diff --git a/README.md b/README.md index f4a8f0d..1dc5337 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ end ### Available methods - connection: * ```client.connect(String url)``` - raises OPCUAClient::Error if unsuccessful +* ``` client.connect(String url, String username, String password, String client_cert, String private_key)``` - authorized connection with username and password, with encryption enabled * ```client.disconnect => Fixnum``` - returns status ### Available methods - reads and writes: @@ -59,28 +60,38 @@ All methods raise OPCUAClient::Error if unsuccessful. * ```client.read_int32(Fixnum ns, String name) => Fixnum``` * ```client.read_uint32(Fixnum ns, String name) => Fixnum``` * ```client.read_float(Fixnum ns, String name) => Float``` +* ```client.read_double(Fixnum ns, String name) => Double``` * ```client.read_boolean(Fixnum ns, String name) => true/false``` * ```client.read_string(Fixnum ns, String name) => String``` +* ```client.read_byte(Fixnum ns, String name) => Byte``` +* ```client.read_uint32_list(Fixnum ns, String name) => Array[Fixnum]``` +* ```client.read_int32_list(Fixnum ns, String name) => Array[Fixnum]``` * ```client.multi_read(Fixnum ns, Array[String] names) => Array values``` * ```client.write_int16(Fixnum ns, String name, Fixnum value)``` * ```client.write_uint16(Fixnum ns, String name, Fixnum value)``` * ```client.write_int32(Fixnum ns, String name, Fixnum value)``` * ```client.write_uint32(Fixnum ns, String name, Fixnum value)``` * ```client.write_float(Fixnum ns, String name, Float value)``` +* ```client.write_double(Fixnum ns, String name, Double value)``` * ```client.write_boolean(Fixnum ns, String name, bool value)``` * ```client.write_string(Fixnum ns, String name, String value)``` +* ```client.write_uint32_list(Fixnum ns, String name, Array[Fixnum] value)``` +* ```client.write_int32_list(Fixnum ns, String name, Array[Fixnum] value)``` * ```client.multi_write_int16(Fixnum ns, Array[String] names, Array[Fixnum] values)``` * ```client.multi_write_uint16(Fixnum ns, Array[String] names, Array[Fixnum] values)``` * ```client.multi_write_int32(Fixnum ns, Array[String] names, Array[Fixnum] values)``` * ```client.multi_write_uint32(Fixnum ns, Array[String] names, Array[Fixnum] values)``` * ```client.multi_write_float(Fixnum ns, Array[String] names, Array[Float] values)``` +* ```client.multi_write_double(Fixnum ns, Array[String] names, Array[Double] values)``` * ```client.multi_write_boolean(Fixnum ns, Array[String] names, Array[bool] values)``` * ```client.multi_write_string(Fixnum ns, Array[String] names, Array[String] values)``` +* ```client.multi_write_byte(Fixnum ns, Array[String] names, Array[Byte] values)``` +* ```client.multi_write_int32_list(Fixnum ns, Array[String] names, Array[Array[Fixnum]] values)``` + ### Available methods - misc: * ```client.state => Fixnum``` - client internal state -* ```client.human_state => String``` - human readable client internal state * ```OPCUAClient::Client.human_status_code(Fixnum status) => String``` - returns human status for status ## Subscriptions and monitoring diff --git a/compile_output.log b/compile_output.log new file mode 100644 index 0000000..b10f706 --- /dev/null +++ b/compile_output.log @@ -0,0 +1,13637 @@ +/usr/bin/make +cd tmp/arm64-darwin24/opcua_client/3.1.2 +compiling ../../../../ext/opcua_client/open62541.c +../../../../ext/opcua_client/open62541.c:4992:38: error: unknown type name 'PubSubEncodeJsonCtx'; did you mean 'PubSubEncodeCtx'? + 4992 | UA_NetworkMessage_encodeJsonInternal(PubSubEncodeJsonCtx *ctx, + | ^~~~~~~~~~~~~~~~~~~ + | PubSubEncodeCtx +../../../../ext/opcua_client/open62541.c:4891:3: note: 'PubSubEncodeCtx' declared here + 4891 | } PubSubEncodeCtx; + | ^ +../../../../ext/opcua_client/open62541.c:5647:74: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 5647 | return (UA_PubSubManager*)getServerComponentByName(server, UA_STRING("pubsub")); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.h:22554:37: note: passing argument to parameter 'chars' here + 22554 | UA_EXPORT UA_String UA_STRING(char *chars); + | ^ +../../../../ext/opcua_client/open62541.c:9259:9: warning: No native IEEE 754 format detected. Use slow generic encoding. [-W#pragma-messages] + 9259 | #pragma message "No native IEEE 754 format detected. Use slow generic encoding." + | ^ +../../../../ext/opcua_client/open62541.c:26570:53: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26570 | res |= UA_String_append(&tmp, UA_STRING("/")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26574:53: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26574 | res |= UA_String_append(&tmp, UA_STRING(".")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26576:53: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26576 | res |= UA_String_append(&tmp, UA_STRING("<")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26578:57: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26578 | res |= UA_String_append(&tmp, UA_STRING("#")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26580:57: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26580 | res |= UA_String_append(&tmp, UA_STRING("!")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26594:53: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26594 | res |= UA_String_append(&tmp, UA_STRING(">")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26605:53: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26605 | res |= UA_String_append(&tmp, UA_STRING(":")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26658:49: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26658 | res |= UA_String_append(&tmp, UA_STRING("#")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26664:49: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26664 | res |= UA_String_append(&tmp, UA_STRING("[")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26666:49: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26666 | res |= UA_String_append(&tmp, UA_STRING("]")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26703:49: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26703 | res |= UA_String_append(&tmp, UA_STRING("#")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26709:49: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26709 | res |= UA_String_append(&tmp, UA_STRING("[")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26711:49: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26711 | res |= UA_String_append(&tmp, UA_STRING("]")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26740:49: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26740 | res |= UA_String_append(&tmp, UA_STRING("#")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26746:49: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26746 | res |= UA_String_append(&tmp, UA_STRING("[")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:26748:49: warning: passing 'const char[2]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 26748 | res |= UA_String_append(&tmp, UA_STRING("]")); + | ^~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:31338:22: warning: passing 'const char[48]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31338 | UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:31387:19: warning: passing 'const char[48]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31387 | UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:31569:52: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31569 | getServerComponentByName(server, UA_STRING("binary")); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:31775:48: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31775 | object_attr.displayName = UA_LOCALIZEDTEXT("", name); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31787:51: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31787 | reference_attr.displayName = UA_LOCALIZEDTEXT("", name); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31791:55: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31791 | reference_attr.inverseName = UA_LOCALIZEDTEXT("", inverseName); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31813:52: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31813 | references_attr.displayName = UA_LOCALIZEDTEXT("", "References"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31813:56: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31813 | references_attr.displayName = UA_LOCALIZEDTEXT("", "References"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31816:52: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31816 | references_attr.inverseName = UA_LOCALIZEDTEXT("", "References"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31816:56: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31816 | references_attr.inverseName = UA_LOCALIZEDTEXT("", "References"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31817:85: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31817 | ret |= ns0_addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_REFERENCES, "References", + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31747:37: note: passing argument to parameter 'name' here + 31747 | UA_UInt32 nodeId, char *name, void *attributes, + | ^ +../../../../ext/opcua_client/open62541.c:31821:52: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31821 | hassubtype_attr.displayName = UA_LOCALIZEDTEXT("", "HasSubtype"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31821:56: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31821 | hassubtype_attr.displayName = UA_LOCALIZEDTEXT("", "HasSubtype"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31824:52: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31824 | hassubtype_attr.inverseName = UA_LOCALIZEDTEXT("", "SubtypeOf"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31824:56: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31824 | hassubtype_attr.inverseName = UA_LOCALIZEDTEXT("", "SubtypeOf"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31825:85: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31825 | ret |= ns0_addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_HASSUBTYPE, "HasSubtype", + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31747:37: note: passing argument to parameter 'name' here + 31747 | UA_UInt32 nodeId, char *name, void *attributes, + | ^ +../../../../ext/opcua_client/open62541.c:31829:52: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31829 | aggregates_attr.displayName = UA_LOCALIZEDTEXT("", "Aggregates"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31829:56: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31829 | aggregates_attr.displayName = UA_LOCALIZEDTEXT("", "Aggregates"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31832:52: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31832 | aggregates_attr.inverseName = UA_LOCALIZEDTEXT("", "AggregatedBy"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31832:56: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31832 | aggregates_attr.inverseName = UA_LOCALIZEDTEXT("", "AggregatedBy"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31833:85: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31833 | ret |= ns0_addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_AGGREGATES, "Aggregates", + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31747:37: note: passing argument to parameter 'name' here + 31747 | UA_UInt32 nodeId, char *name, void *attributes, + | ^ +../../../../ext/opcua_client/open62541.c:31836:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31836 | ret |= addReferenceTypeNode(server, "HierarchicalReferences", NULL, + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31839:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31839 | ret |= addReferenceTypeNode(server, "NonHierarchicalReferences", NULL, + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31842:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31842 | ret |= addReferenceTypeNode(server, "HasChild", NULL, UA_NS0ID_HASCHILD, + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31845:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31845 | ret |= addReferenceTypeNode(server, "Organizes", "OrganizedBy", UA_NS0ID_ORGANIZES, + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31845:54: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31845 | ret |= addReferenceTypeNode(server, "Organizes", "OrganizedBy", UA_NS0ID_ORGANIZES, + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:59: note: passing argument to parameter 'inverseName' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31848:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31848 | ret |= addReferenceTypeNode(server, "HasEventSource", "EventSourceOf", UA_NS0ID_HASEVENTSOURCE, + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31848:59: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31848 | ret |= addReferenceTypeNode(server, "HasEventSource", "EventSourceOf", UA_NS0ID_HASEVENTSOURCE, + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:59: note: passing argument to parameter 'inverseName' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31851:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31851 | ret |= addReferenceTypeNode(server, "HasModellingRule", "ModellingRuleOf", UA_NS0ID_HASMODELLINGRULE, + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31851:61: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31851 | ret |= addReferenceTypeNode(server, "HasModellingRule", "ModellingRuleOf", UA_NS0ID_HASMODELLINGRULE, + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:59: note: passing argument to parameter 'inverseName' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31854:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31854 | ret |= addReferenceTypeNode(server, "HasEncoding", "EncodingOf", UA_NS0ID_HASENCODING, + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31854:56: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31854 | ret |= addReferenceTypeNode(server, "HasEncoding", "EncodingOf", UA_NS0ID_HASENCODING, + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:59: note: passing argument to parameter 'inverseName' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31857:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31857 | ret |= addReferenceTypeNode(server, "HasDescription", "DescriptionOf", UA_NS0ID_HASDESCRIPTION, + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31857:59: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31857 | ret |= addReferenceTypeNode(server, "HasDescription", "DescriptionOf", UA_NS0ID_HASDESCRIPTION, + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:59: note: passing argument to parameter 'inverseName' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31860:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31860 | ret |= addReferenceTypeNode(server, "HasTypeDefinition", "TypeDefinitionOf", UA_NS0ID_HASTYPEDEFINITION, + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31860:62: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31860 | ret |= addReferenceTypeNode(server, "HasTypeDefinition", "TypeDefinitionOf", UA_NS0ID_HASTYPEDEFINITION, + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:59: note: passing argument to parameter 'inverseName' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31863:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31863 | ret |= addReferenceTypeNode(server, "GeneratesEvent", "GeneratedBy", UA_NS0ID_GENERATESEVENT, + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31863:59: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31863 | ret |= addReferenceTypeNode(server, "GeneratesEvent", "GeneratedBy", UA_NS0ID_GENERATESEVENT, + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:59: note: passing argument to parameter 'inverseName' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31872:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31872 | ret |= addReferenceTypeNode(server, "HasProperty", "PropertyOf", UA_NS0ID_HASPROPERTY, + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31872:56: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31872 | ret |= addReferenceTypeNode(server, "HasProperty", "PropertyOf", UA_NS0ID_HASPROPERTY, + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:59: note: passing argument to parameter 'inverseName' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31875:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31875 | ret |= addReferenceTypeNode(server, "HasComponent", "ComponentOf", UA_NS0ID_HASCOMPONENT, + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31875:57: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31875 | ret |= addReferenceTypeNode(server, "HasComponent", "ComponentOf", UA_NS0ID_HASCOMPONENT, + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:59: note: passing argument to parameter 'inverseName' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31878:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31878 | ret |= addReferenceTypeNode(server, "HasNotifier", "NotifierOf", UA_NS0ID_HASNOTIFIER, + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31878:56: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31878 | ret |= addReferenceTypeNode(server, "HasNotifier", "NotifierOf", UA_NS0ID_HASNOTIFIER, + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:59: note: passing argument to parameter 'inverseName' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31881:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31881 | ret |= addReferenceTypeNode(server, "HasOrderedComponent", "OrderedComponentOf", + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31881:64: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31881 | ret |= addReferenceTypeNode(server, "HasOrderedComponent", "OrderedComponentOf", + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:59: note: passing argument to parameter 'inverseName' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31884:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31884 | ret |= addReferenceTypeNode(server, "HasInterface", "InterfaceOf", + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:47: note: passing argument to parameter 'name' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31884:57: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31884 | ret |= addReferenceTypeNode(server, "HasInterface", "InterfaceOf", + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31784:59: note: passing argument to parameter 'inverseName' here + 31784 | addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, + | ^ +../../../../ext/opcua_client/open62541.c:31893:54: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31893 | basedatatype_attr.displayName = UA_LOCALIZEDTEXT("", "BaseDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31893:58: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31893 | basedatatype_attr.displayName = UA_LOCALIZEDTEXT("", "BaseDataType"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31895:82: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31895 | ret |= ns0_addNode_raw(server, UA_NODECLASS_DATATYPE, UA_NS0ID_BASEDATATYPE, "BaseDataType", + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31747:37: note: passing argument to parameter 'name' here + 31747 | UA_UInt32 nodeId, char *name, void *attributes, + | ^ +../../../../ext/opcua_client/open62541.c:31903:49: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31903 | basevar_attr.displayName = UA_LOCALIZEDTEXT("", "BaseVariableType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31903:53: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31903 | basevar_attr.displayName = UA_LOCALIZEDTEXT("", "BaseVariableType"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31908:55: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31908 | UA_NS0ID_BASEVARIABLETYPE, "BaseVariableType", + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31747:37: note: passing argument to parameter 'name' here + 31747 | UA_UInt32 nodeId, char *name, void *attributes, + | ^ +../../../../ext/opcua_client/open62541.c:31912:45: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31912 | bdv_attr.displayName = UA_LOCALIZEDTEXT("", "BaseDataVariableType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31912:49: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31912 | bdv_attr.displayName = UA_LOCALIZEDTEXT("", "BaseDataVariableType"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31917:56: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31917 | UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "BaseDataVariableType"), + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:31922:46: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31922 | prop_attr.displayName = UA_LOCALIZEDTEXT("", "PropertyType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31922:50: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31922 | prop_attr.displayName = UA_LOCALIZEDTEXT("", "PropertyType"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31927:56: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31927 | UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "PropertyType"), + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:31936:49: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31936 | baseobj_attr.displayName = UA_LOCALIZEDTEXT("", "BaseObjectType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31936:53: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31936 | baseobj_attr.displayName = UA_LOCALIZEDTEXT("", "BaseObjectType"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31938:53: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31938 | UA_NS0ID_BASEOBJECTTYPE, "BaseObjectType", + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31747:37: note: passing argument to parameter 'name' here + 31747 | UA_UInt32 nodeId, char *name, void *attributes, + | ^ +../../../../ext/opcua_client/open62541.c:31942:48: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31942 | folder_attr.displayName = UA_LOCALIZEDTEXT("", "FolderType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31942:52: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31942 | folder_attr.displayName = UA_LOCALIZEDTEXT("", "FolderType"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31945:56: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31945 | UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "FolderType"), + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:31953:34: warning: passing 'const char[5]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31953 | ret |= addObjectNode(server, "Root", UA_NS0ID_ROOTFOLDER, 0, 0, UA_NS0ID_FOLDERTYPE); + | ^~~~~~ +../../../../ext/opcua_client/open62541.c:31772:40: note: passing argument to parameter 'name' here + 31772 | addObjectNode(UA_Server *server, char* name, UA_UInt32 objectid, + | ^ +../../../../ext/opcua_client/open62541.c:31955:34: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31955 | ret |= addObjectNode(server, "Objects", UA_NS0ID_OBJECTSFOLDER, UA_NS0ID_ROOTFOLDER, + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31772:40: note: passing argument to parameter 'name' here + 31772 | addObjectNode(UA_Server *server, char* name, UA_UInt32 objectid, + | ^ +../../../../ext/opcua_client/open62541.c:31958:34: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31958 | ret |= addObjectNode(server, "Types", UA_NS0ID_TYPESFOLDER, UA_NS0ID_ROOTFOLDER, + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:31772:40: note: passing argument to parameter 'name' here + 31772 | addObjectNode(UA_Server *server, char* name, UA_UInt32 objectid, + | ^ +../../../../ext/opcua_client/open62541.c:31961:34: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31961 | ret |= addObjectNode(server, "ReferenceTypes", UA_NS0ID_REFERENCETYPESFOLDER, UA_NS0ID_TYPESFOLDER, + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31772:40: note: passing argument to parameter 'name' here + 31772 | addObjectNode(UA_Server *server, char* name, UA_UInt32 objectid, + | ^ +../../../../ext/opcua_client/open62541.c:31966:34: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31966 | ret |= addObjectNode(server, "DataTypes", UA_NS0ID_DATATYPESFOLDER, UA_NS0ID_TYPESFOLDER, + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31772:40: note: passing argument to parameter 'name' here + 31772 | addObjectNode(UA_Server *server, char* name, UA_UInt32 objectid, + | ^ +../../../../ext/opcua_client/open62541.c:31971:34: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31971 | ret |= addObjectNode(server, "VariableTypes", UA_NS0ID_VARIABLETYPESFOLDER, UA_NS0ID_TYPESFOLDER, + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31772:40: note: passing argument to parameter 'name' here + 31772 | addObjectNode(UA_Server *server, char* name, UA_UInt32 objectid, + | ^ +../../../../ext/opcua_client/open62541.c:31976:34: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31976 | ret |= addObjectNode(server, "ObjectTypes", UA_NS0ID_OBJECTTYPESFOLDER, UA_NS0ID_TYPESFOLDER, + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31772:40: note: passing argument to parameter 'name' here + 31772 | addObjectNode(UA_Server *server, char* name, UA_UInt32 objectid, + | ^ +../../../../ext/opcua_client/open62541.c:31981:34: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31981 | ret |= addObjectNode(server, "EventTypes", UA_NS0ID_EVENTTYPESFOLDER, UA_NS0ID_TYPESFOLDER, + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:31772:40: note: passing argument to parameter 'name' here + 31772 | addObjectNode(UA_Server *server, char* name, UA_UInt32 objectid, + | ^ +../../../../ext/opcua_client/open62541.c:31984:34: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31984 | ret |= addObjectNode(server, "Views", UA_NS0ID_VIEWSFOLDER, UA_NS0ID_ROOTFOLDER, + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:31772:40: note: passing argument to parameter 'name' here + 31772 | addObjectNode(UA_Server *server, char* name, UA_UInt32 objectid, + | ^ +../../../../ext/opcua_client/open62541.c:31989:51: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31989 | eventtype_attr.displayName = UA_LOCALIZEDTEXT("", "BaseEventType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31989:55: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31989 | eventtype_attr.displayName = UA_LOCALIZEDTEXT("", "BaseEventType"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:31992:40: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 31992 | UA_QUALIFIEDNAME(0, "BaseEventType"), UA_NODEID_NULL, &eventtype_attr, + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:32781:39: warning: passing 'const char[3]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 32781 | UA_LocaleId locale_en = UA_STRING("en"); + | ^~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:32794:21: warning: passing 'const char[58]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 32794 | ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/StandardUA2017"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:32793:73: note: expanded from macro 'ADDPROFILEARRAY' + 32793 | #define ADDPROFILEARRAY(x) profileArray[profileArraySize++] = UA_STRING(x) + | ^ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:33411:34: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 33411 | if(equalBrowseName(&bn.name, "SessionDiagnostics")) { + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:33034:38: note: passing argument to parameter 'n' here + 33034 | equalBrowseName(UA_String *bn, char *n) { + | ^ +../../../../ext/opcua_client/open62541.c:33415:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 33415 | } else if(equalBrowseName(&bn.name, "SessionSecurityDiagnostics")) { + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:33034:38: note: passing argument to parameter 'n' here + 33034 | equalBrowseName(UA_String *bn, char *n) { + | ^ +../../../../ext/opcua_client/open62541.c:33509:55: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 33509 | UA_QualifiedName browseName = UA_QUALIFIEDNAME(0, ""); + | ^~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:36257:66: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 36257 | UA_KeyValueMap_getScalar(params, UA_QUALIFIEDNAME(0, "listen-port"), + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:36260:66: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 36260 | UA_KeyValueMap_getScalar(params, UA_QUALIFIEDNAME(0, "listen-address"), + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:36390:37: warning: passing 'const char[4]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 36390 | UA_String tcpString = UA_STRING("tcp"); + | ^~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:36404:45: warning: passing 'const char[5]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 36404 | params[0].key = UA_QUALIFIEDNAME(0, "port"); + | ^~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:36408:45: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 36408 | params[1].key = UA_QUALIFIEDNAME(0, "listen"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:36412:45: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 36412 | params[2].key = UA_QUALIFIEDNAME(0, "reuse"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:36417:49: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 36417 | params[3].key = UA_QUALIFIEDNAME(0, "address"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:36588:45: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 36588 | params[0].key = UA_QUALIFIEDNAME(0, "address"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:36591:45: warning: passing 'const char[5]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 36591 | params[1].key = UA_QUALIFIEDNAME(0, "port"); + | ^~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:36618:52: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 36618 | getServerComponentByName(server, UA_STRING("binary")); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:36673:52: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 36673 | getServerComponentByName(server, UA_STRING("binary")); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:36876:42: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 36876 | UA_String defaultUrl = UA_STRING("opc.tcp://:4840"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:36999:30: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 36999 | bpm->sc.name = UA_STRING("binary"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:47418:42: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 47418 | rpe.targetName = UA_QUALIFIEDNAME(0, "DefaultInstanceBrowseName"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:50856:31: warning: passing 'const char[48]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 50856 | policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:51678:38: warning: passing 'const char[48]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 51678 | const UA_String none = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:52633:37: warning: passing 'const char[4]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 52633 | UA_String tcpString = UA_STRING("tcp"); + | ^~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:52645:45: warning: passing 'const char[5]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 52645 | params[0].key = UA_QUALIFIEDNAME(0, "port"); + | ^~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:52647:45: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 52647 | params[1].key = UA_QUALIFIEDNAME(0, "address"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:52649:45: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 52649 | params[2].key = UA_QUALIFIEDNAME(0, "reuse"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:53063:41: warning: passing 'const char[5]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 53063 | params[0].key = UA_QUALIFIEDNAME(0, "port"); + | ^~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:53065:41: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 53065 | params[1].key = UA_QUALIFIEDNAME(0, "address"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:53068:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 53068 | params[2].key = UA_QUALIFIEDNAME(0, "listen"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:53070:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 53070 | params[3].key = UA_QUALIFIEDNAME(0, "reuse"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:58961:38: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58961 | attr.inverseName = UA_LOCALIZEDTEXT("", "IsReaderInGroup"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:58961:42: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58961 | attr.inverseName = UA_LOCALIZEDTEXT("", "IsReaderInGroup"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:58962:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58962 | attr.displayName = UA_LOCALIZEDTEXT("", "HasDataSetReader"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:58962:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58962 | attr.displayName = UA_LOCALIZEDTEXT("", "HasDataSetReader"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:58963:354: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58963 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15297LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HasDataSetReader"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:58976:38: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58976 | attr.inverseName = UA_LOCALIZEDTEXT("", "IsWriterInGroup"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:58976:42: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58976 | attr.inverseName = UA_LOCALIZEDTEXT("", "IsWriterInGroup"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:58977:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58977 | attr.displayName = UA_LOCALIZEDTEXT("", "HasDataSetWriter"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:58977:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58977 | attr.displayName = UA_LOCALIZEDTEXT("", "HasDataSetWriter"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:58978:354: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58978 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15296LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HasDataSetWriter"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:58991:38: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58991 | attr.inverseName = UA_LOCALIZEDTEXT("", "PubSubConnectionOf"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:58991:42: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58991 | attr.inverseName = UA_LOCALIZEDTEXT("", "PubSubConnectionOf"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:58992:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58992 | attr.displayName = UA_LOCALIZEDTEXT("", "HasPubSubConnection"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:58992:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58992 | attr.displayName = UA_LOCALIZEDTEXT("", "HasPubSubConnection"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:58993:354: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 58993 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14476LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HasPubSubConnection"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59006:38: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59006 | attr.inverseName = UA_LOCALIZEDTEXT("", "WriterToDataSet"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59006:42: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59006 | attr.inverseName = UA_LOCALIZEDTEXT("", "WriterToDataSet"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59007:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59007 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetToWriter"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59007:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59007 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetToWriter"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59008:354: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59008 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14936LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 33LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetToWriter"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59021:38: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59021 | attr.inverseName = UA_LOCALIZEDTEXT("", "AddInOf"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59021:42: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59021 | attr.inverseName = UA_LOCALIZEDTEXT("", "AddInOf"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59022:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59022 | attr.displayName = UA_LOCALIZEDTEXT("", "HasAddIn"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59022:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59022 | attr.displayName = UA_LOCALIZEDTEXT("", "HasAddIn"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59023:354: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59023 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17604LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 32LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HasAddIn"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59036:38: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59036 | attr.inverseName = UA_LOCALIZEDTEXT("", "HistoricalConfigurationOf"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59036:42: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59036 | attr.inverseName = UA_LOCALIZEDTEXT("", "HistoricalConfigurationOf"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59037:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59037 | attr.displayName = UA_LOCALIZEDTEXT("", "HasHistoricalConfiguration"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59037:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59037 | attr.displayName = UA_LOCALIZEDTEXT("", "HasHistoricalConfiguration"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59038:351: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59038 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 56LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 44LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HasHistoricalConfiguration"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59051:38: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59051 | attr.inverseName = UA_LOCALIZEDTEXT("", "MayBeEffectedBy"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59051:42: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59051 | attr.inverseName = UA_LOCALIZEDTEXT("", "MayBeEffectedBy"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59052:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59052 | attr.displayName = UA_LOCALIZEDTEXT("", "HasEffect"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59052:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59052 | attr.displayName = UA_LOCALIZEDTEXT("", "HasEffect"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59053:351: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59053 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 54LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 32LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HasEffect"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59066:38: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59066 | attr.inverseName = UA_LOCALIZEDTEXT("", "MayBeCausedBy"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59066:42: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59066 | attr.inverseName = UA_LOCALIZEDTEXT("", "MayBeCausedBy"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59067:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59067 | attr.displayName = UA_LOCALIZEDTEXT("", "HasCause"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59067:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59067 | attr.displayName = UA_LOCALIZEDTEXT("", "HasCause"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59068:351: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59068 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 53LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 32LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HasCause"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59081:38: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59081 | attr.inverseName = UA_LOCALIZEDTEXT("", "FromTransition"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59081:42: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59081 | attr.inverseName = UA_LOCALIZEDTEXT("", "FromTransition"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59082:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59082 | attr.displayName = UA_LOCALIZEDTEXT("", "ToState"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59082:41: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59082 | attr.displayName = UA_LOCALIZEDTEXT("", "ToState"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59083:351: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59083 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 52LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 32LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ToState"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59096:38: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59096 | attr.inverseName = UA_LOCALIZEDTEXT("", "ToTransition"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59096:42: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59096 | attr.inverseName = UA_LOCALIZEDTEXT("", "ToTransition"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59097:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59097 | attr.displayName = UA_LOCALIZEDTEXT("", "FromState"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59097:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59097 | attr.displayName = UA_LOCALIZEDTEXT("", "FromState"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59098:351: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59098 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 51LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 32LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "FromState"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59111:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59111 | attr.displayName = UA_LOCALIZEDTEXT("", "DiagnosticInfo"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59111:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59111 | attr.displayName = UA_LOCALIZEDTEXT("", "DiagnosticInfo"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59112:346: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59112 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 25LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DiagnosticInfo"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59125:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59125 | attr.displayName = UA_LOCALIZEDTEXT("", "DataValue"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59125:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59125 | attr.displayName = UA_LOCALIZEDTEXT("", "DataValue"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59126:346: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59126 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataValue"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59140:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59140 | attr.displayName = UA_LOCALIZEDTEXT("", "Structure"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59140:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59140 | attr.displayName = UA_LOCALIZEDTEXT("", "Structure"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59141:346: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59141 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Structure"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59154:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59154 | attr.displayName = UA_LOCALIZEDTEXT("", "EUInformation"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59154:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59154 | attr.displayName = UA_LOCALIZEDTEXT("", "EUInformation"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59155:347: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59155 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 887LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EUInformation"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59168:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59168 | attr.displayName = UA_LOCALIZEDTEXT("", "Range"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59168:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59168 | attr.displayName = UA_LOCALIZEDTEXT("", "Range"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59169:347: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59169 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 884LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Range"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59182:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59182 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59182:41: warning: passing 'const char[32]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59182 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsDataType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59183:347: warning: passing 'const char[32]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59183 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 874LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscriptionDiagnosticsDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59196:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59196 | attr.displayName = UA_LOCALIZEDTEXT("", "ServiceCounterDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59196:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59196 | attr.displayName = UA_LOCALIZEDTEXT("", "ServiceCounterDataType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59197:347: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59197 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 871LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServiceCounterDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59210:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59210 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnosticsDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59210:41: warning: passing 'const char[35]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59210 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnosticsDataType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59211:347: warning: passing 'const char[35]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59211 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 868LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionSecurityDiagnosticsDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59224:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59224 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59224:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59224 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsDataType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59225:347: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59225 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 865LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionDiagnosticsDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59238:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59238 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerStatusDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59238:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59238 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerStatusDataType"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59239:347: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59239 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 862LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerStatusDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59252:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59252 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummaryDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59252:41: warning: passing 'const char[33]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59252 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummaryDataType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59253:347: warning: passing 'const char[33]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59253 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 859LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerDiagnosticsSummaryDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59266:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59266 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingIntervalDiagnosticsDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59266:41: warning: passing 'const char[36]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59266 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingIntervalDiagnosticsDataType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59267:347: warning: passing 'const char[36]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59267 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 856LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SamplingIntervalDiagnosticsDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59280:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59280 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumValueType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59280:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59280 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumValueType"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59281:348: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59281 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 7594LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnumValueType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59294:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59294 | attr.displayName = UA_LOCALIZEDTEXT("", "SignedSoftwareCertificate"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59294:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59294 | attr.displayName = UA_LOCALIZEDTEXT("", "SignedSoftwareCertificate"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59295:347: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59295 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 344LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SignedSoftwareCertificate"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59308:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59308 | attr.displayName = UA_LOCALIZEDTEXT("", "BuildInfo"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59308:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59308 | attr.displayName = UA_LOCALIZEDTEXT("", "BuildInfo"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59309:347: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59309 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 338LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BuildInfo"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59322:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59322 | attr.displayName = UA_LOCALIZEDTEXT("", "ApplicationDescription"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59322:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59322 | attr.displayName = UA_LOCALIZEDTEXT("", "ApplicationDescription"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59323:347: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59323 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 308LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ApplicationDescription"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59336:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59336 | attr.displayName = UA_LOCALIZEDTEXT("", "Argument"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59336:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59336 | attr.displayName = UA_LOCALIZEDTEXT("", "Argument"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59337:347: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59337 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 296LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Argument"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59350:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59350 | attr.displayName = UA_LOCALIZEDTEXT("", "AdditionalParametersType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59350:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59350 | attr.displayName = UA_LOCALIZEDTEXT("", "AdditionalParametersType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59351:349: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59351 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 16313LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AdditionalParametersType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59364:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59364 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubConnectionDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59364:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59364 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubConnectionDataType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59365:349: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59365 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15617LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PubSubConnectionDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59379:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59379 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataSetSourceDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59379:41: warning: passing 'const char[31]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59379 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataSetSourceDataType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59380:349: warning: passing 'const char[31]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59380 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15580LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishedDataSetSourceDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59393:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59393 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataItemsDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59393:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59393 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataItemsDataType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59394:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59394 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15581LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15580LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishedDataItemsDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59407:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59407 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataSetDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59407:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59407 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataSetDataType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59408:349: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59408 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15578LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishedDataSetDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59421:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59421 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeSchemaHeader"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59421:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59421 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeSchemaHeader"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59422:349: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59422 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15534LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataTypeSchemaHeader"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59435:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59435 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetMetaDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59435:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59435 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetMetaDataType"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59436:352: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59436 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14523LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15534LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetMetaDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59449:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59449 | attr.displayName = UA_LOCALIZEDTEXT("", "ConfigurationVersionDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59449:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59449 | attr.displayName = UA_LOCALIZEDTEXT("", "ConfigurationVersionDataType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59450:349: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59450 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14593LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ConfigurationVersionDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59463:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59463 | attr.displayName = UA_LOCALIZEDTEXT("", "KeyValuePair"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59463:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59463 | attr.displayName = UA_LOCALIZEDTEXT("", "KeyValuePair"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59464:349: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59464 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14533LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "KeyValuePair"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59477:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59477 | attr.displayName = UA_LOCALIZEDTEXT("", "FieldMetaData"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59477:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59477 | attr.displayName = UA_LOCALIZEDTEXT("", "FieldMetaData"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59478:349: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59478 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14524LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "FieldMetaData"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59491:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59491 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedVariableDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59491:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59491 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedVariableDataType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59492:349: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59492 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14273LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishedVariableDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59506:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59506 | attr.displayName = UA_LOCALIZEDTEXT("", "Union"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59506:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59506 | attr.displayName = UA_LOCALIZEDTEXT("", "Union"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59507:349: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59507 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12756LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Union"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59520:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59520 | attr.displayName = UA_LOCALIZEDTEXT("", "TrustListDataType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59520:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59520 | attr.displayName = UA_LOCALIZEDTEXT("", "TrustListDataType"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59521:349: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59521 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12554LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 22LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TrustListDataType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59534:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59534 | attr.displayName = UA_LOCALIZEDTEXT("", "LocalizedText"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59534:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59534 | attr.displayName = UA_LOCALIZEDTEXT("", "LocalizedText"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59535:346: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59535 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "LocalizedText"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59548:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59548 | attr.displayName = UA_LOCALIZEDTEXT("", "QualifiedName"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59548:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59548 | attr.displayName = UA_LOCALIZEDTEXT("", "QualifiedName"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59549:346: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59549 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 20LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "QualifiedName"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59562:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59562 | attr.displayName = UA_LOCALIZEDTEXT("", "StatusCode"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59562:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59562 | attr.displayName = UA_LOCALIZEDTEXT("", "StatusCode"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59563:346: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59563 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 19LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "StatusCode"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59576:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59576 | attr.displayName = UA_LOCALIZEDTEXT("", "ExpandedNodeId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59576:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59576 | attr.displayName = UA_LOCALIZEDTEXT("", "ExpandedNodeId"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59577:346: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59577 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 18LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ExpandedNodeId"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59590:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59590 | attr.displayName = UA_LOCALIZEDTEXT("", "NodeId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59590:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59590 | attr.displayName = UA_LOCALIZEDTEXT("", "NodeId"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59591:346: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59591 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NodeId"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59604:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59604 | attr.displayName = UA_LOCALIZEDTEXT("", "XmlElement"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59604:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59604 | attr.displayName = UA_LOCALIZEDTEXT("", "XmlElement"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59605:346: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59605 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 16LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "XmlElement"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59618:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59618 | attr.displayName = UA_LOCALIZEDTEXT("", "ByteString"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59618:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59618 | attr.displayName = UA_LOCALIZEDTEXT("", "ByteString"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59619:346: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59619 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ByteString"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59633:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59633 | attr.displayName = UA_LOCALIZEDTEXT("", "Image"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59633:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59633 | attr.displayName = UA_LOCALIZEDTEXT("", "Image"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59634:346: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59634 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 30LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Image"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59647:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59647 | attr.displayName = UA_LOCALIZEDTEXT("", "Guid"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59647:41: warning: passing 'const char[5]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59647 | attr.displayName = UA_LOCALIZEDTEXT("", "Guid"); + | ^~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59648:346: warning: passing 'const char[5]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59648 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Guid"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59661:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59661 | attr.displayName = UA_LOCALIZEDTEXT("", "DateTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59661:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59661 | attr.displayName = UA_LOCALIZEDTEXT("", "DateTime"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59662:346: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59662 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 13LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DateTime"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59675:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59675 | attr.displayName = UA_LOCALIZEDTEXT("", "UtcTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59675:41: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59675 | attr.displayName = UA_LOCALIZEDTEXT("", "UtcTime"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59676:347: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59676 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 294LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 13LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UtcTime"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59689:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59689 | attr.displayName = UA_LOCALIZEDTEXT("", "String"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59689:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59689 | attr.displayName = UA_LOCALIZEDTEXT("", "String"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59690:346: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59690 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "String"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59703:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59703 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59703:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59703 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleId"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59704:347: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59704 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 295LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "LocaleId"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59717:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59717 | attr.displayName = UA_LOCALIZEDTEXT("", "Boolean"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59717:41: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59717 | attr.displayName = UA_LOCALIZEDTEXT("", "Boolean"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59718:345: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59718 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 1LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Boolean"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59732:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59732 | attr.displayName = UA_LOCALIZEDTEXT("", "Enumeration"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59732:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59732 | attr.displayName = UA_LOCALIZEDTEXT("", "Enumeration"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59733:346: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59733 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 29LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Enumeration"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59746:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59746 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerState"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59746:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59746 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerState"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59747:347: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59747 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 852LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 29LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerState"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59760:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59760 | attr.displayName = UA_LOCALIZEDTEXT("", "RedundancySupport"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59760:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59760 | attr.displayName = UA_LOCALIZEDTEXT("", "RedundancySupport"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59761:347: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59761 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 851LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 29LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RedundancySupport"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59825:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59825 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59825:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59825 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59826:349: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59826 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 7611LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 851LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnumStrings"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59842:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59842 | attr.displayName = UA_LOCALIZEDTEXT("", "ApplicationType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59842:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59842 | attr.displayName = UA_LOCALIZEDTEXT("", "ApplicationType"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59843:347: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59843 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 307LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 29LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ApplicationType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59897:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59897 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59897:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59897 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59898:349: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59898 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 7597LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 307LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnumStrings"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59914:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59914 | attr.displayName = UA_LOCALIZEDTEXT("", "MessageSecurityMode"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59914:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59914 | attr.displayName = UA_LOCALIZEDTEXT("", "MessageSecurityMode"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59915:347: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59915 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 302LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 29LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MessageSecurityMode"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59969:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59969 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59969:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59969 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59970:349: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59970 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 7595LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 302LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnumStrings"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:59986:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59986 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubState"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59986:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59986 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubState"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:59987:349: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 59987 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14647LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 29LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PubSubState"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60041:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60041 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60041:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60041 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60042:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60042 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14648LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14647LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnumStrings"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60058:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60058 | attr.displayName = UA_LOCALIZEDTEXT("", "TrustListMasks"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60058:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60058 | attr.displayName = UA_LOCALIZEDTEXT("", "TrustListMasks"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60059:349: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60059 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12552LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 29LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TrustListMasks"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60189:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60189 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumValues"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60189:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60189 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumValues"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60190:352: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60190 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12553LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12552LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnumValues"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60206:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60206 | attr.displayName = UA_LOCALIZEDTEXT("", "AxisScaleEnumeration"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60206:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60206 | attr.displayName = UA_LOCALIZEDTEXT("", "AxisScaleEnumeration"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60207:349: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60207 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12077LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 29LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AxisScaleEnumeration"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60256:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60256 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60256:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60256 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60257:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60257 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12078LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12077LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnumStrings"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60273:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60273 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRuleType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60273:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60273 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRuleType"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60274:347: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60274 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 120LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 29LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NamingRuleType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60368:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60368 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumValues"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60368:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60368 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumValues"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60369:350: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60369 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12169LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 120LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnumValues"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60386:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60386 | attr.displayName = UA_LOCALIZEDTEXT("", "Number"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60386:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60386 | attr.displayName = UA_LOCALIZEDTEXT("", "Number"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60387:346: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60387 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 26LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 24LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Number"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60400:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60400 | attr.displayName = UA_LOCALIZEDTEXT("", "Decimal"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60400:41: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60400 | attr.displayName = UA_LOCALIZEDTEXT("", "Decimal"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60401:346: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60401 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 50LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 26LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Decimal"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60415:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60415 | attr.displayName = UA_LOCALIZEDTEXT("", "UInteger"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60415:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60415 | attr.displayName = UA_LOCALIZEDTEXT("", "UInteger"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60416:346: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60416 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 28LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 26LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UInteger"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60429:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60429 | attr.displayName = UA_LOCALIZEDTEXT("", "UInt64"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60429:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60429 | attr.displayName = UA_LOCALIZEDTEXT("", "UInt64"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60430:345: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60430 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 9LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 28LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UInt64"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60443:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60443 | attr.displayName = UA_LOCALIZEDTEXT("", "UInt32"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60443:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60443 | attr.displayName = UA_LOCALIZEDTEXT("", "UInt32"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60444:345: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60444 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 7LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 28LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UInt32"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60457:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60457 | attr.displayName = UA_LOCALIZEDTEXT("", "VersionTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60457:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60457 | attr.displayName = UA_LOCALIZEDTEXT("", "VersionTime"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60458:348: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60458 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 20998LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 7LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "VersionTime"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60471:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60471 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetFieldContentMask"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60471:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60471 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetFieldContentMask"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60472:348: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60472 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15583LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 7LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetFieldContentMask"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60536:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60536 | attr.displayName = UA_LOCALIZEDTEXT("", "OptionSetValues"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60536:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60536 | attr.displayName = UA_LOCALIZEDTEXT("", "OptionSetValues"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60537:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60537 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15584LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15583LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "OptionSetValues"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60553:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60553 | attr.displayName = UA_LOCALIZEDTEXT("", "UInt16"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60553:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60553 | attr.displayName = UA_LOCALIZEDTEXT("", "UInt16"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60554:345: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60554 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 5LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 28LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UInt16"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60567:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60567 | attr.displayName = UA_LOCALIZEDTEXT("", "Byte"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60567:41: warning: passing 'const char[5]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60567 | attr.displayName = UA_LOCALIZEDTEXT("", "Byte"); + | ^~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60568:345: warning: passing 'const char[5]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60568 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 28LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Byte"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60582:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60582 | attr.displayName = UA_LOCALIZEDTEXT("", "Integer"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60582:41: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60582 | attr.displayName = UA_LOCALIZEDTEXT("", "Integer"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60583:346: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60583 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 27LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 26LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Integer"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60596:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60596 | attr.displayName = UA_LOCALIZEDTEXT("", "Int64"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60596:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60596 | attr.displayName = UA_LOCALIZEDTEXT("", "Int64"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60597:345: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60597 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 27LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Int64"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60610:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60610 | attr.displayName = UA_LOCALIZEDTEXT("", "Int32"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60610:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60610 | attr.displayName = UA_LOCALIZEDTEXT("", "Int32"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60611:345: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60611 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 6LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 27LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Int32"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60624:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60624 | attr.displayName = UA_LOCALIZEDTEXT("", "Int16"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60624:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60624 | attr.displayName = UA_LOCALIZEDTEXT("", "Int16"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60625:345: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60625 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 4LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 27LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Int16"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60638:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60638 | attr.displayName = UA_LOCALIZEDTEXT("", "SByte"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60638:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60638 | attr.displayName = UA_LOCALIZEDTEXT("", "SByte"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60639:345: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60639 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 27LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SByte"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60652:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60652 | attr.displayName = UA_LOCALIZEDTEXT("", "Double"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60652:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60652 | attr.displayName = UA_LOCALIZEDTEXT("", "Double"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60653:346: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60653 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 26LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Double"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60666:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60666 | attr.displayName = UA_LOCALIZEDTEXT("", "Duration"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60666:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60666 | attr.displayName = UA_LOCALIZEDTEXT("", "Duration"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60667:347: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60667 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 290LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Duration"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60680:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60680 | attr.displayName = UA_LOCALIZEDTEXT("", "Float"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60680:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60680 | attr.displayName = UA_LOCALIZEDTEXT("", "Float"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60681:346: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60681 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 10LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 26LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Float"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60697:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60697 | attr.displayName = UA_LOCALIZEDTEXT("", "DataItemType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60697:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60697 | attr.displayName = UA_LOCALIZEDTEXT("", "DataItemType"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60701:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60701 | attr.description = UA_LOCALIZEDTEXT("", "A variable that contains live automation data."); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60701:41: warning: passing 'const char[47]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60701 | attr.description = UA_LOCALIZEDTEXT("", "A variable that contains live automation data."); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60705:352: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60705 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2365LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataItemType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60722:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60722 | attr.displayName = UA_LOCALIZEDTEXT("", "DiscreteItemType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60722:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60722 | attr.displayName = UA_LOCALIZEDTEXT("", "DiscreteItemType"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60723:354: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60723 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2372LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2365LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DiscreteItemType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60738:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60738 | attr.displayName = UA_LOCALIZEDTEXT("", "MultiStateDiscreteType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60738:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60738 | attr.displayName = UA_LOCALIZEDTEXT("", "MultiStateDiscreteType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60739:354: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60739 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2376LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2372LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MultiStateDiscreteType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60761:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60761 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60761:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60761 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60762:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60762 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2377LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2376LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnumStrings"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60777:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60777 | attr.displayName = UA_LOCALIZEDTEXT("", "TwoStateDiscreteType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60777:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60777 | attr.displayName = UA_LOCALIZEDTEXT("", "TwoStateDiscreteType"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60778:354: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60778 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2373LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2372LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TwoStateDiscreteType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60797:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60797 | attr.displayName = UA_LOCALIZEDTEXT("", "TrueState"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60797:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60797 | attr.displayName = UA_LOCALIZEDTEXT("", "TrueState"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60798:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60798 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2375LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2373LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TrueState"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60817:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60817 | attr.displayName = UA_LOCALIZEDTEXT("", "FalseState"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60817:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60817 | attr.displayName = UA_LOCALIZEDTEXT("", "FalseState"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60818:350: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60818 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2374LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2373LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "FalseState"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60833:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60833 | attr.displayName = UA_LOCALIZEDTEXT("", "MultiStateValueDiscreteType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60833:41: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60833 | attr.displayName = UA_LOCALIZEDTEXT("", "MultiStateValueDiscreteType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60834:355: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60834 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11238LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2372LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MultiStateValueDiscreteType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60853:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60853 | attr.displayName = UA_LOCALIZEDTEXT("", "ValueAsText"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60853:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60853 | attr.displayName = UA_LOCALIZEDTEXT("", "ValueAsText"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60854:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60854 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11461LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11238LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ValueAsText"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60876:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60876 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumValues"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60876:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60876 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumValues"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60877:352: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60877 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11241LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11238LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnumValues"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60892:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60892 | attr.displayName = UA_LOCALIZEDTEXT("", "AnalogItemType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60892:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60892 | attr.displayName = UA_LOCALIZEDTEXT("", "AnalogItemType"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60893:354: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60893 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2368LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2365LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AnalogItemType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60912:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60912 | attr.displayName = UA_LOCALIZEDTEXT("", "EngineeringUnits"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60912:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60912 | attr.displayName = UA_LOCALIZEDTEXT("", "EngineeringUnits"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60913:350: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60913 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2371LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2368LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EngineeringUnits"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60932:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60932 | attr.displayName = UA_LOCALIZEDTEXT("", "InstrumentRange"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60932:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60932 | attr.displayName = UA_LOCALIZEDTEXT("", "InstrumentRange"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60933:350: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60933 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2370LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2368LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "InstrumentRange"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60952:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60952 | attr.displayName = UA_LOCALIZEDTEXT("", "EURange"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60952:41: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60952 | attr.displayName = UA_LOCALIZEDTEXT("", "EURange"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60953:350: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60953 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2369LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2368LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EURange"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60972:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60972 | attr.displayName = UA_LOCALIZEDTEXT("", "ValuePrecision"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60972:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60972 | attr.displayName = UA_LOCALIZEDTEXT("", "ValuePrecision"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60976:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60976 | attr.description = UA_LOCALIZEDTEXT("", "The maximum precision that the server can maintain for the item based on restrictions in the target environment."); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60976:41: warning: passing 'const char[113]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60976 | attr.description = UA_LOCALIZEDTEXT("", "The maximum precision that the server can maintain for the item based on restrictions in the target environment."); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60980:350: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60980 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2367LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2365LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ValuePrecision"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:60999:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60999 | attr.displayName = UA_LOCALIZEDTEXT("", "Definition"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:60999:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 60999 | attr.displayName = UA_LOCALIZEDTEXT("", "Definition"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61003:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61003 | attr.description = UA_LOCALIZEDTEXT("", "A vendor-specific, human readable string that specifies how the value of this DataItem is calculated."); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61003:41: warning: passing 'const char[102]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61003 | attr.description = UA_LOCALIZEDTEXT("", "A vendor-specific, human readable string that specifies how the value of this DataItem is calculated."); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61007:350: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61007 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2366LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2365LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Definition"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61020:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61020 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSetType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61020:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61020 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSetType"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61021:351: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61021 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15108LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscribedDataSetType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61034:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61034 | attr.displayName = UA_LOCALIZEDTEXT("", "TargetVariablesType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61034:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61034 | attr.displayName = UA_LOCALIZEDTEXT("", "TargetVariablesType"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61035:354: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61035 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15111LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15108LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TargetVariablesType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61353:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61353 | attr.displayName = UA_LOCALIZEDTEXT("", "TargetVariables"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61353:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61353 | attr.displayName = UA_LOCALIZEDTEXT("", "TargetVariables"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61354:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61354 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15114LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15111LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TargetVariables"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61367:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61367 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetReaderMessageType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61367:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61367 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetReaderMessageType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61368:351: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61368 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21104LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetReaderMessageType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61381:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61381 | attr.displayName = UA_LOCALIZEDTEXT("", "UadpDataSetReaderMessageType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61381:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61381 | attr.displayName = UA_LOCALIZEDTEXT("", "UadpDataSetReaderMessageType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61382:354: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61382 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21116LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21104LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UadpDataSetReaderMessageType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61395:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61395 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetReaderTransportType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61395:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61395 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetReaderTransportType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61396:351: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61396 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15319LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetReaderTransportType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61409:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61409 | attr.displayName = UA_LOCALIZEDTEXT("", "BrokerDataSetReaderTransportType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61409:41: warning: passing 'const char[33]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61409 | attr.displayName = UA_LOCALIZEDTEXT("", "BrokerDataSetReaderTransportType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61410:351: warning: passing 'const char[33]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61410 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21142LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BrokerDataSetReaderTransportType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61424:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61424 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetReaderType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61424:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61424 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetReaderType"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61425:351: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61425 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetReaderType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61438:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61438 | attr.displayName = UA_LOCALIZEDTEXT("", "MessageSettings"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61438:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61438 | attr.displayName = UA_LOCALIZEDTEXT("", "MessageSettings"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61439:350: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61439 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21103LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MessageSettings"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21104LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61458:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61458 | attr.displayName = UA_LOCALIZEDTEXT("", "MessageReceiveTimeout"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61458:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61458 | attr.displayName = UA_LOCALIZEDTEXT("", "MessageReceiveTimeout"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61459:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61459 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21102LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MessageReceiveTimeout"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61478:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61478 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetFieldContentMask"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61478:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61478 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetFieldContentMask"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61479:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61479 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21101LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetFieldContentMask"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61498:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61498 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetMetaData"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61498:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61498 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetMetaData"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61499:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61499 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21100LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetMetaData"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61518:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61518 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61518:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61518 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterId"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61519:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61519 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21099LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetWriterId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61538:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61538 | attr.displayName = UA_LOCALIZEDTEXT("", "WriterGroupId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61538:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61538 | attr.displayName = UA_LOCALIZEDTEXT("", "WriterGroupId"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61539:352: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61539 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "WriterGroupId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61559:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61559 | attr.displayName = UA_LOCALIZEDTEXT("", "PublisherId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61559:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61559 | attr.displayName = UA_LOCALIZEDTEXT("", "PublisherId"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61560:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61560 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21097LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublisherId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61582:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61582 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetReaderProperties"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61582:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61582 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetReaderProperties"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61583:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61583 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17494LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetReaderProperties"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61596:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61596 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSet"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61596:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61596 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSet"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61597:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61597 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15316LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscribedDataSet"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15108LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61610:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61610 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportSettings"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61610:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61610 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportSettings"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61611:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61611 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15311LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransportSettings"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15319LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61625:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61625 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterMessageType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61625:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61625 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterMessageType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61626:351: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61626 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21096LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetWriterMessageType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61639:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61639 | attr.displayName = UA_LOCALIZEDTEXT("", "UadpDataSetWriterMessageType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61639:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61639 | attr.displayName = UA_LOCALIZEDTEXT("", "UadpDataSetWriterMessageType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61640:354: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61640 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21111LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21096LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UadpDataSetWriterMessageType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61654:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61654 | attr.displayName = UA_LOCALIZEDTEXT("", "WriterGroupMessageType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61654:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61654 | attr.displayName = UA_LOCALIZEDTEXT("", "WriterGroupMessageType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61655:351: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61655 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17998LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "WriterGroupMessageType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61668:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61668 | attr.displayName = UA_LOCALIZEDTEXT("", "UadpWriterGroupMessageType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61668:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61668 | attr.displayName = UA_LOCALIZEDTEXT("", "UadpWriterGroupMessageType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61669:354: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61669 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21105LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17998LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UadpWriterGroupMessageType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61685:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61685 | attr.displayName = UA_LOCALIZEDTEXT("", "SelectionListType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61685:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61685 | attr.displayName = UA_LOCALIZEDTEXT("", "SelectionListType"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61686:353: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61686 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 16309LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SelectionListType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61708:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61708 | attr.displayName = UA_LOCALIZEDTEXT("", "SelectionDescriptions"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61708:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61708 | attr.displayName = UA_LOCALIZEDTEXT("", "SelectionDescriptions"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61709:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61709 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17633LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 16309LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SelectionDescriptions"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61732:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61732 | attr.displayName = UA_LOCALIZEDTEXT("", "Selections"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61732:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61732 | attr.displayName = UA_LOCALIZEDTEXT("", "Selections"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61733:352: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61733 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17632LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 16309LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Selections"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61752:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61752 | attr.displayName = UA_LOCALIZEDTEXT("", "RestrictToList"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61752:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61752 | attr.displayName = UA_LOCALIZEDTEXT("", "RestrictToList"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61753:352: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61753 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 16312LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 16309LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RestrictToList"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61766:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61766 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubStatusType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61766:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61766 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubStatusType"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61767:351: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61767 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14643LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PubSubStatusType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61780:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61780 | attr.displayName = UA_LOCALIZEDTEXT("", "Status"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61780:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61780 | attr.displayName = UA_LOCALIZEDTEXT("", "Status"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61781:350: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61781 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15307LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Status"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14643LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61800:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61800 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61800:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61800 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61801:352: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61801 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15308LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15307LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "State"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61868:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61868 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61868:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61868 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61869:352: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61869 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14644LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14643LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "State"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61882:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61882 | attr.displayName = UA_LOCALIZEDTEXT("", "StandaloneSubscribedDataSetType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61882:41: warning: passing 'const char[32]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61882 | attr.displayName = UA_LOCALIZEDTEXT("", "StandaloneSubscribedDataSetType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61883:351: warning: passing 'const char[32]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61883 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23828LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "StandaloneSubscribedDataSetType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61902:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61902 | attr.displayName = UA_LOCALIZEDTEXT("", "IsConnected"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61902:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61902 | attr.displayName = UA_LOCALIZEDTEXT("", "IsConnected"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61903:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61903 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23831LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23828LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "IsConnected"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61922:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61922 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetMetaData"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61922:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61922 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetMetaData"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61923:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61923 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23830LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23828LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetMetaData"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61936:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61936 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSet"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61936:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61936 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSet"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61937:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61937 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23829LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23828LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscribedDataSet"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15108LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:61950:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61950 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSetFolderType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61950:41: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61950 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSetFolderType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:61951:351: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 61951 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23795LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 61LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscribedDataSetFolderType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:62426:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62426 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62426:41: warning: passing 'const char[34]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62426 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62427:350: warning: passing 'const char[34]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62427 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23807LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23795LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), ""),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23828LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:62446:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62446 | attr.displayName = UA_LOCALIZEDTEXT("", "IsConnected"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62446:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62446 | attr.displayName = UA_LOCALIZEDTEXT("", "IsConnected"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62447:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62447 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23810LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23807LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "IsConnected"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:62466:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62466 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetMetaData"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62466:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62466 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetMetaData"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62467:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62467 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23809LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23807LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetMetaData"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:62480:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62480 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSet"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62480:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62480 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSet"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62481:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62481 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23808LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23807LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscribedDataSet"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15108LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:62494:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62494 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62494:41: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62494 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62495:350: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62495 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23796LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23795LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 35LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), ""),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23795LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:62970:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62970 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62970:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62970 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterType"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62971:351: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62971 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15298LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetWriterType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:62990:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62990 | attr.displayName = UA_LOCALIZEDTEXT("", "KeyFrameCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62990:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62990 | attr.displayName = UA_LOCALIZEDTEXT("", "KeyFrameCount"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:62991:352: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 62991 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21094LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15298LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "KeyFrameCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63010:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63010 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetFieldContentMask"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63010:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63010 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetFieldContentMask"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63011:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63011 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21093LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15298LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetFieldContentMask"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63030:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63030 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63030:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63030 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterId"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63031:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63031 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21092LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15298LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetWriterId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63053:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63053 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterProperties"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63053:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63053 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterProperties"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63054:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63054 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17493LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15298LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetWriterProperties"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63067:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63067 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportSettings"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63067:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63067 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportSettings"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63068:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63068 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15303LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15298LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransportSettings"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63081:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63081 | attr.displayName = UA_LOCALIZEDTEXT("", "Status"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63081:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63081 | attr.displayName = UA_LOCALIZEDTEXT("", "Status"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63082:350: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63082 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15299LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15298LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Status"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14643LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63101:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63101 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63101:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63101 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63102:352: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63102 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15300LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15299LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "State"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63115:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63115 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubGroupType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63115:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63115 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubGroupType"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63116:351: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63116 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14232LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PubSubGroupType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63129:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63129 | attr.displayName = UA_LOCALIZEDTEXT("", "ReaderGroupType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63129:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63129 | attr.displayName = UA_LOCALIZEDTEXT("", "ReaderGroupType"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63130:354: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63130 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17999LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14232LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ReaderGroupType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63377:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63377 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63377:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63377 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63378:353: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63378 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 18076LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17999LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15297LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), ""),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15306LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63391:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63391 | attr.displayName = UA_LOCALIZEDTEXT("", "WriterGroupType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63391:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63391 | attr.displayName = UA_LOCALIZEDTEXT("", "WriterGroupType"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63392:354: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63392 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17725LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14232LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "WriterGroupType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63638:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63638 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63638:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63638 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63639:353: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63639 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17743LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17725LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15296LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), ""),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15298LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63652:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63652 | attr.displayName = UA_LOCALIZEDTEXT("", "Status"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63652:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63652 | attr.displayName = UA_LOCALIZEDTEXT("", "Status"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63653:350: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63653 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17749LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17743LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Status"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14643LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63672:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63672 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63672:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63672 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63673:352: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63673 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17750LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17749LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "State"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63692:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63692 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetFieldContentMask"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63692:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63692 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetFieldContentMask"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63693:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63693 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17745LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17743LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetFieldContentMask"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63712:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63712 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63712:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63712 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterId"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63713:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63713 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17744LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17743LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetWriterId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63735:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63735 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterProperties"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63735:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63735 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetWriterProperties"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63736:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63736 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17490LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17743LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetWriterProperties"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63758:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63758 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIds"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63758:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63758 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIds"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63759:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63759 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17740LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17725LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "LocaleIds"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63778:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63778 | attr.displayName = UA_LOCALIZEDTEXT("", "Priority"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63778:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63778 | attr.displayName = UA_LOCALIZEDTEXT("", "Priority"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63779:352: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63779 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17739LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17725LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Priority"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63798:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63798 | attr.displayName = UA_LOCALIZEDTEXT("", "KeepAliveTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63798:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63798 | attr.displayName = UA_LOCALIZEDTEXT("", "KeepAliveTime"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63799:352: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63799 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17738LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17725LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "KeepAliveTime"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63818:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63818 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingInterval"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63818:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63818 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingInterval"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63819:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63819 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17737LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17725LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishingInterval"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63838:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63838 | attr.displayName = UA_LOCALIZEDTEXT("", "WriterGroupId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63838:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63838 | attr.displayName = UA_LOCALIZEDTEXT("", "WriterGroupId"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63839:352: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63839 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17736LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17725LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "WriterGroupId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63858:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63858 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNetworkMessageSize"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63858:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63858 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNetworkMessageSize"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63859:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63859 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17724LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14232LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNetworkMessageSize"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63878:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63878 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityGroupId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63878:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63878 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityGroupId"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63879:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63879 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15927LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14232LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityGroupId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63892:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63892 | attr.displayName = UA_LOCALIZEDTEXT("", "Status"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63892:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63892 | attr.displayName = UA_LOCALIZEDTEXT("", "Status"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63893:350: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63893 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15265LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14232LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Status"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14643LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63912:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63912 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63912:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63912 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63913:352: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63913 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15266LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15265LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "State"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63927:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63927 | attr.displayName = UA_LOCALIZEDTEXT("", "ConnectionTransportType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63927:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63927 | attr.displayName = UA_LOCALIZEDTEXT("", "ConnectionTransportType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63928:351: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63928 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17721LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ConnectionTransportType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63942:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63942 | attr.displayName = UA_LOCALIZEDTEXT("", "NetworkAddressType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63942:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63942 | attr.displayName = UA_LOCALIZEDTEXT("", "NetworkAddressType"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63943:351: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63943 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21145LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NetworkAddressType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63956:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63956 | attr.displayName = UA_LOCALIZEDTEXT("", "NetworkAddressUrlType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63956:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63956 | attr.displayName = UA_LOCALIZEDTEXT("", "NetworkAddressUrlType"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63957:354: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63957 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21147LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21145LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NetworkAddressUrlType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63976:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63976 | attr.displayName = UA_LOCALIZEDTEXT("", "Url"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63976:41: warning: passing 'const char[4]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63976 | attr.displayName = UA_LOCALIZEDTEXT("", "Url"); + | ^~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63977:352: warning: passing 'const char[4]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63977 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21149LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21147LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Url"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:63996:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63996 | attr.displayName = UA_LOCALIZEDTEXT("", "NetworkInterface"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63996:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63996 | attr.displayName = UA_LOCALIZEDTEXT("", "NetworkInterface"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:63997:352: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 63997 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21146LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21145LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NetworkInterface"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64010:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64010 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubConnectionType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64010:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64010 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubConnectionType"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64011:351: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64011 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14209LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PubSubConnectionType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64033:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64033 | attr.displayName = UA_LOCALIZEDTEXT("", "ConnectionProperties"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64033:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64033 | attr.displayName = UA_LOCALIZEDTEXT("", "ConnectionProperties"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64034:352: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64034 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17485LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14209LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ConnectionProperties"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64343:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64343 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64343:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64343 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64344:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64344 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17325LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14209LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), ""),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17999LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64357:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64357 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64357:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64357 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64358:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64358 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17310LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14209LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), ""),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17725LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64377:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64377 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportProfileUri"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64377:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64377 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportProfileUri"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64378:352: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64378 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14209LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransportProfileUri"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 16309LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64401:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64401 | attr.displayName = UA_LOCALIZEDTEXT("", "Selections"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64401:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64401 | attr.displayName = UA_LOCALIZEDTEXT("", "Selections"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64402:352: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64402 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17710LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17306LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Selections"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64415:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64415 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportSettings"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64415:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64415 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportSettings"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64416:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64416 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17203LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14209LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransportSettings"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17721LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64429:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64429 | attr.displayName = UA_LOCALIZEDTEXT("", "Status"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64429:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64429 | attr.displayName = UA_LOCALIZEDTEXT("", "Status"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64430:350: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64430 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14600LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14209LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Status"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14643LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64449:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64449 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64449:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64449 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64450:352: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64450 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14601LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14600LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "State"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64470:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64470 | attr.displayName = UA_LOCALIZEDTEXT("", "PublisherId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64470:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64470 | attr.displayName = UA_LOCALIZEDTEXT("", "PublisherId"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64471:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64471 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14595LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14209LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublisherId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64570:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64570 | attr.displayName = UA_LOCALIZEDTEXT("", "Address"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64570:41: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64570 | attr.displayName = UA_LOCALIZEDTEXT("", "Address"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64571:350: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64571 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14221LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14209LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Address"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21145LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64590:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64590 | attr.displayName = UA_LOCALIZEDTEXT("", "NetworkInterface"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64590:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64590 | attr.displayName = UA_LOCALIZEDTEXT("", "NetworkInterface"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64591:352: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64591 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17202LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14221LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NetworkInterface"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64604:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64604 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataSetType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64604:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64604 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataSetType"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64605:351: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64605 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14509LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishedDataSetType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64624:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64624 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetClassId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64624:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64624 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetClassId"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64625:352: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64625 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 16759LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14509LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetClassId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64644:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64644 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetMetaData"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64644:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64644 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetMetaData"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64645:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64645 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15229LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14509LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetMetaData"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:64658:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64658 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataItemsType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64658:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64658 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataItemsType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:64659:354: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 64659 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14534LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14509LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishedDataItemsType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:65073:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65073 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedData"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65073:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65073 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedData"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65074:352: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65074 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14548LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14534LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishedData"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:65093:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65093 | attr.displayName = UA_LOCALIZEDTEXT("", "ConfigurationVersion"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65093:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65093 | attr.displayName = UA_LOCALIZEDTEXT("", "ConfigurationVersion"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65094:352: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65094 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14519LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14509LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ConfigurationVersion"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:65107:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65107 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetFolderType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65107:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65107 | attr.displayName = UA_LOCALIZEDTEXT("", "DataSetFolderType"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65108:351: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65108 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14477LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 61LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataSetFolderType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:65669:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65669 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65669:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65669 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65670:350: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65670 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14478LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14477LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 35LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), ""),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14477LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:65683:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65683 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubKeyServiceType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65683:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65683 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubKeyServiceType"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65684:351: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65684 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15906LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PubSubKeyServiceType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:65697:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65697 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishSubscribeType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65697:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65697 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishSubscribeType"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65698:354: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65698 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14416LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15906LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishSubscribeType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:65717:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65717 | attr.displayName = UA_LOCALIZEDTEXT("", "DefaultDatagramPublisherId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65717:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65717 | attr.displayName = UA_LOCALIZEDTEXT("", "DefaultDatagramPublisherId"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65718:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65718 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 25432LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14416LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DefaultDatagramPublisherId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:65731:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65731 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSets"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65731:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65731 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSets"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65732:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65732 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23622LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14416LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscribedDataSets"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23795LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:65754:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65754 | attr.displayName = UA_LOCALIZEDTEXT("", "SupportedTransportProfiles"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65754:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65754 | attr.displayName = UA_LOCALIZEDTEXT("", "SupportedTransportProfiles"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65755:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65755 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17479LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14416LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SupportedTransportProfiles"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:65916:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65916 | attr.displayName = UA_LOCALIZEDTEXT("", "Status"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65916:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65916 | attr.displayName = UA_LOCALIZEDTEXT("", "Status"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65917:350: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65917 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15844LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14416LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Status"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14643LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:65936:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65936 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65936:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65936 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65937:352: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65937 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15845LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15844LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "State"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:65950:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65950 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataSets"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65950:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65950 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataSets"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:65951:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 65951 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14434LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14416LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishedDataSets"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14477LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66050:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66050 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66050:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66050 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66051:353: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66051 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14417LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14416LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14476LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), ""),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14209LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66073:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66073 | attr.displayName = UA_LOCALIZEDTEXT("", "ConnectionProperties"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66073:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66073 | attr.displayName = UA_LOCALIZEDTEXT("", "ConnectionProperties"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66074:352: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66074 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17478LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14417LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ConnectionProperties"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66093:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66093 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportProfileUri"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66093:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66093 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportProfileUri"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66094:352: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66094 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17292LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14417LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransportProfileUri"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 16309LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66117:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66117 | attr.displayName = UA_LOCALIZEDTEXT("", "Selections"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66117:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66117 | attr.displayName = UA_LOCALIZEDTEXT("", "Selections"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66118:352: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66118 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17706LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17292LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Selections"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66131:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66131 | attr.displayName = UA_LOCALIZEDTEXT("", "Address"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66131:41: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66131 | attr.displayName = UA_LOCALIZEDTEXT("", "Address"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66132:350: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66132 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14423LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14417LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Address"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 21145LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66151:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66151 | attr.displayName = UA_LOCALIZEDTEXT("", "NetworkInterface"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66151:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66151 | attr.displayName = UA_LOCALIZEDTEXT("", "NetworkInterface"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66152:352: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66152 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15533LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14423LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NetworkInterface"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66172:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66172 | attr.displayName = UA_LOCALIZEDTEXT("", "PublisherId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66172:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66172 | attr.displayName = UA_LOCALIZEDTEXT("", "PublisherId"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66173:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66173 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14418LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14417LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublisherId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66189:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66189 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsVariableType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66189:41: warning: passing 'const char[31]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66189 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsVariableType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66190:352: warning: passing 'const char[31]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66190 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionDiagnosticsVariableType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66209:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66209 | attr.displayName = UA_LOCALIZEDTEXT("", "TotalRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66209:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66209 | attr.displayName = UA_LOCALIZEDTEXT("", "TotalRequestCount"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66210:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66210 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8900LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TotalRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66229:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66229 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxResponseMessageSize"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66229:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66229 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxResponseMessageSize"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66230:350: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66230 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3050LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxResponseMessageSize"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66249:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66249 | attr.displayName = UA_LOCALIZEDTEXT("", "UnregisterNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66249:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66249 | attr.displayName = UA_LOCALIZEDTEXT("", "UnregisterNodesCount"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66250:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66250 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2731LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UnregisterNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66269:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66269 | attr.displayName = UA_LOCALIZEDTEXT("", "RegisterNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66269:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66269 | attr.displayName = UA_LOCALIZEDTEXT("", "RegisterNodesCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66270:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66270 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2730LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RegisterNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66289:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66289 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryNextCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66289:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66289 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryNextCount"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66290:350: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66290 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2242LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "QueryNextCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66309:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66309 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryFirstCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66309:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66309 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryFirstCount"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66310:350: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66310 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2241LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "QueryFirstCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66329:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66329 | attr.displayName = UA_LOCALIZEDTEXT("", "TranslateBrowsePathsToNodeIdsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66329:41: warning: passing 'const char[35]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66329 | attr.displayName = UA_LOCALIZEDTEXT("", "TranslateBrowsePathsToNodeIdsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66330:350: warning: passing 'const char[35]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66330 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2240LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TranslateBrowsePathsToNodeIdsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66349:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66349 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseNextCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66349:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66349 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseNextCount"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66350:350: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66350 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2239LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BrowseNextCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66369:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66369 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66369:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66369 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseCount"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66370:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66370 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2238LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BrowseCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66389:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66389 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteReferencesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66389:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66389 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteReferencesCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66390:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66390 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2237LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteReferencesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66409:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66409 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66409:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66409 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteNodesCount"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66410:350: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66410 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2236LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66429:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66429 | attr.displayName = UA_LOCALIZEDTEXT("", "AddReferencesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66429:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66429 | attr.displayName = UA_LOCALIZEDTEXT("", "AddReferencesCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66430:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66430 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2235LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AddReferencesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66449:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66449 | attr.displayName = UA_LOCALIZEDTEXT("", "AddNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66449:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66449 | attr.displayName = UA_LOCALIZEDTEXT("", "AddNodesCount"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66450:350: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66450 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2234LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AddNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66469:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66469 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteSubscriptionsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66469:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66469 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteSubscriptionsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66470:350: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66470 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2233LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteSubscriptionsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66489:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66489 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferSubscriptionsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66489:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66489 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferSubscriptionsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66490:350: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66490 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2232LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransferSubscriptionsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66509:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66509 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66509:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66509 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishCount"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66510:350: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66510 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2231LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RepublishCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66529:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66529 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66529:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66529 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishCount"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66530:350: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66530 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2230LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66549:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66549 | attr.displayName = UA_LOCALIZEDTEXT("", "SetPublishingModeCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66549:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66549 | attr.displayName = UA_LOCALIZEDTEXT("", "SetPublishingModeCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66550:350: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66550 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2229LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SetPublishingModeCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66569:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66569 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifySubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66569:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66569 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifySubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66570:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66570 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2228LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ModifySubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66589:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66589 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateSubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66589:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66589 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateSubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66590:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66590 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2227LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CreateSubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66609:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66609 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66609:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66609 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66610:350: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66610 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2226LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66629:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66629 | attr.displayName = UA_LOCALIZEDTEXT("", "SetTriggeringCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66629:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66629 | attr.displayName = UA_LOCALIZEDTEXT("", "SetTriggeringCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66630:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66630 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2225LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SetTriggeringCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66649:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66649 | attr.displayName = UA_LOCALIZEDTEXT("", "SetMonitoringModeCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66649:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66649 | attr.displayName = UA_LOCALIZEDTEXT("", "SetMonitoringModeCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66650:350: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66650 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2224LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SetMonitoringModeCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66669:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66669 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifyMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66669:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66669 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifyMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66670:350: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66670 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2223LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ModifyMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66689:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66689 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66689:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66689 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66690:350: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66690 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2222LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CreateMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66709:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66709 | attr.displayName = UA_LOCALIZEDTEXT("", "CallCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66709:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66709 | attr.displayName = UA_LOCALIZEDTEXT("", "CallCount"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66710:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66710 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2221LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CallCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66729:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66729 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryUpdateCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66729:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66729 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryUpdateCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66730:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66730 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2220LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HistoryUpdateCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66749:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66749 | attr.displayName = UA_LOCALIZEDTEXT("", "WriteCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66749:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66749 | attr.displayName = UA_LOCALIZEDTEXT("", "WriteCount"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66750:350: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66750 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2219LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "WriteCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66769:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66769 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryReadCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66769:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66769 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryReadCount"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66770:350: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66770 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2218LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HistoryReadCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66789:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66789 | attr.displayName = UA_LOCALIZEDTEXT("", "ReadCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66789:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66789 | attr.displayName = UA_LOCALIZEDTEXT("", "ReadCount"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66790:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66790 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2217LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ReadCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66809:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66809 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentPublishRequestsInQueue"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66809:41: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66809 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentPublishRequestsInQueue"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66810:350: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66810 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2209LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentPublishRequestsInQueue"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66829:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66829 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66829:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66829 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66830:350: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66830 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2208LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66849:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66849 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66849:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66849 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66850:350: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66850 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2207LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentSubscriptionsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66869:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66869 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientLastContactTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66869:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66869 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientLastContactTime"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66870:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66870 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2206LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientLastContactTime"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66889:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66889 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientConnectionTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66889:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66889 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientConnectionTime"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66890:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66890 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2205LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientConnectionTime"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66909:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66909 | attr.displayName = UA_LOCALIZEDTEXT("", "ActualSessionTimeout"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66909:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66909 | attr.displayName = UA_LOCALIZEDTEXT("", "ActualSessionTimeout"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66910:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66910 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2204LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ActualSessionTimeout"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66932:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66932 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIds"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66932:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66932 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIds"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66933:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66933 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2203LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "LocaleIds"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66952:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66952 | attr.displayName = UA_LOCALIZEDTEXT("", "EndpointUrl"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66952:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66952 | attr.displayName = UA_LOCALIZEDTEXT("", "EndpointUrl"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66953:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66953 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2202LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EndpointUrl"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66972:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66972 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerUri"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66972:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66972 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerUri"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66973:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66973 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2201LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerUri"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:66992:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66992 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientDescription"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66992:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66992 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientDescription"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:66993:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 66993 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2200LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientDescription"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67012:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67012 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionName"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67012:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67012 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionName"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67013:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67013 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2199LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionName"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67032:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67032 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67032:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67032 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67033:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67033 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2198LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67052:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67052 | attr.displayName = UA_LOCALIZEDTEXT("", "UnauthorizedRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67052:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67052 | attr.displayName = UA_LOCALIZEDTEXT("", "UnauthorizedRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67053:351: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67053 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11892LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UnauthorizedRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67069:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67069 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67069:41: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67069 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67070:352: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67070 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscriptionDiagnosticsType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67089:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67089 | attr.displayName = UA_LOCALIZEDTEXT("", "EventQueueOverflowCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67089:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67089 | attr.displayName = UA_LOCALIZEDTEXT("", "EventQueueOverflowCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67090:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67090 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8902LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EventQueueOverflowCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67109:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67109 | attr.displayName = UA_LOCALIZEDTEXT("", "NextSequenceNumber"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67109:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67109 | attr.displayName = UA_LOCALIZEDTEXT("", "NextSequenceNumber"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67110:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67110 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8897LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NextSequenceNumber"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67129:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67129 | attr.displayName = UA_LOCALIZEDTEXT("", "MonitoringQueueOverflowCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67129:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67129 | attr.displayName = UA_LOCALIZEDTEXT("", "MonitoringQueueOverflowCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67130:350: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67130 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8896LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MonitoringQueueOverflowCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67149:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67149 | attr.displayName = UA_LOCALIZEDTEXT("", "DisabledMonitoredItemCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67149:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67149 | attr.displayName = UA_LOCALIZEDTEXT("", "DisabledMonitoredItemCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67150:350: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67150 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8895LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DisabledMonitoredItemCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67169:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67169 | attr.displayName = UA_LOCALIZEDTEXT("", "MonitoredItemCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67169:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67169 | attr.displayName = UA_LOCALIZEDTEXT("", "MonitoredItemCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67170:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67170 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8894LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MonitoredItemCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67189:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67189 | attr.displayName = UA_LOCALIZEDTEXT("", "DiscardedMessageCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67189:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67189 | attr.displayName = UA_LOCALIZEDTEXT("", "DiscardedMessageCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67190:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67190 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8893LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DiscardedMessageCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67209:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67209 | attr.displayName = UA_LOCALIZEDTEXT("", "UnacknowledgedMessageCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67209:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67209 | attr.displayName = UA_LOCALIZEDTEXT("", "UnacknowledgedMessageCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67210:350: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67210 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8892LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UnacknowledgedMessageCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67229:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67229 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentLifetimeCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67229:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67229 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentLifetimeCount"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67230:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67230 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8891LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentLifetimeCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67249:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67249 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentKeepAliveCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67249:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67249 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentKeepAliveCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67250:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67250 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8890LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentKeepAliveCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67269:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67269 | attr.displayName = UA_LOCALIZEDTEXT("", "LatePublishRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67269:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67269 | attr.displayName = UA_LOCALIZEDTEXT("", "LatePublishRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67270:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67270 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8889LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "LatePublishRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67289:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67289 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxLifetimeCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67289:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67289 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxLifetimeCount"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67290:350: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67290 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8888LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxLifetimeCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67309:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67309 | attr.displayName = UA_LOCALIZEDTEXT("", "EventNotificationsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67309:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67309 | attr.displayName = UA_LOCALIZEDTEXT("", "EventNotificationsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67310:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67310 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2998LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EventNotificationsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67329:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67329 | attr.displayName = UA_LOCALIZEDTEXT("", "NotificationsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67329:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67329 | attr.displayName = UA_LOCALIZEDTEXT("", "NotificationsCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67330:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67330 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2193LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NotificationsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67349:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67349 | attr.displayName = UA_LOCALIZEDTEXT("", "DataChangeNotificationsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67349:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67349 | attr.displayName = UA_LOCALIZEDTEXT("", "DataChangeNotificationsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67350:350: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67350 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2191LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataChangeNotificationsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67369:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67369 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67369:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67369 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67370:350: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67370 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2190LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67389:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67389 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferredToSameClientCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67389:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67389 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferredToSameClientCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67390:350: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67390 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2189LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransferredToSameClientCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67409:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67409 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferredToAltClientCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67409:41: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67409 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferredToAltClientCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67410:350: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67410 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2188LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransferredToAltClientCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67429:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67429 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67429:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67429 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67430:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67430 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2187LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransferRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67449:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67449 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishMessageCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67449:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67449 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishMessageCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67450:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67450 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2186LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RepublishMessageCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67469:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67469 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishMessageRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67469:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67469 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishMessageRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67470:350: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67470 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2185LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RepublishMessageRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67489:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67489 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67489:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67489 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67490:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67490 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2184LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RepublishRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67509:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67509 | attr.displayName = UA_LOCALIZEDTEXT("", "DisableCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67509:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67509 | attr.displayName = UA_LOCALIZEDTEXT("", "DisableCount"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67510:350: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67510 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2183LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DisableCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67529:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67529 | attr.displayName = UA_LOCALIZEDTEXT("", "EnableCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67529:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67529 | attr.displayName = UA_LOCALIZEDTEXT("", "EnableCount"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67530:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67530 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2182LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnableCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67549:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67549 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifyCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67549:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67549 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifyCount"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67550:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67550 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2181LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ModifyCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67569:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67569 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingEnabled"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67569:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67569 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingEnabled"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67570:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67570 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2180LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishingEnabled"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67589:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67589 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNotificationsPerPublish"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67589:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67589 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNotificationsPerPublish"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67590:350: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67590 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2179LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNotificationsPerPublish"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67609:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67609 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxKeepAliveCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67609:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67609 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxKeepAliveCount"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67610:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67610 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2177LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxKeepAliveCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67629:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67629 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingInterval"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67629:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67629 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingInterval"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67630:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67630 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2176LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishingInterval"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67649:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67649 | attr.displayName = UA_LOCALIZEDTEXT("", "Priority"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67649:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67649 | attr.displayName = UA_LOCALIZEDTEXT("", "Priority"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67650:350: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67650 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2175LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Priority"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67669:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67669 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67669:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67669 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionId"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67670:350: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67670 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2174LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscriptionId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67689:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67689 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67689:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67689 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67690:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67690 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2173LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67709:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67709 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsArrayType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67709:41: warning: passing 'const char[33]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67709 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsArrayType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67710:352: warning: passing 'const char[33]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67710 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2171LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscriptionDiagnosticsArrayType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67729:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67729 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnostics"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67729:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67729 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnostics"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67730:351: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67730 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2171LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscriptionDiagnostics"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2172LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67749:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67749 | attr.displayName = UA_LOCALIZEDTEXT("", "EventQueueOverflowCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67749:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67749 | attr.displayName = UA_LOCALIZEDTEXT("", "EventQueueOverflowCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67750:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67750 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12815LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EventQueueOverflowCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67769:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67769 | attr.displayName = UA_LOCALIZEDTEXT("", "NextSequenceNumber"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67769:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67769 | attr.displayName = UA_LOCALIZEDTEXT("", "NextSequenceNumber"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67770:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67770 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12814LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NextSequenceNumber"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67789:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67789 | attr.displayName = UA_LOCALIZEDTEXT("", "MonitoringQueueOverflowCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67789:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67789 | attr.displayName = UA_LOCALIZEDTEXT("", "MonitoringQueueOverflowCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67790:352: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67790 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12813LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MonitoringQueueOverflowCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67809:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67809 | attr.displayName = UA_LOCALIZEDTEXT("", "DisabledMonitoredItemCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67809:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67809 | attr.displayName = UA_LOCALIZEDTEXT("", "DisabledMonitoredItemCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67810:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67810 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12812LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DisabledMonitoredItemCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67829:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67829 | attr.displayName = UA_LOCALIZEDTEXT("", "MonitoredItemCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67829:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67829 | attr.displayName = UA_LOCALIZEDTEXT("", "MonitoredItemCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67830:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67830 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12811LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MonitoredItemCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67849:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67849 | attr.displayName = UA_LOCALIZEDTEXT("", "DiscardedMessageCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67849:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67849 | attr.displayName = UA_LOCALIZEDTEXT("", "DiscardedMessageCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67850:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67850 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12810LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DiscardedMessageCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67869:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67869 | attr.displayName = UA_LOCALIZEDTEXT("", "UnacknowledgedMessageCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67869:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67869 | attr.displayName = UA_LOCALIZEDTEXT("", "UnacknowledgedMessageCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67870:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67870 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12809LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UnacknowledgedMessageCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67889:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67889 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentLifetimeCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67889:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67889 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentLifetimeCount"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67890:352: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67890 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12808LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentLifetimeCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67909:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67909 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentKeepAliveCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67909:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67909 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentKeepAliveCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67910:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67910 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12807LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentKeepAliveCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67929:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67929 | attr.displayName = UA_LOCALIZEDTEXT("", "LatePublishRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67929:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67929 | attr.displayName = UA_LOCALIZEDTEXT("", "LatePublishRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67930:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67930 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12806LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "LatePublishRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67949:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67949 | attr.displayName = UA_LOCALIZEDTEXT("", "NotificationsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67949:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67949 | attr.displayName = UA_LOCALIZEDTEXT("", "NotificationsCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67950:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67950 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12805LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NotificationsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67969:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67969 | attr.displayName = UA_LOCALIZEDTEXT("", "EventNotificationsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67969:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67969 | attr.displayName = UA_LOCALIZEDTEXT("", "EventNotificationsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67970:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67970 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12804LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EventNotificationsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:67989:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67989 | attr.displayName = UA_LOCALIZEDTEXT("", "DataChangeNotificationsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67989:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67989 | attr.displayName = UA_LOCALIZEDTEXT("", "DataChangeNotificationsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:67990:352: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 67990 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12803LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataChangeNotificationsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68009:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68009 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68009:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68009 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68010:352: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68010 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12802LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68029:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68029 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferredToSameClientCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68029:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68029 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferredToSameClientCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68030:352: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68030 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12801LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransferredToSameClientCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68049:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68049 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferredToAltClientCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68049:41: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68049 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferredToAltClientCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68050:352: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68050 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12800LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransferredToAltClientCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68069:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68069 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68069:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68069 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68070:352: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68070 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12799LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransferRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68089:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68089 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishMessageCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68089:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68089 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishMessageCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68090:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68090 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12798LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RepublishMessageCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68109:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68109 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishMessageRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68109:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68109 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishMessageRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68110:352: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68110 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12797LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RepublishMessageRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68129:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68129 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68129:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68129 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68130:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68130 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12796LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RepublishRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68149:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68149 | attr.displayName = UA_LOCALIZEDTEXT("", "DisableCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68149:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68149 | attr.displayName = UA_LOCALIZEDTEXT("", "DisableCount"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68150:352: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68150 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12795LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DisableCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68169:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68169 | attr.displayName = UA_LOCALIZEDTEXT("", "EnableCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68169:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68169 | attr.displayName = UA_LOCALIZEDTEXT("", "EnableCount"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68170:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68170 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12794LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnableCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68189:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68189 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifyCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68189:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68189 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifyCount"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68190:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68190 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12793LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ModifyCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68209:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68209 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingEnabled"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68209:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68209 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingEnabled"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68210:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68210 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12792LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishingEnabled"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68229:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68229 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNotificationsPerPublish"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68229:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68229 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNotificationsPerPublish"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68230:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68230 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12791LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNotificationsPerPublish"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68249:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68249 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxLifetimeCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68249:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68249 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxLifetimeCount"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68250:352: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68250 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12790LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxLifetimeCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68269:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68269 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxKeepAliveCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68269:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68269 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxKeepAliveCount"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68270:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68270 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12789LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxKeepAliveCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68289:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68289 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingInterval"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68289:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68289 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingInterval"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68290:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68290 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12788LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishingInterval"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68309:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68309 | attr.displayName = UA_LOCALIZEDTEXT("", "Priority"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68309:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68309 | attr.displayName = UA_LOCALIZEDTEXT("", "Priority"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68310:352: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68310 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12787LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Priority"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68329:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68329 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68329:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68329 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionId"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68330:352: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68330 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12786LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscriptionId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68349:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68349 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68349:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68349 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68350:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68350 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12785LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12784LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68366:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68366 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnosticsType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68366:41: warning: passing 'const char[31]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68366 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnosticsType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68367:352: warning: passing 'const char[31]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68367 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2244LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionSecurityDiagnosticsType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68386:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68386 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientCertificate"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68386:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68386 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientCertificate"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68387:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68387 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3058LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2244LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientCertificate"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68406:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68406 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityPolicyUri"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68406:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68406 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityPolicyUri"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68407:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68407 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2252LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2244LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityPolicyUri"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68426:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68426 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityMode"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68426:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68426 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityMode"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68427:350: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68427 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2251LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2244LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityMode"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68446:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68446 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportProtocol"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68446:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68446 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportProtocol"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68447:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68447 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2250LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2244LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransportProtocol"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68466:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68466 | attr.displayName = UA_LOCALIZEDTEXT("", "Encoding"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68466:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68466 | attr.displayName = UA_LOCALIZEDTEXT("", "Encoding"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68467:350: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68467 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2249LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2244LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Encoding"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68486:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68486 | attr.displayName = UA_LOCALIZEDTEXT("", "AuthenticationMechanism"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68486:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68486 | attr.displayName = UA_LOCALIZEDTEXT("", "AuthenticationMechanism"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68487:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68487 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2248LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2244LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AuthenticationMechanism"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68509:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68509 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdHistory"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68509:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68509 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdHistory"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68510:350: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68510 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2247LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2244LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientUserIdHistory"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68529:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68529 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdOfSession"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68529:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68529 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdOfSession"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68530:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68530 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2246LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2244LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientUserIdOfSession"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68549:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68549 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68549:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68549 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68550:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68550 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2245LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2244LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68563:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68563 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsObjectType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68563:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68563 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsObjectType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68564:350: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68564 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2029LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionDiagnosticsObjectType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68586:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68586 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68586:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68586 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsArray"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68587:350: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68587 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2032LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2029LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscriptionDiagnosticsArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2171LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68606:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68606 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnostics"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68606:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68606 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnostics"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68607:350: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68607 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2031LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2029LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionSecurityDiagnostics"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2244LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68626:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68626 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientCertificate"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68626:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68626 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientCertificate"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68627:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68627 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3187LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2031LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientCertificate"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68646:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68646 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityPolicyUri"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68646:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68646 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityPolicyUri"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68647:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68647 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3186LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2031LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityPolicyUri"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68666:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68666 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityMode"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68666:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68666 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityMode"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68667:350: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68667 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3185LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2031LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityMode"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68686:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68686 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportProtocol"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68686:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68686 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportProtocol"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68687:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68687 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3184LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2031LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransportProtocol"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68706:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68706 | attr.displayName = UA_LOCALIZEDTEXT("", "Encoding"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68706:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68706 | attr.displayName = UA_LOCALIZEDTEXT("", "Encoding"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68707:350: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68707 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3183LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2031LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Encoding"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68726:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68726 | attr.displayName = UA_LOCALIZEDTEXT("", "AuthenticationMechanism"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68726:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68726 | attr.displayName = UA_LOCALIZEDTEXT("", "AuthenticationMechanism"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68727:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68727 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3182LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2031LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AuthenticationMechanism"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68749:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68749 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdHistory"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68749:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68749 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdHistory"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68750:350: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68750 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3181LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2031LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientUserIdHistory"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68769:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68769 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdOfSession"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68769:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68769 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdOfSession"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68770:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68770 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3180LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2031LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientUserIdOfSession"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68789:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68789 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68789:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68789 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68790:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68790 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3179LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2031LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68809:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68809 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnostics"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68809:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68809 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnostics"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68810:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68810 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2029LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionDiagnostics"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68829:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68829 | attr.displayName = UA_LOCALIZEDTEXT("", "TotalRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68829:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68829 | attr.displayName = UA_LOCALIZEDTEXT("", "TotalRequestCount"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68830:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68830 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8898LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TotalRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68849:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68849 | attr.displayName = UA_LOCALIZEDTEXT("", "UnregisterNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68849:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68849 | attr.displayName = UA_LOCALIZEDTEXT("", "UnregisterNodesCount"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68850:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68850 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3178LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UnregisterNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68869:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68869 | attr.displayName = UA_LOCALIZEDTEXT("", "RegisterNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68869:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68869 | attr.displayName = UA_LOCALIZEDTEXT("", "RegisterNodesCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68870:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68870 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3177LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RegisterNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68889:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68889 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryNextCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68889:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68889 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryNextCount"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68890:350: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68890 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3176LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "QueryNextCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68909:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68909 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryFirstCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68909:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68909 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryFirstCount"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68910:350: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68910 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3175LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "QueryFirstCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68929:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68929 | attr.displayName = UA_LOCALIZEDTEXT("", "TranslateBrowsePathsToNodeIdsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68929:41: warning: passing 'const char[35]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68929 | attr.displayName = UA_LOCALIZEDTEXT("", "TranslateBrowsePathsToNodeIdsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68930:350: warning: passing 'const char[35]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68930 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3174LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TranslateBrowsePathsToNodeIdsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68949:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68949 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseNextCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68949:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68949 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseNextCount"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68950:350: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68950 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3173LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BrowseNextCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68969:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68969 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68969:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68969 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseCount"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68970:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68970 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3172LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BrowseCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:68989:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68989 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteReferencesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68989:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68989 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteReferencesCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:68990:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 68990 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3171LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteReferencesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69009:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69009 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69009:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69009 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteNodesCount"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69010:350: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69010 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3170LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69029:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69029 | attr.displayName = UA_LOCALIZEDTEXT("", "AddReferencesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69029:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69029 | attr.displayName = UA_LOCALIZEDTEXT("", "AddReferencesCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69030:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69030 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3169LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AddReferencesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69049:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69049 | attr.displayName = UA_LOCALIZEDTEXT("", "AddNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69049:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69049 | attr.displayName = UA_LOCALIZEDTEXT("", "AddNodesCount"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69050:350: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69050 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3168LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AddNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69069:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69069 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteSubscriptionsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69069:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69069 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteSubscriptionsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69070:350: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69070 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3167LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteSubscriptionsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69089:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69089 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferSubscriptionsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69089:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69089 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferSubscriptionsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69090:350: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69090 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3166LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransferSubscriptionsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69109:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69109 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69109:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69109 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishCount"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69110:350: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69110 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3165LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RepublishCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69129:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69129 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69129:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69129 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishCount"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69130:350: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69130 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3164LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69149:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69149 | attr.displayName = UA_LOCALIZEDTEXT("", "SetPublishingModeCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69149:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69149 | attr.displayName = UA_LOCALIZEDTEXT("", "SetPublishingModeCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69150:350: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69150 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3163LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SetPublishingModeCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69169:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69169 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifySubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69169:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69169 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifySubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69170:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69170 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3162LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ModifySubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69189:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69189 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateSubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69189:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69189 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateSubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69190:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69190 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3161LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CreateSubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69209:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69209 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69209:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69209 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69210:350: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69210 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3160LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69229:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69229 | attr.displayName = UA_LOCALIZEDTEXT("", "SetTriggeringCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69229:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69229 | attr.displayName = UA_LOCALIZEDTEXT("", "SetTriggeringCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69230:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69230 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3159LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SetTriggeringCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69249:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69249 | attr.displayName = UA_LOCALIZEDTEXT("", "SetMonitoringModeCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69249:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69249 | attr.displayName = UA_LOCALIZEDTEXT("", "SetMonitoringModeCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69250:350: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69250 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3158LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SetMonitoringModeCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69269:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69269 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifyMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69269:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69269 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifyMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69270:350: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69270 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3157LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ModifyMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69289:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69289 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69289:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69289 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69290:350: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69290 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3156LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CreateMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69309:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69309 | attr.displayName = UA_LOCALIZEDTEXT("", "CallCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69309:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69309 | attr.displayName = UA_LOCALIZEDTEXT("", "CallCount"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69310:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69310 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3155LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CallCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69329:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69329 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryUpdateCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69329:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69329 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryUpdateCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69330:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69330 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3154LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HistoryUpdateCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69349:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69349 | attr.displayName = UA_LOCALIZEDTEXT("", "WriteCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69349:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69349 | attr.displayName = UA_LOCALIZEDTEXT("", "WriteCount"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69350:350: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69350 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3153LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "WriteCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69369:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69369 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryReadCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69369:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69369 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryReadCount"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69370:350: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69370 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3152LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HistoryReadCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69389:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69389 | attr.displayName = UA_LOCALIZEDTEXT("", "ReadCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69389:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69389 | attr.displayName = UA_LOCALIZEDTEXT("", "ReadCount"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69390:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69390 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3151LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ReadCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69409:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69409 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentPublishRequestsInQueue"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69409:41: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69409 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentPublishRequestsInQueue"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69410:350: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69410 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3143LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentPublishRequestsInQueue"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69429:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69429 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69429:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69429 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69430:350: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69430 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3142LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69449:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69449 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69449:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69449 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69450:350: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69450 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3141LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentSubscriptionsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69469:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69469 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientLastContactTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69469:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69469 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientLastContactTime"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69470:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69470 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3140LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientLastContactTime"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69489:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69489 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientConnectionTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69489:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69489 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientConnectionTime"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69490:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69490 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3139LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientConnectionTime"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69509:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69509 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxResponseMessageSize"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69509:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69509 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxResponseMessageSize"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69510:350: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69510 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3138LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxResponseMessageSize"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69529:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69529 | attr.displayName = UA_LOCALIZEDTEXT("", "ActualSessionTimeout"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69529:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69529 | attr.displayName = UA_LOCALIZEDTEXT("", "ActualSessionTimeout"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69530:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69530 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3137LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ActualSessionTimeout"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69552:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69552 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIds"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69552:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69552 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIds"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69553:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69553 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3136LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "LocaleIds"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69572:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69572 | attr.displayName = UA_LOCALIZEDTEXT("", "EndpointUrl"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69572:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69572 | attr.displayName = UA_LOCALIZEDTEXT("", "EndpointUrl"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69573:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69573 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3135LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EndpointUrl"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69592:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69592 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerUri"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69592:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69592 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerUri"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69593:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69593 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3134LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerUri"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69612:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69612 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientDescription"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69612:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69612 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientDescription"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69613:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69613 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3133LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientDescription"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69632:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69632 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionName"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69632:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69632 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionName"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69633:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69633 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3132LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionName"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69652:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69652 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69652:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69652 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69653:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69653 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3131LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69672:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69672 | attr.displayName = UA_LOCALIZEDTEXT("", "UnauthorizedRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69672:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69672 | attr.displayName = UA_LOCALIZEDTEXT("", "UnauthorizedRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69673:351: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69673 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11891LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2030LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UnauthorizedRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69689:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69689 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummaryType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69689:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69689 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummaryType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69690:352: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69690 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerDiagnosticsSummaryType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69709:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69709 | attr.displayName = UA_LOCALIZEDTEXT("", "RejectedRequestsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69709:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69709 | attr.displayName = UA_LOCALIZEDTEXT("", "RejectedRequestsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69710:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69710 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2163LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RejectedRequestsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69729:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69729 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedRequestsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69729:41: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69729 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedRequestsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69730:350: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69730 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2162LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityRejectedRequestsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69749:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69749 | attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69749:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69749 | attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69750:350: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69750 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2161LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CumulatedSubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69769:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69769 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69769:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69769 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69770:350: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69770 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2160LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentSubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69789:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69789 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingIntervalCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69789:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69789 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingIntervalCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69790:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69790 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2159LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishingIntervalCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69809:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69809 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionAbortCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69809:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69809 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionAbortCount"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69810:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69810 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2157LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionAbortCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69829:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69829 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionTimeoutCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69829:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69829 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionTimeoutCount"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69830:350: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69830 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2156LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionTimeoutCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69849:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69849 | attr.displayName = UA_LOCALIZEDTEXT("", "RejectedSessionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69849:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69849 | attr.displayName = UA_LOCALIZEDTEXT("", "RejectedSessionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69850:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69850 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2155LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RejectedSessionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69869:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69869 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedSessionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69869:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69869 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedSessionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69870:350: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69870 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2154LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityRejectedSessionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69889:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69889 | attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSessionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69889:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69889 | attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSessionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69890:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69890 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2153LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CumulatedSessionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69909:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69909 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSessionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69909:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69909 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSessionCount"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69910:350: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69910 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2152LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentSessionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69929:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69929 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerViewCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69929:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69929 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerViewCount"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69930:350: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69930 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2151LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerViewCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69946:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69946 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingIntervalDiagnosticsType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69946:41: warning: passing 'const char[32]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69946 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingIntervalDiagnosticsType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69947:352: warning: passing 'const char[32]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69947 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2165LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SamplingIntervalDiagnosticsType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69966:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69966 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingInterval"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69966:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69966 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingInterval"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69967:350: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69967 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2166LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2165LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SamplingInterval"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:69986:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69986 | attr.displayName = UA_LOCALIZEDTEXT("", "DisabledMonitoredItemsSamplingCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69986:41: warning: passing 'const char[36]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69986 | attr.displayName = UA_LOCALIZEDTEXT("", "DisabledMonitoredItemsSamplingCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:69987:351: warning: passing 'const char[36]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 69987 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11699LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2165LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DisabledMonitoredItemsSamplingCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70006:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70006 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxSampledMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70006:41: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70006 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxSampledMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70007:351: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70007 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11698LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2165LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxSampledMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70026:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70026 | attr.displayName = UA_LOCALIZEDTEXT("", "SampledMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70026:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70026 | attr.displayName = UA_LOCALIZEDTEXT("", "SampledMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70027:351: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70027 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11697LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2165LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SampledMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70046:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70046 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingIntervalDiagnosticsArrayType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70046:41: warning: passing 'const char[37]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70046 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingIntervalDiagnosticsArrayType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70047:352: warning: passing 'const char[37]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70047 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2164LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SamplingIntervalDiagnosticsArrayType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70066:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70066 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingIntervalDiagnostics"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70066:41: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70066 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingIntervalDiagnostics"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70067:351: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70067 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12779LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2164LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SamplingIntervalDiagnostics"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2165LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70086:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70086 | attr.displayName = UA_LOCALIZEDTEXT("", "DisabledMonitoredItemsSamplingCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70086:41: warning: passing 'const char[36]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70086 | attr.displayName = UA_LOCALIZEDTEXT("", "DisabledMonitoredItemsSamplingCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70087:352: warning: passing 'const char[36]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70087 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12783LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12779LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DisabledMonitoredItemsSamplingCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70106:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70106 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxSampledMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70106:41: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70106 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxSampledMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70107:352: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70107 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12782LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12779LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxSampledMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70126:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70126 | attr.displayName = UA_LOCALIZEDTEXT("", "SampledMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70126:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70126 | attr.displayName = UA_LOCALIZEDTEXT("", "SampledMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70127:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70127 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12781LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12779LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SampledMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70146:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70146 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingInterval"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70146:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70146 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingInterval"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70147:352: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70147 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12780LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12779LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SamplingInterval"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70166:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70166 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsArrayType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70166:41: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70166 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsArrayType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70167:352: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70167 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2196LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionDiagnosticsArrayType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70186:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70186 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnostics"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70186:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70186 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnostics"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70187:351: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70187 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2196LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionDiagnostics"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70206:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70206 | attr.displayName = UA_LOCALIZEDTEXT("", "UnregisterNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70206:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70206 | attr.displayName = UA_LOCALIZEDTEXT("", "UnregisterNodesCount"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70207:352: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70207 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12859LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UnregisterNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70226:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70226 | attr.displayName = UA_LOCALIZEDTEXT("", "RegisterNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70226:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70226 | attr.displayName = UA_LOCALIZEDTEXT("", "RegisterNodesCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70227:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70227 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12858LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RegisterNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70246:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70246 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryNextCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70246:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70246 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryNextCount"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70247:352: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70247 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12857LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "QueryNextCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70266:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70266 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryFirstCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70266:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70266 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryFirstCount"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70267:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70267 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12856LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "QueryFirstCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70286:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70286 | attr.displayName = UA_LOCALIZEDTEXT("", "TranslateBrowsePathsToNodeIdsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70286:41: warning: passing 'const char[35]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70286 | attr.displayName = UA_LOCALIZEDTEXT("", "TranslateBrowsePathsToNodeIdsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70287:352: warning: passing 'const char[35]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70287 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12855LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TranslateBrowsePathsToNodeIdsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70306:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70306 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseNextCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70306:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70306 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseNextCount"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70307:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70307 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12854LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BrowseNextCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70326:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70326 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70326:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70326 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseCount"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70327:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70327 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12853LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BrowseCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70346:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70346 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteReferencesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70346:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70346 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteReferencesCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70347:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70347 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12852LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteReferencesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70366:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70366 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70366:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70366 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteNodesCount"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70367:352: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70367 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12851LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70386:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70386 | attr.displayName = UA_LOCALIZEDTEXT("", "AddReferencesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70386:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70386 | attr.displayName = UA_LOCALIZEDTEXT("", "AddReferencesCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70387:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70387 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12850LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AddReferencesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70406:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70406 | attr.displayName = UA_LOCALIZEDTEXT("", "AddNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70406:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70406 | attr.displayName = UA_LOCALIZEDTEXT("", "AddNodesCount"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70407:352: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70407 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12849LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AddNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70426:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70426 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteSubscriptionsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70426:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70426 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteSubscriptionsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70427:352: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70427 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12848LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteSubscriptionsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70446:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70446 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferSubscriptionsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70446:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70446 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferSubscriptionsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70447:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70447 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12847LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransferSubscriptionsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70466:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70466 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70466:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70466 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishCount"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70467:352: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70467 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12846LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RepublishCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70486:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70486 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70486:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70486 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishCount"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70487:352: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70487 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12845LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70506:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70506 | attr.displayName = UA_LOCALIZEDTEXT("", "SetPublishingModeCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70506:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70506 | attr.displayName = UA_LOCALIZEDTEXT("", "SetPublishingModeCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70507:352: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70507 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12844LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SetPublishingModeCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70526:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70526 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifySubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70526:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70526 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifySubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70527:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70527 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12843LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ModifySubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70546:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70546 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateSubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70546:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70546 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateSubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70547:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70547 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12842LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CreateSubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70566:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70566 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70566:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70566 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70567:352: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70567 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12841LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70586:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70586 | attr.displayName = UA_LOCALIZEDTEXT("", "SetTriggeringCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70586:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70586 | attr.displayName = UA_LOCALIZEDTEXT("", "SetTriggeringCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70587:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70587 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12840LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SetTriggeringCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70606:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70606 | attr.displayName = UA_LOCALIZEDTEXT("", "SetMonitoringModeCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70606:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70606 | attr.displayName = UA_LOCALIZEDTEXT("", "SetMonitoringModeCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70607:352: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70607 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12839LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SetMonitoringModeCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70626:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70626 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifyMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70626:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70626 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifyMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70627:352: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70627 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12838LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ModifyMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70646:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70646 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70646:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70646 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70647:352: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70647 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12837LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CreateMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70666:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70666 | attr.displayName = UA_LOCALIZEDTEXT("", "CallCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70666:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70666 | attr.displayName = UA_LOCALIZEDTEXT("", "CallCount"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70667:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70667 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12836LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CallCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70686:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70686 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryUpdateCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70686:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70686 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryUpdateCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70687:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70687 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12835LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HistoryUpdateCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70706:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70706 | attr.displayName = UA_LOCALIZEDTEXT("", "WriteCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70706:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70706 | attr.displayName = UA_LOCALIZEDTEXT("", "WriteCount"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70707:352: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70707 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12834LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "WriteCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70726:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70726 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryReadCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70726:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70726 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryReadCount"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70727:352: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70727 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12833LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HistoryReadCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70746:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70746 | attr.displayName = UA_LOCALIZEDTEXT("", "ReadCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70746:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70746 | attr.displayName = UA_LOCALIZEDTEXT("", "ReadCount"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70747:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70747 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12832LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ReadCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70766:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70766 | attr.displayName = UA_LOCALIZEDTEXT("", "UnauthorizedRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70766:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70766 | attr.displayName = UA_LOCALIZEDTEXT("", "UnauthorizedRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70767:352: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70767 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12831LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UnauthorizedRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70786:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70786 | attr.displayName = UA_LOCALIZEDTEXT("", "TotalRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70786:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70786 | attr.displayName = UA_LOCALIZEDTEXT("", "TotalRequestCount"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70787:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70787 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12830LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TotalRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70806:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70806 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentPublishRequestsInQueue"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70806:41: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70806 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentPublishRequestsInQueue"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70807:352: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70807 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12829LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentPublishRequestsInQueue"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70826:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70826 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70826:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70826 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70827:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70827 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12828LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70846:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70846 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70846:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70846 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70847:352: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70847 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12827LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentSubscriptionsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70866:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70866 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientLastContactTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70866:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70866 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientLastContactTime"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70867:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70867 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12826LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientLastContactTime"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70886:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70886 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientConnectionTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70886:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70886 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientConnectionTime"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70887:352: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70887 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12825LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientConnectionTime"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70906:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70906 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxResponseMessageSize"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70906:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70906 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxResponseMessageSize"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70907:352: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70907 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12824LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxResponseMessageSize"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70926:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70926 | attr.displayName = UA_LOCALIZEDTEXT("", "ActualSessionTimeout"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70926:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70926 | attr.displayName = UA_LOCALIZEDTEXT("", "ActualSessionTimeout"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70927:352: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70927 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12823LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ActualSessionTimeout"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70949:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70949 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIds"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70949:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70949 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIds"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70950:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70950 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12822LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "LocaleIds"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70969:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70969 | attr.displayName = UA_LOCALIZEDTEXT("", "EndpointUrl"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70969:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70969 | attr.displayName = UA_LOCALIZEDTEXT("", "EndpointUrl"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70970:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70970 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12821LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EndpointUrl"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:70989:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70989 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerUri"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70989:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70989 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerUri"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:70990:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 70990 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12820LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerUri"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71009:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71009 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientDescription"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71009:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71009 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientDescription"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71010:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71010 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12819LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientDescription"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71029:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71029 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionName"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71029:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71029 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionName"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71030:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71030 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12818LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionName"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71049:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71049 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71049:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71049 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71050:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71050 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12817LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12816LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71069:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71069 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnosticsArrayType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71069:41: warning: passing 'const char[36]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71069 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnosticsArrayType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71070:352: warning: passing 'const char[36]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71070 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2243LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionSecurityDiagnosticsArrayType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71089:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71089 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnostics"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71089:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71089 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnostics"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71090:351: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71090 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12860LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2243LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionSecurityDiagnostics"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2244LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71109:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71109 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientCertificate"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71109:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71109 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientCertificate"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71110:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71110 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12869LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12860LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientCertificate"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71129:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71129 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityPolicyUri"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71129:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71129 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityPolicyUri"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71130:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71130 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12868LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12860LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityPolicyUri"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71149:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71149 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityMode"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71149:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71149 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityMode"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71150:352: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71150 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12867LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12860LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityMode"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71169:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71169 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportProtocol"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71169:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71169 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportProtocol"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71170:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71170 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12866LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12860LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransportProtocol"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71189:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71189 | attr.displayName = UA_LOCALIZEDTEXT("", "Encoding"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71189:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71189 | attr.displayName = UA_LOCALIZEDTEXT("", "Encoding"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71190:352: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71190 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12865LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12860LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Encoding"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71209:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71209 | attr.displayName = UA_LOCALIZEDTEXT("", "AuthenticationMechanism"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71209:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71209 | attr.displayName = UA_LOCALIZEDTEXT("", "AuthenticationMechanism"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71210:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71210 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12864LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12860LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AuthenticationMechanism"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71232:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71232 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdHistory"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71232:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71232 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdHistory"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71233:352: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71233 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12863LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12860LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientUserIdHistory"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71252:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71252 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdOfSession"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71252:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71252 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdOfSession"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71253:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71253 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12862LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12860LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientUserIdOfSession"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71272:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71272 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71272:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71272 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71273:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71273 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12861LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12860LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71286:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71286 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionsDiagnosticsSummaryType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71286:41: warning: passing 'const char[31]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71286 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionsDiagnosticsSummaryType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71287:350: warning: passing 'const char[31]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71287 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2026LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionsDiagnosticsSummaryType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71309:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71309 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnosticsArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71309:41: warning: passing 'const char[32]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71309 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnosticsArray"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71310:350: warning: passing 'const char[32]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71310 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2028LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2026LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionSecurityDiagnosticsArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2243LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71332:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71332 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71332:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71332 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsArray"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71333:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71333 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2027LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2026LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionDiagnosticsArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2196LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71346:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71346 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71346:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71346 | attr.displayName = UA_LOCALIZEDTEXT("", ""); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71347:349: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71347 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12097LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2026LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), ""),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2029LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71369:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71369 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71369:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71369 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsArray"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71370:352: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71370 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12152LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12097LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscriptionDiagnosticsArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2171LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71389:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71389 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnostics"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71389:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71389 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnostics"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71390:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71390 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12142LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12097LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionSecurityDiagnostics"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2244LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71409:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71409 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientCertificate"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71409:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71409 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientCertificate"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71410:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71410 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12151LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12142LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientCertificate"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71429:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71429 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityPolicyUri"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71429:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71429 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityPolicyUri"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71430:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71430 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12150LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12142LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityPolicyUri"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71449:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71449 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityMode"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71449:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71449 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityMode"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71450:352: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71450 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12149LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12142LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityMode"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71469:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71469 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportProtocol"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71469:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71469 | attr.displayName = UA_LOCALIZEDTEXT("", "TransportProtocol"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71470:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71470 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12148LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12142LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransportProtocol"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71489:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71489 | attr.displayName = UA_LOCALIZEDTEXT("", "Encoding"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71489:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71489 | attr.displayName = UA_LOCALIZEDTEXT("", "Encoding"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71490:352: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71490 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12147LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12142LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Encoding"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71509:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71509 | attr.displayName = UA_LOCALIZEDTEXT("", "AuthenticationMechanism"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71509:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71509 | attr.displayName = UA_LOCALIZEDTEXT("", "AuthenticationMechanism"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71510:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71510 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12146LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12142LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AuthenticationMechanism"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71532:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71532 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdHistory"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71532:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71532 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdHistory"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71533:352: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71533 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12145LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12142LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientUserIdHistory"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71552:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71552 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdOfSession"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71552:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71552 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientUserIdOfSession"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71553:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71553 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12144LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12142LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientUserIdOfSession"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71572:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71572 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71572:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71572 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71573:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71573 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12143LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12142LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71592:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71592 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnostics"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71592:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71592 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnostics"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71593:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71593 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12097LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionDiagnostics"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2197LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71612:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71612 | attr.displayName = UA_LOCALIZEDTEXT("", "UnregisterNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71612:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71612 | attr.displayName = UA_LOCALIZEDTEXT("", "UnregisterNodesCount"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71613:352: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71613 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12141LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UnregisterNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71632:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71632 | attr.displayName = UA_LOCALIZEDTEXT("", "RegisterNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71632:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71632 | attr.displayName = UA_LOCALIZEDTEXT("", "RegisterNodesCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71633:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71633 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12140LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RegisterNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71652:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71652 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryNextCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71652:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71652 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryNextCount"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71653:352: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71653 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12139LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "QueryNextCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71672:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71672 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryFirstCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71672:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71672 | attr.displayName = UA_LOCALIZEDTEXT("", "QueryFirstCount"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71673:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71673 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12138LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "QueryFirstCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71692:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71692 | attr.displayName = UA_LOCALIZEDTEXT("", "TranslateBrowsePathsToNodeIdsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71692:41: warning: passing 'const char[35]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71692 | attr.displayName = UA_LOCALIZEDTEXT("", "TranslateBrowsePathsToNodeIdsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71693:352: warning: passing 'const char[35]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71693 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12137LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TranslateBrowsePathsToNodeIdsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71712:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71712 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseNextCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71712:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71712 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseNextCount"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71713:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71713 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12136LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BrowseNextCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71732:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71732 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71732:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71732 | attr.displayName = UA_LOCALIZEDTEXT("", "BrowseCount"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71733:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71733 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12135LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BrowseCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71752:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71752 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteReferencesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71752:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71752 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteReferencesCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71753:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71753 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12134LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteReferencesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71772:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71772 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71772:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71772 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteNodesCount"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71773:352: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71773 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12133LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71792:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71792 | attr.displayName = UA_LOCALIZEDTEXT("", "AddReferencesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71792:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71792 | attr.displayName = UA_LOCALIZEDTEXT("", "AddReferencesCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71793:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71793 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12132LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AddReferencesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71812:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71812 | attr.displayName = UA_LOCALIZEDTEXT("", "AddNodesCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71812:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71812 | attr.displayName = UA_LOCALIZEDTEXT("", "AddNodesCount"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71813:352: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71813 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12131LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AddNodesCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71832:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71832 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteSubscriptionsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71832:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71832 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteSubscriptionsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71833:352: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71833 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12130LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteSubscriptionsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71852:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71852 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferSubscriptionsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71852:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71852 | attr.displayName = UA_LOCALIZEDTEXT("", "TransferSubscriptionsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71853:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71853 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12129LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TransferSubscriptionsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71872:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71872 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71872:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71872 | attr.displayName = UA_LOCALIZEDTEXT("", "RepublishCount"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71873:352: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71873 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12128LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RepublishCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71892:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71892 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71892:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71892 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishCount"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71893:352: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71893 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12127LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71912:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71912 | attr.displayName = UA_LOCALIZEDTEXT("", "SetPublishingModeCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71912:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71912 | attr.displayName = UA_LOCALIZEDTEXT("", "SetPublishingModeCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71913:352: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71913 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12126LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SetPublishingModeCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71932:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71932 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifySubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71932:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71932 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifySubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71933:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71933 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12125LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ModifySubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71952:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71952 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateSubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71952:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71952 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateSubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71953:352: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71953 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12124LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CreateSubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71972:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71972 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71972:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71972 | attr.displayName = UA_LOCALIZEDTEXT("", "DeleteMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71973:352: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71973 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12123LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DeleteMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:71992:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71992 | attr.displayName = UA_LOCALIZEDTEXT("", "SetTriggeringCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71992:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71992 | attr.displayName = UA_LOCALIZEDTEXT("", "SetTriggeringCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:71993:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 71993 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12122LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SetTriggeringCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72012:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72012 | attr.displayName = UA_LOCALIZEDTEXT("", "SetMonitoringModeCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72012:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72012 | attr.displayName = UA_LOCALIZEDTEXT("", "SetMonitoringModeCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72013:352: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72013 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12121LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SetMonitoringModeCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72032:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72032 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifyMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72032:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72032 | attr.displayName = UA_LOCALIZEDTEXT("", "ModifyMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72033:352: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72033 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12120LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ModifyMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72052:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72052 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72052:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72052 | attr.displayName = UA_LOCALIZEDTEXT("", "CreateMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72053:352: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72053 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12119LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CreateMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72072:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72072 | attr.displayName = UA_LOCALIZEDTEXT("", "CallCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72072:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72072 | attr.displayName = UA_LOCALIZEDTEXT("", "CallCount"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72073:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72073 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12118LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CallCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72092:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72092 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryUpdateCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72092:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72092 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryUpdateCount"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72093:352: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72093 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12117LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HistoryUpdateCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72112:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72112 | attr.displayName = UA_LOCALIZEDTEXT("", "WriteCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72112:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72112 | attr.displayName = UA_LOCALIZEDTEXT("", "WriteCount"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72113:352: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72113 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12116LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "WriteCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72132:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72132 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryReadCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72132:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72132 | attr.displayName = UA_LOCALIZEDTEXT("", "HistoryReadCount"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72133:352: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72133 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12115LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "HistoryReadCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72152:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72152 | attr.displayName = UA_LOCALIZEDTEXT("", "ReadCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72152:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72152 | attr.displayName = UA_LOCALIZEDTEXT("", "ReadCount"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72153:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72153 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12114LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ReadCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72172:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72172 | attr.displayName = UA_LOCALIZEDTEXT("", "UnauthorizedRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72172:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72172 | attr.displayName = UA_LOCALIZEDTEXT("", "UnauthorizedRequestCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72173:352: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72173 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12113LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "UnauthorizedRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72192:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72192 | attr.displayName = UA_LOCALIZEDTEXT("", "TotalRequestCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72192:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72192 | attr.displayName = UA_LOCALIZEDTEXT("", "TotalRequestCount"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72193:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72193 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12112LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "TotalRequestCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72212:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72212 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentPublishRequestsInQueue"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72212:41: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72212 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentPublishRequestsInQueue"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72213:352: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72213 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12111LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentPublishRequestsInQueue"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72232:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72232 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentMonitoredItemsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72232:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72232 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentMonitoredItemsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72233:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72233 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12110LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentMonitoredItemsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72252:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72252 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72252:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72252 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72253:352: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72253 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12109LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentSubscriptionsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72272:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72272 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientLastContactTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72272:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72272 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientLastContactTime"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72273:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72273 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12108LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientLastContactTime"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72292:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72292 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientConnectionTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72292:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72292 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientConnectionTime"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72293:352: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72293 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12107LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientConnectionTime"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72312:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72312 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxResponseMessageSize"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72312:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72312 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxResponseMessageSize"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72313:352: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72313 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12106LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxResponseMessageSize"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72332:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72332 | attr.displayName = UA_LOCALIZEDTEXT("", "ActualSessionTimeout"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72332:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72332 | attr.displayName = UA_LOCALIZEDTEXT("", "ActualSessionTimeout"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72333:352: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72333 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12105LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ActualSessionTimeout"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72355:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72355 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIds"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72355:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72355 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIds"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72356:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72356 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12104LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "LocaleIds"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72375:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72375 | attr.displayName = UA_LOCALIZEDTEXT("", "EndpointUrl"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72375:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72375 | attr.displayName = UA_LOCALIZEDTEXT("", "EndpointUrl"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72376:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72376 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12103LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EndpointUrl"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72395:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72395 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerUri"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72395:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72395 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerUri"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72396:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72396 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12102LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerUri"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72415:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72415 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientDescription"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72415:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72415 | attr.displayName = UA_LOCALIZEDTEXT("", "ClientDescription"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72416:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72416 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12101LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ClientDescription"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72435:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72435 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionName"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72435:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72435 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionName"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72436:352: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72436 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12100LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionName"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72455:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72455 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72455:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72455 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionId"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72456:352: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72456 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12099LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 12098LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72469:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72469 | attr.displayName = UA_LOCALIZEDTEXT("", "InterfaceTypes"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72469:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72469 | attr.displayName = UA_LOCALIZEDTEXT("", "InterfaceTypes"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72470:347: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72470 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17708LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 86LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 35LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "InterfaceTypes"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 61LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72484:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72484 | attr.displayName = UA_LOCALIZEDTEXT("", "BaseInterfaceType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72484:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72484 | attr.displayName = UA_LOCALIZEDTEXT("", "BaseInterfaceType"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72485:351: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72485 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17602LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BaseInterfaceType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72502:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72502 | attr.displayName = UA_LOCALIZEDTEXT("", "BuildInfoType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72502:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72502 | attr.displayName = UA_LOCALIZEDTEXT("", "BuildInfoType"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72503:352: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72503 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3051LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BuildInfoType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72519:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72519 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerStatusType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72519:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72519 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerStatusType"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72520:352: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72520 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2138LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerStatusType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72533:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72533 | attr.displayName = UA_LOCALIZEDTEXT("", "OperationLimitsType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72533:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72533 | attr.displayName = UA_LOCALIZEDTEXT("", "OperationLimitsType"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72534:351: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72534 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11564LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 61LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "OperationLimitsType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72553:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72553 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxMonitoredItemsPerCall"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72553:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72553 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxMonitoredItemsPerCall"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72554:352: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72554 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11574LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11564LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxMonitoredItemsPerCall"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72573:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72573 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerNodeManagement"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72573:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72573 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerNodeManagement"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72574:352: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72574 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11573LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11564LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerNodeManagement"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72593:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72593 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerTranslateBrowsePathsToNodeIds"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72593:41: warning: passing 'const char[41]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72593 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerTranslateBrowsePathsToNodeIds"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72594:352: warning: passing 'const char[41]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72594 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11572LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11564LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerTranslateBrowsePathsToNodeIds"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72613:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72613 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRegisterNodes"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72613:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72613 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRegisterNodes"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72614:352: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72614 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11571LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11564LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerRegisterNodes"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72633:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72633 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerBrowse"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72633:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72633 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerBrowse"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72634:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72634 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11570LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11564LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerBrowse"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72653:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72653 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerMethodCall"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72653:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72653 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerMethodCall"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72654:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72654 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11569LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11564LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerMethodCall"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72673:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72673 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerWrite"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72673:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72673 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerWrite"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72674:352: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72674 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11567LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11564LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerWrite"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72693:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72693 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRead"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72693:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72693 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRead"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72694:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72694 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11565LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11564LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerRead"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72707:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72707 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerRedundancyType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72707:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72707 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerRedundancyType"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72708:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72708 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2034LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerRedundancyType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72727:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72727 | attr.displayName = UA_LOCALIZEDTEXT("", "RedundancySupport"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72727:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72727 | attr.displayName = UA_LOCALIZEDTEXT("", "RedundancySupport"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72728:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72728 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2035LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2034LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RedundancySupport"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72741:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72741 | attr.displayName = UA_LOCALIZEDTEXT("", "VendorServerInfoType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72741:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72741 | attr.displayName = UA_LOCALIZEDTEXT("", "VendorServerInfoType"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72742:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72742 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2033LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "VendorServerInfoType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72755:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72755 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72755:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72755 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsType"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72756:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72756 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2020LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerDiagnosticsType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72769:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72769 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionsDiagnosticsSummary"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72769:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72769 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionsDiagnosticsSummary"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72770:348: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72770 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2744LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2020LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionsDiagnosticsSummary"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2026LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72792:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72792 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnosticsArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72792:41: warning: passing 'const char[32]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72792 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnosticsArray"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72793:350: warning: passing 'const char[32]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72793 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3130LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2744LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionSecurityDiagnosticsArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2243LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72815:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72815 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72815:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72815 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsArray"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72816:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72816 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3129LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2744LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionDiagnosticsArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2196LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72835:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72835 | attr.displayName = UA_LOCALIZEDTEXT("", "EnabledFlag"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72835:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72835 | attr.displayName = UA_LOCALIZEDTEXT("", "EnabledFlag"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72836:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72836 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2025LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2020LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnabledFlag"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72858:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72858 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72858:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72858 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsArray"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72859:350: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72859 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2023LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2020LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscriptionDiagnosticsArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2171LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72881:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72881 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingIntervalDiagnosticsArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72881:41: warning: passing 'const char[33]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72881 | attr.displayName = UA_LOCALIZEDTEXT("", "SamplingIntervalDiagnosticsArray"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72882:350: warning: passing 'const char[33]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72882 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2022LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2020LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SamplingIntervalDiagnosticsArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2164LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72901:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72901 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummary"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72901:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72901 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummary"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72902:350: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72902 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2021LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2020LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerDiagnosticsSummary"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72921:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72921 | attr.displayName = UA_LOCALIZEDTEXT("", "RejectedRequestsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72921:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72921 | attr.displayName = UA_LOCALIZEDTEXT("", "RejectedRequestsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72922:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72922 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3128LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2021LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RejectedRequestsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72941:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72941 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedRequestsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72941:41: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72941 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedRequestsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72942:350: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72942 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3127LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2021LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityRejectedRequestsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72961:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72961 | attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72961:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72961 | attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72962:350: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72962 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3126LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2021LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CumulatedSubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:72981:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72981 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72981:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72981 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:72982:350: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 72982 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3125LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2021LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentSubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73001:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73001 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingIntervalCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73001:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73001 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingIntervalCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73002:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73002 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3124LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2021LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishingIntervalCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73021:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73021 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionAbortCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73021:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73021 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionAbortCount"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73022:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73022 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3122LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2021LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionAbortCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73041:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73041 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionTimeoutCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73041:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73041 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionTimeoutCount"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73042:350: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73042 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3121LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2021LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionTimeoutCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73061:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73061 | attr.displayName = UA_LOCALIZEDTEXT("", "RejectedSessionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73061:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73061 | attr.displayName = UA_LOCALIZEDTEXT("", "RejectedSessionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73062:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73062 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3120LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2021LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RejectedSessionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73081:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73081 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedSessionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73081:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73081 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedSessionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73082:350: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73082 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3119LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2021LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityRejectedSessionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73101:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73101 | attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSessionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73101:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73101 | attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSessionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73102:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73102 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3118LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2021LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CumulatedSessionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73121:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73121 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSessionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73121:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73121 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSessionCount"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73122:350: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73122 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3117LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2021LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentSessionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73141:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73141 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerViewCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73141:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73141 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerViewCount"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73142:350: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73142 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3116LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2021LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerViewCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73155:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73155 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerCapabilitiesType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73155:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73155 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerCapabilitiesType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73156:350: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73156 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2013LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerCapabilitiesType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73169:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73169 | attr.displayName = UA_LOCALIZEDTEXT("", "OperationLimits"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73169:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73169 | attr.displayName = UA_LOCALIZEDTEXT("", "OperationLimits"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73170:349: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73170 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11551LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2013LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "OperationLimits"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11564LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73183:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73183 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73183:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73183 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerType"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73184:350: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73184 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2004LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73198:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73198 | attr.displayName = UA_LOCALIZEDTEXT("", "Server"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73198:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73198 | attr.displayName = UA_LOCALIZEDTEXT("", "Server"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73199:346: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73199 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2253LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 85LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 35LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Server"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2004LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73218:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73218 | attr.displayName = UA_LOCALIZEDTEXT("", "Auditing"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73218:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73218 | attr.displayName = UA_LOCALIZEDTEXT("", "Auditing"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73219:350: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73219 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2994LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2253LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Auditing"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73232:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73232 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerRedundancy"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73232:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73232 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerRedundancy"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73233:348: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73233 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2296LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2253LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerRedundancy"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2034LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73252:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73252 | attr.displayName = UA_LOCALIZEDTEXT("", "RedundancySupport"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73252:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73252 | attr.displayName = UA_LOCALIZEDTEXT("", "RedundancySupport"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73253:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73253 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3709LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2296LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RedundancySupport"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73266:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73266 | attr.displayName = UA_LOCALIZEDTEXT("", "VendorServerInfo"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73266:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73266 | attr.displayName = UA_LOCALIZEDTEXT("", "VendorServerInfo"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73267:348: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73267 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2295LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2253LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "VendorServerInfo"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2033LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73280:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73280 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnostics"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73280:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73280 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnostics"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73281:348: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73281 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2274LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2253LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerDiagnostics"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2020LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73294:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73294 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionsDiagnosticsSummary"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73294:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73294 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionsDiagnosticsSummary"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73295:348: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73295 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3706LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2274LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionsDiagnosticsSummary"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2026LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73317:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73317 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnosticsArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73317:41: warning: passing 'const char[32]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73317 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionSecurityDiagnosticsArray"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73318:350: warning: passing 'const char[32]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73318 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3708LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3706LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionSecurityDiagnosticsArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2243LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73340:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73340 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73340:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73340 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionDiagnosticsArray"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73341:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73341 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3707LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3706LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionDiagnosticsArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2196LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73360:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73360 | attr.displayName = UA_LOCALIZEDTEXT("", "EnabledFlag"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73360:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73360 | attr.displayName = UA_LOCALIZEDTEXT("", "EnabledFlag"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73361:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73361 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2294LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2274LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnabledFlag"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73383:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73383 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73383:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73383 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscriptionDiagnosticsArray"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73384:350: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73384 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2290LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2274LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscriptionDiagnosticsArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2171LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73403:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73403 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummary"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73403:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73403 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummary"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73404:350: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73404 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2275LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2274LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerDiagnosticsSummary"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2150LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73423:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73423 | attr.displayName = UA_LOCALIZEDTEXT("", "RejectedSessionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73423:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73423 | attr.displayName = UA_LOCALIZEDTEXT("", "RejectedSessionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73424:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73424 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3705LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2275LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RejectedSessionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73443:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73443 | attr.displayName = UA_LOCALIZEDTEXT("", "RejectedRequestsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73443:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73443 | attr.displayName = UA_LOCALIZEDTEXT("", "RejectedRequestsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73444:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73444 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2288LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2275LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "RejectedRequestsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73463:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73463 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedRequestsCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73463:41: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73463 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedRequestsCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73464:350: warning: passing 'const char[30]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73464 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2287LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2275LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityRejectedRequestsCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73483:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73483 | attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73483:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73483 | attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73484:350: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73484 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2286LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2275LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CumulatedSubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73503:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73503 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73503:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73503 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73504:350: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73504 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2285LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2275LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentSubscriptionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73523:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73523 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingIntervalCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73523:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73523 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishingIntervalCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73524:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73524 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2284LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2275LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishingIntervalCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73543:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73543 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionAbortCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73543:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73543 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionAbortCount"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73544:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73544 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2282LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2275LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionAbortCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73563:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73563 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionTimeoutCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73563:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73563 | attr.displayName = UA_LOCALIZEDTEXT("", "SessionTimeoutCount"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73564:350: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73564 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2281LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2275LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SessionTimeoutCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73583:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73583 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedSessionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73583:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73583 | attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedSessionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73584:350: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73584 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2279LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2275LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecurityRejectedSessionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73603:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73603 | attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSessionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73603:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73603 | attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSessionCount"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73604:350: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73604 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2278LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2275LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CumulatedSessionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73623:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73623 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSessionCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73623:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73623 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSessionCount"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73624:350: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73624 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2277LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2275LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentSessionCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73643:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73643 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerViewCount"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73643:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73643 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerViewCount"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73644:350: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73644 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2276LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2275LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerViewCount"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73657:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73657 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerCapabilities"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73657:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73657 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerCapabilities"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73658:348: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73658 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2268LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2253LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerCapabilities"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2013LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73680:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73680 | attr.displayName = UA_LOCALIZEDTEXT("", "SoftwareCertificates"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73680:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73680 | attr.displayName = UA_LOCALIZEDTEXT("", "SoftwareCertificates"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73681:350: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73681 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3704LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2268LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SoftwareCertificates"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73694:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73694 | attr.displayName = UA_LOCALIZEDTEXT("", "AggregateFunctions"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73694:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73694 | attr.displayName = UA_LOCALIZEDTEXT("", "AggregateFunctions"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73695:348: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73695 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2997LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2268LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "AggregateFunctions"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 61LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73708:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73708 | attr.displayName = UA_LOCALIZEDTEXT("", "ModellingRules"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73708:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73708 | attr.displayName = UA_LOCALIZEDTEXT("", "ModellingRules"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73709:348: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73709 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2996LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2268LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ModellingRules"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 61LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73728:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73728 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxHistoryContinuationPoints"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73728:41: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73728 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxHistoryContinuationPoints"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73729:350: warning: passing 'const char[29]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73729 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2737LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2268LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxHistoryContinuationPoints"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73748:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73748 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxQueryContinuationPoints"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73748:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73748 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxQueryContinuationPoints"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73749:350: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73749 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2736LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2268LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxQueryContinuationPoints"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73768:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73768 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxBrowseContinuationPoints"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73768:41: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73768 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxBrowseContinuationPoints"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73769:350: warning: passing 'const char[28]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73769 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2735LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2268LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxBrowseContinuationPoints"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73788:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73788 | attr.displayName = UA_LOCALIZEDTEXT("", "MinSupportedSampleRate"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73788:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73788 | attr.displayName = UA_LOCALIZEDTEXT("", "MinSupportedSampleRate"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73789:350: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73789 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2272LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2268LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MinSupportedSampleRate"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73811:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73811 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIdArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73811:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73811 | attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIdArray"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73812:350: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73812 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2271LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2268LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "LocaleIdArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73834:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73834 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerProfileArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73834:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73834 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerProfileArray"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73835:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73835 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2269LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2268LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerProfileArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73848:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73848 | attr.displayName = UA_LOCALIZEDTEXT("", "OperationLimits"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73848:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73848 | attr.displayName = UA_LOCALIZEDTEXT("", "OperationLimits"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73849:349: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73849 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11704LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2268LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "OperationLimits"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11564LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73868:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73868 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxMonitoredItemsPerCall"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73868:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73868 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxMonitoredItemsPerCall"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73869:352: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73869 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11714LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11704LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxMonitoredItemsPerCall"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73888:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73888 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerNodeManagement"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73888:41: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73888 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerNodeManagement"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73889:352: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73889 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11713LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11704LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerNodeManagement"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73908:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73908 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerTranslateBrowsePathsToNodeIds"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73908:41: warning: passing 'const char[41]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73908 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerTranslateBrowsePathsToNodeIds"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73909:352: warning: passing 'const char[41]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73909 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11712LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11704LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerTranslateBrowsePathsToNodeIds"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73928:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73928 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRegisterNodes"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73928:41: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73928 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRegisterNodes"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73929:352: warning: passing 'const char[25]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73929 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11711LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11704LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerRegisterNodes"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73948:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73948 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerBrowse"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73948:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73948 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerBrowse"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73949:352: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73949 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11710LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11704LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerBrowse"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73968:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73968 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerMethodCall"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73968:41: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73968 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerMethodCall"); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73969:352: warning: passing 'const char[22]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73969 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11709LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11704LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerMethodCall"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:73988:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73988 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerWrite"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73988:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73988 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerWrite"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:73989:352: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 73989 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11707LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11704LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerWrite"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74008:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74008 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRead"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74008:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74008 | attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRead"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74009:352: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74009 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11705LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11704LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MaxNodesPerRead"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74028:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74028 | attr.displayName = UA_LOCALIZEDTEXT("", "ServiceLevel"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74028:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74028 | attr.displayName = UA_LOCALIZEDTEXT("", "ServiceLevel"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74029:350: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74029 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2267LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2253LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServiceLevel"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74048:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74048 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerStatus"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74048:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74048 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerStatus"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74049:350: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74049 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2256LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2253LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerStatus"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2138LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74068:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74068 | attr.displayName = UA_LOCALIZEDTEXT("", "ShutdownReason"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74068:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74068 | attr.displayName = UA_LOCALIZEDTEXT("", "ShutdownReason"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74069:350: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74069 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2993LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2256LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ShutdownReason"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74088:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74088 | attr.displayName = UA_LOCALIZEDTEXT("", "SecondsTillShutdown"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74088:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74088 | attr.displayName = UA_LOCALIZEDTEXT("", "SecondsTillShutdown"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74089:350: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74089 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2992LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2256LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SecondsTillShutdown"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74108:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74108 | attr.displayName = UA_LOCALIZEDTEXT("", "BuildInfo"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74108:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74108 | attr.displayName = UA_LOCALIZEDTEXT("", "BuildInfo"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74109:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74109 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2260LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2256LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BuildInfo"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3051LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74128:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74128 | attr.displayName = UA_LOCALIZEDTEXT("", "BuildDate"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74128:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74128 | attr.displayName = UA_LOCALIZEDTEXT("", "BuildDate"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74129:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74129 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2266LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2260LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BuildDate"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74148:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74148 | attr.displayName = UA_LOCALIZEDTEXT("", "BuildNumber"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74148:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74148 | attr.displayName = UA_LOCALIZEDTEXT("", "BuildNumber"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74149:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74149 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2265LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2260LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "BuildNumber"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74168:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74168 | attr.displayName = UA_LOCALIZEDTEXT("", "SoftwareVersion"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74168:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74168 | attr.displayName = UA_LOCALIZEDTEXT("", "SoftwareVersion"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74169:350: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74169 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2264LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2260LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SoftwareVersion"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74188:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74188 | attr.displayName = UA_LOCALIZEDTEXT("", "ManufacturerName"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74188:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74188 | attr.displayName = UA_LOCALIZEDTEXT("", "ManufacturerName"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74189:350: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74189 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2263LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2260LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ManufacturerName"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74208:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74208 | attr.displayName = UA_LOCALIZEDTEXT("", "ProductUri"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74208:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74208 | attr.displayName = UA_LOCALIZEDTEXT("", "ProductUri"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74209:350: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74209 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2262LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2260LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ProductUri"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74228:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74228 | attr.displayName = UA_LOCALIZEDTEXT("", "ProductName"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74228:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74228 | attr.displayName = UA_LOCALIZEDTEXT("", "ProductName"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74229:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74229 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2261LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2260LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ProductName"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74248:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74248 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74248:41: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74248 | attr.displayName = UA_LOCALIZEDTEXT("", "State"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74249:350: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74249 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2259LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2256LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "State"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74268:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74268 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74268:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74268 | attr.displayName = UA_LOCALIZEDTEXT("", "CurrentTime"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74269:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74269 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2258LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2256LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "CurrentTime"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74288:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74288 | attr.displayName = UA_LOCALIZEDTEXT("", "StartTime"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74288:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74288 | attr.displayName = UA_LOCALIZEDTEXT("", "StartTime"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74289:350: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74289 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2257LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2256LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "StartTime"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74311:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74311 | attr.displayName = UA_LOCALIZEDTEXT("", "NamespaceArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74311:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74311 | attr.displayName = UA_LOCALIZEDTEXT("", "NamespaceArray"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74312:350: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74312 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2255LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2253LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NamespaceArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74334:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74334 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74334:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74334 | attr.displayName = UA_LOCALIZEDTEXT("", "ServerArray"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74335:350: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74335 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2254LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2253LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ServerArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74348:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74348 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishSubscribe"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74348:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74348 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishSubscribe"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74349:349: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74349 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14443LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2253LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishSubscribe"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14416LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74368:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74368 | attr.displayName = UA_LOCALIZEDTEXT("", "DefaultDatagramPublisherId"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74368:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74368 | attr.displayName = UA_LOCALIZEDTEXT("", "DefaultDatagramPublisherId"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74369:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74369 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 25480LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14443LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DefaultDatagramPublisherId"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74382:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74382 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubConfiguration"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74382:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74382 | attr.displayName = UA_LOCALIZEDTEXT("", "PubSubConfiguration"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74383:350: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74383 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 25451LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14443LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PubSubConfiguration"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74602:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74602 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSets"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74602:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74602 | attr.displayName = UA_LOCALIZEDTEXT("", "SubscribedDataSets"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74603:350: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74603 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23658LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14443LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SubscribedDataSets"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 23795LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74625:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74625 | attr.displayName = UA_LOCALIZEDTEXT("", "SupportedTransportProfiles"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74625:41: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74625 | attr.displayName = UA_LOCALIZEDTEXT("", "SupportedTransportProfiles"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74626:352: warning: passing 'const char[27]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74626 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17481LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14443LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "SupportedTransportProfiles"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:74639:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74639 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataSets"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74639:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74639 | attr.displayName = UA_LOCALIZEDTEXT("", "PublishedDataSets"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:74640:350: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 74640 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 17371LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14443LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "PublishedDataSets"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 14477LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75137:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75137 | attr.displayName = UA_LOCALIZEDTEXT("", "VendorServerInfo"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75137:41: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75137 | attr.displayName = UA_LOCALIZEDTEXT("", "VendorServerInfo"); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75138:348: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75138 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2011LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2004LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "VendorServerInfo"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 2033LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75151:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75151 | attr.displayName = UA_LOCALIZEDTEXT("", "ModellingRuleType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75151:41: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75151 | attr.displayName = UA_LOCALIZEDTEXT("", "ModellingRuleType"); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75152:348: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75152 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 77LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ModellingRuleType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75165:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75165 | attr.displayName = UA_LOCALIZEDTEXT("", "ExposesItsArray"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75165:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75165 | attr.displayName = UA_LOCALIZEDTEXT("", "ExposesItsArray"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75166:342: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75166 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 83LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "ExposesItsArray"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 77LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75200:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75200 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75200:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75200 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75201:347: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75201 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 114LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 83LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NamingRule"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75217:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75217 | attr.displayName = UA_LOCALIZEDTEXT("", "Optional"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75217:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75217 | attr.displayName = UA_LOCALIZEDTEXT("", "Optional"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75218:342: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75218 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 80LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Optional"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 77LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75296:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75296 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75296:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75296 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75297:347: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75297 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 113LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 80LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NamingRule"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75313:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75313 | attr.displayName = UA_LOCALIZEDTEXT("", "Mandatory"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75313:41: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75313 | attr.displayName = UA_LOCALIZEDTEXT("", "Mandatory"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75314:342: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75314 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 78LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Mandatory"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 77LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75777:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75777 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75777:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75777 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75778:347: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75778 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 112LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 78LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NamingRule"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75794:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75794 | attr.displayName = UA_LOCALIZEDTEXT("", "MandatoryPlaceholder"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75794:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75794 | attr.displayName = UA_LOCALIZEDTEXT("", "MandatoryPlaceholder"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75795:345: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75795 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11510LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "MandatoryPlaceholder"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 77LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75825:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75825 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75825:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75825 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75826:352: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75826 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11511LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11510LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NamingRule"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75842:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75842 | attr.displayName = UA_LOCALIZEDTEXT("", "OptionalPlaceholder"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75842:41: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75842 | attr.displayName = UA_LOCALIZEDTEXT("", "OptionalPlaceholder"); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75843:345: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75843 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11508LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "OptionalPlaceholder"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 77LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75882:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75882 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75882:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75882 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75883:352: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75883 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11509LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 11508LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NamingRule"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75916:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75916 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75916:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75916 | attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75917:347: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75917 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 111LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 77LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NamingRule"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75934:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75934 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeEncodingType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75934:41: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75934 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeEncodingType"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75935:348: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75935 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 76LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataTypeEncodingType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75948:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75948 | attr.displayName = UA_LOCALIZEDTEXT("", "Default Binary"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75948:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75948 | attr.displayName = UA_LOCALIZEDTEXT("", "Default Binary"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75949:344: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75949 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 8251LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Default Binary"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 76LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75963:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75963 | attr.displayName = UA_LOCALIZEDTEXT("", "Default Binary"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75963:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75963 | attr.displayName = UA_LOCALIZEDTEXT("", "Default Binary"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75964:343: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75964 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 298LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Default Binary"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 76LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75978:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75978 | attr.displayName = UA_LOCALIZEDTEXT("", "Default JSON"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75978:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75978 | attr.displayName = UA_LOCALIZEDTEXT("", "Default JSON"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75979:345: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75979 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15376LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Default JSON"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 76LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:75993:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75993 | attr.displayName = UA_LOCALIZEDTEXT("", "Default JSON"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75993:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75993 | attr.displayName = UA_LOCALIZEDTEXT("", "Default JSON"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:75994:345: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 75994 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 15375LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Default JSON"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 76LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:76008:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 76008 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeSystemType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:76008:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 76008 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeSystemType"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:76009:348: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 76009 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 75LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataTypeSystemType"), UA_NODEID_NULL,(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:76022:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 76022 | attr.displayName = UA_LOCALIZEDTEXT("", "OPC Binary"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:76022:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 76022 | attr.displayName = UA_LOCALIZEDTEXT("", "OPC Binary"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:76023:344: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 76023 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 93LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 90LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 35LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "OPC Binary"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 75LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:76036:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 76036 | attr.displayName = UA_LOCALIZEDTEXT("", "XML Schema"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:76036:41: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 76036 | attr.displayName = UA_LOCALIZEDTEXT("", "XML Schema"); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:76037:344: warning: passing 'const char[11]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 76037 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 92LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 90LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 35LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "XML Schema"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 75LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:76053:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 76053 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeDictionaryType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:76053:41: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 76053 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeDictionaryType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:76054:350: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 76054 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 72LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataTypeDictionaryType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:79246:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79246 | attr.displayName = UA_LOCALIZEDTEXT("", "Opc.Ua"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79246:41: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79246 | attr.displayName = UA_LOCALIZEDTEXT("", "Opc.Ua"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79247:348: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79247 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 7617LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 93LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Opc.Ua"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 72LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:79272:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79272 | attr.displayName = UA_LOCALIZEDTEXT("", "NamespaceUri"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79272:41: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79272 | attr.displayName = UA_LOCALIZEDTEXT("", "NamespaceUri"); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79276:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79276 | attr.description = UA_LOCALIZEDTEXT("", "A URI that uniquely identifies the dictionary."); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79276:41: warning: passing 'const char[47]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79276 | attr.description = UA_LOCALIZEDTEXT("", "A URI that uniquely identifies the dictionary."); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79280:347: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79280 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 107LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 72LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "NamespaceUri"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:79300:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79300 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeVersion"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79300:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79300 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeVersion"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79301:347: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79301 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 106LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 72LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataTypeVersion"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:79318:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79318 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeDescriptionType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79318:41: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79318 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeDescriptionType"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79319:350: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79319 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 69LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 63LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 45LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataTypeDescriptionType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:79349:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79349 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumValueType"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79349:41: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79349 | attr.displayName = UA_LOCALIZEDTEXT("", "EnumValueType"); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79350:350: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79350 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 7656LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 7617LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "EnumValueType"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 69LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:79384:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79384 | attr.displayName = UA_LOCALIZEDTEXT("", "Argument"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79384:41: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79384 | attr.displayName = UA_LOCALIZEDTEXT("", "Argument"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79385:350: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79385 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 7650LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 7617LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 47LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Argument"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 69LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:79408:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79408 | attr.displayName = UA_LOCALIZEDTEXT("", "DictionaryFragment"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79408:41: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79408 | attr.displayName = UA_LOCALIZEDTEXT("", "DictionaryFragment"); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79409:347: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79409 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 105LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 69LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DictionaryFragment"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:79429:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79429 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeVersion"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79429:41: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79429 | attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeVersion"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79430:347: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79430 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 104LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 69LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 46LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "DataTypeVersion"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 68LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:79444:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79444 | attr.displayName = UA_LOCALIZEDTEXT("", "Default XML"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79444:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79444 | attr.displayName = UA_LOCALIZEDTEXT("", "Default XML"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79445:344: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79445 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3063LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Default XML"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:79458:37: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79458 | attr.displayName = UA_LOCALIZEDTEXT("", "Default Binary"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79458:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79458 | attr.displayName = UA_LOCALIZEDTEXT("", "Default Binary"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:79459:344: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 79459 | retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT,UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 3062LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 0LU),UA_QUALIFIEDNAME(UA_NamespaceMapping_local2Remote(nsMapping, 0), "Default Binary"),UA_NODEID_NUMERIC(UA_NamespaceMapping_local2Remote(nsMapping, 0), 58LU),(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:84867:38: warning: passing 'const char[5]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 84867 | kvp[0].key = UA_QUALIFIEDNAME(0, "port"); + | ^~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:84869:38: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 84869 | kvp[1].key = UA_QUALIFIEDNAME(0, "listen"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:84871:38: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 84871 | kvp[2].key = UA_QUALIFIEDNAME(0, "validate"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:84873:38: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 84873 | kvp[3].key = UA_QUALIFIEDNAME(0, "reuse"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:84875:38: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 84875 | kvp[4].key = UA_QUALIFIEDNAME(0, "loopback"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:84880:42: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 84880 | kvp[5].key = UA_QUALIFIEDNAME(0, "address"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:84885:52: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 84885 | kvp[kvm.mapSize].key = UA_QUALIFIEDNAME(0, "interface"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:84943:38: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 84943 | kvp[0].key = UA_QUALIFIEDNAME(0, "address"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:84945:38: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 84945 | kvp[1].key = UA_QUALIFIEDNAME(0, "listen"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:84947:38: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 84947 | kvp[2].key = UA_QUALIFIEDNAME(0, "interface"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:84950:38: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 84950 | kvp[3].key = UA_QUALIFIEDNAME(0, "validate"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:88066:38: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 88066 | kvp[0].key = UA_QUALIFIEDNAME(0, "address"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:88068:38: warning: passing 'const char[5]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 88068 | kvp[1].key = UA_QUALIFIEDNAME(0, "port"); + | ^~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:88070:38: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 88070 | kvp[2].key = UA_QUALIFIEDNAME(0, "listen"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:88072:38: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 88072 | kvp[3].key = UA_QUALIFIEDNAME(0, "validate"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:88075:42: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 88075 | kvp[4].key = UA_QUALIFIEDNAME(0, "interface"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:88125:38: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 88125 | kvp[0].key = UA_QUALIFIEDNAME(0, "address"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:88127:38: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 88127 | kvp[1].key = UA_QUALIFIEDNAME(0, "subscribe"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:88129:38: warning: passing 'const char[5]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 88129 | kvp[2].key = UA_QUALIFIEDNAME(0, "port"); + | ^~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:88131:38: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 88131 | kvp[3].key = UA_QUALIFIEDNAME(0, "topic"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:88134:38: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 88134 | kvp[4].key = UA_QUALIFIEDNAME(0, "validate"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:90618:38: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 90618 | kvp[0].key = UA_QUALIFIEDNAME(0, "address"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:90620:38: warning: passing 'const char[10]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 90620 | kvp[1].key = UA_QUALIFIEDNAME(0, "subscribe"); + | ^~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:90622:38: warning: passing 'const char[5]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 90622 | kvp[2].key = UA_QUALIFIEDNAME(0, "port"); + | ^~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:90624:38: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 90624 | kvp[3].key = UA_QUALIFIEDNAME(0, "topic"); + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:90627:38: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 90627 | kvp[4].key = UA_QUALIFIEDNAME(0, "validate"); + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:91194:37: warning: passing 'const char[63]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 91194 | UA_String profile_1 = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-mqtt-uadp"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:91195:37: warning: passing 'const char[63]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 91195 | UA_String profile_2 = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-mqtt-json"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:91196:37: warning: passing 'const char[62]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 91196 | UA_String profile_3 = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:91709:30: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 91709 | psm->sc.name = UA_STRING("pubsub"); + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92233:46: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92233 | oAttr.displayName.locale = UA_STRING(""); + | ^~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92238:46: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92238 | oAttr.displayName = UA_LOCALIZEDTEXT("", "Subscribed Variables"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:92238:50: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92238 | oAttr.displayName = UA_LOCALIZEDTEXT("", "Subscribed Variables"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:92239:48: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92239 | folderBrowseName = UA_QUALIFIEDNAME(1, "Subscribed Variables"); + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92257:46: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92257 | vAttr.displayName.locale = UA_STRING(""); + | ^~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92346:41: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92346 | attr.displayName = UA_LOCALIZEDTEXT("", connectionName); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:92357:41: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92357 | attr.displayName = UA_LOCALIZEDTEXT("", "Address"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:92357:45: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92357 | attr.displayName = UA_LOCALIZEDTEXT("", "Address"); + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:92360:43: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92360 | UA_QUALIFIEDNAME(0, "Address"), UA_NS0ID(NETWORKADDRESSURLTYPE), + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92366:57: warning: passing 'const char[8]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92366 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Address"), + | ^~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92369:57: warning: passing 'const char[4]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92369 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Url"), + | ^~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92372:57: warning: passing 'const char[17]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92372 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "NetworkInterface"), + | ^~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92375:57: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92375 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublisherId"), + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92378:57: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92378 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "ConnectionProperties"), + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92381:57: warning: passing 'const char[20]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92381 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "TransportProfileUri"), + | ^~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92565:48: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92565 | object_attr.displayName = UA_LOCALIZEDTEXT("", dsrName); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:92576:71: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92576 | publisherIdNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublisherId"), + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92579:73: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92579 | writerGroupIdNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "WriterGroupId"), + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92582:75: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92582 | dataSetwriterIdNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetWriterId"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92585:68: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92585 | statusIdNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Status"), + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92592:67: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92592 | stateIdNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "State"), + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92685:40: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92685 | UA_LocalizedText name = {UA_STRING(""), newFolderName}; + | ^~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92689:59: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92689 | UA_QUALIFIEDNAME(0, "DataSetFolder"), + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92731:48: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92731 | object_attr.displayName = UA_LOCALIZEDTEXT("", pdsName); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:92746:57: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92746 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "ConfigurationVersion"), + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92761:57: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92761 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishedData"), + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92775:57: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92775 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetMetaData"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92902:48: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92902 | object_attr.displayName = UA_LOCALIZEDTEXT("", sdsName); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:92911:57: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92911 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "SubscribedDataSet"), + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92914:57: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92914 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetMetaData"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92917:57: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92917 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "IsConnected"), + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:92928:45: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92928 | attr.displayName = UA_LOCALIZEDTEXT("", "TargetVariables"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:92928:49: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92928 | attr.displayName = UA_LOCALIZEDTEXT("", "TargetVariables"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:92942:67: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 92942 | UA_NS0ID(HASPROPERTY), UA_QUALIFIEDNAME(0, "TargetVariables"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93048:48: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93048 | object_attr.displayName = UA_LOCALIZEDTEXT("", wgName); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:93056:57: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93056 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "KeepAliveTime"), + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93059:57: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93059 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishingInterval"), + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93062:57: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93062 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Status"), + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93069:57: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93069 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "State"), + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93103:57: warning: passing 'const char[9]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93103 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Priority"), + | ^~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93106:57: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93106 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "WriterGroupId"), + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93120:48: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93120 | object_attr.displayName = UA_LOCALIZEDTEXT("", "MessageSettings"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:93120:52: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93120 | object_attr.displayName = UA_LOCALIZEDTEXT("", "MessageSettings"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:93123:43: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93123 | UA_QUALIFIEDNAME(0, "MessageSettings"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93131:57: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93131 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "MessageSettings"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93134:57: warning: passing 'const char[26]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93134 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "NetworkMessageContentMask"), + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93150:57: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93150 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "GroupVersion"), + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93254:37: warning: passing 'const char[63]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93254 | UA_String profile_1 = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-mqtt-uadp"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93255:37: warning: passing 'const char[63]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93255 | UA_String profile_2 = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-mqtt-json"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93291:48: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93291 | object_attr.displayName = UA_LOCALIZEDTEXT("", rgName); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:93301:57: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93301 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Status"), + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93308:57: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93308 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "State"), + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93487:48: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93487 | object_attr.displayName = UA_LOCALIZEDTEXT("", dswName); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:93501:57: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93501 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetWriterId"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93504:57: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93504 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "KeyFrameCount"), + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93507:57: warning: passing 'const char[24]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93507 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetFieldContentMask"), + | ^~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93511:57: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93511 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Status"), + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93518:57: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93518 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "State"), + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93562:48: warning: passing 'const char[1]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93562 | object_attr.displayName = UA_LOCALIZEDTEXT("", "MessageSettings"); + | ^~ +../../../../ext/opcua_client/open62541.c:7770:24: note: passing argument to parameter 'locale' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:93562:52: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93562 | object_attr.displayName = UA_LOCALIZEDTEXT("", "MessageSettings"); + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:7770:38: note: passing argument to parameter 'text' here + 7770 | UA_LOCALIZEDTEXT(char *locale, char *text) { + | ^ +../../../../ext/opcua_client/open62541.c:93565:43: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93565 | UA_QUALIFIEDNAME(0, "MessageSettings"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93846:57: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93846 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublisherId"), + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93863:57: warning: passing 'const char[19]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93863 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishingInterval"), + | ^~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93867:57: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93867 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Status"), + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93870:57: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93870 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "State"), + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93890:57: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93890 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Status"), + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93893:57: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93893 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "State"), + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93912:57: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93912 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetWriterId"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93915:57: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93915 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Status"), + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93918:57: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93918 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "State"), + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93940:57: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93940 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublisherId"), + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93943:57: warning: passing 'const char[7]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93943 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Status"), + | ^~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93946:57: warning: passing 'const char[6]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93946 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "State"), + | ^~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93968:70: warning: passing 'const char[14]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93968 | UA_NodeId node = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishedData"), + | ^~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93974:60: warning: passing 'const char[21]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93974 | node = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "ConfigurationVersion"), + | ^~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93980:60: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93980 | node = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetMetaData"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:93997:57: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 93997 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetMetaData"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:94002:60: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 94002 | node = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "IsConnected"), + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:94078:33: warning: passing 'const char[62]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 94078 | profileArray[0] = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:94199:57: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 94199 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetMetaData"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:94202:57: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 94202 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "SubscribedDataSet"), + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:94210:57: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 94210 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetMetaData"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:94213:57: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 94213 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "SubscribedDataSet"), + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:94233:57: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 94233 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetMetaData"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:94236:57: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 94236 | findSingleChildNode(server, UA_QUALIFIEDNAME(0, "SubscribedDataSet"), + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:98123:58: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 98123 | UA_ConnectionManager_new_POSIX_TCP(UA_STRING("tcp connection manager")); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:98136:58: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 98136 | UA_ConnectionManager_new_POSIX_UDP(UA_STRING("udp connection manager")); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:98151:75: warning: passing 'const char[18]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 98151 | UA_InterruptManager *im = UA_InterruptManager_new_POSIX(UA_STRING("interrupt manager")); + | ^~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:99536:58: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 99536 | UA_ConnectionManager_new_POSIX_TCP(UA_STRING("tcp connection manager")); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:99548:58: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 99548 | UA_ConnectionManager_new_POSIX_UDP(UA_STRING("udp connection manager")); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:100003:35: warning: passing 'const char[48]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 100003 | policy->policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None"); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6203:17: note: passing argument to parameter 'chars' here + 6203 | UA_STRING(char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:101372:54: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 101372 | UA_QUALIFIEDNAME(0, "clock-source"), + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:101376:54: warning: passing 'const char[23]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 101376 | UA_QUALIFIEDNAME(0, "clock-source-monotonic"), + | ^~~~~~~~~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:101840:54: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 101840 | UA_QUALIFIEDNAME(0, "recv-bufsize"), + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:101851:54: warning: passing 'const char[13]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 101851 | UA_QUALIFIEDNAME(0, "send-bufsize"), + | ^~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:102249:47: warning: passing 'int *' to parameter of type 'socklen_t *' (aka 'unsigned int *') converts between pointers to integer types with different sign [-Wpointer-sign] + 102249 | getsockname(lst, (struct sockaddr*)&addr, &len); + | ^~~~ +/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/socket.h:714:78: note: passing argument to parameter here + 714 | int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict) + | ^ +../../../../ext/opcua_client/open62541.c:102782:54: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 102782 | &cm->eventSource.params, UA_QUALIFIEDNAME(0, "max-connections"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:102791:35: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 102791 | kvp.key = UA_QUALIFIEDNAME(0, "remote-address"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:102817:58: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 102817 | &pcm->cm.eventSource.params, UA_QUALIFIEDNAME(0, "max-connections"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:102998:41: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 102998 | params[0].key = UA_QUALIFIEDNAME(0, "listen-address"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:103000:41: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 103000 | params[1].key = UA_QUALIFIEDNAME(0, "listen-port"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:103255:58: warning: passing 'const char[16]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 103255 | &pcm->cm.eventSource.params, UA_QUALIFIEDNAME(0, "max-connections"), + | ^~~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:104308:38: warning: passing 'const char[15]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 104308 | kvp[0].key = UA_QUALIFIEDNAME(0, "remote-address"); + | ^~~~~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +../../../../ext/opcua_client/open62541.c:104310:38: warning: passing 'const char[12]' to parameter of type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers] + 104310 | kvp[1].key = UA_QUALIFIEDNAME(0, "remote-port"); + | ^~~~~~~~~~~~~ +../../../../ext/opcua_client/open62541.c:6353:43: note: passing argument to parameter 'chars' here + 6353 | UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + | ^ +2270 warnings and 1 error generated. +make: *** [open62541.o] Error 1 +rake aborted! +Command failed with status (2): [/usr/bin/make...] + +Tasks: TOP => compile => compile:arm64-darwin24 => compile:opcua_client:arm64-darwin24 => copy:opcua_client:arm64-darwin24:3.1.2 => tmp/arm64-darwin24/opcua_client/3.1.2/opcua_client.bundle +(See full trace by running task with --trace) diff --git a/ext/opcua_client/extconf.rb b/ext/opcua_client/extconf.rb index 73f50b7..776e71b 100644 --- a/ext/opcua_client/extconf.rb +++ b/ext/opcua_client/extconf.rb @@ -1,2 +1,19 @@ require 'mkmf' -create_makefile 'opcua_client/opcua_client' + +# Get the absolute path to the mbedtls directory +mbedtls_dir = File.expand_path('mbedtls', __dir__) + +# Build the Mbed TLS static libraries +Dir.chdir(mbedtls_dir) do + system('make clean') # Clean previous build artifacts + system('make') # Build the .a files +end + +# Add the Mbed TLS include and library paths +mbedtls_include = File.expand_path('include', mbedtls_dir) +mbedtls_library = mbedtls_dir # Path to the .a files + +$CFLAGS << " -I#{mbedtls_include}" +$LDFLAGS << " -L#{mbedtls_library} -lmbedtls -lmbedcrypto -lmbedx509" + +create_makefile('opcua_client/opcua_client') diff --git a/ext/opcua_client/mbedtls/Makefile b/ext/opcua_client/mbedtls/Makefile new file mode 100644 index 0000000..ee25ce1 --- /dev/null +++ b/ext/opcua_client/mbedtls/Makefile @@ -0,0 +1,63 @@ +CC = gcc +AR = ar +CFLAGS = -Iinclude -Wall -Wextra -O2 +CFLAGS += -fPIC +LIBDIR = library +OBJDIR = obj + +# Source files for each library +SRCS_CRYPTO = $(LIBDIR)/aes.c $(LIBDIR)/aesni.c $(LIBDIR)/arc4.c $(LIBDIR)/aria.c $(LIBDIR)/asn1parse.c \ + $(LIBDIR)/asn1write.c $(LIBDIR)/base64.c $(LIBDIR)/bignum.c $(LIBDIR)/blowfish.c $(LIBDIR)/camellia.c \ + $(LIBDIR)/ccm.c $(LIBDIR)/chacha20.c $(LIBDIR)/chachapoly.c $(LIBDIR)/cipher.c $(LIBDIR)/cipher_wrap.c \ + $(LIBDIR)/constant_time.c $(LIBDIR)/cmac.c $(LIBDIR)/ctr_drbg.c $(LIBDIR)/des.c $(LIBDIR)/dhm.c \ + $(LIBDIR)/ecdh.c $(LIBDIR)/ecdsa.c $(LIBDIR)/ecjpake.c $(LIBDIR)/ecp.c $(LIBDIR)/ecp_curves.c \ + $(LIBDIR)/entropy.c $(LIBDIR)/entropy_poll.c $(LIBDIR)/error.c $(LIBDIR)/gcm.c $(LIBDIR)/havege.c \ + $(LIBDIR)/hkdf.c $(LIBDIR)/hmac_drbg.c $(LIBDIR)/md.c $(LIBDIR)/md2.c $(LIBDIR)/md4.c $(LIBDIR)/md5.c \ + $(LIBDIR)/memory_buffer_alloc.c $(LIBDIR)/nist_kw.c $(LIBDIR)/oid.c $(LIBDIR)/padlock.c $(LIBDIR)/pem.c \ + $(LIBDIR)/pk.c $(LIBDIR)/pk_wrap.c $(LIBDIR)/pkcs12.c $(LIBDIR)/pkcs5.c $(LIBDIR)/pkparse.c \ + $(LIBDIR)/pkwrite.c $(LIBDIR)/platform.c $(LIBDIR)/platform_util.c $(LIBDIR)/poly1305.c \ + $(LIBDIR)/psa_crypto.c $(LIBDIR)/psa_crypto_aead.c $(LIBDIR)/psa_crypto_cipher.c $(LIBDIR)/psa_crypto_client.c \ + $(LIBDIR)/psa_crypto_driver_wrappers.c $(LIBDIR)/psa_crypto_ecp.c $(LIBDIR)/psa_crypto_hash.c \ + $(LIBDIR)/psa_crypto_mac.c $(LIBDIR)/psa_crypto_rsa.c $(LIBDIR)/psa_crypto_se.c $(LIBDIR)/psa_crypto_slot_management.c \ + $(LIBDIR)/psa_crypto_storage.c $(LIBDIR)/psa_its_file.c $(LIBDIR)/ripemd160.c $(LIBDIR)/rsa.c \ + $(LIBDIR)/rsa_internal.c $(LIBDIR)/sha1.c $(LIBDIR)/sha256.c $(LIBDIR)/sha512.c $(LIBDIR)/threading.c \ + $(LIBDIR)/timing.c $(LIBDIR)/version.c $(LIBDIR)/version_features.c $(LIBDIR)/xtea.c + +SRCS_X509 = $(LIBDIR)/certs.c $(LIBDIR)/pkcs11.c $(LIBDIR)/x509.c $(LIBDIR)/x509_create.c $(LIBDIR)/x509_crl.c \ + $(LIBDIR)/x509_crt.c $(LIBDIR)/x509_csr.c $(LIBDIR)/x509write_crt.c $(LIBDIR)/x509write_csr.c + +SRCS_TLS = $(LIBDIR)/debug.c $(LIBDIR)/net_sockets.c $(LIBDIR)/ssl_cache.c $(LIBDIR)/ssl_ciphersuites.c \ + $(LIBDIR)/ssl_cli.c $(LIBDIR)/ssl_cookie.c $(LIBDIR)/ssl_msg.c $(LIBDIR)/ssl_srv.c $(LIBDIR)/ssl_ticket.c \ + $(LIBDIR)/ssl_tls.c $(LIBDIR)/ssl_tls13_keys.c + +# Object files for each library +OBJS_CRYPTO = $(SRCS_CRYPTO:$(LIBDIR)/%.c=$(OBJDIR)/%.o) +OBJS_X509 = $(SRCS_X509:$(LIBDIR)/%.c=$(OBJDIR)/%.o) +OBJS_TLS = $(SRCS_TLS:$(LIBDIR)/%.c=$(OBJDIR)/%.o) + +# Output libraries +LIBCRYPTO = libmbedcrypto.a +LIBX509 = libmbedx509.a +LIBTLS = libmbedtls.a + +# Default target +all: $(LIBCRYPTO) $(LIBX509) $(LIBTLS) + +# Build object files +$(OBJDIR)/%.o: $(LIBDIR)/%.c + @mkdir -p $(OBJDIR) + $(CC) $(CFLAGS) -c $< -o $@ + +# Build static libraries +$(LIBCRYPTO): $(OBJS_CRYPTO) + $(AR) rcs $@ $(OBJS_CRYPTO) + +$(LIBX509): $(OBJS_X509) + $(AR) rcs $@ $(OBJS_X509) + +$(LIBTLS): $(OBJS_TLS) + $(AR) rcs $@ $(OBJS_TLS) + +# Clean up build artifacts +clean: + rm -rf $(OBJDIR) $(LIBCRYPTO) $(LIBX509) $(LIBTLS) diff --git a/ext/opcua_client/mbedtls/include/.gitignore b/ext/opcua_client/mbedtls/include/.gitignore new file mode 100644 index 0000000..bf67d02 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/.gitignore @@ -0,0 +1,4 @@ +Makefile +*.sln +*.vcxproj +mbedtls/check_config diff --git a/ext/opcua_client/mbedtls/include/CMakeLists.txt b/ext/opcua_client/mbedtls/include/CMakeLists.txt new file mode 100644 index 0000000..11b417b --- /dev/null +++ b/ext/opcua_client/mbedtls/include/CMakeLists.txt @@ -0,0 +1,22 @@ +option(INSTALL_MBEDTLS_HEADERS "Install Mbed TLS headers." ON) + +if(INSTALL_MBEDTLS_HEADERS) + + file(GLOB headers "mbedtls/*.h") + file(GLOB psa_headers "psa/*.h") + + install(FILES ${headers} + DESTINATION include/mbedtls + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) + + install(FILES ${psa_headers} + DESTINATION include/psa + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) + +endif(INSTALL_MBEDTLS_HEADERS) + +# Make config.h available in an out-of-source build. ssl-opt.sh requires it. +if (ENABLE_TESTING AND NOT ${CMAKE_CURRENT_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) + link_to_source(mbedtls) + link_to_source(psa) +endif() diff --git a/ext/opcua_client/mbedtls/include/mbedtls/aes.h b/ext/opcua_client/mbedtls/include/mbedtls/aes.h new file mode 100644 index 0000000..2623a42 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/aes.h @@ -0,0 +1,675 @@ +/** + * \file aes.h + * + * \brief This file contains AES definitions and functions. + * + * The Advanced Encryption Standard (AES) specifies a FIPS-approved + * cryptographic algorithm that can be used to protect electronic + * data. + * + * The AES algorithm is a symmetric block cipher that can + * encrypt and decrypt information. For more information, see + * FIPS Publication 197: Advanced Encryption Standard and + * ISO/IEC 18033-2:2006: Information technology -- Security + * techniques -- Encryption algorithms -- Part 2: Asymmetric + * ciphers. + * + * The AES-XTS block mode is standardized by NIST SP 800-38E + * + * and described in detail by IEEE P1619 + * . + */ + +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_AES_H +#define MBEDTLS_AES_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif +#include "mbedtls/platform_util.h" + +#include +#include + +/* padlock.c and aesni.c rely on these values! */ +#define MBEDTLS_AES_ENCRYPT 1 /**< AES encryption. */ +#define MBEDTLS_AES_DECRYPT 0 /**< AES decryption. */ + +/* Error codes in range 0x0020-0x0022 */ +/** Invalid key length. */ +#define MBEDTLS_ERR_AES_INVALID_KEY_LENGTH -0x0020 +/** Invalid data input length. */ +#define MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH -0x0022 + +/* Error codes in range 0x0021-0x0025 */ +/** Invalid input data. */ +#define MBEDTLS_ERR_AES_BAD_INPUT_DATA -0x0021 + +/* MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE is deprecated and should not be used. */ +/** Feature not available. For example, an unsupported AES key size. */ +#define MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE -0x0023 + +/* MBEDTLS_ERR_AES_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** AES hardware accelerator failed. */ +#define MBEDTLS_ERR_AES_HW_ACCEL_FAILED -0x0025 + +#if (defined(__ARMCC_VERSION) || defined(_MSC_VER)) && \ + !defined(inline) && !defined(__cplusplus) +#define inline __inline +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_AES_ALT) +// Regular implementation +// + +/** + * \brief The AES context-type definition. + */ +typedef struct mbedtls_aes_context { + int nr; /*!< The number of rounds. */ + uint32_t *rk; /*!< AES round keys. */ + uint32_t buf[68]; /*!< Unaligned data buffer. This buffer can + hold 32 extra Bytes, which can be used for + one of the following purposes: +
  • Alignment if VIA padlock is + used.
  • +
  • Simplifying key expansion in the 256-bit + case by generating an extra round key. +
*/ +} +mbedtls_aes_context; + +#if defined(MBEDTLS_CIPHER_MODE_XTS) +/** + * \brief The AES XTS context-type definition. + */ +typedef struct mbedtls_aes_xts_context { + mbedtls_aes_context crypt; /*!< The AES context to use for AES block + encryption or decryption. */ + mbedtls_aes_context tweak; /*!< The AES context used for tweak + computation. */ +} mbedtls_aes_xts_context; +#endif /* MBEDTLS_CIPHER_MODE_XTS */ + +#else /* MBEDTLS_AES_ALT */ +#include "aes_alt.h" +#endif /* MBEDTLS_AES_ALT */ + +/** + * \brief This function initializes the specified AES context. + * + * It must be the first API called before using + * the context. + * + * \param ctx The AES context to initialize. This must not be \c NULL. + */ +void mbedtls_aes_init(mbedtls_aes_context *ctx); + +/** + * \brief This function releases and clears the specified AES context. + * + * \param ctx The AES context to clear. + * If this is \c NULL, this function does nothing. + * Otherwise, the context must have been at least initialized. + */ +void mbedtls_aes_free(mbedtls_aes_context *ctx); + +#if defined(MBEDTLS_CIPHER_MODE_XTS) +/** + * \brief This function initializes the specified AES XTS context. + * + * It must be the first API called before using + * the context. + * + * \param ctx The AES XTS context to initialize. This must not be \c NULL. + */ +void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx); + +/** + * \brief This function releases and clears the specified AES XTS context. + * + * \param ctx The AES XTS context to clear. + * If this is \c NULL, this function does nothing. + * Otherwise, the context must have been at least initialized. + */ +void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx); +#endif /* MBEDTLS_CIPHER_MODE_XTS */ + +/** + * \brief This function sets the encryption key. + * + * \param ctx The AES context to which the key should be bound. + * It must be initialized. + * \param key The encryption key. + * This must be a readable buffer of size \p keybits bits. + * \param keybits The size of data passed in bits. Valid options are: + *
  • 128 bits
  • + *
  • 192 bits
  • + *
  • 256 bits
+ * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key, + unsigned int keybits); + +/** + * \brief This function sets the decryption key. + * + * \param ctx The AES context to which the key should be bound. + * It must be initialized. + * \param key The decryption key. + * This must be a readable buffer of size \p keybits bits. + * \param keybits The size of data passed. Valid options are: + *
  • 128 bits
  • + *
  • 192 bits
  • + *
  • 256 bits
+ * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key, + unsigned int keybits); + +#if defined(MBEDTLS_CIPHER_MODE_XTS) +/** + * \brief This function prepares an XTS context for encryption and + * sets the encryption key. + * + * \param ctx The AES XTS context to which the key should be bound. + * It must be initialized. + * \param key The encryption key. This is comprised of the XTS key1 + * concatenated with the XTS key2. + * This must be a readable buffer of size \p keybits bits. + * \param keybits The size of \p key passed in bits. Valid options are: + *
  • 256 bits (each of key1 and key2 is a 128-bit key)
  • + *
  • 512 bits (each of key1 and key2 is a 256-bit key)
+ * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx, + const unsigned char *key, + unsigned int keybits); + +/** + * \brief This function prepares an XTS context for decryption and + * sets the decryption key. + * + * \param ctx The AES XTS context to which the key should be bound. + * It must be initialized. + * \param key The decryption key. This is comprised of the XTS key1 + * concatenated with the XTS key2. + * This must be a readable buffer of size \p keybits bits. + * \param keybits The size of \p key passed in bits. Valid options are: + *
  • 256 bits (each of key1 and key2 is a 128-bit key)
  • + *
  • 512 bits (each of key1 and key2 is a 256-bit key)
+ * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx, + const unsigned char *key, + unsigned int keybits); +#endif /* MBEDTLS_CIPHER_MODE_XTS */ + +/** + * \brief This function performs an AES single-block encryption or + * decryption operation. + * + * It performs the operation defined in the \p mode parameter + * (encrypt or decrypt), on the input data buffer defined in + * the \p input parameter. + * + * mbedtls_aes_init(), and either mbedtls_aes_setkey_enc() or + * mbedtls_aes_setkey_dec() must be called before the first + * call to this API with the same context. + * + * \param ctx The AES context to use for encryption or decryption. + * It must be initialized and bound to a key. + * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or + * #MBEDTLS_AES_DECRYPT. + * \param input The buffer holding the input data. + * It must be readable and at least \c 16 Bytes long. + * \param output The buffer where the output data will be written. + * It must be writeable and at least \c 16 Bytes long. + + * \return \c 0 on success. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16]); + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/** + * \brief This function performs an AES-CBC encryption or decryption operation + * on full blocks. + * + * It performs the operation defined in the \p mode + * parameter (encrypt/decrypt), on the input data buffer defined in + * the \p input parameter. + * + * It can be called as many times as needed, until all the input + * data is processed. mbedtls_aes_init(), and either + * mbedtls_aes_setkey_enc() or mbedtls_aes_setkey_dec() must be called + * before the first call to this API with the same context. + * + * \note This function operates on full blocks, that is, the input size + * must be a multiple of the AES block size of \c 16 Bytes. + * + * \note Upon exit, the content of the IV is updated so that you can + * call the same function again on the next + * block(s) of data and get the same result as if it was + * encrypted in one call. This allows a "streaming" usage. + * If you need to retain the contents of the IV, you should + * either save it manually or use the cipher module instead. + * + * + * \param ctx The AES context to use for encryption or decryption. + * It must be initialized and bound to a key. + * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or + * #MBEDTLS_AES_DECRYPT. + * \param length The length of the input data in Bytes. This must be a + * multiple of the block size (\c 16 Bytes). + * \param iv Initialization vector (updated after use). + * It must be a readable and writeable buffer of \c 16 Bytes. + * \param input The buffer holding the input data. + * It must be readable and of size \p length Bytes. + * \param output The buffer holding the output data. + * It must be writeable and of size \p length Bytes. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH + * on failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_XTS) +/** + * \brief This function performs an AES-XTS encryption or decryption + * operation for an entire XTS data unit. + * + * AES-XTS encrypts or decrypts blocks based on their location as + * defined by a data unit number. The data unit number must be + * provided by \p data_unit. + * + * NIST SP 800-38E limits the maximum size of a data unit to 2^20 + * AES blocks. If the data unit is larger than this, this function + * returns #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH. + * + * \param ctx The AES XTS context to use for AES XTS operations. + * It must be initialized and bound to a key. + * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or + * #MBEDTLS_AES_DECRYPT. + * \param length The length of a data unit in Bytes. This can be any + * length between 16 bytes and 2^24 bytes inclusive + * (between 1 and 2^20 block cipher blocks). + * \param data_unit The address of the data unit encoded as an array of 16 + * bytes in little-endian format. For disk encryption, this + * is typically the index of the block device sector that + * contains the data. + * \param input The buffer holding the input data (which is an entire + * data unit). This function reads \p length Bytes from \p + * input. + * \param output The buffer holding the output data (which is an entire + * data unit). This function writes \p length Bytes to \p + * output. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH if \p length is + * smaller than an AES block in size (16 Bytes) or if \p + * length is larger than 2^20 blocks (16 MiB). + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx, + int mode, + size_t length, + const unsigned char data_unit[16], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_XTS */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +/** + * \brief This function performs an AES-CFB128 encryption or decryption + * operation. + * + * It performs the operation defined in the \p mode + * parameter (encrypt or decrypt), on the input data buffer + * defined in the \p input parameter. + * + * For CFB, you must set up the context with mbedtls_aes_setkey_enc(), + * regardless of whether you are performing an encryption or decryption + * operation, that is, regardless of the \p mode parameter. This is + * because CFB mode uses the same key schedule for encryption and + * decryption. + * + * \note Upon exit, the content of the IV is updated so that you can + * call the same function again on the next + * block(s) of data and get the same result as if it was + * encrypted in one call. This allows a "streaming" usage. + * If you need to retain the contents of the + * IV, you must either save it manually or use the cipher + * module instead. + * + * + * \param ctx The AES context to use for encryption or decryption. + * It must be initialized and bound to a key. + * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or + * #MBEDTLS_AES_DECRYPT. + * \param length The length of the input data in Bytes. + * \param iv_off The offset in IV (updated after use). + * It must point to a valid \c size_t. + * \param iv The initialization vector (updated after use). + * It must be a readable and writeable buffer of \c 16 Bytes. + * \param input The buffer holding the input data. + * It must be readable and of size \p length Bytes. + * \param output The buffer holding the output data. + * It must be writeable and of size \p length Bytes. + * + * \return \c 0 on success. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output); + +/** + * \brief This function performs an AES-CFB8 encryption or decryption + * operation. + * + * It performs the operation defined in the \p mode + * parameter (encrypt/decrypt), on the input data buffer defined + * in the \p input parameter. + * + * Due to the nature of CFB, you must use the same key schedule for + * both encryption and decryption operations. Therefore, you must + * use the context initialized with mbedtls_aes_setkey_enc() for + * both #MBEDTLS_AES_ENCRYPT and #MBEDTLS_AES_DECRYPT. + * + * \note Upon exit, the content of the IV is updated so that you can + * call the same function again on the next + * block(s) of data and get the same result as if it was + * encrypted in one call. This allows a "streaming" usage. + * If you need to retain the contents of the + * IV, you should either save it manually or use the cipher + * module instead. + * + * + * \param ctx The AES context to use for encryption or decryption. + * It must be initialized and bound to a key. + * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or + * #MBEDTLS_AES_DECRYPT + * \param length The length of the input data. + * \param iv The initialization vector (updated after use). + * It must be a readable and writeable buffer of \c 16 Bytes. + * \param input The buffer holding the input data. + * It must be readable and of size \p length Bytes. + * \param output The buffer holding the output data. + * It must be writeable and of size \p length Bytes. + * + * \return \c 0 on success. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output); +#endif /*MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_OFB) +/** + * \brief This function performs an AES-OFB (Output Feedback Mode) + * encryption or decryption operation. + * + * For OFB, you must set up the context with + * mbedtls_aes_setkey_enc(), regardless of whether you are + * performing an encryption or decryption operation. This is + * because OFB mode uses the same key schedule for encryption and + * decryption. + * + * The OFB operation is identical for encryption or decryption, + * therefore no operation mode needs to be specified. + * + * \note Upon exit, the content of iv, the Initialisation Vector, is + * updated so that you can call the same function again on the next + * block(s) of data and get the same result as if it was encrypted + * in one call. This allows a "streaming" usage, by initialising + * iv_off to 0 before the first call, and preserving its value + * between calls. + * + * For non-streaming use, the iv should be initialised on each call + * to a unique value, and iv_off set to 0 on each call. + * + * If you need to retain the contents of the initialisation vector, + * you must either save it manually or use the cipher module + * instead. + * + * \warning For the OFB mode, the initialisation vector must be unique + * every encryption operation. Reuse of an initialisation vector + * will compromise security. + * + * \param ctx The AES context to use for encryption or decryption. + * It must be initialized and bound to a key. + * \param length The length of the input data. + * \param iv_off The offset in IV (updated after use). + * It must point to a valid \c size_t. + * \param iv The initialization vector (updated after use). + * It must be a readable and writeable buffer of \c 16 Bytes. + * \param input The buffer holding the input data. + * It must be readable and of size \p length Bytes. + * \param output The buffer holding the output data. + * It must be writeable and of size \p length Bytes. + * + * \return \c 0 on success. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx, + size_t length, + size_t *iv_off, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output); + +#endif /* MBEDTLS_CIPHER_MODE_OFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +/** + * \brief This function performs an AES-CTR encryption or decryption + * operation. + * + * Due to the nature of CTR, you must use the same key schedule + * for both encryption and decryption operations. Therefore, you + * must use the context initialized with mbedtls_aes_setkey_enc() + * for both #MBEDTLS_AES_ENCRYPT and #MBEDTLS_AES_DECRYPT. + * + * \warning You must never reuse a nonce value with the same key. Doing so + * would void the encryption for the two messages encrypted with + * the same nonce and key. + * + * There are two common strategies for managing nonces with CTR: + * + * 1. You can handle everything as a single message processed over + * successive calls to this function. In that case, you want to + * set \p nonce_counter and \p nc_off to 0 for the first call, and + * then preserve the values of \p nonce_counter, \p nc_off and \p + * stream_block across calls to this function as they will be + * updated by this function. + * + * With this strategy, you must not encrypt more than 2**128 + * blocks of data with the same key. + * + * 2. You can encrypt separate messages by dividing the \p + * nonce_counter buffer in two areas: the first one used for a + * per-message nonce, handled by yourself, and the second one + * updated by this function internally. + * + * For example, you might reserve the first 12 bytes for the + * per-message nonce, and the last 4 bytes for internal use. In that + * case, before calling this function on a new message you need to + * set the first 12 bytes of \p nonce_counter to your chosen nonce + * value, the last 4 to 0, and \p nc_off to 0 (which will cause \p + * stream_block to be ignored). That way, you can encrypt at most + * 2**96 messages of up to 2**32 blocks each with the same key. + * + * The per-message nonce (or information sufficient to reconstruct + * it) needs to be communicated with the ciphertext and must be unique. + * The recommended way to ensure uniqueness is to use a message + * counter. An alternative is to generate random nonces, but this + * limits the number of messages that can be securely encrypted: + * for example, with 96-bit random nonces, you should not encrypt + * more than 2**32 messages with the same key. + * + * Note that for both strategies, sizes are measured in blocks and + * that an AES block is 16 bytes. + * + * \warning Upon return, \p stream_block contains sensitive data. Its + * content must not be written to insecure storage and should be + * securely discarded as soon as it's no longer needed. + * + * \param ctx The AES context to use for encryption or decryption. + * It must be initialized and bound to a key. + * \param length The length of the input data. + * \param nc_off The offset in the current \p stream_block, for + * resuming within the current cipher stream. The + * offset pointer should be 0 at the start of a stream. + * It must point to a valid \c size_t. + * \param nonce_counter The 128-bit nonce and counter. + * It must be a readable-writeable buffer of \c 16 Bytes. + * \param stream_block The saved stream block for resuming. This is + * overwritten by the function. + * It must be a readable-writeable buffer of \c 16 Bytes. + * \param input The buffer holding the input data. + * It must be readable and of size \p length Bytes. + * \param output The buffer holding the output data. + * It must be writeable and of size \p length Bytes. + * + * \return \c 0 on success. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[16], + unsigned char stream_block[16], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +/** + * \brief Internal AES block encryption function. This is only + * exposed to allow overriding it using + * \c MBEDTLS_AES_ENCRYPT_ALT. + * + * \param ctx The AES context to use for encryption. + * \param input The plaintext block. + * \param output The output (ciphertext) block. + * + * \return \c 0 on success. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx, + const unsigned char input[16], + unsigned char output[16]); + +/** + * \brief Internal AES block decryption function. This is only + * exposed to allow overriding it using see + * \c MBEDTLS_AES_DECRYPT_ALT. + * + * \param ctx The AES context to use for decryption. + * \param input The ciphertext block. + * \param output The output (plaintext) block. + * + * \return \c 0 on success. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx, + const unsigned char input[16], + unsigned char output[16]); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief Deprecated internal AES block encryption function + * without return value. + * + * \deprecated Superseded by mbedtls_internal_aes_encrypt() + * + * \param ctx The AES context to use for encryption. + * \param input Plaintext block. + * \param output Output (ciphertext) block. + */ +MBEDTLS_DEPRECATED void mbedtls_aes_encrypt(mbedtls_aes_context *ctx, + const unsigned char input[16], + unsigned char output[16]); + +/** + * \brief Deprecated internal AES block decryption function + * without return value. + * + * \deprecated Superseded by mbedtls_internal_aes_decrypt() + * + * \param ctx The AES context to use for decryption. + * \param input Ciphertext block. + * \param output Output (plaintext) block. + */ +MBEDTLS_DEPRECATED void mbedtls_aes_decrypt(mbedtls_aes_context *ctx, + const unsigned char input[16], + unsigned char output[16]); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + + +#if defined(MBEDTLS_SELF_TEST) +/** + * \brief Checkup routine. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_aes_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* aes.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/aesni.h b/ext/opcua_client/mbedtls/include/mbedtls/aesni.h new file mode 100644 index 0000000..93f0673 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/aesni.h @@ -0,0 +1,169 @@ +/** + * \file aesni.h + * + * \brief AES-NI for hardware AES acceleration on some Intel processors + * + * \warning These functions are only for internal use by other library + * functions; you must not call them directly. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_AESNI_H +#define MBEDTLS_AESNI_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/aes.h" + +#define MBEDTLS_AESNI_AES 0x02000000u +#define MBEDTLS_AESNI_CLMUL 0x00000002u + +#if !defined(MBEDTLS_HAVE_X86_64) && \ + (defined(__amd64__) || defined(__x86_64__) || \ + defined(_M_X64) || defined(_M_AMD64)) && \ + !defined(_M_ARM64EC) +#define MBEDTLS_HAVE_X86_64 +#endif + +#if !defined(MBEDTLS_HAVE_X86) && \ + (defined(__i386__) || defined(_M_IX86)) +#define MBEDTLS_HAVE_X86 +#endif + +#if defined(MBEDTLS_AESNI_C) && \ + (defined(MBEDTLS_HAVE_X86_64) || defined(MBEDTLS_HAVE_X86)) + +/* Can we do AESNI with intrinsics? + * (Only implemented with certain compilers, only for certain targets.) + * + * NOTE: MBEDTLS_AESNI_HAVE_INTRINSICS and MBEDTLS_AESNI_HAVE_CODE are internal + * macros that may change in future releases. + */ +#undef MBEDTLS_AESNI_HAVE_INTRINSICS +#if defined(_MSC_VER) && !defined(__clang__) +/* Visual Studio supports AESNI intrinsics since VS 2008 SP1. We only support + * VS 2013 and up for other reasons anyway, so no need to check the version. */ +#define MBEDTLS_AESNI_HAVE_INTRINSICS +#endif +/* GCC-like compilers: currently, we only support intrinsics if the requisite + * target flag is enabled when building the library (e.g. `gcc -mpclmul -msse2` + * or `clang -maes -mpclmul`). */ +#if (defined(__GNUC__) || defined(__clang__)) && defined(__AES__) && defined(__PCLMUL__) +#define MBEDTLS_AESNI_HAVE_INTRINSICS +#endif + +/* Choose the implementation of AESNI, if one is available. */ +#undef MBEDTLS_AESNI_HAVE_CODE +/* To minimize disruption when releasing the intrinsics-based implementation, + * favor the assembly-based implementation if it's available. We intend to + * revise this in a later release of Mbed TLS 3.x. In the long run, we will + * likely remove the assembly implementation. */ +#if defined(MBEDTLS_HAVE_ASM) && \ + defined(__GNUC__) && defined(MBEDTLS_HAVE_X86_64) +/* Can we do AESNI with inline assembly? + * (Only implemented with gas syntax, only for 64-bit.) + */ +#define MBEDTLS_AESNI_HAVE_CODE 1 // via assembly +#elif defined(MBEDTLS_AESNI_HAVE_INTRINSICS) +#define MBEDTLS_AESNI_HAVE_CODE 2 // via intrinsics +#endif + +#if defined(MBEDTLS_AESNI_HAVE_CODE) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Internal function to detect the AES-NI feature in CPUs. + * + * \note This function is only for internal use by other library + * functions; you must not call it directly. + * + * \param what The feature to detect + * (MBEDTLS_AESNI_AES or MBEDTLS_AESNI_CLMUL) + * + * \return 1 if CPU has support for the feature, 0 otherwise + */ +int mbedtls_aesni_has_support(unsigned int what); + +/** + * \brief Internal AES-NI AES-ECB block encryption and decryption + * + * \note This function is only for internal use by other library + * functions; you must not call it directly. + * + * \param ctx AES context + * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT + * \param input 16-byte input block + * \param output 16-byte output block + * + * \return 0 on success (cannot fail) + */ +int mbedtls_aesni_crypt_ecb(mbedtls_aes_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16]); + +/** + * \brief Internal GCM multiplication: c = a * b in GF(2^128) + * + * \note This function is only for internal use by other library + * functions; you must not call it directly. + * + * \param c Result + * \param a First operand + * \param b Second operand + * + * \note Both operands and result are bit strings interpreted as + * elements of GF(2^128) as per the GCM spec. + */ +void mbedtls_aesni_gcm_mult(unsigned char c[16], + const unsigned char a[16], + const unsigned char b[16]); + +/** + * \brief Internal round key inversion. This function computes + * decryption round keys from the encryption round keys. + * + * \note This function is only for internal use by other library + * functions; you must not call it directly. + * + * \param invkey Round keys for the equivalent inverse cipher + * \param fwdkey Original round keys (for encryption) + * \param nr Number of rounds (that is, number of round keys minus one) + */ +void mbedtls_aesni_inverse_key(unsigned char *invkey, + const unsigned char *fwdkey, + int nr); + +/** + * \brief Internal key expansion for encryption + * + * \note This function is only for internal use by other library + * functions; you must not call it directly. + * + * \param rk Destination buffer where the round keys are written + * \param key Encryption key + * \param bits Key size in bits (must be 128, 192 or 256) + * + * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH + */ +int mbedtls_aesni_setkey_enc(unsigned char *rk, + const unsigned char *key, + size_t bits); + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_AESNI_HAVE_CODE */ +#endif /* MBEDTLS_AESNI_C && (MBEDTLS_HAVE_X86_64 || MBEDTLS_HAVE_X86) */ + +#endif /* MBEDTLS_AESNI_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/arc4.h b/ext/opcua_client/mbedtls/include/mbedtls/arc4.h new file mode 100644 index 0000000..1f813aa --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/arc4.h @@ -0,0 +1,132 @@ +/** + * \file arc4.h + * + * \brief The ARCFOUR stream cipher + * + * \warning ARC4 is considered a weak cipher and its use constitutes a + * security risk. We recommend considering stronger ciphers instead. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + * + */ +#ifndef MBEDTLS_ARC4_H +#define MBEDTLS_ARC4_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include + +/* MBEDTLS_ERR_ARC4_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** ARC4 hardware accelerator failed. */ +#define MBEDTLS_ERR_ARC4_HW_ACCEL_FAILED -0x0019 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_ARC4_ALT) +// Regular implementation +// + +/** + * \brief ARC4 context structure + * + * \warning ARC4 is considered a weak cipher and its use constitutes a + * security risk. We recommend considering stronger ciphers instead. + * + */ +typedef struct mbedtls_arc4_context { + int x; /*!< permutation index */ + int y; /*!< permutation index */ + unsigned char m[256]; /*!< permutation table */ +} +mbedtls_arc4_context; + +#else /* MBEDTLS_ARC4_ALT */ +#include "arc4_alt.h" +#endif /* MBEDTLS_ARC4_ALT */ + +/** + * \brief Initialize ARC4 context + * + * \param ctx ARC4 context to be initialized + * + * \warning ARC4 is considered a weak cipher and its use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + * + */ +void mbedtls_arc4_init(mbedtls_arc4_context *ctx); + +/** + * \brief Clear ARC4 context + * + * \param ctx ARC4 context to be cleared + * + * \warning ARC4 is considered a weak cipher and its use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + * + */ +void mbedtls_arc4_free(mbedtls_arc4_context *ctx); + +/** + * \brief ARC4 key schedule + * + * \param ctx ARC4 context to be setup + * \param key the secret key + * \param keylen length of the key, in bytes + * + * \warning ARC4 is considered a weak cipher and its use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + * + */ +void mbedtls_arc4_setup(mbedtls_arc4_context *ctx, const unsigned char *key, + unsigned int keylen); + +/** + * \brief ARC4 cipher function + * + * \param ctx ARC4 context + * \param length length of the input data + * \param input buffer holding the input data + * \param output buffer for the output data + * + * \return 0 if successful + * + * \warning ARC4 is considered a weak cipher and its use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + * + */ +int mbedtls_arc4_crypt(mbedtls_arc4_context *ctx, size_t length, const unsigned char *input, + unsigned char *output); + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + * + * \warning ARC4 is considered a weak cipher and its use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + * + */ +int mbedtls_arc4_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* arc4.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/aria.h b/ext/opcua_client/mbedtls/include/mbedtls/aria.h new file mode 100644 index 0000000..e360aa6 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/aria.h @@ -0,0 +1,356 @@ +/** + * \file aria.h + * + * \brief ARIA block cipher + * + * The ARIA algorithm is a symmetric block cipher that can encrypt and + * decrypt information. It is defined by the Korean Agency for + * Technology and Standards (KATS) in KS X 1213:2004 (in + * Korean, but see http://210.104.33.10/ARIA/index-e.html in English) + * and also described by the IETF in RFC 5794. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_ARIA_H +#define MBEDTLS_ARIA_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +#include "mbedtls/platform_util.h" + +#define MBEDTLS_ARIA_ENCRYPT 1 /**< ARIA encryption. */ +#define MBEDTLS_ARIA_DECRYPT 0 /**< ARIA decryption. */ + +#define MBEDTLS_ARIA_BLOCKSIZE 16 /**< ARIA block size in bytes. */ +#define MBEDTLS_ARIA_MAX_ROUNDS 16 /**< Maximum number of rounds in ARIA. */ +#define MBEDTLS_ARIA_MAX_KEYSIZE 32 /**< Maximum size of an ARIA key in bytes. */ + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#define MBEDTLS_ERR_ARIA_INVALID_KEY_LENGTH MBEDTLS_DEPRECATED_NUMERIC_CONSTANT(-0x005C) +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ +/** Bad input data. */ +#define MBEDTLS_ERR_ARIA_BAD_INPUT_DATA -0x005C + +/** Invalid data input length. */ +#define MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH -0x005E + +/* MBEDTLS_ERR_ARIA_FEATURE_UNAVAILABLE is deprecated and should not be used. + */ +/** Feature not available. For example, an unsupported ARIA key size. */ +#define MBEDTLS_ERR_ARIA_FEATURE_UNAVAILABLE -0x005A + +/* MBEDTLS_ERR_ARIA_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** ARIA hardware accelerator failed. */ +#define MBEDTLS_ERR_ARIA_HW_ACCEL_FAILED -0x0058 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_ARIA_ALT) +// Regular implementation +// + +/** + * \brief The ARIA context-type definition. + */ +typedef struct mbedtls_aria_context { + unsigned char nr; /*!< The number of rounds (12, 14 or 16) */ + /*! The ARIA round keys. */ + uint32_t rk[MBEDTLS_ARIA_MAX_ROUNDS + 1][MBEDTLS_ARIA_BLOCKSIZE / 4]; +} +mbedtls_aria_context; + +#else /* MBEDTLS_ARIA_ALT */ +#include "aria_alt.h" +#endif /* MBEDTLS_ARIA_ALT */ + +/** + * \brief This function initializes the specified ARIA context. + * + * It must be the first API called before using + * the context. + * + * \param ctx The ARIA context to initialize. This must not be \c NULL. + */ +void mbedtls_aria_init(mbedtls_aria_context *ctx); + +/** + * \brief This function releases and clears the specified ARIA context. + * + * \param ctx The ARIA context to clear. This may be \c NULL, in which + * case this function returns immediately. If it is not \c NULL, + * it must point to an initialized ARIA context. + */ +void mbedtls_aria_free(mbedtls_aria_context *ctx); + +/** + * \brief This function sets the encryption key. + * + * \param ctx The ARIA context to which the key should be bound. + * This must be initialized. + * \param key The encryption key. This must be a readable buffer + * of size \p keybits Bits. + * \param keybits The size of \p key in Bits. Valid options are: + *
  • 128 bits
  • + *
  • 192 bits
  • + *
  • 256 bits
+ * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_aria_setkey_enc(mbedtls_aria_context *ctx, + const unsigned char *key, + unsigned int keybits); + +/** + * \brief This function sets the decryption key. + * + * \param ctx The ARIA context to which the key should be bound. + * This must be initialized. + * \param key The decryption key. This must be a readable buffer + * of size \p keybits Bits. + * \param keybits The size of data passed. Valid options are: + *
  • 128 bits
  • + *
  • 192 bits
  • + *
  • 256 bits
+ * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_aria_setkey_dec(mbedtls_aria_context *ctx, + const unsigned char *key, + unsigned int keybits); + +/** + * \brief This function performs an ARIA single-block encryption or + * decryption operation. + * + * It performs encryption or decryption (depending on whether + * the key was set for encryption on decryption) on the input + * data buffer defined in the \p input parameter. + * + * mbedtls_aria_init(), and either mbedtls_aria_setkey_enc() or + * mbedtls_aria_setkey_dec() must be called before the first + * call to this API with the same context. + * + * \param ctx The ARIA context to use for encryption or decryption. + * This must be initialized and bound to a key. + * \param input The 16-Byte buffer holding the input data. + * \param output The 16-Byte buffer holding the output data. + + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_aria_crypt_ecb(mbedtls_aria_context *ctx, + const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE], + unsigned char output[MBEDTLS_ARIA_BLOCKSIZE]); + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/** + * \brief This function performs an ARIA-CBC encryption or decryption operation + * on full blocks. + * + * It performs the operation defined in the \p mode + * parameter (encrypt/decrypt), on the input data buffer defined in + * the \p input parameter. + * + * It can be called as many times as needed, until all the input + * data is processed. mbedtls_aria_init(), and either + * mbedtls_aria_setkey_enc() or mbedtls_aria_setkey_dec() must be called + * before the first call to this API with the same context. + * + * \note This function operates on aligned blocks, that is, the input size + * must be a multiple of the ARIA block size of 16 Bytes. + * + * \note Upon exit, the content of the IV is updated so that you can + * call the same function again on the next + * block(s) of data and get the same result as if it was + * encrypted in one call. This allows a "streaming" usage. + * If you need to retain the contents of the IV, you should + * either save it manually or use the cipher module instead. + * + * + * \param ctx The ARIA context to use for encryption or decryption. + * This must be initialized and bound to a key. + * \param mode The mode of operation. This must be either + * #MBEDTLS_ARIA_ENCRYPT for encryption, or + * #MBEDTLS_ARIA_DECRYPT for decryption. + * \param length The length of the input data in Bytes. This must be a + * multiple of the block size (16 Bytes). + * \param iv Initialization vector (updated after use). + * This must be a readable buffer of size 16 Bytes. + * \param input The buffer holding the input data. This must + * be a readable buffer of length \p length Bytes. + * \param output The buffer holding the output data. This must + * be a writable buffer of length \p length Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_aria_crypt_cbc(mbedtls_aria_context *ctx, + int mode, + size_t length, + unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +/** + * \brief This function performs an ARIA-CFB128 encryption or decryption + * operation. + * + * It performs the operation defined in the \p mode + * parameter (encrypt or decrypt), on the input data buffer + * defined in the \p input parameter. + * + * For CFB, you must set up the context with mbedtls_aria_setkey_enc(), + * regardless of whether you are performing an encryption or decryption + * operation, that is, regardless of the \p mode parameter. This is + * because CFB mode uses the same key schedule for encryption and + * decryption. + * + * \note Upon exit, the content of the IV is updated so that you can + * call the same function again on the next + * block(s) of data and get the same result as if it was + * encrypted in one call. This allows a "streaming" usage. + * If you need to retain the contents of the + * IV, you must either save it manually or use the cipher + * module instead. + * + * + * \param ctx The ARIA context to use for encryption or decryption. + * This must be initialized and bound to a key. + * \param mode The mode of operation. This must be either + * #MBEDTLS_ARIA_ENCRYPT for encryption, or + * #MBEDTLS_ARIA_DECRYPT for decryption. + * \param length The length of the input data \p input in Bytes. + * \param iv_off The offset in IV (updated after use). + * This must not be larger than 15. + * \param iv The initialization vector (updated after use). + * This must be a readable buffer of size 16 Bytes. + * \param input The buffer holding the input data. This must + * be a readable buffer of length \p length Bytes. + * \param output The buffer holding the output data. This must + * be a writable buffer of length \p length Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_aria_crypt_cfb128(mbedtls_aria_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +/** + * \brief This function performs an ARIA-CTR encryption or decryption + * operation. + * + * Due to the nature of CTR, you must use the same key schedule + * for both encryption and decryption operations. Therefore, you + * must use the context initialized with mbedtls_aria_setkey_enc() + * for both #MBEDTLS_ARIA_ENCRYPT and #MBEDTLS_ARIA_DECRYPT. + * + * \warning You must never reuse a nonce value with the same key. Doing so + * would void the encryption for the two messages encrypted with + * the same nonce and key. + * + * There are two common strategies for managing nonces with CTR: + * + * 1. You can handle everything as a single message processed over + * successive calls to this function. In that case, you want to + * set \p nonce_counter and \p nc_off to 0 for the first call, and + * then preserve the values of \p nonce_counter, \p nc_off and \p + * stream_block across calls to this function as they will be + * updated by this function. + * + * With this strategy, you must not encrypt more than 2**128 + * blocks of data with the same key. + * + * 2. You can encrypt separate messages by dividing the \p + * nonce_counter buffer in two areas: the first one used for a + * per-message nonce, handled by yourself, and the second one + * updated by this function internally. + * + * For example, you might reserve the first 12 bytes for the + * per-message nonce, and the last 4 bytes for internal use. In that + * case, before calling this function on a new message you need to + * set the first 12 bytes of \p nonce_counter to your chosen nonce + * value, the last 4 to 0, and \p nc_off to 0 (which will cause \p + * stream_block to be ignored). That way, you can encrypt at most + * 2**96 messages of up to 2**32 blocks each with the same key. + * + * The per-message nonce (or information sufficient to reconstruct + * it) needs to be communicated with the ciphertext and must be unique. + * The recommended way to ensure uniqueness is to use a message + * counter. An alternative is to generate random nonces, but this + * limits the number of messages that can be securely encrypted: + * for example, with 96-bit random nonces, you should not encrypt + * more than 2**32 messages with the same key. + * + * Note that for both strategies, sizes are measured in blocks and + * that an ARIA block is 16 bytes. + * + * \warning Upon return, \p stream_block contains sensitive data. Its + * content must not be written to insecure storage and should be + * securely discarded as soon as it's no longer needed. + * + * \param ctx The ARIA context to use for encryption or decryption. + * This must be initialized and bound to a key. + * \param length The length of the input data \p input in Bytes. + * \param nc_off The offset in Bytes in the current \p stream_block, + * for resuming within the current cipher stream. The + * offset pointer should be \c 0 at the start of a + * stream. This must not be larger than \c 15 Bytes. + * \param nonce_counter The 128-bit nonce and counter. This must point to + * a read/write buffer of length \c 16 bytes. + * \param stream_block The saved stream block for resuming. This must + * point to a read/write buffer of length \c 16 bytes. + * This is overwritten by the function. + * \param input The buffer holding the input data. This must + * be a readable buffer of length \p length Bytes. + * \param output The buffer holding the output data. This must + * be a writable buffer of length \p length Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_aria_crypt_ctr(mbedtls_aria_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE], + unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +#if defined(MBEDTLS_SELF_TEST) +/** + * \brief Checkup routine. + * + * \return \c 0 on success, or \c 1 on failure. + */ +int mbedtls_aria_self_test(int verbose); +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* aria.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/asn1.h b/ext/opcua_client/mbedtls/include/mbedtls/asn1.h new file mode 100644 index 0000000..c676fd3 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/asn1.h @@ -0,0 +1,600 @@ +/** + * \file asn1.h + * + * \brief Generic ASN.1 parsing + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_ASN1_H +#define MBEDTLS_ASN1_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include + +#if defined(MBEDTLS_BIGNUM_C) +#include "mbedtls/bignum.h" +#endif + +/** + * \addtogroup asn1_module + * \{ + */ + +/** + * \name ASN1 Error codes + * These error codes are OR'ed to X509 error codes for + * higher error granularity. + * ASN1 is a standard to specify data structures. + * \{ + */ +/** Out of data when parsing an ASN1 data structure. */ +#define MBEDTLS_ERR_ASN1_OUT_OF_DATA -0x0060 +/** ASN1 tag was of an unexpected value. */ +#define MBEDTLS_ERR_ASN1_UNEXPECTED_TAG -0x0062 +/** Error when trying to determine the length or invalid length. */ +#define MBEDTLS_ERR_ASN1_INVALID_LENGTH -0x0064 +/** Actual length differs from expected length. */ +#define MBEDTLS_ERR_ASN1_LENGTH_MISMATCH -0x0066 +/** Data is invalid. */ +#define MBEDTLS_ERR_ASN1_INVALID_DATA -0x0068 +/** Memory allocation failed */ +#define MBEDTLS_ERR_ASN1_ALLOC_FAILED -0x006A +/** Buffer too small when writing ASN.1 data structure. */ +#define MBEDTLS_ERR_ASN1_BUF_TOO_SMALL -0x006C + +/** \} name ASN1 Error codes */ + +/** + * \name DER constants + * These constants comply with the DER encoded ASN.1 type tags. + * DER encoding uses hexadecimal representation. + * An example DER sequence is:\n + * - 0x02 -- tag indicating INTEGER + * - 0x01 -- length in octets + * - 0x05 -- value + * Such sequences are typically read into \c ::mbedtls_x509_buf. + * \{ + */ +#define MBEDTLS_ASN1_BOOLEAN 0x01 +#define MBEDTLS_ASN1_INTEGER 0x02 +#define MBEDTLS_ASN1_BIT_STRING 0x03 +#define MBEDTLS_ASN1_OCTET_STRING 0x04 +#define MBEDTLS_ASN1_NULL 0x05 +#define MBEDTLS_ASN1_OID 0x06 +#define MBEDTLS_ASN1_ENUMERATED 0x0A +#define MBEDTLS_ASN1_UTF8_STRING 0x0C +#define MBEDTLS_ASN1_SEQUENCE 0x10 +#define MBEDTLS_ASN1_SET 0x11 +#define MBEDTLS_ASN1_PRINTABLE_STRING 0x13 +#define MBEDTLS_ASN1_T61_STRING 0x14 +#define MBEDTLS_ASN1_IA5_STRING 0x16 +#define MBEDTLS_ASN1_UTC_TIME 0x17 +#define MBEDTLS_ASN1_GENERALIZED_TIME 0x18 +#define MBEDTLS_ASN1_UNIVERSAL_STRING 0x1C +#define MBEDTLS_ASN1_BMP_STRING 0x1E +#define MBEDTLS_ASN1_PRIMITIVE 0x00 +#define MBEDTLS_ASN1_CONSTRUCTED 0x20 +#define MBEDTLS_ASN1_CONTEXT_SPECIFIC 0x80 + +/* Slightly smaller way to check if tag is a string tag + * compared to canonical implementation. */ +#define MBEDTLS_ASN1_IS_STRING_TAG(tag) \ + ((tag) < 32u && ( \ + ((1u << (tag)) & ((1u << MBEDTLS_ASN1_BMP_STRING) | \ + (1u << MBEDTLS_ASN1_UTF8_STRING) | \ + (1u << MBEDTLS_ASN1_T61_STRING) | \ + (1u << MBEDTLS_ASN1_IA5_STRING) | \ + (1u << MBEDTLS_ASN1_UNIVERSAL_STRING) | \ + (1u << MBEDTLS_ASN1_PRINTABLE_STRING) | \ + (1u << MBEDTLS_ASN1_BIT_STRING))) != 0)) + +/* + * Bit masks for each of the components of an ASN.1 tag as specified in + * ITU X.690 (08/2015), section 8.1 "General rules for encoding", + * paragraph 8.1.2.2: + * + * Bit 8 7 6 5 1 + * +-------+-----+------------+ + * | Class | P/C | Tag number | + * +-------+-----+------------+ + */ +#define MBEDTLS_ASN1_TAG_CLASS_MASK 0xC0 +#define MBEDTLS_ASN1_TAG_PC_MASK 0x20 +#define MBEDTLS_ASN1_TAG_VALUE_MASK 0x1F + +/** \} name DER constants */ + +/** Returns the size of the binary string, without the trailing \\0 */ +#define MBEDTLS_OID_SIZE(x) (sizeof(x) - 1) + +/** + * Compares an mbedtls_asn1_buf structure to a reference OID. + * + * Only works for 'defined' oid_str values (MBEDTLS_OID_HMAC_SHA1), you cannot use a + * 'unsigned char *oid' here! + */ +#define MBEDTLS_OID_CMP(oid_str, oid_buf) \ + ((MBEDTLS_OID_SIZE(oid_str) != (oid_buf)->len) || \ + memcmp((oid_str), (oid_buf)->p, (oid_buf)->len) != 0) + +#define MBEDTLS_OID_CMP_RAW(oid_str, oid_buf, oid_buf_len) \ + ((MBEDTLS_OID_SIZE(oid_str) != (oid_buf_len)) || \ + memcmp((oid_str), (oid_buf), (oid_buf_len)) != 0) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name Functions to parse ASN.1 data structures + * \{ + */ + +/** + * Type-length-value structure that allows for ASN1 using DER. + */ +typedef struct mbedtls_asn1_buf { + int tag; /**< ASN1 type, e.g. MBEDTLS_ASN1_UTF8_STRING. */ + size_t len; /**< ASN1 length, in octets. */ + unsigned char *p; /**< ASN1 data, e.g. in ASCII. */ +} +mbedtls_asn1_buf; + +/** + * Container for ASN1 bit strings. + */ +typedef struct mbedtls_asn1_bitstring { + size_t len; /**< ASN1 length, in octets. */ + unsigned char unused_bits; /**< Number of unused bits at the end of the string */ + unsigned char *p; /**< Raw ASN1 data for the bit string */ +} +mbedtls_asn1_bitstring; + +/** + * Container for a sequence of ASN.1 items + */ +typedef struct mbedtls_asn1_sequence { + mbedtls_asn1_buf buf; /**< Buffer containing the given ASN.1 item. */ + struct mbedtls_asn1_sequence *next; /**< The next entry in the sequence. */ +} +mbedtls_asn1_sequence; + +/** + * Container for a sequence or list of 'named' ASN.1 data items + */ +typedef struct mbedtls_asn1_named_data { + mbedtls_asn1_buf oid; /**< The object identifier. */ + mbedtls_asn1_buf val; /**< The named value. */ + struct mbedtls_asn1_named_data *next; /**< The next entry in the sequence. */ + unsigned char next_merged; /**< Merge next item into the current one? */ +} +mbedtls_asn1_named_data; + +/** + * \brief Get the length of an ASN.1 element. + * Updates the pointer to immediately behind the length. + * + * \param p On entry, \c *p points to the first byte of the length, + * i.e. immediately after the tag. + * On successful completion, \c *p points to the first byte + * after the length, i.e. the first byte of the content. + * On error, the value of \c *p is undefined. + * \param end End of data. + * \param len On successful completion, \c *len contains the length + * read from the ASN.1 input. + * + * \return 0 if successful. + * \return #MBEDTLS_ERR_ASN1_OUT_OF_DATA if the ASN.1 element + * would end beyond \p end. + * \return #MBEDTLS_ERR_ASN1_INVALID_LENGTH if the length is unparsable. + */ +int mbedtls_asn1_get_len(unsigned char **p, + const unsigned char *end, + size_t *len); + +/** + * \brief Get the tag and length of the element. + * Check for the requested tag. + * Updates the pointer to immediately behind the tag and length. + * + * \param p On entry, \c *p points to the start of the ASN.1 element. + * On successful completion, \c *p points to the first byte + * after the length, i.e. the first byte of the content. + * On error, the value of \c *p is undefined. + * \param end End of data. + * \param len On successful completion, \c *len contains the length + * read from the ASN.1 input. + * \param tag The expected tag. + * + * \return 0 if successful. + * \return #MBEDTLS_ERR_ASN1_UNEXPECTED_TAG if the data does not start + * with the requested tag. + * \return #MBEDTLS_ERR_ASN1_OUT_OF_DATA if the ASN.1 element + * would end beyond \p end. + * \return #MBEDTLS_ERR_ASN1_INVALID_LENGTH if the length is unparsable. + */ +int mbedtls_asn1_get_tag(unsigned char **p, + const unsigned char *end, + size_t *len, int tag); + +/** + * \brief Retrieve a boolean ASN.1 tag and its value. + * Updates the pointer to immediately behind the full tag. + * + * \param p On entry, \c *p points to the start of the ASN.1 element. + * On successful completion, \c *p points to the first byte + * beyond the ASN.1 element. + * On error, the value of \c *p is undefined. + * \param end End of data. + * \param val On success, the parsed value (\c 0 or \c 1). + * + * \return 0 if successful. + * \return An ASN.1 error code if the input does not start with + * a valid ASN.1 BOOLEAN. + */ +int mbedtls_asn1_get_bool(unsigned char **p, + const unsigned char *end, + int *val); + +/** + * \brief Retrieve an integer ASN.1 tag and its value. + * Updates the pointer to immediately behind the full tag. + * + * \param p On entry, \c *p points to the start of the ASN.1 element. + * On successful completion, \c *p points to the first byte + * beyond the ASN.1 element. + * On error, the value of \c *p is undefined. + * \param end End of data. + * \param val On success, the parsed value. + * + * \return 0 if successful. + * \return An ASN.1 error code if the input does not start with + * a valid ASN.1 INTEGER. + * \return #MBEDTLS_ERR_ASN1_INVALID_LENGTH if the parsed value does + * not fit in an \c int. + */ +int mbedtls_asn1_get_int(unsigned char **p, + const unsigned char *end, + int *val); + +/** + * \brief Retrieve an enumerated ASN.1 tag and its value. + * Updates the pointer to immediately behind the full tag. + * + * \param p On entry, \c *p points to the start of the ASN.1 element. + * On successful completion, \c *p points to the first byte + * beyond the ASN.1 element. + * On error, the value of \c *p is undefined. + * \param end End of data. + * \param val On success, the parsed value. + * + * \return 0 if successful. + * \return An ASN.1 error code if the input does not start with + * a valid ASN.1 ENUMERATED. + * \return #MBEDTLS_ERR_ASN1_INVALID_LENGTH if the parsed value does + * not fit in an \c int. + */ +int mbedtls_asn1_get_enum(unsigned char **p, + const unsigned char *end, + int *val); + +/** + * \brief Retrieve a bitstring ASN.1 tag and its value. + * Updates the pointer to immediately behind the full tag. + * + * \param p On entry, \c *p points to the start of the ASN.1 element. + * On successful completion, \c *p is equal to \p end. + * On error, the value of \c *p is undefined. + * \param end End of data. + * \param bs On success, ::mbedtls_asn1_bitstring information about + * the parsed value. + * + * \return 0 if successful. + * \return #MBEDTLS_ERR_ASN1_LENGTH_MISMATCH if the input contains + * extra data after a valid BIT STRING. + * \return An ASN.1 error code if the input does not start with + * a valid ASN.1 BIT STRING. + */ +int mbedtls_asn1_get_bitstring(unsigned char **p, const unsigned char *end, + mbedtls_asn1_bitstring *bs); + +/** + * \brief Retrieve a bitstring ASN.1 tag without unused bits and its + * value. + * Updates the pointer to the beginning of the bit/octet string. + * + * \param p On entry, \c *p points to the start of the ASN.1 element. + * On successful completion, \c *p points to the first byte + * of the content of the BIT STRING. + * On error, the value of \c *p is undefined. + * \param end End of data. + * \param len On success, \c *len is the length of the content in bytes. + * + * \return 0 if successful. + * \return #MBEDTLS_ERR_ASN1_INVALID_DATA if the input starts with + * a valid BIT STRING with a nonzero number of unused bits. + * \return An ASN.1 error code if the input does not start with + * a valid ASN.1 BIT STRING. + */ +int mbedtls_asn1_get_bitstring_null(unsigned char **p, + const unsigned char *end, + size_t *len); + +/** + * \brief Parses and splits an ASN.1 "SEQUENCE OF ". + * Updates the pointer to immediately behind the full sequence tag. + * + * This function allocates memory for the sequence elements. You can free + * the allocated memory with mbedtls_asn1_sequence_free(). + * + * \note On error, this function may return a partial list in \p cur. + * You must set `cur->next = NULL` before calling this function! + * Otherwise it is impossible to distinguish a previously non-null + * pointer from a pointer to an object allocated by this function. + * + * \note If the sequence is empty, this function does not modify + * \c *cur. If the sequence is valid and non-empty, this + * function sets `cur->buf.tag` to \p tag. This allows + * callers to distinguish between an empty sequence and + * a one-element sequence. + * + * \param p On entry, \c *p points to the start of the ASN.1 element. + * On successful completion, \c *p is equal to \p end. + * On error, the value of \c *p is undefined. + * \param end End of data. + * \param cur A ::mbedtls_asn1_sequence which this function fills. + * When this function returns, \c *cur is the head of a linked + * list. Each node in this list is allocated with + * mbedtls_calloc() apart from \p cur itself, and should + * therefore be freed with mbedtls_free(). + * The list describes the content of the sequence. + * The head of the list (i.e. \c *cur itself) describes the + * first element, `*cur->next` describes the second element, etc. + * For each element, `buf.tag == tag`, `buf.len` is the length + * of the content of the content of the element, and `buf.p` + * points to the first byte of the content (i.e. immediately + * past the length of the element). + * Note that list elements may be allocated even on error. + * \param tag Each element of the sequence must have this tag. + * + * \return 0 if successful. + * \return #MBEDTLS_ERR_ASN1_LENGTH_MISMATCH if the input contains + * extra data after a valid SEQUENCE OF \p tag. + * \return #MBEDTLS_ERR_ASN1_UNEXPECTED_TAG if the input starts with + * an ASN.1 SEQUENCE in which an element has a tag that + * is different from \p tag. + * \return #MBEDTLS_ERR_ASN1_ALLOC_FAILED if a memory allocation failed. + * \return An ASN.1 error code if the input does not start with + * a valid ASN.1 SEQUENCE. + */ +int mbedtls_asn1_get_sequence_of(unsigned char **p, + const unsigned char *end, + mbedtls_asn1_sequence *cur, + int tag); +/** + * \brief Free a heap-allocated linked list presentation of + * an ASN.1 sequence, including the first element. + * + * There are two common ways to manage the memory used for the representation + * of a parsed ASN.1 sequence: + * - Allocate a head node `mbedtls_asn1_sequence *head` with mbedtls_calloc(). + * Pass this node as the `cur` argument to mbedtls_asn1_get_sequence_of(). + * When you have finished processing the sequence, + * call mbedtls_asn1_sequence_free() on `head`. + * - Allocate a head node `mbedtls_asn1_sequence *head` in any manner, + * for example on the stack. Make sure that `head->next == NULL`. + * Pass `head` as the `cur` argument to mbedtls_asn1_get_sequence_of(). + * When you have finished processing the sequence, + * call mbedtls_asn1_sequence_free() on `head->cur`, + * then free `head` itself in the appropriate manner. + * + * \param seq The address of the first sequence component. This may + * be \c NULL, in which case this functions returns + * immediately. + */ +void mbedtls_asn1_sequence_free(mbedtls_asn1_sequence *seq); + +/** + * \brief Traverse an ASN.1 SEQUENCE container and + * call a callback for each entry. + * + * This function checks that the input is a SEQUENCE of elements that + * each have a "must" tag, and calls a callback function on the elements + * that have a "may" tag. + * + * For example, to validate that the input is a SEQUENCE of `tag1` and call + * `cb` on each element, use + * ``` + * mbedtls_asn1_traverse_sequence_of(&p, end, 0xff, tag1, 0, 0, cb, ctx); + * ``` + * + * To validate that the input is a SEQUENCE of ANY and call `cb` on + * each element, use + * ``` + * mbedtls_asn1_traverse_sequence_of(&p, end, 0, 0, 0, 0, cb, ctx); + * ``` + * + * To validate that the input is a SEQUENCE of CHOICE {NULL, OCTET STRING} + * and call `cb` on each element that is an OCTET STRING, use + * ``` + * mbedtls_asn1_traverse_sequence_of(&p, end, 0xfe, 0x04, 0xff, 0x04, cb, ctx); + * ``` + * + * The callback is called on the elements with a "may" tag from left to + * right. If the input is not a valid SEQUENCE of elements with a "must" tag, + * the callback is called on the elements up to the leftmost point where + * the input is invalid. + * + * \warning This function is still experimental and may change + * at any time. + * + * \param p The address of the pointer to the beginning of + * the ASN.1 SEQUENCE header. This is updated to + * point to the end of the ASN.1 SEQUENCE container + * on a successful invocation. + * \param end The end of the ASN.1 SEQUENCE container. + * \param tag_must_mask A mask to be applied to the ASN.1 tags found within + * the SEQUENCE before comparing to \p tag_must_val. + * \param tag_must_val The required value of each ASN.1 tag found in the + * SEQUENCE, after masking with \p tag_must_mask. + * Mismatching tags lead to an error. + * For example, a value of \c 0 for both \p tag_must_mask + * and \p tag_must_val means that every tag is allowed, + * while a value of \c 0xFF for \p tag_must_mask means + * that \p tag_must_val is the only allowed tag. + * \param tag_may_mask A mask to be applied to the ASN.1 tags found within + * the SEQUENCE before comparing to \p tag_may_val. + * \param tag_may_val The desired value of each ASN.1 tag found in the + * SEQUENCE, after masking with \p tag_may_mask. + * Mismatching tags will be silently ignored. + * For example, a value of \c 0 for \p tag_may_mask and + * \p tag_may_val means that any tag will be considered, + * while a value of \c 0xFF for \p tag_may_mask means + * that all tags with value different from \p tag_may_val + * will be ignored. + * \param cb The callback to trigger for each component + * in the ASN.1 SEQUENCE that matches \p tag_may_val. + * The callback function is called with the following + * parameters: + * - \p ctx. + * - The tag of the current element. + * - A pointer to the start of the current element's + * content inside the input. + * - The length of the content of the current element. + * If the callback returns a non-zero value, + * the function stops immediately, + * forwarding the callback's return value. + * \param ctx The context to be passed to the callback \p cb. + * + * \return \c 0 if successful the entire ASN.1 SEQUENCE + * was traversed without parsing or callback errors. + * \return #MBEDTLS_ERR_ASN1_LENGTH_MISMATCH if the input + * contains extra data after a valid SEQUENCE + * of elements with an accepted tag. + * \return #MBEDTLS_ERR_ASN1_UNEXPECTED_TAG if the input starts + * with an ASN.1 SEQUENCE in which an element has a tag + * that is not accepted. + * \return An ASN.1 error code if the input does not start with + * a valid ASN.1 SEQUENCE. + * \return A non-zero error code forwarded from the callback + * \p cb in case the latter returns a non-zero value. + */ +int mbedtls_asn1_traverse_sequence_of( + unsigned char **p, + const unsigned char *end, + unsigned char tag_must_mask, unsigned char tag_must_val, + unsigned char tag_may_mask, unsigned char tag_may_val, + int (*cb)(void *ctx, int tag, + unsigned char *start, size_t len), + void *ctx); + +#if defined(MBEDTLS_BIGNUM_C) +/** + * \brief Retrieve an integer ASN.1 tag and its value. + * Updates the pointer to immediately behind the full tag. + * + * \param p On entry, \c *p points to the start of the ASN.1 element. + * On successful completion, \c *p points to the first byte + * beyond the ASN.1 element. + * On error, the value of \c *p is undefined. + * \param end End of data. + * \param X On success, the parsed value. + * + * \return 0 if successful. + * \return An ASN.1 error code if the input does not start with + * a valid ASN.1 INTEGER. + * \return #MBEDTLS_ERR_ASN1_INVALID_LENGTH if the parsed value does + * not fit in an \c int. + * \return An MPI error code if the parsed value is too large. + */ +int mbedtls_asn1_get_mpi(unsigned char **p, + const unsigned char *end, + mbedtls_mpi *X); +#endif /* MBEDTLS_BIGNUM_C */ + +/** + * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence. + * Updates the pointer to immediately behind the full + * AlgorithmIdentifier. + * + * \param p On entry, \c *p points to the start of the ASN.1 element. + * On successful completion, \c *p points to the first byte + * beyond the AlgorithmIdentifier element. + * On error, the value of \c *p is undefined. + * \param end End of data. + * \param alg The buffer to receive the OID. + * \param params The buffer to receive the parameters. + * This is zeroized if there are no parameters. + * + * \return 0 if successful or a specific ASN.1 or MPI error code. + */ +int mbedtls_asn1_get_alg(unsigned char **p, + const unsigned char *end, + mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params); + +/** + * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence with NULL or no + * params. + * Updates the pointer to immediately behind the full + * AlgorithmIdentifier. + * + * \param p On entry, \c *p points to the start of the ASN.1 element. + * On successful completion, \c *p points to the first byte + * beyond the AlgorithmIdentifier element. + * On error, the value of \c *p is undefined. + * \param end End of data. + * \param alg The buffer to receive the OID. + * + * \return 0 if successful or a specific ASN.1 or MPI error code. + */ +int mbedtls_asn1_get_alg_null(unsigned char **p, + const unsigned char *end, + mbedtls_asn1_buf *alg); + +/** + * \brief Find a specific named_data entry in a sequence or list based on + * the OID. + * + * \param list The list to seek through + * \param oid The OID to look for + * \param len Size of the OID + * + * \return NULL if not found, or a pointer to the existing entry. + */ +mbedtls_asn1_named_data *mbedtls_asn1_find_named_data(mbedtls_asn1_named_data *list, + const char *oid, size_t len); + +/** + * \brief Free a mbedtls_asn1_named_data entry + * + * \param entry The named data entry to free. + * This function calls mbedtls_free() on + * `entry->oid.p` and `entry->val.p`. + */ +void mbedtls_asn1_free_named_data(mbedtls_asn1_named_data *entry); + +/** + * \brief Free all entries in a mbedtls_asn1_named_data list. + * + * \param head Pointer to the head of the list of named data entries to free. + * This function calls mbedtls_asn1_free_named_data() and + * mbedtls_free() on each list element and + * sets \c *head to \c NULL. + */ +void mbedtls_asn1_free_named_data_list(mbedtls_asn1_named_data **head); + +/** \} name Functions to parse ASN.1 data structures */ +/** \} addtogroup asn1_module */ + +#ifdef __cplusplus +} +#endif + +#endif /* asn1.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/asn1write.h b/ext/opcua_client/mbedtls/include/mbedtls/asn1write.h new file mode 100644 index 0000000..a12bf03 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/asn1write.h @@ -0,0 +1,379 @@ +/** + * \file asn1write.h + * + * \brief ASN.1 buffer writing functionality + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_ASN1_WRITE_H +#define MBEDTLS_ASN1_WRITE_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/asn1.h" + +#define MBEDTLS_ASN1_CHK_ADD(g, f) \ + do \ + { \ + if ((ret = (f)) < 0) \ + return ret; \ + else \ + (g) += ret; \ + } while (0) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Write a length field in ASN.1 format. + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param len The length value to write. + * + * \return The number of bytes written to \p p on success. + * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_asn1_write_len(unsigned char **p, unsigned char *start, + size_t len); +/** + * \brief Write an ASN.1 tag in ASN.1 format. + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param tag The tag to write. + * + * \return The number of bytes written to \p p on success. + * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_asn1_write_tag(unsigned char **p, unsigned char *start, + unsigned char tag); + +/** + * \brief Write raw buffer data. + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param buf The data buffer to write. + * \param size The length of the data buffer. + * + * \return The number of bytes written to \p p on success. + * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_asn1_write_raw_buffer(unsigned char **p, unsigned char *start, + const unsigned char *buf, size_t size); + +#if defined(MBEDTLS_BIGNUM_C) +/** + * \brief Write an arbitrary-precision number (#MBEDTLS_ASN1_INTEGER) + * in ASN.1 format. + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param X The MPI to write. + * It must be non-negative. + * + * \return The number of bytes written to \p p on success. + * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_asn1_write_mpi(unsigned char **p, unsigned char *start, + const mbedtls_mpi *X); +#endif /* MBEDTLS_BIGNUM_C */ + +/** + * \brief Write a NULL tag (#MBEDTLS_ASN1_NULL) with zero data + * in ASN.1 format. + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * + * \return The number of bytes written to \p p on success. + * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_asn1_write_null(unsigned char **p, unsigned char *start); + +/** + * \brief Write an OID tag (#MBEDTLS_ASN1_OID) and data + * in ASN.1 format. + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param oid The OID to write. + * \param oid_len The length of the OID. + * + * \return The number of bytes written to \p p on success. + * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_asn1_write_oid(unsigned char **p, unsigned char *start, + const char *oid, size_t oid_len); + +/** + * \brief Write an AlgorithmIdentifier sequence in ASN.1 format. + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param oid The OID of the algorithm to write. + * \param oid_len The length of the algorithm's OID. + * \param par_len The length of the parameters, which must be already written. + * If 0, NULL parameters are added + * + * \return The number of bytes written to \p p on success. + * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_asn1_write_algorithm_identifier(unsigned char **p, + unsigned char *start, + const char *oid, size_t oid_len, + size_t par_len); + +/** + * \brief Write an AlgorithmIdentifier sequence in ASN.1 format. + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param oid The OID of the algorithm to write. + * \param oid_len The length of the algorithm's OID. + * \param par_len The length of the parameters, which must be already written. + * \param has_par If there are any parameters. If 0, par_len must be 0. If 1 + * and \p par_len is 0, NULL parameters are added. + * + * \return The number of bytes written to \p p on success. + * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_asn1_write_algorithm_identifier_ext(unsigned char **p, + unsigned char *start, + const char *oid, size_t oid_len, + size_t par_len, int has_par); + +/** + * \brief Write a boolean tag (#MBEDTLS_ASN1_BOOLEAN) and value + * in ASN.1 format. + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param boolean The boolean value to write, either \c 0 or \c 1. + * + * \return The number of bytes written to \p p on success. + * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_asn1_write_bool(unsigned char **p, unsigned char *start, + int boolean); + +/** + * \brief Write an int tag (#MBEDTLS_ASN1_INTEGER) and value + * in ASN.1 format. + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param val The integer value to write. + * It must be non-negative. + * + * \return The number of bytes written to \p p on success. + * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_asn1_write_int(unsigned char **p, unsigned char *start, int val); + +/** + * \brief Write an enum tag (#MBEDTLS_ASN1_ENUMERATED) and value + * in ASN.1 format. + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param val The integer value to write. + * + * \return The number of bytes written to \p p on success. + * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_asn1_write_enum(unsigned char **p, unsigned char *start, int val); + +/** + * \brief Write a string in ASN.1 format using a specific + * string encoding tag. + + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param tag The string encoding tag to write, e.g. + * #MBEDTLS_ASN1_UTF8_STRING. + * \param text The string to write. + * \param text_len The length of \p text in bytes (which might + * be strictly larger than the number of characters). + * + * \return The number of bytes written to \p p on success. + * \return A negative error code on failure. + */ +int mbedtls_asn1_write_tagged_string(unsigned char **p, unsigned char *start, + int tag, const char *text, + size_t text_len); + +/** + * \brief Write a string in ASN.1 format using the PrintableString + * string encoding tag (#MBEDTLS_ASN1_PRINTABLE_STRING). + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param text The string to write. + * \param text_len The length of \p text in bytes (which might + * be strictly larger than the number of characters). + * + * \return The number of bytes written to \p p on success. + * \return A negative error code on failure. + */ +int mbedtls_asn1_write_printable_string(unsigned char **p, + unsigned char *start, + const char *text, size_t text_len); + +/** + * \brief Write a UTF8 string in ASN.1 format using the UTF8String + * string encoding tag (#MBEDTLS_ASN1_UTF8_STRING). + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param text The string to write. + * \param text_len The length of \p text in bytes (which might + * be strictly larger than the number of characters). + * + * \return The number of bytes written to \p p on success. + * \return A negative error code on failure. + */ +int mbedtls_asn1_write_utf8_string(unsigned char **p, unsigned char *start, + const char *text, size_t text_len); + +/** + * \brief Write a string in ASN.1 format using the IA5String + * string encoding tag (#MBEDTLS_ASN1_IA5_STRING). + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param text The string to write. + * \param text_len The length of \p text in bytes (which might + * be strictly larger than the number of characters). + * + * \return The number of bytes written to \p p on success. + * \return A negative error code on failure. + */ +int mbedtls_asn1_write_ia5_string(unsigned char **p, unsigned char *start, + const char *text, size_t text_len); + +/** + * \brief Write a bitstring tag (#MBEDTLS_ASN1_BIT_STRING) and + * value in ASN.1 format. + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param buf The bitstring to write. + * \param bits The total number of bits in the bitstring. + * + * \return The number of bytes written to \p p on success. + * \return A negative error code on failure. + */ +int mbedtls_asn1_write_bitstring(unsigned char **p, unsigned char *start, + const unsigned char *buf, size_t bits); + +/** + * \brief This function writes a named bitstring tag + * (#MBEDTLS_ASN1_BIT_STRING) and value in ASN.1 format. + * + * As stated in RFC 5280 Appendix B, trailing zeroes are + * omitted when encoding named bitstrings in DER. + * + * \note This function works backwards within the data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer which is used for bounds-checking. + * \param buf The bitstring to write. + * \param bits The total number of bits in the bitstring. + * + * \return The number of bytes written to \p p on success. + * \return A negative error code on failure. + */ +int mbedtls_asn1_write_named_bitstring(unsigned char **p, + unsigned char *start, + const unsigned char *buf, + size_t bits); + +/** + * \brief Write an octet string tag (#MBEDTLS_ASN1_OCTET_STRING) + * and value in ASN.1 format. + * + * \note This function works backwards in data buffer. + * + * \param p The reference to the current position pointer. + * \param start The start of the buffer, for bounds-checking. + * \param buf The buffer holding the data to write. + * \param size The length of the data buffer \p buf. + * + * \return The number of bytes written to \p p on success. + * \return A negative error code on failure. + */ +int mbedtls_asn1_write_octet_string(unsigned char **p, unsigned char *start, + const unsigned char *buf, size_t size); + +/** + * \brief Create or find a specific named_data entry for writing in a + * sequence or list based on the OID. If not already in there, + * a new entry is added to the head of the list. + * Warning: Destructive behaviour for the val data! + * + * \param list The pointer to the location of the head of the list to seek + * through (will be updated in case of a new entry). + * \param oid The OID to look for. + * \param oid_len The size of the OID. + * \param val The associated data to store. If this is \c NULL, + * no data is copied to the new or existing buffer. + * \param val_len The minimum length of the data buffer needed. + * If this is 0, do not allocate a buffer for the associated + * data. + * If the OID was already present, enlarge, shrink or free + * the existing buffer to fit \p val_len. + * + * \return A pointer to the new / existing entry on success. + * \return \c NULL if if there was a memory allocation error. + */ +mbedtls_asn1_named_data *mbedtls_asn1_store_named_data(mbedtls_asn1_named_data **list, + const char *oid, size_t oid_len, + const unsigned char *val, + size_t val_len); + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_ASN1_WRITE_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/base64.h b/ext/opcua_client/mbedtls/include/mbedtls/base64.h new file mode 100644 index 0000000..cc46047 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/base64.h @@ -0,0 +1,86 @@ +/** + * \file base64.h + * + * \brief RFC 1521 base64 encoding/decoding + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_BASE64_H +#define MBEDTLS_BASE64_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include + +/** Output buffer too small. */ +#define MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL -0x002A +/** Invalid character in input. */ +#define MBEDTLS_ERR_BASE64_INVALID_CHARACTER -0x002C + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encode a buffer into base64 format + * + * \param dst destination buffer + * \param dlen size of the destination buffer + * \param olen number of bytes written + * \param src source buffer + * \param slen amount of data to be encoded + * + * \return 0 if successful, or MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL. + * *olen is always updated to reflect the amount + * of data that has (or would have) been written. + * If that length cannot be represented, then no data is + * written to the buffer and *olen is set to the maximum + * length representable as a size_t. + * + * \note Call this function with dlen = 0 to obtain the + * required buffer size in *olen + */ +int mbedtls_base64_encode(unsigned char *dst, size_t dlen, size_t *olen, + const unsigned char *src, size_t slen); + +/** + * \brief Decode a base64-formatted buffer + * + * \param dst destination buffer (can be NULL for checking size) + * \param dlen size of the destination buffer + * \param olen number of bytes written + * \param src source buffer + * \param slen amount of data to be decoded + * + * \return 0 if successful, MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL, or + * MBEDTLS_ERR_BASE64_INVALID_CHARACTER if the input data is + * not correct. *olen is always updated to reflect the amount + * of data that has (or would have) been written. + * + * \note Call this function with *dst = NULL or dlen = 0 to obtain + * the required buffer size in *olen + */ +int mbedtls_base64_decode(unsigned char *dst, size_t dlen, size_t *olen, + const unsigned char *src, size_t slen); + +#if defined(MBEDTLS_SELF_TEST) +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int mbedtls_base64_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* base64.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/bignum.h b/ext/opcua_client/mbedtls/include/mbedtls/bignum.h new file mode 100644 index 0000000..fb0ca15 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/bignum.h @@ -0,0 +1,1093 @@ +/** + * \file bignum.h + * + * \brief Multi-precision integer library + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_BIGNUM_H +#define MBEDTLS_BIGNUM_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +#if defined(MBEDTLS_FS_IO) +#include +#endif + +/** An error occurred while reading from or writing to a file. */ +#define MBEDTLS_ERR_MPI_FILE_IO_ERROR -0x0002 +/** Bad input parameters to function. */ +#define MBEDTLS_ERR_MPI_BAD_INPUT_DATA -0x0004 +/** There is an invalid character in the digit string. */ +#define MBEDTLS_ERR_MPI_INVALID_CHARACTER -0x0006 +/** The buffer is too small to write to. */ +#define MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -0x0008 +/** The input arguments are negative or result in illegal output. */ +#define MBEDTLS_ERR_MPI_NEGATIVE_VALUE -0x000A +/** The input argument for division is zero, which is not allowed. */ +#define MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -0x000C +/** The input arguments are not acceptable. */ +#define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -0x000E +/** Memory allocation failed. */ +#define MBEDTLS_ERR_MPI_ALLOC_FAILED -0x0010 + +#define MBEDTLS_MPI_CHK(f) \ + do \ + { \ + if ((ret = (f)) != 0) \ + goto cleanup; \ + } while (0) + +/* + * Maximum size MPIs are allowed to grow to in number of limbs. + */ +#define MBEDTLS_MPI_MAX_LIMBS 10000 + +#if !defined(MBEDTLS_MPI_WINDOW_SIZE) +/* + * Maximum window size used for modular exponentiation. Default: 2 + * Minimum value: 1. Maximum value: 6. + * + * Result is an array of ( 2 ** MBEDTLS_MPI_WINDOW_SIZE ) MPIs used + * for the sliding window calculation. (So 64 by default) + * + * Reduction in size, reduces speed. + */ +#define MBEDTLS_MPI_WINDOW_SIZE 2 /**< Maximum window size used. */ +#endif /* !MBEDTLS_MPI_WINDOW_SIZE */ + +#if !defined(MBEDTLS_MPI_MAX_SIZE) +/* + * Maximum size of MPIs allowed in bits and bytes for user-MPIs. + * ( Default: 512 bytes => 4096 bits, Maximum tested: 2048 bytes => 16384 bits ) + * + * Note: Calculations can temporarily result in larger MPIs. So the number + * of limbs required (MBEDTLS_MPI_MAX_LIMBS) is higher. + */ +#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ +#endif /* !MBEDTLS_MPI_MAX_SIZE */ + +#define MBEDTLS_MPI_MAX_BITS (8 * MBEDTLS_MPI_MAX_SIZE) /**< Maximum number of bits for usable MPIs. */ + +/* + * When reading from files with mbedtls_mpi_read_file() and writing to files with + * mbedtls_mpi_write_file() the buffer should have space + * for a (short) label, the MPI (in the provided radix), the newline + * characters and the '\0'. + * + * By default we assume at least a 10 char label, a minimum radix of 10 + * (decimal) and a maximum of 4096 bit numbers (1234 decimal chars). + * Autosized at compile time for at least a 10 char label, a minimum radix + * of 10 (decimal) for a number of MBEDTLS_MPI_MAX_BITS size. + * + * This used to be statically sized to 1250 for a maximum of 4096 bit + * numbers (1234 decimal chars). + * + * Calculate using the formula: + * MBEDTLS_MPI_RW_BUFFER_SIZE = ceil(MBEDTLS_MPI_MAX_BITS / ln(10) * ln(2)) + + * LabelSize + 6 + */ +#define MBEDTLS_MPI_MAX_BITS_SCALE100 (100 * MBEDTLS_MPI_MAX_BITS) +#define MBEDTLS_LN_2_DIV_LN_10_SCALE100 332 +#define MBEDTLS_MPI_RW_BUFFER_SIZE (((MBEDTLS_MPI_MAX_BITS_SCALE100 + \ + MBEDTLS_LN_2_DIV_LN_10_SCALE100 - 1) / \ + MBEDTLS_LN_2_DIV_LN_10_SCALE100) + 10 + 6) + +/* + * Define the base integer type, architecture-wise. + * + * 32 or 64-bit integer types can be forced regardless of the underlying + * architecture by defining MBEDTLS_HAVE_INT32 or MBEDTLS_HAVE_INT64 + * respectively and undefining MBEDTLS_HAVE_ASM. + * + * Double-width integers (e.g. 128-bit in 64-bit architectures) can be + * disabled by defining MBEDTLS_NO_UDBL_DIVISION. + */ +#if !defined(MBEDTLS_HAVE_INT32) + #if defined(_MSC_VER) && defined(_M_AMD64) +/* Always choose 64-bit when using MSC */ + #if !defined(MBEDTLS_HAVE_INT64) + #define MBEDTLS_HAVE_INT64 + #endif /* !MBEDTLS_HAVE_INT64 */ +typedef int64_t mbedtls_mpi_sint; +typedef uint64_t mbedtls_mpi_uint; + #elif defined(__GNUC__) && ( \ + defined(__amd64__) || defined(__x86_64__) || \ + defined(__ppc64__) || defined(__powerpc64__) || \ + defined(__ia64__) || defined(__alpha__) || \ + (defined(__sparc__) && defined(__arch64__)) || \ + defined(__s390x__) || defined(__mips64) || \ + defined(__aarch64__)) + #if !defined(MBEDTLS_HAVE_INT64) + #define MBEDTLS_HAVE_INT64 + #endif /* MBEDTLS_HAVE_INT64 */ +typedef int64_t mbedtls_mpi_sint; +typedef uint64_t mbedtls_mpi_uint; + #if !defined(MBEDTLS_NO_UDBL_DIVISION) +/* mbedtls_t_udbl defined as 128-bit unsigned int */ +typedef unsigned int mbedtls_t_udbl __attribute__((mode(TI))); + #define MBEDTLS_HAVE_UDBL + #endif /* !MBEDTLS_NO_UDBL_DIVISION */ + #elif defined(__ARMCC_VERSION) && defined(__aarch64__) +/* + * __ARMCC_VERSION is defined for both armcc and armclang and + * __aarch64__ is only defined by armclang when compiling 64-bit code + */ + #if !defined(MBEDTLS_HAVE_INT64) + #define MBEDTLS_HAVE_INT64 + #endif /* !MBEDTLS_HAVE_INT64 */ +typedef int64_t mbedtls_mpi_sint; +typedef uint64_t mbedtls_mpi_uint; + #if !defined(MBEDTLS_NO_UDBL_DIVISION) +/* mbedtls_t_udbl defined as 128-bit unsigned int */ +typedef __uint128_t mbedtls_t_udbl; + #define MBEDTLS_HAVE_UDBL + #endif /* !MBEDTLS_NO_UDBL_DIVISION */ + #elif defined(MBEDTLS_HAVE_INT64) +/* Force 64-bit integers with unknown compiler */ +typedef int64_t mbedtls_mpi_sint; +typedef uint64_t mbedtls_mpi_uint; + #endif +#endif /* !MBEDTLS_HAVE_INT32 */ + +#if !defined(MBEDTLS_HAVE_INT64) +/* Default to 32-bit compilation */ + #if !defined(MBEDTLS_HAVE_INT32) + #define MBEDTLS_HAVE_INT32 + #endif /* !MBEDTLS_HAVE_INT32 */ +typedef int32_t mbedtls_mpi_sint; +typedef uint32_t mbedtls_mpi_uint; + #if !defined(MBEDTLS_NO_UDBL_DIVISION) +typedef uint64_t mbedtls_t_udbl; + #define MBEDTLS_HAVE_UDBL + #endif /* !MBEDTLS_NO_UDBL_DIVISION */ +#endif /* !MBEDTLS_HAVE_INT64 */ + +/** \typedef mbedtls_mpi_uint + * \brief The type of machine digits in a bignum, called _limbs_. + * + * This is always an unsigned integer type with no padding bits. The size + * is platform-dependent. + */ + +/** \typedef mbedtls_mpi_sint + * \brief The signed type corresponding to #mbedtls_mpi_uint. + * + * This is always a signed integer type with no padding bits. The size + * is platform-dependent. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief MPI structure + */ +typedef struct mbedtls_mpi { + /** Sign: -1 if the mpi is negative, 1 otherwise. + * + * The number 0 must be represented with `s = +1`. Although many library + * functions treat all-limbs-zero as equivalent to a valid representation + * of 0 regardless of the sign bit, there are exceptions, so bignum + * functions and external callers must always set \c s to +1 for the + * number zero. + * + * Note that this implies that calloc() or `... = {0}` does not create + * a valid MPI representation. You must call mbedtls_mpi_init(). + */ + int s; + + /** Total number of limbs in \c p. */ + size_t n; + + /** Pointer to limbs. + * + * This may be \c NULL if \c n is 0. + */ + mbedtls_mpi_uint *p; +} +mbedtls_mpi; + +/** + * \brief Initialize an MPI context. + * + * This makes the MPI ready to be set or freed, + * but does not define a value for the MPI. + * + * \param X The MPI context to initialize. This must not be \c NULL. + */ +void mbedtls_mpi_init(mbedtls_mpi *X); + +/** + * \brief This function frees the components of an MPI context. + * + * \param X The MPI context to be cleared. This may be \c NULL, + * in which case this function is a no-op. If it is + * not \c NULL, it must point to an initialized MPI. + */ +void mbedtls_mpi_free(mbedtls_mpi *X); + +/** + * \brief Enlarge an MPI to the specified number of limbs. + * + * \note This function does nothing if the MPI is + * already large enough. + * + * \param X The MPI to grow. It must be initialized. + * \param nblimbs The target number of limbs. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_mpi_grow(mbedtls_mpi *X, size_t nblimbs); + +/** + * \brief This function resizes an MPI downwards, keeping at least the + * specified number of limbs. + * + * If \c X is smaller than \c nblimbs, it is resized up + * instead. + * + * \param X The MPI to shrink. This must point to an initialized MPI. + * \param nblimbs The minimum number of limbs to keep. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed + * (this can only happen when resizing up). + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_mpi_shrink(mbedtls_mpi *X, size_t nblimbs); + +/** + * \brief Make a copy of an MPI. + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param Y The source MPI. This must point to an initialized MPI. + * + * \note The limb-buffer in the destination MPI is enlarged + * if necessary to hold the value in the source MPI. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_mpi_copy(mbedtls_mpi *X, const mbedtls_mpi *Y); + +/** + * \brief Swap the contents of two MPIs. + * + * \param X The first MPI. It must be initialized. + * \param Y The second MPI. It must be initialized. + */ +void mbedtls_mpi_swap(mbedtls_mpi *X, mbedtls_mpi *Y); + +/** + * \brief Perform a safe conditional copy of MPI which doesn't + * reveal whether the condition was true or not. + * + * \param X The MPI to conditionally assign to. This must point + * to an initialized MPI. + * \param Y The MPI to be assigned from. This must point to an + * initialized MPI. + * \param assign The condition deciding whether to perform the + * assignment or not. Must be either 0 or 1: + * * \c 1: Perform the assignment `X = Y`. + * * \c 0: Keep the original value of \p X. + * + * \note This function is equivalent to + * `if( assign ) mbedtls_mpi_copy( X, Y );` + * except that it avoids leaking any information about whether + * the assignment was done or not (the above code may leak + * information through branch prediction and/or memory access + * patterns analysis). + * + * \warning If \p assign is neither 0 nor 1, the result of this function + * is indeterminate, and the resulting value in \p X might be + * neither its original value nor the value in \p Y. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_mpi_safe_cond_assign(mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign); + +/** + * \brief Perform a safe conditional swap which doesn't + * reveal whether the condition was true or not. + * + * \param X The first MPI. This must be initialized. + * \param Y The second MPI. This must be initialized. + * \param swap The condition deciding whether to perform + * the swap or not. Must be either 0 or 1: + * * \c 1: Swap the values of \p X and \p Y. + * * \c 0: Keep the original values of \p X and \p Y. + * + * \note This function is equivalent to + * if( swap ) mbedtls_mpi_swap( X, Y ); + * except that it avoids leaking any information about whether + * the swap was done or not (the above code may leak + * information through branch prediction and/or memory access + * patterns analysis). + * + * \warning If \p swap is neither 0 nor 1, the result of this function + * is indeterminate, and both \p X and \p Y might end up with + * values different to either of the original ones. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. + * \return Another negative error code on other kinds of failure. + * + */ +int mbedtls_mpi_safe_cond_swap(mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char swap); + +/** + * \brief Store integer value in MPI. + * + * \param X The MPI to set. This must be initialized. + * \param z The value to use. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_mpi_lset(mbedtls_mpi *X, mbedtls_mpi_sint z); + +/** + * \brief Get a specific bit from an MPI. + * + * \param X The MPI to query. This must be initialized. + * \param pos Zero-based index of the bit to query. + * + * \return \c 0 or \c 1 on success, depending on whether bit \c pos + * of \c X is unset or set. + * \return A negative error code on failure. + */ +int mbedtls_mpi_get_bit(const mbedtls_mpi *X, size_t pos); + +/** + * \brief Modify a specific bit in an MPI. + * + * \note This function will grow the target MPI if necessary to set a + * bit to \c 1 in a not yet existing limb. It will not grow if + * the bit should be set to \c 0. + * + * \param X The MPI to modify. This must be initialized. + * \param pos Zero-based index of the bit to modify. + * \param val The desired value of bit \c pos: \c 0 or \c 1. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_mpi_set_bit(mbedtls_mpi *X, size_t pos, unsigned char val); + +/** + * \brief Return the number of bits of value \c 0 before the + * least significant bit of value \c 1. + * + * \note This is the same as the zero-based index of + * the least significant bit of value \c 1. + * + * \param X The MPI to query. + * + * \return The number of bits of value \c 0 before the least significant + * bit of value \c 1 in \p X. + */ +size_t mbedtls_mpi_lsb(const mbedtls_mpi *X); + +/** + * \brief Return the number of bits up to and including the most + * significant bit of value \c 1. + * + * * \note This is same as the one-based index of the most + * significant bit of value \c 1. + * + * \param X The MPI to query. This must point to an initialized MPI. + * + * \return The number of bits up to and including the most + * significant bit of value \c 1. + */ +size_t mbedtls_mpi_bitlen(const mbedtls_mpi *X); + +/** + * \brief Return the total size of an MPI value in bytes. + * + * \param X The MPI to use. This must point to an initialized MPI. + * + * \note The value returned by this function may be less than + * the number of bytes used to store \p X internally. + * This happens if and only if there are trailing bytes + * of value zero. + * + * \return The least number of bytes capable of storing + * the absolute value of \p X. + */ +size_t mbedtls_mpi_size(const mbedtls_mpi *X); + +/** + * \brief Import an MPI from an ASCII string. + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param radix The numeric base of the input string. + * \param s Null-terminated string buffer. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_mpi_read_string(mbedtls_mpi *X, int radix, const char *s); + +/** + * \brief Export an MPI to an ASCII string. + * + * \param X The source MPI. This must point to an initialized MPI. + * \param radix The numeric base of the output string. + * \param buf The buffer to write the string to. This must be writable + * buffer of length \p buflen Bytes. + * \param buflen The available size in Bytes of \p buf. + * \param olen The address at which to store the length of the string + * written, including the final \c NULL byte. This must + * not be \c NULL. + * + * \note You can call this function with `buflen == 0` to obtain the + * minimum required buffer size in `*olen`. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if the target buffer \p buf + * is too small to hold the value of \p X in the desired base. + * In this case, `*olen` is nonetheless updated to contain the + * size of \p buf required for a successful call. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_write_string(const mbedtls_mpi *X, int radix, + char *buf, size_t buflen, size_t *olen); + +#if defined(MBEDTLS_FS_IO) +/** + * \brief Read an MPI from a line in an opened file. + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param radix The numeric base of the string representation used + * in the source line. + * \param fin The input file handle to use. This must not be \c NULL. + * + * \note On success, this function advances the file stream + * to the end of the current line or to EOF. + * + * The function returns \c 0 on an empty line. + * + * Leading whitespaces are ignored, as is a + * '0x' prefix for radix \c 16. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if the file read buffer + * is too small. + * \return Another negative error code on failure. + */ +int mbedtls_mpi_read_file(mbedtls_mpi *X, int radix, FILE *fin); + +/** + * \brief Export an MPI into an opened file. + * + * \param p A string prefix to emit prior to the MPI data. + * For example, this might be a label, or "0x" when + * printing in base \c 16. This may be \c NULL if no prefix + * is needed. + * \param X The source MPI. This must point to an initialized MPI. + * \param radix The numeric base to be used in the emitted string. + * \param fout The output file handle. This may be \c NULL, in which case + * the output is written to \c stdout. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_mpi_write_file(const char *p, const mbedtls_mpi *X, + int radix, FILE *fout); +#endif /* MBEDTLS_FS_IO */ + +/** + * \brief Import an MPI from unsigned big endian binary data. + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param buf The input buffer. This must be a readable buffer of length + * \p buflen Bytes. + * \param buflen The length of the input buffer \p buf in Bytes. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_read_binary(mbedtls_mpi *X, const unsigned char *buf, + size_t buflen); + +/** + * \brief Import X from unsigned binary data, little endian + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param buf The input buffer. This must be a readable buffer of length + * \p buflen Bytes. + * \param buflen The length of the input buffer \p buf in Bytes. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_read_binary_le(mbedtls_mpi *X, + const unsigned char *buf, size_t buflen); + +/** + * \brief Export X into unsigned binary data, big endian. + * Always fills the whole buffer, which will start with zeros + * if the number is smaller. + * + * \param X The source MPI. This must point to an initialized MPI. + * \param buf The output buffer. This must be a writable buffer of length + * \p buflen Bytes. + * \param buflen The size of the output buffer \p buf in Bytes. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if \p buf isn't + * large enough to hold the value of \p X. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_write_binary(const mbedtls_mpi *X, unsigned char *buf, + size_t buflen); + +/** + * \brief Export X into unsigned binary data, little endian. + * Always fills the whole buffer, which will end with zeros + * if the number is smaller. + * + * \param X The source MPI. This must point to an initialized MPI. + * \param buf The output buffer. This must be a writable buffer of length + * \p buflen Bytes. + * \param buflen The size of the output buffer \p buf in Bytes. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if \p buf isn't + * large enough to hold the value of \p X. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_write_binary_le(const mbedtls_mpi *X, + unsigned char *buf, size_t buflen); + +/** + * \brief Perform a left-shift on an MPI: X <<= count + * + * \param X The MPI to shift. This must point to an initialized MPI. + * \param count The number of bits to shift by. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_shift_l(mbedtls_mpi *X, size_t count); + +/** + * \brief Perform a right-shift on an MPI: X >>= count + * + * \param X The MPI to shift. This must point to an initialized MPI. + * \param count The number of bits to shift by. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_shift_r(mbedtls_mpi *X, size_t count); + +/** + * \brief Compare the absolute values of two MPIs. + * + * \param X The left-hand MPI. This must point to an initialized MPI. + * \param Y The right-hand MPI. This must point to an initialized MPI. + * + * \return \c 1 if `|X|` is greater than `|Y|`. + * \return \c -1 if `|X|` is lesser than `|Y|`. + * \return \c 0 if `|X|` is equal to `|Y|`. + */ +int mbedtls_mpi_cmp_abs(const mbedtls_mpi *X, const mbedtls_mpi *Y); + +/** + * \brief Compare two MPIs. + * + * \param X The left-hand MPI. This must point to an initialized MPI. + * \param Y The right-hand MPI. This must point to an initialized MPI. + * + * \return \c 1 if \p X is greater than \p Y. + * \return \c -1 if \p X is lesser than \p Y. + * \return \c 0 if \p X is equal to \p Y. + */ +int mbedtls_mpi_cmp_mpi(const mbedtls_mpi *X, const mbedtls_mpi *Y); + +/** + * \brief Check if an MPI is less than the other in constant time. + * + * \param X The left-hand MPI. This must point to an initialized MPI + * with the same allocated length as Y. + * \param Y The right-hand MPI. This must point to an initialized MPI + * with the same allocated length as X. + * \param ret The result of the comparison: + * \c 1 if \p X is less than \p Y. + * \c 0 if \p X is greater than or equal to \p Y. + * + * \return 0 on success. + * \return MBEDTLS_ERR_MPI_BAD_INPUT_DATA if the allocated length of + * the two input MPIs is not the same. + */ +int mbedtls_mpi_lt_mpi_ct(const mbedtls_mpi *X, const mbedtls_mpi *Y, + unsigned *ret); + +/** + * \brief Compare an MPI with an integer. + * + * \param X The left-hand MPI. This must point to an initialized MPI. + * \param z The integer value to compare \p X to. + * + * \return \c 1 if \p X is greater than \p z. + * \return \c -1 if \p X is lesser than \p z. + * \return \c 0 if \p X is equal to \p z. + */ +int mbedtls_mpi_cmp_int(const mbedtls_mpi *X, mbedtls_mpi_sint z); + +/** + * \brief Perform an unsigned addition of MPIs: X = |A| + |B| + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param A The first summand. This must point to an initialized MPI. + * \param B The second summand. This must point to an initialized MPI. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_add_abs(mbedtls_mpi *X, const mbedtls_mpi *A, + const mbedtls_mpi *B); + +/** + * \brief Perform an unsigned subtraction of MPIs: X = |A| - |B| + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param A The minuend. This must point to an initialized MPI. + * \param B The subtrahend. This must point to an initialized MPI. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_NEGATIVE_VALUE if \p B is greater than \p A. + * \return Another negative error code on different kinds of failure. + * + */ +int mbedtls_mpi_sub_abs(mbedtls_mpi *X, const mbedtls_mpi *A, + const mbedtls_mpi *B); + +/** + * \brief Perform a signed addition of MPIs: X = A + B + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param A The first summand. This must point to an initialized MPI. + * \param B The second summand. This must point to an initialized MPI. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_add_mpi(mbedtls_mpi *X, const mbedtls_mpi *A, + const mbedtls_mpi *B); + +/** + * \brief Perform a signed subtraction of MPIs: X = A - B + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param A The minuend. This must point to an initialized MPI. + * \param B The subtrahend. This must point to an initialized MPI. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_sub_mpi(mbedtls_mpi *X, const mbedtls_mpi *A, + const mbedtls_mpi *B); + +/** + * \brief Perform a signed addition of an MPI and an integer: X = A + b + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param A The first summand. This must point to an initialized MPI. + * \param b The second summand. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_add_int(mbedtls_mpi *X, const mbedtls_mpi *A, + mbedtls_mpi_sint b); + +/** + * \brief Perform a signed subtraction of an MPI and an integer: + * X = A - b + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param A The minuend. This must point to an initialized MPI. + * \param b The subtrahend. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_sub_int(mbedtls_mpi *X, const mbedtls_mpi *A, + mbedtls_mpi_sint b); + +/** + * \brief Perform a multiplication of two MPIs: X = A * B + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param A The first factor. This must point to an initialized MPI. + * \param B The second factor. This must point to an initialized MPI. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return Another negative error code on different kinds of failure. + * + */ +int mbedtls_mpi_mul_mpi(mbedtls_mpi *X, const mbedtls_mpi *A, + const mbedtls_mpi *B); + +/** + * \brief Perform a multiplication of an MPI with an unsigned integer: + * X = A * b + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param A The first factor. This must point to an initialized MPI. + * \param b The second factor. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return Another negative error code on different kinds of failure. + * + */ +int mbedtls_mpi_mul_int(mbedtls_mpi *X, const mbedtls_mpi *A, + mbedtls_mpi_uint b); + +/** + * \brief Perform a division with remainder of two MPIs: + * A = Q * B + R + * + * \param Q The destination MPI for the quotient. + * This may be \c NULL if the value of the + * quotient is not needed. This must not alias A or B. + * \param R The destination MPI for the remainder value. + * This may be \c NULL if the value of the + * remainder is not needed. This must not alias A or B. + * \param A The dividend. This must point to an initialized MPI. + * \param B The divisor. This must point to an initialized MPI. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. + * \return #MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if \p B equals zero. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_div_mpi(mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, + const mbedtls_mpi *B); + +/** + * \brief Perform a division with remainder of an MPI by an integer: + * A = Q * b + R + * + * \param Q The destination MPI for the quotient. + * This may be \c NULL if the value of the + * quotient is not needed. This must not alias A. + * \param R The destination MPI for the remainder value. + * This may be \c NULL if the value of the + * remainder is not needed. This must not alias A. + * \param A The dividend. This must point to an initialized MPi. + * \param b The divisor. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. + * \return #MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if \p b equals zero. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_div_int(mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, + mbedtls_mpi_sint b); + +/** + * \brief Perform a modular reduction. R = A mod B + * + * \param R The destination MPI for the residue value. + * This must point to an initialized MPI. + * \param A The MPI to compute the residue of. + * This must point to an initialized MPI. + * \param B The base of the modular reduction. + * This must point to an initialized MPI. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return #MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if \p B equals zero. + * \return #MBEDTLS_ERR_MPI_NEGATIVE_VALUE if \p B is negative. + * \return Another negative error code on different kinds of failure. + * + */ +int mbedtls_mpi_mod_mpi(mbedtls_mpi *R, const mbedtls_mpi *A, + const mbedtls_mpi *B); + +/** + * \brief Perform a modular reduction with respect to an integer. + * r = A mod b + * + * \param r The address at which to store the residue. + * This must not be \c NULL. + * \param A The MPI to compute the residue of. + * This must point to an initialized MPi. + * \param b The integer base of the modular reduction. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return #MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if \p b equals zero. + * \return #MBEDTLS_ERR_MPI_NEGATIVE_VALUE if \p b is negative. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_mod_int(mbedtls_mpi_uint *r, const mbedtls_mpi *A, + mbedtls_mpi_sint b); + +/** + * \brief Perform a sliding-window exponentiation: X = A^E mod N + * + * \param X The destination MPI. This must point to an initialized MPI. + * This must not alias E or N. + * \param A The base of the exponentiation. + * This must point to an initialized MPI. + * \param E The exponent MPI. This must point to an initialized MPI. + * \param N The base for the modular reduction. This must point to an + * initialized MPI. + * \param prec_RR A helper MPI depending solely on \p N which can be used to + * speed-up multiple modular exponentiations for the same value + * of \p N. This may be \c NULL. If it is not \c NULL, it must + * point to an initialized MPI. If it hasn't been used after + * the call to mbedtls_mpi_init(), this function will compute + * the helper value and store it in \p prec_RR for reuse on + * subsequent calls to this function. Otherwise, the function + * will assume that \p prec_RR holds the helper value set by a + * previous call to mbedtls_mpi_exp_mod(), and reuse it. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if \c N is negative or + * even, or if \c E is negative. + * \return Another negative error code on different kinds of failures. + * + */ +int mbedtls_mpi_exp_mod(mbedtls_mpi *X, const mbedtls_mpi *A, + const mbedtls_mpi *E, const mbedtls_mpi *N, + mbedtls_mpi *prec_RR); + +/** + * \brief Fill an MPI with a number of random bytes. + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param size The number of random bytes to generate. + * \param f_rng The RNG function to use. This must not be \c NULL. + * \param p_rng The RNG parameter to be passed to \p f_rng. This may be + * \c NULL if \p f_rng doesn't need a context argument. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return Another negative error code on failure. + * + * \note The bytes obtained from the RNG are interpreted + * as a big-endian representation of an MPI; this can + * be relevant in applications like deterministic ECDSA. + */ +int mbedtls_mpi_fill_random(mbedtls_mpi *X, size_t size, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** Generate a random number uniformly in a range. + * + * This function generates a random number between \p min inclusive and + * \p N exclusive. + * + * The procedure complies with RFC 6979 §3.3 (deterministic ECDSA) + * when the RNG is a suitably parametrized instance of HMAC_DRBG + * and \p min is \c 1. + * + * \note There are `N - min` possible outputs. The lower bound + * \p min can be reached, but the upper bound \p N cannot. + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param min The minimum value to return. + * It must be nonnegative. + * \param N The upper bound of the range, exclusive. + * In other words, this is one plus the maximum value to return. + * \p N must be strictly larger than \p min. + * \param f_rng The RNG function to use. This must not be \c NULL. + * \param p_rng The RNG parameter to be passed to \p f_rng. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if \p min or \p N is invalid + * or if they are incompatible. + * \return #MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if the implementation was + * unable to find a suitable value within a limited number + * of attempts. This has a negligible probability if \p N + * is significantly larger than \p min, which is the case + * for all usual cryptographic applications. + * \return Another negative error code on failure. + */ +int mbedtls_mpi_random(mbedtls_mpi *X, + mbedtls_mpi_sint min, + const mbedtls_mpi *N, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief Compute the greatest common divisor: G = gcd(A, B) + * + * \param G The destination MPI. This must point to an initialized MPI. + * \param A The first operand. This must point to an initialized MPI. + * \param B The second operand. This must point to an initialized MPI. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_mpi_gcd(mbedtls_mpi *G, const mbedtls_mpi *A, + const mbedtls_mpi *B); + +/** + * \brief Compute the modular inverse: X = A^-1 mod N + * + * \param X The destination MPI. This must point to an initialized MPI. + * \param A The MPI to calculate the modular inverse of. This must point + * to an initialized MPI. + * \param N The base of the modular inversion. This must point to an + * initialized MPI. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if \p N is less than + * or equal to one. + * \return #MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if \p A has no modular + * inverse with respect to \p N. + */ +int mbedtls_mpi_inv_mod(mbedtls_mpi *X, const mbedtls_mpi *A, + const mbedtls_mpi *N); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief Perform a Miller-Rabin primality test with error + * probability of 2-80. + * + * \deprecated Superseded by mbedtls_mpi_is_prime_ext() which allows + * specifying the number of Miller-Rabin rounds. + * + * \param X The MPI to check for primality. + * This must point to an initialized MPI. + * \param f_rng The RNG function to use. This must not be \c NULL. + * \param p_rng The RNG parameter to be passed to \p f_rng. + * This may be \c NULL if \p f_rng doesn't use a + * context parameter. + * + * \return \c 0 if successful, i.e. \p X is probably prime. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return #MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if \p X is not prime. + * \return Another negative error code on other kinds of failure. + */ +MBEDTLS_DEPRECATED int mbedtls_mpi_is_prime(const mbedtls_mpi *X, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +/** + * \brief Miller-Rabin primality test. + * + * \warning If \p X is potentially generated by an adversary, for example + * when validating cryptographic parameters that you didn't + * generate yourself and that are supposed to be prime, then + * \p rounds should be at least the half of the security + * strength of the cryptographic algorithm. On the other hand, + * if \p X is chosen uniformly or non-adversarially (as is the + * case when mbedtls_mpi_gen_prime calls this function), then + * \p rounds can be much lower. + * + * \param X The MPI to check for primality. + * This must point to an initialized MPI. + * \param rounds The number of bases to perform the Miller-Rabin primality + * test for. The probability of returning 0 on a composite is + * at most 2-2*\p rounds . + * \param f_rng The RNG function to use. This must not be \c NULL. + * \param p_rng The RNG parameter to be passed to \p f_rng. + * This may be \c NULL if \p f_rng doesn't use + * a context parameter. + * + * \return \c 0 if successful, i.e. \p X is probably prime. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return #MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if \p X is not prime. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_mpi_is_prime_ext(const mbedtls_mpi *X, int rounds, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); +/** + * \brief Flags for mbedtls_mpi_gen_prime() + * + * Each of these flags is a constraint on the result X returned by + * mbedtls_mpi_gen_prime(). + */ +typedef enum { + MBEDTLS_MPI_GEN_PRIME_FLAG_DH = 0x0001, /**< (X-1)/2 is prime too */ + MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR = 0x0002, /**< lower error rate from 2-80 to 2-128 */ +} mbedtls_mpi_gen_prime_flag_t; + +/** + * \brief Generate a prime number. + * + * \param X The destination MPI to store the generated prime in. + * This must point to an initialized MPi. + * \param nbits The required size of the destination MPI in bits. + * This must be between \c 3 and #MBEDTLS_MPI_MAX_BITS. + * \param flags A mask of flags of type #mbedtls_mpi_gen_prime_flag_t. + * \param f_rng The RNG function to use. This must not be \c NULL. + * \param p_rng The RNG parameter to be passed to \p f_rng. + * This may be \c NULL if \p f_rng doesn't use + * a context parameter. + * + * \return \c 0 if successful, in which case \p X holds a + * probably prime number. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. + * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if `nbits` is not between + * \c 3 and #MBEDTLS_MPI_MAX_BITS. + */ +int mbedtls_mpi_gen_prime(mbedtls_mpi *X, size_t nbits, int flags, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int mbedtls_mpi_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* bignum.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/blowfish.h b/ext/opcua_client/mbedtls/include/mbedtls/blowfish.h new file mode 100644 index 0000000..7979670 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/blowfish.h @@ -0,0 +1,275 @@ +/** + * \file blowfish.h + * + * \brief Blowfish block cipher + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_BLOWFISH_H +#define MBEDTLS_BLOWFISH_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +#include "mbedtls/platform_util.h" + +#define MBEDTLS_BLOWFISH_ENCRYPT 1 +#define MBEDTLS_BLOWFISH_DECRYPT 0 +#define MBEDTLS_BLOWFISH_MAX_KEY_BITS 448 +#define MBEDTLS_BLOWFISH_MIN_KEY_BITS 32 +#define MBEDTLS_BLOWFISH_ROUNDS 16 /**< Rounds to use. When increasing this value, make sure to extend the initialisation vectors */ +#define MBEDTLS_BLOWFISH_BLOCKSIZE 8 /* Blowfish uses 64 bit blocks */ + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#define MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH MBEDTLS_DEPRECATED_NUMERIC_CONSTANT(-0x0016) +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ +/** Bad input data. */ +#define MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA -0x0016 + +/** Invalid data input length. */ +#define MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH -0x0018 + +/* MBEDTLS_ERR_BLOWFISH_HW_ACCEL_FAILED is deprecated and should not be used. + */ +/** Blowfish hardware accelerator failed. */ +#define MBEDTLS_ERR_BLOWFISH_HW_ACCEL_FAILED -0x0017 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_BLOWFISH_ALT) +// Regular implementation +// + +/** + * \brief Blowfish context structure + */ +typedef struct mbedtls_blowfish_context { + uint32_t P[MBEDTLS_BLOWFISH_ROUNDS + 2]; /*!< Blowfish round keys */ + uint32_t S[4][256]; /*!< key dependent S-boxes */ +} +mbedtls_blowfish_context; + +#else /* MBEDTLS_BLOWFISH_ALT */ +#include "blowfish_alt.h" +#endif /* MBEDTLS_BLOWFISH_ALT */ + +/** + * \brief Initialize a Blowfish context. + * + * \param ctx The Blowfish context to be initialized. + * This must not be \c NULL. + */ +void mbedtls_blowfish_init(mbedtls_blowfish_context *ctx); + +/** + * \brief Clear a Blowfish context. + * + * \param ctx The Blowfish context to be cleared. + * This may be \c NULL, in which case this function + * returns immediately. If it is not \c NULL, it must + * point to an initialized Blowfish context. + */ +void mbedtls_blowfish_free(mbedtls_blowfish_context *ctx); + +/** + * \brief Perform a Blowfish key schedule operation. + * + * \param ctx The Blowfish context to perform the key schedule on. + * \param key The encryption key. This must be a readable buffer of + * length \p keybits Bits. + * \param keybits The length of \p key in Bits. This must be between + * \c 32 and \c 448 and a multiple of \c 8. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_blowfish_setkey(mbedtls_blowfish_context *ctx, const unsigned char *key, + unsigned int keybits); + +/** + * \brief Perform a Blowfish-ECB block encryption/decryption operation. + * + * \param ctx The Blowfish context to use. This must be initialized + * and bound to a key. + * \param mode The mode of operation. Possible values are + * #MBEDTLS_BLOWFISH_ENCRYPT for encryption, or + * #MBEDTLS_BLOWFISH_DECRYPT for decryption. + * \param input The input block. This must be a readable buffer + * of size \c 8 Bytes. + * \param output The output block. This must be a writable buffer + * of size \c 8 Bytes. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_blowfish_crypt_ecb(mbedtls_blowfish_context *ctx, + int mode, + const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE], + unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE]); + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/** + * \brief Perform a Blowfish-CBC buffer encryption/decryption operation. + * + * \note Upon exit, the content of the IV is updated so that you can + * call the function same function again on the following + * block(s) of data and get the same result as if it was + * encrypted in one call. This allows a "streaming" usage. + * If on the other hand you need to retain the contents of the + * IV, you should either save it manually or use the cipher + * module instead. + * + * \param ctx The Blowfish context to use. This must be initialized + * and bound to a key. + * \param mode The mode of operation. Possible values are + * #MBEDTLS_BLOWFISH_ENCRYPT for encryption, or + * #MBEDTLS_BLOWFISH_DECRYPT for decryption. + * \param length The length of the input data in Bytes. This must be + * multiple of \c 8. + * \param iv The initialization vector. This must be a read/write buffer + * of length \c 8 Bytes. It is updated by this function. + * \param input The input data. This must be a readable buffer of length + * \p length Bytes. + * \param output The output data. This must be a writable buffer of length + * \p length Bytes. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_blowfish_crypt_cbc(mbedtls_blowfish_context *ctx, + int mode, + size_t length, + unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +/** + * \brief Perform a Blowfish CFB buffer encryption/decryption operation. + * + * \note Upon exit, the content of the IV is updated so that you can + * call the function same function again on the following + * block(s) of data and get the same result as if it was + * encrypted in one call. This allows a "streaming" usage. + * If on the other hand you need to retain the contents of the + * IV, you should either save it manually or use the cipher + * module instead. + * + * \param ctx The Blowfish context to use. This must be initialized + * and bound to a key. + * \param mode The mode of operation. Possible values are + * #MBEDTLS_BLOWFISH_ENCRYPT for encryption, or + * #MBEDTLS_BLOWFISH_DECRYPT for decryption. + * \param length The length of the input data in Bytes. + * \param iv_off The offset in the initialization vector. + * The value pointed to must be smaller than \c 8 Bytes. + * It is updated by this function to support the aforementioned + * streaming usage. + * \param iv The initialization vector. This must be a read/write buffer + * of size \c 8 Bytes. It is updated after use. + * \param input The input data. This must be a readable buffer of length + * \p length Bytes. + * \param output The output data. This must be a writable buffer of length + * \p length Bytes. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_blowfish_crypt_cfb64(mbedtls_blowfish_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], + const unsigned char *input, + unsigned char *output); +#endif /*MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +/** + * \brief Perform a Blowfish-CTR buffer encryption/decryption operation. + * + * \warning You must never reuse a nonce value with the same key. Doing so + * would void the encryption for the two messages encrypted with + * the same nonce and key. + * + * There are two common strategies for managing nonces with CTR: + * + * 1. You can handle everything as a single message processed over + * successive calls to this function. In that case, you want to + * set \p nonce_counter and \p nc_off to 0 for the first call, and + * then preserve the values of \p nonce_counter, \p nc_off and \p + * stream_block across calls to this function as they will be + * updated by this function. + * + * With this strategy, you must not encrypt more than 2**64 + * blocks of data with the same key. + * + * 2. You can encrypt separate messages by dividing the \p + * nonce_counter buffer in two areas: the first one used for a + * per-message nonce, handled by yourself, and the second one + * updated by this function internally. + * + * For example, you might reserve the first 4 bytes for the + * per-message nonce, and the last 4 bytes for internal use. In that + * case, before calling this function on a new message you need to + * set the first 4 bytes of \p nonce_counter to your chosen nonce + * value, the last 4 to 0, and \p nc_off to 0 (which will cause \p + * stream_block to be ignored). That way, you can encrypt at most + * 2**32 messages of up to 2**32 blocks each with the same key. + * + * The per-message nonce (or information sufficient to reconstruct + * it) needs to be communicated with the ciphertext and must be unique. + * The recommended way to ensure uniqueness is to use a message + * counter. + * + * Note that for both strategies, sizes are measured in blocks and + * that a Blowfish block is 8 bytes. + * + * \warning Upon return, \p stream_block contains sensitive data. Its + * content must not be written to insecure storage and should be + * securely discarded as soon as it's no longer needed. + * + * \param ctx The Blowfish context to use. This must be initialized + * and bound to a key. + * \param length The length of the input data in Bytes. + * \param nc_off The offset in the current stream_block (for resuming + * within current cipher stream). The offset pointer + * should be \c 0 at the start of a stream and must be + * smaller than \c 8. It is updated by this function. + * \param nonce_counter The 64-bit nonce and counter. This must point to a + * read/write buffer of length \c 8 Bytes. + * \param stream_block The saved stream-block for resuming. This must point to + * a read/write buffer of length \c 8 Bytes. + * \param input The input data. This must be a readable buffer of + * length \p length Bytes. + * \param output The output data. This must be a writable buffer of + * length \p length Bytes. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_blowfish_crypt_ctr(mbedtls_blowfish_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[MBEDTLS_BLOWFISH_BLOCKSIZE], + unsigned char stream_block[MBEDTLS_BLOWFISH_BLOCKSIZE], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +#ifdef __cplusplus +} +#endif + +#endif /* blowfish.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/bn_mul.h b/ext/opcua_client/mbedtls/include/mbedtls/bn_mul.h new file mode 100644 index 0000000..fc0c3cf --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/bn_mul.h @@ -0,0 +1,1005 @@ +/** + * \file bn_mul.h + * + * \brief Multi-precision integer library + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * Multiply source vector [s] with b, add result + * to destination vector [d] and set carry c. + * + * Currently supports: + * + * . IA-32 (386+) . AMD64 / EM64T + * . IA-32 (SSE2) . Motorola 68000 + * . PowerPC, 32-bit . MicroBlaze + * . PowerPC, 64-bit . TriCore + * . SPARC v8 . ARM v3+ + * . Alpha . MIPS32 + * . C, longlong . C, generic + */ +#ifndef MBEDTLS_BN_MUL_H +#define MBEDTLS_BN_MUL_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/bignum.h" + + +/* + * Conversion macros for embedded constants: + * build lists of mbedtls_mpi_uint's from lists of unsigned char's grouped by 8, 4 or 2 + */ +#if defined(MBEDTLS_HAVE_INT32) + +#define MBEDTLS_BYTES_TO_T_UINT_4(a, b, c, d) \ + ((mbedtls_mpi_uint) (a) << 0) | \ + ((mbedtls_mpi_uint) (b) << 8) | \ + ((mbedtls_mpi_uint) (c) << 16) | \ + ((mbedtls_mpi_uint) (d) << 24) + +#define MBEDTLS_BYTES_TO_T_UINT_2(a, b) \ + MBEDTLS_BYTES_TO_T_UINT_4(a, b, 0, 0) + +#define MBEDTLS_BYTES_TO_T_UINT_8(a, b, c, d, e, f, g, h) \ + MBEDTLS_BYTES_TO_T_UINT_4(a, b, c, d), \ + MBEDTLS_BYTES_TO_T_UINT_4(e, f, g, h) + +#else /* 64-bits */ + +#define MBEDTLS_BYTES_TO_T_UINT_8(a, b, c, d, e, f, g, h) \ + ((mbedtls_mpi_uint) (a) << 0) | \ + ((mbedtls_mpi_uint) (b) << 8) | \ + ((mbedtls_mpi_uint) (c) << 16) | \ + ((mbedtls_mpi_uint) (d) << 24) | \ + ((mbedtls_mpi_uint) (e) << 32) | \ + ((mbedtls_mpi_uint) (f) << 40) | \ + ((mbedtls_mpi_uint) (g) << 48) | \ + ((mbedtls_mpi_uint) (h) << 56) + +#define MBEDTLS_BYTES_TO_T_UINT_4(a, b, c, d) \ + MBEDTLS_BYTES_TO_T_UINT_8(a, b, c, d, 0, 0, 0, 0) + +#define MBEDTLS_BYTES_TO_T_UINT_2(a, b) \ + MBEDTLS_BYTES_TO_T_UINT_8(a, b, 0, 0, 0, 0, 0, 0) + +#endif /* bits in mbedtls_mpi_uint */ + +/* *INDENT-OFF* */ +#if defined(MBEDTLS_HAVE_ASM) + +#ifndef asm +#define asm __asm +#endif + +/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */ +#if defined(__GNUC__) && \ + ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) + +/* + * GCC < 5.0 treated the x86 ebx (which is used for the GOT) as a + * fixed reserved register when building as PIC, leading to errors + * like: bn_mul.h:46:13: error: PIC register clobbered by 'ebx' in 'asm' + * + * This is fixed by an improved register allocator in GCC 5+. From the + * release notes: + * Register allocation improvements: Reuse of the PIC hard register, + * instead of using a fixed register, was implemented on x86/x86-64 + * targets. This improves generated PIC code performance as more hard + * registers can be used. + */ +#if defined(__GNUC__) && __GNUC__ < 5 && defined(__PIC__) +#define MULADDC_CANNOT_USE_EBX +#endif + +/* + * Disable use of the i386 assembly code below if option -O0, to disable all + * compiler optimisations, is passed, detected with __OPTIMIZE__ + * This is done as the number of registers used in the assembly code doesn't + * work with the -O0 option. + */ +#if defined(__i386__) && defined(__OPTIMIZE__) && !defined(MULADDC_CANNOT_USE_EBX) + +#define MULADDC_INIT \ + asm( \ + "movl %%ebx, %0 \n\t" \ + "movl %5, %%esi \n\t" \ + "movl %6, %%edi \n\t" \ + "movl %7, %%ecx \n\t" \ + "movl %8, %%ebx \n\t" + +#define MULADDC_CORE \ + "lodsl \n\t" \ + "mull %%ebx \n\t" \ + "addl %%ecx, %%eax \n\t" \ + "adcl $0, %%edx \n\t" \ + "addl (%%edi), %%eax \n\t" \ + "adcl $0, %%edx \n\t" \ + "movl %%edx, %%ecx \n\t" \ + "stosl \n\t" + +#if defined(MBEDTLS_HAVE_SSE2) + +#define MULADDC_HUIT \ + "movd %%ecx, %%mm1 \n\t" \ + "movd %%ebx, %%mm0 \n\t" \ + "movd (%%edi), %%mm3 \n\t" \ + "paddq %%mm3, %%mm1 \n\t" \ + "movd (%%esi), %%mm2 \n\t" \ + "pmuludq %%mm0, %%mm2 \n\t" \ + "movd 4(%%esi), %%mm4 \n\t" \ + "pmuludq %%mm0, %%mm4 \n\t" \ + "movd 8(%%esi), %%mm6 \n\t" \ + "pmuludq %%mm0, %%mm6 \n\t" \ + "movd 12(%%esi), %%mm7 \n\t" \ + "pmuludq %%mm0, %%mm7 \n\t" \ + "paddq %%mm2, %%mm1 \n\t" \ + "movd 4(%%edi), %%mm3 \n\t" \ + "paddq %%mm4, %%mm3 \n\t" \ + "movd 8(%%edi), %%mm5 \n\t" \ + "paddq %%mm6, %%mm5 \n\t" \ + "movd 12(%%edi), %%mm4 \n\t" \ + "paddq %%mm4, %%mm7 \n\t" \ + "movd %%mm1, (%%edi) \n\t" \ + "movd 16(%%esi), %%mm2 \n\t" \ + "pmuludq %%mm0, %%mm2 \n\t" \ + "psrlq $32, %%mm1 \n\t" \ + "movd 20(%%esi), %%mm4 \n\t" \ + "pmuludq %%mm0, %%mm4 \n\t" \ + "paddq %%mm3, %%mm1 \n\t" \ + "movd 24(%%esi), %%mm6 \n\t" \ + "pmuludq %%mm0, %%mm6 \n\t" \ + "movd %%mm1, 4(%%edi) \n\t" \ + "psrlq $32, %%mm1 \n\t" \ + "movd 28(%%esi), %%mm3 \n\t" \ + "pmuludq %%mm0, %%mm3 \n\t" \ + "paddq %%mm5, %%mm1 \n\t" \ + "movd 16(%%edi), %%mm5 \n\t" \ + "paddq %%mm5, %%mm2 \n\t" \ + "movd %%mm1, 8(%%edi) \n\t" \ + "psrlq $32, %%mm1 \n\t" \ + "paddq %%mm7, %%mm1 \n\t" \ + "movd 20(%%edi), %%mm5 \n\t" \ + "paddq %%mm5, %%mm4 \n\t" \ + "movd %%mm1, 12(%%edi) \n\t" \ + "psrlq $32, %%mm1 \n\t" \ + "paddq %%mm2, %%mm1 \n\t" \ + "movd 24(%%edi), %%mm5 \n\t" \ + "paddq %%mm5, %%mm6 \n\t" \ + "movd %%mm1, 16(%%edi) \n\t" \ + "psrlq $32, %%mm1 \n\t" \ + "paddq %%mm4, %%mm1 \n\t" \ + "movd 28(%%edi), %%mm5 \n\t" \ + "paddq %%mm5, %%mm3 \n\t" \ + "movd %%mm1, 20(%%edi) \n\t" \ + "psrlq $32, %%mm1 \n\t" \ + "paddq %%mm6, %%mm1 \n\t" \ + "movd %%mm1, 24(%%edi) \n\t" \ + "psrlq $32, %%mm1 \n\t" \ + "paddq %%mm3, %%mm1 \n\t" \ + "movd %%mm1, 28(%%edi) \n\t" \ + "addl $32, %%edi \n\t" \ + "addl $32, %%esi \n\t" \ + "psrlq $32, %%mm1 \n\t" \ + "movd %%mm1, %%ecx \n\t" + +#define MULADDC_STOP \ + "emms \n\t" \ + "movl %4, %%ebx \n\t" \ + "movl %%ecx, %1 \n\t" \ + "movl %%edi, %2 \n\t" \ + "movl %%esi, %3 \n\t" \ + : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ + : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ + : "eax", "ebx", "ecx", "edx", "esi", "edi" \ + ); + +#else + +#define MULADDC_STOP \ + "movl %4, %%ebx \n\t" \ + "movl %%ecx, %1 \n\t" \ + "movl %%edi, %2 \n\t" \ + "movl %%esi, %3 \n\t" \ + : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ + : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ + : "eax", "ebx", "ecx", "edx", "esi", "edi" \ + ); +#endif /* SSE2 */ +#endif /* i386 */ + +#if defined(__amd64__) || defined (__x86_64__) + +#define MULADDC_INIT \ + asm( \ + "xorq %%r8, %%r8\n" + +#define MULADDC_CORE \ + "movq (%%rsi), %%rax\n" \ + "mulq %%rbx\n" \ + "addq $8, %%rsi\n" \ + "addq %%rcx, %%rax\n" \ + "movq %%r8, %%rcx\n" \ + "adcq $0, %%rdx\n" \ + "nop \n" \ + "addq %%rax, (%%rdi)\n" \ + "adcq %%rdx, %%rcx\n" \ + "addq $8, %%rdi\n" + +#define MULADDC_STOP \ + : "+c" (c), "+D" (d), "+S" (s), "+m" (*(uint64_t (*)[16]) d) \ + : "b" (b), "m" (*(const uint64_t (*)[16]) s) \ + : "rax", "rdx", "r8" \ + ); + +#endif /* AMD64 */ + +#if defined(__aarch64__) + +#define MULADDC_INIT \ + asm( + +#define MULADDC_CORE \ + "ldr x4, [%2], #8 \n\t" \ + "ldr x5, [%1] \n\t" \ + "mul x6, x4, %4 \n\t" \ + "umulh x7, x4, %4 \n\t" \ + "adds x5, x5, x6 \n\t" \ + "adc x7, x7, xzr \n\t" \ + "adds x5, x5, %0 \n\t" \ + "adc %0, x7, xzr \n\t" \ + "str x5, [%1], #8 \n\t" + +#define MULADDC_STOP \ + : "+r" (c), "+r" (d), "+r" (s), "+m" (*(uint64_t (*)[16]) d) \ + : "r" (b), "m" (*(const uint64_t (*)[16]) s) \ + : "x4", "x5", "x6", "x7", "cc" \ + ); + +#endif /* Aarch64 */ + +#if defined(__mc68020__) || defined(__mcpu32__) + +#define MULADDC_INIT \ + asm( \ + "movl %3, %%a2 \n\t" \ + "movl %4, %%a3 \n\t" \ + "movl %5, %%d3 \n\t" \ + "movl %6, %%d2 \n\t" \ + "moveq #0, %%d0 \n\t" + +#define MULADDC_CORE \ + "movel %%a2@+, %%d1 \n\t" \ + "mulul %%d2, %%d4:%%d1 \n\t" \ + "addl %%d3, %%d1 \n\t" \ + "addxl %%d0, %%d4 \n\t" \ + "moveq #0, %%d3 \n\t" \ + "addl %%d1, %%a3@+ \n\t" \ + "addxl %%d4, %%d3 \n\t" + +#define MULADDC_STOP \ + "movl %%d3, %0 \n\t" \ + "movl %%a3, %1 \n\t" \ + "movl %%a2, %2 \n\t" \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "d0", "d1", "d2", "d3", "d4", "a2", "a3" \ + ); + +#define MULADDC_HUIT \ + "movel %%a2@+, %%d1 \n\t" \ + "mulul %%d2, %%d4:%%d1 \n\t" \ + "addxl %%d3, %%d1 \n\t" \ + "addxl %%d0, %%d4 \n\t" \ + "addl %%d1, %%a3@+ \n\t" \ + "movel %%a2@+, %%d1 \n\t" \ + "mulul %%d2, %%d3:%%d1 \n\t" \ + "addxl %%d4, %%d1 \n\t" \ + "addxl %%d0, %%d3 \n\t" \ + "addl %%d1, %%a3@+ \n\t" \ + "movel %%a2@+, %%d1 \n\t" \ + "mulul %%d2, %%d4:%%d1 \n\t" \ + "addxl %%d3, %%d1 \n\t" \ + "addxl %%d0, %%d4 \n\t" \ + "addl %%d1, %%a3@+ \n\t" \ + "movel %%a2@+, %%d1 \n\t" \ + "mulul %%d2, %%d3:%%d1 \n\t" \ + "addxl %%d4, %%d1 \n\t" \ + "addxl %%d0, %%d3 \n\t" \ + "addl %%d1, %%a3@+ \n\t" \ + "movel %%a2@+, %%d1 \n\t" \ + "mulul %%d2, %%d4:%%d1 \n\t" \ + "addxl %%d3, %%d1 \n\t" \ + "addxl %%d0, %%d4 \n\t" \ + "addl %%d1, %%a3@+ \n\t" \ + "movel %%a2@+, %%d1 \n\t" \ + "mulul %%d2, %%d3:%%d1 \n\t" \ + "addxl %%d4, %%d1 \n\t" \ + "addxl %%d0, %%d3 \n\t" \ + "addl %%d1, %%a3@+ \n\t" \ + "movel %%a2@+, %%d1 \n\t" \ + "mulul %%d2, %%d4:%%d1 \n\t" \ + "addxl %%d3, %%d1 \n\t" \ + "addxl %%d0, %%d4 \n\t" \ + "addl %%d1, %%a3@+ \n\t" \ + "movel %%a2@+, %%d1 \n\t" \ + "mulul %%d2, %%d3:%%d1 \n\t" \ + "addxl %%d4, %%d1 \n\t" \ + "addxl %%d0, %%d3 \n\t" \ + "addl %%d1, %%a3@+ \n\t" \ + "addxl %%d0, %%d3 \n\t" + +#endif /* MC68000 */ + +#if defined(__powerpc64__) || defined(__ppc64__) + +#if defined(__MACH__) && defined(__APPLE__) + +#define MULADDC_INIT \ + asm( \ + "ld r3, %3 \n\t" \ + "ld r4, %4 \n\t" \ + "ld r5, %5 \n\t" \ + "ld r6, %6 \n\t" \ + "addi r3, r3, -8 \n\t" \ + "addi r4, r4, -8 \n\t" \ + "addic r5, r5, 0 \n\t" + +#define MULADDC_CORE \ + "ldu r7, 8(r3) \n\t" \ + "mulld r8, r7, r6 \n\t" \ + "mulhdu r9, r7, r6 \n\t" \ + "adde r8, r8, r5 \n\t" \ + "ld r7, 8(r4) \n\t" \ + "addze r5, r9 \n\t" \ + "addc r8, r8, r7 \n\t" \ + "stdu r8, 8(r4) \n\t" + +#define MULADDC_STOP \ + "addze r5, r5 \n\t" \ + "addi r4, r4, 8 \n\t" \ + "addi r3, r3, 8 \n\t" \ + "std r5, %0 \n\t" \ + "std r4, %1 \n\t" \ + "std r3, %2 \n\t" \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ + ); + + +#else /* __MACH__ && __APPLE__ */ + +#define MULADDC_INIT \ + asm( \ + "ld %%r3, %3 \n\t" \ + "ld %%r4, %4 \n\t" \ + "ld %%r5, %5 \n\t" \ + "ld %%r6, %6 \n\t" \ + "addi %%r3, %%r3, -8 \n\t" \ + "addi %%r4, %%r4, -8 \n\t" \ + "addic %%r5, %%r5, 0 \n\t" + +#define MULADDC_CORE \ + "ldu %%r7, 8(%%r3) \n\t" \ + "mulld %%r8, %%r7, %%r6 \n\t" \ + "mulhdu %%r9, %%r7, %%r6 \n\t" \ + "adde %%r8, %%r8, %%r5 \n\t" \ + "ld %%r7, 8(%%r4) \n\t" \ + "addze %%r5, %%r9 \n\t" \ + "addc %%r8, %%r8, %%r7 \n\t" \ + "stdu %%r8, 8(%%r4) \n\t" + +#define MULADDC_STOP \ + "addze %%r5, %%r5 \n\t" \ + "addi %%r4, %%r4, 8 \n\t" \ + "addi %%r3, %%r3, 8 \n\t" \ + "std %%r5, %0 \n\t" \ + "std %%r4, %1 \n\t" \ + "std %%r3, %2 \n\t" \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ + ); + +#endif /* __MACH__ && __APPLE__ */ + +#elif defined(__powerpc__) || defined(__ppc__) /* end PPC64/begin PPC32 */ + +#if defined(__MACH__) && defined(__APPLE__) + +#define MULADDC_INIT \ + asm( \ + "lwz r3, %3 \n\t" \ + "lwz r4, %4 \n\t" \ + "lwz r5, %5 \n\t" \ + "lwz r6, %6 \n\t" \ + "addi r3, r3, -4 \n\t" \ + "addi r4, r4, -4 \n\t" \ + "addic r5, r5, 0 \n\t" + +#define MULADDC_CORE \ + "lwzu r7, 4(r3) \n\t" \ + "mullw r8, r7, r6 \n\t" \ + "mulhwu r9, r7, r6 \n\t" \ + "adde r8, r8, r5 \n\t" \ + "lwz r7, 4(r4) \n\t" \ + "addze r5, r9 \n\t" \ + "addc r8, r8, r7 \n\t" \ + "stwu r8, 4(r4) \n\t" + +#define MULADDC_STOP \ + "addze r5, r5 \n\t" \ + "addi r4, r4, 4 \n\t" \ + "addi r3, r3, 4 \n\t" \ + "stw r5, %0 \n\t" \ + "stw r4, %1 \n\t" \ + "stw r3, %2 \n\t" \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ + ); + +#else /* __MACH__ && __APPLE__ */ + +#define MULADDC_INIT \ + asm( \ + "lwz %%r3, %3 \n\t" \ + "lwz %%r4, %4 \n\t" \ + "lwz %%r5, %5 \n\t" \ + "lwz %%r6, %6 \n\t" \ + "addi %%r3, %%r3, -4 \n\t" \ + "addi %%r4, %%r4, -4 \n\t" \ + "addic %%r5, %%r5, 0 \n\t" + +#define MULADDC_CORE \ + "lwzu %%r7, 4(%%r3) \n\t" \ + "mullw %%r8, %%r7, %%r6 \n\t" \ + "mulhwu %%r9, %%r7, %%r6 \n\t" \ + "adde %%r8, %%r8, %%r5 \n\t" \ + "lwz %%r7, 4(%%r4) \n\t" \ + "addze %%r5, %%r9 \n\t" \ + "addc %%r8, %%r8, %%r7 \n\t" \ + "stwu %%r8, 4(%%r4) \n\t" + +#define MULADDC_STOP \ + "addze %%r5, %%r5 \n\t" \ + "addi %%r4, %%r4, 4 \n\t" \ + "addi %%r3, %%r3, 4 \n\t" \ + "stw %%r5, %0 \n\t" \ + "stw %%r4, %1 \n\t" \ + "stw %%r3, %2 \n\t" \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ + ); + +#endif /* __MACH__ && __APPLE__ */ + +#endif /* PPC32 */ + +/* + * The Sparc(64) assembly is reported to be broken. + * Disable it for now, until we're able to fix it. + */ +#if 0 && defined(__sparc__) +#if defined(__sparc64__) + +#define MULADDC_INIT \ + asm( \ + "ldx %3, %%o0 \n\t" \ + "ldx %4, %%o1 \n\t" \ + "ld %5, %%o2 \n\t" \ + "ld %6, %%o3 \n\t" + +#define MULADDC_CORE \ + "ld [%%o0], %%o4 \n\t" \ + "inc 4, %%o0 \n\t" \ + "ld [%%o1], %%o5 \n\t" \ + "umul %%o3, %%o4, %%o4 \n\t" \ + "addcc %%o4, %%o2, %%o4 \n\t" \ + "rd %%y, %%g1 \n\t" \ + "addx %%g1, 0, %%g1 \n\t" \ + "addcc %%o4, %%o5, %%o4 \n\t" \ + "st %%o4, [%%o1] \n\t" \ + "addx %%g1, 0, %%o2 \n\t" \ + "inc 4, %%o1 \n\t" + + #define MULADDC_STOP \ + "st %%o2, %0 \n\t" \ + "stx %%o1, %1 \n\t" \ + "stx %%o0, %2 \n\t" \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "g1", "o0", "o1", "o2", "o3", "o4", \ + "o5" \ + ); + +#else /* __sparc64__ */ + +#define MULADDC_INIT \ + asm( \ + "ld %3, %%o0 \n\t" \ + "ld %4, %%o1 \n\t" \ + "ld %5, %%o2 \n\t" \ + "ld %6, %%o3 \n\t" + +#define MULADDC_CORE \ + "ld [%%o0], %%o4 \n\t" \ + "inc 4, %%o0 \n\t" \ + "ld [%%o1], %%o5 \n\t" \ + "umul %%o3, %%o4, %%o4 \n\t" \ + "addcc %%o4, %%o2, %%o4 \n\t" \ + "rd %%y, %%g1 \n\t" \ + "addx %%g1, 0, %%g1 \n\t" \ + "addcc %%o4, %%o5, %%o4 \n\t" \ + "st %%o4, [%%o1] \n\t" \ + "addx %%g1, 0, %%o2 \n\t" \ + "inc 4, %%o1 \n\t" + +#define MULADDC_STOP \ + "st %%o2, %0 \n\t" \ + "st %%o1, %1 \n\t" \ + "st %%o0, %2 \n\t" \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "g1", "o0", "o1", "o2", "o3", "o4", \ + "o5" \ + ); + +#endif /* __sparc64__ */ +#endif /* __sparc__ */ + +#if defined(__microblaze__) || defined(microblaze) + +#define MULADDC_INIT \ + asm( \ + "lwi r3, %3 \n\t" \ + "lwi r4, %4 \n\t" \ + "lwi r5, %5 \n\t" \ + "lwi r6, %6 \n\t" \ + "andi r7, r6, 0xffff \n\t" \ + "bsrli r6, r6, 16 \n\t" + +#if(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#define MULADDC_LHUI \ + "lhui r9, r3, 0 \n\t" \ + "addi r3, r3, 2 \n\t" \ + "lhui r8, r3, 0 \n\t" +#else +#define MULADDC_LHUI \ + "lhui r8, r3, 0 \n\t" \ + "addi r3, r3, 2 \n\t" \ + "lhui r9, r3, 0 \n\t" +#endif + +#define MULADDC_CORE \ + MULADDC_LHUI \ + "addi r3, r3, 2 \n\t" \ + "mul r10, r9, r6 \n\t" \ + "mul r11, r8, r7 \n\t" \ + "mul r12, r9, r7 \n\t" \ + "mul r13, r8, r6 \n\t" \ + "bsrli r8, r10, 16 \n\t" \ + "bsrli r9, r11, 16 \n\t" \ + "add r13, r13, r8 \n\t" \ + "add r13, r13, r9 \n\t" \ + "bslli r10, r10, 16 \n\t" \ + "bslli r11, r11, 16 \n\t" \ + "add r12, r12, r10 \n\t" \ + "addc r13, r13, r0 \n\t" \ + "add r12, r12, r11 \n\t" \ + "addc r13, r13, r0 \n\t" \ + "lwi r10, r4, 0 \n\t" \ + "add r12, r12, r10 \n\t" \ + "addc r13, r13, r0 \n\t" \ + "add r12, r12, r5 \n\t" \ + "addc r5, r13, r0 \n\t" \ + "swi r12, r4, 0 \n\t" \ + "addi r4, r4, 4 \n\t" + +#define MULADDC_STOP \ + "swi r5, %0 \n\t" \ + "swi r4, %1 \n\t" \ + "swi r3, %2 \n\t" \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "r3", "r4", "r5", "r6", "r7", "r8", \ + "r9", "r10", "r11", "r12", "r13" \ + ); + +#endif /* MicroBlaze */ + +#if defined(__tricore__) + +#define MULADDC_INIT \ + asm( \ + "ld.a %%a2, %3 \n\t" \ + "ld.a %%a3, %4 \n\t" \ + "ld.w %%d4, %5 \n\t" \ + "ld.w %%d1, %6 \n\t" \ + "xor %%d5, %%d5 \n\t" + +#define MULADDC_CORE \ + "ld.w %%d0, [%%a2+] \n\t" \ + "madd.u %%e2, %%e4, %%d0, %%d1 \n\t" \ + "ld.w %%d0, [%%a3] \n\t" \ + "addx %%d2, %%d2, %%d0 \n\t" \ + "addc %%d3, %%d3, 0 \n\t" \ + "mov %%d4, %%d3 \n\t" \ + "st.w [%%a3+], %%d2 \n\t" + +#define MULADDC_STOP \ + "st.w %0, %%d4 \n\t" \ + "st.a %1, %%a3 \n\t" \ + "st.a %2, %%a2 \n\t" \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "d0", "d1", "e2", "d4", "a2", "a3" \ + ); + +#endif /* TriCore */ + +/* + * Note, gcc -O0 by default uses r7 for the frame pointer, so it complains about + * our use of r7 below, unless -fomit-frame-pointer is passed. + * + * On the other hand, -fomit-frame-pointer is implied by any -Ox options with + * x !=0, which we can detect using __OPTIMIZE__ (which is also defined by + * clang and armcc5 under the same conditions). + * + * So, only use the optimized assembly below for optimized build, which avoids + * the build error and is pretty reasonable anyway. + */ +#if defined(__GNUC__) && !defined(__OPTIMIZE__) +#define MULADDC_CANNOT_USE_R7 +#endif + +#if defined(__arm__) && !defined(MULADDC_CANNOT_USE_R7) + +#if defined(__thumb__) && !defined(__thumb2__) +#if !defined(__ARMCC_VERSION) && !defined(__clang__) \ + && !defined(__llvm__) && !defined(__INTEL_COMPILER) +/* + * Thumb 1 ISA. This code path has only been tested successfully on gcc; + * it does not compile on clang or armclang. + * + * Other compilers which define __GNUC__ may not work. The above macro + * attempts to exclude these untested compilers. + */ + +#define MULADDC_INIT \ + asm( \ + "ldr r0, %3 \n\t" \ + "ldr r1, %4 \n\t" \ + "ldr r2, %5 \n\t" \ + "ldr r3, %6 \n\t" \ + "lsr r7, r3, #16 \n\t" \ + "mov r9, r7 \n\t" \ + "lsl r7, r3, #16 \n\t" \ + "lsr r7, r7, #16 \n\t" \ + "mov r8, r7 \n\t" + +#define MULADDC_CORE \ + "ldmia r0!, {r6} \n\t" \ + "lsr r7, r6, #16 \n\t" \ + "lsl r6, r6, #16 \n\t" \ + "lsr r6, r6, #16 \n\t" \ + "mov r4, r8 \n\t" \ + "mul r4, r6 \n\t" \ + "mov r3, r9 \n\t" \ + "mul r6, r3 \n\t" \ + "mov r5, r9 \n\t" \ + "mul r5, r7 \n\t" \ + "mov r3, r8 \n\t" \ + "mul r7, r3 \n\t" \ + "lsr r3, r6, #16 \n\t" \ + "add r5, r5, r3 \n\t" \ + "lsr r3, r7, #16 \n\t" \ + "add r5, r5, r3 \n\t" \ + "add r4, r4, r2 \n\t" \ + "mov r2, #0 \n\t" \ + "adc r5, r2 \n\t" \ + "lsl r3, r6, #16 \n\t" \ + "add r4, r4, r3 \n\t" \ + "adc r5, r2 \n\t" \ + "lsl r3, r7, #16 \n\t" \ + "add r4, r4, r3 \n\t" \ + "adc r5, r2 \n\t" \ + "ldr r3, [r1] \n\t" \ + "add r4, r4, r3 \n\t" \ + "adc r2, r5 \n\t" \ + "stmia r1!, {r4} \n\t" + +#define MULADDC_STOP \ + "str r2, %0 \n\t" \ + "str r1, %1 \n\t" \ + "str r0, %2 \n\t" \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "r0", "r1", "r2", "r3", "r4", "r5", \ + "r6", "r7", "r8", "r9", "cc" \ + ); + +#endif /* Compiler is gcc */ + +#elif (__ARM_ARCH >= 6) && \ + defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1) + +#define MULADDC_INIT \ + asm( + +#define MULADDC_CORE \ + "ldr r0, [%0], #4 \n\t" \ + "ldr r1, [%1] \n\t" \ + "umaal r1, %2, %3, r0 \n\t" \ + "str r1, [%1], #4 \n\t" + +#define MULADDC_STOP \ + : "=r" (s), "=r" (d), "=r" (c) \ + : "r" (b), "0" (s), "1" (d), "2" (c) \ + : "r0", "r1", "memory" \ + ); + +#else + +#define MULADDC_INIT \ + asm( \ + "ldr r0, %3 \n\t" \ + "ldr r1, %4 \n\t" \ + "ldr r2, %5 \n\t" \ + "ldr r3, %6 \n\t" + +#define MULADDC_CORE \ + "ldr r4, [r0], #4 \n\t" \ + "mov r5, #0 \n\t" \ + "ldr r6, [r1] \n\t" \ + "umlal r2, r5, r3, r4 \n\t" \ + "adds r7, r6, r2 \n\t" \ + "adc r2, r5, #0 \n\t" \ + "str r7, [r1], #4 \n\t" + +#define MULADDC_STOP \ + "str r2, %0 \n\t" \ + "str r1, %1 \n\t" \ + "str r0, %2 \n\t" \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "r0", "r1", "r2", "r3", "r4", "r5", \ + "r6", "r7", "cc" \ + ); + +#endif /* Thumb */ + +#endif /* ARMv3 */ + +#if defined(__alpha__) + +#define MULADDC_INIT \ + asm( \ + "ldq $1, %3 \n\t" \ + "ldq $2, %4 \n\t" \ + "ldq $3, %5 \n\t" \ + "ldq $4, %6 \n\t" + +#define MULADDC_CORE \ + "ldq $6, 0($1) \n\t" \ + "addq $1, 8, $1 \n\t" \ + "mulq $6, $4, $7 \n\t" \ + "umulh $6, $4, $6 \n\t" \ + "addq $7, $3, $7 \n\t" \ + "cmpult $7, $3, $3 \n\t" \ + "ldq $5, 0($2) \n\t" \ + "addq $7, $5, $7 \n\t" \ + "cmpult $7, $5, $5 \n\t" \ + "stq $7, 0($2) \n\t" \ + "addq $2, 8, $2 \n\t" \ + "addq $6, $3, $3 \n\t" \ + "addq $5, $3, $3 \n\t" + +#define MULADDC_STOP \ + "stq $3, %0 \n\t" \ + "stq $2, %1 \n\t" \ + "stq $1, %2 \n\t" \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "$1", "$2", "$3", "$4", "$5", "$6", "$7" \ + ); +#endif /* Alpha */ + +#if defined(__mips__) && !defined(__mips64) + +#define MULADDC_INIT \ + asm( \ + "lw $10, %3 \n\t" \ + "lw $11, %4 \n\t" \ + "lw $12, %5 \n\t" \ + "lw $13, %6 \n\t" + +#define MULADDC_CORE \ + "lw $14, 0($10) \n\t" \ + "multu $13, $14 \n\t" \ + "addi $10, $10, 4 \n\t" \ + "mflo $14 \n\t" \ + "mfhi $9 \n\t" \ + "addu $14, $12, $14 \n\t" \ + "lw $15, 0($11) \n\t" \ + "sltu $12, $14, $12 \n\t" \ + "addu $15, $14, $15 \n\t" \ + "sltu $14, $15, $14 \n\t" \ + "addu $12, $12, $9 \n\t" \ + "sw $15, 0($11) \n\t" \ + "addu $12, $12, $14 \n\t" \ + "addi $11, $11, 4 \n\t" + +#define MULADDC_STOP \ + "sw $12, %0 \n\t" \ + "sw $11, %1 \n\t" \ + "sw $10, %2 \n\t" \ + : "=m" (c), "=m" (d), "=m" (s) \ + : "m" (s), "m" (d), "m" (c), "m" (b) \ + : "$9", "$10", "$11", "$12", "$13", "$14", "$15", "lo", "hi" \ + ); + +#endif /* MIPS */ +#endif /* GNUC */ + +#if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) + +#define MULADDC_INIT \ + __asm mov esi, s \ + __asm mov edi, d \ + __asm mov ecx, c \ + __asm mov ebx, b + +#define MULADDC_CORE \ + __asm lodsd \ + __asm mul ebx \ + __asm add eax, ecx \ + __asm adc edx, 0 \ + __asm add eax, [edi] \ + __asm adc edx, 0 \ + __asm mov ecx, edx \ + __asm stosd + +#if defined(MBEDTLS_HAVE_SSE2) + +#define EMIT __asm _emit + +#define MULADDC_HUIT \ + EMIT 0x0F EMIT 0x6E EMIT 0xC9 \ + EMIT 0x0F EMIT 0x6E EMIT 0xC3 \ + EMIT 0x0F EMIT 0x6E EMIT 0x1F \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ + EMIT 0x0F EMIT 0x6E EMIT 0x16 \ + EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ + EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x04 \ + EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ + EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x08 \ + EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ + EMIT 0x0F EMIT 0x6E EMIT 0x7E EMIT 0x0C \ + EMIT 0x0F EMIT 0xF4 EMIT 0xF8 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ + EMIT 0x0F EMIT 0x6E EMIT 0x5F EMIT 0x04 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xDC \ + EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x08 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xEE \ + EMIT 0x0F EMIT 0x6E EMIT 0x67 EMIT 0x0C \ + EMIT 0x0F EMIT 0xD4 EMIT 0xFC \ + EMIT 0x0F EMIT 0x7E EMIT 0x0F \ + EMIT 0x0F EMIT 0x6E EMIT 0x56 EMIT 0x10 \ + EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x14 \ + EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ + EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x18 \ + EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x04 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0x6E EMIT 0x5E EMIT 0x1C \ + EMIT 0x0F EMIT 0xF4 EMIT 0xD8 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCD \ + EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x10 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xD5 \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x08 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCF \ + EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x14 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xE5 \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x0C \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ + EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x18 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xF5 \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x10 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCC \ + EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x1C \ + EMIT 0x0F EMIT 0xD4 EMIT 0xDD \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x14 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCE \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x18 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ + EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x1C \ + EMIT 0x83 EMIT 0xC7 EMIT 0x20 \ + EMIT 0x83 EMIT 0xC6 EMIT 0x20 \ + EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ + EMIT 0x0F EMIT 0x7E EMIT 0xC9 + +#define MULADDC_STOP \ + EMIT 0x0F EMIT 0x77 \ + __asm mov c, ecx \ + __asm mov d, edi \ + __asm mov s, esi \ + +#else + +#define MULADDC_STOP \ + __asm mov c, ecx \ + __asm mov d, edi \ + __asm mov s, esi \ + +#endif /* SSE2 */ +#endif /* MSVC */ + +#endif /* MBEDTLS_HAVE_ASM */ + +#if !defined(MULADDC_CORE) +#if defined(MBEDTLS_HAVE_UDBL) + +#define MULADDC_INIT \ +{ \ + mbedtls_t_udbl r; \ + mbedtls_mpi_uint r0, r1; + +#define MULADDC_CORE \ + r = *(s++) * (mbedtls_t_udbl) b; \ + r0 = (mbedtls_mpi_uint) r; \ + r1 = (mbedtls_mpi_uint)( r >> biL ); \ + r0 += c; r1 += (r0 < c); \ + r0 += *d; r1 += (r0 < *d); \ + c = r1; *(d++) = r0; + +#define MULADDC_STOP \ +} + +#else +#define MULADDC_INIT \ +{ \ + mbedtls_mpi_uint s0, s1, b0, b1; \ + mbedtls_mpi_uint r0, r1, rx, ry; \ + b0 = ( b << biH ) >> biH; \ + b1 = ( b >> biH ); + +#define MULADDC_CORE \ + s0 = ( *s << biH ) >> biH; \ + s1 = ( *s >> biH ); s++; \ + rx = s0 * b1; r0 = s0 * b0; \ + ry = s1 * b0; r1 = s1 * b1; \ + r1 += ( rx >> biH ); \ + r1 += ( ry >> biH ); \ + rx <<= biH; ry <<= biH; \ + r0 += rx; r1 += (r0 < rx); \ + r0 += ry; r1 += (r0 < ry); \ + r0 += c; r1 += (r0 < c); \ + r0 += *d; r1 += (r0 < *d); \ + c = r1; *(d++) = r0; + +#define MULADDC_STOP \ +} + +#endif /* C (generic) */ +#endif /* C (longlong) */ + +/* *INDENT-ON* */ +#endif /* bn_mul.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/camellia.h b/ext/opcua_client/mbedtls/include/mbedtls/camellia.h new file mode 100644 index 0000000..be8c515 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/camellia.h @@ -0,0 +1,314 @@ +/** + * \file camellia.h + * + * \brief Camellia block cipher + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_CAMELLIA_H +#define MBEDTLS_CAMELLIA_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +#include "mbedtls/platform_util.h" + +#define MBEDTLS_CAMELLIA_ENCRYPT 1 +#define MBEDTLS_CAMELLIA_DECRYPT 0 + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#define MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH MBEDTLS_DEPRECATED_NUMERIC_CONSTANT(-0x0024) +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ +/** Bad input data. */ +#define MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA -0x0024 + +/** Invalid data input length. */ +#define MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH -0x0026 + +/* MBEDTLS_ERR_CAMELLIA_HW_ACCEL_FAILED is deprecated and should not be used. + */ +/** Camellia hardware accelerator failed. */ +#define MBEDTLS_ERR_CAMELLIA_HW_ACCEL_FAILED -0x0027 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_CAMELLIA_ALT) +// Regular implementation +// + +/** + * \brief CAMELLIA context structure + */ +typedef struct mbedtls_camellia_context { + int nr; /*!< number of rounds */ + uint32_t rk[68]; /*!< CAMELLIA round keys */ +} +mbedtls_camellia_context; + +#else /* MBEDTLS_CAMELLIA_ALT */ +#include "camellia_alt.h" +#endif /* MBEDTLS_CAMELLIA_ALT */ + +/** + * \brief Initialize a CAMELLIA context. + * + * \param ctx The CAMELLIA context to be initialized. + * This must not be \c NULL. + */ +void mbedtls_camellia_init(mbedtls_camellia_context *ctx); + +/** + * \brief Clear a CAMELLIA context. + * + * \param ctx The CAMELLIA context to be cleared. This may be \c NULL, + * in which case this function returns immediately. If it is not + * \c NULL, it must be initialized. + */ +void mbedtls_camellia_free(mbedtls_camellia_context *ctx); + +/** + * \brief Perform a CAMELLIA key schedule operation for encryption. + * + * \param ctx The CAMELLIA context to use. This must be initialized. + * \param key The encryption key to use. This must be a readable buffer + * of size \p keybits Bits. + * \param keybits The length of \p key in Bits. This must be either \c 128, + * \c 192 or \c 256. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_camellia_setkey_enc(mbedtls_camellia_context *ctx, + const unsigned char *key, + unsigned int keybits); + +/** + * \brief Perform a CAMELLIA key schedule operation for decryption. + * + * \param ctx The CAMELLIA context to use. This must be initialized. + * \param key The decryption key. This must be a readable buffer + * of size \p keybits Bits. + * \param keybits The length of \p key in Bits. This must be either \c 128, + * \c 192 or \c 256. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_camellia_setkey_dec(mbedtls_camellia_context *ctx, + const unsigned char *key, + unsigned int keybits); + +/** + * \brief Perform a CAMELLIA-ECB block encryption/decryption operation. + * + * \param ctx The CAMELLIA context to use. This must be initialized + * and bound to a key. + * \param mode The mode of operation. This must be either + * #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. + * \param input The input block. This must be a readable buffer + * of size \c 16 Bytes. + * \param output The output block. This must be a writable buffer + * of size \c 16 Bytes. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_camellia_crypt_ecb(mbedtls_camellia_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16]); + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/** + * \brief Perform a CAMELLIA-CBC buffer encryption/decryption operation. + * + * \note Upon exit, the content of the IV is updated so that you can + * call the function same function again on the following + * block(s) of data and get the same result as if it was + * encrypted in one call. This allows a "streaming" usage. + * If on the other hand you need to retain the contents of the + * IV, you should either save it manually or use the cipher + * module instead. + * + * \param ctx The CAMELLIA context to use. This must be initialized + * and bound to a key. + * \param mode The mode of operation. This must be either + * #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. + * \param length The length in Bytes of the input data \p input. + * This must be a multiple of \c 16 Bytes. + * \param iv The initialization vector. This must be a read/write buffer + * of length \c 16 Bytes. It is updated to allow streaming + * use as explained above. + * \param input The buffer holding the input data. This must point to a + * readable buffer of length \p length Bytes. + * \param output The buffer holding the output data. This must point to a + * writable buffer of length \p length Bytes. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_camellia_crypt_cbc(mbedtls_camellia_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +/** + * \brief Perform a CAMELLIA-CFB128 buffer encryption/decryption + * operation. + * + * \note Due to the nature of CFB mode, you should use the same + * key for both encryption and decryption. In particular, calls + * to this function should be preceded by a key-schedule via + * mbedtls_camellia_setkey_enc() regardless of whether \p mode + * is #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. + * + * \note Upon exit, the content of the IV is updated so that you can + * call the function same function again on the following + * block(s) of data and get the same result as if it was + * encrypted in one call. This allows a "streaming" usage. + * If on the other hand you need to retain the contents of the + * IV, you should either save it manually or use the cipher + * module instead. + * + * \param ctx The CAMELLIA context to use. This must be initialized + * and bound to a key. + * \param mode The mode of operation. This must be either + * #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. + * \param length The length of the input data \p input. Any value is allowed. + * \param iv_off The current offset in the IV. This must be smaller + * than \c 16 Bytes. It is updated after this call to allow + * the aforementioned streaming usage. + * \param iv The initialization vector. This must be a read/write buffer + * of length \c 16 Bytes. It is updated after this call to + * allow the aforementioned streaming usage. + * \param input The buffer holding the input data. This must be a readable + * buffer of size \p length Bytes. + * \param output The buffer to hold the output data. This must be a writable + * buffer of length \p length Bytes. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_camellia_crypt_cfb128(mbedtls_camellia_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +/** + * \brief Perform a CAMELLIA-CTR buffer encryption/decryption operation. + * + * *note Due to the nature of CTR mode, you should use the same + * key for both encryption and decryption. In particular, calls + * to this function should be preceded by a key-schedule via + * mbedtls_camellia_setkey_enc() regardless of whether the mode + * is #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. + * + * \warning You must never reuse a nonce value with the same key. Doing so + * would void the encryption for the two messages encrypted with + * the same nonce and key. + * + * There are two common strategies for managing nonces with CTR: + * + * 1. You can handle everything as a single message processed over + * successive calls to this function. In that case, you want to + * set \p nonce_counter and \p nc_off to 0 for the first call, and + * then preserve the values of \p nonce_counter, \p nc_off and \p + * stream_block across calls to this function as they will be + * updated by this function. + * + * With this strategy, you must not encrypt more than 2**128 + * blocks of data with the same key. + * + * 2. You can encrypt separate messages by dividing the \p + * nonce_counter buffer in two areas: the first one used for a + * per-message nonce, handled by yourself, and the second one + * updated by this function internally. + * + * For example, you might reserve the first \c 12 Bytes for the + * per-message nonce, and the last \c 4 Bytes for internal use. + * In that case, before calling this function on a new message you + * need to set the first \c 12 Bytes of \p nonce_counter to your + * chosen nonce value, the last four to \c 0, and \p nc_off to \c 0 + * (which will cause \p stream_block to be ignored). That way, you + * can encrypt at most \c 2**96 messages of up to \c 2**32 blocks + * each with the same key. + * + * The per-message nonce (or information sufficient to reconstruct + * it) needs to be communicated with the ciphertext and must be + * unique. The recommended way to ensure uniqueness is to use a + * message counter. An alternative is to generate random nonces, + * but this limits the number of messages that can be securely + * encrypted: for example, with 96-bit random nonces, you should + * not encrypt more than 2**32 messages with the same key. + * + * Note that for both strategies, sizes are measured in blocks and + * that a CAMELLIA block is \c 16 Bytes. + * + * \warning Upon return, \p stream_block contains sensitive data. Its + * content must not be written to insecure storage and should be + * securely discarded as soon as it's no longer needed. + * + * \param ctx The CAMELLIA context to use. This must be initialized + * and bound to a key. + * \param length The length of the input data \p input in Bytes. + * Any value is allowed. + * \param nc_off The offset in the current \p stream_block (for resuming + * within current cipher stream). The offset pointer to + * should be \c 0 at the start of a stream. It is updated + * at the end of this call. + * \param nonce_counter The 128-bit nonce and counter. This must be a read/write + * buffer of length \c 16 Bytes. + * \param stream_block The saved stream-block for resuming. This must be a + * read/write buffer of length \c 16 Bytes. + * \param input The input data stream. This must be a readable buffer of + * size \p length Bytes. + * \param output The output data stream. This must be a writable buffer + * of size \p length Bytes. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_camellia_crypt_ctr(mbedtls_camellia_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[16], + unsigned char stream_block[16], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int mbedtls_camellia_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* camellia.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ccm.h b/ext/opcua_client/mbedtls/include/mbedtls/ccm.h new file mode 100644 index 0000000..adb14cc --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ccm.h @@ -0,0 +1,298 @@ +/** + * \file ccm.h + * + * \brief This file provides an API for the CCM authenticated encryption + * mode for block ciphers. + * + * CCM combines Counter mode encryption with CBC-MAC authentication + * for 128-bit block ciphers. + * + * Input to CCM includes the following elements: + *
  • Payload - data that is both authenticated and encrypted.
  • + *
  • Associated data (Adata) - data that is authenticated but not + * encrypted, For example, a header.
  • + *
  • Nonce - A unique value that is assigned to the payload and the + * associated data.
+ * + * Definition of CCM: + * http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf + * RFC 3610 "Counter with CBC-MAC (CCM)" + * + * Related: + * RFC 5116 "An Interface and Algorithms for Authenticated Encryption" + * + * Definition of CCM*: + * IEEE 802.15.4 - IEEE Standard for Local and metropolitan area networks + * Integer representation is fixed most-significant-octet-first order and + * the representation of octets is most-significant-bit-first order. This is + * consistent with RFC 3610. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_CCM_H +#define MBEDTLS_CCM_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/cipher.h" + +/** Bad input parameters to the function. */ +#define MBEDTLS_ERR_CCM_BAD_INPUT -0x000D +/** Authenticated decryption failed. */ +#define MBEDTLS_ERR_CCM_AUTH_FAILED -0x000F + +/* MBEDTLS_ERR_CCM_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** CCM hardware accelerator failed. */ +#define MBEDTLS_ERR_CCM_HW_ACCEL_FAILED -0x0011 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_CCM_ALT) +// Regular implementation +// + +/** + * \brief The CCM context-type definition. The CCM context is passed + * to the APIs called. + */ +typedef struct mbedtls_ccm_context { + mbedtls_cipher_context_t cipher_ctx; /*!< The cipher context used. */ +} +mbedtls_ccm_context; + +#else /* MBEDTLS_CCM_ALT */ +#include "ccm_alt.h" +#endif /* MBEDTLS_CCM_ALT */ + +/** + * \brief This function initializes the specified CCM context, + * to make references valid, and prepare the context + * for mbedtls_ccm_setkey() or mbedtls_ccm_free(). + * + * \param ctx The CCM context to initialize. This must not be \c NULL. + */ +void mbedtls_ccm_init(mbedtls_ccm_context *ctx); + +/** + * \brief This function initializes the CCM context set in the + * \p ctx parameter and sets the encryption key. + * + * \param ctx The CCM context to initialize. This must be an initialized + * context. + * \param cipher The 128-bit block cipher to use. + * \param key The encryption key. This must not be \c NULL. + * \param keybits The key size in bits. This must be acceptable by the cipher. + * + * \return \c 0 on success. + * \return A CCM or cipher-specific error code on failure. + */ +int mbedtls_ccm_setkey(mbedtls_ccm_context *ctx, + mbedtls_cipher_id_t cipher, + const unsigned char *key, + unsigned int keybits); + +/** + * \brief This function releases and clears the specified CCM context + * and underlying cipher sub-context. + * + * \param ctx The CCM context to clear. If this is \c NULL, the function + * has no effect. Otherwise, this must be initialized. + */ +void mbedtls_ccm_free(mbedtls_ccm_context *ctx); + +/** + * \brief This function encrypts a buffer using CCM. + * + * \note The tag is written to a separate buffer. To concatenate + * the \p tag with the \p output, as done in RFC-3610: + * Counter with CBC-MAC (CCM), use + * \p tag = \p output + \p length, and make sure that the + * output buffer is at least \p length + \p tag_len wide. + * + * \param ctx The CCM context to use for encryption. This must be + * initialized and bound to a key. + * \param length The length of the input data in Bytes. + * \param iv The initialization vector (nonce). This must be a readable + * buffer of at least \p iv_len Bytes. + * \param iv_len The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, + * or 13. The length L of the message length field is + * 15 - \p iv_len. + * \param add The additional data field. If \p add_len is greater than + * zero, \p add must be a readable buffer of at least that + * length. + * \param add_len The length of additional data in Bytes. + * This must be less than `2^16 - 2^8`. + * \param input The buffer holding the input data. If \p length is greater + * than zero, \p input must be a readable buffer of at least + * that length. + * \param output The buffer holding the output data. If \p length is greater + * than zero, \p output must be a writable buffer of at least + * that length. + * \param tag The buffer holding the authentication field. This must be a + * writable buffer of at least \p tag_len Bytes. + * \param tag_len The length of the authentication field to generate in Bytes: + * 4, 6, 8, 10, 12, 14 or 16. + * + * \return \c 0 on success. + * \return A CCM or cipher-specific error code on failure. + */ +int mbedtls_ccm_encrypt_and_tag(mbedtls_ccm_context *ctx, size_t length, + const unsigned char *iv, size_t iv_len, + const unsigned char *add, size_t add_len, + const unsigned char *input, unsigned char *output, + unsigned char *tag, size_t tag_len); + +/** + * \brief This function encrypts a buffer using CCM*. + * + * \note The tag is written to a separate buffer. To concatenate + * the \p tag with the \p output, as done in RFC-3610: + * Counter with CBC-MAC (CCM), use + * \p tag = \p output + \p length, and make sure that the + * output buffer is at least \p length + \p tag_len wide. + * + * \note When using this function in a variable tag length context, + * the tag length has to be encoded into the \p iv passed to + * this function. + * + * \param ctx The CCM context to use for encryption. This must be + * initialized and bound to a key. + * \param length The length of the input data in Bytes. + * \param iv The initialization vector (nonce). This must be a readable + * buffer of at least \p iv_len Bytes. + * \param iv_len The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, + * or 13. The length L of the message length field is + * 15 - \p iv_len. + * \param add The additional data field. This must be a readable buffer of + * at least \p add_len Bytes. + * \param add_len The length of additional data in Bytes. + * This must be less than 2^16 - 2^8. + * \param input The buffer holding the input data. If \p length is greater + * than zero, \p input must be a readable buffer of at least + * that length. + * \param output The buffer holding the output data. If \p length is greater + * than zero, \p output must be a writable buffer of at least + * that length. + * \param tag The buffer holding the authentication field. This must be a + * writable buffer of at least \p tag_len Bytes. + * \param tag_len The length of the authentication field to generate in Bytes: + * 0, 4, 6, 8, 10, 12, 14 or 16. + * + * \warning Passing \c 0 as \p tag_len means that the message is no + * longer authenticated. + * + * \return \c 0 on success. + * \return A CCM or cipher-specific error code on failure. + */ +int mbedtls_ccm_star_encrypt_and_tag(mbedtls_ccm_context *ctx, size_t length, + const unsigned char *iv, size_t iv_len, + const unsigned char *add, size_t add_len, + const unsigned char *input, unsigned char *output, + unsigned char *tag, size_t tag_len); + +/** + * \brief This function performs a CCM authenticated decryption of a + * buffer. + * + * \param ctx The CCM context to use for decryption. This must be + * initialized and bound to a key. + * \param length The length of the input data in Bytes. + * \param iv The initialization vector (nonce). This must be a readable + * buffer of at least \p iv_len Bytes. + * \param iv_len The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, + * or 13. The length L of the message length field is + * 15 - \p iv_len. + * \param add The additional data field. This must be a readable buffer + * of at least that \p add_len Bytes.. + * \param add_len The length of additional data in Bytes. + * This must be less than 2^16 - 2^8. + * \param input The buffer holding the input data. If \p length is greater + * than zero, \p input must be a readable buffer of at least + * that length. + * \param output The buffer holding the output data. If \p length is greater + * than zero, \p output must be a writable buffer of at least + * that length. + * \param tag The buffer holding the authentication field. This must be a + * readable buffer of at least \p tag_len Bytes. + * \param tag_len The length of the authentication field to generate in Bytes: + * 4, 6, 8, 10, 12, 14 or 16. + * + * \return \c 0 on success. This indicates that the message is authentic. + * \return #MBEDTLS_ERR_CCM_AUTH_FAILED if the tag does not match. + * \return A cipher-specific error code on calculation failure. + */ +int mbedtls_ccm_auth_decrypt(mbedtls_ccm_context *ctx, size_t length, + const unsigned char *iv, size_t iv_len, + const unsigned char *add, size_t add_len, + const unsigned char *input, unsigned char *output, + const unsigned char *tag, size_t tag_len); + +/** + * \brief This function performs a CCM* authenticated decryption of a + * buffer. + * + * \note When using this function in a variable tag length context, + * the tag length has to be decoded from \p iv and passed to + * this function as \p tag_len. (\p tag needs to be adjusted + * accordingly.) + * + * \param ctx The CCM context to use for decryption. This must be + * initialized and bound to a key. + * \param length The length of the input data in Bytes. + * \param iv The initialization vector (nonce). This must be a readable + * buffer of at least \p iv_len Bytes. + * \param iv_len The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, + * or 13. The length L of the message length field is + * 15 - \p iv_len. + * \param add The additional data field. This must be a readable buffer of + * at least that \p add_len Bytes. + * \param add_len The length of additional data in Bytes. + * This must be less than 2^16 - 2^8. + * \param input The buffer holding the input data. If \p length is greater + * than zero, \p input must be a readable buffer of at least + * that length. + * \param output The buffer holding the output data. If \p length is greater + * than zero, \p output must be a writable buffer of at least + * that length. + * \param tag The buffer holding the authentication field. This must be a + * readable buffer of at least \p tag_len Bytes. + * \param tag_len The length of the authentication field in Bytes. + * 0, 4, 6, 8, 10, 12, 14 or 16. + * + * \warning Passing \c 0 as \p tag_len means that the message is nos + * longer authenticated. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CCM_AUTH_FAILED if the tag does not match. + * \return A cipher-specific error code on calculation failure. + */ +int mbedtls_ccm_star_auth_decrypt(mbedtls_ccm_context *ctx, size_t length, + const unsigned char *iv, size_t iv_len, + const unsigned char *add, size_t add_len, + const unsigned char *input, unsigned char *output, + const unsigned char *tag, size_t tag_len); + +#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) +/** + * \brief The CCM checkup routine. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +int mbedtls_ccm_self_test(int verbose); +#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_CCM_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/certs.h b/ext/opcua_client/mbedtls/include/mbedtls/certs.h new file mode 100644 index 0000000..8a1f293 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/certs.h @@ -0,0 +1,238 @@ +/** + * \file certs.h + * + * \brief Sample certificates and DHM parameters for testing + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_CERTS_H +#define MBEDTLS_CERTS_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* List of all PEM-encoded CA certificates, terminated by NULL; + * PEM encoded if MBEDTLS_PEM_PARSE_C is enabled, DER encoded + * otherwise. */ +extern const char *mbedtls_test_cas[]; +extern const size_t mbedtls_test_cas_len[]; + +/* List of all DER-encoded CA certificates, terminated by NULL */ +extern const unsigned char *mbedtls_test_cas_der[]; +extern const size_t mbedtls_test_cas_der_len[]; + +#if defined(MBEDTLS_PEM_PARSE_C) +/* Concatenation of all CA certificates in PEM format if available */ +extern const char mbedtls_test_cas_pem[]; +extern const size_t mbedtls_test_cas_pem_len; +#endif /* MBEDTLS_PEM_PARSE_C */ + +/* + * CA test certificates + */ + +extern const char mbedtls_test_ca_crt_ec_pem[]; +extern const char mbedtls_test_ca_key_ec_pem[]; +extern const char mbedtls_test_ca_pwd_ec_pem[]; +extern const char mbedtls_test_ca_key_rsa_pem[]; +extern const char mbedtls_test_ca_pwd_rsa_pem[]; +extern const char mbedtls_test_ca_crt_rsa_sha1_pem[]; +extern const char mbedtls_test_ca_crt_rsa_sha256_pem[]; + +extern const unsigned char mbedtls_test_ca_crt_ec_der[]; +extern const unsigned char mbedtls_test_ca_key_ec_der[]; +extern const unsigned char mbedtls_test_ca_key_rsa_der[]; +extern const unsigned char mbedtls_test_ca_crt_rsa_sha1_der[]; +extern const unsigned char mbedtls_test_ca_crt_rsa_sha256_der[]; + +extern const size_t mbedtls_test_ca_crt_ec_pem_len; +extern const size_t mbedtls_test_ca_key_ec_pem_len; +extern const size_t mbedtls_test_ca_pwd_ec_pem_len; +extern const size_t mbedtls_test_ca_key_rsa_pem_len; +extern const size_t mbedtls_test_ca_pwd_rsa_pem_len; +extern const size_t mbedtls_test_ca_crt_rsa_sha1_pem_len; +extern const size_t mbedtls_test_ca_crt_rsa_sha256_pem_len; + +extern const size_t mbedtls_test_ca_crt_ec_der_len; +extern const size_t mbedtls_test_ca_key_ec_der_len; +extern const size_t mbedtls_test_ca_pwd_ec_der_len; +extern const size_t mbedtls_test_ca_key_rsa_der_len; +extern const size_t mbedtls_test_ca_pwd_rsa_der_len; +extern const size_t mbedtls_test_ca_crt_rsa_sha1_der_len; +extern const size_t mbedtls_test_ca_crt_rsa_sha256_der_len; + +/* Config-dependent dispatch between PEM and DER encoding + * (PEM if enabled, otherwise DER) */ + +extern const char mbedtls_test_ca_crt_ec[]; +extern const char mbedtls_test_ca_key_ec[]; +extern const char mbedtls_test_ca_pwd_ec[]; +extern const char mbedtls_test_ca_key_rsa[]; +extern const char mbedtls_test_ca_pwd_rsa[]; +extern const char mbedtls_test_ca_crt_rsa_sha1[]; +extern const char mbedtls_test_ca_crt_rsa_sha256[]; + +extern const size_t mbedtls_test_ca_crt_ec_len; +extern const size_t mbedtls_test_ca_key_ec_len; +extern const size_t mbedtls_test_ca_pwd_ec_len; +extern const size_t mbedtls_test_ca_key_rsa_len; +extern const size_t mbedtls_test_ca_pwd_rsa_len; +extern const size_t mbedtls_test_ca_crt_rsa_sha1_len; +extern const size_t mbedtls_test_ca_crt_rsa_sha256_len; + +/* Config-dependent dispatch between SHA-1 and SHA-256 + * (SHA-256 if enabled, otherwise SHA-1) */ + +extern const char mbedtls_test_ca_crt_rsa[]; +extern const size_t mbedtls_test_ca_crt_rsa_len; + +/* Config-dependent dispatch between EC and RSA + * (RSA if enabled, otherwise EC) */ + +extern const char *mbedtls_test_ca_crt; +extern const char *mbedtls_test_ca_key; +extern const char *mbedtls_test_ca_pwd; +extern const size_t mbedtls_test_ca_crt_len; +extern const size_t mbedtls_test_ca_key_len; +extern const size_t mbedtls_test_ca_pwd_len; + +/* + * Server test certificates + */ + +extern const char mbedtls_test_srv_crt_ec_pem[]; +extern const char mbedtls_test_srv_key_ec_pem[]; +extern const char mbedtls_test_srv_pwd_ec_pem[]; +extern const char mbedtls_test_srv_key_rsa_pem[]; +extern const char mbedtls_test_srv_pwd_rsa_pem[]; +extern const char mbedtls_test_srv_crt_rsa_sha1_pem[]; +extern const char mbedtls_test_srv_crt_rsa_sha256_pem[]; + +extern const unsigned char mbedtls_test_srv_crt_ec_der[]; +extern const unsigned char mbedtls_test_srv_key_ec_der[]; +extern const unsigned char mbedtls_test_srv_key_rsa_der[]; +extern const unsigned char mbedtls_test_srv_crt_rsa_sha1_der[]; +extern const unsigned char mbedtls_test_srv_crt_rsa_sha256_der[]; + +extern const size_t mbedtls_test_srv_crt_ec_pem_len; +extern const size_t mbedtls_test_srv_key_ec_pem_len; +extern const size_t mbedtls_test_srv_pwd_ec_pem_len; +extern const size_t mbedtls_test_srv_key_rsa_pem_len; +extern const size_t mbedtls_test_srv_pwd_rsa_pem_len; +extern const size_t mbedtls_test_srv_crt_rsa_sha1_pem_len; +extern const size_t mbedtls_test_srv_crt_rsa_sha256_pem_len; + +extern const size_t mbedtls_test_srv_crt_ec_der_len; +extern const size_t mbedtls_test_srv_key_ec_der_len; +extern const size_t mbedtls_test_srv_pwd_ec_der_len; +extern const size_t mbedtls_test_srv_key_rsa_der_len; +extern const size_t mbedtls_test_srv_pwd_rsa_der_len; +extern const size_t mbedtls_test_srv_crt_rsa_sha1_der_len; +extern const size_t mbedtls_test_srv_crt_rsa_sha256_der_len; + +/* Config-dependent dispatch between PEM and DER encoding + * (PEM if enabled, otherwise DER) */ + +extern const char mbedtls_test_srv_crt_ec[]; +extern const char mbedtls_test_srv_key_ec[]; +extern const char mbedtls_test_srv_pwd_ec[]; +extern const char mbedtls_test_srv_key_rsa[]; +extern const char mbedtls_test_srv_pwd_rsa[]; +extern const char mbedtls_test_srv_crt_rsa_sha1[]; +extern const char mbedtls_test_srv_crt_rsa_sha256[]; + +extern const size_t mbedtls_test_srv_crt_ec_len; +extern const size_t mbedtls_test_srv_key_ec_len; +extern const size_t mbedtls_test_srv_pwd_ec_len; +extern const size_t mbedtls_test_srv_key_rsa_len; +extern const size_t mbedtls_test_srv_pwd_rsa_len; +extern const size_t mbedtls_test_srv_crt_rsa_sha1_len; +extern const size_t mbedtls_test_srv_crt_rsa_sha256_len; + +/* Config-dependent dispatch between SHA-1 and SHA-256 + * (SHA-256 if enabled, otherwise SHA-1) */ + +extern const char mbedtls_test_srv_crt_rsa[]; +extern const size_t mbedtls_test_srv_crt_rsa_len; + +/* Config-dependent dispatch between EC and RSA + * (RSA if enabled, otherwise EC) */ + +extern const char *mbedtls_test_srv_crt; +extern const char *mbedtls_test_srv_key; +extern const char *mbedtls_test_srv_pwd; +extern const size_t mbedtls_test_srv_crt_len; +extern const size_t mbedtls_test_srv_key_len; +extern const size_t mbedtls_test_srv_pwd_len; + +/* + * Client test certificates + */ + +extern const char mbedtls_test_cli_crt_ec_pem[]; +extern const char mbedtls_test_cli_key_ec_pem[]; +extern const char mbedtls_test_cli_pwd_ec_pem[]; +extern const char mbedtls_test_cli_key_rsa_pem[]; +extern const char mbedtls_test_cli_pwd_rsa_pem[]; +extern const char mbedtls_test_cli_crt_rsa_pem[]; + +extern const unsigned char mbedtls_test_cli_crt_ec_der[]; +extern const unsigned char mbedtls_test_cli_key_ec_der[]; +extern const unsigned char mbedtls_test_cli_key_rsa_der[]; +extern const unsigned char mbedtls_test_cli_crt_rsa_der[]; + +extern const size_t mbedtls_test_cli_crt_ec_pem_len; +extern const size_t mbedtls_test_cli_key_ec_pem_len; +extern const size_t mbedtls_test_cli_pwd_ec_pem_len; +extern const size_t mbedtls_test_cli_key_rsa_pem_len; +extern const size_t mbedtls_test_cli_pwd_rsa_pem_len; +extern const size_t mbedtls_test_cli_crt_rsa_pem_len; + +extern const size_t mbedtls_test_cli_crt_ec_der_len; +extern const size_t mbedtls_test_cli_key_ec_der_len; +extern const size_t mbedtls_test_cli_key_rsa_der_len; +extern const size_t mbedtls_test_cli_crt_rsa_der_len; + +/* Config-dependent dispatch between PEM and DER encoding + * (PEM if enabled, otherwise DER) */ + +extern const char mbedtls_test_cli_crt_ec[]; +extern const char mbedtls_test_cli_key_ec[]; +extern const char mbedtls_test_cli_pwd_ec[]; +extern const char mbedtls_test_cli_key_rsa[]; +extern const char mbedtls_test_cli_pwd_rsa[]; +extern const char mbedtls_test_cli_crt_rsa[]; + +extern const size_t mbedtls_test_cli_crt_ec_len; +extern const size_t mbedtls_test_cli_key_ec_len; +extern const size_t mbedtls_test_cli_pwd_ec_len; +extern const size_t mbedtls_test_cli_key_rsa_len; +extern const size_t mbedtls_test_cli_pwd_rsa_len; +extern const size_t mbedtls_test_cli_crt_rsa_len; + +/* Config-dependent dispatch between EC and RSA + * (RSA if enabled, otherwise EC) */ + +extern const char *mbedtls_test_cli_crt; +extern const char *mbedtls_test_cli_key; +extern const char *mbedtls_test_cli_pwd; +extern const size_t mbedtls_test_cli_crt_len; +extern const size_t mbedtls_test_cli_key_len; +extern const size_t mbedtls_test_cli_pwd_len; + +#ifdef __cplusplus +} +#endif + +#endif /* certs.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/chacha20.h b/ext/opcua_client/mbedtls/include/mbedtls/chacha20.h new file mode 100644 index 0000000..0c0d6a1 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/chacha20.h @@ -0,0 +1,215 @@ +/** + * \file chacha20.h + * + * \brief This file contains ChaCha20 definitions and functions. + * + * ChaCha20 is a stream cipher that can encrypt and decrypt + * information. ChaCha was created by Daniel Bernstein as a variant of + * its Salsa cipher https://cr.yp.to/chacha/chacha-20080128.pdf + * ChaCha20 is the variant with 20 rounds, that was also standardized + * in RFC 7539. + * + * \author Daniel King + */ + +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_CHACHA20_H +#define MBEDTLS_CHACHA20_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +/** Invalid input parameter(s). */ +#define MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA -0x0051 + +/* MBEDTLS_ERR_CHACHA20_FEATURE_UNAVAILABLE is deprecated and should not be + * used. */ +/** Feature not available. For example, s part of the API is not implemented. */ +#define MBEDTLS_ERR_CHACHA20_FEATURE_UNAVAILABLE -0x0053 + +/* MBEDTLS_ERR_CHACHA20_HW_ACCEL_FAILED is deprecated and should not be used. + */ +/** Chacha20 hardware accelerator failed. */ +#define MBEDTLS_ERR_CHACHA20_HW_ACCEL_FAILED -0x0055 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_CHACHA20_ALT) + +typedef struct mbedtls_chacha20_context { + uint32_t state[16]; /*! The state (before round operations). */ + uint8_t keystream8[64]; /*! Leftover keystream bytes. */ + size_t keystream_bytes_used; /*! Number of keystream bytes already used. */ +} +mbedtls_chacha20_context; + +#else /* MBEDTLS_CHACHA20_ALT */ +#include "chacha20_alt.h" +#endif /* MBEDTLS_CHACHA20_ALT */ + +/** + * \brief This function initializes the specified ChaCha20 context. + * + * It must be the first API called before using + * the context. + * + * It is usually followed by calls to + * \c mbedtls_chacha20_setkey() and + * \c mbedtls_chacha20_starts(), then one or more calls to + * to \c mbedtls_chacha20_update(), and finally to + * \c mbedtls_chacha20_free(). + * + * \param ctx The ChaCha20 context to initialize. + * This must not be \c NULL. + */ +void mbedtls_chacha20_init(mbedtls_chacha20_context *ctx); + +/** + * \brief This function releases and clears the specified + * ChaCha20 context. + * + * \param ctx The ChaCha20 context to clear. This may be \c NULL, + * in which case this function is a no-op. If it is not + * \c NULL, it must point to an initialized context. + * + */ +void mbedtls_chacha20_free(mbedtls_chacha20_context *ctx); + +/** + * \brief This function sets the encryption/decryption key. + * + * \note After using this function, you must also call + * \c mbedtls_chacha20_starts() to set a nonce before you + * start encrypting/decrypting data with + * \c mbedtls_chacha_update(). + * + * \param ctx The ChaCha20 context to which the key should be bound. + * It must be initialized. + * \param key The encryption/decryption key. This must be \c 32 Bytes + * in length. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA if ctx or key is NULL. + */ +int mbedtls_chacha20_setkey(mbedtls_chacha20_context *ctx, + const unsigned char key[32]); + +/** + * \brief This function sets the nonce and initial counter value. + * + * \note A ChaCha20 context can be re-used with the same key by + * calling this function to change the nonce. + * + * \warning You must never use the same nonce twice with the same key. + * This would void any confidentiality guarantees for the + * messages encrypted with the same nonce and key. + * + * \param ctx The ChaCha20 context to which the nonce should be bound. + * It must be initialized and bound to a key. + * \param nonce The nonce. This must be \c 12 Bytes in size. + * \param counter The initial counter value. This is usually \c 0. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA if ctx or nonce is + * NULL. + */ +int mbedtls_chacha20_starts(mbedtls_chacha20_context *ctx, + const unsigned char nonce[12], + uint32_t counter); + +/** + * \brief This function encrypts or decrypts data. + * + * Since ChaCha20 is a stream cipher, the same operation is + * used for encrypting and decrypting data. + * + * \note The \p input and \p output pointers must either be equal or + * point to non-overlapping buffers. + * + * \note \c mbedtls_chacha20_setkey() and + * \c mbedtls_chacha20_starts() must be called at least once + * to setup the context before this function can be called. + * + * \note This function can be called multiple times in a row in + * order to encrypt of decrypt data piecewise with the same + * key and nonce. + * + * \param ctx The ChaCha20 context to use for encryption or decryption. + * It must be initialized and bound to a key and nonce. + * \param size The length of the input data in Bytes. + * \param input The buffer holding the input data. + * This pointer can be \c NULL if `size == 0`. + * \param output The buffer holding the output data. + * This must be able to hold \p size Bytes. + * This pointer can be \c NULL if `size == 0`. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_chacha20_update(mbedtls_chacha20_context *ctx, + size_t size, + const unsigned char *input, + unsigned char *output); + +/** + * \brief This function encrypts or decrypts data with ChaCha20 and + * the given key and nonce. + * + * Since ChaCha20 is a stream cipher, the same operation is + * used for encrypting and decrypting data. + * + * \warning You must never use the same (key, nonce) pair more than + * once. This would void any confidentiality guarantees for + * the messages encrypted with the same nonce and key. + * + * \note The \p input and \p output pointers must either be equal or + * point to non-overlapping buffers. + * + * \param key The encryption/decryption key. + * This must be \c 32 Bytes in length. + * \param nonce The nonce. This must be \c 12 Bytes in size. + * \param counter The initial counter value. This is usually \c 0. + * \param size The length of the input data in Bytes. + * \param input The buffer holding the input data. + * This pointer can be \c NULL if `size == 0`. + * \param output The buffer holding the output data. + * This must be able to hold \p size Bytes. + * This pointer can be \c NULL if `size == 0`. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_chacha20_crypt(const unsigned char key[32], + const unsigned char nonce[12], + uint32_t counter, + size_t size, + const unsigned char *input, + unsigned char *output); + +#if defined(MBEDTLS_SELF_TEST) +/** + * \brief The ChaCha20 checkup routine. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +int mbedtls_chacha20_self_test(int verbose); +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_CHACHA20_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/chachapoly.h b/ext/opcua_client/mbedtls/include/mbedtls/chachapoly.h new file mode 100644 index 0000000..1156d7d --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/chachapoly.h @@ -0,0 +1,345 @@ +/** + * \file chachapoly.h + * + * \brief This file contains the AEAD-ChaCha20-Poly1305 definitions and + * functions. + * + * ChaCha20-Poly1305 is an algorithm for Authenticated Encryption + * with Associated Data (AEAD) that can be used to encrypt and + * authenticate data. It is based on ChaCha20 and Poly1305 by Daniel + * Bernstein and was standardized in RFC 7539. + * + * \author Daniel King + */ + +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_CHACHAPOLY_H +#define MBEDTLS_CHACHAPOLY_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +/* for shared error codes */ +#include "mbedtls/poly1305.h" + +/** The requested operation is not permitted in the current state. */ +#define MBEDTLS_ERR_CHACHAPOLY_BAD_STATE -0x0054 +/** Authenticated decryption failed: data was not authentic. */ +#define MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED -0x0056 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + MBEDTLS_CHACHAPOLY_ENCRYPT, /**< The mode value for performing encryption. */ + MBEDTLS_CHACHAPOLY_DECRYPT /**< The mode value for performing decryption. */ +} +mbedtls_chachapoly_mode_t; + +#if !defined(MBEDTLS_CHACHAPOLY_ALT) + +#include "mbedtls/chacha20.h" + +typedef struct mbedtls_chachapoly_context { + mbedtls_chacha20_context chacha20_ctx; /**< The ChaCha20 context. */ + mbedtls_poly1305_context poly1305_ctx; /**< The Poly1305 context. */ + uint64_t aad_len; /**< The length (bytes) of the Additional Authenticated Data. */ + uint64_t ciphertext_len; /**< The length (bytes) of the ciphertext. */ + int state; /**< The current state of the context. */ + mbedtls_chachapoly_mode_t mode; /**< Cipher mode (encrypt or decrypt). */ +} +mbedtls_chachapoly_context; + +#else /* !MBEDTLS_CHACHAPOLY_ALT */ +#include "chachapoly_alt.h" +#endif /* !MBEDTLS_CHACHAPOLY_ALT */ + +/** + * \brief This function initializes the specified ChaCha20-Poly1305 context. + * + * It must be the first API called before using + * the context. It must be followed by a call to + * \c mbedtls_chachapoly_setkey() before any operation can be + * done, and to \c mbedtls_chachapoly_free() once all + * operations with that context have been finished. + * + * In order to encrypt or decrypt full messages at once, for + * each message you should make a single call to + * \c mbedtls_chachapoly_crypt_and_tag() or + * \c mbedtls_chachapoly_auth_decrypt(). + * + * In order to encrypt messages piecewise, for each + * message you should make a call to + * \c mbedtls_chachapoly_starts(), then 0 or more calls to + * \c mbedtls_chachapoly_update_aad(), then 0 or more calls to + * \c mbedtls_chachapoly_update(), then one call to + * \c mbedtls_chachapoly_finish(). + * + * \warning Decryption with the piecewise API is discouraged! Always + * use \c mbedtls_chachapoly_auth_decrypt() when possible! + * + * If however this is not possible because the data is too + * large to fit in memory, you need to: + * + * - call \c mbedtls_chachapoly_starts() and (if needed) + * \c mbedtls_chachapoly_update_aad() as above, + * - call \c mbedtls_chachapoly_update() multiple times and + * ensure its output (the plaintext) is NOT used in any other + * way than placing it in temporary storage at this point, + * - call \c mbedtls_chachapoly_finish() to compute the + * authentication tag and compared it in constant time to the + * tag received with the ciphertext. + * + * If the tags are not equal, you must immediately discard + * all previous outputs of \c mbedtls_chachapoly_update(), + * otherwise you can now safely use the plaintext. + * + * \param ctx The ChachaPoly context to initialize. Must not be \c NULL. + */ +void mbedtls_chachapoly_init(mbedtls_chachapoly_context *ctx); + +/** + * \brief This function releases and clears the specified + * ChaCha20-Poly1305 context. + * + * \param ctx The ChachaPoly context to clear. This may be \c NULL, in which + * case this function is a no-op. + */ +void mbedtls_chachapoly_free(mbedtls_chachapoly_context *ctx); + +/** + * \brief This function sets the ChaCha20-Poly1305 + * symmetric encryption key. + * + * \param ctx The ChaCha20-Poly1305 context to which the key should be + * bound. This must be initialized. + * \param key The \c 256 Bit (\c 32 Bytes) key. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_chachapoly_setkey(mbedtls_chachapoly_context *ctx, + const unsigned char key[32]); + +/** + * \brief This function starts a ChaCha20-Poly1305 encryption or + * decryption operation. + * + * \warning You must never use the same nonce twice with the same key. + * This would void any confidentiality and authenticity + * guarantees for the messages encrypted with the same nonce + * and key. + * + * \note If the context is being used for AAD only (no data to + * encrypt or decrypt) then \p mode can be set to any value. + * + * \warning Decryption with the piecewise API is discouraged, see the + * warning on \c mbedtls_chachapoly_init(). + * + * \param ctx The ChaCha20-Poly1305 context. This must be initialized + * and bound to a key. + * \param nonce The nonce/IV to use for the message. + * This must be a readable buffer of length \c 12 Bytes. + * \param mode The operation to perform: #MBEDTLS_CHACHAPOLY_ENCRYPT or + * #MBEDTLS_CHACHAPOLY_DECRYPT (discouraged, see warning). + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_chachapoly_starts(mbedtls_chachapoly_context *ctx, + const unsigned char nonce[12], + mbedtls_chachapoly_mode_t mode); + +/** + * \brief This function feeds additional data to be authenticated + * into an ongoing ChaCha20-Poly1305 operation. + * + * The Additional Authenticated Data (AAD), also called + * Associated Data (AD) is only authenticated but not + * encrypted nor included in the encrypted output. It is + * usually transmitted separately from the ciphertext or + * computed locally by each party. + * + * \note This function is called before data is encrypted/decrypted. + * I.e. call this function to process the AAD before calling + * \c mbedtls_chachapoly_update(). + * + * You may call this function multiple times to process + * an arbitrary amount of AAD. It is permitted to call + * this function 0 times, if no AAD is used. + * + * This function cannot be called any more if data has + * been processed by \c mbedtls_chachapoly_update(), + * or if the context has been finished. + * + * \warning Decryption with the piecewise API is discouraged, see the + * warning on \c mbedtls_chachapoly_init(). + * + * \param ctx The ChaCha20-Poly1305 context. This must be initialized + * and bound to a key. + * \param aad_len The length in Bytes of the AAD. The length has no + * restrictions. + * \param aad Buffer containing the AAD. + * This pointer can be \c NULL if `aad_len == 0`. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA + * if \p ctx or \p aad are NULL. + * \return #MBEDTLS_ERR_CHACHAPOLY_BAD_STATE + * if the operations has not been started or has been + * finished, or if the AAD has been finished. + */ +int mbedtls_chachapoly_update_aad(mbedtls_chachapoly_context *ctx, + const unsigned char *aad, + size_t aad_len); + +/** + * \brief Thus function feeds data to be encrypted or decrypted + * into an on-going ChaCha20-Poly1305 + * operation. + * + * The direction (encryption or decryption) depends on the + * mode that was given when calling + * \c mbedtls_chachapoly_starts(). + * + * You may call this function multiple times to process + * an arbitrary amount of data. It is permitted to call + * this function 0 times, if no data is to be encrypted + * or decrypted. + * + * \warning Decryption with the piecewise API is discouraged, see the + * warning on \c mbedtls_chachapoly_init(). + * + * \param ctx The ChaCha20-Poly1305 context to use. This must be initialized. + * \param len The length (in bytes) of the data to encrypt or decrypt. + * \param input The buffer containing the data to encrypt or decrypt. + * This pointer can be \c NULL if `len == 0`. + * \param output The buffer to where the encrypted or decrypted data is + * written. This must be able to hold \p len bytes. + * This pointer can be \c NULL if `len == 0`. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CHACHAPOLY_BAD_STATE + * if the operation has not been started or has been + * finished. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_chachapoly_update(mbedtls_chachapoly_context *ctx, + size_t len, + const unsigned char *input, + unsigned char *output); + +/** + * \brief This function finished the ChaCha20-Poly1305 operation and + * generates the MAC (authentication tag). + * + * \param ctx The ChaCha20-Poly1305 context to use. This must be initialized. + * \param mac The buffer to where the 128-bit (16 bytes) MAC is written. + * + * \warning Decryption with the piecewise API is discouraged, see the + * warning on \c mbedtls_chachapoly_init(). + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CHACHAPOLY_BAD_STATE + * if the operation has not been started or has been + * finished. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_chachapoly_finish(mbedtls_chachapoly_context *ctx, + unsigned char mac[16]); + +/** + * \brief This function performs a complete ChaCha20-Poly1305 + * authenticated encryption with the previously-set key. + * + * \note Before using this function, you must set the key with + * \c mbedtls_chachapoly_setkey(). + * + * \warning You must never use the same nonce twice with the same key. + * This would void any confidentiality and authenticity + * guarantees for the messages encrypted with the same nonce + * and key. + * + * \param ctx The ChaCha20-Poly1305 context to use (holds the key). + * This must be initialized. + * \param length The length (in bytes) of the data to encrypt or decrypt. + * \param nonce The 96-bit (12 bytes) nonce/IV to use. + * \param aad The buffer containing the additional authenticated + * data (AAD). This pointer can be \c NULL if `aad_len == 0`. + * \param aad_len The length (in bytes) of the AAD data to process. + * \param input The buffer containing the data to encrypt or decrypt. + * This pointer can be \c NULL if `ilen == 0`. + * \param output The buffer to where the encrypted or decrypted data + * is written. This pointer can be \c NULL if `ilen == 0`. + * \param tag The buffer to where the computed 128-bit (16 bytes) MAC + * is written. This must not be \c NULL. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_chachapoly_encrypt_and_tag(mbedtls_chachapoly_context *ctx, + size_t length, + const unsigned char nonce[12], + const unsigned char *aad, + size_t aad_len, + const unsigned char *input, + unsigned char *output, + unsigned char tag[16]); + +/** + * \brief This function performs a complete ChaCha20-Poly1305 + * authenticated decryption with the previously-set key. + * + * \note Before using this function, you must set the key with + * \c mbedtls_chachapoly_setkey(). + * + * \param ctx The ChaCha20-Poly1305 context to use (holds the key). + * \param length The length (in Bytes) of the data to decrypt. + * \param nonce The \c 96 Bit (\c 12 bytes) nonce/IV to use. + * \param aad The buffer containing the additional authenticated data (AAD). + * This pointer can be \c NULL if `aad_len == 0`. + * \param aad_len The length (in bytes) of the AAD data to process. + * \param tag The buffer holding the authentication tag. + * This must be a readable buffer of length \c 16 Bytes. + * \param input The buffer containing the data to decrypt. + * This pointer can be \c NULL if `ilen == 0`. + * \param output The buffer to where the decrypted data is written. + * This pointer can be \c NULL if `ilen == 0`. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED + * if the data was not authentic. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_chachapoly_auth_decrypt(mbedtls_chachapoly_context *ctx, + size_t length, + const unsigned char nonce[12], + const unsigned char *aad, + size_t aad_len, + const unsigned char tag[16], + const unsigned char *input, + unsigned char *output); + +#if defined(MBEDTLS_SELF_TEST) +/** + * \brief The ChaCha20-Poly1305 checkup routine. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +int mbedtls_chachapoly_self_test(int verbose); +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_CHACHAPOLY_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/check_config.h b/ext/opcua_client/mbedtls/include/mbedtls/check_config.h new file mode 100644 index 0000000..96081fe --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/check_config.h @@ -0,0 +1,949 @@ +/** + * \file check_config.h + * + * \brief Consistency checks for configuration options + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * It is recommended to include this file from your config.h + * in order to catch dependency issues early. + */ + +#ifndef MBEDTLS_CHECK_CONFIG_H +#define MBEDTLS_CHECK_CONFIG_H + +/* *INDENT-OFF* */ +/* + * We assume CHAR_BIT is 8 in many places. In practice, this is true on our + * target platforms, so not an issue, but let's just be extra sure. + */ +#include +#if CHAR_BIT != 8 +#error "Mbed TLS requires a platform with 8-bit chars" +#endif + +#if defined(_WIN32) +#if !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_C is required on Windows" +#endif + +/* Fix the config here. Not convenient to put an #ifdef _WIN32 in config.h as + * it would confuse config.py. */ +#if !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && \ + !defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) +#define MBEDTLS_PLATFORM_SNPRINTF_ALT +#endif + +#if !defined(MBEDTLS_PLATFORM_VSNPRINTF_ALT) && \ + !defined(MBEDTLS_PLATFORM_VSNPRINTF_MACRO) +#define MBEDTLS_PLATFORM_VSNPRINTF_ALT +#endif +#endif /* _WIN32 */ + +#if defined(TARGET_LIKE_MBED) && defined(MBEDTLS_NET_C) +#error "The NET module is not available for mbed OS - please use the network functions provided by Mbed OS" +#endif + +#if defined(MBEDTLS_DEPRECATED_WARNING) && \ + !defined(__GNUC__) && !defined(__clang__) +#error "MBEDTLS_DEPRECATED_WARNING only works with GCC and Clang" +#endif + +#if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_HAVE_TIME) +#error "MBEDTLS_HAVE_TIME_DATE without MBEDTLS_HAVE_TIME does not make sense" +#endif + +#if defined(MBEDTLS_CTR_DRBG_C) && !defined(MBEDTLS_AES_C) +#error "MBEDTLS_CTR_DRBG_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_DHM_C) && !defined(MBEDTLS_BIGNUM_C) +#error "MBEDTLS_DHM_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT) && !defined(MBEDTLS_SSL_TRUNCATED_HMAC) +#error "MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_CMAC_C) && \ + !defined(MBEDTLS_AES_C) && !defined(MBEDTLS_DES_C) +#error "MBEDTLS_CMAC_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_NIST_KW_C) && \ + ( !defined(MBEDTLS_AES_C) || !defined(MBEDTLS_CIPHER_C) ) +#error "MBEDTLS_NIST_KW_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECDH_C) && !defined(MBEDTLS_ECP_C) +#error "MBEDTLS_ECDH_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECDSA_C) && \ + ( !defined(MBEDTLS_ECP_C) || \ + !( defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) ) || \ + !defined(MBEDTLS_ASN1_PARSE_C) || \ + !defined(MBEDTLS_ASN1_WRITE_C) ) +#error "MBEDTLS_ECDSA_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECJPAKE_C) && \ + ( !defined(MBEDTLS_ECP_C) || !defined(MBEDTLS_MD_C) ) +#error "MBEDTLS_ECJPAKE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECP_RESTARTABLE) && \ + ( defined(MBEDTLS_USE_PSA_CRYPTO) || \ + defined(MBEDTLS_ECDH_COMPUTE_SHARED_ALT) || \ + defined(MBEDTLS_ECDH_GEN_PUBLIC_ALT) || \ + defined(MBEDTLS_ECDSA_SIGN_ALT) || \ + defined(MBEDTLS_ECDSA_VERIFY_ALT) || \ + defined(MBEDTLS_ECDSA_GENKEY_ALT) || \ + defined(MBEDTLS_ECP_INTERNAL_ALT) || \ + defined(MBEDTLS_ECP_ALT) ) +#error "MBEDTLS_ECP_RESTARTABLE defined, but it cannot coexist with an alternative or PSA-based ECP implementation" +#endif + +#if defined(MBEDTLS_ECP_RESTARTABLE) && \ + ! defined(MBEDTLS_ECDH_LEGACY_CONTEXT) +#error "MBEDTLS_ECP_RESTARTABLE defined, but not MBEDTLS_ECDH_LEGACY_CONTEXT" +#endif + +#if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED) && \ + defined(MBEDTLS_ECDH_LEGACY_CONTEXT) +#error "MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED defined, but MBEDTLS_ECDH_LEGACY_CONTEXT not disabled" +#endif + +#if defined(MBEDTLS_ECP_RESTARTABLE) && \ + !defined(MBEDTLS_ECP_C) +#error "MBEDTLS_ECP_RESTARTABLE defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) && !defined(MBEDTLS_HMAC_DRBG_C) +#error "MBEDTLS_ECDSA_DETERMINISTIC defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECP_C) && ( !defined(MBEDTLS_BIGNUM_C) || ( \ + !defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) && \ + !defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) && \ + !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) && \ + !defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) && \ + !defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) && \ + !defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) && \ + !defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) && \ + !defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) && \ + !defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) && \ + !defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) && \ + !defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) && \ + !defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) && \ + !defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) ) ) +#error "MBEDTLS_ECP_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECP_C) && !( \ + defined(MBEDTLS_ECP_ALT) || \ + defined(MBEDTLS_CTR_DRBG_C) || \ + defined(MBEDTLS_HMAC_DRBG_C) || \ + defined(MBEDTLS_ECP_NO_INTERNAL_RNG)) +#error "MBEDTLS_ECP_C requires a DRBG module unless MBEDTLS_ECP_NO_INTERNAL_RNG is defined or an alternative implementation is used" +#endif + +#if defined(MBEDTLS_PK_PARSE_C) && !defined(MBEDTLS_ASN1_PARSE_C) +#error "MBEDTLS_PK_PARSE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PKCS5_C) && !defined(MBEDTLS_MD_C) +#error "MBEDTLS_PKCS5_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ENTROPY_C) && (!defined(MBEDTLS_SHA512_C) && \ + !defined(MBEDTLS_SHA256_C)) +#error "MBEDTLS_ENTROPY_C defined, but not all prerequisites" +#endif +#if defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_SHA512_C) && \ + defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 64) +#error "MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high" +#endif +#if defined(MBEDTLS_ENTROPY_C) && \ + ( !defined(MBEDTLS_SHA512_C) || defined(MBEDTLS_ENTROPY_FORCE_SHA256) ) \ + && defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 32) +#error "MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high" +#endif +#if defined(MBEDTLS_ENTROPY_C) && \ + defined(MBEDTLS_ENTROPY_FORCE_SHA256) && !defined(MBEDTLS_SHA256_C) +#error "MBEDTLS_ENTROPY_FORCE_SHA256 defined, but not all prerequisites" +#endif + +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) +#define MBEDTLS_HAS_MEMSAN +#endif +#endif +#if defined(MBEDTLS_TEST_CONSTANT_FLOW_MEMSAN) && !defined(MBEDTLS_HAS_MEMSAN) +#error "MBEDTLS_TEST_CONSTANT_FLOW_MEMSAN requires building with MemorySanitizer" +#endif +#undef MBEDTLS_HAS_MEMSAN + +#if defined(MBEDTLS_TEST_NULL_ENTROPY) && \ + ( !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) ) +#error "MBEDTLS_TEST_NULL_ENTROPY defined, but not all prerequisites" +#endif +#if defined(MBEDTLS_TEST_NULL_ENTROPY) && \ + ( defined(MBEDTLS_ENTROPY_NV_SEED) || defined(MBEDTLS_ENTROPY_HARDWARE_ALT) || \ + defined(MBEDTLS_HAVEGE_C) ) +#error "MBEDTLS_TEST_NULL_ENTROPY defined, but entropy sources too" +#endif + +#if defined(MBEDTLS_CCM_C) && ( \ + !defined(MBEDTLS_AES_C) && !defined(MBEDTLS_CAMELLIA_C) && !defined(MBEDTLS_ARIA_C) ) +#error "MBEDTLS_CCM_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_CCM_C) && !defined(MBEDTLS_CIPHER_C) +#error "MBEDTLS_CCM_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_GCM_C) && ( \ + !defined(MBEDTLS_AES_C) && !defined(MBEDTLS_CAMELLIA_C) && !defined(MBEDTLS_ARIA_C) ) +#error "MBEDTLS_GCM_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_GCM_C) && !defined(MBEDTLS_CIPHER_C) +#error "MBEDTLS_GCM_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_CHACHAPOLY_C) && !defined(MBEDTLS_CHACHA20_C) +#error "MBEDTLS_CHACHAPOLY_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_CHACHAPOLY_C) && !defined(MBEDTLS_POLY1305_C) +#error "MBEDTLS_CHACHAPOLY_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) +#error "MBEDTLS_ECP_RANDOMIZE_JAC_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECP_ADD_MIXED_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) +#error "MBEDTLS_ECP_ADD_MIXED_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) +#error "MBEDTLS_ECP_DOUBLE_JAC_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) +#error "MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) +#error "MBEDTLS_ECP_NORMALIZE_JAC_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) +#error "MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) +#error "MBEDTLS_ECP_RANDOMIZE_MXZ_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) +#error "MBEDTLS_ECP_NORMALIZE_MXZ_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ECP_NO_FALLBACK) && !defined(MBEDTLS_ECP_INTERNAL_ALT) +#error "MBEDTLS_ECP_NO_FALLBACK defined, but no alternative implementation enabled" +#endif + +#if defined(MBEDTLS_HAVEGE_C) && !defined(MBEDTLS_TIMING_C) +#error "MBEDTLS_HAVEGE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_HKDF_C) && !defined(MBEDTLS_MD_C) +#error "MBEDTLS_HKDF_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_HMAC_DRBG_C) && !defined(MBEDTLS_MD_C) +#error "MBEDTLS_HMAC_DRBG_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) && \ + ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_ECDSA_C) || \ + !defined(MBEDTLS_X509_CRT_PARSE_C) ) +#error "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ + ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_RSA_C) || \ + !defined(MBEDTLS_X509_CRT_PARSE_C) ) +#error "MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) && !defined(MBEDTLS_DHM_C) +#error "MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) && \ + !defined(MBEDTLS_ECDH_C) +#error "MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ + ( !defined(MBEDTLS_DHM_C) || !defined(MBEDTLS_RSA_C) || \ + !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) ) +#error "MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ + ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_RSA_C) || \ + !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) ) +#error "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \ + ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_ECDSA_C) || \ + !defined(MBEDTLS_X509_CRT_PARSE_C) ) +#error "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) && \ + ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \ + !defined(MBEDTLS_PKCS1_V15) ) +#error "MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ + ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \ + !defined(MBEDTLS_PKCS1_V15) ) +#error "MBEDTLS_KEY_EXCHANGE_RSA_ENABLED defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) && \ + ( !defined(MBEDTLS_ECJPAKE_C) || !defined(MBEDTLS_SHA256_C) || \ + !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) ) +#error "MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) && \ + !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) && \ + ( !defined(MBEDTLS_SHA256_C) && \ + !defined(MBEDTLS_SHA512_C) && \ + !defined(MBEDTLS_SHA1_C) ) +#error "!MBEDTLS_SSL_KEEP_PEER_CERTIFICATE requires MBEDTLS_SHA512_C, MBEDTLS_SHA256_C or MBEDTLS_SHA1_C" +#endif + +#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && \ + ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) +#error "MBEDTLS_MEMORY_BUFFER_ALLOC_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_MEMORY_BACKTRACE) && !defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) +#error "MBEDTLS_MEMORY_BACKTRACE defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_MEMORY_DEBUG) && !defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) +#error "MBEDTLS_MEMORY_DEBUG defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PADLOCK_C) && !defined(MBEDTLS_HAVE_ASM) +#error "MBEDTLS_PADLOCK_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PEM_PARSE_C) && !defined(MBEDTLS_BASE64_C) +#error "MBEDTLS_PEM_PARSE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PEM_WRITE_C) && !defined(MBEDTLS_BASE64_C) +#error "MBEDTLS_PEM_WRITE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PK_C) && \ + ( !defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_ECP_C) ) +#error "MBEDTLS_PK_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PK_PARSE_C) && !defined(MBEDTLS_PK_C) +#error "MBEDTLS_PK_PARSE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PK_WRITE_C) && !defined(MBEDTLS_PK_C) +#error "MBEDTLS_PK_WRITE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PKCS11_C) && !defined(MBEDTLS_PK_C) +#error "MBEDTLS_PKCS11_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PKCS11_C) +#if defined(MBEDTLS_DEPRECATED_REMOVED) +#error "MBEDTLS_PKCS11_C is deprecated and will be removed in a future version of Mbed TLS" +#elif defined(MBEDTLS_DEPRECATED_WARNING) +#warning "MBEDTLS_PKCS11_C is deprecated and will be removed in a future version of Mbed TLS" +#endif +#endif /* MBEDTLS_PKCS11_C */ + +#if defined(MBEDTLS_PLATFORM_EXIT_ALT) && !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_EXIT_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) && !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_EXIT_MACRO defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) &&\ + ( defined(MBEDTLS_PLATFORM_STD_EXIT) ||\ + defined(MBEDTLS_PLATFORM_EXIT_ALT) ) +#error "MBEDTLS_PLATFORM_EXIT_MACRO and MBEDTLS_PLATFORM_STD_EXIT/MBEDTLS_PLATFORM_EXIT_ALT cannot be defined simultaneously" +#endif + +#if defined(MBEDTLS_PLATFORM_TIME_ALT) &&\ + ( !defined(MBEDTLS_PLATFORM_C) ||\ + !defined(MBEDTLS_HAVE_TIME) ) +#error "MBEDTLS_PLATFORM_TIME_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_TIME_MACRO) &&\ + ( !defined(MBEDTLS_PLATFORM_C) ||\ + !defined(MBEDTLS_HAVE_TIME) ) +#error "MBEDTLS_PLATFORM_TIME_MACRO defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) &&\ + ( !defined(MBEDTLS_PLATFORM_C) ||\ + !defined(MBEDTLS_HAVE_TIME) ) +#error "MBEDTLS_PLATFORM_TIME_TYPE_MACRO defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_TIME_MACRO) &&\ + ( defined(MBEDTLS_PLATFORM_STD_TIME) ||\ + defined(MBEDTLS_PLATFORM_TIME_ALT) ) +#error "MBEDTLS_PLATFORM_TIME_MACRO and MBEDTLS_PLATFORM_STD_TIME/MBEDTLS_PLATFORM_TIME_ALT cannot be defined simultaneously" +#endif + +#if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) &&\ + ( defined(MBEDTLS_PLATFORM_STD_TIME) ||\ + defined(MBEDTLS_PLATFORM_TIME_ALT) ) +#error "MBEDTLS_PLATFORM_TIME_TYPE_MACRO and MBEDTLS_PLATFORM_STD_TIME/MBEDTLS_PLATFORM_TIME_ALT cannot be defined simultaneously" +#endif + +#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_FPRINTF_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_FPRINTF_MACRO defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) &&\ + ( defined(MBEDTLS_PLATFORM_STD_FPRINTF) ||\ + defined(MBEDTLS_PLATFORM_FPRINTF_ALT) ) +#error "MBEDTLS_PLATFORM_FPRINTF_MACRO and MBEDTLS_PLATFORM_STD_FPRINTF/MBEDTLS_PLATFORM_FPRINTF_ALT cannot be defined simultaneously" +#endif + +#if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\ + ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) +#error "MBEDTLS_PLATFORM_FREE_MACRO defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\ + defined(MBEDTLS_PLATFORM_STD_FREE) +#error "MBEDTLS_PLATFORM_FREE_MACRO and MBEDTLS_PLATFORM_STD_FREE cannot be defined simultaneously" +#endif + +#if defined(MBEDTLS_PLATFORM_FREE_MACRO) && !defined(MBEDTLS_PLATFORM_CALLOC_MACRO) +#error "MBEDTLS_PLATFORM_CALLOC_MACRO must be defined if MBEDTLS_PLATFORM_FREE_MACRO is" +#endif + +#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\ + ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) +#error "MBEDTLS_PLATFORM_CALLOC_MACRO defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\ + defined(MBEDTLS_PLATFORM_STD_CALLOC) +#error "MBEDTLS_PLATFORM_CALLOC_MACRO and MBEDTLS_PLATFORM_STD_CALLOC cannot be defined simultaneously" +#endif + +#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) && !defined(MBEDTLS_PLATFORM_FREE_MACRO) +#error "MBEDTLS_PLATFORM_FREE_MACRO must be defined if MBEDTLS_PLATFORM_CALLOC_MACRO is" +#endif + +#if defined(MBEDTLS_PLATFORM_MEMORY) && !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_MEMORY defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_PRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_PRINTF_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_PRINTF_MACRO defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) &&\ + ( defined(MBEDTLS_PLATFORM_STD_PRINTF) ||\ + defined(MBEDTLS_PLATFORM_PRINTF_ALT) ) +#error "MBEDTLS_PLATFORM_PRINTF_MACRO and MBEDTLS_PLATFORM_STD_PRINTF/MBEDTLS_PLATFORM_PRINTF_ALT cannot be defined simultaneously" +#endif + +#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_SNPRINTF_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_SNPRINTF_MACRO defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) &&\ + ( defined(MBEDTLS_PLATFORM_STD_SNPRINTF) ||\ + defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) ) +#error "MBEDTLS_PLATFORM_SNPRINTF_MACRO and MBEDTLS_PLATFORM_STD_SNPRINTF/MBEDTLS_PLATFORM_SNPRINTF_ALT cannot be defined simultaneously" +#endif + +#if defined(MBEDTLS_PLATFORM_VSNPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_VSNPRINTF_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_VSNPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_VSNPRINTF_MACRO defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_VSNPRINTF_MACRO) &&\ + ( defined(MBEDTLS_PLATFORM_STD_VSNPRINTF) ||\ + defined(MBEDTLS_PLATFORM_VSNPRINTF_ALT) ) +#error "MBEDTLS_PLATFORM_VSNPRINTF_MACRO and MBEDTLS_PLATFORM_STD_VSNPRINTF/MBEDTLS_PLATFORM_VSNPRINTF_ALT cannot be defined simultaneously" +#endif + +#if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) &&\ + !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) +#error "MBEDTLS_PLATFORM_STD_MEM_HDR defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_STD_CALLOC) && !defined(MBEDTLS_PLATFORM_MEMORY) +#error "MBEDTLS_PLATFORM_STD_CALLOC defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_STD_FREE) && !defined(MBEDTLS_PLATFORM_MEMORY) +#error "MBEDTLS_PLATFORM_STD_FREE defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_STD_EXIT) &&\ + !defined(MBEDTLS_PLATFORM_EXIT_ALT) +#error "MBEDTLS_PLATFORM_STD_EXIT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_STD_TIME) &&\ + ( !defined(MBEDTLS_PLATFORM_TIME_ALT) ||\ + !defined(MBEDTLS_HAVE_TIME) ) +#error "MBEDTLS_PLATFORM_STD_TIME defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_STD_FPRINTF) &&\ + !defined(MBEDTLS_PLATFORM_FPRINTF_ALT) +#error "MBEDTLS_PLATFORM_STD_FPRINTF defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_STD_PRINTF) &&\ + !defined(MBEDTLS_PLATFORM_PRINTF_ALT) +#error "MBEDTLS_PLATFORM_STD_PRINTF defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_STD_SNPRINTF) &&\ + !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) +#error "MBEDTLS_PLATFORM_STD_SNPRINTF defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_ENTROPY_NV_SEED) &&\ + ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_ENTROPY_C) ) +#error "MBEDTLS_ENTROPY_NV_SEED defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) &&\ + !defined(MBEDTLS_ENTROPY_NV_SEED) +#error "MBEDTLS_PLATFORM_NV_SEED_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) &&\ + !defined(MBEDTLS_PLATFORM_NV_SEED_ALT) +#error "MBEDTLS_PLATFORM_STD_NV_SEED_READ defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) &&\ + !defined(MBEDTLS_PLATFORM_NV_SEED_ALT) +#error "MBEDTLS_PLATFORM_STD_NV_SEED_WRITE defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_NV_SEED_READ_MACRO) &&\ + ( defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) ||\ + defined(MBEDTLS_PLATFORM_NV_SEED_ALT) ) +#error "MBEDTLS_PLATFORM_NV_SEED_READ_MACRO and MBEDTLS_PLATFORM_STD_NV_SEED_READ cannot be defined simultaneously" +#endif + +#if defined(MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO) &&\ + ( defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) ||\ + defined(MBEDTLS_PLATFORM_NV_SEED_ALT) ) +#error "MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO and MBEDTLS_PLATFORM_STD_NV_SEED_WRITE cannot be defined simultaneously" +#endif + +#if defined(MBEDTLS_PSA_CRYPTO_C) && \ + !( ( ( defined(MBEDTLS_CTR_DRBG_C) || defined(MBEDTLS_HMAC_DRBG_C) ) && \ + defined(MBEDTLS_ENTROPY_C) ) || \ + defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) ) +#error "MBEDTLS_PSA_CRYPTO_C defined, but not all prerequisites (missing RNG)" +#endif + +#if defined(MBEDTLS_PSA_CRYPTO_SPM) && !defined(MBEDTLS_PSA_CRYPTO_C) +#error "MBEDTLS_PSA_CRYPTO_SPM defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) && \ + ! ( defined(MBEDTLS_PSA_CRYPTO_C) && \ + defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) ) +#error "MBEDTLS_PSA_CRYPTO_SE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) && \ + ! defined(MBEDTLS_PSA_CRYPTO_C) +#error "MBEDTLS_PSA_CRYPTO_STORAGE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PSA_INJECT_ENTROPY) && \ + !( defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) && \ + defined(MBEDTLS_ENTROPY_NV_SEED) ) +#error "MBEDTLS_PSA_INJECT_ENTROPY defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PSA_INJECT_ENTROPY) && \ + !defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) +#error "MBEDTLS_PSA_INJECT_ENTROPY is not compatible with actual entropy sources" +#endif + +#if defined(MBEDTLS_PSA_INJECT_ENTROPY) && \ + defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) +#error "MBEDTLS_PSA_INJECT_ENTROPY is not compatible with MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG" +#endif + +#if defined(MBEDTLS_PSA_ITS_FILE_C) && \ + !defined(MBEDTLS_FS_IO) +#error "MBEDTLS_PSA_ITS_FILE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER) && \ + defined(MBEDTLS_USE_PSA_CRYPTO) +#error "MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER defined, but it cannot coexist with MBEDTLS_USE_PSA_CRYPTO." +#endif + +#if defined(MBEDTLS_PK_C) && defined(MBEDTLS_USE_PSA_CRYPTO) && \ + !defined(MBEDTLS_PK_WRITE_C) && defined(MBEDTLS_ECDSA_C) +#error "MBEDTLS_PK_C in configuration with MBEDTLS_USE_PSA_CRYPTO and \ + MBEDTLS_ECDSA_C requires MBEDTLS_PK_WRITE_C to be defined." +#endif + +#if defined(MBEDTLS_PSA_CRYPTO_C) && defined(MBEDTLS_RSA_C) && \ + !( defined(MBEDTLS_PK_PARSE_C) && defined(MBEDTLS_PK_WRITE_C) ) +#error "MBEDTLS_PSA_CRYPTO_C with MBEDTLS_RSA_C requires MBEDTLS_PK_PARSE_C and MBEDTLS_PK_WRITE_C" +#endif + +#if defined(MBEDTLS_RSA_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ + !defined(MBEDTLS_OID_C) ) +#error "MBEDTLS_RSA_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_RSA_C) && ( !defined(MBEDTLS_PKCS1_V21) && \ + !defined(MBEDTLS_PKCS1_V15) ) +#error "MBEDTLS_RSA_C defined, but none of the PKCS1 versions enabled" +#endif + +#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && \ + ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_PKCS1_V21) ) +#error "MBEDTLS_X509_RSASSA_PSS_SUPPORT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SHA512_NO_SHA384) && !defined(MBEDTLS_SHA512_C) +#error "MBEDTLS_SHA512_NO_SHA384 defined without MBEDTLS_SHA512_C" +#endif + +#if defined(MBEDTLS_SSL_PROTO_SSL3) && ( !defined(MBEDTLS_MD5_C) || \ + !defined(MBEDTLS_SHA1_C) ) +#error "MBEDTLS_SSL_PROTO_SSL3 defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_PROTO_TLS1) && ( !defined(MBEDTLS_MD5_C) || \ + !defined(MBEDTLS_SHA1_C) ) +#error "MBEDTLS_SSL_PROTO_TLS1 defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_PROTO_TLS1_1) && ( !defined(MBEDTLS_MD5_C) || \ + !defined(MBEDTLS_SHA1_C) ) +#error "MBEDTLS_SSL_PROTO_TLS1_1 defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && ( !defined(MBEDTLS_SHA1_C) && \ + !defined(MBEDTLS_SHA256_C) && !defined(MBEDTLS_SHA512_C) ) +#error "MBEDTLS_SSL_PROTO_TLS1_2 defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) && ( !defined(MBEDTLS_HKDF_C) && \ + !defined(MBEDTLS_SHA256_C) && !defined(MBEDTLS_SHA512_C) ) +#error "MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL defined, but not all prerequisites" +#endif + +#if (defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)) && \ + !(defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) ) +#error "One or more versions of the TLS protocol are enabled " \ + "but no key exchange methods defined with MBEDTLS_KEY_EXCHANGE_xxxx" +#endif + +#if defined(MBEDTLS_SSL_PROTO_DTLS) && \ + !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ + !defined(MBEDTLS_SSL_PROTO_TLS1_2) +#error "MBEDTLS_SSL_PROTO_DTLS defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_CLI_C) && !defined(MBEDTLS_SSL_TLS_C) +#error "MBEDTLS_SSL_CLI_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_TLS_C) && ( !defined(MBEDTLS_CIPHER_C) || \ + !defined(MBEDTLS_MD_C) ) +#error "MBEDTLS_SSL_TLS_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_SRV_C) && !defined(MBEDTLS_SSL_TLS_C) +#error "MBEDTLS_SSL_SRV_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_TLS_C) && (!defined(MBEDTLS_SSL_PROTO_SSL3) && \ + !defined(MBEDTLS_SSL_PROTO_TLS1) && !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ + !defined(MBEDTLS_SSL_PROTO_TLS1_2)) +#error "MBEDTLS_SSL_TLS_C defined, but no protocols are active" +#endif + +#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) && !defined(MBEDTLS_SSL_PROTO_TLS1)) +#error "Illegal protocol selection" +#endif + +#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_TLS1) && \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) && !defined(MBEDTLS_SSL_PROTO_TLS1_1)) +#error "Illegal protocol selection" +#endif + +#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) && (!defined(MBEDTLS_SSL_PROTO_TLS1) || \ + !defined(MBEDTLS_SSL_PROTO_TLS1_1))) +#error "Illegal protocol selection" +#endif + +#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && !defined(MBEDTLS_SSL_PROTO_DTLS) +#error "MBEDTLS_SSL_DTLS_HELLO_VERIFY defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && \ + !defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) +#error "MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) && \ + ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ) +#error "MBEDTLS_SSL_DTLS_ANTI_REPLAY defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) && \ + ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ) +#error "MBEDTLS_SSL_DTLS_CONNECTION_ID defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) && \ + defined(MBEDTLS_SSL_CID_IN_LEN_MAX) && \ + MBEDTLS_SSL_CID_IN_LEN_MAX > 255 +#error "MBEDTLS_SSL_CID_IN_LEN_MAX too large (max 255)" +#endif + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) && \ + defined(MBEDTLS_SSL_CID_OUT_LEN_MAX) && \ + MBEDTLS_SSL_CID_OUT_LEN_MAX > 255 +#error "MBEDTLS_SSL_CID_OUT_LEN_MAX too large (max 255)" +#endif + +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) && \ + ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ) +#error "MBEDTLS_SSL_DTLS_BADMAC_LIMIT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \ + !defined(MBEDTLS_SSL_PROTO_TLS1) && \ + !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ + !defined(MBEDTLS_SSL_PROTO_TLS1_2) +#error "MBEDTLS_SSL_ENCRYPT_THEN_MAC defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \ + !defined(MBEDTLS_SSL_PROTO_TLS1) && \ + !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ + !defined(MBEDTLS_SSL_PROTO_TLS1_2) +#error "MBEDTLS_SSL_EXTENDED_MASTER_SECRET defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_TICKET_C) && !defined(MBEDTLS_CIPHER_C) +#error "MBEDTLS_SSL_TICKET_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_TICKET_C) && \ + !( defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) || defined(MBEDTLS_CHACHAPOLY_C) ) +#error "MBEDTLS_SSL_TICKET_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) && \ + !defined(MBEDTLS_SSL_PROTO_SSL3) && !defined(MBEDTLS_SSL_PROTO_TLS1) +#error "MBEDTLS_SSL_CBC_RECORD_SPLITTING defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && \ + !defined(MBEDTLS_X509_CRT_PARSE_C) +#error "MBEDTLS_SSL_SERVER_NAME_INDICATION defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_THREADING_PTHREAD) +#if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL) +#error "MBEDTLS_THREADING_PTHREAD defined, but not all prerequisites" +#endif +#define MBEDTLS_THREADING_IMPL +#endif + +#if defined(MBEDTLS_THREADING_ALT) +#if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL) +#error "MBEDTLS_THREADING_ALT defined, but not all prerequisites" +#endif +#define MBEDTLS_THREADING_IMPL +#endif + +#if defined(MBEDTLS_THREADING_C) && !defined(MBEDTLS_THREADING_IMPL) +#error "MBEDTLS_THREADING_C defined, single threading implementation required" +#endif +#undef MBEDTLS_THREADING_IMPL + +#if defined(MBEDTLS_USE_PSA_CRYPTO) && !defined(MBEDTLS_PSA_CRYPTO_C) +#error "MBEDTLS_USE_PSA_CRYPTO defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_VERSION_FEATURES) && !defined(MBEDTLS_VERSION_C) +#error "MBEDTLS_VERSION_FEATURES defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_X509_USE_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ + !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_PARSE_C) || \ + !defined(MBEDTLS_PK_PARSE_C) ) +#error "MBEDTLS_X509_USE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_X509_CREATE_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ + !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_WRITE_C) || \ + !defined(MBEDTLS_PK_WRITE_C) ) +#error "MBEDTLS_X509_CREATE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_CERTS_C) && !defined(MBEDTLS_X509_USE_C) +#error "MBEDTLS_CERTS_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) +#error "MBEDTLS_X509_CRT_PARSE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_X509_CRL_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) +#error "MBEDTLS_X509_CRL_PARSE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_X509_CSR_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) +#error "MBEDTLS_X509_CSR_PARSE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_X509_CRT_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) ) +#error "MBEDTLS_X509_CRT_WRITE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_X509_CSR_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) ) +#error "MBEDTLS_X509_CSR_WRITE_C defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_HAVE_INT32) && defined(MBEDTLS_HAVE_INT64) +#error "MBEDTLS_HAVE_INT32 and MBEDTLS_HAVE_INT64 cannot be defined simultaneously" +#endif /* MBEDTLS_HAVE_INT32 && MBEDTLS_HAVE_INT64 */ + +#if ( defined(MBEDTLS_HAVE_INT32) || defined(MBEDTLS_HAVE_INT64) ) && \ + defined(MBEDTLS_HAVE_ASM) +#error "MBEDTLS_HAVE_INT32/MBEDTLS_HAVE_INT64 and MBEDTLS_HAVE_ASM cannot be defined simultaneously" +#endif /* (MBEDTLS_HAVE_INT32 || MBEDTLS_HAVE_INT64) && MBEDTLS_HAVE_ASM */ + +#if defined(MBEDTLS_SSL_PROTO_SSL3) +#if defined(MBEDTLS_DEPRECATED_REMOVED) +#error "MBEDTLS_SSL_PROTO_SSL3 is deprecated and will be removed in a future version of Mbed TLS" +#elif defined(MBEDTLS_DEPRECATED_WARNING) +#warning "MBEDTLS_SSL_PROTO_SSL3 is deprecated and will be removed in a future version of Mbed TLS" +#endif +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ + +#if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) +#if defined(MBEDTLS_DEPRECATED_REMOVED) +#error "MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO is deprecated and will be removed in a future version of Mbed TLS" +#elif defined(MBEDTLS_DEPRECATED_WARNING) +#warning "MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO is deprecated and will be removed in a future version of Mbed TLS" +#endif +#endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */ + +#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) +#if defined(MBEDTLS_DEPRECATED_REMOVED) +#error "MBEDTLS_SSL_HW_RECORD_ACCEL is deprecated and will be removed in a future version of Mbed TLS" +#elif defined(MBEDTLS_DEPRECATED_WARNING) +#warning "MBEDTLS_SSL_HW_RECORD_ACCEL is deprecated and will be removed in a future version of Mbed TLS" +#endif /* MBEDTLS_DEPRECATED_REMOVED */ +#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ + +#if defined(MBEDTLS_SSL_DTLS_SRTP) && ( !defined(MBEDTLS_SSL_PROTO_DTLS) ) +#error "MBEDTLS_SSL_DTLS_SRTP defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) && ( !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) ) +#error "MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION) && !( defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) || defined(MBEDTLS_CHACHAPOLY_C) ) +#error "MBEDTLS_SSL_CONTEXT_SERIALIZATION defined, but not all prerequisites" +#endif + +/* + * Avoid warning from -pedantic. This is a convenient place for this + * workaround since this is included by every single file before the + * #if defined(MBEDTLS_xxx_C) that results in empty translation units. + */ +typedef int mbedtls_iso_c_forbids_empty_translation_units; + +/* *INDENT-ON* */ +#endif /* MBEDTLS_CHECK_CONFIG_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/cipher.h b/ext/opcua_client/mbedtls/include/mbedtls/cipher.h new file mode 100644 index 0000000..db73c1b --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/cipher.h @@ -0,0 +1,1135 @@ +/** + * \file cipher.h + * + * \brief This file contains an abstraction interface for use with the cipher + * primitives provided by the library. It provides a common interface to all of + * the available cipher operations. + * + * \author Adriaan de Jong + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_CIPHER_H +#define MBEDTLS_CIPHER_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include "mbedtls/platform_util.h" + +#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) || defined(MBEDTLS_CHACHAPOLY_C) +#define MBEDTLS_CIPHER_MODE_AEAD +#endif + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#define MBEDTLS_CIPHER_MODE_WITH_PADDING +#endif + +#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) || \ + defined(MBEDTLS_CHACHA20_C) +#define MBEDTLS_CIPHER_MODE_STREAM +#endif + +#if (defined(__ARMCC_VERSION) || defined(_MSC_VER)) && \ + !defined(inline) && !defined(__cplusplus) +#define inline __inline +#endif + +/** The selected feature is not available. */ +#define MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE -0x6080 +/** Bad input parameters. */ +#define MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA -0x6100 +/** Failed to allocate memory. */ +#define MBEDTLS_ERR_CIPHER_ALLOC_FAILED -0x6180 +/** Input data contains invalid padding and is rejected. */ +#define MBEDTLS_ERR_CIPHER_INVALID_PADDING -0x6200 +/** Decryption of block requires a full block. */ +#define MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED -0x6280 +/** Authentication failed (for AEAD modes). */ +#define MBEDTLS_ERR_CIPHER_AUTH_FAILED -0x6300 +/** The context is invalid. For example, because it was freed. */ +#define MBEDTLS_ERR_CIPHER_INVALID_CONTEXT -0x6380 + +/* MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** Cipher hardware accelerator failed. */ +#define MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED -0x6400 + +#define MBEDTLS_CIPHER_VARIABLE_IV_LEN 0x01 /**< Cipher accepts IVs of variable length. */ +#define MBEDTLS_CIPHER_VARIABLE_KEY_LEN 0x02 /**< Cipher accepts keys of variable length. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Supported cipher types. + * + * \warning RC4 and DES/3DES are considered weak ciphers and their use + * constitutes a security risk. We recommend considering stronger + * ciphers instead. + */ +typedef enum { + MBEDTLS_CIPHER_ID_NONE = 0, /**< Placeholder to mark the end of cipher ID lists. */ + MBEDTLS_CIPHER_ID_NULL, /**< The identity cipher, treated as a stream cipher. */ + MBEDTLS_CIPHER_ID_AES, /**< The AES cipher. */ + MBEDTLS_CIPHER_ID_DES, /**< The DES cipher. \warning DES is considered weak. */ + MBEDTLS_CIPHER_ID_3DES, /**< The Triple DES cipher. \warning 3DES is considered weak. */ + MBEDTLS_CIPHER_ID_CAMELLIA, /**< The Camellia cipher. */ + MBEDTLS_CIPHER_ID_BLOWFISH, /**< The Blowfish cipher. */ + MBEDTLS_CIPHER_ID_ARC4, /**< The RC4 cipher. */ + MBEDTLS_CIPHER_ID_ARIA, /**< The Aria cipher. */ + MBEDTLS_CIPHER_ID_CHACHA20, /**< The ChaCha20 cipher. */ +} mbedtls_cipher_id_t; + +/** + * \brief Supported {cipher type, cipher mode} pairs. + * + * \warning RC4 and DES/3DES are considered weak ciphers and their use + * constitutes a security risk. We recommend considering stronger + * ciphers instead. + */ +typedef enum { + MBEDTLS_CIPHER_NONE = 0, /**< Placeholder to mark the end of cipher-pair lists. */ + MBEDTLS_CIPHER_NULL, /**< The identity stream cipher. */ + MBEDTLS_CIPHER_AES_128_ECB, /**< AES cipher with 128-bit ECB mode. */ + MBEDTLS_CIPHER_AES_192_ECB, /**< AES cipher with 192-bit ECB mode. */ + MBEDTLS_CIPHER_AES_256_ECB, /**< AES cipher with 256-bit ECB mode. */ + MBEDTLS_CIPHER_AES_128_CBC, /**< AES cipher with 128-bit CBC mode. */ + MBEDTLS_CIPHER_AES_192_CBC, /**< AES cipher with 192-bit CBC mode. */ + MBEDTLS_CIPHER_AES_256_CBC, /**< AES cipher with 256-bit CBC mode. */ + MBEDTLS_CIPHER_AES_128_CFB128, /**< AES cipher with 128-bit CFB128 mode. */ + MBEDTLS_CIPHER_AES_192_CFB128, /**< AES cipher with 192-bit CFB128 mode. */ + MBEDTLS_CIPHER_AES_256_CFB128, /**< AES cipher with 256-bit CFB128 mode. */ + MBEDTLS_CIPHER_AES_128_CTR, /**< AES cipher with 128-bit CTR mode. */ + MBEDTLS_CIPHER_AES_192_CTR, /**< AES cipher with 192-bit CTR mode. */ + MBEDTLS_CIPHER_AES_256_CTR, /**< AES cipher with 256-bit CTR mode. */ + MBEDTLS_CIPHER_AES_128_GCM, /**< AES cipher with 128-bit GCM mode. */ + MBEDTLS_CIPHER_AES_192_GCM, /**< AES cipher with 192-bit GCM mode. */ + MBEDTLS_CIPHER_AES_256_GCM, /**< AES cipher with 256-bit GCM mode. */ + MBEDTLS_CIPHER_CAMELLIA_128_ECB, /**< Camellia cipher with 128-bit ECB mode. */ + MBEDTLS_CIPHER_CAMELLIA_192_ECB, /**< Camellia cipher with 192-bit ECB mode. */ + MBEDTLS_CIPHER_CAMELLIA_256_ECB, /**< Camellia cipher with 256-bit ECB mode. */ + MBEDTLS_CIPHER_CAMELLIA_128_CBC, /**< Camellia cipher with 128-bit CBC mode. */ + MBEDTLS_CIPHER_CAMELLIA_192_CBC, /**< Camellia cipher with 192-bit CBC mode. */ + MBEDTLS_CIPHER_CAMELLIA_256_CBC, /**< Camellia cipher with 256-bit CBC mode. */ + MBEDTLS_CIPHER_CAMELLIA_128_CFB128, /**< Camellia cipher with 128-bit CFB128 mode. */ + MBEDTLS_CIPHER_CAMELLIA_192_CFB128, /**< Camellia cipher with 192-bit CFB128 mode. */ + MBEDTLS_CIPHER_CAMELLIA_256_CFB128, /**< Camellia cipher with 256-bit CFB128 mode. */ + MBEDTLS_CIPHER_CAMELLIA_128_CTR, /**< Camellia cipher with 128-bit CTR mode. */ + MBEDTLS_CIPHER_CAMELLIA_192_CTR, /**< Camellia cipher with 192-bit CTR mode. */ + MBEDTLS_CIPHER_CAMELLIA_256_CTR, /**< Camellia cipher with 256-bit CTR mode. */ + MBEDTLS_CIPHER_CAMELLIA_128_GCM, /**< Camellia cipher with 128-bit GCM mode. */ + MBEDTLS_CIPHER_CAMELLIA_192_GCM, /**< Camellia cipher with 192-bit GCM mode. */ + MBEDTLS_CIPHER_CAMELLIA_256_GCM, /**< Camellia cipher with 256-bit GCM mode. */ + MBEDTLS_CIPHER_DES_ECB, /**< DES cipher with ECB mode. \warning DES is considered weak. */ + MBEDTLS_CIPHER_DES_CBC, /**< DES cipher with CBC mode. \warning DES is considered weak. */ + MBEDTLS_CIPHER_DES_EDE_ECB, /**< DES cipher with EDE ECB mode. \warning 3DES is considered weak. */ + MBEDTLS_CIPHER_DES_EDE_CBC, /**< DES cipher with EDE CBC mode. \warning 3DES is considered weak. */ + MBEDTLS_CIPHER_DES_EDE3_ECB, /**< DES cipher with EDE3 ECB mode. \warning 3DES is considered weak. */ + MBEDTLS_CIPHER_DES_EDE3_CBC, /**< DES cipher with EDE3 CBC mode. \warning 3DES is considered weak. */ + MBEDTLS_CIPHER_BLOWFISH_ECB, /**< Blowfish cipher with ECB mode. */ + MBEDTLS_CIPHER_BLOWFISH_CBC, /**< Blowfish cipher with CBC mode. */ + MBEDTLS_CIPHER_BLOWFISH_CFB64, /**< Blowfish cipher with CFB64 mode. */ + MBEDTLS_CIPHER_BLOWFISH_CTR, /**< Blowfish cipher with CTR mode. */ + MBEDTLS_CIPHER_ARC4_128, /**< RC4 cipher with 128-bit mode. */ + MBEDTLS_CIPHER_AES_128_CCM, /**< AES cipher with 128-bit CCM mode. */ + MBEDTLS_CIPHER_AES_192_CCM, /**< AES cipher with 192-bit CCM mode. */ + MBEDTLS_CIPHER_AES_256_CCM, /**< AES cipher with 256-bit CCM mode. */ + MBEDTLS_CIPHER_CAMELLIA_128_CCM, /**< Camellia cipher with 128-bit CCM mode. */ + MBEDTLS_CIPHER_CAMELLIA_192_CCM, /**< Camellia cipher with 192-bit CCM mode. */ + MBEDTLS_CIPHER_CAMELLIA_256_CCM, /**< Camellia cipher with 256-bit CCM mode. */ + MBEDTLS_CIPHER_ARIA_128_ECB, /**< Aria cipher with 128-bit key and ECB mode. */ + MBEDTLS_CIPHER_ARIA_192_ECB, /**< Aria cipher with 192-bit key and ECB mode. */ + MBEDTLS_CIPHER_ARIA_256_ECB, /**< Aria cipher with 256-bit key and ECB mode. */ + MBEDTLS_CIPHER_ARIA_128_CBC, /**< Aria cipher with 128-bit key and CBC mode. */ + MBEDTLS_CIPHER_ARIA_192_CBC, /**< Aria cipher with 192-bit key and CBC mode. */ + MBEDTLS_CIPHER_ARIA_256_CBC, /**< Aria cipher with 256-bit key and CBC mode. */ + MBEDTLS_CIPHER_ARIA_128_CFB128, /**< Aria cipher with 128-bit key and CFB-128 mode. */ + MBEDTLS_CIPHER_ARIA_192_CFB128, /**< Aria cipher with 192-bit key and CFB-128 mode. */ + MBEDTLS_CIPHER_ARIA_256_CFB128, /**< Aria cipher with 256-bit key and CFB-128 mode. */ + MBEDTLS_CIPHER_ARIA_128_CTR, /**< Aria cipher with 128-bit key and CTR mode. */ + MBEDTLS_CIPHER_ARIA_192_CTR, /**< Aria cipher with 192-bit key and CTR mode. */ + MBEDTLS_CIPHER_ARIA_256_CTR, /**< Aria cipher with 256-bit key and CTR mode. */ + MBEDTLS_CIPHER_ARIA_128_GCM, /**< Aria cipher with 128-bit key and GCM mode. */ + MBEDTLS_CIPHER_ARIA_192_GCM, /**< Aria cipher with 192-bit key and GCM mode. */ + MBEDTLS_CIPHER_ARIA_256_GCM, /**< Aria cipher with 256-bit key and GCM mode. */ + MBEDTLS_CIPHER_ARIA_128_CCM, /**< Aria cipher with 128-bit key and CCM mode. */ + MBEDTLS_CIPHER_ARIA_192_CCM, /**< Aria cipher with 192-bit key and CCM mode. */ + MBEDTLS_CIPHER_ARIA_256_CCM, /**< Aria cipher with 256-bit key and CCM mode. */ + MBEDTLS_CIPHER_AES_128_OFB, /**< AES 128-bit cipher in OFB mode. */ + MBEDTLS_CIPHER_AES_192_OFB, /**< AES 192-bit cipher in OFB mode. */ + MBEDTLS_CIPHER_AES_256_OFB, /**< AES 256-bit cipher in OFB mode. */ + MBEDTLS_CIPHER_AES_128_XTS, /**< AES 128-bit cipher in XTS block mode. */ + MBEDTLS_CIPHER_AES_256_XTS, /**< AES 256-bit cipher in XTS block mode. */ + MBEDTLS_CIPHER_CHACHA20, /**< ChaCha20 stream cipher. */ + MBEDTLS_CIPHER_CHACHA20_POLY1305, /**< ChaCha20-Poly1305 AEAD cipher. */ + MBEDTLS_CIPHER_AES_128_KW, /**< AES cipher with 128-bit NIST KW mode. */ + MBEDTLS_CIPHER_AES_192_KW, /**< AES cipher with 192-bit NIST KW mode. */ + MBEDTLS_CIPHER_AES_256_KW, /**< AES cipher with 256-bit NIST KW mode. */ + MBEDTLS_CIPHER_AES_128_KWP, /**< AES cipher with 128-bit NIST KWP mode. */ + MBEDTLS_CIPHER_AES_192_KWP, /**< AES cipher with 192-bit NIST KWP mode. */ + MBEDTLS_CIPHER_AES_256_KWP, /**< AES cipher with 256-bit NIST KWP mode. */ +} mbedtls_cipher_type_t; + +/** Supported cipher modes. */ +typedef enum { + MBEDTLS_MODE_NONE = 0, /**< None. */ + MBEDTLS_MODE_ECB, /**< The ECB cipher mode. */ + MBEDTLS_MODE_CBC, /**< The CBC cipher mode. */ + MBEDTLS_MODE_CFB, /**< The CFB cipher mode. */ + MBEDTLS_MODE_OFB, /**< The OFB cipher mode. */ + MBEDTLS_MODE_CTR, /**< The CTR cipher mode. */ + MBEDTLS_MODE_GCM, /**< The GCM cipher mode. */ + MBEDTLS_MODE_STREAM, /**< The stream cipher mode. */ + MBEDTLS_MODE_CCM, /**< The CCM cipher mode. */ + MBEDTLS_MODE_XTS, /**< The XTS cipher mode. */ + MBEDTLS_MODE_CHACHAPOLY, /**< The ChaCha-Poly cipher mode. */ + MBEDTLS_MODE_KW, /**< The SP800-38F KW mode */ + MBEDTLS_MODE_KWP, /**< The SP800-38F KWP mode */ +} mbedtls_cipher_mode_t; + +/** Supported cipher padding types. */ +typedef enum { + MBEDTLS_PADDING_PKCS7 = 0, /**< PKCS7 padding (default). */ + MBEDTLS_PADDING_ONE_AND_ZEROS, /**< ISO/IEC 7816-4 padding. */ + MBEDTLS_PADDING_ZEROS_AND_LEN, /**< ANSI X.923 padding. */ + MBEDTLS_PADDING_ZEROS, /**< Zero padding (not reversible). */ + MBEDTLS_PADDING_NONE, /**< Never pad (full blocks only). */ +} mbedtls_cipher_padding_t; + +/** Type of operation. */ +typedef enum { + MBEDTLS_OPERATION_NONE = -1, + MBEDTLS_DECRYPT = 0, + MBEDTLS_ENCRYPT, +} mbedtls_operation_t; + +enum { + /** Undefined key length. */ + MBEDTLS_KEY_LENGTH_NONE = 0, + /** Key length, in bits (including parity), for DES keys. \warning DES is considered weak. */ + MBEDTLS_KEY_LENGTH_DES = 64, + /** Key length in bits, including parity, for DES in two-key EDE. \warning 3DES is considered weak. */ + MBEDTLS_KEY_LENGTH_DES_EDE = 128, + /** Key length in bits, including parity, for DES in three-key EDE. \warning 3DES is considered weak. */ + MBEDTLS_KEY_LENGTH_DES_EDE3 = 192, +}; + +/** Maximum length of any IV, in Bytes. */ +/* This should ideally be derived automatically from list of ciphers. + * This should be kept in sync with MBEDTLS_SSL_MAX_IV_LENGTH defined + * in ssl_internal.h. */ +#define MBEDTLS_MAX_IV_LENGTH 16 + +/** Maximum block size of any cipher, in Bytes. */ +/* This should ideally be derived automatically from list of ciphers. + * This should be kept in sync with MBEDTLS_SSL_MAX_BLOCK_LENGTH defined + * in ssl_internal.h. */ +#define MBEDTLS_MAX_BLOCK_LENGTH 16 + +/** Maximum key length, in Bytes. */ +/* This should ideally be derived automatically from list of ciphers. + * For now, only check whether XTS is enabled which uses 64 Byte keys, + * and use 32 Bytes as an upper bound for the maximum key length otherwise. + * This should be kept in sync with MBEDTLS_SSL_MAX_BLOCK_LENGTH defined + * in ssl_internal.h, which however deliberately ignores the case of XTS + * since the latter isn't used in SSL/TLS. */ +#if defined(MBEDTLS_CIPHER_MODE_XTS) +#define MBEDTLS_MAX_KEY_LENGTH 64 +#else +#define MBEDTLS_MAX_KEY_LENGTH 32 +#endif /* MBEDTLS_CIPHER_MODE_XTS */ + +/** + * Base cipher information (opaque struct). + */ +typedef struct mbedtls_cipher_base_t mbedtls_cipher_base_t; + +/** + * CMAC context (opaque struct). + */ +typedef struct mbedtls_cmac_context_t mbedtls_cmac_context_t; + +/** + * Cipher information. Allows calling cipher functions + * in a generic way. + */ +typedef struct mbedtls_cipher_info_t { + /** Full cipher identifier. For example, + * MBEDTLS_CIPHER_AES_256_CBC. + */ + mbedtls_cipher_type_t type; + + /** The cipher mode. For example, MBEDTLS_MODE_CBC. */ + mbedtls_cipher_mode_t mode; + + /** The cipher key length, in bits. This is the + * default length for variable sized ciphers. + * Includes parity bits for ciphers like DES. + */ + unsigned int key_bitlen; + + /** Name of the cipher. */ + const char *name; + + /** IV or nonce size, in Bytes. + * For ciphers that accept variable IV sizes, + * this is the recommended size. + */ + unsigned int iv_size; + + /** Bitflag comprised of MBEDTLS_CIPHER_VARIABLE_IV_LEN and + * MBEDTLS_CIPHER_VARIABLE_KEY_LEN indicating whether the + * cipher supports variable IV or variable key sizes, respectively. + */ + int flags; + + /** The block size, in Bytes. */ + unsigned int block_size; + + /** Struct for base cipher information and functions. */ + const mbedtls_cipher_base_t *base; + +} mbedtls_cipher_info_t; + +/** + * Generic cipher context. + */ +typedef struct mbedtls_cipher_context_t { + /** Information about the associated cipher. */ + const mbedtls_cipher_info_t *cipher_info; + + /** Key length to use. */ + int key_bitlen; + + /** Operation that the key of the context has been + * initialized for. + */ + mbedtls_operation_t operation; + +#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) + /** Padding functions to use, if relevant for + * the specific cipher mode. + */ + void (*add_padding)(unsigned char *output, size_t olen, size_t data_len); + int (*get_padding)(unsigned char *input, size_t ilen, size_t *data_len); +#endif + + /** Buffer for input that has not been processed yet. */ + unsigned char unprocessed_data[MBEDTLS_MAX_BLOCK_LENGTH]; + + /** Number of Bytes that have not been processed yet. */ + size_t unprocessed_len; + + /** Current IV or NONCE_COUNTER for CTR-mode, data unit (or sector) number + * for XTS-mode. */ + unsigned char iv[MBEDTLS_MAX_IV_LENGTH]; + + /** IV size in Bytes, for ciphers with variable-length IVs. */ + size_t iv_size; + + /** The cipher-specific context. */ + void *cipher_ctx; + +#if defined(MBEDTLS_CMAC_C) + /** CMAC-specific context. */ + mbedtls_cmac_context_t *cmac_ctx; +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + /** Indicates whether the cipher operations should be performed + * by Mbed TLS' own crypto library or an external implementation + * of the PSA Crypto API. + * This is unset if the cipher context was established through + * mbedtls_cipher_setup(), and set if it was established through + * mbedtls_cipher_setup_psa(). + */ + unsigned char psa_enabled; +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +} mbedtls_cipher_context_t; + +/** + * \brief This function retrieves the list of ciphers supported + * by the generic cipher module. + * + * For any cipher identifier in the returned list, you can + * obtain the corresponding generic cipher information structure + * via mbedtls_cipher_info_from_type(), which can then be used + * to prepare a cipher context via mbedtls_cipher_setup(). + * + * + * \return A statically-allocated array of cipher identifiers + * of type cipher_type_t. The last entry is zero. + */ +const int *mbedtls_cipher_list(void); + +/** + * \brief This function retrieves the cipher-information + * structure associated with the given cipher name. + * + * \param cipher_name Name of the cipher to search for. This must not be + * \c NULL. + * + * \return The cipher information structure associated with the + * given \p cipher_name. + * \return \c NULL if the associated cipher information is not found. + */ +const mbedtls_cipher_info_t *mbedtls_cipher_info_from_string(const char *cipher_name); + +/** + * \brief This function retrieves the cipher-information + * structure associated with the given cipher type. + * + * \param cipher_type Type of the cipher to search for. + * + * \return The cipher information structure associated with the + * given \p cipher_type. + * \return \c NULL if the associated cipher information is not found. + */ +const mbedtls_cipher_info_t *mbedtls_cipher_info_from_type(const mbedtls_cipher_type_t cipher_type); + +/** + * \brief This function retrieves the cipher-information + * structure associated with the given cipher ID, + * key size and mode. + * + * \param cipher_id The ID of the cipher to search for. For example, + * #MBEDTLS_CIPHER_ID_AES. + * \param key_bitlen The length of the key in bits. + * \param mode The cipher mode. For example, #MBEDTLS_MODE_CBC. + * + * \return The cipher information structure associated with the + * given \p cipher_id. + * \return \c NULL if the associated cipher information is not found. + */ +const mbedtls_cipher_info_t *mbedtls_cipher_info_from_values(const mbedtls_cipher_id_t cipher_id, + int key_bitlen, + const mbedtls_cipher_mode_t mode); + +/** + * \brief This function initializes a \p ctx as NONE. + * + * \param ctx The context to be initialized. This must not be \c NULL. + */ +void mbedtls_cipher_init(mbedtls_cipher_context_t *ctx); + +/** + * \brief This function frees and clears the cipher-specific + * context of \p ctx. Freeing \p ctx itself remains the + * responsibility of the caller. + * + * \param ctx The context to be freed. If this is \c NULL, the + * function has no effect, otherwise this must point to an + * initialized context. + */ +void mbedtls_cipher_free(mbedtls_cipher_context_t *ctx); + + +/** + * \brief This function prepares a cipher context for + * use with the given cipher primitive. + * + * \warning In CBC mode, if mbedtls_cipher_set_padding_mode() is not called: + * - If MBEDTLS_CIPHER_PADDING_PKCS7 is enabled, the + * context will use PKCS7 padding. + * - Otherwise the context uses no padding and the input + * must be a whole number of blocks. + * + * \note After calling this function, you should call + * mbedtls_cipher_setkey() and, if the mode uses padding, + * mbedtls_cipher_set_padding_mode(), then for each + * message to encrypt or decrypt with this key, either: + * - mbedtls_cipher_crypt() for one-shot processing with + * non-AEAD modes; + * - mbedtls_cipher_auth_encrypt_ext() or + * mbedtls_cipher_auth_decrypt_ext() for one-shot + * processing with AEAD modes or NIST_KW; + * - for multi-part processing, see the documentation of + * mbedtls_cipher_reset(). + * + * \param ctx The context to prepare. This must be initialized by + * a call to mbedtls_cipher_init() first. + * \param cipher_info The cipher to use. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on + * parameter-verification failure. + * \return #MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the + * cipher-specific context fails. + * + * \internal Currently, the function also clears the structure. + * In future versions, the caller will be required to call + * mbedtls_cipher_init() on the structure first. + */ +int mbedtls_cipher_setup(mbedtls_cipher_context_t *ctx, + const mbedtls_cipher_info_t *cipher_info); + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +/** + * \brief This function initializes a cipher context for + * PSA-based use with the given cipher primitive. + * + * \note See #MBEDTLS_USE_PSA_CRYPTO for information on PSA. + * + * \param ctx The context to initialize. May not be \c NULL. + * \param cipher_info The cipher to use. + * \param taglen For AEAD ciphers, the length in bytes of the + * authentication tag to use. Subsequent uses of + * mbedtls_cipher_auth_encrypt() or + * mbedtls_cipher_auth_decrypt() must provide + * the same tag length. + * For non-AEAD ciphers, the value must be \c 0. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on + * parameter-verification failure. + * \return #MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the + * cipher-specific context fails. + */ +int mbedtls_cipher_setup_psa(mbedtls_cipher_context_t *ctx, + const mbedtls_cipher_info_t *cipher_info, + size_t taglen); +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +/** + * \brief This function returns the block size of the given cipher. + * + * \param ctx The context of the cipher. This must be initialized. + * + * \return The block size of the underlying cipher. + * \return \c 0 if \p ctx has not been initialized. + */ +static inline unsigned int mbedtls_cipher_get_block_size( + const mbedtls_cipher_context_t *ctx) +{ + MBEDTLS_INTERNAL_VALIDATE_RET(ctx != NULL, 0); + if (ctx->cipher_info == NULL) { + return 0; + } + + return ctx->cipher_info->block_size; +} + +/** + * \brief This function returns the mode of operation for + * the cipher. For example, MBEDTLS_MODE_CBC. + * + * \param ctx The context of the cipher. This must be initialized. + * + * \return The mode of operation. + * \return #MBEDTLS_MODE_NONE if \p ctx has not been initialized. + */ +static inline mbedtls_cipher_mode_t mbedtls_cipher_get_cipher_mode( + const mbedtls_cipher_context_t *ctx) +{ + MBEDTLS_INTERNAL_VALIDATE_RET(ctx != NULL, MBEDTLS_MODE_NONE); + if (ctx->cipher_info == NULL) { + return MBEDTLS_MODE_NONE; + } + + return ctx->cipher_info->mode; +} + +/** + * \brief This function returns the size of the IV or nonce + * of the cipher, in Bytes. + * + * \param ctx The context of the cipher. This must be initialized. + * + * \return The recommended IV size if no IV has been set. + * \return \c 0 for ciphers not using an IV or a nonce. + * \return The actual size if an IV has been set. + */ +static inline int mbedtls_cipher_get_iv_size( + const mbedtls_cipher_context_t *ctx) +{ + MBEDTLS_INTERNAL_VALIDATE_RET(ctx != NULL, 0); + if (ctx->cipher_info == NULL) { + return 0; + } + + if (ctx->iv_size != 0) { + return (int) ctx->iv_size; + } + + return (int) ctx->cipher_info->iv_size; +} + +/** + * \brief This function returns the type of the given cipher. + * + * \param ctx The context of the cipher. This must be initialized. + * + * \return The type of the cipher. + * \return #MBEDTLS_CIPHER_NONE if \p ctx has not been initialized. + */ +static inline mbedtls_cipher_type_t mbedtls_cipher_get_type( + const mbedtls_cipher_context_t *ctx) +{ + MBEDTLS_INTERNAL_VALIDATE_RET( + ctx != NULL, MBEDTLS_CIPHER_NONE); + if (ctx->cipher_info == NULL) { + return MBEDTLS_CIPHER_NONE; + } + + return ctx->cipher_info->type; +} + +/** + * \brief This function returns the name of the given cipher + * as a string. + * + * \param ctx The context of the cipher. This must be initialized. + * + * \return The name of the cipher. + * \return NULL if \p ctx has not been not initialized. + */ +static inline const char *mbedtls_cipher_get_name( + const mbedtls_cipher_context_t *ctx) +{ + MBEDTLS_INTERNAL_VALIDATE_RET(ctx != NULL, 0); + if (ctx->cipher_info == NULL) { + return 0; + } + + return ctx->cipher_info->name; +} + +/** + * \brief This function returns the key length of the cipher. + * + * \param ctx The context of the cipher. This must be initialized. + * + * \return The key length of the cipher in bits. + * \return #MBEDTLS_KEY_LENGTH_NONE if \p ctx has not been + * initialized. + */ +static inline int mbedtls_cipher_get_key_bitlen( + const mbedtls_cipher_context_t *ctx) +{ + MBEDTLS_INTERNAL_VALIDATE_RET( + ctx != NULL, MBEDTLS_KEY_LENGTH_NONE); + if (ctx->cipher_info == NULL) { + return MBEDTLS_KEY_LENGTH_NONE; + } + + return (int) ctx->cipher_info->key_bitlen; +} + +/** + * \brief This function returns the operation of the given cipher. + * + * \param ctx The context of the cipher. This must be initialized. + * + * \return The type of operation: #MBEDTLS_ENCRYPT or #MBEDTLS_DECRYPT. + * \return #MBEDTLS_OPERATION_NONE if \p ctx has not been initialized. + */ +static inline mbedtls_operation_t mbedtls_cipher_get_operation( + const mbedtls_cipher_context_t *ctx) +{ + MBEDTLS_INTERNAL_VALIDATE_RET( + ctx != NULL, MBEDTLS_OPERATION_NONE); + if (ctx->cipher_info == NULL) { + return MBEDTLS_OPERATION_NONE; + } + + return ctx->operation; +} + +/** + * \brief This function sets the key to use with the given context. + * + * \param ctx The generic cipher context. This must be initialized and + * bound to a cipher information structure. + * \param key The key to use. This must be a readable buffer of at + * least \p key_bitlen Bits. + * \param key_bitlen The key length to use, in Bits. + * \param operation The operation that the key will be used for: + * #MBEDTLS_ENCRYPT or #MBEDTLS_DECRYPT. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on + * parameter-verification failure. + * \return A cipher-specific error code on failure. + */ +int mbedtls_cipher_setkey(mbedtls_cipher_context_t *ctx, + const unsigned char *key, + int key_bitlen, + const mbedtls_operation_t operation); + +#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) +/** + * \brief This function sets the padding mode, for cipher modes + * that use padding. + * + * \param ctx The generic cipher context. This must be initialized and + * bound to a cipher information structure. + * \param mode The padding mode. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE + * if the selected padding mode is not supported. + * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if the cipher mode + * does not support padding. + */ +int mbedtls_cipher_set_padding_mode(mbedtls_cipher_context_t *ctx, + mbedtls_cipher_padding_t mode); +#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ + +/** + * \brief This function sets the initialization vector (IV) + * or nonce. + * + * \note Some ciphers do not use IVs nor nonce. For these + * ciphers, this function has no effect. + * + * \param ctx The generic cipher context. This must be initialized and + * bound to a cipher information structure. + * \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers. This + * must be a readable buffer of at least \p iv_len Bytes. + * \param iv_len The IV length for ciphers with variable-size IV. + * This parameter is discarded by ciphers with fixed-size IV. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on + * parameter-verification failure. + */ +int mbedtls_cipher_set_iv(mbedtls_cipher_context_t *ctx, + const unsigned char *iv, + size_t iv_len); + +/** + * \brief This function resets the cipher state. + * + * \note With non-AEAD ciphers, the order of calls for each message + * is as follows: + * 1. mbedtls_cipher_set_iv() if the mode uses an IV/nonce. + * 2. mbedtls_cipher_reset() + * 3. mbedtls_cipher_update() one or more times + * 4. mbedtls_cipher_finish() + * . + * This sequence can be repeated to encrypt or decrypt multiple + * messages with the same key. + * + * \note With AEAD ciphers, the order of calls for each message + * is as follows: + * 1. mbedtls_cipher_set_iv() if the mode uses an IV/nonce. + * 2. mbedtls_cipher_reset() + * 3. mbedtls_cipher_update_ad() + * 4. mbedtls_cipher_update() one or more times + * 5. mbedtls_cipher_check_tag() (for decryption) or + * mbedtls_cipher_write_tag() (for encryption). + * . + * This sequence can be repeated to encrypt or decrypt multiple + * messages with the same key. + * + * \param ctx The generic cipher context. This must be bound to a key. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on + * parameter-verification failure. + */ +int mbedtls_cipher_reset(mbedtls_cipher_context_t *ctx); + +#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) +/** + * \brief This function adds additional data for AEAD ciphers. + * Currently supported with GCM and ChaCha20+Poly1305. + * This must be called exactly once, after + * mbedtls_cipher_reset(). + * + * \param ctx The generic cipher context. This must be initialized. + * \param ad The additional data to use. This must be a readable + * buffer of at least \p ad_len Bytes. + * \param ad_len The length of \p ad in Bytes. + * + * \return \c 0 on success. + * \return A specific error code on failure. + */ +int mbedtls_cipher_update_ad(mbedtls_cipher_context_t *ctx, + const unsigned char *ad, size_t ad_len); +#endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ + +/** + * \brief The generic cipher update function. It encrypts or + * decrypts using the given cipher context. Writes as + * many block-sized blocks of data as possible to output. + * Any data that cannot be written immediately is either + * added to the next block, or flushed when + * mbedtls_cipher_finish() is called. + * Exception: For MBEDTLS_MODE_ECB, expects a single block + * in size. For example, 16 Bytes for AES. + * + * \note If the underlying cipher is used in GCM mode, all calls + * to this function, except for the last one before + * mbedtls_cipher_finish(), must have \p ilen as a + * multiple of the block size of the cipher. + * + * \param ctx The generic cipher context. This must be initialized and + * bound to a key. + * \param input The buffer holding the input data. This must be a + * readable buffer of at least \p ilen Bytes. + * \param ilen The length of the input data. + * \param output The buffer for the output data. This must be able to + * hold at least `ilen + block_size`. This must not be the + * same buffer as \p input. + * \param olen The length of the output data, to be updated with the + * actual number of Bytes written. This must not be + * \c NULL. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on + * parameter-verification failure. + * \return #MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE on an + * unsupported mode for a cipher. + * \return A cipher-specific error code on failure. + */ +int mbedtls_cipher_update(mbedtls_cipher_context_t *ctx, + const unsigned char *input, + size_t ilen, unsigned char *output, + size_t *olen); + +/** + * \brief The generic cipher finalization function. If data still + * needs to be flushed from an incomplete block, the data + * contained in it is padded to the size of + * the last block, and written to the \p output buffer. + * + * \param ctx The generic cipher context. This must be initialized and + * bound to a key. + * \param output The buffer to write data to. This needs to be a writable + * buffer of at least block_size Bytes. + * \param olen The length of the data written to the \p output buffer. + * This may not be \c NULL. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on + * parameter-verification failure. + * \return #MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED on decryption + * expecting a full block but not receiving one. + * \return #MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding + * while decrypting. + * \return A cipher-specific error code on failure. + */ +int mbedtls_cipher_finish(mbedtls_cipher_context_t *ctx, + unsigned char *output, size_t *olen); + +#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) +/** + * \brief This function writes a tag for AEAD ciphers. + * Currently supported with GCM and ChaCha20+Poly1305. + * This must be called after mbedtls_cipher_finish(). + * + * \param ctx The generic cipher context. This must be initialized, + * bound to a key, and have just completed a cipher + * operation through mbedtls_cipher_finish() the tag for + * which should be written. + * \param tag The buffer to write the tag to. This must be a writable + * buffer of at least \p tag_len Bytes. + * \param tag_len The length of the tag to write. + * + * \return \c 0 on success. + * \return A specific error code on failure. + */ +int mbedtls_cipher_write_tag(mbedtls_cipher_context_t *ctx, + unsigned char *tag, size_t tag_len); + +/** + * \brief This function checks the tag for AEAD ciphers. + * Currently supported with GCM and ChaCha20+Poly1305. + * This must be called after mbedtls_cipher_finish(). + * + * \param ctx The generic cipher context. This must be initialized. + * \param tag The buffer holding the tag. This must be a readable + * buffer of at least \p tag_len Bytes. + * \param tag_len The length of the tag to check. + * + * \return \c 0 on success. + * \return A specific error code on failure. + */ +int mbedtls_cipher_check_tag(mbedtls_cipher_context_t *ctx, + const unsigned char *tag, size_t tag_len); +#endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ + +/** + * \brief The generic all-in-one encryption/decryption function, + * for all ciphers except AEAD constructs. + * + * \param ctx The generic cipher context. This must be initialized. + * \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers. + * This must be a readable buffer of at least \p iv_len + * Bytes. + * \param iv_len The IV length for ciphers with variable-size IV. + * This parameter is discarded by ciphers with fixed-size + * IV. + * \param input The buffer holding the input data. This must be a + * readable buffer of at least \p ilen Bytes. + * \param ilen The length of the input data in Bytes. + * \param output The buffer for the output data. This must be able to + * hold at least `ilen + block_size`. This must not be the + * same buffer as \p input. + * \param olen The length of the output data, to be updated with the + * actual number of Bytes written. This must not be + * \c NULL. + * + * \note Some ciphers do not use IVs nor nonce. For these + * ciphers, use \p iv = NULL and \p iv_len = 0. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on + * parameter-verification failure. + * \return #MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED on decryption + * expecting a full block but not receiving one. + * \return #MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding + * while decrypting. + * \return A cipher-specific error code on failure. + */ +int mbedtls_cipher_crypt(mbedtls_cipher_context_t *ctx, + const unsigned char *iv, size_t iv_len, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen); + +#if defined(MBEDTLS_CIPHER_MODE_AEAD) +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif /* MBEDTLS_DEPRECATED_WARNING */ +/** + * \brief The generic authenticated encryption (AEAD) function. + * + * \deprecated Superseded by mbedtls_cipher_auth_encrypt_ext(). + * + * \note This function only supports AEAD algorithms, not key + * wrapping algorithms such as NIST_KW; for this, see + * mbedtls_cipher_auth_encrypt_ext(). + * + * \param ctx The generic cipher context. This must be initialized and + * bound to a key associated with an AEAD algorithm. + * \param iv The nonce to use. This must be a readable buffer of + * at least \p iv_len Bytes and must not be \c NULL. + * \param iv_len The length of the nonce. This must satisfy the + * constraints imposed by the AEAD cipher used. + * \param ad The additional data to authenticate. This must be a + * readable buffer of at least \p ad_len Bytes, and may + * be \c NULL is \p ad_len is \c 0. + * \param ad_len The length of \p ad. + * \param input The buffer holding the input data. This must be a + * readable buffer of at least \p ilen Bytes, and may be + * \c NULL if \p ilen is \c 0. + * \param ilen The length of the input data. + * \param output The buffer for the output data. This must be a + * writable buffer of at least \p ilen Bytes, and must + * not be \c NULL. + * \param olen This will be filled with the actual number of Bytes + * written to the \p output buffer. This must point to a + * writable object of type \c size_t. + * \param tag The buffer for the authentication tag. This must be a + * writable buffer of at least \p tag_len Bytes. See note + * below regarding restrictions with PSA-based contexts. + * \param tag_len The desired length of the authentication tag. This + * must match the constraints imposed by the AEAD cipher + * used, and in particular must not be \c 0. + * + * \note If the context is based on PSA (that is, it was set up + * with mbedtls_cipher_setup_psa()), then it is required + * that \c tag == output + ilen. That is, the tag must be + * appended to the ciphertext as recommended by RFC 5116. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on + * parameter-verification failure. + * \return A cipher-specific error code on failure. + */ +int MBEDTLS_DEPRECATED mbedtls_cipher_auth_encrypt( + mbedtls_cipher_context_t *ctx, + const unsigned char *iv, size_t iv_len, + const unsigned char *ad, size_t ad_len, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, + unsigned char *tag, size_t tag_len); + +/** + * \brief The generic authenticated decryption (AEAD) function. + * + * \deprecated Superseded by mbedtls_cipher_auth_decrypt_ext(). + * + * \note This function only supports AEAD algorithms, not key + * wrapping algorithms such as NIST_KW; for this, see + * mbedtls_cipher_auth_decrypt_ext(). + * + * \note If the data is not authentic, then the output buffer + * is zeroed out to prevent the unauthentic plaintext being + * used, making this interface safer. + * + * \param ctx The generic cipher context. This must be initialized and + * bound to a key associated with an AEAD algorithm. + * \param iv The nonce to use. This must be a readable buffer of + * at least \p iv_len Bytes and must not be \c NULL. + * \param iv_len The length of the nonce. This must satisfy the + * constraints imposed by the AEAD cipher used. + * \param ad The additional data to authenticate. This must be a + * readable buffer of at least \p ad_len Bytes, and may + * be \c NULL is \p ad_len is \c 0. + * \param ad_len The length of \p ad. + * \param input The buffer holding the input data. This must be a + * readable buffer of at least \p ilen Bytes, and may be + * \c NULL if \p ilen is \c 0. + * \param ilen The length of the input data. + * \param output The buffer for the output data. This must be a + * writable buffer of at least \p ilen Bytes, and must + * not be \c NULL. + * \param olen This will be filled with the actual number of Bytes + * written to the \p output buffer. This must point to a + * writable object of type \c size_t. + * \param tag The buffer for the authentication tag. This must be a + * readable buffer of at least \p tag_len Bytes. See note + * below regarding restrictions with PSA-based contexts. + * \param tag_len The length of the authentication tag. This must match + * the constraints imposed by the AEAD cipher used, and in + * particular must not be \c 0. + * + * \note If the context is based on PSA (that is, it was set up + * with mbedtls_cipher_setup_psa()), then it is required + * that \c tag == input + len. That is, the tag must be + * appended to the ciphertext as recommended by RFC 5116. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on + * parameter-verification failure. + * \return #MBEDTLS_ERR_CIPHER_AUTH_FAILED if data is not authentic. + * \return A cipher-specific error code on failure. + */ +int MBEDTLS_DEPRECATED mbedtls_cipher_auth_decrypt( + mbedtls_cipher_context_t *ctx, + const unsigned char *iv, size_t iv_len, + const unsigned char *ad, size_t ad_len, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, + const unsigned char *tag, size_t tag_len); +#undef MBEDTLS_DEPRECATED +#endif /* MBEDTLS_DEPRECATED_REMOVED */ +#endif /* MBEDTLS_CIPHER_MODE_AEAD */ + +#if defined(MBEDTLS_CIPHER_MODE_AEAD) || defined(MBEDTLS_NIST_KW_C) +/** + * \brief The authenticated encryption (AEAD/NIST_KW) function. + * + * \note For AEAD modes, the tag will be appended to the + * ciphertext, as recommended by RFC 5116. + * (NIST_KW doesn't have a separate tag.) + * + * \param ctx The generic cipher context. This must be initialized and + * bound to a key, with an AEAD algorithm or NIST_KW. + * \param iv The nonce to use. This must be a readable buffer of + * at least \p iv_len Bytes and may be \c NULL if \p + * iv_len is \c 0. + * \param iv_len The length of the nonce. For AEAD ciphers, this must + * satisfy the constraints imposed by the cipher used. + * For NIST_KW, this must be \c 0. + * \param ad The additional data to authenticate. This must be a + * readable buffer of at least \p ad_len Bytes, and may + * be \c NULL is \p ad_len is \c 0. + * \param ad_len The length of \p ad. For NIST_KW, this must be \c 0. + * \param input The buffer holding the input data. This must be a + * readable buffer of at least \p ilen Bytes, and may be + * \c NULL if \p ilen is \c 0. + * \param ilen The length of the input data. + * \param output The buffer for the output data. This must be a + * writable buffer of at least \p output_len Bytes, and + * must not be \c NULL. + * \param output_len The length of the \p output buffer in Bytes. For AEAD + * ciphers, this must be at least \p ilen + \p tag_len. + * For NIST_KW, this must be at least \p ilen + 8 + * (rounded up to a multiple of 8 if KWP is used); + * \p ilen + 15 is always a safe value. + * \param olen This will be filled with the actual number of Bytes + * written to the \p output buffer. This must point to a + * writable object of type \c size_t. + * \param tag_len The desired length of the authentication tag. For AEAD + * ciphers, this must match the constraints imposed by + * the cipher used, and in particular must not be \c 0. + * For NIST_KW, this must be \c 0. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on + * parameter-verification failure. + * \return A cipher-specific error code on failure. + */ +int mbedtls_cipher_auth_encrypt_ext(mbedtls_cipher_context_t *ctx, + const unsigned char *iv, size_t iv_len, + const unsigned char *ad, size_t ad_len, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t output_len, + size_t *olen, size_t tag_len); + +/** + * \brief The authenticated encryption (AEAD/NIST_KW) function. + * + * \note If the data is not authentic, then the output buffer + * is zeroed out to prevent the unauthentic plaintext being + * used, making this interface safer. + * + * \note For AEAD modes, the tag must be appended to the + * ciphertext, as recommended by RFC 5116. + * (NIST_KW doesn't have a separate tag.) + * + * \param ctx The generic cipher context. This must be initialized and + * bound to a key, with an AEAD algorithm or NIST_KW. + * \param iv The nonce to use. This must be a readable buffer of + * at least \p iv_len Bytes and may be \c NULL if \p + * iv_len is \c 0. + * \param iv_len The length of the nonce. For AEAD ciphers, this must + * satisfy the constraints imposed by the cipher used. + * For NIST_KW, this must be \c 0. + * \param ad The additional data to authenticate. This must be a + * readable buffer of at least \p ad_len Bytes, and may + * be \c NULL is \p ad_len is \c 0. + * \param ad_len The length of \p ad. For NIST_KW, this must be \c 0. + * \param input The buffer holding the input data. This must be a + * readable buffer of at least \p ilen Bytes, and may be + * \c NULL if \p ilen is \c 0. + * \param ilen The length of the input data. For AEAD ciphers this + * must be at least \p tag_len. For NIST_KW this must be + * at least \c 8. + * \param output The buffer for the output data. This must be a + * writable buffer of at least \p output_len Bytes, and + * may be \c NULL if \p output_len is \c 0. + * \param output_len The length of the \p output buffer in Bytes. For AEAD + * ciphers, this must be at least \p ilen - \p tag_len. + * For NIST_KW, this must be at least \p ilen - 8. + * \param olen This will be filled with the actual number of Bytes + * written to the \p output buffer. This must point to a + * writable object of type \c size_t. + * \param tag_len The actual length of the authentication tag. For AEAD + * ciphers, this must match the constraints imposed by + * the cipher used, and in particular must not be \c 0. + * For NIST_KW, this must be \c 0. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on + * parameter-verification failure. + * \return #MBEDTLS_ERR_CIPHER_AUTH_FAILED if data is not authentic. + * \return A cipher-specific error code on failure. + */ +int mbedtls_cipher_auth_decrypt_ext(mbedtls_cipher_context_t *ctx, + const unsigned char *iv, size_t iv_len, + const unsigned char *ad, size_t ad_len, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t output_len, + size_t *olen, size_t tag_len); +#endif /* MBEDTLS_CIPHER_MODE_AEAD || MBEDTLS_NIST_KW_C */ +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_CIPHER_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/cipher_internal.h b/ext/opcua_client/mbedtls/include/mbedtls/cipher_internal.h new file mode 100644 index 0000000..c98abab --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/cipher_internal.h @@ -0,0 +1,134 @@ +/** + * \file cipher_internal.h + * + * \brief Cipher wrappers. + * + * \author Adriaan de Jong + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_CIPHER_WRAP_H +#define MBEDTLS_CIPHER_WRAP_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/cipher.h" + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "psa/crypto.h" +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Base cipher information. The non-mode specific functions and values. + */ +struct mbedtls_cipher_base_t { + /** Base Cipher type (e.g. MBEDTLS_CIPHER_ID_AES) */ + mbedtls_cipher_id_t cipher; + + /** Encrypt using ECB */ + int (*ecb_func)(void *ctx, mbedtls_operation_t mode, + const unsigned char *input, unsigned char *output); + +#if defined(MBEDTLS_CIPHER_MODE_CBC) + /** Encrypt using CBC */ + int (*cbc_func)(void *ctx, mbedtls_operation_t mode, size_t length, + unsigned char *iv, const unsigned char *input, + unsigned char *output); +#endif + +#if defined(MBEDTLS_CIPHER_MODE_CFB) + /** Encrypt using CFB (Full length) */ + int (*cfb_func)(void *ctx, mbedtls_operation_t mode, size_t length, size_t *iv_off, + unsigned char *iv, const unsigned char *input, + unsigned char *output); +#endif + +#if defined(MBEDTLS_CIPHER_MODE_OFB) + /** Encrypt using OFB (Full length) */ + int (*ofb_func)(void *ctx, size_t length, size_t *iv_off, + unsigned char *iv, + const unsigned char *input, + unsigned char *output); +#endif + +#if defined(MBEDTLS_CIPHER_MODE_CTR) + /** Encrypt using CTR */ + int (*ctr_func)(void *ctx, size_t length, size_t *nc_off, + unsigned char *nonce_counter, unsigned char *stream_block, + const unsigned char *input, unsigned char *output); +#endif + +#if defined(MBEDTLS_CIPHER_MODE_XTS) + /** Encrypt or decrypt using XTS. */ + int (*xts_func)(void *ctx, mbedtls_operation_t mode, size_t length, + const unsigned char data_unit[16], + const unsigned char *input, unsigned char *output); +#endif + +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + /** Encrypt using STREAM */ + int (*stream_func)(void *ctx, size_t length, + const unsigned char *input, unsigned char *output); +#endif + + /** Set key for encryption purposes */ + int (*setkey_enc_func)(void *ctx, const unsigned char *key, + unsigned int key_bitlen); + + /** Set key for decryption purposes */ + int (*setkey_dec_func)(void *ctx, const unsigned char *key, + unsigned int key_bitlen); + + /** Allocate a new context */ + void * (*ctx_alloc_func)(void); + + /** Free the given context */ + void (*ctx_free_func)(void *ctx); + +}; + +typedef struct { + mbedtls_cipher_type_t type; + const mbedtls_cipher_info_t *info; +} mbedtls_cipher_definition_t; + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +typedef enum { + MBEDTLS_CIPHER_PSA_KEY_UNSET = 0, + MBEDTLS_CIPHER_PSA_KEY_OWNED, /* Used for PSA-based cipher contexts which */ + /* use raw key material internally imported */ + /* as a volatile key, and which hence need */ + /* to destroy that key when the context is */ + /* freed. */ + MBEDTLS_CIPHER_PSA_KEY_NOT_OWNED, /* Used for PSA-based cipher contexts */ + /* which use a key provided by the */ + /* user, and which hence will not be */ + /* destroyed when the context is freed. */ +} mbedtls_cipher_psa_key_ownership; + +typedef struct { + psa_algorithm_t alg; + psa_key_id_t slot; + mbedtls_cipher_psa_key_ownership slot_state; +} mbedtls_cipher_context_psa; +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +extern const mbedtls_cipher_definition_t mbedtls_cipher_definitions[]; + +extern int mbedtls_cipher_supported[]; + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_CIPHER_WRAP_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/cmac.h b/ext/opcua_client/mbedtls/include/mbedtls/cmac.h new file mode 100644 index 0000000..89634dc --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/cmac.h @@ -0,0 +1,238 @@ +/** + * \file cmac.h + * + * \brief This file contains CMAC definitions and functions. + * + * The Cipher-based Message Authentication Code (CMAC) Mode for + * Authentication is defined in RFC-4493: The AES-CMAC Algorithm. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_CMAC_H +#define MBEDTLS_CMAC_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/cipher.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* MBEDTLS_ERR_CMAC_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** CMAC hardware accelerator failed. */ +#define MBEDTLS_ERR_CMAC_HW_ACCEL_FAILED -0x007A + +#define MBEDTLS_AES_BLOCK_SIZE 16 +#define MBEDTLS_DES3_BLOCK_SIZE 8 + + +/* Although the CMAC module does not support ARIA or CAMELLIA, we adjust the value of + * MBEDTLS_CIPHER_BLKSIZE_MAX to reflect these ciphers. + * This is done to avoid confusion, given the general-purpose name of the macro. */ +#if defined(MBEDTLS_AES_C) || defined(MBEDTLS_ARIA_C) || defined(MBEDTLS_CAMELLIA_C) +#define MBEDTLS_CIPHER_BLKSIZE_MAX 16 /**< The longest block used by CMAC is that of AES. */ +#else +#define MBEDTLS_CIPHER_BLKSIZE_MAX 8 /**< The longest block used by CMAC is that of 3DES. */ +#endif + +#if !defined(MBEDTLS_CMAC_ALT) + +/** + * The CMAC context structure. + */ +struct mbedtls_cmac_context_t { + /** The internal state of the CMAC algorithm. */ + unsigned char state[MBEDTLS_CIPHER_BLKSIZE_MAX]; + + /** Unprocessed data - either data that was not block aligned and is still + * pending processing, or the final block. */ + unsigned char unprocessed_block[MBEDTLS_CIPHER_BLKSIZE_MAX]; + + /** The length of data pending processing. */ + size_t unprocessed_len; +}; + +#else /* !MBEDTLS_CMAC_ALT */ +#include "cmac_alt.h" +#endif /* !MBEDTLS_CMAC_ALT */ + +/** + * \brief This function starts a new CMAC computation + * by setting the CMAC key, and preparing to authenticate + * the input data. + * It must be called with an initialized cipher context. + * + * Once this function has completed, data can be supplied + * to the CMAC computation by calling + * mbedtls_cipher_cmac_update(). + * + * To start a CMAC computation using the same key as a previous + * CMAC computation, use mbedtls_cipher_cmac_finish(). + * + * \note When the CMAC implementation is supplied by an alternate + * implementation (through #MBEDTLS_CMAC_ALT), some ciphers + * may not be supported by that implementation, and thus + * return an error. Alternate implementations must support + * AES-128 and AES-256, and may support AES-192 and 3DES. + * + * \param ctx The cipher context used for the CMAC operation, initialized + * as one of the following types: MBEDTLS_CIPHER_AES_128_ECB, + * MBEDTLS_CIPHER_AES_192_ECB, MBEDTLS_CIPHER_AES_256_ECB, + * or MBEDTLS_CIPHER_DES_EDE3_ECB. + * \param key The CMAC key. + * \param keybits The length of the CMAC key in bits. + * Must be supported by the cipher. + * + * \return \c 0 on success. + * \return A cipher-specific error code on failure. + */ +int mbedtls_cipher_cmac_starts(mbedtls_cipher_context_t *ctx, + const unsigned char *key, size_t keybits); + +/** + * \brief This function feeds an input buffer into an ongoing CMAC + * computation. + * + * The CMAC computation must have previously been started + * by calling mbedtls_cipher_cmac_starts() or + * mbedtls_cipher_cmac_reset(). + * + * Call this function as many times as needed to input the + * data to be authenticated. + * Once all of the required data has been input, + * call mbedtls_cipher_cmac_finish() to obtain the result + * of the CMAC operation. + * + * \param ctx The cipher context used for the CMAC operation. + * \param input The buffer holding the input data. + * \param ilen The length of the input data. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA + * if parameter verification fails. + */ +int mbedtls_cipher_cmac_update(mbedtls_cipher_context_t *ctx, + const unsigned char *input, size_t ilen); + +/** + * \brief This function finishes an ongoing CMAC operation, and + * writes the result to the output buffer. + * + * It should be followed either by + * mbedtls_cipher_cmac_reset(), which starts another CMAC + * operation with the same key, or mbedtls_cipher_free(), + * which clears the cipher context. + * + * \param ctx The cipher context used for the CMAC operation. + * \param output The output buffer for the CMAC checksum result. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA + * if parameter verification fails. + */ +int mbedtls_cipher_cmac_finish(mbedtls_cipher_context_t *ctx, + unsigned char *output); + +/** + * \brief This function starts a new CMAC operation with the same + * key as the previous one. + * + * It should be called after finishing the previous CMAC + * operation with mbedtls_cipher_cmac_finish(). + * After calling this function, + * call mbedtls_cipher_cmac_update() to supply the new + * CMAC operation with data. + * + * \param ctx The cipher context used for the CMAC operation. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA + * if parameter verification fails. + */ +int mbedtls_cipher_cmac_reset(mbedtls_cipher_context_t *ctx); + +/** + * \brief This function calculates the full generic CMAC + * on the input buffer with the provided key. + * + * The function allocates the context, performs the + * calculation, and frees the context. + * + * The CMAC result is calculated as + * output = generic CMAC(cmac key, input buffer). + * + * \note When the CMAC implementation is supplied by an alternate + * implementation (through #MBEDTLS_CMAC_ALT), some ciphers + * may not be supported by that implementation, and thus + * return an error. Alternate implementations must support + * AES-128 and AES-256, and may support AES-192 and 3DES. + * + * \param cipher_info The cipher information. + * \param key The CMAC key. + * \param keylen The length of the CMAC key in bits. + * \param input The buffer holding the input data. + * \param ilen The length of the input data. + * \param output The buffer for the generic CMAC result. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA + * if parameter verification fails. + */ +int mbedtls_cipher_cmac(const mbedtls_cipher_info_t *cipher_info, + const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char *output); + +#if defined(MBEDTLS_AES_C) +/** + * \brief This function implements the AES-CMAC-PRF-128 pseudorandom + * function, as defined in + * RFC-4615: The Advanced Encryption Standard-Cipher-based + * Message Authentication Code-Pseudo-Random Function-128 + * (AES-CMAC-PRF-128) Algorithm for the Internet Key + * Exchange Protocol (IKE). + * + * \param key The key to use. + * \param key_len The key length in Bytes. + * \param input The buffer holding the input data. + * \param in_len The length of the input data in Bytes. + * \param output The buffer holding the generated 16 Bytes of + * pseudorandom output. + * + * \return \c 0 on success. + */ +int mbedtls_aes_cmac_prf_128(const unsigned char *key, size_t key_len, + const unsigned char *input, size_t in_len, + unsigned char output[16]); +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_SELF_TEST) && (defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C)) +/** + * \brief The CMAC checkup routine. + * + * \note In case the CMAC routines are provided by an alternative + * implementation (i.e. #MBEDTLS_CMAC_ALT is defined), the + * checkup routine will succeed even if the implementation does + * not support the less widely used AES-192 or 3DES primitives. + * The self-test requires at least AES-128 and AES-256 to be + * supported by the underlying implementation. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +int mbedtls_cmac_self_test(int verbose); +#endif /* MBEDTLS_SELF_TEST && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_CMAC_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/compat-1.3.h b/ext/opcua_client/mbedtls/include/mbedtls/compat-1.3.h new file mode 100644 index 0000000..de8f625 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/compat-1.3.h @@ -0,0 +1,2533 @@ +/** + * \file compat-1.3.h + * + * \brief Compatibility definitions for using Mbed TLS with client code written + * for the PolarSSL naming conventions. + * + * \deprecated Use the new names directly instead + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) + +#if defined(MBEDTLS_DEPRECATED_WARNING) +#warning "Including compat-1.3.h is deprecated" +#endif + +#ifndef MBEDTLS_COMPAT13_H +#define MBEDTLS_COMPAT13_H + +/* + * config.h options + */ +#if defined MBEDTLS_AESNI_C +#define POLARSSL_AESNI_C MBEDTLS_AESNI_C +#endif +#if defined MBEDTLS_AES_ALT +#define POLARSSL_AES_ALT MBEDTLS_AES_ALT +#endif +#if defined MBEDTLS_AES_C +#define POLARSSL_AES_C MBEDTLS_AES_C +#endif +#if defined MBEDTLS_AES_ROM_TABLES +#define POLARSSL_AES_ROM_TABLES MBEDTLS_AES_ROM_TABLES +#endif +#if defined MBEDTLS_ARC4_ALT +#define POLARSSL_ARC4_ALT MBEDTLS_ARC4_ALT +#endif +#if defined MBEDTLS_ARC4_C +#define POLARSSL_ARC4_C MBEDTLS_ARC4_C +#endif +#if defined MBEDTLS_ASN1_PARSE_C +#define POLARSSL_ASN1_PARSE_C MBEDTLS_ASN1_PARSE_C +#endif +#if defined MBEDTLS_ASN1_WRITE_C +#define POLARSSL_ASN1_WRITE_C MBEDTLS_ASN1_WRITE_C +#endif +#if defined MBEDTLS_BASE64_C +#define POLARSSL_BASE64_C MBEDTLS_BASE64_C +#endif +#if defined MBEDTLS_BIGNUM_C +#define POLARSSL_BIGNUM_C MBEDTLS_BIGNUM_C +#endif +#if defined MBEDTLS_BLOWFISH_ALT +#define POLARSSL_BLOWFISH_ALT MBEDTLS_BLOWFISH_ALT +#endif +#if defined MBEDTLS_BLOWFISH_C +#define POLARSSL_BLOWFISH_C MBEDTLS_BLOWFISH_C +#endif +#if defined MBEDTLS_CAMELLIA_ALT +#define POLARSSL_CAMELLIA_ALT MBEDTLS_CAMELLIA_ALT +#endif +#if defined MBEDTLS_CAMELLIA_C +#define POLARSSL_CAMELLIA_C MBEDTLS_CAMELLIA_C +#endif +#if defined MBEDTLS_CAMELLIA_SMALL_MEMORY +#define POLARSSL_CAMELLIA_SMALL_MEMORY MBEDTLS_CAMELLIA_SMALL_MEMORY +#endif +#if defined MBEDTLS_CCM_C +#define POLARSSL_CCM_C MBEDTLS_CCM_C +#endif +#if defined MBEDTLS_CERTS_C +#define POLARSSL_CERTS_C MBEDTLS_CERTS_C +#endif +#if defined MBEDTLS_CIPHER_C +#define POLARSSL_CIPHER_C MBEDTLS_CIPHER_C +#endif +#if defined MBEDTLS_CIPHER_MODE_CBC +#define POLARSSL_CIPHER_MODE_CBC MBEDTLS_CIPHER_MODE_CBC +#endif +#if defined MBEDTLS_CIPHER_MODE_CFB +#define POLARSSL_CIPHER_MODE_CFB MBEDTLS_CIPHER_MODE_CFB +#endif +#if defined MBEDTLS_CIPHER_MODE_CTR +#define POLARSSL_CIPHER_MODE_CTR MBEDTLS_CIPHER_MODE_CTR +#endif +#if defined MBEDTLS_CIPHER_NULL_CIPHER +#define POLARSSL_CIPHER_NULL_CIPHER MBEDTLS_CIPHER_NULL_CIPHER +#endif +#if defined MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS +#define POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS +#endif +#if defined MBEDTLS_CIPHER_PADDING_PKCS7 +#define POLARSSL_CIPHER_PADDING_PKCS7 MBEDTLS_CIPHER_PADDING_PKCS7 +#endif +#if defined MBEDTLS_CIPHER_PADDING_ZEROS +#define POLARSSL_CIPHER_PADDING_ZEROS MBEDTLS_CIPHER_PADDING_ZEROS +#endif +#if defined MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN +#define POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN +#endif +#if defined MBEDTLS_CTR_DRBG_C +#define POLARSSL_CTR_DRBG_C MBEDTLS_CTR_DRBG_C +#endif +#if defined MBEDTLS_DEBUG_C +#define POLARSSL_DEBUG_C MBEDTLS_DEBUG_C +#endif +#if defined MBEDTLS_DEPRECATED_REMOVED +#define POLARSSL_DEPRECATED_REMOVED MBEDTLS_DEPRECATED_REMOVED +#endif +#if defined MBEDTLS_DEPRECATED_WARNING +#define POLARSSL_DEPRECATED_WARNING MBEDTLS_DEPRECATED_WARNING +#endif +#if defined MBEDTLS_DES_ALT +#define POLARSSL_DES_ALT MBEDTLS_DES_ALT +#endif +#if defined MBEDTLS_DES_C +#define POLARSSL_DES_C MBEDTLS_DES_C +#endif +#if defined MBEDTLS_DHM_C +#define POLARSSL_DHM_C MBEDTLS_DHM_C +#endif +#if defined MBEDTLS_ECDH_C +#define POLARSSL_ECDH_C MBEDTLS_ECDH_C +#endif +#if defined MBEDTLS_ECDSA_C +#define POLARSSL_ECDSA_C MBEDTLS_ECDSA_C +#endif +#if defined MBEDTLS_ECDSA_DETERMINISTIC +#define POLARSSL_ECDSA_DETERMINISTIC MBEDTLS_ECDSA_DETERMINISTIC +#endif +#if defined MBEDTLS_ECP_C +#define POLARSSL_ECP_C MBEDTLS_ECP_C +#endif +#if defined MBEDTLS_ECP_DP_BP256R1_ENABLED +#define POLARSSL_ECP_DP_BP256R1_ENABLED MBEDTLS_ECP_DP_BP256R1_ENABLED +#endif +#if defined MBEDTLS_ECP_DP_BP384R1_ENABLED +#define POLARSSL_ECP_DP_BP384R1_ENABLED MBEDTLS_ECP_DP_BP384R1_ENABLED +#endif +#if defined MBEDTLS_ECP_DP_BP512R1_ENABLED +#define POLARSSL_ECP_DP_BP512R1_ENABLED MBEDTLS_ECP_DP_BP512R1_ENABLED +#endif +#if defined MBEDTLS_ECP_DP_CURVE25519_ENABLED +#define POLARSSL_ECP_DP_M255_ENABLED MBEDTLS_ECP_DP_CURVE25519_ENABLED +#endif +#if defined MBEDTLS_ECP_DP_SECP192K1_ENABLED +#define POLARSSL_ECP_DP_SECP192K1_ENABLED MBEDTLS_ECP_DP_SECP192K1_ENABLED +#endif +#if defined MBEDTLS_ECP_DP_SECP192R1_ENABLED +#define POLARSSL_ECP_DP_SECP192R1_ENABLED MBEDTLS_ECP_DP_SECP192R1_ENABLED +#endif +#if defined MBEDTLS_ECP_DP_SECP224K1_ENABLED +#define POLARSSL_ECP_DP_SECP224K1_ENABLED MBEDTLS_ECP_DP_SECP224K1_ENABLED +#endif +#if defined MBEDTLS_ECP_DP_SECP224R1_ENABLED +#define POLARSSL_ECP_DP_SECP224R1_ENABLED MBEDTLS_ECP_DP_SECP224R1_ENABLED +#endif +#if defined MBEDTLS_ECP_DP_SECP256K1_ENABLED +#define POLARSSL_ECP_DP_SECP256K1_ENABLED MBEDTLS_ECP_DP_SECP256K1_ENABLED +#endif +#if defined MBEDTLS_ECP_DP_SECP256R1_ENABLED +#define POLARSSL_ECP_DP_SECP256R1_ENABLED MBEDTLS_ECP_DP_SECP256R1_ENABLED +#endif +#if defined MBEDTLS_ECP_DP_SECP384R1_ENABLED +#define POLARSSL_ECP_DP_SECP384R1_ENABLED MBEDTLS_ECP_DP_SECP384R1_ENABLED +#endif +#if defined MBEDTLS_ECP_DP_SECP521R1_ENABLED +#define POLARSSL_ECP_DP_SECP521R1_ENABLED MBEDTLS_ECP_DP_SECP521R1_ENABLED +#endif +#if defined MBEDTLS_ECP_FIXED_POINT_OPTIM +#define POLARSSL_ECP_FIXED_POINT_OPTIM MBEDTLS_ECP_FIXED_POINT_OPTIM +#endif +#if defined MBEDTLS_ECP_MAX_BITS +#define POLARSSL_ECP_MAX_BITS MBEDTLS_ECP_MAX_BITS +#endif +#if defined MBEDTLS_ECP_NIST_OPTIM +#define POLARSSL_ECP_NIST_OPTIM MBEDTLS_ECP_NIST_OPTIM +#endif +#if defined MBEDTLS_ECP_WINDOW_SIZE +#define POLARSSL_ECP_WINDOW_SIZE MBEDTLS_ECP_WINDOW_SIZE +#endif +#if defined MBEDTLS_ENABLE_WEAK_CIPHERSUITES +#define POLARSSL_ENABLE_WEAK_CIPHERSUITES MBEDTLS_ENABLE_WEAK_CIPHERSUITES +#endif +#if defined MBEDTLS_ENTROPY_C +#define POLARSSL_ENTROPY_C MBEDTLS_ENTROPY_C +#endif +#if defined MBEDTLS_ENTROPY_FORCE_SHA256 +#define POLARSSL_ENTROPY_FORCE_SHA256 MBEDTLS_ENTROPY_FORCE_SHA256 +#endif +#if defined MBEDTLS_ERROR_C +#define POLARSSL_ERROR_C MBEDTLS_ERROR_C +#endif +#if defined MBEDTLS_ERROR_STRERROR_DUMMY +#define POLARSSL_ERROR_STRERROR_DUMMY MBEDTLS_ERROR_STRERROR_DUMMY +#endif +#if defined MBEDTLS_FS_IO +#define POLARSSL_FS_IO MBEDTLS_FS_IO +#endif +#if defined MBEDTLS_GCM_C +#define POLARSSL_GCM_C MBEDTLS_GCM_C +#endif +#if defined MBEDTLS_GENPRIME +#define POLARSSL_GENPRIME MBEDTLS_GENPRIME +#endif +#if defined MBEDTLS_HAVEGE_C +#define POLARSSL_HAVEGE_C MBEDTLS_HAVEGE_C +#endif +#if defined MBEDTLS_HAVE_ASM +#define POLARSSL_HAVE_ASM MBEDTLS_HAVE_ASM +#endif +#if defined MBEDTLS_HAVE_SSE2 +#define POLARSSL_HAVE_SSE2 MBEDTLS_HAVE_SSE2 +#endif +#if defined MBEDTLS_HAVE_TIME +#define POLARSSL_HAVE_TIME MBEDTLS_HAVE_TIME +#endif +#if defined MBEDTLS_HMAC_DRBG_C +#define POLARSSL_HMAC_DRBG_C MBEDTLS_HMAC_DRBG_C +#endif +#if defined MBEDTLS_HMAC_DRBG_MAX_INPUT +#define POLARSSL_HMAC_DRBG_MAX_INPUT MBEDTLS_HMAC_DRBG_MAX_INPUT +#endif +#if defined MBEDTLS_HMAC_DRBG_MAX_REQUEST +#define POLARSSL_HMAC_DRBG_MAX_REQUEST MBEDTLS_HMAC_DRBG_MAX_REQUEST +#endif +#if defined MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT +#define POLARSSL_HMAC_DRBG_MAX_SEED_INPUT MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT +#endif +#if defined MBEDTLS_HMAC_DRBG_RESEED_INTERVAL +#define POLARSSL_HMAC_DRBG_RESEED_INTERVAL MBEDTLS_HMAC_DRBG_RESEED_INTERVAL +#endif +#if defined MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED +#define POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED +#endif +#if defined MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED +#define POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED +#endif +#if defined MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED +#define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED +#endif +#if defined MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED +#define POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED +#endif +#if defined MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED +#define POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED +#endif +#if defined MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED +#define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED +#endif +#if defined MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED +#define POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED +#endif +#if defined MBEDTLS_KEY_EXCHANGE_PSK_ENABLED +#define POLARSSL_KEY_EXCHANGE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_PSK_ENABLED +#endif +#if defined MBEDTLS_KEY_EXCHANGE_RSA_ENABLED +#define POLARSSL_KEY_EXCHANGE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_ENABLED +#endif +#if defined MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED +#define POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED +#endif +#if defined MBEDTLS_MD2_ALT +#define POLARSSL_MD2_ALT MBEDTLS_MD2_ALT +#endif +#if defined MBEDTLS_MD2_C +#define POLARSSL_MD2_C MBEDTLS_MD2_C +#endif +#if defined MBEDTLS_MD2_PROCESS_ALT +#define POLARSSL_MD2_PROCESS_ALT MBEDTLS_MD2_PROCESS_ALT +#endif +#if defined MBEDTLS_MD4_ALT +#define POLARSSL_MD4_ALT MBEDTLS_MD4_ALT +#endif +#if defined MBEDTLS_MD4_C +#define POLARSSL_MD4_C MBEDTLS_MD4_C +#endif +#if defined MBEDTLS_MD4_PROCESS_ALT +#define POLARSSL_MD4_PROCESS_ALT MBEDTLS_MD4_PROCESS_ALT +#endif +#if defined MBEDTLS_MD5_ALT +#define POLARSSL_MD5_ALT MBEDTLS_MD5_ALT +#endif +#if defined MBEDTLS_MD5_C +#define POLARSSL_MD5_C MBEDTLS_MD5_C +#endif +#if defined MBEDTLS_MD5_PROCESS_ALT +#define POLARSSL_MD5_PROCESS_ALT MBEDTLS_MD5_PROCESS_ALT +#endif +#if defined MBEDTLS_MD_C +#define POLARSSL_MD_C MBEDTLS_MD_C +#endif +#if defined MBEDTLS_MEMORY_ALIGN_MULTIPLE +#define POLARSSL_MEMORY_ALIGN_MULTIPLE MBEDTLS_MEMORY_ALIGN_MULTIPLE +#endif +#if defined MBEDTLS_MEMORY_BACKTRACE +#define POLARSSL_MEMORY_BACKTRACE MBEDTLS_MEMORY_BACKTRACE +#endif +#if defined MBEDTLS_MEMORY_BUFFER_ALLOC_C +#define POLARSSL_MEMORY_BUFFER_ALLOC_C MBEDTLS_MEMORY_BUFFER_ALLOC_C +#endif +#if defined MBEDTLS_MEMORY_DEBUG +#define POLARSSL_MEMORY_DEBUG MBEDTLS_MEMORY_DEBUG +#endif +#if defined MBEDTLS_MPI_MAX_SIZE +#define POLARSSL_MPI_MAX_SIZE MBEDTLS_MPI_MAX_SIZE +#endif +#if defined MBEDTLS_MPI_WINDOW_SIZE +#define POLARSSL_MPI_WINDOW_SIZE MBEDTLS_MPI_WINDOW_SIZE +#endif +#if defined MBEDTLS_NET_C +#define POLARSSL_NET_C MBEDTLS_NET_C +#endif +#if defined MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES +#define POLARSSL_NO_DEFAULT_ENTROPY_SOURCES MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES +#endif +#if defined MBEDTLS_NO_PLATFORM_ENTROPY +#define POLARSSL_NO_PLATFORM_ENTROPY MBEDTLS_NO_PLATFORM_ENTROPY +#endif +#if defined MBEDTLS_OID_C +#define POLARSSL_OID_C MBEDTLS_OID_C +#endif +#if defined MBEDTLS_PADLOCK_C +#define POLARSSL_PADLOCK_C MBEDTLS_PADLOCK_C +#endif +#if defined MBEDTLS_PEM_PARSE_C +#define POLARSSL_PEM_PARSE_C MBEDTLS_PEM_PARSE_C +#endif +#if defined MBEDTLS_PEM_WRITE_C +#define POLARSSL_PEM_WRITE_C MBEDTLS_PEM_WRITE_C +#endif +#if defined MBEDTLS_PKCS11_C +#define POLARSSL_PKCS11_C MBEDTLS_PKCS11_C +#endif +#if defined MBEDTLS_PKCS12_C +#define POLARSSL_PKCS12_C MBEDTLS_PKCS12_C +#endif +#if defined MBEDTLS_PKCS1_V15 +#define POLARSSL_PKCS1_V15 MBEDTLS_PKCS1_V15 +#endif +#if defined MBEDTLS_PKCS1_V21 +#define POLARSSL_PKCS1_V21 MBEDTLS_PKCS1_V21 +#endif +#if defined MBEDTLS_PKCS5_C +#define POLARSSL_PKCS5_C MBEDTLS_PKCS5_C +#endif +#if defined MBEDTLS_PK_C +#define POLARSSL_PK_C MBEDTLS_PK_C +#endif +#if defined MBEDTLS_PK_PARSE_C +#define POLARSSL_PK_PARSE_C MBEDTLS_PK_PARSE_C +#endif +#if defined MBEDTLS_PK_PARSE_EC_EXTENDED +#define POLARSSL_PK_PARSE_EC_EXTENDED MBEDTLS_PK_PARSE_EC_EXTENDED +#endif +#if defined MBEDTLS_PK_RSA_ALT_SUPPORT +#define POLARSSL_PK_RSA_ALT_SUPPORT MBEDTLS_PK_RSA_ALT_SUPPORT +#endif +#if defined MBEDTLS_PK_WRITE_C +#define POLARSSL_PK_WRITE_C MBEDTLS_PK_WRITE_C +#endif +#if defined MBEDTLS_PLATFORM_C +#define POLARSSL_PLATFORM_C MBEDTLS_PLATFORM_C +#endif +#if defined MBEDTLS_PLATFORM_EXIT_ALT +#define POLARSSL_PLATFORM_EXIT_ALT MBEDTLS_PLATFORM_EXIT_ALT +#endif +#if defined MBEDTLS_PLATFORM_EXIT_MACRO +#define POLARSSL_PLATFORM_EXIT_MACRO MBEDTLS_PLATFORM_EXIT_MACRO +#endif +#if defined MBEDTLS_PLATFORM_FPRINTF_ALT +#define POLARSSL_PLATFORM_FPRINTF_ALT MBEDTLS_PLATFORM_FPRINTF_ALT +#endif +#if defined MBEDTLS_PLATFORM_FPRINTF_MACRO +#define POLARSSL_PLATFORM_FPRINTF_MACRO MBEDTLS_PLATFORM_FPRINTF_MACRO +#endif +#if defined MBEDTLS_PLATFORM_FREE_MACRO +#define POLARSSL_PLATFORM_FREE_MACRO MBEDTLS_PLATFORM_FREE_MACRO +#endif +#if defined MBEDTLS_PLATFORM_MEMORY +#define POLARSSL_PLATFORM_MEMORY MBEDTLS_PLATFORM_MEMORY +#endif +#if defined MBEDTLS_PLATFORM_NO_STD_FUNCTIONS +#define POLARSSL_PLATFORM_NO_STD_FUNCTIONS MBEDTLS_PLATFORM_NO_STD_FUNCTIONS +#endif +#if defined MBEDTLS_PLATFORM_PRINTF_ALT +#define POLARSSL_PLATFORM_PRINTF_ALT MBEDTLS_PLATFORM_PRINTF_ALT +#endif +#if defined MBEDTLS_PLATFORM_PRINTF_MACRO +#define POLARSSL_PLATFORM_PRINTF_MACRO MBEDTLS_PLATFORM_PRINTF_MACRO +#endif +#if defined MBEDTLS_PLATFORM_SNPRINTF_ALT +#define POLARSSL_PLATFORM_SNPRINTF_ALT MBEDTLS_PLATFORM_SNPRINTF_ALT +#endif +#if defined MBEDTLS_PLATFORM_SNPRINTF_MACRO +#define POLARSSL_PLATFORM_SNPRINTF_MACRO MBEDTLS_PLATFORM_SNPRINTF_MACRO +#endif +#if defined MBEDTLS_PLATFORM_STD_EXIT +#define POLARSSL_PLATFORM_STD_EXIT MBEDTLS_PLATFORM_STD_EXIT +#endif +#if defined MBEDTLS_PLATFORM_STD_FPRINTF +#define POLARSSL_PLATFORM_STD_FPRINTF MBEDTLS_PLATFORM_STD_FPRINTF +#endif +#if defined MBEDTLS_PLATFORM_STD_FREE +#define POLARSSL_PLATFORM_STD_FREE MBEDTLS_PLATFORM_STD_FREE +#endif +#if defined MBEDTLS_PLATFORM_STD_MEM_HDR +#define POLARSSL_PLATFORM_STD_MEM_HDR MBEDTLS_PLATFORM_STD_MEM_HDR +#endif +#if defined MBEDTLS_PLATFORM_STD_PRINTF +#define POLARSSL_PLATFORM_STD_PRINTF MBEDTLS_PLATFORM_STD_PRINTF +#endif +#if defined MBEDTLS_PLATFORM_STD_SNPRINTF +#define POLARSSL_PLATFORM_STD_SNPRINTF MBEDTLS_PLATFORM_STD_SNPRINTF +#endif +#if defined MBEDTLS_PSK_MAX_LEN +#define POLARSSL_PSK_MAX_LEN MBEDTLS_PSK_MAX_LEN +#endif +#if defined MBEDTLS_REMOVE_ARC4_CIPHERSUITES +#define POLARSSL_REMOVE_ARC4_CIPHERSUITES MBEDTLS_REMOVE_ARC4_CIPHERSUITES +#endif +#if defined MBEDTLS_RIPEMD160_ALT +#define POLARSSL_RIPEMD160_ALT MBEDTLS_RIPEMD160_ALT +#endif +#if defined MBEDTLS_RIPEMD160_C +#define POLARSSL_RIPEMD160_C MBEDTLS_RIPEMD160_C +#endif +#if defined MBEDTLS_RIPEMD160_PROCESS_ALT +#define POLARSSL_RIPEMD160_PROCESS_ALT MBEDTLS_RIPEMD160_PROCESS_ALT +#endif +#if defined MBEDTLS_RSA_C +#define POLARSSL_RSA_C MBEDTLS_RSA_C +#endif +#if defined MBEDTLS_RSA_NO_CRT +#define POLARSSL_RSA_NO_CRT MBEDTLS_RSA_NO_CRT +#endif +#if defined MBEDTLS_SELF_TEST +#define POLARSSL_SELF_TEST MBEDTLS_SELF_TEST +#endif +#if defined MBEDTLS_SHA1_ALT +#define POLARSSL_SHA1_ALT MBEDTLS_SHA1_ALT +#endif +#if defined MBEDTLS_SHA1_C +#define POLARSSL_SHA1_C MBEDTLS_SHA1_C +#endif +#if defined MBEDTLS_SHA1_PROCESS_ALT +#define POLARSSL_SHA1_PROCESS_ALT MBEDTLS_SHA1_PROCESS_ALT +#endif +#if defined MBEDTLS_SHA256_ALT +#define POLARSSL_SHA256_ALT MBEDTLS_SHA256_ALT +#endif +#if defined MBEDTLS_SHA256_C +#define POLARSSL_SHA256_C MBEDTLS_SHA256_C +#endif +#if defined MBEDTLS_SHA256_PROCESS_ALT +#define POLARSSL_SHA256_PROCESS_ALT MBEDTLS_SHA256_PROCESS_ALT +#endif +#if defined MBEDTLS_SHA512_ALT +#define POLARSSL_SHA512_ALT MBEDTLS_SHA512_ALT +#endif +#if defined MBEDTLS_SHA512_C +#define POLARSSL_SHA512_C MBEDTLS_SHA512_C +#endif +#if defined MBEDTLS_SHA512_PROCESS_ALT +#define POLARSSL_SHA512_PROCESS_ALT MBEDTLS_SHA512_PROCESS_ALT +#endif +#if defined MBEDTLS_SSL_ALL_ALERT_MESSAGES +#define POLARSSL_SSL_ALL_ALERT_MESSAGES MBEDTLS_SSL_ALL_ALERT_MESSAGES +#endif +#if defined MBEDTLS_SSL_ALPN +#define POLARSSL_SSL_ALPN MBEDTLS_SSL_ALPN +#endif +#if defined MBEDTLS_SSL_CACHE_C +#define POLARSSL_SSL_CACHE_C MBEDTLS_SSL_CACHE_C +#endif +#if defined MBEDTLS_SSL_CBC_RECORD_SPLITTING +#define POLARSSL_SSL_CBC_RECORD_SPLITTING MBEDTLS_SSL_CBC_RECORD_SPLITTING +#endif +#if defined MBEDTLS_SSL_CLI_C +#define POLARSSL_SSL_CLI_C MBEDTLS_SSL_CLI_C +#endif +#if defined MBEDTLS_SSL_COOKIE_C +#define POLARSSL_SSL_COOKIE_C MBEDTLS_SSL_COOKIE_C +#endif +#if defined MBEDTLS_SSL_COOKIE_TIMEOUT +#define POLARSSL_SSL_COOKIE_TIMEOUT MBEDTLS_SSL_COOKIE_TIMEOUT +#endif +#if defined MBEDTLS_SSL_DEBUG_ALL +#define POLARSSL_SSL_DEBUG_ALL MBEDTLS_SSL_DEBUG_ALL +#endif +#if defined MBEDTLS_SSL_DTLS_ANTI_REPLAY +#define POLARSSL_SSL_DTLS_ANTI_REPLAY MBEDTLS_SSL_DTLS_ANTI_REPLAY +#endif +#if defined MBEDTLS_SSL_DTLS_BADMAC_LIMIT +#define POLARSSL_SSL_DTLS_BADMAC_LIMIT MBEDTLS_SSL_DTLS_BADMAC_LIMIT +#endif +#if defined MBEDTLS_SSL_DTLS_HELLO_VERIFY +#define POLARSSL_SSL_DTLS_HELLO_VERIFY MBEDTLS_SSL_DTLS_HELLO_VERIFY +#endif +#if defined MBEDTLS_SSL_ENCRYPT_THEN_MAC +#define POLARSSL_SSL_ENCRYPT_THEN_MAC MBEDTLS_SSL_ENCRYPT_THEN_MAC +#endif +#if defined MBEDTLS_SSL_EXTENDED_MASTER_SECRET +#define POLARSSL_SSL_EXTENDED_MASTER_SECRET MBEDTLS_SSL_EXTENDED_MASTER_SECRET +#endif +#if defined MBEDTLS_SSL_FALLBACK_SCSV +#define POLARSSL_SSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV +#endif +#if defined MBEDTLS_SSL_HW_RECORD_ACCEL +#define POLARSSL_SSL_HW_RECORD_ACCEL MBEDTLS_SSL_HW_RECORD_ACCEL +#endif +#if defined MBEDTLS_SSL_MAX_FRAGMENT_LENGTH +#define POLARSSL_SSL_MAX_FRAGMENT_LENGTH MBEDTLS_SSL_MAX_FRAGMENT_LENGTH +#endif +#if defined MBEDTLS_SSL_PROTO_DTLS +#define POLARSSL_SSL_PROTO_DTLS MBEDTLS_SSL_PROTO_DTLS +#endif +#if defined MBEDTLS_SSL_PROTO_SSL3 +#define POLARSSL_SSL_PROTO_SSL3 MBEDTLS_SSL_PROTO_SSL3 +#endif +#if defined MBEDTLS_SSL_PROTO_TLS1 +#define POLARSSL_SSL_PROTO_TLS1 MBEDTLS_SSL_PROTO_TLS1 +#endif +#if defined MBEDTLS_SSL_PROTO_TLS1_1 +#define POLARSSL_SSL_PROTO_TLS1_1 MBEDTLS_SSL_PROTO_TLS1_1 +#endif +#if defined MBEDTLS_SSL_PROTO_TLS1_2 +#define POLARSSL_SSL_PROTO_TLS1_2 MBEDTLS_SSL_PROTO_TLS1_2 +#endif +#if defined MBEDTLS_SSL_RENEGOTIATION +#define POLARSSL_SSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION +#endif +#if defined MBEDTLS_SSL_SERVER_NAME_INDICATION +#define POLARSSL_SSL_SERVER_NAME_INDICATION MBEDTLS_SSL_SERVER_NAME_INDICATION +#endif +#if defined MBEDTLS_SSL_SESSION_TICKETS +#define POLARSSL_SSL_SESSION_TICKETS MBEDTLS_SSL_SESSION_TICKETS +#endif +#if defined MBEDTLS_SSL_SRV_C +#define POLARSSL_SSL_SRV_C MBEDTLS_SSL_SRV_C +#endif +#if defined MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE +#define POLARSSL_SSL_SRV_RESPECT_CLIENT_PREFERENCE MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE +#endif +#if defined MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO +#define POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO +#endif +#if defined MBEDTLS_SSL_TLS_C +#define POLARSSL_SSL_TLS_C MBEDTLS_SSL_TLS_C +#endif +#if defined MBEDTLS_SSL_TRUNCATED_HMAC +#define POLARSSL_SSL_TRUNCATED_HMAC MBEDTLS_SSL_TRUNCATED_HMAC +#endif +#if defined MBEDTLS_THREADING_ALT +#define POLARSSL_THREADING_ALT MBEDTLS_THREADING_ALT +#endif +#if defined MBEDTLS_THREADING_C +#define POLARSSL_THREADING_C MBEDTLS_THREADING_C +#endif +#if defined MBEDTLS_THREADING_PTHREAD +#define POLARSSL_THREADING_PTHREAD MBEDTLS_THREADING_PTHREAD +#endif +#if defined MBEDTLS_TIMING_ALT +#define POLARSSL_TIMING_ALT MBEDTLS_TIMING_ALT +#endif +#if defined MBEDTLS_TIMING_C +#define POLARSSL_TIMING_C MBEDTLS_TIMING_C +#endif +#if defined MBEDTLS_VERSION_C +#define POLARSSL_VERSION_C MBEDTLS_VERSION_C +#endif +#if defined MBEDTLS_VERSION_FEATURES +#define POLARSSL_VERSION_FEATURES MBEDTLS_VERSION_FEATURES +#endif +#if defined MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 +#define POLARSSL_X509_ALLOW_EXTENSIONS_NON_V3 MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 +#endif +#if defined MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION +#define POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION \ + MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION +#endif +#if defined MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE +#define POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE +#endif +#if defined MBEDTLS_X509_CHECK_KEY_USAGE +#define POLARSSL_X509_CHECK_KEY_USAGE MBEDTLS_X509_CHECK_KEY_USAGE +#endif +#if defined MBEDTLS_X509_CREATE_C +#define POLARSSL_X509_CREATE_C MBEDTLS_X509_CREATE_C +#endif +#if defined MBEDTLS_X509_CRL_PARSE_C +#define POLARSSL_X509_CRL_PARSE_C MBEDTLS_X509_CRL_PARSE_C +#endif +#if defined MBEDTLS_X509_CRT_PARSE_C +#define POLARSSL_X509_CRT_PARSE_C MBEDTLS_X509_CRT_PARSE_C +#endif +#if defined MBEDTLS_X509_CRT_WRITE_C +#define POLARSSL_X509_CRT_WRITE_C MBEDTLS_X509_CRT_WRITE_C +#endif +#if defined MBEDTLS_X509_CSR_PARSE_C +#define POLARSSL_X509_CSR_PARSE_C MBEDTLS_X509_CSR_PARSE_C +#endif +#if defined MBEDTLS_X509_CSR_WRITE_C +#define POLARSSL_X509_CSR_WRITE_C MBEDTLS_X509_CSR_WRITE_C +#endif +#if defined MBEDTLS_X509_MAX_INTERMEDIATE_CA +#define POLARSSL_X509_MAX_INTERMEDIATE_CA MBEDTLS_X509_MAX_INTERMEDIATE_CA +#endif +#if defined MBEDTLS_X509_RSASSA_PSS_SUPPORT +#define POLARSSL_X509_RSASSA_PSS_SUPPORT MBEDTLS_X509_RSASSA_PSS_SUPPORT +#endif +#if defined MBEDTLS_X509_USE_C +#define POLARSSL_X509_USE_C MBEDTLS_X509_USE_C +#endif +#if defined MBEDTLS_XTEA_ALT +#define POLARSSL_XTEA_ALT MBEDTLS_XTEA_ALT +#endif +#if defined MBEDTLS_XTEA_C +#define POLARSSL_XTEA_C MBEDTLS_XTEA_C +#endif +#if defined MBEDTLS_ZLIB_SUPPORT +#define POLARSSL_ZLIB_SUPPORT MBEDTLS_ZLIB_SUPPORT +#endif + +/* + * Misc names (macros, types, functions, enum constants...) + */ +#define AES_DECRYPT MBEDTLS_AES_DECRYPT +#define AES_ENCRYPT MBEDTLS_AES_ENCRYPT +#define ASN1_BIT_STRING MBEDTLS_ASN1_BIT_STRING +#define ASN1_BMP_STRING MBEDTLS_ASN1_BMP_STRING +#define ASN1_BOOLEAN MBEDTLS_ASN1_BOOLEAN +#define ASN1_CHK_ADD MBEDTLS_ASN1_CHK_ADD +#define ASN1_CONSTRUCTED MBEDTLS_ASN1_CONSTRUCTED +#define ASN1_CONTEXT_SPECIFIC MBEDTLS_ASN1_CONTEXT_SPECIFIC +#define ASN1_GENERALIZED_TIME MBEDTLS_ASN1_GENERALIZED_TIME +#define ASN1_IA5_STRING MBEDTLS_ASN1_IA5_STRING +#define ASN1_INTEGER MBEDTLS_ASN1_INTEGER +#define ASN1_NULL MBEDTLS_ASN1_NULL +#define ASN1_OCTET_STRING MBEDTLS_ASN1_OCTET_STRING +#define ASN1_OID MBEDTLS_ASN1_OID +#define ASN1_PRIMITIVE MBEDTLS_ASN1_PRIMITIVE +#define ASN1_PRINTABLE_STRING MBEDTLS_ASN1_PRINTABLE_STRING +#define ASN1_SEQUENCE MBEDTLS_ASN1_SEQUENCE +#define ASN1_SET MBEDTLS_ASN1_SET +#define ASN1_T61_STRING MBEDTLS_ASN1_T61_STRING +#define ASN1_UNIVERSAL_STRING MBEDTLS_ASN1_UNIVERSAL_STRING +#define ASN1_UTC_TIME MBEDTLS_ASN1_UTC_TIME +#define ASN1_UTF8_STRING MBEDTLS_ASN1_UTF8_STRING +#define BADCERT_CN_MISMATCH MBEDTLS_X509_BADCERT_CN_MISMATCH +#define BADCERT_EXPIRED MBEDTLS_X509_BADCERT_EXPIRED +#define BADCERT_FUTURE MBEDTLS_X509_BADCERT_FUTURE +#define BADCERT_MISSING MBEDTLS_X509_BADCERT_MISSING +#define BADCERT_NOT_TRUSTED MBEDTLS_X509_BADCERT_NOT_TRUSTED +#define BADCERT_OTHER MBEDTLS_X509_BADCERT_OTHER +#define BADCERT_REVOKED MBEDTLS_X509_BADCERT_REVOKED +#define BADCERT_SKIP_VERIFY MBEDTLS_X509_BADCERT_SKIP_VERIFY +#define BADCRL_EXPIRED MBEDTLS_X509_BADCRL_EXPIRED +#define BADCRL_FUTURE MBEDTLS_X509_BADCRL_FUTURE +#define BADCRL_NOT_TRUSTED MBEDTLS_X509_BADCRL_NOT_TRUSTED +#define BLOWFISH_BLOCKSIZE MBEDTLS_BLOWFISH_BLOCKSIZE +#define BLOWFISH_DECRYPT MBEDTLS_BLOWFISH_DECRYPT +#define BLOWFISH_ENCRYPT MBEDTLS_BLOWFISH_ENCRYPT +#define BLOWFISH_MAX_KEY MBEDTLS_BLOWFISH_MAX_KEY_BITS +#define BLOWFISH_MIN_KEY MBEDTLS_BLOWFISH_MIN_KEY_BITS +#define BLOWFISH_ROUNDS MBEDTLS_BLOWFISH_ROUNDS +#define CAMELLIA_DECRYPT MBEDTLS_CAMELLIA_DECRYPT +#define CAMELLIA_ENCRYPT MBEDTLS_CAMELLIA_ENCRYPT +#define COLLECT_SIZE MBEDTLS_HAVEGE_COLLECT_SIZE +#define CTR_DRBG_BLOCKSIZE MBEDTLS_CTR_DRBG_BLOCKSIZE +#define CTR_DRBG_ENTROPY_LEN MBEDTLS_CTR_DRBG_ENTROPY_LEN +#define CTR_DRBG_KEYBITS MBEDTLS_CTR_DRBG_KEYBITS +#define CTR_DRBG_KEYSIZE MBEDTLS_CTR_DRBG_KEYSIZE +#define CTR_DRBG_MAX_INPUT MBEDTLS_CTR_DRBG_MAX_INPUT +#define CTR_DRBG_MAX_REQUEST MBEDTLS_CTR_DRBG_MAX_REQUEST +#define CTR_DRBG_MAX_SEED_INPUT MBEDTLS_CTR_DRBG_MAX_SEED_INPUT +#define CTR_DRBG_PR_OFF MBEDTLS_CTR_DRBG_PR_OFF +#define CTR_DRBG_PR_ON MBEDTLS_CTR_DRBG_PR_ON +#define CTR_DRBG_RESEED_INTERVAL MBEDTLS_CTR_DRBG_RESEED_INTERVAL +#define CTR_DRBG_SEEDLEN MBEDTLS_CTR_DRBG_SEEDLEN +#define DEPRECATED MBEDTLS_DEPRECATED +#define DES_DECRYPT MBEDTLS_DES_DECRYPT +#define DES_ENCRYPT MBEDTLS_DES_ENCRYPT +#define DES_KEY_SIZE MBEDTLS_DES_KEY_SIZE +#define ENTROPY_BLOCK_SIZE MBEDTLS_ENTROPY_BLOCK_SIZE +#define ENTROPY_MAX_GATHER MBEDTLS_ENTROPY_MAX_GATHER +#define ENTROPY_MAX_SEED_SIZE MBEDTLS_ENTROPY_MAX_SEED_SIZE +#define ENTROPY_MAX_SOURCES MBEDTLS_ENTROPY_MAX_SOURCES +#define ENTROPY_MIN_HARDCLOCK MBEDTLS_ENTROPY_MIN_HARDCLOCK +#define ENTROPY_MIN_HAVEGE MBEDTLS_ENTROPY_MIN_HAVEGE +#define ENTROPY_MIN_PLATFORM MBEDTLS_ENTROPY_MIN_PLATFORM +#define ENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_SOURCE_MANUAL +#define EXT_AUTHORITY_KEY_IDENTIFIER MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER +#define EXT_BASIC_CONSTRAINTS MBEDTLS_X509_EXT_BASIC_CONSTRAINTS +#define EXT_CERTIFICATE_POLICIES MBEDTLS_X509_EXT_CERTIFICATE_POLICIES +#define EXT_CRL_DISTRIBUTION_POINTS MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS +#define EXT_EXTENDED_KEY_USAGE MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE +#define EXT_FRESHEST_CRL MBEDTLS_X509_EXT_FRESHEST_CRL +#define EXT_INIHIBIT_ANYPOLICY MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY +#define EXT_ISSUER_ALT_NAME MBEDTLS_X509_EXT_ISSUER_ALT_NAME +#define EXT_KEY_USAGE MBEDTLS_X509_EXT_KEY_USAGE +#define EXT_NAME_CONSTRAINTS MBEDTLS_X509_EXT_NAME_CONSTRAINTS +#define EXT_NS_CERT_TYPE MBEDTLS_X509_EXT_NS_CERT_TYPE +#define EXT_POLICY_CONSTRAINTS MBEDTLS_X509_EXT_POLICY_CONSTRAINTS +#define EXT_POLICY_MAPPINGS MBEDTLS_X509_EXT_POLICY_MAPPINGS +#define EXT_SUBJECT_ALT_NAME MBEDTLS_X509_EXT_SUBJECT_ALT_NAME +#define EXT_SUBJECT_DIRECTORY_ATTRS MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS +#define EXT_SUBJECT_KEY_IDENTIFIER MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER +#define GCM_DECRYPT MBEDTLS_GCM_DECRYPT +#define GCM_ENCRYPT MBEDTLS_GCM_ENCRYPT +#define KU_CRL_SIGN MBEDTLS_X509_KU_CRL_SIGN +#define KU_DATA_ENCIPHERMENT MBEDTLS_X509_KU_DATA_ENCIPHERMENT +#define KU_DIGITAL_SIGNATURE MBEDTLS_X509_KU_DIGITAL_SIGNATURE +#define KU_KEY_AGREEMENT MBEDTLS_X509_KU_KEY_AGREEMENT +#define KU_KEY_CERT_SIGN MBEDTLS_X509_KU_KEY_CERT_SIGN +#define KU_KEY_ENCIPHERMENT MBEDTLS_X509_KU_KEY_ENCIPHERMENT +#define KU_NON_REPUDIATION MBEDTLS_X509_KU_NON_REPUDIATION +#define LN_2_DIV_LN_10_SCALE100 MBEDTLS_LN_2_DIV_LN_10_SCALE100 +#define MEMORY_VERIFY_ALLOC MBEDTLS_MEMORY_VERIFY_ALLOC +#define MEMORY_VERIFY_ALWAYS MBEDTLS_MEMORY_VERIFY_ALWAYS +#define MEMORY_VERIFY_FREE MBEDTLS_MEMORY_VERIFY_FREE +#define MEMORY_VERIFY_NONE MBEDTLS_MEMORY_VERIFY_NONE +#define MPI_CHK MBEDTLS_MPI_CHK +#define NET_PROTO_TCP MBEDTLS_NET_PROTO_TCP +#define NET_PROTO_UDP MBEDTLS_NET_PROTO_UDP +#define NS_CERT_TYPE_EMAIL MBEDTLS_X509_NS_CERT_TYPE_EMAIL +#define NS_CERT_TYPE_EMAIL_CA MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA +#define NS_CERT_TYPE_OBJECT_SIGNING MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING +#define NS_CERT_TYPE_OBJECT_SIGNING_CA MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA +#define NS_CERT_TYPE_RESERVED MBEDTLS_X509_NS_CERT_TYPE_RESERVED +#define NS_CERT_TYPE_SSL_CA MBEDTLS_X509_NS_CERT_TYPE_SSL_CA +#define NS_CERT_TYPE_SSL_CLIENT MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT +#define NS_CERT_TYPE_SSL_SERVER MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER +#define OID_ANSI_X9_62 MBEDTLS_OID_ANSI_X9_62 +#define OID_ANSI_X9_62_FIELD_TYPE MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE +#define OID_ANSI_X9_62_PRIME_FIELD MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD +#define OID_ANSI_X9_62_SIG MBEDTLS_OID_ANSI_X9_62_SIG +#define OID_ANSI_X9_62_SIG_SHA2 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 +#define OID_ANY_EXTENDED_KEY_USAGE MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE +#define OID_AT MBEDTLS_OID_AT +#define OID_AT_CN MBEDTLS_OID_AT_CN +#define OID_AT_COUNTRY MBEDTLS_OID_AT_COUNTRY +#define OID_AT_DN_QUALIFIER MBEDTLS_OID_AT_DN_QUALIFIER +#define OID_AT_GENERATION_QUALIFIER MBEDTLS_OID_AT_GENERATION_QUALIFIER +#define OID_AT_GIVEN_NAME MBEDTLS_OID_AT_GIVEN_NAME +#define OID_AT_INITIALS MBEDTLS_OID_AT_INITIALS +#define OID_AT_LOCALITY MBEDTLS_OID_AT_LOCALITY +#define OID_AT_ORGANIZATION MBEDTLS_OID_AT_ORGANIZATION +#define OID_AT_ORG_UNIT MBEDTLS_OID_AT_ORG_UNIT +#define OID_AT_POSTAL_ADDRESS MBEDTLS_OID_AT_POSTAL_ADDRESS +#define OID_AT_POSTAL_CODE MBEDTLS_OID_AT_POSTAL_CODE +#define OID_AT_PSEUDONYM MBEDTLS_OID_AT_PSEUDONYM +#define OID_AT_SERIAL_NUMBER MBEDTLS_OID_AT_SERIAL_NUMBER +#define OID_AT_STATE MBEDTLS_OID_AT_STATE +#define OID_AT_SUR_NAME MBEDTLS_OID_AT_SUR_NAME +#define OID_AT_TITLE MBEDTLS_OID_AT_TITLE +#define OID_AT_UNIQUE_IDENTIFIER MBEDTLS_OID_AT_UNIQUE_IDENTIFIER +#define OID_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER +#define OID_BASIC_CONSTRAINTS MBEDTLS_OID_BASIC_CONSTRAINTS +#define OID_CERTICOM MBEDTLS_OID_CERTICOM +#define OID_CERTIFICATE_POLICIES MBEDTLS_OID_CERTIFICATE_POLICIES +#define OID_CLIENT_AUTH MBEDTLS_OID_CLIENT_AUTH +#define OID_CMP MBEDTLS_OID_CMP +#define OID_CODE_SIGNING MBEDTLS_OID_CODE_SIGNING +#define OID_COUNTRY_US MBEDTLS_OID_COUNTRY_US +#define OID_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_CRL_DISTRIBUTION_POINTS +#define OID_CRL_NUMBER MBEDTLS_OID_CRL_NUMBER +#define OID_DES_CBC MBEDTLS_OID_DES_CBC +#define OID_DES_EDE3_CBC MBEDTLS_OID_DES_EDE3_CBC +#define OID_DIGEST_ALG_MD2 MBEDTLS_OID_DIGEST_ALG_MD2 +#define OID_DIGEST_ALG_MD4 MBEDTLS_OID_DIGEST_ALG_MD4 +#define OID_DIGEST_ALG_MD5 MBEDTLS_OID_DIGEST_ALG_MD5 +#define OID_DIGEST_ALG_SHA1 MBEDTLS_OID_DIGEST_ALG_SHA1 +#define OID_DIGEST_ALG_SHA224 MBEDTLS_OID_DIGEST_ALG_SHA224 +#define OID_DIGEST_ALG_SHA256 MBEDTLS_OID_DIGEST_ALG_SHA256 +#define OID_DIGEST_ALG_SHA384 MBEDTLS_OID_DIGEST_ALG_SHA384 +#define OID_DIGEST_ALG_SHA512 MBEDTLS_OID_DIGEST_ALG_SHA512 +#define OID_DOMAIN_COMPONENT MBEDTLS_OID_DOMAIN_COMPONENT +#define OID_ECDSA_SHA1 MBEDTLS_OID_ECDSA_SHA1 +#define OID_ECDSA_SHA224 MBEDTLS_OID_ECDSA_SHA224 +#define OID_ECDSA_SHA256 MBEDTLS_OID_ECDSA_SHA256 +#define OID_ECDSA_SHA384 MBEDTLS_OID_ECDSA_SHA384 +#define OID_ECDSA_SHA512 MBEDTLS_OID_ECDSA_SHA512 +#define OID_EC_ALG_ECDH MBEDTLS_OID_EC_ALG_ECDH +#define OID_EC_ALG_UNRESTRICTED MBEDTLS_OID_EC_ALG_UNRESTRICTED +#define OID_EC_BRAINPOOL_V1 MBEDTLS_OID_EC_BRAINPOOL_V1 +#define OID_EC_GRP_BP256R1 MBEDTLS_OID_EC_GRP_BP256R1 +#define OID_EC_GRP_BP384R1 MBEDTLS_OID_EC_GRP_BP384R1 +#define OID_EC_GRP_BP512R1 MBEDTLS_OID_EC_GRP_BP512R1 +#define OID_EC_GRP_SECP192K1 MBEDTLS_OID_EC_GRP_SECP192K1 +#define OID_EC_GRP_SECP192R1 MBEDTLS_OID_EC_GRP_SECP192R1 +#define OID_EC_GRP_SECP224K1 MBEDTLS_OID_EC_GRP_SECP224K1 +#define OID_EC_GRP_SECP224R1 MBEDTLS_OID_EC_GRP_SECP224R1 +#define OID_EC_GRP_SECP256K1 MBEDTLS_OID_EC_GRP_SECP256K1 +#define OID_EC_GRP_SECP256R1 MBEDTLS_OID_EC_GRP_SECP256R1 +#define OID_EC_GRP_SECP384R1 MBEDTLS_OID_EC_GRP_SECP384R1 +#define OID_EC_GRP_SECP521R1 MBEDTLS_OID_EC_GRP_SECP521R1 +#define OID_EMAIL_PROTECTION MBEDTLS_OID_EMAIL_PROTECTION +#define OID_EXTENDED_KEY_USAGE MBEDTLS_OID_EXTENDED_KEY_USAGE +#define OID_FRESHEST_CRL MBEDTLS_OID_FRESHEST_CRL +#define OID_GOV MBEDTLS_OID_GOV +#define OID_HMAC_SHA1 MBEDTLS_OID_HMAC_SHA1 +#define OID_ID_CE MBEDTLS_OID_ID_CE +#define OID_INIHIBIT_ANYPOLICY MBEDTLS_OID_INIHIBIT_ANYPOLICY +#define OID_ISO_CCITT_DS MBEDTLS_OID_ISO_CCITT_DS +#define OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ISO_IDENTIFIED_ORG +#define OID_ISO_ITU_COUNTRY MBEDTLS_OID_ISO_ITU_COUNTRY +#define OID_ISO_ITU_US_ORG MBEDTLS_OID_ISO_ITU_US_ORG +#define OID_ISO_MEMBER_BODIES MBEDTLS_OID_ISO_MEMBER_BODIES +#define OID_ISSUER_ALT_NAME MBEDTLS_OID_ISSUER_ALT_NAME +#define OID_KEY_USAGE MBEDTLS_OID_KEY_USAGE +#define OID_KP MBEDTLS_OID_KP +#define OID_MGF1 MBEDTLS_OID_MGF1 +#define OID_NAME_CONSTRAINTS MBEDTLS_OID_NAME_CONSTRAINTS +#define OID_NETSCAPE MBEDTLS_OID_NETSCAPE +#define OID_NS_BASE_URL MBEDTLS_OID_NS_BASE_URL +#define OID_NS_CA_POLICY_URL MBEDTLS_OID_NS_CA_POLICY_URL +#define OID_NS_CA_REVOCATION_URL MBEDTLS_OID_NS_CA_REVOCATION_URL +#define OID_NS_CERT MBEDTLS_OID_NS_CERT +#define OID_NS_CERT_SEQUENCE MBEDTLS_OID_NS_CERT_SEQUENCE +#define OID_NS_CERT_TYPE MBEDTLS_OID_NS_CERT_TYPE +#define OID_NS_COMMENT MBEDTLS_OID_NS_COMMENT +#define OID_NS_DATA_TYPE MBEDTLS_OID_NS_DATA_TYPE +#define OID_NS_RENEWAL_URL MBEDTLS_OID_NS_RENEWAL_URL +#define OID_NS_REVOCATION_URL MBEDTLS_OID_NS_REVOCATION_URL +#define OID_NS_SSL_SERVER_NAME MBEDTLS_OID_NS_SSL_SERVER_NAME +#define OID_OCSP_SIGNING MBEDTLS_OID_OCSP_SIGNING +#define OID_OIW_SECSIG MBEDTLS_OID_OIW_SECSIG +#define OID_OIW_SECSIG_ALG MBEDTLS_OID_OIW_SECSIG_ALG +#define OID_OIW_SECSIG_SHA1 MBEDTLS_OID_OIW_SECSIG_SHA1 +#define OID_ORGANIZATION MBEDTLS_OID_ORGANIZATION +#define OID_ORG_ANSI_X9_62 MBEDTLS_OID_ORG_ANSI_X9_62 +#define OID_ORG_CERTICOM MBEDTLS_OID_ORG_CERTICOM +#define OID_ORG_DOD MBEDTLS_OID_ORG_DOD +#define OID_ORG_GOV MBEDTLS_OID_ORG_GOV +#define OID_ORG_NETSCAPE MBEDTLS_OID_ORG_NETSCAPE +#define OID_ORG_OIW MBEDTLS_OID_ORG_OIW +#define OID_ORG_RSA_DATA_SECURITY MBEDTLS_OID_ORG_RSA_DATA_SECURITY +#define OID_ORG_TELETRUST MBEDTLS_OID_ORG_TELETRUST +#define OID_PKCS MBEDTLS_OID_PKCS +#define OID_PKCS1 MBEDTLS_OID_PKCS1 +#define OID_PKCS12 MBEDTLS_OID_PKCS12 +#define OID_PKCS12_PBE MBEDTLS_OID_PKCS12_PBE +#define OID_PKCS12_PBE_SHA1_DES2_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC +#define OID_PKCS12_PBE_SHA1_DES3_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC +#define OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC +#define OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC +#define OID_PKCS12_PBE_SHA1_RC4_128 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128 +#define OID_PKCS12_PBE_SHA1_RC4_40 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40 +#define OID_PKCS1_MD2 MBEDTLS_OID_PKCS1_MD2 +#define OID_PKCS1_MD4 MBEDTLS_OID_PKCS1_MD4 +#define OID_PKCS1_MD5 MBEDTLS_OID_PKCS1_MD5 +#define OID_PKCS1_RSA MBEDTLS_OID_PKCS1_RSA +#define OID_PKCS1_SHA1 MBEDTLS_OID_PKCS1_SHA1 +#define OID_PKCS1_SHA224 MBEDTLS_OID_PKCS1_SHA224 +#define OID_PKCS1_SHA256 MBEDTLS_OID_PKCS1_SHA256 +#define OID_PKCS1_SHA384 MBEDTLS_OID_PKCS1_SHA384 +#define OID_PKCS1_SHA512 MBEDTLS_OID_PKCS1_SHA512 +#define OID_PKCS5 MBEDTLS_OID_PKCS5 +#define OID_PKCS5_PBES2 MBEDTLS_OID_PKCS5_PBES2 +#define OID_PKCS5_PBE_MD2_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC +#define OID_PKCS5_PBE_MD2_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC +#define OID_PKCS5_PBE_MD5_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC +#define OID_PKCS5_PBE_MD5_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC +#define OID_PKCS5_PBE_SHA1_DES_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC +#define OID_PKCS5_PBE_SHA1_RC2_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC +#define OID_PKCS5_PBKDF2 MBEDTLS_OID_PKCS5_PBKDF2 +#define OID_PKCS5_PBMAC1 MBEDTLS_OID_PKCS5_PBMAC1 +#define OID_PKCS9 MBEDTLS_OID_PKCS9 +#define OID_PKCS9_CSR_EXT_REQ MBEDTLS_OID_PKCS9_CSR_EXT_REQ +#define OID_PKCS9_EMAIL MBEDTLS_OID_PKCS9_EMAIL +#define OID_PKIX MBEDTLS_OID_PKIX +#define OID_POLICY_CONSTRAINTS MBEDTLS_OID_POLICY_CONSTRAINTS +#define OID_POLICY_MAPPINGS MBEDTLS_OID_POLICY_MAPPINGS +#define OID_PRIVATE_KEY_USAGE_PERIOD MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD +#define OID_RSASSA_PSS MBEDTLS_OID_RSASSA_PSS +#define OID_RSA_COMPANY MBEDTLS_OID_RSA_COMPANY +#define OID_RSA_SHA_OBS MBEDTLS_OID_RSA_SHA_OBS +#define OID_SERVER_AUTH MBEDTLS_OID_SERVER_AUTH +#define OID_SIZE MBEDTLS_OID_SIZE +#define OID_SUBJECT_ALT_NAME MBEDTLS_OID_SUBJECT_ALT_NAME +#define OID_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS +#define OID_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER +#define OID_TELETRUST MBEDTLS_OID_TELETRUST +#define OID_TIME_STAMPING MBEDTLS_OID_TIME_STAMPING +#define PADLOCK_ACE MBEDTLS_PADLOCK_ACE +#define PADLOCK_ALIGN16 MBEDTLS_PADLOCK_ALIGN16 +#define PADLOCK_PHE MBEDTLS_PADLOCK_PHE +#define PADLOCK_PMM MBEDTLS_PADLOCK_PMM +#define PADLOCK_RNG MBEDTLS_PADLOCK_RNG +#define PKCS12_DERIVE_IV MBEDTLS_PKCS12_DERIVE_IV +#define PKCS12_DERIVE_KEY MBEDTLS_PKCS12_DERIVE_KEY +#define PKCS12_DERIVE_MAC_KEY MBEDTLS_PKCS12_DERIVE_MAC_KEY +#define PKCS12_PBE_DECRYPT MBEDTLS_PKCS12_PBE_DECRYPT +#define PKCS12_PBE_ENCRYPT MBEDTLS_PKCS12_PBE_ENCRYPT +#define PKCS5_DECRYPT MBEDTLS_PKCS5_DECRYPT +#define PKCS5_ENCRYPT MBEDTLS_PKCS5_ENCRYPT +#define POLARSSL_AESNI_AES MBEDTLS_AESNI_AES +#define POLARSSL_AESNI_CLMUL MBEDTLS_AESNI_CLMUL +#define POLARSSL_AESNI_H MBEDTLS_AESNI_H +#define POLARSSL_AES_H MBEDTLS_AES_H +#define POLARSSL_ARC4_H MBEDTLS_ARC4_H +#define POLARSSL_ASN1_H MBEDTLS_ASN1_H +#define POLARSSL_ASN1_WRITE_H MBEDTLS_ASN1_WRITE_H +#define POLARSSL_BASE64_H MBEDTLS_BASE64_H +#define POLARSSL_BIGNUM_H MBEDTLS_BIGNUM_H +#define POLARSSL_BLOWFISH_H MBEDTLS_BLOWFISH_H +#define POLARSSL_BN_MUL_H MBEDTLS_BN_MUL_H +#define POLARSSL_CAMELLIA_H MBEDTLS_CAMELLIA_H +#define POLARSSL_CCM_H MBEDTLS_CCM_H +#define POLARSSL_CERTS_H MBEDTLS_CERTS_H +#define POLARSSL_CHECK_CONFIG_H MBEDTLS_CHECK_CONFIG_H +#define POLARSSL_CIPHERSUITE_NODTLS MBEDTLS_CIPHERSUITE_NODTLS +#define POLARSSL_CIPHERSUITE_SHORT_TAG MBEDTLS_CIPHERSUITE_SHORT_TAG +#define POLARSSL_CIPHERSUITE_WEAK MBEDTLS_CIPHERSUITE_WEAK +#define POLARSSL_CIPHER_AES_128_CBC MBEDTLS_CIPHER_AES_128_CBC +#define POLARSSL_CIPHER_AES_128_CCM MBEDTLS_CIPHER_AES_128_CCM +#define POLARSSL_CIPHER_AES_128_CFB128 MBEDTLS_CIPHER_AES_128_CFB128 +#define POLARSSL_CIPHER_AES_128_CTR MBEDTLS_CIPHER_AES_128_CTR +#define POLARSSL_CIPHER_AES_128_ECB MBEDTLS_CIPHER_AES_128_ECB +#define POLARSSL_CIPHER_AES_128_GCM MBEDTLS_CIPHER_AES_128_GCM +#define POLARSSL_CIPHER_AES_192_CBC MBEDTLS_CIPHER_AES_192_CBC +#define POLARSSL_CIPHER_AES_192_CCM MBEDTLS_CIPHER_AES_192_CCM +#define POLARSSL_CIPHER_AES_192_CFB128 MBEDTLS_CIPHER_AES_192_CFB128 +#define POLARSSL_CIPHER_AES_192_CTR MBEDTLS_CIPHER_AES_192_CTR +#define POLARSSL_CIPHER_AES_192_ECB MBEDTLS_CIPHER_AES_192_ECB +#define POLARSSL_CIPHER_AES_192_GCM MBEDTLS_CIPHER_AES_192_GCM +#define POLARSSL_CIPHER_AES_256_CBC MBEDTLS_CIPHER_AES_256_CBC +#define POLARSSL_CIPHER_AES_256_CCM MBEDTLS_CIPHER_AES_256_CCM +#define POLARSSL_CIPHER_AES_256_CFB128 MBEDTLS_CIPHER_AES_256_CFB128 +#define POLARSSL_CIPHER_AES_256_CTR MBEDTLS_CIPHER_AES_256_CTR +#define POLARSSL_CIPHER_AES_256_ECB MBEDTLS_CIPHER_AES_256_ECB +#define POLARSSL_CIPHER_AES_256_GCM MBEDTLS_CIPHER_AES_256_GCM +#define POLARSSL_CIPHER_ARC4_128 MBEDTLS_CIPHER_ARC4_128 +#define POLARSSL_CIPHER_BLOWFISH_CBC MBEDTLS_CIPHER_BLOWFISH_CBC +#define POLARSSL_CIPHER_BLOWFISH_CFB64 MBEDTLS_CIPHER_BLOWFISH_CFB64 +#define POLARSSL_CIPHER_BLOWFISH_CTR MBEDTLS_CIPHER_BLOWFISH_CTR +#define POLARSSL_CIPHER_BLOWFISH_ECB MBEDTLS_CIPHER_BLOWFISH_ECB +#define POLARSSL_CIPHER_CAMELLIA_128_CBC MBEDTLS_CIPHER_CAMELLIA_128_CBC +#define POLARSSL_CIPHER_CAMELLIA_128_CCM MBEDTLS_CIPHER_CAMELLIA_128_CCM +#define POLARSSL_CIPHER_CAMELLIA_128_CFB128 MBEDTLS_CIPHER_CAMELLIA_128_CFB128 +#define POLARSSL_CIPHER_CAMELLIA_128_CTR MBEDTLS_CIPHER_CAMELLIA_128_CTR +#define POLARSSL_CIPHER_CAMELLIA_128_ECB MBEDTLS_CIPHER_CAMELLIA_128_ECB +#define POLARSSL_CIPHER_CAMELLIA_128_GCM MBEDTLS_CIPHER_CAMELLIA_128_GCM +#define POLARSSL_CIPHER_CAMELLIA_192_CBC MBEDTLS_CIPHER_CAMELLIA_192_CBC +#define POLARSSL_CIPHER_CAMELLIA_192_CCM MBEDTLS_CIPHER_CAMELLIA_192_CCM +#define POLARSSL_CIPHER_CAMELLIA_192_CFB128 MBEDTLS_CIPHER_CAMELLIA_192_CFB128 +#define POLARSSL_CIPHER_CAMELLIA_192_CTR MBEDTLS_CIPHER_CAMELLIA_192_CTR +#define POLARSSL_CIPHER_CAMELLIA_192_ECB MBEDTLS_CIPHER_CAMELLIA_192_ECB +#define POLARSSL_CIPHER_CAMELLIA_192_GCM MBEDTLS_CIPHER_CAMELLIA_192_GCM +#define POLARSSL_CIPHER_CAMELLIA_256_CBC MBEDTLS_CIPHER_CAMELLIA_256_CBC +#define POLARSSL_CIPHER_CAMELLIA_256_CCM MBEDTLS_CIPHER_CAMELLIA_256_CCM +#define POLARSSL_CIPHER_CAMELLIA_256_CFB128 MBEDTLS_CIPHER_CAMELLIA_256_CFB128 +#define POLARSSL_CIPHER_CAMELLIA_256_CTR MBEDTLS_CIPHER_CAMELLIA_256_CTR +#define POLARSSL_CIPHER_CAMELLIA_256_ECB MBEDTLS_CIPHER_CAMELLIA_256_ECB +#define POLARSSL_CIPHER_CAMELLIA_256_GCM MBEDTLS_CIPHER_CAMELLIA_256_GCM +#define POLARSSL_CIPHER_DES_CBC MBEDTLS_CIPHER_DES_CBC +#define POLARSSL_CIPHER_DES_ECB MBEDTLS_CIPHER_DES_ECB +#define POLARSSL_CIPHER_DES_EDE3_CBC MBEDTLS_CIPHER_DES_EDE3_CBC +#define POLARSSL_CIPHER_DES_EDE3_ECB MBEDTLS_CIPHER_DES_EDE3_ECB +#define POLARSSL_CIPHER_DES_EDE_CBC MBEDTLS_CIPHER_DES_EDE_CBC +#define POLARSSL_CIPHER_DES_EDE_ECB MBEDTLS_CIPHER_DES_EDE_ECB +#define POLARSSL_CIPHER_H MBEDTLS_CIPHER_H +#define POLARSSL_CIPHER_ID_3DES MBEDTLS_CIPHER_ID_3DES +#define POLARSSL_CIPHER_ID_AES MBEDTLS_CIPHER_ID_AES +#define POLARSSL_CIPHER_ID_ARC4 MBEDTLS_CIPHER_ID_ARC4 +#define POLARSSL_CIPHER_ID_BLOWFISH MBEDTLS_CIPHER_ID_BLOWFISH +#define POLARSSL_CIPHER_ID_CAMELLIA MBEDTLS_CIPHER_ID_CAMELLIA +#define POLARSSL_CIPHER_ID_DES MBEDTLS_CIPHER_ID_DES +#define POLARSSL_CIPHER_ID_NONE MBEDTLS_CIPHER_ID_NONE +#define POLARSSL_CIPHER_ID_NULL MBEDTLS_CIPHER_ID_NULL +#define POLARSSL_CIPHER_MODE_AEAD MBEDTLS_CIPHER_MODE_AEAD +#define POLARSSL_CIPHER_MODE_STREAM MBEDTLS_CIPHER_MODE_STREAM +#define POLARSSL_CIPHER_MODE_WITH_PADDING MBEDTLS_CIPHER_MODE_WITH_PADDING +#define POLARSSL_CIPHER_NONE MBEDTLS_CIPHER_NONE +#define POLARSSL_CIPHER_NULL MBEDTLS_CIPHER_NULL +#define POLARSSL_CIPHER_VARIABLE_IV_LEN MBEDTLS_CIPHER_VARIABLE_IV_LEN +#define POLARSSL_CIPHER_VARIABLE_KEY_LEN MBEDTLS_CIPHER_VARIABLE_KEY_LEN +#define POLARSSL_CIPHER_WRAP_H MBEDTLS_CIPHER_WRAP_H +#define POLARSSL_CONFIG_H MBEDTLS_CONFIG_H +#define POLARSSL_CTR_DRBG_H MBEDTLS_CTR_DRBG_H +#define POLARSSL_DEBUG_H MBEDTLS_DEBUG_H +#define POLARSSL_DECRYPT MBEDTLS_DECRYPT +#define POLARSSL_DES_H MBEDTLS_DES_H +#define POLARSSL_DHM_H MBEDTLS_DHM_H +#define POLARSSL_DHM_RFC3526_MODP_2048_G MBEDTLS_DHM_RFC3526_MODP_2048_G +#define POLARSSL_DHM_RFC3526_MODP_2048_P MBEDTLS_DHM_RFC3526_MODP_2048_P +#define POLARSSL_DHM_RFC3526_MODP_3072_G MBEDTLS_DHM_RFC3526_MODP_3072_G +#define POLARSSL_DHM_RFC3526_MODP_3072_P MBEDTLS_DHM_RFC3526_MODP_3072_P +#define POLARSSL_DHM_RFC5114_MODP_2048_G MBEDTLS_DHM_RFC5114_MODP_2048_G +#define POLARSSL_DHM_RFC5114_MODP_2048_P MBEDTLS_DHM_RFC5114_MODP_2048_P +#define POLARSSL_ECDH_H MBEDTLS_ECDH_H +#define POLARSSL_ECDH_OURS MBEDTLS_ECDH_OURS +#define POLARSSL_ECDH_THEIRS MBEDTLS_ECDH_THEIRS +#define POLARSSL_ECDSA_H MBEDTLS_ECDSA_H +#define POLARSSL_ECP_DP_BP256R1 MBEDTLS_ECP_DP_BP256R1 +#define POLARSSL_ECP_DP_BP384R1 MBEDTLS_ECP_DP_BP384R1 +#define POLARSSL_ECP_DP_BP512R1 MBEDTLS_ECP_DP_BP512R1 +#define POLARSSL_ECP_DP_M255 MBEDTLS_ECP_DP_CURVE25519 +#define POLARSSL_ECP_DP_MAX MBEDTLS_ECP_DP_MAX +#define POLARSSL_ECP_DP_NONE MBEDTLS_ECP_DP_NONE +#define POLARSSL_ECP_DP_SECP192K1 MBEDTLS_ECP_DP_SECP192K1 +#define POLARSSL_ECP_DP_SECP192R1 MBEDTLS_ECP_DP_SECP192R1 +#define POLARSSL_ECP_DP_SECP224K1 MBEDTLS_ECP_DP_SECP224K1 +#define POLARSSL_ECP_DP_SECP224R1 MBEDTLS_ECP_DP_SECP224R1 +#define POLARSSL_ECP_DP_SECP256K1 MBEDTLS_ECP_DP_SECP256K1 +#define POLARSSL_ECP_DP_SECP256R1 MBEDTLS_ECP_DP_SECP256R1 +#define POLARSSL_ECP_DP_SECP384R1 MBEDTLS_ECP_DP_SECP384R1 +#define POLARSSL_ECP_DP_SECP521R1 MBEDTLS_ECP_DP_SECP521R1 +#define POLARSSL_ECP_H MBEDTLS_ECP_H +#define POLARSSL_ECP_MAX_BYTES MBEDTLS_ECP_MAX_BYTES +#define POLARSSL_ECP_MAX_PT_LEN MBEDTLS_ECP_MAX_PT_LEN +#define POLARSSL_ECP_PF_COMPRESSED MBEDTLS_ECP_PF_COMPRESSED +#define POLARSSL_ECP_PF_UNCOMPRESSED MBEDTLS_ECP_PF_UNCOMPRESSED +#define POLARSSL_ECP_TLS_NAMED_CURVE MBEDTLS_ECP_TLS_NAMED_CURVE +#define POLARSSL_ENCRYPT MBEDTLS_ENCRYPT +#define POLARSSL_ENTROPY_H MBEDTLS_ENTROPY_H +#define POLARSSL_ENTROPY_POLL_H MBEDTLS_ENTROPY_POLL_H +#define POLARSSL_ENTROPY_SHA256_ACCUMULATOR MBEDTLS_ENTROPY_SHA256_ACCUMULATOR +#define POLARSSL_ENTROPY_SHA512_ACCUMULATOR MBEDTLS_ENTROPY_SHA512_ACCUMULATOR +#define POLARSSL_ERROR_H MBEDTLS_ERROR_H +#define POLARSSL_ERR_AES_INVALID_INPUT_LENGTH MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH +#define POLARSSL_ERR_AES_INVALID_KEY_LENGTH MBEDTLS_ERR_AES_INVALID_KEY_LENGTH +#define POLARSSL_ERR_ASN1_BUF_TOO_SMALL MBEDTLS_ERR_ASN1_BUF_TOO_SMALL +#define POLARSSL_ERR_ASN1_INVALID_DATA MBEDTLS_ERR_ASN1_INVALID_DATA +#define POLARSSL_ERR_ASN1_INVALID_LENGTH MBEDTLS_ERR_ASN1_INVALID_LENGTH +#define POLARSSL_ERR_ASN1_LENGTH_MISMATCH MBEDTLS_ERR_ASN1_LENGTH_MISMATCH +#define POLARSSL_ERR_ASN1_MALLOC_FAILED MBEDTLS_ERR_ASN1_ALLOC_FAILED +#define POLARSSL_ERR_ASN1_OUT_OF_DATA MBEDTLS_ERR_ASN1_OUT_OF_DATA +#define POLARSSL_ERR_ASN1_UNEXPECTED_TAG MBEDTLS_ERR_ASN1_UNEXPECTED_TAG +#define POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL +#define POLARSSL_ERR_BASE64_INVALID_CHARACTER MBEDTLS_ERR_BASE64_INVALID_CHARACTER +#define POLARSSL_ERR_BLOWFISH_INVALID_INPUT_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH +#define POLARSSL_ERR_BLOWFISH_INVALID_KEY_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH +#define POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH +#define POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH +#define POLARSSL_ERR_CCM_AUTH_FAILED MBEDTLS_ERR_CCM_AUTH_FAILED +#define POLARSSL_ERR_CCM_BAD_INPUT MBEDTLS_ERR_CCM_BAD_INPUT +#define POLARSSL_ERR_CIPHER_ALLOC_FAILED MBEDTLS_ERR_CIPHER_ALLOC_FAILED +#define POLARSSL_ERR_CIPHER_AUTH_FAILED MBEDTLS_ERR_CIPHER_AUTH_FAILED +#define POLARSSL_ERR_CIPHER_BAD_INPUT_DATA MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA +#define POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE +#define POLARSSL_ERR_CIPHER_FULL_BLOCK_EXPECTED MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED +#define POLARSSL_ERR_CIPHER_INVALID_PADDING MBEDTLS_ERR_CIPHER_INVALID_PADDING +#define POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED +#define POLARSSL_ERR_CTR_DRBG_FILE_IO_ERROR MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR +#define POLARSSL_ERR_CTR_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG +#define POLARSSL_ERR_CTR_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG +#define POLARSSL_ERR_DES_INVALID_INPUT_LENGTH MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH +#define POLARSSL_ERR_DHM_BAD_INPUT_DATA MBEDTLS_ERR_DHM_BAD_INPUT_DATA +#define POLARSSL_ERR_DHM_CALC_SECRET_FAILED MBEDTLS_ERR_DHM_CALC_SECRET_FAILED +#define POLARSSL_ERR_DHM_FILE_IO_ERROR MBEDTLS_ERR_DHM_FILE_IO_ERROR +#define POLARSSL_ERR_DHM_INVALID_FORMAT MBEDTLS_ERR_DHM_INVALID_FORMAT +#define POLARSSL_ERR_DHM_MAKE_PARAMS_FAILED MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED +#define POLARSSL_ERR_DHM_MAKE_PUBLIC_FAILED MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED +#define POLARSSL_ERR_DHM_MALLOC_FAILED MBEDTLS_ERR_DHM_ALLOC_FAILED +#define POLARSSL_ERR_DHM_READ_PARAMS_FAILED MBEDTLS_ERR_DHM_READ_PARAMS_FAILED +#define POLARSSL_ERR_DHM_READ_PUBLIC_FAILED MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED +#define POLARSSL_ERR_ECP_BAD_INPUT_DATA MBEDTLS_ERR_ECP_BAD_INPUT_DATA +#define POLARSSL_ERR_ECP_BUFFER_TOO_SMALL MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL +#define POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE +#define POLARSSL_ERR_ECP_INVALID_KEY MBEDTLS_ERR_ECP_INVALID_KEY +#define POLARSSL_ERR_ECP_MALLOC_FAILED MBEDTLS_ERR_ECP_ALLOC_FAILED +#define POLARSSL_ERR_ECP_RANDOM_FAILED MBEDTLS_ERR_ECP_RANDOM_FAILED +#define POLARSSL_ERR_ECP_SIG_LEN_MISMATCH MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH +#define POLARSSL_ERR_ECP_VERIFY_FAILED MBEDTLS_ERR_ECP_VERIFY_FAILED +#define POLARSSL_ERR_ENTROPY_FILE_IO_ERROR MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR +#define POLARSSL_ERR_ENTROPY_MAX_SOURCES MBEDTLS_ERR_ENTROPY_MAX_SOURCES +#define POLARSSL_ERR_ENTROPY_NO_SOURCES_DEFINED MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED +#define POLARSSL_ERR_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_ENTROPY_SOURCE_FAILED +#define POLARSSL_ERR_GCM_AUTH_FAILED MBEDTLS_ERR_GCM_AUTH_FAILED +#define POLARSSL_ERR_GCM_BAD_INPUT MBEDTLS_ERR_GCM_BAD_INPUT +#define POLARSSL_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED +#define POLARSSL_ERR_HMAC_DRBG_FILE_IO_ERROR MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR +#define POLARSSL_ERR_HMAC_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG +#define POLARSSL_ERR_HMAC_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG +#define POLARSSL_ERR_MD_ALLOC_FAILED MBEDTLS_ERR_MD_ALLOC_FAILED +#define POLARSSL_ERR_MD_BAD_INPUT_DATA MBEDTLS_ERR_MD_BAD_INPUT_DATA +#define POLARSSL_ERR_MD_FEATURE_UNAVAILABLE MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE +#define POLARSSL_ERR_MD_FILE_IO_ERROR MBEDTLS_ERR_MD_FILE_IO_ERROR +#define POLARSSL_ERR_MPI_BAD_INPUT_DATA MBEDTLS_ERR_MPI_BAD_INPUT_DATA +#define POLARSSL_ERR_MPI_BUFFER_TOO_SMALL MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL +#define POLARSSL_ERR_MPI_DIVISION_BY_ZERO MBEDTLS_ERR_MPI_DIVISION_BY_ZERO +#define POLARSSL_ERR_MPI_FILE_IO_ERROR MBEDTLS_ERR_MPI_FILE_IO_ERROR +#define POLARSSL_ERR_MPI_INVALID_CHARACTER MBEDTLS_ERR_MPI_INVALID_CHARACTER +#define POLARSSL_ERR_MPI_MALLOC_FAILED MBEDTLS_ERR_MPI_ALLOC_FAILED +#define POLARSSL_ERR_MPI_NEGATIVE_VALUE MBEDTLS_ERR_MPI_NEGATIVE_VALUE +#define POLARSSL_ERR_MPI_NOT_ACCEPTABLE MBEDTLS_ERR_MPI_NOT_ACCEPTABLE +#define POLARSSL_ERR_NET_ACCEPT_FAILED MBEDTLS_ERR_NET_ACCEPT_FAILED +#define POLARSSL_ERR_NET_BIND_FAILED MBEDTLS_ERR_NET_BIND_FAILED +#define POLARSSL_ERR_NET_CONNECT_FAILED MBEDTLS_ERR_NET_CONNECT_FAILED +#define POLARSSL_ERR_NET_CONN_RESET MBEDTLS_ERR_NET_CONN_RESET +#define POLARSSL_ERR_NET_LISTEN_FAILED MBEDTLS_ERR_NET_LISTEN_FAILED +#define POLARSSL_ERR_NET_RECV_FAILED MBEDTLS_ERR_NET_RECV_FAILED +#define POLARSSL_ERR_NET_SEND_FAILED MBEDTLS_ERR_NET_SEND_FAILED +#define POLARSSL_ERR_NET_SOCKET_FAILED MBEDTLS_ERR_NET_SOCKET_FAILED +#define POLARSSL_ERR_NET_TIMEOUT MBEDTLS_ERR_SSL_TIMEOUT +#define POLARSSL_ERR_NET_UNKNOWN_HOST MBEDTLS_ERR_NET_UNKNOWN_HOST +#define POLARSSL_ERR_NET_WANT_READ MBEDTLS_ERR_SSL_WANT_READ +#define POLARSSL_ERR_NET_WANT_WRITE MBEDTLS_ERR_SSL_WANT_WRITE +#define POLARSSL_ERR_OID_BUF_TOO_SMALL MBEDTLS_ERR_OID_BUF_TOO_SMALL +#define POLARSSL_ERR_OID_NOT_FOUND MBEDTLS_ERR_OID_NOT_FOUND +#define POLARSSL_ERR_PADLOCK_DATA_MISALIGNED MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED +#define POLARSSL_ERR_PEM_BAD_INPUT_DATA MBEDTLS_ERR_PEM_BAD_INPUT_DATA +#define POLARSSL_ERR_PEM_FEATURE_UNAVAILABLE MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE +#define POLARSSL_ERR_PEM_INVALID_DATA MBEDTLS_ERR_PEM_INVALID_DATA +#define POLARSSL_ERR_PEM_INVALID_ENC_IV MBEDTLS_ERR_PEM_INVALID_ENC_IV +#define POLARSSL_ERR_PEM_MALLOC_FAILED MBEDTLS_ERR_PEM_ALLOC_FAILED +#define POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT +#define POLARSSL_ERR_PEM_PASSWORD_MISMATCH MBEDTLS_ERR_PEM_PASSWORD_MISMATCH +#define POLARSSL_ERR_PEM_PASSWORD_REQUIRED MBEDTLS_ERR_PEM_PASSWORD_REQUIRED +#define POLARSSL_ERR_PEM_UNKNOWN_ENC_ALG MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG +#define POLARSSL_ERR_PKCS12_BAD_INPUT_DATA MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA +#define POLARSSL_ERR_PKCS12_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE +#define POLARSSL_ERR_PKCS12_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH +#define POLARSSL_ERR_PKCS12_PBE_INVALID_FORMAT MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT +#define POLARSSL_ERR_PKCS5_BAD_INPUT_DATA MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA +#define POLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE +#define POLARSSL_ERR_PKCS5_INVALID_FORMAT MBEDTLS_ERR_PKCS5_INVALID_FORMAT +#define POLARSSL_ERR_PKCS5_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH +#define POLARSSL_ERR_PK_BAD_INPUT_DATA MBEDTLS_ERR_PK_BAD_INPUT_DATA +#define POLARSSL_ERR_PK_FEATURE_UNAVAILABLE MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE +#define POLARSSL_ERR_PK_FILE_IO_ERROR MBEDTLS_ERR_PK_FILE_IO_ERROR +#define POLARSSL_ERR_PK_INVALID_ALG MBEDTLS_ERR_PK_INVALID_ALG +#define POLARSSL_ERR_PK_INVALID_PUBKEY MBEDTLS_ERR_PK_INVALID_PUBKEY +#define POLARSSL_ERR_PK_KEY_INVALID_FORMAT MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +#define POLARSSL_ERR_PK_KEY_INVALID_VERSION MBEDTLS_ERR_PK_KEY_INVALID_VERSION +#define POLARSSL_ERR_PK_MALLOC_FAILED MBEDTLS_ERR_PK_ALLOC_FAILED +#define POLARSSL_ERR_PK_PASSWORD_MISMATCH MBEDTLS_ERR_PK_PASSWORD_MISMATCH +#define POLARSSL_ERR_PK_PASSWORD_REQUIRED MBEDTLS_ERR_PK_PASSWORD_REQUIRED +#define POLARSSL_ERR_PK_SIG_LEN_MISMATCH MBEDTLS_ERR_PK_SIG_LEN_MISMATCH +#define POLARSSL_ERR_PK_TYPE_MISMATCH MBEDTLS_ERR_PK_TYPE_MISMATCH +#define POLARSSL_ERR_PK_UNKNOWN_NAMED_CURVE MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE +#define POLARSSL_ERR_PK_UNKNOWN_PK_ALG MBEDTLS_ERR_PK_UNKNOWN_PK_ALG +#define POLARSSL_ERR_RSA_BAD_INPUT_DATA MBEDTLS_ERR_RSA_BAD_INPUT_DATA +#define POLARSSL_ERR_RSA_INVALID_PADDING MBEDTLS_ERR_RSA_INVALID_PADDING +#define POLARSSL_ERR_RSA_KEY_CHECK_FAILED MBEDTLS_ERR_RSA_KEY_CHECK_FAILED +#define POLARSSL_ERR_RSA_KEY_GEN_FAILED MBEDTLS_ERR_RSA_KEY_GEN_FAILED +#define POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE +#define POLARSSL_ERR_RSA_PRIVATE_FAILED MBEDTLS_ERR_RSA_PRIVATE_FAILED +#define POLARSSL_ERR_RSA_PUBLIC_FAILED MBEDTLS_ERR_RSA_PUBLIC_FAILED +#define POLARSSL_ERR_RSA_RNG_FAILED MBEDTLS_ERR_RSA_RNG_FAILED +#define POLARSSL_ERR_RSA_VERIFY_FAILED MBEDTLS_ERR_RSA_VERIFY_FAILED +#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE +#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST +#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY +#define POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC +#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO +#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE +#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS +#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP +#define POLARSSL_ERR_SSL_BAD_HS_FINISHED MBEDTLS_ERR_SSL_BAD_HS_FINISHED +#define POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET +#define POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION +#define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO +#define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE +#define POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE +#define POLARSSL_ERR_SSL_BAD_INPUT_DATA MBEDTLS_ERR_SSL_BAD_INPUT_DATA +#define POLARSSL_ERR_SSL_BUFFER_TOO_SMALL MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL +#define POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED +#define POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED +#define POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE +#define POLARSSL_ERR_SSL_COMPRESSION_FAILED MBEDTLS_ERR_SSL_COMPRESSION_FAILED +#define POLARSSL_ERR_SSL_CONN_EOF MBEDTLS_ERR_SSL_CONN_EOF +#define POLARSSL_ERR_SSL_COUNTER_WRAPPING MBEDTLS_ERR_SSL_COUNTER_WRAPPING +#define POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE +#define POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE +#define POLARSSL_ERR_SSL_HELLO_VERIFY_REQUIRED MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED +#define POLARSSL_ERR_SSL_HW_ACCEL_FAILED MBEDTLS_ERR_SSL_HW_ACCEL_FAILED +#define POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH +#define POLARSSL_ERR_SSL_INTERNAL_ERROR MBEDTLS_ERR_SSL_INTERNAL_ERROR +#define POLARSSL_ERR_SSL_INVALID_MAC MBEDTLS_ERR_SSL_INVALID_MAC +#define POLARSSL_ERR_SSL_INVALID_RECORD MBEDTLS_ERR_SSL_INVALID_RECORD +#define POLARSSL_ERR_SSL_MALLOC_FAILED MBEDTLS_ERR_SSL_ALLOC_FAILED +#define POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN +#define POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE +#define POLARSSL_ERR_SSL_NO_RNG MBEDTLS_ERR_SSL_NO_RNG +#define POLARSSL_ERR_SSL_NO_USABLE_CIPHERSUITE MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE +#define POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY +#define POLARSSL_ERR_SSL_PEER_VERIFY_FAILED MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED +#define POLARSSL_ERR_SSL_PK_TYPE_MISMATCH MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH +#define POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED +#define POLARSSL_ERR_SSL_SESSION_TICKET_EXPIRED MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED +#define POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE +#define POLARSSL_ERR_SSL_UNKNOWN_CIPHER MBEDTLS_ERR_SSL_UNKNOWN_CIPHER +#define POLARSSL_ERR_SSL_UNKNOWN_IDENTITY MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY +#define POLARSSL_ERR_SSL_WAITING_SERVER_HELLO_RENEGO MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO +#define POLARSSL_ERR_THREADING_BAD_INPUT_DATA MBEDTLS_ERR_THREADING_BAD_INPUT_DATA +#define POLARSSL_ERR_THREADING_FEATURE_UNAVAILABLE MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE +#define POLARSSL_ERR_THREADING_MUTEX_ERROR MBEDTLS_ERR_THREADING_MUTEX_ERROR +#define POLARSSL_ERR_X509_BAD_INPUT_DATA MBEDTLS_ERR_X509_BAD_INPUT_DATA +#define POLARSSL_ERR_X509_CERT_UNKNOWN_FORMAT MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT +#define POLARSSL_ERR_X509_CERT_VERIFY_FAILED MBEDTLS_ERR_X509_CERT_VERIFY_FAILED +#define POLARSSL_ERR_X509_FEATURE_UNAVAILABLE MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE +#define POLARSSL_ERR_X509_FILE_IO_ERROR MBEDTLS_ERR_X509_FILE_IO_ERROR +#define POLARSSL_ERR_X509_INVALID_ALG MBEDTLS_ERR_X509_INVALID_ALG +#define POLARSSL_ERR_X509_INVALID_DATE MBEDTLS_ERR_X509_INVALID_DATE +#define POLARSSL_ERR_X509_INVALID_EXTENSIONS MBEDTLS_ERR_X509_INVALID_EXTENSIONS +#define POLARSSL_ERR_X509_INVALID_FORMAT MBEDTLS_ERR_X509_INVALID_FORMAT +#define POLARSSL_ERR_X509_INVALID_NAME MBEDTLS_ERR_X509_INVALID_NAME +#define POLARSSL_ERR_X509_INVALID_SERIAL MBEDTLS_ERR_X509_INVALID_SERIAL +#define POLARSSL_ERR_X509_INVALID_SIGNATURE MBEDTLS_ERR_X509_INVALID_SIGNATURE +#define POLARSSL_ERR_X509_INVALID_VERSION MBEDTLS_ERR_X509_INVALID_VERSION +#define POLARSSL_ERR_X509_MALLOC_FAILED MBEDTLS_ERR_X509_ALLOC_FAILED +#define POLARSSL_ERR_X509_SIG_MISMATCH MBEDTLS_ERR_X509_SIG_MISMATCH +#define POLARSSL_ERR_X509_UNKNOWN_OID MBEDTLS_ERR_X509_UNKNOWN_OID +#define POLARSSL_ERR_X509_UNKNOWN_SIG_ALG MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG +#define POLARSSL_ERR_X509_UNKNOWN_VERSION MBEDTLS_ERR_X509_UNKNOWN_VERSION +#define POLARSSL_ERR_XTEA_INVALID_INPUT_LENGTH MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH +#define POLARSSL_GCM_H MBEDTLS_GCM_H +#define POLARSSL_HAVEGE_H MBEDTLS_HAVEGE_H +#define POLARSSL_HAVE_INT32 MBEDTLS_HAVE_INT32 +#define POLARSSL_HAVE_INT64 MBEDTLS_HAVE_INT64 +#define POLARSSL_HAVE_UDBL MBEDTLS_HAVE_UDBL +#define POLARSSL_HAVE_X86 MBEDTLS_HAVE_X86 +#define POLARSSL_HAVE_X86_64 MBEDTLS_HAVE_X86_64 +#define POLARSSL_HMAC_DRBG_H MBEDTLS_HMAC_DRBG_H +#define POLARSSL_HMAC_DRBG_PR_OFF MBEDTLS_HMAC_DRBG_PR_OFF +#define POLARSSL_HMAC_DRBG_PR_ON MBEDTLS_HMAC_DRBG_PR_ON +#define POLARSSL_KEY_EXCHANGE_DHE_PSK MBEDTLS_KEY_EXCHANGE_DHE_PSK +#define POLARSSL_KEY_EXCHANGE_DHE_RSA MBEDTLS_KEY_EXCHANGE_DHE_RSA +#define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA +#define POLARSSL_KEY_EXCHANGE_ECDHE_PSK MBEDTLS_KEY_EXCHANGE_ECDHE_PSK +#define POLARSSL_KEY_EXCHANGE_ECDHE_RSA MBEDTLS_KEY_EXCHANGE_ECDHE_RSA +#define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA +#define POLARSSL_KEY_EXCHANGE_ECDH_RSA MBEDTLS_KEY_EXCHANGE_ECDH_RSA +#define POLARSSL_KEY_EXCHANGE_NONE MBEDTLS_KEY_EXCHANGE_NONE +#define POLARSSL_KEY_EXCHANGE_PSK MBEDTLS_KEY_EXCHANGE_PSK +#define POLARSSL_KEY_EXCHANGE_RSA MBEDTLS_KEY_EXCHANGE_RSA +#define POLARSSL_KEY_EXCHANGE_RSA_PSK MBEDTLS_KEY_EXCHANGE_RSA_PSK +#define POLARSSL_KEY_EXCHANGE__SOME__ECDHE_ENABLED MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED +#define POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED +#define POLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED +#define POLARSSL_KEY_LENGTH_DES MBEDTLS_KEY_LENGTH_DES +#define POLARSSL_KEY_LENGTH_DES_EDE MBEDTLS_KEY_LENGTH_DES_EDE +#define POLARSSL_KEY_LENGTH_DES_EDE3 MBEDTLS_KEY_LENGTH_DES_EDE3 +#define POLARSSL_KEY_LENGTH_NONE MBEDTLS_KEY_LENGTH_NONE +#define POLARSSL_MAX_BLOCK_LENGTH MBEDTLS_MAX_BLOCK_LENGTH +#define POLARSSL_MAX_IV_LENGTH MBEDTLS_MAX_IV_LENGTH +#define POLARSSL_MD2_H MBEDTLS_MD2_H +#define POLARSSL_MD4_H MBEDTLS_MD4_H +#define POLARSSL_MD5_H MBEDTLS_MD5_H +#define POLARSSL_MD_H MBEDTLS_MD_H +#define POLARSSL_MD_MAX_SIZE MBEDTLS_MD_MAX_SIZE +#define POLARSSL_MD_MD2 MBEDTLS_MD_MD2 +#define POLARSSL_MD_MD4 MBEDTLS_MD_MD4 +#define POLARSSL_MD_MD5 MBEDTLS_MD_MD5 +#define POLARSSL_MD_NONE MBEDTLS_MD_NONE +#define POLARSSL_MD_RIPEMD160 MBEDTLS_MD_RIPEMD160 +#define POLARSSL_MD_SHA1 MBEDTLS_MD_SHA1 +#define POLARSSL_MD_SHA224 MBEDTLS_MD_SHA224 +#define POLARSSL_MD_SHA256 MBEDTLS_MD_SHA256 +#define POLARSSL_MD_SHA384 MBEDTLS_MD_SHA384 +#define POLARSSL_MD_SHA512 MBEDTLS_MD_SHA512 +#define POLARSSL_MD_WRAP_H MBEDTLS_MD_WRAP_H +#define POLARSSL_MEMORY_BUFFER_ALLOC_H MBEDTLS_MEMORY_BUFFER_ALLOC_H +#define POLARSSL_MODE_CBC MBEDTLS_MODE_CBC +#define POLARSSL_MODE_CCM MBEDTLS_MODE_CCM +#define POLARSSL_MODE_CFB MBEDTLS_MODE_CFB +#define POLARSSL_MODE_CTR MBEDTLS_MODE_CTR +#define POLARSSL_MODE_ECB MBEDTLS_MODE_ECB +#define POLARSSL_MODE_GCM MBEDTLS_MODE_GCM +#define POLARSSL_MODE_NONE MBEDTLS_MODE_NONE +#define POLARSSL_MODE_OFB MBEDTLS_MODE_OFB +#define POLARSSL_MODE_STREAM MBEDTLS_MODE_STREAM +#define POLARSSL_MPI_MAX_BITS MBEDTLS_MPI_MAX_BITS +#define POLARSSL_MPI_MAX_BITS_SCALE100 MBEDTLS_MPI_MAX_BITS_SCALE100 +#define POLARSSL_MPI_MAX_LIMBS MBEDTLS_MPI_MAX_LIMBS +#define POLARSSL_MPI_RW_BUFFER_SIZE MBEDTLS_MPI_RW_BUFFER_SIZE +#define POLARSSL_NET_H MBEDTLS_NET_SOCKETS_H +#define POLARSSL_NET_LISTEN_BACKLOG MBEDTLS_NET_LISTEN_BACKLOG +#define POLARSSL_OID_H MBEDTLS_OID_H +#define POLARSSL_OPERATION_NONE MBEDTLS_OPERATION_NONE +#define POLARSSL_PADDING_NONE MBEDTLS_PADDING_NONE +#define POLARSSL_PADDING_ONE_AND_ZEROS MBEDTLS_PADDING_ONE_AND_ZEROS +#define POLARSSL_PADDING_PKCS7 MBEDTLS_PADDING_PKCS7 +#define POLARSSL_PADDING_ZEROS MBEDTLS_PADDING_ZEROS +#define POLARSSL_PADDING_ZEROS_AND_LEN MBEDTLS_PADDING_ZEROS_AND_LEN +#define POLARSSL_PADLOCK_H MBEDTLS_PADLOCK_H +#define POLARSSL_PEM_H MBEDTLS_PEM_H +#define POLARSSL_PKCS11_H MBEDTLS_PKCS11_H +#define POLARSSL_PKCS12_H MBEDTLS_PKCS12_H +#define POLARSSL_PKCS5_H MBEDTLS_PKCS5_H +#define POLARSSL_PK_DEBUG_ECP MBEDTLS_PK_DEBUG_ECP +#define POLARSSL_PK_DEBUG_MAX_ITEMS MBEDTLS_PK_DEBUG_MAX_ITEMS +#define POLARSSL_PK_DEBUG_MPI MBEDTLS_PK_DEBUG_MPI +#define POLARSSL_PK_DEBUG_NONE MBEDTLS_PK_DEBUG_NONE +#define POLARSSL_PK_ECDSA MBEDTLS_PK_ECDSA +#define POLARSSL_PK_ECKEY MBEDTLS_PK_ECKEY +#define POLARSSL_PK_ECKEY_DH MBEDTLS_PK_ECKEY_DH +#define POLARSSL_PK_H MBEDTLS_PK_H +#define POLARSSL_PK_NONE MBEDTLS_PK_NONE +#define POLARSSL_PK_RSA MBEDTLS_PK_RSA +#define POLARSSL_PK_RSASSA_PSS MBEDTLS_PK_RSASSA_PSS +#define POLARSSL_PK_RSA_ALT MBEDTLS_PK_RSA_ALT +#define POLARSSL_PK_WRAP_H MBEDTLS_PK_WRAP_H +#define POLARSSL_PLATFORM_H MBEDTLS_PLATFORM_H +#define POLARSSL_PREMASTER_SIZE MBEDTLS_PREMASTER_SIZE +#define POLARSSL_RIPEMD160_H MBEDTLS_RIPEMD160_H +#define POLARSSL_RSA_H MBEDTLS_RSA_H +#define POLARSSL_SHA1_H MBEDTLS_SHA1_H +#define POLARSSL_SHA256_H MBEDTLS_SHA256_H +#define POLARSSL_SHA512_H MBEDTLS_SHA512_H +#define POLARSSL_SSL_CACHE_H MBEDTLS_SSL_CACHE_H +#define POLARSSL_SSL_CIPHERSUITES_H MBEDTLS_SSL_CIPHERSUITES_H +#define POLARSSL_SSL_COOKIE_H MBEDTLS_SSL_COOKIE_H +#define POLARSSL_SSL_H MBEDTLS_SSL_H +#define POLARSSL_THREADING_H MBEDTLS_THREADING_H +#define POLARSSL_THREADING_IMPL MBEDTLS_THREADING_IMPL +#define POLARSSL_TIMING_H MBEDTLS_TIMING_H +#define POLARSSL_VERSION_H MBEDTLS_VERSION_H +#define POLARSSL_VERSION_MAJOR MBEDTLS_VERSION_MAJOR +#define POLARSSL_VERSION_MINOR MBEDTLS_VERSION_MINOR +#define POLARSSL_VERSION_NUMBER MBEDTLS_VERSION_NUMBER +#define POLARSSL_VERSION_PATCH MBEDTLS_VERSION_PATCH +#define POLARSSL_VERSION_STRING MBEDTLS_VERSION_STRING +#define POLARSSL_VERSION_STRING_FULL MBEDTLS_VERSION_STRING_FULL +#define POLARSSL_X509_CRL_H MBEDTLS_X509_CRL_H +#define POLARSSL_X509_CRT_H MBEDTLS_X509_CRT_H +#define POLARSSL_X509_CSR_H MBEDTLS_X509_CSR_H +#define POLARSSL_X509_H MBEDTLS_X509_H +#define POLARSSL_XTEA_H MBEDTLS_XTEA_H +#define RSA_CRYPT MBEDTLS_RSA_CRYPT +#define RSA_PKCS_V15 MBEDTLS_RSA_PKCS_V15 +#define RSA_PKCS_V21 MBEDTLS_RSA_PKCS_V21 +#define RSA_PRIVATE MBEDTLS_RSA_PRIVATE +#define RSA_PUBLIC MBEDTLS_RSA_PUBLIC +#define RSA_SALT_LEN_ANY MBEDTLS_RSA_SALT_LEN_ANY +#define RSA_SIGN MBEDTLS_RSA_SIGN +#define SSL_ALERT_LEVEL_FATAL MBEDTLS_SSL_ALERT_LEVEL_FATAL +#define SSL_ALERT_LEVEL_WARNING MBEDTLS_SSL_ALERT_LEVEL_WARNING +#define SSL_ALERT_MSG_ACCESS_DENIED MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED +#define SSL_ALERT_MSG_BAD_CERT MBEDTLS_SSL_ALERT_MSG_BAD_CERT +#define SSL_ALERT_MSG_BAD_RECORD_MAC MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC +#define SSL_ALERT_MSG_CERT_EXPIRED MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED +#define SSL_ALERT_MSG_CERT_REVOKED MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED +#define SSL_ALERT_MSG_CERT_UNKNOWN MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN +#define SSL_ALERT_MSG_CLOSE_NOTIFY MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY +#define SSL_ALERT_MSG_DECODE_ERROR MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR +#define SSL_ALERT_MSG_DECOMPRESSION_FAILURE MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE +#define SSL_ALERT_MSG_DECRYPTION_FAILED MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED +#define SSL_ALERT_MSG_DECRYPT_ERROR MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR +#define SSL_ALERT_MSG_EXPORT_RESTRICTION MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION +#define SSL_ALERT_MSG_HANDSHAKE_FAILURE MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE +#define SSL_ALERT_MSG_ILLEGAL_PARAMETER MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER +#define SSL_ALERT_MSG_INAPROPRIATE_FALLBACK MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK +#define SSL_ALERT_MSG_INSUFFICIENT_SECURITY MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY +#define SSL_ALERT_MSG_INTERNAL_ERROR MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR +#define SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL +#define SSL_ALERT_MSG_NO_CERT MBEDTLS_SSL_ALERT_MSG_NO_CERT +#define SSL_ALERT_MSG_NO_RENEGOTIATION MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION +#define SSL_ALERT_MSG_PROTOCOL_VERSION MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION +#define SSL_ALERT_MSG_RECORD_OVERFLOW MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW +#define SSL_ALERT_MSG_UNEXPECTED_MESSAGE MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE +#define SSL_ALERT_MSG_UNKNOWN_CA MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA +#define SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY +#define SSL_ALERT_MSG_UNRECOGNIZED_NAME MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME +#define SSL_ALERT_MSG_UNSUPPORTED_CERT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT +#define SSL_ALERT_MSG_UNSUPPORTED_EXT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT +#define SSL_ALERT_MSG_USER_CANCELED MBEDTLS_SSL_ALERT_MSG_USER_CANCELED +#define SSL_ANTI_REPLAY_DISABLED MBEDTLS_SSL_ANTI_REPLAY_DISABLED +#define SSL_ANTI_REPLAY_ENABLED MBEDTLS_SSL_ANTI_REPLAY_ENABLED +#define SSL_ARC4_DISABLED MBEDTLS_SSL_ARC4_DISABLED +#define SSL_ARC4_ENABLED MBEDTLS_SSL_ARC4_ENABLED +#define SSL_BUFFER_LEN (((MBEDTLS_SSL_IN_BUFFER_LEN) < (MBEDTLS_SSL_OUT_BUFFER_LEN)) \ + ? (MBEDTLS_SSL_IN_BUFFER_LEN) : (MBEDTLS_SSL_OUT_BUFFER_LEN)) +#define SSL_CACHE_DEFAULT_MAX_ENTRIES MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES +#define SSL_CACHE_DEFAULT_TIMEOUT MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT +#define SSL_CBC_RECORD_SPLITTING_DISABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED +#define SSL_CBC_RECORD_SPLITTING_ENABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED +#define SSL_CERTIFICATE_REQUEST MBEDTLS_SSL_CERTIFICATE_REQUEST +#define SSL_CERTIFICATE_VERIFY MBEDTLS_SSL_CERTIFICATE_VERIFY +#define SSL_CERT_TYPE_ECDSA_SIGN MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN +#define SSL_CERT_TYPE_RSA_SIGN MBEDTLS_SSL_CERT_TYPE_RSA_SIGN +#define SSL_CHANNEL_INBOUND MBEDTLS_SSL_CHANNEL_INBOUND +#define SSL_CHANNEL_OUTBOUND MBEDTLS_SSL_CHANNEL_OUTBOUND +#define SSL_CIPHERSUITES MBEDTLS_SSL_CIPHERSUITES +#define SSL_CLIENT_CERTIFICATE MBEDTLS_SSL_CLIENT_CERTIFICATE +#define SSL_CLIENT_CHANGE_CIPHER_SPEC MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC +#define SSL_CLIENT_FINISHED MBEDTLS_SSL_CLIENT_FINISHED +#define SSL_CLIENT_HELLO MBEDTLS_SSL_CLIENT_HELLO +#define SSL_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_CLIENT_KEY_EXCHANGE +#define SSL_COMPRESSION_ADD MBEDTLS_SSL_COMPRESSION_ADD +#define SSL_COMPRESS_DEFLATE MBEDTLS_SSL_COMPRESS_DEFLATE +#define SSL_COMPRESS_NULL MBEDTLS_SSL_COMPRESS_NULL +#define SSL_DEBUG_BUF MBEDTLS_SSL_DEBUG_BUF +#define SSL_DEBUG_CRT MBEDTLS_SSL_DEBUG_CRT +#define SSL_DEBUG_ECP MBEDTLS_SSL_DEBUG_ECP +#define SSL_DEBUG_MPI MBEDTLS_SSL_DEBUG_MPI +#define SSL_DEBUG_MSG MBEDTLS_SSL_DEBUG_MSG +#define SSL_DEBUG_RET MBEDTLS_SSL_DEBUG_RET +#define SSL_DEFAULT_TICKET_LIFETIME MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME +#define SSL_DTLS_TIMEOUT_DFL_MAX MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX +#define SSL_DTLS_TIMEOUT_DFL_MIN MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN +#define SSL_EMPTY_RENEGOTIATION_INFO MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO +#define SSL_ETM_DISABLED MBEDTLS_SSL_ETM_DISABLED +#define SSL_ETM_ENABLED MBEDTLS_SSL_ETM_ENABLED +#define SSL_EXTENDED_MS_DISABLED MBEDTLS_SSL_EXTENDED_MS_DISABLED +#define SSL_EXTENDED_MS_ENABLED MBEDTLS_SSL_EXTENDED_MS_ENABLED +#define SSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV +#define SSL_FLUSH_BUFFERS MBEDTLS_SSL_FLUSH_BUFFERS +#define SSL_HANDSHAKE_OVER MBEDTLS_SSL_HANDSHAKE_OVER +#define SSL_HANDSHAKE_WRAPUP MBEDTLS_SSL_HANDSHAKE_WRAPUP +#define SSL_HASH_MD5 MBEDTLS_SSL_HASH_MD5 +#define SSL_HASH_NONE MBEDTLS_SSL_HASH_NONE +#define SSL_HASH_SHA1 MBEDTLS_SSL_HASH_SHA1 +#define SSL_HASH_SHA224 MBEDTLS_SSL_HASH_SHA224 +#define SSL_HASH_SHA256 MBEDTLS_SSL_HASH_SHA256 +#define SSL_HASH_SHA384 MBEDTLS_SSL_HASH_SHA384 +#define SSL_HASH_SHA512 MBEDTLS_SSL_HASH_SHA512 +#define SSL_HELLO_REQUEST MBEDTLS_SSL_HELLO_REQUEST +#define SSL_HS_CERTIFICATE MBEDTLS_SSL_HS_CERTIFICATE +#define SSL_HS_CERTIFICATE_REQUEST MBEDTLS_SSL_HS_CERTIFICATE_REQUEST +#define SSL_HS_CERTIFICATE_VERIFY MBEDTLS_SSL_HS_CERTIFICATE_VERIFY +#define SSL_HS_CLIENT_HELLO MBEDTLS_SSL_HS_CLIENT_HELLO +#define SSL_HS_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE +#define SSL_HS_FINISHED MBEDTLS_SSL_HS_FINISHED +#define SSL_HS_HELLO_REQUEST MBEDTLS_SSL_HS_HELLO_REQUEST +#define SSL_HS_HELLO_VERIFY_REQUEST MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST +#define SSL_HS_NEW_SESSION_TICKET MBEDTLS_SSL_HS_NEW_SESSION_TICKET +#define SSL_HS_SERVER_HELLO MBEDTLS_SSL_HS_SERVER_HELLO +#define SSL_HS_SERVER_HELLO_DONE MBEDTLS_SSL_HS_SERVER_HELLO_DONE +#define SSL_HS_SERVER_KEY_EXCHANGE MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE +#define SSL_INITIAL_HANDSHAKE MBEDTLS_SSL_INITIAL_HANDSHAKE +#define SSL_IS_CLIENT MBEDTLS_SSL_IS_CLIENT +#define SSL_IS_FALLBACK MBEDTLS_SSL_IS_FALLBACK +#define SSL_IS_NOT_FALLBACK MBEDTLS_SSL_IS_NOT_FALLBACK +#define SSL_IS_SERVER MBEDTLS_SSL_IS_SERVER +#define SSL_LEGACY_ALLOW_RENEGOTIATION MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION +#define SSL_LEGACY_BREAK_HANDSHAKE MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE +#define SSL_LEGACY_NO_RENEGOTIATION MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION +#define SSL_LEGACY_RENEGOTIATION MBEDTLS_SSL_LEGACY_RENEGOTIATION +#define SSL_MAC_ADD MBEDTLS_SSL_MAC_ADD +#define SSL_MAJOR_VERSION_3 MBEDTLS_SSL_MAJOR_VERSION_3 +#define SSL_MAX_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN +#define SSL_MAX_FRAG_LEN_1024 MBEDTLS_SSL_MAX_FRAG_LEN_1024 +#define SSL_MAX_FRAG_LEN_2048 MBEDTLS_SSL_MAX_FRAG_LEN_2048 +#define SSL_MAX_FRAG_LEN_4096 MBEDTLS_SSL_MAX_FRAG_LEN_4096 +#define SSL_MAX_FRAG_LEN_512 MBEDTLS_SSL_MAX_FRAG_LEN_512 +#define SSL_MAX_FRAG_LEN_INVALID MBEDTLS_SSL_MAX_FRAG_LEN_INVALID +#define SSL_MAX_FRAG_LEN_NONE MBEDTLS_SSL_MAX_FRAG_LEN_NONE +#define SSL_MAX_MAJOR_VERSION MBEDTLS_SSL_MAX_MAJOR_VERSION +#define SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MAX_MINOR_VERSION +#define SSL_MINOR_VERSION_0 MBEDTLS_SSL_MINOR_VERSION_0 +#define SSL_MINOR_VERSION_1 MBEDTLS_SSL_MINOR_VERSION_1 +#define SSL_MINOR_VERSION_2 MBEDTLS_SSL_MINOR_VERSION_2 +#define SSL_MINOR_VERSION_3 MBEDTLS_SSL_MINOR_VERSION_3 +#define SSL_MIN_MAJOR_VERSION MBEDTLS_SSL_MIN_MAJOR_VERSION +#define SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MIN_MINOR_VERSION +#define SSL_MSG_ALERT MBEDTLS_SSL_MSG_ALERT +#define SSL_MSG_APPLICATION_DATA MBEDTLS_SSL_MSG_APPLICATION_DATA +#define SSL_MSG_CHANGE_CIPHER_SPEC MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC +#define SSL_MSG_HANDSHAKE MBEDTLS_SSL_MSG_HANDSHAKE +#define SSL_PADDING_ADD MBEDTLS_SSL_PADDING_ADD +#define SSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION +#define SSL_RENEGOTIATION_DISABLED MBEDTLS_SSL_RENEGOTIATION_DISABLED +#define SSL_RENEGOTIATION_DONE MBEDTLS_SSL_RENEGOTIATION_DONE +#define SSL_RENEGOTIATION_ENABLED MBEDTLS_SSL_RENEGOTIATION_ENABLED +#define SSL_RENEGOTIATION_NOT_ENFORCED MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED +#define SSL_RENEGOTIATION_PENDING MBEDTLS_SSL_RENEGOTIATION_PENDING +#define SSL_RENEGO_MAX_RECORDS_DEFAULT MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT +#define SSL_RETRANS_FINISHED MBEDTLS_SSL_RETRANS_FINISHED +#define SSL_RETRANS_PREPARING MBEDTLS_SSL_RETRANS_PREPARING +#define SSL_RETRANS_SENDING MBEDTLS_SSL_RETRANS_SENDING +#define SSL_RETRANS_WAITING MBEDTLS_SSL_RETRANS_WAITING +#define SSL_SECURE_RENEGOTIATION MBEDTLS_SSL_SECURE_RENEGOTIATION +#define SSL_SERVER_CERTIFICATE MBEDTLS_SSL_SERVER_CERTIFICATE +#define SSL_SERVER_CHANGE_CIPHER_SPEC MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC +#define SSL_SERVER_FINISHED MBEDTLS_SSL_SERVER_FINISHED +#define SSL_SERVER_HELLO MBEDTLS_SSL_SERVER_HELLO +#define SSL_SERVER_HELLO_DONE MBEDTLS_SSL_SERVER_HELLO_DONE +#define SSL_SERVER_HELLO_VERIFY_REQUEST_SENT MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT +#define SSL_SERVER_KEY_EXCHANGE MBEDTLS_SSL_SERVER_KEY_EXCHANGE +#define SSL_SERVER_NEW_SESSION_TICKET MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET +#define SSL_SESSION_TICKETS_DISABLED MBEDTLS_SSL_SESSION_TICKETS_DISABLED +#define SSL_SESSION_TICKETS_ENABLED MBEDTLS_SSL_SESSION_TICKETS_ENABLED +#define SSL_SIG_ANON MBEDTLS_SSL_SIG_ANON +#define SSL_SIG_ECDSA MBEDTLS_SSL_SIG_ECDSA +#define SSL_SIG_RSA MBEDTLS_SSL_SIG_RSA +#define SSL_TRANSPORT_DATAGRAM MBEDTLS_SSL_TRANSPORT_DATAGRAM +#define SSL_TRANSPORT_STREAM MBEDTLS_SSL_TRANSPORT_STREAM +#define SSL_TRUNCATED_HMAC_LEN MBEDTLS_SSL_TRUNCATED_HMAC_LEN +#define SSL_TRUNC_HMAC_DISABLED MBEDTLS_SSL_TRUNC_HMAC_DISABLED +#define SSL_TRUNC_HMAC_ENABLED MBEDTLS_SSL_TRUNC_HMAC_ENABLED +#define SSL_VERIFY_DATA_MAX_LEN MBEDTLS_SSL_VERIFY_DATA_MAX_LEN +#define SSL_VERIFY_NONE MBEDTLS_SSL_VERIFY_NONE +#define SSL_VERIFY_OPTIONAL MBEDTLS_SSL_VERIFY_OPTIONAL +#define SSL_VERIFY_REQUIRED MBEDTLS_SSL_VERIFY_REQUIRED +#define TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA +#define TLS_DHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA +#define TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 +#define TLS_DHE_PSK_WITH_AES_128_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM +#define TLS_DHE_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8 +#define TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 +#define TLS_DHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA +#define TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 +#define TLS_DHE_PSK_WITH_AES_256_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM +#define TLS_DHE_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8 +#define TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 +#define TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 +#define TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 +#define TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 +#define TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 +#define TLS_DHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA +#define TLS_DHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 +#define TLS_DHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 +#define TLS_DHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA +#define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA +#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA +#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 +#define TLS_DHE_RSA_WITH_AES_128_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM +#define TLS_DHE_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8 +#define TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 +#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA +#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 +#define TLS_DHE_RSA_WITH_AES_256_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM +#define TLS_DHE_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8 +#define TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 +#define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA +#define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 +#define TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 +#define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA +#define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 +#define TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 +#define TLS_DHE_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA +#define TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA +#define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA +#define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 +#define TLS_ECDHE_ECDSA_WITH_AES_128_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM +#define TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 +#define TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 +#define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA +#define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 +#define TLS_ECDHE_ECDSA_WITH_AES_256_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM +#define TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 +#define TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 +#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 \ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 +#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 \ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 +#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 \ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 +#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 \ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 +#define TLS_ECDHE_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA +#define TLS_ECDHE_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA +#define TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA +#define TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA +#define TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 +#define TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA +#define TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 +#define TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 \ + MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 +#define TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 \ + MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 +#define TLS_ECDHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA +#define TLS_ECDHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 +#define TLS_ECDHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 +#define TLS_ECDHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA +#define TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA +#define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA +#define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 +#define TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 +#define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA +#define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 +#define TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 +#define TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 \ + MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 +#define TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 \ + MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 +#define TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 \ + MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 +#define TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 \ + MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 +#define TLS_ECDHE_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA +#define TLS_ECDHE_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA +#define TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA +#define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA +#define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 +#define TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 +#define TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA +#define TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 +#define TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 +#define TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 \ + MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 +#define TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 \ + MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 +#define TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 \ + MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 +#define TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 \ + MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 +#define TLS_ECDH_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA +#define TLS_ECDH_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA +#define TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA +#define TLS_ECDH_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA +#define TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 +#define TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 +#define TLS_ECDH_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA +#define TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 +#define TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 +#define TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 +#define TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 +#define TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 +#define TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 +#define TLS_ECDH_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA +#define TLS_ECDH_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA +#define TLS_EXT_ALPN MBEDTLS_TLS_EXT_ALPN +#define TLS_EXT_ENCRYPT_THEN_MAC MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC +#define TLS_EXT_EXTENDED_MASTER_SECRET MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET +#define TLS_EXT_MAX_FRAGMENT_LENGTH MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH +#define TLS_EXT_RENEGOTIATION_INFO MBEDTLS_TLS_EXT_RENEGOTIATION_INFO +#define TLS_EXT_SERVERNAME MBEDTLS_TLS_EXT_SERVERNAME +#define TLS_EXT_SERVERNAME_HOSTNAME MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME +#define TLS_EXT_SESSION_TICKET MBEDTLS_TLS_EXT_SESSION_TICKET +#define TLS_EXT_SIG_ALG MBEDTLS_TLS_EXT_SIG_ALG +#define TLS_EXT_SUPPORTED_ELLIPTIC_CURVES MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES +#define TLS_EXT_SUPPORTED_POINT_FORMATS MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS +#define TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT +#define TLS_EXT_TRUNCATED_HMAC MBEDTLS_TLS_EXT_TRUNCATED_HMAC +#define TLS_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA +#define TLS_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA +#define TLS_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 +#define TLS_PSK_WITH_AES_128_CCM MBEDTLS_TLS_PSK_WITH_AES_128_CCM +#define TLS_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8 +#define TLS_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 +#define TLS_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA +#define TLS_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 +#define TLS_PSK_WITH_AES_256_CCM MBEDTLS_TLS_PSK_WITH_AES_256_CCM +#define TLS_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8 +#define TLS_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 +#define TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 +#define TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 +#define TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 +#define TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 +#define TLS_PSK_WITH_NULL_SHA MBEDTLS_TLS_PSK_WITH_NULL_SHA +#define TLS_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_PSK_WITH_NULL_SHA256 +#define TLS_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_PSK_WITH_NULL_SHA384 +#define TLS_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_PSK_WITH_RC4_128_SHA +#define TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA +#define TLS_RSA_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA +#define TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 +#define TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 +#define TLS_RSA_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA +#define TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 +#define TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 +#define TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 +#define TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 +#define TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 +#define TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 +#define TLS_RSA_PSK_WITH_NULL_SHA MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA +#define TLS_RSA_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 +#define TLS_RSA_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 +#define TLS_RSA_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA +#define TLS_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA +#define TLS_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA +#define TLS_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 +#define TLS_RSA_WITH_AES_128_CCM MBEDTLS_TLS_RSA_WITH_AES_128_CCM +#define TLS_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8 +#define TLS_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 +#define TLS_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA +#define TLS_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 +#define TLS_RSA_WITH_AES_256_CCM MBEDTLS_TLS_RSA_WITH_AES_256_CCM +#define TLS_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8 +#define TLS_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 +#define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA +#define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 +#define TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 +#define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA +#define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 +#define TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 +#define TLS_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA +#define TLS_RSA_WITH_NULL_MD5 MBEDTLS_TLS_RSA_WITH_NULL_MD5 +#define TLS_RSA_WITH_NULL_SHA MBEDTLS_TLS_RSA_WITH_NULL_SHA +#define TLS_RSA_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_WITH_NULL_SHA256 +#define TLS_RSA_WITH_RC4_128_MD5 MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 +#define TLS_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_WITH_RC4_128_SHA +#define X509_CRT_VERSION_1 MBEDTLS_X509_CRT_VERSION_1 +#define X509_CRT_VERSION_2 MBEDTLS_X509_CRT_VERSION_2 +#define X509_CRT_VERSION_3 MBEDTLS_X509_CRT_VERSION_3 +#define X509_FORMAT_DER MBEDTLS_X509_FORMAT_DER +#define X509_FORMAT_PEM MBEDTLS_X509_FORMAT_PEM +#define X509_MAX_DN_NAME_SIZE MBEDTLS_X509_MAX_DN_NAME_SIZE +#define X509_RFC5280_MAX_SERIAL_LEN MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN +#define X509_RFC5280_UTC_TIME_LEN MBEDTLS_X509_RFC5280_UTC_TIME_LEN +#define XTEA_DECRYPT MBEDTLS_XTEA_DECRYPT +#define XTEA_ENCRYPT MBEDTLS_XTEA_ENCRYPT +#define _asn1_bitstring mbedtls_asn1_bitstring +#define _asn1_buf mbedtls_asn1_buf +#define _asn1_named_data mbedtls_asn1_named_data +#define _asn1_sequence mbedtls_asn1_sequence +#define _ssl_cache_context mbedtls_ssl_cache_context +#define _ssl_cache_entry mbedtls_ssl_cache_entry +#define _ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t +#define _ssl_context mbedtls_ssl_context +#define _ssl_flight_item mbedtls_ssl_flight_item +#define _ssl_handshake_params mbedtls_ssl_handshake_params +#define _ssl_key_cert mbedtls_ssl_key_cert +#define _ssl_premaster_secret mbedtls_ssl_premaster_secret +#define _ssl_session mbedtls_ssl_session +#define _ssl_transform mbedtls_ssl_transform +#define _x509_crl mbedtls_x509_crl +#define _x509_crl_entry mbedtls_x509_crl_entry +#define _x509_crt mbedtls_x509_crt +#define _x509_csr mbedtls_x509_csr +#define _x509_time mbedtls_x509_time +#define _x509write_cert mbedtls_x509write_cert +#define _x509write_csr mbedtls_x509write_csr +#define aes_context mbedtls_aes_context +#define aes_crypt_cbc mbedtls_aes_crypt_cbc +#define aes_crypt_cfb128 mbedtls_aes_crypt_cfb128 +#define aes_crypt_cfb8 mbedtls_aes_crypt_cfb8 +#define aes_crypt_ctr mbedtls_aes_crypt_ctr +#define aes_crypt_ecb mbedtls_aes_crypt_ecb +#define aes_free mbedtls_aes_free +#define aes_init mbedtls_aes_init +#define aes_self_test mbedtls_aes_self_test +#define aes_setkey_dec mbedtls_aes_setkey_dec +#define aes_setkey_enc mbedtls_aes_setkey_enc +#define aesni_crypt_ecb mbedtls_aesni_crypt_ecb +#define aesni_gcm_mult mbedtls_aesni_gcm_mult +#define aesni_inverse_key mbedtls_aesni_inverse_key +#define aesni_setkey_enc mbedtls_aesni_setkey_enc +#define aesni_supports mbedtls_aesni_has_support +#define alarmed mbedtls_timing_alarmed +#define arc4_context mbedtls_arc4_context +#define arc4_crypt mbedtls_arc4_crypt +#define arc4_free mbedtls_arc4_free +#define arc4_init mbedtls_arc4_init +#define arc4_self_test mbedtls_arc4_self_test +#define arc4_setup mbedtls_arc4_setup +#define asn1_bitstring mbedtls_asn1_bitstring +#define asn1_buf mbedtls_asn1_buf +#define asn1_find_named_data mbedtls_asn1_find_named_data +#define asn1_free_named_data mbedtls_asn1_free_named_data +#define asn1_free_named_data_list mbedtls_asn1_free_named_data_list +#define asn1_get_alg mbedtls_asn1_get_alg +#define asn1_get_alg_null mbedtls_asn1_get_alg_null +#define asn1_get_bitstring mbedtls_asn1_get_bitstring +#define asn1_get_bitstring_null mbedtls_asn1_get_bitstring_null +#define asn1_get_bool mbedtls_asn1_get_bool +#define asn1_get_int mbedtls_asn1_get_int +#define asn1_get_len mbedtls_asn1_get_len +#define asn1_get_mpi mbedtls_asn1_get_mpi +#define asn1_get_sequence_of mbedtls_asn1_get_sequence_of +#define asn1_get_tag mbedtls_asn1_get_tag +#define asn1_named_data mbedtls_asn1_named_data +#define asn1_sequence mbedtls_asn1_sequence +#define asn1_store_named_data mbedtls_asn1_store_named_data +#define asn1_write_algorithm_identifier mbedtls_asn1_write_algorithm_identifier +#define asn1_write_bitstring mbedtls_asn1_write_bitstring +#define asn1_write_bool mbedtls_asn1_write_bool +#define asn1_write_ia5_string mbedtls_asn1_write_ia5_string +#define asn1_write_int mbedtls_asn1_write_int +#define asn1_write_len mbedtls_asn1_write_len +#define asn1_write_mpi mbedtls_asn1_write_mpi +#define asn1_write_null mbedtls_asn1_write_null +#define asn1_write_octet_string mbedtls_asn1_write_octet_string +#define asn1_write_oid mbedtls_asn1_write_oid +#define asn1_write_printable_string mbedtls_asn1_write_printable_string +#define asn1_write_raw_buffer mbedtls_asn1_write_raw_buffer +#define asn1_write_tag mbedtls_asn1_write_tag +#define base64_decode mbedtls_base64_decode +#define base64_encode mbedtls_base64_encode +#define base64_self_test mbedtls_base64_self_test +#define blowfish_context mbedtls_blowfish_context +#define blowfish_crypt_cbc mbedtls_blowfish_crypt_cbc +#define blowfish_crypt_cfb64 mbedtls_blowfish_crypt_cfb64 +#define blowfish_crypt_ctr mbedtls_blowfish_crypt_ctr +#define blowfish_crypt_ecb mbedtls_blowfish_crypt_ecb +#define blowfish_free mbedtls_blowfish_free +#define blowfish_init mbedtls_blowfish_init +#define blowfish_setkey mbedtls_blowfish_setkey +#define camellia_context mbedtls_camellia_context +#define camellia_crypt_cbc mbedtls_camellia_crypt_cbc +#define camellia_crypt_cfb128 mbedtls_camellia_crypt_cfb128 +#define camellia_crypt_ctr mbedtls_camellia_crypt_ctr +#define camellia_crypt_ecb mbedtls_camellia_crypt_ecb +#define camellia_free mbedtls_camellia_free +#define camellia_init mbedtls_camellia_init +#define camellia_self_test mbedtls_camellia_self_test +#define camellia_setkey_dec mbedtls_camellia_setkey_dec +#define camellia_setkey_enc mbedtls_camellia_setkey_enc +#define ccm_auth_decrypt mbedtls_ccm_auth_decrypt +#define ccm_context mbedtls_ccm_context +#define ccm_encrypt_and_tag mbedtls_ccm_encrypt_and_tag +#define ccm_free mbedtls_ccm_free +#define ccm_init mbedtls_ccm_init +#define ccm_self_test mbedtls_ccm_self_test +#define cipher_auth_decrypt mbedtls_cipher_auth_decrypt +#define cipher_auth_encrypt mbedtls_cipher_auth_encrypt +#define cipher_base_t mbedtls_cipher_base_t +#define cipher_check_tag mbedtls_cipher_check_tag +#define cipher_context_t mbedtls_cipher_context_t +#define cipher_crypt mbedtls_cipher_crypt +#define cipher_definition_t mbedtls_cipher_definition_t +#define cipher_definitions mbedtls_cipher_definitions +#define cipher_finish mbedtls_cipher_finish +#define cipher_free mbedtls_cipher_free +#define cipher_get_block_size mbedtls_cipher_get_block_size +#define cipher_get_cipher_mode mbedtls_cipher_get_cipher_mode +#define cipher_get_iv_size mbedtls_cipher_get_iv_size +#define cipher_get_key_size mbedtls_cipher_get_key_bitlen +#define cipher_get_name mbedtls_cipher_get_name +#define cipher_get_operation mbedtls_cipher_get_operation +#define cipher_get_type mbedtls_cipher_get_type +#define cipher_id_t mbedtls_cipher_id_t +#define cipher_info_from_string mbedtls_cipher_info_from_string +#define cipher_info_from_type mbedtls_cipher_info_from_type +#define cipher_info_from_values mbedtls_cipher_info_from_values +#define cipher_info_t mbedtls_cipher_info_t +#define cipher_init mbedtls_cipher_init +#define cipher_init_ctx mbedtls_cipher_setup +#define cipher_list mbedtls_cipher_list +#define cipher_mode_t mbedtls_cipher_mode_t +#define cipher_padding_t mbedtls_cipher_padding_t +#define cipher_reset mbedtls_cipher_reset +#define cipher_set_iv mbedtls_cipher_set_iv +#define cipher_set_padding_mode mbedtls_cipher_set_padding_mode +#define cipher_setkey mbedtls_cipher_setkey +#define cipher_type_t mbedtls_cipher_type_t +#define cipher_update mbedtls_cipher_update +#define cipher_update_ad mbedtls_cipher_update_ad +#define cipher_write_tag mbedtls_cipher_write_tag +#define ctr_drbg_context mbedtls_ctr_drbg_context +#define ctr_drbg_free mbedtls_ctr_drbg_free +#define ctr_drbg_init mbedtls_ctr_drbg_init +#define ctr_drbg_random mbedtls_ctr_drbg_random +#define ctr_drbg_random_with_add mbedtls_ctr_drbg_random_with_add +#define ctr_drbg_reseed mbedtls_ctr_drbg_reseed +#define ctr_drbg_self_test mbedtls_ctr_drbg_self_test +#define ctr_drbg_set_entropy_len mbedtls_ctr_drbg_set_entropy_len +#define ctr_drbg_set_prediction_resistance mbedtls_ctr_drbg_set_prediction_resistance +#define ctr_drbg_set_reseed_interval mbedtls_ctr_drbg_set_reseed_interval +#define ctr_drbg_update mbedtls_ctr_drbg_update +#define ctr_drbg_update_seed_file mbedtls_ctr_drbg_update_seed_file +#define ctr_drbg_write_seed_file mbedtls_ctr_drbg_write_seed_file +#define debug_print_buf mbedtls_debug_print_buf +#define debug_print_crt mbedtls_debug_print_crt +#define debug_print_ecp mbedtls_debug_print_ecp +#define debug_print_mpi mbedtls_debug_print_mpi +#define debug_print_msg mbedtls_debug_print_msg +#define debug_print_ret mbedtls_debug_print_ret +#define debug_set_threshold mbedtls_debug_set_threshold +#define des3_context mbedtls_des3_context +#define des3_crypt_cbc mbedtls_des3_crypt_cbc +#define des3_crypt_ecb mbedtls_des3_crypt_ecb +#define des3_free mbedtls_des3_free +#define des3_init mbedtls_des3_init +#define des3_set2key_dec mbedtls_des3_set2key_dec +#define des3_set2key_enc mbedtls_des3_set2key_enc +#define des3_set3key_dec mbedtls_des3_set3key_dec +#define des3_set3key_enc mbedtls_des3_set3key_enc +#define des_context mbedtls_des_context +#define des_crypt_cbc mbedtls_des_crypt_cbc +#define des_crypt_ecb mbedtls_des_crypt_ecb +#define des_free mbedtls_des_free +#define des_init mbedtls_des_init +#define des_key_check_key_parity mbedtls_des_key_check_key_parity +#define des_key_check_weak mbedtls_des_key_check_weak +#define des_key_set_parity mbedtls_des_key_set_parity +#define des_self_test mbedtls_des_self_test +#define des_setkey_dec mbedtls_des_setkey_dec +#define des_setkey_enc mbedtls_des_setkey_enc +#define dhm_calc_secret mbedtls_dhm_calc_secret +#define dhm_context mbedtls_dhm_context +#define dhm_free mbedtls_dhm_free +#define dhm_init mbedtls_dhm_init +#define dhm_make_params mbedtls_dhm_make_params +#define dhm_make_public mbedtls_dhm_make_public +#define dhm_parse_dhm mbedtls_dhm_parse_dhm +#define dhm_parse_dhmfile mbedtls_dhm_parse_dhmfile +#define dhm_read_params mbedtls_dhm_read_params +#define dhm_read_public mbedtls_dhm_read_public +#define dhm_self_test mbedtls_dhm_self_test +#define ecdh_calc_secret mbedtls_ecdh_calc_secret +#define ecdh_compute_shared mbedtls_ecdh_compute_shared +#define ecdh_context mbedtls_ecdh_context +#define ecdh_free mbedtls_ecdh_free +#define ecdh_gen_public mbedtls_ecdh_gen_public +#define ecdh_get_params mbedtls_ecdh_get_params +#define ecdh_init mbedtls_ecdh_init +#define ecdh_make_params mbedtls_ecdh_make_params +#define ecdh_make_public mbedtls_ecdh_make_public +#define ecdh_read_params mbedtls_ecdh_read_params +#define ecdh_read_public mbedtls_ecdh_read_public +#define ecdh_side mbedtls_ecdh_side +#define ecdsa_context mbedtls_ecdsa_context +#define ecdsa_free mbedtls_ecdsa_free +#define ecdsa_from_keypair mbedtls_ecdsa_from_keypair +#define ecdsa_genkey mbedtls_ecdsa_genkey +#define ecdsa_info mbedtls_ecdsa_info +#define ecdsa_init mbedtls_ecdsa_init +#define ecdsa_read_signature mbedtls_ecdsa_read_signature +#define ecdsa_sign mbedtls_ecdsa_sign +#define ecdsa_sign_det mbedtls_ecdsa_sign_det +#define ecdsa_verify mbedtls_ecdsa_verify +#define ecdsa_write_signature mbedtls_ecdsa_write_signature +#define ecdsa_write_signature_det mbedtls_ecdsa_write_signature_det +#define eckey_info mbedtls_eckey_info +#define eckeydh_info mbedtls_eckeydh_info +#define ecp_check_privkey mbedtls_ecp_check_privkey +#define ecp_check_pub_priv mbedtls_ecp_check_pub_priv +#define ecp_check_pubkey mbedtls_ecp_check_pubkey +#define ecp_copy mbedtls_ecp_copy +#define ecp_curve_info mbedtls_ecp_curve_info +#define ecp_curve_info_from_grp_id mbedtls_ecp_curve_info_from_grp_id +#define ecp_curve_info_from_name mbedtls_ecp_curve_info_from_name +#define ecp_curve_info_from_tls_id mbedtls_ecp_curve_info_from_tls_id +#define ecp_curve_list mbedtls_ecp_curve_list +#define ecp_gen_key mbedtls_ecp_gen_key +#define ecp_gen_keypair mbedtls_ecp_gen_keypair +#define ecp_group mbedtls_ecp_group +#define ecp_group_copy mbedtls_ecp_group_copy +#define ecp_group_free mbedtls_ecp_group_free +#define ecp_group_id mbedtls_ecp_group_id +#define ecp_group_init mbedtls_ecp_group_init +#define ecp_grp_id_list mbedtls_ecp_grp_id_list +#define ecp_is_zero mbedtls_ecp_is_zero +#define ecp_keypair mbedtls_ecp_keypair +#define ecp_keypair_free mbedtls_ecp_keypair_free +#define ecp_keypair_init mbedtls_ecp_keypair_init +#define ecp_mul mbedtls_ecp_mul +#define ecp_point mbedtls_ecp_point +#define ecp_point_free mbedtls_ecp_point_free +#define ecp_point_init mbedtls_ecp_point_init +#define ecp_point_read_binary mbedtls_ecp_point_read_binary +#define ecp_point_read_string mbedtls_ecp_point_read_string +#define ecp_point_write_binary mbedtls_ecp_point_write_binary +#define ecp_self_test mbedtls_ecp_self_test +#define ecp_set_zero mbedtls_ecp_set_zero +#define ecp_tls_read_group mbedtls_ecp_tls_read_group +#define ecp_tls_read_point mbedtls_ecp_tls_read_point +#define ecp_tls_write_group mbedtls_ecp_tls_write_group +#define ecp_tls_write_point mbedtls_ecp_tls_write_point +#define ecp_use_known_dp mbedtls_ecp_group_load +#define entropy_add_source mbedtls_entropy_add_source +#define entropy_context mbedtls_entropy_context +#define entropy_free mbedtls_entropy_free +#define entropy_func mbedtls_entropy_func +#define entropy_gather mbedtls_entropy_gather +#define entropy_init mbedtls_entropy_init +#define entropy_self_test mbedtls_entropy_self_test +#define entropy_update_manual mbedtls_entropy_update_manual +#define entropy_update_seed_file mbedtls_entropy_update_seed_file +#define entropy_write_seed_file mbedtls_entropy_write_seed_file +#define error_strerror mbedtls_strerror +#define f_source_ptr mbedtls_entropy_f_source_ptr +#define gcm_auth_decrypt mbedtls_gcm_auth_decrypt +#define gcm_context mbedtls_gcm_context +#define gcm_crypt_and_tag mbedtls_gcm_crypt_and_tag +#define gcm_finish mbedtls_gcm_finish +#define gcm_free mbedtls_gcm_free +#define gcm_init mbedtls_gcm_init +#define gcm_self_test mbedtls_gcm_self_test +#define gcm_starts mbedtls_gcm_starts +#define gcm_update mbedtls_gcm_update +#define get_timer mbedtls_timing_get_timer +#define hardclock mbedtls_timing_hardclock +#define hardclock_poll mbedtls_hardclock_poll +#define havege_free mbedtls_havege_free +#define havege_init mbedtls_havege_init +#define havege_poll mbedtls_havege_poll +#define havege_random mbedtls_havege_random +#define havege_state mbedtls_havege_state +#define hmac_drbg_context mbedtls_hmac_drbg_context +#define hmac_drbg_free mbedtls_hmac_drbg_free +#define hmac_drbg_init mbedtls_hmac_drbg_init +#define hmac_drbg_random mbedtls_hmac_drbg_random +#define hmac_drbg_random_with_add mbedtls_hmac_drbg_random_with_add +#define hmac_drbg_reseed mbedtls_hmac_drbg_reseed +#define hmac_drbg_self_test mbedtls_hmac_drbg_self_test +#define hmac_drbg_set_entropy_len mbedtls_hmac_drbg_set_entropy_len +#define hmac_drbg_set_prediction_resistance mbedtls_hmac_drbg_set_prediction_resistance +#define hmac_drbg_set_reseed_interval mbedtls_hmac_drbg_set_reseed_interval +#define hmac_drbg_update mbedtls_hmac_drbg_update +#define hmac_drbg_update_seed_file mbedtls_hmac_drbg_update_seed_file +#define hmac_drbg_write_seed_file mbedtls_hmac_drbg_write_seed_file +#define hr_time mbedtls_timing_hr_time +#define key_exchange_type_t mbedtls_key_exchange_type_t +#define md mbedtls_md +#define md2 mbedtls_md2 +#define md2_context mbedtls_md2_context +#define md2_finish mbedtls_md2_finish +#define md2_free mbedtls_md2_free +#define md2_info mbedtls_md2_info +#define md2_init mbedtls_md2_init +#define md2_process mbedtls_md2_process +#define md2_self_test mbedtls_md2_self_test +#define md2_starts mbedtls_md2_starts +#define md2_update mbedtls_md2_update +#define md4 mbedtls_md4 +#define md4_context mbedtls_md4_context +#define md4_finish mbedtls_md4_finish +#define md4_free mbedtls_md4_free +#define md4_info mbedtls_md4_info +#define md4_init mbedtls_md4_init +#define md4_process mbedtls_md4_process +#define md4_self_test mbedtls_md4_self_test +#define md4_starts mbedtls_md4_starts +#define md4_update mbedtls_md4_update +#define md5 mbedtls_md5 +#define md5_context mbedtls_md5_context +#define md5_finish mbedtls_md5_finish +#define md5_free mbedtls_md5_free +#define md5_info mbedtls_md5_info +#define md5_init mbedtls_md5_init +#define md5_process mbedtls_md5_process +#define md5_self_test mbedtls_md5_self_test +#define md5_starts mbedtls_md5_starts +#define md5_update mbedtls_md5_update +#define md_context_t mbedtls_md_context_t +#define md_file mbedtls_md_file +#define md_finish mbedtls_md_finish +#define md_free mbedtls_md_free +#define md_get_name mbedtls_md_get_name +#define md_get_size mbedtls_md_get_size +#define md_get_type mbedtls_md_get_type +#define md_hmac mbedtls_md_hmac +#define md_hmac_finish mbedtls_md_hmac_finish +#define md_hmac_reset mbedtls_md_hmac_reset +#define md_hmac_starts mbedtls_md_hmac_starts +#define md_hmac_update mbedtls_md_hmac_update +#define md_info_from_string mbedtls_md_info_from_string +#define md_info_from_type mbedtls_md_info_from_type +#define md_info_t mbedtls_md_info_t +#define md_init mbedtls_md_init +#define md_init_ctx mbedtls_md_init_ctx +#define md_list mbedtls_md_list +#define md_process mbedtls_md_process +#define md_starts mbedtls_md_starts +#define md_type_t mbedtls_md_type_t +#define md_update mbedtls_md_update +#define memory_buffer_alloc_cur_get mbedtls_memory_buffer_alloc_cur_get +#define memory_buffer_alloc_free mbedtls_memory_buffer_alloc_free +#define memory_buffer_alloc_init mbedtls_memory_buffer_alloc_init +#define memory_buffer_alloc_max_get mbedtls_memory_buffer_alloc_max_get +#define memory_buffer_alloc_max_reset mbedtls_memory_buffer_alloc_max_reset +#define memory_buffer_alloc_self_test mbedtls_memory_buffer_alloc_self_test +#define memory_buffer_alloc_status mbedtls_memory_buffer_alloc_status +#define memory_buffer_alloc_verify mbedtls_memory_buffer_alloc_verify +#define memory_buffer_set_verify mbedtls_memory_buffer_set_verify +#define mpi mbedtls_mpi +#define mpi_add_abs mbedtls_mpi_add_abs +#define mpi_add_int mbedtls_mpi_add_int +#define mpi_add_mpi mbedtls_mpi_add_mpi +#define mpi_cmp_abs mbedtls_mpi_cmp_abs +#define mpi_cmp_int mbedtls_mpi_cmp_int +#define mpi_cmp_mpi mbedtls_mpi_cmp_mpi +#define mpi_copy mbedtls_mpi_copy +#define mpi_div_int mbedtls_mpi_div_int +#define mpi_div_mpi mbedtls_mpi_div_mpi +#define mpi_exp_mod mbedtls_mpi_exp_mod +#define mpi_fill_random mbedtls_mpi_fill_random +#define mpi_free mbedtls_mpi_free +#define mpi_gcd mbedtls_mpi_gcd +#define mpi_gen_prime mbedtls_mpi_gen_prime +#define mpi_get_bit mbedtls_mpi_get_bit +#define mpi_grow mbedtls_mpi_grow +#define mpi_init mbedtls_mpi_init +#define mpi_inv_mod mbedtls_mpi_inv_mod +#define mpi_is_prime mbedtls_mpi_is_prime +#define mpi_lsb mbedtls_mpi_lsb +#define mpi_lset mbedtls_mpi_lset +#define mpi_mod_int mbedtls_mpi_mod_int +#define mpi_mod_mpi mbedtls_mpi_mod_mpi +#define mpi_msb mbedtls_mpi_bitlen +#define mpi_mul_int mbedtls_mpi_mul_int +#define mpi_mul_mpi mbedtls_mpi_mul_mpi +#define mpi_read_binary mbedtls_mpi_read_binary +#define mpi_read_file mbedtls_mpi_read_file +#define mpi_read_string mbedtls_mpi_read_string +#define mpi_safe_cond_assign mbedtls_mpi_safe_cond_assign +#define mpi_safe_cond_swap mbedtls_mpi_safe_cond_swap +#define mpi_self_test mbedtls_mpi_self_test +#define mpi_set_bit mbedtls_mpi_set_bit +#define mpi_shift_l mbedtls_mpi_shift_l +#define mpi_shift_r mbedtls_mpi_shift_r +#define mpi_shrink mbedtls_mpi_shrink +#define mpi_size mbedtls_mpi_size +#define mpi_sub_abs mbedtls_mpi_sub_abs +#define mpi_sub_int mbedtls_mpi_sub_int +#define mpi_sub_mpi mbedtls_mpi_sub_mpi +#define mpi_swap mbedtls_mpi_swap +#define mpi_write_binary mbedtls_mpi_write_binary +#define mpi_write_file mbedtls_mpi_write_file +#define mpi_write_string mbedtls_mpi_write_string +#define net_accept mbedtls_net_accept +#define net_bind mbedtls_net_bind +#define net_close mbedtls_net_free +#define net_connect mbedtls_net_connect +#define net_recv mbedtls_net_recv +#define net_recv_timeout mbedtls_net_recv_timeout +#define net_send mbedtls_net_send +#define net_set_block mbedtls_net_set_block +#define net_set_nonblock mbedtls_net_set_nonblock +#define net_usleep mbedtls_net_usleep +#define oid_descriptor_t mbedtls_oid_descriptor_t +#define oid_get_attr_short_name mbedtls_oid_get_attr_short_name +#define oid_get_cipher_alg mbedtls_oid_get_cipher_alg +#define oid_get_ec_grp mbedtls_oid_get_ec_grp +#define oid_get_extended_key_usage mbedtls_oid_get_extended_key_usage +#define oid_get_md_alg mbedtls_oid_get_md_alg +#define oid_get_numeric_string mbedtls_oid_get_numeric_string +#define oid_get_oid_by_ec_grp mbedtls_oid_get_oid_by_ec_grp +#define oid_get_oid_by_md mbedtls_oid_get_oid_by_md +#define oid_get_oid_by_pk_alg mbedtls_oid_get_oid_by_pk_alg +#define oid_get_oid_by_sig_alg mbedtls_oid_get_oid_by_sig_alg +#define oid_get_pk_alg mbedtls_oid_get_pk_alg +#define oid_get_pkcs12_pbe_alg mbedtls_oid_get_pkcs12_pbe_alg +#define oid_get_sig_alg mbedtls_oid_get_sig_alg +#define oid_get_sig_alg_desc mbedtls_oid_get_sig_alg_desc +#define oid_get_x509_ext_type mbedtls_oid_get_x509_ext_type +#define operation_t mbedtls_operation_t +#define padlock_supports mbedtls_padlock_has_support +#define padlock_xcryptcbc mbedtls_padlock_xcryptcbc +#define padlock_xcryptecb mbedtls_padlock_xcryptecb +#define pem_context mbedtls_pem_context +#define pem_free mbedtls_pem_free +#define pem_init mbedtls_pem_init +#define pem_read_buffer mbedtls_pem_read_buffer +#define pem_write_buffer mbedtls_pem_write_buffer +#define pk_can_do mbedtls_pk_can_do +#define pk_check_pair mbedtls_pk_check_pair +#define pk_context mbedtls_pk_context +#define pk_debug mbedtls_pk_debug +#define pk_debug_item mbedtls_pk_debug_item +#define pk_debug_type mbedtls_pk_debug_type +#define pk_decrypt mbedtls_pk_decrypt +#define pk_ec mbedtls_pk_ec +#define pk_encrypt mbedtls_pk_encrypt +#define pk_free mbedtls_pk_free +#define pk_get_len mbedtls_pk_get_len +#define pk_get_name mbedtls_pk_get_name +#define pk_get_size mbedtls_pk_get_bitlen +#define pk_get_type mbedtls_pk_get_type +#define pk_info_from_type mbedtls_pk_info_from_type +#define pk_info_t mbedtls_pk_info_t +#define pk_init mbedtls_pk_init +#define pk_init_ctx mbedtls_pk_setup +#define pk_init_ctx_rsa_alt mbedtls_pk_setup_rsa_alt +#define pk_load_file mbedtls_pk_load_file +#define pk_parse_key mbedtls_pk_parse_key +#define pk_parse_keyfile mbedtls_pk_parse_keyfile +#define pk_parse_public_key mbedtls_pk_parse_public_key +#define pk_parse_public_keyfile mbedtls_pk_parse_public_keyfile +#define pk_parse_subpubkey mbedtls_pk_parse_subpubkey +#define pk_rsa mbedtls_pk_rsa +#define pk_rsa_alt_decrypt_func mbedtls_pk_rsa_alt_decrypt_func +#define pk_rsa_alt_key_len_func mbedtls_pk_rsa_alt_key_len_func +#define pk_rsa_alt_sign_func mbedtls_pk_rsa_alt_sign_func +#define pk_rsassa_pss_options mbedtls_pk_rsassa_pss_options +#define pk_sign mbedtls_pk_sign +#define pk_type_t mbedtls_pk_type_t +#define pk_verify mbedtls_pk_verify +#define pk_verify_ext mbedtls_pk_verify_ext +#define pk_write_key_der mbedtls_pk_write_key_der +#define pk_write_key_pem mbedtls_pk_write_key_pem +#define pk_write_pubkey mbedtls_pk_write_pubkey +#define pk_write_pubkey_der mbedtls_pk_write_pubkey_der +#define pk_write_pubkey_pem mbedtls_pk_write_pubkey_pem +#define pkcs11_context mbedtls_pkcs11_context +#define pkcs11_decrypt mbedtls_pkcs11_decrypt +#define pkcs11_priv_key_free mbedtls_pkcs11_priv_key_free +#define pkcs11_priv_key_init mbedtls_pkcs11_priv_key_bind +#define pkcs11_sign mbedtls_pkcs11_sign +#define pkcs11_x509_cert_init mbedtls_pkcs11_x509_cert_bind +#define pkcs12_derivation mbedtls_pkcs12_derivation +#define pkcs12_pbe mbedtls_pkcs12_pbe +#define pkcs12_pbe_sha1_rc4_128 mbedtls_pkcs12_pbe_sha1_rc4_128 +#define pkcs5_pbes2 mbedtls_pkcs5_pbes2 +#define pkcs5_pbkdf2_hmac mbedtls_pkcs5_pbkdf2_hmac +#define pkcs5_self_test mbedtls_pkcs5_self_test +#define platform_entropy_poll mbedtls_platform_entropy_poll +#define platform_set_exit mbedtls_platform_set_exit +#define platform_set_fprintf mbedtls_platform_set_fprintf +#define platform_set_printf mbedtls_platform_set_printf +#define platform_set_snprintf mbedtls_platform_set_snprintf +#define polarssl_exit mbedtls_exit +#define polarssl_fprintf mbedtls_fprintf +#define polarssl_free mbedtls_free +#define polarssl_mutex_free mbedtls_mutex_free +#define polarssl_mutex_init mbedtls_mutex_init +#define polarssl_mutex_lock mbedtls_mutex_lock +#define polarssl_mutex_unlock mbedtls_mutex_unlock +#define polarssl_printf mbedtls_printf +#define polarssl_snprintf mbedtls_snprintf +#define polarssl_strerror mbedtls_strerror +#define ripemd160 mbedtls_ripemd160 +#define ripemd160_context mbedtls_ripemd160_context +#define ripemd160_finish mbedtls_ripemd160_finish +#define ripemd160_free mbedtls_ripemd160_free +#define ripemd160_info mbedtls_ripemd160_info +#define ripemd160_init mbedtls_ripemd160_init +#define ripemd160_process mbedtls_ripemd160_process +#define ripemd160_self_test mbedtls_ripemd160_self_test +#define ripemd160_starts mbedtls_ripemd160_starts +#define ripemd160_update mbedtls_ripemd160_update +#define rsa_alt_context mbedtls_rsa_alt_context +#define rsa_alt_info mbedtls_rsa_alt_info +#define rsa_check_privkey mbedtls_rsa_check_privkey +#define rsa_check_pub_priv mbedtls_rsa_check_pub_priv +#define rsa_check_pubkey mbedtls_rsa_check_pubkey +#define rsa_context mbedtls_rsa_context +#define rsa_copy mbedtls_rsa_copy +#define rsa_free mbedtls_rsa_free +#define rsa_gen_key mbedtls_rsa_gen_key +#define rsa_info mbedtls_rsa_info +#define rsa_init mbedtls_rsa_init +#define rsa_pkcs1_decrypt mbedtls_rsa_pkcs1_decrypt +#define rsa_pkcs1_encrypt mbedtls_rsa_pkcs1_encrypt +#define rsa_pkcs1_sign mbedtls_rsa_pkcs1_sign +#define rsa_pkcs1_verify mbedtls_rsa_pkcs1_verify +#define rsa_private mbedtls_rsa_private +#define rsa_public mbedtls_rsa_public +#define rsa_rsaes_oaep_decrypt mbedtls_rsa_rsaes_oaep_decrypt +#define rsa_rsaes_oaep_encrypt mbedtls_rsa_rsaes_oaep_encrypt +#define rsa_rsaes_pkcs1_v15_decrypt mbedtls_rsa_rsaes_pkcs1_v15_decrypt +#define rsa_rsaes_pkcs1_v15_encrypt mbedtls_rsa_rsaes_pkcs1_v15_encrypt +#define rsa_rsassa_pkcs1_v15_sign mbedtls_rsa_rsassa_pkcs1_v15_sign +#define rsa_rsassa_pkcs1_v15_verify mbedtls_rsa_rsassa_pkcs1_v15_verify +#define rsa_rsassa_pss_sign mbedtls_rsa_rsassa_pss_sign +#define rsa_rsassa_pss_verify mbedtls_rsa_rsassa_pss_verify +#define rsa_rsassa_pss_verify_ext mbedtls_rsa_rsassa_pss_verify_ext +#define rsa_self_test mbedtls_rsa_self_test +#define rsa_set_padding mbedtls_rsa_set_padding +#define safer_memcmp mbedtls_ssl_safer_memcmp +#define set_alarm mbedtls_set_alarm +#define sha1 mbedtls_sha1 +#define sha1_context mbedtls_sha1_context +#define sha1_finish mbedtls_sha1_finish +#define sha1_free mbedtls_sha1_free +#define sha1_info mbedtls_sha1_info +#define sha1_init mbedtls_sha1_init +#define sha1_process mbedtls_sha1_process +#define sha1_self_test mbedtls_sha1_self_test +#define sha1_starts mbedtls_sha1_starts +#define sha1_update mbedtls_sha1_update +#define sha224_info mbedtls_sha224_info +#define sha256 mbedtls_sha256 +#define sha256_context mbedtls_sha256_context +#define sha256_finish mbedtls_sha256_finish +#define sha256_free mbedtls_sha256_free +#define sha256_info mbedtls_sha256_info +#define sha256_init mbedtls_sha256_init +#define sha256_process mbedtls_sha256_process +#define sha256_self_test mbedtls_sha256_self_test +#define sha256_starts mbedtls_sha256_starts +#define sha256_update mbedtls_sha256_update +#define sha384_info mbedtls_sha384_info +#define sha512 mbedtls_sha512 +#define sha512_context mbedtls_sha512_context +#define sha512_finish mbedtls_sha512_finish +#define sha512_free mbedtls_sha512_free +#define sha512_info mbedtls_sha512_info +#define sha512_init mbedtls_sha512_init +#define sha512_process mbedtls_sha512_process +#define sha512_self_test mbedtls_sha512_self_test +#define sha512_starts mbedtls_sha512_starts +#define sha512_update mbedtls_sha512_update +#define source_state mbedtls_entropy_source_state +#define ssl_cache_context mbedtls_ssl_cache_context +#define ssl_cache_entry mbedtls_ssl_cache_entry +#define ssl_cache_free mbedtls_ssl_cache_free +#define ssl_cache_get mbedtls_ssl_cache_get +#define ssl_cache_init mbedtls_ssl_cache_init +#define ssl_cache_set mbedtls_ssl_cache_set +#define ssl_cache_set_max_entries mbedtls_ssl_cache_set_max_entries +#define ssl_cache_set_timeout mbedtls_ssl_cache_set_timeout +#define ssl_check_cert_usage mbedtls_ssl_check_cert_usage +#define ssl_ciphersuite_from_id mbedtls_ssl_ciphersuite_from_id +#define ssl_ciphersuite_from_string mbedtls_ssl_ciphersuite_from_string +#define ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t +#define ssl_ciphersuite_uses_ec mbedtls_ssl_ciphersuite_uses_ec +#define ssl_ciphersuite_uses_psk mbedtls_ssl_ciphersuite_uses_psk +#define ssl_close_notify mbedtls_ssl_close_notify +#define ssl_context mbedtls_ssl_context +#define ssl_cookie_check mbedtls_ssl_cookie_check +#define ssl_cookie_check_t mbedtls_ssl_cookie_check_t +#define ssl_cookie_ctx mbedtls_ssl_cookie_ctx +#define ssl_cookie_free mbedtls_ssl_cookie_free +#define ssl_cookie_init mbedtls_ssl_cookie_init +#define ssl_cookie_set_timeout mbedtls_ssl_cookie_set_timeout +#define ssl_cookie_setup mbedtls_ssl_cookie_setup +#define ssl_cookie_write mbedtls_ssl_cookie_write +#define ssl_cookie_write_t mbedtls_ssl_cookie_write_t +#define ssl_derive_keys mbedtls_ssl_derive_keys +#define ssl_dtls_replay_check mbedtls_ssl_dtls_replay_check +#define ssl_dtls_replay_update mbedtls_ssl_dtls_replay_update +#define ssl_fetch_input mbedtls_ssl_fetch_input +#define ssl_flight_item mbedtls_ssl_flight_item +#define ssl_flush_output mbedtls_ssl_flush_output +#define ssl_free mbedtls_ssl_free +#define ssl_get_alpn_protocol mbedtls_ssl_get_alpn_protocol +#define ssl_get_bytes_avail mbedtls_ssl_get_bytes_avail +#define ssl_get_ciphersuite mbedtls_ssl_get_ciphersuite +#define ssl_get_ciphersuite_id mbedtls_ssl_get_ciphersuite_id +#define ssl_get_ciphersuite_name mbedtls_ssl_get_ciphersuite_name +#define ssl_get_ciphersuite_sig_pk_alg mbedtls_ssl_get_ciphersuite_sig_pk_alg +#define ssl_get_peer_cert mbedtls_ssl_get_peer_cert +#define ssl_get_record_expansion mbedtls_ssl_get_record_expansion +#define ssl_get_session mbedtls_ssl_get_session +#define ssl_get_verify_result mbedtls_ssl_get_verify_result +#define ssl_get_version mbedtls_ssl_get_version +#define ssl_handshake mbedtls_ssl_handshake +#define ssl_handshake_client_step mbedtls_ssl_handshake_client_step +#define ssl_handshake_free mbedtls_ssl_handshake_free +#define ssl_handshake_params mbedtls_ssl_handshake_params +#define ssl_handshake_server_step mbedtls_ssl_handshake_server_step +#define ssl_handshake_step mbedtls_ssl_handshake_step +#define ssl_handshake_wrapup mbedtls_ssl_handshake_wrapup +#define ssl_hdr_len mbedtls_ssl_hdr_len +#define ssl_hs_hdr_len mbedtls_ssl_hs_hdr_len +#define ssl_hw_record_activate mbedtls_ssl_hw_record_activate +#define ssl_hw_record_finish mbedtls_ssl_hw_record_finish +#define ssl_hw_record_init mbedtls_ssl_hw_record_init +#define ssl_hw_record_read mbedtls_ssl_hw_record_read +#define ssl_hw_record_reset mbedtls_ssl_hw_record_reset +#define ssl_hw_record_write mbedtls_ssl_hw_record_write +#define ssl_init mbedtls_ssl_init +#define ssl_key_cert mbedtls_ssl_key_cert +#define ssl_legacy_renegotiation mbedtls_ssl_conf_legacy_renegotiation +#define ssl_list_ciphersuites mbedtls_ssl_list_ciphersuites +#define ssl_md_alg_from_hash mbedtls_ssl_md_alg_from_hash +#define ssl_optimize_checksum mbedtls_ssl_optimize_checksum +#define ssl_own_cert mbedtls_ssl_own_cert +#define ssl_own_key mbedtls_ssl_own_key +#define ssl_parse_certificate mbedtls_ssl_parse_certificate +#define ssl_parse_change_cipher_spec mbedtls_ssl_parse_change_cipher_spec +#define ssl_parse_finished mbedtls_ssl_parse_finished +#define ssl_pk_alg_from_sig mbedtls_ssl_pk_alg_from_sig +#define ssl_pkcs11_decrypt mbedtls_ssl_pkcs11_decrypt +#define ssl_pkcs11_key_len mbedtls_ssl_pkcs11_key_len +#define ssl_pkcs11_sign mbedtls_ssl_pkcs11_sign +#define ssl_psk_derive_premaster mbedtls_ssl_psk_derive_premaster +#define ssl_read mbedtls_ssl_read +#define ssl_read_record mbedtls_ssl_read_record +#define ssl_read_version mbedtls_ssl_read_version +#define ssl_recv_flight_completed mbedtls_ssl_recv_flight_completed +#define ssl_renegotiate mbedtls_ssl_renegotiate +#define ssl_resend mbedtls_ssl_resend +#define ssl_reset_checksum mbedtls_ssl_reset_checksum +#define ssl_send_alert_message mbedtls_ssl_send_alert_message +#define ssl_send_fatal_handshake_failure mbedtls_ssl_send_fatal_handshake_failure +#define ssl_send_flight_completed mbedtls_ssl_send_flight_completed +#define ssl_session mbedtls_ssl_session +#define ssl_session_free mbedtls_ssl_session_free +#define ssl_session_init mbedtls_ssl_session_init +#define ssl_session_reset mbedtls_ssl_session_reset +#define ssl_set_alpn_protocols mbedtls_ssl_conf_alpn_protocols +#define ssl_set_arc4_support mbedtls_ssl_conf_arc4_support +#define ssl_set_authmode mbedtls_ssl_conf_authmode +#define ssl_set_bio mbedtls_ssl_set_bio +#define ssl_set_ca_chain mbedtls_ssl_conf_ca_chain +#define ssl_set_cbc_record_splitting mbedtls_ssl_conf_cbc_record_splitting +#define ssl_set_ciphersuites mbedtls_ssl_conf_ciphersuites +#define ssl_set_ciphersuites_for_version mbedtls_ssl_conf_ciphersuites_for_version +#define ssl_set_client_transport_id mbedtls_ssl_set_client_transport_id +#define ssl_set_curves mbedtls_ssl_conf_curves +#define ssl_set_dbg mbedtls_ssl_conf_dbg +#define ssl_set_dh_param mbedtls_ssl_conf_dh_param +#define ssl_set_dh_param_ctx mbedtls_ssl_conf_dh_param_ctx +#define ssl_set_dtls_anti_replay mbedtls_ssl_conf_dtls_anti_replay +#define ssl_set_dtls_badmac_limit mbedtls_ssl_conf_dtls_badmac_limit +#define ssl_set_dtls_cookies mbedtls_ssl_conf_dtls_cookies +#define ssl_set_encrypt_then_mac mbedtls_ssl_conf_encrypt_then_mac +#define ssl_set_endpoint mbedtls_ssl_conf_endpoint +#define ssl_set_extended_master_secret mbedtls_ssl_conf_extended_master_secret +#define ssl_set_fallback mbedtls_ssl_conf_fallback +#define ssl_set_handshake_timeout mbedtls_ssl_conf_handshake_timeout +#define ssl_set_hostname mbedtls_ssl_set_hostname +#define ssl_set_max_frag_len mbedtls_ssl_conf_max_frag_len +#define ssl_set_max_version mbedtls_ssl_conf_max_version +#define ssl_set_min_version mbedtls_ssl_conf_min_version +#define ssl_set_own_cert mbedtls_ssl_conf_own_cert +#define ssl_set_psk mbedtls_ssl_conf_psk +#define ssl_set_psk_cb mbedtls_ssl_conf_psk_cb +#define ssl_set_renegotiation mbedtls_ssl_conf_renegotiation +#define ssl_set_renegotiation_enforced mbedtls_ssl_conf_renegotiation_enforced +#define ssl_set_renegotiation_period mbedtls_ssl_conf_renegotiation_period +#define ssl_set_rng mbedtls_ssl_conf_rng +#define ssl_set_session mbedtls_ssl_set_session +#define ssl_set_session_cache mbedtls_ssl_conf_session_cache +#define ssl_set_session_tickets mbedtls_ssl_conf_session_tickets +#define ssl_set_sni mbedtls_ssl_conf_sni +#define ssl_set_transport mbedtls_ssl_conf_transport +#define ssl_set_truncated_hmac mbedtls_ssl_conf_truncated_hmac +#define ssl_set_verify mbedtls_ssl_conf_verify +#define ssl_sig_from_pk mbedtls_ssl_sig_from_pk +#define ssl_states mbedtls_ssl_states +#define ssl_transform mbedtls_ssl_transform +#define ssl_transform_free mbedtls_ssl_transform_free +#define ssl_write mbedtls_ssl_write +#define ssl_write_certificate mbedtls_ssl_write_certificate +#define ssl_write_change_cipher_spec mbedtls_ssl_write_change_cipher_spec +#define ssl_write_finished mbedtls_ssl_write_finished +#define ssl_write_record mbedtls_ssl_write_record +#define ssl_write_version mbedtls_ssl_write_version +#define supported_ciphers mbedtls_cipher_supported +#define t_sint mbedtls_mpi_sint +#define t_udbl mbedtls_t_udbl +#define t_uint mbedtls_mpi_uint +#define test_ca_crt mbedtls_test_ca_crt +#define test_ca_crt_ec mbedtls_test_ca_crt_ec +#define test_ca_crt_rsa mbedtls_test_ca_crt_rsa +#define test_ca_key mbedtls_test_ca_key +#define test_ca_key_ec mbedtls_test_ca_key_ec +#define test_ca_key_rsa mbedtls_test_ca_key_rsa +#define test_ca_list mbedtls_test_cas_pem +#define test_ca_pwd mbedtls_test_ca_pwd +#define test_ca_pwd_ec mbedtls_test_ca_pwd_ec +#define test_ca_pwd_rsa mbedtls_test_ca_pwd_rsa +#define test_cli_crt mbedtls_test_cli_crt +#define test_cli_crt_ec mbedtls_test_cli_crt_ec +#define test_cli_crt_rsa mbedtls_test_cli_crt_rsa +#define test_cli_key mbedtls_test_cli_key +#define test_cli_key_ec mbedtls_test_cli_key_ec +#define test_cli_key_rsa mbedtls_test_cli_key_rsa +#define test_srv_crt mbedtls_test_srv_crt +#define test_srv_crt_ec mbedtls_test_srv_crt_ec +#define test_srv_crt_rsa mbedtls_test_srv_crt_rsa +#define test_srv_key mbedtls_test_srv_key +#define test_srv_key_ec mbedtls_test_srv_key_ec +#define test_srv_key_rsa mbedtls_test_srv_key_rsa +#define threading_mutex_t mbedtls_threading_mutex_t +#define threading_set_alt mbedtls_threading_set_alt +#define timing_self_test mbedtls_timing_self_test +#define version_check_feature mbedtls_version_check_feature +#define version_get_number mbedtls_version_get_number +#define version_get_string mbedtls_version_get_string +#define version_get_string_full mbedtls_version_get_string_full +#define x509_bitstring mbedtls_x509_bitstring +#define x509_buf mbedtls_x509_buf +#define x509_crl mbedtls_x509_crl +#define x509_crl_entry mbedtls_x509_crl_entry +#define x509_crl_free mbedtls_x509_crl_free +#define x509_crl_info mbedtls_x509_crl_info +#define x509_crl_init mbedtls_x509_crl_init +#define x509_crl_parse mbedtls_x509_crl_parse +#define x509_crl_parse_der mbedtls_x509_crl_parse_der +#define x509_crl_parse_file mbedtls_x509_crl_parse_file +#define x509_crt mbedtls_x509_crt +#define x509_crt_check_extended_key_usage mbedtls_x509_crt_check_extended_key_usage +#define x509_crt_check_key_usage mbedtls_x509_crt_check_key_usage +#define x509_crt_free mbedtls_x509_crt_free +#define x509_crt_info mbedtls_x509_crt_info +#define x509_crt_init mbedtls_x509_crt_init +#define x509_crt_parse mbedtls_x509_crt_parse +#define x509_crt_parse_der mbedtls_x509_crt_parse_der +#define x509_crt_parse_file mbedtls_x509_crt_parse_file +#define x509_crt_parse_path mbedtls_x509_crt_parse_path +#define x509_crt_revoked mbedtls_x509_crt_is_revoked +#define x509_crt_verify mbedtls_x509_crt_verify +#define x509_csr mbedtls_x509_csr +#define x509_csr_free mbedtls_x509_csr_free +#define x509_csr_info mbedtls_x509_csr_info +#define x509_csr_init mbedtls_x509_csr_init +#define x509_csr_parse mbedtls_x509_csr_parse +#define x509_csr_parse_der mbedtls_x509_csr_parse_der +#define x509_csr_parse_file mbedtls_x509_csr_parse_file +#define x509_dn_gets mbedtls_x509_dn_gets +#define x509_get_alg mbedtls_x509_get_alg +#define x509_get_alg_null mbedtls_x509_get_alg_null +#define x509_get_ext mbedtls_x509_get_ext +#define x509_get_name mbedtls_x509_get_name +#define x509_get_rsassa_pss_params mbedtls_x509_get_rsassa_pss_params +#define x509_get_serial mbedtls_x509_get_serial +#define x509_get_sig mbedtls_x509_get_sig +#define x509_get_sig_alg mbedtls_x509_get_sig_alg +#define x509_get_time mbedtls_x509_get_time +#define x509_key_size_helper mbedtls_x509_key_size_helper +#define x509_name mbedtls_x509_name +#define x509_self_test mbedtls_x509_self_test +#define x509_sequence mbedtls_x509_sequence +#define x509_serial_gets mbedtls_x509_serial_gets +#define x509_set_extension mbedtls_x509_set_extension +#define x509_sig_alg_gets mbedtls_x509_sig_alg_gets +#define x509_string_to_names mbedtls_x509_string_to_names +#define x509_time mbedtls_x509_time +#define x509_time_expired mbedtls_x509_time_is_past +#define x509_time_future mbedtls_x509_time_is_future +#define x509_write_extensions mbedtls_x509_write_extensions +#define x509_write_names mbedtls_x509_write_names +#define x509_write_sig mbedtls_x509_write_sig +#define x509write_cert mbedtls_x509write_cert +#define x509write_crt_der mbedtls_x509write_crt_der +#define x509write_crt_free mbedtls_x509write_crt_free +#define x509write_crt_init mbedtls_x509write_crt_init +#define x509write_crt_pem mbedtls_x509write_crt_pem +#define x509write_crt_set_authority_key_identifier \ + mbedtls_x509write_crt_set_authority_key_identifier +#define x509write_crt_set_basic_constraints mbedtls_x509write_crt_set_basic_constraints +#define x509write_crt_set_extension mbedtls_x509write_crt_set_extension +#define x509write_crt_set_issuer_key mbedtls_x509write_crt_set_issuer_key +#define x509write_crt_set_issuer_name mbedtls_x509write_crt_set_issuer_name +#define x509write_crt_set_key_usage mbedtls_x509write_crt_set_key_usage +#define x509write_crt_set_md_alg mbedtls_x509write_crt_set_md_alg +#define x509write_crt_set_ns_cert_type mbedtls_x509write_crt_set_ns_cert_type +#define x509write_crt_set_serial mbedtls_x509write_crt_set_serial +#define x509write_crt_set_subject_key mbedtls_x509write_crt_set_subject_key +#define x509write_crt_set_subject_key_identifier mbedtls_x509write_crt_set_subject_key_identifier +#define x509write_crt_set_subject_name mbedtls_x509write_crt_set_subject_name +#define x509write_crt_set_validity mbedtls_x509write_crt_set_validity +#define x509write_crt_set_version mbedtls_x509write_crt_set_version +#define x509write_csr mbedtls_x509write_csr +#define x509write_csr_der mbedtls_x509write_csr_der +#define x509write_csr_free mbedtls_x509write_csr_free +#define x509write_csr_init mbedtls_x509write_csr_init +#define x509write_csr_pem mbedtls_x509write_csr_pem +#define x509write_csr_set_extension mbedtls_x509write_csr_set_extension +#define x509write_csr_set_key mbedtls_x509write_csr_set_key +#define x509write_csr_set_key_usage mbedtls_x509write_csr_set_key_usage +#define x509write_csr_set_md_alg mbedtls_x509write_csr_set_md_alg +#define x509write_csr_set_ns_cert_type mbedtls_x509write_csr_set_ns_cert_type +#define x509write_csr_set_subject_name mbedtls_x509write_csr_set_subject_name +#define xtea_context mbedtls_xtea_context +#define xtea_crypt_cbc mbedtls_xtea_crypt_cbc +#define xtea_crypt_ecb mbedtls_xtea_crypt_ecb +#define xtea_free mbedtls_xtea_free +#define xtea_init mbedtls_xtea_init +#define xtea_self_test mbedtls_xtea_self_test +#define xtea_setup mbedtls_xtea_setup + +#endif /* compat-1.3.h */ +#endif /* MBEDTLS_DEPRECATED_REMOVED */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/config.h b/ext/opcua_client/mbedtls/include/mbedtls/config.h new file mode 100644 index 0000000..a67eb60 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/config.h @@ -0,0 +1,4319 @@ +/** + * \file config.h + * + * \brief Configuration options (set of defines) + * + * This set of compile-time options may be used to enable + * or disable features selectively, and reduce the global + * memory footprint. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_CONFIG_H +#define MBEDTLS_CONFIG_H + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif + +/** + * \name SECTION: System support + * + * This section sets system specific settings. + * \{ + */ + +/** + * \def MBEDTLS_HAVE_ASM + * + * The compiler has support for asm(). + * + * Requires support for asm() in compiler. + * + * Used in: + * library/aria.c + * library/timing.c + * include/mbedtls/bn_mul.h + * + * Required by: + * MBEDTLS_AESNI_C (on some platforms) + * MBEDTLS_PADLOCK_C + * + * Comment to disable the use of assembly code. + */ +#define MBEDTLS_HAVE_ASM + +/** + * \def MBEDTLS_NO_UDBL_DIVISION + * + * The platform lacks support for double-width integer division (64-bit + * division on a 32-bit platform, 128-bit division on a 64-bit platform). + * + * Used in: + * include/mbedtls/bignum.h + * library/bignum.c + * + * The bignum code uses double-width division to speed up some operations. + * Double-width division is often implemented in software that needs to + * be linked with the program. The presence of a double-width integer + * type is usually detected automatically through preprocessor macros, + * but the automatic detection cannot know whether the code needs to + * and can be linked with an implementation of division for that type. + * By default division is assumed to be usable if the type is present. + * Uncomment this option to prevent the use of double-width division. + * + * Note that division for the native integer type is always required. + * Furthermore, a 64-bit type is always required even on a 32-bit + * platform, but it need not support multiplication or division. In some + * cases it is also desirable to disable some double-width operations. For + * example, if double-width division is implemented in software, disabling + * it can reduce code size in some embedded targets. + */ +//#define MBEDTLS_NO_UDBL_DIVISION + +/** + * \def MBEDTLS_NO_64BIT_MULTIPLICATION + * + * The platform lacks support for 32x32 -> 64-bit multiplication. + * + * Used in: + * library/poly1305.c + * + * Some parts of the library may use multiplication of two unsigned 32-bit + * operands with a 64-bit result in order to speed up computations. On some + * platforms, this is not available in hardware and has to be implemented in + * software, usually in a library provided by the toolchain. + * + * Sometimes it is not desirable to have to link to that library. This option + * removes the dependency of that library on platforms that lack a hardware + * 64-bit multiplier by embedding a software implementation in Mbed TLS. + * + * Note that depending on the compiler, this may decrease performance compared + * to using the library function provided by the toolchain. + */ +//#define MBEDTLS_NO_64BIT_MULTIPLICATION + +/** + * \def MBEDTLS_HAVE_SSE2 + * + * CPU supports SSE2 instruction set. + * + * Uncomment if the CPU supports SSE2 (IA-32 specific). + */ +//#define MBEDTLS_HAVE_SSE2 + +/** + * \def MBEDTLS_HAVE_TIME + * + * System has time.h and time(). + * The time does not need to be correct, only time differences are used, + * by contrast with MBEDTLS_HAVE_TIME_DATE + * + * Defining MBEDTLS_HAVE_TIME allows you to specify MBEDTLS_PLATFORM_TIME_ALT, + * MBEDTLS_PLATFORM_TIME_MACRO, MBEDTLS_PLATFORM_TIME_TYPE_MACRO and + * MBEDTLS_PLATFORM_STD_TIME. + * + * Comment if your system does not support time functions. + * + * \note If MBEDTLS_TIMING_C is set - to enable the semi-portable timing + * interface - timing.c will include time.h on suitable platforms + * regardless of the setting of MBEDTLS_HAVE_TIME, unless + * MBEDTLS_TIMING_ALT is used. See timing.c for more information. + */ +#define MBEDTLS_HAVE_TIME + +/** + * \def MBEDTLS_HAVE_TIME_DATE + * + * System has time.h, time(), and an implementation for + * mbedtls_platform_gmtime_r() (see below). + * The time needs to be correct (not necessarily very accurate, but at least + * the date should be correct). This is used to verify the validity period of + * X.509 certificates. + * + * Comment if your system does not have a correct clock. + * + * \note mbedtls_platform_gmtime_r() is an abstraction in platform_util.h that + * behaves similarly to the gmtime_r() function from the C standard. Refer to + * the documentation for mbedtls_platform_gmtime_r() for more information. + * + * \note It is possible to configure an implementation for + * mbedtls_platform_gmtime_r() at compile-time by using the macro + * MBEDTLS_PLATFORM_GMTIME_R_ALT. + */ +#define MBEDTLS_HAVE_TIME_DATE + +/** + * \def MBEDTLS_PLATFORM_MEMORY + * + * Enable the memory allocation layer. + * + * By default Mbed TLS uses the system-provided calloc() and free(). + * This allows different allocators (self-implemented or provided) to be + * provided to the platform abstraction layer. + * + * Enabling #MBEDTLS_PLATFORM_MEMORY without the + * MBEDTLS_PLATFORM_{FREE,CALLOC}_MACROs will provide + * "mbedtls_platform_set_calloc_free()" allowing you to set an alternative calloc() and + * free() function pointer at runtime. + * + * Enabling #MBEDTLS_PLATFORM_MEMORY and specifying + * MBEDTLS_PLATFORM_{CALLOC,FREE}_MACROs will allow you to specify the + * alternate function at compile time. + * + * An overview of how the value of mbedtls_calloc is determined: + * + * - if !MBEDTLS_PLATFORM_MEMORY + * - mbedtls_calloc = calloc + * - if MBEDTLS_PLATFORM_MEMORY + * - if (MBEDTLS_PLATFORM_CALLOC_MACRO && MBEDTLS_PLATFORM_FREE_MACRO): + * - mbedtls_calloc = MBEDTLS_PLATFORM_CALLOC_MACRO + * - if !(MBEDTLS_PLATFORM_CALLOC_MACRO && MBEDTLS_PLATFORM_FREE_MACRO): + * - Dynamic setup via mbedtls_platform_set_calloc_free is now possible with a default value MBEDTLS_PLATFORM_STD_CALLOC. + * - How is MBEDTLS_PLATFORM_STD_CALLOC handled? + * - if MBEDTLS_PLATFORM_NO_STD_FUNCTIONS: + * - MBEDTLS_PLATFORM_STD_CALLOC is not set to anything; + * - MBEDTLS_PLATFORM_STD_MEM_HDR can be included if present; + * - if !MBEDTLS_PLATFORM_NO_STD_FUNCTIONS: + * - if MBEDTLS_PLATFORM_STD_CALLOC is present: + * - User-defined MBEDTLS_PLATFORM_STD_CALLOC is respected; + * - if !MBEDTLS_PLATFORM_STD_CALLOC: + * - MBEDTLS_PLATFORM_STD_CALLOC = calloc + * + * - At this point the presence of MBEDTLS_PLATFORM_STD_CALLOC is checked. + * - if !MBEDTLS_PLATFORM_STD_CALLOC + * - MBEDTLS_PLATFORM_STD_CALLOC = uninitialized_calloc + * + * - mbedtls_calloc = MBEDTLS_PLATFORM_STD_CALLOC. + * + * Defining MBEDTLS_PLATFORM_CALLOC_MACRO and #MBEDTLS_PLATFORM_STD_CALLOC at the same time is not possible. + * MBEDTLS_PLATFORM_CALLOC_MACRO and MBEDTLS_PLATFORM_FREE_MACRO must both be defined or undefined at the same time. + * #MBEDTLS_PLATFORM_STD_CALLOC and #MBEDTLS_PLATFORM_STD_FREE do not have to be defined at the same time, as, if they are used, + * dynamic setup of these functions is possible. See the tree above to see how are they handled in all cases. + * An uninitialized #MBEDTLS_PLATFORM_STD_CALLOC always fails, returning a null pointer. + * An uninitialized #MBEDTLS_PLATFORM_STD_FREE does not do anything. + * + * Requires: MBEDTLS_PLATFORM_C + * + * Enable this layer to allow use of alternative memory allocators. + */ +//#define MBEDTLS_PLATFORM_MEMORY + +/** + * \def MBEDTLS_PLATFORM_NO_STD_FUNCTIONS + * + * Do not assign standard functions in the platform layer (e.g. calloc() to + * MBEDTLS_PLATFORM_STD_CALLOC and printf() to MBEDTLS_PLATFORM_STD_PRINTF) + * + * This makes sure there are no linking errors on platforms that do not support + * these functions. You will HAVE to provide alternatives, either at runtime + * via the platform_set_xxx() functions or at compile time by setting + * the MBEDTLS_PLATFORM_STD_XXX defines, or enabling a + * MBEDTLS_PLATFORM_XXX_MACRO. + * + * Requires: MBEDTLS_PLATFORM_C + * + * Uncomment to prevent default assignment of standard functions in the + * platform layer. + */ +//#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS + +/** + * \def MBEDTLS_PLATFORM_EXIT_ALT + * + * MBEDTLS_PLATFORM_XXX_ALT: Uncomment a macro to let Mbed TLS support the + * function in the platform abstraction layer. + * + * Example: In case you uncomment MBEDTLS_PLATFORM_PRINTF_ALT, Mbed TLS will + * provide a function "mbedtls_platform_set_printf()" that allows you to set an + * alternative printf function pointer. + * + * All these define require MBEDTLS_PLATFORM_C to be defined! + * + * \note MBEDTLS_PLATFORM_SNPRINTF_ALT is required on Windows; + * it will be enabled automatically by check_config.h + * + * \warning MBEDTLS_PLATFORM_XXX_ALT cannot be defined at the same time as + * MBEDTLS_PLATFORM_XXX_MACRO! + * + * Requires: MBEDTLS_PLATFORM_TIME_ALT requires MBEDTLS_HAVE_TIME + * + * Uncomment a macro to enable alternate implementation of specific base + * platform function + */ +//#define MBEDTLS_PLATFORM_EXIT_ALT +//#define MBEDTLS_PLATFORM_TIME_ALT +//#define MBEDTLS_PLATFORM_FPRINTF_ALT +//#define MBEDTLS_PLATFORM_PRINTF_ALT +//#define MBEDTLS_PLATFORM_SNPRINTF_ALT +//#define MBEDTLS_PLATFORM_VSNPRINTF_ALT +//#define MBEDTLS_PLATFORM_NV_SEED_ALT +//#define MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT + +/** + * Uncomment the macro to let Mbed TLS use your alternate implementation of + * mbedtls_platform_gmtime_r(). This replaces the default implementation in + * platform_util.c. + * + * gmtime() is not a thread-safe function as defined in the C standard. The + * library will try to use safer implementations of this function, such as + * gmtime_r() when available. However, if Mbed TLS cannot identify the target + * system, the implementation of mbedtls_platform_gmtime_r() will default to + * using the standard gmtime(). In this case, calls from the library to + * gmtime() will be guarded by the global mutex mbedtls_threading_gmtime_mutex + * if MBEDTLS_THREADING_C is enabled. We recommend that calls from outside the + * library are also guarded with this mutex to avoid race conditions. However, + * if the macro MBEDTLS_PLATFORM_GMTIME_R_ALT is defined, Mbed TLS will + * unconditionally use the implementation for mbedtls_platform_gmtime_r() + * supplied at compile time. + */ +//#define MBEDTLS_PLATFORM_GMTIME_R_ALT + +/** + * Uncomment the macro to let Mbed TLS use your alternate implementation of + * mbedtls_platform_zeroize(). This replaces the default implementation in + * platform_util.c. + * + * mbedtls_platform_zeroize() is a widely used function across the library to + * zero a block of memory. The implementation is expected to be secure in the + * sense that it has been written to prevent the compiler from removing calls + * to mbedtls_platform_zeroize() as part of redundant code elimination + * optimizations. However, it is difficult to guarantee that calls to + * mbedtls_platform_zeroize() will not be optimized by the compiler as older + * versions of the C language standards do not provide a secure implementation + * of memset(). Therefore, MBEDTLS_PLATFORM_ZEROIZE_ALT enables users to + * configure their own implementation of mbedtls_platform_zeroize(), for + * example by using directives specific to their compiler, features from newer + * C standards (e.g using memset_s() in C11) or calling a secure memset() from + * their system (e.g explicit_bzero() in BSD). + */ +//#define MBEDTLS_PLATFORM_ZEROIZE_ALT + +/** + * \def MBEDTLS_DEPRECATED_WARNING + * + * Mark deprecated functions and features so that they generate a warning if + * used. Functionality deprecated in one version will usually be removed in the + * next version. You can enable this to help you prepare the transition to a + * new major version by making sure your code is not using this functionality. + * + * This only works with GCC and Clang. With other compilers, you may want to + * use MBEDTLS_DEPRECATED_REMOVED + * + * Uncomment to get warnings on using deprecated functions and features. + */ +//#define MBEDTLS_DEPRECATED_WARNING + +/** + * \def MBEDTLS_DEPRECATED_REMOVED + * + * Remove deprecated functions and features so that they generate an error if + * used. Functionality deprecated in one version will usually be removed in the + * next version. You can enable this to help you prepare the transition to a + * new major version by making sure your code is not using this functionality. + * + * Uncomment to get errors on using deprecated functions and features. + */ +//#define MBEDTLS_DEPRECATED_REMOVED + +/** + * \def MBEDTLS_CHECK_PARAMS + * + * This configuration option controls whether the library validates more of + * the parameters passed to it. + * + * When this flag is not defined, the library only attempts to validate an + * input parameter if: (1) they may come from the outside world (such as the + * network, the filesystem, etc.) or (2) not validating them could result in + * internal memory errors such as overflowing a buffer controlled by the + * library. On the other hand, it doesn't attempt to validate parameters whose + * values are fully controlled by the application (such as pointers). + * + * When this flag is defined, the library additionally attempts to validate + * parameters that are fully controlled by the application, and should always + * be valid if the application code is fully correct and trusted. + * + * For example, when a function accepts as input a pointer to a buffer that may + * contain untrusted data, and its documentation mentions that this pointer + * must not be NULL: + * - The pointer is checked to be non-NULL only if this option is enabled. + * - The content of the buffer is always validated. + * + * When this flag is defined, if a library function receives a parameter that + * is invalid: + * 1. The function will invoke the macro MBEDTLS_PARAM_FAILED(). + * 2. If MBEDTLS_PARAM_FAILED() did not terminate the program, the function + * will immediately return. If the function returns an Mbed TLS error code, + * the error code in this case is MBEDTLS_ERR_xxx_BAD_INPUT_DATA. + * + * When defining this flag, you also need to arrange a definition for + * MBEDTLS_PARAM_FAILED(). You can do this by any of the following methods: + * - By default, the library defines MBEDTLS_PARAM_FAILED() to call a + * function mbedtls_param_failed(), but the library does not define this + * function. If you do not make any other arrangements, you must provide + * the function mbedtls_param_failed() in your application. + * See `platform_util.h` for its prototype. + * - If you enable the macro #MBEDTLS_CHECK_PARAMS_ASSERT, then the + * library defines MBEDTLS_PARAM_FAILED(\c cond) to be `assert(cond)`. + * You can still supply an alternative definition of + * MBEDTLS_PARAM_FAILED(), which may call `assert`. + * - If you define a macro MBEDTLS_PARAM_FAILED() before including `config.h` + * or you uncomment the definition of MBEDTLS_PARAM_FAILED() in `config.h`, + * the library will call the macro that you defined and will not supply + * its own version. Note that if MBEDTLS_PARAM_FAILED() calls `assert`, + * you need to enable #MBEDTLS_CHECK_PARAMS_ASSERT so that library source + * files include ``. + * + * Uncomment to enable validation of application-controlled parameters. + */ +//#define MBEDTLS_CHECK_PARAMS + +/** + * \def MBEDTLS_CHECK_PARAMS_ASSERT + * + * Allow MBEDTLS_PARAM_FAILED() to call `assert`, and make it default to + * `assert`. This macro is only used if #MBEDTLS_CHECK_PARAMS is defined. + * + * If this macro is not defined, then MBEDTLS_PARAM_FAILED() defaults to + * calling a function mbedtls_param_failed(). See the documentation of + * #MBEDTLS_CHECK_PARAMS for details. + * + * Uncomment to allow MBEDTLS_PARAM_FAILED() to call `assert`. + */ +//#define MBEDTLS_CHECK_PARAMS_ASSERT + +/** \} name SECTION: System support */ + +/** + * \name SECTION: Mbed TLS feature support + * + * This section sets support for features that are or are not needed + * within the modules that are enabled. + * \{ + */ + +/** + * \def MBEDTLS_TIMING_ALT + * + * Uncomment to provide your own alternate implementation for mbedtls_timing_hardclock(), + * mbedtls_timing_get_timer(), mbedtls_set_alarm(), mbedtls_set/get_delay() + * + * Only works if you have MBEDTLS_TIMING_C enabled. + * + * You will need to provide a header "timing_alt.h" and an implementation at + * compile time. + */ +//#define MBEDTLS_TIMING_ALT + +/** + * \def MBEDTLS_AES_ALT + * + * MBEDTLS__MODULE_NAME__ALT: Uncomment a macro to let Mbed TLS use your + * alternate core implementation of a symmetric crypto, an arithmetic or hash + * module (e.g. platform specific assembly optimized implementations). Keep + * in mind that the function prototypes should remain the same. + * + * This replaces the whole module. If you only want to replace one of the + * functions, use one of the MBEDTLS__FUNCTION_NAME__ALT flags. + * + * Example: In case you uncomment MBEDTLS_AES_ALT, Mbed TLS will no longer + * provide the "struct mbedtls_aes_context" definition and omit the base + * function declarations and implementations. "aes_alt.h" will be included from + * "aes.h" to include the new function definitions. + * + * Uncomment a macro to enable alternate implementation of the corresponding + * module. + * + * \warning MD2, MD4, MD5, ARC4, DES and SHA-1 are considered weak and their + * use constitutes a security risk. If possible, we recommend + * avoiding dependencies on them, and considering stronger message + * digests and ciphers instead. + * + */ +//#define MBEDTLS_AES_ALT +//#define MBEDTLS_ARC4_ALT +//#define MBEDTLS_ARIA_ALT +//#define MBEDTLS_BLOWFISH_ALT +//#define MBEDTLS_CAMELLIA_ALT +//#define MBEDTLS_CCM_ALT +//#define MBEDTLS_CHACHA20_ALT +//#define MBEDTLS_CHACHAPOLY_ALT +//#define MBEDTLS_CMAC_ALT +//#define MBEDTLS_DES_ALT +//#define MBEDTLS_DHM_ALT +//#define MBEDTLS_ECJPAKE_ALT +//#define MBEDTLS_GCM_ALT +//#define MBEDTLS_NIST_KW_ALT +//#define MBEDTLS_MD2_ALT +//#define MBEDTLS_MD4_ALT +//#define MBEDTLS_MD5_ALT +//#define MBEDTLS_POLY1305_ALT +//#define MBEDTLS_RIPEMD160_ALT +//#define MBEDTLS_RSA_ALT +//#define MBEDTLS_SHA1_ALT +//#define MBEDTLS_SHA256_ALT +//#define MBEDTLS_SHA512_ALT +//#define MBEDTLS_XTEA_ALT + +/* + * When replacing the elliptic curve module, please consider, that it is + * implemented with two .c files: + * - ecp.c + * - ecp_curves.c + * You can replace them very much like all the other MBEDTLS__MODULE_NAME__ALT + * macros as described above. The only difference is that you have to make sure + * that you provide functionality for both .c files. + */ +//#define MBEDTLS_ECP_ALT + +/** + * \def MBEDTLS_MD2_PROCESS_ALT + * + * MBEDTLS__FUNCTION_NAME__ALT: Uncomment a macro to let Mbed TLS use you + * alternate core implementation of symmetric crypto or hash function. Keep in + * mind that function prototypes should remain the same. + * + * This replaces only one function. The header file from Mbed TLS is still + * used, in contrast to the MBEDTLS__MODULE_NAME__ALT flags. + * + * Example: In case you uncomment MBEDTLS_SHA256_PROCESS_ALT, Mbed TLS will + * no longer provide the mbedtls_sha1_process() function, but it will still provide + * the other function (using your mbedtls_sha1_process() function) and the definition + * of mbedtls_sha1_context, so your implementation of mbedtls_sha1_process must be compatible + * with this definition. + * + * \note Because of a signature change, the core AES encryption and decryption routines are + * currently named mbedtls_aes_internal_encrypt and mbedtls_aes_internal_decrypt, + * respectively. When setting up alternative implementations, these functions should + * be overridden, but the wrapper functions mbedtls_aes_decrypt and mbedtls_aes_encrypt + * must stay untouched. + * + * \note If you use the AES_xxx_ALT macros, then it is recommended to also set + * MBEDTLS_AES_ROM_TABLES in order to help the linker garbage-collect the AES + * tables. + * + * Uncomment a macro to enable alternate implementation of the corresponding + * function. + * + * \warning MD2, MD4, MD5, DES and SHA-1 are considered weak and their use + * constitutes a security risk. If possible, we recommend avoiding + * dependencies on them, and considering stronger message digests + * and ciphers instead. + * + * \warning If both MBEDTLS_ECDSA_SIGN_ALT and MBEDTLS_ECDSA_DETERMINISTIC are + * enabled, then the deterministic ECDH signature functions pass the + * the static HMAC-DRBG as RNG to mbedtls_ecdsa_sign(). Therefore + * alternative implementations should use the RNG only for generating + * the ephemeral key and nothing else. If this is not possible, then + * MBEDTLS_ECDSA_DETERMINISTIC should be disabled and an alternative + * implementation should be provided for mbedtls_ecdsa_sign_det_ext() + * (and for mbedtls_ecdsa_sign_det() too if backward compatibility is + * desirable). + * + */ +//#define MBEDTLS_MD2_PROCESS_ALT +//#define MBEDTLS_MD4_PROCESS_ALT +//#define MBEDTLS_MD5_PROCESS_ALT +//#define MBEDTLS_RIPEMD160_PROCESS_ALT +//#define MBEDTLS_SHA1_PROCESS_ALT +//#define MBEDTLS_SHA256_PROCESS_ALT +//#define MBEDTLS_SHA512_PROCESS_ALT +//#define MBEDTLS_DES_SETKEY_ALT +//#define MBEDTLS_DES_CRYPT_ECB_ALT +//#define MBEDTLS_DES3_CRYPT_ECB_ALT +//#define MBEDTLS_AES_SETKEY_ENC_ALT +//#define MBEDTLS_AES_SETKEY_DEC_ALT +//#define MBEDTLS_AES_ENCRYPT_ALT +//#define MBEDTLS_AES_DECRYPT_ALT +//#define MBEDTLS_ECDH_GEN_PUBLIC_ALT +//#define MBEDTLS_ECDH_COMPUTE_SHARED_ALT +//#define MBEDTLS_ECDSA_VERIFY_ALT +//#define MBEDTLS_ECDSA_SIGN_ALT +//#define MBEDTLS_ECDSA_GENKEY_ALT + +/** + * \def MBEDTLS_ECP_INTERNAL_ALT + * + * Expose a part of the internal interface of the Elliptic Curve Point module. + * + * MBEDTLS_ECP__FUNCTION_NAME__ALT: Uncomment a macro to let Mbed TLS use your + * alternative core implementation of elliptic curve arithmetic. Keep in mind + * that function prototypes should remain the same. + * + * This partially replaces one function. The header file from Mbed TLS is still + * used, in contrast to the MBEDTLS_ECP_ALT flag. The original implementation + * is still present and it is used for group structures not supported by the + * alternative. + * + * The original implementation can in addition be removed by setting the + * MBEDTLS_ECP_NO_FALLBACK option, in which case any function for which the + * corresponding MBEDTLS_ECP__FUNCTION_NAME__ALT macro is defined will not be + * able to fallback to curves not supported by the alternative implementation. + * + * Any of these options become available by defining MBEDTLS_ECP_INTERNAL_ALT + * and implementing the following functions: + * unsigned char mbedtls_internal_ecp_grp_capable( + * const mbedtls_ecp_group *grp ) + * int mbedtls_internal_ecp_init( const mbedtls_ecp_group *grp ) + * void mbedtls_internal_ecp_free( const mbedtls_ecp_group *grp ) + * The mbedtls_internal_ecp_grp_capable function should return 1 if the + * replacement functions implement arithmetic for the given group and 0 + * otherwise. + * The functions mbedtls_internal_ecp_init and mbedtls_internal_ecp_free are + * called before and after each point operation and provide an opportunity to + * implement optimized set up and tear down instructions. + * + * Example: In case you set MBEDTLS_ECP_INTERNAL_ALT and + * MBEDTLS_ECP_DOUBLE_JAC_ALT, Mbed TLS will still provide the ecp_double_jac() + * function, but will use your mbedtls_internal_ecp_double_jac() if the group + * for the operation is supported by your implementation (i.e. your + * mbedtls_internal_ecp_grp_capable() function returns 1 for this group). If the + * group is not supported by your implementation, then the original Mbed TLS + * implementation of ecp_double_jac() is used instead, unless this fallback + * behaviour is disabled by setting MBEDTLS_ECP_NO_FALLBACK (in which case + * ecp_double_jac() will return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE). + * + * The function prototypes and the definition of mbedtls_ecp_group and + * mbedtls_ecp_point will not change based on MBEDTLS_ECP_INTERNAL_ALT, so your + * implementation of mbedtls_internal_ecp__function_name__ must be compatible + * with their definitions. + * + * Uncomment a macro to enable alternate implementation of the corresponding + * function. + */ +/* Required for all the functions in this section */ +//#define MBEDTLS_ECP_INTERNAL_ALT +/* Turn off software fallback for curves not supported in hardware */ +//#define MBEDTLS_ECP_NO_FALLBACK +/* Support for Weierstrass curves with Jacobi representation */ +//#define MBEDTLS_ECP_RANDOMIZE_JAC_ALT +//#define MBEDTLS_ECP_ADD_MIXED_ALT +//#define MBEDTLS_ECP_DOUBLE_JAC_ALT +//#define MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT +//#define MBEDTLS_ECP_NORMALIZE_JAC_ALT +/* Support for curves with Montgomery arithmetic */ +//#define MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT +//#define MBEDTLS_ECP_RANDOMIZE_MXZ_ALT +//#define MBEDTLS_ECP_NORMALIZE_MXZ_ALT + +/** + * \def MBEDTLS_TEST_NULL_ENTROPY + * + * Enables testing and use of Mbed TLS without any configured entropy sources. + * This permits use of the library on platforms before an entropy source has + * been integrated (see for example the MBEDTLS_ENTROPY_HARDWARE_ALT or the + * MBEDTLS_ENTROPY_NV_SEED switches). + * + * WARNING! This switch MUST be disabled in production builds, and is suitable + * only for development. + * Enabling the switch negates any security provided by the library. + * + * Requires MBEDTLS_ENTROPY_C, MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES + * + */ +//#define MBEDTLS_TEST_NULL_ENTROPY + +/** + * \def MBEDTLS_ENTROPY_HARDWARE_ALT + * + * Uncomment this macro to let Mbed TLS use your own implementation of a + * hardware entropy collector. + * + * Your function must be called \c mbedtls_hardware_poll(), have the same + * prototype as declared in entropy_poll.h, and accept NULL as first argument. + * + * Uncomment to use your own hardware entropy collector. + */ +//#define MBEDTLS_ENTROPY_HARDWARE_ALT + +/** + * \def MBEDTLS_AES_ROM_TABLES + * + * Use precomputed AES tables stored in ROM. + * + * Uncomment this macro to use precomputed AES tables stored in ROM. + * Comment this macro to generate AES tables in RAM at runtime. + * + * Tradeoff: Using precomputed ROM tables reduces RAM usage by ~8kb + * (or ~2kb if \c MBEDTLS_AES_FEWER_TABLES is used) and reduces the + * initialization time before the first AES operation can be performed. + * It comes at the cost of additional ~8kb ROM use (resp. ~2kb if \c + * MBEDTLS_AES_FEWER_TABLES below is used), and potentially degraded + * performance if ROM access is slower than RAM access. + * + * This option is independent of \c MBEDTLS_AES_FEWER_TABLES. + * + */ +//#define MBEDTLS_AES_ROM_TABLES + +/** + * \def MBEDTLS_AES_FEWER_TABLES + * + * Use less ROM/RAM for AES tables. + * + * Uncommenting this macro omits 75% of the AES tables from + * ROM / RAM (depending on the value of \c MBEDTLS_AES_ROM_TABLES) + * by computing their values on the fly during operations + * (the tables are entry-wise rotations of one another). + * + * Tradeoff: Uncommenting this reduces the RAM / ROM footprint + * by ~6kb but at the cost of more arithmetic operations during + * runtime. Specifically, one has to compare 4 accesses within + * different tables to 4 accesses with additional arithmetic + * operations within the same table. The performance gain/loss + * depends on the system and memory details. + * + * This option is independent of \c MBEDTLS_AES_ROM_TABLES. + * + */ +//#define MBEDTLS_AES_FEWER_TABLES + +/** + * \def MBEDTLS_CAMELLIA_SMALL_MEMORY + * + * Use less ROM for the Camellia implementation (saves about 768 bytes). + * + * Uncomment this macro to use less memory for Camellia. + */ +//#define MBEDTLS_CAMELLIA_SMALL_MEMORY + +/** + * \def MBEDTLS_CHECK_RETURN_WARNING + * + * If this macro is defined, emit a compile-time warning if application code + * calls a function without checking its return value, but the return value + * should generally be checked in portable applications. + * + * This is only supported on platforms where #MBEDTLS_CHECK_RETURN is + * implemented. Otherwise this option has no effect. + * + * Uncomment to get warnings on using fallible functions without checking + * their return value. + * + * \note This feature is a work in progress. + * Warnings will be added to more functions in the future. + * + * \note A few functions are considered critical, and ignoring the return + * value of these functions will trigger a warning even if this + * macro is not defined. To completely disable return value check + * warnings, define #MBEDTLS_CHECK_RETURN with an empty expansion. + */ +//#define MBEDTLS_CHECK_RETURN_WARNING + +/** + * \def MBEDTLS_CIPHER_MODE_CBC + * + * Enable Cipher Block Chaining mode (CBC) for symmetric ciphers. + */ +#define MBEDTLS_CIPHER_MODE_CBC + +/** + * \def MBEDTLS_CIPHER_MODE_CFB + * + * Enable Cipher Feedback mode (CFB) for symmetric ciphers. + */ +#define MBEDTLS_CIPHER_MODE_CFB + +/** + * \def MBEDTLS_CIPHER_MODE_CTR + * + * Enable Counter Block Cipher mode (CTR) for symmetric ciphers. + */ +#define MBEDTLS_CIPHER_MODE_CTR + +/** + * \def MBEDTLS_CIPHER_MODE_OFB + * + * Enable Output Feedback mode (OFB) for symmetric ciphers. + */ +#define MBEDTLS_CIPHER_MODE_OFB + +/** + * \def MBEDTLS_CIPHER_MODE_XTS + * + * Enable Xor-encrypt-xor with ciphertext stealing mode (XTS) for AES. + */ +#define MBEDTLS_CIPHER_MODE_XTS + +/** + * \def MBEDTLS_CIPHER_NULL_CIPHER + * + * Enable NULL cipher. + * Warning: Only do so when you know what you are doing. This allows for + * encryption or channels without any security! + * + * Requires MBEDTLS_ENABLE_WEAK_CIPHERSUITES as well to enable + * the following ciphersuites: + * MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA + * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA + * MBEDTLS_TLS_RSA_WITH_NULL_SHA256 + * MBEDTLS_TLS_RSA_WITH_NULL_SHA + * MBEDTLS_TLS_RSA_WITH_NULL_MD5 + * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA + * MBEDTLS_TLS_PSK_WITH_NULL_SHA384 + * MBEDTLS_TLS_PSK_WITH_NULL_SHA256 + * MBEDTLS_TLS_PSK_WITH_NULL_SHA + * + * Uncomment this macro to enable the NULL cipher and ciphersuites + */ +//#define MBEDTLS_CIPHER_NULL_CIPHER + +/** + * \def MBEDTLS_CIPHER_PADDING_PKCS7 + * + * MBEDTLS_CIPHER_PADDING_XXX: Uncomment or comment macros to add support for + * specific padding modes in the cipher layer with cipher modes that support + * padding (e.g. CBC) + * + * If you disable all padding modes, only full blocks can be used with CBC. + * + * Enable padding modes in the cipher layer. + */ +#define MBEDTLS_CIPHER_PADDING_PKCS7 +#define MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS +#define MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN +#define MBEDTLS_CIPHER_PADDING_ZEROS + +/** \def MBEDTLS_CTR_DRBG_USE_128_BIT_KEY + * + * Uncomment this macro to use a 128-bit key in the CTR_DRBG module. + * By default, CTR_DRBG uses a 256-bit key. + */ +//#define MBEDTLS_CTR_DRBG_USE_128_BIT_KEY + +/** + * \def MBEDTLS_ENABLE_WEAK_CIPHERSUITES + * + * Enable weak ciphersuites in SSL / TLS. + * Warning: Only do so when you know what you are doing. This allows for + * channels with virtually no security at all! + * + * This enables the following ciphersuites: + * MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA + * + * Uncomment this macro to enable weak ciphersuites + * + * \warning DES is considered a weak cipher and its use constitutes a + * security risk. We recommend considering stronger ciphers instead. + */ +//#define MBEDTLS_ENABLE_WEAK_CIPHERSUITES + +/** + * \def MBEDTLS_REMOVE_ARC4_CIPHERSUITES + * + * Remove RC4 ciphersuites by default in SSL / TLS. + * This flag removes the ciphersuites based on RC4 from the default list as + * returned by mbedtls_ssl_list_ciphersuites(). However, it is still possible to + * enable (some of) them with mbedtls_ssl_conf_ciphersuites() by including them + * explicitly. + * + * Uncomment this macro to remove RC4 ciphersuites by default. + */ +#define MBEDTLS_REMOVE_ARC4_CIPHERSUITES + +/** + * \def MBEDTLS_REMOVE_3DES_CIPHERSUITES + * + * Remove 3DES ciphersuites by default in SSL / TLS. + * This flag removes the ciphersuites based on 3DES from the default list as + * returned by mbedtls_ssl_list_ciphersuites(). However, it is still possible + * to enable (some of) them with mbedtls_ssl_conf_ciphersuites() by including + * them explicitly. + * + * A man-in-the-browser attacker can recover authentication tokens sent through + * a TLS connection using a 3DES based cipher suite (see "On the Practical + * (In-)Security of 64-bit Block Ciphers" by Karthikeyan Bhargavan and Gaëtan + * Leurent, see https://sweet32.info/SWEET32_CCS16.pdf). If this attack falls + * in your threat model or you are unsure, then you should keep this option + * enabled to remove 3DES based cipher suites. + * + * Comment this macro to keep 3DES in the default ciphersuite list. + */ +#define MBEDTLS_REMOVE_3DES_CIPHERSUITES + +/** + * Enable the verified implementations of ECDH primitives from Project Everest + * (currently only Curve25519). This feature changes the layout of ECDH + * contexts and therefore is a compatibility break for applications that access + * fields of a mbedtls_ecdh_context structure directly. See also + * MBEDTLS_ECDH_LEGACY_CONTEXT in include/mbedtls/ecdh.h. + * + * The Everest code is provided under the Apache 2.0 license only; therefore enabling this + * option is not compatible with taking the library under the GPL v2.0-or-later license. + */ +//#define MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED + +/** + * \def MBEDTLS_ECP_DP_SECP192R1_ENABLED + * + * MBEDTLS_ECP_XXXX_ENABLED: Enables specific curves within the Elliptic Curve + * module. By default all supported curves are enabled. + * + * Comment macros to disable the curve and functions for it + */ +/* Short Weierstrass curves (supporting ECP, ECDH, ECDSA) */ +#define MBEDTLS_ECP_DP_SECP192R1_ENABLED +#define MBEDTLS_ECP_DP_SECP224R1_ENABLED +#define MBEDTLS_ECP_DP_SECP256R1_ENABLED +#define MBEDTLS_ECP_DP_SECP384R1_ENABLED +#define MBEDTLS_ECP_DP_SECP521R1_ENABLED +#define MBEDTLS_ECP_DP_SECP192K1_ENABLED +#define MBEDTLS_ECP_DP_SECP224K1_ENABLED +#define MBEDTLS_ECP_DP_SECP256K1_ENABLED +#define MBEDTLS_ECP_DP_BP256R1_ENABLED +#define MBEDTLS_ECP_DP_BP384R1_ENABLED +#define MBEDTLS_ECP_DP_BP512R1_ENABLED +/* Montgomery curves (supporting ECP) */ +#define MBEDTLS_ECP_DP_CURVE25519_ENABLED +#define MBEDTLS_ECP_DP_CURVE448_ENABLED + +/** + * \def MBEDTLS_ECP_NIST_OPTIM + * + * Enable specific 'modulo p' routines for each NIST prime. + * Depending on the prime and architecture, makes operations 4 to 8 times + * faster on the corresponding curve. + * + * Comment this macro to disable NIST curves optimisation. + */ +#define MBEDTLS_ECP_NIST_OPTIM + +/** + * \def MBEDTLS_ECP_NO_INTERNAL_RNG + * + * When this option is disabled, mbedtls_ecp_mul() will make use of an + * internal RNG when called with a NULL \c f_rng argument, in order to protect + * against some side-channel attacks. + * + * This protection introduces a dependency of the ECP module on one of the + * DRBG modules. For very constrained implementations that don't require this + * protection (for example, because you're only doing signature verification, + * so not manipulating any secret, or because local/physical side-channel + * attacks are outside your threat model), it might be desirable to get rid of + * that dependency. + * + * \warning Enabling this option makes some uses of ECP vulnerable to some + * side-channel attacks. Only enable it if you know that's not a problem for + * your use case. + * + * Uncomment this macro to disable some counter-measures in ECP. + */ +//#define MBEDTLS_ECP_NO_INTERNAL_RNG + +/** + * \def MBEDTLS_ECP_RESTARTABLE + * + * Enable "non-blocking" ECC operations that can return early and be resumed. + * + * This allows various functions to pause by returning + * #MBEDTLS_ERR_ECP_IN_PROGRESS (or, for functions in the SSL module, + * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) and then be called later again in + * order to further progress and eventually complete their operation. This is + * controlled through mbedtls_ecp_set_max_ops() which limits the maximum + * number of ECC operations a function may perform before pausing; see + * mbedtls_ecp_set_max_ops() for more information. + * + * This is useful in non-threaded environments if you want to avoid blocking + * for too long on ECC (and, hence, X.509 or SSL/TLS) operations. + * + * This option: + * - Adds xxx_restartable() variants of existing operations in the + * following modules, with corresponding restart context types: + * - ECP (for Short Weierstrass curves only): scalar multiplication (mul), + * linear combination (muladd); + * - ECDSA: signature generation & verification; + * - PK: signature generation & verification; + * - X509: certificate chain verification. + * - Adds mbedtls_ecdh_enable_restart() in the ECDH module. + * - Changes the behaviour of TLS 1.2 clients (not servers) when using the + * ECDHE-ECDSA key exchange (not other key exchanges) to make all ECC + * computations restartable: + * - ECDH operations from the key exchange, only for Short Weierstrass + * curves; + * - verification of the server's key exchange signature; + * - verification of the server's certificate chain; + * - generation of the client's signature if client authentication is used, + * with an ECC key/certificate. + * + * \note In the cases above, the usual SSL/TLS functions, such as + * mbedtls_ssl_handshake(), can now return + * MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS. + * + * \note This option only works with the default software implementation of + * elliptic curve functionality. It is incompatible with + * MBEDTLS_ECP_ALT, MBEDTLS_ECDH_XXX_ALT, MBEDTLS_ECDSA_XXX_ALT, + * MBEDTLS_ECDH_LEGACY_CONTEXT, and MBEDTLS_USE_PSA_CRYPTO. + * + * Requires: MBEDTLS_ECP_C + * + * Uncomment this macro to enable restartable ECC computations. + */ +//#define MBEDTLS_ECP_RESTARTABLE + +/** + * \def MBEDTLS_ECDH_LEGACY_CONTEXT + * + * Use a backward compatible ECDH context. + * + * Mbed TLS supports two formats for ECDH contexts (#mbedtls_ecdh_context + * defined in `ecdh.h`). For most applications, the choice of format makes + * no difference, since all library functions can work with either format, + * except that the new format is incompatible with MBEDTLS_ECP_RESTARTABLE. + + * The new format used when this option is disabled is smaller + * (56 bytes on a 32-bit platform). In future versions of the library, it + * will support alternative implementations of ECDH operations. + * The new format is incompatible with applications that access + * context fields directly and with restartable ECP operations. + * + * Define this macro if you enable MBEDTLS_ECP_RESTARTABLE or if you + * want to access ECDH context fields directly. Otherwise you should + * comment out this macro definition. + * + * This option has no effect if #MBEDTLS_ECDH_C is not enabled. + * + * \note This configuration option is experimental. Future versions of the + * library may modify the way the ECDH context layout is configured + * and may modify the layout of the new context type. + */ +#define MBEDTLS_ECDH_LEGACY_CONTEXT + +/** + * \def MBEDTLS_ECDSA_DETERMINISTIC + * + * Enable deterministic ECDSA (RFC 6979). + * Standard ECDSA is "fragile" in the sense that lack of entropy when signing + * may result in a compromise of the long-term signing key. This is avoided by + * the deterministic variant. + * + * Requires: MBEDTLS_HMAC_DRBG_C, MBEDTLS_ECDSA_C + * + * Comment this macro to disable deterministic ECDSA. + */ +#define MBEDTLS_ECDSA_DETERMINISTIC + +/** + * \def MBEDTLS_KEY_EXCHANGE_PSK_ENABLED + * + * Enable the PSK based ciphersuite modes in SSL / TLS. + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA + */ +#define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED + * + * Enable the DHE-PSK based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_DHM_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA + * + * \warning Using DHE constitutes a security risk as it + * is not possible to validate custom DH parameters. + * If possible, it is recommended users should consider + * preferring other methods of key exchange. + * See dhm.h for more details. + * + */ +#define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED + * + * Enable the ECDHE-PSK based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_ECDH_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA + */ +#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED + * + * Enable the RSA-PSK based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, + * MBEDTLS_X509_CRT_PARSE_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA + */ +#define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_RSA_ENABLED + * + * Enable the RSA-only based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, + * MBEDTLS_X509_CRT_PARSE_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 + */ +#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED + * + * Enable the DHE-RSA based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_DHM_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, + * MBEDTLS_X509_CRT_PARSE_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA + * + * \warning Using DHE constitutes a security risk as it + * is not possible to validate custom DH parameters. + * If possible, it is recommended users should consider + * preferring other methods of key exchange. + * See dhm.h for more details. + * + */ +#define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED + * + * Enable the ECDHE-RSA based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_ECDH_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, + * MBEDTLS_X509_CRT_PARSE_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA + */ +#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED + * + * Enable the ECDHE-ECDSA based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_ECDH_C, MBEDTLS_ECDSA_C, MBEDTLS_X509_CRT_PARSE_C, + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA + */ +#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED + * + * Enable the ECDH-ECDSA based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_ECDH_C, MBEDTLS_ECDSA_C, MBEDTLS_X509_CRT_PARSE_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 + */ +#define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED + * + * Enable the ECDH-RSA based ciphersuite modes in SSL / TLS. + * + * Requires: MBEDTLS_ECDH_C, MBEDTLS_RSA_C, MBEDTLS_X509_CRT_PARSE_C + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 + */ +#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED + +/** + * \def MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED + * + * Enable the ECJPAKE based ciphersuite modes in SSL / TLS. + * + * \warning This is currently experimental. EC J-PAKE support is based on the + * Thread v1.0.0 specification; incompatible changes to the specification + * might still happen. For this reason, this is disabled by default. + * + * Requires: MBEDTLS_ECJPAKE_C + * MBEDTLS_SHA256_C + * MBEDTLS_ECP_DP_SECP256R1_ENABLED + * + * This enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8 + */ +//#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED + +/** + * \def MBEDTLS_PK_PARSE_EC_EXTENDED + * + * Enhance support for reading EC keys using variants of SEC1 not allowed by + * RFC 5915 and RFC 5480. + * + * Currently this means parsing the SpecifiedECDomain choice of EC + * parameters (only known groups are supported, not arbitrary domains, to + * avoid validation issues). + * + * Disable if you only need to support RFC 5915 + 5480 key formats. + */ +#define MBEDTLS_PK_PARSE_EC_EXTENDED + +/** + * \def MBEDTLS_ERROR_STRERROR_DUMMY + * + * Enable a dummy error function to make use of mbedtls_strerror() in + * third party libraries easier when MBEDTLS_ERROR_C is disabled + * (no effect when MBEDTLS_ERROR_C is enabled). + * + * You can safely disable this if MBEDTLS_ERROR_C is enabled, or if you're + * not using mbedtls_strerror() or error_strerror() in your application. + * + * Disable if you run into name conflicts and want to really remove the + * mbedtls_strerror() + */ +#define MBEDTLS_ERROR_STRERROR_DUMMY + +/** + * \def MBEDTLS_GENPRIME + * + * Enable the prime-number generation code. + * + * Requires: MBEDTLS_BIGNUM_C + */ +#define MBEDTLS_GENPRIME + +/** + * \def MBEDTLS_FS_IO + * + * Enable functions that use the filesystem. + */ +#define MBEDTLS_FS_IO + +/** + * \def MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES + * + * Do not add default entropy sources. These are the platform specific, + * mbedtls_timing_hardclock and HAVEGE based poll functions. + * + * This is useful to have more control over the added entropy sources in an + * application. + * + * Uncomment this macro to prevent loading of default entropy functions. + */ +//#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES + +/** + * \def MBEDTLS_NO_PLATFORM_ENTROPY + * + * Do not use built-in platform entropy functions. + * This is useful if your platform does not support + * standards like the /dev/urandom or Windows CryptoAPI. + * + * Uncomment this macro to disable the built-in platform entropy functions. + */ +//#define MBEDTLS_NO_PLATFORM_ENTROPY + +/** + * \def MBEDTLS_ENTROPY_FORCE_SHA256 + * + * Force the entropy accumulator to use a SHA-256 accumulator instead of the + * default SHA-512 based one (if both are available). + * + * Requires: MBEDTLS_SHA256_C + * + * On 32-bit systems SHA-256 can be much faster than SHA-512. Use this option + * if you have performance concerns. + * + * This option is only useful if both MBEDTLS_SHA256_C and + * MBEDTLS_SHA512_C are defined. Otherwise the available hash module is used. + */ +//#define MBEDTLS_ENTROPY_FORCE_SHA256 + +/** + * \def MBEDTLS_ENTROPY_NV_SEED + * + * Enable the non-volatile (NV) seed file-based entropy source. + * (Also enables the NV seed read/write functions in the platform layer) + * + * This is crucial (if not required) on systems that do not have a + * cryptographic entropy source (in hardware or kernel) available. + * + * Requires: MBEDTLS_ENTROPY_C, MBEDTLS_PLATFORM_C + * + * \note The read/write functions that are used by the entropy source are + * determined in the platform layer, and can be modified at runtime and/or + * compile-time depending on the flags (MBEDTLS_PLATFORM_NV_SEED_*) used. + * + * \note If you use the default implementation functions that read a seedfile + * with regular fopen(), please make sure you make a seedfile with the + * proper name (defined in MBEDTLS_PLATFORM_STD_NV_SEED_FILE) and at + * least MBEDTLS_ENTROPY_BLOCK_SIZE bytes in size that can be read from + * and written to or you will get an entropy source error! The default + * implementation will only use the first MBEDTLS_ENTROPY_BLOCK_SIZE + * bytes from the file. + * + * \note The entropy collector will write to the seed file before entropy is + * given to an external source, to update it. + */ +//#define MBEDTLS_ENTROPY_NV_SEED + +/* MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER + * + * Enable key identifiers that encode a key owner identifier. + * + * The owner of a key is identified by a value of type ::mbedtls_key_owner_id_t + * which is currently hard-coded to be int32_t. + * + * Note that this option is meant for internal use only and may be removed + * without notice. It is incompatible with MBEDTLS_USE_PSA_CRYPTO. + */ +//#define MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER + +/** + * \def MBEDTLS_MEMORY_DEBUG + * + * Enable debugging of buffer allocator memory issues. Automatically prints + * (to stderr) all (fatal) messages on memory allocation issues. Enables + * function for 'debug output' of allocated memory. + * + * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C + * + * Uncomment this macro to let the buffer allocator print out error messages. + */ +//#define MBEDTLS_MEMORY_DEBUG + +/** + * \def MBEDTLS_MEMORY_BACKTRACE + * + * Include backtrace information with each allocated block. + * + * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C + * GLIBC-compatible backtrace() and backtrace_symbols() support + * + * Uncomment this macro to include backtrace information + */ +//#define MBEDTLS_MEMORY_BACKTRACE + +/** + * \def MBEDTLS_PK_RSA_ALT_SUPPORT + * + * Support external private RSA keys (eg from a HSM) in the PK layer. + * + * Comment this macro to disable support for external private RSA keys. + */ +#define MBEDTLS_PK_RSA_ALT_SUPPORT + +/** + * \def MBEDTLS_PKCS1_V15 + * + * Enable support for PKCS#1 v1.5 encoding. + * + * Requires: MBEDTLS_RSA_C + * + * This enables support for PKCS#1 v1.5 operations. + */ +#define MBEDTLS_PKCS1_V15 + +/** + * \def MBEDTLS_PKCS1_V21 + * + * Enable support for PKCS#1 v2.1 encoding. + * + * Requires: MBEDTLS_MD_C, MBEDTLS_RSA_C + * + * This enables support for RSAES-OAEP and RSASSA-PSS operations. + */ +#define MBEDTLS_PKCS1_V21 + +/** \def MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS + * + * Enable support for platform built-in keys. If you enable this feature, + * you must implement the function mbedtls_psa_platform_get_builtin_key(). + * See the documentation of that function for more information. + * + * Built-in keys are typically derived from a hardware unique key or + * stored in a secure element. + * + * Requires: MBEDTLS_PSA_CRYPTO_C. + * + * \warning This interface is experimental and may change or be removed + * without notice. + */ +//#define MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS + +/** \def MBEDTLS_PSA_CRYPTO_CLIENT + * + * Enable support for PSA crypto client. + * + * \note This option allows to include the code necessary for a PSA + * crypto client when the PSA crypto implementation is not included in + * the library (MBEDTLS_PSA_CRYPTO_C disabled). The code included is the + * code to set and get PSA key attributes. + * The development of PSA drivers partially relying on the library to + * fulfill the hardware gaps is another possible usage of this option. + * + * \warning This interface is experimental and may change or be removed + * without notice. + */ +//#define MBEDTLS_PSA_CRYPTO_CLIENT + +/** \def MBEDTLS_PSA_CRYPTO_DRIVERS + * + * Enable support for the experimental PSA crypto driver interface. + * + * Requires: MBEDTLS_PSA_CRYPTO_C + * + * \warning This interface is experimental and may change or be removed + * without notice. + */ +//#define MBEDTLS_PSA_CRYPTO_DRIVERS + +/** \def MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG + * + * Make the PSA Crypto module use an external random generator provided + * by a driver, instead of Mbed TLS's entropy and DRBG modules. + * + * \note This random generator must deliver random numbers with cryptographic + * quality and high performance. It must supply unpredictable numbers + * with a uniform distribution. The implementation of this function + * is responsible for ensuring that the random generator is seeded + * with sufficient entropy. If you have a hardware TRNG which is slow + * or delivers non-uniform output, declare it as an entropy source + * with mbedtls_entropy_add_source() instead of enabling this option. + * + * If you enable this option, you must configure the type + * ::mbedtls_psa_external_random_context_t in psa/crypto_platform.h + * and define a function called mbedtls_psa_external_get_random() + * with the following prototype: + * ``` + * psa_status_t mbedtls_psa_external_get_random( + * mbedtls_psa_external_random_context_t *context, + * uint8_t *output, size_t output_size, size_t *output_length); + * ); + * ``` + * The \c context value is initialized to 0 before the first call. + * The function must fill the \c output buffer with \c output_size bytes + * of random data and set \c *output_length to \c output_size. + * + * Requires: MBEDTLS_PSA_CRYPTO_C + * + * \warning If you enable this option, code that uses the PSA cryptography + * interface will not use any of the entropy sources set up for + * the entropy module, nor the NV seed that MBEDTLS_ENTROPY_NV_SEED + * enables. + * + * \note This option is experimental and may be removed without notice. + */ +//#define MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG + +/** + * \def MBEDTLS_PSA_CRYPTO_SPM + * + * When MBEDTLS_PSA_CRYPTO_SPM is defined, the code is built for SPM (Secure + * Partition Manager) integration which separates the code into two parts: a + * NSPE (Non-Secure Process Environment) and an SPE (Secure Process + * Environment). + * + * Module: library/psa_crypto.c + * Requires: MBEDTLS_PSA_CRYPTO_C + * + */ +//#define MBEDTLS_PSA_CRYPTO_SPM + +/** + * \def MBEDTLS_PSA_INJECT_ENTROPY + * + * Enable support for entropy injection at first boot. This feature is + * required on systems that do not have a built-in entropy source (TRNG). + * This feature is currently not supported on systems that have a built-in + * entropy source. + * + * Requires: MBEDTLS_PSA_CRYPTO_STORAGE_C, MBEDTLS_ENTROPY_NV_SEED + * + */ +//#define MBEDTLS_PSA_INJECT_ENTROPY + +/** + * \def MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS + * + * Assume all buffers passed to PSA functions are owned exclusively by the + * PSA function and are not stored in shared memory. + * + * This option may be enabled if all buffers passed to any PSA function reside + * in memory that is accessible only to the PSA function during its execution. + * + * This option MUST be disabled whenever buffer arguments are in memory shared + * with an untrusted party, for example where arguments to PSA calls are passed + * across a trust boundary. + * + * \note Enabling this option reduces memory usage and code size. + * + * \note Enabling this option causes overlap of input and output buffers + * not to be supported by PSA functions. + */ +//#define MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS + +/** + * \def MBEDTLS_RSA_NO_CRT + * + * Do not use the Chinese Remainder Theorem + * for the RSA private operation. + * + * Uncomment this macro to disable the use of CRT in RSA. + * + */ +//#define MBEDTLS_RSA_NO_CRT + +/** + * \def MBEDTLS_SELF_TEST + * + * Enable the checkup functions (*_self_test). + */ +#define MBEDTLS_SELF_TEST + +/** + * \def MBEDTLS_SHA256_SMALLER + * + * Enable an implementation of SHA-256 that has lower ROM footprint but also + * lower performance. + * + * The default implementation is meant to be a reasonable compromise between + * performance and size. This version optimizes more aggressively for size at + * the expense of performance. Eg on Cortex-M4 it reduces the size of + * mbedtls_sha256_process() from ~2KB to ~0.5KB for a performance hit of about + * 30%. + * + * Uncomment to enable the smaller implementation of SHA256. + */ +//#define MBEDTLS_SHA256_SMALLER + +/** + * \def MBEDTLS_SHA512_SMALLER + * + * Enable an implementation of SHA-512 that has lower ROM footprint but also + * lower performance. + * + * Uncomment to enable the smaller implementation of SHA512. + */ +//#define MBEDTLS_SHA512_SMALLER + +/** + * \def MBEDTLS_SHA512_NO_SHA384 + * + * Disable the SHA-384 option of the SHA-512 module. Use this to save some + * code size on devices that don't use SHA-384. + * + * Requires: MBEDTLS_SHA512_C + * + * Uncomment to disable SHA-384 + */ +//#define MBEDTLS_SHA512_NO_SHA384 + +/** + * \def MBEDTLS_SSL_ALL_ALERT_MESSAGES + * + * Enable sending of alert messages in case of encountered errors as per RFC. + * If you choose not to send the alert messages, Mbed TLS can still communicate + * with other servers, only debugging of failures is harder. + * + * The advantage of not sending alert messages, is that no information is given + * about reasons for failures thus preventing adversaries of gaining intel. + * + * Enable sending of all alert messages + */ +#define MBEDTLS_SSL_ALL_ALERT_MESSAGES + +/** + * \def MBEDTLS_SSL_RECORD_CHECKING + * + * Enable the function mbedtls_ssl_check_record() which can be used to check + * the validity and authenticity of an incoming record, to verify that it has + * not been seen before. These checks are performed without modifying the + * externally visible state of the SSL context. + * + * See mbedtls_ssl_check_record() for more information. + * + * Uncomment to enable support for record checking. + */ +#define MBEDTLS_SSL_RECORD_CHECKING + +/** + * \def MBEDTLS_SSL_DTLS_CONNECTION_ID + * + * Enable support for the DTLS Connection ID extension + * (version draft-ietf-tls-dtls-connection-id-05, + * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05) + * which allows to identify DTLS connections across changes + * in the underlying transport. + * + * Setting this option enables the SSL APIs `mbedtls_ssl_set_cid()`, + * `mbedtls_ssl_get_peer_cid()` and `mbedtls_ssl_conf_cid()`. + * See the corresponding documentation for more information. + * + * \warning The Connection ID extension is still in draft state. + * We make no stability promises for the availability + * or the shape of the API controlled by this option. + * + * The maximum lengths of outgoing and incoming CIDs can be configured + * through the options + * - MBEDTLS_SSL_CID_OUT_LEN_MAX + * - MBEDTLS_SSL_CID_IN_LEN_MAX. + * + * Requires: MBEDTLS_SSL_PROTO_DTLS + * + * Uncomment to enable the Connection ID extension. + */ +//#define MBEDTLS_SSL_DTLS_CONNECTION_ID + +/** + * \def MBEDTLS_SSL_ASYNC_PRIVATE + * + * Enable asynchronous external private key operations in SSL. This allows + * you to configure an SSL connection to call an external cryptographic + * module to perform private key operations instead of performing the + * operation inside the library. + * + */ +//#define MBEDTLS_SSL_ASYNC_PRIVATE + +/** \def MBEDTLS_SSL_CLI_ALLOW_WEAK_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME + * + * In TLS clients, when a client authenticates a server through its + * certificate, the client normally checks three things: + * - the certificate chain must be valid; + * - the chain must start from a trusted CA; + * - the certificate must cover the server name that is expected by the client. + * + * Omitting any of these checks is generally insecure, and can allow a + * malicious server to impersonate a legitimate server. + * + * The third check may be safely skipped in some unusual scenarios, + * such as networks where eavesdropping is a risk but not active attacks, + * or a private PKI where the client equally trusts all servers that are + * accredited by the root CA. + * + * You should call mbedtls_ssl_set_hostname() with the expected server name + * before starting a TLS handshake on a client (unless the client is + * set up to only use PSK-based authentication, which does not rely on the + * host name). This configuration option controls what happens if a TLS client + * is configured with the authentication mode #MBEDTLS_SSL_VERIFY_REQUIRED + * (default), certificate authentication is enabled and the client does not + * call mbedtls_ssl_set_hostname(): + * + * - If this option is unset (default), the connection attempt is aborted + * with the error #MBEDTLS_ERR_SSL_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME. + * - If this option is set, the TLS library does not check the server name + * that the certificate is valid for. This is the historical behavior + * of Mbed TLS, but may be insecure as explained above. + * + * Enable this option for strict backward compatibility if you have + * determined that it is secure in the scenario where you are using + * Mbed TLS. + * + * \deprecated This option exists only for backward compatibility and will + * be removed in the next major version of Mbed TLS. + * + */ +//#define MBEDTLS_SSL_CLI_ALLOW_WEAK_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME + +/** + * \def MBEDTLS_SSL_CONTEXT_SERIALIZATION + * + * Enable serialization of the TLS context structures, through use of the + * functions mbedtls_ssl_context_save() and mbedtls_ssl_context_load(). + * + * This pair of functions allows one side of a connection to serialize the + * context associated with the connection, then free or re-use that context + * while the serialized state is persisted elsewhere, and finally deserialize + * that state to a live context for resuming read/write operations on the + * connection. From a protocol perspective, the state of the connection is + * unaffected, in particular this is entirely transparent to the peer. + * + * Note: this is distinct from TLS session resumption, which is part of the + * protocol and fully visible by the peer. TLS session resumption enables + * establishing new connections associated to a saved session with shorter, + * lighter handshakes, while context serialization is a local optimization in + * handling a single, potentially long-lived connection. + * + * Enabling these APIs makes some SSL structures larger, as 64 extra bytes are + * saved after the handshake to allow for more efficient serialization, so if + * you don't need this feature you'll save RAM by disabling it. + * + * Requires: MBEDTLS_GCM_C or MBEDTLS_CCM_C or MBEDTLS_CHACHAPOLY_C + * + * Comment to disable the context serialization APIs. + */ +#define MBEDTLS_SSL_CONTEXT_SERIALIZATION + +/** + * \def MBEDTLS_SSL_DEBUG_ALL + * + * Enable the debug messages in SSL module for all issues. + * Debug messages have been disabled in some places to prevent timing + * attacks due to (unbalanced) debugging function calls. + * + * If you need all error reporting you should enable this during debugging, + * but remove this for production servers that should log as well. + * + * Uncomment this macro to report all debug messages on errors introducing + * a timing side-channel. + * + */ +//#define MBEDTLS_SSL_DEBUG_ALL + +/** \def MBEDTLS_SSL_ENCRYPT_THEN_MAC + * + * Enable support for Encrypt-then-MAC, RFC 7366. + * + * This allows peers that both support it to use a more robust protection for + * ciphersuites using CBC, providing deep resistance against timing attacks + * on the padding or underlying cipher. + * + * This only affects CBC ciphersuites, and is useless if none is defined. + * + * Requires: MBEDTLS_SSL_PROTO_TLS1 or + * MBEDTLS_SSL_PROTO_TLS1_1 or + * MBEDTLS_SSL_PROTO_TLS1_2 + * + * Comment this macro to disable support for Encrypt-then-MAC + */ +#define MBEDTLS_SSL_ENCRYPT_THEN_MAC + +/** \def MBEDTLS_SSL_EXTENDED_MASTER_SECRET + * + * Enable support for RFC 7627: Session Hash and Extended Master Secret + * Extension. + * + * This was introduced as "the proper fix" to the Triple Handshake family of + * attacks, but it is recommended to always use it (even if you disable + * renegotiation), since it actually fixes a more fundamental issue in the + * original SSL/TLS design, and has implications beyond Triple Handshake. + * + * Requires: MBEDTLS_SSL_PROTO_TLS1 or + * MBEDTLS_SSL_PROTO_TLS1_1 or + * MBEDTLS_SSL_PROTO_TLS1_2 + * + * Comment this macro to disable support for Extended Master Secret. + */ +#define MBEDTLS_SSL_EXTENDED_MASTER_SECRET + +/** + * \def MBEDTLS_SSL_FALLBACK_SCSV + * + * Enable support for RFC 7507: Fallback Signaling Cipher Suite Value (SCSV) + * for Preventing Protocol Downgrade Attacks. + * + * For servers, it is recommended to always enable this, unless you support + * only one version of TLS, or know for sure that none of your clients + * implements a fallback strategy. + * + * For clients, you only need this if you're using a fallback strategy, which + * is not recommended in the first place, unless you absolutely need it to + * interoperate with buggy (version-intolerant) servers. + * + * Comment this macro to disable support for FALLBACK_SCSV + */ +#define MBEDTLS_SSL_FALLBACK_SCSV + +/** + * \def MBEDTLS_SSL_KEEP_PEER_CERTIFICATE + * + * This option controls the availability of the API mbedtls_ssl_get_peer_cert() + * giving access to the peer's certificate after completion of the handshake. + * + * Unless you need mbedtls_ssl_peer_cert() in your application, it is + * recommended to disable this option for reduced RAM usage. + * + * \note If this option is disabled, mbedtls_ssl_get_peer_cert() is still + * defined, but always returns \c NULL. + * + * \note This option has no influence on the protection against the + * triple handshake attack. Even if it is disabled, Mbed TLS will + * still ensure that certificates do not change during renegotiation, + * for example by keeping a hash of the peer's certificate. + * + * Comment this macro to disable storing the peer's certificate + * after the handshake. + */ +#define MBEDTLS_SSL_KEEP_PEER_CERTIFICATE + +/** + * \def MBEDTLS_SSL_HW_RECORD_ACCEL + * + * Enable hooking functions in SSL module for hardware acceleration of + * individual records. + * + * \deprecated This option is deprecated and will be removed in a future + * version of Mbed TLS. + * + * Uncomment this macro to enable hooking functions. + */ +//#define MBEDTLS_SSL_HW_RECORD_ACCEL + +/** + * \def MBEDTLS_SSL_CBC_RECORD_SPLITTING + * + * Enable 1/n-1 record splitting for CBC mode in SSLv3 and TLS 1.0. + * + * This is a countermeasure to the BEAST attack, which also minimizes the risk + * of interoperability issues compared to sending 0-length records. + * + * Comment this macro to disable 1/n-1 record splitting. + */ +#define MBEDTLS_SSL_CBC_RECORD_SPLITTING + +/** + * \def MBEDTLS_SSL_RENEGOTIATION + * + * Enable support for TLS renegotiation. + * + * The two main uses of renegotiation are (1) refresh keys on long-lived + * connections and (2) client authentication after the initial handshake. + * If you don't need renegotiation, it's probably better to disable it, since + * it has been associated with security issues in the past and is easy to + * misuse/misunderstand. + * + * Comment this to disable support for renegotiation. + * + * \note Even if this option is disabled, both client and server are aware + * of the Renegotiation Indication Extension (RFC 5746) used to + * prevent the SSL renegotiation attack (see RFC 5746 Sect. 1). + * (See \c mbedtls_ssl_conf_legacy_renegotiation for the + * configuration of this extension). + * + */ +#define MBEDTLS_SSL_RENEGOTIATION + +/** + * \def MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO + * + * Enable support for receiving and parsing SSLv2 Client Hello messages for the + * SSL Server module (MBEDTLS_SSL_SRV_C). + * + * \deprecated This option is deprecated and will be removed in a future + * version of Mbed TLS. + * + * Uncomment this macro to enable support for SSLv2 Client Hello messages. + */ +//#define MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO + +/** + * \def MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE + * + * Pick the ciphersuite according to the client's preferences rather than ours + * in the SSL Server module (MBEDTLS_SSL_SRV_C). + * + * Uncomment this macro to respect client's ciphersuite order + */ +//#define MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE + +/** + * \def MBEDTLS_SSL_MAX_FRAGMENT_LENGTH + * + * Enable support for RFC 6066 max_fragment_length extension in SSL. + * + * Comment this macro to disable support for the max_fragment_length extension + */ +#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH + +/** + * \def MBEDTLS_SSL_PROTO_SSL3 + * + * Enable support for SSL 3.0. + * + * Requires: MBEDTLS_MD5_C + * MBEDTLS_SHA1_C + * + * \deprecated This option is deprecated and will be removed in a future + * version of Mbed TLS. + * + * Comment this macro to disable support for SSL 3.0 + */ +//#define MBEDTLS_SSL_PROTO_SSL3 + +/** + * \def MBEDTLS_SSL_PROTO_TLS1 + * + * Enable support for TLS 1.0. + * + * Requires: MBEDTLS_MD5_C + * MBEDTLS_SHA1_C + * + * Comment this macro to disable support for TLS 1.0 + */ +#define MBEDTLS_SSL_PROTO_TLS1 + +/** + * \def MBEDTLS_SSL_PROTO_TLS1_1 + * + * Enable support for TLS 1.1 (and DTLS 1.0 if DTLS is enabled). + * + * Requires: MBEDTLS_MD5_C + * MBEDTLS_SHA1_C + * + * Comment this macro to disable support for TLS 1.1 / DTLS 1.0 + */ +#define MBEDTLS_SSL_PROTO_TLS1_1 + +/** + * \def MBEDTLS_SSL_PROTO_TLS1_2 + * + * Enable support for TLS 1.2 (and DTLS 1.2 if DTLS is enabled). + * + * Requires: MBEDTLS_SHA1_C or MBEDTLS_SHA256_C or MBEDTLS_SHA512_C + * (Depends on ciphersuites) + * + * Comment this macro to disable support for TLS 1.2 / DTLS 1.2 + */ +#define MBEDTLS_SSL_PROTO_TLS1_2 + +/** + * \def MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL + * + * This macro is used to selectively enable experimental parts + * of the code that contribute to the ongoing development of + * the prototype TLS 1.3 and DTLS 1.3 implementation, and provide + * no other purpose. + * + * \warning TLS 1.3 and DTLS 1.3 aren't yet supported in Mbed TLS, + * and no feature exposed through this macro is part of the + * public API. In particular, features under the control + * of this macro are experimental and don't come with any + * stability guarantees. + * + * Uncomment this macro to enable experimental and partial + * functionality specific to TLS 1.3. + */ +//#define MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL + +/** + * \def MBEDTLS_SSL_PROTO_DTLS + * + * Enable support for DTLS (all available versions). + * + * Enable this and MBEDTLS_SSL_PROTO_TLS1_1 to enable DTLS 1.0, + * and/or this and MBEDTLS_SSL_PROTO_TLS1_2 to enable DTLS 1.2. + * + * Requires: MBEDTLS_SSL_PROTO_TLS1_1 + * or MBEDTLS_SSL_PROTO_TLS1_2 + * + * Comment this macro to disable support for DTLS + */ +#define MBEDTLS_SSL_PROTO_DTLS + +/** + * \def MBEDTLS_SSL_ALPN + * + * Enable support for RFC 7301 Application Layer Protocol Negotiation. + * + * Comment this macro to disable support for ALPN. + */ +#define MBEDTLS_SSL_ALPN + +/** + * \def MBEDTLS_SSL_DTLS_ANTI_REPLAY + * + * Enable support for the anti-replay mechanism in DTLS. + * + * Requires: MBEDTLS_SSL_TLS_C + * MBEDTLS_SSL_PROTO_DTLS + * + * \warning Disabling this is often a security risk! + * See mbedtls_ssl_conf_dtls_anti_replay() for details. + * + * Comment this to disable anti-replay in DTLS. + */ +#define MBEDTLS_SSL_DTLS_ANTI_REPLAY + +/** + * \def MBEDTLS_SSL_DTLS_HELLO_VERIFY + * + * Enable support for HelloVerifyRequest on DTLS servers. + * + * This feature is highly recommended to prevent DTLS servers being used as + * amplifiers in DoS attacks against other hosts. It should always be enabled + * unless you know for sure amplification cannot be a problem in the + * environment in which your server operates. + * + * \warning Disabling this can be a security risk! (see above) + * + * Requires: MBEDTLS_SSL_PROTO_DTLS + * + * Comment this to disable support for HelloVerifyRequest. + */ +#define MBEDTLS_SSL_DTLS_HELLO_VERIFY + +/** + * \def MBEDTLS_SSL_DTLS_SRTP + * + * Enable support for negotiation of DTLS-SRTP (RFC 5764) + * through the use_srtp extension. + * + * \note This feature provides the minimum functionality required + * to negotiate the use of DTLS-SRTP and to allow the derivation of + * the associated SRTP packet protection key material. + * In particular, the SRTP packet protection itself, as well as the + * demultiplexing of RTP and DTLS packets at the datagram layer + * (see Section 5 of RFC 5764), are not handled by this feature. + * Instead, after successful completion of a handshake negotiating + * the use of DTLS-SRTP, the extended key exporter API + * mbedtls_ssl_conf_export_keys_ext_cb() should be used to implement + * the key exporter described in Section 4.2 of RFC 5764 and RFC 5705 + * (this is implemented in the SSL example programs). + * The resulting key should then be passed to an SRTP stack. + * + * Setting this option enables the runtime API + * mbedtls_ssl_conf_dtls_srtp_protection_profiles() + * through which the supported DTLS-SRTP protection + * profiles can be configured. You must call this API at + * runtime if you wish to negotiate the use of DTLS-SRTP. + * + * Requires: MBEDTLS_SSL_PROTO_DTLS + * + * Uncomment this to enable support for use_srtp extension. + */ +//#define MBEDTLS_SSL_DTLS_SRTP + +/** + * \def MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE + * + * Enable server-side support for clients that reconnect from the same port. + * + * Some clients unexpectedly close the connection and try to reconnect using the + * same source port. This needs special support from the server to handle the + * new connection securely, as described in section 4.2.8 of RFC 6347. This + * flag enables that support. + * + * Requires: MBEDTLS_SSL_DTLS_HELLO_VERIFY + * + * Comment this to disable support for clients reusing the source port. + */ +#define MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE + +/** + * \def MBEDTLS_SSL_DTLS_BADMAC_LIMIT + * + * Enable support for a limit of records with bad MAC. + * + * See mbedtls_ssl_conf_dtls_badmac_limit(). + * + * Requires: MBEDTLS_SSL_PROTO_DTLS + */ +#define MBEDTLS_SSL_DTLS_BADMAC_LIMIT + +/** + * \def MBEDTLS_SSL_SESSION_TICKETS + * + * Enable support for RFC 5077 session tickets in SSL. + * Client-side, provides full support for session tickets (maintenance of a + * session store remains the responsibility of the application, though). + * Server-side, you also need to provide callbacks for writing and parsing + * tickets, including authenticated encryption and key management. Example + * callbacks are provided by MBEDTLS_SSL_TICKET_C. + * + * Comment this macro to disable support for SSL session tickets + */ +#define MBEDTLS_SSL_SESSION_TICKETS + +/** + * \def MBEDTLS_SSL_EXPORT_KEYS + * + * Enable support for exporting key block and master secret. + * This is required for certain users of TLS, e.g. EAP-TLS. + * + * Comment this macro to disable support for key export + */ +#define MBEDTLS_SSL_EXPORT_KEYS + +/** + * \def MBEDTLS_SSL_SERVER_NAME_INDICATION + * + * Enable support for RFC 6066 server name indication (SNI) in SSL. + * + * Requires: MBEDTLS_X509_CRT_PARSE_C + * + * Comment this macro to disable support for server name indication in SSL + */ +#define MBEDTLS_SSL_SERVER_NAME_INDICATION + +/** + * \def MBEDTLS_SSL_TRUNCATED_HMAC + * + * Enable support for RFC 6066 truncated HMAC in SSL. + * + * Comment this macro to disable support for truncated HMAC in SSL + */ +#define MBEDTLS_SSL_TRUNCATED_HMAC + +/** + * \def MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT + * + * Fallback to old (pre-2.7), non-conforming implementation of the truncated + * HMAC extension which also truncates the HMAC key. Note that this option is + * only meant for a transitory upgrade period and will be removed in a future + * version of the library. + * + * \warning The old implementation is non-compliant and has a security weakness + * (2^80 brute force attack on the HMAC key used for a single, + * uninterrupted connection). This should only be enabled temporarily + * when (1) the use of truncated HMAC is essential in order to save + * bandwidth, and (2) the peer is an Mbed TLS stack that doesn't use + * the fixed implementation yet (pre-2.7). + * + * \deprecated This option is deprecated and will be removed in a + * future version of Mbed TLS. + * + * Uncomment to fallback to old, non-compliant truncated HMAC implementation. + * + * Requires: MBEDTLS_SSL_TRUNCATED_HMAC + */ +//#define MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT + +/** + * \def MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH + * + * When this option is enabled, the SSL buffer will be resized automatically + * based on the negotiated maximum fragment length in each direction. + * + * Requires: MBEDTLS_SSL_MAX_FRAGMENT_LENGTH + */ +//#define MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH + +/** + * Allow SHA-1 in the default TLS configuration for TLS 1.2 handshake + * signature and ciphersuite selection. Without this build-time option, SHA-1 + * support must be activated explicitly through mbedtls_ssl_conf_sig_hashes. + * The use of SHA-1 in TLS <= 1.1 and in HMAC-SHA-1 is always allowed by + * default. At the time of writing, there is no practical attack on the use + * of SHA-1 in handshake signatures, hence this option is turned on by default + * to preserve compatibility with existing peers, but the general + * warning applies nonetheless: + * + * \warning SHA-1 is considered a weak message digest and its use constitutes + * a security risk. If possible, we recommend avoiding dependencies + * on it, and considering stronger message digests instead. + * + */ +//#define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE + +/** + * \def MBEDTLS_TEST_CONSTANT_FLOW_MEMSAN + * + * Enable testing of the constant-flow nature of some sensitive functions with + * clang's MemorySanitizer. This causes some existing tests to also test + * this non-functional property of the code under test. + * + * This setting requires compiling with clang -fsanitize=memory. The test + * suites can then be run normally. + * + * \warning This macro is only used for extended testing; it is not considered + * part of the library's API, so it may change or disappear at any time. + * + * Uncomment to enable testing of the constant-flow nature of selected code. + */ +//#define MBEDTLS_TEST_CONSTANT_FLOW_MEMSAN + +/** + * \def MBEDTLS_TEST_CONSTANT_FLOW_VALGRIND + * + * Enable testing of the constant-flow nature of some sensitive functions with + * valgrind's memcheck tool. This causes some existing tests to also test + * this non-functional property of the code under test. + * + * This setting requires valgrind headers for building, and is only useful for + * testing if the tests suites are run with valgrind's memcheck. This can be + * done for an individual test suite with 'valgrind ./test_suite_xxx', or when + * using CMake, this can be done for all test suites with 'make memcheck'. + * + * \warning This macro is only used for extended testing; it is not considered + * part of the library's API, so it may change or disappear at any time. + * + * Uncomment to enable testing of the constant-flow nature of selected code. + */ +//#define MBEDTLS_TEST_CONSTANT_FLOW_VALGRIND + +/** + * \def MBEDTLS_TEST_HOOKS + * + * Enable features for invasive testing such as introspection functions and + * hooks for fault injection. This enables additional unit tests. + * + * Merely enabling this feature should not change the behavior of the product. + * It only adds new code, and new branching points where the default behavior + * is the same as when this feature is disabled. + * However, this feature increases the attack surface: there is an added + * risk of vulnerabilities, and more gadgets that can make exploits easier. + * Therefore this feature must never be enabled in production. + * + * See `docs/architecture/testing/mbed-crypto-invasive-testing.md` for more + * information. + * + * Uncomment to enable invasive tests. + */ +//#define MBEDTLS_TEST_HOOKS + +/** + * \def MBEDTLS_THREADING_ALT + * + * Provide your own alternate threading implementation. + * + * Requires: MBEDTLS_THREADING_C + * + * Uncomment this to allow your own alternate threading implementation. + */ +//#define MBEDTLS_THREADING_ALT + +/** + * \def MBEDTLS_THREADING_PTHREAD + * + * Enable the pthread wrapper layer for the threading layer. + * + * Requires: MBEDTLS_THREADING_C + * + * Uncomment this to enable pthread mutexes. + */ +//#define MBEDTLS_THREADING_PTHREAD + +/** + * \def MBEDTLS_USE_PSA_CRYPTO + * + * Make the X.509 and TLS library use PSA for cryptographic operations, and + * enable new APIs for using keys handled by PSA Crypto. + * + * \note Development of this option is currently in progress, and parts of Mbed + * TLS's X.509 and TLS modules are not ported to PSA yet. However, these parts + * will still continue to work as usual, so enabling this option should not + * break backwards compatibility. + * + * \note See docs/use-psa-crypto.md for a complete description of what this + * option currently does, and of parts that are not affected by it so far. + * + * \warning This option enables new Mbed TLS APIs which are currently + * considered experimental and may change in incompatible ways at any time. + * That is, the APIs enabled by this option are not covered by the usual + * promises of API stability. + * + * \warning In multithreaded applications, you must also enable + * #MBEDTLS_THREADING_C, unless only one thread ever calls PSA functions + * (`psa_xxx()`), including indirect calls through SSL/TLS, X.509 or PK. + * + * Requires: MBEDTLS_PSA_CRYPTO_C. + * + * Uncomment this to enable internal use of PSA Crypto and new associated APIs. + */ +//#define MBEDTLS_USE_PSA_CRYPTO + +/** + * \def MBEDTLS_PSA_CRYPTO_CONFIG + * + * This setting allows support for cryptographic mechanisms through the PSA + * API to be configured separately from support through the mbedtls API. + * + * When this option is disabled, the PSA API exposes the cryptographic + * mechanisms that can be implemented on top of the `mbedtls_xxx` API + * configured with `MBEDTLS_XXX` symbols. + * + * When this option is enabled, the PSA API exposes the cryptographic + * mechanisms requested by the `PSA_WANT_XXX` symbols defined in + * include/psa/crypto_config.h. The corresponding `MBEDTLS_XXX` settings are + * automatically enabled if required (i.e. if no PSA driver provides the + * mechanism). You may still freely enable additional `MBEDTLS_XXX` symbols + * in config.h. + * + * If the symbol #MBEDTLS_PSA_CRYPTO_CONFIG_FILE is defined, it specifies + * an alternative header to include instead of include/psa/crypto_config.h. + * + * If you enable this option and write your own configuration file, you must + * include mbedtls/config_psa.h in your configuration file. The default + * provided mbedtls/config.h contains the necessary inclusion. + * + * This feature is still experimental and is not ready for production since + * it is not completed. + */ +//#define MBEDTLS_PSA_CRYPTO_CONFIG + +/** + * \def MBEDTLS_VERSION_FEATURES + * + * Allow run-time checking of compile-time enabled features. Thus allowing users + * to check at run-time if the library is for instance compiled with threading + * support via mbedtls_version_check_feature(). + * + * Requires: MBEDTLS_VERSION_C + * + * Comment this to disable run-time checking and save ROM space + */ +#define MBEDTLS_VERSION_FEATURES + +/** + * \def MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 + * + * If set, the X509 parser will not break-off when parsing an X509 certificate + * and encountering an extension in a v1 or v2 certificate. + * + * Uncomment to prevent an error. + */ +//#define MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 + +/** + * \def MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION + * + * If set, the X509 parser will not break-off when parsing an X509 certificate + * and encountering an unknown critical extension. + * + * \warning Depending on your PKI use, enabling this can be a security risk! + * + * Uncomment to prevent an error. + */ +//#define MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION + +/** + * \def MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK + * + * If set, this enables the X.509 API `mbedtls_x509_crt_verify_with_ca_cb()` + * and the SSL API `mbedtls_ssl_conf_ca_cb()` which allow users to configure + * the set of trusted certificates through a callback instead of a linked + * list. + * + * This is useful for example in environments where a large number of trusted + * certificates is present and storing them in a linked list isn't efficient + * enough, or when the set of trusted certificates changes frequently. + * + * See the documentation of `mbedtls_x509_crt_verify_with_ca_cb()` and + * `mbedtls_ssl_conf_ca_cb()` for more information. + * + * Uncomment to enable trusted certificate callbacks. + */ +//#define MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK + +/** + * \def MBEDTLS_X509_CHECK_KEY_USAGE + * + * Enable verification of the keyUsage extension (CA and leaf certificates). + * + * Disabling this avoids problems with mis-issued and/or misused + * (intermediate) CA and leaf certificates. + * + * \warning Depending on your PKI use, disabling this can be a security risk! + * + * Comment to skip keyUsage checking for both CA and leaf certificates. + */ +#define MBEDTLS_X509_CHECK_KEY_USAGE + +/** + * \def MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE + * + * Enable verification of the extendedKeyUsage extension (leaf certificates). + * + * Disabling this avoids problems with mis-issued and/or misused certificates. + * + * \warning Depending on your PKI use, disabling this can be a security risk! + * + * Comment to skip extendedKeyUsage checking for certificates. + */ +#define MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE + +/** + * \def MBEDTLS_X509_RSASSA_PSS_SUPPORT + * + * Enable parsing and verification of X.509 certificates, CRLs and CSRS + * signed with RSASSA-PSS (aka PKCS#1 v2.1). + * + * Comment this macro to disallow using RSASSA-PSS in certificates. + */ +#define MBEDTLS_X509_RSASSA_PSS_SUPPORT + +/** + * \def MBEDTLS_ZLIB_SUPPORT + * + * If set, the SSL/TLS module uses ZLIB to support compression and + * decompression of packet data. + * + * \warning TLS-level compression MAY REDUCE SECURITY! See for example the + * CRIME attack. Before enabling this option, you should examine with care if + * CRIME or similar exploits may be applicable to your use case. + * + * \note Currently compression can't be used with DTLS. + * + * \deprecated This feature is deprecated and will be removed + * in the next major revision of the library. + * + * Used in: library/ssl_tls.c + * library/ssl_cli.c + * library/ssl_srv.c + * + * This feature requires zlib library and headers to be present. + * + * Uncomment to enable use of ZLIB + */ +//#define MBEDTLS_ZLIB_SUPPORT +/** \} name SECTION: Mbed TLS feature support */ + +/** + * \name SECTION: Mbed TLS modules + * + * This section enables or disables entire modules in Mbed TLS + * \{ + */ + +/** + * \def MBEDTLS_AESNI_C + * + * Enable AES-NI support on x86-64 or x86-32. + * + * \note AESNI is only supported with certain compilers and target options: + * - Visual Studio 2013: supported. + * - GCC, x86-64, target not explicitly supporting AESNI: + * requires MBEDTLS_HAVE_ASM. + * - GCC, x86-32, target not explicitly supporting AESNI: + * not supported. + * - GCC, x86-64 or x86-32, target supporting AESNI: supported. + * For this assembly-less implementation, you must currently compile + * `library/aesni.c` and `library/aes.c` with machine options to enable + * SSE2 and AESNI instructions: `gcc -msse2 -maes -mpclmul` or + * `clang -maes -mpclmul`. + * - Non-x86 targets: this option is silently ignored. + * - Other compilers: this option is silently ignored. + * + * \note + * Above, "GCC" includes compatible compilers such as Clang. + * The limitations on target support are likely to be relaxed in the future. + * + * Module: library/aesni.c + * Caller: library/aes.c + * + * Requires: MBEDTLS_HAVE_ASM (on some platforms, see note) + * + * This modules adds support for the AES-NI instructions on x86. + */ +#define MBEDTLS_AESNI_C + +/** + * \def MBEDTLS_AES_C + * + * Enable the AES block cipher. + * + * Module: library/aes.c + * Caller: library/cipher.c + * library/pem.c + * library/ctr_drbg.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA + * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 + * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 + * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA + * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 + * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 + * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA + * + * PEM_PARSE uses AES for decrypting encrypted keys. + */ +#define MBEDTLS_AES_C + +/** + * \def MBEDTLS_ARC4_C + * + * Enable the ARCFOUR stream cipher. + * + * Module: library/arc4.c + * Caller: library/cipher.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA + * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA + * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 + * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA + * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA + * + * \warning ARC4 is considered a weak cipher and its use constitutes a + * security risk. If possible, we recommend avoiding dependencies on + * it, and considering stronger ciphers instead. + * + */ +#define MBEDTLS_ARC4_C + +/** + * \def MBEDTLS_ASN1_PARSE_C + * + * Enable the generic ASN1 parser. + * + * Module: library/asn1.c + * Caller: library/x509.c + * library/dhm.c + * library/pkcs12.c + * library/pkcs5.c + * library/pkparse.c + */ +#define MBEDTLS_ASN1_PARSE_C + +/** + * \def MBEDTLS_ASN1_WRITE_C + * + * Enable the generic ASN1 writer. + * + * Module: library/asn1write.c + * Caller: library/ecdsa.c + * library/pkwrite.c + * library/x509_create.c + * library/x509write_crt.c + * library/x509write_csr.c + */ +#define MBEDTLS_ASN1_WRITE_C + +/** + * \def MBEDTLS_BASE64_C + * + * Enable the Base64 module. + * + * Module: library/base64.c + * Caller: library/pem.c + * + * This module is required for PEM support (required by X.509). + */ +#define MBEDTLS_BASE64_C + +/** + * \def MBEDTLS_BIGNUM_C + * + * Enable the multi-precision integer library. + * + * Module: library/bignum.c + * Caller: library/dhm.c + * library/ecp.c + * library/ecdsa.c + * library/rsa.c + * library/rsa_internal.c + * library/ssl_tls.c + * + * This module is required for RSA, DHM and ECC (ECDH, ECDSA) support. + */ +#define MBEDTLS_BIGNUM_C + +/** + * \def MBEDTLS_BLOWFISH_C + * + * Enable the Blowfish block cipher. + * + * Module: library/blowfish.c + */ +#define MBEDTLS_BLOWFISH_C + +/** + * \def MBEDTLS_CAMELLIA_C + * + * Enable the Camellia block cipher. + * + * Module: library/camellia.c + * Caller: library/cipher.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 + * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 + */ +#define MBEDTLS_CAMELLIA_C + +/** + * \def MBEDTLS_ARIA_C + * + * Enable the ARIA block cipher. + * + * Module: library/aria.c + * Caller: library/cipher.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * + * MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 + * MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 + * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 + * MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 + * MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 + */ +//#define MBEDTLS_ARIA_C + +/** + * \def MBEDTLS_CCM_C + * + * Enable the Counter with CBC-MAC (CCM) mode for 128-bit block cipher. + * + * Module: library/ccm.c + * + * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C + * + * This module enables the AES-CCM ciphersuites, if other requisites are + * enabled as well. + */ +#define MBEDTLS_CCM_C + +/** + * \def MBEDTLS_CERTS_C + * + * Enable the test certificates. + * + * Module: library/certs.c + * Caller: + * + * This module is used for testing (ssl_client/server). + */ +#define MBEDTLS_CERTS_C + +/** + * \def MBEDTLS_CHACHA20_C + * + * Enable the ChaCha20 stream cipher. + * + * Module: library/chacha20.c + */ +#define MBEDTLS_CHACHA20_C + +/** + * \def MBEDTLS_CHACHAPOLY_C + * + * Enable the ChaCha20-Poly1305 AEAD algorithm. + * + * Module: library/chachapoly.c + * + * This module requires: MBEDTLS_CHACHA20_C, MBEDTLS_POLY1305_C + */ +#define MBEDTLS_CHACHAPOLY_C + +/** + * \def MBEDTLS_CIPHER_C + * + * Enable the generic cipher layer. + * + * Module: library/cipher.c + * Caller: library/ssl_tls.c + * + * Uncomment to enable generic cipher wrappers. + */ +#define MBEDTLS_CIPHER_C + +/** + * \def MBEDTLS_CMAC_C + * + * Enable the CMAC (Cipher-based Message Authentication Code) mode for block + * ciphers. + * + * \note When #MBEDTLS_CMAC_ALT is active, meaning that the underlying + * implementation of the CMAC algorithm is provided by an alternate + * implementation, that alternate implementation may opt to not support + * AES-192 or 3DES as underlying block ciphers for the CMAC operation. + * + * Module: library/cmac.c + * + * Requires: MBEDTLS_AES_C or MBEDTLS_DES_C + * + */ +//#define MBEDTLS_CMAC_C + +/** + * \def MBEDTLS_CTR_DRBG_C + * + * Enable the CTR_DRBG AES-based random generator. + * The CTR_DRBG generator uses AES-256 by default. + * To use AES-128 instead, enable \c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY above. + * + * \note To achieve a 256-bit security strength with CTR_DRBG, + * you must use AES-256 *and* use sufficient entropy. + * See ctr_drbg.h for more details. + * + * Module: library/ctr_drbg.c + * Caller: + * + * Requires: MBEDTLS_AES_C + * + * This module provides the CTR_DRBG AES random number generator. + */ +#define MBEDTLS_CTR_DRBG_C + +/** + * \def MBEDTLS_DEBUG_C + * + * Enable the debug functions. + * + * Module: library/debug.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * + * This module provides debugging functions. + */ +#define MBEDTLS_DEBUG_C + +/** + * \def MBEDTLS_DES_C + * + * Enable the DES block cipher. + * + * Module: library/des.c + * Caller: library/pem.c + * library/cipher.c + * + * This module enables the following ciphersuites (if other requisites are + * enabled as well): + * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA + * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA + * + * PEM_PARSE uses DES/3DES for decrypting encrypted keys. + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers instead. + */ +#define MBEDTLS_DES_C + +/** + * \def MBEDTLS_DHM_C + * + * Enable the Diffie-Hellman-Merkle module. + * + * Module: library/dhm.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * + * This module is used by the following key exchanges: + * DHE-RSA, DHE-PSK + * + * \warning Using DHE constitutes a security risk as it + * is not possible to validate custom DH parameters. + * If possible, it is recommended users should consider + * preferring other methods of key exchange. + * See dhm.h for more details. + * + */ +#define MBEDTLS_DHM_C + +/** + * \def MBEDTLS_ECDH_C + * + * Enable the elliptic curve Diffie-Hellman library. + * + * Module: library/ecdh.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * + * This module is used by the following key exchanges: + * ECDHE-ECDSA, ECDHE-RSA, DHE-PSK + * + * Requires: MBEDTLS_ECP_C + */ +#define MBEDTLS_ECDH_C + +/** + * \def MBEDTLS_ECDSA_C + * + * Enable the elliptic curve DSA library. + * + * Module: library/ecdsa.c + * Caller: + * + * This module is used by the following key exchanges: + * ECDHE-ECDSA + * + * Requires: MBEDTLS_ECP_C, MBEDTLS_ASN1_WRITE_C, MBEDTLS_ASN1_PARSE_C, + * and at least one MBEDTLS_ECP_DP_XXX_ENABLED for a + * short Weierstrass curve. + */ +#define MBEDTLS_ECDSA_C + +/** + * \def MBEDTLS_ECJPAKE_C + * + * Enable the elliptic curve J-PAKE library. + * + * \warning This is currently experimental. EC J-PAKE support is based on the + * Thread v1.0.0 specification; incompatible changes to the specification + * might still happen. For this reason, this is disabled by default. + * + * Module: library/ecjpake.c + * Caller: + * + * This module is used by the following key exchanges: + * ECJPAKE + * + * Requires: MBEDTLS_ECP_C, MBEDTLS_MD_C + */ +//#define MBEDTLS_ECJPAKE_C + +/** + * \def MBEDTLS_ECP_C + * + * Enable the elliptic curve over GF(p) library. + * + * Module: library/ecp.c + * Caller: library/ecdh.c + * library/ecdsa.c + * library/ecjpake.c + * + * Requires: MBEDTLS_BIGNUM_C and at least one MBEDTLS_ECP_DP_XXX_ENABLED + */ +#define MBEDTLS_ECP_C + +/** + * \def MBEDTLS_ENTROPY_C + * + * Enable the platform-specific entropy code. + * + * Module: library/entropy.c + * Caller: + * + * Requires: MBEDTLS_SHA512_C or MBEDTLS_SHA256_C + * + * This module provides a generic entropy pool + */ +#define MBEDTLS_ENTROPY_C + +/** + * \def MBEDTLS_ERROR_C + * + * Enable error code to error string conversion. + * + * Module: library/error.c + * Caller: + * + * This module enables mbedtls_strerror(). + */ +#define MBEDTLS_ERROR_C + +/** + * \def MBEDTLS_GCM_C + * + * Enable the Galois/Counter Mode (GCM). + * + * Module: library/gcm.c + * + * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C or MBEDTLS_ARIA_C + * + * This module enables the AES-GCM and CAMELLIA-GCM ciphersuites, if other + * requisites are enabled as well. + */ +#define MBEDTLS_GCM_C + +/** + * \def MBEDTLS_HAVEGE_C + * + * Enable the HAVEGE random generator. + * + * Warning: the HAVEGE random generator is not suitable for virtualized + * environments + * + * Warning: the HAVEGE random generator is dependent on timing and specific + * processor traits. It is therefore not advised to use HAVEGE as + * your applications primary random generator or primary entropy pool + * input. As a secondary input to your entropy pool, it IS able add + * the (limited) extra entropy it provides. + * + * Module: library/havege.c + * Caller: + * + * Requires: MBEDTLS_TIMING_C + * + * Uncomment to enable the HAVEGE random generator. + */ +//#define MBEDTLS_HAVEGE_C + +/** + * \def MBEDTLS_HKDF_C + * + * Enable the HKDF algorithm (RFC 5869). + * + * Module: library/hkdf.c + * Caller: + * + * Requires: MBEDTLS_MD_C + * + * This module adds support for the Hashed Message Authentication Code + * (HMAC)-based key derivation function (HKDF). + */ +#define MBEDTLS_HKDF_C + +/** + * \def MBEDTLS_HMAC_DRBG_C + * + * Enable the HMAC_DRBG random generator. + * + * Module: library/hmac_drbg.c + * Caller: + * + * Requires: MBEDTLS_MD_C + * + * Uncomment to enable the HMAC_DRBG random number generator. + */ +#define MBEDTLS_HMAC_DRBG_C + +/** + * \def MBEDTLS_NIST_KW_C + * + * Enable the Key Wrapping mode for 128-bit block ciphers, + * as defined in NIST SP 800-38F. Only KW and KWP modes + * are supported. At the moment, only AES is approved by NIST. + * + * Module: library/nist_kw.c + * + * Requires: MBEDTLS_AES_C and MBEDTLS_CIPHER_C + */ +//#define MBEDTLS_NIST_KW_C + +/** + * \def MBEDTLS_MD_C + * + * Enable the generic message digest layer. + * + * Module: library/md.c + * Caller: + * + * Uncomment to enable generic message digest wrappers. + */ +#define MBEDTLS_MD_C + +/** + * \def MBEDTLS_MD2_C + * + * Enable the MD2 hash algorithm. + * + * Module: library/md2.c + * Caller: + * + * Uncomment to enable support for (rare) MD2-signed X.509 certs. + * + * \warning MD2 is considered a weak message digest and its use constitutes a + * security risk. If possible, we recommend avoiding dependencies on + * it, and considering stronger message digests instead. + * + */ +//#define MBEDTLS_MD2_C + +/** + * \def MBEDTLS_MD4_C + * + * Enable the MD4 hash algorithm. + * + * Module: library/md4.c + * Caller: + * + * Uncomment to enable support for (rare) MD4-signed X.509 certs. + * + * \warning MD4 is considered a weak message digest and its use constitutes a + * security risk. If possible, we recommend avoiding dependencies on + * it, and considering stronger message digests instead. + * + */ +//#define MBEDTLS_MD4_C + +/** + * \def MBEDTLS_MD5_C + * + * Enable the MD5 hash algorithm. + * + * Module: library/md5.c + * Caller: library/md.c + * library/pem.c + * library/ssl_tls.c + * + * This module is required for SSL/TLS up to version 1.1, and for TLS 1.2 + * depending on the handshake parameters. Further, it is used for checking + * MD5-signed certificates, and for PBKDF1 when decrypting PEM-encoded + * encrypted keys. + * + * \warning MD5 is considered a weak message digest and its use constitutes a + * security risk. If possible, we recommend avoiding dependencies on + * it, and considering stronger message digests instead. + * + */ +#define MBEDTLS_MD5_C + +/** + * \def MBEDTLS_MEMORY_BUFFER_ALLOC_C + * + * Enable the buffer allocator implementation that makes use of a (stack) + * based buffer to 'allocate' dynamic memory. (replaces calloc() and free() + * calls) + * + * Module: library/memory_buffer_alloc.c + * + * Requires: MBEDTLS_PLATFORM_C + * MBEDTLS_PLATFORM_MEMORY (to use it within Mbed TLS) + * + * Enable this module to enable the buffer memory allocator. + */ +//#define MBEDTLS_MEMORY_BUFFER_ALLOC_C + +/** + * \def MBEDTLS_NET_C + * + * Enable the TCP and UDP over IPv6/IPv4 networking routines. + * + * \note This module only works on POSIX/Unix (including Linux, BSD and OS X) + * and Windows. For other platforms, you'll want to disable it, and write your + * own networking callbacks to be passed to \c mbedtls_ssl_set_bio(). + * + * \note See also our Knowledge Base article about porting to a new + * environment: + * https://mbed-tls.readthedocs.io/en/latest/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS + * + * Module: library/net_sockets.c + * + * This module provides networking routines. + */ +#define MBEDTLS_NET_C + +/** + * \def MBEDTLS_OID_C + * + * Enable the OID database. + * + * Module: library/oid.c + * Caller: library/asn1write.c + * library/pkcs5.c + * library/pkparse.c + * library/pkwrite.c + * library/rsa.c + * library/x509.c + * library/x509_create.c + * library/x509_crl.c + * library/x509_crt.c + * library/x509_csr.c + * library/x509write_crt.c + * library/x509write_csr.c + * + * This modules translates between OIDs and internal values. + */ +#define MBEDTLS_OID_C + +/** + * \def MBEDTLS_PADLOCK_C + * + * Enable VIA Padlock support on x86. + * + * Module: library/padlock.c + * Caller: library/aes.c + * + * Requires: MBEDTLS_HAVE_ASM + * + * This modules adds support for the VIA PadLock on x86. + */ +#define MBEDTLS_PADLOCK_C + +/** + * \def MBEDTLS_PEM_PARSE_C + * + * Enable PEM decoding / parsing. + * + * Module: library/pem.c + * Caller: library/dhm.c + * library/pkparse.c + * library/x509_crl.c + * library/x509_crt.c + * library/x509_csr.c + * + * Requires: MBEDTLS_BASE64_C + * + * This modules adds support for decoding / parsing PEM files. + */ +#define MBEDTLS_PEM_PARSE_C + +/** + * \def MBEDTLS_PEM_WRITE_C + * + * Enable PEM encoding / writing. + * + * Module: library/pem.c + * Caller: library/pkwrite.c + * library/x509write_crt.c + * library/x509write_csr.c + * + * Requires: MBEDTLS_BASE64_C + * + * This modules adds support for encoding / writing PEM files. + */ +#define MBEDTLS_PEM_WRITE_C + +/** + * \def MBEDTLS_PK_C + * + * Enable the generic public (asymmetric) key layer. + * + * Module: library/pk.c + * Caller: library/ssl_tls.c + * library/ssl_cli.c + * library/ssl_srv.c + * + * Requires: MBEDTLS_RSA_C or MBEDTLS_ECP_C + * + * Uncomment to enable generic public key wrappers. + */ +#define MBEDTLS_PK_C + +/** + * \def MBEDTLS_PK_PARSE_C + * + * Enable the generic public (asymmetric) key parser. + * + * Module: library/pkparse.c + * Caller: library/x509_crt.c + * library/x509_csr.c + * + * Requires: MBEDTLS_PK_C + * + * Uncomment to enable generic public key parse functions. + */ +#define MBEDTLS_PK_PARSE_C + +/** + * \def MBEDTLS_PK_WRITE_C + * + * Enable the generic public (asymmetric) key writer. + * + * Module: library/pkwrite.c + * Caller: library/x509write.c + * + * Requires: MBEDTLS_PK_C + * + * Uncomment to enable generic public key write functions. + */ +#define MBEDTLS_PK_WRITE_C + +/** + * \def MBEDTLS_PKCS5_C + * + * Enable PKCS#5 functions. + * + * Module: library/pkcs5.c + * + * Requires: MBEDTLS_MD_C + * + * This module adds support for the PKCS#5 functions. + */ +#define MBEDTLS_PKCS5_C + +/** + * \def MBEDTLS_PKCS11_C + * + * Enable wrapper for PKCS#11 smartcard support via the pkcs11-helper library. + * + * \deprecated This option is deprecated and will be removed in a future + * version of Mbed TLS. + * + * Module: library/pkcs11.c + * Caller: library/pk.c + * + * Requires: MBEDTLS_PK_C + * + * This module enables SSL/TLS PKCS #11 smartcard support. + * Requires the presence of the PKCS#11 helper library (libpkcs11-helper) + */ +//#define MBEDTLS_PKCS11_C + +/** + * \def MBEDTLS_PKCS12_C + * + * Enable PKCS#12 PBE functions. + * Adds algorithms for parsing PKCS#8 encrypted private keys + * + * Module: library/pkcs12.c + * Caller: library/pkparse.c + * + * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_CIPHER_C, MBEDTLS_MD_C + * Can use: MBEDTLS_ARC4_C + * + * This module enables PKCS#12 functions. + */ +#define MBEDTLS_PKCS12_C + +/** + * \def MBEDTLS_PLATFORM_C + * + * Enable the platform abstraction layer that allows you to re-assign + * functions like calloc(), free(), snprintf(), printf(), fprintf(), exit(). + * + * Enabling MBEDTLS_PLATFORM_C enables to use of MBEDTLS_PLATFORM_XXX_ALT + * or MBEDTLS_PLATFORM_XXX_MACRO directives, allowing the functions mentioned + * above to be specified at runtime or compile time respectively. + * + * \note This abstraction layer must be enabled on Windows (including MSYS2) + * as other module rely on it for a fixed snprintf implementation. + * + * Module: library/platform.c + * Caller: Most other .c files + * + * This module enables abstraction of common (libc) functions. + */ +#define MBEDTLS_PLATFORM_C + +/** + * \def MBEDTLS_POLY1305_C + * + * Enable the Poly1305 MAC algorithm. + * + * Module: library/poly1305.c + * Caller: library/chachapoly.c + */ +#define MBEDTLS_POLY1305_C + +/** + * \def MBEDTLS_PSA_CRYPTO_C + * + * Enable the Platform Security Architecture cryptography API. + * + * \note In multithreaded applications, you must enable #MBEDTLS_THREADING_C, + * unless only one thread ever calls `psa_xxx()` functions. + * That includes indirect calls, such as: + * - indirect calls from PK, X.509 or SSL functions when + * #MBEDTLS_USE_PSA_CRYPTO is enabled; + * - any other call to a function that requires calling psa_crypto_init() + * beforehand. + * + * Module: library/psa_crypto.c + * + * Requires: either MBEDTLS_CTR_DRBG_C and MBEDTLS_ENTROPY_C, + * or MBEDTLS_HMAC_DRBG_C and MBEDTLS_ENTROPY_C, + * or MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG. + * + */ +#define MBEDTLS_PSA_CRYPTO_C + +/** + * \def MBEDTLS_PSA_CRYPTO_SE_C + * + * Enable secure element support in the Platform Security Architecture + * cryptography API. + * + * \warning This feature is not yet suitable for production. It is provided + * for API evaluation and testing purposes only. + * + * Module: library/psa_crypto_se.c + * + * Requires: MBEDTLS_PSA_CRYPTO_C, MBEDTLS_PSA_CRYPTO_STORAGE_C + * + */ +//#define MBEDTLS_PSA_CRYPTO_SE_C + +/** + * \def MBEDTLS_PSA_CRYPTO_STORAGE_C + * + * Enable the Platform Security Architecture persistent key storage. + * + * Module: library/psa_crypto_storage.c + * + * Requires: MBEDTLS_PSA_CRYPTO_C, + * either MBEDTLS_PSA_ITS_FILE_C or a native implementation of + * the PSA ITS interface + */ +#define MBEDTLS_PSA_CRYPTO_STORAGE_C + +/** + * \def MBEDTLS_PSA_ITS_FILE_C + * + * Enable the emulation of the Platform Security Architecture + * Internal Trusted Storage (PSA ITS) over files. + * + * Module: library/psa_its_file.c + * + * Requires: MBEDTLS_FS_IO + */ +#define MBEDTLS_PSA_ITS_FILE_C + +/** + * \def MBEDTLS_RIPEMD160_C + * + * Enable the RIPEMD-160 hash algorithm. + * + * Module: library/ripemd160.c + * Caller: library/md.c + * + */ +#define MBEDTLS_RIPEMD160_C + +/** + * \def MBEDTLS_RSA_C + * + * Enable the RSA public-key cryptosystem. + * + * Module: library/rsa.c + * library/rsa_internal.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * library/x509.c + * + * This module is used by the following key exchanges: + * RSA, DHE-RSA, ECDHE-RSA, RSA-PSK + * + * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C + */ +#define MBEDTLS_RSA_C + +/** + * \def MBEDTLS_SHA1_C + * + * Enable the SHA1 cryptographic hash algorithm. + * + * Module: library/sha1.c + * Caller: library/md.c + * library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * library/x509write_crt.c + * + * This module is required for SSL/TLS up to version 1.1, for TLS 1.2 + * depending on the handshake parameters, and for SHA1-signed certificates. + * + * \warning SHA-1 is considered a weak message digest and its use constitutes + * a security risk. If possible, we recommend avoiding dependencies + * on it, and considering stronger message digests instead. + * + */ +#define MBEDTLS_SHA1_C + +/** + * \def MBEDTLS_SHA256_C + * + * Enable the SHA-224 and SHA-256 cryptographic hash algorithms. + * + * Module: library/sha256.c + * Caller: library/entropy.c + * library/md.c + * library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * + * This module adds support for SHA-224 and SHA-256. + * This module is required for the SSL/TLS 1.2 PRF function. + */ +#define MBEDTLS_SHA256_C + +/** + * \def MBEDTLS_SHA512_C + * + * Enable the SHA-384 and SHA-512 cryptographic hash algorithms. + * + * Module: library/sha512.c + * Caller: library/entropy.c + * library/md.c + * library/ssl_cli.c + * library/ssl_srv.c + * + * This module adds support for SHA-384 and SHA-512. + */ +#define MBEDTLS_SHA512_C + +/** + * \def MBEDTLS_SSL_CACHE_C + * + * Enable simple SSL cache implementation. + * + * Module: library/ssl_cache.c + * Caller: + * + * Requires: MBEDTLS_SSL_CACHE_C + */ +#define MBEDTLS_SSL_CACHE_C + +/** + * \def MBEDTLS_SSL_COOKIE_C + * + * Enable basic implementation of DTLS cookies for hello verification. + * + * Module: library/ssl_cookie.c + * Caller: + */ +#define MBEDTLS_SSL_COOKIE_C + +/** + * \def MBEDTLS_SSL_TICKET_C + * + * Enable an implementation of TLS server-side callbacks for session tickets. + * + * Module: library/ssl_ticket.c + * Caller: + * + * Requires: MBEDTLS_CIPHER_C && + * ( MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C ) + */ +#define MBEDTLS_SSL_TICKET_C + +/** + * \def MBEDTLS_SSL_CLI_C + * + * Enable the SSL/TLS client code. + * + * Module: library/ssl_cli.c + * Caller: + * + * Requires: MBEDTLS_SSL_TLS_C + * + * This module is required for SSL/TLS client support. + */ +#define MBEDTLS_SSL_CLI_C + +/** + * \def MBEDTLS_SSL_SRV_C + * + * Enable the SSL/TLS server code. + * + * Module: library/ssl_srv.c + * Caller: + * + * Requires: MBEDTLS_SSL_TLS_C + * + * This module is required for SSL/TLS server support. + */ +#define MBEDTLS_SSL_SRV_C + +/** + * \def MBEDTLS_SSL_TLS_C + * + * Enable the generic SSL/TLS code. + * + * Module: library/ssl_tls.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * + * Requires: MBEDTLS_CIPHER_C, MBEDTLS_MD_C + * and at least one of the MBEDTLS_SSL_PROTO_XXX defines + * + * This module is required for SSL/TLS. + */ +#define MBEDTLS_SSL_TLS_C + +/** + * \def MBEDTLS_THREADING_C + * + * Traditionally, Mbed TLS assumes it is used in a non-threaded environment or + * that contexts are not shared between threads. If you do intend to use contexts + * between threads, you will need to enable this layer to prevent race + * conditions. + * + * The PSA subsystem has an implicit shared context. Therefore, you must + * enable this option if more than one thread may use any part of + * Mbed TLS that is implemented on top of the PSA subsystem. + * + * You must enable this option in multithreaded applications where more than + * one thread performs any of the following operations: + * + * - Any call to a PSA function (`psa_xxx()`). + * - Any call to a TLS, X.509 or PK function (`mbedtls_ssl_xxx()`, + * `mbedtls_x509_xxx()`, `mbedtls_pkcs7_xxx()`, `mbedtls_pk_xxx()`) + * if `MBEDTLS_USE_PSA_CRYPTO` is enabled (regardless of whether individual + * TLS, X.509 or PK contexts are shared between threads). + * - Any use of a cryptographic context if the same context is used in + * multiple threads. + * - Any call to a function where the documentation specifies that + * psa_crypto_init() must be called prior to that function. + * + * See also our Knowledge Base article about threading: + * https://mbed-tls.readthedocs.io/en/latest/kb/development/thread-safety-and-multi-threading + * + * Module: library/threading.c + * + * This allows different threading implementations (self-implemented or + * provided). + * + * You will have to enable either MBEDTLS_THREADING_ALT or + * MBEDTLS_THREADING_PTHREAD. + * + * Enable this layer to allow use of mutexes within Mbed TLS + */ +//#define MBEDTLS_THREADING_C + +/** + * \def MBEDTLS_TIMING_C + * + * Enable the semi-portable timing interface. + * + * \note The provided implementation only works on POSIX/Unix (including Linux, + * BSD and OS X) and Windows. On other platforms, you can either disable that + * module and provide your own implementations of the callbacks needed by + * \c mbedtls_ssl_set_timer_cb() for DTLS, or leave it enabled and provide + * your own implementation of the whole module by setting + * \c MBEDTLS_TIMING_ALT in the current file. + * + * \note The timing module will include time.h on suitable platforms + * regardless of the setting of MBEDTLS_HAVE_TIME, unless + * MBEDTLS_TIMING_ALT is used. See timing.c for more information. + * + * \note See also our Knowledge Base article about porting to a new + * environment: + * https://mbed-tls.readthedocs.io/en/latest/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS + * + * Module: library/timing.c + * Caller: library/havege.c + * + * This module is used by the HAVEGE random number generator. + */ +#define MBEDTLS_TIMING_C + +/** + * \def MBEDTLS_VERSION_C + * + * Enable run-time version information. + * + * Module: library/version.c + * + * This module provides run-time version information. + */ +#define MBEDTLS_VERSION_C + +/** + * \def MBEDTLS_X509_USE_C + * + * Enable X.509 core for using certificates. + * + * Module: library/x509.c + * Caller: library/x509_crl.c + * library/x509_crt.c + * library/x509_csr.c + * + * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, + * MBEDTLS_PK_PARSE_C + * + * This module is required for the X.509 parsing modules. + */ +#define MBEDTLS_X509_USE_C + +/** + * \def MBEDTLS_X509_CRT_PARSE_C + * + * Enable X.509 certificate parsing. + * + * Module: library/x509_crt.c + * Caller: library/ssl_cli.c + * library/ssl_srv.c + * library/ssl_tls.c + * + * Requires: MBEDTLS_X509_USE_C + * + * This module is required for X.509 certificate parsing. + */ +#define MBEDTLS_X509_CRT_PARSE_C + +/** + * \def MBEDTLS_X509_CRL_PARSE_C + * + * Enable X.509 CRL parsing. + * + * Module: library/x509_crl.c + * Caller: library/x509_crt.c + * + * Requires: MBEDTLS_X509_USE_C + * + * This module is required for X.509 CRL parsing. + */ +#define MBEDTLS_X509_CRL_PARSE_C + +/** + * \def MBEDTLS_X509_CSR_PARSE_C + * + * Enable X.509 Certificate Signing Request (CSR) parsing. + * + * Module: library/x509_csr.c + * Caller: library/x509_crt_write.c + * + * Requires: MBEDTLS_X509_USE_C + * + * This module is used for reading X.509 certificate request. + */ +#define MBEDTLS_X509_CSR_PARSE_C + +/** + * \def MBEDTLS_X509_CREATE_C + * + * Enable X.509 core for creating certificates. + * + * Module: library/x509_create.c + * + * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, MBEDTLS_PK_WRITE_C + * + * This module is the basis for creating X.509 certificates and CSRs. + */ +#define MBEDTLS_X509_CREATE_C + +/** + * \def MBEDTLS_X509_CRT_WRITE_C + * + * Enable creating X.509 certificates. + * + * Module: library/x509_crt_write.c + * + * Requires: MBEDTLS_X509_CREATE_C + * + * This module is required for X.509 certificate creation. + */ +#define MBEDTLS_X509_CRT_WRITE_C + +/** + * \def MBEDTLS_X509_CSR_WRITE_C + * + * Enable creating X.509 Certificate Signing Requests (CSR). + * + * Module: library/x509_csr_write.c + * + * Requires: MBEDTLS_X509_CREATE_C + * + * This module is required for X.509 certificate request writing. + */ +#define MBEDTLS_X509_CSR_WRITE_C + +/** + * \def MBEDTLS_XTEA_C + * + * Enable the XTEA block cipher. + * + * Module: library/xtea.c + * Caller: + */ +#define MBEDTLS_XTEA_C + +/** \} name SECTION: Mbed TLS modules */ + +/** + * \name SECTION: General configuration options + * + * This section contains Mbed TLS build settings that are not associated + * with a particular module. + * + * \{ + */ + +/** + * \def MBEDTLS_CONFIG_FILE + * + * If defined, this is a header which will be included instead of + * `"mbedtls/config.h"`. + * This header file specifies the compile-time configuration of Mbed TLS. + * Unlike other configuration options, this one must be defined on the + * compiler command line: a definition in `config.h` would have no effect. + * + * This macro is expanded after an \#include directive. This is a popular but + * non-standard feature of the C language, so this feature is only available + * with compilers that perform macro expansion on an \#include line. + * + * The value of this symbol is typically a path in double quotes, either + * absolute or relative to a directory on the include search path. + */ +//#define MBEDTLS_CONFIG_FILE "mbedtls/config.h" + +/** + * \def MBEDTLS_USER_CONFIG_FILE + * + * If defined, this is a header which will be included after + * `"mbedtls/config.h"` or #MBEDTLS_CONFIG_FILE. + * This allows you to modify the default configuration, including the ability + * to undefine options that are enabled by default. + * + * This macro is expanded after an \#include directive. This is a popular but + * non-standard feature of the C language, so this feature is only available + * with compilers that perform macro expansion on an \#include line. + * + * The value of this symbol is typically a path in double quotes, either + * absolute or relative to a directory on the include search path. + */ +//#define MBEDTLS_USER_CONFIG_FILE "/dev/null" + +/** + * \def MBEDTLS_PSA_CRYPTO_CONFIG_FILE + * + * If defined, this is a header which will be included instead of + * `"psa/crypto_config.h"`. + * This header file specifies which cryptographic mechanisms are available + * through the PSA API when #MBEDTLS_PSA_CRYPTO_CONFIG is enabled, and + * is not used when #MBEDTLS_PSA_CRYPTO_CONFIG is disabled. + * + * This macro is expanded after an \#include directive. This is a popular but + * non-standard feature of the C language, so this feature is only available + * with compilers that perform macro expansion on an \#include line. + * + * The value of this symbol is typically a path in double quotes, either + * absolute or relative to a directory on the include search path. + */ +//#define MBEDTLS_PSA_CRYPTO_CONFIG_FILE "psa/crypto_config.h" + +/** + * \def MBEDTLS_PSA_CRYPTO_USER_CONFIG_FILE + * + * If defined, this is a header which will be included after + * `"psa/crypto_config.h"` or #MBEDTLS_PSA_CRYPTO_CONFIG_FILE. + * This allows you to modify the default configuration, including the ability + * to undefine options that are enabled by default. + * + * This macro is expanded after an \#include directive. This is a popular but + * non-standard feature of the C language, so this feature is only available + * with compilers that perform macro expansion on an \#include line. + * + * The value of this symbol is typically a path in double quotes, either + * absolute or relative to a directory on the include search path. + */ +//#define MBEDTLS_PSA_CRYPTO_USER_CONFIG_FILE "/dev/null" + +/** \} name SECTION: General configuration options */ + +/** + * \name SECTION: Module configuration options + * + * This section allows for the setting of module specific sizes and + * configuration options. The default values are already present in the + * relevant header files and should suffice for the regular use cases. + * + * Our advice is to enable options and change their values here + * only if you have a good reason and know the consequences. + * \{ + */ +/* The Doxygen documentation here is used when a user comments out a + * setting and runs doxygen themselves. On the other hand, when we typeset + * the full documentation including disabled settings, the documentation + * in specific modules' header files is used if present. When editing this + * file, make sure that each option is documented in exactly one place, + * plus optionally a same-line Doxygen comment here if there is a Doxygen + * comment in the specific module. */ + +/* MPI / BIGNUM options */ +//#define MBEDTLS_MPI_WINDOW_SIZE 2 /**< Maximum window size used. */ +//#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ + +/* CTR_DRBG options */ +//#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 48 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */ +//#define MBEDTLS_CTR_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ +//#define MBEDTLS_CTR_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ +//#define MBEDTLS_CTR_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ +//#define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ + +/* HMAC_DRBG options */ +//#define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ +//#define MBEDTLS_HMAC_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ +//#define MBEDTLS_HMAC_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ +//#define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ + +/* ECP options */ +//#define MBEDTLS_ECP_MAX_BITS 521 /**< Maximum bit size of groups. Normally determined automatically from the configured curves. */ +//#define MBEDTLS_ECP_WINDOW_SIZE 4 /**< Maximum window size used */ +//#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up */ + +/* Entropy options */ +//#define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ +//#define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ +//#define MBEDTLS_ENTROPY_MIN_HARDWARE 32 /**< Default minimum number of bytes required for the hardware entropy source mbedtls_hardware_poll() before entropy is released */ + +/* Memory buffer allocator options */ +//#define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ + +/* Platform options */ +//#define MBEDTLS_PLATFORM_STD_MEM_HDR /**< Header to include if MBEDTLS_PLATFORM_NO_STD_FUNCTIONS is defined. Don't define if no header is needed. */ + +/** \def MBEDTLS_PLATFORM_STD_CALLOC + * + * Default allocator to use, can be undefined. + * It must initialize the allocated buffer memory to zeroes. + * The size of the buffer is the product of the two parameters. + * The calloc function returns either a null pointer or a pointer to the allocated space. + * If the product is 0, the function may either return NULL or a valid pointer to an array of size 0 which is a valid input to the deallocation function. + * An uninitialized #MBEDTLS_PLATFORM_STD_CALLOC always fails, returning a null pointer. + * See the description of #MBEDTLS_PLATFORM_MEMORY for more details. + * The corresponding deallocation function is #MBEDTLS_PLATFORM_STD_FREE. + */ +//#define MBEDTLS_PLATFORM_STD_CALLOC calloc + +/** \def MBEDTLS_PLATFORM_STD_FREE + * + * Default free to use, can be undefined. + * NULL is a valid parameter, and the function must do nothing. + * A non-null parameter will always be a pointer previously returned by #MBEDTLS_PLATFORM_STD_CALLOC and not yet freed. + * An uninitialized #MBEDTLS_PLATFORM_STD_FREE does not do anything. + * See the description of #MBEDTLS_PLATFORM_MEMORY for more details (same principles as for MBEDTLS_PLATFORM_STD_CALLOC apply). + */ +//#define MBEDTLS_PLATFORM_STD_FREE free +//#define MBEDTLS_PLATFORM_STD_EXIT exit /**< Default exit to use, can be undefined */ +//#define MBEDTLS_PLATFORM_STD_TIME time /**< Default time to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ +//#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use, can be undefined */ +//#define MBEDTLS_PLATFORM_STD_PRINTF printf /**< Default printf to use, can be undefined */ +/* Note: your snprintf must correctly zero-terminate the buffer! */ +//#define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< Default snprintf to use, can be undefined */ +//#define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS 0 /**< Default exit value to use, can be undefined */ +//#define MBEDTLS_PLATFORM_STD_EXIT_FAILURE 1 /**< Default exit value to use, can be undefined */ +//#define MBEDTLS_PLATFORM_STD_NV_SEED_READ mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */ +//#define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */ +//#define MBEDTLS_PLATFORM_STD_NV_SEED_FILE "seedfile" /**< Seed file to read/write with default implementation */ + +/* To use the following function macros, MBEDTLS_PLATFORM_C must be enabled. */ +/* MBEDTLS_PLATFORM_XXX_MACRO and MBEDTLS_PLATFORM_XXX_ALT cannot both be defined */ +//#define MBEDTLS_PLATFORM_CALLOC_MACRO calloc /**< Default allocator macro to use, can be undefined. See MBEDTLS_PLATFORM_STD_CALLOC for requirements. */ +//#define MBEDTLS_PLATFORM_FREE_MACRO free /**< Default free macro to use, can be undefined. See MBEDTLS_PLATFORM_STD_FREE for requirements. */ +//#define MBEDTLS_PLATFORM_EXIT_MACRO exit /**< Default exit macro to use, can be undefined */ +//#define MBEDTLS_PLATFORM_TIME_MACRO time /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ +//#define MBEDTLS_PLATFORM_TIME_TYPE_MACRO time_t /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ +//#define MBEDTLS_PLATFORM_FPRINTF_MACRO fprintf /**< Default fprintf macro to use, can be undefined */ +//#define MBEDTLS_PLATFORM_PRINTF_MACRO printf /**< Default printf macro to use, can be undefined */ +/* Note: your snprintf must correctly zero-terminate the buffer! */ +//#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf /**< Default snprintf macro to use, can be undefined */ +//#define MBEDTLS_PLATFORM_VSNPRINTF_MACRO vsnprintf /**< Default vsnprintf macro to use, can be undefined */ +//#define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */ +//#define MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */ + +/** + * \brief This macro is invoked by the library when an invalid parameter + * is detected that is only checked with #MBEDTLS_CHECK_PARAMS + * (see the documentation of that option for context). + * + * When you leave this undefined here, the library provides + * a default definition. If the macro #MBEDTLS_CHECK_PARAMS_ASSERT + * is defined, the default definition is `assert(cond)`, + * otherwise the default definition calls a function + * mbedtls_param_failed(). This function is declared in + * `platform_util.h` for the benefit of the library, but + * you need to define in your application. + * + * When you define this here, this replaces the default + * definition in platform_util.h (which no longer declares the + * function mbedtls_param_failed()) and it is your responsibility + * to make sure this macro expands to something suitable (in + * particular, that all the necessary declarations are visible + * from within the library - you can ensure that by providing + * them in this file next to the macro definition). + * If you define this macro to call `assert`, also define + * #MBEDTLS_CHECK_PARAMS_ASSERT so that library source files + * include ``. + * + * Note that you may define this macro to expand to nothing, in + * which case you don't have to worry about declarations or + * definitions. However, you will then be notified about invalid + * parameters only in non-void functions, and void function will + * just silently return early on invalid parameters, which + * partially negates the benefits of enabling + * #MBEDTLS_CHECK_PARAMS in the first place, so is discouraged. + * + * \param cond The expression that should evaluate to true, but doesn't. + */ +//#define MBEDTLS_PARAM_FAILED( cond ) assert( cond ) + +/** \def MBEDTLS_CHECK_RETURN + * + * This macro is used at the beginning of the declaration of a function + * to indicate that its return value should be checked. It should + * instruct the compiler to emit a warning or an error if the function + * is called without checking its return value. + * + * There is a default implementation for popular compilers in platform_util.h. + * You can override the default implementation by defining your own here. + * + * If the implementation here is empty, this will effectively disable the + * checking of functions' return values. + */ +//#define MBEDTLS_CHECK_RETURN __attribute__((__warn_unused_result__)) + +/** \def MBEDTLS_IGNORE_RETURN + * + * This macro requires one argument, which should be a C function call. + * If that function call would cause a #MBEDTLS_CHECK_RETURN warning, this + * warning is suppressed. + */ +//#define MBEDTLS_IGNORE_RETURN( result ) ((void) !(result)) + +/* PSA options */ +/** + * Use HMAC_DRBG with the specified hash algorithm for HMAC_DRBG for the + * PSA crypto subsystem. + * + * If this option is unset, the library chooses a hash (currently between + * #MBEDTLS_MD_SHA512 and #MBEDTLS_MD_SHA256) based on availability and + * unspecified heuristics. + * + * \note The PSA crypto subsystem uses the first available mechanism amongst + * the following: + * - #MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG if enabled; + * - Entropy from #MBEDTLS_ENTROPY_C plus CTR_DRBG with AES + * if #MBEDTLS_CTR_DRBG_C is enabled; + * - Entropy from #MBEDTLS_ENTROPY_C plus HMAC_DRBG. + * + * A future version may reevaluate the prioritization of DRBG mechanisms. + */ +//#define MBEDTLS_PSA_HMAC_DRBG_MD_TYPE MBEDTLS_MD_SHA256 + +/** \def MBEDTLS_PSA_KEY_SLOT_COUNT + * + * The maximum amount of PSA keys simultaneously in memory. This counts all + * volatile keys, plus loaded persistent keys. + * + * Currently, persistent keys do not need to be loaded all the time while + * a multipart operation is in progress, only while the operation is being + * set up. This may change in future versions of the library. + * + * Currently, the library traverses of the whole table on each access to a + * persistent key. Therefore large values may cause poor performance. + * + * This option has no effect when #MBEDTLS_PSA_CRYPTO_C is disabled. + */ +//#define MBEDTLS_PSA_KEY_SLOT_COUNT 32 + +/* SSL Cache options */ +//#define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT 86400 /**< 1 day */ +//#define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /**< Maximum entries in cache */ + +/* SSL options */ + +/** \def MBEDTLS_SSL_MAX_CONTENT_LEN + * + * Maximum length (in bytes) of incoming and outgoing plaintext fragments. + * + * This determines the size of both the incoming and outgoing TLS I/O buffers + * in such a way that both are capable of holding the specified amount of + * plaintext data, regardless of the protection mechanism used. + * + * To configure incoming and outgoing I/O buffers separately, use + * #MBEDTLS_SSL_IN_CONTENT_LEN and #MBEDTLS_SSL_OUT_CONTENT_LEN, + * which overwrite the value set by this option. + * + * \note When using a value less than the default of 16KB on the client, it is + * recommended to use the Maximum Fragment Length (MFL) extension to + * inform the server about this limitation. On the server, there + * is no supported, standardized way of informing the client about + * restriction on the maximum size of incoming messages, and unless + * the limitation has been communicated by other means, it is recommended + * to only change the outgoing buffer size #MBEDTLS_SSL_OUT_CONTENT_LEN + * while keeping the default value of 16KB for the incoming buffer. + * + * Uncomment to set the maximum plaintext size of both + * incoming and outgoing I/O buffers. + */ +//#define MBEDTLS_SSL_MAX_CONTENT_LEN 16384 + +/** \def MBEDTLS_SSL_IN_CONTENT_LEN + * + * Maximum length (in bytes) of incoming plaintext fragments. + * + * This determines the size of the incoming TLS I/O buffer in such a way + * that it is capable of holding the specified amount of plaintext data, + * regardless of the protection mechanism used. + * + * If this option is undefined, it inherits its value from + * #MBEDTLS_SSL_MAX_CONTENT_LEN. + * + * \note When using a value less than the default of 16KB on the client, it is + * recommended to use the Maximum Fragment Length (MFL) extension to + * inform the server about this limitation. On the server, there + * is no supported, standardized way of informing the client about + * restriction on the maximum size of incoming messages, and unless + * the limitation has been communicated by other means, it is recommended + * to only change the outgoing buffer size #MBEDTLS_SSL_OUT_CONTENT_LEN + * while keeping the default value of 16KB for the incoming buffer. + * + * Uncomment to set the maximum plaintext size of the incoming I/O buffer + * independently of the outgoing I/O buffer. + */ +//#define MBEDTLS_SSL_IN_CONTENT_LEN 16384 + +/** \def MBEDTLS_SSL_CID_IN_LEN_MAX + * + * The maximum length of CIDs used for incoming DTLS messages. + * + */ +//#define MBEDTLS_SSL_CID_IN_LEN_MAX 32 + +/** \def MBEDTLS_SSL_CID_OUT_LEN_MAX + * + * The maximum length of CIDs used for outgoing DTLS messages. + * + */ +//#define MBEDTLS_SSL_CID_OUT_LEN_MAX 32 + +/** \def MBEDTLS_SSL_CID_PADDING_GRANULARITY + * + * This option controls the use of record plaintext padding + * when using the Connection ID extension in DTLS 1.2. + * + * The padding will always be chosen so that the length of the + * padded plaintext is a multiple of the value of this option. + * + * Note: A value of \c 1 means that no padding will be used + * for outgoing records. + * + * Note: On systems lacking division instructions, + * a power of two should be preferred. + * + */ +//#define MBEDTLS_SSL_CID_PADDING_GRANULARITY 16 + +/** \def MBEDTLS_SSL_TLS1_3_PADDING_GRANULARITY + * + * This option controls the use of record plaintext padding + * in TLS 1.3. + * + * The padding will always be chosen so that the length of the + * padded plaintext is a multiple of the value of this option. + * + * Note: A value of \c 1 means that no padding will be used + * for outgoing records. + * + * Note: On systems lacking division instructions, + * a power of two should be preferred. + */ +//#define MBEDTLS_SSL_TLS1_3_PADDING_GRANULARITY 1 + +/** \def MBEDTLS_SSL_OUT_CONTENT_LEN + * + * Maximum length (in bytes) of outgoing plaintext fragments. + * + * This determines the size of the outgoing TLS I/O buffer in such a way + * that it is capable of holding the specified amount of plaintext data, + * regardless of the protection mechanism used. + * + * If this option undefined, it inherits its value from + * #MBEDTLS_SSL_MAX_CONTENT_LEN. + * + * It is possible to save RAM by setting a smaller outward buffer, while keeping + * the default inward 16384 byte buffer to conform to the TLS specification. + * + * The minimum required outward buffer size is determined by the handshake + * protocol's usage. Handshaking will fail if the outward buffer is too small. + * The specific size requirement depends on the configured ciphers and any + * certificate data which is sent during the handshake. + * + * Uncomment to set the maximum plaintext size of the outgoing I/O buffer + * independently of the incoming I/O buffer. + */ +//#define MBEDTLS_SSL_OUT_CONTENT_LEN 16384 + +/** \def MBEDTLS_SSL_DTLS_MAX_BUFFERING + * + * Maximum number of heap-allocated bytes for the purpose of + * DTLS handshake message reassembly and future message buffering. + * + * This should be at least 9/8 * MBEDTLS_SSL_IN_CONTENT_LEN + * to account for a reassembled handshake message of maximum size, + * together with its reassembly bitmap. + * + * A value of 2 * MBEDTLS_SSL_IN_CONTENT_LEN (32768 by default) + * should be sufficient for all practical situations as it allows + * to reassembly a large handshake message (such as a certificate) + * while buffering multiple smaller handshake messages. + * + */ +//#define MBEDTLS_SSL_DTLS_MAX_BUFFERING 32768 + +//#define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ +//#define MBEDTLS_PSK_MAX_LEN 32 /**< Max size of TLS pre-shared keys, in bytes (default 256 bits) */ +//#define MBEDTLS_SSL_COOKIE_TIMEOUT 60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number of cookies issued */ + +/** \def MBEDTLS_TLS_EXT_CID + * + * At the time of writing, the CID extension has not been assigned its + * final value. Set this configuration option to make Mbed TLS use a + * different value. + * + * A future minor revision of Mbed TLS may change the default value of + * this option to match evolving standards and usage. + */ +//#define MBEDTLS_TLS_EXT_CID 254 + +/** + * Complete list of ciphersuites to use, in order of preference. + * + * \warning No dependency checking is done on that field! This option can only + * be used to restrict the set of available ciphersuites. It is your + * responsibility to make sure the needed modules are active. + * + * Use this to save a few hundred bytes of ROM (default ordering of all + * available ciphersuites) and a few to a few hundred bytes of RAM. + * + * The value below is only an example, not the default. + */ +//#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 + +/* X509 options */ +//#define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 /**< Maximum number of intermediate CAs in a verification chain. */ +//#define MBEDTLS_X509_MAX_FILE_PATH_LEN 512 /**< Maximum length of a path/filename string in bytes including the null terminator character ('\0'). */ + +/** \} name SECTION: Module configuration options */ + +/* Target and application specific configurations + * + * Allow user to override any previous default. + * + */ +#if defined(MBEDTLS_USER_CONFIG_FILE) +#include MBEDTLS_USER_CONFIG_FILE +#endif + +#if defined(MBEDTLS_PSA_CRYPTO_CONFIG) +#include "mbedtls/config_psa.h" +#endif + +#include "mbedtls/check_config.h" + +#endif /* MBEDTLS_CONFIG_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/config_psa.h b/ext/opcua_client/mbedtls/include/mbedtls/config_psa.h new file mode 100644 index 0000000..205d303 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/config_psa.h @@ -0,0 +1,825 @@ +/** + * \file mbedtls/config_psa.h + * \brief PSA crypto configuration options (set of defines) + * + * This set of compile-time options takes settings defined in + * include/mbedtls/config.h and include/psa/crypto_config.h and uses + * those definitions to define symbols used in the library code. + * + * Users and integrators should not edit this file, please edit + * include/mbedtls/config.h for MBEDTLS_XXX settings or + * include/psa/crypto_config.h for PSA_WANT_XXX settings. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_CONFIG_PSA_H +#define MBEDTLS_CONFIG_PSA_H + +#if defined(MBEDTLS_PSA_CRYPTO_CONFIG) +#if defined(MBEDTLS_PSA_CRYPTO_CONFIG_FILE) +#include MBEDTLS_PSA_CRYPTO_CONFIG_FILE +#else +#include "psa/crypto_config.h" +#endif +#endif /* defined(MBEDTLS_PSA_CRYPTO_CONFIG) */ + +#if defined(MBEDTLS_PSA_CRYPTO_USER_CONFIG_FILE) +#include MBEDTLS_PSA_CRYPTO_USER_CONFIG_FILE +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + + +/****************************************************************/ +/* De facto synonyms */ +/****************************************************************/ + +#if defined(PSA_WANT_ALG_ECDSA_ANY) && !defined(PSA_WANT_ALG_ECDSA) +#define PSA_WANT_ALG_ECDSA PSA_WANT_ALG_ECDSA_ANY +#elif !defined(PSA_WANT_ALG_ECDSA_ANY) && defined(PSA_WANT_ALG_ECDSA) +#define PSA_WANT_ALG_ECDSA_ANY PSA_WANT_ALG_ECDSA +#endif + +#if defined(PSA_WANT_ALG_RSA_PKCS1V15_SIGN_RAW) && !defined(PSA_WANT_ALG_RSA_PKCS1V15_SIGN) +#define PSA_WANT_ALG_RSA_PKCS1V15_SIGN PSA_WANT_ALG_RSA_PKCS1V15_SIGN_RAW +#elif !defined(PSA_WANT_ALG_RSA_PKCS1V15_SIGN_RAW) && defined(PSA_WANT_ALG_RSA_PKCS1V15_SIGN) +#define PSA_WANT_ALG_RSA_PKCS1V15_SIGN_RAW PSA_WANT_ALG_RSA_PKCS1V15_SIGN +#endif + +#if defined(PSA_WANT_ALG_RSA_PSS_ANY_SALT) && !defined(PSA_WANT_ALG_RSA_PSS) +#define PSA_WANT_ALG_RSA_PSS PSA_WANT_ALG_RSA_PSS_ANY_SALT +#elif !defined(PSA_WANT_ALG_RSA_PSS_ANY_SALT) && defined(PSA_WANT_ALG_RSA_PSS) +#define PSA_WANT_ALG_RSA_PSS_ANY_SALT PSA_WANT_ALG_RSA_PSS +#endif + + + +/****************************************************************/ +/* Require built-in implementations based on PSA requirements */ +/****************************************************************/ + +#if defined(MBEDTLS_PSA_CRYPTO_CONFIG) + +#if defined(PSA_WANT_ALG_DETERMINISTIC_ECDSA) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA) +#define MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA 1 +#define MBEDTLS_ECDSA_DETERMINISTIC +#define MBEDTLS_ECDSA_C +#define MBEDTLS_HMAC_DRBG_C +#define MBEDTLS_MD_C +#endif /* !MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA */ +#endif /* PSA_WANT_ALG_DETERMINISTIC_ECDSA */ + +#if defined(PSA_WANT_ALG_ECDH) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_ECDH) +#define MBEDTLS_PSA_BUILTIN_ALG_ECDH 1 +#define MBEDTLS_ECDH_C +#define MBEDTLS_ECP_C +#define MBEDTLS_BIGNUM_C +#endif /* !MBEDTLS_PSA_ACCEL_ALG_ECDH */ +#endif /* PSA_WANT_ALG_ECDH */ + +#if defined(PSA_WANT_ALG_ECDSA) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) +#define MBEDTLS_PSA_BUILTIN_ALG_ECDSA 1 +#define MBEDTLS_ECDSA_C +#define MBEDTLS_ECP_C +#define MBEDTLS_BIGNUM_C +#define MBEDTLS_ASN1_PARSE_C +#define MBEDTLS_ASN1_WRITE_C +#endif /* !MBEDTLS_PSA_ACCEL_ALG_ECDSA */ +#endif /* PSA_WANT_ALG_ECDSA */ + +#if defined(PSA_WANT_ALG_HKDF) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_HKDF) +/* + * The PSA implementation has its own implementation of HKDF, separate from + * hkdf.c. No need to enable MBEDTLS_HKDF_C here. + */ +#define MBEDTLS_PSA_BUILTIN_ALG_HMAC 1 +#define MBEDTLS_PSA_BUILTIN_ALG_HKDF 1 +#endif /* !MBEDTLS_PSA_ACCEL_ALG_HKDF */ +#endif /* PSA_WANT_ALG_HKDF */ + +#if defined(PSA_WANT_ALG_HMAC) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_HMAC) +#define MBEDTLS_PSA_BUILTIN_ALG_HMAC 1 +#endif /* !MBEDTLS_PSA_ACCEL_ALG_HMAC */ +#endif /* PSA_WANT_ALG_HMAC */ + +#if defined(PSA_WANT_ALG_MD2) && !defined(MBEDTLS_PSA_ACCEL_ALG_MD2) +#define MBEDTLS_PSA_BUILTIN_ALG_MD2 1 +#define MBEDTLS_MD2_C +#endif + +#if defined(PSA_WANT_ALG_MD4) && !defined(MBEDTLS_PSA_ACCEL_ALG_MD4) +#define MBEDTLS_PSA_BUILTIN_ALG_MD4 1 +#define MBEDTLS_MD4_C +#endif + +#if defined(PSA_WANT_ALG_MD5) && !defined(MBEDTLS_PSA_ACCEL_ALG_MD5) +#define MBEDTLS_PSA_BUILTIN_ALG_MD5 1 +#define MBEDTLS_MD5_C +#endif + +#if defined(PSA_WANT_ALG_RIPEMD160) && !defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160) +#define MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160 1 +#define MBEDTLS_RIPEMD160_C +#endif + +#if defined(PSA_WANT_ALG_RSA_OAEP) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_RSA_OAEP) +#define MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP 1 +#define MBEDTLS_RSA_C +#define MBEDTLS_BIGNUM_C +#define MBEDTLS_OID_C +#define MBEDTLS_PKCS1_V21 +#define MBEDTLS_MD_C +#endif /* !MBEDTLS_PSA_ACCEL_ALG_RSA_OAEP */ +#endif /* PSA_WANT_ALG_RSA_OAEP */ + +#if defined(PSA_WANT_ALG_RSA_PKCS1V15_CRYPT) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_CRYPT) +#define MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT 1 +#define MBEDTLS_RSA_C +#define MBEDTLS_BIGNUM_C +#define MBEDTLS_OID_C +#define MBEDTLS_PKCS1_V15 +#endif /* !MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_CRYPT */ +#endif /* PSA_WANT_ALG_RSA_PKCS1V15_CRYPT */ + +#if defined(PSA_WANT_ALG_RSA_PKCS1V15_SIGN) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) +#define MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN 1 +#define MBEDTLS_RSA_C +#define MBEDTLS_BIGNUM_C +#define MBEDTLS_OID_C +#define MBEDTLS_PKCS1_V15 +#define MBEDTLS_MD_C +#endif /* !MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN */ +#endif /* PSA_WANT_ALG_RSA_PKCS1V15_SIGN */ + +#if defined(PSA_WANT_ALG_RSA_PSS) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS) +#define MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS 1 +#define MBEDTLS_RSA_C +#define MBEDTLS_BIGNUM_C +#define MBEDTLS_OID_C +#define MBEDTLS_PKCS1_V21 +#define MBEDTLS_MD_C +#endif /* !MBEDTLS_PSA_ACCEL_ALG_RSA_PSS */ +#endif /* PSA_WANT_ALG_RSA_PSS */ + +#if defined(PSA_WANT_ALG_SHA_1) && !defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1) +#define MBEDTLS_PSA_BUILTIN_ALG_SHA_1 1 +#define MBEDTLS_SHA1_C +#endif + +#if defined(PSA_WANT_ALG_SHA_224) && !defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224) +#define MBEDTLS_PSA_BUILTIN_ALG_SHA_224 1 +#define MBEDTLS_SHA256_C +#endif + +#if defined(PSA_WANT_ALG_SHA_256) && !defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256) +#define MBEDTLS_PSA_BUILTIN_ALG_SHA_256 1 +#define MBEDTLS_SHA256_C +#endif + +#if defined(PSA_WANT_ALG_SHA_384) && !defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384) +#define MBEDTLS_PSA_BUILTIN_ALG_SHA_384 1 +#define MBEDTLS_SHA512_C +#endif + +#if defined(PSA_WANT_ALG_SHA_512) && !defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512) +#define MBEDTLS_PSA_BUILTIN_ALG_SHA_512 1 +#define MBEDTLS_SHA512_C +#endif + +#if defined(PSA_WANT_ALG_TLS12_PRF) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_TLS12_PRF) +#define MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF 1 +#endif /* !MBEDTLS_PSA_ACCEL_ALG_TLS12_PRF */ +#endif /* PSA_WANT_ALG_TLS12_PRF */ + +#if defined(PSA_WANT_ALG_TLS12_PSK_TO_MS) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_TLS12_PSK_TO_MS) +#define MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS 1 +#endif /* !MBEDTLS_PSA_ACCEL_ALG_TLS12_PSK_TO_MS */ +#endif /* PSA_WANT_ALG_TLS12_PSK_TO_MS */ + +#if defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR) +#if !defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_KEY_PAIR) +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR 1 +#define MBEDTLS_ECP_C +#define MBEDTLS_BIGNUM_C +#endif /* !MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_KEY_PAIR */ +#endif /* PSA_WANT_KEY_TYPE_ECC_KEY_PAIR */ + +#if defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY) +#if !defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_PUBLIC_KEY) +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY 1 +#define MBEDTLS_ECP_C +#define MBEDTLS_BIGNUM_C +#endif /* !MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_PUBLIC_KEY */ +#endif /* PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY */ + +#if defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR) +#if !defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_RSA_KEY_PAIR) +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR 1 +#define MBEDTLS_RSA_C +#define MBEDTLS_BIGNUM_C +#define MBEDTLS_OID_C +#define MBEDTLS_GENPRIME +#define MBEDTLS_PK_PARSE_C +#define MBEDTLS_PK_WRITE_C +#define MBEDTLS_PK_C +#define MBEDTLS_ASN1_PARSE_C +#define MBEDTLS_ASN1_WRITE_C +#endif /* !MBEDTLS_PSA_ACCEL_KEY_TYPE_RSA_KEY_PAIR */ +#endif /* PSA_WANT_KEY_TYPE_RSA_KEY_PAIR */ + +#if defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY) +#if !defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_RSA_PUBLIC_KEY) +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY 1 +#define MBEDTLS_RSA_C +#define MBEDTLS_BIGNUM_C +#define MBEDTLS_OID_C +#define MBEDTLS_PK_PARSE_C +#define MBEDTLS_PK_WRITE_C +#define MBEDTLS_PK_C +#define MBEDTLS_ASN1_PARSE_C +#define MBEDTLS_ASN1_WRITE_C +#endif /* !MBEDTLS_PSA_ACCEL_KEY_TYPE_RSA_PUBLIC_KEY */ +#endif /* PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY */ + +/* If any of the block modes are requested that don't have an + * associated HW assist, define PSA_HAVE_SOFT_BLOCK_MODE for checking + * in the block cipher key types. */ +#if (defined(PSA_WANT_ALG_CTR) && !defined(MBEDTLS_PSA_ACCEL_ALG_CTR)) || \ + (defined(PSA_WANT_ALG_CFB) && !defined(MBEDTLS_PSA_ACCEL_ALG_CFB)) || \ + (defined(PSA_WANT_ALG_OFB) && !defined(MBEDTLS_PSA_ACCEL_ALG_OFB)) || \ + defined(PSA_WANT_ALG_ECB_NO_PADDING) || \ + (defined(PSA_WANT_ALG_CBC_NO_PADDING) && \ + !defined(MBEDTLS_PSA_ACCEL_ALG_CBC_NO_PADDING)) || \ + (defined(PSA_WANT_ALG_CBC_PKCS7) && \ + !defined(MBEDTLS_PSA_ACCEL_ALG_CBC_PKCS7)) || \ + (defined(PSA_WANT_ALG_CMAC) && !defined(MBEDTLS_PSA_ACCEL_ALG_CMAC)) +#define PSA_HAVE_SOFT_BLOCK_MODE 1 +#endif + +#if (defined(PSA_WANT_ALG_GCM) && !defined(MBEDTLS_PSA_ACCEL_ALG_GCM)) || \ + (defined(PSA_WANT_ALG_CCM) && !defined(MBEDTLS_PSA_ACCEL_ALG_CCM)) +#define PSA_HAVE_SOFT_BLOCK_AEAD 1 +#endif + +#if defined(PSA_WANT_KEY_TYPE_AES) +#if !defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_AES) +#define PSA_HAVE_SOFT_KEY_TYPE_AES 1 +#endif /* !MBEDTLS_PSA_ACCEL_KEY_TYPE_AES */ +#if defined(PSA_HAVE_SOFT_KEY_TYPE_AES) || \ + defined(PSA_HAVE_SOFT_BLOCK_MODE) || \ + defined(PSA_HAVE_SOFT_BLOCK_AEAD) +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_AES 1 +#define MBEDTLS_AES_C +#endif /* PSA_HAVE_SOFT_KEY_TYPE_AES || PSA_HAVE_SOFT_BLOCK_MODE */ +#endif /* PSA_WANT_KEY_TYPE_AES */ + +#if defined(PSA_WANT_KEY_TYPE_ARC4) +#if !defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_ARC4) +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_ARC4 1 +#define MBEDTLS_ARC4_C +#endif /*!MBEDTLS_PSA_ACCEL_KEY_TYPE_ARC4 */ +#endif /* PSA_WANT_KEY_TYPE_ARC4 */ + +#if defined(PSA_WANT_KEY_TYPE_ARIA) +#if !defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_ARIA) +#define PSA_HAVE_SOFT_KEY_TYPE_ARIA 1 +#endif /* !MBEDTLS_PSA_ACCEL_KEY_TYPE_ARIA */ +#if defined(PSA_HAVE_SOFT_KEY_TYPE_ARIA) || \ + defined(PSA_HAVE_SOFT_BLOCK_MODE) || \ + defined(PSA_HAVE_SOFT_BLOCK_AEAD) +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_ARIA 1 +#define MBEDTLS_ARIA_C +#endif /* PSA_HAVE_SOFT_KEY_TYPE_ARIA || PSA_HAVE_SOFT_BLOCK_MODE */ +#endif /* PSA_WANT_KEY_TYPE_ARIA */ + +#if defined(PSA_WANT_KEY_TYPE_CAMELLIA) +#if !defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_CAMELLIA) +#define PSA_HAVE_SOFT_KEY_TYPE_CAMELLIA 1 +#endif /* !MBEDTLS_PSA_ACCEL_KEY_TYPE_CAMELLIA */ +#if defined(PSA_HAVE_SOFT_KEY_TYPE_CAMELLIA) || \ + defined(PSA_HAVE_SOFT_BLOCK_MODE) || \ + defined(PSA_HAVE_SOFT_BLOCK_AEAD) +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_CAMELLIA 1 +#define MBEDTLS_CAMELLIA_C +#endif /* PSA_HAVE_SOFT_KEY_TYPE_CAMELLIA || PSA_HAVE_SOFT_BLOCK_MODE */ +#endif /* PSA_WANT_KEY_TYPE_CAMELLIA */ + +#if defined(PSA_WANT_KEY_TYPE_DES) +#if !defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_DES) +#define PSA_HAVE_SOFT_KEY_TYPE_DES 1 +#endif /* !MBEDTLS_PSA_ACCEL_KEY_TYPE_DES */ +#if defined(PSA_HAVE_SOFT_KEY_TYPE_DES) || \ + defined(PSA_HAVE_SOFT_BLOCK_MODE) +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES 1 +#define MBEDTLS_DES_C +#endif /*PSA_HAVE_SOFT_KEY_TYPE_DES || PSA_HAVE_SOFT_BLOCK_MODE */ +#endif /* PSA_WANT_KEY_TYPE_DES */ + +#if defined(PSA_WANT_KEY_TYPE_CHACHA20) +#if !defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_CHACHA20) +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_CHACHA20 1 +#define MBEDTLS_CHACHA20_C +#endif /*!MBEDTLS_PSA_ACCEL_KEY_TYPE_CHACHA20 */ +#endif /* PSA_WANT_KEY_TYPE_CHACHA20 */ + +/* If any of the software block ciphers are selected, define + * PSA_HAVE_SOFT_BLOCK_CIPHER, which can be used in any of these + * situations. */ +#if defined(PSA_HAVE_SOFT_KEY_TYPE_AES) || \ + defined(PSA_HAVE_SOFT_KEY_TYPE_ARIA) || \ + defined(PSA_HAVE_SOFT_KEY_TYPE_DES) || \ + defined(PSA_HAVE_SOFT_KEY_TYPE_CAMELLIA) +#define PSA_HAVE_SOFT_BLOCK_CIPHER 1 +#endif + +#if defined(PSA_WANT_ALG_STREAM_CIPHER) +#define MBEDTLS_PSA_BUILTIN_ALG_STREAM_CIPHER 1 +#endif /* PSA_WANT_ALG_STREAM_CIPHER */ + +#if defined(PSA_WANT_ALG_CBC_MAC) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_CBC_MAC) +#error "CBC-MAC is not yet supported via the PSA API in Mbed TLS." +#define MBEDTLS_PSA_BUILTIN_ALG_CBC_MAC 1 +#endif /* !MBEDTLS_PSA_ACCEL_ALG_CBC_MAC */ +#endif /* PSA_WANT_ALG_CBC_MAC */ + +#if defined(PSA_WANT_ALG_CMAC) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_CMAC) || \ + defined(PSA_HAVE_SOFT_BLOCK_CIPHER) +#define MBEDTLS_PSA_BUILTIN_ALG_CMAC 1 +#define MBEDTLS_CMAC_C +#endif /* !MBEDTLS_PSA_ACCEL_ALG_CMAC */ +#endif /* PSA_WANT_ALG_CMAC */ + +#if defined(PSA_WANT_ALG_CTR) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_CTR) || \ + defined(PSA_HAVE_SOFT_BLOCK_CIPHER) +#define MBEDTLS_PSA_BUILTIN_ALG_CTR 1 +#define MBEDTLS_CIPHER_MODE_CTR +#endif +#endif /* PSA_WANT_ALG_CTR */ + +#if defined(PSA_WANT_ALG_CFB) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_CFB) || \ + defined(PSA_HAVE_SOFT_BLOCK_CIPHER) +#define MBEDTLS_PSA_BUILTIN_ALG_CFB 1 +#define MBEDTLS_CIPHER_MODE_CFB +#endif +#endif /* PSA_WANT_ALG_CFB */ + +#if defined(PSA_WANT_ALG_OFB) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_OFB) || \ + defined(PSA_HAVE_SOFT_BLOCK_CIPHER) +#define MBEDTLS_PSA_BUILTIN_ALG_OFB 1 +#define MBEDTLS_CIPHER_MODE_OFB +#endif +#endif /* PSA_WANT_ALG_OFB */ + +#if defined(PSA_WANT_ALG_ECB_NO_PADDING) && \ + !defined(MBEDTLS_PSA_ACCEL_ALG_ECB_NO_PADDING) +#define MBEDTLS_PSA_BUILTIN_ALG_ECB_NO_PADDING 1 +#endif + +#if defined(PSA_WANT_ALG_CBC_NO_PADDING) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_CBC_NO_PADDING) || \ + defined(PSA_HAVE_SOFT_BLOCK_CIPHER) +#define MBEDTLS_CIPHER_MODE_CBC +#define MBEDTLS_PSA_BUILTIN_ALG_CBC_NO_PADDING 1 +#endif +#endif /* PSA_WANT_ALG_CBC_NO_PADDING */ + +#if defined(PSA_WANT_ALG_CBC_PKCS7) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_CBC_PKCS7) || \ + defined(PSA_HAVE_SOFT_BLOCK_CIPHER) +#define MBEDTLS_CIPHER_MODE_CBC +#define MBEDTLS_PSA_BUILTIN_ALG_CBC_PKCS7 1 +#define MBEDTLS_CIPHER_PADDING_PKCS7 +#endif +#endif /* PSA_WANT_ALG_CBC_PKCS7 */ + +#if defined(PSA_WANT_ALG_CCM) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_CCM) || \ + defined(PSA_HAVE_SOFT_KEY_TYPE_AES) || \ + defined(PSA_HAVE_SOFT_KEY_TYPE_ARIA) || \ + defined(PSA_HAVE_SOFT_KEY_TYPE_CAMELLIA) +#define MBEDTLS_PSA_BUILTIN_ALG_CCM 1 +#define MBEDTLS_CCM_C +#endif +#endif /* PSA_WANT_ALG_CCM */ + +#if defined(PSA_WANT_ALG_GCM) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_GCM) || \ + defined(PSA_HAVE_SOFT_KEY_TYPE_AES) || \ + defined(PSA_HAVE_SOFT_KEY_TYPE_ARIA) || \ + defined(PSA_HAVE_SOFT_KEY_TYPE_CAMELLIA) +#define MBEDTLS_PSA_BUILTIN_ALG_GCM 1 +#define MBEDTLS_GCM_C +#endif +#endif /* PSA_WANT_ALG_GCM */ + +#if defined(PSA_WANT_ALG_CHACHA20_POLY1305) +#if !defined(MBEDTLS_PSA_ACCEL_ALG_CHACHA20_POLY1305) +#if defined(PSA_WANT_KEY_TYPE_CHACHA20) +#define MBEDTLS_CHACHAPOLY_C +#define MBEDTLS_CHACHA20_C +#define MBEDTLS_POLY1305_C +#define MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305 1 +#endif /* PSA_WANT_KEY_TYPE_CHACHA20 */ +#endif /* !MBEDTLS_PSA_ACCEL_ALG_CHACHA20_POLY1305 */ +#endif /* PSA_WANT_ALG_CHACHA20_POLY1305 */ + +#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256) +#if !defined(MBEDTLS_PSA_ACCEL_ECC_BRAINPOOL_P_R1_256) +#define MBEDTLS_ECP_DP_BP256R1_ENABLED +#define MBEDTLS_PSA_BUILTIN_ECC_BRAINPOOL_P_R1_256 1 +#endif /* !MBEDTLS_PSA_ACCEL_ECC_BRAINPOOL_P_R1_256 */ +#endif /* PSA_WANT_ECC_BRAINPOOL_P_R1_256 */ + +#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384) +#if !defined(MBEDTLS_PSA_ACCEL_ECC_BRAINPOOL_P_R1_384) +#define MBEDTLS_ECP_DP_BP384R1_ENABLED +#define MBEDTLS_PSA_BUILTIN_ECC_BRAINPOOL_P_R1_384 1 +#endif /* !MBEDTLS_PSA_ACCEL_ECC_BRAINPOOL_P_R1_384 */ +#endif /* PSA_WANT_ECC_BRAINPOOL_P_R1_384 */ + +#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512) +#if !defined(MBEDTLS_PSA_ACCEL_ECC_BRAINPOOL_P_R1_512) +#define MBEDTLS_ECP_DP_BP512R1_ENABLED +#define MBEDTLS_PSA_BUILTIN_ECC_BRAINPOOL_P_R1_512 1 +#endif /* !MBEDTLS_PSA_ACCEL_ECC_BRAINPOOL_P_R1_512 */ +#endif /* PSA_WANT_ECC_BRAINPOOL_P_R1_512 */ + +#if defined(PSA_WANT_ECC_MONTGOMERY_255) +#if !defined(MBEDTLS_PSA_ACCEL_ECC_MONTGOMERY_255) +#define MBEDTLS_ECP_DP_CURVE25519_ENABLED +#define MBEDTLS_PSA_BUILTIN_ECC_MONTGOMERY_255 1 +#endif /* !MBEDTLS_PSA_ACCEL_ECC_MONTGOMERY_255 */ +#endif /* PSA_WANT_ECC_MONTGOMERY_255 */ + +#if defined(PSA_WANT_ECC_MONTGOMERY_448) +#if !defined(MBEDTLS_PSA_ACCEL_ECC_MONTGOMERY_448) +/* + * Curve448 is not yet supported via the PSA API in Mbed TLS + * (https://github.com/Mbed-TLS/mbedtls/issues/4249). + */ +#error "Curve448 is not yet supported via the PSA API in Mbed TLS." +#define MBEDTLS_ECP_DP_CURVE448_ENABLED +#define MBEDTLS_PSA_BUILTIN_ECC_MONTGOMERY_448 1 +#endif /* !MBEDTLS_PSA_ACCEL_ECC_MONTGOMERY_448 */ +#endif /* PSA_WANT_ECC_MONTGOMERY_448 */ + +#if defined(PSA_WANT_ECC_SECP_R1_192) +#if !defined(MBEDTLS_PSA_ACCEL_ECC_SECP_R1_192) +#define MBEDTLS_ECP_DP_SECP192R1_ENABLED +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_R1_192 1 +#endif /* !MBEDTLS_PSA_ACCEL_ECC_SECP_R1_192 */ +#endif /* PSA_WANT_ECC_SECP_R1_192 */ + +#if defined(PSA_WANT_ECC_SECP_R1_224) +#if !defined(MBEDTLS_PSA_ACCEL_ECC_SECP_R1_224) +#define MBEDTLS_ECP_DP_SECP224R1_ENABLED +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_R1_224 1 +#endif /* !MBEDTLS_PSA_ACCEL_ECC_SECP_R1_224 */ +#endif /* PSA_WANT_ECC_SECP_R1_224 */ + +#if defined(PSA_WANT_ECC_SECP_R1_256) +#if !defined(MBEDTLS_PSA_ACCEL_ECC_SECP_R1_256) +#define MBEDTLS_ECP_DP_SECP256R1_ENABLED +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_R1_256 1 +#endif /* !MBEDTLS_PSA_ACCEL_ECC_SECP_R1_256 */ +#endif /* PSA_WANT_ECC_SECP_R1_256 */ + +#if defined(PSA_WANT_ECC_SECP_R1_384) +#if !defined(MBEDTLS_PSA_ACCEL_ECC_SECP_R1_384) +#define MBEDTLS_ECP_DP_SECP384R1_ENABLED +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_R1_384 1 +#endif /* !MBEDTLS_PSA_ACCEL_ECC_SECP_R1_384 */ +#endif /* PSA_WANT_ECC_SECP_R1_384 */ + +#if defined(PSA_WANT_ECC_SECP_R1_521) +#if !defined(MBEDTLS_PSA_ACCEL_ECC_SECP_R1_521) +#define MBEDTLS_ECP_DP_SECP521R1_ENABLED +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_R1_521 1 +#endif /* !MBEDTLS_PSA_ACCEL_ECC_SECP_R1_521 */ +#endif /* PSA_WANT_ECC_SECP_R1_521 */ + +#if defined(PSA_WANT_ECC_SECP_K1_192) +#if !defined(MBEDTLS_PSA_ACCEL_ECC_SECP_K1_192) +#define MBEDTLS_ECP_DP_SECP192K1_ENABLED +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_K1_192 1 +#endif /* !MBEDTLS_PSA_ACCEL_ECC_SECP_K1_192 */ +#endif /* PSA_WANT_ECC_SECP_K1_192 */ + +#if defined(PSA_WANT_ECC_SECP_K1_224) +#if !defined(MBEDTLS_PSA_ACCEL_ECC_SECP_K1_224) +/* + * SECP224K1 is buggy via the PSA API in Mbed TLS + * (https://github.com/Mbed-TLS/mbedtls/issues/3541). + */ +#error "SECP224K1 is buggy via the PSA API in Mbed TLS." +#define MBEDTLS_ECP_DP_SECP224K1_ENABLED +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_K1_224 1 +#endif /* !MBEDTLS_PSA_ACCEL_ECC_SECP_K1_224 */ +#endif /* PSA_WANT_ECC_SECP_K1_224 */ + +#if defined(PSA_WANT_ECC_SECP_K1_256) +#if !defined(MBEDTLS_PSA_ACCEL_ECC_SECP_K1_256) +#define MBEDTLS_ECP_DP_SECP256K1_ENABLED +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_K1_256 1 +#endif /* !MBEDTLS_PSA_ACCEL_ECC_SECP_K1_256 */ +#endif /* PSA_WANT_ECC_SECP_K1_256 */ + + + +/****************************************************************/ +/* Infer PSA requirements from Mbed TLS capabilities */ +/****************************************************************/ + +#else /* MBEDTLS_PSA_CRYPTO_CONFIG */ + +/* + * Ensure PSA_WANT_* defines are setup properly if MBEDTLS_PSA_CRYPTO_CONFIG + * is not defined + */ + +#if defined(MBEDTLS_CCM_C) +#define MBEDTLS_PSA_BUILTIN_ALG_CCM 1 +#define PSA_WANT_ALG_CCM 1 +#endif /* MBEDTLS_CCM_C */ + +#if defined(MBEDTLS_CMAC_C) +#define MBEDTLS_PSA_BUILTIN_ALG_CMAC 1 +#define PSA_WANT_ALG_CMAC 1 +#endif /* MBEDTLS_CMAC_C */ + +#if defined(MBEDTLS_ECDH_C) +#define MBEDTLS_PSA_BUILTIN_ALG_ECDH 1 +#define PSA_WANT_ALG_ECDH 1 +#endif /* MBEDTLS_ECDH_C */ + +#if defined(MBEDTLS_ECDSA_C) +#define MBEDTLS_PSA_BUILTIN_ALG_ECDSA 1 +#define PSA_WANT_ALG_ECDSA 1 +#define PSA_WANT_ALG_ECDSA_ANY 1 + +// Only add in DETERMINISTIC support if ECDSA is also enabled +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) +#define MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA 1 +#define PSA_WANT_ALG_DETERMINISTIC_ECDSA 1 +#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ + +#endif /* MBEDTLS_ECDSA_C */ + +#if defined(MBEDTLS_ECP_C) +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR 1 +#define PSA_WANT_KEY_TYPE_ECC_KEY_PAIR 1 +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY 1 +#define PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY 1 +#endif /* MBEDTLS_ECP_C */ + +#if defined(MBEDTLS_GCM_C) +#define MBEDTLS_PSA_BUILTIN_ALG_GCM 1 +#define PSA_WANT_ALG_GCM 1 +#endif /* MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_HKDF_C) +#define MBEDTLS_PSA_BUILTIN_ALG_HMAC 1 +#define PSA_WANT_ALG_HMAC 1 +#define MBEDTLS_PSA_BUILTIN_ALG_HKDF 1 +#define PSA_WANT_ALG_HKDF 1 +#endif /* MBEDTLS_HKDF_C */ + +#if defined(MBEDTLS_MD_C) +#define MBEDTLS_PSA_BUILTIN_ALG_HMAC 1 +#define PSA_WANT_ALG_HMAC 1 +#define PSA_WANT_KEY_TYPE_HMAC 1 +#define MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF 1 +#define PSA_WANT_ALG_TLS12_PRF 1 +#define MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS 1 +#define PSA_WANT_ALG_TLS12_PSK_TO_MS 1 +#endif /* MBEDTLS_MD_C */ + +#if defined(MBEDTLS_MD2_C) +#define MBEDTLS_PSA_BUILTIN_ALG_MD2 1 +#define PSA_WANT_ALG_MD2 1 +#endif + +#if defined(MBEDTLS_MD4_C) +#define MBEDTLS_PSA_BUILTIN_ALG_MD4 1 +#define PSA_WANT_ALG_MD4 1 +#endif + +#if defined(MBEDTLS_MD5_C) +#define MBEDTLS_PSA_BUILTIN_ALG_MD5 1 +#define PSA_WANT_ALG_MD5 1 +#endif + +#if defined(MBEDTLS_RIPEMD160_C) +#define MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160 1 +#define PSA_WANT_ALG_RIPEMD160 1 +#endif + +#if defined(MBEDTLS_RSA_C) +#if defined(MBEDTLS_PKCS1_V15) +#define MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT 1 +#define PSA_WANT_ALG_RSA_PKCS1V15_CRYPT 1 +#define MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN 1 +#define PSA_WANT_ALG_RSA_PKCS1V15_SIGN 1 +#define PSA_WANT_ALG_RSA_PKCS1V15_SIGN_RAW 1 +#endif /* MBEDTLS_PKCS1_V15 */ +#if defined(MBEDTLS_PKCS1_V21) +#define MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP 1 +#define PSA_WANT_ALG_RSA_OAEP 1 +#define MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS 1 +#define PSA_WANT_ALG_RSA_PSS 1 +#endif /* MBEDTLS_PKCS1_V21 */ +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR 1 +#define PSA_WANT_KEY_TYPE_RSA_KEY_PAIR 1 +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY 1 +#define PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY 1 +#endif /* MBEDTLS_RSA_C */ + +#if defined(MBEDTLS_SHA1_C) +#define MBEDTLS_PSA_BUILTIN_ALG_SHA_1 1 +#define PSA_WANT_ALG_SHA_1 1 +#endif + +#if defined(MBEDTLS_SHA256_C) +#define MBEDTLS_PSA_BUILTIN_ALG_SHA_224 1 +#define MBEDTLS_PSA_BUILTIN_ALG_SHA_256 1 +#define PSA_WANT_ALG_SHA_224 1 +#define PSA_WANT_ALG_SHA_256 1 +#endif + +#if defined(MBEDTLS_SHA512_C) +#if !defined(MBEDTLS_SHA512_NO_SHA384) +#define MBEDTLS_PSA_BUILTIN_ALG_SHA_384 1 +#define PSA_WANT_ALG_SHA_384 1 +#endif +#define MBEDTLS_PSA_BUILTIN_ALG_SHA_512 1 +#define PSA_WANT_ALG_SHA_512 1 +#endif + +#if defined(MBEDTLS_AES_C) +#define PSA_WANT_KEY_TYPE_AES 1 +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_AES 1 +#endif + +#if defined(MBEDTLS_ARC4_C) +#define PSA_WANT_KEY_TYPE_ARC4 1 +#define PSA_WANT_ALG_STREAM_CIPHER 1 +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_ARC4 1 +#define MBEDTLS_PSA_BUILTIN_ALG_STREAM_CIPHER 1 +#endif + +#if defined(MBEDTLS_ARIA_C) +#define PSA_WANT_KEY_TYPE_ARIA 1 +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_ARIA 1 +#endif + +#if defined(MBEDTLS_CAMELLIA_C) +#define PSA_WANT_KEY_TYPE_CAMELLIA 1 +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_CAMELLIA 1 +#endif + +#if defined(MBEDTLS_DES_C) +#define PSA_WANT_KEY_TYPE_DES 1 +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES 1 +#endif + +#if defined(MBEDTLS_CHACHA20_C) +#define PSA_WANT_KEY_TYPE_CHACHA20 1 +#define PSA_WANT_ALG_STREAM_CIPHER 1 +#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_CHACHA20 1 +#define MBEDTLS_PSA_BUILTIN_ALG_STREAM_CIPHER 1 +#if defined(MBEDTLS_CHACHAPOLY_C) +#define PSA_WANT_ALG_CHACHA20_POLY1305 1 +#define MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305 1 +#endif +#endif + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#define MBEDTLS_PSA_BUILTIN_ALG_CBC_NO_PADDING 1 +#define PSA_WANT_ALG_CBC_NO_PADDING 1 +#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) +#define MBEDTLS_PSA_BUILTIN_ALG_CBC_PKCS7 1 +#define PSA_WANT_ALG_CBC_PKCS7 1 +#endif +#endif + +#if defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C) || \ + defined(MBEDTLS_ARIA_C) || defined(MBEDTLS_CAMELLIA_C) +#define MBEDTLS_PSA_BUILTIN_ALG_ECB_NO_PADDING 1 +#define PSA_WANT_ALG_ECB_NO_PADDING 1 +#endif + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +#define MBEDTLS_PSA_BUILTIN_ALG_CFB 1 +#define PSA_WANT_ALG_CFB 1 +#endif + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +#define MBEDTLS_PSA_BUILTIN_ALG_CTR 1 +#define PSA_WANT_ALG_CTR 1 +#endif + +#if defined(MBEDTLS_CIPHER_MODE_OFB) +#define MBEDTLS_PSA_BUILTIN_ALG_OFB 1 +#define PSA_WANT_ALG_OFB 1 +#endif + +#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) +#define MBEDTLS_PSA_BUILTIN_ECC_BRAINPOOL_P_R1_256 1 +#define PSA_WANT_ECC_BRAINPOOL_P_R1_256 1 +#endif + +#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) +#define MBEDTLS_PSA_BUILTIN_ECC_BRAINPOOL_P_R1_384 1 +#define PSA_WANT_ECC_BRAINPOOL_P_R1_384 1 +#endif + +#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) +#define MBEDTLS_PSA_BUILTIN_ECC_BRAINPOOL_P_R1_512 1 +#define PSA_WANT_ECC_BRAINPOOL_P_R1_512 1 +#endif + +#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) +#define MBEDTLS_PSA_BUILTIN_ECC_MONTGOMERY_255 1 +#define PSA_WANT_ECC_MONTGOMERY_255 1 +#endif + +/* Curve448 is not yet supported via the PSA API (https://github.com/Mbed-TLS/mbedtls/issues/4249) */ +#if 0 && defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) +#define MBEDTLS_PSA_BUILTIN_ECC_MONTGOMERY_448 1 +#define PSA_WANT_ECC_MONTGOMERY_448 1 +#endif + +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_R1_192 1 +#define PSA_WANT_ECC_SECP_R1_192 1 +#endif + +#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_R1_224 1 +#define PSA_WANT_ECC_SECP_R1_224 1 +#endif + +#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_R1_256 1 +#define PSA_WANT_ECC_SECP_R1_256 1 +#endif + +#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_R1_384 1 +#define PSA_WANT_ECC_SECP_R1_384 1 +#endif + +#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_R1_521 1 +#define PSA_WANT_ECC_SECP_R1_521 1 +#endif + +#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_K1_192 1 +#define PSA_WANT_ECC_SECP_K1_192 1 +#endif + +/* SECP224K1 is buggy via the PSA API (https://github.com/Mbed-TLS/mbedtls/issues/3541) */ +#if 0 && defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_K1_224 1 +#define PSA_WANT_ECC_SECP_K1_224 1 +#endif + +#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) +#define MBEDTLS_PSA_BUILTIN_ECC_SECP_K1_256 1 +#define PSA_WANT_ECC_SECP_K1_256 1 +#endif + +#endif /* MBEDTLS_PSA_CRYPTO_CONFIG */ + +/* These features are always enabled. */ +#define PSA_WANT_KEY_TYPE_DERIVE 1 +#define PSA_WANT_KEY_TYPE_RAW_DATA 1 + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_CONFIG_PSA_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/constant_time.h b/ext/opcua_client/mbedtls/include/mbedtls/constant_time.h new file mode 100644 index 0000000..7226ae1 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/constant_time.h @@ -0,0 +1,33 @@ +/** + * Constant-time functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_CONSTANT_TIME_H +#define MBEDTLS_CONSTANT_TIME_H + +#include + + +/** Constant-time buffer comparison without branches. + * + * This is equivalent to the standard memcmp function, but is likely to be + * compiled to code using bitwise operation rather than a branch. + * + * This function can be used to write constant-time code by replacing branches + * with bit operations using masks. + * + * \param a Pointer to the first buffer. + * \param b Pointer to the second buffer. + * \param n The number of bytes to compare in the buffer. + * + * \return Zero if the content of the two buffer is the same, + * otherwise non-zero. + */ +int mbedtls_ct_memcmp(const void *a, + const void *b, + size_t n); + +#endif /* MBEDTLS_CONSTANT_TIME_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ctr_drbg.h b/ext/opcua_client/mbedtls/include/mbedtls/ctr_drbg.h new file mode 100644 index 0000000..eb72f9e --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ctr_drbg.h @@ -0,0 +1,598 @@ +/** + * \file ctr_drbg.h + * + * \brief This file contains definitions and functions for the + * CTR_DRBG pseudorandom generator. + * + * CTR_DRBG is a standardized way of building a PRNG from a block-cipher + * in counter mode operation, as defined in NIST SP 800-90A: + * Recommendation for Random Number Generation Using Deterministic Random + * Bit Generators. + * + * The Mbed TLS implementation of CTR_DRBG uses AES-256 (default) or AES-128 + * (if \c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is enabled at compile time) + * as the underlying block cipher, with a derivation function. + * + * The security strength as defined in NIST SP 800-90A is + * 128 bits when AES-128 is used (\c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY enabled) + * and 256 bits otherwise, provided that #MBEDTLS_CTR_DRBG_ENTROPY_LEN is + * kept at its default value (and not overridden in config.h) and that the + * DRBG instance is set up with default parameters. + * See the documentation of mbedtls_ctr_drbg_seed() for more + * information. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_CTR_DRBG_H +#define MBEDTLS_CTR_DRBG_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/aes.h" + +#if defined(MBEDTLS_THREADING_C) +#include "mbedtls/threading.h" +#endif + +/** The entropy source failed. */ +#define MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED -0x0034 +/** The requested random buffer length is too big. */ +#define MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG -0x0036 +/** The input (entropy + additional data) is too large. */ +#define MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG -0x0038 +/** Read or write error in file. */ +#define MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR -0x003A + +#define MBEDTLS_CTR_DRBG_BLOCKSIZE 16 /**< The block size used by the cipher. */ + +#if defined(MBEDTLS_CTR_DRBG_USE_128_BIT_KEY) +#define MBEDTLS_CTR_DRBG_KEYSIZE 16 +/**< The key size in bytes used by the cipher. + * + * Compile-time choice: 16 bytes (128 bits) + * because #MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is enabled. + */ +#else +#define MBEDTLS_CTR_DRBG_KEYSIZE 32 +/**< The key size in bytes used by the cipher. + * + * Compile-time choice: 32 bytes (256 bits) + * because \c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is disabled. + */ +#endif + +#define MBEDTLS_CTR_DRBG_KEYBITS (MBEDTLS_CTR_DRBG_KEYSIZE * 8) /**< The key size for the DRBG operation, in bits. */ +#define MBEDTLS_CTR_DRBG_SEEDLEN (MBEDTLS_CTR_DRBG_KEYSIZE + MBEDTLS_CTR_DRBG_BLOCKSIZE) /**< The seed length, calculated as (counter + AES key). */ + +/** + * \name SECTION: Module settings + * + * The configuration options you can set for this module are in this section. + * Either change them in config.h or define them using the compiler command + * line. + * \{ + */ + +/** \def MBEDTLS_CTR_DRBG_ENTROPY_LEN + * + * \brief The amount of entropy used per seed by default, in bytes. + */ +#if !defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) +/** This is 48 bytes because the entropy module uses SHA-512 + * (\c MBEDTLS_ENTROPY_FORCE_SHA256 is disabled). + */ +#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 48 + +#else /* defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) */ + +/** This is 32 bytes because the entropy module uses SHA-256 + * (the SHA512 module is disabled or + * \c MBEDTLS_ENTROPY_FORCE_SHA256 is enabled). + */ +#if !defined(MBEDTLS_CTR_DRBG_USE_128_BIT_KEY) +/** \warning To achieve a 256-bit security strength, you must pass a nonce + * to mbedtls_ctr_drbg_seed(). + */ +#endif /* !defined(MBEDTLS_CTR_DRBG_USE_128_BIT_KEY) */ +#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 32 +#endif /* defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) */ +#endif /* !defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) */ + +#if !defined(MBEDTLS_CTR_DRBG_RESEED_INTERVAL) +#define MBEDTLS_CTR_DRBG_RESEED_INTERVAL 10000 +/**< The interval before reseed is performed by default. */ +#endif + +#if !defined(MBEDTLS_CTR_DRBG_MAX_INPUT) +#define MBEDTLS_CTR_DRBG_MAX_INPUT 256 +/**< The maximum number of additional input Bytes. */ +#endif + +#if !defined(MBEDTLS_CTR_DRBG_MAX_REQUEST) +#define MBEDTLS_CTR_DRBG_MAX_REQUEST 1024 +/**< The maximum number of requested Bytes per call. */ +#endif + +#if !defined(MBEDTLS_CTR_DRBG_MAX_SEED_INPUT) +#define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT 384 +/**< The maximum size of seed or reseed buffer in bytes. */ +#endif + +/** \} name SECTION: Module settings */ + +#define MBEDTLS_CTR_DRBG_PR_OFF 0 +/**< Prediction resistance is disabled. */ +#define MBEDTLS_CTR_DRBG_PR_ON 1 +/**< Prediction resistance is enabled. */ + +#ifdef __cplusplus +extern "C" { +#endif + +#if MBEDTLS_CTR_DRBG_ENTROPY_LEN >= MBEDTLS_CTR_DRBG_KEYSIZE * 3 / 2 +/** The default length of the nonce read from the entropy source. + * + * This is \c 0 because a single read from the entropy source is sufficient + * to include a nonce. + * See the documentation of mbedtls_ctr_drbg_seed() for more information. + */ +#define MBEDTLS_CTR_DRBG_ENTROPY_NONCE_LEN 0 +#else +/** The default length of the nonce read from the entropy source. + * + * This is half of the default entropy length because a single read from + * the entropy source does not provide enough material to form a nonce. + * See the documentation of mbedtls_ctr_drbg_seed() for more information. + */ +#define MBEDTLS_CTR_DRBG_ENTROPY_NONCE_LEN (MBEDTLS_CTR_DRBG_ENTROPY_LEN + 1) / 2 +#endif + +/** + * \brief The CTR_DRBG context structure. + */ +typedef struct mbedtls_ctr_drbg_context { + unsigned char counter[16]; /*!< The counter (V). */ + int reseed_counter; /*!< The reseed counter. + * This is the number of requests that have + * been made since the last (re)seeding, + * minus one. + * Before the initial seeding, this field + * contains the amount of entropy in bytes + * to use as a nonce for the initial seeding, + * or -1 if no nonce length has been explicitly + * set (see mbedtls_ctr_drbg_set_nonce_len()). + */ + int prediction_resistance; /*!< This determines whether prediction + resistance is enabled, that is + whether to systematically reseed before + each random generation. */ + size_t entropy_len; /*!< The amount of entropy grabbed on each + seed or reseed operation, in bytes. */ + int reseed_interval; /*!< The reseed interval. + * This is the maximum number of requests + * that can be made between reseedings. */ + + mbedtls_aes_context aes_ctx; /*!< The AES context. */ + + /* + * Callbacks (Entropy) + */ + int (*f_entropy)(void *, unsigned char *, size_t); + /*!< The entropy callback function. */ + + void *p_entropy; /*!< The context for the entropy function. */ + +#if defined(MBEDTLS_THREADING_C) + /* Invariant: the mutex is initialized if and only if f_entropy != NULL. + * This means that the mutex is initialized during the initial seeding + * in mbedtls_ctr_drbg_seed() and freed in mbedtls_ctr_drbg_free(). + * + * Note that this invariant may change without notice. Do not rely on it + * and do not access the mutex directly in application code. + */ + mbedtls_threading_mutex_t mutex; +#endif +} +mbedtls_ctr_drbg_context; + +/** + * \brief This function initializes the CTR_DRBG context, + * and prepares it for mbedtls_ctr_drbg_seed() + * or mbedtls_ctr_drbg_free(). + * + * \note The reseed interval is + * #MBEDTLS_CTR_DRBG_RESEED_INTERVAL by default. + * You can override it by calling + * mbedtls_ctr_drbg_set_reseed_interval(). + * + * \param ctx The CTR_DRBG context to initialize. + */ +void mbedtls_ctr_drbg_init(mbedtls_ctr_drbg_context *ctx); + +/** + * \brief This function seeds and sets up the CTR_DRBG + * entropy source for future reseeds. + * + * A typical choice for the \p f_entropy and \p p_entropy parameters is + * to use the entropy module: + * - \p f_entropy is mbedtls_entropy_func(); + * - \p p_entropy is an instance of ::mbedtls_entropy_context initialized + * with mbedtls_entropy_init() (which registers the platform's default + * entropy sources). + * + * The entropy length is #MBEDTLS_CTR_DRBG_ENTROPY_LEN by default. + * You can override it by calling mbedtls_ctr_drbg_set_entropy_len(). + * + * The entropy nonce length is: + * - \c 0 if the entropy length is at least 3/2 times the entropy length, + * which guarantees that the security strength is the maximum permitted + * by the key size and entropy length according to NIST SP 800-90A §10.2.1; + * - Half the entropy length otherwise. + * You can override it by calling mbedtls_ctr_drbg_set_nonce_len(). + * With the default entropy length, the entropy nonce length is + * #MBEDTLS_CTR_DRBG_ENTROPY_NONCE_LEN. + * + * You can provide a nonce and personalization string in addition to the + * entropy source, to make this instantiation as unique as possible. + * See SP 800-90A §8.6.7 for more details about nonces. + * + * The _seed_material_ value passed to the derivation function in + * the CTR_DRBG Instantiate Process described in NIST SP 800-90A §10.2.1.3.2 + * is the concatenation of the following strings: + * - A string obtained by calling \p f_entropy function for the entropy + * length. + */ +#if MBEDTLS_CTR_DRBG_ENTROPY_NONCE_LEN == 0 +/** + * - If mbedtls_ctr_drbg_set_nonce_len() has been called, a string + * obtained by calling \p f_entropy function for the specified length. + */ +#else +/** + * - A string obtained by calling \p f_entropy function for the entropy nonce + * length. If the entropy nonce length is \c 0, this function does not + * make a second call to \p f_entropy. + */ +#endif +#if defined(MBEDTLS_THREADING_C) +/** + * \note When Mbed TLS is built with threading support, + * after this function returns successfully, + * it is safe to call mbedtls_ctr_drbg_random() + * from multiple threads. Other operations, including + * reseeding, are not thread-safe. + */ +#endif /* MBEDTLS_THREADING_C */ +/** + * - The \p custom string. + * + * \note To achieve the nominal security strength permitted + * by CTR_DRBG, the entropy length must be: + * - at least 16 bytes for a 128-bit strength + * (maximum achievable strength when using AES-128); + * - at least 32 bytes for a 256-bit strength + * (maximum achievable strength when using AES-256). + * + * In addition, if you do not pass a nonce in \p custom, + * the sum of the entropy length + * and the entropy nonce length must be: + * - at least 24 bytes for a 128-bit strength + * (maximum achievable strength when using AES-128); + * - at least 48 bytes for a 256-bit strength + * (maximum achievable strength when using AES-256). + * + * \param ctx The CTR_DRBG context to seed. + * It must have been initialized with + * mbedtls_ctr_drbg_init(). + * After a successful call to mbedtls_ctr_drbg_seed(), + * you may not call mbedtls_ctr_drbg_seed() again on + * the same context unless you call + * mbedtls_ctr_drbg_free() and mbedtls_ctr_drbg_init() + * again first. + * After a failed call to mbedtls_ctr_drbg_seed(), + * you must call mbedtls_ctr_drbg_free(). + * \param f_entropy The entropy callback, taking as arguments the + * \p p_entropy context, the buffer to fill, and the + * length of the buffer. + * \p f_entropy is always called with a buffer size + * less than or equal to the entropy length. + * \param p_entropy The entropy context to pass to \p f_entropy. + * \param custom The personalization string. + * This can be \c NULL, in which case the personalization + * string is empty regardless of the value of \p len. + * \param len The length of the personalization string. + * This must be at most + * #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT + * - #MBEDTLS_CTR_DRBG_ENTROPY_LEN. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on failure. + */ +int mbedtls_ctr_drbg_seed(mbedtls_ctr_drbg_context *ctx, + int (*f_entropy)(void *, unsigned char *, size_t), + void *p_entropy, + const unsigned char *custom, + size_t len); + +/** + * \brief This function resets CTR_DRBG context to the state immediately + * after initial call of mbedtls_ctr_drbg_init(). + * + * \param ctx The CTR_DRBG context to clear. + */ +void mbedtls_ctr_drbg_free(mbedtls_ctr_drbg_context *ctx); + +/** + * \brief This function turns prediction resistance on or off. + * The default value is off. + * + * \note If enabled, entropy is gathered at the beginning of + * every call to mbedtls_ctr_drbg_random_with_add() + * or mbedtls_ctr_drbg_random(). + * Only use this if your entropy source has sufficient + * throughput. + * + * \param ctx The CTR_DRBG context. + * \param resistance #MBEDTLS_CTR_DRBG_PR_ON or #MBEDTLS_CTR_DRBG_PR_OFF. + */ +void mbedtls_ctr_drbg_set_prediction_resistance(mbedtls_ctr_drbg_context *ctx, + int resistance); + +/** + * \brief This function sets the amount of entropy grabbed on each + * seed or reseed. + * + * The default value is #MBEDTLS_CTR_DRBG_ENTROPY_LEN. + * + * \note The security strength of CTR_DRBG is bounded by the + * entropy length. Thus: + * - When using AES-256 + * (\c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is disabled, + * which is the default), + * \p len must be at least 32 (in bytes) + * to achieve a 256-bit strength. + * - When using AES-128 + * (\c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY is enabled) + * \p len must be at least 16 (in bytes) + * to achieve a 128-bit strength. + * + * \param ctx The CTR_DRBG context. + * \param len The amount of entropy to grab, in bytes. + * This must be at most #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT + * and at most the maximum length accepted by the + * entropy function that is set in the context. + */ +void mbedtls_ctr_drbg_set_entropy_len(mbedtls_ctr_drbg_context *ctx, + size_t len); + +/** + * \brief This function sets the amount of entropy grabbed + * as a nonce for the initial seeding. + * + * Call this function before calling mbedtls_ctr_drbg_seed() to read + * a nonce from the entropy source during the initial seeding. + * + * \param ctx The CTR_DRBG context. + * \param len The amount of entropy to grab for the nonce, in bytes. + * This must be at most #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT + * and at most the maximum length accepted by the + * entropy function that is set in the context. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG if \p len is + * more than #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT. + * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED + * if the initial seeding has already taken place. + */ +int mbedtls_ctr_drbg_set_nonce_len(mbedtls_ctr_drbg_context *ctx, + size_t len); + +/** + * \brief This function sets the reseed interval. + * + * The reseed interval is the number of calls to mbedtls_ctr_drbg_random() + * or mbedtls_ctr_drbg_random_with_add() after which the entropy function + * is called again. + * + * The default value is #MBEDTLS_CTR_DRBG_RESEED_INTERVAL. + * + * \param ctx The CTR_DRBG context. + * \param interval The reseed interval. + */ +void mbedtls_ctr_drbg_set_reseed_interval(mbedtls_ctr_drbg_context *ctx, + int interval); + +/** + * \brief This function reseeds the CTR_DRBG context, that is + * extracts data from the entropy source. + * + * \note This function is not thread-safe. It is not safe + * to call this function if another thread might be + * concurrently obtaining random numbers from the same + * context or updating or reseeding the same context. + * + * \param ctx The CTR_DRBG context. + * \param additional Additional data to add to the state. Can be \c NULL. + * \param len The length of the additional data. + * This must be less than + * #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT - \c entropy_len + * where \c entropy_len is the entropy length + * configured for the context. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on failure. + */ +int mbedtls_ctr_drbg_reseed(mbedtls_ctr_drbg_context *ctx, + const unsigned char *additional, size_t len); + +/** + * \brief This function updates the state of the CTR_DRBG context. + * + * \note This function is not thread-safe. It is not safe + * to call this function if another thread might be + * concurrently obtaining random numbers from the same + * context or updating or reseeding the same context. + * + * \param ctx The CTR_DRBG context. + * \param additional The data to update the state with. This must not be + * \c NULL unless \p add_len is \c 0. + * \param add_len Length of \p additional in bytes. This must be at + * most #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG if + * \p add_len is more than + * #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT. + * \return An error from the underlying AES cipher on failure. + */ +int mbedtls_ctr_drbg_update_ret(mbedtls_ctr_drbg_context *ctx, + const unsigned char *additional, + size_t add_len); + +/** + * \brief This function updates a CTR_DRBG instance with additional + * data and uses it to generate random data. + * + * This function automatically reseeds if the reseed counter is exceeded + * or prediction resistance is enabled. + * + * \note This function is not thread-safe. It is not safe + * to call this function if another thread might be + * concurrently obtaining random numbers from the same + * context or updating or reseeding the same context. + * + * \param p_rng The CTR_DRBG context. This must be a pointer to a + * #mbedtls_ctr_drbg_context structure. + * \param output The buffer to fill. + * \param output_len The length of the buffer in bytes. + * \param additional Additional data to update. Can be \c NULL, in which + * case the additional data is empty regardless of + * the value of \p add_len. + * \param add_len The length of the additional data + * if \p additional is not \c NULL. + * This must be less than #MBEDTLS_CTR_DRBG_MAX_INPUT + * and less than + * #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT - \c entropy_len + * where \c entropy_len is the entropy length + * configured for the context. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or + * #MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG on failure. + */ +int mbedtls_ctr_drbg_random_with_add(void *p_rng, + unsigned char *output, size_t output_len, + const unsigned char *additional, size_t add_len); + +/** + * \brief This function uses CTR_DRBG to generate random data. + * + * This function automatically reseeds if the reseed counter is exceeded + * or prediction resistance is enabled. + */ +#if defined(MBEDTLS_THREADING_C) +/** + * \note When Mbed TLS is built with threading support, + * it is safe to call mbedtls_ctr_drbg_random() + * from multiple threads. Other operations, including + * reseeding, are not thread-safe. + */ +#endif /* MBEDTLS_THREADING_C */ +/** + * \param p_rng The CTR_DRBG context. This must be a pointer to a + * #mbedtls_ctr_drbg_context structure. + * \param output The buffer to fill. + * \param output_len The length of the buffer in bytes. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or + * #MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG on failure. + */ +int mbedtls_ctr_drbg_random(void *p_rng, + unsigned char *output, size_t output_len); + + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief This function updates the state of the CTR_DRBG context. + * + * \deprecated Superseded by mbedtls_ctr_drbg_update_ret() + * in 2.16.0. + * + * \note If \p add_len is greater than + * #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT, only the first + * #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT Bytes are used. + * The remaining Bytes are silently discarded. + * + * \param ctx The CTR_DRBG context. + * \param additional The data to update the state with. + * \param add_len Length of \p additional data. + */ +MBEDTLS_DEPRECATED void mbedtls_ctr_drbg_update( + mbedtls_ctr_drbg_context *ctx, + const unsigned char *additional, + size_t add_len); +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +#if defined(MBEDTLS_FS_IO) +/** + * \brief This function writes a seed file. + * + * \param ctx The CTR_DRBG context. + * \param path The name of the file. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error. + * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on reseed + * failure. + */ +int mbedtls_ctr_drbg_write_seed_file(mbedtls_ctr_drbg_context *ctx, const char *path); + +/** + * \brief This function reads and updates a seed file. The seed + * is added to this instance. + * + * \param ctx The CTR_DRBG context. + * \param path The name of the file. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error. + * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on + * reseed failure. + * \return #MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG if the existing + * seed file is too large. + */ +int mbedtls_ctr_drbg_update_seed_file(mbedtls_ctr_drbg_context *ctx, const char *path); +#endif /* MBEDTLS_FS_IO */ + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief The CTR_DRBG checkup routine. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +int mbedtls_ctr_drbg_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* ctr_drbg.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/debug.h b/ext/opcua_client/mbedtls/include/mbedtls/debug.h new file mode 100644 index 0000000..1da0726 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/debug.h @@ -0,0 +1,300 @@ +/** + * \file debug.h + * + * \brief Functions for controlling and providing debug output from the library. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_DEBUG_H +#define MBEDTLS_DEBUG_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/ssl.h" + +#if defined(MBEDTLS_ECP_C) +#include "mbedtls/ecp.h" +#endif + +#if defined(MBEDTLS_DEBUG_C) + +#define MBEDTLS_DEBUG_STRIP_PARENS(...) __VA_ARGS__ + +#define MBEDTLS_SSL_DEBUG_MSG(level, args) \ + mbedtls_debug_print_msg(ssl, level, __FILE__, __LINE__, \ + MBEDTLS_DEBUG_STRIP_PARENS args) + +#define MBEDTLS_SSL_DEBUG_RET(level, text, ret) \ + mbedtls_debug_print_ret(ssl, level, __FILE__, __LINE__, text, ret) + +#define MBEDTLS_SSL_DEBUG_BUF(level, text, buf, len) \ + mbedtls_debug_print_buf(ssl, level, __FILE__, __LINE__, text, buf, len) + +#if defined(MBEDTLS_BIGNUM_C) +#define MBEDTLS_SSL_DEBUG_MPI(level, text, X) \ + mbedtls_debug_print_mpi(ssl, level, __FILE__, __LINE__, text, X) +#endif + +#if defined(MBEDTLS_ECP_C) +#define MBEDTLS_SSL_DEBUG_ECP(level, text, X) \ + mbedtls_debug_print_ecp(ssl, level, __FILE__, __LINE__, text, X) +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +#define MBEDTLS_SSL_DEBUG_CRT(level, text, crt) \ + mbedtls_debug_print_crt(ssl, level, __FILE__, __LINE__, text, crt) +#endif + +#if defined(MBEDTLS_ECDH_C) +#define MBEDTLS_SSL_DEBUG_ECDH(level, ecdh, attr) \ + mbedtls_debug_printf_ecdh(ssl, level, __FILE__, __LINE__, ecdh, attr) +#endif + +#else /* MBEDTLS_DEBUG_C */ + +#define MBEDTLS_SSL_DEBUG_MSG(level, args) do { } while (0) +#define MBEDTLS_SSL_DEBUG_RET(level, text, ret) do { } while (0) +#define MBEDTLS_SSL_DEBUG_BUF(level, text, buf, len) do { } while (0) +#define MBEDTLS_SSL_DEBUG_MPI(level, text, X) do { } while (0) +#define MBEDTLS_SSL_DEBUG_ECP(level, text, X) do { } while (0) +#define MBEDTLS_SSL_DEBUG_CRT(level, text, crt) do { } while (0) +#define MBEDTLS_SSL_DEBUG_ECDH(level, ecdh, attr) do { } while (0) + +#endif /* MBEDTLS_DEBUG_C */ + +/** + * \def MBEDTLS_PRINTF_ATTRIBUTE + * + * Mark a function as having printf attributes, and thus enable checking + * via -wFormat and other flags. This does nothing on builds with compilers + * that do not support the format attribute + * + * Module: library/debug.c + * Caller: + * + * This module provides debugging functions. + */ +#if defined(__has_attribute) +#if __has_attribute(format) +#if defined(__MINGW32__) && __USE_MINGW_ANSI_STDIO == 1 +#define MBEDTLS_PRINTF_ATTRIBUTE(string_index, first_to_check) \ + __attribute__((__format__(gnu_printf, string_index, first_to_check))) +#else /* defined(__MINGW32__) && __USE_MINGW_ANSI_STDIO == 1 */ +#define MBEDTLS_PRINTF_ATTRIBUTE(string_index, first_to_check) \ + __attribute__((format(printf, string_index, first_to_check))) +#endif +#else /* __has_attribute(format) */ +#define MBEDTLS_PRINTF_ATTRIBUTE(string_index, first_to_check) +#endif /* __has_attribute(format) */ +#else /* defined(__has_attribute) */ +#define MBEDTLS_PRINTF_ATTRIBUTE(string_index, first_to_check) +#endif + +/** + * \def MBEDTLS_PRINTF_SIZET + * + * MBEDTLS_PRINTF_xxx: Due to issues with older window compilers + * and MinGW we need to define the printf specifier for size_t + * and long long per platform. + * + * Module: library/debug.c + * Caller: + * + * This module provides debugging functions. + */ +#if defined(__MINGW32__) || (defined(_MSC_VER) && _MSC_VER < 1900) + #include + #define MBEDTLS_PRINTF_SIZET PRIuPTR + #define MBEDTLS_PRINTF_LONGLONG "I64d" +#else \ + /* defined(__MINGW32__) || (defined(_MSC_VER) && _MSC_VER < 1900) */ + #define MBEDTLS_PRINTF_SIZET "zu" + #define MBEDTLS_PRINTF_LONGLONG "lld" +#endif \ + /* defined(__MINGW32__) || (defined(_MSC_VER) && _MSC_VER < 1900) */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Set the threshold error level to handle globally all debug output. + * Debug messages that have a level over the threshold value are + * discarded. + * (Default value: 0 = No debug ) + * + * \param threshold threshold level of messages to filter on. Messages at a + * higher level will be discarded. + * - Debug levels + * - 0 No debug + * - 1 Error + * - 2 State change + * - 3 Informational + * - 4 Verbose + */ +void mbedtls_debug_set_threshold(int threshold); + +/** + * \brief Print a message to the debug output. This function is always used + * through the MBEDTLS_SSL_DEBUG_MSG() macro, which supplies the ssl + * context, file and line number parameters. + * + * \param ssl SSL context + * \param level error level of the debug message + * \param file file the message has occurred in + * \param line line number the message has occurred at + * \param format format specifier, in printf format + * \param ... variables used by the format specifier + * + * \attention This function is intended for INTERNAL usage within the + * library only. + */ +void mbedtls_debug_print_msg(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const char *format, ...) MBEDTLS_PRINTF_ATTRIBUTE(5, 6); + +/** + * \brief Print the return value of a function to the debug output. This + * function is always used through the MBEDTLS_SSL_DEBUG_RET() macro, + * which supplies the ssl context, file and line number parameters. + * + * \param ssl SSL context + * \param level error level of the debug message + * \param file file the error has occurred in + * \param line line number the error has occurred in + * \param text the name of the function that returned the error + * \param ret the return code value + * + * \attention This function is intended for INTERNAL usage within the + * library only. + */ +void mbedtls_debug_print_ret(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const char *text, int ret); + +/** + * \brief Output a buffer of size len bytes to the debug output. This function + * is always used through the MBEDTLS_SSL_DEBUG_BUF() macro, + * which supplies the ssl context, file and line number parameters. + * + * \param ssl SSL context + * \param level error level of the debug message + * \param file file the error has occurred in + * \param line line number the error has occurred in + * \param text a name or label for the buffer being dumped. Normally the + * variable or buffer name + * \param buf the buffer to be outputted + * \param len length of the buffer + * + * \attention This function is intended for INTERNAL usage within the + * library only. + */ +void mbedtls_debug_print_buf(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, const char *text, + const unsigned char *buf, size_t len); + +#if defined(MBEDTLS_BIGNUM_C) +/** + * \brief Print a MPI variable to the debug output. This function is always + * used through the MBEDTLS_SSL_DEBUG_MPI() macro, which supplies the + * ssl context, file and line number parameters. + * + * \param ssl SSL context + * \param level error level of the debug message + * \param file file the error has occurred in + * \param line line number the error has occurred in + * \param text a name or label for the MPI being output. Normally the + * variable name + * \param X the MPI variable + * + * \attention This function is intended for INTERNAL usage within the + * library only. + */ +void mbedtls_debug_print_mpi(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const char *text, const mbedtls_mpi *X); +#endif + +#if defined(MBEDTLS_ECP_C) +/** + * \brief Print an ECP point to the debug output. This function is always + * used through the MBEDTLS_SSL_DEBUG_ECP() macro, which supplies the + * ssl context, file and line number parameters. + * + * \param ssl SSL context + * \param level error level of the debug message + * \param file file the error has occurred in + * \param line line number the error has occurred in + * \param text a name or label for the ECP point being output. Normally the + * variable name + * \param X the ECP point + * + * \attention This function is intended for INTERNAL usage within the + * library only. + */ +void mbedtls_debug_print_ecp(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const char *text, const mbedtls_ecp_point *X); +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +/** + * \brief Print a X.509 certificate structure to the debug output. This + * function is always used through the MBEDTLS_SSL_DEBUG_CRT() macro, + * which supplies the ssl context, file and line number parameters. + * + * \param ssl SSL context + * \param level error level of the debug message + * \param file file the error has occurred in + * \param line line number the error has occurred in + * \param text a name or label for the certificate being output + * \param crt X.509 certificate structure + * + * \attention This function is intended for INTERNAL usage within the + * library only. + */ +void mbedtls_debug_print_crt(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const char *text, const mbedtls_x509_crt *crt); +#endif + +#if defined(MBEDTLS_ECDH_C) +typedef enum { + MBEDTLS_DEBUG_ECDH_Q, + MBEDTLS_DEBUG_ECDH_QP, + MBEDTLS_DEBUG_ECDH_Z, +} mbedtls_debug_ecdh_attr; + +/** + * \brief Print a field of the ECDH structure in the SSL context to the debug + * output. This function is always used through the + * MBEDTLS_SSL_DEBUG_ECDH() macro, which supplies the ssl context, file + * and line number parameters. + * + * \param ssl SSL context + * \param level error level of the debug message + * \param file file the error has occurred in + * \param line line number the error has occurred in + * \param ecdh the ECDH context + * \param attr the identifier of the attribute being output + * + * \attention This function is intended for INTERNAL usage within the + * library only. + */ +void mbedtls_debug_printf_ecdh(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const mbedtls_ecdh_context *ecdh, + mbedtls_debug_ecdh_attr attr); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* debug.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/des.h b/ext/opcua_client/mbedtls/include/mbedtls/des.h new file mode 100644 index 0000000..031b9cf --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/des.h @@ -0,0 +1,392 @@ +/** + * \file des.h + * + * \brief DES block cipher + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + * + */ +#ifndef MBEDTLS_DES_H +#define MBEDTLS_DES_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif +#include "mbedtls/platform_util.h" + +#include +#include + +#define MBEDTLS_DES_ENCRYPT 1 +#define MBEDTLS_DES_DECRYPT 0 + +/** The data input has an invalid length. */ +#define MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH -0x0032 + +/* MBEDTLS_ERR_DES_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** DES hardware accelerator failed. */ +#define MBEDTLS_ERR_DES_HW_ACCEL_FAILED -0x0033 + +#define MBEDTLS_DES_KEY_SIZE 8 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_DES_ALT) +// Regular implementation +// + +/** + * \brief DES context structure + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +typedef struct mbedtls_des_context { + uint32_t sk[32]; /*!< DES subkeys */ +} +mbedtls_des_context; + +/** + * \brief Triple-DES context structure + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +typedef struct mbedtls_des3_context { + uint32_t sk[96]; /*!< 3DES subkeys */ +} +mbedtls_des3_context; + +#else /* MBEDTLS_DES_ALT */ +#include "des_alt.h" +#endif /* MBEDTLS_DES_ALT */ + +/** + * \brief Initialize DES context + * + * \param ctx DES context to be initialized + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +void mbedtls_des_init(mbedtls_des_context *ctx); + +/** + * \brief Clear DES context + * + * \param ctx DES context to be cleared + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +void mbedtls_des_free(mbedtls_des_context *ctx); + +/** + * \brief Initialize Triple-DES context + * + * \param ctx DES3 context to be initialized + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +void mbedtls_des3_init(mbedtls_des3_context *ctx); + +/** + * \brief Clear Triple-DES context + * + * \param ctx DES3 context to be cleared + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +void mbedtls_des3_free(mbedtls_des3_context *ctx); + +/** + * \brief Set key parity on the given key to odd. + * + * DES keys are 56 bits long, but each byte is padded with + * a parity bit to allow verification. + * + * \param key 8-byte secret key + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +void mbedtls_des_key_set_parity(unsigned char key[MBEDTLS_DES_KEY_SIZE]); + +/** + * \brief Check that key parity on the given key is odd. + * + * DES keys are 56 bits long, but each byte is padded with + * a parity bit to allow verification. + * + * \param key 8-byte secret key + * + * \return 0 is parity was ok, 1 if parity was not correct. + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_des_key_check_key_parity(const unsigned char key[MBEDTLS_DES_KEY_SIZE]); + +/** + * \brief Check that key is not a weak or semi-weak DES key + * + * \param key 8-byte secret key + * + * \return 0 if no weak key was found, 1 if a weak key was identified. + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_des_key_check_weak(const unsigned char key[MBEDTLS_DES_KEY_SIZE]); + +/** + * \brief DES key schedule (56-bit, encryption) + * + * \param ctx DES context to be initialized + * \param key 8-byte secret key + * + * \return 0 + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_des_setkey_enc(mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE]); + +/** + * \brief DES key schedule (56-bit, decryption) + * + * \param ctx DES context to be initialized + * \param key 8-byte secret key + * + * \return 0 + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_des_setkey_dec(mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE]); + +/** + * \brief Triple-DES key schedule (112-bit, encryption) + * + * \param ctx 3DES context to be initialized + * \param key 16-byte secret key + * + * \return 0 + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_des3_set2key_enc(mbedtls_des3_context *ctx, + const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2]); + +/** + * \brief Triple-DES key schedule (112-bit, decryption) + * + * \param ctx 3DES context to be initialized + * \param key 16-byte secret key + * + * \return 0 + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_des3_set2key_dec(mbedtls_des3_context *ctx, + const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2]); + +/** + * \brief Triple-DES key schedule (168-bit, encryption) + * + * \param ctx 3DES context to be initialized + * \param key 24-byte secret key + * + * \return 0 + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_des3_set3key_enc(mbedtls_des3_context *ctx, + const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3]); + +/** + * \brief Triple-DES key schedule (168-bit, decryption) + * + * \param ctx 3DES context to be initialized + * \param key 24-byte secret key + * + * \return 0 + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_des3_set3key_dec(mbedtls_des3_context *ctx, + const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3]); + +/** + * \brief DES-ECB block encryption/decryption + * + * \param ctx DES context + * \param input 64-bit input block + * \param output 64-bit output block + * + * \return 0 if successful + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_des_crypt_ecb(mbedtls_des_context *ctx, + const unsigned char input[8], + unsigned char output[8]); + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/** + * \brief DES-CBC buffer encryption/decryption + * + * \note Upon exit, the content of the IV is updated so that you can + * call the function same function again on the following + * block(s) of data and get the same result as if it was + * encrypted in one call. This allows a "streaming" usage. + * If on the other hand you need to retain the contents of the + * IV, you should either save it manually or use the cipher + * module instead. + * + * \param ctx DES context + * \param mode MBEDTLS_DES_ENCRYPT or MBEDTLS_DES_DECRYPT + * \param length length of the input data + * \param iv initialization vector (updated after use) + * \param input buffer holding the input data + * \param output buffer holding the output data + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_des_crypt_cbc(mbedtls_des_context *ctx, + int mode, + size_t length, + unsigned char iv[8], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +/** + * \brief 3DES-ECB block encryption/decryption + * + * \param ctx 3DES context + * \param input 64-bit input block + * \param output 64-bit output block + * + * \return 0 if successful + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_des3_crypt_ecb(mbedtls_des3_context *ctx, + const unsigned char input[8], + unsigned char output[8]); + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/** + * \brief 3DES-CBC buffer encryption/decryption + * + * \note Upon exit, the content of the IV is updated so that you can + * call the function same function again on the following + * block(s) of data and get the same result as if it was + * encrypted in one call. This allows a "streaming" usage. + * If on the other hand you need to retain the contents of the + * IV, you should either save it manually or use the cipher + * module instead. + * + * \param ctx 3DES context + * \param mode MBEDTLS_DES_ENCRYPT or MBEDTLS_DES_DECRYPT + * \param length length of the input data + * \param iv initialization vector (updated after use) + * \param input buffer holding the input data + * \param output buffer holding the output data + * + * \return 0 if successful, or MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_des3_crypt_cbc(mbedtls_des3_context *ctx, + int mode, + size_t length, + unsigned char iv[8], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +/** + * \brief Internal function for key expansion. + * (Only exposed to allow overriding it, + * see MBEDTLS_DES_SETKEY_ALT) + * + * \param SK Round keys + * \param key Base key + * + * \warning DES/3DES are considered weak ciphers and their use constitutes a + * security risk. We recommend considering stronger ciphers + * instead. + */ +void mbedtls_des_setkey(uint32_t SK[32], + const unsigned char key[MBEDTLS_DES_KEY_SIZE]); + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_des_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* des.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/dhm.h b/ext/opcua_client/mbedtls/include/mbedtls/dhm.h new file mode 100644 index 0000000..b61e4d4 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/dhm.h @@ -0,0 +1,1090 @@ +/** + * \file dhm.h + * + * \brief This file contains Diffie-Hellman-Merkle (DHM) key exchange + * definitions and functions. + * + * Diffie-Hellman-Merkle (DHM) key exchange is defined in + * RFC-2631: Diffie-Hellman Key Agreement Method and + * Public-Key Cryptography Standards (PKCS) #3: Diffie + * Hellman Key Agreement Standard. + * + * RFC-3526: More Modular Exponential (MODP) Diffie-Hellman groups for + * Internet Key Exchange (IKE) defines a number of standardized + * Diffie-Hellman groups for IKE. + * + * RFC-5114: Additional Diffie-Hellman Groups for Use with IETF + * Standards defines a number of standardized Diffie-Hellman + * groups that can be used. + * + * \warning The security of the DHM key exchange relies on the proper choice + * of prime modulus - optimally, it should be a safe prime. The usage + * of non-safe primes both decreases the difficulty of the underlying + * discrete logarithm problem and can lead to small subgroup attacks + * leaking private exponent bits when invalid public keys are used + * and not detected. This is especially relevant if the same DHM + * parameters are reused for multiple key exchanges as in static DHM, + * while the criticality of small-subgroup attacks is lower for + * ephemeral DHM. + * + * \warning For performance reasons, the code does neither perform primality + * nor safe primality tests, nor the expensive checks for invalid + * subgroups. Moreover, even if these were performed, non-standardized + * primes cannot be trusted because of the possibility of backdoors + * that can't be effectively checked for. + * + * \warning Diffie-Hellman-Merkle is therefore a security risk when not using + * standardized primes generated using a trustworthy ("nothing up + * my sleeve") method, such as the RFC 3526 / 7919 primes. In the TLS + * protocol, DH parameters need to be negotiated, so using the default + * primes systematically is not always an option. If possible, use + * Elliptic Curve Diffie-Hellman (ECDH), which has better performance, + * and for which the TLS protocol mandates the use of standard + * parameters. + * + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_DHM_H +#define MBEDTLS_DHM_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif +#include "mbedtls/bignum.h" + +/* + * DHM Error codes + */ +/** Bad input parameters. */ +#define MBEDTLS_ERR_DHM_BAD_INPUT_DATA -0x3080 +/** Reading of the DHM parameters failed. */ +#define MBEDTLS_ERR_DHM_READ_PARAMS_FAILED -0x3100 +/** Making of the DHM parameters failed. */ +#define MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED -0x3180 +/** Reading of the public values failed. */ +#define MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED -0x3200 +/** Making of the public value failed. */ +#define MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED -0x3280 +/** Calculation of the DHM secret failed. */ +#define MBEDTLS_ERR_DHM_CALC_SECRET_FAILED -0x3300 +/** The ASN.1 data is not formatted correctly. */ +#define MBEDTLS_ERR_DHM_INVALID_FORMAT -0x3380 +/** Allocation of memory failed. */ +#define MBEDTLS_ERR_DHM_ALLOC_FAILED -0x3400 +/** Read or write of file failed. */ +#define MBEDTLS_ERR_DHM_FILE_IO_ERROR -0x3480 + +/* MBEDTLS_ERR_DHM_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** DHM hardware accelerator failed. */ +#define MBEDTLS_ERR_DHM_HW_ACCEL_FAILED -0x3500 + +/** Setting the modulus and generator failed. */ +#define MBEDTLS_ERR_DHM_SET_GROUP_FAILED -0x3580 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_DHM_ALT) + +/** + * \brief The DHM context structure. + */ +typedef struct mbedtls_dhm_context { + size_t len; /*!< The size of \p P in Bytes. */ + mbedtls_mpi P; /*!< The prime modulus. */ + mbedtls_mpi G; /*!< The generator. */ + mbedtls_mpi X; /*!< Our secret value. */ + mbedtls_mpi GX; /*!< Our public key = \c G^X mod \c P. */ + mbedtls_mpi GY; /*!< The public key of the peer = \c G^Y mod \c P. */ + mbedtls_mpi K; /*!< The shared secret = \c G^(XY) mod \c P. */ + mbedtls_mpi RP; /*!< The cached value = \c R^2 mod \c P. */ + mbedtls_mpi Vi; /*!< The blinding value. */ + mbedtls_mpi Vf; /*!< The unblinding value. */ + mbedtls_mpi pX; /*!< The previous \c X. */ +} +mbedtls_dhm_context; + +#else /* MBEDTLS_DHM_ALT */ +#include "dhm_alt.h" +#endif /* MBEDTLS_DHM_ALT */ + +/** + * \brief This function initializes the DHM context. + * + * \param ctx The DHM context to initialize. + */ +void mbedtls_dhm_init(mbedtls_dhm_context *ctx); + +/** + * \brief This function parses the DHM parameters in a + * TLS ServerKeyExchange handshake message + * (DHM modulus, generator, and public key). + * + * \note In a TLS handshake, this is the how the client + * sets up its DHM context from the server's public + * DHM key material. + * + * \param ctx The DHM context to use. This must be initialized. + * \param p On input, *p must be the start of the input buffer. + * On output, *p is updated to point to the end of the data + * that has been read. On success, this is the first byte + * past the end of the ServerKeyExchange parameters. + * On error, this is the point at which an error has been + * detected, which is usually not useful except to debug + * failures. + * \param end The end of the input buffer. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. + */ +int mbedtls_dhm_read_params(mbedtls_dhm_context *ctx, + unsigned char **p, + const unsigned char *end); + +/** + * \brief This function generates a DHM key pair and exports its + * public part together with the DHM parameters in the format + * used in a TLS ServerKeyExchange handshake message. + * + * \note This function assumes that the DHM parameters \c ctx->P + * and \c ctx->G have already been properly set. For that, use + * mbedtls_dhm_set_group() below in conjunction with + * mbedtls_mpi_read_binary() and mbedtls_mpi_read_string(). + * + * \note In a TLS handshake, this is the how the server generates + * and exports its DHM key material. + * + * \param ctx The DHM context to use. This must be initialized + * and have the DHM parameters set. It may or may not + * already have imported the peer's public key. + * \param x_size The private key size in Bytes. + * \param olen The address at which to store the number of Bytes + * written on success. This must not be \c NULL. + * \param output The destination buffer. This must be a writable buffer of + * sufficient size to hold the reduced binary presentation of + * the modulus, the generator and the public key, each wrapped + * with a 2-byte length field. It is the responsibility of the + * caller to ensure that enough space is available. Refer to + * mbedtls_mpi_size() to computing the byte-size of an MPI. + * \param f_rng The RNG function. Must not be \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL if \p f_rng doesn't need a context parameter. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. + */ +int mbedtls_dhm_make_params(mbedtls_dhm_context *ctx, int x_size, + unsigned char *output, size_t *olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief This function sets the prime modulus and generator. + * + * \note This function can be used to set \c ctx->P, \c ctx->G + * in preparation for mbedtls_dhm_make_params(). + * + * \param ctx The DHM context to configure. This must be initialized. + * \param P The MPI holding the DHM prime modulus. This must be + * an initialized MPI. + * \param G The MPI holding the DHM generator. This must be an + * initialized MPI. + * + * \return \c 0 if successful. + * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. + */ +int mbedtls_dhm_set_group(mbedtls_dhm_context *ctx, + const mbedtls_mpi *P, + const mbedtls_mpi *G); + +/** + * \brief This function imports the raw public value of the peer. + * + * \note In a TLS handshake, this is the how the server imports + * the Client's public DHM key. + * + * \param ctx The DHM context to use. This must be initialized and have + * its DHM parameters set, e.g. via mbedtls_dhm_set_group(). + * It may or may not already have generated its own private key. + * \param input The input buffer containing the \c G^Y value of the peer. + * This must be a readable buffer of size \p ilen Bytes. + * \param ilen The size of the input buffer \p input in Bytes. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. + */ +int mbedtls_dhm_read_public(mbedtls_dhm_context *ctx, + const unsigned char *input, size_t ilen); + +/** + * \brief This function creates a DHM key pair and exports + * the raw public key in big-endian format. + * + * \note The destination buffer is always fully written + * so as to contain a big-endian representation of G^X mod P. + * If it is larger than \c ctx->len, it is padded accordingly + * with zero-bytes at the beginning. + * + * \param ctx The DHM context to use. This must be initialized and + * have the DHM parameters set. It may or may not already + * have imported the peer's public key. + * \param x_size The private key size in Bytes. + * \param output The destination buffer. This must be a writable buffer of + * size \p olen Bytes. + * \param olen The length of the destination buffer. This must be at least + * equal to `ctx->len` (the size of \c P). + * \param f_rng The RNG function. This must not be \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. This may be \c NULL + * if \p f_rng doesn't need a context argument. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. + */ +int mbedtls_dhm_make_public(mbedtls_dhm_context *ctx, int x_size, + unsigned char *output, size_t olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief This function derives and exports the shared secret + * \c (G^Y)^X mod \c P. + * + * \note If \p f_rng is not \c NULL, it is used to blind the input as + * a countermeasure against timing attacks. Blinding is used + * only if our private key \c X is re-used, and not used + * otherwise. We recommend always passing a non-NULL + * \p f_rng argument. + * + * \param ctx The DHM context to use. This must be initialized + * and have its own private key generated and the peer's + * public key imported. + * \param output The buffer to write the generated shared key to. This + * must be a writable buffer of size \p output_size Bytes. + * \param output_size The size of the destination buffer. This must be at + * least the size of \c ctx->len (the size of \c P). + * \param olen On exit, holds the actual number of Bytes written. + * \param f_rng The RNG function, for blinding purposes. This may + * b \c NULL if blinding isn't needed. + * \param p_rng The RNG context. This may be \c NULL if \p f_rng + * doesn't need a context argument. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. + */ +int mbedtls_dhm_calc_secret(mbedtls_dhm_context *ctx, + unsigned char *output, size_t output_size, size_t *olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief This function frees and clears the components + * of a DHM context. + * + * \param ctx The DHM context to free and clear. This may be \c NULL, + * in which case this function is a no-op. If it is not \c NULL, + * it must point to an initialized DHM context. + */ +void mbedtls_dhm_free(mbedtls_dhm_context *ctx); + +#if defined(MBEDTLS_ASN1_PARSE_C) +/** + * \brief This function parses DHM parameters in PEM or DER format. + * + * \param dhm The DHM context to import the DHM parameters into. + * This must be initialized. + * \param dhmin The input buffer. This must be a readable buffer of + * length \p dhminlen Bytes. + * \param dhminlen The size of the input buffer \p dhmin, including the + * terminating \c NULL Byte for PEM data. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_DHM_XXX or \c MBEDTLS_ERR_PEM_XXX error + * code on failure. + */ +int mbedtls_dhm_parse_dhm(mbedtls_dhm_context *dhm, const unsigned char *dhmin, + size_t dhminlen); + +#if defined(MBEDTLS_FS_IO) +/** + * \brief This function loads and parses DHM parameters from a file. + * + * \param dhm The DHM context to load the parameters to. + * This must be initialized. + * \param path The filename to read the DHM parameters from. + * This must not be \c NULL. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_DHM_XXX or \c MBEDTLS_ERR_PEM_XXX + * error code on failure. + */ +int mbedtls_dhm_parse_dhmfile(mbedtls_dhm_context *dhm, const char *path); +#endif /* MBEDTLS_FS_IO */ +#endif /* MBEDTLS_ASN1_PARSE_C */ + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief The DMH checkup routine. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +int mbedtls_dhm_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ +#ifdef __cplusplus +} +#endif + +/** + * RFC 3526, RFC 5114 and RFC 7919 standardize a number of + * Diffie-Hellman groups, some of which are included here + * for use within the SSL/TLS module and the user's convenience + * when configuring the Diffie-Hellman parameters by hand + * through \c mbedtls_ssl_conf_dh_param. + * + * The following lists the source of the above groups in the standards: + * - RFC 5114 section 2.2: 2048-bit MODP Group with 224-bit Prime Order Subgroup + * - RFC 3526 section 3: 2048-bit MODP Group + * - RFC 3526 section 4: 3072-bit MODP Group + * - RFC 3526 section 5: 4096-bit MODP Group + * - RFC 7919 section A.1: ffdhe2048 + * - RFC 7919 section A.2: ffdhe3072 + * - RFC 7919 section A.3: ffdhe4096 + * - RFC 7919 section A.4: ffdhe6144 + * - RFC 7919 section A.5: ffdhe8192 + * + * The constants with suffix "_p" denote the chosen prime moduli, while + * the constants with suffix "_g" denote the chosen generator + * of the associated prime field. + * + * The constants further suffixed with "_bin" are provided in binary format, + * while all other constants represent null-terminated strings holding the + * hexadecimal presentation of the respective numbers. + * + * The primes from RFC 3526 and RFC 7919 have been generating by the following + * trust-worthy procedure: + * - Fix N in { 2048, 3072, 4096, 6144, 8192 } and consider the N-bit number + * the first and last 64 bits are all 1, and the remaining N - 128 bits of + * which are 0x7ff...ff. + * - Add the smallest multiple of the first N - 129 bits of the binary expansion + * of pi (for RFC 5236) or e (for RFC 7919) to this intermediate bit-string + * such that the resulting integer is a safe-prime. + * - The result is the respective RFC 3526 / 7919 prime, and the corresponding + * generator is always chosen to be 2 (which is a square for these prime, + * hence the corresponding subgroup has order (p-1)/2 and avoids leaking a + * bit in the private exponent). + * + */ + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) + +/** + * \warning The origin of the primes in RFC 5114 is not documented and + * their use therefore constitutes a security risk! + * + * \deprecated The hex-encoded primes from RFC 5114 are deprecated and are + * likely to be removed in a future version of the library without + * replacement. + */ + +/** + * The hexadecimal presentation of the prime underlying the + * 2048-bit MODP Group with 224-bit Prime Order Subgroup, as defined + * in RFC-5114: Additional Diffie-Hellman Groups for Use with + * IETF Standards. + */ +#define MBEDTLS_DHM_RFC5114_MODP_2048_P \ + MBEDTLS_DEPRECATED_STRING_CONSTANT( \ + "AD107E1E9123A9D0D660FAA79559C51FA20D64E5683B9FD1" \ + "B54B1597B61D0A75E6FA141DF95A56DBAF9A3C407BA1DF15" \ + "EB3D688A309C180E1DE6B85A1274A0A66D3F8152AD6AC212" \ + "9037C9EDEFDA4DF8D91E8FEF55B7394B7AD5B7D0B6C12207" \ + "C9F98D11ED34DBF6C6BA0B2C8BBC27BE6A00E0A0B9C49708" \ + "B3BF8A317091883681286130BC8985DB1602E714415D9330" \ + "278273C7DE31EFDC7310F7121FD5A07415987D9ADC0A486D" \ + "CDF93ACC44328387315D75E198C641A480CD86A1B9E587E8" \ + "BE60E69CC928B2B9C52172E413042E9B23F10B0E16E79763" \ + "C9B53DCF4BA80A29E3FB73C16B8E75B97EF363E2FFA31F71" \ + "CF9DE5384E71B81C0AC4DFFE0C10E64F") + +/** + * The hexadecimal presentation of the chosen generator of the 2048-bit MODP + * Group with 224-bit Prime Order Subgroup, as defined in RFC-5114: + * Additional Diffie-Hellman Groups for Use with IETF Standards. + */ +#define MBEDTLS_DHM_RFC5114_MODP_2048_G \ + MBEDTLS_DEPRECATED_STRING_CONSTANT( \ + "AC4032EF4F2D9AE39DF30B5C8FFDAC506CDEBE7B89998CAF" \ + "74866A08CFE4FFE3A6824A4E10B9A6F0DD921F01A70C4AFA" \ + "AB739D7700C29F52C57DB17C620A8652BE5E9001A8D66AD7" \ + "C17669101999024AF4D027275AC1348BB8A762D0521BC98A" \ + "E247150422EA1ED409939D54DA7460CDB5F6C6B250717CBE" \ + "F180EB34118E98D119529A45D6F834566E3025E316A330EF" \ + "BB77A86F0C1AB15B051AE3D428C8F8ACB70A8137150B8EEB" \ + "10E183EDD19963DDD9E263E4770589EF6AA21E7F5F2FF381" \ + "B539CCE3409D13CD566AFBB48D6C019181E1BCFE94B30269" \ + "EDFE72FE9B6AA4BD7B5A0F1C71CFFF4C19C418E1F6EC0179" \ + "81BC087F2A7065B384B890D3191F2BFA") + +/** + * The hexadecimal presentation of the prime underlying the 2048-bit MODP + * Group, as defined in RFC-3526: More Modular Exponential (MODP) + * Diffie-Hellman groups for Internet Key Exchange (IKE). + * + * \deprecated The hex-encoded primes from RFC 3625 are deprecated and + * superseded by the corresponding macros providing them as + * binary constants. Their hex-encoded constants are likely + * to be removed in a future version of the library. + * + */ +#define MBEDTLS_DHM_RFC3526_MODP_2048_P \ + MBEDTLS_DEPRECATED_STRING_CONSTANT( \ + "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ + "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ + "15728E5A8AACAA68FFFFFFFFFFFFFFFF") + +/** + * The hexadecimal presentation of the chosen generator of the 2048-bit MODP + * Group, as defined in RFC-3526: More Modular Exponential (MODP) + * Diffie-Hellman groups for Internet Key Exchange (IKE). + */ +#define MBEDTLS_DHM_RFC3526_MODP_2048_G \ + MBEDTLS_DEPRECATED_STRING_CONSTANT("02") + +/** + * The hexadecimal presentation of the prime underlying the 3072-bit MODP + * Group, as defined in RFC-3072: More Modular Exponential (MODP) + * Diffie-Hellman groups for Internet Key Exchange (IKE). + */ +#define MBEDTLS_DHM_RFC3526_MODP_3072_P \ + MBEDTLS_DEPRECATED_STRING_CONSTANT( \ + "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ + "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ + "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" \ + "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" \ + "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" \ + "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" \ + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" \ + "43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF") + +/** + * The hexadecimal presentation of the chosen generator of the 3072-bit MODP + * Group, as defined in RFC-3526: More Modular Exponential (MODP) + * Diffie-Hellman groups for Internet Key Exchange (IKE). + */ +#define MBEDTLS_DHM_RFC3526_MODP_3072_G \ + MBEDTLS_DEPRECATED_STRING_CONSTANT("02") + +/** + * The hexadecimal presentation of the prime underlying the 4096-bit MODP + * Group, as defined in RFC-3526: More Modular Exponential (MODP) + * Diffie-Hellman groups for Internet Key Exchange (IKE). + */ +#define MBEDTLS_DHM_RFC3526_MODP_4096_P \ + MBEDTLS_DEPRECATED_STRING_CONSTANT( \ + "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ + "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ + "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ + "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ + "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ + "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" \ + "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" \ + "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" \ + "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" \ + "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" \ + "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" \ + "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA" \ + "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" \ + "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED" \ + "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" \ + "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" \ + "FFFFFFFFFFFFFFFF") + +/** + * The hexadecimal presentation of the chosen generator of the 4096-bit MODP + * Group, as defined in RFC-3526: More Modular Exponential (MODP) + * Diffie-Hellman groups for Internet Key Exchange (IKE). + */ +#define MBEDTLS_DHM_RFC3526_MODP_4096_G \ + MBEDTLS_DEPRECATED_STRING_CONSTANT("02") + +#endif /* MBEDTLS_DEPRECATED_REMOVED */ + +/* + * Trustworthy DHM parameters in binary form + */ + +#define MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN { \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, \ + 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, \ + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, \ + 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, \ + 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, \ + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, \ + 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, \ + 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, \ + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, \ + 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, \ + 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, \ + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, \ + 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, \ + 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, \ + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, \ + 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, \ + 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, \ + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, \ + 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, \ + 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, \ + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, \ + 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, \ + 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, \ + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, \ + 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, \ + 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, \ + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, \ + 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, \ + 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, \ + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } + +#define MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN { 0x02 } + +#define MBEDTLS_DHM_RFC3526_MODP_3072_P_BIN { \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, \ + 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, \ + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, \ + 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, \ + 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, \ + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, \ + 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, \ + 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, \ + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, \ + 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, \ + 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, \ + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, \ + 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, \ + 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, \ + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, \ + 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, \ + 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, \ + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, \ + 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, \ + 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, \ + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, \ + 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, \ + 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, \ + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, \ + 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, \ + 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, \ + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, \ + 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, \ + 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, \ + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, \ + 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, \ + 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, \ + 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, \ + 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, \ + 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, \ + 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, \ + 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, \ + 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, \ + 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, \ + 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, \ + 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, \ + 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, \ + 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, \ + 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, \ + 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, \ + 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x3A, 0xD2, 0xCA, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } + +#define MBEDTLS_DHM_RFC3526_MODP_3072_G_BIN { 0x02 } + +#define MBEDTLS_DHM_RFC3526_MODP_4096_P_BIN { \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, \ + 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, \ + 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, \ + 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, \ + 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, \ + 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, \ + 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, \ + 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, \ + 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, \ + 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, \ + 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, \ + 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, \ + 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, \ + 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, \ + 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, \ + 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, \ + 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, \ + 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, \ + 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, \ + 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, \ + 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, \ + 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, \ + 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, \ + 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, \ + 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, \ + 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, \ + 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, \ + 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, \ + 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, \ + 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, \ + 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, \ + 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, \ + 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, \ + 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, \ + 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, \ + 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, \ + 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, \ + 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, \ + 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, \ + 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, \ + 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, \ + 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, \ + 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, \ + 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, \ + 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, \ + 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01, \ + 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7, \ + 0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, \ + 0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C, \ + 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA, \ + 0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, \ + 0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9, \ + 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6, \ + 0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, \ + 0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2, \ + 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED, \ + 0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, \ + 0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C, \ + 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9, \ + 0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, \ + 0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F, \ + 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } + +#define MBEDTLS_DHM_RFC3526_MODP_4096_G_BIN { 0x02 } + +#define MBEDTLS_DHM_RFC7919_FFDHE2048_P_BIN { \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ + 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ + 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ + 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ + 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ + 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ + 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ + 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ + 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ + 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ + 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ + 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ + 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ + 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ + 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ + 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ + 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ + 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ + 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ + 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ + 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ + 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ + 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ + 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ + 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ + 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ + 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ + 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ + 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ + 0x88, 0x6B, 0x42, 0x38, 0x61, 0x28, 0x5C, 0x97, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, } + +#define MBEDTLS_DHM_RFC7919_FFDHE2048_G_BIN { 0x02 } + +#define MBEDTLS_DHM_RFC7919_FFDHE3072_P_BIN { \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ + 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ + 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ + 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ + 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ + 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ + 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ + 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ + 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ + 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ + 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ + 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ + 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ + 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ + 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ + 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ + 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ + 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ + 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ + 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ + 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ + 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ + 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ + 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ + 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ + 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ + 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ + 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ + 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ + 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, \ + 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B, \ + 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38, \ + 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, \ + 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE, \ + 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C, \ + 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, \ + 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44, \ + 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3, \ + 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, \ + 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E, \ + 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D, \ + 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, \ + 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E, \ + 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF, \ + 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, \ + 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0xC6, 0x2E, 0x37, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } + +#define MBEDTLS_DHM_RFC7919_FFDHE3072_G_BIN { 0x02 } + +#define MBEDTLS_DHM_RFC7919_FFDHE4096_P_BIN { \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ + 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ + 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ + 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ + 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ + 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ + 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ + 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ + 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ + 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ + 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ + 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ + 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ + 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ + 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ + 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ + 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ + 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ + 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ + 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ + 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ + 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ + 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ + 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ + 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ + 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ + 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ + 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ + 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ + 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, \ + 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B, \ + 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38, \ + 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, \ + 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE, \ + 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C, \ + 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, \ + 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44, \ + 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3, \ + 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, \ + 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E, \ + 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D, \ + 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, \ + 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E, \ + 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF, \ + 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, \ + 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1, \ + 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB, \ + 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6, \ + 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18, \ + 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04, \ + 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A, \ + 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A, \ + 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32, \ + 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4, \ + 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38, \ + 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A, \ + 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C, \ + 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC, \ + 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF, \ + 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B, \ + 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1, \ + 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x65, 0x5F, 0x6A, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } + +#define MBEDTLS_DHM_RFC7919_FFDHE4096_G_BIN { 0x02 } + +#define MBEDTLS_DHM_RFC7919_FFDHE6144_P_BIN { \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ + 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ + 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ + 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ + 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ + 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ + 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ + 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ + 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ + 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ + 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ + 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ + 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ + 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ + 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ + 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ + 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ + 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ + 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ + 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ + 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ + 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ + 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ + 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ + 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ + 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ + 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ + 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ + 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ + 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, \ + 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B, \ + 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38, \ + 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, \ + 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE, \ + 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C, \ + 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, \ + 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44, \ + 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3, \ + 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, \ + 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E, \ + 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D, \ + 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, \ + 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E, \ + 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF, \ + 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, \ + 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1, \ + 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB, \ + 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6, \ + 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18, \ + 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04, \ + 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A, \ + 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A, \ + 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32, \ + 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4, \ + 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38, \ + 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A, \ + 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C, \ + 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC, \ + 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF, \ + 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B, \ + 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1, \ + 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x0D, 0xD9, 0x02, \ + 0x0B, 0xFD, 0x64, 0xB6, 0x45, 0x03, 0x6C, 0x7A, \ + 0x4E, 0x67, 0x7D, 0x2C, 0x38, 0x53, 0x2A, 0x3A, \ + 0x23, 0xBA, 0x44, 0x42, 0xCA, 0xF5, 0x3E, 0xA6, \ + 0x3B, 0xB4, 0x54, 0x32, 0x9B, 0x76, 0x24, 0xC8, \ + 0x91, 0x7B, 0xDD, 0x64, 0xB1, 0xC0, 0xFD, 0x4C, \ + 0xB3, 0x8E, 0x8C, 0x33, 0x4C, 0x70, 0x1C, 0x3A, \ + 0xCD, 0xAD, 0x06, 0x57, 0xFC, 0xCF, 0xEC, 0x71, \ + 0x9B, 0x1F, 0x5C, 0x3E, 0x4E, 0x46, 0x04, 0x1F, \ + 0x38, 0x81, 0x47, 0xFB, 0x4C, 0xFD, 0xB4, 0x77, \ + 0xA5, 0x24, 0x71, 0xF7, 0xA9, 0xA9, 0x69, 0x10, \ + 0xB8, 0x55, 0x32, 0x2E, 0xDB, 0x63, 0x40, 0xD8, \ + 0xA0, 0x0E, 0xF0, 0x92, 0x35, 0x05, 0x11, 0xE3, \ + 0x0A, 0xBE, 0xC1, 0xFF, 0xF9, 0xE3, 0xA2, 0x6E, \ + 0x7F, 0xB2, 0x9F, 0x8C, 0x18, 0x30, 0x23, 0xC3, \ + 0x58, 0x7E, 0x38, 0xDA, 0x00, 0x77, 0xD9, 0xB4, \ + 0x76, 0x3E, 0x4E, 0x4B, 0x94, 0xB2, 0xBB, 0xC1, \ + 0x94, 0xC6, 0x65, 0x1E, 0x77, 0xCA, 0xF9, 0x92, \ + 0xEE, 0xAA, 0xC0, 0x23, 0x2A, 0x28, 0x1B, 0xF6, \ + 0xB3, 0xA7, 0x39, 0xC1, 0x22, 0x61, 0x16, 0x82, \ + 0x0A, 0xE8, 0xDB, 0x58, 0x47, 0xA6, 0x7C, 0xBE, \ + 0xF9, 0xC9, 0x09, 0x1B, 0x46, 0x2D, 0x53, 0x8C, \ + 0xD7, 0x2B, 0x03, 0x74, 0x6A, 0xE7, 0x7F, 0x5E, \ + 0x62, 0x29, 0x2C, 0x31, 0x15, 0x62, 0xA8, 0x46, \ + 0x50, 0x5D, 0xC8, 0x2D, 0xB8, 0x54, 0x33, 0x8A, \ + 0xE4, 0x9F, 0x52, 0x35, 0xC9, 0x5B, 0x91, 0x17, \ + 0x8C, 0xCF, 0x2D, 0xD5, 0xCA, 0xCE, 0xF4, 0x03, \ + 0xEC, 0x9D, 0x18, 0x10, 0xC6, 0x27, 0x2B, 0x04, \ + 0x5B, 0x3B, 0x71, 0xF9, 0xDC, 0x6B, 0x80, 0xD6, \ + 0x3F, 0xDD, 0x4A, 0x8E, 0x9A, 0xDB, 0x1E, 0x69, \ + 0x62, 0xA6, 0x95, 0x26, 0xD4, 0x31, 0x61, 0xC1, \ + 0xA4, 0x1D, 0x57, 0x0D, 0x79, 0x38, 0xDA, 0xD4, \ + 0xA4, 0x0E, 0x32, 0x9C, 0xD0, 0xE4, 0x0E, 0x65, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } + +#define MBEDTLS_DHM_RFC7919_FFDHE6144_G_BIN { 0x02 } + +#define MBEDTLS_DHM_RFC7919_FFDHE8192_P_BIN { \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ + 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ + 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ + 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ + 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ + 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ + 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ + 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ + 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ + 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ + 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ + 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ + 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ + 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ + 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ + 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ + 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ + 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ + 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ + 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ + 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ + 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ + 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ + 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ + 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ + 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ + 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ + 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ + 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ + 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, \ + 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B, \ + 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38, \ + 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, \ + 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE, \ + 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C, \ + 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, \ + 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44, \ + 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3, \ + 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, \ + 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E, \ + 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D, \ + 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, \ + 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E, \ + 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF, \ + 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, \ + 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1, \ + 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB, \ + 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6, \ + 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18, \ + 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04, \ + 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A, \ + 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A, \ + 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32, \ + 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4, \ + 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38, \ + 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A, \ + 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C, \ + 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC, \ + 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF, \ + 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B, \ + 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1, \ + 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x0D, 0xD9, 0x02, \ + 0x0B, 0xFD, 0x64, 0xB6, 0x45, 0x03, 0x6C, 0x7A, \ + 0x4E, 0x67, 0x7D, 0x2C, 0x38, 0x53, 0x2A, 0x3A, \ + 0x23, 0xBA, 0x44, 0x42, 0xCA, 0xF5, 0x3E, 0xA6, \ + 0x3B, 0xB4, 0x54, 0x32, 0x9B, 0x76, 0x24, 0xC8, \ + 0x91, 0x7B, 0xDD, 0x64, 0xB1, 0xC0, 0xFD, 0x4C, \ + 0xB3, 0x8E, 0x8C, 0x33, 0x4C, 0x70, 0x1C, 0x3A, \ + 0xCD, 0xAD, 0x06, 0x57, 0xFC, 0xCF, 0xEC, 0x71, \ + 0x9B, 0x1F, 0x5C, 0x3E, 0x4E, 0x46, 0x04, 0x1F, \ + 0x38, 0x81, 0x47, 0xFB, 0x4C, 0xFD, 0xB4, 0x77, \ + 0xA5, 0x24, 0x71, 0xF7, 0xA9, 0xA9, 0x69, 0x10, \ + 0xB8, 0x55, 0x32, 0x2E, 0xDB, 0x63, 0x40, 0xD8, \ + 0xA0, 0x0E, 0xF0, 0x92, 0x35, 0x05, 0x11, 0xE3, \ + 0x0A, 0xBE, 0xC1, 0xFF, 0xF9, 0xE3, 0xA2, 0x6E, \ + 0x7F, 0xB2, 0x9F, 0x8C, 0x18, 0x30, 0x23, 0xC3, \ + 0x58, 0x7E, 0x38, 0xDA, 0x00, 0x77, 0xD9, 0xB4, \ + 0x76, 0x3E, 0x4E, 0x4B, 0x94, 0xB2, 0xBB, 0xC1, \ + 0x94, 0xC6, 0x65, 0x1E, 0x77, 0xCA, 0xF9, 0x92, \ + 0xEE, 0xAA, 0xC0, 0x23, 0x2A, 0x28, 0x1B, 0xF6, \ + 0xB3, 0xA7, 0x39, 0xC1, 0x22, 0x61, 0x16, 0x82, \ + 0x0A, 0xE8, 0xDB, 0x58, 0x47, 0xA6, 0x7C, 0xBE, \ + 0xF9, 0xC9, 0x09, 0x1B, 0x46, 0x2D, 0x53, 0x8C, \ + 0xD7, 0x2B, 0x03, 0x74, 0x6A, 0xE7, 0x7F, 0x5E, \ + 0x62, 0x29, 0x2C, 0x31, 0x15, 0x62, 0xA8, 0x46, \ + 0x50, 0x5D, 0xC8, 0x2D, 0xB8, 0x54, 0x33, 0x8A, \ + 0xE4, 0x9F, 0x52, 0x35, 0xC9, 0x5B, 0x91, 0x17, \ + 0x8C, 0xCF, 0x2D, 0xD5, 0xCA, 0xCE, 0xF4, 0x03, \ + 0xEC, 0x9D, 0x18, 0x10, 0xC6, 0x27, 0x2B, 0x04, \ + 0x5B, 0x3B, 0x71, 0xF9, 0xDC, 0x6B, 0x80, 0xD6, \ + 0x3F, 0xDD, 0x4A, 0x8E, 0x9A, 0xDB, 0x1E, 0x69, \ + 0x62, 0xA6, 0x95, 0x26, 0xD4, 0x31, 0x61, 0xC1, \ + 0xA4, 0x1D, 0x57, 0x0D, 0x79, 0x38, 0xDA, 0xD4, \ + 0xA4, 0x0E, 0x32, 0x9C, 0xCF, 0xF4, 0x6A, 0xAA, \ + 0x36, 0xAD, 0x00, 0x4C, 0xF6, 0x00, 0xC8, 0x38, \ + 0x1E, 0x42, 0x5A, 0x31, 0xD9, 0x51, 0xAE, 0x64, \ + 0xFD, 0xB2, 0x3F, 0xCE, 0xC9, 0x50, 0x9D, 0x43, \ + 0x68, 0x7F, 0xEB, 0x69, 0xED, 0xD1, 0xCC, 0x5E, \ + 0x0B, 0x8C, 0xC3, 0xBD, 0xF6, 0x4B, 0x10, 0xEF, \ + 0x86, 0xB6, 0x31, 0x42, 0xA3, 0xAB, 0x88, 0x29, \ + 0x55, 0x5B, 0x2F, 0x74, 0x7C, 0x93, 0x26, 0x65, \ + 0xCB, 0x2C, 0x0F, 0x1C, 0xC0, 0x1B, 0xD7, 0x02, \ + 0x29, 0x38, 0x88, 0x39, 0xD2, 0xAF, 0x05, 0xE4, \ + 0x54, 0x50, 0x4A, 0xC7, 0x8B, 0x75, 0x82, 0x82, \ + 0x28, 0x46, 0xC0, 0xBA, 0x35, 0xC3, 0x5F, 0x5C, \ + 0x59, 0x16, 0x0C, 0xC0, 0x46, 0xFD, 0x82, 0x51, \ + 0x54, 0x1F, 0xC6, 0x8C, 0x9C, 0x86, 0xB0, 0x22, \ + 0xBB, 0x70, 0x99, 0x87, 0x6A, 0x46, 0x0E, 0x74, \ + 0x51, 0xA8, 0xA9, 0x31, 0x09, 0x70, 0x3F, 0xEE, \ + 0x1C, 0x21, 0x7E, 0x6C, 0x38, 0x26, 0xE5, 0x2C, \ + 0x51, 0xAA, 0x69, 0x1E, 0x0E, 0x42, 0x3C, 0xFC, \ + 0x99, 0xE9, 0xE3, 0x16, 0x50, 0xC1, 0x21, 0x7B, \ + 0x62, 0x48, 0x16, 0xCD, 0xAD, 0x9A, 0x95, 0xF9, \ + 0xD5, 0xB8, 0x01, 0x94, 0x88, 0xD9, 0xC0, 0xA0, \ + 0xA1, 0xFE, 0x30, 0x75, 0xA5, 0x77, 0xE2, 0x31, \ + 0x83, 0xF8, 0x1D, 0x4A, 0x3F, 0x2F, 0xA4, 0x57, \ + 0x1E, 0xFC, 0x8C, 0xE0, 0xBA, 0x8A, 0x4F, 0xE8, \ + 0xB6, 0x85, 0x5D, 0xFE, 0x72, 0xB0, 0xA6, 0x6E, \ + 0xDE, 0xD2, 0xFB, 0xAB, 0xFB, 0xE5, 0x8A, 0x30, \ + 0xFA, 0xFA, 0xBE, 0x1C, 0x5D, 0x71, 0xA8, 0x7E, \ + 0x2F, 0x74, 0x1E, 0xF8, 0xC1, 0xFE, 0x86, 0xFE, \ + 0xA6, 0xBB, 0xFD, 0xE5, 0x30, 0x67, 0x7F, 0x0D, \ + 0x97, 0xD1, 0x1D, 0x49, 0xF7, 0xA8, 0x44, 0x3D, \ + 0x08, 0x22, 0xE5, 0x06, 0xA9, 0xF4, 0x61, 0x4E, \ + 0x01, 0x1E, 0x2A, 0x94, 0x83, 0x8F, 0xF8, 0x8C, \ + 0xD6, 0x8C, 0x8B, 0xB7, 0xC5, 0xC6, 0x42, 0x4C, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } + +#define MBEDTLS_DHM_RFC7919_FFDHE8192_G_BIN { 0x02 } + +#endif /* dhm.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ecdh.h b/ext/opcua_client/mbedtls/include/mbedtls/ecdh.h new file mode 100644 index 0000000..bf41a70 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ecdh.h @@ -0,0 +1,429 @@ +/** + * \file ecdh.h + * + * \brief This file contains ECDH definitions and functions. + * + * The Elliptic Curve Diffie-Hellman (ECDH) protocol is an anonymous + * key agreement protocol allowing two parties to establish a shared + * secret over an insecure channel. Each party must have an + * elliptic-curve public–private key pair. + * + * For more information, see NIST SP 800-56A Rev. 2: Recommendation for + * Pair-Wise Key Establishment Schemes Using Discrete Logarithm + * Cryptography. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_ECDH_H +#define MBEDTLS_ECDH_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/ecp.h" + +#if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED) +#undef MBEDTLS_ECDH_LEGACY_CONTEXT +#include "everest/everest.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Defines the source of the imported EC key. + */ +typedef enum { + MBEDTLS_ECDH_OURS, /**< Our key. */ + MBEDTLS_ECDH_THEIRS, /**< The key of the peer. */ +} mbedtls_ecdh_side; + +#if !defined(MBEDTLS_ECDH_LEGACY_CONTEXT) +/** + * Defines the ECDH implementation used. + * + * Later versions of the library may add new variants, therefore users should + * not make any assumptions about them. + */ +typedef enum { + MBEDTLS_ECDH_VARIANT_NONE = 0, /*!< Implementation not defined. */ + MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0,/*!< The default Mbed TLS implementation */ +#if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED) + MBEDTLS_ECDH_VARIANT_EVEREST /*!< Everest implementation */ +#endif +} mbedtls_ecdh_variant; + +/** + * The context used by the default ECDH implementation. + * + * Later versions might change the structure of this context, therefore users + * should not make any assumptions about the structure of + * mbedtls_ecdh_context_mbed. + */ +typedef struct mbedtls_ecdh_context_mbed { + mbedtls_ecp_group grp; /*!< The elliptic curve used. */ + mbedtls_mpi d; /*!< The private key. */ + mbedtls_ecp_point Q; /*!< The public key. */ + mbedtls_ecp_point Qp; /*!< The value of the public key of the peer. */ + mbedtls_mpi z; /*!< The shared secret. */ +#if defined(MBEDTLS_ECP_RESTARTABLE) + mbedtls_ecp_restart_ctx rs; /*!< The restart context for EC computations. */ +#endif +} mbedtls_ecdh_context_mbed; +#endif + +/** + * + * \warning Performing multiple operations concurrently on the same + * ECDSA context is not supported; objects of this type + * should not be shared between multiple threads. + * \brief The ECDH context structure. + */ +typedef struct mbedtls_ecdh_context { +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + mbedtls_ecp_group grp; /*!< The elliptic curve used. */ + mbedtls_mpi d; /*!< The private key. */ + mbedtls_ecp_point Q; /*!< The public key. */ + mbedtls_ecp_point Qp; /*!< The value of the public key of the peer. */ + mbedtls_mpi z; /*!< The shared secret. */ + int point_format; /*!< The format of point export in TLS messages. */ + mbedtls_ecp_point Vi; /*!< The blinding value. */ + mbedtls_ecp_point Vf; /*!< The unblinding value. */ + mbedtls_mpi _d; /*!< The previous \p d. */ +#if defined(MBEDTLS_ECP_RESTARTABLE) + int restart_enabled; /*!< The flag for restartable mode. */ + mbedtls_ecp_restart_ctx rs; /*!< The restart context for EC computations. */ +#endif /* MBEDTLS_ECP_RESTARTABLE */ +#else + uint8_t point_format; /*!< The format of point export in TLS messages + as defined in RFC 4492. */ + mbedtls_ecp_group_id grp_id;/*!< The elliptic curve used. */ + mbedtls_ecdh_variant var; /*!< The ECDH implementation/structure used. */ + union { + mbedtls_ecdh_context_mbed mbed_ecdh; +#if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED) + mbedtls_ecdh_context_everest everest_ecdh; +#endif + } ctx; /*!< Implementation-specific context. The + context in use is specified by the \c var + field. */ +#if defined(MBEDTLS_ECP_RESTARTABLE) + uint8_t restart_enabled; /*!< The flag for restartable mode. Functions of + an alternative implementation not supporting + restartable mode must return + MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED error + if this flag is set. */ +#endif /* MBEDTLS_ECP_RESTARTABLE */ +#endif /* MBEDTLS_ECDH_LEGACY_CONTEXT */ +} +mbedtls_ecdh_context; + +/** + * \brief Check whether a given group can be used for ECDH. + * + * \param gid The ECP group ID to check. + * + * \return \c 1 if the group can be used, \c 0 otherwise + */ +int mbedtls_ecdh_can_do(mbedtls_ecp_group_id gid); + +/** + * \brief This function generates an ECDH keypair on an elliptic + * curve. + * + * This function performs the first of two core computations + * implemented during the ECDH key exchange. The second core + * computation is performed by mbedtls_ecdh_compute_shared(). + * + * \see ecp.h + * + * \param grp The ECP group to use. This must be initialized and have + * domain parameters loaded, for example through + * mbedtls_ecp_load() or mbedtls_ecp_tls_read_group(). + * \param d The destination MPI (private key). + * This must be initialized. + * \param Q The destination point (public key). + * This must be initialized. + * \param f_rng The RNG function to use. This must not be \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL in case \p f_rng doesn't need a context argument. + * + * \return \c 0 on success. + * \return Another \c MBEDTLS_ERR_ECP_XXX or + * \c MBEDTLS_MPI_XXX error code on failure. + */ +int mbedtls_ecdh_gen_public(mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief This function computes the shared secret. + * + * This function performs the second of two core computations + * implemented during the ECDH key exchange. The first core + * computation is performed by mbedtls_ecdh_gen_public(). + * + * \see ecp.h + * + * \note If \p f_rng is not NULL, it is used to implement + * countermeasures against side-channel attacks. + * For more information, see mbedtls_ecp_mul(). + * + * \param grp The ECP group to use. This must be initialized and have + * domain parameters loaded, for example through + * mbedtls_ecp_load() or mbedtls_ecp_tls_read_group(). + * \param z The destination MPI (shared secret). + * This must be initialized. + * \param Q The public key from another party. + * This must be initialized. + * \param d Our secret exponent (private key). + * This must be initialized. + * \param f_rng The RNG function. This may be \c NULL if randomization + * of intermediate results during the ECP computations is + * not needed (discouraged). See the documentation of + * mbedtls_ecp_mul() for more. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL if \p f_rng is \c NULL or doesn't need a + * context argument. + * + * \return \c 0 on success. + * \return Another \c MBEDTLS_ERR_ECP_XXX or + * \c MBEDTLS_MPI_XXX error code on failure. + */ +int mbedtls_ecdh_compute_shared(mbedtls_ecp_group *grp, mbedtls_mpi *z, + const mbedtls_ecp_point *Q, const mbedtls_mpi *d, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief This function initializes an ECDH context. + * + * \param ctx The ECDH context to initialize. This must not be \c NULL. + */ +void mbedtls_ecdh_init(mbedtls_ecdh_context *ctx); + +/** + * \brief This function sets up the ECDH context with the information + * given. + * + * This function should be called after mbedtls_ecdh_init() but + * before mbedtls_ecdh_make_params(). There is no need to call + * this function before mbedtls_ecdh_read_params(). + * + * This is the first function used by a TLS server for ECDHE + * ciphersuites. + * + * \param ctx The ECDH context to set up. This must be initialized. + * \param grp_id The group id of the group to set up the context for. + * + * \return \c 0 on success. + */ +int mbedtls_ecdh_setup(mbedtls_ecdh_context *ctx, + mbedtls_ecp_group_id grp_id); + +/** + * \brief This function frees a context. + * + * \param ctx The context to free. This may be \c NULL, in which + * case this function does nothing. If it is not \c NULL, + * it must point to an initialized ECDH context. + */ +void mbedtls_ecdh_free(mbedtls_ecdh_context *ctx); + +/** + * \brief This function generates an EC key pair and exports its + * in the format used in a TLS ServerKeyExchange handshake + * message. + * + * This is the second function used by a TLS server for ECDHE + * ciphersuites. (It is called after mbedtls_ecdh_setup().) + * + * \see ecp.h + * + * \param ctx The ECDH context to use. This must be initialized + * and bound to a group, for example via mbedtls_ecdh_setup(). + * \param olen The address at which to store the number of Bytes written. + * \param buf The destination buffer. This must be a writable buffer of + * length \p blen Bytes. + * \param blen The length of the destination buffer \p buf in Bytes. + * \param f_rng The RNG function to use. This must not be \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL in case \p f_rng doesn't need a context argument. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of + * operations was reached: see \c mbedtls_ecp_set_max_ops(). + * \return Another \c MBEDTLS_ERR_ECP_XXX error code on failure. + */ +int mbedtls_ecdh_make_params(mbedtls_ecdh_context *ctx, size_t *olen, + unsigned char *buf, size_t blen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief This function parses the ECDHE parameters in a + * TLS ServerKeyExchange handshake message. + * + * \note In a TLS handshake, this is the how the client + * sets up its ECDHE context from the server's public + * ECDHE key material. + * + * \see ecp.h + * + * \param ctx The ECDHE context to use. This must be initialized. + * \param buf On input, \c *buf must be the start of the input buffer. + * On output, \c *buf is updated to point to the end of the + * data that has been read. On success, this is the first byte + * past the end of the ServerKeyExchange parameters. + * On error, this is the point at which an error has been + * detected, which is usually not useful except to debug + * failures. + * \param end The end of the input buffer. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX error code on failure. + * + */ +int mbedtls_ecdh_read_params(mbedtls_ecdh_context *ctx, + const unsigned char **buf, + const unsigned char *end); + +/** + * \brief This function sets up an ECDH context from an EC key. + * + * It is used by clients and servers in place of the + * ServerKeyExchange for static ECDH, and imports ECDH + * parameters from the EC key information of a certificate. + * + * \see ecp.h + * + * \param ctx The ECDH context to set up. This must be initialized. + * \param key The EC key to use. This must be initialized. + * \param side Defines the source of the key. Possible values are: + * - #MBEDTLS_ECDH_OURS: The key is ours. + * - #MBEDTLS_ECDH_THEIRS: The key is that of the peer. + * + * \return \c 0 on success. + * \return Another \c MBEDTLS_ERR_ECP_XXX error code on failure. + * + */ +int mbedtls_ecdh_get_params(mbedtls_ecdh_context *ctx, + const mbedtls_ecp_keypair *key, + mbedtls_ecdh_side side); + +/** + * \brief This function generates a public key and exports it + * as a TLS ClientKeyExchange payload. + * + * This is the second function used by a TLS client for ECDH(E) + * ciphersuites. + * + * \see ecp.h + * + * \param ctx The ECDH context to use. This must be initialized + * and bound to a group, the latter usually by + * mbedtls_ecdh_read_params(). + * \param olen The address at which to store the number of Bytes written. + * This must not be \c NULL. + * \param buf The destination buffer. This must be a writable buffer + * of length \p blen Bytes. + * \param blen The size of the destination buffer \p buf in Bytes. + * \param f_rng The RNG function to use. This must not be \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL in case \p f_rng doesn't need a context argument. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of + * operations was reached: see \c mbedtls_ecp_set_max_ops(). + * \return Another \c MBEDTLS_ERR_ECP_XXX error code on failure. + */ +int mbedtls_ecdh_make_public(mbedtls_ecdh_context *ctx, size_t *olen, + unsigned char *buf, size_t blen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief This function parses and processes the ECDHE payload of a + * TLS ClientKeyExchange message. + * + * This is the third function used by a TLS server for ECDH(E) + * ciphersuites. (It is called after mbedtls_ecdh_setup() and + * mbedtls_ecdh_make_params().) + * + * \see ecp.h + * + * \param ctx The ECDH context to use. This must be initialized + * and bound to a group, for example via mbedtls_ecdh_setup(). + * \param buf The pointer to the ClientKeyExchange payload. This must + * be a readable buffer of length \p blen Bytes. + * \param blen The length of the input buffer \p buf in Bytes. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX error code on failure. + */ +int mbedtls_ecdh_read_public(mbedtls_ecdh_context *ctx, + const unsigned char *buf, size_t blen); + +/** + * \brief This function derives and exports the shared secret. + * + * This is the last function used by both TLS client + * and servers. + * + * \note If \p f_rng is not NULL, it is used to implement + * countermeasures against side-channel attacks. + * For more information, see mbedtls_ecp_mul(). + * + * \see ecp.h + + * \param ctx The ECDH context to use. This must be initialized + * and have its own private key generated and the peer's + * public key imported. + * \param olen The address at which to store the total number of + * Bytes written on success. This must not be \c NULL. + * \param buf The buffer to write the generated shared key to. This + * must be a writable buffer of size \p blen Bytes. + * \param blen The length of the destination buffer \p buf in Bytes. + * \param f_rng The RNG function, for blinding purposes. This may + * b \c NULL if blinding isn't needed. + * \param p_rng The RNG context. This may be \c NULL if \p f_rng + * doesn't need a context argument. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of + * operations was reached: see \c mbedtls_ecp_set_max_ops(). + * \return Another \c MBEDTLS_ERR_ECP_XXX error code on failure. + */ +int mbedtls_ecdh_calc_secret(mbedtls_ecdh_context *ctx, size_t *olen, + unsigned char *buf, size_t blen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +#if defined(MBEDTLS_ECP_RESTARTABLE) +/** + * \brief This function enables restartable EC computations for this + * context. (Default: disabled.) + * + * \see \c mbedtls_ecp_set_max_ops() + * + * \note It is not possible to safely disable restartable + * computations once enabled, except by free-ing the context, + * which cancels possible in-progress operations. + * + * \param ctx The ECDH context to use. This must be initialized. + */ +void mbedtls_ecdh_enable_restart(mbedtls_ecdh_context *ctx); +#endif /* MBEDTLS_ECP_RESTARTABLE */ + +#ifdef __cplusplus +} +#endif + +#endif /* ecdh.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ecdsa.h b/ext/opcua_client/mbedtls/include/mbedtls/ecdsa.h new file mode 100644 index 0000000..34a6b13 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ecdsa.h @@ -0,0 +1,612 @@ +/** + * \file ecdsa.h + * + * \brief This file contains ECDSA definitions and functions. + * + * The Elliptic Curve Digital Signature Algorithm (ECDSA) is defined in + * Standards for Efficient Cryptography Group (SECG): + * SEC1 Elliptic Curve Cryptography. + * The use of ECDSA for TLS is defined in RFC-4492: Elliptic Curve + * Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS). + * + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_ECDSA_H +#define MBEDTLS_ECDSA_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/ecp.h" +#include "mbedtls/md.h" + +/** + * \brief Maximum ECDSA signature size for a given curve bit size + * + * \param bits Curve size in bits + * \return Maximum signature size in bytes + * + * \note This macro returns a compile-time constant if its argument + * is one. It may evaluate its argument multiple times. + */ +/* + * Ecdsa-Sig-Value ::= SEQUENCE { + * r INTEGER, + * s INTEGER + * } + * + * For each of r and s, the value (V) may include an extra initial "0" bit. + */ +#define MBEDTLS_ECDSA_MAX_SIG_LEN(bits) \ + (/*T,L of SEQUENCE*/ ((bits) >= 61 * 8 ? 3 : 2) + \ + /*T,L of r,s*/ 2 * (((bits) >= 127 * 8 ? 3 : 2) + \ + /*V of r,s*/ ((bits) + 8) / 8)) + +/** The maximal size of an ECDSA signature in Bytes. */ +#define MBEDTLS_ECDSA_MAX_LEN MBEDTLS_ECDSA_MAX_SIG_LEN(MBEDTLS_ECP_MAX_BITS) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The ECDSA context structure. + * + * \warning Performing multiple operations concurrently on the same + * ECDSA context is not supported; objects of this type + * should not be shared between multiple threads. + */ +typedef mbedtls_ecp_keypair mbedtls_ecdsa_context; + +#if defined(MBEDTLS_ECP_RESTARTABLE) + +/** + * \brief Internal restart context for ecdsa_verify() + * + * \note Opaque struct, defined in ecdsa.c + */ +typedef struct mbedtls_ecdsa_restart_ver mbedtls_ecdsa_restart_ver_ctx; + +/** + * \brief Internal restart context for ecdsa_sign() + * + * \note Opaque struct, defined in ecdsa.c + */ +typedef struct mbedtls_ecdsa_restart_sig mbedtls_ecdsa_restart_sig_ctx; + +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) +/** + * \brief Internal restart context for ecdsa_sign_det() + * + * \note Opaque struct, defined in ecdsa.c + */ +typedef struct mbedtls_ecdsa_restart_det mbedtls_ecdsa_restart_det_ctx; +#endif + +/** + * \brief General context for resuming ECDSA operations + */ +typedef struct { + mbedtls_ecp_restart_ctx ecp; /*!< base context for ECP restart and + shared administrative info */ + mbedtls_ecdsa_restart_ver_ctx *ver; /*!< ecdsa_verify() sub-context */ + mbedtls_ecdsa_restart_sig_ctx *sig; /*!< ecdsa_sign() sub-context */ +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) + mbedtls_ecdsa_restart_det_ctx *det; /*!< ecdsa_sign_det() sub-context */ +#endif +} mbedtls_ecdsa_restart_ctx; + +#else /* MBEDTLS_ECP_RESTARTABLE */ + +/* Now we can declare functions that take a pointer to that */ +typedef void mbedtls_ecdsa_restart_ctx; + +#endif /* MBEDTLS_ECP_RESTARTABLE */ + +/** + * \brief This function checks whether a given group can be used + * for ECDSA. + * + * \param gid The ECP group ID to check. + * + * \return \c 1 if the group can be used, \c 0 otherwise + */ +int mbedtls_ecdsa_can_do(mbedtls_ecp_group_id gid); + +/** + * \brief This function computes the ECDSA signature of a + * previously-hashed message. + * + * \note The deterministic version implemented in + * mbedtls_ecdsa_sign_det() is usually preferred. + * + * \note If the bitlength of the message hash is larger than the + * bitlength of the group order, then the hash is truncated + * as defined in Standards for Efficient Cryptography Group + * (SECG): SEC1 Elliptic Curve Cryptography, section + * 4.1.3, step 5. + * + * \see ecp.h + * + * \param grp The context for the elliptic curve to use. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param r The MPI context in which to store the first part + * the signature. This must be initialized. + * \param s The MPI context in which to store the second part + * the signature. This must be initialized. + * \param d The private signing key. This must be initialized. + * \param buf The content to be signed. This is usually the hash of + * the original data to be signed. This must be a readable + * buffer of length \p blen Bytes. It may be \c NULL if + * \p blen is zero. + * \param blen The length of \p buf in Bytes. + * \param f_rng The RNG function. This must not be \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL if \p f_rng doesn't need a context parameter. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX + * or \c MBEDTLS_MPI_XXX error code on failure. + */ +int mbedtls_ecdsa_sign(mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, + const mbedtls_mpi *d, const unsigned char *buf, size_t blen, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng); + +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief This function computes the ECDSA signature of a + * previously-hashed message, deterministic version. + * + * For more information, see RFC-6979: Deterministic + * Usage of the Digital Signature Algorithm (DSA) and Elliptic + * Curve Digital Signature Algorithm (ECDSA). + * + * \note If the bitlength of the message hash is larger than the + * bitlength of the group order, then the hash is truncated as + * defined in Standards for Efficient Cryptography Group + * (SECG): SEC1 Elliptic Curve Cryptography, section + * 4.1.3, step 5. + * + * \warning Since the output of the internal RNG is always the same for + * the same key and message, this limits the efficiency of + * blinding and leaks information through side channels. For + * secure behavior use mbedtls_ecdsa_sign_det_ext() instead. + * + * (Optimally the blinding is a random value that is different + * on every execution. In this case the blinding is still + * random from the attackers perspective, but is the same on + * each execution. This means that this blinding does not + * prevent attackers from recovering secrets by combining + * several measurement traces, but may prevent some attacks + * that exploit relationships between secret data.) + * + * \see ecp.h + * + * \param grp The context for the elliptic curve to use. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param r The MPI context in which to store the first part + * the signature. This must be initialized. + * \param s The MPI context in which to store the second part + * the signature. This must be initialized. + * \param d The private signing key. This must be initialized + * and setup, for example through mbedtls_ecp_gen_privkey(). + * \param buf The hashed content to be signed. This must be a readable + * buffer of length \p blen Bytes. It may be \c NULL if + * \p blen is zero. + * \param blen The length of \p buf in Bytes. + * \param md_alg The hash algorithm used to hash the original data. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX + * error code on failure. + */ +int mbedtls_ecdsa_sign_det(mbedtls_ecp_group *grp, mbedtls_mpi *r, + mbedtls_mpi *s, const mbedtls_mpi *d, + const unsigned char *buf, size_t blen, + mbedtls_md_type_t md_alg) MBEDTLS_DEPRECATED; +#undef MBEDTLS_DEPRECATED +#endif /* MBEDTLS_DEPRECATED_REMOVED */ + +/** + * \brief This function computes the ECDSA signature of a + * previously-hashed message, deterministic version. + * + * For more information, see RFC-6979: Deterministic + * Usage of the Digital Signature Algorithm (DSA) and Elliptic + * Curve Digital Signature Algorithm (ECDSA). + * + * \note If the bitlength of the message hash is larger than the + * bitlength of the group order, then the hash is truncated as + * defined in Standards for Efficient Cryptography Group + * (SECG): SEC1 Elliptic Curve Cryptography, section + * 4.1.3, step 5. + * + * \see ecp.h + * + * \param grp The context for the elliptic curve to use. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param r The MPI context in which to store the first part + * the signature. This must be initialized. + * \param s The MPI context in which to store the second part + * the signature. This must be initialized. + * \param d The private signing key. This must be initialized + * and setup, for example through mbedtls_ecp_gen_privkey(). + * \param buf The hashed content to be signed. This must be a readable + * buffer of length \p blen Bytes. It may be \c NULL if + * \p blen is zero. + * \param blen The length of \p buf in Bytes. + * \param md_alg The hash algorithm used to hash the original data. + * \param f_rng_blind The RNG function used for blinding. This must not be + * \c NULL. + * \param p_rng_blind The RNG context to be passed to \p f_rng_blind. This + * may be \c NULL if \p f_rng_blind doesn't need + * a context parameter. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX + * error code on failure. + */ +int mbedtls_ecdsa_sign_det_ext(mbedtls_ecp_group *grp, mbedtls_mpi *r, + mbedtls_mpi *s, const mbedtls_mpi *d, + const unsigned char *buf, size_t blen, + mbedtls_md_type_t md_alg, + int (*f_rng_blind)(void *, unsigned char *, size_t), + void *p_rng_blind); +#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ + +/** + * \brief This function verifies the ECDSA signature of a + * previously-hashed message. + * + * \note If the bitlength of the message hash is larger than the + * bitlength of the group order, then the hash is truncated as + * defined in Standards for Efficient Cryptography Group + * (SECG): SEC1 Elliptic Curve Cryptography, section + * 4.1.4, step 3. + * + * \see ecp.h + * + * \param grp The ECP group to use. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param buf The hashed content that was signed. This must be a readable + * buffer of length \p blen Bytes. It may be \c NULL if + * \p blen is zero. + * \param blen The length of \p buf in Bytes. + * \param Q The public key to use for verification. This must be + * initialized and setup. + * \param r The first integer of the signature. + * This must be initialized. + * \param s The second integer of the signature. + * This must be initialized. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX + * error code on failure. + */ +int mbedtls_ecdsa_verify(mbedtls_ecp_group *grp, + const unsigned char *buf, size_t blen, + const mbedtls_ecp_point *Q, const mbedtls_mpi *r, + const mbedtls_mpi *s); + +/** + * \brief This function computes the ECDSA signature and writes it + * to a buffer, serialized as defined in RFC-4492: + * Elliptic Curve Cryptography (ECC) Cipher Suites for + * Transport Layer Security (TLS). + * + * \warning It is not thread-safe to use the same context in + * multiple threads. + * + * \note The deterministic version is used if + * #MBEDTLS_ECDSA_DETERMINISTIC is defined. For more + * information, see RFC-6979: Deterministic Usage + * of the Digital Signature Algorithm (DSA) and Elliptic + * Curve Digital Signature Algorithm (ECDSA). + * + * \note If the bitlength of the message hash is larger than the + * bitlength of the group order, then the hash is truncated as + * defined in Standards for Efficient Cryptography Group + * (SECG): SEC1 Elliptic Curve Cryptography, section + * 4.1.3, step 5. + * + * \see ecp.h + * + * \param ctx The ECDSA context to use. This must be initialized + * and have a group and private key bound to it, for example + * via mbedtls_ecdsa_genkey() or mbedtls_ecdsa_from_keypair(). + * \param md_alg The message digest that was used to hash the message. + * \param hash The message hash to be signed. This must be a readable + * buffer of length \p hlen Bytes. + * \param hlen The length of the hash \p hash in Bytes. + * \param sig The buffer to which to write the signature. This must be a + * writable buffer of length at least twice as large as the + * size of the curve used, plus 9. For example, 73 Bytes if + * a 256-bit curve is used. A buffer length of + * #MBEDTLS_ECDSA_MAX_LEN is always safe. + * \param slen The address at which to store the actual length of + * the signature written. Must not be \c NULL. + * \param f_rng The RNG function. This must not be \c NULL if + * #MBEDTLS_ECDSA_DETERMINISTIC is unset. Otherwise, + * it is used only for blinding and may be set to \c NULL, but + * doing so is DEPRECATED. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL if \p f_rng is \c NULL or doesn't use a context. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or + * \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_ecdsa_write_signature(mbedtls_ecdsa_context *ctx, + mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hlen, + unsigned char *sig, size_t *slen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief This function computes the ECDSA signature and writes it + * to a buffer, in a restartable way. + * + * \see \c mbedtls_ecdsa_write_signature() + * + * \note This function is like \c mbedtls_ecdsa_write_signature() + * but it can return early and restart according to the limit + * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. + * + * \param ctx The ECDSA context to use. This must be initialized + * and have a group and private key bound to it, for example + * via mbedtls_ecdsa_genkey() or mbedtls_ecdsa_from_keypair(). + * \param md_alg The message digest that was used to hash the message. + * \param hash The message hash to be signed. This must be a readable + * buffer of length \p hlen Bytes. + * \param hlen The length of the hash \p hash in Bytes. + * \param sig The buffer to which to write the signature. This must be a + * writable buffer of length at least twice as large as the + * size of the curve used, plus 9. For example, 73 Bytes if + * a 256-bit curve is used. A buffer length of + * #MBEDTLS_ECDSA_MAX_LEN is always safe. + * \param slen The address at which to store the actual length of + * the signature written. Must not be \c NULL. + * \param f_rng The RNG function. This must not be \c NULL if + * #MBEDTLS_ECDSA_DETERMINISTIC is unset. Otherwise, + * it is unused and may be set to \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL if \p f_rng is \c NULL or doesn't use a context. + * \param rs_ctx The restart context to use. This may be \c NULL to disable + * restarting. If it is not \c NULL, it must point to an + * initialized restart context. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of + * operations was reached: see \c mbedtls_ecp_set_max_ops(). + * \return Another \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or + * \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_ecdsa_write_signature_restartable(mbedtls_ecdsa_context *ctx, + mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hlen, + unsigned char *sig, size_t *slen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + mbedtls_ecdsa_restart_ctx *rs_ctx); + +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief This function computes an ECDSA signature and writes + * it to a buffer, serialized as defined in RFC-4492: + * Elliptic Curve Cryptography (ECC) Cipher Suites for + * Transport Layer Security (TLS). + * + * The deterministic version is defined in RFC-6979: + * Deterministic Usage of the Digital Signature Algorithm (DSA) + * and Elliptic Curve Digital Signature Algorithm (ECDSA). + * + * \warning It is not thread-safe to use the same context in + * multiple threads. + * + * \note If the bitlength of the message hash is larger than the + * bitlength of the group order, then the hash is truncated as + * defined in Standards for Efficient Cryptography Group + * (SECG): SEC1 Elliptic Curve Cryptography, section + * 4.1.3, step 5. + * + * \see ecp.h + * + * \deprecated Superseded by mbedtls_ecdsa_write_signature() in + * Mbed TLS version 2.0 and later. + * + * \param ctx The ECDSA context to use. This must be initialized + * and have a group and private key bound to it, for example + * via mbedtls_ecdsa_genkey() or mbedtls_ecdsa_from_keypair(). + * \param hash The message hash to be signed. This must be a readable + * buffer of length \p hlen Bytes. + * \param hlen The length of the hash \p hash in Bytes. + * \param sig The buffer to which to write the signature. This must be a + * writable buffer of length at least twice as large as the + * size of the curve used, plus 9. For example, 73 Bytes if + * a 256-bit curve is used. A buffer length of + * #MBEDTLS_ECDSA_MAX_LEN is always safe. + * \param slen The address at which to store the actual length of + * the signature written. Must not be \c NULL. + * \param md_alg The message digest that was used to hash the message. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or + * \c MBEDTLS_ERR_ASN1_XXX error code on failure. + */ +int mbedtls_ecdsa_write_signature_det(mbedtls_ecdsa_context *ctx, + const unsigned char *hash, size_t hlen, + unsigned char *sig, size_t *slen, + mbedtls_md_type_t md_alg) MBEDTLS_DEPRECATED; +#undef MBEDTLS_DEPRECATED +#endif /* MBEDTLS_DEPRECATED_REMOVED */ +#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ + +/** + * \brief This function reads and verifies an ECDSA signature. + * + * \note If the bitlength of the message hash is larger than the + * bitlength of the group order, then the hash is truncated as + * defined in Standards for Efficient Cryptography Group + * (SECG): SEC1 Elliptic Curve Cryptography, section + * 4.1.4, step 3. + * + * \see ecp.h + * + * \param ctx The ECDSA context to use. This must be initialized + * and have a group and public key bound to it. + * \param hash The message hash that was signed. This must be a readable + * buffer of length \p hlen Bytes. + * \param hlen The size of the hash \p hash. + * \param sig The signature to read and verify. This must be a readable + * buffer of length \p slen Bytes. + * \param slen The size of \p sig in Bytes. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid. + * \return #MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if there is a valid + * signature in \p sig, but its length is less than \p siglen. + * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_ERR_MPI_XXX + * error code on failure for any other reason. + */ +int mbedtls_ecdsa_read_signature(mbedtls_ecdsa_context *ctx, + const unsigned char *hash, size_t hlen, + const unsigned char *sig, size_t slen); + +/** + * \brief This function reads and verifies an ECDSA signature, + * in a restartable way. + * + * \see \c mbedtls_ecdsa_read_signature() + * + * \note This function is like \c mbedtls_ecdsa_read_signature() + * but it can return early and restart according to the limit + * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. + * + * \param ctx The ECDSA context to use. This must be initialized + * and have a group and public key bound to it. + * \param hash The message hash that was signed. This must be a readable + * buffer of length \p hlen Bytes. + * \param hlen The size of the hash \p hash. + * \param sig The signature to read and verify. This must be a readable + * buffer of length \p slen Bytes. + * \param slen The size of \p sig in Bytes. + * \param rs_ctx The restart context to use. This may be \c NULL to disable + * restarting. If it is not \c NULL, it must point to an + * initialized restart context. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid. + * \return #MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if there is a valid + * signature in \p sig, but its length is less than \p siglen. + * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of + * operations was reached: see \c mbedtls_ecp_set_max_ops(). + * \return Another \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_ERR_MPI_XXX + * error code on failure for any other reason. + */ +int mbedtls_ecdsa_read_signature_restartable(mbedtls_ecdsa_context *ctx, + const unsigned char *hash, size_t hlen, + const unsigned char *sig, size_t slen, + mbedtls_ecdsa_restart_ctx *rs_ctx); + +/** + * \brief This function generates an ECDSA keypair on the given curve. + * + * \see ecp.h + * + * \param ctx The ECDSA context to store the keypair in. + * This must be initialized. + * \param gid The elliptic curve to use. One of the various + * \c MBEDTLS_ECP_DP_XXX macros depending on configuration. + * \param f_rng The RNG function to use. This must not be \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL if \p f_rng doesn't need a context argument. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX code on failure. + */ +int mbedtls_ecdsa_genkey(mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng); + +/** + * \brief This function sets up an ECDSA context from an EC key pair. + * + * \see ecp.h + * + * \param ctx The ECDSA context to setup. This must be initialized. + * \param key The EC key to use. This must be initialized and hold + * a private-public key pair or a public key. In the former + * case, the ECDSA context may be used for signature creation + * and verification after this call. In the latter case, it + * may be used for signature verification. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX code on failure. + */ +int mbedtls_ecdsa_from_keypair(mbedtls_ecdsa_context *ctx, + const mbedtls_ecp_keypair *key); + +/** + * \brief This function initializes an ECDSA context. + * + * \param ctx The ECDSA context to initialize. + * This must not be \c NULL. + */ +void mbedtls_ecdsa_init(mbedtls_ecdsa_context *ctx); + +/** + * \brief This function frees an ECDSA context. + * + * \param ctx The ECDSA context to free. This may be \c NULL, + * in which case this function does nothing. If it + * is not \c NULL, it must be initialized. + */ +void mbedtls_ecdsa_free(mbedtls_ecdsa_context *ctx); + +#if defined(MBEDTLS_ECP_RESTARTABLE) +/** + * \brief Initialize a restart context. + * + * \param ctx The restart context to initialize. + * This must not be \c NULL. + */ +void mbedtls_ecdsa_restart_init(mbedtls_ecdsa_restart_ctx *ctx); + +/** + * \brief Free the components of a restart context. + * + * \param ctx The restart context to free. This may be \c NULL, + * in which case this function does nothing. If it + * is not \c NULL, it must be initialized. + */ +void mbedtls_ecdsa_restart_free(mbedtls_ecdsa_restart_ctx *ctx); +#endif /* MBEDTLS_ECP_RESTARTABLE */ + +#ifdef __cplusplus +} +#endif + +#endif /* ecdsa.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ecjpake.h b/ext/opcua_client/mbedtls/include/mbedtls/ecjpake.h new file mode 100644 index 0000000..1a98442 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ecjpake.h @@ -0,0 +1,262 @@ +/** + * \file ecjpake.h + * + * \brief Elliptic curve J-PAKE + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_ECJPAKE_H +#define MBEDTLS_ECJPAKE_H + +/* + * J-PAKE is a password-authenticated key exchange that allows deriving a + * strong shared secret from a (potentially low entropy) pre-shared + * passphrase, with forward secrecy and mutual authentication. + * https://en.wikipedia.org/wiki/Password_Authenticated_Key_Exchange_by_Juggling + * + * This file implements the Elliptic Curve variant of J-PAKE, + * as defined in Chapter 7.4 of the Thread v1.0 Specification, + * available to members of the Thread Group http://threadgroup.org/ + * + * As the J-PAKE algorithm is inherently symmetric, so is our API. + * Each party needs to send its first round message, in any order, to the + * other party, then each sends its second round message, in any order. + * The payloads are serialized in a way suitable for use in TLS, but could + * also be use outside TLS. + */ +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/ecp.h" +#include "mbedtls/md.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Roles in the EC J-PAKE exchange + */ +typedef enum { + MBEDTLS_ECJPAKE_CLIENT = 0, /**< Client */ + MBEDTLS_ECJPAKE_SERVER, /**< Server */ +} mbedtls_ecjpake_role; + +#if !defined(MBEDTLS_ECJPAKE_ALT) +/** + * EC J-PAKE context structure. + * + * J-PAKE is a symmetric protocol, except for the identifiers used in + * Zero-Knowledge Proofs, and the serialization of the second message + * (KeyExchange) as defined by the Thread spec. + * + * In order to benefit from this symmetry, we choose a different naming + * convention from the Thread v1.0 spec. Correspondence is indicated in the + * description as a pair C: client name, S: server name + */ +typedef struct mbedtls_ecjpake_context { + const mbedtls_md_info_t *md_info; /**< Hash to use */ + mbedtls_ecp_group grp; /**< Elliptic curve */ + mbedtls_ecjpake_role role; /**< Are we client or server? */ + int point_format; /**< Format for point export */ + + mbedtls_ecp_point Xm1; /**< My public key 1 C: X1, S: X3 */ + mbedtls_ecp_point Xm2; /**< My public key 2 C: X2, S: X4 */ + mbedtls_ecp_point Xp1; /**< Peer public key 1 C: X3, S: X1 */ + mbedtls_ecp_point Xp2; /**< Peer public key 2 C: X4, S: X2 */ + mbedtls_ecp_point Xp; /**< Peer public key C: Xs, S: Xc */ + + mbedtls_mpi xm1; /**< My private key 1 C: x1, S: x3 */ + mbedtls_mpi xm2; /**< My private key 2 C: x2, S: x4 */ + + mbedtls_mpi s; /**< Pre-shared secret (passphrase) */ +} mbedtls_ecjpake_context; + +#else /* MBEDTLS_ECJPAKE_ALT */ +#include "ecjpake_alt.h" +#endif /* MBEDTLS_ECJPAKE_ALT */ + +/** + * \brief Initialize an ECJPAKE context. + * + * \param ctx The ECJPAKE context to initialize. + * This must not be \c NULL. + */ +void mbedtls_ecjpake_init(mbedtls_ecjpake_context *ctx); + +/** + * \brief Set up an ECJPAKE context for use. + * + * \note Currently the only values for hash/curve allowed by the + * standard are #MBEDTLS_MD_SHA256/#MBEDTLS_ECP_DP_SECP256R1. + * + * \param ctx The ECJPAKE context to set up. This must be initialized. + * \param role The role of the caller. This must be either + * #MBEDTLS_ECJPAKE_CLIENT or #MBEDTLS_ECJPAKE_SERVER. + * \param hash The identifier of the hash function to use, + * for example #MBEDTLS_MD_SHA256. + * \param curve The identifier of the elliptic curve to use, + * for example #MBEDTLS_ECP_DP_SECP256R1. + * \param secret The pre-shared secret (passphrase). This must be + * a readable buffer of length \p len Bytes. It need + * only be valid for the duration of this call. + * \param len The length of the pre-shared secret \p secret. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_ecjpake_setup(mbedtls_ecjpake_context *ctx, + mbedtls_ecjpake_role role, + mbedtls_md_type_t hash, + mbedtls_ecp_group_id curve, + const unsigned char *secret, + size_t len); + +/** + * \brief Check if an ECJPAKE context is ready for use. + * + * \param ctx The ECJPAKE context to check. This must be + * initialized. + * + * \return \c 0 if the context is ready for use. + * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA otherwise. + */ +int mbedtls_ecjpake_check(const mbedtls_ecjpake_context *ctx); + +/** + * \brief Generate and write the first round message + * (TLS: contents of the Client/ServerHello extension, + * excluding extension type and length bytes). + * + * \param ctx The ECJPAKE context to use. This must be + * initialized and set up. + * \param buf The buffer to write the contents to. This must be a + * writable buffer of length \p len Bytes. + * \param len The length of \p buf in Bytes. + * \param olen The address at which to store the total number + * of Bytes written to \p buf. This must not be \c NULL. + * \param f_rng The RNG function to use. This must not be \c NULL. + * \param p_rng The RNG parameter to be passed to \p f_rng. This + * may be \c NULL if \p f_rng doesn't use a context. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_ecjpake_write_round_one(mbedtls_ecjpake_context *ctx, + unsigned char *buf, size_t len, size_t *olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief Read and process the first round message + * (TLS: contents of the Client/ServerHello extension, + * excluding extension type and length bytes). + * + * \param ctx The ECJPAKE context to use. This must be initialized + * and set up. + * \param buf The buffer holding the first round message. This must + * be a readable buffer of length \p len Bytes. + * \param len The length in Bytes of \p buf. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_ecjpake_read_round_one(mbedtls_ecjpake_context *ctx, + const unsigned char *buf, + size_t len); + +/** + * \brief Generate and write the second round message + * (TLS: contents of the Client/ServerKeyExchange). + * + * \param ctx The ECJPAKE context to use. This must be initialized, + * set up, and already have performed round one. + * \param buf The buffer to write the round two contents to. + * This must be a writable buffer of length \p len Bytes. + * \param len The size of \p buf in Bytes. + * \param olen The address at which to store the total number of Bytes + * written to \p buf. This must not be \c NULL. + * \param f_rng The RNG function to use. This must not be \c NULL. + * \param p_rng The RNG parameter to be passed to \p f_rng. This + * may be \c NULL if \p f_rng doesn't use a context. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_ecjpake_write_round_two(mbedtls_ecjpake_context *ctx, + unsigned char *buf, size_t len, size_t *olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief Read and process the second round message + * (TLS: contents of the Client/ServerKeyExchange). + * + * \param ctx The ECJPAKE context to use. This must be initialized + * and set up and already have performed round one. + * \param buf The buffer holding the second round message. This must + * be a readable buffer of length \p len Bytes. + * \param len The length in Bytes of \p buf. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_ecjpake_read_round_two(mbedtls_ecjpake_context *ctx, + const unsigned char *buf, + size_t len); + +/** + * \brief Derive the shared secret + * (TLS: Pre-Master Secret). + * + * \param ctx The ECJPAKE context to use. This must be initialized, + * set up and have performed both round one and two. + * \param buf The buffer to write the derived secret to. This must + * be a writable buffer of length \p len Bytes. + * \param len The length of \p buf in Bytes. + * \param olen The address at which to store the total number of Bytes + * written to \p buf. This must not be \c NULL. + * \param f_rng The RNG function to use. This must not be \c NULL. + * \param p_rng The RNG parameter to be passed to \p f_rng. This + * may be \c NULL if \p f_rng doesn't use a context. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_ecjpake_derive_secret(mbedtls_ecjpake_context *ctx, + unsigned char *buf, size_t len, size_t *olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief This clears an ECJPAKE context and frees any + * embedded data structure. + * + * \param ctx The ECJPAKE context to free. This may be \c NULL, + * in which case this function does nothing. If it is not + * \c NULL, it must point to an initialized ECJPAKE context. + */ +void mbedtls_ecjpake_free(mbedtls_ecjpake_context *ctx); + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if a test failed + */ +int mbedtls_ecjpake_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + + +#endif /* ecjpake.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ecp.h b/ext/opcua_client/mbedtls/include/mbedtls/ecp.h new file mode 100644 index 0000000..1b55b61 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ecp.h @@ -0,0 +1,1369 @@ +/** + * \file ecp.h + * + * \brief This file provides an API for Elliptic Curves over GF(P) (ECP). + * + * The use of ECP in cryptography and TLS is defined in + * Standards for Efficient Cryptography Group (SECG): SEC1 + * Elliptic Curve Cryptography and + * RFC-4492: Elliptic Curve Cryptography (ECC) Cipher Suites + * for Transport Layer Security (TLS). + * + * RFC-2409: The Internet Key Exchange (IKE) defines ECP + * group types. + * + */ + +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_ECP_H +#define MBEDTLS_ECP_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/bignum.h" + +#if (defined(__ARMCC_VERSION) || defined(_MSC_VER)) && \ + !defined(inline) && !defined(__cplusplus) +#define inline __inline +#endif + +/* + * ECP error codes + */ +/** Bad input parameters to function. */ +#define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80 +/** The buffer is too small to write to. */ +#define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00 +/** The requested feature is not available, for example, the requested curve is not supported. */ +#define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80 +/** The signature is not valid. */ +#define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00 +/** Memory allocation failed. */ +#define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80 +/** Generation of random value, such as ephemeral key, failed. */ +#define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00 +/** Invalid private or public key. */ +#define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80 +/** The buffer contains a valid signature followed by more data. */ +#define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00 + +/* MBEDTLS_ERR_ECP_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** The ECP hardware accelerator failed. */ +#define MBEDTLS_ERR_ECP_HW_ACCEL_FAILED -0x4B80 + +/** Operation in progress, call again with the same parameters to continue. */ +#define MBEDTLS_ERR_ECP_IN_PROGRESS -0x4B00 + +/* Flags indicating whether to include code that is specific to certain + * types of curves. These flags are for internal library use only. */ +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) +#define MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED +#endif +#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) || \ + defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) +#define MBEDTLS_ECP_MONTGOMERY_ENABLED +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Domain-parameter identifiers: curve, subgroup, and generator. + * + * \note Only curves over prime fields are supported. + * + * \warning This library does not support validation of arbitrary domain + * parameters. Therefore, only standardized domain parameters from trusted + * sources should be used. See mbedtls_ecp_group_load(). + */ +/* Note: when adding a new curve: + * - Add it at the end of this enum, otherwise you'll break the ABI by + * changing the numerical value for existing curves. + * - Increment MBEDTLS_ECP_DP_MAX below if needed. + * - Update the calculation of MBEDTLS_ECP_MAX_BITS_MIN below. + * - Add the corresponding MBEDTLS_ECP_DP_xxx_ENABLED macro definition to + * config.h. + * - List the curve as a dependency of MBEDTLS_ECP_C and + * MBEDTLS_ECDSA_C if supported in check_config.h. + * - Add the curve to the appropriate curve type macro + * MBEDTLS_ECP_yyy_ENABLED above. + * - Add the necessary definitions to ecp_curves.c. + * - Add the curve to the ecp_supported_curves array in ecp.c. + * - Add the curve to applicable profiles in x509_crt.c if applicable. + */ +typedef enum { + MBEDTLS_ECP_DP_NONE = 0, /*!< Curve not defined. */ + MBEDTLS_ECP_DP_SECP192R1, /*!< Domain parameters for the 192-bit curve defined by FIPS 186-4 and SEC1. */ + MBEDTLS_ECP_DP_SECP224R1, /*!< Domain parameters for the 224-bit curve defined by FIPS 186-4 and SEC1. */ + MBEDTLS_ECP_DP_SECP256R1, /*!< Domain parameters for the 256-bit curve defined by FIPS 186-4 and SEC1. */ + MBEDTLS_ECP_DP_SECP384R1, /*!< Domain parameters for the 384-bit curve defined by FIPS 186-4 and SEC1. */ + MBEDTLS_ECP_DP_SECP521R1, /*!< Domain parameters for the 521-bit curve defined by FIPS 186-4 and SEC1. */ + MBEDTLS_ECP_DP_BP256R1, /*!< Domain parameters for 256-bit Brainpool curve. */ + MBEDTLS_ECP_DP_BP384R1, /*!< Domain parameters for 384-bit Brainpool curve. */ + MBEDTLS_ECP_DP_BP512R1, /*!< Domain parameters for 512-bit Brainpool curve. */ + MBEDTLS_ECP_DP_CURVE25519, /*!< Domain parameters for Curve25519. */ + MBEDTLS_ECP_DP_SECP192K1, /*!< Domain parameters for 192-bit "Koblitz" curve. */ + MBEDTLS_ECP_DP_SECP224K1, /*!< Domain parameters for 224-bit "Koblitz" curve. */ + MBEDTLS_ECP_DP_SECP256K1, /*!< Domain parameters for 256-bit "Koblitz" curve. */ + MBEDTLS_ECP_DP_CURVE448, /*!< Domain parameters for Curve448. */ +} mbedtls_ecp_group_id; + +/** + * The number of supported curves, plus one for #MBEDTLS_ECP_DP_NONE. + * + * \note Montgomery curves are currently excluded. + */ +#define MBEDTLS_ECP_DP_MAX 12 + +/* + * Curve types + */ +typedef enum { + MBEDTLS_ECP_TYPE_NONE = 0, + MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS, /* y^2 = x^3 + a x + b */ + MBEDTLS_ECP_TYPE_MONTGOMERY, /* y^2 = x^3 + a x^2 + x */ +} mbedtls_ecp_curve_type; + +/** + * Curve information, for use by other modules. + */ +typedef struct mbedtls_ecp_curve_info { + mbedtls_ecp_group_id grp_id; /*!< An internal identifier. */ + uint16_t tls_id; /*!< The TLS NamedCurve identifier. */ + uint16_t bit_size; /*!< The curve size in bits. */ + const char *name; /*!< A human-friendly name. */ +} mbedtls_ecp_curve_info; + +/** + * \brief The ECP point structure, in Jacobian coordinates. + * + * \note All functions expect and return points satisfying + * the following condition: Z == 0 or + * Z == 1. Other values of \p Z are + * used only by internal functions. + * The point is zero, or "at infinity", if Z == 0. + * Otherwise, \p X and \p Y are its standard (affine) + * coordinates. + */ +typedef struct mbedtls_ecp_point { + mbedtls_mpi X; /*!< The X coordinate of the ECP point. */ + mbedtls_mpi Y; /*!< The Y coordinate of the ECP point. */ + mbedtls_mpi Z; /*!< The Z coordinate of the ECP point. */ +} +mbedtls_ecp_point; + +/* Determine the minimum safe value of MBEDTLS_ECP_MAX_BITS. */ +#if !defined(MBEDTLS_ECP_C) +#define MBEDTLS_ECP_MAX_BITS_MIN 0 +/* Note: the curves must be listed in DECREASING size! */ +#elif defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) +#define MBEDTLS_ECP_MAX_BITS_MIN 521 +#elif defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) +#define MBEDTLS_ECP_MAX_BITS_MIN 512 +#elif defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) +#define MBEDTLS_ECP_MAX_BITS_MIN 448 +#elif defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) +#define MBEDTLS_ECP_MAX_BITS_MIN 384 +#elif defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) +#define MBEDTLS_ECP_MAX_BITS_MIN 384 +#elif defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) +#define MBEDTLS_ECP_MAX_BITS_MIN 256 +#elif defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) +#define MBEDTLS_ECP_MAX_BITS_MIN 256 +#elif defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) +#define MBEDTLS_ECP_MAX_BITS_MIN 256 +#elif defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) +#define MBEDTLS_ECP_MAX_BITS_MIN 255 +#elif defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) +#define MBEDTLS_ECP_MAX_BITS_MIN 225 // n is slightly above 2^224 +#elif defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) +#define MBEDTLS_ECP_MAX_BITS_MIN 224 +#elif defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) +#define MBEDTLS_ECP_MAX_BITS_MIN 192 +#elif defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) +#define MBEDTLS_ECP_MAX_BITS_MIN 192 +#else +#error "MBEDTLS_ECP_C enabled, but no curve?" +#endif + +#if !defined(MBEDTLS_ECP_ALT) +/* + * default Mbed TLS elliptic curve arithmetic implementation + * + * (in case MBEDTLS_ECP_ALT is defined then the developer has to provide an + * alternative implementation for the whole module and it will replace this + * one.) + */ + +/** + * \brief The ECP group structure. + * + * We consider two types of curve equations: + *
  • Short Weierstrass: y^2 = x^3 + A x + B mod P + * (SEC1 + RFC-4492)
  • + *
  • Montgomery: y^2 = x^3 + A x^2 + x mod P (Curve25519, + * Curve448)
+ * In both cases, the generator (\p G) for a prime-order subgroup is fixed. + * + * For Short Weierstrass, this subgroup is the whole curve, and its + * cardinality is denoted by \p N. Our code requires that \p N is an + * odd prime as mbedtls_ecp_mul() requires an odd number, and + * mbedtls_ecdsa_sign() requires that it is prime for blinding purposes. + * + * The default implementation only initializes \p A without setting it to the + * authentic value for curves with A = -3(SECP256R1, etc), in which + * case you need to load \p A by yourself when using domain parameters directly, + * for example: + * \code + * mbedtls_mpi_init(&A); + * mbedtls_ecp_group_init(&grp); + * CHECK_RETURN(mbedtls_ecp_group_load(&grp, grp_id)); + * if (mbedtls_ecp_group_a_is_minus_3(&grp)) { + * CHECK_RETURN(mbedtls_mpi_sub_int(&A, &grp.P, 3)); + * } else { + * CHECK_RETURN(mbedtls_mpi_copy(&A, &grp.A)); + * } + * + * do_something_with_a(&A); + * + * cleanup: + * mbedtls_mpi_free(&A); + * mbedtls_ecp_group_free(&grp); + * \endcode + * + * For Montgomery curves, we do not store \p A, but (A + 2) / 4, + * which is the quantity used in the formulas. Additionally, \p nbits is + * not the size of \p N but the required size for private keys. + * + * If \p modp is NULL, reduction modulo \p P is done using a generic algorithm. + * Otherwise, \p modp must point to a function that takes an \p mbedtls_mpi in the + * range of 0..2^(2*pbits)-1, and transforms it in-place to an integer + * which is congruent mod \p P to the given MPI, and is close enough to \p pbits + * in size, so that it may be efficiently brought in the 0..P-1 range by a few + * additions or subtractions. Therefore, it is only an approximate modular + * reduction. It must return 0 on success and non-zero on failure. + * + * \note Alternative implementations must keep the group IDs distinct. If + * two group structures have the same ID, then they must be + * identical. + * + */ +typedef struct mbedtls_ecp_group { + mbedtls_ecp_group_id id; /*!< An internal group identifier. */ + mbedtls_mpi P; /*!< The prime modulus of the base field. */ + mbedtls_mpi A; /*!< For Short Weierstrass: \p A in the equation. Note that + \p A is not set to the authentic value in some cases. + Refer to detailed description of ::mbedtls_ecp_group if + using domain parameters in the structure. + For Montgomery curves: (A + 2) / 4. */ + mbedtls_mpi B; /*!< For Short Weierstrass: \p B in the equation. + For Montgomery curves: unused. */ + mbedtls_ecp_point G; /*!< The generator of the subgroup used. */ + mbedtls_mpi N; /*!< The order of \p G. */ + size_t pbits; /*!< The number of bits in \p P.*/ + size_t nbits; /*!< For Short Weierstrass: The number of bits in \p P. + For Montgomery curves: the number of bits in the + private keys. */ + unsigned int h; /*!< \internal 1 if the constants are static. */ + int (*modp)(mbedtls_mpi *); /*!< The function for fast pseudo-reduction + mod \p P (see above).*/ + int (*t_pre)(mbedtls_ecp_point *, void *); /*!< Unused. */ + int (*t_post)(mbedtls_ecp_point *, void *); /*!< Unused. */ + void *t_data; /*!< Unused. */ + mbedtls_ecp_point *T; /*!< Pre-computed points for ecp_mul_comb(). */ + size_t T_size; /*!< The number of pre-computed points. */ +} +mbedtls_ecp_group; + +/** + * \name SECTION: Module settings + * + * The configuration options you can set for this module are in this section. + * Either change them in config.h, or define them using the compiler command line. + * \{ + */ + +#if defined(MBEDTLS_ECP_MAX_BITS) + +#if MBEDTLS_ECP_MAX_BITS < MBEDTLS_ECP_MAX_BITS_MIN +#error "MBEDTLS_ECP_MAX_BITS is smaller than the largest supported curve" +#endif + +#elif defined(MBEDTLS_ECP_C) +/** + * The maximum size of the groups, that is, of \c N and \c P. + */ +#define MBEDTLS_ECP_MAX_BITS MBEDTLS_ECP_MAX_BITS_MIN + +#else +/* MBEDTLS_ECP_MAX_BITS is not relevant without MBEDTLS_ECP_C, but set it + * to a nonzero value so that code that unconditionally allocates an array + * of a size based on it keeps working if built without ECC support. */ +#define MBEDTLS_ECP_MAX_BITS 1 +#endif + +#define MBEDTLS_ECP_MAX_BYTES ((MBEDTLS_ECP_MAX_BITS + 7) / 8) +#define MBEDTLS_ECP_MAX_PT_LEN (2 * MBEDTLS_ECP_MAX_BYTES + 1) + +#if !defined(MBEDTLS_ECP_WINDOW_SIZE) +/* + * Maximum "window" size used for point multiplication. + * Default: a point where higher memory usage yields diminishing performance + * returns. + * Minimum value: 2. Maximum value: 7. + * + * Result is an array of at most ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) ) + * points used for point multiplication. This value is directly tied to EC + * peak memory usage, so decreasing it by one should roughly cut memory usage + * by two (if large curves are in use). + * + * Reduction in size may reduce speed, but larger curves are impacted first. + * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1): + * w-size: 6 5 4 3 2 + * 521 145 141 135 120 97 + * 384 214 209 198 177 146 + * 256 320 320 303 262 226 + * 224 475 475 453 398 342 + * 192 640 640 633 587 476 + */ +#define MBEDTLS_ECP_WINDOW_SIZE 4 /**< The maximum window size used. */ +#endif /* MBEDTLS_ECP_WINDOW_SIZE */ + +#if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM) +/* + * Trade memory for speed on fixed-point multiplication. + * + * This speeds up repeated multiplication of the generator (that is, the + * multiplication in ECDSA signatures, and half of the multiplications in + * ECDSA verification and ECDHE) by a factor roughly 3 to 4. + * + * The cost is increasing EC peak memory usage by a factor roughly 2. + * + * Change this value to 0 to reduce peak memory usage. + */ +#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up. */ +#endif /* MBEDTLS_ECP_FIXED_POINT_OPTIM */ + +/** \} name SECTION: Module settings */ + +#else /* MBEDTLS_ECP_ALT */ +#include "ecp_alt.h" +#endif /* MBEDTLS_ECP_ALT */ + +#if defined(MBEDTLS_ECP_RESTARTABLE) + +/** + * \brief Internal restart context for multiplication + * + * \note Opaque struct + */ +typedef struct mbedtls_ecp_restart_mul mbedtls_ecp_restart_mul_ctx; + +/** + * \brief Internal restart context for ecp_muladd() + * + * \note Opaque struct + */ +typedef struct mbedtls_ecp_restart_muladd mbedtls_ecp_restart_muladd_ctx; + +/** + * \brief General context for resuming ECC operations + */ +typedef struct { + unsigned ops_done; /*!< current ops count */ + unsigned depth; /*!< call depth (0 = top-level) */ + mbedtls_ecp_restart_mul_ctx *rsm; /*!< ecp_mul_comb() sub-context */ + mbedtls_ecp_restart_muladd_ctx *ma; /*!< ecp_muladd() sub-context */ +} mbedtls_ecp_restart_ctx; + +/* + * Operation counts for restartable functions + */ +#define MBEDTLS_ECP_OPS_CHK 3 /*!< basic ops count for ecp_check_pubkey() */ +#define MBEDTLS_ECP_OPS_DBL 8 /*!< basic ops count for ecp_double_jac() */ +#define MBEDTLS_ECP_OPS_ADD 11 /*!< basic ops count for see ecp_add_mixed() */ +#define MBEDTLS_ECP_OPS_INV 120 /*!< empirical equivalent for mpi_mod_inv() */ + +/** + * \brief Internal; for restartable functions in other modules. + * Check and update basic ops budget. + * + * \param grp Group structure + * \param rs_ctx Restart context + * \param ops Number of basic ops to do + * + * \return \c 0 if doing \p ops basic ops is still allowed, + * \return #MBEDTLS_ERR_ECP_IN_PROGRESS otherwise. + */ +int mbedtls_ecp_check_budget(const mbedtls_ecp_group *grp, + mbedtls_ecp_restart_ctx *rs_ctx, + unsigned ops); + +/* Utility macro for checking and updating ops budget */ +#define MBEDTLS_ECP_BUDGET(ops) \ + MBEDTLS_MPI_CHK(mbedtls_ecp_check_budget(grp, rs_ctx, \ + (unsigned) (ops))); + +#else /* MBEDTLS_ECP_RESTARTABLE */ + +#define MBEDTLS_ECP_BUDGET(ops) /* no-op; for compatibility */ + +/* We want to declare restartable versions of existing functions anyway */ +typedef void mbedtls_ecp_restart_ctx; + +#endif /* MBEDTLS_ECP_RESTARTABLE */ + +/** + * \brief The ECP key-pair structure. + * + * A generic key-pair that may be used for ECDSA and fixed ECDH, for example. + * + * \note Members are deliberately in the same order as in the + * ::mbedtls_ecdsa_context structure. + */ +typedef struct mbedtls_ecp_keypair { + mbedtls_ecp_group grp; /*!< Elliptic curve and base point */ + mbedtls_mpi d; /*!< our secret value */ + mbedtls_ecp_point Q; /*!< our public value */ +} +mbedtls_ecp_keypair; + +/* + * Point formats, from RFC 4492's enum ECPointFormat + */ +#define MBEDTLS_ECP_PF_UNCOMPRESSED 0 /**< Uncompressed point format. */ +#define MBEDTLS_ECP_PF_COMPRESSED 1 /**< Compressed point format. */ + +/* + * Some other constants from RFC 4492 + */ +#define MBEDTLS_ECP_TLS_NAMED_CURVE 3 /**< The named_curve of ECCurveType. */ + +#if defined(MBEDTLS_ECP_RESTARTABLE) +/** + * \brief Set the maximum number of basic operations done in a row. + * + * If more operations are needed to complete a computation, + * #MBEDTLS_ERR_ECP_IN_PROGRESS will be returned by the + * function performing the computation. It is then the + * caller's responsibility to either call again with the same + * parameters until it returns 0 or an error code; or to free + * the restart context if the operation is to be aborted. + * + * It is strictly required that all input parameters and the + * restart context be the same on successive calls for the + * same operation, but output parameters need not be the + * same; they must not be used until the function finally + * returns 0. + * + * This only applies to functions whose documentation + * mentions they may return #MBEDTLS_ERR_ECP_IN_PROGRESS (or + * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS for functions in the + * SSL module). For functions that accept a "restart context" + * argument, passing NULL disables restart and makes the + * function equivalent to the function with the same name + * with \c _restartable removed. For functions in the ECDH + * module, restart is disabled unless the function accepts + * an "ECDH context" argument and + * mbedtls_ecdh_enable_restart() was previously called on + * that context. For function in the SSL module, restart is + * only enabled for specific sides and key exchanges + * (currently only for clients and ECDHE-ECDSA). + * + * \param max_ops Maximum number of basic operations done in a row. + * Default: 0 (unlimited). + * Lower (non-zero) values mean ECC functions will block for + * a lesser maximum amount of time. + * + * \note A "basic operation" is defined as a rough equivalent of a + * multiplication in GF(p) for the NIST P-256 curve. + * As an indication, with default settings, a scalar + * multiplication (full run of \c mbedtls_ecp_mul()) is: + * - about 3300 basic operations for P-256 + * - about 9400 basic operations for P-384 + * + * \note Very low values are not always respected: sometimes + * functions need to block for a minimum number of + * operations, and will do so even if max_ops is set to a + * lower value. That minimum depends on the curve size, and + * can be made lower by decreasing the value of + * \c MBEDTLS_ECP_WINDOW_SIZE. As an indication, here is the + * lowest effective value for various curves and values of + * that parameter (w for short): + * w=6 w=5 w=4 w=3 w=2 + * P-256 208 208 160 136 124 + * P-384 682 416 320 272 248 + * P-521 1364 832 640 544 496 + * + * \note This setting is currently ignored by Curve25519. + */ +void mbedtls_ecp_set_max_ops(unsigned max_ops); + +/** + * \brief Check if restart is enabled (max_ops != 0) + * + * \return \c 0 if \c max_ops == 0 (restart disabled) + * \return \c 1 otherwise (restart enabled) + */ +int mbedtls_ecp_restart_is_enabled(void); +#endif /* MBEDTLS_ECP_RESTARTABLE */ + +/* + * Get the type of a curve + */ +mbedtls_ecp_curve_type mbedtls_ecp_get_type(const mbedtls_ecp_group *grp); + +/** + * \brief This function retrieves the information defined in + * mbedtls_ecp_curve_info() for all supported curves. + * + * \note This function returns information about all curves + * supported by the library. Some curves may not be + * supported for all algorithms. Call mbedtls_ecdh_can_do() + * or mbedtls_ecdsa_can_do() to check if a curve is + * supported for ECDH or ECDSA. + * + * \return A statically allocated array. The last entry is 0. + */ +const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list(void); + +/** + * \brief This function retrieves the list of internal group + * identifiers of all supported curves in the order of + * preference. + * + * \note This function returns information about all curves + * supported by the library. Some curves may not be + * supported for all algorithms. Call mbedtls_ecdh_can_do() + * or mbedtls_ecdsa_can_do() to check if a curve is + * supported for ECDH or ECDSA. + * + * \return A statically allocated array, + * terminated with MBEDTLS_ECP_DP_NONE. + */ +const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list(void); + +/** + * \brief This function retrieves curve information from an internal + * group identifier. + * + * \param grp_id An \c MBEDTLS_ECP_DP_XXX value. + * + * \return The associated curve information on success. + * \return NULL on failure. + */ +const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id(mbedtls_ecp_group_id grp_id); + +/** + * \brief This function retrieves curve information from a TLS + * NamedCurve value. + * + * \param tls_id An \c MBEDTLS_ECP_DP_XXX value. + * + * \return The associated curve information on success. + * \return NULL on failure. + */ +const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id(uint16_t tls_id); + +/** + * \brief This function retrieves curve information from a + * human-readable name. + * + * \param name The human-readable name. + * + * \return The associated curve information on success. + * \return NULL on failure. + */ +const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name(const char *name); + +/** + * \brief This function initializes a point as zero. + * + * \param pt The point to initialize. + */ +void mbedtls_ecp_point_init(mbedtls_ecp_point *pt); + +/** + * \brief This function initializes an ECP group context + * without loading any domain parameters. + * + * \note After this function is called, domain parameters + * for various ECP groups can be loaded through the + * mbedtls_ecp_group_load() or mbedtls_ecp_tls_read_group() + * functions. + */ +void mbedtls_ecp_group_init(mbedtls_ecp_group *grp); + +/** + * \brief This function initializes a key pair as an invalid one. + * + * \param key The key pair to initialize. + */ +void mbedtls_ecp_keypair_init(mbedtls_ecp_keypair *key); + +/** + * \brief This function frees the components of a point. + * + * \param pt The point to free. + */ +void mbedtls_ecp_point_free(mbedtls_ecp_point *pt); + +/** + * \brief This function frees the components of an ECP group. + * + * \param grp The group to free. This may be \c NULL, in which + * case this function returns immediately. If it is not + * \c NULL, it must point to an initialized ECP group. + */ +void mbedtls_ecp_group_free(mbedtls_ecp_group *grp); + +/** + * \brief This function frees the components of a key pair. + * + * \param key The key pair to free. This may be \c NULL, in which + * case this function returns immediately. If it is not + * \c NULL, it must point to an initialized ECP key pair. + */ +void mbedtls_ecp_keypair_free(mbedtls_ecp_keypair *key); + +#if defined(MBEDTLS_ECP_RESTARTABLE) +/** + * \brief Initialize a restart context. + * + * \param ctx The restart context to initialize. This must + * not be \c NULL. + */ +void mbedtls_ecp_restart_init(mbedtls_ecp_restart_ctx *ctx); + +/** + * \brief Free the components of a restart context. + * + * \param ctx The restart context to free. This may be \c NULL, in which + * case this function returns immediately. If it is not + * \c NULL, it must point to an initialized restart context. + */ +void mbedtls_ecp_restart_free(mbedtls_ecp_restart_ctx *ctx); +#endif /* MBEDTLS_ECP_RESTARTABLE */ + +/** + * \brief This function copies the contents of point \p Q into + * point \p P. + * + * \param P The destination point. This must be initialized. + * \param Q The source point. This must be initialized. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. + * \return Another negative error code for other kinds of failure. + */ +int mbedtls_ecp_copy(mbedtls_ecp_point *P, const mbedtls_ecp_point *Q); + +/** + * \brief This function copies the contents of group \p src into + * group \p dst. + * + * \param dst The destination group. This must be initialized. + * \param src The source group. This must be initialized. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_group_copy(mbedtls_ecp_group *dst, + const mbedtls_ecp_group *src); + +/** + * \brief This function sets a point to the point at infinity. + * + * \param pt The point to set. This must be initialized. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_set_zero(mbedtls_ecp_point *pt); + +/** + * \brief This function checks if a point is the point at infinity. + * + * \param pt The point to test. This must be initialized. + * + * \return \c 1 if the point is zero. + * \return \c 0 if the point is non-zero. + * \return A negative error code on failure. + */ +int mbedtls_ecp_is_zero(mbedtls_ecp_point *pt); + +/** + * \brief This function compares two points. + * + * \note This assumes that the points are normalized. Otherwise, + * they may compare as "not equal" even if they are. + * + * \param P The first point to compare. This must be initialized. + * \param Q The second point to compare. This must be initialized. + * + * \return \c 0 if the points are equal. + * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the points are not equal. + */ +int mbedtls_ecp_point_cmp(const mbedtls_ecp_point *P, + const mbedtls_ecp_point *Q); + +/** + * \brief This function imports a non-zero point from two ASCII + * strings. + * + * \param P The destination point. This must be initialized. + * \param radix The numeric base of the input. + * \param x The first affine coordinate, as a null-terminated string. + * \param y The second affine coordinate, as a null-terminated string. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_MPI_XXX error code on failure. + */ +int mbedtls_ecp_point_read_string(mbedtls_ecp_point *P, int radix, + const char *x, const char *y); + +/** + * \brief This function exports a point into unsigned binary data. + * + * \param grp The group to which the point should belong. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param P The point to export. This must be initialized. + * \param format The point format. This must be either + * #MBEDTLS_ECP_PF_COMPRESSED or #MBEDTLS_ECP_PF_UNCOMPRESSED. + * (For groups without these formats, this parameter is + * ignored. But it still has to be either of the above + * values.) + * \param olen The address at which to store the length of + * the output in Bytes. This must not be \c NULL. + * \param buf The output buffer. This must be a writable buffer + * of length \p buflen Bytes. + * \param buflen The length of the output buffer \p buf in Bytes. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL if the output buffer + * is too small to hold the point. + * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the point format + * or the export for the given group is not implemented. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_point_write_binary(const mbedtls_ecp_group *grp, + const mbedtls_ecp_point *P, + int format, size_t *olen, + unsigned char *buf, size_t buflen); + +/** + * \brief This function imports a point from unsigned binary data. + * + * \note This function does not check that the point actually + * belongs to the given group, see mbedtls_ecp_check_pubkey() + * for that. + * + * \param grp The group to which the point should belong. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param P The destination context to import the point to. + * This must be initialized. + * \param buf The input buffer. This must be a readable buffer + * of length \p ilen Bytes. + * \param ilen The length of the input buffer \p buf in Bytes. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the input is invalid. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. + * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the import for the + * given group is not implemented. + */ +int mbedtls_ecp_point_read_binary(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *P, + const unsigned char *buf, size_t ilen); + +/** + * \brief This function imports a point from a TLS ECPoint record. + * + * \note On function return, \p *buf is updated to point immediately + * after the ECPoint record. + * + * \param grp The ECP group to use. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param pt The destination point. + * \param buf The address of the pointer to the start of the input buffer. + * \param len The length of the buffer. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_MPI_XXX error code on initialization + * failure. + * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid. + */ +int mbedtls_ecp_tls_read_point(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *pt, + const unsigned char **buf, size_t len); + +/** + * \brief This function exports a point as a TLS ECPoint record + * defined in RFC 4492, Section 5.4. + * + * \param grp The ECP group to use. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param pt The point to be exported. This must be initialized. + * \param format The point format to use. This must be either + * #MBEDTLS_ECP_PF_COMPRESSED or #MBEDTLS_ECP_PF_UNCOMPRESSED. + * \param olen The address at which to store the length in Bytes + * of the data written. + * \param buf The target buffer. This must be a writable buffer of + * length \p blen Bytes. + * \param blen The length of the target buffer \p buf in Bytes. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the input is invalid. + * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL if the target buffer + * is too small to hold the exported point. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_tls_write_point(const mbedtls_ecp_group *grp, + const mbedtls_ecp_point *pt, + int format, size_t *olen, + unsigned char *buf, size_t blen); + +/** + * \brief This function sets up an ECP group context + * from a standardized set of domain parameters. + * + * \note The index should be a value of the NamedCurve enum, + * as defined in RFC-4492: Elliptic Curve Cryptography + * (ECC) Cipher Suites for Transport Layer Security (TLS), + * usually in the form of an \c MBEDTLS_ECP_DP_XXX macro. + * + * \param grp The group context to setup. This must be initialized. + * \param id The identifier of the domain parameter set to load. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if \p id doesn't + * correspond to a known group. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_group_load(mbedtls_ecp_group *grp, mbedtls_ecp_group_id id); + +/** + * \brief This function sets up an ECP group context from a TLS + * ECParameters record as defined in RFC 4492, Section 5.4. + * + * \note The read pointer \p buf is updated to point right after + * the ECParameters record on exit. + * + * \param grp The group context to setup. This must be initialized. + * \param buf The address of the pointer to the start of the input buffer. + * \param len The length of the input buffer \c *buf in Bytes. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid. + * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the group is not + * recognized. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_tls_read_group(mbedtls_ecp_group *grp, + const unsigned char **buf, size_t len); + +/** + * \brief This function extracts an elliptic curve group ID from a + * TLS ECParameters record as defined in RFC 4492, Section 5.4. + * + * \note The read pointer \p buf is updated to point right after + * the ECParameters record on exit. + * + * \param grp The address at which to store the group id. + * This must not be \c NULL. + * \param buf The address of the pointer to the start of the input buffer. + * \param len The length of the input buffer \c *buf in Bytes. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid. + * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the group is not + * recognized. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_tls_read_group_id(mbedtls_ecp_group_id *grp, + const unsigned char **buf, + size_t len); +/** + * \brief This function exports an elliptic curve as a TLS + * ECParameters record as defined in RFC 4492, Section 5.4. + * + * \param grp The ECP group to be exported. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param olen The address at which to store the number of Bytes written. + * This must not be \c NULL. + * \param buf The buffer to write to. This must be a writable buffer + * of length \p blen Bytes. + * \param blen The length of the output buffer \p buf in Bytes. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL if the output + * buffer is too small to hold the exported group. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_tls_write_group(const mbedtls_ecp_group *grp, + size_t *olen, + unsigned char *buf, size_t blen); + +/** + * \brief This function performs a scalar multiplication of a point + * by an integer: \p R = \p m * \p P. + * + * It is not thread-safe to use same group in multiple threads. + * + * \note To prevent timing attacks, this function + * executes the exact same sequence of base-field + * operations for any valid \p m. It avoids any if-branch or + * array index depending on the value of \p m. + * + * \note If \p f_rng is not NULL, it is used to randomize + * intermediate results to prevent potential timing attacks + * targeting these results. We recommend always providing + * a non-NULL \p f_rng. The overhead is negligible. + * Note: unless #MBEDTLS_ECP_NO_INTERNAL_RNG is defined, when + * \p f_rng is NULL, an internal RNG (seeded from the value + * of \p m) will be used instead. + * + * \param grp The ECP group to use. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param R The point in which to store the result of the calculation. + * This must be initialized. + * \param m The integer by which to multiply. This must be initialized. + * \param P The point to multiply. This must be initialized. + * \param f_rng The RNG function. This may be \c NULL if randomization + * of intermediate results isn't desired (discouraged). + * \param p_rng The RNG context to be passed to \p p_rng. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m is not a valid private + * key, or \p P is not a valid public key. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_mul(mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_mpi *m, const mbedtls_ecp_point *P, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng); + +/** + * \brief This function performs multiplication of a point by + * an integer: \p R = \p m * \p P in a restartable way. + * + * \see mbedtls_ecp_mul() + * + * \note This function does the same as \c mbedtls_ecp_mul(), but + * it can return early and restart according to the limit set + * with \c mbedtls_ecp_set_max_ops() to reduce blocking. + * + * \param grp The ECP group to use. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param R The point in which to store the result of the calculation. + * This must be initialized. + * \param m The integer by which to multiply. This must be initialized. + * \param P The point to multiply. This must be initialized. + * \param f_rng The RNG function. This may be \c NULL if randomization + * of intermediate results isn't desired (discouraged). + * \param p_rng The RNG context to be passed to \p p_rng. + * \param rs_ctx The restart context (NULL disables restart). + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m is not a valid private + * key, or \p P is not a valid public key. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. + * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of + * operations was reached: see \c mbedtls_ecp_set_max_ops(). + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_mul_restartable(mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_mpi *m, const mbedtls_ecp_point *P, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + mbedtls_ecp_restart_ctx *rs_ctx); + +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) +/** + * \brief This function checks if domain parameter A of the curve is + * \c -3. + * + * \note This function is only defined for short Weierstrass curves. + * It may not be included in builds without any short + * Weierstrass curve. + * + * \param grp The ECP group to use. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * + * \return \c 1 if A = -3. + * \return \c 0 Otherwise. + */ +static inline int mbedtls_ecp_group_a_is_minus_3(const mbedtls_ecp_group *grp) +{ + return grp->A.p == NULL; +} + +/** + * \brief This function performs multiplication and addition of two + * points by integers: \p R = \p m * \p P + \p n * \p Q + * + * It is not thread-safe to use same group in multiple threads. + * + * \note In contrast to mbedtls_ecp_mul(), this function does not + * guarantee a constant execution flow and timing. + * + * \note This function is only defined for short Weierstrass curves. + * It may not be included in builds without any short + * Weierstrass curve. + * + * \param grp The ECP group to use. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param R The point in which to store the result of the calculation. + * This must be initialized. + * \param m The integer by which to multiply \p P. + * This must be initialized. + * \param P The point to multiply by \p m. This must be initialized. + * \param n The integer by which to multiply \p Q. + * This must be initialized. + * \param Q The point to be multiplied by \p n. + * This must be initialized. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m or \p n are not + * valid private keys, or \p P or \p Q are not valid public + * keys. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. + * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if \p grp does not + * designate a short Weierstrass curve. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_muladd(mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_mpi *m, const mbedtls_ecp_point *P, + const mbedtls_mpi *n, const mbedtls_ecp_point *Q); + +/** + * \brief This function performs multiplication and addition of two + * points by integers: \p R = \p m * \p P + \p n * \p Q in a + * restartable way. + * + * \see \c mbedtls_ecp_muladd() + * + * \note This function works the same as \c mbedtls_ecp_muladd(), + * but it can return early and restart according to the limit + * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. + * + * \note This function is only defined for short Weierstrass curves. + * It may not be included in builds without any short + * Weierstrass curve. + * + * \param grp The ECP group to use. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param R The point in which to store the result of the calculation. + * This must be initialized. + * \param m The integer by which to multiply \p P. + * This must be initialized. + * \param P The point to multiply by \p m. This must be initialized. + * \param n The integer by which to multiply \p Q. + * This must be initialized. + * \param Q The point to be multiplied by \p n. + * This must be initialized. + * \param rs_ctx The restart context (NULL disables restart). + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m or \p n are not + * valid private keys, or \p P or \p Q are not valid public + * keys. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. + * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if \p grp does not + * designate a short Weierstrass curve. + * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of + * operations was reached: see \c mbedtls_ecp_set_max_ops(). + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_muladd_restartable( + mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_mpi *m, const mbedtls_ecp_point *P, + const mbedtls_mpi *n, const mbedtls_ecp_point *Q, + mbedtls_ecp_restart_ctx *rs_ctx); +#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */ + +/** + * \brief This function checks that a point is a valid public key + * on this curve. + * + * It only checks that the point is non-zero, has + * valid coordinates and lies on the curve. It does not verify + * that it is indeed a multiple of \c G. This additional + * check is computationally more expensive, is not required + * by standards, and should not be necessary if the group + * used has a small cofactor. In particular, it is useless for + * the NIST groups which all have a cofactor of 1. + * + * \note This function uses bare components rather than an + * ::mbedtls_ecp_keypair structure, to ease use with other + * structures, such as ::mbedtls_ecdh_context or + * ::mbedtls_ecdsa_context. + * + * \param grp The ECP group the point should belong to. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param pt The point to check. This must be initialized. + * + * \return \c 0 if the point is a valid public key. + * \return #MBEDTLS_ERR_ECP_INVALID_KEY if the point is not + * a valid public key for the given curve. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_check_pubkey(const mbedtls_ecp_group *grp, + const mbedtls_ecp_point *pt); + +/** + * \brief This function checks that an \c mbedtls_mpi is a + * valid private key for this curve. + * + * \note This function uses bare components rather than an + * ::mbedtls_ecp_keypair structure to ease use with other + * structures, such as ::mbedtls_ecdh_context or + * ::mbedtls_ecdsa_context. + * + * \param grp The ECP group the private key should belong to. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param d The integer to check. This must be initialized. + * + * \return \c 0 if the point is a valid private key. + * \return #MBEDTLS_ERR_ECP_INVALID_KEY if the point is not a valid + * private key for the given curve. + * \return Another negative error code on other kinds of failure. + */ +int mbedtls_ecp_check_privkey(const mbedtls_ecp_group *grp, + const mbedtls_mpi *d); + +/** + * \brief This function generates a private key. + * + * \param grp The ECP group to generate a private key for. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param d The destination MPI (secret part). This must be initialized. + * \param f_rng The RNG function. This must not be \c NULL. + * \param p_rng The RNG parameter to be passed to \p f_rng. This may be + * \c NULL if \p f_rng doesn't need a context argument. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code + * on failure. + */ +int mbedtls_ecp_gen_privkey(const mbedtls_ecp_group *grp, + mbedtls_mpi *d, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief This function generates a keypair with a configurable base + * point. + * + * \note This function uses bare components rather than an + * ::mbedtls_ecp_keypair structure to ease use with other + * structures, such as ::mbedtls_ecdh_context or + * ::mbedtls_ecdsa_context. + * + * \param grp The ECP group to generate a key pair for. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param G The base point to use. This must be initialized + * and belong to \p grp. It replaces the default base + * point \c grp->G used by mbedtls_ecp_gen_keypair(). + * \param d The destination MPI (secret part). + * This must be initialized. + * \param Q The destination point (public part). + * This must be initialized. + * \param f_rng The RNG function. This must not be \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. This may + * be \c NULL if \p f_rng doesn't need a context argument. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code + * on failure. + */ +int mbedtls_ecp_gen_keypair_base(mbedtls_ecp_group *grp, + const mbedtls_ecp_point *G, + mbedtls_mpi *d, mbedtls_ecp_point *Q, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief This function generates an ECP keypair. + * + * \note This function uses bare components rather than an + * ::mbedtls_ecp_keypair structure to ease use with other + * structures, such as ::mbedtls_ecdh_context or + * ::mbedtls_ecdsa_context. + * + * \param grp The ECP group to generate a key pair for. + * This must be initialized and have group parameters + * set, for example through mbedtls_ecp_group_load(). + * \param d The destination MPI (secret part). + * This must be initialized. + * \param Q The destination point (public part). + * This must be initialized. + * \param f_rng The RNG function. This must not be \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. This may + * be \c NULL if \p f_rng doesn't need a context argument. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code + * on failure. + */ +int mbedtls_ecp_gen_keypair(mbedtls_ecp_group *grp, mbedtls_mpi *d, + mbedtls_ecp_point *Q, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief This function generates an ECP key. + * + * \param grp_id The ECP group identifier. + * \param key The destination key. This must be initialized. + * \param f_rng The RNG function to use. This must not be \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. This may + * be \c NULL if \p f_rng doesn't need a context argument. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code + * on failure. + */ +int mbedtls_ecp_gen_key(mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief This function reads an elliptic curve private key. + * + * \note This function does not support Curve448 yet. + * + * \param grp_id The ECP group identifier. + * \param key The destination key. + * \param buf The buffer containing the binary representation of the + * key. (Big endian integer for Weierstrass curves, byte + * string for Montgomery curves.) + * \param buflen The length of the buffer in bytes. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_INVALID_KEY error if the key is + * invalid. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. + * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the operation for + * the group is not implemented. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_ecp_read_key(mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key, + const unsigned char *buf, size_t buflen); + +/** + * \brief This function exports an elliptic curve private key. + * + * \note Note that although this function accepts an output + * buffer that is smaller or larger than the key, most key + * import interfaces require the output to have exactly + * key's nominal length. It is generally simplest to + * pass the key's nominal length as \c buflen, after + * checking that the output buffer is large enough. + * See the description of the \p buflen parameter for + * how to calculate the nominal length. + * + * \note If the private key was not set in \p key, + * the output is unspecified. Future versions + * may return an error in that case. + * + * \note This function does not support Curve448 yet. + * + * \param key The private key. + * \param buf The output buffer for containing the binary representation + * of the key. + * For Weierstrass curves, this is the big-endian + * representation, padded with null bytes at the beginning + * to reach \p buflen bytes. + * For Montgomery curves, this is the standard byte string + * representation (which is little-endian), padded with + * null bytes at the end to reach \p buflen bytes. + * \param buflen The total length of the buffer in bytes. + * The length of the output is + * (`grp->nbits` + 7) / 8 bytes + * where `grp->nbits` is the private key size in bits. + * For Weierstrass keys, if the output buffer is smaller, + * leading zeros are trimmed to fit if possible. For + * Montgomery keys, the output buffer must always be large + * enough for the nominal length. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL or + * #MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if the \p key + * representation is larger than the available space in \p buf. + * \return Another negative error code on different kinds of failure. + */ +int mbedtls_ecp_write_key(mbedtls_ecp_keypair *key, + unsigned char *buf, size_t buflen); + +/** + * \brief This function checks that the keypair objects + * \p pub and \p prv have the same group and the + * same public point, and that the private key in + * \p prv is consistent with the public key. + * + * \param pub The keypair structure holding the public key. This + * must be initialized. If it contains a private key, that + * part is ignored. + * \param prv The keypair structure holding the full keypair. + * This must be initialized. + * + * \return \c 0 on success, meaning that the keys are valid and match. + * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the keys are invalid or do not match. + * \return An \c MBEDTLS_ERR_ECP_XXX or an \c MBEDTLS_ERR_MPI_XXX + * error code on calculation failure. + */ +int mbedtls_ecp_check_pub_priv(const mbedtls_ecp_keypair *pub, + const mbedtls_ecp_keypair *prv); + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief The ECP checkup routine. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +int mbedtls_ecp_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* ecp.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ecp_internal.h b/ext/opcua_client/mbedtls/include/mbedtls/ecp_internal.h new file mode 100644 index 0000000..f6af5cb --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ecp_internal.h @@ -0,0 +1,291 @@ +/** + * \file ecp_internal.h + * + * \brief Function declarations for alternative implementation of elliptic curve + * point arithmetic. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * References: + * + * [1] BERNSTEIN, Daniel J. Curve25519: new Diffie-Hellman speed records. + * + * + * [2] CORON, Jean-S'ebastien. Resistance against differential power analysis + * for elliptic curve cryptosystems. In : Cryptographic Hardware and + * Embedded Systems. Springer Berlin Heidelberg, 1999. p. 292-302. + * + * + * [3] HEDABOU, Mustapha, PINEL, Pierre, et B'EN'ETEAU, Lucien. A comb method to + * render ECC resistant against Side Channel Attacks. IACR Cryptology + * ePrint Archive, 2004, vol. 2004, p. 342. + * + * + * [4] Certicom Research. SEC 2: Recommended Elliptic Curve Domain Parameters. + * + * + * [5] HANKERSON, Darrel, MENEZES, Alfred J., VANSTONE, Scott. Guide to Elliptic + * Curve Cryptography. + * + * [6] Digital Signature Standard (DSS), FIPS 186-4. + * + * + * [7] Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer + * Security (TLS), RFC 4492. + * + * + * [8] + * + * [9] COHEN, Henri. A Course in Computational Algebraic Number Theory. + * Springer Science & Business Media, 1 Aug 2000 + */ + +#ifndef MBEDTLS_ECP_INTERNAL_H +#define MBEDTLS_ECP_INTERNAL_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#if defined(MBEDTLS_ECP_INTERNAL_ALT) + +/** + * \brief Indicate if the Elliptic Curve Point module extension can + * handle the group. + * + * \param grp The pointer to the elliptic curve group that will be the + * basis of the cryptographic computations. + * + * \return Non-zero if successful. + */ +unsigned char mbedtls_internal_ecp_grp_capable(const mbedtls_ecp_group *grp); + +/** + * \brief Initialise the Elliptic Curve Point module extension. + * + * If mbedtls_internal_ecp_grp_capable returns true for a + * group, this function has to be able to initialise the + * module for it. + * + * This module can be a driver to a crypto hardware + * accelerator, for which this could be an initialise function. + * + * \param grp The pointer to the group the module needs to be + * initialised for. + * + * \return 0 if successful. + */ +int mbedtls_internal_ecp_init(const mbedtls_ecp_group *grp); + +/** + * \brief Frees and deallocates the Elliptic Curve Point module + * extension. + * + * \param grp The pointer to the group the module was initialised for. + */ +void mbedtls_internal_ecp_free(const mbedtls_ecp_group *grp); + +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) + +#if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) +/** + * \brief Randomize jacobian coordinates: + * (X, Y, Z) -> (l^2 X, l^3 Y, l Z) for random l. + * + * \param grp Pointer to the group representing the curve. + * + * \param pt The point on the curve to be randomised, given with Jacobian + * coordinates. + * + * \param f_rng A function pointer to the random number generator. + * + * \param p_rng A pointer to the random number generator state. + * + * \return 0 if successful. + */ +int mbedtls_internal_ecp_randomize_jac(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *pt, int (*f_rng)(void *, + unsigned char *, + size_t), + void *p_rng); +#endif + +#if defined(MBEDTLS_ECP_ADD_MIXED_ALT) +/** + * \brief Addition: R = P + Q, mixed affine-Jacobian coordinates. + * + * The coordinates of Q must be normalized (= affine), + * but those of P don't need to. R is not normalized. + * + * This function is used only as a subrutine of + * ecp_mul_comb(). + * + * Special cases: (1) P or Q is zero, (2) R is zero, + * (3) P == Q. + * None of these cases can happen as intermediate step in + * ecp_mul_comb(): + * - at each step, P, Q and R are multiples of the base + * point, the factor being less than its order, so none of + * them is zero; + * - Q is an odd multiple of the base point, P an even + * multiple, due to the choice of precomputed points in the + * modified comb method. + * So branches for these cases do not leak secret information. + * + * We accept Q->Z being unset (saving memory in tables) as + * meaning 1. + * + * Cost in field operations if done by [5] 3.22: + * 1A := 8M + 3S + * + * \param grp Pointer to the group representing the curve. + * + * \param R Pointer to a point structure to hold the result. + * + * \param P Pointer to the first summand, given with Jacobian + * coordinates + * + * \param Q Pointer to the second summand, given with affine + * coordinates. + * + * \return 0 if successful. + */ +int mbedtls_internal_ecp_add_mixed(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *R, const mbedtls_ecp_point *P, + const mbedtls_ecp_point *Q); +#endif + +/** + * \brief Point doubling R = 2 P, Jacobian coordinates. + * + * Cost: 1D := 3M + 4S (A == 0) + * 4M + 4S (A == -3) + * 3M + 6S + 1a otherwise + * when the implementation is based on the "dbl-1998-cmo-2" + * doubling formulas in [8] and standard optimizations are + * applied when curve parameter A is one of { 0, -3 }. + * + * \param grp Pointer to the group representing the curve. + * + * \param R Pointer to a point structure to hold the result. + * + * \param P Pointer to the point that has to be doubled, given with + * Jacobian coordinates. + * + * \return 0 if successful. + */ +#if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) +int mbedtls_internal_ecp_double_jac(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *R, const mbedtls_ecp_point *P); +#endif + +/** + * \brief Normalize jacobian coordinates of an array of (pointers to) + * points. + * + * Using Montgomery's trick to perform only one inversion mod P + * the cost is: + * 1N(t) := 1I + (6t - 3)M + 1S + * (See for example Algorithm 10.3.4. in [9]) + * + * This function is used only as a subrutine of + * ecp_mul_comb(). + * + * Warning: fails (returning an error) if one of the points is + * zero! + * This should never happen, see choice of w in ecp_mul_comb(). + * + * \param grp Pointer to the group representing the curve. + * + * \param T Array of pointers to the points to normalise. + * + * \param t_len Number of elements in the array. + * + * \return 0 if successful, + * an error if one of the points is zero. + */ +#if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) +int mbedtls_internal_ecp_normalize_jac_many(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *T[], size_t t_len); +#endif + +/** + * \brief Normalize jacobian coordinates so that Z == 0 || Z == 1. + * + * Cost in field operations if done by [5] 3.2.1: + * 1N := 1I + 3M + 1S + * + * \param grp Pointer to the group representing the curve. + * + * \param pt pointer to the point to be normalised. This is an + * input/output parameter. + * + * \return 0 if successful. + */ +#if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) +int mbedtls_internal_ecp_normalize_jac(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *pt); +#endif + +#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */ + +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) + +#if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) +int mbedtls_internal_ecp_double_add_mxz(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *R, + mbedtls_ecp_point *S, + const mbedtls_ecp_point *P, + const mbedtls_ecp_point *Q, + const mbedtls_mpi *d); +#endif + +/** + * \brief Randomize projective x/z coordinates: + * (X, Z) -> (l X, l Z) for random l + * + * \param grp pointer to the group representing the curve + * + * \param P the point on the curve to be randomised given with + * projective coordinates. This is an input/output parameter. + * + * \param f_rng a function pointer to the random number generator + * + * \param p_rng a pointer to the random number generator state + * + * \return 0 if successful + */ +#if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) +int mbedtls_internal_ecp_randomize_mxz(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *P, int (*f_rng)(void *, + unsigned char *, + size_t), + void *p_rng); +#endif + +/** + * \brief Normalize Montgomery x/z coordinates: X = X/Z, Z = 1. + * + * \param grp pointer to the group representing the curve + * + * \param P pointer to the point to be normalised. This is an + * input/output parameter. + * + * \return 0 if successful + */ +#if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) +int mbedtls_internal_ecp_normalize_mxz(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *P); +#endif + +#endif /* MBEDTLS_ECP_MONTGOMERY_ENABLED */ + +#endif /* MBEDTLS_ECP_INTERNAL_ALT */ + +#endif /* ecp_internal.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/entropy.h b/ext/opcua_client/mbedtls/include/mbedtls/entropy.h new file mode 100644 index 0000000..096bff8 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/entropy.h @@ -0,0 +1,280 @@ +/** + * \file entropy.h + * + * \brief Entropy accumulator implementation + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_ENTROPY_H +#define MBEDTLS_ENTROPY_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include + +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) +#include "mbedtls/sha512.h" +#define MBEDTLS_ENTROPY_SHA512_ACCUMULATOR +#else +#if defined(MBEDTLS_SHA256_C) +#define MBEDTLS_ENTROPY_SHA256_ACCUMULATOR +#include "mbedtls/sha256.h" +#endif +#endif + +#if defined(MBEDTLS_THREADING_C) +#include "mbedtls/threading.h" +#endif + +#if defined(MBEDTLS_HAVEGE_C) +#include "mbedtls/havege.h" +#endif + +/** Critical entropy source failure. */ +#define MBEDTLS_ERR_ENTROPY_SOURCE_FAILED -0x003C +/** No more sources can be added. */ +#define MBEDTLS_ERR_ENTROPY_MAX_SOURCES -0x003E +/** No sources have been added to poll. */ +#define MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED -0x0040 +/** No strong sources have been added to poll. */ +#define MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE -0x003D +/** Read/write error in file. */ +#define MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR -0x003F + +/** + * \name SECTION: Module settings + * + * The configuration options you can set for this module are in this section. + * Either change them in config.h or define them on the compiler command line. + * \{ + */ + +#if !defined(MBEDTLS_ENTROPY_MAX_SOURCES) +#define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ +#endif + +#if !defined(MBEDTLS_ENTROPY_MAX_GATHER) +#define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ +#endif + +/** \} name SECTION: Module settings */ + +#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) +#define MBEDTLS_ENTROPY_BLOCK_SIZE 64 /**< Block size of entropy accumulator (SHA-512) */ +#else +#define MBEDTLS_ENTROPY_BLOCK_SIZE 32 /**< Block size of entropy accumulator (SHA-256) */ +#endif + +#define MBEDTLS_ENTROPY_MAX_SEED_SIZE 1024 /**< Maximum size of seed we read from seed file */ +#define MBEDTLS_ENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_MAX_SOURCES + +#define MBEDTLS_ENTROPY_SOURCE_STRONG 1 /**< Entropy source is strong */ +#define MBEDTLS_ENTROPY_SOURCE_WEAK 0 /**< Entropy source is weak */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Entropy poll callback pointer + * + * \param data Callback-specific data pointer + * \param output Data to fill + * \param len Maximum size to provide + * \param olen The actual amount of bytes put into the buffer (Can be 0) + * + * \return 0 if no critical failures occurred, + * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED otherwise + */ +typedef int (*mbedtls_entropy_f_source_ptr)(void *data, unsigned char *output, size_t len, + size_t *olen); + +/** + * \brief Entropy source state + */ +typedef struct mbedtls_entropy_source_state { + mbedtls_entropy_f_source_ptr f_source; /**< The entropy source callback */ + void *p_source; /**< The callback data pointer */ + size_t size; /**< Amount received in bytes */ + size_t threshold; /**< Minimum bytes required before release */ + int strong; /**< Is the source strong? */ +} +mbedtls_entropy_source_state; + +/** + * \brief Entropy context structure + */ +typedef struct mbedtls_entropy_context { + int accumulator_started; /* 0 after init. + * 1 after the first update. + * -1 after free. */ +#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) + mbedtls_sha512_context accumulator; +#elif defined(MBEDTLS_ENTROPY_SHA256_ACCUMULATOR) + mbedtls_sha256_context accumulator; +#endif + int source_count; /* Number of entries used in source. */ + mbedtls_entropy_source_state source[MBEDTLS_ENTROPY_MAX_SOURCES]; +#if defined(MBEDTLS_HAVEGE_C) + mbedtls_havege_state havege_data; +#endif +#if defined(MBEDTLS_THREADING_C) + mbedtls_threading_mutex_t mutex; /*!< mutex */ +#endif +#if defined(MBEDTLS_ENTROPY_NV_SEED) + int initial_entropy_run; +#endif +} +mbedtls_entropy_context; + +/** + * \brief Initialize the context + * + * \param ctx Entropy context to initialize + */ +void mbedtls_entropy_init(mbedtls_entropy_context *ctx); + +/** + * \brief Free the data in the context + * + * \param ctx Entropy context to free + */ +void mbedtls_entropy_free(mbedtls_entropy_context *ctx); + +/** + * \brief Adds an entropy source to poll + * (Thread-safe if MBEDTLS_THREADING_C is enabled) + * + * \param ctx Entropy context + * \param f_source Entropy function + * \param p_source Function data + * \param threshold Minimum required from source before entropy is released + * ( with mbedtls_entropy_func() ) (in bytes) + * \param strong MBEDTLS_ENTROPY_SOURCE_STRONG or + * MBEDTLS_ENTROPY_SOURCE_WEAK. + * At least one strong source needs to be added. + * Weaker sources (such as the cycle counter) can be used as + * a complement. + * + * \return 0 if successful or MBEDTLS_ERR_ENTROPY_MAX_SOURCES + */ +int mbedtls_entropy_add_source(mbedtls_entropy_context *ctx, + mbedtls_entropy_f_source_ptr f_source, void *p_source, + size_t threshold, int strong); + +/** + * \brief Trigger an extra gather poll for the accumulator + * (Thread-safe if MBEDTLS_THREADING_C is enabled) + * + * \param ctx Entropy context + * + * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED + */ +int mbedtls_entropy_gather(mbedtls_entropy_context *ctx); + +/** + * \brief Retrieve entropy from the accumulator + * (Maximum length: MBEDTLS_ENTROPY_BLOCK_SIZE) + * (Thread-safe if MBEDTLS_THREADING_C is enabled) + * + * \param data Entropy context + * \param output Buffer to fill + * \param len Number of bytes desired, must be at most MBEDTLS_ENTROPY_BLOCK_SIZE + * + * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED + */ +int mbedtls_entropy_func(void *data, unsigned char *output, size_t len); + +/** + * \brief Add data to the accumulator manually + * (Thread-safe if MBEDTLS_THREADING_C is enabled) + * + * \param ctx Entropy context + * \param data Data to add + * \param len Length of data + * + * \return 0 if successful + */ +int mbedtls_entropy_update_manual(mbedtls_entropy_context *ctx, + const unsigned char *data, size_t len); + +#if defined(MBEDTLS_ENTROPY_NV_SEED) +/** + * \brief Trigger an update of the seed file in NV by using the + * current entropy pool. + * + * \param ctx Entropy context + * + * \return 0 if successful + */ +int mbedtls_entropy_update_nv_seed(mbedtls_entropy_context *ctx); +#endif /* MBEDTLS_ENTROPY_NV_SEED */ + +#if defined(MBEDTLS_FS_IO) +/** + * \brief Write a seed file + * + * \param ctx Entropy context + * \param path Name of the file + * + * \return 0 if successful, + * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, or + * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED + */ +int mbedtls_entropy_write_seed_file(mbedtls_entropy_context *ctx, const char *path); + +/** + * \brief Read and update a seed file. Seed is added to this + * instance. No more than MBEDTLS_ENTROPY_MAX_SEED_SIZE bytes are + * read from the seed file. The rest is ignored. + * + * \param ctx Entropy context + * \param path Name of the file + * + * \return 0 if successful, + * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, + * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED + */ +int mbedtls_entropy_update_seed_file(mbedtls_entropy_context *ctx, const char *path); +#endif /* MBEDTLS_FS_IO */ + +#if defined(MBEDTLS_SELF_TEST) +/** + * \brief Checkup routine + * + * This module self-test also calls the entropy self-test, + * mbedtls_entropy_source_self_test(); + * + * \return 0 if successful, or 1 if a test failed + */ +int mbedtls_entropy_self_test(int verbose); + +#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) +/** + * \brief Checkup routine + * + * Verifies the integrity of the hardware entropy source + * provided by the function 'mbedtls_hardware_poll()'. + * + * Note this is the only hardware entropy source that is known + * at link time, and other entropy sources configured + * dynamically at runtime by the function + * mbedtls_entropy_add_source() will not be tested. + * + * \return 0 if successful, or 1 if a test failed + */ +int mbedtls_entropy_source_self_test(int verbose); +#endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */ +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* entropy.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/entropy_poll.h b/ext/opcua_client/mbedtls/include/mbedtls/entropy_poll.h new file mode 100644 index 0000000..d7147b9 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/entropy_poll.h @@ -0,0 +1,96 @@ +/** + * \file entropy_poll.h + * + * \brief Platform-specific and custom entropy polling functions + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_ENTROPY_POLL_H +#define MBEDTLS_ENTROPY_POLL_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Default thresholds for built-in sources, in bytes + */ +#define MBEDTLS_ENTROPY_MIN_PLATFORM 32 /**< Minimum for platform source */ +#define MBEDTLS_ENTROPY_MIN_HAVEGE 32 /**< Minimum for HAVEGE */ +#define MBEDTLS_ENTROPY_MIN_HARDCLOCK 4 /**< Minimum for mbedtls_timing_hardclock() */ +#if !defined(MBEDTLS_ENTROPY_MIN_HARDWARE) +#define MBEDTLS_ENTROPY_MIN_HARDWARE 32 /**< Minimum for the hardware source */ +#endif + +/** + * \brief Entropy poll callback that provides 0 entropy. + */ +#if defined(MBEDTLS_TEST_NULL_ENTROPY) +int mbedtls_null_entropy_poll(void *data, + unsigned char *output, size_t len, size_t *olen); +#endif + +#if !defined(MBEDTLS_NO_PLATFORM_ENTROPY) +/** + * \brief Platform-specific entropy poll callback + */ +int mbedtls_platform_entropy_poll(void *data, + unsigned char *output, size_t len, size_t *olen); +#endif + +#if defined(MBEDTLS_HAVEGE_C) +/** + * \brief HAVEGE based entropy poll callback + * + * Requires an HAVEGE state as its data pointer. + */ +int mbedtls_havege_poll(void *data, + unsigned char *output, size_t len, size_t *olen); +#endif + +#if defined(MBEDTLS_TIMING_C) +/** + * \brief mbedtls_timing_hardclock-based entropy poll callback + */ +int mbedtls_hardclock_poll(void *data, + unsigned char *output, size_t len, size_t *olen); +#endif + +#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) +/** + * \brief Entropy poll callback for a hardware source + * + * \warning This is not provided by Mbed TLS! + * See \c MBEDTLS_ENTROPY_HARDWARE_ALT in config.h. + * + * \note This must accept NULL as its first argument. + */ +int mbedtls_hardware_poll(void *data, + unsigned char *output, size_t len, size_t *olen); +#endif + +#if defined(MBEDTLS_ENTROPY_NV_SEED) +/** + * \brief Entropy poll callback for a non-volatile seed file + * + * \note This must accept NULL as its first argument. + */ +int mbedtls_nv_seed_poll(void *data, + unsigned char *output, size_t len, size_t *olen); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* entropy_poll.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/error.h b/ext/opcua_client/mbedtls/include/mbedtls/error.h new file mode 100644 index 0000000..fd0ac76 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/error.h @@ -0,0 +1,206 @@ +/** + * \file error.h + * + * \brief Error to string translation + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_ERROR_H +#define MBEDTLS_ERROR_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include + +#if (defined(__ARMCC_VERSION) || defined(_MSC_VER)) && \ + !defined(inline) && !defined(__cplusplus) +#define inline __inline +#endif + +/** + * Error code layout. + * + * Currently we try to keep all error codes within the negative space of 16 + * bits signed integers to support all platforms (-0x0001 - -0x7FFF). In + * addition we'd like to give two layers of information on the error if + * possible. + * + * For that purpose the error codes are segmented in the following manner: + * + * 16 bit error code bit-segmentation + * + * 1 bit - Unused (sign bit) + * 3 bits - High level module ID + * 5 bits - Module-dependent error code + * 7 bits - Low level module errors + * + * For historical reasons, low-level error codes are divided in even and odd, + * even codes were assigned first, and -1 is reserved for other errors. + * + * Low-level module errors (0x0002-0x007E, 0x0001-0x007F) + * + * Module Nr Codes assigned + * ERROR 2 0x006E 0x0001 + * MPI 7 0x0002-0x0010 + * GCM 3 0x0012-0x0014 0x0013-0x0013 + * BLOWFISH 3 0x0016-0x0018 0x0017-0x0017 + * THREADING 3 0x001A-0x001E + * AES 5 0x0020-0x0022 0x0021-0x0025 + * CAMELLIA 3 0x0024-0x0026 0x0027-0x0027 + * XTEA 2 0x0028-0x0028 0x0029-0x0029 + * BASE64 2 0x002A-0x002C + * OID 1 0x002E-0x002E 0x000B-0x000B + * PADLOCK 1 0x0030-0x0030 + * DES 2 0x0032-0x0032 0x0033-0x0033 + * CTR_DBRG 4 0x0034-0x003A + * ENTROPY 3 0x003C-0x0040 0x003D-0x003F + * NET 13 0x0042-0x0052 0x0043-0x0049 + * ARIA 4 0x0058-0x005E + * ASN1 7 0x0060-0x006C + * CMAC 1 0x007A-0x007A + * PBKDF2 1 0x007C-0x007C + * HMAC_DRBG 4 0x0003-0x0009 + * CCM 3 0x000D-0x0011 + * ARC4 1 0x0019-0x0019 + * MD2 1 0x002B-0x002B + * MD4 1 0x002D-0x002D + * MD5 1 0x002F-0x002F + * RIPEMD160 1 0x0031-0x0031 + * SHA1 1 0x0035-0x0035 0x0073-0x0073 + * SHA256 1 0x0037-0x0037 0x0074-0x0074 + * SHA512 1 0x0039-0x0039 0x0075-0x0075 + * CHACHA20 3 0x0051-0x0055 + * POLY1305 3 0x0057-0x005B + * CHACHAPOLY 2 0x0054-0x0056 + * PLATFORM 2 0x0070-0x0072 + * + * High-level module nr (3 bits - 0x0...-0x7...) + * Name ID Nr of Errors + * PEM 1 9 + * PKCS#12 1 4 (Started from top) + * X509 2 20 + * PKCS5 2 4 (Started from top) + * DHM 3 11 + * PK 3 15 (Started from top) + * RSA 4 11 + * ECP 4 10 (Started from top) + * MD 5 5 + * HKDF 5 1 (Started from top) + * SSL 5 3 (Started from 0x5F00) + * CIPHER 6 8 (Started from 0x6080) + * SSL 6 24 (Started from top, plus 0x6000) + * SSL 7 32 + * + * Module dependent error code (5 bits 0x.00.-0x.F8.) + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** Generic error */ +#define MBEDTLS_ERR_ERROR_GENERIC_ERROR -0x0001 +/** This is a bug in the library */ +#define MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED -0x006E + +/** + * \brief Combines a high-level and low-level error code together. + * + * Wrapper macro for mbedtls_error_add(). See that function for + * more details. + */ +#define MBEDTLS_ERROR_ADD(high, low) \ + mbedtls_error_add(high, low, __FILE__, __LINE__) + +#if defined(MBEDTLS_TEST_HOOKS) +/** + * \brief Testing hook called before adding/combining two error codes together. + * Only used when invasive testing is enabled via MBEDTLS_TEST_HOOKS. + */ +extern void (*mbedtls_test_hook_error_add)(int, int, const char *, int); +#endif + +/** + * \brief Combines a high-level and low-level error code together. + * + * This function can be called directly however it is usually + * called via the #MBEDTLS_ERROR_ADD macro. + * + * While a value of zero is not a negative error code, it is still an + * error code (that denotes success) and can be combined with both a + * negative error code or another value of zero. + * + * \note When invasive testing is enabled via #MBEDTLS_TEST_HOOKS, also try to + * call \link mbedtls_test_hook_error_add \endlink. + * + * \param high high-level error code. See error.h for more details. + * \param low low-level error code. See error.h for more details. + * \param file file where this error code addition occurred. + * \param line line where this error code addition occurred. + */ +static inline int mbedtls_error_add(int high, int low, + const char *file, int line) +{ +#if defined(MBEDTLS_TEST_HOOKS) + if (*mbedtls_test_hook_error_add != NULL) { + (*mbedtls_test_hook_error_add)(high, low, file, line); + } +#endif + (void) file; + (void) line; + + return high + low; +} + +/** + * \brief Translate an Mbed TLS error code into a string representation. + * The result is truncated if necessary and always includes a + * terminating null byte. + * + * \param errnum error code + * \param buffer buffer to place representation in + * \param buflen length of the buffer + */ +void mbedtls_strerror(int errnum, char *buffer, size_t buflen); + +/** + * \brief Translate the high-level part of an Mbed TLS error code into a string + * representation. + * + * This function returns a const pointer to an un-modifiable string. The caller + * must not try to modify the string. It is intended to be used mostly for + * logging purposes. + * + * \param error_code error code + * + * \return The string representation of the error code, or \c NULL if the error + * code is unknown. + */ +const char *mbedtls_high_level_strerr(int error_code); + +/** + * \brief Translate the low-level part of an Mbed TLS error code into a string + * representation. + * + * This function returns a const pointer to an un-modifiable string. The caller + * must not try to modify the string. It is intended to be used mostly for + * logging purposes. + * + * \param error_code error code + * + * \return The string representation of the error code, or \c NULL if the error + * code is unknown. + */ +const char *mbedtls_low_level_strerr(int error_code); + +#ifdef __cplusplus +} +#endif + +#endif /* error.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/gcm.h b/ext/opcua_client/mbedtls/include/mbedtls/gcm.h new file mode 100644 index 0000000..166ae1c --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/gcm.h @@ -0,0 +1,317 @@ +/** + * \file gcm.h + * + * \brief This file contains GCM definitions and functions. + * + * The Galois/Counter Mode (GCM) for 128-bit block ciphers is defined + * in D. McGrew, J. Viega, The Galois/Counter Mode of Operation + * (GCM), Natl. Inst. Stand. Technol. + * + * For more information on GCM, see NIST SP 800-38D: Recommendation for + * Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC. + * + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_GCM_H +#define MBEDTLS_GCM_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/cipher.h" + +#include + +#define MBEDTLS_GCM_ENCRYPT 1 +#define MBEDTLS_GCM_DECRYPT 0 + +/** Authenticated decryption failed. */ +#define MBEDTLS_ERR_GCM_AUTH_FAILED -0x0012 + +/* MBEDTLS_ERR_GCM_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** GCM hardware accelerator failed. */ +#define MBEDTLS_ERR_GCM_HW_ACCEL_FAILED -0x0013 + +/** Bad input parameters to function. */ +#define MBEDTLS_ERR_GCM_BAD_INPUT -0x0014 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_GCM_ALT) + +/** + * \brief The GCM context structure. + */ +typedef struct mbedtls_gcm_context { + mbedtls_cipher_context_t cipher_ctx; /*!< The cipher context used. */ + uint64_t HL[16]; /*!< Precalculated HTable low. */ + uint64_t HH[16]; /*!< Precalculated HTable high. */ + uint64_t len; /*!< The total length of the encrypted data. */ + uint64_t add_len; /*!< The total length of the additional data. */ + unsigned char base_ectr[16]; /*!< The first ECTR for tag. */ + unsigned char y[16]; /*!< The Y working value. */ + unsigned char buf[16]; /*!< The buf working value. */ + int mode; /*!< The operation to perform: + #MBEDTLS_GCM_ENCRYPT or + #MBEDTLS_GCM_DECRYPT. */ +} +mbedtls_gcm_context; + +#else /* !MBEDTLS_GCM_ALT */ +#include "gcm_alt.h" +#endif /* !MBEDTLS_GCM_ALT */ + +/** + * \brief This function initializes the specified GCM context, + * to make references valid, and prepares the context + * for mbedtls_gcm_setkey() or mbedtls_gcm_free(). + * + * The function does not bind the GCM context to a particular + * cipher, nor set the key. For this purpose, use + * mbedtls_gcm_setkey(). + * + * \param ctx The GCM context to initialize. This must not be \c NULL. + */ +void mbedtls_gcm_init(mbedtls_gcm_context *ctx); + +/** + * \brief This function associates a GCM context with a + * cipher algorithm and a key. + * + * \param ctx The GCM context. This must be initialized. + * \param cipher The 128-bit block cipher to use. + * \param key The encryption key. This must be a readable buffer of at + * least \p keybits bits. + * \param keybits The key size in bits. Valid options are: + *
  • 128 bits
  • + *
  • 192 bits
  • + *
  • 256 bits
+ * + * \return \c 0 on success. + * \return A cipher-specific error code on failure. + */ +int mbedtls_gcm_setkey(mbedtls_gcm_context *ctx, + mbedtls_cipher_id_t cipher, + const unsigned char *key, + unsigned int keybits); + +/** + * \brief This function performs GCM encryption or decryption of a buffer. + * + * \note The output buffer \p output can be the same as the input + * buffer \p input. If \p output is greater than \p input, they + * cannot overlap. + * + * \warning When this function performs a decryption, it outputs the + * authentication tag and does not verify that the data is + * authentic. You should use this function to perform encryption + * only. For decryption, use mbedtls_gcm_auth_decrypt() instead. + * + * \param ctx The GCM context to use for encryption or decryption. This + * must be initialized. + * \param mode The operation to perform: + * - #MBEDTLS_GCM_ENCRYPT to perform authenticated encryption. + * The ciphertext is written to \p output and the + * authentication tag is written to \p tag. + * - #MBEDTLS_GCM_DECRYPT to perform decryption. + * The plaintext is written to \p output and the + * authentication tag is written to \p tag. + * Note that this mode is not recommended, because it does + * not verify the authenticity of the data. For this reason, + * you should use mbedtls_gcm_auth_decrypt() instead of + * calling this function in decryption mode. + * \param length The length of the input data, which is equal to the length + * of the output data. + * \param iv The initialization vector. This must be a readable buffer of + * at least \p iv_len Bytes. + * \param iv_len The length of the IV. + * \param add The buffer holding the additional data. This must be of at + * least that size in Bytes. + * \param add_len The length of the additional data. + * \param input The buffer holding the input data. If \p length is greater + * than zero, this must be a readable buffer of at least that + * size in Bytes. + * \param output The buffer for holding the output data. If \p length is greater + * than zero, this must be a writable buffer of at least that + * size in Bytes. + * \param tag_len The length of the tag to generate. + * \param tag The buffer for holding the tag. This must be a writable + * buffer of at least \p tag_len Bytes. + * + * \return \c 0 if the encryption or decryption was performed + * successfully. Note that in #MBEDTLS_GCM_DECRYPT mode, + * this does not indicate that the data is authentic. + * \return #MBEDTLS_ERR_GCM_BAD_INPUT if the lengths or pointers are + * not valid or a cipher-specific error code if the encryption + * or decryption failed. + */ +int mbedtls_gcm_crypt_and_tag(mbedtls_gcm_context *ctx, + int mode, + size_t length, + const unsigned char *iv, + size_t iv_len, + const unsigned char *add, + size_t add_len, + const unsigned char *input, + unsigned char *output, + size_t tag_len, + unsigned char *tag); + +/** + * \brief This function performs a GCM authenticated decryption of a + * buffer. + * + * \note The output buffer \p output can be the same as the input + * buffer \p input. If \p output is greater than \p input, they + * cannot overlap. Implementations which require + * MBEDTLS_GCM_ALT to be enabled may not provide support for + * overlapping buffers. + * + * \param ctx The GCM context. This must be initialized. + * \param length The length of the ciphertext to decrypt, which is also + * the length of the decrypted plaintext. + * \param iv The initialization vector. This must be a readable buffer + * of at least \p iv_len Bytes. + * \param iv_len The length of the IV. + * \param add The buffer holding the additional data. This must be of at + * least that size in Bytes. + * \param add_len The length of the additional data. + * \param tag The buffer holding the tag to verify. This must be a + * readable buffer of at least \p tag_len Bytes. + * \param tag_len The length of the tag to verify. + * \param input The buffer holding the ciphertext. If \p length is greater + * than zero, this must be a readable buffer of at least that + * size. + * \param output The buffer for holding the decrypted plaintext. If \p length + * is greater than zero, this must be a writable buffer of at + * least that size. + * + * \return \c 0 if successful and authenticated. + * \return #MBEDTLS_ERR_GCM_AUTH_FAILED if the tag does not match. + * \return #MBEDTLS_ERR_GCM_BAD_INPUT if the lengths or pointers are + * not valid or a cipher-specific error code if the decryption + * failed. + */ +int mbedtls_gcm_auth_decrypt(mbedtls_gcm_context *ctx, + size_t length, + const unsigned char *iv, + size_t iv_len, + const unsigned char *add, + size_t add_len, + const unsigned char *tag, + size_t tag_len, + const unsigned char *input, + unsigned char *output); + +/** + * \brief This function starts a GCM encryption or decryption + * operation. + * + * \param ctx The GCM context. This must be initialized. + * \param mode The operation to perform: #MBEDTLS_GCM_ENCRYPT or + * #MBEDTLS_GCM_DECRYPT. + * \param iv The initialization vector. This must be a readable buffer of + * at least \p iv_len Bytes. + * \param iv_len The length of the IV. + * \param add The buffer holding the additional data, or \c NULL + * if \p add_len is \c 0. + * \param add_len The length of the additional data. If \c 0, + * \p add may be \c NULL. + * + * \return \c 0 on success. + */ +int mbedtls_gcm_starts(mbedtls_gcm_context *ctx, + int mode, + const unsigned char *iv, + size_t iv_len, + const unsigned char *add, + size_t add_len); + +/** + * \brief This function feeds an input buffer into an ongoing GCM + * encryption or decryption operation. + * + * ` The function expects input to be a multiple of 16 + * Bytes. Only the last call before calling + * mbedtls_gcm_finish() can be less than 16 Bytes. + * + * \note The output buffer \p output can be the same as the input + * buffer \p input. If \p output is greater than \p input, they + * cannot overlap. Implementations which require + * MBEDTLS_GCM_ALT to be enabled may not provide support for + * overlapping buffers. + * + * \param ctx The GCM context. This must be initialized. + * \param length The length of the input data. This must be a multiple of + * 16 except in the last call before mbedtls_gcm_finish(). + * \param input The buffer holding the input data. If \p length is greater + * than zero, this must be a readable buffer of at least that + * size in Bytes. + * \param output The buffer for holding the output data. If \p length is + * greater than zero, this must be a writable buffer of at + * least that size in Bytes. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_GCM_BAD_INPUT on failure. + */ +int mbedtls_gcm_update(mbedtls_gcm_context *ctx, + size_t length, + const unsigned char *input, + unsigned char *output); + +/** + * \brief This function finishes the GCM operation and generates + * the authentication tag. + * + * It wraps up the GCM stream, and generates the + * tag. The tag can have a maximum length of 16 Bytes. + * + * \param ctx The GCM context. This must be initialized. + * \param tag The buffer for holding the tag. This must be a writable + * buffer of at least \p tag_len Bytes. + * \param tag_len The length of the tag to generate. This must be at least + * four. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_GCM_BAD_INPUT on failure. + */ +int mbedtls_gcm_finish(mbedtls_gcm_context *ctx, + unsigned char *tag, + size_t tag_len); + +/** + * \brief This function clears a GCM context and the underlying + * cipher sub-context. + * + * \param ctx The GCM context to clear. If this is \c NULL, the call has + * no effect. Otherwise, this must be initialized. + */ +void mbedtls_gcm_free(mbedtls_gcm_context *ctx); + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief The GCM checkup routine. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +int mbedtls_gcm_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + + +#endif /* gcm.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/havege.h b/ext/opcua_client/mbedtls/include/mbedtls/havege.h new file mode 100644 index 0000000..cdaf8a8 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/havege.h @@ -0,0 +1,67 @@ +/** + * \file havege.h + * + * \brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_HAVEGE_H +#define MBEDTLS_HAVEGE_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +#define MBEDTLS_HAVEGE_COLLECT_SIZE 1024 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief HAVEGE state structure + */ +typedef struct mbedtls_havege_state { + uint32_t PT1, PT2, offset[2]; + uint32_t pool[MBEDTLS_HAVEGE_COLLECT_SIZE]; + uint32_t WALK[8192]; +} +mbedtls_havege_state; + +/** + * \brief HAVEGE initialization + * + * \param hs HAVEGE state to be initialized + */ +void mbedtls_havege_init(mbedtls_havege_state *hs); + +/** + * \brief Clear HAVEGE state + * + * \param hs HAVEGE state to be cleared + */ +void mbedtls_havege_free(mbedtls_havege_state *hs); + +/** + * \brief HAVEGE rand function + * + * \param p_rng A HAVEGE state + * \param output Buffer to fill + * \param len Length of buffer + * + * \return 0 + */ +int mbedtls_havege_random(void *p_rng, unsigned char *output, size_t len); + +#ifdef __cplusplus +} +#endif + +#endif /* havege.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/hkdf.h b/ext/opcua_client/mbedtls/include/mbedtls/hkdf.h new file mode 100644 index 0000000..103f329 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/hkdf.h @@ -0,0 +1,128 @@ +/** + * \file hkdf.h + * + * \brief This file contains the HKDF interface. + * + * The HMAC-based Extract-and-Expand Key Derivation Function (HKDF) is + * specified by RFC 5869. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_HKDF_H +#define MBEDTLS_HKDF_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/md.h" + +/** + * \name HKDF Error codes + * \{ + */ +/** Bad input parameters to function. */ +#define MBEDTLS_ERR_HKDF_BAD_INPUT_DATA -0x5F80 +/** \} name */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief This is the HMAC-based Extract-and-Expand Key Derivation Function + * (HKDF). + * + * \param md A hash function; md.size denotes the length of the hash + * function output in bytes. + * \param salt An optional salt value (a non-secret random value); + * if the salt is not provided, a string of all zeros of + * md.size length is used as the salt. + * \param salt_len The length in bytes of the optional \p salt. + * \param ikm The input keying material. + * \param ikm_len The length in bytes of \p ikm. + * \param info An optional context and application specific information + * string. This can be a zero-length string. + * \param info_len The length of \p info in bytes. + * \param okm The output keying material of \p okm_len bytes. + * \param okm_len The length of the output keying material in bytes. This + * must be less than or equal to 255 * md.size bytes. + * + * \return 0 on success. + * \return #MBEDTLS_ERR_HKDF_BAD_INPUT_DATA when the parameters are invalid. + * \return An MBEDTLS_ERR_MD_* error for errors returned from the underlying + * MD layer. + */ +int mbedtls_hkdf(const mbedtls_md_info_t *md, const unsigned char *salt, + size_t salt_len, const unsigned char *ikm, size_t ikm_len, + const unsigned char *info, size_t info_len, + unsigned char *okm, size_t okm_len); + +/** + * \brief Take the input keying material \p ikm and extract from it a + * fixed-length pseudorandom key \p prk. + * + * \warning This function should only be used if the security of it has been + * studied and established in that particular context (eg. TLS 1.3 + * key schedule). For standard HKDF security guarantees use + * \c mbedtls_hkdf instead. + * + * \param md A hash function; md.size denotes the length of the + * hash function output in bytes. + * \param salt An optional salt value (a non-secret random value); + * if the salt is not provided, a string of all zeros + * of md.size length is used as the salt. + * \param salt_len The length in bytes of the optional \p salt. + * \param ikm The input keying material. + * \param ikm_len The length in bytes of \p ikm. + * \param[out] prk A pseudorandom key of at least md.size bytes. + * + * \return 0 on success. + * \return #MBEDTLS_ERR_HKDF_BAD_INPUT_DATA when the parameters are invalid. + * \return An MBEDTLS_ERR_MD_* error for errors returned from the underlying + * MD layer. + */ +int mbedtls_hkdf_extract(const mbedtls_md_info_t *md, + const unsigned char *salt, size_t salt_len, + const unsigned char *ikm, size_t ikm_len, + unsigned char *prk); + +/** + * \brief Expand the supplied \p prk into several additional pseudorandom + * keys, which is the output of the HKDF. + * + * \warning This function should only be used if the security of it has been + * studied and established in that particular context (eg. TLS 1.3 + * key schedule). For standard HKDF security guarantees use + * \c mbedtls_hkdf instead. + * + * \param md A hash function; md.size denotes the length of the hash + * function output in bytes. + * \param prk A pseudorandom key of at least md.size bytes. \p prk is + * usually the output from the HKDF extract step. + * \param prk_len The length in bytes of \p prk. + * \param info An optional context and application specific information + * string. This can be a zero-length string. + * \param info_len The length of \p info in bytes. + * \param okm The output keying material of \p okm_len bytes. + * \param okm_len The length of the output keying material in bytes. This + * must be less than or equal to 255 * md.size bytes. + * + * \return 0 on success. + * \return #MBEDTLS_ERR_HKDF_BAD_INPUT_DATA when the parameters are invalid. + * \return An MBEDTLS_ERR_MD_* error for errors returned from the underlying + * MD layer. + */ +int mbedtls_hkdf_expand(const mbedtls_md_info_t *md, const unsigned char *prk, + size_t prk_len, const unsigned char *info, + size_t info_len, unsigned char *okm, size_t okm_len); + +#ifdef __cplusplus +} +#endif + +#endif /* hkdf.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/hmac_drbg.h b/ext/opcua_client/mbedtls/include/mbedtls/hmac_drbg.h new file mode 100644 index 0000000..d531382 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/hmac_drbg.h @@ -0,0 +1,461 @@ +/** + * \file hmac_drbg.h + * + * \brief The HMAC_DRBG pseudorandom generator. + * + * This module implements the HMAC_DRBG pseudorandom generator described + * in NIST SP 800-90A: Recommendation for Random Number Generation Using + * Deterministic Random Bit Generators. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_HMAC_DRBG_H +#define MBEDTLS_HMAC_DRBG_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/md.h" + +#if defined(MBEDTLS_THREADING_C) +#include "mbedtls/threading.h" +#endif + +/* + * Error codes + */ +/** Too many random requested in single call. */ +#define MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG -0x0003 +/** Input too large (Entropy + additional). */ +#define MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG -0x0005 +/** Read/write error in file. */ +#define MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR -0x0007 +/** The entropy source failed. */ +#define MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED -0x0009 + +/** + * \name SECTION: Module settings + * + * The configuration options you can set for this module are in this section. + * Either change them in config.h or define them on the compiler command line. + * \{ + */ + +#if !defined(MBEDTLS_HMAC_DRBG_RESEED_INTERVAL) +#define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ +#endif + +#if !defined(MBEDTLS_HMAC_DRBG_MAX_INPUT) +#define MBEDTLS_HMAC_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ +#endif + +#if !defined(MBEDTLS_HMAC_DRBG_MAX_REQUEST) +#define MBEDTLS_HMAC_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ +#endif + +#if !defined(MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT) +#define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ +#endif + +/** \} name SECTION: Module settings */ + +#define MBEDTLS_HMAC_DRBG_PR_OFF 0 /**< No prediction resistance */ +#define MBEDTLS_HMAC_DRBG_PR_ON 1 /**< Prediction resistance enabled */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * HMAC_DRBG context. + */ +typedef struct mbedtls_hmac_drbg_context { + /* Working state: the key K is not stored explicitly, + * but is implied by the HMAC context */ + mbedtls_md_context_t md_ctx; /*!< HMAC context (inc. K) */ + unsigned char V[MBEDTLS_MD_MAX_SIZE]; /*!< V in the spec */ + int reseed_counter; /*!< reseed counter */ + + /* Administrative state */ + size_t entropy_len; /*!< entropy bytes grabbed on each (re)seed */ + int prediction_resistance; /*!< enable prediction resistance (Automatic + reseed before every random generation) */ + int reseed_interval; /*!< reseed interval */ + + /* Callbacks */ + int (*f_entropy)(void *, unsigned char *, size_t); /*!< entropy function */ + void *p_entropy; /*!< context for the entropy function */ + +#if defined(MBEDTLS_THREADING_C) + /* Invariant: the mutex is initialized if and only if + * md_ctx->md_info != NULL. This means that the mutex is initialized + * during the initial seeding in mbedtls_hmac_drbg_seed() or + * mbedtls_hmac_drbg_seed_buf() and freed in mbedtls_ctr_drbg_free(). + * + * Note that this invariant may change without notice. Do not rely on it + * and do not access the mutex directly in application code. + */ + mbedtls_threading_mutex_t mutex; +#endif +} mbedtls_hmac_drbg_context; + +/** + * \brief HMAC_DRBG context initialization. + * + * This function makes the context ready for mbedtls_hmac_drbg_seed(), + * mbedtls_hmac_drbg_seed_buf() or mbedtls_hmac_drbg_free(). + * + * \note The reseed interval is #MBEDTLS_HMAC_DRBG_RESEED_INTERVAL + * by default. Override this value by calling + * mbedtls_hmac_drbg_set_reseed_interval(). + * + * \param ctx HMAC_DRBG context to be initialized. + */ +void mbedtls_hmac_drbg_init(mbedtls_hmac_drbg_context *ctx); + +/** + * \brief HMAC_DRBG initial seeding. + * + * Set the initial seed and set up the entropy source for future reseeds. + * + * A typical choice for the \p f_entropy and \p p_entropy parameters is + * to use the entropy module: + * - \p f_entropy is mbedtls_entropy_func(); + * - \p p_entropy is an instance of ::mbedtls_entropy_context initialized + * with mbedtls_entropy_init() (which registers the platform's default + * entropy sources). + * + * You can provide a personalization string in addition to the + * entropy source, to make this instantiation as unique as possible. + * + * \note By default, the security strength as defined by NIST is: + * - 128 bits if \p md_info is SHA-1; + * - 192 bits if \p md_info is SHA-224; + * - 256 bits if \p md_info is SHA-256, SHA-384 or SHA-512. + * Note that SHA-256 is just as efficient as SHA-224. + * The security strength can be reduced if a smaller + * entropy length is set with + * mbedtls_hmac_drbg_set_entropy_len(). + * + * \note The default entropy length is the security strength + * (converted from bits to bytes). You can override + * it by calling mbedtls_hmac_drbg_set_entropy_len(). + * + * \note During the initial seeding, this function calls + * the entropy source to obtain a nonce + * whose length is half the entropy length. + */ +#if defined(MBEDTLS_THREADING_C) +/** + * \note When Mbed TLS is built with threading support, + * after this function returns successfully, + * it is safe to call mbedtls_hmac_drbg_random() + * from multiple threads. Other operations, including + * reseeding, are not thread-safe. + */ +#endif /* MBEDTLS_THREADING_C */ +/** + * \param ctx HMAC_DRBG context to be seeded. + * \param md_info MD algorithm to use for HMAC_DRBG. + * \param f_entropy The entropy callback, taking as arguments the + * \p p_entropy context, the buffer to fill, and the + * length of the buffer. + * \p f_entropy is always called with a length that is + * less than or equal to the entropy length. + * \param p_entropy The entropy context to pass to \p f_entropy. + * \param custom The personalization string. + * This can be \c NULL, in which case the personalization + * string is empty regardless of the value of \p len. + * \param len The length of the personalization string. + * This must be at most #MBEDTLS_HMAC_DRBG_MAX_INPUT + * and also at most + * #MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT - \c entropy_len * 3 / 2 + * where \c entropy_len is the entropy length + * described above. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA if \p md_info is + * invalid. + * \return #MBEDTLS_ERR_MD_ALLOC_FAILED if there was not enough + * memory to allocate context data. + * \return #MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED + * if the call to \p f_entropy failed. + */ +int mbedtls_hmac_drbg_seed(mbedtls_hmac_drbg_context *ctx, + const mbedtls_md_info_t *md_info, + int (*f_entropy)(void *, unsigned char *, size_t), + void *p_entropy, + const unsigned char *custom, + size_t len); + +/** + * \brief Initialisation of simplified HMAC_DRBG (never reseeds). + * + * This function is meant for use in algorithms that need a pseudorandom + * input such as deterministic ECDSA. + */ +#if defined(MBEDTLS_THREADING_C) +/** + * \note When Mbed TLS is built with threading support, + * after this function returns successfully, + * it is safe to call mbedtls_hmac_drbg_random() + * from multiple threads. Other operations, including + * reseeding, are not thread-safe. + */ +#endif /* MBEDTLS_THREADING_C */ +/** + * \param ctx HMAC_DRBG context to be initialised. + * \param md_info MD algorithm to use for HMAC_DRBG. + * \param data Concatenation of the initial entropy string and + * the additional data. + * \param data_len Length of \p data in bytes. + * + * \return \c 0 if successful. or + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA if \p md_info is + * invalid. + * \return #MBEDTLS_ERR_MD_ALLOC_FAILED if there was not enough + * memory to allocate context data. + */ +int mbedtls_hmac_drbg_seed_buf(mbedtls_hmac_drbg_context *ctx, + const mbedtls_md_info_t *md_info, + const unsigned char *data, size_t data_len); + +/** + * \brief This function turns prediction resistance on or off. + * The default value is off. + * + * \note If enabled, entropy is gathered at the beginning of + * every call to mbedtls_hmac_drbg_random_with_add() + * or mbedtls_hmac_drbg_random(). + * Only use this if your entropy source has sufficient + * throughput. + * + * \param ctx The HMAC_DRBG context. + * \param resistance #MBEDTLS_HMAC_DRBG_PR_ON or #MBEDTLS_HMAC_DRBG_PR_OFF. + */ +void mbedtls_hmac_drbg_set_prediction_resistance(mbedtls_hmac_drbg_context *ctx, + int resistance); + +/** + * \brief This function sets the amount of entropy grabbed on each + * seed or reseed. + * + * See the documentation of mbedtls_hmac_drbg_seed() for the default value. + * + * \param ctx The HMAC_DRBG context. + * \param len The amount of entropy to grab, in bytes. + */ +void mbedtls_hmac_drbg_set_entropy_len(mbedtls_hmac_drbg_context *ctx, + size_t len); + +/** + * \brief Set the reseed interval. + * + * The reseed interval is the number of calls to mbedtls_hmac_drbg_random() + * or mbedtls_hmac_drbg_random_with_add() after which the entropy function + * is called again. + * + * The default value is #MBEDTLS_HMAC_DRBG_RESEED_INTERVAL. + * + * \param ctx The HMAC_DRBG context. + * \param interval The reseed interval. + */ +void mbedtls_hmac_drbg_set_reseed_interval(mbedtls_hmac_drbg_context *ctx, + int interval); + +/** + * \brief This function updates the state of the HMAC_DRBG context. + * + * \note This function is not thread-safe. It is not safe + * to call this function if another thread might be + * concurrently obtaining random numbers from the same + * context or updating or reseeding the same context. + * + * \param ctx The HMAC_DRBG context. + * \param additional The data to update the state with. + * If this is \c NULL, there is no additional data. + * \param add_len Length of \p additional in bytes. + * Unused if \p additional is \c NULL. + * + * \return \c 0 on success, or an error from the underlying + * hash calculation. + */ +int mbedtls_hmac_drbg_update_ret(mbedtls_hmac_drbg_context *ctx, + const unsigned char *additional, size_t add_len); + +/** + * \brief This function reseeds the HMAC_DRBG context, that is + * extracts data from the entropy source. + * + * \note This function is not thread-safe. It is not safe + * to call this function if another thread might be + * concurrently obtaining random numbers from the same + * context or updating or reseeding the same context. + * + * \param ctx The HMAC_DRBG context. + * \param additional Additional data to add to the state. + * If this is \c NULL, there is no additional data + * and \p len should be \c 0. + * \param len The length of the additional data. + * This must be at most #MBEDTLS_HMAC_DRBG_MAX_INPUT + * and also at most + * #MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT - \c entropy_len + * where \c entropy_len is the entropy length + * (see mbedtls_hmac_drbg_set_entropy_len()). + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED + * if a call to the entropy function failed. + */ +int mbedtls_hmac_drbg_reseed(mbedtls_hmac_drbg_context *ctx, + const unsigned char *additional, size_t len); + +/** + * \brief This function updates an HMAC_DRBG instance with additional + * data and uses it to generate random data. + * + * This function automatically reseeds if the reseed counter is exceeded + * or prediction resistance is enabled. + * + * \note This function is not thread-safe. It is not safe + * to call this function if another thread might be + * concurrently obtaining random numbers from the same + * context or updating or reseeding the same context. + * + * \param p_rng The HMAC_DRBG context. This must be a pointer to a + * #mbedtls_hmac_drbg_context structure. + * \param output The buffer to fill. + * \param output_len The length of the buffer in bytes. + * This must be at most #MBEDTLS_HMAC_DRBG_MAX_REQUEST. + * \param additional Additional data to update with. + * If this is \c NULL, there is no additional data + * and \p add_len should be \c 0. + * \param add_len The length of the additional data. + * This must be at most #MBEDTLS_HMAC_DRBG_MAX_INPUT. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED + * if a call to the entropy source failed. + * \return #MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG if + * \p output_len > #MBEDTLS_HMAC_DRBG_MAX_REQUEST. + * \return #MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG if + * \p add_len > #MBEDTLS_HMAC_DRBG_MAX_INPUT. + */ +int mbedtls_hmac_drbg_random_with_add(void *p_rng, + unsigned char *output, size_t output_len, + const unsigned char *additional, + size_t add_len); + +/** + * \brief This function uses HMAC_DRBG to generate random data. + * + * This function automatically reseeds if the reseed counter is exceeded + * or prediction resistance is enabled. + */ +#if defined(MBEDTLS_THREADING_C) +/** + * \note When Mbed TLS is built with threading support, + * it is safe to call mbedtls_ctr_drbg_random() + * from multiple threads. Other operations, including + * reseeding, are not thread-safe. + */ +#endif /* MBEDTLS_THREADING_C */ +/** + * \param p_rng The HMAC_DRBG context. This must be a pointer to a + * #mbedtls_hmac_drbg_context structure. + * \param output The buffer to fill. + * \param out_len The length of the buffer in bytes. + * This must be at most #MBEDTLS_HMAC_DRBG_MAX_REQUEST. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED + * if a call to the entropy source failed. + * \return #MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG if + * \p out_len > #MBEDTLS_HMAC_DRBG_MAX_REQUEST. + */ +int mbedtls_hmac_drbg_random(void *p_rng, unsigned char *output, size_t out_len); + +/** + * \brief This function resets HMAC_DRBG context to the state immediately + * after initial call of mbedtls_hmac_drbg_init(). + * + * \param ctx The HMAC_DRBG context to free. + */ +void mbedtls_hmac_drbg_free(mbedtls_hmac_drbg_context *ctx); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief This function updates the state of the HMAC_DRBG context. + * + * \deprecated Superseded by mbedtls_hmac_drbg_update_ret() + * in 2.16.0. + * + * \param ctx The HMAC_DRBG context. + * \param additional The data to update the state with. + * If this is \c NULL, there is no additional data. + * \param add_len Length of \p additional in bytes. + * Unused if \p additional is \c NULL. + */ +MBEDTLS_DEPRECATED void mbedtls_hmac_drbg_update( + mbedtls_hmac_drbg_context *ctx, + const unsigned char *additional, size_t add_len); +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +#if defined(MBEDTLS_FS_IO) +/** + * \brief This function writes a seed file. + * + * \param ctx The HMAC_DRBG context. + * \param path The name of the file. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR on file error. + * \return #MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED on reseed + * failure. + */ +int mbedtls_hmac_drbg_write_seed_file(mbedtls_hmac_drbg_context *ctx, const char *path); + +/** + * \brief This function reads and updates a seed file. The seed + * is added to this instance. + * + * \param ctx The HMAC_DRBG context. + * \param path The name of the file. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR on file error. + * \return #MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED on + * reseed failure. + * \return #MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG if the existing + * seed file is too large. + */ +int mbedtls_hmac_drbg_update_seed_file(mbedtls_hmac_drbg_context *ctx, const char *path); +#endif /* MBEDTLS_FS_IO */ + + +#if defined(MBEDTLS_SELF_TEST) +/** + * \brief The HMAC_DRBG Checkup routine. + * + * \return \c 0 if successful. + * \return \c 1 if the test failed. + */ +int mbedtls_hmac_drbg_self_test(int verbose); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* hmac_drbg.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/md.h b/ext/opcua_client/mbedtls/include/mbedtls/md.h new file mode 100644 index 0000000..7b43113 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/md.h @@ -0,0 +1,481 @@ +/** + * \file md.h + * + * \brief This file contains the generic message-digest wrapper. + * + * \author Adriaan de Jong + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_MD_H +#define MBEDTLS_MD_H + +#include + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif +#include "mbedtls/platform_util.h" + +/** The selected feature is not available. */ +#define MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE -0x5080 +/** Bad input parameters to function. */ +#define MBEDTLS_ERR_MD_BAD_INPUT_DATA -0x5100 +/** Failed to allocate memory. */ +#define MBEDTLS_ERR_MD_ALLOC_FAILED -0x5180 +/** Opening or reading of file failed. */ +#define MBEDTLS_ERR_MD_FILE_IO_ERROR -0x5200 + +/* MBEDTLS_ERR_MD_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** MD hardware accelerator failed. */ +#define MBEDTLS_ERR_MD_HW_ACCEL_FAILED -0x5280 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Supported message digests. + * + * \warning MD2, MD4, MD5 and SHA-1 are considered weak message digests and + * their use constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +typedef enum { + MBEDTLS_MD_NONE=0, /**< None. */ + MBEDTLS_MD_MD2, /**< The MD2 message digest. */ + MBEDTLS_MD_MD4, /**< The MD4 message digest. */ + MBEDTLS_MD_MD5, /**< The MD5 message digest. */ + MBEDTLS_MD_SHA1, /**< The SHA-1 message digest. */ + MBEDTLS_MD_SHA224, /**< The SHA-224 message digest. */ + MBEDTLS_MD_SHA256, /**< The SHA-256 message digest. */ + MBEDTLS_MD_SHA384, /**< The SHA-384 message digest. */ + MBEDTLS_MD_SHA512, /**< The SHA-512 message digest. */ + MBEDTLS_MD_RIPEMD160, /**< The RIPEMD-160 message digest. */ +} mbedtls_md_type_t; + +#if defined(MBEDTLS_SHA512_C) +#define MBEDTLS_MD_MAX_SIZE 64 /* longest known is SHA512 */ +#else +#define MBEDTLS_MD_MAX_SIZE 32 /* longest known is SHA256 or less */ +#endif + +#if defined(MBEDTLS_SHA512_C) +#define MBEDTLS_MD_MAX_BLOCK_SIZE 128 +#else +#define MBEDTLS_MD_MAX_BLOCK_SIZE 64 +#endif + +/** + * Opaque struct defined in md_internal.h. + */ +typedef struct mbedtls_md_info_t mbedtls_md_info_t; + +/** + * The generic message-digest context. + */ +typedef struct mbedtls_md_context_t { + /** Information about the associated message digest. */ + const mbedtls_md_info_t *md_info; + + /** The digest-specific context. */ + void *md_ctx; + + /** The HMAC part of the context. */ + void *hmac_ctx; +} mbedtls_md_context_t; + +/** + * \brief This function returns the list of digests supported by the + * generic digest module. + * + * \note The list starts with the strongest available hashes. + * + * \return A statically allocated array of digests. Each element + * in the returned list is an integer belonging to the + * message-digest enumeration #mbedtls_md_type_t. + * The last entry is 0. + */ +const int *mbedtls_md_list(void); + +/** + * \brief This function returns the message-digest information + * associated with the given digest name. + * + * \param md_name The name of the digest to search for. + * + * \return The message-digest information associated with \p md_name. + * \return NULL if the associated message-digest information is not found. + */ +const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name); + +/** + * \brief This function returns the message-digest information + * associated with the given digest type. + * + * \param md_type The type of digest to search for. + * + * \return The message-digest information associated with \p md_type. + * \return NULL if the associated message-digest information is not found. + */ +const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type); + +/** + * \brief This function initializes a message-digest context without + * binding it to a particular message-digest algorithm. + * + * This function should always be called first. It prepares the + * context for mbedtls_md_setup() for binding it to a + * message-digest algorithm. + */ +void mbedtls_md_init(mbedtls_md_context_t *ctx); + +/** + * \brief This function clears the internal structure of \p ctx and + * frees any embedded internal structure, but does not free + * \p ctx itself. + * + * If you have called mbedtls_md_setup() on \p ctx, you must + * call mbedtls_md_free() when you are no longer using the + * context. + * Calling this function if you have previously + * called mbedtls_md_init() and nothing else is optional. + * You must not call this function if you have not called + * mbedtls_md_init(). + */ +void mbedtls_md_free(mbedtls_md_context_t *ctx); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief This function selects the message digest algorithm to use, + * and allocates internal structures. + * + * It should be called after mbedtls_md_init() or mbedtls_md_free(). + * Makes it necessary to call mbedtls_md_free() later. + * + * \deprecated Superseded by mbedtls_md_setup() in 2.0.0 + * + * \param ctx The context to set up. + * \param md_info The information structure of the message-digest algorithm + * to use. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification + * failure. + * \return #MBEDTLS_ERR_MD_ALLOC_FAILED on memory-allocation failure. + */ +int mbedtls_md_init_ctx(mbedtls_md_context_t *ctx, + const mbedtls_md_info_t *md_info) MBEDTLS_DEPRECATED; +#undef MBEDTLS_DEPRECATED +#endif /* MBEDTLS_DEPRECATED_REMOVED */ + +/** + * \brief This function selects the message digest algorithm to use, + * and allocates internal structures. + * + * It should be called after mbedtls_md_init() or + * mbedtls_md_free(). Makes it necessary to call + * mbedtls_md_free() later. + * + * \param ctx The context to set up. + * \param md_info The information structure of the message-digest algorithm + * to use. + * \param hmac Defines if HMAC is used. 0: HMAC is not used (saves some memory), + * or non-zero: HMAC is used with this context. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification + * failure. + * \return #MBEDTLS_ERR_MD_ALLOC_FAILED on memory-allocation failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac); + +/** + * \brief This function clones the state of a message-digest + * context. + * + * \note You must call mbedtls_md_setup() on \c dst before calling + * this function. + * + * \note The two contexts must have the same type, + * for example, both are SHA-256. + * + * \warning This function clones the message-digest state, not the + * HMAC state. + * + * \param dst The destination context. + * \param src The context to be cloned. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_md_clone(mbedtls_md_context_t *dst, + const mbedtls_md_context_t *src); + +/** + * \brief This function extracts the message-digest size from the + * message-digest information structure. + * + * \param md_info The information structure of the message-digest algorithm + * to use. + * + * \return The size of the message-digest output in Bytes. + */ +unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info); + +/** + * \brief This function extracts the message-digest type from the + * message-digest information structure. + * + * \param md_info The information structure of the message-digest algorithm + * to use. + * + * \return The type of the message digest. + */ +mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info); + +/** + * \brief This function extracts the message-digest name from the + * message-digest information structure. + * + * \param md_info The information structure of the message-digest algorithm + * to use. + * + * \return The name of the message digest. + */ +const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info); + +/** + * \brief This function starts a message-digest computation. + * + * You must call this function after setting up the context + * with mbedtls_md_setup(), and before passing data with + * mbedtls_md_update(). + * + * \param ctx The generic message-digest context. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification + * failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_md_starts(mbedtls_md_context_t *ctx); + +/** + * \brief This function feeds an input buffer into an ongoing + * message-digest computation. + * + * You must call mbedtls_md_starts() before calling this + * function. You may call this function multiple times. + * Afterwards, call mbedtls_md_finish(). + * + * \param ctx The generic message-digest context. + * \param input The buffer holding the input data. + * \param ilen The length of the input data. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification + * failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen); + +/** + * \brief This function finishes the digest operation, + * and writes the result to the output buffer. + * + * Call this function after a call to mbedtls_md_starts(), + * followed by any number of calls to mbedtls_md_update(). + * Afterwards, you may either clear the context with + * mbedtls_md_free(), or call mbedtls_md_starts() to reuse + * the context for another digest operation with the same + * algorithm. + * + * \param ctx The generic message-digest context. + * \param output The buffer for the generic message-digest checksum result. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification + * failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output); + +/** + * \brief This function calculates the message-digest of a buffer, + * with respect to a configurable message-digest algorithm + * in a single call. + * + * The result is calculated as + * Output = message_digest(input buffer). + * + * \param md_info The information structure of the message-digest algorithm + * to use. + * \param input The buffer holding the data. + * \param ilen The length of the input data. + * \param output The generic message-digest checksum result. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification + * failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, + unsigned char *output); + +#if defined(MBEDTLS_FS_IO) +/** + * \brief This function calculates the message-digest checksum + * result of the contents of the provided file. + * + * The result is calculated as + * Output = message_digest(file contents). + * + * \param md_info The information structure of the message-digest algorithm + * to use. + * \param path The input file name. + * \param output The generic message-digest checksum result. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_FILE_IO_ERROR on an I/O error accessing + * the file pointed by \p path. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA if \p md_info was NULL. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, + unsigned char *output); +#endif /* MBEDTLS_FS_IO */ + +/** + * \brief This function sets the HMAC key and prepares to + * authenticate a new message. + * + * Call this function after mbedtls_md_setup(), to use + * the MD context for an HMAC calculation, then call + * mbedtls_md_hmac_update() to provide the input data, and + * mbedtls_md_hmac_finish() to get the HMAC value. + * + * \param ctx The message digest context containing an embedded HMAC + * context. + * \param key The HMAC secret key. + * \param keylen The length of the HMAC key in Bytes. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification + * failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, + size_t keylen); + +/** + * \brief This function feeds an input buffer into an ongoing HMAC + * computation. + * + * Call mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset() + * before calling this function. + * You may call this function multiple times to pass the + * input piecewise. + * Afterwards, call mbedtls_md_hmac_finish(). + * + * \param ctx The message digest context containing an embedded HMAC + * context. + * \param input The buffer holding the input data. + * \param ilen The length of the input data. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification + * failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, + size_t ilen); + +/** + * \brief This function finishes the HMAC operation, and writes + * the result to the output buffer. + * + * Call this function after mbedtls_md_hmac_starts() and + * mbedtls_md_hmac_update() to get the HMAC value. Afterwards + * you may either call mbedtls_md_free() to clear the context, + * or call mbedtls_md_hmac_reset() to reuse the context with + * the same HMAC key. + * + * \param ctx The message digest context containing an embedded HMAC + * context. + * \param output The generic HMAC checksum result. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification + * failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output); + +/** + * \brief This function prepares to authenticate a new message with + * the same key as the previous HMAC operation. + * + * You may call this function after mbedtls_md_hmac_finish(). + * Afterwards call mbedtls_md_hmac_update() to pass the new + * input. + * + * \param ctx The message digest context containing an embedded HMAC + * context. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification + * failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx); + +/** + * \brief This function calculates the full generic HMAC + * on the input buffer with the provided key. + * + * The function allocates the context, performs the + * calculation, and frees the context. + * + * The HMAC result is calculated as + * output = generic HMAC(hmac key, input buffer). + * + * \param md_info The information structure of the message-digest algorithm + * to use. + * \param key The HMAC secret key. + * \param keylen The length of the HMAC secret key in Bytes. + * \param input The buffer holding the input data. + * \param ilen The length of the input data. + * \param output The generic HMAC result. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification + * failure. + */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_md_hmac(const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char *output); + +/* Internal use */ +MBEDTLS_CHECK_RETURN_TYPICAL +int mbedtls_md_process(mbedtls_md_context_t *ctx, const unsigned char *data); + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_MD_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/md2.h b/ext/opcua_client/mbedtls/include/mbedtls/md2.h new file mode 100644 index 0000000..afcf3a3 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/md2.h @@ -0,0 +1,292 @@ +/** + * \file md2.h + * + * \brief MD2 message digest algorithm (hash function) + * + * \warning MD2 is considered a weak message digest and its use constitutes a + * security risk. We recommend considering stronger message digests + * instead. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + * + */ +#ifndef MBEDTLS_MD2_H +#define MBEDTLS_MD2_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include + +/* MBEDTLS_ERR_MD2_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** MD2 hardware accelerator failed */ +#define MBEDTLS_ERR_MD2_HW_ACCEL_FAILED -0x002B + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_MD2_ALT) +// Regular implementation +// + +/** + * \brief MD2 context structure + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +typedef struct mbedtls_md2_context { + unsigned char cksum[16]; /*!< checksum of the data block */ + unsigned char state[48]; /*!< intermediate digest state */ + unsigned char buffer[16]; /*!< data block being processed */ + size_t left; /*!< amount of data in buffer */ +} +mbedtls_md2_context; + +#else /* MBEDTLS_MD2_ALT */ +#include "md2_alt.h" +#endif /* MBEDTLS_MD2_ALT */ + +/** + * \brief Initialize MD2 context + * + * \param ctx MD2 context to be initialized + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +void mbedtls_md2_init(mbedtls_md2_context *ctx); + +/** + * \brief Clear MD2 context + * + * \param ctx MD2 context to be cleared + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +void mbedtls_md2_free(mbedtls_md2_context *ctx); + +/** + * \brief Clone (the state of) an MD2 context + * + * \param dst The destination context + * \param src The context to be cloned + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +void mbedtls_md2_clone(mbedtls_md2_context *dst, + const mbedtls_md2_context *src); + +/** + * \brief MD2 context setup + * + * \param ctx context to be initialized + * + * \return 0 if successful + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md2_starts_ret(mbedtls_md2_context *ctx); + +/** + * \brief MD2 process buffer + * + * \param ctx MD2 context + * \param input buffer holding the data + * \param ilen length of the input data + * + * \return 0 if successful + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md2_update_ret(mbedtls_md2_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief MD2 final digest + * + * \param ctx MD2 context + * \param output MD2 checksum result + * + * \return 0 if successful + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md2_finish_ret(mbedtls_md2_context *ctx, + unsigned char output[16]); + +/** + * \brief MD2 process data block (internal use only) + * + * \param ctx MD2 context + * + * \return 0 if successful + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_internal_md2_process(mbedtls_md2_context *ctx); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief MD2 context setup + * + * \deprecated Superseded by mbedtls_md2_starts_ret() in 2.7.0 + * + * \param ctx context to be initialized + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md2_starts(mbedtls_md2_context *ctx); + +/** + * \brief MD2 process buffer + * + * \deprecated Superseded by mbedtls_md2_update_ret() in 2.7.0 + * + * \param ctx MD2 context + * \param input buffer holding the data + * \param ilen length of the input data + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md2_update(mbedtls_md2_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief MD2 final digest + * + * \deprecated Superseded by mbedtls_md2_finish_ret() in 2.7.0 + * + * \param ctx MD2 context + * \param output MD2 checksum result + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md2_finish(mbedtls_md2_context *ctx, + unsigned char output[16]); + +/** + * \brief MD2 process data block (internal use only) + * + * \deprecated Superseded by mbedtls_internal_md2_process() in 2.7.0 + * + * \param ctx MD2 context + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md2_process(mbedtls_md2_context *ctx); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +/** + * \brief Output = MD2( input buffer ) + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output MD2 checksum result + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md2_ret(const unsigned char *input, + size_t ilen, + unsigned char output[16]); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief Output = MD2( input buffer ) + * + * \deprecated Superseded by mbedtls_md2_ret() in 2.7.0 + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output MD2 checksum result + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md2(const unsigned char *input, + size_t ilen, + unsigned char output[16]); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + * + * \warning MD2 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md2_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* mbedtls_md2.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/md4.h b/ext/opcua_client/mbedtls/include/mbedtls/md4.h new file mode 100644 index 0000000..b827ffe --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/md4.h @@ -0,0 +1,297 @@ +/** + * \file md4.h + * + * \brief MD4 message digest algorithm (hash function) + * + * \warning MD4 is considered a weak message digest and its use constitutes a + * security risk. We recommend considering stronger message digests + * instead. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + * + */ +#ifndef MBEDTLS_MD4_H +#define MBEDTLS_MD4_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +/* MBEDTLS_ERR_MD4_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** MD4 hardware accelerator failed */ +#define MBEDTLS_ERR_MD4_HW_ACCEL_FAILED -0x002D + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_MD4_ALT) +// Regular implementation +// + +/** + * \brief MD4 context structure + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +typedef struct mbedtls_md4_context { + uint32_t total[2]; /*!< number of bytes processed */ + uint32_t state[4]; /*!< intermediate digest state */ + unsigned char buffer[64]; /*!< data block being processed */ +} +mbedtls_md4_context; + +#else /* MBEDTLS_MD4_ALT */ +#include "md4_alt.h" +#endif /* MBEDTLS_MD4_ALT */ + +/** + * \brief Initialize MD4 context + * + * \param ctx MD4 context to be initialized + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +void mbedtls_md4_init(mbedtls_md4_context *ctx); + +/** + * \brief Clear MD4 context + * + * \param ctx MD4 context to be cleared + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +void mbedtls_md4_free(mbedtls_md4_context *ctx); + +/** + * \brief Clone (the state of) an MD4 context + * + * \param dst The destination context + * \param src The context to be cloned + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +void mbedtls_md4_clone(mbedtls_md4_context *dst, + const mbedtls_md4_context *src); + +/** + * \brief MD4 context setup + * + * \param ctx context to be initialized + * + * \return 0 if successful + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + */ +int mbedtls_md4_starts_ret(mbedtls_md4_context *ctx); + +/** + * \brief MD4 process buffer + * + * \param ctx MD4 context + * \param input buffer holding the data + * \param ilen length of the input data + * + * \return 0 if successful + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md4_update_ret(mbedtls_md4_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief MD4 final digest + * + * \param ctx MD4 context + * \param output MD4 checksum result + * + * \return 0 if successful + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md4_finish_ret(mbedtls_md4_context *ctx, + unsigned char output[16]); + +/** + * \brief MD4 process data block (internal use only) + * + * \param ctx MD4 context + * \param data buffer holding one block of data + * + * \return 0 if successful + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_internal_md4_process(mbedtls_md4_context *ctx, + const unsigned char data[64]); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief MD4 context setup + * + * \deprecated Superseded by mbedtls_md4_starts_ret() in 2.7.0 + * + * \param ctx context to be initialized + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md4_starts(mbedtls_md4_context *ctx); + +/** + * \brief MD4 process buffer + * + * \deprecated Superseded by mbedtls_md4_update_ret() in 2.7.0 + * + * \param ctx MD4 context + * \param input buffer holding the data + * \param ilen length of the input data + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md4_update(mbedtls_md4_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief MD4 final digest + * + * \deprecated Superseded by mbedtls_md4_finish_ret() in 2.7.0 + * + * \param ctx MD4 context + * \param output MD4 checksum result + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md4_finish(mbedtls_md4_context *ctx, + unsigned char output[16]); + +/** + * \brief MD4 process data block (internal use only) + * + * \deprecated Superseded by mbedtls_internal_md4_process() in 2.7.0 + * + * \param ctx MD4 context + * \param data buffer holding one block of data + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md4_process(mbedtls_md4_context *ctx, + const unsigned char data[64]); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +/** + * \brief Output = MD4( input buffer ) + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output MD4 checksum result + * + * \return 0 if successful + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md4_ret(const unsigned char *input, + size_t ilen, + unsigned char output[16]); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief Output = MD4( input buffer ) + * + * \deprecated Superseded by mbedtls_md4_ret() in 2.7.0 + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output MD4 checksum result + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md4(const unsigned char *input, + size_t ilen, + unsigned char output[16]); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + * + * \warning MD4 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md4_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* mbedtls_md4.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/md5.h b/ext/opcua_client/mbedtls/include/mbedtls/md5.h new file mode 100644 index 0000000..fdc530a --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/md5.h @@ -0,0 +1,297 @@ +/** + * \file md5.h + * + * \brief MD5 message digest algorithm (hash function) + * + * \warning MD5 is considered a weak message digest and its use constitutes a + * security risk. We recommend considering stronger message + * digests instead. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_MD5_H +#define MBEDTLS_MD5_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +/* MBEDTLS_ERR_MD5_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** MD5 hardware accelerator failed */ +#define MBEDTLS_ERR_MD5_HW_ACCEL_FAILED -0x002F + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_MD5_ALT) +// Regular implementation +// + +/** + * \brief MD5 context structure + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +typedef struct mbedtls_md5_context { + uint32_t total[2]; /*!< number of bytes processed */ + uint32_t state[4]; /*!< intermediate digest state */ + unsigned char buffer[64]; /*!< data block being processed */ +} +mbedtls_md5_context; + +#else /* MBEDTLS_MD5_ALT */ +#include "md5_alt.h" +#endif /* MBEDTLS_MD5_ALT */ + +/** + * \brief Initialize MD5 context + * + * \param ctx MD5 context to be initialized + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +void mbedtls_md5_init(mbedtls_md5_context *ctx); + +/** + * \brief Clear MD5 context + * + * \param ctx MD5 context to be cleared + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +void mbedtls_md5_free(mbedtls_md5_context *ctx); + +/** + * \brief Clone (the state of) an MD5 context + * + * \param dst The destination context + * \param src The context to be cloned + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +void mbedtls_md5_clone(mbedtls_md5_context *dst, + const mbedtls_md5_context *src); + +/** + * \brief MD5 context setup + * + * \param ctx context to be initialized + * + * \return 0 if successful + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md5_starts_ret(mbedtls_md5_context *ctx); + +/** + * \brief MD5 process buffer + * + * \param ctx MD5 context + * \param input buffer holding the data + * \param ilen length of the input data + * + * \return 0 if successful + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md5_update_ret(mbedtls_md5_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief MD5 final digest + * + * \param ctx MD5 context + * \param output MD5 checksum result + * + * \return 0 if successful + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md5_finish_ret(mbedtls_md5_context *ctx, + unsigned char output[16]); + +/** + * \brief MD5 process data block (internal use only) + * + * \param ctx MD5 context + * \param data buffer holding one block of data + * + * \return 0 if successful + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_internal_md5_process(mbedtls_md5_context *ctx, + const unsigned char data[64]); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief MD5 context setup + * + * \deprecated Superseded by mbedtls_md5_starts_ret() in 2.7.0 + * + * \param ctx context to be initialized + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md5_starts(mbedtls_md5_context *ctx); + +/** + * \brief MD5 process buffer + * + * \deprecated Superseded by mbedtls_md5_update_ret() in 2.7.0 + * + * \param ctx MD5 context + * \param input buffer holding the data + * \param ilen length of the input data + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md5_update(mbedtls_md5_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief MD5 final digest + * + * \deprecated Superseded by mbedtls_md5_finish_ret() in 2.7.0 + * + * \param ctx MD5 context + * \param output MD5 checksum result + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md5_finish(mbedtls_md5_context *ctx, + unsigned char output[16]); + +/** + * \brief MD5 process data block (internal use only) + * + * \deprecated Superseded by mbedtls_internal_md5_process() in 2.7.0 + * + * \param ctx MD5 context + * \param data buffer holding one block of data + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md5_process(mbedtls_md5_context *ctx, + const unsigned char data[64]); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +/** + * \brief Output = MD5( input buffer ) + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output MD5 checksum result + * + * \return 0 if successful + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md5_ret(const unsigned char *input, + size_t ilen, + unsigned char output[16]); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief Output = MD5( input buffer ) + * + * \deprecated Superseded by mbedtls_md5_ret() in 2.7.0 + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output MD5 checksum result + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +MBEDTLS_DEPRECATED void mbedtls_md5(const unsigned char *input, + size_t ilen, + unsigned char output[16]); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + * + * \warning MD5 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +int mbedtls_md5_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* mbedtls_md5.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/md_internal.h b/ext/opcua_client/mbedtls/include/mbedtls/md_internal.h new file mode 100644 index 0000000..239fdd9 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/md_internal.h @@ -0,0 +1,77 @@ +/** + * \file md_internal.h + * + * \brief Message digest wrappers. + * + * \warning This in an internal header. Do not include directly. + * + * \author Adriaan de Jong + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_MD_WRAP_H +#define MBEDTLS_MD_WRAP_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/md.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Message digest information. + * Allows message digest functions to be called in a generic way. + */ +struct mbedtls_md_info_t { + /** Name of the message digest */ + const char *name; + + /** Digest identifier */ + mbedtls_md_type_t type; + + /** Output length of the digest function in bytes */ + unsigned char size; + + /** Block length of the digest function in bytes */ + unsigned char block_size; +}; + +#if defined(MBEDTLS_MD2_C) +extern const mbedtls_md_info_t mbedtls_md2_info; +#endif +#if defined(MBEDTLS_MD4_C) +extern const mbedtls_md_info_t mbedtls_md4_info; +#endif +#if defined(MBEDTLS_MD5_C) +extern const mbedtls_md_info_t mbedtls_md5_info; +#endif +#if defined(MBEDTLS_RIPEMD160_C) +extern const mbedtls_md_info_t mbedtls_ripemd160_info; +#endif +#if defined(MBEDTLS_SHA1_C) +extern const mbedtls_md_info_t mbedtls_sha1_info; +#endif +#if defined(MBEDTLS_SHA256_C) +extern const mbedtls_md_info_t mbedtls_sha224_info; +extern const mbedtls_md_info_t mbedtls_sha256_info; +#endif +#if defined(MBEDTLS_SHA512_C) +#if !defined(MBEDTLS_SHA512_NO_SHA384) +extern const mbedtls_md_info_t mbedtls_sha384_info; +#endif +extern const mbedtls_md_info_t mbedtls_sha512_info; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_MD_WRAP_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/memory_buffer_alloc.h b/ext/opcua_client/mbedtls/include/mbedtls/memory_buffer_alloc.h new file mode 100644 index 0000000..34013b9 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/memory_buffer_alloc.h @@ -0,0 +1,138 @@ +/** + * \file memory_buffer_alloc.h + * + * \brief Buffer-based memory allocator + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_MEMORY_BUFFER_ALLOC_H +#define MBEDTLS_MEMORY_BUFFER_ALLOC_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include + +/** + * \name SECTION: Module settings + * + * The configuration options you can set for this module are in this section. + * Either change them in config.h or define them on the compiler command line. + * \{ + */ + +#if !defined(MBEDTLS_MEMORY_ALIGN_MULTIPLE) +#define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ +#endif + +/** \} name SECTION: Module settings */ + +#define MBEDTLS_MEMORY_VERIFY_NONE 0 +#define MBEDTLS_MEMORY_VERIFY_ALLOC (1 << 0) +#define MBEDTLS_MEMORY_VERIFY_FREE (1 << 1) +#define MBEDTLS_MEMORY_VERIFY_ALWAYS (MBEDTLS_MEMORY_VERIFY_ALLOC | \ + MBEDTLS_MEMORY_VERIFY_FREE) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Initialize use of stack-based memory allocator. + * The stack-based allocator does memory management inside the + * presented buffer and does not call calloc() and free(). + * It sets the global mbedtls_calloc() and mbedtls_free() pointers + * to its own functions. + * (Provided mbedtls_calloc() and mbedtls_free() are thread-safe if + * MBEDTLS_THREADING_C is defined) + * + * \note This code is not optimized and provides a straight-forward + * implementation of a stack-based memory allocator. + * + * \param buf buffer to use as heap + * \param len size of the buffer + */ +void mbedtls_memory_buffer_alloc_init(unsigned char *buf, size_t len); + +/** + * \brief Free the mutex for thread-safety and clear remaining memory + */ +void mbedtls_memory_buffer_alloc_free(void); + +/** + * \brief Determine when the allocator should automatically verify the state + * of the entire chain of headers / meta-data. + * (Default: MBEDTLS_MEMORY_VERIFY_NONE) + * + * \param verify One of MBEDTLS_MEMORY_VERIFY_NONE, MBEDTLS_MEMORY_VERIFY_ALLOC, + * MBEDTLS_MEMORY_VERIFY_FREE or MBEDTLS_MEMORY_VERIFY_ALWAYS + */ +void mbedtls_memory_buffer_set_verify(int verify); + +#if defined(MBEDTLS_MEMORY_DEBUG) +/** + * \brief Print out the status of the allocated memory (primarily for use + * after a program should have de-allocated all memory) + * Prints out a list of 'still allocated' blocks and their stack + * trace if MBEDTLS_MEMORY_BACKTRACE is defined. + */ +void mbedtls_memory_buffer_alloc_status(void); + +/** + * \brief Get the peak heap usage so far + * + * \param max_used Peak number of bytes in use or committed. This + * includes bytes in allocated blocks too small to split + * into smaller blocks but larger than the requested size. + * \param max_blocks Peak number of blocks in use, including free and used + */ +void mbedtls_memory_buffer_alloc_max_get(size_t *max_used, size_t *max_blocks); + +/** + * \brief Reset peak statistics + */ +void mbedtls_memory_buffer_alloc_max_reset(void); + +/** + * \brief Get the current heap usage + * + * \param cur_used Current number of bytes in use or committed. This + * includes bytes in allocated blocks too small to split + * into smaller blocks but larger than the requested size. + * \param cur_blocks Current number of blocks in use, including free and used + */ +void mbedtls_memory_buffer_alloc_cur_get(size_t *cur_used, size_t *cur_blocks); +#endif /* MBEDTLS_MEMORY_DEBUG */ + +/** + * \brief Verifies that all headers in the memory buffer are correct + * and contain sane values. Helps debug buffer-overflow errors. + * + * Prints out first failure if MBEDTLS_MEMORY_DEBUG is defined. + * Prints out full header information if MBEDTLS_MEMORY_DEBUG + * is defined. (Includes stack trace information for each block if + * MBEDTLS_MEMORY_BACKTRACE is defined as well). + * + * \return 0 if verified, 1 otherwise + */ +int mbedtls_memory_buffer_alloc_verify(void); + +#if defined(MBEDTLS_SELF_TEST) +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if a test failed + */ +int mbedtls_memory_buffer_alloc_self_test(int verbose); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* memory_buffer_alloc.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/net.h b/ext/opcua_client/mbedtls/include/mbedtls/net.h new file mode 100644 index 0000000..805ce33 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/net.h @@ -0,0 +1,23 @@ +/** + * \file net.h + * + * \brief Deprecated header file that includes net_sockets.h + * + * \deprecated Superseded by mbedtls/net_sockets.h + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#include "mbedtls/net_sockets.h" +#if defined(MBEDTLS_DEPRECATED_WARNING) +#warning "Deprecated header file: Superseded by mbedtls/net_sockets.h" +#endif /* MBEDTLS_DEPRECATED_WARNING */ +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/net_sockets.h b/ext/opcua_client/mbedtls/include/mbedtls/net_sockets.h new file mode 100644 index 0000000..5f5202f --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/net_sockets.h @@ -0,0 +1,296 @@ +/** + * \file net_sockets.h + * + * \brief Network sockets abstraction layer to integrate Mbed TLS into a + * BSD-style sockets API. + * + * The network sockets module provides an example integration of the + * Mbed TLS library into a BSD sockets implementation. The module is + * intended to be an example of how Mbed TLS can be integrated into a + * networking stack, as well as to be Mbed TLS's network integration + * for its supported platforms. + * + * The module is intended only to be used with the Mbed TLS library and + * is not intended to be used by third party application software + * directly. + * + * The supported platforms are as follows: + * * Microsoft Windows and Windows CE + * * POSIX/Unix platforms including Linux, OS X + * + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_NET_SOCKETS_H +#define MBEDTLS_NET_SOCKETS_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/ssl.h" + +#include +#include + +/** Failed to open a socket. */ +#define MBEDTLS_ERR_NET_SOCKET_FAILED -0x0042 +/** The connection to the given server / port failed. */ +#define MBEDTLS_ERR_NET_CONNECT_FAILED -0x0044 +/** Binding of the socket failed. */ +#define MBEDTLS_ERR_NET_BIND_FAILED -0x0046 +/** Could not listen on the socket. */ +#define MBEDTLS_ERR_NET_LISTEN_FAILED -0x0048 +/** Could not accept the incoming connection. */ +#define MBEDTLS_ERR_NET_ACCEPT_FAILED -0x004A +/** Reading information from the socket failed. */ +#define MBEDTLS_ERR_NET_RECV_FAILED -0x004C +/** Sending information through the socket failed. */ +#define MBEDTLS_ERR_NET_SEND_FAILED -0x004E +/** Connection was reset by peer. */ +#define MBEDTLS_ERR_NET_CONN_RESET -0x0050 +/** Failed to get an IP address for the given hostname. */ +#define MBEDTLS_ERR_NET_UNKNOWN_HOST -0x0052 +/** Buffer is too small to hold the data. */ +#define MBEDTLS_ERR_NET_BUFFER_TOO_SMALL -0x0043 +/** The context is invalid, eg because it was free()ed. */ +#define MBEDTLS_ERR_NET_INVALID_CONTEXT -0x0045 +/** Polling the net context failed. */ +#define MBEDTLS_ERR_NET_POLL_FAILED -0x0047 +/** Input invalid. */ +#define MBEDTLS_ERR_NET_BAD_INPUT_DATA -0x0049 + +#define MBEDTLS_NET_LISTEN_BACKLOG 10 /**< The backlog that listen() should use. */ + +#define MBEDTLS_NET_PROTO_TCP 0 /**< The TCP transport protocol */ +#define MBEDTLS_NET_PROTO_UDP 1 /**< The UDP transport protocol */ + +#define MBEDTLS_NET_POLL_READ 1 /**< Used in \c mbedtls_net_poll to check for pending data */ +#define MBEDTLS_NET_POLL_WRITE 2 /**< Used in \c mbedtls_net_poll to check if write possible */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Wrapper type for sockets. + * + * Currently backed by just a file descriptor, but might be more in the future + * (eg two file descriptors for combined IPv4 + IPv6 support, or additional + * structures for hand-made UDP demultiplexing). + */ +typedef struct mbedtls_net_context { + int fd; /**< The underlying file descriptor */ +} +mbedtls_net_context; + +/** + * \brief Initialize a context + * Just makes the context ready to be used or freed safely. + * + * \param ctx Context to initialize + */ +void mbedtls_net_init(mbedtls_net_context *ctx); + +/** + * \brief Initiate a connection with host:port in the given protocol + * + * \param ctx Socket to use + * \param host Host to connect to + * \param port Port to connect to + * \param proto Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP + * + * \return 0 if successful, or one of: + * MBEDTLS_ERR_NET_SOCKET_FAILED, + * MBEDTLS_ERR_NET_UNKNOWN_HOST, + * MBEDTLS_ERR_NET_CONNECT_FAILED + * + * \note Sets the socket in connected mode even with UDP. + */ +int mbedtls_net_connect(mbedtls_net_context *ctx, const char *host, const char *port, int proto); + +/** + * \brief Create a receiving socket on bind_ip:port in the chosen + * protocol. If bind_ip == NULL, all interfaces are bound. + * + * \param ctx Socket to use + * \param bind_ip IP to bind to, can be NULL + * \param port Port number to use + * \param proto Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP + * + * \return 0 if successful, or one of: + * MBEDTLS_ERR_NET_SOCKET_FAILED, + * MBEDTLS_ERR_NET_UNKNOWN_HOST, + * MBEDTLS_ERR_NET_BIND_FAILED, + * MBEDTLS_ERR_NET_LISTEN_FAILED + * + * \note Regardless of the protocol, opens the sockets and binds it. + * In addition, make the socket listening if protocol is TCP. + */ +int mbedtls_net_bind(mbedtls_net_context *ctx, const char *bind_ip, const char *port, int proto); + +/** + * \brief Accept a connection from a remote client + * + * \param bind_ctx Relevant socket + * \param client_ctx Will contain the connected client socket + * \param client_ip Will contain the client IP address, can be NULL + * \param buf_size Size of the client_ip buffer + * \param cip_len Will receive the size of the client IP written, + * can be NULL if client_ip is null + * + * \return 0 if successful, or + * MBEDTLS_ERR_NET_SOCKET_FAILED, + * MBEDTLS_ERR_NET_BIND_FAILED, + * MBEDTLS_ERR_NET_ACCEPT_FAILED, or + * MBEDTLS_ERR_NET_BUFFER_TOO_SMALL if buf_size is too small, + * MBEDTLS_ERR_SSL_WANT_READ if bind_fd was set to + * non-blocking and accept() would block. + */ +int mbedtls_net_accept(mbedtls_net_context *bind_ctx, + mbedtls_net_context *client_ctx, + void *client_ip, size_t buf_size, size_t *cip_len); + +/** + * \brief Check and wait for the context to be ready for read/write + * + * \note The current implementation of this function uses + * select() and returns an error if the file descriptor + * is \c FD_SETSIZE or greater. + * + * \param ctx Socket to check + * \param rw Bitflag composed of MBEDTLS_NET_POLL_READ and + * MBEDTLS_NET_POLL_WRITE specifying the events + * to wait for: + * - If MBEDTLS_NET_POLL_READ is set, the function + * will return as soon as the net context is available + * for reading. + * - If MBEDTLS_NET_POLL_WRITE is set, the function + * will return as soon as the net context is available + * for writing. + * \param timeout Maximal amount of time to wait before returning, + * in milliseconds. If \c timeout is zero, the + * function returns immediately. If \c timeout is + * -1u, the function blocks potentially indefinitely. + * + * \return Bitmask composed of MBEDTLS_NET_POLL_READ/WRITE + * on success or timeout, or a negative return code otherwise. + */ +int mbedtls_net_poll(mbedtls_net_context *ctx, uint32_t rw, uint32_t timeout); + +/** + * \brief Set the socket blocking + * + * \param ctx Socket to set + * + * \return 0 if successful, or a non-zero error code + */ +int mbedtls_net_set_block(mbedtls_net_context *ctx); + +/** + * \brief Set the socket non-blocking + * + * \param ctx Socket to set + * + * \return 0 if successful, or a non-zero error code + */ +int mbedtls_net_set_nonblock(mbedtls_net_context *ctx); + +/** + * \brief Portable usleep helper + * + * \param usec Amount of microseconds to sleep + * + * \note Real amount of time slept will not be less than + * select()'s timeout granularity (typically, 10ms). + */ +void mbedtls_net_usleep(unsigned long usec); + +/** + * \brief Read at most 'len' characters. If no error occurs, + * the actual amount read is returned. + * + * \param ctx Socket + * \param buf The buffer to write to + * \param len Maximum length of the buffer + * + * \return the number of bytes received, + * or a non-zero error code; with a non-blocking socket, + * MBEDTLS_ERR_SSL_WANT_READ indicates read() would block. + */ +int mbedtls_net_recv(void *ctx, unsigned char *buf, size_t len); + +/** + * \brief Write at most 'len' characters. If no error occurs, + * the actual amount written is returned. + * + * \param ctx Socket + * \param buf The buffer to read from + * \param len The length of the buffer + * + * \return the number of bytes sent, + * or a non-zero error code; with a non-blocking socket, + * MBEDTLS_ERR_SSL_WANT_WRITE indicates write() would block. + */ +int mbedtls_net_send(void *ctx, const unsigned char *buf, size_t len); + +/** + * \brief Read at most 'len' characters, blocking for at most + * 'timeout' seconds. If no error occurs, the actual amount + * read is returned. + * + * \note The current implementation of this function uses + * select() and returns an error if the file descriptor + * is \c FD_SETSIZE or greater. + * + * \param ctx Socket + * \param buf The buffer to write to + * \param len Maximum length of the buffer + * \param timeout Maximum number of milliseconds to wait for data + * 0 means no timeout (wait forever) + * + * \return The number of bytes received if successful. + * MBEDTLS_ERR_SSL_TIMEOUT if the operation timed out. + * MBEDTLS_ERR_SSL_WANT_READ if interrupted by a signal. + * Another negative error code (MBEDTLS_ERR_NET_xxx) + * for other failures. + * + * \note This function will block (until data becomes available or + * timeout is reached) even if the socket is set to + * non-blocking. Handling timeouts with non-blocking reads + * requires a different strategy. + */ +int mbedtls_net_recv_timeout(void *ctx, unsigned char *buf, size_t len, + uint32_t timeout); + +/** + * \brief Closes down the connection and free associated data + * + * \param ctx The context to close + * + * \note This function frees and clears data associated with the + * context but does not free the memory pointed to by \p ctx. + * This memory is the responsibility of the caller. + */ +void mbedtls_net_close(mbedtls_net_context *ctx); + +/** + * \brief Gracefully shutdown the connection and free associated data + * + * \param ctx The context to free + * + * \note This function frees and clears data associated with the + * context but does not free the memory pointed to by \p ctx. + * This memory is the responsibility of the caller. + */ +void mbedtls_net_free(mbedtls_net_context *ctx); + +#ifdef __cplusplus +} +#endif + +#endif /* net_sockets.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/nist_kw.h b/ext/opcua_client/mbedtls/include/mbedtls/nist_kw.h new file mode 100644 index 0000000..a2479b0 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/nist_kw.h @@ -0,0 +1,169 @@ +/** + * \file nist_kw.h + * + * \brief This file provides an API for key wrapping (KW) and key wrapping with + * padding (KWP) as defined in NIST SP 800-38F. + * https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38F.pdf + * + * Key wrapping specifies a deterministic authenticated-encryption mode + * of operation, according to NIST SP 800-38F: Recommendation for + * Block Cipher Modes of Operation: Methods for Key Wrapping. Its + * purpose is to protect cryptographic keys. + * + * Its equivalent is RFC 3394 for KW, and RFC 5649 for KWP. + * https://tools.ietf.org/html/rfc3394 + * https://tools.ietf.org/html/rfc5649 + * + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_NIST_KW_H +#define MBEDTLS_NIST_KW_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/cipher.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + MBEDTLS_KW_MODE_KW = 0, + MBEDTLS_KW_MODE_KWP = 1 +} mbedtls_nist_kw_mode_t; + +#if !defined(MBEDTLS_NIST_KW_ALT) +// Regular implementation +// + +/** + * \brief The key wrapping context-type definition. The key wrapping context is passed + * to the APIs called. + * + * \note The definition of this type may change in future library versions. + * Don't make any assumptions on this context! + */ +typedef struct { + mbedtls_cipher_context_t cipher_ctx; /*!< The cipher context used. */ +} mbedtls_nist_kw_context; + +#else /* MBEDTLS_NIST_key wrapping_ALT */ +#include "nist_kw_alt.h" +#endif /* MBEDTLS_NIST_KW_ALT */ + +/** + * \brief This function initializes the specified key wrapping context + * to make references valid and prepare the context + * for mbedtls_nist_kw_setkey() or mbedtls_nist_kw_free(). + * + * \param ctx The key wrapping context to initialize. + * + */ +void mbedtls_nist_kw_init(mbedtls_nist_kw_context *ctx); + +/** + * \brief This function initializes the key wrapping context set in the + * \p ctx parameter and sets the encryption key. + * + * \param ctx The key wrapping context. + * \param cipher The 128-bit block cipher to use. Only AES is supported. + * \param key The Key Encryption Key (KEK). + * \param keybits The KEK size in bits. This must be acceptable by the cipher. + * \param is_wrap Specify whether the operation within the context is wrapping or unwrapping + * + * \return \c 0 on success. + * \return \c MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA for any invalid input. + * \return \c MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE for 128-bit block ciphers + * which are not supported. + * \return cipher-specific error code on failure of the underlying cipher. + */ +int mbedtls_nist_kw_setkey(mbedtls_nist_kw_context *ctx, + mbedtls_cipher_id_t cipher, + const unsigned char *key, + unsigned int keybits, + const int is_wrap); + +/** + * \brief This function releases and clears the specified key wrapping context + * and underlying cipher sub-context. + * + * \param ctx The key wrapping context to clear. + */ +void mbedtls_nist_kw_free(mbedtls_nist_kw_context *ctx); + +/** + * \brief This function encrypts a buffer using key wrapping. + * + * \param ctx The key wrapping context to use for encryption. + * \param mode The key wrapping mode to use (MBEDTLS_KW_MODE_KW or MBEDTLS_KW_MODE_KWP) + * \param input The buffer holding the input data. + * \param in_len The length of the input data in Bytes. + * The input uses units of 8 Bytes called semiblocks. + *
  • For KW mode: a multiple of 8 bytes between 16 and 2^57-8 inclusive.
  • + *
  • For KWP mode: any length between 1 and 2^32-1 inclusive.
+ * \param[out] output The buffer holding the output data. + *
  • For KW mode: Must be at least 8 bytes larger than \p in_len.
  • + *
  • For KWP mode: Must be at least 8 bytes larger rounded up to a multiple of + * 8 bytes for KWP (15 bytes at most).
+ * \param[out] out_len The number of bytes written to the output buffer. \c 0 on failure. + * \param[in] out_size The capacity of the output buffer. + * + * \return \c 0 on success. + * \return \c MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA for invalid input length. + * \return cipher-specific error code on failure of the underlying cipher. + */ +int mbedtls_nist_kw_wrap(mbedtls_nist_kw_context *ctx, mbedtls_nist_kw_mode_t mode, + const unsigned char *input, size_t in_len, + unsigned char *output, size_t *out_len, size_t out_size); + +/** + * \brief This function decrypts a buffer using key wrapping. + * + * \param ctx The key wrapping context to use for decryption. + * \param mode The key wrapping mode to use (MBEDTLS_KW_MODE_KW or MBEDTLS_KW_MODE_KWP) + * \param input The buffer holding the input data. + * \param in_len The length of the input data in Bytes. + * The input uses units of 8 Bytes called semiblocks. + * The input must be a multiple of semiblocks. + *
  • For KW mode: a multiple of 8 bytes between 24 and 2^57 inclusive.
  • + *
  • For KWP mode: a multiple of 8 bytes between 16 and 2^32 inclusive.
+ * \param[out] output The buffer holding the output data. + * The output buffer's minimal length is 8 bytes shorter than \p in_len. + * \param[out] out_len The number of bytes written to the output buffer. \c 0 on failure. + * For KWP mode, the length could be up to 15 bytes shorter than \p in_len, + * depending on how much padding was added to the data. + * \param[in] out_size The capacity of the output buffer. + * + * \return \c 0 on success. + * \return \c MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA for invalid input length. + * \return \c MBEDTLS_ERR_CIPHER_AUTH_FAILED for verification failure of the ciphertext. + * \return cipher-specific error code on failure of the underlying cipher. + */ +int mbedtls_nist_kw_unwrap(mbedtls_nist_kw_context *ctx, mbedtls_nist_kw_mode_t mode, + const unsigned char *input, size_t in_len, + unsigned char *output, size_t *out_len, size_t out_size); + + +#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) +/** + * \brief The key wrapping checkup routine. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +int mbedtls_nist_kw_self_test(int verbose); +#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_NIST_KW_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/oid.h b/ext/opcua_client/mbedtls/include/mbedtls/oid.h new file mode 100644 index 0000000..8da1ce8 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/oid.h @@ -0,0 +1,642 @@ +/** + * \file oid.h + * + * \brief Object Identifier (OID) database + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_OID_H +#define MBEDTLS_OID_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/asn1.h" +#include "mbedtls/pk.h" + +#include + +#if defined(MBEDTLS_CIPHER_C) +#include "mbedtls/cipher.h" +#endif + +#if defined(MBEDTLS_MD_C) +#include "mbedtls/md.h" +#endif + +/** OID is not found. */ +#define MBEDTLS_ERR_OID_NOT_FOUND -0x002E +/** output buffer is too small */ +#define MBEDTLS_ERR_OID_BUF_TOO_SMALL -0x000B + +/* This is for the benefit of X.509, but defined here in order to avoid + * having a "backwards" include of x.509.h here */ +/* + * X.509 extension types (internal, arbitrary values for bitsets) + */ +#define MBEDTLS_OID_X509_EXT_AUTHORITY_KEY_IDENTIFIER (1 << 0) +#define MBEDTLS_OID_X509_EXT_SUBJECT_KEY_IDENTIFIER (1 << 1) +#define MBEDTLS_OID_X509_EXT_KEY_USAGE (1 << 2) +#define MBEDTLS_OID_X509_EXT_CERTIFICATE_POLICIES (1 << 3) +#define MBEDTLS_OID_X509_EXT_POLICY_MAPPINGS (1 << 4) +#define MBEDTLS_OID_X509_EXT_SUBJECT_ALT_NAME (1 << 5) +#define MBEDTLS_OID_X509_EXT_ISSUER_ALT_NAME (1 << 6) +#define MBEDTLS_OID_X509_EXT_SUBJECT_DIRECTORY_ATTRS (1 << 7) +#define MBEDTLS_OID_X509_EXT_BASIC_CONSTRAINTS (1 << 8) +#define MBEDTLS_OID_X509_EXT_NAME_CONSTRAINTS (1 << 9) +#define MBEDTLS_OID_X509_EXT_POLICY_CONSTRAINTS (1 << 10) +#define MBEDTLS_OID_X509_EXT_EXTENDED_KEY_USAGE (1 << 11) +#define MBEDTLS_OID_X509_EXT_CRL_DISTRIBUTION_POINTS (1 << 12) +#define MBEDTLS_OID_X509_EXT_INIHIBIT_ANYPOLICY (1 << 13) +#define MBEDTLS_OID_X509_EXT_FRESHEST_CRL (1 << 14) +#define MBEDTLS_OID_X509_EXT_NS_CERT_TYPE (1 << 16) + +/* + * Top level OID tuples + */ +#define MBEDTLS_OID_ISO_MEMBER_BODIES "\x2a" /* {iso(1) member-body(2)} */ +#define MBEDTLS_OID_ISO_IDENTIFIED_ORG "\x2b" /* {iso(1) identified-organization(3)} */ +#define MBEDTLS_OID_ISO_CCITT_DS "\x55" /* {joint-iso-ccitt(2) ds(5)} */ +#define MBEDTLS_OID_ISO_ITU_COUNTRY "\x60" /* {joint-iso-itu-t(2) country(16)} */ + +/* + * ISO Member bodies OID parts + */ +#define MBEDTLS_OID_COUNTRY_US "\x86\x48" /* {us(840)} */ +#define MBEDTLS_OID_ORG_RSA_DATA_SECURITY "\x86\xf7\x0d" /* {rsadsi(113549)} */ +#define MBEDTLS_OID_RSA_COMPANY MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \ + MBEDTLS_OID_ORG_RSA_DATA_SECURITY /* {iso(1) member-body(2) us(840) rsadsi(113549)} */ +#define MBEDTLS_OID_ORG_ANSI_X9_62 "\xce\x3d" /* ansi-X9-62(10045) */ +#define MBEDTLS_OID_ANSI_X9_62 MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \ + MBEDTLS_OID_ORG_ANSI_X9_62 + +/* + * ISO Identified organization OID parts + */ +#define MBEDTLS_OID_ORG_DOD "\x06" /* {dod(6)} */ +#define MBEDTLS_OID_ORG_OIW "\x0e" +#define MBEDTLS_OID_OIW_SECSIG MBEDTLS_OID_ORG_OIW "\x03" +#define MBEDTLS_OID_OIW_SECSIG_ALG MBEDTLS_OID_OIW_SECSIG "\x02" +#define MBEDTLS_OID_OIW_SECSIG_SHA1 MBEDTLS_OID_OIW_SECSIG_ALG "\x1a" +#define MBEDTLS_OID_ORG_CERTICOM "\x81\x04" /* certicom(132) */ +#define MBEDTLS_OID_CERTICOM MBEDTLS_OID_ISO_IDENTIFIED_ORG \ + MBEDTLS_OID_ORG_CERTICOM +#define MBEDTLS_OID_ORG_TELETRUST "\x24" /* teletrust(36) */ +#define MBEDTLS_OID_TELETRUST MBEDTLS_OID_ISO_IDENTIFIED_ORG \ + MBEDTLS_OID_ORG_TELETRUST + +/* + * ISO ITU OID parts + */ +#define MBEDTLS_OID_ORGANIZATION "\x01" /* {organization(1)} */ +#define MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ISO_ITU_COUNTRY MBEDTLS_OID_COUNTRY_US \ + MBEDTLS_OID_ORGANIZATION /* {joint-iso-itu-t(2) country(16) us(840) organization(1)} */ + +#define MBEDTLS_OID_ORG_GOV "\x65" /* {gov(101)} */ +#define MBEDTLS_OID_GOV MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_GOV /* {joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101)} */ + +#define MBEDTLS_OID_ORG_NETSCAPE "\x86\xF8\x42" /* {netscape(113730)} */ +#define MBEDTLS_OID_NETSCAPE MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_NETSCAPE /* Netscape OID {joint-iso-itu-t(2) country(16) us(840) organization(1) netscape(113730)} */ + +/* ISO arc for standard certificate and CRL extensions */ +#define MBEDTLS_OID_ID_CE MBEDTLS_OID_ISO_CCITT_DS "\x1D" /**< id-ce OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 29} */ + +#define MBEDTLS_OID_NIST_ALG MBEDTLS_OID_GOV "\x03\x04" /** { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistAlgorithm(4) */ + +/** + * Private Internet Extensions + * { iso(1) identified-organization(3) dod(6) internet(1) + * security(5) mechanisms(5) pkix(7) } + */ +#define MBEDTLS_OID_INTERNET MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_DOD \ + "\x01" +#define MBEDTLS_OID_PKIX MBEDTLS_OID_INTERNET "\x05\x05\x07" + +/* + * Arc for standard naming attributes + */ +#define MBEDTLS_OID_AT MBEDTLS_OID_ISO_CCITT_DS "\x04" /**< id-at OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 4} */ +#define MBEDTLS_OID_AT_CN MBEDTLS_OID_AT "\x03" /**< id-at-commonName AttributeType:= {id-at 3} */ +#define MBEDTLS_OID_AT_SUR_NAME MBEDTLS_OID_AT "\x04" /**< id-at-surName AttributeType:= {id-at 4} */ +#define MBEDTLS_OID_AT_SERIAL_NUMBER MBEDTLS_OID_AT "\x05" /**< id-at-serialNumber AttributeType:= {id-at 5} */ +#define MBEDTLS_OID_AT_COUNTRY MBEDTLS_OID_AT "\x06" /**< id-at-countryName AttributeType:= {id-at 6} */ +#define MBEDTLS_OID_AT_LOCALITY MBEDTLS_OID_AT "\x07" /**< id-at-locality AttributeType:= {id-at 7} */ +#define MBEDTLS_OID_AT_STATE MBEDTLS_OID_AT "\x08" /**< id-at-state AttributeType:= {id-at 8} */ +#define MBEDTLS_OID_AT_ORGANIZATION MBEDTLS_OID_AT "\x0A" /**< id-at-organizationName AttributeType:= {id-at 10} */ +#define MBEDTLS_OID_AT_ORG_UNIT MBEDTLS_OID_AT "\x0B" /**< id-at-organizationalUnitName AttributeType:= {id-at 11} */ +#define MBEDTLS_OID_AT_TITLE MBEDTLS_OID_AT "\x0C" /**< id-at-title AttributeType:= {id-at 12} */ +#define MBEDTLS_OID_AT_POSTAL_ADDRESS MBEDTLS_OID_AT "\x10" /**< id-at-postalAddress AttributeType:= {id-at 16} */ +#define MBEDTLS_OID_AT_POSTAL_CODE MBEDTLS_OID_AT "\x11" /**< id-at-postalCode AttributeType:= {id-at 17} */ +#define MBEDTLS_OID_AT_GIVEN_NAME MBEDTLS_OID_AT "\x2A" /**< id-at-givenName AttributeType:= {id-at 42} */ +#define MBEDTLS_OID_AT_INITIALS MBEDTLS_OID_AT "\x2B" /**< id-at-initials AttributeType:= {id-at 43} */ +#define MBEDTLS_OID_AT_GENERATION_QUALIFIER MBEDTLS_OID_AT "\x2C" /**< id-at-generationQualifier AttributeType:= {id-at 44} */ +#define MBEDTLS_OID_AT_UNIQUE_IDENTIFIER MBEDTLS_OID_AT "\x2D" /**< id-at-uniqueIdentifier AttributeType:= {id-at 45} */ +#define MBEDTLS_OID_AT_DN_QUALIFIER MBEDTLS_OID_AT "\x2E" /**< id-at-dnQualifier AttributeType:= {id-at 46} */ +#define MBEDTLS_OID_AT_PSEUDONYM MBEDTLS_OID_AT "\x41" /**< id-at-pseudonym AttributeType:= {id-at 65} */ + +#define MBEDTLS_OID_DOMAIN_COMPONENT "\x09\x92\x26\x89\x93\xF2\x2C\x64\x01\x19" /** id-domainComponent AttributeType:= {itu-t(0) data(9) pss(2342) ucl(19200300) pilot(100) pilotAttributeType(1) domainComponent(25)} */ + +/* + * OIDs for standard certificate extensions + */ +#define MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_ID_CE "\x23" /**< id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 35 } */ +#define MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_ID_CE "\x0E" /**< id-ce-subjectKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 14 } */ +#define MBEDTLS_OID_KEY_USAGE MBEDTLS_OID_ID_CE "\x0F" /**< id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 } */ +#define MBEDTLS_OID_CERTIFICATE_POLICIES MBEDTLS_OID_ID_CE "\x20" /**< id-ce-certificatePolicies OBJECT IDENTIFIER ::= { id-ce 32 } */ +#define MBEDTLS_OID_POLICY_MAPPINGS MBEDTLS_OID_ID_CE "\x21" /**< id-ce-policyMappings OBJECT IDENTIFIER ::= { id-ce 33 } */ +#define MBEDTLS_OID_SUBJECT_ALT_NAME MBEDTLS_OID_ID_CE "\x11" /**< id-ce-subjectAltName OBJECT IDENTIFIER ::= { id-ce 17 } */ +#define MBEDTLS_OID_ISSUER_ALT_NAME MBEDTLS_OID_ID_CE "\x12" /**< id-ce-issuerAltName OBJECT IDENTIFIER ::= { id-ce 18 } */ +#define MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_ID_CE "\x09" /**< id-ce-subjectDirectoryAttributes OBJECT IDENTIFIER ::= { id-ce 9 } */ +#define MBEDTLS_OID_BASIC_CONSTRAINTS MBEDTLS_OID_ID_CE "\x13" /**< id-ce-basicConstraints OBJECT IDENTIFIER ::= { id-ce 19 } */ +#define MBEDTLS_OID_NAME_CONSTRAINTS MBEDTLS_OID_ID_CE "\x1E" /**< id-ce-nameConstraints OBJECT IDENTIFIER ::= { id-ce 30 } */ +#define MBEDTLS_OID_POLICY_CONSTRAINTS MBEDTLS_OID_ID_CE "\x24" /**< id-ce-policyConstraints OBJECT IDENTIFIER ::= { id-ce 36 } */ +#define MBEDTLS_OID_EXTENDED_KEY_USAGE MBEDTLS_OID_ID_CE "\x25" /**< id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 } */ +#define MBEDTLS_OID_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_ID_CE "\x1F" /**< id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::= { id-ce 31 } */ +#define MBEDTLS_OID_INIHIBIT_ANYPOLICY MBEDTLS_OID_ID_CE "\x36" /**< id-ce-inhibitAnyPolicy OBJECT IDENTIFIER ::= { id-ce 54 } */ +#define MBEDTLS_OID_FRESHEST_CRL MBEDTLS_OID_ID_CE "\x2E" /**< id-ce-freshestCRL OBJECT IDENTIFIER ::= { id-ce 46 } */ + +/* + * Certificate policies + */ +#define MBEDTLS_OID_ANY_POLICY MBEDTLS_OID_CERTIFICATE_POLICIES "\x00" /**< anyPolicy OBJECT IDENTIFIER ::= { id-ce-certificatePolicies 0 } */ + +/* + * Netscape certificate extensions + */ +#define MBEDTLS_OID_NS_CERT MBEDTLS_OID_NETSCAPE "\x01" +#define MBEDTLS_OID_NS_CERT_TYPE MBEDTLS_OID_NS_CERT "\x01" +#define MBEDTLS_OID_NS_BASE_URL MBEDTLS_OID_NS_CERT "\x02" +#define MBEDTLS_OID_NS_REVOCATION_URL MBEDTLS_OID_NS_CERT "\x03" +#define MBEDTLS_OID_NS_CA_REVOCATION_URL MBEDTLS_OID_NS_CERT "\x04" +#define MBEDTLS_OID_NS_RENEWAL_URL MBEDTLS_OID_NS_CERT "\x07" +#define MBEDTLS_OID_NS_CA_POLICY_URL MBEDTLS_OID_NS_CERT "\x08" +#define MBEDTLS_OID_NS_SSL_SERVER_NAME MBEDTLS_OID_NS_CERT "\x0C" +#define MBEDTLS_OID_NS_COMMENT MBEDTLS_OID_NS_CERT "\x0D" +#define MBEDTLS_OID_NS_DATA_TYPE MBEDTLS_OID_NETSCAPE "\x02" +#define MBEDTLS_OID_NS_CERT_SEQUENCE MBEDTLS_OID_NS_DATA_TYPE "\x05" + +/* + * OIDs for CRL extensions + */ +#define MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD MBEDTLS_OID_ID_CE "\x10" +#define MBEDTLS_OID_CRL_NUMBER MBEDTLS_OID_ID_CE "\x14" /**< id-ce-cRLNumber OBJECT IDENTIFIER ::= { id-ce 20 } */ + +/* + * X.509 v3 Extended key usage OIDs + */ +#define MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE MBEDTLS_OID_EXTENDED_KEY_USAGE "\x00" /**< anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 } */ + +#define MBEDTLS_OID_KP MBEDTLS_OID_PKIX "\x03" /**< id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } */ +#define MBEDTLS_OID_SERVER_AUTH MBEDTLS_OID_KP "\x01" /**< id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } */ +#define MBEDTLS_OID_CLIENT_AUTH MBEDTLS_OID_KP "\x02" /**< id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } */ +#define MBEDTLS_OID_CODE_SIGNING MBEDTLS_OID_KP "\x03" /**< id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 } */ +#define MBEDTLS_OID_EMAIL_PROTECTION MBEDTLS_OID_KP "\x04" /**< id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 } */ +#define MBEDTLS_OID_TIME_STAMPING MBEDTLS_OID_KP "\x08" /**< id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 } */ +#define MBEDTLS_OID_OCSP_SIGNING MBEDTLS_OID_KP "\x09" /**< id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 } */ + +/** + * Wi-SUN Alliance Field Area Network + * { iso(1) identified-organization(3) dod(6) internet(1) + * private(4) enterprise(1) WiSUN(45605) FieldAreaNetwork(1) } + */ +#define MBEDTLS_OID_WISUN_FAN MBEDTLS_OID_INTERNET "\x04\x01\x82\xe4\x25\x01" + +#define MBEDTLS_OID_ON MBEDTLS_OID_PKIX "\x08" /**< id-on OBJECT IDENTIFIER ::= { id-pkix 8 } */ +#define MBEDTLS_OID_ON_HW_MODULE_NAME MBEDTLS_OID_ON "\x04" /**< id-on-hardwareModuleName OBJECT IDENTIFIER ::= { id-on 4 } */ + +/* + * PKCS definition OIDs + */ + +#define MBEDTLS_OID_PKCS MBEDTLS_OID_RSA_COMPANY "\x01" /**< pkcs OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) 1 } */ +#define MBEDTLS_OID_PKCS1 MBEDTLS_OID_PKCS "\x01" /**< pkcs-1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 } */ +#define MBEDTLS_OID_PKCS5 MBEDTLS_OID_PKCS "\x05" /**< pkcs-5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 5 } */ +#define MBEDTLS_OID_PKCS9 MBEDTLS_OID_PKCS "\x09" /**< pkcs-9 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 9 } */ +#define MBEDTLS_OID_PKCS12 MBEDTLS_OID_PKCS "\x0c" /**< pkcs-12 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 12 } */ + +/* + * PKCS#1 OIDs + */ +#define MBEDTLS_OID_PKCS1_RSA MBEDTLS_OID_PKCS1 "\x01" /**< rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } */ +#define MBEDTLS_OID_PKCS1_MD2 MBEDTLS_OID_PKCS1 "\x02" /**< md2WithRSAEncryption ::= { pkcs-1 2 } */ +#define MBEDTLS_OID_PKCS1_MD4 MBEDTLS_OID_PKCS1 "\x03" /**< md4WithRSAEncryption ::= { pkcs-1 3 } */ +#define MBEDTLS_OID_PKCS1_MD5 MBEDTLS_OID_PKCS1 "\x04" /**< md5WithRSAEncryption ::= { pkcs-1 4 } */ +#define MBEDTLS_OID_PKCS1_SHA1 MBEDTLS_OID_PKCS1 "\x05" /**< sha1WithRSAEncryption ::= { pkcs-1 5 } */ +#define MBEDTLS_OID_PKCS1_SHA224 MBEDTLS_OID_PKCS1 "\x0e" /**< sha224WithRSAEncryption ::= { pkcs-1 14 } */ +#define MBEDTLS_OID_PKCS1_SHA256 MBEDTLS_OID_PKCS1 "\x0b" /**< sha256WithRSAEncryption ::= { pkcs-1 11 } */ +#define MBEDTLS_OID_PKCS1_SHA384 MBEDTLS_OID_PKCS1 "\x0c" /**< sha384WithRSAEncryption ::= { pkcs-1 12 } */ +#define MBEDTLS_OID_PKCS1_SHA512 MBEDTLS_OID_PKCS1 "\x0d" /**< sha512WithRSAEncryption ::= { pkcs-1 13 } */ + +#define MBEDTLS_OID_RSA_SHA_OBS "\x2B\x0E\x03\x02\x1D" + +#define MBEDTLS_OID_PKCS9_EMAIL MBEDTLS_OID_PKCS9 "\x01" /**< emailAddress AttributeType ::= { pkcs-9 1 } */ + +/* RFC 4055 */ +#define MBEDTLS_OID_RSASSA_PSS MBEDTLS_OID_PKCS1 "\x0a" /**< id-RSASSA-PSS ::= { pkcs-1 10 } */ +#define MBEDTLS_OID_MGF1 MBEDTLS_OID_PKCS1 "\x08" /**< id-mgf1 ::= { pkcs-1 8 } */ + +/* + * Digest algorithms + */ +#define MBEDTLS_OID_DIGEST_ALG_MD2 MBEDTLS_OID_RSA_COMPANY "\x02\x02" /**< id-mbedtls_md2 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } */ +#define MBEDTLS_OID_DIGEST_ALG_MD4 MBEDTLS_OID_RSA_COMPANY "\x02\x04" /**< id-mbedtls_md4 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 4 } */ +#define MBEDTLS_OID_DIGEST_ALG_MD5 MBEDTLS_OID_RSA_COMPANY "\x02\x05" /**< id-mbedtls_md5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } */ +#define MBEDTLS_OID_DIGEST_ALG_SHA1 MBEDTLS_OID_ISO_IDENTIFIED_ORG \ + MBEDTLS_OID_OIW_SECSIG_SHA1 /**< id-mbedtls_sha1 OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 } */ +#define MBEDTLS_OID_DIGEST_ALG_SHA224 MBEDTLS_OID_NIST_ALG "\x02\x04" /**< id-sha224 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 4 } */ +#define MBEDTLS_OID_DIGEST_ALG_SHA256 MBEDTLS_OID_NIST_ALG "\x02\x01" /**< id-mbedtls_sha256 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 1 } */ + +#define MBEDTLS_OID_DIGEST_ALG_SHA384 MBEDTLS_OID_NIST_ALG "\x02\x02" /**< id-sha384 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 2 } */ + +#define MBEDTLS_OID_DIGEST_ALG_SHA512 MBEDTLS_OID_NIST_ALG "\x02\x03" /**< id-mbedtls_sha512 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 3 } */ + +#define MBEDTLS_OID_DIGEST_ALG_RIPEMD160 MBEDTLS_OID_TELETRUST "\x03\x02\x01" /**< id-ripemd160 OBJECT IDENTIFIER :: { iso(1) identified-organization(3) teletrust(36) algorithm(3) hashAlgorithm(2) ripemd160(1) } */ + +#define MBEDTLS_OID_HMAC_SHA1 MBEDTLS_OID_RSA_COMPANY "\x02\x07" /**< id-hmacWithSHA1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 7 } */ + +#define MBEDTLS_OID_HMAC_SHA224 MBEDTLS_OID_RSA_COMPANY "\x02\x08" /**< id-hmacWithSHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 8 } */ + +#define MBEDTLS_OID_HMAC_SHA256 MBEDTLS_OID_RSA_COMPANY "\x02\x09" /**< id-hmacWithSHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 9 } */ + +#define MBEDTLS_OID_HMAC_SHA384 MBEDTLS_OID_RSA_COMPANY "\x02\x0A" /**< id-hmacWithSHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 10 } */ + +#define MBEDTLS_OID_HMAC_SHA512 MBEDTLS_OID_RSA_COMPANY "\x02\x0B" /**< id-hmacWithSHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 11 } */ + +/* + * Encryption algorithms + */ +#define MBEDTLS_OID_DES_CBC MBEDTLS_OID_ISO_IDENTIFIED_ORG \ + MBEDTLS_OID_OIW_SECSIG_ALG "\x07" /**< desCBC OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 7 } */ +#define MBEDTLS_OID_DES_EDE3_CBC MBEDTLS_OID_RSA_COMPANY "\x03\x07" /**< des-ede3-cbc OBJECT IDENTIFIER ::= { iso(1) member-body(2) -- us(840) rsadsi(113549) encryptionAlgorithm(3) 7 } */ +#define MBEDTLS_OID_AES MBEDTLS_OID_NIST_ALG "\x01" /** aes OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistAlgorithm(4) 1 } */ + +/* + * Key Wrapping algorithms + */ +/* + * RFC 5649 + */ +#define MBEDTLS_OID_AES128_KW MBEDTLS_OID_AES "\x05" /** id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } */ +#define MBEDTLS_OID_AES128_KWP MBEDTLS_OID_AES "\x08" /** id-aes128-wrap-pad OBJECT IDENTIFIER ::= { aes 8 } */ +#define MBEDTLS_OID_AES192_KW MBEDTLS_OID_AES "\x19" /** id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } */ +#define MBEDTLS_OID_AES192_KWP MBEDTLS_OID_AES "\x1c" /** id-aes192-wrap-pad OBJECT IDENTIFIER ::= { aes 28 } */ +#define MBEDTLS_OID_AES256_KW MBEDTLS_OID_AES "\x2d" /** id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } */ +#define MBEDTLS_OID_AES256_KWP MBEDTLS_OID_AES "\x30" /** id-aes256-wrap-pad OBJECT IDENTIFIER ::= { aes 48 } */ +/* + * PKCS#5 OIDs + */ +#define MBEDTLS_OID_PKCS5_PBKDF2 MBEDTLS_OID_PKCS5 "\x0c" /**< id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12} */ +#define MBEDTLS_OID_PKCS5_PBES2 MBEDTLS_OID_PKCS5 "\x0d" /**< id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13} */ +#define MBEDTLS_OID_PKCS5_PBMAC1 MBEDTLS_OID_PKCS5 "\x0e" /**< id-PBMAC1 OBJECT IDENTIFIER ::= {pkcs-5 14} */ + +/* + * PKCS#5 PBES1 algorithms + */ +#define MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC MBEDTLS_OID_PKCS5 "\x01" /**< pbeWithMD2AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 1} */ +#define MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC MBEDTLS_OID_PKCS5 "\x04" /**< pbeWithMD2AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 4} */ +#define MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC MBEDTLS_OID_PKCS5 "\x03" /**< pbeWithMD5AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 3} */ +#define MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC MBEDTLS_OID_PKCS5 "\x06" /**< pbeWithMD5AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 6} */ +#define MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC MBEDTLS_OID_PKCS5 "\x0a" /**< pbeWithSHA1AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 10} */ +#define MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC MBEDTLS_OID_PKCS5 "\x0b" /**< pbeWithSHA1AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 11} */ + +/* + * PKCS#8 OIDs + */ +#define MBEDTLS_OID_PKCS9_CSR_EXT_REQ MBEDTLS_OID_PKCS9 "\x0e" /**< extensionRequest OBJECT IDENTIFIER ::= {pkcs-9 14} */ + +/* + * PKCS#12 PBE OIDs + */ +#define MBEDTLS_OID_PKCS12_PBE MBEDTLS_OID_PKCS12 "\x01" /**< pkcs-12PbeIds OBJECT IDENTIFIER ::= {pkcs-12 1} */ + +#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128 MBEDTLS_OID_PKCS12_PBE "\x01" /**< pbeWithSHAAnd128BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 1} */ +#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40 MBEDTLS_OID_PKCS12_PBE "\x02" /**< pbeWithSHAAnd40BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 2} */ +#define MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC MBEDTLS_OID_PKCS12_PBE "\x03" /**< pbeWithSHAAnd3-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 3} */ +#define MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC MBEDTLS_OID_PKCS12_PBE "\x04" /**< pbeWithSHAAnd2-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 4} */ +#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE "\x05" /**< pbeWithSHAAnd128BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 5} */ +#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE "\x06" /**< pbeWithSHAAnd40BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 6} */ + +/* + * EC key algorithms from RFC 5480 + */ + +/* id-ecPublicKey OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 } */ +#define MBEDTLS_OID_EC_ALG_UNRESTRICTED MBEDTLS_OID_ANSI_X9_62 "\x02\01" + +/* id-ecDH OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) certicom(132) + * schemes(1) ecdh(12) } */ +#define MBEDTLS_OID_EC_ALG_ECDH MBEDTLS_OID_CERTICOM "\x01\x0c" + +/* + * ECParameters namedCurve identifiers, from RFC 5480, RFC 5639, and SEC2 + */ + +/* secp192r1 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 1 } */ +#define MBEDTLS_OID_EC_GRP_SECP192R1 MBEDTLS_OID_ANSI_X9_62 "\x03\x01\x01" + +/* secp224r1 OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) certicom(132) curve(0) 33 } */ +#define MBEDTLS_OID_EC_GRP_SECP224R1 MBEDTLS_OID_CERTICOM "\x00\x21" + +/* secp256r1 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 7 } */ +#define MBEDTLS_OID_EC_GRP_SECP256R1 MBEDTLS_OID_ANSI_X9_62 "\x03\x01\x07" + +/* secp384r1 OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) certicom(132) curve(0) 34 } */ +#define MBEDTLS_OID_EC_GRP_SECP384R1 MBEDTLS_OID_CERTICOM "\x00\x22" + +/* secp521r1 OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) certicom(132) curve(0) 35 } */ +#define MBEDTLS_OID_EC_GRP_SECP521R1 MBEDTLS_OID_CERTICOM "\x00\x23" + +/* secp192k1 OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) certicom(132) curve(0) 31 } */ +#define MBEDTLS_OID_EC_GRP_SECP192K1 MBEDTLS_OID_CERTICOM "\x00\x1f" + +/* secp224k1 OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) certicom(132) curve(0) 32 } */ +#define MBEDTLS_OID_EC_GRP_SECP224K1 MBEDTLS_OID_CERTICOM "\x00\x20" + +/* secp256k1 OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) certicom(132) curve(0) 10 } */ +#define MBEDTLS_OID_EC_GRP_SECP256K1 MBEDTLS_OID_CERTICOM "\x00\x0a" + +/* RFC 5639 4.1 + * ecStdCurvesAndGeneration OBJECT IDENTIFIER::= {iso(1) + * identified-organization(3) teletrust(36) algorithm(3) signature- + * algorithm(3) ecSign(2) 8} + * ellipticCurve OBJECT IDENTIFIER ::= {ecStdCurvesAndGeneration 1} + * versionOne OBJECT IDENTIFIER ::= {ellipticCurve 1} */ +#define MBEDTLS_OID_EC_BRAINPOOL_V1 MBEDTLS_OID_TELETRUST "\x03\x03\x02\x08\x01\x01" + +/* brainpoolP256r1 OBJECT IDENTIFIER ::= {versionOne 7} */ +#define MBEDTLS_OID_EC_GRP_BP256R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x07" + +/* brainpoolP384r1 OBJECT IDENTIFIER ::= {versionOne 11} */ +#define MBEDTLS_OID_EC_GRP_BP384R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x0B" + +/* brainpoolP512r1 OBJECT IDENTIFIER ::= {versionOne 13} */ +#define MBEDTLS_OID_EC_GRP_BP512R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x0D" + +/* + * SEC1 C.1 + * + * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 } + * id-fieldType OBJECT IDENTIFIER ::= { ansi-X9-62 fieldType(1)} + */ +#define MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE MBEDTLS_OID_ANSI_X9_62 "\x01" +#define MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE "\x01" + +/* + * ECDSA signature identifiers, from RFC 5480 + */ +#define MBEDTLS_OID_ANSI_X9_62_SIG MBEDTLS_OID_ANSI_X9_62 "\x04" /* signatures(4) */ +#define MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 MBEDTLS_OID_ANSI_X9_62_SIG "\x03" /* ecdsa-with-SHA2(3) */ + +/* ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) 1 } */ +#define MBEDTLS_OID_ECDSA_SHA1 MBEDTLS_OID_ANSI_X9_62_SIG "\x01" + +/* ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) + * ecdsa-with-SHA2(3) 1 } */ +#define MBEDTLS_OID_ECDSA_SHA224 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x01" + +/* ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) + * ecdsa-with-SHA2(3) 2 } */ +#define MBEDTLS_OID_ECDSA_SHA256 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x02" + +/* ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) + * ecdsa-with-SHA2(3) 3 } */ +#define MBEDTLS_OID_ECDSA_SHA384 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x03" + +/* ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) + * ecdsa-with-SHA2(3) 4 } */ +#define MBEDTLS_OID_ECDSA_SHA512 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x04" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Base OID descriptor structure + */ +typedef struct mbedtls_oid_descriptor_t { + const char *asn1; /*!< OID ASN.1 representation */ + size_t asn1_len; /*!< length of asn1 */ + const char *name; /*!< official name (e.g. from RFC) */ + const char *description; /*!< human friendly description */ +} mbedtls_oid_descriptor_t; + +/** + * \brief Translate an ASN.1 OID into its numeric representation + * (e.g. "\x2A\x86\x48\x86\xF7\x0D" into "1.2.840.113549") + * + * \param buf buffer to put representation in + * \param size size of the buffer + * \param oid OID to translate + * + * \return Length of the string written (excluding final NULL) or + * MBEDTLS_ERR_OID_BUF_TOO_SMALL in case of error + */ +int mbedtls_oid_get_numeric_string(char *buf, size_t size, const mbedtls_asn1_buf *oid); + +/** + * \brief Translate an X.509 extension OID into local values + * + * \param oid OID to use + * \param ext_type place to store the extension type + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_x509_ext_type(const mbedtls_asn1_buf *oid, int *ext_type); + +/** + * \brief Translate an X.509 attribute type OID into the short name + * (e.g. the OID for an X520 Common Name into "CN") + * + * \param oid OID to use + * \param short_name place to store the string pointer + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_attr_short_name(const mbedtls_asn1_buf *oid, const char **short_name); + +/** + * \brief Translate PublicKeyAlgorithm OID into pk_type + * + * \param oid OID to use + * \param pk_alg place to store public key algorithm + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_pk_alg(const mbedtls_asn1_buf *oid, mbedtls_pk_type_t *pk_alg); + +/** + * \brief Translate pk_type into PublicKeyAlgorithm OID + * + * \param pk_alg Public key type to look for + * \param oid place to store ASN.1 OID string pointer + * \param olen length of the OID + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_oid_by_pk_alg(mbedtls_pk_type_t pk_alg, + const char **oid, size_t *olen); + +#if defined(MBEDTLS_ECP_C) +/** + * \brief Translate NamedCurve OID into an EC group identifier + * + * \param oid OID to use + * \param grp_id place to store group id + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_ec_grp(const mbedtls_asn1_buf *oid, mbedtls_ecp_group_id *grp_id); + +/** + * \brief Translate EC group identifier into NamedCurve OID + * + * \param grp_id EC group identifier + * \param oid place to store ASN.1 OID string pointer + * \param olen length of the OID + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_oid_by_ec_grp(mbedtls_ecp_group_id grp_id, + const char **oid, size_t *olen); +#endif /* MBEDTLS_ECP_C */ + +#if defined(MBEDTLS_MD_C) +/** + * \brief Translate SignatureAlgorithm OID into md_type and pk_type + * + * \param oid OID to use + * \param md_alg place to store message digest algorithm + * \param pk_alg place to store public key algorithm + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_sig_alg(const mbedtls_asn1_buf *oid, + mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg); + +/** + * \brief Translate SignatureAlgorithm OID into description + * + * \param oid OID to use + * \param desc place to store string pointer + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_sig_alg_desc(const mbedtls_asn1_buf *oid, const char **desc); + +/** + * \brief Translate md_type and pk_type into SignatureAlgorithm OID + * + * \param md_alg message digest algorithm + * \param pk_alg public key algorithm + * \param oid place to store ASN.1 OID string pointer + * \param olen length of the OID + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_oid_by_sig_alg(mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, + const char **oid, size_t *olen); + +/** + * \brief Translate hash algorithm OID into md_type + * + * \param oid OID to use + * \param md_alg place to store message digest algorithm + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_md_alg(const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg); + +/** + * \brief Translate hmac algorithm OID into md_type + * + * \param oid OID to use + * \param md_hmac place to store message hmac algorithm + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_md_hmac(const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_hmac); +#endif /* MBEDTLS_MD_C */ + +/** + * \brief Translate Extended Key Usage OID into description + * + * \param oid OID to use + * \param desc place to store string pointer + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_extended_key_usage(const mbedtls_asn1_buf *oid, const char **desc); + +/** + * \brief Translate certificate policies OID into description + * + * \param oid OID to use + * \param desc place to store string pointer + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_certificate_policies(const mbedtls_asn1_buf *oid, const char **desc); + +/** + * \brief Translate md_type into hash algorithm OID + * + * \param md_alg message digest algorithm + * \param oid place to store ASN.1 OID string pointer + * \param olen length of the OID + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_oid_by_md(mbedtls_md_type_t md_alg, const char **oid, size_t *olen); + +#if defined(MBEDTLS_CIPHER_C) +/** + * \brief Translate encryption algorithm OID into cipher_type + * + * \param oid OID to use + * \param cipher_alg place to store cipher algorithm + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_cipher_alg(const mbedtls_asn1_buf *oid, mbedtls_cipher_type_t *cipher_alg); +#endif /* MBEDTLS_CIPHER_C */ + +#if defined(MBEDTLS_PKCS12_C) +/** + * \brief Translate PKCS#12 PBE algorithm OID into md_type and + * cipher_type + * + * \param oid OID to use + * \param md_alg place to store message digest algorithm + * \param cipher_alg place to store cipher algorithm + * + * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND + */ +int mbedtls_oid_get_pkcs12_pbe_alg(const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg, + mbedtls_cipher_type_t *cipher_alg); +#endif /* MBEDTLS_PKCS12_C */ + +#ifdef __cplusplus +} +#endif + +#endif /* oid.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/padlock.h b/ext/opcua_client/mbedtls/include/mbedtls/padlock.h new file mode 100644 index 0000000..0821105 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/padlock.h @@ -0,0 +1,117 @@ +/** + * \file padlock.h + * + * \brief VIA PadLock ACE for HW encryption/decryption supported by some + * processors + * + * \warning These functions are only for internal use by other library + * functions; you must not call them directly. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_PADLOCK_H +#define MBEDTLS_PADLOCK_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/aes.h" + +/** Input data should be aligned. */ +#define MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED -0x0030 + +#if defined(__has_feature) +#if __has_feature(address_sanitizer) +#define MBEDTLS_HAVE_ASAN +#endif +#endif + +/* Some versions of ASan result in errors about not enough registers */ +#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_ASM) && \ + defined(__GNUC__) && defined(__i386__) && \ + !defined(MBEDTLS_HAVE_ASAN) + +#define MBEDTLS_VIA_PADLOCK_HAVE_CODE + +#ifndef MBEDTLS_HAVE_X86 +#define MBEDTLS_HAVE_X86 +#endif + +#include + +#define MBEDTLS_PADLOCK_RNG 0x000C +#define MBEDTLS_PADLOCK_ACE 0x00C0 +#define MBEDTLS_PADLOCK_PHE 0x0C00 +#define MBEDTLS_PADLOCK_PMM 0x3000 + +#define MBEDTLS_PADLOCK_ALIGN16(x) (uint32_t *) (16 + ((int32_t) (x) & ~15)) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Internal PadLock detection routine + * + * \note This function is only for internal use by other library + * functions; you must not call it directly. + * + * \param feature The feature to detect + * + * \return non-zero if CPU has support for the feature, 0 otherwise + */ +int mbedtls_padlock_has_support(int feature); + +/** + * \brief Internal PadLock AES-ECB block en(de)cryption + * + * \note This function is only for internal use by other library + * functions; you must not call it directly. + * + * \param ctx AES context + * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT + * \param input 16-byte input block + * \param output 16-byte output block + * + * \return 0 if success, 1 if operation failed + */ +int mbedtls_padlock_xcryptecb(mbedtls_aes_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16]); + +/** + * \brief Internal PadLock AES-CBC buffer en(de)cryption + * + * \note This function is only for internal use by other library + * functions; you must not call it directly. + * + * \param ctx AES context + * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT + * \param length length of the input data + * \param iv initialization vector (updated after use) + * \param input buffer holding the input data + * \param output buffer holding the output data + * + * \return 0 if success, 1 if operation failed + */ +int mbedtls_padlock_xcryptcbc(mbedtls_aes_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output); + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_PADLOCK_C && MBEDTLS_HAVE_ASM && + __GNUC__ && __i386__ && !MBEDTLS_HAVE_ASAN */ + +#endif /* padlock.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/pem.h b/ext/opcua_client/mbedtls/include/mbedtls/pem.h new file mode 100644 index 0000000..ffe6e47 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/pem.h @@ -0,0 +1,140 @@ +/** + * \file pem.h + * + * \brief Privacy Enhanced Mail (PEM) decoding + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_PEM_H +#define MBEDTLS_PEM_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include + +/** + * \name PEM Error codes + * These error codes are returned in case of errors reading the + * PEM data. + * \{ + */ +/** No PEM header or footer found. */ +#define MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT -0x1080 +/** PEM string is not as expected. */ +#define MBEDTLS_ERR_PEM_INVALID_DATA -0x1100 +/** Failed to allocate memory. */ +#define MBEDTLS_ERR_PEM_ALLOC_FAILED -0x1180 +/** RSA IV is not in hex-format. */ +#define MBEDTLS_ERR_PEM_INVALID_ENC_IV -0x1200 +/** Unsupported key encryption algorithm. */ +#define MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG -0x1280 +/** Private key password can't be empty. */ +#define MBEDTLS_ERR_PEM_PASSWORD_REQUIRED -0x1300 +/** Given private key password does not allow for correct decryption. */ +#define MBEDTLS_ERR_PEM_PASSWORD_MISMATCH -0x1380 +/** Unavailable feature, e.g. hashing/encryption combination. */ +#define MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE -0x1400 +/** Bad input parameters to function. */ +#define MBEDTLS_ERR_PEM_BAD_INPUT_DATA -0x1480 +/** \} name PEM Error codes */ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(MBEDTLS_PEM_PARSE_C) +/** + * \brief PEM context structure + */ +typedef struct mbedtls_pem_context { + unsigned char *buf; /*!< buffer for decoded data */ + size_t buflen; /*!< length of the buffer */ + unsigned char *info; /*!< buffer for extra header information */ +} +mbedtls_pem_context; + +/** + * \brief PEM context setup + * + * \param ctx context to be initialized + */ +void mbedtls_pem_init(mbedtls_pem_context *ctx); + +/** + * \brief Read a buffer for PEM information and store the resulting + * data into the specified context buffers. + * + * \param ctx context to use + * \param header header string to seek and expect + * \param footer footer string to seek and expect + * \param data source data to look in (must be nul-terminated) + * \param pwd password for decryption (can be NULL) + * \param pwdlen length of password + * \param use_len destination for total length used (set after header is + * correctly read, so unless you get + * MBEDTLS_ERR_PEM_BAD_INPUT_DATA or + * MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT, use_len is + * the length to skip) + * + * \note Attempts to check password correctness by verifying if + * the decrypted text starts with an ASN.1 sequence of + * appropriate length + * + * \return 0 on success, or a specific PEM error code + */ +int mbedtls_pem_read_buffer(mbedtls_pem_context *ctx, const char *header, const char *footer, + const unsigned char *data, + const unsigned char *pwd, + size_t pwdlen, size_t *use_len); + +/** + * \brief PEM context memory freeing + * + * \param ctx context to be freed + */ +void mbedtls_pem_free(mbedtls_pem_context *ctx); +#endif /* MBEDTLS_PEM_PARSE_C */ + +#if defined(MBEDTLS_PEM_WRITE_C) +/** + * \brief Write a buffer of PEM information from a DER encoded + * buffer. + * + * \param header The header string to write. + * \param footer The footer string to write. + * \param der_data The DER data to encode. + * \param der_len The length of the DER data \p der_data in Bytes. + * \param buf The buffer to write to. + * \param buf_len The length of the output buffer \p buf in Bytes. + * \param olen The address at which to store the total length written + * or required (if \p buf_len is not enough). + * + * \note You may pass \c NULL for \p buf and \c 0 for \p buf_len + * to request the length of the resulting PEM buffer in + * `*olen`. + * + * \note This function may be called with overlapping \p der_data + * and \p buf buffers. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL if \p buf isn't large + * enough to hold the PEM buffer. In this case, `*olen` holds + * the required minimum size of \p buf. + * \return Another PEM or BASE64 error code on other kinds of failure. + */ +int mbedtls_pem_write_buffer(const char *header, const char *footer, + const unsigned char *der_data, size_t der_len, + unsigned char *buf, size_t buf_len, size_t *olen); +#endif /* MBEDTLS_PEM_WRITE_C */ + +#ifdef __cplusplus +} +#endif + +#endif /* pem.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/pk.h b/ext/opcua_client/mbedtls/include/mbedtls/pk.h new file mode 100644 index 0000000..a8c0c37 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/pk.h @@ -0,0 +1,906 @@ +/** + * \file pk.h + * + * \brief Public Key abstraction layer + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_PK_H +#define MBEDTLS_PK_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/md.h" + +#if defined(MBEDTLS_RSA_C) +#include "mbedtls/rsa.h" +#endif + +#if defined(MBEDTLS_ECP_C) +#include "mbedtls/ecp.h" +#endif + +#if defined(MBEDTLS_ECDSA_C) +#include "mbedtls/ecdsa.h" +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "psa/crypto.h" +#endif + +#if (defined(__ARMCC_VERSION) || defined(_MSC_VER)) && \ + !defined(inline) && !defined(__cplusplus) +#define inline __inline +#endif + +/** Memory allocation failed. */ +#define MBEDTLS_ERR_PK_ALLOC_FAILED -0x3F80 +/** Type mismatch, eg attempt to encrypt with an ECDSA key */ +#define MBEDTLS_ERR_PK_TYPE_MISMATCH -0x3F00 +/** Bad input parameters to function. */ +#define MBEDTLS_ERR_PK_BAD_INPUT_DATA -0x3E80 +/** Read/write of file failed. */ +#define MBEDTLS_ERR_PK_FILE_IO_ERROR -0x3E00 +/** Unsupported key version */ +#define MBEDTLS_ERR_PK_KEY_INVALID_VERSION -0x3D80 +/** Invalid key tag or value. */ +#define MBEDTLS_ERR_PK_KEY_INVALID_FORMAT -0x3D00 +/** Key algorithm is unsupported (only RSA and EC are supported). */ +#define MBEDTLS_ERR_PK_UNKNOWN_PK_ALG -0x3C80 +/** Private key password can't be empty. */ +#define MBEDTLS_ERR_PK_PASSWORD_REQUIRED -0x3C00 +/** Given private key password does not allow for correct decryption. */ +#define MBEDTLS_ERR_PK_PASSWORD_MISMATCH -0x3B80 +/** The pubkey tag or value is invalid (only RSA and EC are supported). */ +#define MBEDTLS_ERR_PK_INVALID_PUBKEY -0x3B00 +/** The algorithm tag or value is invalid. */ +#define MBEDTLS_ERR_PK_INVALID_ALG -0x3A80 +/** Elliptic curve is unsupported (only NIST curves are supported). */ +#define MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE -0x3A00 +/** Unavailable feature, e.g. RSA disabled for RSA key. */ +#define MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE -0x3980 +/** The buffer contains a valid signature followed by more data. */ +#define MBEDTLS_ERR_PK_SIG_LEN_MISMATCH -0x3900 + +/* MBEDTLS_ERR_PK_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** PK hardware accelerator failed. */ +#define MBEDTLS_ERR_PK_HW_ACCEL_FAILED -0x3880 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Public key types + */ +typedef enum { + MBEDTLS_PK_NONE=0, + MBEDTLS_PK_RSA, + MBEDTLS_PK_ECKEY, + MBEDTLS_PK_ECKEY_DH, + MBEDTLS_PK_ECDSA, + MBEDTLS_PK_RSA_ALT, + MBEDTLS_PK_RSASSA_PSS, + MBEDTLS_PK_OPAQUE, +} mbedtls_pk_type_t; + +/** + * \brief Options for RSASSA-PSS signature verification. + * See \c mbedtls_rsa_rsassa_pss_verify_ext() + */ +typedef struct mbedtls_pk_rsassa_pss_options { + mbedtls_md_type_t mgf1_hash_id; + int expected_salt_len; + +} mbedtls_pk_rsassa_pss_options; + +/** + * \brief Maximum size of a signature made by mbedtls_pk_sign(). + */ +/* We need to set MBEDTLS_PK_SIGNATURE_MAX_SIZE to the maximum signature + * size among the supported signature types. Do it by starting at 0, + * then incrementally increasing to be large enough for each supported + * signature mechanism. + * + * The resulting value can be 0, for example if MBEDTLS_ECDH_C is enabled + * (which allows the pk module to be included) but neither MBEDTLS_ECDSA_C + * nor MBEDTLS_RSA_C nor any opaque signature mechanism (PSA or RSA_ALT). + */ +#define MBEDTLS_PK_SIGNATURE_MAX_SIZE 0 + +#if (defined(MBEDTLS_RSA_C) || defined(MBEDTLS_PK_RSA_ALT_SUPPORT)) && \ + MBEDTLS_MPI_MAX_SIZE > MBEDTLS_PK_SIGNATURE_MAX_SIZE +/* For RSA, the signature can be as large as the bignum module allows. + * For RSA_ALT, the signature size is not necessarily tied to what the + * bignum module can do, but in the absence of any specific setting, + * we use that (rsa_alt_sign_wrap in pk_wrap will check). */ +#undef MBEDTLS_PK_SIGNATURE_MAX_SIZE +#define MBEDTLS_PK_SIGNATURE_MAX_SIZE MBEDTLS_MPI_MAX_SIZE +#endif + +#if defined(MBEDTLS_ECDSA_C) && \ + MBEDTLS_ECDSA_MAX_LEN > MBEDTLS_PK_SIGNATURE_MAX_SIZE +/* For ECDSA, the ecdsa module exports a constant for the maximum + * signature size. */ +#undef MBEDTLS_PK_SIGNATURE_MAX_SIZE +#define MBEDTLS_PK_SIGNATURE_MAX_SIZE MBEDTLS_ECDSA_MAX_LEN +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#if PSA_SIGNATURE_MAX_SIZE > MBEDTLS_PK_SIGNATURE_MAX_SIZE +/* PSA_SIGNATURE_MAX_SIZE is the maximum size of a signature made + * through the PSA API in the PSA representation. */ +#undef MBEDTLS_PK_SIGNATURE_MAX_SIZE +#define MBEDTLS_PK_SIGNATURE_MAX_SIZE PSA_SIGNATURE_MAX_SIZE +#endif + +#if PSA_VENDOR_ECDSA_SIGNATURE_MAX_SIZE + 11 > MBEDTLS_PK_SIGNATURE_MAX_SIZE +/* The Mbed TLS representation is different for ECDSA signatures: + * PSA uses the raw concatenation of r and s, + * whereas Mbed TLS uses the ASN.1 representation (SEQUENCE of two INTEGERs). + * Add the overhead of ASN.1: up to (1+2) + 2 * (1+2+1) for the + * types, lengths (represented by up to 2 bytes), and potential leading + * zeros of the INTEGERs and the SEQUENCE. */ +#undef MBEDTLS_PK_SIGNATURE_MAX_SIZE +#define MBEDTLS_PK_SIGNATURE_MAX_SIZE (PSA_VENDOR_ECDSA_SIGNATURE_MAX_SIZE + 11) +#endif +#endif /* defined(MBEDTLS_USE_PSA_CRYPTO) */ + +/** + * \brief Types for interfacing with the debug module + */ +typedef enum { + MBEDTLS_PK_DEBUG_NONE = 0, + MBEDTLS_PK_DEBUG_MPI, + MBEDTLS_PK_DEBUG_ECP, +} mbedtls_pk_debug_type; + +/** + * \brief Item to send to the debug module + */ +typedef struct mbedtls_pk_debug_item { + mbedtls_pk_debug_type type; + const char *name; + void *value; +} mbedtls_pk_debug_item; + +/** Maximum number of item send for debugging, plus 1 */ +#define MBEDTLS_PK_DEBUG_MAX_ITEMS 3 + +/** + * \brief Public key information and operations + */ +typedef struct mbedtls_pk_info_t mbedtls_pk_info_t; + +/** + * \brief Public key container + */ +typedef struct mbedtls_pk_context { + const mbedtls_pk_info_t *pk_info; /**< Public key information */ + void *pk_ctx; /**< Underlying public key context */ +} mbedtls_pk_context; + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) +/** + * \brief Context for resuming operations + */ +typedef struct { + const mbedtls_pk_info_t *pk_info; /**< Public key information */ + void *rs_ctx; /**< Underlying restart context */ +} mbedtls_pk_restart_ctx; +#else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ +/* Now we can declare functions that take a pointer to that */ +typedef void mbedtls_pk_restart_ctx; +#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + +#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) +/** + * \brief Types for RSA-alt abstraction + */ +typedef int (*mbedtls_pk_rsa_alt_decrypt_func)(void *ctx, int mode, size_t *olen, + const unsigned char *input, unsigned char *output, + size_t output_max_len); +typedef int (*mbedtls_pk_rsa_alt_sign_func)(void *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, unsigned char *sig); +typedef size_t (*mbedtls_pk_rsa_alt_key_len_func)(void *ctx); +#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ + +/** + * \brief Return information associated with the given PK type + * + * \param pk_type PK type to search for. + * + * \return The PK info associated with the type or NULL if not found. + */ +const mbedtls_pk_info_t *mbedtls_pk_info_from_type(mbedtls_pk_type_t pk_type); + +/** + * \brief Initialize a #mbedtls_pk_context (as NONE). + * + * \param ctx The context to initialize. + * This must not be \c NULL. + */ +void mbedtls_pk_init(mbedtls_pk_context *ctx); + +/** + * \brief Free the components of a #mbedtls_pk_context. + * + * \param ctx The context to clear. It must have been initialized. + * If this is \c NULL, this function does nothing. + * + * \note For contexts that have been set up with + * mbedtls_pk_setup_opaque(), this does not free the underlying + * PSA key and you still need to call psa_destroy_key() + * independently if you want to destroy that key. + */ +void mbedtls_pk_free(mbedtls_pk_context *ctx); + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) +/** + * \brief Initialize a restart context + * + * \param ctx The context to initialize. + * This must not be \c NULL. + */ +void mbedtls_pk_restart_init(mbedtls_pk_restart_ctx *ctx); + +/** + * \brief Free the components of a restart context + * + * \param ctx The context to clear. It must have been initialized. + * If this is \c NULL, this function does nothing. + */ +void mbedtls_pk_restart_free(mbedtls_pk_restart_ctx *ctx); +#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + +/** + * \brief Initialize a PK context with the information given + * and allocates the type-specific PK subcontext. + * + * \param ctx Context to initialize. It must not have been set + * up yet (type #MBEDTLS_PK_NONE). + * \param info Information to use + * + * \return 0 on success, + * MBEDTLS_ERR_PK_BAD_INPUT_DATA on invalid input, + * MBEDTLS_ERR_PK_ALLOC_FAILED on allocation failure. + * + * \note For contexts holding an RSA-alt key, use + * \c mbedtls_pk_setup_rsa_alt() instead. + */ +int mbedtls_pk_setup(mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info); + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +/** + * \brief Initialize a PK context to wrap a PSA key. + * + * \note This function replaces mbedtls_pk_setup() for contexts + * that wrap a (possibly opaque) PSA key instead of + * storing and manipulating the key material directly. + * + * \param ctx The context to initialize. It must be empty (type NONE). + * \param key The PSA key to wrap, which must hold an ECC key pair + * (see notes below). + * + * \note The wrapped key must remain valid as long as the + * wrapping PK context is in use, that is at least between + * the point this function is called and the point + * mbedtls_pk_free() is called on this context. The wrapped + * key might then be independently used or destroyed. + * + * \note This function is currently only available for ECC key + * pairs (that is, ECC keys containing private key material). + * Support for other key types may be added later. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_PK_BAD_INPUT_DATA on invalid input + * (context already used, invalid key identifier). + * \return #MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE if the key is not an + * ECC key pair. + * \return #MBEDTLS_ERR_PK_ALLOC_FAILED on allocation failure. + */ +int mbedtls_pk_setup_opaque(mbedtls_pk_context *ctx, + const psa_key_id_t key); +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) +/** + * \brief Initialize an RSA-alt context + * + * \param ctx Context to initialize. It must not have been set + * up yet (type #MBEDTLS_PK_NONE). + * \param key RSA key pointer + * \param decrypt_func Decryption function + * \param sign_func Signing function + * \param key_len_func Function returning key length in bytes + * + * \return 0 on success, or MBEDTLS_ERR_PK_BAD_INPUT_DATA if the + * context wasn't already initialized as RSA_ALT. + * + * \note This function replaces \c mbedtls_pk_setup() for RSA-alt. + */ +int mbedtls_pk_setup_rsa_alt(mbedtls_pk_context *ctx, void *key, + mbedtls_pk_rsa_alt_decrypt_func decrypt_func, + mbedtls_pk_rsa_alt_sign_func sign_func, + mbedtls_pk_rsa_alt_key_len_func key_len_func); +#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ + +/** + * \brief Get the size in bits of the underlying key + * + * \param ctx The context to query. It must have been initialized. + * + * \return Key size in bits, or 0 on error + */ +size_t mbedtls_pk_get_bitlen(const mbedtls_pk_context *ctx); + +/** + * \brief Get the length in bytes of the underlying key + * + * \param ctx The context to query. It must have been initialized. + * + * \return Key length in bytes, or 0 on error + */ +static inline size_t mbedtls_pk_get_len(const mbedtls_pk_context *ctx) +{ + return (mbedtls_pk_get_bitlen(ctx) + 7) / 8; +} + +/** + * \brief Tell if a context can do the operation given by type + * + * \param ctx The context to query. It must have been initialized. + * \param type The desired type. + * + * \return 1 if the context can do operations on the given type. + * \return 0 if the context cannot do the operations on the given + * type. This is always the case for a context that has + * been initialized but not set up, or that has been + * cleared with mbedtls_pk_free(). + */ +int mbedtls_pk_can_do(const mbedtls_pk_context *ctx, mbedtls_pk_type_t type); + +/** + * \brief Verify signature (including padding if relevant). + * + * \param ctx The PK context to use. It must have been set up. + * \param md_alg Hash algorithm used (see notes) + * \param hash Hash of the message to sign + * \param hash_len Hash length or 0 (see notes) + * \param sig Signature to verify + * \param sig_len Signature length + * + * \return 0 on success (signature is valid), + * #MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if there is a valid + * signature in \p sig but its length is less than \p sig_len, + * or a specific error code. + * + * \note For RSA keys, the default padding type is PKCS#1 v1.5. + * Use \c mbedtls_pk_verify_ext( MBEDTLS_PK_RSASSA_PSS, ... ) + * to verify RSASSA_PSS signatures. + * + * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto + * subsystem must have been initialized by calling + * psa_crypto_init() before calling this function, + * if the key might be an ECC (ECDSA) key. + * + * \note If hash_len is 0, then the length associated with md_alg + * is used instead, or an error returned if it is invalid. + * + * \note md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0 + */ +int mbedtls_pk_verify(mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len); + +/** + * \brief Restartable version of \c mbedtls_pk_verify() + * + * \note Performs the same job as \c mbedtls_pk_verify(), but can + * return early and restart according to the limit set with + * \c mbedtls_ecp_set_max_ops() to reduce blocking for ECC + * operations. For RSA, same as \c mbedtls_pk_verify(). + * + * \param ctx The PK context to use. It must have been set up. + * \param md_alg Hash algorithm used (see notes) + * \param hash Hash of the message to sign + * \param hash_len Hash length or 0 (see notes) + * \param sig Signature to verify + * \param sig_len Signature length + * \param rs_ctx Restart context (NULL to disable restart) + * + * \return See \c mbedtls_pk_verify(), or + * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of + * operations was reached: see \c mbedtls_ecp_set_max_ops(). + */ +int mbedtls_pk_verify_restartable(mbedtls_pk_context *ctx, + mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len, + mbedtls_pk_restart_ctx *rs_ctx); + +/** + * \brief Verify signature, with options. + * (Includes verification of the padding depending on type.) + * + * \param type Signature type (inc. possible padding type) to verify + * \param options Pointer to type-specific options, or NULL + * \param ctx The PK context to use. It must have been set up. + * \param md_alg Hash algorithm used (see notes) + * \param hash Hash of the message to sign + * \param hash_len Hash length or 0 (see notes) + * \param sig Signature to verify + * \param sig_len Signature length + * + * \return 0 on success (signature is valid), + * #MBEDTLS_ERR_PK_TYPE_MISMATCH if the PK context can't be + * used for this type of signatures, + * #MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if there is a valid + * signature in \p sig but its length is less than \p sig_len, + * or a specific error code. + * + * \note If hash_len is 0, then the length associated with md_alg + * is used instead, or an error returned if it is invalid. + * + * \note md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0 + * + * \note If type is MBEDTLS_PK_RSASSA_PSS, then options must point + * to a mbedtls_pk_rsassa_pss_options structure, + * otherwise it must be NULL. + */ +int mbedtls_pk_verify_ext(mbedtls_pk_type_t type, const void *options, + mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len); + +/** + * \brief Make signature, including padding if relevant. + * + * \param ctx The PK context to use. It must have been set up + * with a private key. + * \param md_alg Hash algorithm used (see notes) + * \param hash Hash of the message to sign + * \param hash_len Hash length or 0 (see notes) + * \param sig Place to write the signature. + * It must have enough room for the signature. + * #MBEDTLS_PK_SIGNATURE_MAX_SIZE is always enough. + * You may use a smaller buffer if it is large enough + * given the key type. + * \param sig_len On successful return, + * the number of bytes written to \p sig. + * \param f_rng RNG function + * \param p_rng RNG parameter + * + * \return 0 on success, or a specific error code. + * + * \note For RSA keys, the default padding type is PKCS#1 v1.5. + * There is no interface in the PK module to make RSASSA-PSS + * signatures yet. + * + * \note If hash_len is 0, then the length associated with md_alg + * is used instead, or an error returned if it is invalid. + * + * \note For RSA, md_alg may be MBEDTLS_MD_NONE if hash_len != 0. + * For ECDSA, md_alg may never be MBEDTLS_MD_NONE. + */ +int mbedtls_pk_sign(mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng); + +/** + * \brief Restartable version of \c mbedtls_pk_sign() + * + * \note Performs the same job as \c mbedtls_pk_sign(), but can + * return early and restart according to the limit set with + * \c mbedtls_ecp_set_max_ops() to reduce blocking for ECC + * operations. For RSA, same as \c mbedtls_pk_sign(). + * + * \param ctx The PK context to use. It must have been set up + * with a private key. + * \param md_alg Hash algorithm used (see notes for mbedtls_pk_sign()) + * \param hash Hash of the message to sign + * \param hash_len Hash length or 0 (see notes for mbedtls_pk_sign()) + * \param sig Place to write the signature. + * It must have enough room for the signature. + * #MBEDTLS_PK_SIGNATURE_MAX_SIZE is always enough. + * You may use a smaller buffer if it is large enough + * given the key type. + * \param sig_len On successful return, + * the number of bytes written to \p sig. + * \param f_rng RNG function + * \param p_rng RNG parameter + * \param rs_ctx Restart context (NULL to disable restart) + * + * \return See \c mbedtls_pk_sign(). + * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of + * operations was reached: see \c mbedtls_ecp_set_max_ops(). + */ +int mbedtls_pk_sign_restartable(mbedtls_pk_context *ctx, + mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + mbedtls_pk_restart_ctx *rs_ctx); + +/** + * \brief Decrypt message (including padding if relevant). + * + * \param ctx The PK context to use. It must have been set up + * with a private key. + * \param input Input to decrypt + * \param ilen Input size + * \param output Decrypted output + * \param olen Decrypted message length + * \param osize Size of the output buffer + * \param f_rng RNG function + * \param p_rng RNG parameter + * + * \note For RSA keys, the default padding type is PKCS#1 v1.5. + * + * \return 0 on success, or a specific error code. + */ +int mbedtls_pk_decrypt(mbedtls_pk_context *ctx, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, size_t osize, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng); + +/** + * \brief Encrypt message (including padding if relevant). + * + * \param ctx The PK context to use. It must have been set up. + * \param input Message to encrypt + * \param ilen Message size + * \param output Encrypted output + * \param olen Encrypted output length + * \param osize Size of the output buffer + * \param f_rng RNG function + * \param p_rng RNG parameter + * + * \note For RSA keys, the default padding type is PKCS#1 v1.5. + * + * \return 0 on success, or a specific error code. + */ +int mbedtls_pk_encrypt(mbedtls_pk_context *ctx, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, size_t osize, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng); + +/** + * \brief Check if a public-private pair of keys matches. + * + * \param pub Context holding a public key. + * \param prv Context holding a private (and public) key. + * + * \return \c 0 on success (keys were checked and match each other). + * \return #MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE if the keys could not + * be checked - in that case they may or may not match. + * \return #MBEDTLS_ERR_PK_BAD_INPUT_DATA if a context is invalid. + * \return Another non-zero value if the keys do not match. + */ +int mbedtls_pk_check_pair(const mbedtls_pk_context *pub, const mbedtls_pk_context *prv); + +/** + * \brief Export debug information + * + * \param ctx The PK context to use. It must have been initialized. + * \param items Place to write debug items + * + * \return 0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA + */ +int mbedtls_pk_debug(const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items); + +/** + * \brief Access the type name + * + * \param ctx The PK context to use. It must have been initialized. + * + * \return Type name on success, or "invalid PK" + */ +const char *mbedtls_pk_get_name(const mbedtls_pk_context *ctx); + +/** + * \brief Get the key type + * + * \param ctx The PK context to use. It must have been initialized. + * + * \return Type on success. + * \return #MBEDTLS_PK_NONE for a context that has not been set up. + */ +mbedtls_pk_type_t mbedtls_pk_get_type(const mbedtls_pk_context *ctx); + +#if defined(MBEDTLS_RSA_C) +/** + * Quick access to an RSA context inside a PK context. + * + * \warning This function can only be used when the type of the context, as + * returned by mbedtls_pk_get_type(), is #MBEDTLS_PK_RSA. + * Ensuring that is the caller's responsibility. + * Alternatively, you can check whether this function returns NULL. + * + * \return The internal RSA context held by the PK context, or NULL. + */ +static inline mbedtls_rsa_context *mbedtls_pk_rsa(const mbedtls_pk_context pk) +{ + switch (mbedtls_pk_get_type(&pk)) { + case MBEDTLS_PK_RSA: + return (mbedtls_rsa_context *) (pk).pk_ctx; + default: + return NULL; + } +} +#endif /* MBEDTLS_RSA_C */ + +#if defined(MBEDTLS_ECP_C) +/** + * Quick access to an EC context inside a PK context. + * + * \warning This function can only be used when the type of the context, as + * returned by mbedtls_pk_get_type(), is #MBEDTLS_PK_ECKEY, + * #MBEDTLS_PK_ECKEY_DH, or #MBEDTLS_PK_ECDSA. + * Ensuring that is the caller's responsibility. + * Alternatively, you can check whether this function returns NULL. + * + * \return The internal EC context held by the PK context, or NULL. + */ +static inline mbedtls_ecp_keypair *mbedtls_pk_ec(const mbedtls_pk_context pk) +{ + switch (mbedtls_pk_get_type(&pk)) { + case MBEDTLS_PK_ECKEY: + case MBEDTLS_PK_ECKEY_DH: + case MBEDTLS_PK_ECDSA: + return (mbedtls_ecp_keypair *) (pk).pk_ctx; + default: + return NULL; + } +} +#endif /* MBEDTLS_ECP_C */ + +#if defined(MBEDTLS_PK_PARSE_C) +/** \ingroup pk_module */ +/** + * \brief Parse a private key in PEM or DER format + * + * \param ctx The PK context to fill. It must have been initialized + * but not set up. + * \param key Input buffer to parse. + * The buffer must contain the input exactly, with no + * extra trailing material. For PEM, the buffer must + * contain a null-terminated string. + * \param keylen Size of \b key in bytes. + * For PEM data, this includes the terminating null byte, + * so \p keylen must be equal to `strlen(key) + 1`. + * \param pwd Optional password for decryption. + * Pass \c NULL if expecting a non-encrypted key. + * Pass a string of \p pwdlen bytes if expecting an encrypted + * key; a non-encrypted key will also be accepted. + * The empty password is not supported. + * \param pwdlen Size of the password in bytes. + * Ignored if \p pwd is \c NULL. + * + * \note On entry, ctx must be empty, either freshly initialised + * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a + * specific key type, check the result with mbedtls_pk_can_do(). + * + * \note The key is also checked for correctness. + * + * \return 0 if successful, or a specific PK or PEM error code + */ +int mbedtls_pk_parse_key(mbedtls_pk_context *ctx, + const unsigned char *key, size_t keylen, + const unsigned char *pwd, size_t pwdlen); + +/** \ingroup pk_module */ +/** + * \brief Parse a public key in PEM or DER format + * + * \param ctx The PK context to fill. It must have been initialized + * but not set up. + * \param key Input buffer to parse. + * The buffer must contain the input exactly, with no + * extra trailing material. For PEM, the buffer must + * contain a null-terminated string. + * \param keylen Size of \b key in bytes. + * For PEM data, this includes the terminating null byte, + * so \p keylen must be equal to `strlen(key) + 1`. + * + * \note On entry, ctx must be empty, either freshly initialised + * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a + * specific key type, check the result with mbedtls_pk_can_do(). + * + * \note The key is also checked for correctness. + * + * \return 0 if successful, or a specific PK or PEM error code + */ +int mbedtls_pk_parse_public_key(mbedtls_pk_context *ctx, + const unsigned char *key, size_t keylen); + +#if defined(MBEDTLS_FS_IO) +/** \ingroup pk_module */ +/** + * \brief Load and parse a private key + * + * \param ctx The PK context to fill. It must have been initialized + * but not set up. + * \param path filename to read the private key from + * \param password Optional password to decrypt the file. + * Pass \c NULL if expecting a non-encrypted key. + * Pass a null-terminated string if expecting an encrypted + * key; a non-encrypted key will also be accepted. + * The empty password is not supported. + * + * \note On entry, ctx must be empty, either freshly initialised + * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a + * specific key type, check the result with mbedtls_pk_can_do(). + * + * \note The key is also checked for correctness. + * + * \return 0 if successful, or a specific PK or PEM error code + */ +int mbedtls_pk_parse_keyfile(mbedtls_pk_context *ctx, + const char *path, const char *password); + +/** \ingroup pk_module */ +/** + * \brief Load and parse a public key + * + * \param ctx The PK context to fill. It must have been initialized + * but not set up. + * \param path filename to read the public key from + * + * \note On entry, ctx must be empty, either freshly initialised + * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If + * you need a specific key type, check the result with + * mbedtls_pk_can_do(). + * + * \note The key is also checked for correctness. + * + * \return 0 if successful, or a specific PK or PEM error code + */ +int mbedtls_pk_parse_public_keyfile(mbedtls_pk_context *ctx, const char *path); +#endif /* MBEDTLS_FS_IO */ +#endif /* MBEDTLS_PK_PARSE_C */ + +#if defined(MBEDTLS_PK_WRITE_C) +/** + * \brief Write a private key to a PKCS#1 or SEC1 DER structure + * Note: data is written at the end of the buffer! Use the + * return value to determine where you should start + * using the buffer + * + * \param ctx PK context which must contain a valid private key. + * \param buf buffer to write to + * \param size size of the buffer + * + * \return length of data written if successful, or a specific + * error code + */ +int mbedtls_pk_write_key_der(mbedtls_pk_context *ctx, unsigned char *buf, size_t size); + +/** + * \brief Write a public key to a SubjectPublicKeyInfo DER structure + * Note: data is written at the end of the buffer! Use the + * return value to determine where you should start + * using the buffer + * + * \param ctx PK context which must contain a valid public or private key. + * \param buf buffer to write to + * \param size size of the buffer + * + * \return length of data written if successful, or a specific + * error code + */ +int mbedtls_pk_write_pubkey_der(mbedtls_pk_context *ctx, unsigned char *buf, size_t size); + +#if defined(MBEDTLS_PEM_WRITE_C) +/** + * \brief Write a public key to a PEM string + * + * \param ctx PK context which must contain a valid public or private key. + * \param buf Buffer to write to. The output includes a + * terminating null byte. + * \param size Size of the buffer in bytes. + * + * \return 0 if successful, or a specific error code + */ +int mbedtls_pk_write_pubkey_pem(mbedtls_pk_context *ctx, unsigned char *buf, size_t size); + +/** + * \brief Write a private key to a PKCS#1 or SEC1 PEM string + * + * \param ctx PK context which must contain a valid private key. + * \param buf Buffer to write to. The output includes a + * terminating null byte. + * \param size Size of the buffer in bytes. + * + * \return 0 if successful, or a specific error code + */ +int mbedtls_pk_write_key_pem(mbedtls_pk_context *ctx, unsigned char *buf, size_t size); +#endif /* MBEDTLS_PEM_WRITE_C */ +#endif /* MBEDTLS_PK_WRITE_C */ + +/* + * WARNING: Low-level functions. You probably do not want to use these unless + * you are certain you do ;) + */ + +#if defined(MBEDTLS_PK_PARSE_C) +/** + * \brief Parse a SubjectPublicKeyInfo DER structure + * + * \param p the position in the ASN.1 data + * \param end end of the buffer + * \param pk The PK context to fill. It must have been initialized + * but not set up. + * + * \return 0 if successful, or a specific PK error code + */ +int mbedtls_pk_parse_subpubkey(unsigned char **p, const unsigned char *end, + mbedtls_pk_context *pk); +#endif /* MBEDTLS_PK_PARSE_C */ + +#if defined(MBEDTLS_PK_WRITE_C) +/** + * \brief Write a subjectPublicKey to ASN.1 data + * Note: function works backwards in data buffer + * + * \param p reference to current position pointer + * \param start start of the buffer (for bounds-checking) + * \param key PK context which must contain a valid public or private key. + * + * \return the length written or a negative error code + */ +int mbedtls_pk_write_pubkey(unsigned char **p, unsigned char *start, + const mbedtls_pk_context *key); +#endif /* MBEDTLS_PK_WRITE_C */ + +/* + * Internal module functions. You probably do not want to use these unless you + * know you do. + */ +#if defined(MBEDTLS_FS_IO) +int mbedtls_pk_load_file(const char *path, unsigned char **buf, size_t *n); +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +/** + * \brief Turn an EC key into an opaque one. + * + * \warning This is a temporary utility function for tests. It might + * change or be removed at any time without notice. + * + * \note Only ECDSA keys are supported so far. Signing with the + * specified hash is the only allowed use of that key. + * + * \param pk Input: the EC key to import to a PSA key. + * Output: a PK context wrapping that PSA key. + * \param key Output: a PSA key identifier. + * It's the caller's responsibility to call + * psa_destroy_key() on that key identifier after calling + * mbedtls_pk_free() on the PK context. + * \param hash_alg The hash algorithm to allow for use with that key. + * + * \return \c 0 if successful. + * \return An Mbed TLS error code otherwise. + */ +int mbedtls_pk_wrap_as_opaque(mbedtls_pk_context *pk, + psa_key_id_t *key, + psa_algorithm_t hash_alg); +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_PK_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/pk_internal.h b/ext/opcua_client/mbedtls/include/mbedtls/pk_internal.h new file mode 100644 index 0000000..15165ac --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/pk_internal.h @@ -0,0 +1,126 @@ +/** + * \file pk_internal.h + * + * \brief Public Key abstraction layer: wrapper functions + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_PK_WRAP_H +#define MBEDTLS_PK_WRAP_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/pk.h" + +struct mbedtls_pk_info_t { + /** Public key type */ + mbedtls_pk_type_t type; + + /** Type name */ + const char *name; + + /** Get key size in bits */ + size_t (*get_bitlen)(const void *); + + /** Tell if the context implements this type (e.g. ECKEY can do ECDSA) */ + int (*can_do)(mbedtls_pk_type_t type); + + /** Verify signature */ + int (*verify_func)(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len); + + /** Make signature */ + int (*sign_func)(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + /** Verify signature (restartable) */ + int (*verify_rs_func)(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len, + void *rs_ctx); + + /** Make signature (restartable) */ + int (*sign_rs_func)(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, void *rs_ctx); +#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + + /** Decrypt message */ + int (*decrypt_func)(void *ctx, const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, size_t osize, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + + /** Encrypt message */ + int (*encrypt_func)(void *ctx, const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, size_t osize, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + + /** Check public-private key pair */ + int (*check_pair_func)(const void *pub, const void *prv); + + /** Allocate a new context */ + void * (*ctx_alloc_func)(void); + + /** Free the given context */ + void (*ctx_free_func)(void *ctx); + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + /** Allocate the restart context */ + void *(*rs_alloc_func)(void); + + /** Free the restart context */ + void (*rs_free_func)(void *rs_ctx); +#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + + /** Interface with the debug module */ + void (*debug_func)(const void *ctx, mbedtls_pk_debug_item *items); + +}; +#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) +/* Container for RSA-alt */ +typedef struct { + void *key; + mbedtls_pk_rsa_alt_decrypt_func decrypt_func; + mbedtls_pk_rsa_alt_sign_func sign_func; + mbedtls_pk_rsa_alt_key_len_func key_len_func; +} mbedtls_rsa_alt_context; +#endif + +#if defined(MBEDTLS_RSA_C) +extern const mbedtls_pk_info_t mbedtls_rsa_info; +#endif + +#if defined(MBEDTLS_ECP_C) +extern const mbedtls_pk_info_t mbedtls_eckey_info; +extern const mbedtls_pk_info_t mbedtls_eckeydh_info; +#endif + +#if defined(MBEDTLS_ECDSA_C) +extern const mbedtls_pk_info_t mbedtls_ecdsa_info; +#endif + +#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) +extern const mbedtls_pk_info_t mbedtls_rsa_alt_info; +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +extern const mbedtls_pk_info_t mbedtls_pk_opaque_info; +#endif + +#endif /* MBEDTLS_PK_WRAP_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/pkcs11.h b/ext/opcua_client/mbedtls/include/mbedtls/pkcs11.h new file mode 100644 index 0000000..25d1dd1 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/pkcs11.h @@ -0,0 +1,241 @@ +/** + * \file pkcs11.h + * + * \brief Wrapper for PKCS#11 library libpkcs11-helper + * + * \author Adriaan de Jong + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_PKCS11_H +#define MBEDTLS_PKCS11_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#if defined(MBEDTLS_PKCS11_C) + +#include "mbedtls/x509_crt.h" + +#include + +#if (defined(__ARMCC_VERSION) || defined(_MSC_VER)) && \ + !defined(inline) && !defined(__cplusplus) +#define inline __inline +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(MBEDTLS_DEPRECATED_REMOVED) + +/** + * Context for PKCS #11 private keys. + */ +typedef struct mbedtls_pkcs11_context { + pkcs11h_certificate_t pkcs11h_cert; + int len; +} mbedtls_pkcs11_context; + +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif + +/** + * Initialize a mbedtls_pkcs11_context. + * (Just making memory references valid.) + * + * \deprecated This function is deprecated and will be removed in a + * future version of the library. + */ +MBEDTLS_DEPRECATED void mbedtls_pkcs11_init(mbedtls_pkcs11_context *ctx); + +/** + * Fill in a Mbed TLS certificate, based on the given PKCS11 helper certificate. + * + * \deprecated This function is deprecated and will be removed in a + * future version of the library. + * + * \param cert X.509 certificate to fill + * \param pkcs11h_cert PKCS #11 helper certificate + * + * \return 0 on success. + */ +MBEDTLS_DEPRECATED int mbedtls_pkcs11_x509_cert_bind(mbedtls_x509_crt *cert, + pkcs11h_certificate_t pkcs11h_cert); + +/** + * Set up a mbedtls_pkcs11_context storing the given certificate. Note that the + * mbedtls_pkcs11_context will take over control of the certificate, freeing it when + * done. + * + * \deprecated This function is deprecated and will be removed in a + * future version of the library. + * + * \param priv_key Private key structure to fill. + * \param pkcs11_cert PKCS #11 helper certificate + * + * \return 0 on success + */ +MBEDTLS_DEPRECATED int mbedtls_pkcs11_priv_key_bind( + mbedtls_pkcs11_context *priv_key, + pkcs11h_certificate_t pkcs11_cert); + +/** + * Free the contents of the given private key context. Note that the structure + * itself is not freed. + * + * \deprecated This function is deprecated and will be removed in a + * future version of the library. + * + * \param priv_key Private key structure to cleanup + */ +MBEDTLS_DEPRECATED void mbedtls_pkcs11_priv_key_free( + mbedtls_pkcs11_context *priv_key); + +/** + * \brief Do an RSA private key decrypt, then remove the message + * padding + * + * \deprecated This function is deprecated and will be removed in a future + * version of the library. + * + * \param ctx PKCS #11 context + * \param mode must be MBEDTLS_RSA_PRIVATE, for compatibility with rsa.c's signature + * \param input buffer holding the encrypted data + * \param output buffer that will hold the plaintext + * \param olen will contain the plaintext length + * \param output_max_len maximum length of the output buffer + * + * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code + * + * \note The output buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise + * an error is thrown. + */ +MBEDTLS_DEPRECATED int mbedtls_pkcs11_decrypt(mbedtls_pkcs11_context *ctx, + int mode, size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len); + +/** + * \brief Do a private RSA to sign a message digest + * + * \deprecated This function is deprecated and will be removed in a future + * version of the library. + * + * \param ctx PKCS #11 context + * \param mode must be MBEDTLS_RSA_PRIVATE, for compatibility with rsa.c's signature + * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) + * \param hashlen message digest length (for MBEDTLS_MD_NONE only) + * \param hash buffer holding the message digest + * \param sig buffer that will hold the ciphertext + * + * \return 0 if the signing operation was successful, + * or an MBEDTLS_ERR_RSA_XXX error code + * + * \note The "sig" buffer must be as large as the size + * of ctx->N (eg. 128 bytes if RSA-1024 is used). + */ +MBEDTLS_DEPRECATED int mbedtls_pkcs11_sign(mbedtls_pkcs11_context *ctx, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig); + +/** + * SSL/TLS wrappers for PKCS#11 functions + * + * \deprecated This function is deprecated and will be removed in a future + * version of the library. + */ +MBEDTLS_DEPRECATED static inline int mbedtls_ssl_pkcs11_decrypt(void *ctx, + int mode, + size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len) +{ + return mbedtls_pkcs11_decrypt((mbedtls_pkcs11_context *) ctx, mode, olen, input, output, + output_max_len); +} + +/** + * \brief This function signs a message digest using RSA. + * + * \deprecated This function is deprecated and will be removed in a future + * version of the library. + * + * \param ctx The PKCS #11 context. + * \param f_rng The RNG function. This parameter is unused. + * \param p_rng The RNG context. This parameter is unused. + * \param mode The operation to run. This must be set to + * MBEDTLS_RSA_PRIVATE, for compatibility with rsa.c's + * signature. + * \param md_alg The message digest algorithm. One of the MBEDTLS_MD_XXX + * must be passed to this function and MBEDTLS_MD_NONE can be + * used for signing raw data. + * \param hashlen The message digest length (for MBEDTLS_MD_NONE only). + * \param hash The buffer holding the message digest. + * \param sig The buffer that will hold the ciphertext. + * + * \return \c 0 if the signing operation was successful. + * \return A non-zero error code on failure. + * + * \note The \p sig buffer must be as large as the size of + * ctx->N. For example, 128 bytes if RSA-1024 is + * used. + */ +MBEDTLS_DEPRECATED static inline int mbedtls_ssl_pkcs11_sign(void *ctx, + int (*f_rng)(void *, + unsigned char *, + size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig) +{ + ((void) f_rng); + ((void) p_rng); + return mbedtls_pkcs11_sign((mbedtls_pkcs11_context *) ctx, mode, md_alg, + hashlen, hash, sig); +} + +/** + * This function gets the length of the private key. + * + * \deprecated This function is deprecated and will be removed in a future + * version of the library. + * + * \param ctx The PKCS #11 context. + * + * \return The length of the private key. + */ +MBEDTLS_DEPRECATED static inline size_t mbedtls_ssl_pkcs11_key_len(void *ctx) +{ + return ((mbedtls_pkcs11_context *) ctx)->len; +} + +#undef MBEDTLS_DEPRECATED + +#endif /* MBEDTLS_DEPRECATED_REMOVED */ + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_PKCS11_C */ + +#endif /* MBEDTLS_PKCS11_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/pkcs12.h b/ext/opcua_client/mbedtls/include/mbedtls/pkcs12.h new file mode 100644 index 0000000..2ad5e9c --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/pkcs12.h @@ -0,0 +1,202 @@ +/** + * \file pkcs12.h + * + * \brief PKCS#12 Personal Information Exchange Syntax + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_PKCS12_H +#define MBEDTLS_PKCS12_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/md.h" +#include "mbedtls/cipher.h" +#include "mbedtls/asn1.h" + +#include + +/** Bad input parameters to function. */ +#define MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA -0x1F80 +/** Feature not available, e.g. unsupported encryption scheme. */ +#define MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE -0x1F00 +/** PBE ASN.1 data not as expected. */ +#define MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT -0x1E80 +/** Given private key password does not allow for correct decryption. */ +#define MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH -0x1E00 + +#define MBEDTLS_PKCS12_DERIVE_KEY 1 /**< encryption/decryption key */ +#define MBEDTLS_PKCS12_DERIVE_IV 2 /**< initialization vector */ +#define MBEDTLS_PKCS12_DERIVE_MAC_KEY 3 /**< integrity / MAC key */ + +#define MBEDTLS_PKCS12_PBE_DECRYPT 0 +#define MBEDTLS_PKCS12_PBE_ENCRYPT 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(MBEDTLS_ASN1_PARSE_C) + +/** + * \brief PKCS12 Password Based function (encryption / decryption) + * for pbeWithSHAAnd128BitRC4 + * + * \param pbe_params an ASN1 buffer containing the pkcs-12PbeParams structure + * \param mode either MBEDTLS_PKCS12_PBE_ENCRYPT or MBEDTLS_PKCS12_PBE_DECRYPT + * \param pwd the password used (may be NULL if no password is used) + * \param pwdlen length of the password (may be 0) + * \param input the input data + * \param len data length + * \param output the output buffer + * + * \return 0 if successful, or a MBEDTLS_ERR_XXX code + */ +int mbedtls_pkcs12_pbe_sha1_rc4_128(mbedtls_asn1_buf *pbe_params, int mode, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *input, size_t len, + unsigned char *output); + +/** + * \brief PKCS12 Password Based function (encryption / decryption) + * for cipher-based and mbedtls_md-based PBE's + * + * \note When encrypting, #MBEDTLS_CIPHER_PADDING_PKCS7 must + * be enabled at compile time. + * + * \warning When decrypting: + * - if #MBEDTLS_CIPHER_PADDING_PKCS7 is enabled at compile + * time, this function validates the CBC padding and returns + * #MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH if the padding is + * invalid. Note that this can help active adversaries + * attempting to brute-forcing the password. Note also that + * there is no guarantee that an invalid password will be + * detected (the chances of a valid padding with a random + * password are about 1/255). + * - if #MBEDTLS_CIPHER_PADDING_PKCS7 is disabled at compile + * time, this function does not validate the CBC padding. + * + * \param pbe_params an ASN1 buffer containing the pkcs-12 PbeParams structure + * \param mode either #MBEDTLS_PKCS12_PBE_ENCRYPT or + * #MBEDTLS_PKCS12_PBE_DECRYPT + * \param cipher_type the cipher used + * \param md_type the mbedtls_md used + * \param pwd Latin1-encoded password used. This may only be \c NULL when + * \p pwdlen is 0. No null terminator should be used. + * \param pwdlen length of the password (may be 0) + * \param data the input data + * \param len data length + * \param output Output buffer. + * On success, it contains the encrypted or decrypted data, + * possibly followed by the CBC padding. + * On failure, the content is indeterminate. + * For decryption, there must be enough room for \p len + * bytes. + * For encryption, there must be enough room for + * \p len + 1 bytes, rounded up to the block size of + * the block cipher identified by \p pbe_params. + * + * \return 0 if successful, or a MBEDTLS_ERR_XXX code + */ +int mbedtls_pkcs12_pbe(mbedtls_asn1_buf *pbe_params, int mode, + mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t len, + unsigned char *output); + +#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) + +/** + * \brief PKCS12 Password Based function (encryption / decryption) + * for cipher-based and mbedtls_md-based PBE's + * + * + * \warning When decrypting: + * - This function validates the CBC padding and returns + * #MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH if the padding is + * invalid. Note that this can help active adversaries + * attempting to brute-forcing the password. Note also that + * there is no guarantee that an invalid password will be + * detected (the chances of a valid padding with a random + * password are about 1/255). + * + * \param pbe_params an ASN1 buffer containing the pkcs-12 PbeParams structure + * \param mode either #MBEDTLS_PKCS12_PBE_ENCRYPT or + * #MBEDTLS_PKCS12_PBE_DECRYPT + * \param cipher_type the cipher used + * \param md_type the mbedtls_md used + * \param pwd Latin1-encoded password used. This may only be \c NULL when + * \p pwdlen is 0. No null terminator should be used. + * \param pwdlen length of the password (may be 0) + * \param data the input data + * \param len data length + * \param output Output buffer. + * On success, it contains the encrypted or decrypted data, + * possibly followed by the CBC padding. + * On failure, the content is indeterminate. + * For decryption, there must be enough room for \p len + * bytes. + * For encryption, there must be enough room for + * \p len + 1 bytes, rounded up to the block size of + * the block cipher identified by \p pbe_params. + * \param output_size size of output buffer. + * This must be big enough to accommodate for output plus + * padding data. + * \param output_len On success, length of actual data written to the output buffer. + * + * \return 0 if successful, or a MBEDTLS_ERR_XXX code + */ +int mbedtls_pkcs12_pbe_ext(mbedtls_asn1_buf *pbe_params, int mode, + mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t len, + unsigned char *output, size_t output_size, + size_t *output_len); + +#endif /* MBEDTLS_CIPHER_PADDING_PKCS7 */ + +#endif /* MBEDTLS_ASN1_PARSE_C */ + +/** + * \brief The PKCS#12 derivation function uses a password and a salt + * to produce pseudo-random bits for a particular "purpose". + * + * Depending on the given id, this function can produce an + * encryption/decryption key, an initialization vector or an + * integrity key. + * + * \param data buffer to store the derived data in + * \param datalen length of buffer to fill + * \param pwd The password to use. For compliance with PKCS#12 §B.1, this + * should be a BMPString, i.e. a Unicode string where each + * character is encoded as 2 bytes in big-endian order, with + * no byte order mark and with a null terminator (i.e. the + * last two bytes should be 0x00 0x00). + * \param pwdlen length of the password (may be 0). + * \param salt Salt buffer to use This may only be \c NULL when + * \p saltlen is 0. + * \param saltlen length of the salt (may be zero) + * \param mbedtls_md mbedtls_md type to use during the derivation + * \param id id that describes the purpose (can be + * #MBEDTLS_PKCS12_DERIVE_KEY, #MBEDTLS_PKCS12_DERIVE_IV or + * #MBEDTLS_PKCS12_DERIVE_MAC_KEY) + * \param iterations number of iterations + * + * \return 0 if successful, or a MD, BIGNUM type error. + */ +int mbedtls_pkcs12_derivation(unsigned char *data, size_t datalen, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *salt, size_t saltlen, + mbedtls_md_type_t mbedtls_md, int id, int iterations); + +#ifdef __cplusplus +} +#endif + +#endif /* pkcs12.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/pkcs5.h b/ext/opcua_client/mbedtls/include/mbedtls/pkcs5.h new file mode 100644 index 0000000..05bea48 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/pkcs5.h @@ -0,0 +1,165 @@ +/** + * \file pkcs5.h + * + * \brief PKCS#5 functions + * + * \author Mathias Olsson + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_PKCS5_H +#define MBEDTLS_PKCS5_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/asn1.h" +#include "mbedtls/md.h" + +#include +#include + +/** Bad input parameters to function. */ +#define MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA -0x2f80 +/** Unexpected ASN.1 data. */ +#define MBEDTLS_ERR_PKCS5_INVALID_FORMAT -0x2f00 +/** Requested encryption or digest alg not available. */ +#define MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE -0x2e80 +/** Given private key password does not allow for correct decryption. */ +#define MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH -0x2e00 + +#define MBEDTLS_PKCS5_DECRYPT 0 +#define MBEDTLS_PKCS5_ENCRYPT 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(MBEDTLS_ASN1_PARSE_C) + +/** + * \brief PKCS#5 PBES2 function + * + * \note When encrypting, #MBEDTLS_CIPHER_PADDING_PKCS7 must + * be enabled at compile time. + * + * \warning When decrypting: + * - if #MBEDTLS_CIPHER_PADDING_PKCS7 is enabled at compile + * time, this function validates the CBC padding and returns + * #MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH if the padding is + * invalid. Note that this can help active adversaries + * attempting to brute-forcing the password. Note also that + * there is no guarantee that an invalid password will be + * detected (the chances of a valid padding with a random + * password are about 1/255). + * - if #MBEDTLS_CIPHER_PADDING_PKCS7 is disabled at compile + * time, this function does not validate the CBC padding. + * + * \param pbe_params the ASN.1 algorithm parameters + * \param mode either #MBEDTLS_PKCS5_DECRYPT or #MBEDTLS_PKCS5_ENCRYPT + * \param pwd password to use when generating key + * \param pwdlen length of password + * \param data data to process + * \param datalen length of data + * \param output Output buffer. + * On success, it contains the encrypted or decrypted data, + * possibly followed by the CBC padding. + * On failure, the content is indeterminate. + * For decryption, there must be enough room for \p datalen + * bytes. + * For encryption, there must be enough room for + * \p datalen + 1 bytes, rounded up to the block size of + * the block cipher identified by \p pbe_params. + * + * \returns 0 on success, or a MBEDTLS_ERR_XXX code if verification fails. + */ +int mbedtls_pkcs5_pbes2(const mbedtls_asn1_buf *pbe_params, int mode, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t datalen, + unsigned char *output); + +#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) + +/** + * \brief PKCS#5 PBES2 function + * + * \warning When decrypting: + * - This function validates the CBC padding and returns + * #MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH if the padding is + * invalid. Note that this can help active adversaries + * attempting to brute-forcing the password. Note also that + * there is no guarantee that an invalid password will be + * detected (the chances of a valid padding with a random + * password are about 1/255). + * + * \param pbe_params the ASN.1 algorithm parameters + * \param mode either #MBEDTLS_PKCS5_DECRYPT or #MBEDTLS_PKCS5_ENCRYPT + * \param pwd password to use when generating key + * \param pwdlen length of password + * \param data data to process + * \param datalen length of data + * \param output Output buffer. + * On success, it contains the decrypted data. + * On failure, the content is indetermidate. + * For decryption, there must be enough room for \p datalen + * bytes. + * For encryption, there must be enough room for + * \p datalen + 1 bytes, rounded up to the block size of + * the block cipher identified by \p pbe_params. + * \param output_size size of output buffer. + * This must be big enough to accommodate for output plus + * padding data. + * \param output_len On success, length of actual data written to the output buffer. + * + * \returns 0 on success, or a MBEDTLS_ERR_XXX code if parsing or decryption fails. + */ +int mbedtls_pkcs5_pbes2_ext(const mbedtls_asn1_buf *pbe_params, int mode, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t datalen, + unsigned char *output, size_t output_size, + size_t *output_len); + +#endif /* MBEDTLS_CIPHER_PADDING_PKCS7 */ + +#endif /* MBEDTLS_ASN1_PARSE_C */ + +/** + * \brief PKCS#5 PBKDF2 using HMAC + * + * \param ctx Generic HMAC context + * \param password Password to use when generating key + * \param plen Length of password + * \param salt Salt to use when generating key + * \param slen Length of salt + * \param iteration_count Iteration count + * \param key_length Length of generated key in bytes + * \param output Generated key. Must be at least as big as key_length + * + * \returns 0 on success, or a MBEDTLS_ERR_XXX code if verification fails. + */ +int mbedtls_pkcs5_pbkdf2_hmac(mbedtls_md_context_t *ctx, const unsigned char *password, + size_t plen, const unsigned char *salt, size_t slen, + unsigned int iteration_count, + uint32_t key_length, unsigned char *output); + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int mbedtls_pkcs5_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* pkcs5.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/platform.h b/ext/opcua_client/mbedtls/include/mbedtls/platform.h new file mode 100644 index 0000000..1763954 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/platform.h @@ -0,0 +1,437 @@ +/** + * \file platform.h + * + * \brief This file contains the definitions and functions of the + * Mbed TLS platform abstraction layer. + * + * The platform abstraction layer removes the need for the library + * to directly link to standard C library functions or operating + * system services, making the library easier to port and embed. + * Application developers and users of the library can provide their own + * implementations of these functions, or implementations specific to + * their platform, which can be statically linked to the library or + * dynamically configured at runtime. + * + * When all compilation options related to platform abstraction are + * disabled, this header just defines `mbedtls_xxx` function names + * as aliases to the standard `xxx` function. + * + * Most modules in the library and example programs are expected to + * include this header. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_PLATFORM_H +#define MBEDTLS_PLATFORM_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#if defined(MBEDTLS_HAVE_TIME) +#include "mbedtls/platform_time.h" +#endif + +/** Hardware accelerator failed */ +#define MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED -0x0070 +/** The requested feature is not supported by the platform */ +#define MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED -0x0072 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name SECTION: Module settings + * + * The configuration options you can set for this module are in this section. + * Either change them in config.h or define them on the compiler command line. + * \{ + */ + +/* The older Microsoft Windows common runtime provides non-conforming + * implementations of some standard library functions, including snprintf + * and vsnprintf. This affects MSVC and MinGW builds. + */ +#if defined(__MINGW32__) || (defined(_MSC_VER) && _MSC_VER <= 1900) +#define MBEDTLS_PLATFORM_HAS_NON_CONFORMING_SNPRINTF +#define MBEDTLS_PLATFORM_HAS_NON_CONFORMING_VSNPRINTF +#endif + +#if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) +#include +#include +#if defined(MBEDTLS_HAVE_TIME) +#include +#endif +#if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF) +#if defined(MBEDTLS_PLATFORM_HAS_NON_CONFORMING_SNPRINTF) +#define MBEDTLS_PLATFORM_STD_SNPRINTF mbedtls_platform_win32_snprintf /**< The default \c snprintf function to use. */ +#else +#define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< The default \c snprintf function to use. */ +#endif +#endif +#if !defined(MBEDTLS_PLATFORM_STD_VSNPRINTF) +#if defined(MBEDTLS_PLATFORM_HAS_NON_CONFORMING_VSNPRINTF) +#define MBEDTLS_PLATFORM_STD_VSNPRINTF mbedtls_platform_win32_vsnprintf /**< The default \c vsnprintf function to use. */ +#else +#define MBEDTLS_PLATFORM_STD_VSNPRINTF vsnprintf /**< The default \c vsnprintf function to use. */ +#endif +#endif +#if !defined(MBEDTLS_PLATFORM_STD_PRINTF) +#define MBEDTLS_PLATFORM_STD_PRINTF printf /**< The default \c printf function to use. */ +#endif +#if !defined(MBEDTLS_PLATFORM_STD_FPRINTF) +#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< The default \c fprintf function to use. */ +#endif +#if !defined(MBEDTLS_PLATFORM_STD_CALLOC) +#define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< The default \c calloc function to use. */ +#endif +#if !defined(MBEDTLS_PLATFORM_STD_FREE) +#define MBEDTLS_PLATFORM_STD_FREE free /**< The default \c free function to use. */ +#endif +#if !defined(MBEDTLS_PLATFORM_STD_EXIT) +#define MBEDTLS_PLATFORM_STD_EXIT exit /**< The default \c exit function to use. */ +#endif +#if !defined(MBEDTLS_PLATFORM_STD_TIME) +#define MBEDTLS_PLATFORM_STD_TIME time /**< The default \c time function to use. */ +#endif +#if !defined(MBEDTLS_PLATFORM_STD_EXIT_SUCCESS) +#define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS EXIT_SUCCESS /**< The default exit value to use. */ +#endif +#if !defined(MBEDTLS_PLATFORM_STD_EXIT_FAILURE) +#define MBEDTLS_PLATFORM_STD_EXIT_FAILURE EXIT_FAILURE /**< The default exit value to use. */ +#endif +#if defined(MBEDTLS_FS_IO) +#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) +#define MBEDTLS_PLATFORM_STD_NV_SEED_READ mbedtls_platform_std_nv_seed_read +#endif +#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) +#define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE mbedtls_platform_std_nv_seed_write +#endif +#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_FILE) +#define MBEDTLS_PLATFORM_STD_NV_SEED_FILE "seedfile" +#endif +#endif /* MBEDTLS_FS_IO */ +#else /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ +#if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) +#include MBEDTLS_PLATFORM_STD_MEM_HDR +#endif +#endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ + +/* Enable certain documented defines only when generating doxygen to avoid + * an "unrecognized define" error. */ +#if defined(__DOXYGEN__) && !defined(MBEDTLS_PLATFORM_STD_CALLOC) +#define MBEDTLS_PLATFORM_STD_CALLOC +#endif + +#if defined(__DOXYGEN__) && !defined(MBEDTLS_PLATFORM_STD_FREE) +#define MBEDTLS_PLATFORM_STD_FREE +#endif + +/** \} name SECTION: Module settings */ + +/* + * The function pointers for calloc and free. + * Please see MBEDTLS_PLATFORM_STD_CALLOC and MBEDTLS_PLATFORM_STD_FREE + * in mbedtls_config.h for more information about behaviour and requirements. + */ +#if defined(MBEDTLS_PLATFORM_MEMORY) +#if defined(MBEDTLS_PLATFORM_FREE_MACRO) && \ + defined(MBEDTLS_PLATFORM_CALLOC_MACRO) +#undef mbedtls_free +#undef mbedtls_calloc +#define mbedtls_free MBEDTLS_PLATFORM_FREE_MACRO +#define mbedtls_calloc MBEDTLS_PLATFORM_CALLOC_MACRO +#else +/* For size_t */ +#include +extern void *mbedtls_calloc(size_t n, size_t size); +extern void mbedtls_free(void *ptr); + +/** + * \brief This function dynamically sets the memory-management + * functions used by the library, during runtime. + * + * \param calloc_func The \c calloc function implementation. + * \param free_func The \c free function implementation. + * + * \return \c 0. + */ +int mbedtls_platform_set_calloc_free(void *(*calloc_func)(size_t, size_t), + void (*free_func)(void *)); +#endif /* MBEDTLS_PLATFORM_FREE_MACRO && MBEDTLS_PLATFORM_CALLOC_MACRO */ +#else /* !MBEDTLS_PLATFORM_MEMORY */ +#undef mbedtls_free +#undef mbedtls_calloc +#define mbedtls_free free +#define mbedtls_calloc calloc +#endif /* MBEDTLS_PLATFORM_MEMORY && !MBEDTLS_PLATFORM_{FREE,CALLOC}_MACRO */ + +/* + * The function pointers for fprintf + */ +#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) +/* We need FILE * */ +#include +extern int (*mbedtls_fprintf)(FILE *stream, const char *format, ...); + +/** + * \brief This function dynamically configures the fprintf + * function that is called when the + * mbedtls_fprintf() function is invoked by the library. + * + * \param fprintf_func The \c fprintf function implementation. + * + * \return \c 0. + */ +int mbedtls_platform_set_fprintf(int (*fprintf_func)(FILE *stream, const char *, + ...)); +#else +#undef mbedtls_fprintf +#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) +#define mbedtls_fprintf MBEDTLS_PLATFORM_FPRINTF_MACRO +#else +#define mbedtls_fprintf fprintf +#endif /* MBEDTLS_PLATFORM_FPRINTF_MACRO */ +#endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */ + +/* + * The function pointers for printf + */ +#if defined(MBEDTLS_PLATFORM_PRINTF_ALT) +extern int (*mbedtls_printf)(const char *format, ...); + +/** + * \brief This function dynamically configures the snprintf + * function that is called when the mbedtls_snprintf() + * function is invoked by the library. + * + * \param printf_func The \c printf function implementation. + * + * \return \c 0 on success. + */ +int mbedtls_platform_set_printf(int (*printf_func)(const char *, ...)); +#else /* !MBEDTLS_PLATFORM_PRINTF_ALT */ +#undef mbedtls_printf +#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) +#define mbedtls_printf MBEDTLS_PLATFORM_PRINTF_MACRO +#else +#define mbedtls_printf printf +#endif /* MBEDTLS_PLATFORM_PRINTF_MACRO */ +#endif /* MBEDTLS_PLATFORM_PRINTF_ALT */ + +/* + * The function pointers for snprintf + * + * The snprintf implementation should conform to C99: + * - it *must* always correctly zero-terminate the buffer + * (except when n == 0, then it must leave the buffer untouched) + * - however it is acceptable to return -1 instead of the required length when + * the destination buffer is too short. + */ +#if defined(MBEDTLS_PLATFORM_HAS_NON_CONFORMING_SNPRINTF) +/* For Windows (inc. MSYS2), we provide our own fixed implementation */ +int mbedtls_platform_win32_snprintf(char *s, size_t n, const char *fmt, ...); +#endif + +#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) +extern int (*mbedtls_snprintf)(char *s, size_t n, const char *format, ...); + +/** + * \brief This function allows configuring a custom + * \c snprintf function pointer. + * + * \param snprintf_func The \c snprintf function implementation. + * + * \return \c 0 on success. + */ +int mbedtls_platform_set_snprintf(int (*snprintf_func)(char *s, size_t n, + const char *format, ...)); +#else /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ +#undef mbedtls_snprintf +#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) +#define mbedtls_snprintf MBEDTLS_PLATFORM_SNPRINTF_MACRO +#else +#define mbedtls_snprintf MBEDTLS_PLATFORM_STD_SNPRINTF +#endif /* MBEDTLS_PLATFORM_SNPRINTF_MACRO */ +#endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ + +/* + * The function pointers for vsnprintf + * + * The vsnprintf implementation should conform to C99: + * - it *must* always correctly zero-terminate the buffer + * (except when n == 0, then it must leave the buffer untouched) + * - however it is acceptable to return -1 instead of the required length when + * the destination buffer is too short. + */ +#if defined(MBEDTLS_PLATFORM_HAS_NON_CONFORMING_VSNPRINTF) +#include +/* For Older Windows (inc. MSYS2), we provide our own fixed implementation */ +int mbedtls_platform_win32_vsnprintf(char *s, size_t n, const char *fmt, va_list arg); +#endif + +#if defined(MBEDTLS_PLATFORM_VSNPRINTF_ALT) +#include +extern int (*mbedtls_vsnprintf)(char *s, size_t n, const char *format, va_list arg); + +/** + * \brief Set your own snprintf function pointer + * + * \param vsnprintf_func The \c vsnprintf function implementation + * + * \return \c 0 + */ +int mbedtls_platform_set_vsnprintf(int (*vsnprintf_func)(char *s, size_t n, + const char *format, va_list arg)); +#else /* MBEDTLS_PLATFORM_VSNPRINTF_ALT */ +#undef mbedtls_vsnprintf +#if defined(MBEDTLS_PLATFORM_VSNPRINTF_MACRO) +#define mbedtls_vsnprintf MBEDTLS_PLATFORM_VSNPRINTF_MACRO +#else +#define mbedtls_vsnprintf vsnprintf +#endif /* MBEDTLS_PLATFORM_VSNPRINTF_MACRO */ +#endif /* MBEDTLS_PLATFORM_VSNPRINTF_ALT */ + +/* + * The function pointers for exit + */ +#if defined(MBEDTLS_PLATFORM_EXIT_ALT) +extern void (*mbedtls_exit)(int status); + +/** + * \brief This function dynamically configures the exit + * function that is called when the mbedtls_exit() + * function is invoked by the library. + * + * \param exit_func The \c exit function implementation. + * + * \return \c 0 on success. + */ +int mbedtls_platform_set_exit(void (*exit_func)(int status)); +#else +#undef mbedtls_exit +#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) +#define mbedtls_exit MBEDTLS_PLATFORM_EXIT_MACRO +#else +#define mbedtls_exit exit +#endif /* MBEDTLS_PLATFORM_EXIT_MACRO */ +#endif /* MBEDTLS_PLATFORM_EXIT_ALT */ + +/* + * The default exit values + */ +#if defined(MBEDTLS_PLATFORM_STD_EXIT_SUCCESS) +#define MBEDTLS_EXIT_SUCCESS MBEDTLS_PLATFORM_STD_EXIT_SUCCESS +#else +#define MBEDTLS_EXIT_SUCCESS 0 +#endif +#if defined(MBEDTLS_PLATFORM_STD_EXIT_FAILURE) +#define MBEDTLS_EXIT_FAILURE MBEDTLS_PLATFORM_STD_EXIT_FAILURE +#else +#define MBEDTLS_EXIT_FAILURE 1 +#endif + +/* + * The function pointers for reading from and writing a seed file to + * Non-Volatile storage (NV) in a platform-independent way + * + * Only enabled when the NV seed entropy source is enabled + */ +#if defined(MBEDTLS_ENTROPY_NV_SEED) +#if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) && defined(MBEDTLS_FS_IO) +/* Internal standard platform definitions */ +int mbedtls_platform_std_nv_seed_read(unsigned char *buf, size_t buf_len); +int mbedtls_platform_std_nv_seed_write(unsigned char *buf, size_t buf_len); +#endif + +#if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) +extern int (*mbedtls_nv_seed_read)(unsigned char *buf, size_t buf_len); +extern int (*mbedtls_nv_seed_write)(unsigned char *buf, size_t buf_len); + +/** + * \brief This function allows configuring custom seed file writing and + * reading functions. + * + * \param nv_seed_read_func The seed reading function implementation. + * \param nv_seed_write_func The seed writing function implementation. + * + * \return \c 0 on success. + */ +int mbedtls_platform_set_nv_seed( + int (*nv_seed_read_func)(unsigned char *buf, size_t buf_len), + int (*nv_seed_write_func)(unsigned char *buf, size_t buf_len) + ); +#else +#undef mbedtls_nv_seed_read +#undef mbedtls_nv_seed_write +#if defined(MBEDTLS_PLATFORM_NV_SEED_READ_MACRO) && \ + defined(MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO) +#define mbedtls_nv_seed_read MBEDTLS_PLATFORM_NV_SEED_READ_MACRO +#define mbedtls_nv_seed_write MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO +#else +#define mbedtls_nv_seed_read mbedtls_platform_std_nv_seed_read +#define mbedtls_nv_seed_write mbedtls_platform_std_nv_seed_write +#endif +#endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */ +#endif /* MBEDTLS_ENTROPY_NV_SEED */ + +#if !defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT) + +/** + * \brief The platform context structure. + * + * \note This structure may be used to assist platform-specific + * setup or teardown operations. + */ +typedef struct mbedtls_platform_context { + char dummy; /**< A placeholder member, as empty structs are not portable. */ +} +mbedtls_platform_context; + +#else +#include "platform_alt.h" +#endif /* !MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */ + +/** + * \brief This function performs any platform-specific initialization + * operations. + * + * \note This function should be called before any other library functions. + * + * Its implementation is platform-specific, and unless + * platform-specific code is provided, it does nothing. + * + * \note The usage and necessity of this function is dependent on the platform. + * + * \param ctx The platform context. + * + * \return \c 0 on success. + */ +int mbedtls_platform_setup(mbedtls_platform_context *ctx); +/** + * \brief This function performs any platform teardown operations. + * + * \note This function should be called after every other Mbed TLS module + * has been correctly freed using the appropriate free function. + * + * Its implementation is platform-specific, and unless + * platform-specific code is provided, it does nothing. + * + * \note The usage and necessity of this function is dependent on the platform. + * + * \param ctx The platform context. + * + */ +void mbedtls_platform_teardown(mbedtls_platform_context *ctx); + +#ifdef __cplusplus +} +#endif + +#endif /* platform.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/platform_time.h b/ext/opcua_client/mbedtls/include/mbedtls/platform_time.h new file mode 100644 index 0000000..9671c88 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/platform_time.h @@ -0,0 +1,60 @@ +/** + * \file platform_time.h + * + * \brief Mbed TLS Platform time abstraction + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_PLATFORM_TIME_H +#define MBEDTLS_PLATFORM_TIME_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The time_t datatype + */ +#if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) +typedef MBEDTLS_PLATFORM_TIME_TYPE_MACRO mbedtls_time_t; +#else +/* For time_t */ +#include +typedef time_t mbedtls_time_t; +#endif /* MBEDTLS_PLATFORM_TIME_TYPE_MACRO */ + +/* + * The function pointers for time + */ +#if defined(MBEDTLS_PLATFORM_TIME_ALT) +extern mbedtls_time_t (*mbedtls_time)(mbedtls_time_t *time); + +/** + * \brief Set your own time function pointer + * + * \param time_func the time function implementation + * + * \return 0 + */ +int mbedtls_platform_set_time(mbedtls_time_t (*time_func)(mbedtls_time_t *time)); +#else +#if defined(MBEDTLS_PLATFORM_TIME_MACRO) +#define mbedtls_time MBEDTLS_PLATFORM_TIME_MACRO +#else +#define mbedtls_time time +#endif /* MBEDTLS_PLATFORM_TIME_MACRO */ +#endif /* MBEDTLS_PLATFORM_TIME_ALT */ + +#ifdef __cplusplus +} +#endif + +#endif /* platform_time.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/platform_util.h b/ext/opcua_client/mbedtls/include/mbedtls/platform_util.h new file mode 100644 index 0000000..74e2a1d --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/platform_util.h @@ -0,0 +1,277 @@ +/** + * \file platform_util.h + * + * \brief Common and shared functions used by multiple modules in the Mbed TLS + * library. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_PLATFORM_UTIL_H +#define MBEDTLS_PLATFORM_UTIL_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#if defined(MBEDTLS_HAVE_TIME_DATE) +#include "mbedtls/platform_time.h" +#include +#endif /* MBEDTLS_HAVE_TIME_DATE */ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(MBEDTLS_CHECK_PARAMS) + +#if defined(MBEDTLS_CHECK_PARAMS_ASSERT) +/* Allow the user to define MBEDTLS_PARAM_FAILED to something like assert + * (which is what our config.h suggests). */ +#include +#endif /* MBEDTLS_CHECK_PARAMS_ASSERT */ + +#if defined(MBEDTLS_PARAM_FAILED) +/** An alternative definition of MBEDTLS_PARAM_FAILED has been set in config.h. + * + * This flag can be used to check whether it is safe to assume that + * MBEDTLS_PARAM_FAILED() will expand to a call to mbedtls_param_failed(). + */ +#define MBEDTLS_PARAM_FAILED_ALT + +#elif defined(MBEDTLS_CHECK_PARAMS_ASSERT) +#define MBEDTLS_PARAM_FAILED(cond) assert(cond) +#define MBEDTLS_PARAM_FAILED_ALT + +#else /* MBEDTLS_PARAM_FAILED */ +#define MBEDTLS_PARAM_FAILED(cond) \ + mbedtls_param_failed( #cond, __FILE__, __LINE__) + +/** + * \brief User supplied callback function for parameter validation failure. + * See #MBEDTLS_CHECK_PARAMS for context. + * + * This function will be called unless an alternative treatment + * is defined through the #MBEDTLS_PARAM_FAILED macro. + * + * This function can return, and the operation will be aborted, or + * alternatively, through use of setjmp()/longjmp() can resume + * execution in the application code. + * + * \param failure_condition The assertion that didn't hold. + * \param file The file where the assertion failed. + * \param line The line in the file where the assertion failed. + */ +void mbedtls_param_failed(const char *failure_condition, + const char *file, + int line); +#endif /* MBEDTLS_PARAM_FAILED */ + +/* Internal macro meant to be called only from within the library. */ +#define MBEDTLS_INTERNAL_VALIDATE_RET(cond, ret) \ + do { \ + if (!(cond)) \ + { \ + MBEDTLS_PARAM_FAILED(cond); \ + return ret; \ + } \ + } while (0) + +/* Internal macro meant to be called only from within the library. */ +#define MBEDTLS_INTERNAL_VALIDATE(cond) \ + do { \ + if (!(cond)) \ + { \ + MBEDTLS_PARAM_FAILED(cond); \ + return; \ + } \ + } while (0) + +#else /* MBEDTLS_CHECK_PARAMS */ + +/* Internal macros meant to be called only from within the library. */ +#define MBEDTLS_INTERNAL_VALIDATE_RET(cond, ret) do { } while (0) +#define MBEDTLS_INTERNAL_VALIDATE(cond) do { } while (0) + +#endif /* MBEDTLS_CHECK_PARAMS */ + +/* Internal helper macros for deprecating API constants. */ +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +/* Deliberately don't (yet) export MBEDTLS_DEPRECATED here + * to avoid conflict with other headers which define and use + * it, too. We might want to move all these definitions here at + * some point for uniformity. */ +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +MBEDTLS_DEPRECATED typedef char const *mbedtls_deprecated_string_constant_t; +#define MBEDTLS_DEPRECATED_STRING_CONSTANT(VAL) \ + ((mbedtls_deprecated_string_constant_t) (VAL)) +MBEDTLS_DEPRECATED typedef int mbedtls_deprecated_numeric_constant_t; +#define MBEDTLS_DEPRECATED_NUMERIC_CONSTANT(VAL) \ + ((mbedtls_deprecated_numeric_constant_t) (VAL)) +#undef MBEDTLS_DEPRECATED +#else /* MBEDTLS_DEPRECATED_WARNING */ +#define MBEDTLS_DEPRECATED_STRING_CONSTANT(VAL) VAL +#define MBEDTLS_DEPRECATED_NUMERIC_CONSTANT(VAL) VAL +#endif /* MBEDTLS_DEPRECATED_WARNING */ +#endif /* MBEDTLS_DEPRECATED_REMOVED */ + +/* Implementation of the check-return facility. + * See the user documentation in config.h. + * + * Do not use this macro directly to annotate function: instead, + * use one of MBEDTLS_CHECK_RETURN_CRITICAL or MBEDTLS_CHECK_RETURN_TYPICAL + * depending on how important it is to check the return value. + */ +#if !defined(MBEDTLS_CHECK_RETURN) +#if defined(__GNUC__) +#define MBEDTLS_CHECK_RETURN __attribute__((__warn_unused_result__)) +#elif defined(_MSC_VER) && _MSC_VER >= 1700 +#include +#define MBEDTLS_CHECK_RETURN _Check_return_ +#else +#define MBEDTLS_CHECK_RETURN +#endif +#endif + +/** Critical-failure function + * + * This macro appearing at the beginning of the declaration of a function + * indicates that its return value should be checked in all applications. + * Omitting the check is very likely to indicate a bug in the application + * and will result in a compile-time warning if #MBEDTLS_CHECK_RETURN + * is implemented for the compiler in use. + * + * \note The use of this macro is a work in progress. + * This macro may be added to more functions in the future. + * Such an extension is not considered an API break, provided that + * there are near-unavoidable circumstances under which the function + * can fail. For example, signature/MAC/AEAD verification functions, + * and functions that require a random generator, are considered + * return-check-critical. + */ +#define MBEDTLS_CHECK_RETURN_CRITICAL MBEDTLS_CHECK_RETURN + +/** Ordinary-failure function + * + * This macro appearing at the beginning of the declaration of a function + * indicates that its return value should be generally be checked in portable + * applications. Omitting the check will result in a compile-time warning if + * #MBEDTLS_CHECK_RETURN is implemented for the compiler in use and + * #MBEDTLS_CHECK_RETURN_WARNING is enabled in the compile-time configuration. + * + * You can use #MBEDTLS_IGNORE_RETURN to explicitly ignore the return value + * of a function that is annotated with #MBEDTLS_CHECK_RETURN. + * + * \note The use of this macro is a work in progress. + * This macro will be added to more functions in the future. + * Eventually this should appear before most functions returning + * an error code (as \c int in the \c mbedtls_xxx API or + * as ::psa_status_t in the \c psa_xxx API). + */ +#if defined(MBEDTLS_CHECK_RETURN_WARNING) +#define MBEDTLS_CHECK_RETURN_TYPICAL MBEDTLS_CHECK_RETURN +#else +#define MBEDTLS_CHECK_RETURN_TYPICAL +#endif + +/** Benign-failure function + * + * This macro appearing at the beginning of the declaration of a function + * indicates that it is rarely useful to check its return value. + * + * This macro has an empty expansion. It exists for documentation purposes: + * a #MBEDTLS_CHECK_RETURN_OPTIONAL annotation indicates that the function + * has been analyzed for return-check usefulness, whereas the lack of + * an annotation indicates that the function has not been analyzed and its + * return-check usefulness is unknown. + */ +#define MBEDTLS_CHECK_RETURN_OPTIONAL + +/** \def MBEDTLS_IGNORE_RETURN + * + * Call this macro with one argument, a function call, to suppress a warning + * from #MBEDTLS_CHECK_RETURN due to that function call. + */ +#if !defined(MBEDTLS_IGNORE_RETURN) +/* GCC doesn't silence the warning with just (void)(result). + * (void)!(result) is known to work up at least up to GCC 10, as well + * as with Clang and MSVC. + * + * https://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Non_002dbugs.html + * https://stackoverflow.com/questions/40576003/ignoring-warning-wunused-result + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425#c34 + */ +#define MBEDTLS_IGNORE_RETURN(result) ((void) !(result)) +#endif + +/* If the following macro is defined, the library is being built by the test + * framework, and the framework is going to provide a replacement + * mbedtls_platform_zeroize() using a preprocessor macro, so the function + * declaration should be omitted. */ +#if !defined(MBEDTLS_TEST_DEFINES_ZEROIZE) //no-check-names +/** + * \brief Securely zeroize a buffer + * + * The function is meant to wipe the data contained in a buffer so + * that it can no longer be recovered even if the program memory + * is later compromised. Call this function on sensitive data + * stored on the stack before returning from a function, and on + * sensitive data stored on the heap before freeing the heap + * object. + * + * It is extremely difficult to guarantee that calls to + * mbedtls_platform_zeroize() are not removed by aggressive + * compiler optimizations in a portable way. For this reason, Mbed + * TLS provides the configuration option + * MBEDTLS_PLATFORM_ZEROIZE_ALT, which allows users to configure + * mbedtls_platform_zeroize() to use a suitable implementation for + * their platform and needs + * + * \param buf Buffer to be zeroized + * \param len Length of the buffer in bytes + * + */ +void mbedtls_platform_zeroize(void *buf, size_t len); +#endif + +#if defined(MBEDTLS_HAVE_TIME_DATE) +/** + * \brief Platform-specific implementation of gmtime_r() + * + * The function is a thread-safe abstraction that behaves + * similarly to the gmtime_r() function from Unix/POSIX. + * + * Mbed TLS will try to identify the underlying platform and + * make use of an appropriate underlying implementation (e.g. + * gmtime_r() for POSIX and gmtime_s() for Windows). If this is + * not possible, then gmtime() will be used. In this case, calls + * from the library to gmtime() will be guarded by the mutex + * mbedtls_threading_gmtime_mutex if MBEDTLS_THREADING_C is + * enabled. It is recommended that calls from outside the library + * are also guarded by this mutex. + * + * If MBEDTLS_PLATFORM_GMTIME_R_ALT is defined, then Mbed TLS will + * unconditionally use the alternative implementation for + * mbedtls_platform_gmtime_r() supplied by the user at compile time. + * + * \param tt Pointer to an object containing time (in seconds) since the + * epoch to be converted + * \param tm_buf Pointer to an object where the results will be stored + * + * \return Pointer to an object of type struct tm on success, otherwise + * NULL + */ +struct tm *mbedtls_platform_gmtime_r(const mbedtls_time_t *tt, + struct tm *tm_buf); +#endif /* MBEDTLS_HAVE_TIME_DATE */ + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_PLATFORM_UTIL_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/poly1305.h b/ext/opcua_client/mbedtls/include/mbedtls/poly1305.h new file mode 100644 index 0000000..ecbd984 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/poly1305.h @@ -0,0 +1,181 @@ +/** + * \file poly1305.h + * + * \brief This file contains Poly1305 definitions and functions. + * + * Poly1305 is a one-time message authenticator that can be used to + * authenticate messages. Poly1305-AES was created by Daniel + * Bernstein https://cr.yp.to/mac/poly1305-20050329.pdf The generic + * Poly1305 algorithm (not tied to AES) was also standardized in RFC + * 7539. + * + * \author Daniel King + */ + +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_POLY1305_H +#define MBEDTLS_POLY1305_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +/** Invalid input parameter(s). */ +#define MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA -0x0057 + +/* MBEDTLS_ERR_POLY1305_FEATURE_UNAVAILABLE is deprecated and should not be + * used. */ +/** Feature not available. For example, s part of the API is not implemented. */ +#define MBEDTLS_ERR_POLY1305_FEATURE_UNAVAILABLE -0x0059 + +/* MBEDTLS_ERR_POLY1305_HW_ACCEL_FAILED is deprecated and should not be used. + */ +/** Poly1305 hardware accelerator failed. */ +#define MBEDTLS_ERR_POLY1305_HW_ACCEL_FAILED -0x005B + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_POLY1305_ALT) + +typedef struct mbedtls_poly1305_context { + uint32_t r[4]; /** The value for 'r' (low 128 bits of the key). */ + uint32_t s[4]; /** The value for 's' (high 128 bits of the key). */ + uint32_t acc[5]; /** The accumulator number. */ + uint8_t queue[16]; /** The current partial block of data. */ + size_t queue_len; /** The number of bytes stored in 'queue'. */ +} +mbedtls_poly1305_context; + +#else /* MBEDTLS_POLY1305_ALT */ +#include "poly1305_alt.h" +#endif /* MBEDTLS_POLY1305_ALT */ + +/** + * \brief This function initializes the specified Poly1305 context. + * + * It must be the first API called before using + * the context. + * + * It is usually followed by a call to + * \c mbedtls_poly1305_starts(), then one or more calls to + * \c mbedtls_poly1305_update(), then one call to + * \c mbedtls_poly1305_finish(), then finally + * \c mbedtls_poly1305_free(). + * + * \param ctx The Poly1305 context to initialize. This must + * not be \c NULL. + */ +void mbedtls_poly1305_init(mbedtls_poly1305_context *ctx); + +/** + * \brief This function releases and clears the specified + * Poly1305 context. + * + * \param ctx The Poly1305 context to clear. This may be \c NULL, in which + * case this function is a no-op. If it is not \c NULL, it must + * point to an initialized Poly1305 context. + */ +void mbedtls_poly1305_free(mbedtls_poly1305_context *ctx); + +/** + * \brief This function sets the one-time authentication key. + * + * \warning The key must be unique and unpredictable for each + * invocation of Poly1305. + * + * \param ctx The Poly1305 context to which the key should be bound. + * This must be initialized. + * \param key The buffer containing the \c 32 Byte (\c 256 Bit) key. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_poly1305_starts(mbedtls_poly1305_context *ctx, + const unsigned char key[32]); + +/** + * \brief This functions feeds an input buffer into an ongoing + * Poly1305 computation. + * + * It is called between \c mbedtls_cipher_poly1305_starts() and + * \c mbedtls_cipher_poly1305_finish(). + * It can be called repeatedly to process a stream of data. + * + * \param ctx The Poly1305 context to use for the Poly1305 operation. + * This must be initialized and bound to a key. + * \param ilen The length of the input data in Bytes. + * Any value is accepted. + * \param input The buffer holding the input data. + * This pointer can be \c NULL if `ilen == 0`. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_poly1305_update(mbedtls_poly1305_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief This function generates the Poly1305 Message + * Authentication Code (MAC). + * + * \param ctx The Poly1305 context to use for the Poly1305 operation. + * This must be initialized and bound to a key. + * \param mac The buffer to where the MAC is written. This must + * be a writable buffer of length \c 16 Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_poly1305_finish(mbedtls_poly1305_context *ctx, + unsigned char mac[16]); + +/** + * \brief This function calculates the Poly1305 MAC of the input + * buffer with the provided key. + * + * \warning The key must be unique and unpredictable for each + * invocation of Poly1305. + * + * \param key The buffer containing the \c 32 Byte (\c 256 Bit) key. + * \param ilen The length of the input data in Bytes. + * Any value is accepted. + * \param input The buffer holding the input data. + * This pointer can be \c NULL if `ilen == 0`. + * \param mac The buffer to where the MAC is written. This must be + * a writable buffer of length \c 16 Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_poly1305_mac(const unsigned char key[32], + const unsigned char *input, + size_t ilen, + unsigned char mac[16]); + +#if defined(MBEDTLS_SELF_TEST) +/** + * \brief The Poly1305 checkup routine. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +int mbedtls_poly1305_self_test(int verbose); +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_POLY1305_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/psa_util.h b/ext/opcua_client/mbedtls/include/mbedtls/psa_util.h new file mode 100644 index 0000000..6d7e444 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/psa_util.h @@ -0,0 +1,494 @@ +/** + * \file psa_util.h + * + * \brief Utility functions for the use of the PSA Crypto library. + * + * \warning This function is not part of the public API and may + * change at any time. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_PSA_UTIL_H +#define MBEDTLS_PSA_UTIL_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + +#include "psa/crypto.h" + +#include "mbedtls/ecp.h" +#include "mbedtls/md.h" +#include "mbedtls/pk.h" +#include "mbedtls/oid.h" + +#include + +/* Translations for symmetric crypto. */ + +static inline psa_key_type_t mbedtls_psa_translate_cipher_type( + mbedtls_cipher_type_t cipher) +{ + switch (cipher) { + case MBEDTLS_CIPHER_AES_128_CCM: + case MBEDTLS_CIPHER_AES_192_CCM: + case MBEDTLS_CIPHER_AES_256_CCM: + case MBEDTLS_CIPHER_AES_128_GCM: + case MBEDTLS_CIPHER_AES_192_GCM: + case MBEDTLS_CIPHER_AES_256_GCM: + case MBEDTLS_CIPHER_AES_128_CBC: + case MBEDTLS_CIPHER_AES_192_CBC: + case MBEDTLS_CIPHER_AES_256_CBC: + case MBEDTLS_CIPHER_AES_128_ECB: + case MBEDTLS_CIPHER_AES_192_ECB: + case MBEDTLS_CIPHER_AES_256_ECB: + return PSA_KEY_TYPE_AES; + + /* ARIA not yet supported in PSA. */ + /* case MBEDTLS_CIPHER_ARIA_128_CCM: + case MBEDTLS_CIPHER_ARIA_192_CCM: + case MBEDTLS_CIPHER_ARIA_256_CCM: + case MBEDTLS_CIPHER_ARIA_128_GCM: + case MBEDTLS_CIPHER_ARIA_192_GCM: + case MBEDTLS_CIPHER_ARIA_256_GCM: + case MBEDTLS_CIPHER_ARIA_128_CBC: + case MBEDTLS_CIPHER_ARIA_192_CBC: + case MBEDTLS_CIPHER_ARIA_256_CBC: + return( PSA_KEY_TYPE_ARIA ); */ + + default: + return 0; + } +} + +static inline psa_algorithm_t mbedtls_psa_translate_cipher_mode( + mbedtls_cipher_mode_t mode, size_t taglen) +{ + switch (mode) { + case MBEDTLS_MODE_ECB: + return PSA_ALG_ECB_NO_PADDING; + case MBEDTLS_MODE_GCM: + return PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_GCM, taglen); + case MBEDTLS_MODE_CCM: + return PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, taglen); + case MBEDTLS_MODE_CBC: + if (taglen == 0) { + return PSA_ALG_CBC_NO_PADDING; + } else { + return 0; + } + default: + return 0; + } +} + +static inline psa_key_usage_t mbedtls_psa_translate_cipher_operation( + mbedtls_operation_t op) +{ + switch (op) { + case MBEDTLS_ENCRYPT: + return PSA_KEY_USAGE_ENCRYPT; + case MBEDTLS_DECRYPT: + return PSA_KEY_USAGE_DECRYPT; + default: + return 0; + } +} + +/* Translations for hashing. */ + +static inline psa_algorithm_t mbedtls_psa_translate_md(mbedtls_md_type_t md_alg) +{ + switch (md_alg) { +#if defined(MBEDTLS_MD2_C) + case MBEDTLS_MD_MD2: + return PSA_ALG_MD2; +#endif +#if defined(MBEDTLS_MD4_C) + case MBEDTLS_MD_MD4: + return PSA_ALG_MD4; +#endif +#if defined(MBEDTLS_MD5_C) + case MBEDTLS_MD_MD5: + return PSA_ALG_MD5; +#endif +#if defined(MBEDTLS_SHA1_C) + case MBEDTLS_MD_SHA1: + return PSA_ALG_SHA_1; +#endif +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_MD_SHA224: + return PSA_ALG_SHA_224; + case MBEDTLS_MD_SHA256: + return PSA_ALG_SHA_256; +#endif +#if defined(MBEDTLS_SHA512_C) + case MBEDTLS_MD_SHA384: + return PSA_ALG_SHA_384; + case MBEDTLS_MD_SHA512: + return PSA_ALG_SHA_512; +#endif +#if defined(MBEDTLS_RIPEMD160_C) + case MBEDTLS_MD_RIPEMD160: + return PSA_ALG_RIPEMD160; +#endif + case MBEDTLS_MD_NONE: + return 0; + default: + return 0; + } +} + +/* Translations for ECC. */ + +static inline int mbedtls_psa_get_ecc_oid_from_id( + psa_ecc_family_t curve, size_t bits, + char const **oid, size_t *oid_len) +{ + switch (curve) { + case PSA_ECC_FAMILY_SECP_R1: + switch (bits) { +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) + case 192: + *oid = MBEDTLS_OID_EC_GRP_SECP192R1; + *oid_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_EC_GRP_SECP192R1); + return 0; +#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) + case 224: + *oid = MBEDTLS_OID_EC_GRP_SECP224R1; + *oid_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_EC_GRP_SECP224R1); + return 0; +#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) + case 256: + *oid = MBEDTLS_OID_EC_GRP_SECP256R1; + *oid_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_EC_GRP_SECP256R1); + return 0; +#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) + case 384: + *oid = MBEDTLS_OID_EC_GRP_SECP384R1; + *oid_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_EC_GRP_SECP384R1); + return 0; +#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) + case 521: + *oid = MBEDTLS_OID_EC_GRP_SECP521R1; + *oid_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_EC_GRP_SECP521R1); + return 0; +#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ + } + break; + case PSA_ECC_FAMILY_SECP_K1: + switch (bits) { +#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) + case 192: + *oid = MBEDTLS_OID_EC_GRP_SECP192K1; + *oid_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_EC_GRP_SECP192K1); + return 0; +#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) + case 224: + *oid = MBEDTLS_OID_EC_GRP_SECP224K1; + *oid_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_EC_GRP_SECP224K1); + return 0; +#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) + case 256: + *oid = MBEDTLS_OID_EC_GRP_SECP256K1; + *oid_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_EC_GRP_SECP256K1); + return 0; +#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ + } + break; + case PSA_ECC_FAMILY_BRAINPOOL_P_R1: + switch (bits) { +#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) + case 256: + *oid = MBEDTLS_OID_EC_GRP_BP256R1; + *oid_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_EC_GRP_BP256R1); + return 0; +#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) + case 384: + *oid = MBEDTLS_OID_EC_GRP_BP384R1; + *oid_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_EC_GRP_BP384R1); + return 0; +#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) + case 512: + *oid = MBEDTLS_OID_EC_GRP_BP512R1; + *oid_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_EC_GRP_BP512R1); + return 0; +#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ + } + break; + } + (void) oid; + (void) oid_len; + return -1; +} + +#define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH 1 + +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) +#if MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH < (2 * ((192 + 7) / 8) + 1) +#undef MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH +#define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH (2 * ((192 + 7) / 8) + 1) +#endif +#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) +#if MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH < (2 * ((224 + 7) / 8) + 1) +#undef MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH +#define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH (2 * ((224 + 7) / 8) + 1) +#endif +#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) +#if MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH < (2 * ((256 + 7) / 8) + 1) +#undef MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH +#define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH (2 * ((256 + 7) / 8) + 1) +#endif +#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) +#if MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH < (2 * ((384 + 7) / 8) + 1) +#undef MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH +#define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH (2 * ((384 + 7) / 8) + 1) +#endif +#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) +#if MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH < (2 * ((521 + 7) / 8) + 1) +#undef MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH +#define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH (2 * ((521 + 7) / 8) + 1) +#endif +#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) +#if MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH < (2 * ((192 + 7) / 8) + 1) +#undef MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH +#define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH (2 * ((192 + 7) / 8) + 1) +#endif +#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) +#if MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH < (2 * ((224 + 7) / 8) + 1) +#undef MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH +#define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH (2 * ((224 + 7) / 8) + 1) +#endif +#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) +#if MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH < (2 * ((256 + 7) / 8) + 1) +#undef MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH +#define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH (2 * ((256 + 7) / 8) + 1) +#endif +#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) +#if MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH < (2 * ((256 + 7) / 8) + 1) +#undef MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH +#define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH (2 * ((256 + 7) / 8) + 1) +#endif +#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) +#if MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH < (2 * ((384 + 7) / 8) + 1) +#undef MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH +#define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH (2 * ((384 + 7) / 8) + 1) +#endif +#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) +#if MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH < (2 * ((512 + 7) / 8) + 1) +#undef MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH +#define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH (2 * ((512 + 7) / 8) + 1) +#endif +#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ + + +/* Translations for PK layer */ + +static inline int mbedtls_psa_err_translate_pk(psa_status_t status) +{ + switch (status) { + case PSA_SUCCESS: + return 0; + case PSA_ERROR_NOT_SUPPORTED: + return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE; + case PSA_ERROR_INSUFFICIENT_MEMORY: + return MBEDTLS_ERR_PK_ALLOC_FAILED; + case PSA_ERROR_INSUFFICIENT_ENTROPY: + return MBEDTLS_ERR_ECP_RANDOM_FAILED; + case PSA_ERROR_BAD_STATE: + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + /* All other failures */ + case PSA_ERROR_COMMUNICATION_FAILURE: + case PSA_ERROR_HARDWARE_FAILURE: + case PSA_ERROR_CORRUPTION_DETECTED: + return MBEDTLS_ERR_PK_HW_ACCEL_FAILED; + default: /* We return the same as for the 'other failures', + * but list them separately nonetheless to indicate + * which failure conditions we have considered. */ + return MBEDTLS_ERR_PK_HW_ACCEL_FAILED; + } +} + +/* Translations for ECC */ + +/* This function transforms an ECC group identifier from + * https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8 + * into a PSA ECC group identifier. */ +#if defined(MBEDTLS_ECP_C) +static inline psa_key_type_t mbedtls_psa_parse_tls_ecc_group( + uint16_t tls_ecc_grp_reg_id, size_t *bits) +{ + const mbedtls_ecp_curve_info *curve_info = + mbedtls_ecp_curve_info_from_tls_id(tls_ecc_grp_reg_id); + if (curve_info == NULL) { + return 0; + } + return PSA_KEY_TYPE_ECC_KEY_PAIR( + mbedtls_ecc_group_to_psa(curve_info->grp_id, bits)); +} +#endif /* MBEDTLS_ECP_C */ + +/* This function takes a buffer holding an EC public key + * exported through psa_export_public_key(), and converts + * it into an ECPoint structure to be put into a ClientKeyExchange + * message in an ECDHE exchange. + * + * Both the present and the foreseeable future format of EC public keys + * used by PSA have the ECPoint structure contained in the exported key + * as a subbuffer, and the function merely selects this subbuffer instead + * of making a copy. + */ +static inline int mbedtls_psa_tls_psa_ec_to_ecpoint(unsigned char *src, + size_t srclen, + unsigned char **dst, + size_t *dstlen) +{ + *dst = src; + *dstlen = srclen; + return 0; +} + +/* This function takes a buffer holding an ECPoint structure + * (as contained in a TLS ServerKeyExchange message for ECDHE + * exchanges) and converts it into a format that the PSA key + * agreement API understands. + */ +static inline int mbedtls_psa_tls_ecpoint_to_psa_ec(unsigned char const *src, + size_t srclen, + unsigned char *dst, + size_t dstlen, + size_t *olen) +{ + if (srclen > dstlen) { + return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + } + + memcpy(dst, src, srclen); + *olen = srclen; + return 0; +} + +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +/* Expose whatever RNG the PSA subsystem uses to applications using the + * mbedtls_xxx API. The declarations and definitions here need to be + * consistent with the implementation in library/psa_crypto_random_impl.h. + * See that file for implementation documentation. */ +#if defined(MBEDTLS_PSA_CRYPTO_C) + +/* The type of a `f_rng` random generator function that many library functions + * take. + * + * This type name is not part of the Mbed TLS stable API. It may be renamed + * or moved without warning. + */ +typedef int mbedtls_f_rng_t(void *p_rng, unsigned char *output, size_t output_size); + +#if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) + +/** The random generator function for the PSA subsystem. + * + * This function is suitable as the `f_rng` random generator function + * parameter of many `mbedtls_xxx` functions. Use #MBEDTLS_PSA_RANDOM_STATE + * to obtain the \p p_rng parameter. + * + * The implementation of this function depends on the configuration of the + * library. + * + * \note Depending on the configuration, this may be a function or + * a pointer to a function. + * + * \note This function may only be used if the PSA crypto subsystem is active. + * This means that you must call psa_crypto_init() before any call to + * this function, and you must not call this function after calling + * mbedtls_psa_crypto_free(). + * + * \param p_rng The random generator context. This must be + * #MBEDTLS_PSA_RANDOM_STATE. No other state is + * supported. + * \param output The buffer to fill. It must have room for + * \c output_size bytes. + * \param output_size The number of bytes to write to \p output. + * This function may fail if \p output_size is too + * large. It is guaranteed to accept any output size + * requested by Mbed TLS library functions. The + * maximum request size depends on the library + * configuration. + * + * \return \c 0 on success. + * \return An `MBEDTLS_ERR_ENTROPY_xxx`, + * `MBEDTLS_ERR_PLATFORM_xxx, + * `MBEDTLS_ERR_CTR_DRBG_xxx` or + * `MBEDTLS_ERR_HMAC_DRBG_xxx` on error. + */ +int mbedtls_psa_get_random(void *p_rng, + unsigned char *output, + size_t output_size); + +/** The random generator state for the PSA subsystem. + * + * This macro expands to an expression which is suitable as the `p_rng` + * random generator state parameter of many `mbedtls_xxx` functions. + * It must be used in combination with the random generator function + * mbedtls_psa_get_random(). + * + * The implementation of this macro depends on the configuration of the + * library. Do not make any assumption on its nature. + */ +#define MBEDTLS_PSA_RANDOM_STATE NULL + +#else /* !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) */ + +#if defined(MBEDTLS_CTR_DRBG_C) +#include "mbedtls/ctr_drbg.h" +typedef mbedtls_ctr_drbg_context mbedtls_psa_drbg_context_t; +static mbedtls_f_rng_t *const mbedtls_psa_get_random = mbedtls_ctr_drbg_random; +#elif defined(MBEDTLS_HMAC_DRBG_C) +#include "mbedtls/hmac_drbg.h" +typedef mbedtls_hmac_drbg_context mbedtls_psa_drbg_context_t; +static mbedtls_f_rng_t *const mbedtls_psa_get_random = mbedtls_hmac_drbg_random; +#endif +extern mbedtls_psa_drbg_context_t *const mbedtls_psa_random_state; + +#define MBEDTLS_PSA_RANDOM_STATE mbedtls_psa_random_state + +#endif /* !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) */ + +#endif /* MBEDTLS_PSA_CRYPTO_C */ + +#endif /* MBEDTLS_PSA_UTIL_H */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ripemd160.h b/ext/opcua_client/mbedtls/include/mbedtls/ripemd160.h new file mode 100644 index 0000000..38318a2 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ripemd160.h @@ -0,0 +1,223 @@ +/** + * \file ripemd160.h + * + * \brief RIPE MD-160 message digest + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_RIPEMD160_H +#define MBEDTLS_RIPEMD160_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +/* MBEDTLS_ERR_RIPEMD160_HW_ACCEL_FAILED is deprecated and should not be used. + */ +/** RIPEMD160 hardware accelerator failed */ +#define MBEDTLS_ERR_RIPEMD160_HW_ACCEL_FAILED -0x0031 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_RIPEMD160_ALT) +// Regular implementation +// + +/** + * \brief RIPEMD-160 context structure + */ +typedef struct mbedtls_ripemd160_context { + uint32_t total[2]; /*!< number of bytes processed */ + uint32_t state[5]; /*!< intermediate digest state */ + unsigned char buffer[64]; /*!< data block being processed */ +} +mbedtls_ripemd160_context; + +#else /* MBEDTLS_RIPEMD160_ALT */ +#include "ripemd160_alt.h" +#endif /* MBEDTLS_RIPEMD160_ALT */ + +/** + * \brief Initialize RIPEMD-160 context + * + * \param ctx RIPEMD-160 context to be initialized + */ +void mbedtls_ripemd160_init(mbedtls_ripemd160_context *ctx); + +/** + * \brief Clear RIPEMD-160 context + * + * \param ctx RIPEMD-160 context to be cleared + */ +void mbedtls_ripemd160_free(mbedtls_ripemd160_context *ctx); + +/** + * \brief Clone (the state of) a RIPEMD-160 context + * + * \param dst The destination context + * \param src The context to be cloned + */ +void mbedtls_ripemd160_clone(mbedtls_ripemd160_context *dst, + const mbedtls_ripemd160_context *src); + +/** + * \brief RIPEMD-160 context setup + * + * \param ctx context to be initialized + * + * \return 0 if successful + */ +int mbedtls_ripemd160_starts_ret(mbedtls_ripemd160_context *ctx); + +/** + * \brief RIPEMD-160 process buffer + * + * \param ctx RIPEMD-160 context + * \param input buffer holding the data + * \param ilen length of the input data + * + * \return 0 if successful + */ +int mbedtls_ripemd160_update_ret(mbedtls_ripemd160_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief RIPEMD-160 final digest + * + * \param ctx RIPEMD-160 context + * \param output RIPEMD-160 checksum result + * + * \return 0 if successful + */ +int mbedtls_ripemd160_finish_ret(mbedtls_ripemd160_context *ctx, + unsigned char output[20]); + +/** + * \brief RIPEMD-160 process data block (internal use only) + * + * \param ctx RIPEMD-160 context + * \param data buffer holding one block of data + * + * \return 0 if successful + */ +int mbedtls_internal_ripemd160_process(mbedtls_ripemd160_context *ctx, + const unsigned char data[64]); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief RIPEMD-160 context setup + * + * \deprecated Superseded by mbedtls_ripemd160_starts_ret() in 2.7.0 + * + * \param ctx context to be initialized + */ +MBEDTLS_DEPRECATED void mbedtls_ripemd160_starts( + mbedtls_ripemd160_context *ctx); + +/** + * \brief RIPEMD-160 process buffer + * + * \deprecated Superseded by mbedtls_ripemd160_update_ret() in 2.7.0 + * + * \param ctx RIPEMD-160 context + * \param input buffer holding the data + * \param ilen length of the input data + */ +MBEDTLS_DEPRECATED void mbedtls_ripemd160_update( + mbedtls_ripemd160_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief RIPEMD-160 final digest + * + * \deprecated Superseded by mbedtls_ripemd160_finish_ret() in 2.7.0 + * + * \param ctx RIPEMD-160 context + * \param output RIPEMD-160 checksum result + */ +MBEDTLS_DEPRECATED void mbedtls_ripemd160_finish( + mbedtls_ripemd160_context *ctx, + unsigned char output[20]); + +/** + * \brief RIPEMD-160 process data block (internal use only) + * + * \deprecated Superseded by mbedtls_internal_ripemd160_process() in 2.7.0 + * + * \param ctx RIPEMD-160 context + * \param data buffer holding one block of data + */ +MBEDTLS_DEPRECATED void mbedtls_ripemd160_process( + mbedtls_ripemd160_context *ctx, + const unsigned char data[64]); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +/** + * \brief Output = RIPEMD-160( input buffer ) + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output RIPEMD-160 checksum result + * + * \return 0 if successful + */ +int mbedtls_ripemd160_ret(const unsigned char *input, + size_t ilen, + unsigned char output[20]); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief Output = RIPEMD-160( input buffer ) + * + * \deprecated Superseded by mbedtls_ripemd160_ret() in 2.7.0 + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output RIPEMD-160 checksum result + */ +MBEDTLS_DEPRECATED void mbedtls_ripemd160(const unsigned char *input, + size_t ilen, + unsigned char output[20]); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int mbedtls_ripemd160_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* mbedtls_ripemd160.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/rsa.h b/ext/opcua_client/mbedtls/include/mbedtls/rsa.h new file mode 100644 index 0000000..1779775 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/rsa.h @@ -0,0 +1,1347 @@ +/** + * \file rsa.h + * + * \brief This file provides an API for the RSA public-key cryptosystem. + * + * The RSA public-key cryptosystem is defined in Public-Key + * Cryptography Standards (PKCS) #1 v1.5: RSA Encryption + * and Public-Key Cryptography Standards (PKCS) #1 v2.1: + * RSA Cryptography Specifications. + * + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_RSA_H +#define MBEDTLS_RSA_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/bignum.h" +#include "mbedtls/md.h" + +#if defined(MBEDTLS_THREADING_C) +#include "mbedtls/threading.h" +#endif + +/* + * RSA Error codes + */ +/** Bad input parameters to function. */ +#define MBEDTLS_ERR_RSA_BAD_INPUT_DATA -0x4080 +/** Input data contains invalid padding and is rejected. */ +#define MBEDTLS_ERR_RSA_INVALID_PADDING -0x4100 +/** Something failed during generation of a key. */ +#define MBEDTLS_ERR_RSA_KEY_GEN_FAILED -0x4180 +/** Key failed to pass the validity check of the library. */ +#define MBEDTLS_ERR_RSA_KEY_CHECK_FAILED -0x4200 +/** The public key operation failed. */ +#define MBEDTLS_ERR_RSA_PUBLIC_FAILED -0x4280 +/** The private key operation failed. */ +#define MBEDTLS_ERR_RSA_PRIVATE_FAILED -0x4300 +/** The PKCS#1 verification failed. */ +#define MBEDTLS_ERR_RSA_VERIFY_FAILED -0x4380 +/** The output buffer for decryption is not large enough. */ +#define MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE -0x4400 +/** The random generator failed to generate non-zeros. */ +#define MBEDTLS_ERR_RSA_RNG_FAILED -0x4480 + +/* MBEDTLS_ERR_RSA_UNSUPPORTED_OPERATION is deprecated and should not be used. + */ +/** The implementation does not offer the requested operation, for example, because of security violations or lack of functionality. */ +#define MBEDTLS_ERR_RSA_UNSUPPORTED_OPERATION -0x4500 + +/* MBEDTLS_ERR_RSA_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** RSA hardware accelerator failed. */ +#define MBEDTLS_ERR_RSA_HW_ACCEL_FAILED -0x4580 + +/* + * RSA constants + */ +#define MBEDTLS_RSA_PUBLIC 0 /**< Request private key operation. */ +#define MBEDTLS_RSA_PRIVATE 1 /**< Request public key operation. */ + +#define MBEDTLS_RSA_PKCS_V15 0 /**< Use PKCS#1 v1.5 encoding. */ +#define MBEDTLS_RSA_PKCS_V21 1 /**< Use PKCS#1 v2.1 encoding. */ + +#define MBEDTLS_RSA_SIGN 1 /**< Identifier for RSA signature operations. */ +#define MBEDTLS_RSA_CRYPT 2 /**< Identifier for RSA encryption and decryption operations. */ + +#define MBEDTLS_RSA_SALT_LEN_ANY -1 + +/* + * The above constants may be used even if the RSA module is compile out, + * eg for alternative (PKCS#11) RSA implementations in the PK layers. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_RSA_ALT) +// Regular implementation +// + +/** + * \brief The RSA context structure. + * + * \note Direct manipulation of the members of this structure + * is deprecated. All manipulation should instead be done through + * the public interface functions. + */ +typedef struct mbedtls_rsa_context { + int ver; /*!< Reserved for internal purposes. + * Do not set this field in application + * code. Its meaning might change without + * notice. */ + size_t len; /*!< The size of \p N in Bytes. */ + + mbedtls_mpi N; /*!< The public modulus. */ + mbedtls_mpi E; /*!< The public exponent. */ + + mbedtls_mpi D; /*!< The private exponent. */ + mbedtls_mpi P; /*!< The first prime factor. */ + mbedtls_mpi Q; /*!< The second prime factor. */ + + mbedtls_mpi DP; /*!< D % (P - 1). */ + mbedtls_mpi DQ; /*!< D % (Q - 1). */ + mbedtls_mpi QP; /*!< 1 / (Q % P). */ + + mbedtls_mpi RN; /*!< cached R^2 mod N. */ + + mbedtls_mpi RP; /*!< cached R^2 mod P. */ + mbedtls_mpi RQ; /*!< cached R^2 mod Q. */ + + mbedtls_mpi Vi; /*!< The cached blinding value. */ + mbedtls_mpi Vf; /*!< The cached un-blinding value. */ + + int padding; /*!< Selects padding mode: + #MBEDTLS_RSA_PKCS_V15 for 1.5 padding and + #MBEDTLS_RSA_PKCS_V21 for OAEP or PSS. */ + int hash_id; /*!< Hash identifier of mbedtls_md_type_t type, + as specified in md.h for use in the MGF + mask generating function used in the + EME-OAEP and EMSA-PSS encodings. */ +#if defined(MBEDTLS_THREADING_C) + /* Invariant: the mutex is initialized iff ver != 0. */ + mbedtls_threading_mutex_t mutex; /*!< Thread-safety mutex. */ +#endif +} +mbedtls_rsa_context; + +#else /* MBEDTLS_RSA_ALT */ +#include "rsa_alt.h" +#endif /* MBEDTLS_RSA_ALT */ + +/** + * \brief This function initializes an RSA context. + * + * \note Set padding to #MBEDTLS_RSA_PKCS_V21 for the RSAES-OAEP + * encryption scheme and the RSASSA-PSS signature scheme. + * + * \note The \p hash_id parameter is ignored when using + * #MBEDTLS_RSA_PKCS_V15 padding. + * + * \note The choice of padding mode is strictly enforced for private key + * operations, since there might be security concerns in + * mixing padding modes. For public key operations it is + * a default value, which can be overridden by calling specific + * \c rsa_rsaes_xxx or \c rsa_rsassa_xxx functions. + * + * \note The hash selected in \p hash_id is always used for OEAP + * encryption. For PSS signatures, it is always used for + * making signatures, but can be overridden for verifying them. + * If set to #MBEDTLS_MD_NONE, it is always overridden. + * + * \param ctx The RSA context to initialize. This must not be \c NULL. + * \param padding The padding mode to use. This must be either + * #MBEDTLS_RSA_PKCS_V15 or #MBEDTLS_RSA_PKCS_V21. + * \param hash_id The hash identifier of ::mbedtls_md_type_t type, if + * \p padding is #MBEDTLS_RSA_PKCS_V21. It is unused + * otherwise. + */ +void mbedtls_rsa_init(mbedtls_rsa_context *ctx, + int padding, + int hash_id); + +/** + * \brief This function imports a set of core parameters into an + * RSA context. + * + * \note This function can be called multiple times for successive + * imports, if the parameters are not simultaneously present. + * + * Any sequence of calls to this function should be followed + * by a call to mbedtls_rsa_complete(), which checks and + * completes the provided information to a ready-for-use + * public or private RSA key. + * + * \note See mbedtls_rsa_complete() for more information on which + * parameters are necessary to set up a private or public + * RSA key. + * + * \note The imported parameters are copied and need not be preserved + * for the lifetime of the RSA context being set up. + * + * \param ctx The initialized RSA context to store the parameters in. + * \param N The RSA modulus. This may be \c NULL. + * \param P The first prime factor of \p N. This may be \c NULL. + * \param Q The second prime factor of \p N. This may be \c NULL. + * \param D The private exponent. This may be \c NULL. + * \param E The public exponent. This may be \c NULL. + * + * \return \c 0 on success. + * \return A non-zero error code on failure. + */ +int mbedtls_rsa_import(mbedtls_rsa_context *ctx, + const mbedtls_mpi *N, + const mbedtls_mpi *P, const mbedtls_mpi *Q, + const mbedtls_mpi *D, const mbedtls_mpi *E); + +/** + * \brief This function imports core RSA parameters, in raw big-endian + * binary format, into an RSA context. + * + * \note This function can be called multiple times for successive + * imports, if the parameters are not simultaneously present. + * + * Any sequence of calls to this function should be followed + * by a call to mbedtls_rsa_complete(), which checks and + * completes the provided information to a ready-for-use + * public or private RSA key. + * + * \note See mbedtls_rsa_complete() for more information on which + * parameters are necessary to set up a private or public + * RSA key. + * + * \note The imported parameters are copied and need not be preserved + * for the lifetime of the RSA context being set up. + * + * \param ctx The initialized RSA context to store the parameters in. + * \param N The RSA modulus. This may be \c NULL. + * \param N_len The Byte length of \p N; it is ignored if \p N == NULL. + * \param P The first prime factor of \p N. This may be \c NULL. + * \param P_len The Byte length of \p P; it ns ignored if \p P == NULL. + * \param Q The second prime factor of \p N. This may be \c NULL. + * \param Q_len The Byte length of \p Q; it is ignored if \p Q == NULL. + * \param D The private exponent. This may be \c NULL. + * \param D_len The Byte length of \p D; it is ignored if \p D == NULL. + * \param E The public exponent. This may be \c NULL. + * \param E_len The Byte length of \p E; it is ignored if \p E == NULL. + * + * \return \c 0 on success. + * \return A non-zero error code on failure. + */ +int mbedtls_rsa_import_raw(mbedtls_rsa_context *ctx, + unsigned char const *N, size_t N_len, + unsigned char const *P, size_t P_len, + unsigned char const *Q, size_t Q_len, + unsigned char const *D, size_t D_len, + unsigned char const *E, size_t E_len); + +/** + * \brief This function completes an RSA context from + * a set of imported core parameters. + * + * To setup an RSA public key, precisely \c N and \c E + * must have been imported. + * + * To setup an RSA private key, sufficient information must + * be present for the other parameters to be derivable. + * + * The default implementation supports the following: + *
  • Derive \c P, \c Q from \c N, \c D, \c E.
  • + *
  • Derive \c N, \c D from \c P, \c Q, \c E.
+ * Alternative implementations need not support these. + * + * If this function runs successfully, it guarantees that + * the RSA context can be used for RSA operations without + * the risk of failure or crash. + * + * \warning This function need not perform consistency checks + * for the imported parameters. In particular, parameters that + * are not needed by the implementation might be silently + * discarded and left unchecked. To check the consistency + * of the key material, see mbedtls_rsa_check_privkey(). + * + * \param ctx The initialized RSA context holding imported parameters. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_RSA_BAD_INPUT_DATA if the attempted derivations + * failed. + * + */ +int mbedtls_rsa_complete(mbedtls_rsa_context *ctx); + +/** + * \brief This function exports the core parameters of an RSA key. + * + * If this function runs successfully, the non-NULL buffers + * pointed to by \p N, \p P, \p Q, \p D, and \p E are fully + * written, with additional unused space filled leading by + * zero Bytes. + * + * Possible reasons for returning + * #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED:
    + *
  • An alternative RSA implementation is in use, which + * stores the key externally, and either cannot or should + * not export it into RAM.
  • + *
  • A SW or HW implementation might not support a certain + * deduction. For example, \p P, \p Q from \p N, \p D, + * and \p E if the former are not part of the + * implementation.
+ * + * If the function fails due to an unsupported operation, + * the RSA context stays intact and remains usable. + * + * \param ctx The initialized RSA context. + * \param N The MPI to hold the RSA modulus. + * This may be \c NULL if this field need not be exported. + * \param P The MPI to hold the first prime factor of \p N. + * This may be \c NULL if this field need not be exported. + * \param Q The MPI to hold the second prime factor of \p N. + * This may be \c NULL if this field need not be exported. + * \param D The MPI to hold the private exponent. + * This may be \c NULL if this field need not be exported. + * \param E The MPI to hold the public exponent. + * This may be \c NULL if this field need not be exported. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED if exporting the + * requested parameters cannot be done due to missing + * functionality or because of security policies. + * \return A non-zero return code on any other failure. + * + */ +int mbedtls_rsa_export(const mbedtls_rsa_context *ctx, + mbedtls_mpi *N, mbedtls_mpi *P, mbedtls_mpi *Q, + mbedtls_mpi *D, mbedtls_mpi *E); + +/** + * \brief This function exports core parameters of an RSA key + * in raw big-endian binary format. + * + * If this function runs successfully, the non-NULL buffers + * pointed to by \p N, \p P, \p Q, \p D, and \p E are fully + * written, with additional unused space filled leading by + * zero Bytes. + * + * Possible reasons for returning + * #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED:
    + *
  • An alternative RSA implementation is in use, which + * stores the key externally, and either cannot or should + * not export it into RAM.
  • + *
  • A SW or HW implementation might not support a certain + * deduction. For example, \p P, \p Q from \p N, \p D, + * and \p E if the former are not part of the + * implementation.
+ * If the function fails due to an unsupported operation, + * the RSA context stays intact and remains usable. + * + * \note The length parameters are ignored if the corresponding + * buffer pointers are NULL. + * + * \param ctx The initialized RSA context. + * \param N The Byte array to store the RSA modulus, + * or \c NULL if this field need not be exported. + * \param N_len The size of the buffer for the modulus. + * \param P The Byte array to hold the first prime factor of \p N, + * or \c NULL if this field need not be exported. + * \param P_len The size of the buffer for the first prime factor. + * \param Q The Byte array to hold the second prime factor of \p N, + * or \c NULL if this field need not be exported. + * \param Q_len The size of the buffer for the second prime factor. + * \param D The Byte array to hold the private exponent, + * or \c NULL if this field need not be exported. + * \param D_len The size of the buffer for the private exponent. + * \param E The Byte array to hold the public exponent, + * or \c NULL if this field need not be exported. + * \param E_len The size of the buffer for the public exponent. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED if exporting the + * requested parameters cannot be done due to missing + * functionality or because of security policies. + * \return A non-zero return code on any other failure. + */ +int mbedtls_rsa_export_raw(const mbedtls_rsa_context *ctx, + unsigned char *N, size_t N_len, + unsigned char *P, size_t P_len, + unsigned char *Q, size_t Q_len, + unsigned char *D, size_t D_len, + unsigned char *E, size_t E_len); + +/** + * \brief This function exports CRT parameters of a private RSA key. + * + * \note Alternative RSA implementations not using CRT-parameters + * internally can implement this function based on + * mbedtls_rsa_deduce_opt(). + * + * \param ctx The initialized RSA context. + * \param DP The MPI to hold \c D modulo `P-1`, + * or \c NULL if it need not be exported. + * \param DQ The MPI to hold \c D modulo `Q-1`, + * or \c NULL if it need not be exported. + * \param QP The MPI to hold modular inverse of \c Q modulo \c P, + * or \c NULL if it need not be exported. + * + * \return \c 0 on success. + * \return A non-zero error code on failure. + * + */ +int mbedtls_rsa_export_crt(const mbedtls_rsa_context *ctx, + mbedtls_mpi *DP, mbedtls_mpi *DQ, mbedtls_mpi *QP); + +/** + * \brief This function sets padding for an already initialized RSA + * context. See mbedtls_rsa_init() for details. + * + * \param ctx The initialized RSA context to be configured. + * \param padding The padding mode to use. This must be either + * #MBEDTLS_RSA_PKCS_V15 or #MBEDTLS_RSA_PKCS_V21. + * \param hash_id The #MBEDTLS_RSA_PKCS_V21 hash identifier. + */ +void mbedtls_rsa_set_padding(mbedtls_rsa_context *ctx, int padding, + int hash_id); + +/** + * \brief This function retrieves the length of RSA modulus in Bytes. + * + * \param ctx The initialized RSA context. + * + * \return The length of the RSA modulus in Bytes. + * + */ +size_t mbedtls_rsa_get_len(const mbedtls_rsa_context *ctx); + +/** + * \brief This function generates an RSA keypair. + * + * \note mbedtls_rsa_init() must be called before this function, + * to set up the RSA context. + * + * \param ctx The initialized RSA context used to hold the key. + * \param f_rng The RNG function to be used for key generation. + * This must not be \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. + * This may be \c NULL if \p f_rng doesn't need a context. + * \param nbits The size of the public key in bits. + * \param exponent The public exponent to use. For example, \c 65537. + * This must be odd and greater than \c 1. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_gen_key(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + unsigned int nbits, int exponent); + +/** + * \brief This function checks if a context contains at least an RSA + * public key. + * + * If the function runs successfully, it is guaranteed that + * enough information is present to perform an RSA public key + * operation using mbedtls_rsa_public(). + * + * \param ctx The initialized RSA context to check. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + * + */ +int mbedtls_rsa_check_pubkey(const mbedtls_rsa_context *ctx); + +/** + * \brief This function checks if a context contains an RSA private key + * and perform basic consistency checks. + * + * \note The consistency checks performed by this function not only + * ensure that mbedtls_rsa_private() can be called successfully + * on the given context, but that the various parameters are + * mutually consistent with high probability, in the sense that + * mbedtls_rsa_public() and mbedtls_rsa_private() are inverses. + * + * \warning This function should catch accidental misconfigurations + * like swapping of parameters, but it cannot establish full + * trust in neither the quality nor the consistency of the key + * material that was used to setup the given RSA context: + *
  • Consistency: Imported parameters that are irrelevant + * for the implementation might be silently dropped. If dropped, + * the current function does not have access to them, + * and therefore cannot check them. See mbedtls_rsa_complete(). + * If you want to check the consistency of the entire + * content of a PKCS1-encoded RSA private key, for example, you + * should use mbedtls_rsa_validate_params() before setting + * up the RSA context. + * Additionally, if the implementation performs empirical checks, + * these checks substantiate but do not guarantee consistency.
  • + *
  • Quality: This function is not expected to perform + * extended quality assessments like checking that the prime + * factors are safe. Additionally, it is the responsibility of the + * user to ensure the trustworthiness of the source of his RSA + * parameters, which goes beyond what is effectively checkable + * by the library.
+ * + * \param ctx The initialized RSA context to check. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_check_privkey(const mbedtls_rsa_context *ctx); + +/** + * \brief This function checks a public-private RSA key pair. + * + * It checks each of the contexts, and makes sure they match. + * + * \param pub The initialized RSA context holding the public key. + * \param prv The initialized RSA context holding the private key. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_check_pub_priv(const mbedtls_rsa_context *pub, + const mbedtls_rsa_context *prv); + +/** + * \brief This function performs an RSA public key operation. + * + * \param ctx The initialized RSA context to use. + * \param input The input buffer. This must be a readable buffer + * of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * \param output The output buffer. This must be a writable buffer + * of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * + * \note This function does not handle message padding. + * + * \note Make sure to set \p input[0] = 0 or ensure that + * input is smaller than \c N. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_public(mbedtls_rsa_context *ctx, + const unsigned char *input, + unsigned char *output); + +/** + * \brief This function performs an RSA private key operation. + * + * \note Blinding is used if and only if a PRNG is provided. + * + * \note If blinding is used, both the base of exponentiation + * and the exponent are blinded, providing protection + * against some side-channel attacks. + * + * \warning It is deprecated and a security risk to not provide + * a PRNG here and thereby prevent the use of blinding. + * Future versions of the library may enforce the presence + * of a PRNG. + * + * \param ctx The initialized RSA context to use. + * \param f_rng The RNG function, used for blinding. It is discouraged + * and deprecated to pass \c NULL here, in which case + * blinding will be omitted. + * \param p_rng The RNG context to pass to \p f_rng. This may be \c NULL + * if \p f_rng is \c NULL or if \p f_rng doesn't need a context. + * \param input The input buffer. This must be a readable buffer + * of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * \param output The output buffer. This must be a writable buffer + * of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + * + */ +int mbedtls_rsa_private(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + const unsigned char *input, + unsigned char *output); + +/** + * \brief This function adds the message padding, then performs an RSA + * operation. + * + * It is the generic wrapper for performing a PKCS#1 encryption + * operation using the \p mode from the context. + * + * \deprecated It is deprecated and discouraged to call this function + * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library + * are likely to remove the \p mode argument and have it + * implicitly set to #MBEDTLS_RSA_PUBLIC. + * + * \note Alternative implementations of RSA need not support + * mode being set to #MBEDTLS_RSA_PRIVATE and might instead + * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. + * + * \param ctx The initialized RSA context to use. + * \param f_rng The RNG to use. It is mandatory for PKCS#1 v2.1 padding + * encoding, and for PKCS#1 v1.5 padding encoding when used + * with \p mode set to #MBEDTLS_RSA_PUBLIC. For PKCS#1 v1.5 + * padding encoding and \p mode set to #MBEDTLS_RSA_PRIVATE, + * it is used for blinding and should be provided in this + * case; see mbedtls_rsa_private() for more. + * \param p_rng The RNG context to be passed to \p f_rng. May be + * \c NULL if \p f_rng is \c NULL or if \p f_rng doesn't + * need a context argument. + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). + * \param ilen The length of the plaintext in Bytes. + * \param input The input data to encrypt. This must be a readable + * buffer of size \p ilen Bytes. It may be \c NULL if + * `ilen == 0`. + * \param output The output buffer. This must be a writable buffer + * of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_pkcs1_encrypt(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, size_t ilen, + const unsigned char *input, + unsigned char *output); + +/** + * \brief This function performs a PKCS#1 v1.5 encryption operation + * (RSAES-PKCS1-v1_5-ENCRYPT). + * + * \deprecated It is deprecated and discouraged to call this function + * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library + * are likely to remove the \p mode argument and have it + * implicitly set to #MBEDTLS_RSA_PUBLIC. + * + * \note Alternative implementations of RSA need not support + * mode being set to #MBEDTLS_RSA_PRIVATE and might instead + * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. + * + * \param ctx The initialized RSA context to use. + * \param f_rng The RNG function to use. It is needed for padding generation + * if \p mode is #MBEDTLS_RSA_PUBLIC. If \p mode is + * #MBEDTLS_RSA_PRIVATE (discouraged), it is used for + * blinding and should be provided; see mbedtls_rsa_private(). + * \param p_rng The RNG context to be passed to \p f_rng. This may + * be \c NULL if \p f_rng is \c NULL or if \p f_rng + * doesn't need a context argument. + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). + * \param ilen The length of the plaintext in Bytes. + * \param input The input data to encrypt. This must be a readable + * buffer of size \p ilen Bytes. It may be \c NULL if + * `ilen == 0`. + * \param output The output buffer. This must be a writable buffer + * of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_rsaes_pkcs1_v15_encrypt(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, size_t ilen, + const unsigned char *input, + unsigned char *output); + +/** + * \brief This function performs a PKCS#1 v2.1 OAEP encryption + * operation (RSAES-OAEP-ENCRYPT). + * + * \note The output buffer must be as large as the size + * of ctx->N. For example, 128 Bytes if RSA-1024 is used. + * + * \deprecated It is deprecated and discouraged to call this function + * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library + * are likely to remove the \p mode argument and have it + * implicitly set to #MBEDTLS_RSA_PUBLIC. + * + * \note Alternative implementations of RSA need not support + * mode being set to #MBEDTLS_RSA_PRIVATE and might instead + * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. + * + * \param ctx The initialized RSA context to use. + * \param f_rng The RNG function to use. This is needed for padding + * generation and must be provided. + * \param p_rng The RNG context to be passed to \p f_rng. This may + * be \c NULL if \p f_rng doesn't need a context argument. + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). + * \param label The buffer holding the custom label to use. + * This must be a readable buffer of length \p label_len + * Bytes. It may be \c NULL if \p label_len is \c 0. + * \param label_len The length of the label in Bytes. + * \param ilen The length of the plaintext buffer \p input in Bytes. + * \param input The input data to encrypt. This must be a readable + * buffer of size \p ilen Bytes. It may be \c NULL if + * `ilen == 0`. + * \param output The output buffer. This must be a writable buffer + * of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_rsaes_oaep_encrypt(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + const unsigned char *label, size_t label_len, + size_t ilen, + const unsigned char *input, + unsigned char *output); + +/** + * \brief This function performs an RSA operation, then removes the + * message padding. + * + * It is the generic wrapper for performing a PKCS#1 decryption + * operation using the \p mode from the context. + * + * \warning When \p ctx->padding is set to #MBEDTLS_RSA_PKCS_V15, + * mbedtls_rsa_rsaes_pkcs1_v15_decrypt() is called, which is an + * inherently dangerous function (CWE-242). + * + * \note The output buffer length \c output_max_len should be + * as large as the size \p ctx->len of \p ctx->N (for example, + * 128 Bytes if RSA-1024 is used) to be able to hold an + * arbitrary decrypted message. If it is not large enough to + * hold the decryption of the particular ciphertext provided, + * the function returns \c MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE. + * + * \deprecated It is deprecated and discouraged to call this function + * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library + * are likely to remove the \p mode argument and have it + * implicitly set to #MBEDTLS_RSA_PRIVATE. + * + * \note Alternative implementations of RSA need not support + * mode being set to #MBEDTLS_RSA_PUBLIC and might instead + * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. + * + * \param ctx The initialized RSA context to use. + * \param f_rng The RNG function. If \p mode is #MBEDTLS_RSA_PRIVATE, + * this is used for blinding and should be provided; see + * mbedtls_rsa_private() for more. If \p mode is + * #MBEDTLS_RSA_PUBLIC, it is ignored. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL if \p f_rng is \c NULL or doesn't need a context. + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). + * \param olen The address at which to store the length of + * the plaintext. This must not be \c NULL. + * \param input The ciphertext buffer. This must be a readable buffer + * of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * \param output The buffer used to hold the plaintext. This must + * be a writable buffer of length \p output_max_len Bytes. + * \param output_max_len The length in Bytes of the output buffer \p output. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_pkcs1_decrypt(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len); + +/** + * \brief This function performs a PKCS#1 v1.5 decryption + * operation (RSAES-PKCS1-v1_5-DECRYPT). + * + * \warning This is an inherently dangerous function (CWE-242). Unless + * it is used in a side channel free and safe way (eg. + * implementing the TLS protocol as per 7.4.7.1 of RFC 5246), + * the calling code is vulnerable. + * + * \note The output buffer length \c output_max_len should be + * as large as the size \p ctx->len of \p ctx->N, for example, + * 128 Bytes if RSA-1024 is used, to be able to hold an + * arbitrary decrypted message. If it is not large enough to + * hold the decryption of the particular ciphertext provided, + * the function returns #MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE. + * + * \deprecated It is deprecated and discouraged to call this function + * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library + * are likely to remove the \p mode argument and have it + * implicitly set to #MBEDTLS_RSA_PRIVATE. + * + * \note Alternative implementations of RSA need not support + * mode being set to #MBEDTLS_RSA_PUBLIC and might instead + * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. + * + * \param ctx The initialized RSA context to use. + * \param f_rng The RNG function. If \p mode is #MBEDTLS_RSA_PRIVATE, + * this is used for blinding and should be provided; see + * mbedtls_rsa_private() for more. If \p mode is + * #MBEDTLS_RSA_PUBLIC, it is ignored. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL if \p f_rng is \c NULL or doesn't need a context. + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). + * \param olen The address at which to store the length of + * the plaintext. This must not be \c NULL. + * \param input The ciphertext buffer. This must be a readable buffer + * of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * \param output The buffer used to hold the plaintext. This must + * be a writable buffer of length \p output_max_len Bytes. + * \param output_max_len The length in Bytes of the output buffer \p output. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + * + */ +int mbedtls_rsa_rsaes_pkcs1_v15_decrypt(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len); + +/** + * \brief This function performs a PKCS#1 v2.1 OAEP decryption + * operation (RSAES-OAEP-DECRYPT). + * + * \note The output buffer length \c output_max_len should be + * as large as the size \p ctx->len of \p ctx->N, for + * example, 128 Bytes if RSA-1024 is used, to be able to + * hold an arbitrary decrypted message. If it is not + * large enough to hold the decryption of the particular + * ciphertext provided, the function returns + * #MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE. + * + * \deprecated It is deprecated and discouraged to call this function + * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library + * are likely to remove the \p mode argument and have it + * implicitly set to #MBEDTLS_RSA_PRIVATE. + * + * \note Alternative implementations of RSA need not support + * mode being set to #MBEDTLS_RSA_PUBLIC and might instead + * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. + * + * \param ctx The initialized RSA context to use. + * \param f_rng The RNG function. If \p mode is #MBEDTLS_RSA_PRIVATE, + * this is used for blinding and should be provided; see + * mbedtls_rsa_private() for more. If \p mode is + * #MBEDTLS_RSA_PUBLIC, it is ignored. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL if \p f_rng is \c NULL or doesn't need a context. + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). + * \param label The buffer holding the custom label to use. + * This must be a readable buffer of length \p label_len + * Bytes. It may be \c NULL if \p label_len is \c 0. + * \param label_len The length of the label in Bytes. + * \param olen The address at which to store the length of + * the plaintext. This must not be \c NULL. + * \param input The ciphertext buffer. This must be a readable buffer + * of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * \param output The buffer used to hold the plaintext. This must + * be a writable buffer of length \p output_max_len Bytes. + * \param output_max_len The length in Bytes of the output buffer \p output. + * + * \return \c 0 on success. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_rsaes_oaep_decrypt(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + const unsigned char *label, size_t label_len, + size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len); + +/** + * \brief This function performs a private RSA operation to sign + * a message digest using PKCS#1. + * + * It is the generic wrapper for performing a PKCS#1 + * signature using the \p mode from the context. + * + * \note The \p sig buffer must be as large as the size + * of \p ctx->N. For example, 128 Bytes if RSA-1024 is used. + * + * \note For PKCS#1 v2.1 encoding, see comments on + * mbedtls_rsa_rsassa_pss_sign() for details on + * \p md_alg and \p hash_id. + * + * \deprecated It is deprecated and discouraged to call this function + * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library + * are likely to remove the \p mode argument and have it + * implicitly set to #MBEDTLS_RSA_PRIVATE. + * + * \note Alternative implementations of RSA need not support + * mode being set to #MBEDTLS_RSA_PUBLIC and might instead + * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. + * + * \param ctx The initialized RSA context to use. + * \param f_rng The RNG function to use. If the padding mode is PKCS#1 v2.1, + * this must be provided. If the padding mode is PKCS#1 v1.5 and + * \p mode is #MBEDTLS_RSA_PRIVATE, it is used for blinding + * and should be provided; see mbedtls_rsa_private() for more + * more. It is ignored otherwise. + * \param p_rng The RNG context to be passed to \p f_rng. This may be \c NULL + * if \p f_rng is \c NULL or doesn't need a context argument. + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). + * \param md_alg The message-digest algorithm used to hash the original data. + * Use #MBEDTLS_MD_NONE for signing raw data. + * \param hashlen The length of the message digest. + * Ths is only used if \p md_alg is #MBEDTLS_MD_NONE. + * \param hash The buffer holding the message digest or raw data. + * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable + * buffer of length \p hashlen Bytes. If \p md_alg is not + * #MBEDTLS_MD_NONE, it must be a readable buffer of length + * the size of the hash corresponding to \p md_alg. + * \param sig The buffer to hold the signature. This must be a writable + * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. A buffer length of + * #MBEDTLS_MPI_MAX_SIZE is always safe. + * + * \return \c 0 if the signing operation was successful. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_pkcs1_sign(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig); + +/** + * \brief This function performs a PKCS#1 v1.5 signature + * operation (RSASSA-PKCS1-v1_5-SIGN). + * + * \deprecated It is deprecated and discouraged to call this function + * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library + * are likely to remove the \p mode argument and have it + * implicitly set to #MBEDTLS_RSA_PRIVATE. + * + * \note Alternative implementations of RSA need not support + * mode being set to #MBEDTLS_RSA_PUBLIC and might instead + * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. + * + * \param ctx The initialized RSA context to use. + * \param f_rng The RNG function. If \p mode is #MBEDTLS_RSA_PRIVATE, + * this is used for blinding and should be provided; see + * mbedtls_rsa_private() for more. If \p mode is + * #MBEDTLS_RSA_PUBLIC, it is ignored. + * \param p_rng The RNG context to be passed to \p f_rng. This may be \c NULL + * if \p f_rng is \c NULL or doesn't need a context argument. + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). + * \param md_alg The message-digest algorithm used to hash the original data. + * Use #MBEDTLS_MD_NONE for signing raw data. + * \param hashlen The length of the message digest. + * Ths is only used if \p md_alg is #MBEDTLS_MD_NONE. + * \param hash The buffer holding the message digest or raw data. + * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable + * buffer of length \p hashlen Bytes. If \p md_alg is not + * #MBEDTLS_MD_NONE, it must be a readable buffer of length + * the size of the hash corresponding to \p md_alg. + * \param sig The buffer to hold the signature. This must be a writable + * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. A buffer length of + * #MBEDTLS_MPI_MAX_SIZE is always safe. + * + * \return \c 0 if the signing operation was successful. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_rsassa_pkcs1_v15_sign(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig); + +/** + * \brief This function performs a PKCS#1 v2.1 PSS signature + * operation (RSASSA-PSS-SIGN). + * + * \note The \c hash_id set in \p ctx (when calling + * mbedtls_rsa_init() or by calling mbedtls_rsa_set_padding() + * afterwards) selects the hash used for the + * encoding operation and for the mask generation function + * (MGF1). For more details on the encoding operation and the + * mask generation function, consult RFC-3447: Public-Key + * Cryptography Standards (PKCS) #1 v2.1: RSA Cryptography + * Specifications. + * + * \note This function enforces that the provided salt length complies + * with FIPS 186-4 §5.5 (e) and RFC 8017 (PKCS#1 v2.2) §9.1.1 + * step 3. The constraint is that the hash length plus the salt + * length plus 2 bytes must be at most the key length. If this + * constraint is not met, this function returns + * #MBEDTLS_ERR_RSA_BAD_INPUT_DATA. + * + * \param ctx The initialized RSA context to use. + * \param f_rng The RNG function. It must not be \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. This may be \c NULL + * if \p f_rng doesn't need a context argument. + * \param md_alg The message-digest algorithm used to hash the original data. + * Use #MBEDTLS_MD_NONE for signing raw data. + * \param hashlen The length of the message digest. + * Ths is only used if \p md_alg is #MBEDTLS_MD_NONE. + * \param hash The buffer holding the message digest or raw data. + * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable + * buffer of length \p hashlen Bytes. If \p md_alg is not + * #MBEDTLS_MD_NONE, it must be a readable buffer of length + * the size of the hash corresponding to \p md_alg. + * \param saltlen The length of the salt that should be used. + * If passed #MBEDTLS_RSA_SALT_LEN_ANY, the function will use + * the largest possible salt length up to the hash length, + * which is the largest permitted by some standards including + * FIPS 186-4 §5.5. + * \param sig The buffer to hold the signature. This must be a writable + * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. A buffer length of + * #MBEDTLS_MPI_MAX_SIZE is always safe. + * + * \return \c 0 if the signing operation was successful. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_rsassa_pss_sign_ext(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + int saltlen, + unsigned char *sig); + +/** + * \brief This function performs a PKCS#1 v2.1 PSS signature + * operation (RSASSA-PSS-SIGN). + * + * \note The \c hash_id set in \p ctx (when calling + * mbedtls_rsa_init() or by calling mbedtls_rsa_set_padding() + * afterwards) selects the hash used for the + * encoding operation and for the mask generation function + * (MGF1). For more details on the encoding operation and the + * mask generation function, consult RFC-3447: Public-Key + * Cryptography Standards (PKCS) #1 v2.1: RSA Cryptography + * Specifications. + * + * \note This function always uses the maximum possible salt size, + * up to the length of the payload hash. This choice of salt + * size complies with FIPS 186-4 §5.5 (e) and RFC 8017 (PKCS#1 + * v2.2) §9.1.1 step 3. Furthermore this function enforces a + * minimum salt size which is the hash size minus 2 bytes. If + * this minimum size is too large given the key size (the salt + * size, plus the hash size, plus 2 bytes must be no more than + * the key size in bytes), this function returns + * #MBEDTLS_ERR_RSA_BAD_INPUT_DATA. + * + * \deprecated It is deprecated and discouraged to call this function + * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library + * are likely to remove the \p mode argument and have it + * implicitly set to #MBEDTLS_RSA_PRIVATE. + * + * \note Alternative implementations of RSA need not support + * mode being set to #MBEDTLS_RSA_PUBLIC and might instead + * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. + * + * \param ctx The initialized RSA context to use. + * \param f_rng The RNG function. It must not be \c NULL. + * \param p_rng The RNG context to be passed to \p f_rng. This may be \c NULL + * if \p f_rng doesn't need a context argument. + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). + * \param md_alg The message-digest algorithm used to hash the original data. + * Use #MBEDTLS_MD_NONE for signing raw data. + * \param hashlen The length of the message digest. + * This is only used if \p md_alg is #MBEDTLS_MD_NONE. + * \param hash The buffer holding the message digest or raw data. + * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable + * buffer of length \p hashlen Bytes. If \p md_alg is not + * #MBEDTLS_MD_NONE, it must be a readable buffer of length + * the size of the hash corresponding to \p md_alg. + * \param sig The buffer to hold the signature. This must be a writable + * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. A buffer length of + * #MBEDTLS_MPI_MAX_SIZE is always safe. + * + * \return \c 0 if the signing operation was successful. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_rsassa_pss_sign(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig); + +/** + * \brief This function performs a public RSA operation and checks + * the message digest. + * + * This is the generic wrapper for performing a PKCS#1 + * verification using the mode from the context. + * + * \note For PKCS#1 v2.1 encoding, see comments on + * mbedtls_rsa_rsassa_pss_verify() about \c md_alg and + * \c hash_id. + * + * \deprecated It is deprecated and discouraged to call this function + * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library + * are likely to remove the \p mode argument and have it + * set to #MBEDTLS_RSA_PUBLIC. + * + * \note Alternative implementations of RSA need not support + * mode being set to #MBEDTLS_RSA_PRIVATE and might instead + * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. + * + * \param ctx The initialized RSA public key context to use. + * \param f_rng The RNG function to use. If \p mode is #MBEDTLS_RSA_PRIVATE, + * this is used for blinding and should be provided; see + * mbedtls_rsa_private() for more. Otherwise, it is ignored. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL if \p f_rng is \c NULL or doesn't need a context. + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). + * \param md_alg The message-digest algorithm used to hash the original data. + * Use #MBEDTLS_MD_NONE for signing raw data. + * \param hashlen The length of the message digest. + * This is only used if \p md_alg is #MBEDTLS_MD_NONE. + * \param hash The buffer holding the message digest or raw data. + * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable + * buffer of length \p hashlen Bytes. If \p md_alg is not + * #MBEDTLS_MD_NONE, it must be a readable buffer of length + * the size of the hash corresponding to \p md_alg. + * \param sig The buffer holding the signature. This must be a readable + * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * + * \return \c 0 if the verify operation was successful. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_pkcs1_verify(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + const unsigned char *sig); + +/** + * \brief This function performs a PKCS#1 v1.5 verification + * operation (RSASSA-PKCS1-v1_5-VERIFY). + * + * \deprecated It is deprecated and discouraged to call this function + * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library + * are likely to remove the \p mode argument and have it + * set to #MBEDTLS_RSA_PUBLIC. + * + * \note Alternative implementations of RSA need not support + * mode being set to #MBEDTLS_RSA_PRIVATE and might instead + * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. + * + * \param ctx The initialized RSA public key context to use. + * \param f_rng The RNG function to use. If \p mode is #MBEDTLS_RSA_PRIVATE, + * this is used for blinding and should be provided; see + * mbedtls_rsa_private() for more. Otherwise, it is ignored. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL if \p f_rng is \c NULL or doesn't need a context. + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). + * \param md_alg The message-digest algorithm used to hash the original data. + * Use #MBEDTLS_MD_NONE for signing raw data. + * \param hashlen The length of the message digest. + * This is only used if \p md_alg is #MBEDTLS_MD_NONE. + * \param hash The buffer holding the message digest or raw data. + * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable + * buffer of length \p hashlen Bytes. If \p md_alg is not + * #MBEDTLS_MD_NONE, it must be a readable buffer of length + * the size of the hash corresponding to \p md_alg. + * \param sig The buffer holding the signature. This must be a readable + * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * + * \return \c 0 if the verify operation was successful. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_rsassa_pkcs1_v15_verify(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + const unsigned char *sig); + +/** + * \brief This function performs a PKCS#1 v2.1 PSS verification + * operation (RSASSA-PSS-VERIFY). + * + * \note The \c hash_id set in \p ctx (when calling + * mbedtls_rsa_init() or by calling mbedtls_rsa_set_padding() + * afterwards) selects the hash used for the + * encoding operation and for the mask generation function + * (MGF1). For more details on the encoding operation and the + * mask generation function, consult RFC-3447: Public-Key + * Cryptography Standards (PKCS) #1 v2.1: RSA Cryptography + * Specifications. If the \c hash_id set in \p ctx is + * #MBEDTLS_MD_NONE, the \p md_alg parameter is used. + * + * \deprecated It is deprecated and discouraged to call this function + * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library + * are likely to remove the \p mode argument and have it + * implicitly set to #MBEDTLS_RSA_PUBLIC. + * + * \note Alternative implementations of RSA need not support + * mode being set to #MBEDTLS_RSA_PRIVATE and might instead + * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. + * + * \param ctx The initialized RSA public key context to use. + * \param f_rng The RNG function to use. If \p mode is #MBEDTLS_RSA_PRIVATE, + * this is used for blinding and should be provided; see + * mbedtls_rsa_private() for more. Otherwise, it is ignored. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL if \p f_rng is \c NULL or doesn't need a context. + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). + * \param md_alg The message-digest algorithm used to hash the original data. + * Use #MBEDTLS_MD_NONE for signing raw data. + * \param hashlen The length of the message digest. + * This is only used if \p md_alg is #MBEDTLS_MD_NONE. + * \param hash The buffer holding the message digest or raw data. + * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable + * buffer of length \p hashlen Bytes. If \p md_alg is not + * #MBEDTLS_MD_NONE, it must be a readable buffer of length + * the size of the hash corresponding to \p md_alg. + * \param sig The buffer holding the signature. This must be a readable + * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * + * \return \c 0 if the verify operation was successful. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_rsassa_pss_verify(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + const unsigned char *sig); + +/** + * \brief This function performs a PKCS#1 v2.1 PSS verification + * operation (RSASSA-PSS-VERIFY). + * + * \note The \p sig buffer must be as large as the size + * of \p ctx->N. For example, 128 Bytes if RSA-1024 is used. + * + * \note The \c hash_id set in \p ctx (when calling + * mbedtls_rsa_init() or by calling mbedtls_rsa_set_padding() + * afterwards) is ignored. + * + * \param ctx The initialized RSA public key context to use. + * \param f_rng The RNG function to use. If \p mode is #MBEDTLS_RSA_PRIVATE, + * this is used for blinding and should be provided; see + * mbedtls_rsa_private() for more. Otherwise, it is ignored. + * \param p_rng The RNG context to be passed to \p f_rng. This may be + * \c NULL if \p f_rng is \c NULL or doesn't need a context. + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE. + * \param md_alg The message-digest algorithm used to hash the original data. + * Use #MBEDTLS_MD_NONE for signing raw data. + * \param hashlen The length of the message digest. + * This is only used if \p md_alg is #MBEDTLS_MD_NONE. + * \param hash The buffer holding the message digest or raw data. + * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable + * buffer of length \p hashlen Bytes. If \p md_alg is not + * #MBEDTLS_MD_NONE, it must be a readable buffer of length + * the size of the hash corresponding to \p md_alg. + * \param mgf1_hash_id The message digest algorithm used for the + * verification operation and the mask generation + * function (MGF1). For more details on the encoding + * operation and the mask generation function, consult + * RFC-3447: Public-Key Cryptography Standards + * (PKCS) #1 v2.1: RSA Cryptography + * Specifications. + * \param expected_salt_len The length of the salt used in padding. Use + * #MBEDTLS_RSA_SALT_LEN_ANY to accept any salt length. + * \param sig The buffer holding the signature. This must be a readable + * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes + * for an 2048-bit RSA modulus. + * + * \return \c 0 if the verify operation was successful. + * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. + */ +int mbedtls_rsa_rsassa_pss_verify_ext(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + mbedtls_md_type_t mgf1_hash_id, + int expected_salt_len, + const unsigned char *sig); + +/** + * \brief This function copies the components of an RSA context. + * + * \param dst The destination context. This must be initialized. + * \param src The source context. This must be initialized. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory allocation failure. + */ +int mbedtls_rsa_copy(mbedtls_rsa_context *dst, const mbedtls_rsa_context *src); + +/** + * \brief This function frees the components of an RSA key. + * + * \param ctx The RSA context to free. May be \c NULL, in which case + * this function is a no-op. If it is not \c NULL, it must + * point to an initialized RSA context. + */ +void mbedtls_rsa_free(mbedtls_rsa_context *ctx); + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief The RSA checkup routine. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +int mbedtls_rsa_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* rsa.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/rsa_internal.h b/ext/opcua_client/mbedtls/include/mbedtls/rsa_internal.h new file mode 100644 index 0000000..286cff2 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/rsa_internal.h @@ -0,0 +1,212 @@ +/** + * \file rsa_internal.h + * + * \brief Context-independent RSA helper functions + * + * This module declares some RSA-related helper functions useful when + * implementing the RSA interface. These functions are provided in a separate + * compilation unit in order to make it easy for designers of alternative RSA + * implementations to use them in their own code, as it is conceived that the + * functionality they provide will be necessary for most complete + * implementations. + * + * End-users of Mbed TLS who are not providing their own alternative RSA + * implementations should not use these functions directly, and should instead + * use only the functions declared in rsa.h. + * + * The interface provided by this module will be maintained through LTS (Long + * Term Support) branches of Mbed TLS, but may otherwise be subject to change, + * and must be considered an internal interface of the library. + * + * There are two classes of helper functions: + * + * (1) Parameter-generating helpers. These are: + * - mbedtls_rsa_deduce_primes + * - mbedtls_rsa_deduce_private_exponent + * - mbedtls_rsa_deduce_crt + * Each of these functions takes a set of core RSA parameters and + * generates some other, or CRT related parameters. + * + * (2) Parameter-checking helpers. These are: + * - mbedtls_rsa_validate_params + * - mbedtls_rsa_validate_crt + * They take a set of core or CRT related RSA parameters and check their + * validity. + * + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + * + */ + +#ifndef MBEDTLS_RSA_INTERNAL_H +#define MBEDTLS_RSA_INTERNAL_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/bignum.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * \brief Compute RSA prime moduli P, Q from public modulus N=PQ + * and a pair of private and public key. + * + * \note This is a 'static' helper function not operating on + * an RSA context. Alternative implementations need not + * overwrite it. + * + * \param N RSA modulus N = PQ, with P, Q to be found + * \param E RSA public exponent + * \param D RSA private exponent + * \param P Pointer to MPI holding first prime factor of N on success + * \param Q Pointer to MPI holding second prime factor of N on success + * + * \return + * - 0 if successful. In this case, P and Q constitute a + * factorization of N. + * - A non-zero error code otherwise. + * + * \note It is neither checked that P, Q are prime nor that + * D, E are modular inverses wrt. P-1 and Q-1. For that, + * use the helper function \c mbedtls_rsa_validate_params. + * + */ +int mbedtls_rsa_deduce_primes(mbedtls_mpi const *N, mbedtls_mpi const *E, + mbedtls_mpi const *D, + mbedtls_mpi *P, mbedtls_mpi *Q); + +/** + * \brief Compute RSA private exponent from + * prime moduli and public key. + * + * \note This is a 'static' helper function not operating on + * an RSA context. Alternative implementations need not + * overwrite it. + * + * \param P First prime factor of RSA modulus + * \param Q Second prime factor of RSA modulus + * \param E RSA public exponent + * \param D Pointer to MPI holding the private exponent on success. + * + * \return + * - 0 if successful. In this case, D is set to a simultaneous + * modular inverse of E modulo both P-1 and Q-1. + * - A non-zero error code otherwise. + * + * \note This function does not check whether P and Q are primes. + * + */ +int mbedtls_rsa_deduce_private_exponent(mbedtls_mpi const *P, + mbedtls_mpi const *Q, + mbedtls_mpi const *E, + mbedtls_mpi *D); + + +/** + * \brief Generate RSA-CRT parameters + * + * \note This is a 'static' helper function not operating on + * an RSA context. Alternative implementations need not + * overwrite it. + * + * \param P First prime factor of N + * \param Q Second prime factor of N + * \param D RSA private exponent + * \param DP Output variable for D modulo P-1 + * \param DQ Output variable for D modulo Q-1 + * \param QP Output variable for the modular inverse of Q modulo P. + * + * \return 0 on success, non-zero error code otherwise. + * + * \note This function does not check whether P, Q are + * prime and whether D is a valid private exponent. + * + */ +int mbedtls_rsa_deduce_crt(const mbedtls_mpi *P, const mbedtls_mpi *Q, + const mbedtls_mpi *D, mbedtls_mpi *DP, + mbedtls_mpi *DQ, mbedtls_mpi *QP); + + +/** + * \brief Check validity of core RSA parameters + * + * \note This is a 'static' helper function not operating on + * an RSA context. Alternative implementations need not + * overwrite it. + * + * \param N RSA modulus N = PQ + * \param P First prime factor of N + * \param Q Second prime factor of N + * \param D RSA private exponent + * \param E RSA public exponent + * \param f_rng PRNG to be used for primality check, or NULL + * \param p_rng PRNG context for f_rng, or NULL + * + * \return + * - 0 if the following conditions are satisfied + * if all relevant parameters are provided: + * - P prime if f_rng != NULL (%) + * - Q prime if f_rng != NULL (%) + * - 1 < N = P * Q + * - 1 < D, E < N + * - D and E are modular inverses modulo P-1 and Q-1 + * (%) This is only done if MBEDTLS_GENPRIME is defined. + * - A non-zero error code otherwise. + * + * \note The function can be used with a restricted set of arguments + * to perform specific checks only. E.g., calling it with + * (-,P,-,-,-) and a PRNG amounts to a primality check for P. + */ +int mbedtls_rsa_validate_params(const mbedtls_mpi *N, const mbedtls_mpi *P, + const mbedtls_mpi *Q, const mbedtls_mpi *D, + const mbedtls_mpi *E, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief Check validity of RSA CRT parameters + * + * \note This is a 'static' helper function not operating on + * an RSA context. Alternative implementations need not + * overwrite it. + * + * \param P First prime factor of RSA modulus + * \param Q Second prime factor of RSA modulus + * \param D RSA private exponent + * \param DP MPI to check for D modulo P-1 + * \param DQ MPI to check for D modulo P-1 + * \param QP MPI to check for the modular inverse of Q modulo P. + * + * \return + * - 0 if the following conditions are satisfied: + * - D = DP mod P-1 if P, D, DP != NULL + * - Q = DQ mod P-1 if P, D, DQ != NULL + * - QP = Q^-1 mod P if P, Q, QP != NULL + * - \c MBEDTLS_ERR_RSA_KEY_CHECK_FAILED if check failed, + * potentially including \c MBEDTLS_ERR_MPI_XXX if some + * MPI calculations failed. + * - \c MBEDTLS_ERR_RSA_BAD_INPUT_DATA if insufficient + * data was provided to check DP, DQ or QP. + * + * \note The function can be used with a restricted set of arguments + * to perform specific checks only. E.g., calling it with the + * parameters (P, -, D, DP, -, -) will check DP = D mod P-1. + */ +int mbedtls_rsa_validate_crt(const mbedtls_mpi *P, const mbedtls_mpi *Q, + const mbedtls_mpi *D, const mbedtls_mpi *DP, + const mbedtls_mpi *DQ, const mbedtls_mpi *QP); + +#ifdef __cplusplus +} +#endif + +#endif /* rsa_internal.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/sha1.h b/ext/opcua_client/mbedtls/include/mbedtls/sha1.h new file mode 100644 index 0000000..61d81f1 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/sha1.h @@ -0,0 +1,339 @@ +/** + * \file sha1.h + * + * \brief This file contains SHA-1 definitions and functions. + * + * The Secure Hash Algorithm 1 (SHA-1) cryptographic hash function is defined in + * FIPS 180-4: Secure Hash Standard (SHS). + * + * \warning SHA-1 is considered a weak message digest and its use constitutes + * a security risk. We recommend considering stronger message + * digests instead. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_SHA1_H +#define MBEDTLS_SHA1_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +/* MBEDTLS_ERR_SHA1_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** SHA-1 hardware accelerator failed */ +#define MBEDTLS_ERR_SHA1_HW_ACCEL_FAILED -0x0035 +/** SHA-1 input data was malformed. */ +#define MBEDTLS_ERR_SHA1_BAD_INPUT_DATA -0x0073 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_SHA1_ALT) +// Regular implementation +// + +/** + * \brief The SHA-1 context structure. + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + */ +typedef struct mbedtls_sha1_context { + uint32_t total[2]; /*!< The number of Bytes processed. */ + uint32_t state[5]; /*!< The intermediate digest state. */ + unsigned char buffer[64]; /*!< The data block being processed. */ +} +mbedtls_sha1_context; + +#else /* MBEDTLS_SHA1_ALT */ +#include "sha1_alt.h" +#endif /* MBEDTLS_SHA1_ALT */ + +/** + * \brief This function initializes a SHA-1 context. + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \param ctx The SHA-1 context to initialize. + * This must not be \c NULL. + * + */ +void mbedtls_sha1_init(mbedtls_sha1_context *ctx); + +/** + * \brief This function clears a SHA-1 context. + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \param ctx The SHA-1 context to clear. This may be \c NULL, + * in which case this function does nothing. If it is + * not \c NULL, it must point to an initialized + * SHA-1 context. + * + */ +void mbedtls_sha1_free(mbedtls_sha1_context *ctx); + +/** + * \brief This function clones the state of a SHA-1 context. + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \param dst The SHA-1 context to clone to. This must be initialized. + * \param src The SHA-1 context to clone from. This must be initialized. + * + */ +void mbedtls_sha1_clone(mbedtls_sha1_context *dst, + const mbedtls_sha1_context *src); + +/** + * \brief This function starts a SHA-1 checksum calculation. + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \param ctx The SHA-1 context to initialize. This must be initialized. + * + * \return \c 0 on success. + * \return A negative error code on failure. + * + */ +int mbedtls_sha1_starts_ret(mbedtls_sha1_context *ctx); + +/** + * \brief This function feeds an input buffer into an ongoing SHA-1 + * checksum calculation. + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \param ctx The SHA-1 context. This must be initialized + * and have a hash operation started. + * \param input The buffer holding the input data. + * This must be a readable buffer of length \p ilen Bytes. + * \param ilen The length of the input data \p input in Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_sha1_update_ret(mbedtls_sha1_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief This function finishes the SHA-1 operation, and writes + * the result to the output buffer. + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \param ctx The SHA-1 context to use. This must be initialized and + * have a hash operation started. + * \param output The SHA-1 checksum result. This must be a writable + * buffer of length \c 20 Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_sha1_finish_ret(mbedtls_sha1_context *ctx, + unsigned char output[20]); + +/** + * \brief SHA-1 process data block (internal use only). + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \param ctx The SHA-1 context to use. This must be initialized. + * \param data The data block being processed. This must be a + * readable buffer of length \c 64 Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + * + */ +int mbedtls_internal_sha1_process(mbedtls_sha1_context *ctx, + const unsigned char data[64]); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief This function starts a SHA-1 checksum calculation. + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \deprecated Superseded by mbedtls_sha1_starts_ret() in 2.7.0. + * + * \param ctx The SHA-1 context to initialize. This must be initialized. + * + */ +MBEDTLS_DEPRECATED void mbedtls_sha1_starts(mbedtls_sha1_context *ctx); + +/** + * \brief This function feeds an input buffer into an ongoing SHA-1 + * checksum calculation. + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \deprecated Superseded by mbedtls_sha1_update_ret() in 2.7.0. + * + * \param ctx The SHA-1 context. This must be initialized and + * have a hash operation started. + * \param input The buffer holding the input data. + * This must be a readable buffer of length \p ilen Bytes. + * \param ilen The length of the input data \p input in Bytes. + * + */ +MBEDTLS_DEPRECATED void mbedtls_sha1_update(mbedtls_sha1_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief This function finishes the SHA-1 operation, and writes + * the result to the output buffer. + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \deprecated Superseded by mbedtls_sha1_finish_ret() in 2.7.0. + * + * \param ctx The SHA-1 context. This must be initialized and + * have a hash operation started. + * \param output The SHA-1 checksum result. + * This must be a writable buffer of length \c 20 Bytes. + */ +MBEDTLS_DEPRECATED void mbedtls_sha1_finish(mbedtls_sha1_context *ctx, + unsigned char output[20]); + +/** + * \brief SHA-1 process data block (internal use only). + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \deprecated Superseded by mbedtls_internal_sha1_process() in 2.7.0. + * + * \param ctx The SHA-1 context. This must be initialized. + * \param data The data block being processed. + * This must be a readable buffer of length \c 64 bytes. + * + */ +MBEDTLS_DEPRECATED void mbedtls_sha1_process(mbedtls_sha1_context *ctx, + const unsigned char data[64]); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +/** + * \brief This function calculates the SHA-1 checksum of a buffer. + * + * The function allocates the context, performs the + * calculation, and frees the context. + * + * The SHA-1 result is calculated as + * output = SHA-1(input buffer). + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \param input The buffer holding the input data. + * This must be a readable buffer of length \p ilen Bytes. + * \param ilen The length of the input data \p input in Bytes. + * \param output The SHA-1 checksum result. + * This must be a writable buffer of length \c 20 Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + * + */ +int mbedtls_sha1_ret(const unsigned char *input, + size_t ilen, + unsigned char output[20]); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief This function calculates the SHA-1 checksum of a buffer. + * + * The function allocates the context, performs the + * calculation, and frees the context. + * + * The SHA-1 result is calculated as + * output = SHA-1(input buffer). + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \deprecated Superseded by mbedtls_sha1_ret() in 2.7.0 + * + * \param input The buffer holding the input data. + * This must be a readable buffer of length \p ilen Bytes. + * \param ilen The length of the input data \p input in Bytes. + * \param output The SHA-1 checksum result. This must be a writable + * buffer of size \c 20 Bytes. + * + */ +MBEDTLS_DEPRECATED void mbedtls_sha1(const unsigned char *input, + size_t ilen, + unsigned char output[20]); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief The SHA-1 checkup routine. + * + * \warning SHA-1 is considered a weak message digest and its use + * constitutes a security risk. We recommend considering + * stronger message digests instead. + * + * \return \c 0 on success. + * \return \c 1 on failure. + * + */ +int mbedtls_sha1_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* mbedtls_sha1.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/sha256.h b/ext/opcua_client/mbedtls/include/mbedtls/sha256.h new file mode 100644 index 0000000..d4c3e64 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/sha256.h @@ -0,0 +1,287 @@ +/** + * \file sha256.h + * + * \brief This file contains SHA-224 and SHA-256 definitions and functions. + * + * The Secure Hash Algorithms 224 and 256 (SHA-224 and SHA-256) cryptographic + * hash functions are defined in FIPS 180-4: Secure Hash Standard (SHS). + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_SHA256_H +#define MBEDTLS_SHA256_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +/* MBEDTLS_ERR_SHA256_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** SHA-256 hardware accelerator failed */ +#define MBEDTLS_ERR_SHA256_HW_ACCEL_FAILED -0x0037 +/** SHA-256 input data was malformed. */ +#define MBEDTLS_ERR_SHA256_BAD_INPUT_DATA -0x0074 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_SHA256_ALT) +// Regular implementation +// + +/** + * \brief The SHA-256 context structure. + * + * The structure is used both for SHA-256 and for SHA-224 + * checksum calculations. The choice between these two is + * made in the call to mbedtls_sha256_starts_ret(). + */ +typedef struct mbedtls_sha256_context { + uint32_t total[2]; /*!< The number of Bytes processed. */ + uint32_t state[8]; /*!< The intermediate digest state. */ + unsigned char buffer[64]; /*!< The data block being processed. */ + int is224; /*!< Determines which function to use: + 0: Use SHA-256, or 1: Use SHA-224. */ +} +mbedtls_sha256_context; + +#else /* MBEDTLS_SHA256_ALT */ +#include "sha256_alt.h" +#endif /* MBEDTLS_SHA256_ALT */ + +/** + * \brief This function initializes a SHA-256 context. + * + * \param ctx The SHA-256 context to initialize. This must not be \c NULL. + */ +void mbedtls_sha256_init(mbedtls_sha256_context *ctx); + +/** + * \brief This function clears a SHA-256 context. + * + * \param ctx The SHA-256 context to clear. This may be \c NULL, in which + * case this function returns immediately. If it is not \c NULL, + * it must point to an initialized SHA-256 context. + */ +void mbedtls_sha256_free(mbedtls_sha256_context *ctx); + +/** + * \brief This function clones the state of a SHA-256 context. + * + * \param dst The destination context. This must be initialized. + * \param src The context to clone. This must be initialized. + */ +void mbedtls_sha256_clone(mbedtls_sha256_context *dst, + const mbedtls_sha256_context *src); + +/** + * \brief This function starts a SHA-224 or SHA-256 checksum + * calculation. + * + * \param ctx The context to use. This must be initialized. + * \param is224 This determines which function to use. This must be + * either \c 0 for SHA-256, or \c 1 for SHA-224. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_sha256_starts_ret(mbedtls_sha256_context *ctx, int is224); + +/** + * \brief This function feeds an input buffer into an ongoing + * SHA-256 checksum calculation. + * + * \param ctx The SHA-256 context. This must be initialized + * and have a hash operation started. + * \param input The buffer holding the data. This must be a readable + * buffer of length \p ilen Bytes. + * \param ilen The length of the input data in Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_sha256_update_ret(mbedtls_sha256_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief This function finishes the SHA-256 operation, and writes + * the result to the output buffer. + * + * \param ctx The SHA-256 context. This must be initialized + * and have a hash operation started. + * \param output The SHA-224 or SHA-256 checksum result. + * This must be a writable buffer of length \c 32 Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_sha256_finish_ret(mbedtls_sha256_context *ctx, + unsigned char output[32]); + +/** + * \brief This function processes a single data block within + * the ongoing SHA-256 computation. This function is for + * internal use only. + * + * \param ctx The SHA-256 context. This must be initialized. + * \param data The buffer holding one block of data. This must + * be a readable buffer of length \c 64 Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_internal_sha256_process(mbedtls_sha256_context *ctx, + const unsigned char data[64]); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief This function starts a SHA-224 or SHA-256 checksum + * calculation. + * + * \deprecated Superseded by mbedtls_sha256_starts_ret() in 2.7.0. + * + * \param ctx The context to use. This must be initialized. + * \param is224 Determines which function to use. This must be + * either \c 0 for SHA-256, or \c 1 for SHA-224. + */ +MBEDTLS_DEPRECATED void mbedtls_sha256_starts(mbedtls_sha256_context *ctx, + int is224); + +/** + * \brief This function feeds an input buffer into an ongoing + * SHA-256 checksum calculation. + * + * \deprecated Superseded by mbedtls_sha256_update_ret() in 2.7.0. + * + * \param ctx The SHA-256 context to use. This must be + * initialized and have a hash operation started. + * \param input The buffer holding the data. This must be a readable + * buffer of length \p ilen Bytes. + * \param ilen The length of the input data in Bytes. + */ +MBEDTLS_DEPRECATED void mbedtls_sha256_update(mbedtls_sha256_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief This function finishes the SHA-256 operation, and writes + * the result to the output buffer. + * + * \deprecated Superseded by mbedtls_sha256_finish_ret() in 2.7.0. + * + * \param ctx The SHA-256 context. This must be initialized and + * have a hash operation started. + * \param output The SHA-224 or SHA-256 checksum result. This must be + * a writable buffer of length \c 32 Bytes. + */ +MBEDTLS_DEPRECATED void mbedtls_sha256_finish(mbedtls_sha256_context *ctx, + unsigned char output[32]); + +/** + * \brief This function processes a single data block within + * the ongoing SHA-256 computation. This function is for + * internal use only. + * + * \deprecated Superseded by mbedtls_internal_sha256_process() in 2.7.0. + * + * \param ctx The SHA-256 context. This must be initialized. + * \param data The buffer holding one block of data. This must be + * a readable buffer of size \c 64 Bytes. + */ +MBEDTLS_DEPRECATED void mbedtls_sha256_process(mbedtls_sha256_context *ctx, + const unsigned char data[64]); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +/** + * \brief This function calculates the SHA-224 or SHA-256 + * checksum of a buffer. + * + * The function allocates the context, performs the + * calculation, and frees the context. + * + * The SHA-256 result is calculated as + * output = SHA-256(input buffer). + * + * \param input The buffer holding the data. This must be a readable + * buffer of length \p ilen Bytes. + * \param ilen The length of the input data in Bytes. + * \param output The SHA-224 or SHA-256 checksum result. This must + * be a writable buffer of length \c 32 Bytes. + * \param is224 Determines which function to use. This must be + * either \c 0 for SHA-256, or \c 1 for SHA-224. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_sha256_ret(const unsigned char *input, + size_t ilen, + unsigned char output[32], + int is224); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif + +/** + * \brief This function calculates the SHA-224 or SHA-256 checksum + * of a buffer. + * + * The function allocates the context, performs the + * calculation, and frees the context. + * + * The SHA-256 result is calculated as + * output = SHA-256(input buffer). + * + * \deprecated Superseded by mbedtls_sha256_ret() in 2.7.0. + * + * \param input The buffer holding the data. This must be a readable + * buffer of length \p ilen Bytes. + * \param ilen The length of the input data in Bytes. + * \param output The SHA-224 or SHA-256 checksum result. This must be + * a writable buffer of length \c 32 Bytes. + * \param is224 Determines which function to use. This must be either + * \c 0 for SHA-256, or \c 1 for SHA-224. + */ +MBEDTLS_DEPRECATED void mbedtls_sha256(const unsigned char *input, + size_t ilen, + unsigned char output[32], + int is224); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief The SHA-224 and SHA-256 checkup routine. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +int mbedtls_sha256_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* mbedtls_sha256.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/sha512.h b/ext/opcua_client/mbedtls/include/mbedtls/sha512.h new file mode 100644 index 0000000..c9e0169 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/sha512.h @@ -0,0 +1,303 @@ +/** + * \file sha512.h + * \brief This file contains SHA-384 and SHA-512 definitions and functions. + * + * The Secure Hash Algorithms 384 and 512 (SHA-384 and SHA-512) cryptographic + * hash functions are defined in FIPS 180-4: Secure Hash Standard (SHS). + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_SHA512_H +#define MBEDTLS_SHA512_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +/* MBEDTLS_ERR_SHA512_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** SHA-512 hardware accelerator failed */ +#define MBEDTLS_ERR_SHA512_HW_ACCEL_FAILED -0x0039 +/** SHA-512 input data was malformed. */ +#define MBEDTLS_ERR_SHA512_BAD_INPUT_DATA -0x0075 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_SHA512_ALT) +// Regular implementation +// + +/** + * \brief The SHA-512 context structure. + * + * The structure is used both for SHA-384 and for SHA-512 + * checksum calculations. The choice between these two is + * made in the call to mbedtls_sha512_starts_ret(). + */ +typedef struct mbedtls_sha512_context { + uint64_t total[2]; /*!< The number of Bytes processed. */ + uint64_t state[8]; /*!< The intermediate digest state. */ + unsigned char buffer[128]; /*!< The data block being processed. */ +#if !defined(MBEDTLS_SHA512_NO_SHA384) + int is384; /*!< Determines which function to use: + 0: Use SHA-512, or 1: Use SHA-384. */ +#endif +} +mbedtls_sha512_context; + +#else /* MBEDTLS_SHA512_ALT */ +#include "sha512_alt.h" +#endif /* MBEDTLS_SHA512_ALT */ + +/** + * \brief This function initializes a SHA-512 context. + * + * \param ctx The SHA-512 context to initialize. This must + * not be \c NULL. + */ +void mbedtls_sha512_init(mbedtls_sha512_context *ctx); + +/** + * \brief This function clears a SHA-512 context. + * + * \param ctx The SHA-512 context to clear. This may be \c NULL, + * in which case this function does nothing. If it + * is not \c NULL, it must point to an initialized + * SHA-512 context. + */ +void mbedtls_sha512_free(mbedtls_sha512_context *ctx); + +/** + * \brief This function clones the state of a SHA-512 context. + * + * \param dst The destination context. This must be initialized. + * \param src The context to clone. This must be initialized. + */ +void mbedtls_sha512_clone(mbedtls_sha512_context *dst, + const mbedtls_sha512_context *src); + +/** + * \brief This function starts a SHA-384 or SHA-512 checksum + * calculation. + * + * \param ctx The SHA-512 context to use. This must be initialized. + * \param is384 Determines which function to use. This must be + * either \c 0 for SHA-512, or \c 1 for SHA-384. + * + * \note When \c MBEDTLS_SHA512_NO_SHA384 is defined, \p is384 must + * be \c 0, or the function will return + * #MBEDTLS_ERR_SHA512_BAD_INPUT_DATA. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_sha512_starts_ret(mbedtls_sha512_context *ctx, int is384); + +/** + * \brief This function feeds an input buffer into an ongoing + * SHA-512 checksum calculation. + * + * \param ctx The SHA-512 context. This must be initialized + * and have a hash operation started. + * \param input The buffer holding the input data. This must + * be a readable buffer of length \p ilen Bytes. + * \param ilen The length of the input data in Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_sha512_update_ret(mbedtls_sha512_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief This function finishes the SHA-512 operation, and writes + * the result to the output buffer. + * + * \param ctx The SHA-512 context. This must be initialized + * and have a hash operation started. + * \param output The SHA-384 or SHA-512 checksum result. + * This must be a writable buffer of length \c 64 Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_sha512_finish_ret(mbedtls_sha512_context *ctx, + unsigned char output[64]); + +/** + * \brief This function processes a single data block within + * the ongoing SHA-512 computation. + * This function is for internal use only. + * + * \param ctx The SHA-512 context. This must be initialized. + * \param data The buffer holding one block of data. This + * must be a readable buffer of length \c 128 Bytes. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_internal_sha512_process(mbedtls_sha512_context *ctx, + const unsigned char data[128]); +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif +/** + * \brief This function starts a SHA-384 or SHA-512 checksum + * calculation. + * + * \deprecated Superseded by mbedtls_sha512_starts_ret() in 2.7.0 + * + * \param ctx The SHA-512 context to use. This must be initialized. + * \param is384 Determines which function to use. This must be either + * \c 0 for SHA-512 or \c 1 for SHA-384. + * + * \note When \c MBEDTLS_SHA512_NO_SHA384 is defined, \p is384 must + * be \c 0, or the function will fail to work. + */ +MBEDTLS_DEPRECATED void mbedtls_sha512_starts(mbedtls_sha512_context *ctx, + int is384); + +/** + * \brief This function feeds an input buffer into an ongoing + * SHA-512 checksum calculation. + * + * \deprecated Superseded by mbedtls_sha512_update_ret() in 2.7.0. + * + * \param ctx The SHA-512 context. This must be initialized + * and have a hash operation started. + * \param input The buffer holding the data. This must be a readable + * buffer of length \p ilen Bytes. + * \param ilen The length of the input data in Bytes. + */ +MBEDTLS_DEPRECATED void mbedtls_sha512_update(mbedtls_sha512_context *ctx, + const unsigned char *input, + size_t ilen); + +/** + * \brief This function finishes the SHA-512 operation, and writes + * the result to the output buffer. + * + * \deprecated Superseded by mbedtls_sha512_finish_ret() in 2.7.0. + * + * \param ctx The SHA-512 context. This must be initialized + * and have a hash operation started. + * \param output The SHA-384 or SHA-512 checksum result. This must + * be a writable buffer of size \c 64 Bytes. + */ +MBEDTLS_DEPRECATED void mbedtls_sha512_finish(mbedtls_sha512_context *ctx, + unsigned char output[64]); + +/** + * \brief This function processes a single data block within + * the ongoing SHA-512 computation. This function is for + * internal use only. + * + * \deprecated Superseded by mbedtls_internal_sha512_process() in 2.7.0. + * + * \param ctx The SHA-512 context. This must be initialized. + * \param data The buffer holding one block of data. This must be + * a readable buffer of length \c 128 Bytes. + */ +MBEDTLS_DEPRECATED void mbedtls_sha512_process( + mbedtls_sha512_context *ctx, + const unsigned char data[128]); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +/** + * \brief This function calculates the SHA-512 or SHA-384 + * checksum of a buffer. + * + * The function allocates the context, performs the + * calculation, and frees the context. + * + * The SHA-512 result is calculated as + * output = SHA-512(input buffer). + * + * \param input The buffer holding the input data. This must be + * a readable buffer of length \p ilen Bytes. + * \param ilen The length of the input data in Bytes. + * \param output The SHA-384 or SHA-512 checksum result. + * This must be a writable buffer of length \c 64 Bytes. + * \param is384 Determines which function to use. This must be either + * \c 0 for SHA-512, or \c 1 for SHA-384. + * + * \note When \c MBEDTLS_SHA512_NO_SHA384 is defined, \p is384 must + * be \c 0, or the function will return + * #MBEDTLS_ERR_SHA512_BAD_INPUT_DATA. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_sha512_ret(const unsigned char *input, + size_t ilen, + unsigned char output[64], + int is384); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif + +/** + * \brief This function calculates the SHA-512 or SHA-384 + * checksum of a buffer. + * + * The function allocates the context, performs the + * calculation, and frees the context. + * + * The SHA-512 result is calculated as + * output = SHA-512(input buffer). + * + * \deprecated Superseded by mbedtls_sha512_ret() in 2.7.0 + * + * \param input The buffer holding the data. This must be a + * readable buffer of length \p ilen Bytes. + * \param ilen The length of the input data in Bytes. + * \param output The SHA-384 or SHA-512 checksum result. This must + * be a writable buffer of length \c 64 Bytes. + * \param is384 Determines which function to use. This must be either + * \c 0 for SHA-512, or \c 1 for SHA-384. + * + * \note When \c MBEDTLS_SHA512_NO_SHA384 is defined, \p is384 must + * be \c 0, or the function will fail to work. + */ +MBEDTLS_DEPRECATED void mbedtls_sha512(const unsigned char *input, + size_t ilen, + unsigned char output[64], + int is384); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief The SHA-384 or SHA-512 checkup routine. + * + * \return \c 0 on success. + * \return \c 1 on failure. + */ +int mbedtls_sha512_self_test(int verbose); +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* mbedtls_sha512.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ssl.h b/ext/opcua_client/mbedtls/include/mbedtls/ssl.h new file mode 100644 index 0000000..8f9d38e --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ssl.h @@ -0,0 +1,4504 @@ +/** + * \file ssl.h + * + * \brief SSL/TLS functions. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_SSL_H +#define MBEDTLS_SSL_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/bignum.h" +#include "mbedtls/ecp.h" + +#include "mbedtls/ssl_ciphersuites.h" + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +#include "mbedtls/x509_crt.h" +#include "mbedtls/x509_crl.h" +#endif + +#if defined(MBEDTLS_DHM_C) +#include "mbedtls/dhm.h" +#endif + +/* Adding guard for MBEDTLS_ECDSA_C to ensure no compile errors due + * to guards also being in ssl_srv.c and ssl_cli.c. There is a gap + * in functionality that access to ecdh_ctx structure is needed for + * MBEDTLS_ECDSA_C which does not seem correct. + */ +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) +#include "mbedtls/ecdh.h" +#endif + +#if defined(MBEDTLS_ZLIB_SUPPORT) + +#if defined(MBEDTLS_DEPRECATED_WARNING) +#warning \ + "Record compression support via MBEDTLS_ZLIB_SUPPORT is deprecated and will be removed in the next major revision of the library" +#endif + +#if defined(MBEDTLS_DEPRECATED_REMOVED) +#error \ + "Record compression support via MBEDTLS_ZLIB_SUPPORT is deprecated and cannot be used if MBEDTLS_DEPRECATED_REMOVED is set" +#endif + +#include "zlib.h" +#endif + +#if defined(MBEDTLS_HAVE_TIME) +#include "mbedtls/platform_time.h" +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "psa/crypto.h" +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +/* + * SSL Error codes + */ +/** The requested feature is not available. */ +#define MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE -0x7080 +/** Bad input parameters to function. */ +#define MBEDTLS_ERR_SSL_BAD_INPUT_DATA -0x7100 +/** Verification of the message MAC failed. */ +#define MBEDTLS_ERR_SSL_INVALID_MAC -0x7180 +/** An invalid SSL record was received. */ +#define MBEDTLS_ERR_SSL_INVALID_RECORD -0x7200 +/** The connection indicated an EOF. */ +#define MBEDTLS_ERR_SSL_CONN_EOF -0x7280 +/** An unknown cipher was received. */ +#define MBEDTLS_ERR_SSL_UNKNOWN_CIPHER -0x7300 +/** The server has no ciphersuites in common with the client. */ +#define MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN -0x7380 +/** No RNG was provided to the SSL module. */ +#define MBEDTLS_ERR_SSL_NO_RNG -0x7400 +/** No client certification received from the client, but required by the authentication mode. */ +#define MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE -0x7480 +/** Our own certificate(s) is/are too large to send in an SSL message. */ +#define MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE -0x7500 +/** The own certificate is not set, but needed by the server. */ +#define MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED -0x7580 +/** The own private key or pre-shared key is not set, but needed. */ +#define MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED -0x7600 +/** No CA Chain is set, but required to operate. */ +#define MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED -0x7680 +/** An unexpected message was received from our peer. */ +#define MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE -0x7700 +/** A fatal alert message was received from our peer. */ +#define MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE -0x7780 +/** Verification of our peer failed. */ +#define MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED -0x7800 +/** The peer notified us that the connection is going to be closed. */ +#define MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY -0x7880 +/** Processing of the ClientHello handshake message failed. */ +#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO -0x7900 +/** Processing of the ServerHello handshake message failed. */ +#define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO -0x7980 +/** Processing of the Certificate handshake message failed. */ +#define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE -0x7A00 +/** Processing of the CertificateRequest handshake message failed. */ +#define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST -0x7A80 +/** Processing of the ServerKeyExchange handshake message failed. */ +#define MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE -0x7B00 +/** Processing of the ServerHelloDone handshake message failed. */ +#define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE -0x7B80 +/** Processing of the ClientKeyExchange handshake message failed. */ +#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE -0x7C00 +/** Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Read Public. */ +#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP -0x7C80 +/** Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Calculate Secret. */ +#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS -0x7D00 +/** Processing of the CertificateVerify handshake message failed. */ +#define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY -0x7D80 +/** Processing of the ChangeCipherSpec handshake message failed. */ +#define MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC -0x7E00 +/** Processing of the Finished handshake message failed. */ +#define MBEDTLS_ERR_SSL_BAD_HS_FINISHED -0x7E80 +/** Memory allocation failed */ +#define MBEDTLS_ERR_SSL_ALLOC_FAILED -0x7F00 +/** Hardware acceleration function returned with error */ +#define MBEDTLS_ERR_SSL_HW_ACCEL_FAILED -0x7F80 +/** Hardware acceleration function skipped / left alone data */ +#define MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH -0x6F80 +/** Processing of the compression / decompression failed */ +#define MBEDTLS_ERR_SSL_COMPRESSION_FAILED -0x6F00 +/** Handshake protocol not within min/max boundaries */ +#define MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION -0x6E80 +/** Processing of the NewSessionTicket handshake message failed. */ +#define MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET -0x6E00 +/** Session ticket has expired. */ +#define MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED -0x6D80 +/** Public key type mismatch (eg, asked for RSA key exchange and presented EC key) */ +#define MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH -0x6D00 +/** Unknown identity received (eg, PSK identity) */ +#define MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY -0x6C80 +/** Internal error (eg, unexpected failure in lower-level module) */ +#define MBEDTLS_ERR_SSL_INTERNAL_ERROR -0x6C00 +/** A counter would wrap (eg, too many messages exchanged). */ +#define MBEDTLS_ERR_SSL_COUNTER_WRAPPING -0x6B80 +/** Unexpected message at ServerHello in renegotiation. */ +#define MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO -0x6B00 +/** DTLS client must retry for hello verification */ +#define MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED -0x6A80 +/** A buffer is too small to receive or write a message */ +#define MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL -0x6A00 +/** None of the common ciphersuites is usable (eg, no suitable certificate, see debug messages). */ +#define MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE -0x6980 +/** No data of requested type currently available on underlying transport. */ +#define MBEDTLS_ERR_SSL_WANT_READ -0x6900 +/** Connection requires a write call. */ +#define MBEDTLS_ERR_SSL_WANT_WRITE -0x6880 +/** The operation timed out. */ +#define MBEDTLS_ERR_SSL_TIMEOUT -0x6800 +/** The client initiated a reconnect from the same port. */ +#define MBEDTLS_ERR_SSL_CLIENT_RECONNECT -0x6780 +/** Record header looks valid but is not expected. */ +#define MBEDTLS_ERR_SSL_UNEXPECTED_RECORD -0x6700 +/** The alert message received indicates a non-fatal error. */ +#define MBEDTLS_ERR_SSL_NON_FATAL -0x6680 +/** Couldn't set the hash for verifying CertificateVerify */ +#define MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH -0x6600 +/** Internal-only message signaling that further message-processing should be done */ +#define MBEDTLS_ERR_SSL_CONTINUE_PROCESSING -0x6580 +/** The asynchronous operation is not completed yet. */ +#define MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS -0x6500 +/** Internal-only message signaling that a message arrived early. */ +#define MBEDTLS_ERR_SSL_EARLY_MESSAGE -0x6480 +/** An encrypted DTLS-frame with an unexpected CID was received. */ +#define MBEDTLS_ERR_SSL_UNEXPECTED_CID -0x6000 +/** An operation failed due to an unexpected version or configuration. */ +#define MBEDTLS_ERR_SSL_VERSION_MISMATCH -0x5F00 +/** A cryptographic operation is in progress. Try again later. */ +#define MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS -0x7000 +/** Invalid value in SSL config */ +#define MBEDTLS_ERR_SSL_BAD_CONFIG -0x5E80 +/** Cache entry not found */ +#define MBEDTLS_ERR_SSL_CACHE_ENTRY_NOT_FOUND -0x5E00 +/** Attempt to verify a certificate without an expected hostname. + * This is usually insecure. + * + * In TLS clients, when a client authenticates a server through its + * certificate, the client normally checks three things: + * - the certificate chain must be valid; + * - the chain must start from a trusted CA; + * - the certificate must cover the server name that is expected by the client. + * + * Omitting any of these checks is generally insecure, and can allow a + * malicious server to impersonate a legitimate server. + * + * The third check may be safely skipped in some unusual scenarios, + * such as networks where eavesdropping is a risk but not active attacks, + * or a private PKI where the client equally trusts all servers that are + * accredited by the root CA. + * + * You should call mbedtls_ssl_set_hostname() with the expected server name + * before starting a TLS handshake on a client (unless the client is + * set up to only use PSK-based authentication, which does not rely on the + * host name). If you have determined that server name verification is not + * required for security in your scenario, call mbedtls_ssl_set_hostname() + * with \p NULL as the server name. + * + * This error is raised if all of the following conditions are met: + * + * - A TLS client is configured with the authentication mode + * #MBEDTLS_SSL_VERIFY_REQUIRED (default). + * - Certificate authentication is enabled. + * - The client does not call mbedtls_ssl_set_hostname(). + * - The configuration option + * #MBEDTLS_SSL_CLI_ALLOW_WEAK_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME + * is not enabled. + */ +#define MBEDTLS_ERR_SSL_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME -0x5D80 + +/* + * Various constants + */ +#define MBEDTLS_SSL_MAJOR_VERSION_3 3 +#define MBEDTLS_SSL_MINOR_VERSION_0 0 /*!< SSL v3.0 */ +#define MBEDTLS_SSL_MINOR_VERSION_1 1 /*!< TLS v1.0 */ +#define MBEDTLS_SSL_MINOR_VERSION_2 2 /*!< TLS v1.1 */ +#define MBEDTLS_SSL_MINOR_VERSION_3 3 /*!< TLS v1.2 */ +#define MBEDTLS_SSL_MINOR_VERSION_4 4 /*!< TLS v1.3 (experimental) */ + +#define MBEDTLS_SSL_TRANSPORT_STREAM 0 /*!< TLS */ +#define MBEDTLS_SSL_TRANSPORT_DATAGRAM 1 /*!< DTLS */ + +#define MBEDTLS_SSL_MAX_HOST_NAME_LEN 255 /*!< Maximum host name defined in RFC 1035 */ +#define MBEDTLS_SSL_MAX_ALPN_NAME_LEN 255 /*!< Maximum size in bytes of a protocol name in alpn ext., RFC 7301 */ + +#define MBEDTLS_SSL_MAX_ALPN_LIST_LEN 65535 /*!< Maximum size in bytes of list in alpn ext., RFC 7301 */ + +/* RFC 6066 section 4, see also mfl_code_to_length in ssl_tls.c + * NONE must be zero so that memset()ing structure to zero works */ +#define MBEDTLS_SSL_MAX_FRAG_LEN_NONE 0 /*!< don't use this extension */ +#define MBEDTLS_SSL_MAX_FRAG_LEN_512 1 /*!< MaxFragmentLength 2^9 */ +#define MBEDTLS_SSL_MAX_FRAG_LEN_1024 2 /*!< MaxFragmentLength 2^10 */ +#define MBEDTLS_SSL_MAX_FRAG_LEN_2048 3 /*!< MaxFragmentLength 2^11 */ +#define MBEDTLS_SSL_MAX_FRAG_LEN_4096 4 /*!< MaxFragmentLength 2^12 */ +#define MBEDTLS_SSL_MAX_FRAG_LEN_INVALID 5 /*!< first invalid value */ + +#define MBEDTLS_SSL_IS_CLIENT 0 +#define MBEDTLS_SSL_IS_SERVER 1 + +#define MBEDTLS_SSL_IS_NOT_FALLBACK 0 +#define MBEDTLS_SSL_IS_FALLBACK 1 + +#define MBEDTLS_SSL_EXTENDED_MS_DISABLED 0 +#define MBEDTLS_SSL_EXTENDED_MS_ENABLED 1 + +#define MBEDTLS_SSL_CID_DISABLED 0 +#define MBEDTLS_SSL_CID_ENABLED 1 + +#define MBEDTLS_SSL_ETM_DISABLED 0 +#define MBEDTLS_SSL_ETM_ENABLED 1 + +#define MBEDTLS_SSL_COMPRESS_NULL 0 +#define MBEDTLS_SSL_COMPRESS_DEFLATE 1 + +#define MBEDTLS_SSL_VERIFY_NONE 0 +#define MBEDTLS_SSL_VERIFY_OPTIONAL 1 +#define MBEDTLS_SSL_VERIFY_REQUIRED 2 +#define MBEDTLS_SSL_VERIFY_UNSET 3 /* Used only for sni_authmode */ + +#define MBEDTLS_SSL_LEGACY_RENEGOTIATION 0 +#define MBEDTLS_SSL_SECURE_RENEGOTIATION 1 + +#define MBEDTLS_SSL_RENEGOTIATION_DISABLED 0 +#define MBEDTLS_SSL_RENEGOTIATION_ENABLED 1 + +#define MBEDTLS_SSL_ANTI_REPLAY_DISABLED 0 +#define MBEDTLS_SSL_ANTI_REPLAY_ENABLED 1 + +#define MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED -1 +#define MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT 16 + +#define MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION 0 +#define MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION 1 +#define MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE 2 + +#define MBEDTLS_SSL_TRUNC_HMAC_DISABLED 0 +#define MBEDTLS_SSL_TRUNC_HMAC_ENABLED 1 +#define MBEDTLS_SSL_TRUNCATED_HMAC_LEN 10 /* 80 bits, rfc 6066 section 7 */ + +#define MBEDTLS_SSL_SESSION_TICKETS_DISABLED 0 +#define MBEDTLS_SSL_SESSION_TICKETS_ENABLED 1 + +#define MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED 0 +#define MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED 1 + +#define MBEDTLS_SSL_ARC4_ENABLED 0 +#define MBEDTLS_SSL_ARC4_DISABLED 1 + +#define MBEDTLS_SSL_PRESET_DEFAULT 0 +#define MBEDTLS_SSL_PRESET_SUITEB 2 + +#define MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED 1 +#define MBEDTLS_SSL_CERT_REQ_CA_LIST_DISABLED 0 + +#define MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED 0 +#define MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED 1 + +/* + * Default range for DTLS retransmission timer value, in milliseconds. + * RFC 6347 4.2.4.1 says from 1 second to 60 seconds. + */ +#define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN 1000 +#define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX 60000 + +/** + * \name SECTION: Module settings + * + * The configuration options you can set for this module are in this section. + * Either change them in config.h or define them on the compiler command line. + * \{ + */ + +#if !defined(MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME) +#define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ +#endif + +/* + * Maximum fragment length in bytes, + * determines the size of each of the two internal I/O buffers. + * + * Note: the RFC defines the default size of SSL / TLS messages. If you + * change the value here, other clients / servers may not be able to + * communicate with you anymore. Only change this value if you control + * both sides of the connection and have it reduced at both sides, or + * if you're using the Max Fragment Length extension and you know all your + * peers are using it too! + */ +#if !defined(MBEDTLS_SSL_MAX_CONTENT_LEN) +#define MBEDTLS_SSL_MAX_CONTENT_LEN 16384 /**< Size of the input / output buffer */ +#endif + +#if !defined(MBEDTLS_SSL_IN_CONTENT_LEN) +#define MBEDTLS_SSL_IN_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN +#endif + +#if !defined(MBEDTLS_SSL_OUT_CONTENT_LEN) +#define MBEDTLS_SSL_OUT_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN +#endif + +/* + * Maximum number of heap-allocated bytes for the purpose of + * DTLS handshake message reassembly and future message buffering. + */ +#if !defined(MBEDTLS_SSL_DTLS_MAX_BUFFERING) +#define MBEDTLS_SSL_DTLS_MAX_BUFFERING 32768 +#endif + +/* + * Maximum length of CIDs for incoming and outgoing messages. + */ +#if !defined(MBEDTLS_SSL_CID_IN_LEN_MAX) +#define MBEDTLS_SSL_CID_IN_LEN_MAX 32 +#endif + +#if !defined(MBEDTLS_SSL_CID_OUT_LEN_MAX) +#define MBEDTLS_SSL_CID_OUT_LEN_MAX 32 +#endif + +#if !defined(MBEDTLS_SSL_CID_PADDING_GRANULARITY) +#define MBEDTLS_SSL_CID_PADDING_GRANULARITY 16 +#endif + +#if !defined(MBEDTLS_SSL_TLS1_3_PADDING_GRANULARITY) +#define MBEDTLS_SSL_TLS1_3_PADDING_GRANULARITY 1 +#endif + +/** \} name SECTION: Module settings */ + +/* + * Length of the verify data for secure renegotiation + */ +#if defined(MBEDTLS_SSL_PROTO_SSL3) +#define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 36 +#else +#define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 12 +#endif + +/* + * Signaling ciphersuite values (SCSV) + */ +#define MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO 0xFF /**< renegotiation info ext */ +#define MBEDTLS_SSL_FALLBACK_SCSV_VALUE 0x5600 /**< RFC 7507 section 2 */ + +/* + * Supported Signature and Hash algorithms (For TLS 1.2) + * RFC 5246 section 7.4.1.4.1 + */ +#define MBEDTLS_SSL_HASH_NONE 0 +#define MBEDTLS_SSL_HASH_MD5 1 +#define MBEDTLS_SSL_HASH_SHA1 2 +#define MBEDTLS_SSL_HASH_SHA224 3 +#define MBEDTLS_SSL_HASH_SHA256 4 +#define MBEDTLS_SSL_HASH_SHA384 5 +#define MBEDTLS_SSL_HASH_SHA512 6 + +#define MBEDTLS_SSL_SIG_ANON 0 +#define MBEDTLS_SSL_SIG_RSA 1 +#define MBEDTLS_SSL_SIG_ECDSA 3 + +/* + * Client Certificate Types + * RFC 5246 section 7.4.4 plus RFC 4492 section 5.5 + */ +#define MBEDTLS_SSL_CERT_TYPE_RSA_SIGN 1 +#define MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN 64 + +/* + * Message, alert and handshake types + */ +#define MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC 20 +#define MBEDTLS_SSL_MSG_ALERT 21 +#define MBEDTLS_SSL_MSG_HANDSHAKE 22 +#define MBEDTLS_SSL_MSG_APPLICATION_DATA 23 +#define MBEDTLS_SSL_MSG_CID 25 + +#define MBEDTLS_SSL_ALERT_LEVEL_WARNING 1 +#define MBEDTLS_SSL_ALERT_LEVEL_FATAL 2 + +#define MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY 0 /* 0x00 */ +#define MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE 10 /* 0x0A */ +#define MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC 20 /* 0x14 */ +#define MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED 21 /* 0x15 */ +#define MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW 22 /* 0x16 */ +#define MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE 30 /* 0x1E */ +#define MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE 40 /* 0x28 */ +#define MBEDTLS_SSL_ALERT_MSG_NO_CERT 41 /* 0x29 */ +#define MBEDTLS_SSL_ALERT_MSG_BAD_CERT 42 /* 0x2A */ +#define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT 43 /* 0x2B */ +#define MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED 44 /* 0x2C */ +#define MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED 45 /* 0x2D */ +#define MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN 46 /* 0x2E */ +#define MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER 47 /* 0x2F */ +#define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA 48 /* 0x30 */ +#define MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED 49 /* 0x31 */ +#define MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR 50 /* 0x32 */ +#define MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR 51 /* 0x33 */ +#define MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION 60 /* 0x3C */ +#define MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION 70 /* 0x46 */ +#define MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY 71 /* 0x47 */ +#define MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR 80 /* 0x50 */ +#define MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK 86 /* 0x56 */ +#define MBEDTLS_SSL_ALERT_MSG_USER_CANCELED 90 /* 0x5A */ +#define MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION 100 /* 0x64 */ +#define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT 110 /* 0x6E */ +#define MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME 112 /* 0x70 */ +#define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY 115 /* 0x73 */ +#define MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL 120 /* 0x78 */ + +#define MBEDTLS_SSL_HS_HELLO_REQUEST 0 +#define MBEDTLS_SSL_HS_CLIENT_HELLO 1 +#define MBEDTLS_SSL_HS_SERVER_HELLO 2 +#define MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST 3 +#define MBEDTLS_SSL_HS_NEW_SESSION_TICKET 4 +#define MBEDTLS_SSL_HS_CERTIFICATE 11 +#define MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE 12 +#define MBEDTLS_SSL_HS_CERTIFICATE_REQUEST 13 +#define MBEDTLS_SSL_HS_SERVER_HELLO_DONE 14 +#define MBEDTLS_SSL_HS_CERTIFICATE_VERIFY 15 +#define MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE 16 +#define MBEDTLS_SSL_HS_FINISHED 20 + +/* + * TLS extensions + */ +#define MBEDTLS_TLS_EXT_SERVERNAME 0 +#define MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME 0 + +#define MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH 1 + +#define MBEDTLS_TLS_EXT_TRUNCATED_HMAC 4 + +#define MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES 10 +#define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS 11 + +#define MBEDTLS_TLS_EXT_SIG_ALG 13 + +#define MBEDTLS_TLS_EXT_USE_SRTP 14 + +#define MBEDTLS_TLS_EXT_ALPN 16 + +#define MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC 22 /* 0x16 */ +#define MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET 0x0017 /* 23 */ + +#define MBEDTLS_TLS_EXT_SESSION_TICKET 35 + +/* The value of the CID extension is still TBD as of + * draft-ietf-tls-dtls-connection-id-05 + * (https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05). + * + * A future minor revision of Mbed TLS may change the default value of + * this option to match evolving standards and usage. + */ +#if !defined(MBEDTLS_TLS_EXT_CID) +#define MBEDTLS_TLS_EXT_CID 254 /* TBD */ +#endif + +#define MBEDTLS_TLS_EXT_ECJPAKE_KKPP 256 /* experimental */ + +#define MBEDTLS_TLS_EXT_RENEGOTIATION_INFO 0xFF01 + +/* + * Size defines + */ +#if !defined(MBEDTLS_PSK_MAX_LEN) +#define MBEDTLS_PSK_MAX_LEN 32 /* 256 bits */ +#endif + +/* Dummy type used only for its size */ +union mbedtls_ssl_premaster_secret { + unsigned char dummy; /* Make the union non-empty even with SSL disabled */ +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) + unsigned char _pms_rsa[48]; /* RFC 5246 8.1.1 */ +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) + unsigned char _pms_dhm[MBEDTLS_MPI_MAX_SIZE]; /* RFC 5246 8.1.2 */ +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) + unsigned char _pms_ecdh[MBEDTLS_ECP_MAX_BYTES]; /* RFC 4492 5.10 */ +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) + unsigned char _pms_psk[4 + 2 * MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 2 */ +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) + unsigned char _pms_dhe_psk[4 + MBEDTLS_MPI_MAX_SIZE + + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 3 */ +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) + unsigned char _pms_rsa_psk[52 + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 4 */ +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) + unsigned char _pms_ecdhe_psk[4 + MBEDTLS_ECP_MAX_BYTES + + MBEDTLS_PSK_MAX_LEN]; /* RFC 5489 2 */ +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + unsigned char _pms_ecjpake[32]; /* Thread spec: SHA-256 output */ +#endif +}; + +#define MBEDTLS_PREMASTER_SIZE sizeof(union mbedtls_ssl_premaster_secret) + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * SSL state machine + */ +typedef enum { + MBEDTLS_SSL_HELLO_REQUEST, + MBEDTLS_SSL_CLIENT_HELLO, + MBEDTLS_SSL_SERVER_HELLO, + MBEDTLS_SSL_SERVER_CERTIFICATE, + MBEDTLS_SSL_SERVER_KEY_EXCHANGE, + MBEDTLS_SSL_CERTIFICATE_REQUEST, + MBEDTLS_SSL_SERVER_HELLO_DONE, + MBEDTLS_SSL_CLIENT_CERTIFICATE, + MBEDTLS_SSL_CLIENT_KEY_EXCHANGE, + MBEDTLS_SSL_CERTIFICATE_VERIFY, + MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC, + MBEDTLS_SSL_CLIENT_FINISHED, + MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC, + MBEDTLS_SSL_SERVER_FINISHED, + MBEDTLS_SSL_FLUSH_BUFFERS, + MBEDTLS_SSL_HANDSHAKE_WRAPUP, + MBEDTLS_SSL_HANDSHAKE_OVER, + MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET, + MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT, +} +mbedtls_ssl_states; + +/* + * The tls_prf function types. + */ +typedef enum { + MBEDTLS_SSL_TLS_PRF_NONE, + MBEDTLS_SSL_TLS_PRF_SSL3, + MBEDTLS_SSL_TLS_PRF_TLS1, + MBEDTLS_SSL_TLS_PRF_SHA384, + MBEDTLS_SSL_TLS_PRF_SHA256 +} +mbedtls_tls_prf_types; +/** + * \brief Callback type: send data on the network. + * + * \note That callback may be either blocking or non-blocking. + * + * \param ctx Context for the send callback (typically a file descriptor) + * \param buf Buffer holding the data to send + * \param len Length of the data to send + * + * \return The callback must return the number of bytes sent if any, + * or a non-zero error code. + * If performing non-blocking I/O, \c MBEDTLS_ERR_SSL_WANT_WRITE + * must be returned when the operation would block. + * + * \note The callback is allowed to send fewer bytes than requested. + * It must always return the number of bytes actually sent. + */ +typedef int mbedtls_ssl_send_t(void *ctx, + const unsigned char *buf, + size_t len); + +/** + * \brief Callback type: receive data from the network. + * + * \note That callback may be either blocking or non-blocking. + * + * \param ctx Context for the receive callback (typically a file + * descriptor) + * \param buf Buffer to write the received data to + * \param len Length of the receive buffer + * + * \returns If data has been received, the positive number of bytes received. + * \returns \c 0 if the connection has been closed. + * \returns If performing non-blocking I/O, \c MBEDTLS_ERR_SSL_WANT_READ + * must be returned when the operation would block. + * \returns Another negative error code on other kinds of failures. + * + * \note The callback may receive fewer bytes than the length of the + * buffer. It must always return the number of bytes actually + * received and written to the buffer. + */ +typedef int mbedtls_ssl_recv_t(void *ctx, + unsigned char *buf, + size_t len); + +/** + * \brief Callback type: receive data from the network, with timeout + * + * \note That callback must block until data is received, or the + * timeout delay expires, or the operation is interrupted by a + * signal. + * + * \param ctx Context for the receive callback (typically a file descriptor) + * \param buf Buffer to write the received data to + * \param len Length of the receive buffer + * \param timeout Maximum number of milliseconds to wait for data + * 0 means no timeout (potentially waiting forever) + * + * \return The callback must return the number of bytes received, + * or a non-zero error code: + * \c MBEDTLS_ERR_SSL_TIMEOUT if the operation timed out, + * \c MBEDTLS_ERR_SSL_WANT_READ if interrupted by a signal. + * + * \note The callback may receive fewer bytes than the length of the + * buffer. It must always return the number of bytes actually + * received and written to the buffer. + */ +typedef int mbedtls_ssl_recv_timeout_t(void *ctx, + unsigned char *buf, + size_t len, + uint32_t timeout); +/** + * \brief Callback type: set a pair of timers/delays to watch + * + * \param ctx Context pointer + * \param int_ms Intermediate delay in milliseconds + * \param fin_ms Final delay in milliseconds + * 0 cancels the current timer. + * + * \note This callback must at least store the necessary information + * for the associated \c mbedtls_ssl_get_timer_t callback to + * return correct information. + * + * \note If using an event-driven style of programming, an event must + * be generated when the final delay is passed. The event must + * cause a call to \c mbedtls_ssl_handshake() with the proper + * SSL context to be scheduled. Care must be taken to ensure + * that at most one such call happens at a time. + * + * \note Only one timer at a time must be running. Calling this + * function while a timer is running must cancel it. Cancelled + * timers must not generate any event. + */ +typedef void mbedtls_ssl_set_timer_t(void *ctx, + uint32_t int_ms, + uint32_t fin_ms); + +/** + * \brief Callback type: get status of timers/delays + * + * \param ctx Context pointer + * + * \return This callback must return: + * -1 if cancelled (fin_ms == 0), + * 0 if none of the delays have passed, + * 1 if only the intermediate delay has passed, + * 2 if the final delay has passed. + */ +typedef int mbedtls_ssl_get_timer_t(void *ctx); + +/* Defined below */ +typedef struct mbedtls_ssl_session mbedtls_ssl_session; +typedef struct mbedtls_ssl_context mbedtls_ssl_context; +typedef struct mbedtls_ssl_config mbedtls_ssl_config; + +/* Defined in ssl_internal.h */ +typedef struct mbedtls_ssl_transform mbedtls_ssl_transform; +typedef struct mbedtls_ssl_handshake_params mbedtls_ssl_handshake_params; +typedef struct mbedtls_ssl_sig_hash_set_t mbedtls_ssl_sig_hash_set_t; +#if defined(MBEDTLS_X509_CRT_PARSE_C) +typedef struct mbedtls_ssl_key_cert mbedtls_ssl_key_cert; +#endif +#if defined(MBEDTLS_SSL_PROTO_DTLS) +typedef struct mbedtls_ssl_flight_item mbedtls_ssl_flight_item; +#endif + +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) +#if defined(MBEDTLS_X509_CRT_PARSE_C) +/** + * \brief Callback type: start external signature operation. + * + * This callback is called during an SSL handshake to start + * a signature decryption operation using an + * external processor. The parameter \p cert contains + * the public key; it is up to the callback function to + * determine how to access the associated private key. + * + * This function typically sends or enqueues a request, and + * does not wait for the operation to complete. This allows + * the handshake step to be non-blocking. + * + * The parameters \p ssl and \p cert are guaranteed to remain + * valid throughout the handshake. On the other hand, this + * function must save the contents of \p hash if the value + * is needed for later processing, because the \p hash buffer + * is no longer valid after this function returns. + * + * This function may call mbedtls_ssl_set_async_operation_data() + * to store an operation context for later retrieval + * by the resume or cancel callback. + * + * \note For RSA signatures, this function must produce output + * that is consistent with PKCS#1 v1.5 in the same way as + * mbedtls_rsa_pkcs1_sign(). Before the private key operation, + * apply the padding steps described in RFC 8017, section 9.2 + * "EMSA-PKCS1-v1_5" as follows. + * - If \p md_alg is #MBEDTLS_MD_NONE, apply the PKCS#1 v1.5 + * encoding, treating \p hash as the DigestInfo to be + * padded. In other words, apply EMSA-PKCS1-v1_5 starting + * from step 3, with `T = hash` and `tLen = hash_len`. + * - If `md_alg != MBEDTLS_MD_NONE`, apply the PKCS#1 v1.5 + * encoding, treating \p hash as the hash to be encoded and + * padded. In other words, apply EMSA-PKCS1-v1_5 starting + * from step 2, with `digestAlgorithm` obtained by calling + * mbedtls_oid_get_oid_by_md() on \p md_alg. + * + * \note For ECDSA signatures, the output format is the DER encoding + * `Ecdsa-Sig-Value` defined in + * [RFC 4492 section 5.4](https://tools.ietf.org/html/rfc4492#section-5.4). + * + * \param ssl The SSL connection instance. It should not be + * modified other than via + * mbedtls_ssl_set_async_operation_data(). + * \param cert Certificate containing the public key. + * In simple cases, this is one of the pointers passed to + * mbedtls_ssl_conf_own_cert() when configuring the SSL + * connection. However, if other callbacks are used, this + * property may not hold. For example, if an SNI callback + * is registered with mbedtls_ssl_conf_sni(), then + * this callback determines what certificate is used. + * \param md_alg Hash algorithm. + * \param hash Buffer containing the hash. This buffer is + * no longer valid when the function returns. + * \param hash_len Size of the \c hash buffer in bytes. + * + * \return 0 if the operation was started successfully and the SSL + * stack should call the resume callback immediately. + * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation + * was started successfully and the SSL stack should return + * immediately without calling the resume callback yet. + * \return #MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH if the external + * processor does not support this key. The SSL stack will + * use the private key object instead. + * \return Any other error indicates a fatal failure and is + * propagated up the call chain. The callback should + * use \c MBEDTLS_ERR_PK_xxx error codes, and must not + * use \c MBEDTLS_ERR_SSL_xxx error codes except as + * directed in the documentation of this callback. + */ +typedef int mbedtls_ssl_async_sign_t(mbedtls_ssl_context *ssl, + mbedtls_x509_crt *cert, + mbedtls_md_type_t md_alg, + const unsigned char *hash, + size_t hash_len); + +/** + * \brief Callback type: start external decryption operation. + * + * This callback is called during an SSL handshake to start + * an RSA decryption operation using an + * external processor. The parameter \p cert contains + * the public key; it is up to the callback function to + * determine how to access the associated private key. + * + * This function typically sends or enqueues a request, and + * does not wait for the operation to complete. This allows + * the handshake step to be non-blocking. + * + * The parameters \p ssl and \p cert are guaranteed to remain + * valid throughout the handshake. On the other hand, this + * function must save the contents of \p input if the value + * is needed for later processing, because the \p input buffer + * is no longer valid after this function returns. + * + * This function may call mbedtls_ssl_set_async_operation_data() + * to store an operation context for later retrieval + * by the resume or cancel callback. + * + * \warning RSA decryption as used in TLS is subject to a potential + * timing side channel attack first discovered by Bleichenbacher + * in 1998. This attack can be remotely exploitable + * in practice. To avoid this attack, you must ensure that + * if the callback performs an RSA decryption, the time it + * takes to execute and return the result does not depend + * on whether the RSA decryption succeeded or reported + * invalid padding. + * + * \param ssl The SSL connection instance. It should not be + * modified other than via + * mbedtls_ssl_set_async_operation_data(). + * \param cert Certificate containing the public key. + * In simple cases, this is one of the pointers passed to + * mbedtls_ssl_conf_own_cert() when configuring the SSL + * connection. However, if other callbacks are used, this + * property may not hold. For example, if an SNI callback + * is registered with mbedtls_ssl_conf_sni(), then + * this callback determines what certificate is used. + * \param input Buffer containing the input ciphertext. This buffer + * is no longer valid when the function returns. + * \param input_len Size of the \p input buffer in bytes. + * + * \return 0 if the operation was started successfully and the SSL + * stack should call the resume callback immediately. + * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation + * was started successfully and the SSL stack should return + * immediately without calling the resume callback yet. + * \return #MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH if the external + * processor does not support this key. The SSL stack will + * use the private key object instead. + * \return Any other error indicates a fatal failure and is + * propagated up the call chain. The callback should + * use \c MBEDTLS_ERR_PK_xxx error codes, and must not + * use \c MBEDTLS_ERR_SSL_xxx error codes except as + * directed in the documentation of this callback. + */ +typedef int mbedtls_ssl_async_decrypt_t(mbedtls_ssl_context *ssl, + mbedtls_x509_crt *cert, + const unsigned char *input, + size_t input_len); +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +/** + * \brief Callback type: resume external operation. + * + * This callback is called during an SSL handshake to resume + * an external operation started by the + * ::mbedtls_ssl_async_sign_t or + * ::mbedtls_ssl_async_decrypt_t callback. + * + * This function typically checks the status of a pending + * request or causes the request queue to make progress, and + * does not wait for the operation to complete. This allows + * the handshake step to be non-blocking. + * + * This function may call mbedtls_ssl_get_async_operation_data() + * to retrieve an operation context set by the start callback. + * It may call mbedtls_ssl_set_async_operation_data() to modify + * this context. + * + * Note that when this function returns a status other than + * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, it must free any + * resources associated with the operation. + * + * \param ssl The SSL connection instance. It should not be + * modified other than via + * mbedtls_ssl_set_async_operation_data(). + * \param output Buffer containing the output (signature or decrypted + * data) on success. + * \param output_len On success, number of bytes written to \p output. + * \param output_size Size of the \p output buffer in bytes. + * + * \return 0 if output of the operation is available in the + * \p output buffer. + * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation + * is still in progress. Subsequent requests for progress + * on the SSL connection will call the resume callback + * again. + * \return Any other error means that the operation is aborted. + * The SSL handshake is aborted. The callback should + * use \c MBEDTLS_ERR_PK_xxx error codes, and must not + * use \c MBEDTLS_ERR_SSL_xxx error codes except as + * directed in the documentation of this callback. + */ +typedef int mbedtls_ssl_async_resume_t(mbedtls_ssl_context *ssl, + unsigned char *output, + size_t *output_len, + size_t output_size); + +/** + * \brief Callback type: cancel external operation. + * + * This callback is called if an SSL connection is closed + * while an asynchronous operation is in progress. Note that + * this callback is not called if the + * ::mbedtls_ssl_async_resume_t callback has run and has + * returned a value other than + * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, since in that case + * the asynchronous operation has already completed. + * + * This function may call mbedtls_ssl_get_async_operation_data() + * to retrieve an operation context set by the start callback. + * + * \param ssl The SSL connection instance. It should not be + * modified. + */ +typedef void mbedtls_ssl_async_cancel_t(mbedtls_ssl_context *ssl); +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) && \ + !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) +#define MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN 48 +#if defined(MBEDTLS_SHA256_C) +#define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE MBEDTLS_MD_SHA256 +#define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN 32 +#elif defined(MBEDTLS_SHA512_C) +#define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE MBEDTLS_MD_SHA384 +#define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN 48 +#elif defined(MBEDTLS_SHA1_C) +#define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE MBEDTLS_MD_SHA1 +#define MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN 20 +#else +/* This is already checked in check_config.h, but be sure. */ +#error "Bad configuration - need SHA-1, SHA-256 or SHA-512 enabled to compute digest of peer CRT." +#endif +#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED && + !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + +#if defined(MBEDTLS_SSL_DTLS_SRTP) + +#define MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH 255 +#define MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH 4 +/* + * For code readability use a typedef for DTLS-SRTP profiles + * + * Use_srtp extension protection profiles values as defined in + * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml + * + * Reminder: if this list is expanded mbedtls_ssl_check_srtp_profile_value + * must be updated too. + */ +#define MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80 ((uint16_t) 0x0001) +#define MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32 ((uint16_t) 0x0002) +#define MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_80 ((uint16_t) 0x0005) +#define MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_32 ((uint16_t) 0x0006) +/* This one is not iana defined, but for code readability. */ +#define MBEDTLS_TLS_SRTP_UNSET ((uint16_t) 0x0000) + +typedef uint16_t mbedtls_ssl_srtp_profile; + +typedef struct mbedtls_dtls_srtp_info_t { + /*! The SRTP profile that was negotiated. */ + mbedtls_ssl_srtp_profile chosen_dtls_srtp_profile; + /*! The length of mki_value. */ + uint16_t mki_len; + /*! The mki_value used, with max size of 256 bytes. */ + unsigned char mki_value[MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH]; +} +mbedtls_dtls_srtp_info; + +#endif /* MBEDTLS_SSL_DTLS_SRTP */ + +/* + * This structure is used for storing current session data. + * + * Note: when changing this definition, we need to check and update: + * - in tests/suites/test_suite_ssl.function: + * ssl_populate_session() and ssl_serialize_session_save_load() + * - in library/ssl_tls.c: + * mbedtls_ssl_session_init() and mbedtls_ssl_session_free() + * mbedtls_ssl_session_save() and ssl_session_load() + * ssl_session_copy() + */ +struct mbedtls_ssl_session { +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) + unsigned char mfl_code; /*!< MaxFragmentLength negotiated by peer */ +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ + +#if defined(MBEDTLS_HAVE_TIME) + mbedtls_time_t start; /*!< starting time */ +#endif + int ciphersuite; /*!< chosen ciphersuite */ + int compression; /*!< chosen compression */ + size_t id_len; /*!< session id length */ + unsigned char id[32]; /*!< session identifier */ + unsigned char master[48]; /*!< the master secret */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + mbedtls_x509_crt *peer_cert; /*!< peer X.509 cert chain */ +#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + /*! The digest of the peer's end-CRT. This must be kept to detect CRT + * changes during renegotiation, mitigating the triple handshake attack. */ + unsigned char *peer_cert_digest; + size_t peer_cert_digest_len; + mbedtls_md_type_t peer_cert_digest_type; +#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + uint32_t verify_result; /*!< verification result */ + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) + unsigned char *ticket; /*!< RFC 5077 session ticket */ + size_t ticket_len; /*!< session ticket length */ + uint32_t ticket_lifetime; /*!< ticket lifetime hint */ +#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + int trunc_hmac; /*!< flag for truncated hmac activation */ +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + int encrypt_then_mac; /*!< flag for EtM activation */ +#endif +}; + +/** + * SSL/TLS configuration to be shared between mbedtls_ssl_context structures. + */ +struct mbedtls_ssl_config { + /* Group items by size and reorder them to maximize usage of immediate offset access. */ + + /* + * Numerical settings (char) + */ + + unsigned char max_major_ver; /*!< max. major version used */ + unsigned char max_minor_ver; /*!< max. minor version used */ + unsigned char min_major_ver; /*!< min. major version used */ + unsigned char min_minor_ver; /*!< min. minor version used */ + + /* + * Flags (could be bit-fields to save RAM, but separate bytes make + * the code smaller on architectures with an instruction for direct + * byte access). + */ + + uint8_t endpoint /*bool*/; /*!< 0: client, 1: server */ + uint8_t transport /*bool*/; /*!< stream (TLS) or datagram (DTLS) */ + uint8_t authmode /*2 bits*/; /*!< MBEDTLS_SSL_VERIFY_XXX */ + /* needed even with renego disabled for LEGACY_BREAK_HANDSHAKE */ + uint8_t allow_legacy_renegotiation /*2 bits*/; /*!< MBEDTLS_LEGACY_XXX */ +#if defined(MBEDTLS_ARC4_C) + uint8_t arc4_disabled /*bool*/; /*!< blacklist RC4 ciphersuites? */ +#endif +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) + uint8_t mfl_code /*3 bits*/; /*!< desired fragment length */ +#endif +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + uint8_t encrypt_then_mac /*bool*/; /*!< negotiate encrypt-then-mac? */ +#endif +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) + uint8_t extended_ms /*bool*/; /*!< negotiate extended master secret? */ +#endif +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) + uint8_t anti_replay /*bool*/; /*!< detect and prevent replay? */ +#endif +#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) + uint8_t cbc_record_splitting /*bool*/; /*!< do cbc record splitting */ +#endif +#if defined(MBEDTLS_SSL_RENEGOTIATION) + uint8_t disable_renegotiation /*bool*/; /*!< disable renegotiation? */ +#endif +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + uint8_t trunc_hmac /*bool*/; /*!< negotiate truncated hmac? */ +#endif +#if defined(MBEDTLS_SSL_SESSION_TICKETS) + uint8_t session_tickets /*bool*/; /*!< use session tickets? */ +#endif +#if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) + uint8_t fallback /*bool*/; /*!< is this a fallback? */ +#endif +#if defined(MBEDTLS_SSL_SRV_C) + uint8_t cert_req_ca_list /*bool*/; /*!< enable sending CA list in + Certificate Request messages? */ +#endif +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + uint8_t ignore_unexpected_cid /*bool*/; /*!< Determines whether DTLS + * record with unexpected CID + * should lead to failure. */ +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ +#if defined(MBEDTLS_SSL_DTLS_SRTP) + uint8_t dtls_srtp_mki_support /*bool*/; /*!< support having mki_value + in the use_srtp extension? */ +#endif + + /* + * Numerical settings (int or larger) + */ + + uint32_t read_timeout; /*!< timeout for mbedtls_ssl_read (ms) */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + uint32_t hs_timeout_min; /*!< initial value of the handshake + retransmission timeout (ms) */ + uint32_t hs_timeout_max; /*!< maximum value of the handshake + retransmission timeout (ms) */ +#endif + +#if defined(MBEDTLS_SSL_RENEGOTIATION) + int renego_max_records; /*!< grace period for renegotiation */ + unsigned char renego_period[8]; /*!< value of the record counters + that triggers renegotiation */ +#endif + +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) + unsigned int badmac_limit; /*!< limit of records with a bad MAC */ +#endif + +#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) + unsigned int dhm_min_bitlen; /*!< min. bit length of the DHM prime */ +#endif + + /* + * Pointers + */ + + const int *ciphersuite_list[4]; /*!< allowed ciphersuites per version */ + + /** Callback for printing debug output */ + void (*f_dbg)(void *, int, const char *, int, const char *); + void *p_dbg; /*!< context for the debug function */ + + /** Callback for getting (pseudo-)random numbers */ + int (*f_rng)(void *, unsigned char *, size_t); + void *p_rng; /*!< context for the RNG function */ + + /** Callback to retrieve a session from the cache */ + int (*f_get_cache)(void *, mbedtls_ssl_session *); + /** Callback to store a session into the cache */ + int (*f_set_cache)(void *, const mbedtls_ssl_session *); + void *p_cache; /*!< context for cache callbacks */ + +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) + /** Callback for setting cert according to SNI extension */ + int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, size_t); + void *p_sni; /*!< context for SNI callback */ +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + /** Callback to customize X.509 certificate chain verification */ + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *); + void *p_vrfy; /*!< context for X.509 verify calllback */ +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) + /** Callback to retrieve PSK key from identity */ + int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, size_t); + void *p_psk; /*!< context for PSK callback */ +#endif + +#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) + /** Callback to create & write a cookie for ClientHello verification */ + int (*f_cookie_write)(void *, unsigned char **, unsigned char *, + const unsigned char *, size_t); + /** Callback to verify validity of a ClientHello cookie */ + int (*f_cookie_check)(void *, const unsigned char *, size_t, + const unsigned char *, size_t); + void *p_cookie; /*!< context for the cookie callbacks */ +#endif + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) + /** Callback to create & write a session ticket */ + int (*f_ticket_write)(void *, const mbedtls_ssl_session *, + unsigned char *, const unsigned char *, size_t *, uint32_t *); + /** Callback to parse a session ticket into a session structure */ + int (*f_ticket_parse)(void *, mbedtls_ssl_session *, unsigned char *, size_t); + void *p_ticket; /*!< context for the ticket callbacks */ +#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ + +#if defined(MBEDTLS_SSL_EXPORT_KEYS) + /** Callback to export key block and master secret */ + int (*f_export_keys)(void *, const unsigned char *, + const unsigned char *, size_t, size_t, size_t); + /** Callback to export key block, master secret, + * tls_prf and random bytes. Should replace f_export_keys */ + int (*f_export_keys_ext)(void *, const unsigned char *, + const unsigned char *, size_t, size_t, size_t, + const unsigned char[32], const unsigned char[32], + mbedtls_tls_prf_types); + void *p_export_keys; /*!< context for key export callback */ +#endif + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + size_t cid_len; /*!< The length of CIDs for incoming DTLS records. */ +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + const mbedtls_x509_crt_profile *cert_profile; /*!< verification profile */ + mbedtls_ssl_key_cert *key_cert; /*!< own certificate/key pair(s) */ + mbedtls_x509_crt *ca_chain; /*!< trusted CAs */ + mbedtls_x509_crl *ca_crl; /*!< trusted CAs CRLs */ +#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) + mbedtls_x509_crt_ca_cb_t f_ca_cb; + void *p_ca_cb; +#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) +#if defined(MBEDTLS_X509_CRT_PARSE_C) + mbedtls_ssl_async_sign_t *f_async_sign_start; /*!< start asynchronous signature operation */ + mbedtls_ssl_async_decrypt_t *f_async_decrypt_start; /*!< start asynchronous decryption operation */ +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + mbedtls_ssl_async_resume_t *f_async_resume; /*!< resume asynchronous operation */ + mbedtls_ssl_async_cancel_t *f_async_cancel; /*!< cancel asynchronous operation */ + void *p_async_config_data; /*!< Configuration data set by mbedtls_ssl_conf_async_private_cb(). */ +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + const int *sig_hashes; /*!< allowed signature hashes */ +#endif + +#if defined(MBEDTLS_ECP_C) + const mbedtls_ecp_group_id *curve_list; /*!< allowed curves */ +#endif + +#if defined(MBEDTLS_DHM_C) + mbedtls_mpi dhm_P; /*!< prime modulus for DHM */ + mbedtls_mpi dhm_G; /*!< generator for DHM */ +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_key_id_t psk_opaque; /*!< PSA key slot holding opaque PSK. This field + * should only be set via + * mbedtls_ssl_conf_psk_opaque(). + * If either no PSK or a raw PSK have been + * configured, this has value \c 0. + */ +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + unsigned char *psk; /*!< The raw pre-shared key. This field should + * only be set via mbedtls_ssl_conf_psk(). + * If either no PSK or an opaque PSK + * have been configured, this has value NULL. */ + size_t psk_len; /*!< The length of the raw pre-shared key. + * This field should only be set via + * mbedtls_ssl_conf_psk(). + * Its value is non-zero if and only if + * \c psk is not \c NULL. */ + + unsigned char *psk_identity; /*!< The PSK identity for PSK negotiation. + * This field should only be set via + * mbedtls_ssl_conf_psk(). + * This is set if and only if either + * \c psk or \c psk_opaque are set. */ + size_t psk_identity_len;/*!< The length of PSK identity. + * This field should only be set via + * mbedtls_ssl_conf_psk(). + * Its value is non-zero if and only if + * \c psk is not \c NULL or \c psk_opaque + * is not \c 0. */ +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ + +#if defined(MBEDTLS_SSL_ALPN) + const char **alpn_list; /*!< ordered list of protocols */ +#endif + +#if defined(MBEDTLS_SSL_DTLS_SRTP) + /*! ordered list of supported srtp profile */ + const mbedtls_ssl_srtp_profile *dtls_srtp_profile_list; + /*! number of supported profiles */ + size_t dtls_srtp_profile_list_len; +#endif /* MBEDTLS_SSL_DTLS_SRTP */ +}; + +struct mbedtls_ssl_context { + const mbedtls_ssl_config *conf; /*!< configuration information */ + + /* + * Miscellaneous + */ + int state; /*!< SSL handshake: current state */ +#if defined(MBEDTLS_SSL_RENEGOTIATION) + int renego_status; /*!< Initial, in progress, pending? */ + int renego_records_seen; /*!< Records since renego request, or with DTLS, + number of retransmissions of request if + renego_max_records is < 0 */ +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + + int major_ver; /*!< equal to MBEDTLS_SSL_MAJOR_VERSION_3 */ + int minor_ver; /*!< either 0 (SSL3) or 1 (TLS1.0) */ + +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) + unsigned badmac_seen; /*!< records with a bad MAC received */ +#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + /** Callback to customize X.509 certificate chain verification */ + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *); + void *p_vrfy; /*!< context for X.509 verify callback */ +#endif + + mbedtls_ssl_send_t *f_send; /*!< Callback for network send */ + mbedtls_ssl_recv_t *f_recv; /*!< Callback for network receive */ + mbedtls_ssl_recv_timeout_t *f_recv_timeout; + /*!< Callback for network receive with timeout */ + + void *p_bio; /*!< context for I/O operations */ + + /* + * Session layer + */ + mbedtls_ssl_session *session_in; /*!< current session data (in) */ + mbedtls_ssl_session *session_out; /*!< current session data (out) */ + mbedtls_ssl_session *session; /*!< negotiated session data */ + mbedtls_ssl_session *session_negotiate; /*!< session data in negotiation */ + + mbedtls_ssl_handshake_params *handshake; /*!< params required only during + the handshake process */ + + /* + * Record layer transformations + */ + mbedtls_ssl_transform *transform_in; /*!< current transform params (in) */ + mbedtls_ssl_transform *transform_out; /*!< current transform params (in) */ + mbedtls_ssl_transform *transform; /*!< negotiated transform params */ + mbedtls_ssl_transform *transform_negotiate; /*!< transform params in negotiation */ + + /* + * Timers + */ + void *p_timer; /*!< context for the timer callbacks */ + + mbedtls_ssl_set_timer_t *f_set_timer; /*!< set timer callback */ + mbedtls_ssl_get_timer_t *f_get_timer; /*!< get timer callback */ + + /* + * Record layer (incoming data) + */ + unsigned char *in_buf; /*!< input buffer */ + unsigned char *in_ctr; /*!< 64-bit incoming message counter + TLS: maintained by us + DTLS: read from peer */ + unsigned char *in_hdr; /*!< start of record header */ +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + unsigned char *in_cid; /*!< The start of the CID; + * (the end is marked by in_len). */ +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + unsigned char *in_len; /*!< two-bytes message length field */ + unsigned char *in_iv; /*!< ivlen-byte IV */ + unsigned char *in_msg; /*!< message contents (in_iv+ivlen) */ + unsigned char *in_offt; /*!< read offset in application data */ + + int in_msgtype; /*!< record header: message type */ + size_t in_msglen; /*!< record header: message length */ + size_t in_left; /*!< amount of data read so far */ +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + size_t in_buf_len; /*!< length of input buffer */ +#endif +#if defined(MBEDTLS_SSL_PROTO_DTLS) + uint16_t in_epoch; /*!< DTLS epoch for incoming records */ + size_t next_record_offset; /*!< offset of the next record in datagram + (equal to in_left if none) */ +#endif /* MBEDTLS_SSL_PROTO_DTLS */ +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) + uint64_t in_window_top; /*!< last validated record seq_num */ + uint64_t in_window; /*!< bitmask for replay detection */ +#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ + + size_t in_hslen; /*!< current handshake message length, + including the handshake header */ + int nb_zero; /*!< # of 0-length encrypted messages */ + + int keep_current_message; /*!< drop or reuse current message + on next call to record layer? */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + uint8_t disable_datagram_packing; /*!< Disable packing multiple records + * within a single datagram. */ +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + /* + * Record layer (outgoing data) + */ + unsigned char *out_buf; /*!< output buffer */ + unsigned char *out_ctr; /*!< 64-bit outgoing message counter */ + unsigned char *out_hdr; /*!< start of record header */ +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + unsigned char *out_cid; /*!< The start of the CID; + * (the end is marked by in_len). */ +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + unsigned char *out_len; /*!< two-bytes message length field */ + unsigned char *out_iv; /*!< ivlen-byte IV */ + unsigned char *out_msg; /*!< message contents (out_iv+ivlen) */ + + int out_msgtype; /*!< record header: message type */ + size_t out_msglen; /*!< record header: message length */ + size_t out_left; /*!< amount of data not yet written */ +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + size_t out_buf_len; /*!< length of output buffer */ +#endif + + unsigned char cur_out_ctr[8]; /*!< Outgoing record sequence number. */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + uint16_t mtu; /*!< path mtu, used to fragment outgoing messages */ +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +#if defined(MBEDTLS_ZLIB_SUPPORT) + unsigned char *compress_buf; /*!< zlib data buffer */ +#endif /* MBEDTLS_ZLIB_SUPPORT */ +#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) + signed char split_done; /*!< current record already split? */ +#endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ + + /* + * PKI layer + */ + int client_auth; /*!< flag for client auth. */ + + /* + * User settings + */ +#if defined(MBEDTLS_X509_CRT_PARSE_C) + /** Expected peer CN for verification. + * + * Also used on clients for SNI. + * + * The value of this field can be: + * - \p NULL in a newly initialized or reset context. + * - A heap-allocated copy of the last value passed to + * mbedtls_ssl_set_hostname(), if the last call had a non-null + * \p hostname argument. + * - A special value to indicate that mbedtls_ssl_set_hostname() + * was called with \p NULL (as opposed to never having been called). + * + * If you need to obtain the value passed to + * mbedtls_ssl_set_hostname() even if it may have been called with + * \p NULL, call mbedtls_ssl_get_hostname_pointer(). + * + * If this field contains the value \p NULL and the configuration option + * #MBEDTLS_SSL_CLI_ALLOW_WEAK_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME + * is unset, on a TLS client, attempting to verify a server certificate + * results in the error + * #MBEDTLS_ERR_SSL_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME. + * + * If this field contains the special value described above, or if + * the value is \p NULL and the configuration option + * #MBEDTLS_SSL_CLI_ALLOW_WEAK_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME + * is set, then the peer name verification is skipped, which may be + * insecure, especially on a client. Furthermore, on a client, the + * server_name extension is not sent. + */ + char *hostname; +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +#if defined(MBEDTLS_SSL_ALPN) + const char *alpn_chosen; /*!< negotiated protocol */ +#endif /* MBEDTLS_SSL_ALPN */ + +#if defined(MBEDTLS_SSL_DTLS_SRTP) + /* + * use_srtp extension + */ + mbedtls_dtls_srtp_info dtls_srtp_info; +#endif /* MBEDTLS_SSL_DTLS_SRTP */ + + /* + * Information for DTLS hello verify + */ +#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) + unsigned char *cli_id; /*!< transport-level ID of the client */ + size_t cli_id_len; /*!< length of cli_id */ +#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ + + /* + * Secure renegotiation + */ + /* needed to know when to send extension on server */ + int secure_renegotiation; /*!< does peer support legacy or + secure renegotiation */ +#if defined(MBEDTLS_SSL_RENEGOTIATION) + size_t verify_data_len; /*!< length of verify data stored */ + char own_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ + char peer_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + /* CID configuration to use in subsequent handshakes. */ + + /*! The next incoming CID, chosen by the user and applying to + * all subsequent handshakes. This may be different from the + * CID currently used in case the user has re-configured the CID + * after an initial handshake. */ + unsigned char own_cid[MBEDTLS_SSL_CID_IN_LEN_MAX]; + uint8_t own_cid_len; /*!< The length of \c own_cid. */ + uint8_t negotiate_cid; /*!< This indicates whether the CID extension should + * be negotiated in the next handshake or not. + * Possible values are #MBEDTLS_SSL_CID_ENABLED + * and #MBEDTLS_SSL_CID_DISABLED. */ +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ +}; + +#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) + +#define MBEDTLS_SSL_CHANNEL_OUTBOUND MBEDTLS_DEPRECATED_NUMERIC_CONSTANT(0) +#define MBEDTLS_SSL_CHANNEL_INBOUND MBEDTLS_DEPRECATED_NUMERIC_CONSTANT(1) + +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif /* MBEDTLS_DEPRECATED_WARNING */ + +MBEDTLS_DEPRECATED extern int (*mbedtls_ssl_hw_record_init)( + mbedtls_ssl_context *ssl, + const unsigned char *key_enc, const unsigned char *key_dec, + size_t keylen, + const unsigned char *iv_enc, const unsigned char *iv_dec, + size_t ivlen, + const unsigned char *mac_enc, const unsigned char *mac_dec, + size_t maclen); +MBEDTLS_DEPRECATED extern int (*mbedtls_ssl_hw_record_activate)( + mbedtls_ssl_context *ssl, + int direction); +MBEDTLS_DEPRECATED extern int (*mbedtls_ssl_hw_record_reset)( + mbedtls_ssl_context *ssl); +MBEDTLS_DEPRECATED extern int (*mbedtls_ssl_hw_record_write)( + mbedtls_ssl_context *ssl); +MBEDTLS_DEPRECATED extern int (*mbedtls_ssl_hw_record_read)( + mbedtls_ssl_context *ssl); +MBEDTLS_DEPRECATED extern int (*mbedtls_ssl_hw_record_finish)( + mbedtls_ssl_context *ssl); + +#undef MBEDTLS_DEPRECATED +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ + +/** + * \brief Return the name of the ciphersuite associated with the + * given ID + * + * \param ciphersuite_id SSL ciphersuite ID + * + * \return a string containing the ciphersuite name + */ +const char *mbedtls_ssl_get_ciphersuite_name(const int ciphersuite_id); + +/** + * \brief Return the ID of the ciphersuite associated with the + * given name + * + * \param ciphersuite_name SSL ciphersuite name + * + * \return the ID with the ciphersuite or 0 if not found + */ +int mbedtls_ssl_get_ciphersuite_id(const char *ciphersuite_name); + +/** + * \brief Initialize an SSL context + * Just makes the context ready for mbedtls_ssl_setup() or + * mbedtls_ssl_free() + * + * \param ssl SSL context + */ +void mbedtls_ssl_init(mbedtls_ssl_context *ssl); + +/** + * \brief Set up an SSL context for use + * + * \note No copy of the configuration context is made, it can be + * shared by many mbedtls_ssl_context structures. + * + * \warning The conf structure will be accessed during the session. + * It must not be modified or freed as long as the session + * is active. + * + * \warning This function must be called exactly once per context. + * Calling mbedtls_ssl_setup again is not supported, even + * if no session is active. + * + * \warning After setting up a client context, if certificate-based + * authentication is enabled, you should call + * mbedtls_ssl_set_hostname() to specifiy the expected + * name of the server. Without this, in most scenarios, + * the TLS connection is insecure. See + * #MBEDTLS_ERR_SSL_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME + * for more information. + * + * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto + * subsystem must have been initialized by calling + * psa_crypto_init() before calling this function. + * + * \param ssl SSL context + * \param conf SSL configuration to use + * + * \return 0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED if + * memory allocation failed + */ +int mbedtls_ssl_setup(mbedtls_ssl_context *ssl, + const mbedtls_ssl_config *conf); + +/** + * \brief Reset an already initialized SSL context for re-use + * while retaining application-set variables, function + * pointers and data. + * + * \param ssl SSL context + * \return 0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED, + MBEDTLS_ERR_SSL_HW_ACCEL_FAILED or + * MBEDTLS_ERR_SSL_COMPRESSION_FAILED + */ +int mbedtls_ssl_session_reset(mbedtls_ssl_context *ssl); + +/** + * \brief Set the current endpoint type + * + * \param conf SSL configuration + * \param endpoint must be MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER + */ +void mbedtls_ssl_conf_endpoint(mbedtls_ssl_config *conf, int endpoint); + +/** + * \brief Set the transport type (TLS or DTLS). + * Default: TLS + * + * \note For DTLS, you must either provide a recv callback that + * doesn't block, or one that handles timeouts, see + * \c mbedtls_ssl_set_bio(). You also need to provide timer + * callbacks with \c mbedtls_ssl_set_timer_cb(). + * + * \param conf SSL configuration + * \param transport transport type: + * MBEDTLS_SSL_TRANSPORT_STREAM for TLS, + * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS. + */ +void mbedtls_ssl_conf_transport(mbedtls_ssl_config *conf, int transport); + +/** + * \brief Set the certificate verification mode + * Default: NONE on server, REQUIRED on client + * + * \param conf SSL configuration + * \param authmode can be: + * + * MBEDTLS_SSL_VERIFY_NONE: peer certificate is not checked + * (default on server) + * (insecure on client) + * + * MBEDTLS_SSL_VERIFY_OPTIONAL: peer certificate is checked, however the + * handshake continues even if verification failed; + * mbedtls_ssl_get_verify_result() can be called after the + * handshake is complete. + * + * MBEDTLS_SSL_VERIFY_REQUIRED: peer *must* present a valid certificate, + * handshake is aborted if verification failed. + * (default on client) + * + * \note On client, MBEDTLS_SSL_VERIFY_REQUIRED is the recommended mode. + * With MBEDTLS_SSL_VERIFY_OPTIONAL, the user needs to call mbedtls_ssl_get_verify_result() at + * the right time(s), which may not be obvious, while REQUIRED always perform + * the verification as soon as possible. For example, REQUIRED was protecting + * against the "triple handshake" attack even before it was found. + */ +void mbedtls_ssl_conf_authmode(mbedtls_ssl_config *conf, int authmode); + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +/** + * \brief Set the verification callback (Optional). + * + * If set, the provided verify callback is called for each + * certificate in the peer's CRT chain, including the trusted + * root. For more information, please see the documentation of + * \c mbedtls_x509_crt_verify(). + * + * \note For per context callbacks and contexts, please use + * mbedtls_ssl_set_verify() instead. + * + * \param conf The SSL configuration to use. + * \param f_vrfy The verification callback to use during CRT verification. + * \param p_vrfy The opaque context to be passed to the callback. + */ +void mbedtls_ssl_conf_verify(mbedtls_ssl_config *conf, + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), + void *p_vrfy); +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +/** + * \brief Set the random number generator callback + * + * \param conf SSL configuration + * \param f_rng RNG function + * \param p_rng RNG parameter + */ +void mbedtls_ssl_conf_rng(mbedtls_ssl_config *conf, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief Set the debug callback + * + * The callback has the following argument: + * void * opaque context for the callback + * int debug level + * const char * file name + * int line number + * const char * message + * + * \param conf SSL configuration + * \param f_dbg debug function + * \param p_dbg debug parameter + */ +void mbedtls_ssl_conf_dbg(mbedtls_ssl_config *conf, + void (*f_dbg)(void *, int, const char *, int, const char *), + void *p_dbg); + +/** + * \brief Set the underlying BIO callbacks for write, read and + * read-with-timeout. + * + * \param ssl SSL context + * \param p_bio parameter (context) shared by BIO callbacks + * \param f_send write callback + * \param f_recv read callback + * \param f_recv_timeout blocking read callback with timeout. + * + * \note One of f_recv or f_recv_timeout can be NULL, in which case + * the other is used. If both are non-NULL, f_recv_timeout is + * used and f_recv is ignored (as if it were NULL). + * + * \note The two most common use cases are: + * - non-blocking I/O, f_recv != NULL, f_recv_timeout == NULL + * - blocking I/O, f_recv == NULL, f_recv_timeout != NULL + * + * \note For DTLS, you need to provide either a non-NULL + * f_recv_timeout callback, or a f_recv that doesn't block. + * + * \note See the documentations of \c mbedtls_ssl_send_t, + * \c mbedtls_ssl_recv_t and \c mbedtls_ssl_recv_timeout_t for + * the conventions those callbacks must follow. + * + * \note On some platforms, net_sockets.c provides + * \c mbedtls_net_send(), \c mbedtls_net_recv() and + * \c mbedtls_net_recv_timeout() that are suitable to be used + * here. + */ +void mbedtls_ssl_set_bio(mbedtls_ssl_context *ssl, + void *p_bio, + mbedtls_ssl_send_t *f_send, + mbedtls_ssl_recv_t *f_recv, + mbedtls_ssl_recv_timeout_t *f_recv_timeout); + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + + +/** + * \brief Configure the use of the Connection ID (CID) + * extension in the next handshake. + * + * Reference: draft-ietf-tls-dtls-connection-id-05 + * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05 + * + * The DTLS CID extension allows the reliable association of + * DTLS records to DTLS connections across changes in the + * underlying transport (changed IP and Port metadata) by + * adding explicit connection identifiers (CIDs) to the + * headers of encrypted DTLS records. The desired CIDs are + * configured by the application layer and are exchanged in + * new `ClientHello` / `ServerHello` extensions during the + * handshake, where each side indicates the CID it wants the + * peer to use when writing encrypted messages. The CIDs are + * put to use once records get encrypted: the stack discards + * any incoming records that don't include the configured CID + * in their header, and adds the peer's requested CID to the + * headers of outgoing messages. + * + * This API enables or disables the use of the CID extension + * in the next handshake and sets the value of the CID to + * be used for incoming messages. + * + * \param ssl The SSL context to configure. This must be initialized. + * \param enable This value determines whether the CID extension should + * be used or not. Possible values are: + * - MBEDTLS_SSL_CID_ENABLED to enable the use of the CID. + * - MBEDTLS_SSL_CID_DISABLED (default) to disable the use + * of the CID. + * \param own_cid The address of the readable buffer holding the CID we want + * the peer to use when sending encrypted messages to us. + * This may be \c NULL if \p own_cid_len is \c 0. + * This parameter is unused if \p enable is set to + * MBEDTLS_SSL_CID_DISABLED. + * \param own_cid_len The length of \p own_cid. + * This parameter is unused if \p enable is set to + * MBEDTLS_SSL_CID_DISABLED. + * + * \note The value of \p own_cid_len must match the value of the + * \c len parameter passed to mbedtls_ssl_conf_cid() + * when configuring the ::mbedtls_ssl_config that \p ssl + * is bound to. + * + * \note This CID configuration applies to subsequent handshakes + * performed on the SSL context \p ssl, but does not trigger + * one. You still have to call `mbedtls_ssl_handshake()` + * (for the initial handshake) or `mbedtls_ssl_renegotiate()` + * (for a renegotiation handshake) explicitly after a + * successful call to this function to run the handshake. + * + * \note This call cannot guarantee that the use of the CID + * will be successfully negotiated in the next handshake, + * because the peer might not support it. Specifically: + * - On the Client, enabling the use of the CID through + * this call implies that the `ClientHello` in the next + * handshake will include the CID extension, thereby + * offering the use of the CID to the server. Only if + * the `ServerHello` contains the CID extension, too, + * the CID extension will actually be put to use. + * - On the Server, enabling the use of the CID through + * this call implies that that the server will look for + * the CID extension in a `ClientHello` from the client, + * and, if present, reply with a CID extension in its + * `ServerHello`. + * + * \note To check whether the use of the CID was negotiated + * after the subsequent handshake has completed, please + * use the API mbedtls_ssl_get_peer_cid(). + * + * \warning If the use of the CID extension is enabled in this call + * and the subsequent handshake negotiates its use, Mbed TLS + * will silently drop every packet whose CID does not match + * the CID configured in \p own_cid. It is the responsibility + * of the user to adapt the underlying transport to take care + * of CID-based demultiplexing before handing datagrams to + * Mbed TLS. + * + * \return \c 0 on success. In this case, the CID configuration + * applies to the next handshake. + * \return A negative error code on failure. + */ +int mbedtls_ssl_set_cid(mbedtls_ssl_context *ssl, + int enable, + unsigned char const *own_cid, + size_t own_cid_len); + +/** + * \brief Get information about the use of the CID extension + * in the current connection. + * + * \param ssl The SSL context to query. + * \param enabled The address at which to store whether the CID extension + * is currently in use or not. If the CID is in use, + * `*enabled` is set to MBEDTLS_SSL_CID_ENABLED; + * otherwise, it is set to MBEDTLS_SSL_CID_DISABLED. + * \param peer_cid The address of the buffer in which to store the CID + * chosen by the peer (if the CID extension is used). + * This may be \c NULL in case the value of peer CID + * isn't needed. If it is not \c NULL, \p peer_cid_len + * must not be \c NULL. + * \param peer_cid_len The address at which to store the size of the CID + * chosen by the peer (if the CID extension is used). + * This is also the number of Bytes in \p peer_cid that + * have been written. + * This may be \c NULL in case the length of the peer CID + * isn't needed. If it is \c NULL, \p peer_cid must be + * \c NULL, too. + * + * \note This applies to the state of the CID negotiated in + * the last complete handshake. If a handshake is in + * progress, this function will attempt to complete + * the handshake first. + * + * \note If CID extensions have been exchanged but both client + * and server chose to use an empty CID, this function + * sets `*enabled` to #MBEDTLS_SSL_CID_DISABLED + * (the rationale for this is that the resulting + * communication is the same as if the CID extensions + * hadn't been used). + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_ssl_get_peer_cid(mbedtls_ssl_context *ssl, + int *enabled, + unsigned char peer_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX], + size_t *peer_cid_len); + +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + +/** + * \brief Set the Maximum Transport Unit (MTU). + * Special value: 0 means unset (no limit). + * This represents the maximum size of a datagram payload + * handled by the transport layer (usually UDP) as determined + * by the network link and stack. In practice, this controls + * the maximum size datagram the DTLS layer will pass to the + * \c f_send() callback set using \c mbedtls_ssl_set_bio(). + * + * \note The limit on datagram size is converted to a limit on + * record payload by subtracting the current overhead of + * encapsulation and encryption/authentication if any. + * + * \note This can be called at any point during the connection, for + * example when a Path Maximum Transfer Unit (PMTU) + * estimate becomes available from other sources, + * such as lower (or higher) protocol layers. + * + * \note This setting only controls the size of the packets we send, + * and does not restrict the size of the datagrams we're + * willing to receive. Client-side, you can request the + * server to use smaller records with \c + * mbedtls_ssl_conf_max_frag_len(). + * + * \note If both a MTU and a maximum fragment length have been + * configured (or negotiated with the peer), the resulting + * lower limit on record payload (see first note) is used. + * + * \note This can only be used to decrease the maximum size + * of datagrams (hence records, see first note) sent. It + * cannot be used to increase the maximum size of records over + * the limit set by #MBEDTLS_SSL_OUT_CONTENT_LEN. + * + * \note Values lower than the current record layer expansion will + * result in an error when trying to send data. + * + * \note Using record compression together with a non-zero MTU value + * will result in an error when trying to send data. + * + * \param ssl SSL context + * \param mtu Value of the path MTU in bytes + */ +void mbedtls_ssl_set_mtu(mbedtls_ssl_context *ssl, uint16_t mtu); +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +/** + * \brief Set a connection-specific verification callback (optional). + * + * If set, the provided verify callback is called for each + * certificate in the peer's CRT chain, including the trusted + * root. For more information, please see the documentation of + * \c mbedtls_x509_crt_verify(). + * + * \note This call is analogous to mbedtls_ssl_conf_verify() but + * binds the verification callback and context to an SSL context + * as opposed to an SSL configuration. + * If mbedtls_ssl_conf_verify() and mbedtls_ssl_set_verify() + * are both used, mbedtls_ssl_set_verify() takes precedence. + * + * \param ssl The SSL context to use. + * \param f_vrfy The verification callback to use during CRT verification. + * \param p_vrfy The opaque context to be passed to the callback. + */ +void mbedtls_ssl_set_verify(mbedtls_ssl_context *ssl, + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), + void *p_vrfy); +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +/** + * \brief Set the timeout period for mbedtls_ssl_read() + * (Default: no timeout.) + * + * \param conf SSL configuration context + * \param timeout Timeout value in milliseconds. + * Use 0 for no timeout (default). + * + * \note With blocking I/O, this will only work if a non-NULL + * \c f_recv_timeout was set with \c mbedtls_ssl_set_bio(). + * With non-blocking I/O, this will only work if timer + * callbacks were set with \c mbedtls_ssl_set_timer_cb(). + * + * \note With non-blocking I/O, you may also skip this function + * altogether and handle timeouts at the application layer. + */ +void mbedtls_ssl_conf_read_timeout(mbedtls_ssl_config *conf, uint32_t timeout); + +#if defined(MBEDTLS_SSL_RECORD_CHECKING) +/** + * \brief Check whether a buffer contains a valid and authentic record + * that has not been seen before. (DTLS only). + * + * This function does not change the user-visible state + * of the SSL context. Its sole purpose is to provide + * an indication of the legitimacy of an incoming record. + * + * This can be useful e.g. in distributed server environments + * using the DTLS Connection ID feature, in which connections + * might need to be passed between service instances on a change + * of peer address, but where such disruptive operations should + * only happen after the validity of incoming records has been + * confirmed. + * + * \param ssl The SSL context to use. + * \param buf The address of the buffer holding the record to be checked. + * This must be a read/write buffer of length \p buflen Bytes. + * \param buflen The length of \p buf in Bytes. + * + * \note This routine only checks whether the provided buffer begins + * with a valid and authentic record that has not been seen + * before, but does not check potential data following the + * initial record. In particular, it is possible to pass DTLS + * datagrams containing multiple records, in which case only + * the first record is checked. + * + * \note This function modifies the input buffer \p buf. If you need + * to preserve the original record, you have to maintain a copy. + * + * \return \c 0 if the record is valid and authentic and has not been + * seen before. + * \return MBEDTLS_ERR_SSL_INVALID_MAC if the check completed + * successfully but the record was found to be not authentic. + * \return MBEDTLS_ERR_SSL_INVALID_RECORD if the check completed + * successfully but the record was found to be invalid for + * a reason different from authenticity checking. + * \return MBEDTLS_ERR_SSL_UNEXPECTED_RECORD if the check completed + * successfully but the record was found to be unexpected + * in the state of the SSL context, including replayed records. + * \return Another negative error code on different kinds of failure. + * In this case, the SSL context becomes unusable and needs + * to be freed or reset before reuse. + */ +int mbedtls_ssl_check_record(mbedtls_ssl_context const *ssl, + unsigned char *buf, + size_t buflen); +#endif /* MBEDTLS_SSL_RECORD_CHECKING */ + +/** + * \brief Set the timer callbacks (Mandatory for DTLS.) + * + * \param ssl SSL context + * \param p_timer parameter (context) shared by timer callbacks + * \param f_set_timer set timer callback + * \param f_get_timer get timer callback. Must return: + * + * \note See the documentation of \c mbedtls_ssl_set_timer_t and + * \c mbedtls_ssl_get_timer_t for the conventions this pair of + * callbacks must follow. + * + * \note On some platforms, timing.c provides + * \c mbedtls_timing_set_delay() and + * \c mbedtls_timing_get_delay() that are suitable for using + * here, except if using an event-driven style. + * + * \note See also the "DTLS tutorial" article in our knowledge base. + * https://mbed-tls.readthedocs.io/en/latest/kb/how-to/dtls-tutorial + */ +void mbedtls_ssl_set_timer_cb(mbedtls_ssl_context *ssl, + void *p_timer, + mbedtls_ssl_set_timer_t *f_set_timer, + mbedtls_ssl_get_timer_t *f_get_timer); + +/** + * \brief Callback type: generate and write session ticket + * + * \note This describes what a callback implementation should do. + * This callback should generate an encrypted and + * authenticated ticket for the session and write it to the + * output buffer. Here, ticket means the opaque ticket part + * of the NewSessionTicket structure of RFC 5077. + * + * \param p_ticket Context for the callback + * \param session SSL session to be written in the ticket + * \param start Start of the output buffer + * \param end End of the output buffer + * \param tlen On exit, holds the length written + * \param lifetime On exit, holds the lifetime of the ticket in seconds + * + * \return 0 if successful, or + * a specific MBEDTLS_ERR_XXX code. + */ +typedef int mbedtls_ssl_ticket_write_t(void *p_ticket, + const mbedtls_ssl_session *session, + unsigned char *start, + const unsigned char *end, + size_t *tlen, + uint32_t *lifetime); + +#if defined(MBEDTLS_SSL_EXPORT_KEYS) +/** + * \brief Callback type: Export key block and master secret + * + * \note This is required for certain uses of TLS, e.g. EAP-TLS + * (RFC 5216) and Thread. The key pointers are ephemeral and + * therefore must not be stored. The master secret and keys + * should not be used directly except as an input to a key + * derivation function. + * + * \param p_expkey Context for the callback + * \param ms Pointer to master secret (fixed length: 48 bytes) + * \param kb Pointer to key block, see RFC 5246 section 6.3 + * (variable length: 2 * maclen + 2 * keylen + 2 * ivlen). + * \param maclen MAC length + * \param keylen Key length + * \param ivlen IV length + * + * \return 0 if successful, or + * a specific MBEDTLS_ERR_XXX code. + */ +typedef int mbedtls_ssl_export_keys_t(void *p_expkey, + const unsigned char *ms, + const unsigned char *kb, + size_t maclen, + size_t keylen, + size_t ivlen); + +/** + * \brief Callback type: Export key block, master secret, + * handshake randbytes and the tls_prf function + * used to derive keys. + * + * \note This is required for certain uses of TLS, e.g. EAP-TLS + * (RFC 5216) and Thread. The key pointers are ephemeral and + * therefore must not be stored. The master secret and keys + * should not be used directly except as an input to a key + * derivation function. + * + * \param p_expkey Context for the callback. + * \param ms Pointer to master secret (fixed length: 48 bytes). + * \param kb Pointer to key block, see RFC 5246 section 6.3. + * (variable length: 2 * maclen + 2 * keylen + 2 * ivlen). + * \param maclen MAC length. + * \param keylen Key length. + * \param ivlen IV length. + * \param client_random The client random bytes. + * \param server_random The server random bytes. + * \param tls_prf_type The tls_prf enum type. + * + * \return 0 if successful, or + * a specific MBEDTLS_ERR_XXX code. + */ +typedef int mbedtls_ssl_export_keys_ext_t(void *p_expkey, + const unsigned char *ms, + const unsigned char *kb, + size_t maclen, + size_t keylen, + size_t ivlen, + const unsigned char client_random[32], + const unsigned char server_random[32], + mbedtls_tls_prf_types tls_prf_type); +#endif /* MBEDTLS_SSL_EXPORT_KEYS */ + +/** + * \brief Callback type: parse and load session ticket + * + * \note This describes what a callback implementation should do. + * This callback should parse a session ticket as generated + * by the corresponding mbedtls_ssl_ticket_write_t function, + * and, if the ticket is authentic and valid, load the + * session. + * + * \note The implementation is allowed to modify the first len + * bytes of the input buffer, eg to use it as a temporary + * area for the decrypted ticket contents. + * + * \param p_ticket Context for the callback + * \param session SSL session to be loaded + * \param buf Start of the buffer containing the ticket + * \param len Length of the ticket. + * + * \return 0 if successful, or + * MBEDTLS_ERR_SSL_INVALID_MAC if not authentic, or + * MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED if expired, or + * any other non-zero code for other failures. + */ +typedef int mbedtls_ssl_ticket_parse_t(void *p_ticket, + mbedtls_ssl_session *session, + unsigned char *buf, + size_t len); + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) +/** + * \brief Configure SSL session ticket callbacks (server only). + * (Default: none.) + * + * \note On server, session tickets are enabled by providing + * non-NULL callbacks. + * + * \note On client, use \c mbedtls_ssl_conf_session_tickets(). + * + * \param conf SSL configuration context + * \param f_ticket_write Callback for writing a ticket + * \param f_ticket_parse Callback for parsing a ticket + * \param p_ticket Context shared by the two callbacks + */ +void mbedtls_ssl_conf_session_tickets_cb(mbedtls_ssl_config *conf, + mbedtls_ssl_ticket_write_t *f_ticket_write, + mbedtls_ssl_ticket_parse_t *f_ticket_parse, + void *p_ticket); +#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ + +#if defined(MBEDTLS_SSL_EXPORT_KEYS) +/** + * \brief Configure key export callback. + * (Default: none.) + * + * \note See \c mbedtls_ssl_export_keys_t. + * + * \param conf SSL configuration context + * \param f_export_keys Callback for exporting keys + * \param p_export_keys Context for the callback + */ +void mbedtls_ssl_conf_export_keys_cb(mbedtls_ssl_config *conf, + mbedtls_ssl_export_keys_t *f_export_keys, + void *p_export_keys); + +/** + * \brief Configure extended key export callback. + * (Default: none.) + * + * \note See \c mbedtls_ssl_export_keys_ext_t. + * \warning Exported key material must not be used for any purpose + * before the (D)TLS handshake is completed + * + * \param conf SSL configuration context + * \param f_export_keys_ext Callback for exporting keys + * \param p_export_keys Context for the callback + */ +void mbedtls_ssl_conf_export_keys_ext_cb(mbedtls_ssl_config *conf, + mbedtls_ssl_export_keys_ext_t *f_export_keys_ext, + void *p_export_keys); +#endif /* MBEDTLS_SSL_EXPORT_KEYS */ + +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) +/** + * \brief Configure asynchronous private key operation callbacks. + * + * \param conf SSL configuration context + * \param f_async_sign Callback to start a signature operation. See + * the description of ::mbedtls_ssl_async_sign_t + * for more information. This may be \c NULL if the + * external processor does not support any signature + * operation; in this case the private key object + * associated with the certificate will be used. + * \param f_async_decrypt Callback to start a decryption operation. See + * the description of ::mbedtls_ssl_async_decrypt_t + * for more information. This may be \c NULL if the + * external processor does not support any decryption + * operation; in this case the private key object + * associated with the certificate will be used. + * \param f_async_resume Callback to resume an asynchronous operation. See + * the description of ::mbedtls_ssl_async_resume_t + * for more information. This may not be \c NULL unless + * \p f_async_sign and \p f_async_decrypt are both + * \c NULL. + * \param f_async_cancel Callback to cancel an asynchronous operation. See + * the description of ::mbedtls_ssl_async_cancel_t + * for more information. This may be \c NULL if + * no cleanup is needed. + * \param config_data A pointer to configuration data which can be + * retrieved with + * mbedtls_ssl_conf_get_async_config_data(). The + * library stores this value without dereferencing it. + */ +void mbedtls_ssl_conf_async_private_cb(mbedtls_ssl_config *conf, + mbedtls_ssl_async_sign_t *f_async_sign, + mbedtls_ssl_async_decrypt_t *f_async_decrypt, + mbedtls_ssl_async_resume_t *f_async_resume, + mbedtls_ssl_async_cancel_t *f_async_cancel, + void *config_data); + +/** + * \brief Retrieve the configuration data set by + * mbedtls_ssl_conf_async_private_cb(). + * + * \param conf SSL configuration context + * \return The configuration data set by + * mbedtls_ssl_conf_async_private_cb(). + */ +void *mbedtls_ssl_conf_get_async_config_data(const mbedtls_ssl_config *conf); + +/** + * \brief Retrieve the asynchronous operation user context. + * + * \note This function may only be called while a handshake + * is in progress. + * + * \param ssl The SSL context to access. + * + * \return The asynchronous operation user context that was last + * set during the current handshake. If + * mbedtls_ssl_set_async_operation_data() has not yet been + * called during the current handshake, this function returns + * \c NULL. + */ +void *mbedtls_ssl_get_async_operation_data(const mbedtls_ssl_context *ssl); + +/** + * \brief Retrieve the asynchronous operation user context. + * + * \note This function may only be called while a handshake + * is in progress. + * + * \param ssl The SSL context to access. + * \param ctx The new value of the asynchronous operation user context. + * Call mbedtls_ssl_get_async_operation_data() later during the + * same handshake to retrieve this value. + */ +void mbedtls_ssl_set_async_operation_data(mbedtls_ssl_context *ssl, + void *ctx); +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ + +/** + * \brief Callback type: generate a cookie + * + * \param ctx Context for the callback + * \param p Buffer to write to, + * must be updated to point right after the cookie + * \param end Pointer to one past the end of the output buffer + * \param info Client ID info that was passed to + * \c mbedtls_ssl_set_client_transport_id() + * \param ilen Length of info in bytes + * + * \return The callback must return 0 on success, + * or a negative error code. + */ +typedef int mbedtls_ssl_cookie_write_t(void *ctx, + unsigned char **p, unsigned char *end, + const unsigned char *info, size_t ilen); + +/** + * \brief Callback type: verify a cookie + * + * \param ctx Context for the callback + * \param cookie Cookie to verify + * \param clen Length of cookie + * \param info Client ID info that was passed to + * \c mbedtls_ssl_set_client_transport_id() + * \param ilen Length of info in bytes + * + * \return The callback must return 0 if cookie is valid, + * or a negative error code. + */ +typedef int mbedtls_ssl_cookie_check_t(void *ctx, + const unsigned char *cookie, size_t clen, + const unsigned char *info, size_t ilen); + +#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) +/** + * \brief Register callbacks for DTLS cookies + * (Server only. DTLS only.) + * + * Default: dummy callbacks that fail, in order to force you to + * register working callbacks (and initialize their context). + * + * To disable HelloVerifyRequest, register NULL callbacks. + * + * \warning Disabling hello verification allows your server to be used + * for amplification in DoS attacks against other hosts. + * Only disable if you known this can't happen in your + * particular environment. + * + * \note See comments on \c mbedtls_ssl_handshake() about handling + * the MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED that is expected + * on the first handshake attempt when this is enabled. + * + * \note This is also necessary to handle client reconnection from + * the same port as described in RFC 6347 section 4.2.8 (only + * the variant with cookies is supported currently). See + * comments on \c mbedtls_ssl_read() for details. + * + * \param conf SSL configuration + * \param f_cookie_write Cookie write callback + * \param f_cookie_check Cookie check callback + * \param p_cookie Context for both callbacks + */ +void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf, + mbedtls_ssl_cookie_write_t *f_cookie_write, + mbedtls_ssl_cookie_check_t *f_cookie_check, + void *p_cookie); + +/** + * \brief Set client's transport-level identification info. + * (Server only. DTLS only.) + * + * This is usually the IP address (and port), but could be + * anything identify the client depending on the underlying + * network stack. Used for HelloVerifyRequest with DTLS. + * This is *not* used to route the actual packets. + * + * \param ssl SSL context + * \param info Transport-level info identifying the client (eg IP + port) + * \param ilen Length of info in bytes + * + * \note An internal copy is made, so the info buffer can be reused. + * + * \return 0 on success, + * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used on client, + * MBEDTLS_ERR_SSL_ALLOC_FAILED if out of memory. + */ +int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl, + const unsigned char *info, + size_t ilen); + +#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ + +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) +/** + * \brief Enable or disable anti-replay protection for DTLS. + * (DTLS only, no effect on TLS.) + * Default: enabled. + * + * \param conf SSL configuration + * \param mode MBEDTLS_SSL_ANTI_REPLAY_ENABLED or MBEDTLS_SSL_ANTI_REPLAY_DISABLED. + * + * \warning Disabling this is a security risk unless the application + * protocol handles duplicated packets in a safe way. You + * should not disable this without careful consideration. + * However, if your application already detects duplicated + * packets and needs information about them to adjust its + * transmission strategy, then you'll want to disable this. + */ +void mbedtls_ssl_conf_dtls_anti_replay(mbedtls_ssl_config *conf, char mode); +#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ + +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) +/** + * \brief Set a limit on the number of records with a bad MAC + * before terminating the connection. + * (DTLS only, no effect on TLS.) + * Default: 0 (disabled). + * + * \param conf SSL configuration + * \param limit Limit, or 0 to disable. + * + * \note If the limit is N, then the connection is terminated when + * the Nth non-authentic record is seen. + * + * \note Records with an invalid header are not counted, only the + * ones going through the authentication-decryption phase. + * + * \note This is a security trade-off related to the fact that it's + * often relatively easy for an active attacker to inject UDP + * datagrams. On one hand, setting a low limit here makes it + * easier for such an attacker to forcibly terminated a + * connection. On the other hand, a high limit or no limit + * might make us waste resources checking authentication on + * many bogus packets. + */ +void mbedtls_ssl_conf_dtls_badmac_limit(mbedtls_ssl_config *conf, unsigned limit); +#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + +/** + * \brief Allow or disallow packing of multiple handshake records + * within a single datagram. + * + * \param ssl The SSL context to configure. + * \param allow_packing This determines whether datagram packing may + * be used or not. A value of \c 0 means that every + * record will be sent in a separate datagram; a + * value of \c 1 means that, if space permits, + * multiple handshake messages (including CCS) belonging to + * a single flight may be packed within a single datagram. + * + * \note This is enabled by default and should only be disabled + * for test purposes, or if datagram packing causes + * interoperability issues with peers that don't support it. + * + * \note Allowing datagram packing reduces the network load since + * there's less overhead if multiple messages share the same + * datagram. Also, it increases the handshake efficiency + * since messages belonging to a single datagram will not + * be reordered in transit, and so future message buffering + * or flight retransmission (if no buffering is used) as + * means to deal with reordering are needed less frequently. + * + * \note Application records are not affected by this option and + * are currently always sent in separate datagrams. + * + */ +void mbedtls_ssl_set_datagram_packing(mbedtls_ssl_context *ssl, + unsigned allow_packing); + +/** + * \brief Set retransmit timeout values for the DTLS handshake. + * (DTLS only, no effect on TLS.) + * + * \param conf SSL configuration + * \param min Initial timeout value in milliseconds. + * Default: 1000 (1 second). + * \param max Maximum timeout value in milliseconds. + * Default: 60000 (60 seconds). + * + * \note Default values are from RFC 6347 section 4.2.4.1. + * + * \note The 'min' value should typically be slightly above the + * expected round-trip time to your peer, plus whatever time + * it takes for the peer to process the message. For example, + * if your RTT is about 600ms and you peer needs up to 1s to + * do the cryptographic operations in the handshake, then you + * should set 'min' slightly above 1600. Lower values of 'min' + * might cause spurious resends which waste network resources, + * while larger value of 'min' will increase overall latency + * on unreliable network links. + * + * \note The more unreliable your network connection is, the larger + * your max / min ratio needs to be in order to achieve + * reliable handshakes. + * + * \note Messages are retransmitted up to log2(ceil(max/min)) times. + * For example, if min = 1s and max = 5s, the retransmit plan + * goes: send ... 1s -> resend ... 2s -> resend ... 4s -> + * resend ... 5s -> give up and return a timeout error. + */ +void mbedtls_ssl_conf_handshake_timeout(mbedtls_ssl_config *conf, uint32_t min, uint32_t max); +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +#if defined(MBEDTLS_SSL_SRV_C) +/** + * \brief Set the session cache callbacks (server-side only) + * If not set, no session resuming is done (except if session + * tickets are enabled too). + * + * The session cache has the responsibility to check for stale + * entries based on timeout. See RFC 5246 for recommendations. + * + * Warning: session.peer_cert is cleared by the SSL/TLS layer on + * connection shutdown, so do not cache the pointer! Either set + * it to NULL or make a full copy of the certificate. + * + * The get callback is called once during the initial handshake + * to enable session resuming. The get function has the + * following parameters: (void *parameter, mbedtls_ssl_session *session) + * If a valid entry is found, it should fill the master of + * the session object with the cached values and return 0, + * return 1 otherwise. Optionally peer_cert can be set as well + * if it is properly present in cache entry. + * + * The set callback is called once during the initial handshake + * to enable session resuming after the entire handshake has + * been finished. The set function has the following parameters: + * (void *parameter, const mbedtls_ssl_session *session). The function + * should create a cache entry for future retrieval based on + * the data in the session structure and should keep in mind + * that the mbedtls_ssl_session object presented (and all its referenced + * data) is cleared by the SSL/TLS layer when the connection is + * terminated. It is recommended to add metadata to determine if + * an entry is still valid in the future. Return 0 if + * successfully cached, return 1 otherwise. + * + * \param conf SSL configuration + * \param p_cache parameter (context) for both callbacks + * \param f_get_cache session get callback + * \param f_set_cache session set callback + */ +void mbedtls_ssl_conf_session_cache(mbedtls_ssl_config *conf, + void *p_cache, + int (*f_get_cache)(void *, mbedtls_ssl_session *), + int (*f_set_cache)(void *, const mbedtls_ssl_session *)); +#endif /* MBEDTLS_SSL_SRV_C */ + +#if defined(MBEDTLS_SSL_CLI_C) +/** + * \brief Request resumption of session (client-side only) + * Session data is copied from presented session structure. + * + * \param ssl SSL context + * \param session session context + * + * \return 0 if successful, + * MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed, + * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or + * arguments are otherwise invalid + * + * \sa mbedtls_ssl_get_session() + */ +int mbedtls_ssl_set_session(mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session); +#endif /* MBEDTLS_SSL_CLI_C */ + +/** + * \brief Load serialized session data into a session structure. + * On client, this can be used for loading saved sessions + * before resuming them with mbedtls_ssl_set_session(). + * On server, this can be used for alternative implementations + * of session cache or session tickets. + * + * \warning If a peer certificate chain is associated with the session, + * the serialized state will only contain the peer's + * end-entity certificate and the result of the chain + * verification (unless verification was disabled), but not + * the rest of the chain. + * + * \see mbedtls_ssl_session_save() + * \see mbedtls_ssl_set_session() + * + * \param session The session structure to be populated. It must have been + * initialised with mbedtls_ssl_session_init() but not + * populated yet. + * \param buf The buffer holding the serialized session data. It must be a + * readable buffer of at least \p len bytes. + * \param len The size of the serialized data in bytes. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed. + * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if input data is invalid. + * \return #MBEDTLS_ERR_SSL_VERSION_MISMATCH if the serialized data + * was generated in a different version or configuration of + * Mbed TLS. + * \return Another negative value for other kinds of errors (for + * example, unsupported features in the embedded certificate). + */ +int mbedtls_ssl_session_load(mbedtls_ssl_session *session, + const unsigned char *buf, + size_t len); + +/** + * \brief Save session structure as serialized data in a buffer. + * On client, this can be used for saving session data, + * potentially in non-volatile storage, for resuming later. + * On server, this can be used for alternative implementations + * of session cache or session tickets. + * + * \see mbedtls_ssl_session_load() + * \see mbedtls_ssl_get_session_pointer() + * + * \param session The session structure to be saved. + * \param buf The buffer to write the serialized data to. It must be a + * writeable buffer of at least \p buf_len bytes, or may be \c + * NULL if \p buf_len is \c 0. + * \param buf_len The number of bytes available for writing in \p buf. + * \param olen The size in bytes of the data that has been or would have + * been written. It must point to a valid \c size_t. + * + * \note \p olen is updated to the correct value regardless of + * whether \p buf_len was large enough. This makes it possible + * to determine the necessary size by calling this function + * with \p buf set to \c NULL and \p buf_len to \c 0. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL if \p buf is too small. + */ +int mbedtls_ssl_session_save(const mbedtls_ssl_session *session, + unsigned char *buf, + size_t buf_len, + size_t *olen); + +/** + * \brief Get a pointer to the current session structure, for example + * to serialize it. + * + * \warning Ownership of the session remains with the SSL context, and + * the returned pointer is only guaranteed to be valid until + * the next API call operating on the same \p ssl context. + * + * \see mbedtls_ssl_session_save() + * + * \param ssl The SSL context. + * + * \return A pointer to the current session if successful. + * \return \c NULL if no session is active. + */ +const mbedtls_ssl_session *mbedtls_ssl_get_session_pointer(const mbedtls_ssl_context *ssl); + +/** + * \brief Set the list of allowed ciphersuites and the preference + * order. First in the list has the highest preference. + * (Overrides all version-specific lists) + * + * The ciphersuites array is not copied, and must remain + * valid for the lifetime of the ssl_config. + * + * Note: The server uses its own preferences + * over the preference of the client unless + * MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE is defined! + * + * \param conf SSL configuration + * \param ciphersuites 0-terminated list of allowed ciphersuites + */ +void mbedtls_ssl_conf_ciphersuites(mbedtls_ssl_config *conf, + const int *ciphersuites); + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) +#define MBEDTLS_SSL_UNEXPECTED_CID_IGNORE 0 +#define MBEDTLS_SSL_UNEXPECTED_CID_FAIL 1 +/** + * \brief Specify the length of Connection IDs for incoming + * encrypted DTLS records, as well as the behaviour + * on unexpected CIDs. + * + * By default, the CID length is set to \c 0, + * and unexpected CIDs are silently ignored. + * + * \param conf The SSL configuration to modify. + * \param len The length in Bytes of the CID fields in encrypted + * DTLS records using the CID mechanism. This must + * not be larger than #MBEDTLS_SSL_CID_OUT_LEN_MAX. + * \param ignore_other_cids This determines the stack's behaviour when + * receiving a record with an unexpected CID. + * Possible values are: + * - #MBEDTLS_SSL_UNEXPECTED_CID_IGNORE + * In this case, the record is silently ignored. + * - #MBEDTLS_SSL_UNEXPECTED_CID_FAIL + * In this case, the stack fails with the specific + * error code #MBEDTLS_ERR_SSL_UNEXPECTED_CID. + * + * \note The CID specification allows implementations to either + * use a common length for all incoming connection IDs or + * allow variable-length incoming IDs. Mbed TLS currently + * requires a common length for all connections sharing the + * same SSL configuration; this allows simpler parsing of + * record headers. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if \p len + * is too large. + */ +int mbedtls_ssl_conf_cid(mbedtls_ssl_config *conf, size_t len, + int ignore_other_cids); +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + +/** + * \brief Set the list of allowed ciphersuites and the + * preference order for a specific version of the protocol. + * (Only useful on the server side) + * + * The ciphersuites array is not copied, and must remain + * valid for the lifetime of the ssl_config. + * + * \param conf SSL configuration + * \param ciphersuites 0-terminated list of allowed ciphersuites + * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 + * supported) + * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, + * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, + * MBEDTLS_SSL_MINOR_VERSION_3 supported) + * + * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 + * and MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 + */ +void mbedtls_ssl_conf_ciphersuites_for_version(mbedtls_ssl_config *conf, + const int *ciphersuites, + int major, int minor); + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +/** + * \brief Set the X.509 security profile used for verification + * + * \note The restrictions are enforced for all certificates in the + * chain. However, signatures in the handshake are not covered + * by this setting but by \b mbedtls_ssl_conf_sig_hashes(). + * + * \param conf SSL configuration + * \param profile Profile to use + */ +void mbedtls_ssl_conf_cert_profile(mbedtls_ssl_config *conf, + const mbedtls_x509_crt_profile *profile); + +/** + * \brief Set the data required to verify peer certificate + * + * \note See \c mbedtls_x509_crt_verify() for notes regarding the + * parameters ca_chain (maps to trust_ca for that function) + * and ca_crl. + * + * \param conf SSL configuration + * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) + * \param ca_crl trusted CA CRLs + */ +void mbedtls_ssl_conf_ca_chain(mbedtls_ssl_config *conf, + mbedtls_x509_crt *ca_chain, + mbedtls_x509_crl *ca_crl); + +#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) +/** + * \brief Set the trusted certificate callback. + * + * This API allows to register the set of trusted certificates + * through a callback, instead of a linked list as configured + * by mbedtls_ssl_conf_ca_chain(). + * + * This is useful for example in contexts where a large number + * of CAs are used, and the inefficiency of maintaining them + * in a linked list cannot be tolerated. It is also useful when + * the set of trusted CAs needs to be modified frequently. + * + * See the documentation of `mbedtls_x509_crt_ca_cb_t` for + * more information. + * + * \param conf The SSL configuration to register the callback with. + * \param f_ca_cb The trusted certificate callback to use when verifying + * certificate chains. + * \param p_ca_cb The context to be passed to \p f_ca_cb (for example, + * a reference to a trusted CA database). + * + * \note This API is incompatible with mbedtls_ssl_conf_ca_chain(): + * Any call to this function overwrites the values set through + * earlier calls to mbedtls_ssl_conf_ca_chain() or + * mbedtls_ssl_conf_ca_cb(). + * + * \note This API is incompatible with CA indication in + * CertificateRequest messages: A server-side SSL context which + * is bound to an SSL configuration that uses a CA callback + * configured via mbedtls_ssl_conf_ca_cb(), and which requires + * client authentication, will send an empty CA list in the + * corresponding CertificateRequest message. + * + * \note This API is incompatible with mbedtls_ssl_set_hs_ca_chain(): + * If an SSL context is bound to an SSL configuration which uses + * CA callbacks configured via mbedtls_ssl_conf_ca_cb(), then + * calls to mbedtls_ssl_set_hs_ca_chain() have no effect. + * + * \note The use of this API disables the use of restartable ECC + * during X.509 CRT signature verification (but doesn't affect + * other uses). + * + * \warning This API is incompatible with the use of CRLs. Any call to + * mbedtls_ssl_conf_ca_cb() unsets CRLs configured through + * earlier calls to mbedtls_ssl_conf_ca_chain(). + * + * \warning In multi-threaded environments, the callback \p f_ca_cb + * must be thread-safe, and it is the user's responsibility + * to guarantee this (for example through a mutex + * contained in the callback context pointed to by \p p_ca_cb). + */ +void mbedtls_ssl_conf_ca_cb(mbedtls_ssl_config *conf, + mbedtls_x509_crt_ca_cb_t f_ca_cb, + void *p_ca_cb); +#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ + +/** + * \brief Set own certificate chain and private key + * + * \note own_cert should contain in order from the bottom up your + * certificate chain. The top certificate (self-signed) + * can be omitted. + * + * \note On server, this function can be called multiple times to + * provision more than one cert/key pair (eg one ECDSA, one + * RSA with SHA-256, one RSA with SHA-1). An adequate + * certificate will be selected according to the client's + * advertised capabilities. In case multiple certificates are + * adequate, preference is given to the one set by the first + * call to this function, then second, etc. + * + * \note On client, only the first call has any effect. That is, + * only one client certificate can be provisioned. The + * server's preferences in its CertificateRequest message will + * be ignored and our only cert will be sent regardless of + * whether it matches those preferences - the server can then + * decide what it wants to do with it. + * + * \note The provided \p pk_key needs to match the public key in the + * first certificate in \p own_cert, or all handshakes using + * that certificate will fail. It is your responsibility + * to ensure that; this function will not perform any check. + * You may use mbedtls_pk_check_pair() in order to perform + * this check yourself, but be aware that this function can + * be computationally expensive on some key types. + * + * \param conf SSL configuration + * \param own_cert own public certificate chain + * \param pk_key own private key + * + * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED + */ +int mbedtls_ssl_conf_own_cert(mbedtls_ssl_config *conf, + mbedtls_x509_crt *own_cert, + mbedtls_pk_context *pk_key); +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) +/** + * \brief Configure a pre-shared key (PSK) and identity + * to be used in PSK-based ciphersuites. + * + * \note This is mainly useful for clients. Servers will usually + * want to use \c mbedtls_ssl_conf_psk_cb() instead. + * + * \note A PSK set by \c mbedtls_ssl_set_hs_psk() in the PSK callback + * takes precedence over a PSK configured by this function. + * + * \warning Currently, clients can only register a single pre-shared key. + * Calling this function or mbedtls_ssl_conf_psk_opaque() more + * than once will overwrite values configured in previous calls. + * Support for setting multiple PSKs on clients and selecting + * one based on the identity hint is not a planned feature, + * but feedback is welcomed. + * + * \param conf The SSL configuration to register the PSK with. + * \param psk The pointer to the pre-shared key to use. + * \param psk_len The length of the pre-shared key in bytes. + * \param psk_identity The pointer to the pre-shared key identity. + * \param psk_identity_len The length of the pre-shared key identity + * in bytes. + * + * \note The PSK and its identity are copied internally and + * hence need not be preserved by the caller for the lifetime + * of the SSL configuration. + * + * \return \c 0 if successful. + * \return An \c MBEDTLS_ERR_SSL_XXX error code on failure. + */ +int mbedtls_ssl_conf_psk(mbedtls_ssl_config *conf, + const unsigned char *psk, size_t psk_len, + const unsigned char *psk_identity, size_t psk_identity_len); + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +/** + * \brief Configure an opaque pre-shared key (PSK) and identity + * to be used in PSK-based ciphersuites. + * + * \note This is mainly useful for clients. Servers will usually + * want to use \c mbedtls_ssl_conf_psk_cb() instead. + * + * \note An opaque PSK set by \c mbedtls_ssl_set_hs_psk_opaque() in + * the PSK callback takes precedence over an opaque PSK + * configured by this function. + * + * \warning Currently, clients can only register a single pre-shared key. + * Calling this function or mbedtls_ssl_conf_psk() more than + * once will overwrite values configured in previous calls. + * Support for setting multiple PSKs on clients and selecting + * one based on the identity hint is not a planned feature, + * but feedback is welcomed. + * + * \param conf The SSL configuration to register the PSK with. + * \param psk The identifier of the key slot holding the PSK. + * Until \p conf is destroyed or this function is successfully + * called again, the key slot \p psk must be populated with a + * key of type PSA_ALG_CATEGORY_KEY_DERIVATION whose policy + * allows its use for the key derivation algorithm applied + * in the handshake. + * \param psk_identity The pointer to the pre-shared key identity. + * \param psk_identity_len The length of the pre-shared key identity + * in bytes. + * + * \note The PSK identity hint is copied internally and hence need + * not be preserved by the caller for the lifetime of the + * SSL configuration. + * + * \return \c 0 if successful. + * \return An \c MBEDTLS_ERR_SSL_XXX error code on failure. + */ +int mbedtls_ssl_conf_psk_opaque(mbedtls_ssl_config *conf, + psa_key_id_t psk, + const unsigned char *psk_identity, + size_t psk_identity_len); +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +/** + * \brief Set the pre-shared Key (PSK) for the current handshake. + * + * \note This should only be called inside the PSK callback, + * i.e. the function passed to \c mbedtls_ssl_conf_psk_cb(). + * + * \note A PSK set by this function takes precedence over a PSK + * configured by \c mbedtls_ssl_conf_psk(). + * + * \param ssl The SSL context to configure a PSK for. + * \param psk The pointer to the pre-shared key. + * \param psk_len The length of the pre-shared key in bytes. + * + * \return \c 0 if successful. + * \return An \c MBEDTLS_ERR_SSL_XXX error code on failure. + */ +int mbedtls_ssl_set_hs_psk(mbedtls_ssl_context *ssl, + const unsigned char *psk, size_t psk_len); + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +/** + * \brief Set an opaque pre-shared Key (PSK) for the current handshake. + * + * \note This should only be called inside the PSK callback, + * i.e. the function passed to \c mbedtls_ssl_conf_psk_cb(). + * + * \note An opaque PSK set by this function takes precedence over an + * opaque PSK configured by \c mbedtls_ssl_conf_psk_opaque(). + * + * \param ssl The SSL context to configure a PSK for. + * \param psk The identifier of the key slot holding the PSK. + * For the duration of the current handshake, the key slot + * must be populated with a key of type + * PSA_ALG_CATEGORY_KEY_DERIVATION whose policy allows its + * use for the key derivation algorithm + * applied in the handshake. + * + * \return \c 0 if successful. + * \return An \c MBEDTLS_ERR_SSL_XXX error code on failure. + */ +int mbedtls_ssl_set_hs_psk_opaque(mbedtls_ssl_context *ssl, + psa_key_id_t psk); +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +/** + * \brief Set the PSK callback (server-side only). + * + * If set, the PSK callback is called for each + * handshake where a PSK-based ciphersuite was negotiated. + * The caller provides the identity received and wants to + * receive the actual PSK data and length. + * + * The callback has the following parameters: + * - \c void*: The opaque pointer \p p_psk. + * - \c mbedtls_ssl_context*: The SSL context to which + * the operation applies. + * - \c const unsigned char*: The PSK identity + * selected by the client. + * - \c size_t: The length of the PSK identity + * selected by the client. + * + * If a valid PSK identity is found, the callback should use + * \c mbedtls_ssl_set_hs_psk() or + * \c mbedtls_ssl_set_hs_psk_opaque() + * on the SSL context to set the correct PSK and return \c 0. + * Any other return value will result in a denied PSK identity. + * + * \note A dynamic PSK (i.e. set by the PSK callback) takes + * precedence over a static PSK (i.e. set by + * \c mbedtls_ssl_conf_psk() or + * \c mbedtls_ssl_conf_psk_opaque()). + * This means that if you set a PSK callback using this + * function, you don't need to set a PSK using + * \c mbedtls_ssl_conf_psk() or + * \c mbedtls_ssl_conf_psk_opaque()). + * + * \param conf The SSL configuration to register the callback with. + * \param f_psk The callback for selecting and setting the PSK based + * in the PSK identity chosen by the client. + * \param p_psk A pointer to an opaque structure to be passed to + * the callback, for example a PSK store. + */ +void mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config *conf, + int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, + size_t), + void *p_psk); +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ + +#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) + +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif + +/** + * \brief Set the Diffie-Hellman public P and G values, + * read as hexadecimal strings (server-side only) + * (Default values: MBEDTLS_DHM_RFC3526_MODP_2048_[PG]) + * + * \param conf SSL configuration + * \param dhm_P Diffie-Hellman-Merkle modulus + * \param dhm_G Diffie-Hellman-Merkle generator + * + * \deprecated Superseded by \c mbedtls_ssl_conf_dh_param_bin. + * + * \return 0 if successful + */ +MBEDTLS_DEPRECATED int mbedtls_ssl_conf_dh_param(mbedtls_ssl_config *conf, + const char *dhm_P, + const char *dhm_G); + +#endif /* MBEDTLS_DEPRECATED_REMOVED */ + +/** + * \brief Set the Diffie-Hellman public P and G values + * from big-endian binary presentations. + * (Default values: MBEDTLS_DHM_RFC3526_MODP_2048_[PG]_BIN) + * + * \param conf SSL configuration + * \param dhm_P Diffie-Hellman-Merkle modulus in big-endian binary form + * \param P_len Length of DHM modulus + * \param dhm_G Diffie-Hellman-Merkle generator in big-endian binary form + * \param G_len Length of DHM generator + * + * \return 0 if successful + */ +int mbedtls_ssl_conf_dh_param_bin(mbedtls_ssl_config *conf, + const unsigned char *dhm_P, size_t P_len, + const unsigned char *dhm_G, size_t G_len); + +/** + * \brief Set the Diffie-Hellman public P and G values, + * read from existing context (server-side only) + * + * \param conf SSL configuration + * \param dhm_ctx Diffie-Hellman-Merkle context + * + * \return 0 if successful + */ +int mbedtls_ssl_conf_dh_param_ctx(mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx); +#endif /* MBEDTLS_DHM_C && defined(MBEDTLS_SSL_SRV_C) */ + +#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) +/** + * \brief Set the minimum length for Diffie-Hellman parameters. + * (Client-side only.) + * (Default: 1024 bits.) + * + * \param conf SSL configuration + * \param bitlen Minimum bit length of the DHM prime + */ +void mbedtls_ssl_conf_dhm_min_bitlen(mbedtls_ssl_config *conf, + unsigned int bitlen); +#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */ + +#if defined(MBEDTLS_ECP_C) +/** + * \brief Set the allowed curves in order of preference. + * (Default: all defined curves in order of decreasing size, + * except that Montgomery curves come last. This order + * is likely to change in a future version.) + * + * On server: this only affects selection of the ECDHE curve; + * the curves used for ECDH and ECDSA are determined by the + * list of available certificates instead. + * + * On client: this affects the list of curves offered for any + * use. The server can override our preference order. + * + * Both sides: limits the set of curves accepted for use in + * ECDHE and in the peer's end-entity certificate. + * + * \note This has no influence on which curves are allowed inside the + * certificate chains, see \c mbedtls_ssl_conf_cert_profile() + * for that. For the end-entity certificate however, the key + * will be accepted only if it is allowed both by this list + * and by the cert profile. + * + * \note This list should be ordered by decreasing preference + * (preferred curve first). + * + * \param conf SSL configuration + * \param curves Ordered list of allowed curves, + * terminated by MBEDTLS_ECP_DP_NONE. + */ +void mbedtls_ssl_conf_curves(mbedtls_ssl_config *conf, + const mbedtls_ecp_group_id *curves); +#endif /* MBEDTLS_ECP_C */ + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) +/** + * \brief Set the allowed hashes for signatures during the handshake. + * (Default: all SHA-2 hashes, largest first. Also SHA-1 if + * the compile-time option + * `MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE` is enabled.) + * + * \note This only affects which hashes are offered and can be used + * for signatures during the handshake. Hashes for message + * authentication and the TLS PRF are controlled by the + * ciphersuite, see \c mbedtls_ssl_conf_ciphersuites(). Hashes + * used for certificate signature are controlled by the + * verification profile, see \c mbedtls_ssl_conf_cert_profile(). + * + * \note This list should be ordered by decreasing preference + * (preferred hash first). + * + * \param conf SSL configuration + * \param hashes Ordered list of allowed signature hashes, + * terminated by \c MBEDTLS_MD_NONE. + */ +void mbedtls_ssl_conf_sig_hashes(mbedtls_ssl_config *conf, + const int *hashes); +#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +/** + * \brief Set or reset the hostname to check against the received + * peer certificate. On a client, this also sets the + * ServerName TLS extension, if that extension is enabled. + * On a TLS 1.3 client, this also sets the server name in + * the session resumption ticket, if that feature is enabled. + * + * \param ssl SSL context + * \param hostname The server hostname. This may be \c NULL to clear + * the hostname. + * + * \note Maximum hostname length #MBEDTLS_SSL_MAX_HOST_NAME_LEN. + * + * \note If the hostname is \c NULL on a client, then the server + * is not authenticated: it only needs to have a valid + * certificate, not a certificate matching its name. + * Therefore you should always call this function on a client, + * unless the connection is set up to only allow + * pre-shared keys, or in scenarios where server + * impersonation is not a concern. See the documentation of + * #MBEDTLS_ERR_SSL_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME + * for more details. + * + * \return 0 if successful, #MBEDTLS_ERR_SSL_ALLOC_FAILED on + * allocation failure, #MBEDTLS_ERR_SSL_BAD_INPUT_DATA on + * too long input hostname. + * + * Hostname set to the one provided on success (cleared + * when NULL). On allocation failure hostname is cleared. + * On too long input failure, old hostname is unchanged. + */ +int mbedtls_ssl_set_hostname(mbedtls_ssl_context *ssl, const char *hostname); +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) +/** + * \brief Set own certificate and key for the current handshake + * + * \note Same as \c mbedtls_ssl_conf_own_cert() but for use within + * the SNI callback. + * + * \param ssl SSL context + * \param own_cert own public certificate chain + * \param pk_key own private key + * + * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED + */ +int mbedtls_ssl_set_hs_own_cert(mbedtls_ssl_context *ssl, + mbedtls_x509_crt *own_cert, + mbedtls_pk_context *pk_key); + +/** + * \brief Set the data required to verify peer certificate for the + * current handshake + * + * \note Same as \c mbedtls_ssl_conf_ca_chain() but for use within + * the SNI callback. + * + * \param ssl SSL context + * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) + * \param ca_crl trusted CA CRLs + */ +void mbedtls_ssl_set_hs_ca_chain(mbedtls_ssl_context *ssl, + mbedtls_x509_crt *ca_chain, + mbedtls_x509_crl *ca_crl); + +/** + * \brief Set authmode for the current handshake. + * + * \note Same as \c mbedtls_ssl_conf_authmode() but for use within + * the SNI callback. + * + * \param ssl SSL context + * \param authmode MBEDTLS_SSL_VERIFY_NONE, MBEDTLS_SSL_VERIFY_OPTIONAL or + * MBEDTLS_SSL_VERIFY_REQUIRED + */ +void mbedtls_ssl_set_hs_authmode(mbedtls_ssl_context *ssl, + int authmode); + +/** + * \brief Set server side ServerName TLS extension callback + * (optional, server-side only). + * + * If set, the ServerName callback is called whenever the + * server receives a ServerName TLS extension from the client + * during a handshake. The ServerName callback has the + * following parameters: (void *parameter, mbedtls_ssl_context *ssl, + * const unsigned char *hostname, size_t len). If a suitable + * certificate is found, the callback must set the + * certificate(s) and key(s) to use with \c + * mbedtls_ssl_set_hs_own_cert() (can be called repeatedly), + * and may optionally adjust the CA and associated CRL with \c + * mbedtls_ssl_set_hs_ca_chain() as well as the client + * authentication mode with \c mbedtls_ssl_set_hs_authmode(), + * then must return 0. If no matching name is found, the + * callback must either set a default cert, or + * return non-zero to abort the handshake at this point. + * + * \param conf SSL configuration + * \param f_sni verification function + * \param p_sni verification parameter + */ +void mbedtls_ssl_conf_sni(mbedtls_ssl_config *conf, + int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, + size_t), + void *p_sni); +#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +/** + * \brief Set the EC J-PAKE password for current handshake. + * + * \note An internal copy is made, and destroyed as soon as the + * handshake is completed, or when the SSL context is reset or + * freed. + * + * \note The SSL context needs to be already set up. The right place + * to call this function is between \c mbedtls_ssl_setup() or + * \c mbedtls_ssl_reset() and \c mbedtls_ssl_handshake(). + * + * \param ssl SSL context + * \param pw EC J-PAKE password (pre-shared secret) + * \param pw_len length of pw in bytes + * + * \return 0 on success, or a negative error code. + */ +int mbedtls_ssl_set_hs_ecjpake_password(mbedtls_ssl_context *ssl, + const unsigned char *pw, + size_t pw_len); +#endif /*MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_SSL_ALPN) +/** + * \brief Set the supported Application Layer Protocols. + * + * \param conf SSL configuration + * \param protos Pointer to a NULL-terminated list of supported protocols, + * in decreasing preference order. The pointer to the list is + * recorded by the library for later reference as required, so + * the lifetime of the table must be at least as long as the + * lifetime of the SSL configuration structure. + * + * \return 0 on success, or MBEDTLS_ERR_SSL_BAD_INPUT_DATA. + */ +int mbedtls_ssl_conf_alpn_protocols(mbedtls_ssl_config *conf, const char **protos); + +/** + * \brief Get the name of the negotiated Application Layer Protocol. + * This function should be called after the handshake is + * completed. + * + * \param ssl SSL context + * + * \return Protocol name, or NULL if no protocol was negotiated. + */ +const char *mbedtls_ssl_get_alpn_protocol(const mbedtls_ssl_context *ssl); +#endif /* MBEDTLS_SSL_ALPN */ + +#if defined(MBEDTLS_SSL_DTLS_SRTP) +#if defined(MBEDTLS_DEBUG_C) +static inline const char *mbedtls_ssl_get_srtp_profile_as_string(mbedtls_ssl_srtp_profile profile) +{ + switch (profile) { + case MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80: + return "MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80"; + case MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32: + return "MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32"; + case MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_80: + return "MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_80"; + case MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_32: + return "MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_32"; + default: break; + } + return ""; +} +#endif /* MBEDTLS_DEBUG_C */ +/** + * \brief Manage support for mki(master key id) value + * in use_srtp extension. + * MKI is an optional part of SRTP used for key management + * and re-keying. See RFC3711 section 3.1 for details. + * The default value is + * #MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED. + * + * \param conf The SSL configuration to manage mki support. + * \param support_mki_value Enable or disable mki usage. Values are + * #MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED + * or #MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED. + */ +void mbedtls_ssl_conf_srtp_mki_value_supported(mbedtls_ssl_config *conf, + int support_mki_value); + +/** + * \brief Set the supported DTLS-SRTP protection profiles. + * + * \param conf SSL configuration + * \param profiles Pointer to a List of MBEDTLS_TLS_SRTP_UNSET terminated + * supported protection profiles + * in decreasing preference order. + * The pointer to the list is recorded by the library + * for later reference as required, so the lifetime + * of the table must be at least as long as the lifetime + * of the SSL configuration structure. + * The list must not hold more than + * MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH elements + * (excluding the terminating MBEDTLS_TLS_SRTP_UNSET). + * + * \return 0 on success + * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA when the list of + * protection profiles is incorrect. + */ +int mbedtls_ssl_conf_dtls_srtp_protection_profiles + (mbedtls_ssl_config *conf, + const mbedtls_ssl_srtp_profile *profiles); + +/** + * \brief Set the mki_value for the current DTLS-SRTP session. + * + * \param ssl SSL context to use. + * \param mki_value The MKI value to set. + * \param mki_len The length of the MKI value. + * + * \note This function is relevant on client side only. + * The server discovers the mki value during handshake. + * A mki value set on server side using this function + * is ignored. + * + * \return 0 on success + * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA + * \return #MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE + */ +int mbedtls_ssl_dtls_srtp_set_mki_value(mbedtls_ssl_context *ssl, + unsigned char *mki_value, + uint16_t mki_len); +/** + * \brief Get the negotiated DTLS-SRTP information: + * Protection profile and MKI value. + * + * \warning This function must be called after the handshake is + * completed. The value returned by this function must + * not be trusted or acted upon before the handshake completes. + * + * \param ssl The SSL context to query. + * \param dtls_srtp_info The negotiated DTLS-SRTP information: + * - Protection profile in use. + * A direct mapping of the iana defined value for protection + * profile on an uint16_t. + http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml + * #MBEDTLS_TLS_SRTP_UNSET if the use of SRTP was not negotiated + * or peer's Hello packet was not parsed yet. + * - mki size and value( if size is > 0 ). + */ +void mbedtls_ssl_get_dtls_srtp_negotiation_result(const mbedtls_ssl_context *ssl, + mbedtls_dtls_srtp_info *dtls_srtp_info); +#endif /* MBEDTLS_SSL_DTLS_SRTP */ + +/** + * \brief Set the maximum supported version sent from the client side + * and/or accepted at the server side + * (Default: MBEDTLS_SSL_MAX_MAJOR_VERSION, MBEDTLS_SSL_MAX_MINOR_VERSION) + * + * \note This ignores ciphersuites from higher versions. + * + * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and + * MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 + * + * \param conf SSL configuration + * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported) + * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, + * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, + * MBEDTLS_SSL_MINOR_VERSION_3 supported) + */ +void mbedtls_ssl_conf_max_version(mbedtls_ssl_config *conf, int major, int minor); + +/** + * \brief Set the minimum accepted SSL/TLS protocol version + * (Default: TLS 1.0) + * + * \note Input outside of the SSL_MAX_XXXXX_VERSION and + * SSL_MIN_XXXXX_VERSION range is ignored. + * + * \note MBEDTLS_SSL_MINOR_VERSION_0 (SSL v3) should be avoided. + * + * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and + * MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 + * + * \param conf SSL configuration + * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported) + * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, + * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, + * MBEDTLS_SSL_MINOR_VERSION_3 supported) + */ +void mbedtls_ssl_conf_min_version(mbedtls_ssl_config *conf, int major, int minor); + +#if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) +/** + * \brief Set the fallback flag (client-side only). + * (Default: MBEDTLS_SSL_IS_NOT_FALLBACK). + * + * \note Set to MBEDTLS_SSL_IS_FALLBACK when preparing a fallback + * connection, that is a connection with max_version set to a + * lower value than the value you're willing to use. Such + * fallback connections are not recommended but are sometimes + * necessary to interoperate with buggy (version-intolerant) + * servers. + * + * \warning You should NOT set this to MBEDTLS_SSL_IS_FALLBACK for + * non-fallback connections! This would appear to work for a + * while, then cause failures when the server is upgraded to + * support a newer TLS version. + * + * \param conf SSL configuration + * \param fallback MBEDTLS_SSL_IS_NOT_FALLBACK or MBEDTLS_SSL_IS_FALLBACK + */ +void mbedtls_ssl_conf_fallback(mbedtls_ssl_config *conf, char fallback); +#endif /* MBEDTLS_SSL_FALLBACK_SCSV && MBEDTLS_SSL_CLI_C */ + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) +/** + * \brief Enable or disable Encrypt-then-MAC + * (Default: MBEDTLS_SSL_ETM_ENABLED) + * + * \note This should always be enabled, it is a security + * improvement, and should not cause any interoperability + * issue (used only if the peer supports it too). + * + * \param conf SSL configuration + * \param etm MBEDTLS_SSL_ETM_ENABLED or MBEDTLS_SSL_ETM_DISABLED + */ +void mbedtls_ssl_conf_encrypt_then_mac(mbedtls_ssl_config *conf, char etm); +#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) +/** + * \brief Enable or disable Extended Master Secret negotiation. + * (Default: MBEDTLS_SSL_EXTENDED_MS_ENABLED) + * + * \note This should always be enabled, it is a security fix to the + * protocol, and should not cause any interoperability issue + * (used only if the peer supports it too). + * + * \param conf SSL configuration + * \param ems MBEDTLS_SSL_EXTENDED_MS_ENABLED or MBEDTLS_SSL_EXTENDED_MS_DISABLED + */ +void mbedtls_ssl_conf_extended_master_secret(mbedtls_ssl_config *conf, char ems); +#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ + +#if defined(MBEDTLS_ARC4_C) +/** + * \brief Disable or enable support for RC4 + * (Default: MBEDTLS_SSL_ARC4_DISABLED) + * + * \warning Use of RC4 in DTLS/TLS has been prohibited by RFC 7465 + * for security reasons. Use at your own risk. + * + * \note This function is deprecated and will be removed in + * a future version of the library. + * RC4 is disabled by default at compile time and needs to be + * actively enabled for use with legacy systems. + * + * \param conf SSL configuration + * \param arc4 MBEDTLS_SSL_ARC4_ENABLED or MBEDTLS_SSL_ARC4_DISABLED + */ +void mbedtls_ssl_conf_arc4_support(mbedtls_ssl_config *conf, char arc4); +#endif /* MBEDTLS_ARC4_C */ + +#if defined(MBEDTLS_SSL_SRV_C) +/** + * \brief Whether to send a list of acceptable CAs in + * CertificateRequest messages. + * (Default: do send) + * + * \param conf SSL configuration + * \param cert_req_ca_list MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED or + * MBEDTLS_SSL_CERT_REQ_CA_LIST_DISABLED + */ +void mbedtls_ssl_conf_cert_req_ca_list(mbedtls_ssl_config *conf, + char cert_req_ca_list); +#endif /* MBEDTLS_SSL_SRV_C */ + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) +/** + * \brief Set the maximum fragment length to emit and/or negotiate. + * (Typical: the smaller of #MBEDTLS_SSL_IN_CONTENT_LEN and + * #MBEDTLS_SSL_OUT_CONTENT_LEN, usually `2^14` bytes) + * (Server: set maximum fragment length to emit, + * usually negotiated by the client during handshake) + * (Client: set maximum fragment length to emit *and* + * negotiate with the server during handshake) + * (Default: #MBEDTLS_SSL_MAX_FRAG_LEN_NONE) + * + * \note On the client side, the maximum fragment length extension + * *will not* be used, unless the maximum fragment length has + * been set via this function to a value different than + * #MBEDTLS_SSL_MAX_FRAG_LEN_NONE. + * + * \note With TLS, this currently only affects ApplicationData (sent + * with \c mbedtls_ssl_read()), not handshake messages. + * With DTLS, this affects both ApplicationData and handshake. + * + * \note This sets the maximum length for a record's payload, + * excluding record overhead that will be added to it, see + * \c mbedtls_ssl_get_record_expansion(). + * + * \note For DTLS, it is also possible to set a limit for the total + * size of datagrams passed to the transport layer, including + * record overhead, see \c mbedtls_ssl_set_mtu(). + * + * \param conf SSL configuration + * \param mfl_code Code for maximum fragment length (allowed values: + * MBEDTLS_SSL_MAX_FRAG_LEN_512, MBEDTLS_SSL_MAX_FRAG_LEN_1024, + * MBEDTLS_SSL_MAX_FRAG_LEN_2048, MBEDTLS_SSL_MAX_FRAG_LEN_4096) + * + * \return 0 if successful or MBEDTLS_ERR_SSL_BAD_INPUT_DATA + */ +int mbedtls_ssl_conf_max_frag_len(mbedtls_ssl_config *conf, unsigned char mfl_code); +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) +/** + * \brief Activate negotiation of truncated HMAC + * (Default: MBEDTLS_SSL_TRUNC_HMAC_DISABLED) + * + * \param conf SSL configuration + * \param truncate Enable or disable (MBEDTLS_SSL_TRUNC_HMAC_ENABLED or + * MBEDTLS_SSL_TRUNC_HMAC_DISABLED) + */ +void mbedtls_ssl_conf_truncated_hmac(mbedtls_ssl_config *conf, int truncate); +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ + +#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) +/** + * \brief Enable / Disable 1/n-1 record splitting + * (Default: MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED) + * + * \note Only affects SSLv3 and TLS 1.0, not higher versions. + * Does not affect non-CBC ciphersuites in any version. + * + * \param conf SSL configuration + * \param split MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED or + * MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED + */ +void mbedtls_ssl_conf_cbc_record_splitting(mbedtls_ssl_config *conf, char split); +#endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) +/** + * \brief Enable / Disable session tickets (client only). + * (Default: MBEDTLS_SSL_SESSION_TICKETS_ENABLED.) + * + * \note On server, use \c mbedtls_ssl_conf_session_tickets_cb(). + * + * \param conf SSL configuration + * \param use_tickets Enable or disable (MBEDTLS_SSL_SESSION_TICKETS_ENABLED or + * MBEDTLS_SSL_SESSION_TICKETS_DISABLED) + */ +void mbedtls_ssl_conf_session_tickets(mbedtls_ssl_config *conf, int use_tickets); +#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ + +#if defined(MBEDTLS_SSL_RENEGOTIATION) +/** + * \brief Enable / Disable renegotiation support for connection when + * initiated by peer + * (Default: MBEDTLS_SSL_RENEGOTIATION_DISABLED) + * + * \warning It is recommended to always disable renegotiation unless you + * know you need it and you know what you're doing. In the + * past, there have been several issues associated with + * renegotiation or a poor understanding of its properties. + * + * \note Server-side, enabling renegotiation also makes the server + * susceptible to a resource DoS by a malicious client. + * + * \param conf SSL configuration + * \param renegotiation Enable or disable (MBEDTLS_SSL_RENEGOTIATION_ENABLED or + * MBEDTLS_SSL_RENEGOTIATION_DISABLED) + */ +void mbedtls_ssl_conf_renegotiation(mbedtls_ssl_config *conf, int renegotiation); +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + +/** + * \brief Prevent or allow legacy renegotiation. + * (Default: MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) + * + * MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION allows connections to + * be established even if the peer does not support + * secure renegotiation, but does not allow renegotiation + * to take place if not secure. + * (Interoperable and secure option) + * + * MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION allows renegotiations + * with non-upgraded peers. Allowing legacy renegotiation + * makes the connection vulnerable to specific man in the + * middle attacks. (See RFC 5746) + * (Most interoperable and least secure option) + * + * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE breaks off connections + * if peer does not support secure renegotiation. Results + * in interoperability issues with non-upgraded peers + * that do not support renegotiation altogether. + * (Most secure option, interoperability issues) + * + * \param conf SSL configuration + * \param allow_legacy Prevent or allow (SSL_NO_LEGACY_RENEGOTIATION, + * SSL_ALLOW_LEGACY_RENEGOTIATION or + * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) + */ +void mbedtls_ssl_conf_legacy_renegotiation(mbedtls_ssl_config *conf, int allow_legacy); + +#if defined(MBEDTLS_SSL_RENEGOTIATION) +/** + * \brief Enforce renegotiation requests. + * (Default: enforced, max_records = 16) + * + * When we request a renegotiation, the peer can comply or + * ignore the request. This function allows us to decide + * whether to enforce our renegotiation requests by closing + * the connection if the peer doesn't comply. + * + * However, records could already be in transit from the peer + * when the request is emitted. In order to increase + * reliability, we can accept a number of records before the + * expected handshake records. + * + * The optimal value is highly dependent on the specific usage + * scenario. + * + * \note With DTLS and server-initiated renegotiation, the + * HelloRequest is retransmitted every time mbedtls_ssl_read() times + * out or receives Application Data, until: + * - max_records records have beens seen, if it is >= 0, or + * - the number of retransmits that would happen during an + * actual handshake has been reached. + * Please remember the request might be lost a few times + * if you consider setting max_records to a really low value. + * + * \warning On client, the grace period can only happen during + * mbedtls_ssl_read(), as opposed to mbedtls_ssl_write() and mbedtls_ssl_renegotiate() + * which always behave as if max_record was 0. The reason is, + * if we receive application data from the server, we need a + * place to write it, which only happens during mbedtls_ssl_read(). + * + * \param conf SSL configuration + * \param max_records Use MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED if you don't want to + * enforce renegotiation, or a non-negative value to enforce + * it but allow for a grace period of max_records records. + */ +void mbedtls_ssl_conf_renegotiation_enforced(mbedtls_ssl_config *conf, int max_records); + +/** + * \brief Set record counter threshold for periodic renegotiation. + * (Default: 2^48 - 1) + * + * Renegotiation is automatically triggered when a record + * counter (outgoing or incoming) crosses the defined + * threshold. The default value is meant to prevent the + * connection from being closed when the counter is about to + * reached its maximal value (it is not allowed to wrap). + * + * Lower values can be used to enforce policies such as "keys + * must be refreshed every N packets with cipher X". + * + * The renegotiation period can be disabled by setting + * conf->disable_renegotiation to + * MBEDTLS_SSL_RENEGOTIATION_DISABLED. + * + * \note When the configured transport is + * MBEDTLS_SSL_TRANSPORT_DATAGRAM the maximum renegotiation + * period is 2^48 - 1, and for MBEDTLS_SSL_TRANSPORT_STREAM, + * the maximum renegotiation period is 2^64 - 1. + * + * \param conf SSL configuration + * \param period The threshold value: a big-endian 64-bit number. + */ +void mbedtls_ssl_conf_renegotiation_period(mbedtls_ssl_config *conf, + const unsigned char period[8]); +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + +/** + * \brief Check if there is data already read from the + * underlying transport but not yet processed. + * + * \param ssl SSL context + * + * \return 0 if nothing's pending, 1 otherwise. + * + * \note This is different in purpose and behaviour from + * \c mbedtls_ssl_get_bytes_avail in that it considers + * any kind of unprocessed data, not only unread + * application data. If \c mbedtls_ssl_get_bytes + * returns a non-zero value, this function will + * also signal pending data, but the converse does + * not hold. For example, in DTLS there might be + * further records waiting to be processed from + * the current underlying transport's datagram. + * + * \note If this function returns 1 (data pending), this + * does not imply that a subsequent call to + * \c mbedtls_ssl_read will provide any data; + * e.g., the unprocessed data might turn out + * to be an alert or a handshake message. + * + * \note This function is useful in the following situation: + * If the SSL/TLS module successfully returns from an + * operation - e.g. a handshake or an application record + * read - and you're awaiting incoming data next, you + * must not immediately idle on the underlying transport + * to have data ready, but you need to check the value + * of this function first. The reason is that the desired + * data might already be read but not yet processed. + * If, in contrast, a previous call to the SSL/TLS module + * returned MBEDTLS_ERR_SSL_WANT_READ, it is not necessary + * to call this function, as the latter error code entails + * that all internal data has been processed. + * + */ +int mbedtls_ssl_check_pending(const mbedtls_ssl_context *ssl); + +/** + * \brief Return the number of application data bytes + * remaining to be read from the current record. + * + * \param ssl SSL context + * + * \return How many bytes are available in the application + * data record read buffer. + * + * \note When working over a datagram transport, this is + * useful to detect the current datagram's boundary + * in case \c mbedtls_ssl_read has written the maximal + * amount of data fitting into the input buffer. + * + */ +size_t mbedtls_ssl_get_bytes_avail(const mbedtls_ssl_context *ssl); + +/** + * \brief Return the result of the certificate verification + * + * \param ssl The SSL context to use. + * + * \return \c 0 if the certificate verification was successful. + * \return \c -1u if the result is not available. This may happen + * e.g. if the handshake aborts early, or a verification + * callback returned a fatal error. + * \return A bitwise combination of \c MBEDTLS_X509_BADCERT_XXX + * and \c MBEDTLS_X509_BADCRL_XXX failure flags; see x509.h. + */ +uint32_t mbedtls_ssl_get_verify_result(const mbedtls_ssl_context *ssl); + +/** + * \brief Return the name of the current ciphersuite + * + * \param ssl SSL context + * + * \return a string containing the ciphersuite name + */ +const char *mbedtls_ssl_get_ciphersuite(const mbedtls_ssl_context *ssl); + +/** + * \brief Return the current SSL version (SSLv3/TLSv1/etc) + * + * \param ssl SSL context + * + * \return a string containing the SSL version + */ +const char *mbedtls_ssl_get_version(const mbedtls_ssl_context *ssl); + +/** + * \brief Return the (maximum) number of bytes added by the record + * layer: header + encryption/MAC overhead (inc. padding) + * + * \note This function is not available (always returns an error) + * when record compression is enabled. + * + * \param ssl SSL context + * + * \return Current maximum record expansion in bytes, or + * MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE if compression is + * enabled, which makes expansion much less predictable + */ +int mbedtls_ssl_get_record_expansion(const mbedtls_ssl_context *ssl); + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) +/** + * \brief Return the maximum fragment length (payload, in bytes) for + * the output buffer. For the client, this is the configured + * value. For the server, it is the minimum of two - the + * configured value and the negotiated one. + * + * \sa mbedtls_ssl_conf_max_frag_len() + * \sa mbedtls_ssl_get_max_record_payload() + * + * \param ssl SSL context + * + * \return Current maximum fragment length for the output buffer. + */ +size_t mbedtls_ssl_get_output_max_frag_len(const mbedtls_ssl_context *ssl); + +/** + * \brief Return the maximum fragment length (payload, in bytes) for + * the input buffer. This is the negotiated maximum fragment + * length, or, if there is none, MBEDTLS_SSL_MAX_CONTENT_LEN. + * If it is not defined either, the value is 2^14. This function + * works as its predecessor, \c mbedtls_ssl_get_max_frag_len(). + * + * \sa mbedtls_ssl_conf_max_frag_len() + * \sa mbedtls_ssl_get_max_record_payload() + * + * \param ssl SSL context + * + * \return Current maximum fragment length for the output buffer. + */ +size_t mbedtls_ssl_get_input_max_frag_len(const mbedtls_ssl_context *ssl); + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) + +#if defined(MBEDTLS_DEPRECATED_WARNING) +#define MBEDTLS_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_DEPRECATED +#endif + +/** + * \brief This function is a deprecated approach to getting the max + * fragment length. Its an alias for + * \c mbedtls_ssl_get_output_max_frag_len(), as the behaviour + * is the same. See \c mbedtls_ssl_get_output_max_frag_len() for + * more detail. + * + * \sa mbedtls_ssl_get_input_max_frag_len() + * \sa mbedtls_ssl_get_output_max_frag_len() + * + * \param ssl SSL context + * + * \return Current maximum fragment length for the output buffer. + */ +MBEDTLS_DEPRECATED size_t mbedtls_ssl_get_max_frag_len( + const mbedtls_ssl_context *ssl); +#endif /* MBEDTLS_DEPRECATED_REMOVED */ +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ + +/** + * \brief Return the current maximum outgoing record payload in bytes. + * This takes into account the config.h setting \c + * MBEDTLS_SSL_OUT_CONTENT_LEN, the configured and negotiated + * max fragment length extension if used, and for DTLS the + * path MTU as configured and current record expansion. + * + * \note With DTLS, \c mbedtls_ssl_write() will return an error if + * called with a larger length value. + * With TLS, \c mbedtls_ssl_write() will fragment the input if + * necessary and return the number of bytes written; it is up + * to the caller to call \c mbedtls_ssl_write() again in + * order to send the remaining bytes if any. + * + * \note This function is not available (always returns an error) + * when record compression is enabled. + * + * \sa mbedtls_ssl_set_mtu() + * \sa mbedtls_ssl_get_output_max_frag_len() + * \sa mbedtls_ssl_get_input_max_frag_len() + * \sa mbedtls_ssl_get_record_expansion() + * + * \param ssl SSL context + * + * \return Current maximum payload for an outgoing record, + * or a negative error code. + */ +int mbedtls_ssl_get_max_out_record_payload(const mbedtls_ssl_context *ssl); + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +/** + * \brief Return the peer certificate from the current connection. + * + * \param ssl The SSL context to use. This must be initialized and setup. + * + * \return The current peer certificate, if available. + * The returned certificate is owned by the SSL context and + * is valid only until the next call to the SSL API. + * \return \c NULL if no peer certificate is available. This might + * be because the chosen ciphersuite doesn't use CRTs + * (PSK-based ciphersuites, for example), or because + * #MBEDTLS_SSL_KEEP_PEER_CERTIFICATE has been disabled, + * allowing the stack to free the peer's CRT to save memory. + * + * \note For one-time inspection of the peer's certificate during + * the handshake, consider registering an X.509 CRT verification + * callback through mbedtls_ssl_conf_verify() instead of calling + * this function. Using mbedtls_ssl_conf_verify() also comes at + * the benefit of allowing you to influence the verification + * process, for example by masking expected and tolerated + * verification failures. + * + * \warning You must not use the pointer returned by this function + * after any further call to the SSL API, including + * mbedtls_ssl_read() and mbedtls_ssl_write(); this is + * because the pointer might change during renegotiation, + * which happens transparently to the user. + * If you want to use the certificate across API calls, + * you must make a copy. + */ +const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert(const mbedtls_ssl_context *ssl); +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +#if defined(MBEDTLS_SSL_CLI_C) +/** + * \brief Save session in order to resume it later (client-side only) + * Session data is copied to presented session structure. + * + * + * \param ssl SSL context + * \param session session context + * + * \return 0 if successful, + * MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed, + * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or + * arguments are otherwise invalid. + * + * \note Only the server certificate is copied, and not the full chain, + * so you should not attempt to validate the certificate again + * by calling \c mbedtls_x509_crt_verify() on it. + * Instead, you should use the results from the verification + * in the original handshake by calling \c mbedtls_ssl_get_verify_result() + * after loading the session again into a new SSL context + * using \c mbedtls_ssl_set_session(). + * + * \note Once the session object is not needed anymore, you should + * free it by calling \c mbedtls_ssl_session_free(). + * + * \sa mbedtls_ssl_set_session() + */ +int mbedtls_ssl_get_session(const mbedtls_ssl_context *ssl, mbedtls_ssl_session *session); +#endif /* MBEDTLS_SSL_CLI_C */ + +/** + * \brief Perform the SSL handshake + * + * \param ssl SSL context + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE + * if the handshake is incomplete and waiting for data to + * be available for reading from or writing to the underlying + * transport - in this case you must call this function again + * when the underlying transport is ready for the operation. + * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous + * operation is in progress (see + * mbedtls_ssl_conf_async_private_cb()) - in this case you + * must call this function again when the operation is ready. + * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic + * operation is in progress (see mbedtls_ecp_set_max_ops()) - + * in this case you must call this function again to complete + * the handshake when you're done attending other tasks. + * \return #MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED if DTLS is in use + * and the client did not demonstrate reachability yet - in + * this case you must stop using the context (see below). + * \return Another SSL error code - in this case you must stop using + * the context (see below). + * + * \warning If this function returns something other than + * \c 0, + * #MBEDTLS_ERR_SSL_WANT_READ, + * #MBEDTLS_ERR_SSL_WANT_WRITE, + * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or + * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, + * you must stop using the SSL context for reading or writing, + * and either free it or call \c mbedtls_ssl_session_reset() + * on it before re-using it for a new connection; the current + * connection must be closed. + * + * \note If DTLS is in use, then you may choose to handle + * #MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED specially for logging + * purposes, as it is an expected return value rather than an + * actual error, but you still need to reset/free the context. + * + * \note Remarks regarding event-driven DTLS: + * If the function returns #MBEDTLS_ERR_SSL_WANT_READ, no datagram + * from the underlying transport layer is currently being processed, + * and it is safe to idle until the timer or the underlying transport + * signal a new event. This is not true for a successful handshake, + * in which case the datagram of the underlying transport that is + * currently being processed might or might not contain further + * DTLS records. + * + * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto + * subsystem must have been initialized by calling + * psa_crypto_init() before calling this function. + */ +int mbedtls_ssl_handshake(mbedtls_ssl_context *ssl); + +/** + * \brief Perform a single step of the SSL handshake + * + * \note The state of the context (ssl->state) will be at + * the next state after this function returns \c 0. Do not + * call this function if state is MBEDTLS_SSL_HANDSHAKE_OVER. + * + * \param ssl SSL context + * + * \return See mbedtls_ssl_handshake(). + * + * \warning If this function returns something other than \c 0, + * #MBEDTLS_ERR_SSL_WANT_READ, #MBEDTLS_ERR_SSL_WANT_WRITE, + * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or + * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, you must stop using + * the SSL context for reading or writing, and either free it + * or call \c mbedtls_ssl_session_reset() on it before + * re-using it for a new connection; the current connection + * must be closed. + */ +int mbedtls_ssl_handshake_step(mbedtls_ssl_context *ssl); + +#if defined(MBEDTLS_SSL_RENEGOTIATION) +/** + * \brief Initiate an SSL renegotiation on the running connection. + * Client: perform the renegotiation right now. + * Server: request renegotiation, which will be performed + * during the next call to mbedtls_ssl_read() if honored by + * client. + * + * \param ssl SSL context + * + * \return 0 if successful, or any mbedtls_ssl_handshake() return + * value except #MBEDTLS_ERR_SSL_CLIENT_RECONNECT that can't + * happen during a renegotiation. + * + * \warning If this function returns something other than \c 0, + * #MBEDTLS_ERR_SSL_WANT_READ, #MBEDTLS_ERR_SSL_WANT_WRITE, + * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or + * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, you must stop using + * the SSL context for reading or writing, and either free it + * or call \c mbedtls_ssl_session_reset() on it before + * re-using it for a new connection; the current connection + * must be closed. + * + */ +int mbedtls_ssl_renegotiate(mbedtls_ssl_context *ssl); +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + +/** + * \brief Read at most 'len' application data bytes + * + * \param ssl SSL context + * \param buf buffer that will hold the data + * \param len maximum number of bytes to read + * + * \return The (positive) number of bytes read if successful. + * \return \c 0 if the read end of the underlying transport was closed + * without sending a CloseNotify beforehand, which might happen + * because of various reasons (internal error of an underlying + * stack, non-conformant peer not sending a CloseNotify and + * such) - in this case you must stop using the context + * (see below). + * \return #MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY if the underlying + * transport is still functional, but the peer has + * acknowledged to not send anything anymore. + * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE + * if the handshake is incomplete and waiting for data to + * be available for reading from or writing to the underlying + * transport - in this case you must call this function again + * when the underlying transport is ready for the operation. + * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous + * operation is in progress (see + * mbedtls_ssl_conf_async_private_cb()) - in this case you + * must call this function again when the operation is ready. + * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic + * operation is in progress (see mbedtls_ecp_set_max_ops()) - + * in this case you must call this function again to complete + * the handshake when you're done attending other tasks. + * \return #MBEDTLS_ERR_SSL_CLIENT_RECONNECT if we're at the server + * side of a DTLS connection and the client is initiating a + * new connection using the same source port. See below. + * \return Another SSL error code - in this case you must stop using + * the context (see below). + * + * \warning If this function returns something other than + * a positive value, + * #MBEDTLS_ERR_SSL_WANT_READ, + * #MBEDTLS_ERR_SSL_WANT_WRITE, + * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, + * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS or + * #MBEDTLS_ERR_SSL_CLIENT_RECONNECT, + * you must stop using the SSL context for reading or writing, + * and either free it or call \c mbedtls_ssl_session_reset() + * on it before re-using it for a new connection; the current + * connection must be closed. + * + * \note When this function returns #MBEDTLS_ERR_SSL_CLIENT_RECONNECT + * (which can only happen server-side), it means that a client + * is initiating a new connection using the same source port. + * You can either treat that as a connection close and wait + * for the client to resend a ClientHello, or directly + * continue with \c mbedtls_ssl_handshake() with the same + * context (as it has been reset internally). Either way, you + * must make sure this is seen by the application as a new + * connection: application state, if any, should be reset, and + * most importantly the identity of the client must be checked + * again. WARNING: not validating the identity of the client + * again, or not transmitting the new identity to the + * application layer, would allow authentication bypass! + * + * \note Remarks regarding event-driven DTLS: + * - If the function returns #MBEDTLS_ERR_SSL_WANT_READ, no datagram + * from the underlying transport layer is currently being processed, + * and it is safe to idle until the timer or the underlying transport + * signal a new event. + * - This function may return MBEDTLS_ERR_SSL_WANT_READ even if data was + * initially available on the underlying transport, as this data may have + * been only e.g. duplicated messages or a renegotiation request. + * Therefore, you must be prepared to receive MBEDTLS_ERR_SSL_WANT_READ even + * when reacting to an incoming-data event from the underlying transport. + * - On success, the datagram of the underlying transport that is currently + * being processed may contain further DTLS records. You should call + * \c mbedtls_ssl_check_pending to check for remaining records. + * + */ +int mbedtls_ssl_read(mbedtls_ssl_context *ssl, unsigned char *buf, size_t len); + +/** + * \brief Try to write exactly 'len' application data bytes + * + * \warning This function will do partial writes in some cases. If the + * return value is non-negative but less than length, the + * function must be called again with updated arguments: + * buf + ret, len - ret (if ret is the return value) until + * it returns a value equal to the last 'len' argument. + * + * \param ssl SSL context + * \param buf buffer holding the data + * \param len how many bytes must be written + * + * \return The (non-negative) number of bytes actually written if + * successful (may be less than \p len). + * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE + * if the handshake is incomplete and waiting for data to + * be available for reading from or writing to the underlying + * transport - in this case you must call this function again + * when the underlying transport is ready for the operation. + * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous + * operation is in progress (see + * mbedtls_ssl_conf_async_private_cb()) - in this case you + * must call this function again when the operation is ready. + * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic + * operation is in progress (see mbedtls_ecp_set_max_ops()) - + * in this case you must call this function again to complete + * the handshake when you're done attending other tasks. + * \return Another SSL error code - in this case you must stop using + * the context (see below). + * + * \warning If this function returns something other than + * a non-negative value, + * #MBEDTLS_ERR_SSL_WANT_READ, + * #MBEDTLS_ERR_SSL_WANT_WRITE, + * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or + * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, + * you must stop using the SSL context for reading or writing, + * and either free it or call \c mbedtls_ssl_session_reset() + * on it before re-using it for a new connection; the current + * connection must be closed. + * + * \note When this function returns #MBEDTLS_ERR_SSL_WANT_WRITE/READ, + * it must be called later with the *same* arguments, + * until it returns a value greater that or equal to 0. When + * the function returns #MBEDTLS_ERR_SSL_WANT_WRITE there may be + * some partial data in the output buffer, however this is not + * yet sent. + * + * \note If the requested length is greater than the maximum + * fragment length (either the built-in limit or the one set + * or negotiated with the peer), then: + * - with TLS, less bytes than requested are written. + * - with DTLS, MBEDTLS_ERR_SSL_BAD_INPUT_DATA is returned. + * \c mbedtls_ssl_get_output_max_frag_len() may be used to + * query the active maximum fragment length. + * + * \note Attempting to write 0 bytes will result in an empty TLS + * application record being sent. + */ +int mbedtls_ssl_write(mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len); + +/** + * \brief Send an alert message + * + * \param ssl SSL context + * \param level The alert level of the message + * (MBEDTLS_SSL_ALERT_LEVEL_WARNING or MBEDTLS_SSL_ALERT_LEVEL_FATAL) + * \param message The alert message (SSL_ALERT_MSG_*) + * + * \return 0 if successful, or a specific SSL error code. + * + * \note If this function returns something other than 0 or + * MBEDTLS_ERR_SSL_WANT_READ/WRITE, you must stop using + * the SSL context for reading or writing, and either free it or + * call \c mbedtls_ssl_session_reset() on it before re-using it + * for a new connection; the current connection must be closed. + */ +int mbedtls_ssl_send_alert_message(mbedtls_ssl_context *ssl, + unsigned char level, + unsigned char message); +/** + * \brief Notify the peer that the connection is being closed + * + * \param ssl SSL context + * + * \return 0 if successful, or a specific SSL error code. + * + * \note If this function returns something other than 0 or + * MBEDTLS_ERR_SSL_WANT_READ/WRITE, you must stop using + * the SSL context for reading or writing, and either free it or + * call \c mbedtls_ssl_session_reset() on it before re-using it + * for a new connection; the current connection must be closed. + */ +int mbedtls_ssl_close_notify(mbedtls_ssl_context *ssl); + +/** + * \brief Free referenced items in an SSL context and clear memory + * + * \param ssl SSL context + */ +void mbedtls_ssl_free(mbedtls_ssl_context *ssl); + +#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION) +/** + * \brief Save an active connection as serialized data in a buffer. + * This allows the freeing or re-using of the SSL context + * while still picking up the connection later in a way that + * it entirely transparent to the peer. + * + * \see mbedtls_ssl_context_load() + * + * \note This feature is currently only available under certain + * conditions, see the documentation of the return value + * #MBEDTLS_ERR_SSL_BAD_INPUT_DATA for details. + * + * \note When this function succeeds, it calls + * mbedtls_ssl_session_reset() on \p ssl which as a result is + * no longer associated with the connection that has been + * serialized. This avoids creating copies of the connection + * state. You're then free to either re-use the context + * structure for a different connection, or call + * mbedtls_ssl_free() on it. See the documentation of + * mbedtls_ssl_session_reset() for more details. + * + * \param ssl The SSL context to save. On success, it is no longer + * associated with the connection that has been serialized. + * \param buf The buffer to write the serialized data to. It must be a + * writeable buffer of at least \p buf_len bytes, or may be \c + * NULL if \p buf_len is \c 0. + * \param buf_len The number of bytes available for writing in \p buf. + * \param olen The size in bytes of the data that has been or would have + * been written. It must point to a valid \c size_t. + * + * \note \p olen is updated to the correct value regardless of + * whether \p buf_len was large enough. This makes it possible + * to determine the necessary size by calling this function + * with \p buf set to \c NULL and \p buf_len to \c 0. However, + * the value of \p olen is only guaranteed to be correct when + * the function returns #MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL or + * \c 0. If the return value is different, then the value of + * \p olen is undefined. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL if \p buf is too small. + * \return #MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed + * while resetting the context. + * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if a handshake is in + * progress, or there is pending data for reading or sending, + * or the connection does not use DTLS 1.2 with an AEAD + * ciphersuite, or renegotiation is enabled. + */ +int mbedtls_ssl_context_save(mbedtls_ssl_context *ssl, + unsigned char *buf, + size_t buf_len, + size_t *olen); + +/** + * \brief Load serialized connection data to an SSL context. + * + * \see mbedtls_ssl_context_save() + * + * \warning The same serialized data must never be loaded into more + * that one context. In order to ensure that, after + * successfully loading serialized data to an SSL context, you + * should immediately destroy or invalidate all copies of the + * serialized data that was loaded. Loading the same data in + * more than one context would cause severe security failures + * including but not limited to loss of confidentiality. + * + * \note Before calling this function, the SSL context must be + * prepared in one of the two following ways. The first way is + * to take a context freshly initialised with + * mbedtls_ssl_init() and call mbedtls_ssl_setup() on it with + * the same ::mbedtls_ssl_config structure that was used in + * the original connection. The second way is to + * call mbedtls_ssl_session_reset() on a context that was + * previously prepared as above but used in the meantime. + * Either way, you must not use the context to perform a + * handshake between calling mbedtls_ssl_setup() or + * mbedtls_ssl_session_reset() and calling this function. You + * may however call other setter functions in that time frame + * as indicated in the note below. + * + * \note Before or after calling this function successfully, you + * also need to configure some connection-specific callbacks + * and settings before you can use the connection again + * (unless they were already set before calling + * mbedtls_ssl_session_reset() and the values are suitable for + * the present connection). Specifically, you want to call + * at least mbedtls_ssl_set_bio() and + * mbedtls_ssl_set_timer_cb(). All other SSL setter functions + * are not necessary to call, either because they're only used + * in handshakes, or because the setting is already saved. You + * might choose to call them anyway, for example in order to + * share code between the cases of establishing a new + * connection and the case of loading an already-established + * connection. + * + * \note If you have new information about the path MTU, you want to + * call mbedtls_ssl_set_mtu() after calling this function, as + * otherwise this function would overwrite your + * newly-configured value with the value that was active when + * the context was saved. + * + * \note When this function returns an error code, it calls + * mbedtls_ssl_free() on \p ssl. In this case, you need to + * prepare the context with the usual sequence starting with a + * call to mbedtls_ssl_init() if you want to use it again. + * + * \param ssl The SSL context structure to be populated. It must have + * been prepared as described in the note above. + * \param buf The buffer holding the serialized connection data. It must + * be a readable buffer of at least \p len bytes. + * \param len The size of the serialized data in bytes. + * + * \return \c 0 if successful. + * \return #MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed. + * \return #MBEDTLS_ERR_SSL_VERSION_MISMATCH if the serialized data + * comes from a different Mbed TLS version or build. + * \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if input data is invalid. + */ +int mbedtls_ssl_context_load(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len); +#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */ + +/** + * \brief Initialize an SSL configuration context + * Just makes the context ready for + * mbedtls_ssl_config_defaults() or mbedtls_ssl_config_free(). + * + * \note You need to call mbedtls_ssl_config_defaults() unless you + * manually set all of the relevant fields yourself. + * + * \param conf SSL configuration context + */ +void mbedtls_ssl_config_init(mbedtls_ssl_config *conf); + +/** + * \brief Load reasonable default SSL configuration values. + * (You need to call mbedtls_ssl_config_init() first.) + * + * \param conf SSL configuration context + * \param endpoint MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER + * \param transport MBEDTLS_SSL_TRANSPORT_STREAM for TLS, or + * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS + * \param preset a MBEDTLS_SSL_PRESET_XXX value + * + * \note See \c mbedtls_ssl_conf_transport() for notes on DTLS. + * + * \return 0 if successful, or + * MBEDTLS_ERR_XXX_ALLOC_FAILED on memory allocation error. + */ +int mbedtls_ssl_config_defaults(mbedtls_ssl_config *conf, + int endpoint, int transport, int preset); + +/** + * \brief Free an SSL configuration context + * + * \param conf SSL configuration context + */ +void mbedtls_ssl_config_free(mbedtls_ssl_config *conf); + +/** + * \brief Initialize SSL session structure + * + * \param session SSL session + */ +void mbedtls_ssl_session_init(mbedtls_ssl_session *session); + +/** + * \brief Free referenced items in an SSL session including the + * peer certificate and clear memory + * + * \note A session object can be freed even if the SSL context + * that was used to retrieve the session is still in use. + * + * \param session SSL session + */ +void mbedtls_ssl_session_free(mbedtls_ssl_session *session); + +/** + * \brief TLS-PRF function for key derivation. + * + * \param prf The tls_prf type function type to be used. + * \param secret Secret for the key derivation function. + * \param slen Length of the secret. + * \param label String label for the key derivation function, + * terminated with null character. + * \param random Random bytes. + * \param rlen Length of the random bytes buffer. + * \param dstbuf The buffer holding the derived key. + * \param dlen Length of the output buffer. + * + * \return 0 on success. An SSL specific error on failure. + */ +int mbedtls_ssl_tls_prf(const mbedtls_tls_prf_types prf, + const unsigned char *secret, size_t slen, + const char *label, + const unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen); + +#ifdef __cplusplus +} +#endif + +#endif /* ssl.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ssl_cache.h b/ext/opcua_client/mbedtls/include/mbedtls/ssl_cache.h new file mode 100644 index 0000000..cadb30c --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ssl_cache.h @@ -0,0 +1,143 @@ +/** + * \file ssl_cache.h + * + * \brief SSL session cache implementation + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_SSL_CACHE_H +#define MBEDTLS_SSL_CACHE_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/ssl.h" + +#if defined(MBEDTLS_THREADING_C) +#include "mbedtls/threading.h" +#endif + +/** + * \name SECTION: Module settings + * + * The configuration options you can set for this module are in this section. + * Either change them in config.h or define them on the compiler command line. + * \{ + */ + +#if !defined(MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT) +#define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT 86400 /*!< 1 day */ +#endif + +#if !defined(MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES) +#define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /*!< Maximum entries in cache */ +#endif + +/** \} name SECTION: Module settings */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mbedtls_ssl_cache_context mbedtls_ssl_cache_context; +typedef struct mbedtls_ssl_cache_entry mbedtls_ssl_cache_entry; + +/** + * \brief This structure is used for storing cache entries + */ +struct mbedtls_ssl_cache_entry { +#if defined(MBEDTLS_HAVE_TIME) + mbedtls_time_t timestamp; /*!< entry timestamp */ +#endif + mbedtls_ssl_session session; /*!< entry session */ +#if defined(MBEDTLS_X509_CRT_PARSE_C) && \ + defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + mbedtls_x509_buf peer_cert; /*!< entry peer_cert */ +#endif + mbedtls_ssl_cache_entry *next; /*!< chain pointer */ +}; + +/** + * \brief Cache context + */ +struct mbedtls_ssl_cache_context { + mbedtls_ssl_cache_entry *chain; /*!< start of the chain */ + int timeout; /*!< cache entry timeout */ + int max_entries; /*!< maximum entries */ +#if defined(MBEDTLS_THREADING_C) + mbedtls_threading_mutex_t mutex; /*!< mutex */ +#endif +}; + +/** + * \brief Initialize an SSL cache context + * + * \param cache SSL cache context + */ +void mbedtls_ssl_cache_init(mbedtls_ssl_cache_context *cache); + +/** + * \brief Cache get callback implementation + * (Thread-safe if MBEDTLS_THREADING_C is enabled) + * + * \param data SSL cache context + * \param session session to retrieve entry for + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_SSL_CACHE_ENTRY_NOT_FOUND if there is + * no cache entry with specified session ID found, or + * any other negative error code for other failures. + */ +int mbedtls_ssl_cache_get(void *data, mbedtls_ssl_session *session); + +/** + * \brief Cache set callback implementation + * (Thread-safe if MBEDTLS_THREADING_C is enabled) + * + * \param data SSL cache context + * \param session session to store entry for + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +int mbedtls_ssl_cache_set(void *data, const mbedtls_ssl_session *session); + +#if defined(MBEDTLS_HAVE_TIME) +/** + * \brief Set the cache timeout + * (Default: MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT (1 day)) + * + * A timeout of 0 indicates no timeout. + * + * \param cache SSL cache context + * \param timeout cache entry timeout in seconds + */ +void mbedtls_ssl_cache_set_timeout(mbedtls_ssl_cache_context *cache, int timeout); +#endif /* MBEDTLS_HAVE_TIME */ + +/** + * \brief Set the maximum number of cache entries + * (Default: MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES (50)) + * + * \param cache SSL cache context + * \param max cache entry maximum + */ +void mbedtls_ssl_cache_set_max_entries(mbedtls_ssl_cache_context *cache, int max); + +/** + * \brief Free referenced items in a cache context and clear memory + * + * \param cache SSL cache context + */ +void mbedtls_ssl_cache_free(mbedtls_ssl_cache_context *cache); + +#ifdef __cplusplus +} +#endif + +#endif /* ssl_cache.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ssl_ciphersuites.h b/ext/opcua_client/mbedtls/include/mbedtls/ssl_ciphersuites.h new file mode 100644 index 0000000..199014f --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ssl_ciphersuites.h @@ -0,0 +1,536 @@ +/** + * \file ssl_ciphersuites.h + * + * \brief SSL Ciphersuites for Mbed TLS + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_SSL_CIPHERSUITES_H +#define MBEDTLS_SSL_CIPHERSUITES_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/pk.h" +#include "mbedtls/cipher.h" +#include "mbedtls/md.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Supported ciphersuites (Official IANA names) + */ +#define MBEDTLS_TLS_RSA_WITH_NULL_MD5 0x01 /**< Weak! */ +#define MBEDTLS_TLS_RSA_WITH_NULL_SHA 0x02 /**< Weak! */ + +#define MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 0x04 +#define MBEDTLS_TLS_RSA_WITH_RC4_128_SHA 0x05 +#define MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA 0x09 /**< Weak! Not in TLS 1.2 */ + +#define MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA 0x0A + +#define MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA 0x15 /**< Weak! Not in TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA 0x16 + +#define MBEDTLS_TLS_PSK_WITH_NULL_SHA 0x2C /**< Weak! */ +#define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA 0x2D /**< Weak! */ +#define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA 0x2E /**< Weak! */ +#define MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA 0x2F + +#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA 0x33 +#define MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA 0x35 +#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA 0x39 + +#define MBEDTLS_TLS_RSA_WITH_NULL_SHA256 0x3B /**< Weak! */ +#define MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 0x3C /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 0x3D /**< TLS 1.2 */ + +#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA 0x41 +#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x45 + +#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 0x67 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 0x6B /**< TLS 1.2 */ + +#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA 0x84 +#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x88 + +#define MBEDTLS_TLS_PSK_WITH_RC4_128_SHA 0x8A +#define MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA 0x8B +#define MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA 0x8C +#define MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA 0x8D + +#define MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA 0x8E +#define MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA 0x8F +#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA 0x90 +#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA 0x91 + +#define MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA 0x92 +#define MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA 0x93 +#define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA 0x94 +#define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA 0x95 + +#define MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 0x9C /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 0x9D /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 0x9E /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 0x9F /**< TLS 1.2 */ + +#define MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 0xA8 /**< TLS 1.2 */ +#define MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 0xA9 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 0xAA /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 0xAB /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 0xAC /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 0xAD /**< TLS 1.2 */ + +#define MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 0xAE +#define MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 0xAF +#define MBEDTLS_TLS_PSK_WITH_NULL_SHA256 0xB0 /**< Weak! */ +#define MBEDTLS_TLS_PSK_WITH_NULL_SHA384 0xB1 /**< Weak! */ + +#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 0xB2 +#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 0xB3 +#define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 0xB4 /**< Weak! */ +#define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 0xB5 /**< Weak! */ + +#define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 0xB6 +#define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 0xB7 +#define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 0xB8 /**< Weak! */ +#define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 0xB9 /**< Weak! */ + +#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBA /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBE /**< TLS 1.2 */ + +#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC0 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC4 /**< TLS 1.2 */ + +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA 0xC001 /**< Weak! */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA 0xC002 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA 0xC003 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0xC004 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0xC005 /**< Not in SSL3! */ + +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA 0xC006 /**< Weak! */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA 0xC007 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA 0xC008 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0xC009 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0xC00A /**< Not in SSL3! */ + +#define MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA 0xC00B /**< Weak! */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA 0xC00C /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA 0xC00D /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA 0xC00E /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA 0xC00F /**< Not in SSL3! */ + +#define MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA 0xC010 /**< Weak! */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA 0xC011 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA 0xC012 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 0xC013 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 0xC014 /**< Not in SSL3! */ + +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 0xC023 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 0xC024 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 0xC025 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 0xC026 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 0xC027 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 0xC028 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 0xC029 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 0xC02A /**< TLS 1.2 */ + +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0xC02B /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0xC02C /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0xC02D /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0xC02E /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xC02F /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0xC030 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 0xC031 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 0xC032 /**< TLS 1.2 */ + +#define MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA 0xC033 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA 0xC034 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA 0xC035 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA 0xC036 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 0xC037 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 0xC038 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA 0xC039 /**< Weak! No SSL3! */ +#define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 0xC03A /**< Weak! No SSL3! */ +#define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 0xC03B /**< Weak! No SSL3! */ + +#define MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256 0xC03C /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384 0xC03D /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 0xC044 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 0xC045 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 0xC048 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 0xC049 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 0xC04A /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 0xC04B /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 0xC04C /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 0xC04D /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 0xC04E /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 0xC04F /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256 0xC050 /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384 0xC051 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 0xC052 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 0xC053 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 0xC05C /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 0xC05D /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 0xC05E /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 0xC05F /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 0xC060 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 0xC061 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 0xC062 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 0xC063 /**< TLS 1.2 */ +#define MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256 0xC064 /**< TLS 1.2 */ +#define MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384 0xC065 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 0xC066 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 0xC067 /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 0xC068 /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 0xC069 /**< TLS 1.2 */ +#define MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256 0xC06A /**< TLS 1.2 */ +#define MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384 0xC06B /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 0xC06C /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 0xC06D /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 0xC06E /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 0xC06F /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 0xC070 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 0xC071 /**< TLS 1.2 */ + +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0xC072 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0xC073 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0xC074 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0xC075 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xC076 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 0xC077 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xC078 /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 0xC079 /**< Not in SSL3! */ + +#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC07A /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC07B /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC07C /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC07D /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 0xC086 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 0xC087 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 0xC088 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 0xC089 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC08A /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC08B /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC08C /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC08D /**< TLS 1.2 */ + +#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC08E /**< TLS 1.2 */ +#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC08F /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC090 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC091 /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC092 /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC093 /**< TLS 1.2 */ + +#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC094 +#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC095 +#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC096 +#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC097 +#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC098 +#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC099 +#define MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC09A /**< Not in SSL3! */ +#define MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC09B /**< Not in SSL3! */ + +#define MBEDTLS_TLS_RSA_WITH_AES_128_CCM 0xC09C /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_WITH_AES_256_CCM 0xC09D /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM 0xC09E /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM 0xC09F /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8 0xC0A0 /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8 0xC0A1 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8 0xC0A2 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8 0xC0A3 /**< TLS 1.2 */ +#define MBEDTLS_TLS_PSK_WITH_AES_128_CCM 0xC0A4 /**< TLS 1.2 */ +#define MBEDTLS_TLS_PSK_WITH_AES_256_CCM 0xC0A5 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM 0xC0A6 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM 0xC0A7 /**< TLS 1.2 */ +#define MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8 0xC0A8 /**< TLS 1.2 */ +#define MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8 0xC0A9 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8 0xC0AA /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8 0xC0AB /**< TLS 1.2 */ +/* The last two are named with PSK_DHE in the RFC, which looks like a typo */ + +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM 0xC0AC /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM 0xC0AD /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 0xC0AE /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 0xC0AF /**< TLS 1.2 */ + +#define MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8 0xC0FF /**< experimental */ + +/* RFC 7905 */ +#define MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0xCCA8 /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 0xCCA9 /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0xCCAA /**< TLS 1.2 */ +#define MBEDTLS_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAB /**< TLS 1.2 */ +#define MBEDTLS_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAC /**< TLS 1.2 */ +#define MBEDTLS_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAD /**< TLS 1.2 */ +#define MBEDTLS_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAE /**< TLS 1.2 */ + +/* Reminder: update mbedtls_ssl_premaster_secret when adding a new key exchange. + * Reminder: update MBEDTLS_KEY_EXCHANGE__xxx below + */ +typedef enum { + MBEDTLS_KEY_EXCHANGE_NONE = 0, + MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_KEY_EXCHANGE_ECJPAKE, +} mbedtls_key_exchange_type_t; + +/* Key exchanges using a certificate */ +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) +#define MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED +#endif + +/* Key exchanges allowing client certificate requests */ +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) +#define MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED +#endif + +/* Key exchanges involving server signature in ServerKeyExchange */ +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) +#define MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED +#endif + +/* Key exchanges using ECDH */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) +#define MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED +#endif + +/* Key exchanges that don't involve ephemeral keys */ +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED) +#define MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED +#endif + +/* Key exchanges that involve ephemeral keys */ +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +#define MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED +#endif + +/* Key exchanges using a PSK */ +#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) +#define MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED +#endif + +/* Key exchanges using DHE */ +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) +#define MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED +#endif + +/* Key exchanges using ECDHE */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) +#define MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED +#endif + +typedef struct mbedtls_ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t; + +#define MBEDTLS_CIPHERSUITE_WEAK 0x01 /**< Weak ciphersuite flag */ +#define MBEDTLS_CIPHERSUITE_SHORT_TAG 0x02 /**< Short authentication tag, + eg for CCM_8 */ +#define MBEDTLS_CIPHERSUITE_NODTLS 0x04 /**< Can't be used with DTLS */ + +/** + * \brief This structure is used for storing ciphersuite information + */ +struct mbedtls_ssl_ciphersuite_t { + int id; + const char *name; + + mbedtls_cipher_type_t cipher; + mbedtls_md_type_t mac; + mbedtls_key_exchange_type_t key_exchange; + + int min_major_ver; + int min_minor_ver; + int max_major_ver; + int max_minor_ver; + + unsigned char flags; +}; + +const int *mbedtls_ssl_list_ciphersuites(void); + +const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_string(const char *ciphersuite_name); +const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_id(int ciphersuite_id); + +#if defined(MBEDTLS_PK_C) +mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_pk_alg(const mbedtls_ssl_ciphersuite_t *info); +mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_alg(const mbedtls_ssl_ciphersuite_t *info); +#endif + +int mbedtls_ssl_ciphersuite_uses_ec(const mbedtls_ssl_ciphersuite_t *info); +int mbedtls_ssl_ciphersuite_uses_psk(const mbedtls_ssl_ciphersuite_t *info); + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED) +static inline int mbedtls_ssl_ciphersuite_has_pfs(const mbedtls_ssl_ciphersuite_t *info) +{ + switch (info->key_exchange) { + case MBEDTLS_KEY_EXCHANGE_DHE_RSA: + case MBEDTLS_KEY_EXCHANGE_DHE_PSK: + case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: + case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: + case MBEDTLS_KEY_EXCHANGE_ECJPAKE: + return 1; + + default: + return 0; + } +} +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED) +static inline int mbedtls_ssl_ciphersuite_no_pfs(const mbedtls_ssl_ciphersuite_t *info) +{ + switch (info->key_exchange) { + case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: + case MBEDTLS_KEY_EXCHANGE_RSA: + case MBEDTLS_KEY_EXCHANGE_PSK: + case MBEDTLS_KEY_EXCHANGE_RSA_PSK: + return 1; + + default: + return 0; + } +} +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED) +static inline int mbedtls_ssl_ciphersuite_uses_ecdh(const mbedtls_ssl_ciphersuite_t *info) +{ + switch (info->key_exchange) { + case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: + return 1; + + default: + return 0; + } +} +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */ + +static inline int mbedtls_ssl_ciphersuite_cert_req_allowed(const mbedtls_ssl_ciphersuite_t *info) +{ + switch (info->key_exchange) { + case MBEDTLS_KEY_EXCHANGE_RSA: + case MBEDTLS_KEY_EXCHANGE_DHE_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: + return 1; + + default: + return 0; + } +} + +static inline int mbedtls_ssl_ciphersuite_uses_srv_cert(const mbedtls_ssl_ciphersuite_t *info) +{ + switch (info->key_exchange) { + case MBEDTLS_KEY_EXCHANGE_RSA: + case MBEDTLS_KEY_EXCHANGE_RSA_PSK: + case MBEDTLS_KEY_EXCHANGE_DHE_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: + return 1; + + default: + return 0; + } +} + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED) +static inline int mbedtls_ssl_ciphersuite_uses_dhe(const mbedtls_ssl_ciphersuite_t *info) +{ + switch (info->key_exchange) { + case MBEDTLS_KEY_EXCHANGE_DHE_RSA: + case MBEDTLS_KEY_EXCHANGE_DHE_PSK: + return 1; + + default: + return 0; + } +} +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED) */ + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED) +static inline int mbedtls_ssl_ciphersuite_uses_ecdhe(const mbedtls_ssl_ciphersuite_t *info) +{ + switch (info->key_exchange) { + case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: + return 1; + + default: + return 0; + } +} +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED) */ + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) +static inline int mbedtls_ssl_ciphersuite_uses_server_signature( + const mbedtls_ssl_ciphersuite_t *info) +{ + switch (info->key_exchange) { + case MBEDTLS_KEY_EXCHANGE_DHE_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: + return 1; + + default: + return 0; + } +} +#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */ + +#ifdef __cplusplus +} +#endif + +#endif /* ssl_ciphersuites.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ssl_cookie.h b/ext/opcua_client/mbedtls/include/mbedtls/ssl_cookie.h new file mode 100644 index 0000000..85a1b4a --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ssl_cookie.h @@ -0,0 +1,100 @@ +/** + * \file ssl_cookie.h + * + * \brief DTLS cookie callbacks implementation + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_SSL_COOKIE_H +#define MBEDTLS_SSL_COOKIE_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/ssl.h" + +#if defined(MBEDTLS_THREADING_C) +#include "mbedtls/threading.h" +#endif + +/** + * \name SECTION: Module settings + * + * The configuration options you can set for this module are in this section. + * Either change them in config.h or define them on the compiler command line. + * \{ + */ +#ifndef MBEDTLS_SSL_COOKIE_TIMEOUT +#define MBEDTLS_SSL_COOKIE_TIMEOUT 60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number of cookies issued */ +#endif + +/** \} name SECTION: Module settings */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Context for the default cookie functions. + */ +typedef struct mbedtls_ssl_cookie_ctx { + mbedtls_md_context_t hmac_ctx; /*!< context for the HMAC portion */ +#if !defined(MBEDTLS_HAVE_TIME) + unsigned long serial; /*!< serial number for expiration */ +#endif + unsigned long timeout; /*!< timeout delay, in seconds if HAVE_TIME, + or in number of tickets issued */ + +#if defined(MBEDTLS_THREADING_C) + mbedtls_threading_mutex_t mutex; +#endif +} mbedtls_ssl_cookie_ctx; + +/** + * \brief Initialize cookie context + */ +void mbedtls_ssl_cookie_init(mbedtls_ssl_cookie_ctx *ctx); + +/** + * \brief Setup cookie context (generate keys) + */ +int mbedtls_ssl_cookie_setup(mbedtls_ssl_cookie_ctx *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +/** + * \brief Set expiration delay for cookies + * (Default MBEDTLS_SSL_COOKIE_TIMEOUT) + * + * \param ctx Cookie context + * \param delay Delay, in seconds if HAVE_TIME, or in number of cookies + * issued in the meantime. + * 0 to disable expiration (NOT recommended) + */ +void mbedtls_ssl_cookie_set_timeout(mbedtls_ssl_cookie_ctx *ctx, unsigned long delay); + +/** + * \brief Free cookie context + */ +void mbedtls_ssl_cookie_free(mbedtls_ssl_cookie_ctx *ctx); + +/** + * \brief Generate cookie, see \c mbedtls_ssl_cookie_write_t + */ +mbedtls_ssl_cookie_write_t mbedtls_ssl_cookie_write; + +/** + * \brief Verify cookie, see \c mbedtls_ssl_cookie_write_t + */ +mbedtls_ssl_cookie_check_t mbedtls_ssl_cookie_check; + +#ifdef __cplusplus +} +#endif + +#endif /* ssl_cookie.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ssl_internal.h b/ext/opcua_client/mbedtls/include/mbedtls/ssl_internal.h new file mode 100644 index 0000000..17bb631 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ssl_internal.h @@ -0,0 +1,1339 @@ +/** + * \file ssl_internal.h + * + * \brief Internal functions shared by the SSL modules + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_SSL_INTERNAL_H +#define MBEDTLS_SSL_INTERNAL_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/ssl.h" +#include "mbedtls/cipher.h" + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "psa/crypto.h" +#endif + +#if defined(MBEDTLS_MD5_C) +#include "mbedtls/md5.h" +#endif + +#if defined(MBEDTLS_SHA1_C) +#include "mbedtls/sha1.h" +#endif + +#if defined(MBEDTLS_SHA256_C) +#include "mbedtls/sha256.h" +#endif + +#if defined(MBEDTLS_SHA512_C) +#include "mbedtls/sha512.h" +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +#include "mbedtls/ecjpake.h" +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "psa/crypto.h" +#include "mbedtls/psa_util.h" +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#if (defined(__ARMCC_VERSION) || defined(_MSC_VER)) && \ + !defined(inline) && !defined(__cplusplus) +#define inline __inline +#endif + +/* Determine minimum supported version */ +#define MBEDTLS_SSL_MIN_MAJOR_VERSION MBEDTLS_SSL_MAJOR_VERSION_3 + +#if defined(MBEDTLS_SSL_PROTO_SSL3) +#define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_0 +#else +#if defined(MBEDTLS_SSL_PROTO_TLS1) +#define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_1 +#else +#if defined(MBEDTLS_SSL_PROTO_TLS1_1) +#define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_2 +#else +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_3 +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ +#endif /* MBEDTLS_SSL_PROTO_TLS1_1 */ +#endif /* MBEDTLS_SSL_PROTO_TLS1 */ +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ + +#define MBEDTLS_SSL_MIN_VALID_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_1 +#define MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION MBEDTLS_SSL_MAJOR_VERSION_3 + +/* Determine maximum supported version */ +#define MBEDTLS_SSL_MAX_MAJOR_VERSION MBEDTLS_SSL_MAJOR_VERSION_3 + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_3 +#else +#if defined(MBEDTLS_SSL_PROTO_TLS1_1) +#define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_2 +#else +#if defined(MBEDTLS_SSL_PROTO_TLS1) +#define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_1 +#else +#if defined(MBEDTLS_SSL_PROTO_SSL3) +#define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_0 +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ +#endif /* MBEDTLS_SSL_PROTO_TLS1 */ +#endif /* MBEDTLS_SSL_PROTO_TLS1_1 */ +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + +/* Shorthand for restartable ECC */ +#if defined(MBEDTLS_ECP_RESTARTABLE) && \ + defined(MBEDTLS_SSL_CLI_C) && \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) +#define MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED +#endif + +#define MBEDTLS_SSL_INITIAL_HANDSHAKE 0 +#define MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS 1 /* In progress */ +#define MBEDTLS_SSL_RENEGOTIATION_DONE 2 /* Done or aborted */ +#define MBEDTLS_SSL_RENEGOTIATION_PENDING 3 /* Requested (server only) */ + +/* + * DTLS retransmission states, see RFC 6347 4.2.4 + * + * The SENDING state is merged in PREPARING for initial sends, + * but is distinct for resends. + * + * Note: initial state is wrong for server, but is not used anyway. + */ +#define MBEDTLS_SSL_RETRANS_PREPARING 0 +#define MBEDTLS_SSL_RETRANS_SENDING 1 +#define MBEDTLS_SSL_RETRANS_WAITING 2 +#define MBEDTLS_SSL_RETRANS_FINISHED 3 + +/* + * Allow extra bytes for record, authentication and encryption overhead: + * counter (8) + header (5) + IV(16) + MAC (16-48) + padding (0-256) + * and allow for a maximum of 1024 of compression expansion if + * enabled. + */ +#if defined(MBEDTLS_ZLIB_SUPPORT) +#define MBEDTLS_SSL_COMPRESSION_ADD 1024 +#else +#define MBEDTLS_SSL_COMPRESSION_ADD 0 +#endif + +/* This macro determines whether CBC is supported. */ +#if defined(MBEDTLS_CIPHER_MODE_CBC) && \ + (defined(MBEDTLS_AES_C) || \ + defined(MBEDTLS_CAMELLIA_C) || \ + defined(MBEDTLS_ARIA_C) || \ + defined(MBEDTLS_DES_C)) +#define MBEDTLS_SSL_SOME_SUITES_USE_CBC +#endif + +/* This macro determines whether the CBC construct used in TLS 1.0-1.2 (as + * opposed to the very different CBC construct used in SSLv3) is supported. */ +#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC) && \ + (defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_2)) +#define MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC +#endif + +#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) || \ + defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC) +#define MBEDTLS_SSL_SOME_MODES_USE_MAC +#endif + +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) +/* Ciphersuites using HMAC */ +#if defined(MBEDTLS_SHA512_C) +#define MBEDTLS_SSL_MAC_ADD 48 /* SHA-384 used for HMAC */ +#elif defined(MBEDTLS_SHA256_C) +#define MBEDTLS_SSL_MAC_ADD 32 /* SHA-256 used for HMAC */ +#else +#define MBEDTLS_SSL_MAC_ADD 20 /* SHA-1 used for HMAC */ +#endif +#else /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ +/* AEAD ciphersuites: GCM and CCM use a 128 bits tag */ +#define MBEDTLS_SSL_MAC_ADD 16 +#endif + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#define MBEDTLS_SSL_PADDING_ADD 256 +#else +#define MBEDTLS_SSL_PADDING_ADD 0 +#endif + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) +#define MBEDTLS_SSL_MAX_CID_EXPANSION MBEDTLS_SSL_CID_PADDING_GRANULARITY +#else +#define MBEDTLS_SSL_MAX_CID_EXPANSION 0 +#endif + +#define MBEDTLS_SSL_PAYLOAD_OVERHEAD (MBEDTLS_SSL_COMPRESSION_ADD + \ + MBEDTLS_MAX_IV_LENGTH + \ + MBEDTLS_SSL_MAC_ADD + \ + MBEDTLS_SSL_PADDING_ADD + \ + MBEDTLS_SSL_MAX_CID_EXPANSION \ + ) + +#define MBEDTLS_SSL_IN_PAYLOAD_LEN (MBEDTLS_SSL_PAYLOAD_OVERHEAD + \ + (MBEDTLS_SSL_IN_CONTENT_LEN)) + +#define MBEDTLS_SSL_OUT_PAYLOAD_LEN (MBEDTLS_SSL_PAYLOAD_OVERHEAD + \ + (MBEDTLS_SSL_OUT_CONTENT_LEN)) + +/* The maximum number of buffered handshake messages. */ +#define MBEDTLS_SSL_MAX_BUFFERED_HS 4 + +/* Maximum length we can advertise as our max content length for + RFC 6066 max_fragment_length extension negotiation purposes + (the lesser of both sizes, if they are unequal.) + */ +#define MBEDTLS_TLS_EXT_ADV_CONTENT_LEN ( \ + (MBEDTLS_SSL_IN_CONTENT_LEN > MBEDTLS_SSL_OUT_CONTENT_LEN) \ + ? (MBEDTLS_SSL_OUT_CONTENT_LEN) \ + : (MBEDTLS_SSL_IN_CONTENT_LEN) \ + ) + +/* Maximum size in bytes of list in sig-hash algorithm ext., RFC 5246 */ +#define MBEDTLS_SSL_MAX_SIG_HASH_ALG_LIST_LEN 65534 + +/* Maximum size in bytes of list in supported elliptic curve ext., RFC 4492 */ +#define MBEDTLS_SSL_MAX_CURVE_LIST_LEN 65535 + +/* + * Check that we obey the standard's message size bounds + */ + +#if MBEDTLS_SSL_MAX_CONTENT_LEN > 16384 +#error "Bad configuration - record content too large." +#endif + +#if MBEDTLS_SSL_IN_CONTENT_LEN > MBEDTLS_SSL_MAX_CONTENT_LEN +#error \ + "Bad configuration - incoming record content should not be larger than MBEDTLS_SSL_MAX_CONTENT_LEN." +#endif + +#if MBEDTLS_SSL_OUT_CONTENT_LEN > MBEDTLS_SSL_MAX_CONTENT_LEN +#error \ + "Bad configuration - outgoing record content should not be larger than MBEDTLS_SSL_MAX_CONTENT_LEN." +#endif + +#if MBEDTLS_SSL_IN_PAYLOAD_LEN > MBEDTLS_SSL_MAX_CONTENT_LEN + 2048 +#error "Bad configuration - incoming protected record payload too large." +#endif + +#if MBEDTLS_SSL_OUT_PAYLOAD_LEN > MBEDTLS_SSL_MAX_CONTENT_LEN + 2048 +#error "Bad configuration - outgoing protected record payload too large." +#endif + +/* Calculate buffer sizes */ + +/* Note: Even though the TLS record header is only 5 bytes + long, we're internally using 8 bytes to store the + implicit sequence number. */ +#define MBEDTLS_SSL_HEADER_LEN 13 + +#if !defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) +#define MBEDTLS_SSL_IN_BUFFER_LEN \ + ((MBEDTLS_SSL_HEADER_LEN) + (MBEDTLS_SSL_IN_PAYLOAD_LEN)) +#else +#define MBEDTLS_SSL_IN_BUFFER_LEN \ + ((MBEDTLS_SSL_HEADER_LEN) + (MBEDTLS_SSL_IN_PAYLOAD_LEN) \ + + (MBEDTLS_SSL_CID_IN_LEN_MAX)) +#endif + +#if !defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) +#define MBEDTLS_SSL_OUT_BUFFER_LEN \ + ((MBEDTLS_SSL_HEADER_LEN) + (MBEDTLS_SSL_OUT_PAYLOAD_LEN)) +#else +#define MBEDTLS_SSL_OUT_BUFFER_LEN \ + ((MBEDTLS_SSL_HEADER_LEN) + (MBEDTLS_SSL_OUT_PAYLOAD_LEN) \ + + (MBEDTLS_SSL_CID_OUT_LEN_MAX)) +#endif + +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) +static inline size_t mbedtls_ssl_get_output_buflen(const mbedtls_ssl_context *ctx) +{ +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + return mbedtls_ssl_get_output_max_frag_len(ctx) + + MBEDTLS_SSL_HEADER_LEN + MBEDTLS_SSL_PAYLOAD_OVERHEAD + + MBEDTLS_SSL_CID_OUT_LEN_MAX; +#else + return mbedtls_ssl_get_output_max_frag_len(ctx) + + MBEDTLS_SSL_HEADER_LEN + MBEDTLS_SSL_PAYLOAD_OVERHEAD; +#endif +} + +static inline size_t mbedtls_ssl_get_input_buflen(const mbedtls_ssl_context *ctx) +{ +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + return mbedtls_ssl_get_input_max_frag_len(ctx) + + MBEDTLS_SSL_HEADER_LEN + MBEDTLS_SSL_PAYLOAD_OVERHEAD + + MBEDTLS_SSL_CID_IN_LEN_MAX; +#else + return mbedtls_ssl_get_input_max_frag_len(ctx) + + MBEDTLS_SSL_HEADER_LEN + MBEDTLS_SSL_PAYLOAD_OVERHEAD; +#endif +} +#endif + +#ifdef MBEDTLS_ZLIB_SUPPORT +/* Compression buffer holds both IN and OUT buffers, so should be size of the larger */ +#define MBEDTLS_SSL_COMPRESS_BUFFER_LEN ( \ + (MBEDTLS_SSL_IN_BUFFER_LEN > MBEDTLS_SSL_OUT_BUFFER_LEN) \ + ? MBEDTLS_SSL_IN_BUFFER_LEN \ + : MBEDTLS_SSL_OUT_BUFFER_LEN \ + ) +#endif + +/* + * TLS extension flags (for extensions with outgoing ServerHello content + * that need it (e.g. for RENEGOTIATION_INFO the server already knows because + * of state of the renegotiation flag, so no indicator is required) + */ +#define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT (1 << 0) +#define MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK (1 << 1) + +/** + * \brief This function checks if the remaining size in a buffer is + * greater or equal than a needed space. + * + * \param cur Pointer to the current position in the buffer. + * \param end Pointer to one past the end of the buffer. + * \param need Needed space in bytes. + * + * \return Zero if the needed space is available in the buffer, non-zero + * otherwise. + */ +static inline int mbedtls_ssl_chk_buf_ptr(const uint8_t *cur, + const uint8_t *end, size_t need) +{ + return (cur > end) || (need > (size_t) (end - cur)); +} + +/** + * \brief This macro checks if the remaining size in a buffer is + * greater or equal than a needed space. If it is not the case, + * it returns an SSL_BUFFER_TOO_SMALL error. + * + * \param cur Pointer to the current position in the buffer. + * \param end Pointer to one past the end of the buffer. + * \param need Needed space in bytes. + * + */ +#define MBEDTLS_SSL_CHK_BUF_PTR(cur, end, need) \ + do { \ + if (mbedtls_ssl_chk_buf_ptr((cur), (end), (need)) != 0) \ + { \ + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; \ + } \ + } while (0) + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) +/* + * Abstraction for a grid of allowed signature-hash-algorithm pairs. + */ +struct mbedtls_ssl_sig_hash_set_t { + /* At the moment, we only need to remember a single suitable + * hash algorithm per signature algorithm. As long as that's + * the case - and we don't need a general lookup function - + * we can implement the sig-hash-set as a map from signatures + * to hash algorithms. */ + mbedtls_md_type_t rsa; + mbedtls_md_type_t ecdsa; +}; +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && + MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ + +typedef int mbedtls_ssl_tls_prf_cb(const unsigned char *secret, size_t slen, + const char *label, + const unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen); + +/* cipher.h exports the maximum IV, key and block length from + * all ciphers enabled in the config, regardless of whether those + * ciphers are actually usable in SSL/TLS. Notably, XTS is enabled + * in the default configuration and uses 64 Byte keys, but it is + * not used for record protection in SSL/TLS. + * + * In order to prevent unnecessary inflation of key structures, + * we introduce SSL-specific variants of the max-{key,block,IV} + * macros here which are meant to only take those ciphers into + * account which can be negotiated in SSL/TLS. + * + * Since the current definitions of MBEDTLS_MAX_{KEY|BLOCK|IV}_LENGTH + * in cipher.h are rough overapproximations of the real maxima, here + * we content ourselves with replicating those overapproximations + * for the maximum block and IV length, and excluding XTS from the + * computation of the maximum key length. */ +#define MBEDTLS_SSL_MAX_BLOCK_LENGTH 16 +#define MBEDTLS_SSL_MAX_IV_LENGTH 16 +#define MBEDTLS_SSL_MAX_KEY_LENGTH 32 + +/** + * \brief The data structure holding the cryptographic material (key and IV) + * used for record protection in TLS 1.3. + */ +struct mbedtls_ssl_key_set { + /*! The key for client->server records. */ + unsigned char client_write_key[MBEDTLS_SSL_MAX_KEY_LENGTH]; + /*! The key for server->client records. */ + unsigned char server_write_key[MBEDTLS_SSL_MAX_KEY_LENGTH]; + /*! The IV for client->server records. */ + unsigned char client_write_iv[MBEDTLS_SSL_MAX_IV_LENGTH]; + /*! The IV for server->client records. */ + unsigned char server_write_iv[MBEDTLS_SSL_MAX_IV_LENGTH]; + + size_t key_len; /*!< The length of client_write_key and + * server_write_key, in Bytes. */ + size_t iv_len; /*!< The length of client_write_iv and + * server_write_iv, in Bytes. */ +}; +typedef struct mbedtls_ssl_key_set mbedtls_ssl_key_set; + +/* + * This structure contains the parameters only needed during handshake. + */ +struct mbedtls_ssl_handshake_params { + /* + * Handshake specific crypto variables + */ + + uint8_t max_major_ver; /*!< max. major version client*/ + uint8_t max_minor_ver; /*!< max. minor version client*/ + uint8_t resume; /*!< session resume indicator*/ + uint8_t cli_exts; /*!< client extension presence*/ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) && \ + defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) + uint8_t sni_authmode; /*!< authmode from SNI callback */ +#endif + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) + uint8_t new_session_ticket; /*!< use NewSessionTicket? */ +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) + uint8_t extended_ms; /*!< use Extended Master Secret? */ +#endif + +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) + uint8_t async_in_progress; /*!< an asynchronous operation is in progress */ +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + unsigned char retransmit_state; /*!< Retransmission state */ +#endif + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + uint8_t ecrs_enabled; /*!< Handshake supports EC restart? */ + enum { /* this complements ssl->state with info on intra-state operations */ + ssl_ecrs_none = 0, /*!< nothing going on (yet) */ + ssl_ecrs_crt_verify, /*!< Certificate: crt_verify() */ + ssl_ecrs_ske_start_processing, /*!< ServerKeyExchange: pk_verify() */ + ssl_ecrs_cke_ecdh_calc_secret, /*!< ClientKeyExchange: ECDH step 2 */ + ssl_ecrs_crt_vrfy_sign, /*!< CertificateVerify: pk_sign() */ + } ecrs_state; /*!< current (or last) operation */ + mbedtls_x509_crt *ecrs_peer_cert; /*!< The peer's CRT chain. */ + size_t ecrs_n; /*!< place for saving a length */ +#endif + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + mbedtls_ssl_sig_hash_set_t hash_algs; /*!< Set of suitable sig-hash pairs */ +#endif + + size_t pmslen; /*!< premaster length */ + + mbedtls_ssl_ciphersuite_t const *ciphersuite_info; + + void (*update_checksum)(mbedtls_ssl_context *, const unsigned char *, size_t); + void (*calc_verify)(const mbedtls_ssl_context *, unsigned char *, size_t *); + MBEDTLS_CHECK_RETURN_CRITICAL + int (*calc_finished)(mbedtls_ssl_context *, unsigned char *, int); + mbedtls_ssl_tls_prf_cb *tls_prf; + +#if defined(MBEDTLS_DHM_C) + mbedtls_dhm_context dhm_ctx; /*!< DHM key exchange */ +#endif + +/* Adding guard for MBEDTLS_ECDSA_C to ensure no compile errors due + * to guards also being in ssl_srv.c and ssl_cli.c. There is a gap + * in functionality that access to ecdh_ctx structure is needed for + * MBEDTLS_ECDSA_C which does not seem correct. + */ +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) + mbedtls_ecdh_context ecdh_ctx; /*!< ECDH key exchange */ + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_key_type_t ecdh_psa_type; + uint16_t ecdh_bits; + psa_key_id_t ecdh_psa_privkey; + unsigned char ecdh_psa_peerkey[MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH]; + size_t ecdh_psa_peerkey_len; +#endif /* MBEDTLS_USE_PSA_CRYPTO */ +#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + mbedtls_ecjpake_context ecjpake_ctx; /*!< EC J-PAKE key exchange */ +#if defined(MBEDTLS_SSL_CLI_C) + unsigned char *ecjpake_cache; /*!< Cache for ClientHello ext */ + size_t ecjpake_cache_len; /*!< Length of cached data */ +#endif +#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + const mbedtls_ecp_curve_info **curves; /*!< Supported elliptic curves */ +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_key_id_t psk_opaque; /*!< Opaque PSK from the callback */ +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + unsigned char *psk; /*!< PSK from the callback */ + size_t psk_len; /*!< Length of PSK from callback */ +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + mbedtls_ssl_key_cert *key_cert; /*!< chosen key/cert pair (server) */ +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) + mbedtls_ssl_key_cert *sni_key_cert; /*!< key/cert list from SNI */ + mbedtls_x509_crt *sni_ca_chain; /*!< trusted CAs from SNI callback */ + mbedtls_x509_crl *sni_ca_crl; /*!< trusted CAs CRLs from SNI */ +#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + mbedtls_x509_crt_restart_ctx ecrs_ctx; /*!< restart context */ +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) && \ + !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + mbedtls_pk_context peer_pubkey; /*!< The public key from the peer. */ +#endif /* MBEDTLS_X509_CRT_PARSE_C && !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + struct { + size_t total_bytes_buffered; /*!< Cumulative size of heap allocated + * buffers used for message buffering. */ + + uint8_t seen_ccs; /*!< Indicates if a CCS message has + * been seen in the current flight. */ + + struct mbedtls_ssl_hs_buffer { + unsigned is_valid : 1; + unsigned is_fragmented : 1; + unsigned is_complete : 1; + unsigned char *data; + size_t data_len; + } hs[MBEDTLS_SSL_MAX_BUFFERED_HS]; + + struct { + unsigned char *data; + size_t len; + unsigned epoch; + } future_record; + + } buffering; + + unsigned int out_msg_seq; /*!< Outgoing handshake sequence number */ + unsigned int in_msg_seq; /*!< Incoming handshake sequence number */ + + unsigned char *verify_cookie; /*!< Cli: HelloVerifyRequest cookie + Srv: unused */ + unsigned char verify_cookie_len; /*!< Cli: cookie length + Srv: flag for sending a cookie */ + + uint32_t retransmit_timeout; /*!< Current value of timeout */ + mbedtls_ssl_flight_item *flight; /*!< Current outgoing flight */ + mbedtls_ssl_flight_item *cur_msg; /*!< Current message in flight */ + unsigned char *cur_msg_p; /*!< Position in current message */ + unsigned int in_flight_start_seq; /*!< Minimum message sequence in the + flight being received */ + mbedtls_ssl_transform *alt_transform_out; /*!< Alternative transform for + resending messages */ + unsigned char alt_out_ctr[8]; /*!< Alternative record epoch/counter + for resending messages */ + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + /* The state of CID configuration in this handshake. */ + + uint8_t cid_in_use; /*!< This indicates whether the use of the CID extension + * has been negotiated. Possible values are + * #MBEDTLS_SSL_CID_ENABLED and + * #MBEDTLS_SSL_CID_DISABLED. */ + unsigned char peer_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX]; /*! The peer's CID */ + uint8_t peer_cid_len; /*!< The length of + * \c peer_cid. */ +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + + uint16_t mtu; /*!< Handshake mtu, used to fragment outgoing messages */ +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + /* + * Checksum contexts + */ +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) + mbedtls_md5_context fin_md5; + mbedtls_sha1_context fin_sha1; +#endif +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_SHA256_C) +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_hash_operation_t fin_sha256_psa; +#else + mbedtls_sha256_context fin_sha256; +#endif +#endif +#if defined(MBEDTLS_SHA512_C) +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_hash_operation_t fin_sha384_psa; +#else + mbedtls_sha512_context fin_sha512; +#endif +#endif +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + + unsigned char randbytes[64]; /*!< random bytes */ + unsigned char premaster[MBEDTLS_PREMASTER_SIZE]; + /*!< premaster secret */ + +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) + /** Asynchronous operation context. This field is meant for use by the + * asynchronous operation callbacks (mbedtls_ssl_config::f_async_sign_start, + * mbedtls_ssl_config::f_async_decrypt_start, + * mbedtls_ssl_config::f_async_resume, mbedtls_ssl_config::f_async_cancel). + * The library does not use it internally. */ + void *user_async_ctx; +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ +}; + +typedef struct mbedtls_ssl_hs_buffer mbedtls_ssl_hs_buffer; + +/* + * Representation of decryption/encryption transformations on records + * + * There are the following general types of record transformations: + * - Stream transformations (TLS versions <= 1.2 only) + * Transformation adding a MAC and applying a stream-cipher + * to the authenticated message. + * - CBC block cipher transformations ([D]TLS versions <= 1.2 only) + * In addition to the distinction of the order of encryption and + * authentication, there's a fundamental difference between the + * handling in SSL3 & TLS 1.0 and TLS 1.1 and TLS 1.2: For SSL3 + * and TLS 1.0, the final IV after processing a record is used + * as the IV for the next record. No explicit IV is contained + * in an encrypted record. The IV for the first record is extracted + * at key extraction time. In contrast, for TLS 1.1 and 1.2, no + * IV is generated at key extraction time, but every encrypted + * record is explicitly prefixed by the IV with which it was encrypted. + * - AEAD transformations ([D]TLS versions >= 1.2 only) + * These come in two fundamentally different versions, the first one + * used in TLS 1.2, excluding ChaChaPoly ciphersuites, and the second + * one used for ChaChaPoly ciphersuites in TLS 1.2 as well as for TLS 1.3. + * In the first transformation, the IV to be used for a record is obtained + * as the concatenation of an explicit, static 4-byte IV and the 8-byte + * record sequence number, and explicitly prepending this sequence number + * to the encrypted record. In contrast, in the second transformation + * the IV is obtained by XOR'ing a static IV obtained at key extraction + * time with the 8-byte record sequence number, without prepending the + * latter to the encrypted record. + * + * Additionally, DTLS 1.2 + CID as well as TLS 1.3 use an inner plaintext + * which allows to add flexible length padding and to hide a record's true + * content type. + * + * In addition to type and version, the following parameters are relevant: + * - The symmetric cipher algorithm to be used. + * - The (static) encryption/decryption keys for the cipher. + * - For stream/CBC, the type of message digest to be used. + * - For stream/CBC, (static) encryption/decryption keys for the digest. + * - For AEAD transformations, the size (potentially 0) of an explicit, + * random initialization vector placed in encrypted records. + * - For some transformations (currently AEAD and CBC in SSL3 and TLS 1.0) + * an implicit IV. It may be static (e.g. AEAD) or dynamic (e.g. CBC) + * and (if present) is combined with the explicit IV in a transformation- + * dependent way (e.g. appending in TLS 1.2 and XOR'ing in TLS 1.3). + * - For stream/CBC, a flag determining the order of encryption and MAC. + * - The details of the transformation depend on the SSL/TLS version. + * - The length of the authentication tag. + * + * Note: Except for CBC in SSL3 and TLS 1.0, these parameters are + * constant across multiple encryption/decryption operations. + * For CBC, the implicit IV needs to be updated after each + * operation. + * + * The struct below refines this abstract view as follows: + * - The cipher underlying the transformation is managed in + * cipher contexts cipher_ctx_{enc/dec}, which must have the + * same cipher type. The mode of these cipher contexts determines + * the type of the transformation in the sense above: e.g., if + * the type is MBEDTLS_CIPHER_AES_256_CBC resp. MBEDTLS_CIPHER_AES_192_GCM + * then the transformation has type CBC resp. AEAD. + * - The cipher keys are never stored explicitly but + * are maintained within cipher_ctx_{enc/dec}. + * - For stream/CBC transformations, the message digest contexts + * used for the MAC's are stored in md_ctx_{enc/dec}. These contexts + * are unused for AEAD transformations. + * - For stream/CBC transformations and versions > SSL3, the + * MAC keys are not stored explicitly but maintained within + * md_ctx_{enc/dec}. + * - For stream/CBC transformations and version SSL3, the MAC + * keys are stored explicitly in mac_enc, mac_dec and have + * a fixed size of 20 bytes. These fields are unused for + * AEAD transformations or transformations >= TLS 1.0. + * - For transformations using an implicit IV maintained within + * the transformation context, its contents are stored within + * iv_{enc/dec}. + * - The value of ivlen indicates the length of the IV. + * This is redundant in case of stream/CBC transformations + * which always use 0 resp. the cipher's block length as the + * IV length, but is needed for AEAD ciphers and may be + * different from the underlying cipher's block length + * in this case. + * - The field fixed_ivlen is nonzero for AEAD transformations only + * and indicates the length of the static part of the IV which is + * constant throughout the communication, and which is stored in + * the first fixed_ivlen bytes of the iv_{enc/dec} arrays. + * Note: For CBC in SSL3 and TLS 1.0, the fields iv_{enc/dec} + * still store IV's for continued use across multiple transformations, + * so it is not true that fixed_ivlen == 0 means that iv_{enc/dec} are + * not being used! + * - minor_ver denotes the SSL/TLS version + * - For stream/CBC transformations, maclen denotes the length of the + * authentication tag, while taglen is unused and 0. + * - For AEAD transformations, taglen denotes the length of the + * authentication tag, while maclen is unused and 0. + * - For CBC transformations, encrypt_then_mac determines the + * order of encryption and authentication. This field is unused + * in other transformations. + * + */ +struct mbedtls_ssl_transform { + /* + * Session specific crypto layer + */ + size_t minlen; /*!< min. ciphertext length */ + size_t ivlen; /*!< IV length */ + size_t fixed_ivlen; /*!< Fixed part of IV (AEAD) */ + size_t maclen; /*!< MAC(CBC) len */ + size_t taglen; /*!< TAG(AEAD) len */ + + unsigned char iv_enc[16]; /*!< IV (encryption) */ + unsigned char iv_dec[16]; /*!< IV (decryption) */ + +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) + +#if defined(MBEDTLS_SSL_PROTO_SSL3) + /* Needed only for SSL v3.0 secret */ + unsigned char mac_enc[20]; /*!< SSL v3.0 secret (enc) */ + unsigned char mac_dec[20]; /*!< SSL v3.0 secret (dec) */ +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ + + mbedtls_md_context_t md_ctx_enc; /*!< MAC (encryption) */ + mbedtls_md_context_t md_ctx_dec; /*!< MAC (decryption) */ + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + int encrypt_then_mac; /*!< flag for EtM activation */ +#endif + +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ + + mbedtls_cipher_context_t cipher_ctx_enc; /*!< encryption context */ + mbedtls_cipher_context_t cipher_ctx_dec; /*!< decryption context */ + int minor_ver; + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + uint8_t in_cid_len; + uint8_t out_cid_len; + unsigned char in_cid[MBEDTLS_SSL_CID_IN_LEN_MAX]; + unsigned char out_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX]; +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + + /* + * Session specific compression layer + */ +#if defined(MBEDTLS_ZLIB_SUPPORT) + z_stream ctx_deflate; /*!< compression context */ + z_stream ctx_inflate; /*!< decompression context */ +#endif + +#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION) + /* We need the Hello random bytes in order to re-derive keys from the + * Master Secret and other session info, see ssl_populate_transform() */ + unsigned char randbytes[64]; /*!< ServerHello.random+ClientHello.random */ +#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */ +}; + +/* + * Return 1 if the transform uses an AEAD cipher, 0 otherwise. + * Equivalently, return 0 if a separate MAC is used, 1 otherwise. + */ +static inline int mbedtls_ssl_transform_uses_aead( + const mbedtls_ssl_transform *transform) +{ +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) + return transform->maclen == 0 && transform->taglen != 0; +#else + (void) transform; + return 1; +#endif +} + +/* + * Internal representation of record frames + * + * Instances come in two flavors: + * (1) Encrypted + * These always have data_offset = 0 + * (2) Unencrypted + * These have data_offset set to the amount of + * pre-expansion during record protection. Concretely, + * this is the length of the fixed part of the explicit IV + * used for encryption, or 0 if no explicit IV is used + * (e.g. for CBC in TLS 1.0, or stream ciphers). + * + * The reason for the data_offset in the unencrypted case + * is to allow for in-place conversion of an unencrypted to + * an encrypted record. If the offset wasn't included, the + * encrypted content would need to be shifted afterwards to + * make space for the fixed IV. + * + */ +#if MBEDTLS_SSL_CID_OUT_LEN_MAX > MBEDTLS_SSL_CID_IN_LEN_MAX +#define MBEDTLS_SSL_CID_LEN_MAX MBEDTLS_SSL_CID_OUT_LEN_MAX +#else +#define MBEDTLS_SSL_CID_LEN_MAX MBEDTLS_SSL_CID_IN_LEN_MAX +#endif + +typedef struct { + uint8_t ctr[8]; /* In TLS: The implicit record sequence number. + * In DTLS: The 2-byte epoch followed by + * the 6-byte sequence number. + * This is stored as a raw big endian byte array + * as opposed to a uint64_t because we rarely + * need to perform arithmetic on this, but do + * need it as a Byte array for the purpose of + * MAC computations. */ + uint8_t type; /* The record content type. */ + uint8_t ver[2]; /* SSL/TLS version as present on the wire. + * Convert to internal presentation of versions + * using mbedtls_ssl_read_version() and + * mbedtls_ssl_write_version(). + * Keep wire-format for MAC computations. */ + + unsigned char *buf; /* Memory buffer enclosing the record content */ + size_t buf_len; /* Buffer length */ + size_t data_offset; /* Offset of record content */ + size_t data_len; /* Length of record content */ + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + uint8_t cid_len; /* Length of the CID (0 if not present) */ + unsigned char cid[MBEDTLS_SSL_CID_LEN_MAX]; /* The CID */ +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ +} mbedtls_record; + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +/* + * List of certificate + private key pairs + */ +struct mbedtls_ssl_key_cert { + mbedtls_x509_crt *cert; /*!< cert */ + mbedtls_pk_context *key; /*!< private key */ + mbedtls_ssl_key_cert *next; /*!< next key/cert pair */ +}; +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) +/* + * List of handshake messages kept around for resending + */ +struct mbedtls_ssl_flight_item { + unsigned char *p; /*!< message, including handshake headers */ + size_t len; /*!< length of p */ + unsigned char type; /*!< type of the message: handshake or CCS */ + mbedtls_ssl_flight_item *next; /*!< next handshake message(s) */ +}; +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + +/* Find an entry in a signature-hash set matching a given hash algorithm. */ +mbedtls_md_type_t mbedtls_ssl_sig_hash_set_find(mbedtls_ssl_sig_hash_set_t *set, + mbedtls_pk_type_t sig_alg); +/* Add a signature-hash-pair to a signature-hash set */ +void mbedtls_ssl_sig_hash_set_add(mbedtls_ssl_sig_hash_set_t *set, + mbedtls_pk_type_t sig_alg, + mbedtls_md_type_t md_alg); +/* Allow exactly one hash algorithm for each signature. */ +void mbedtls_ssl_sig_hash_set_const_hash(mbedtls_ssl_sig_hash_set_t *set, + mbedtls_md_type_t md_alg); + +/* Setup an empty signature-hash set */ +static inline void mbedtls_ssl_sig_hash_set_init(mbedtls_ssl_sig_hash_set_t *set) +{ + mbedtls_ssl_sig_hash_set_const_hash(set, MBEDTLS_MD_NONE); +} + +#endif /* MBEDTLS_SSL_PROTO_TLS1_2) && + MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ + +/** + * \brief Free referenced items in an SSL transform context and clear + * memory + * + * \param transform SSL transform context + */ +void mbedtls_ssl_transform_free(mbedtls_ssl_transform *transform); + +/** + * \brief Free referenced items in an SSL handshake context and clear + * memory + * + * \param ssl SSL context + */ +void mbedtls_ssl_handshake_free(mbedtls_ssl_context *ssl); + +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_handshake_client_step(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl); +void mbedtls_ssl_handshake_wrapup(mbedtls_ssl_context *ssl); + +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_send_fatal_handshake_failure(mbedtls_ssl_context *ssl); + +void mbedtls_ssl_reset_checksum(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_derive_keys(mbedtls_ssl_context *ssl); + +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_handle_message_type(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_prepare_handshake_record(mbedtls_ssl_context *ssl); +void mbedtls_ssl_update_handshake_status(mbedtls_ssl_context *ssl); + +/** + * \brief Update record layer + * + * This function roughly separates the implementation + * of the logic of (D)TLS from the implementation + * of the secure transport. + * + * \param ssl The SSL context to use. + * \param update_hs_digest This indicates if the handshake digest + * should be automatically updated in case + * a handshake message is found. + * + * \return 0 or non-zero error code. + * + * \note A clarification on what is called 'record layer' here + * is in order, as many sensible definitions are possible: + * + * The record layer takes as input an untrusted underlying + * transport (stream or datagram) and transforms it into + * a serially multiplexed, secure transport, which + * conceptually provides the following: + * + * (1) Three datagram based, content-agnostic transports + * for handshake, alert and CCS messages. + * (2) One stream- or datagram-based transport + * for application data. + * (3) Functionality for changing the underlying transform + * securing the contents. + * + * The interface to this functionality is given as follows: + * + * a Updating + * [Currently implemented by mbedtls_ssl_read_record] + * + * Check if and on which of the four 'ports' data is pending: + * Nothing, a controlling datagram of type (1), or application + * data (2). In any case data is present, internal buffers + * provide access to the data for the user to process it. + * Consumption of type (1) datagrams is done automatically + * on the next update, invalidating that the internal buffers + * for previous datagrams, while consumption of application + * data (2) is user-controlled. + * + * b Reading of application data + * [Currently manual adaption of ssl->in_offt pointer] + * + * As mentioned in the last paragraph, consumption of data + * is different from the automatic consumption of control + * datagrams (1) because application data is treated as a stream. + * + * c Tracking availability of application data + * [Currently manually through decreasing ssl->in_msglen] + * + * For efficiency and to retain datagram semantics for + * application data in case of DTLS, the record layer + * provides functionality for checking how much application + * data is still available in the internal buffer. + * + * d Changing the transformation securing the communication. + * + * Given an opaque implementation of the record layer in the + * above sense, it should be possible to implement the logic + * of (D)TLS on top of it without the need to know anything + * about the record layer's internals. This is done e.g. + * in all the handshake handling functions, and in the + * application data reading function mbedtls_ssl_read. + * + * \note The above tries to give a conceptual picture of the + * record layer, but the current implementation deviates + * from it in some places. For example, our implementation of + * the update functionality through mbedtls_ssl_read_record + * discards datagrams depending on the current state, which + * wouldn't fall under the record layer's responsibility + * following the above definition. + * + */ +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_read_record(mbedtls_ssl_context *ssl, + unsigned update_hs_digest); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_fetch_input(mbedtls_ssl_context *ssl, size_t nb_want); + +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_write_handshake_msg(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_write_record(mbedtls_ssl_context *ssl, uint8_t force_flush); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_flush_output(mbedtls_ssl_context *ssl); + +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_parse_certificate(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_write_certificate(mbedtls_ssl_context *ssl); + +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_parse_change_cipher_spec(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_write_change_cipher_spec(mbedtls_ssl_context *ssl); + +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_parse_finished(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_write_finished(mbedtls_ssl_context *ssl); + +void mbedtls_ssl_optimize_checksum(mbedtls_ssl_context *ssl, + const mbedtls_ssl_ciphersuite_t *ciphersuite_info); + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_psk_derive_premaster(mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex); + +/** + * Get the first defined PSK by order of precedence: + * 1. handshake PSK set by \c mbedtls_ssl_set_hs_psk() in the PSK callback + * 2. static PSK configured by \c mbedtls_ssl_conf_psk() + * Return a code and update the pair (PSK, PSK length) passed to this function + */ +static inline int mbedtls_ssl_get_psk(const mbedtls_ssl_context *ssl, + const unsigned char **psk, size_t *psk_len) +{ + if (ssl->handshake->psk != NULL && ssl->handshake->psk_len > 0) { + *psk = ssl->handshake->psk; + *psk_len = ssl->handshake->psk_len; + } else if (ssl->conf->psk != NULL && ssl->conf->psk_len > 0) { + *psk = ssl->conf->psk; + *psk_len = ssl->conf->psk_len; + } else { + *psk = NULL; + *psk_len = 0; + return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED; + } + + return 0; +} + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +/** + * Get the first defined opaque PSK by order of precedence: + * 1. handshake PSK set by \c mbedtls_ssl_set_hs_psk_opaque() in the PSK + * callback + * 2. static PSK configured by \c mbedtls_ssl_conf_psk_opaque() + * Return an opaque PSK + */ +static inline psa_key_id_t mbedtls_ssl_get_opaque_psk( + const mbedtls_ssl_context *ssl) +{ + if (!mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque)) { + return ssl->handshake->psk_opaque; + } + + if (!mbedtls_svc_key_id_is_null(ssl->conf->psk_opaque)) { + return ssl->conf->psk_opaque; + } + + return MBEDTLS_SVC_KEY_ID_INIT; +} +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ + +#if defined(MBEDTLS_PK_C) +unsigned char mbedtls_ssl_sig_from_pk(mbedtls_pk_context *pk); +unsigned char mbedtls_ssl_sig_from_pk_alg(mbedtls_pk_type_t type); +mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig(unsigned char sig); +#endif + +mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash(unsigned char hash); +unsigned char mbedtls_ssl_hash_from_md_alg(int md); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_set_calc_verify_md(mbedtls_ssl_context *ssl, int md); + +#if defined(MBEDTLS_ECP_C) +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_check_curve(const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_check_curve_tls_id(const mbedtls_ssl_context *ssl, uint16_t tls_id); +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_check_sig_hash(const mbedtls_ssl_context *ssl, + mbedtls_md_type_t md); +#endif + +#if defined(MBEDTLS_SSL_DTLS_SRTP) +static inline mbedtls_ssl_srtp_profile mbedtls_ssl_check_srtp_profile_value + (const uint16_t srtp_profile_value) +{ + switch (srtp_profile_value) { + case MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80: + case MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32: + case MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_80: + case MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_32: + return srtp_profile_value; + default: break; + } + return MBEDTLS_TLS_SRTP_UNSET; +} +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +static inline mbedtls_pk_context *mbedtls_ssl_own_key(mbedtls_ssl_context *ssl) +{ + mbedtls_ssl_key_cert *key_cert; + + if (ssl->handshake != NULL && ssl->handshake->key_cert != NULL) { + key_cert = ssl->handshake->key_cert; + } else { + key_cert = ssl->conf->key_cert; + } + + return key_cert == NULL ? NULL : key_cert->key; +} + +static inline mbedtls_x509_crt *mbedtls_ssl_own_cert(mbedtls_ssl_context *ssl) +{ + mbedtls_ssl_key_cert *key_cert; + + if (ssl->handshake != NULL && ssl->handshake->key_cert != NULL) { + key_cert = ssl->handshake->key_cert; + } else { + key_cert = ssl->conf->key_cert; + } + + return key_cert == NULL ? NULL : key_cert->cert; +} + +/* + * Check usage of a certificate wrt extensions: + * keyUsage, extendedKeyUsage (later), and nSCertType (later). + * + * Warning: cert_endpoint is the endpoint of the cert (ie, of our peer when we + * check a cert we received from them)! + * + * Return 0 if everything is OK, -1 if not. + */ +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_check_cert_usage(const mbedtls_x509_crt *cert, + const mbedtls_ssl_ciphersuite_t *ciphersuite, + int cert_endpoint, + uint32_t *flags); +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +void mbedtls_ssl_write_version(int major, int minor, int transport, + unsigned char ver[2]); +void mbedtls_ssl_read_version(int *major, int *minor, int transport, + const unsigned char ver[2]); + +static inline size_t mbedtls_ssl_in_hdr_len(const mbedtls_ssl_context *ssl) +{ +#if !defined(MBEDTLS_SSL_PROTO_DTLS) + ((void) ssl); +#endif + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + return 13; + } else +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + { + return 5; + } +} + +static inline size_t mbedtls_ssl_out_hdr_len(const mbedtls_ssl_context *ssl) +{ + return (size_t) (ssl->out_iv - ssl->out_hdr); +} + +static inline size_t mbedtls_ssl_hs_hdr_len(const mbedtls_ssl_context *ssl) +{ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + return 12; + } +#else + ((void) ssl); +#endif + return 4; +} + +/** Get the host name from the SSL context. + * + * \param[in] ssl SSL context + * + * \return The \p hostname pointer from the SSL context. + * \c NULL if mbedtls_ssl_set_hostname() has never been called on + * \p ssl or if it was last called with \p NULL. + */ +const char *mbedtls_ssl_get_hostname_pointer(const mbedtls_ssl_context *ssl); + +#if defined(MBEDTLS_SSL_PROTO_DTLS) +void mbedtls_ssl_send_flight_completed(mbedtls_ssl_context *ssl); +void mbedtls_ssl_recv_flight_completed(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_resend(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_flight_transmit(mbedtls_ssl_context *ssl); +#endif + +/* Visible for testing purposes only */ +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_dtls_replay_check(mbedtls_ssl_context const *ssl); +void mbedtls_ssl_dtls_replay_update(mbedtls_ssl_context *ssl); +#endif + +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_session_copy(mbedtls_ssl_session *dst, + const mbedtls_ssl_session *src); + +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_get_key_exchange_md_ssl_tls(mbedtls_ssl_context *ssl, + unsigned char *output, + unsigned char *data, size_t data_len); +#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ + MBEDTLS_SSL_PROTO_TLS1_1 */ + +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) +/* The hash buffer must have at least MBEDTLS_MD_MAX_SIZE bytes of length. */ +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_get_key_exchange_md_tls1_2(mbedtls_ssl_context *ssl, + unsigned char *hash, size_t *hashlen, + unsigned char *data, size_t data_len, + mbedtls_md_type_t md_alg); +#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ + MBEDTLS_SSL_PROTO_TLS1_2 */ + +#ifdef __cplusplus +} +#endif + +void mbedtls_ssl_transform_init(mbedtls_ssl_transform *transform); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_encrypt_buf(mbedtls_ssl_context *ssl, + mbedtls_ssl_transform *transform, + mbedtls_record *rec, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_decrypt_buf(mbedtls_ssl_context const *ssl, + mbedtls_ssl_transform *transform, + mbedtls_record *rec); + +/* Length of the "epoch" field in the record header */ +static inline size_t mbedtls_ssl_ep_len(const mbedtls_ssl_context *ssl) +{ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + return 2; + } +#else + ((void) ssl); +#endif + return 0; +} + +#if defined(MBEDTLS_SSL_PROTO_DTLS) +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_resend_hello_request(mbedtls_ssl_context *ssl); +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +void mbedtls_ssl_set_timer(mbedtls_ssl_context *ssl, uint32_t millisecs); +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_check_timer(mbedtls_ssl_context *ssl); + +void mbedtls_ssl_reset_in_out_pointers(mbedtls_ssl_context *ssl); +void mbedtls_ssl_update_out_pointers(mbedtls_ssl_context *ssl, + mbedtls_ssl_transform *transform); +void mbedtls_ssl_update_in_pointers(mbedtls_ssl_context *ssl); + +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_session_reset_int(mbedtls_ssl_context *ssl, int partial); + +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) +void mbedtls_ssl_dtls_replay_reset(mbedtls_ssl_context *ssl); +#endif + +void mbedtls_ssl_handshake_wrapup_free_hs_transform(mbedtls_ssl_context *ssl); + +#if defined(MBEDTLS_SSL_RENEGOTIATION) +MBEDTLS_CHECK_RETURN_CRITICAL +int mbedtls_ssl_start_renegotiation(mbedtls_ssl_context *ssl); +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) +size_t mbedtls_ssl_get_current_mtu(const mbedtls_ssl_context *ssl); +void mbedtls_ssl_buffering_free(mbedtls_ssl_context *ssl); +void mbedtls_ssl_flight_free(mbedtls_ssl_flight_item *flight); +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +#if defined(MBEDTLS_TEST_HOOKS) +int mbedtls_ssl_check_dtls_clihlo_cookie( + mbedtls_ssl_context *ssl, + const unsigned char *cli_id, size_t cli_id_len, + const unsigned char *in, size_t in_len, + unsigned char *obuf, size_t buf_len, size_t *olen); +#endif + +#endif /* ssl_internal.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/ssl_ticket.h b/ext/opcua_client/mbedtls/include/mbedtls/ssl_ticket.h new file mode 100644 index 0000000..ad15923 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/ssl_ticket.h @@ -0,0 +1,126 @@ +/** + * \file ssl_ticket.h + * + * \brief TLS server ticket callbacks implementation + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_SSL_TICKET_H +#define MBEDTLS_SSL_TICKET_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +/* + * This implementation of the session ticket callbacks includes key + * management, rotating the keys periodically in order to preserve forward + * secrecy, when MBEDTLS_HAVE_TIME is defined. + */ + +#include "mbedtls/ssl.h" +#include "mbedtls/cipher.h" + +#if defined(MBEDTLS_THREADING_C) +#include "mbedtls/threading.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Information for session ticket protection + */ +typedef struct mbedtls_ssl_ticket_key { + unsigned char name[4]; /*!< random key identifier */ + uint32_t generation_time; /*!< key generation timestamp (seconds) */ + mbedtls_cipher_context_t ctx; /*!< context for auth enc/decryption */ +} +mbedtls_ssl_ticket_key; + +/** + * \brief Context for session ticket handling functions + */ +typedef struct mbedtls_ssl_ticket_context { + mbedtls_ssl_ticket_key keys[2]; /*!< ticket protection keys */ + unsigned char active; /*!< index of the currently active key */ + + uint32_t ticket_lifetime; /*!< lifetime of tickets in seconds */ + + /** Callback for getting (pseudo-)random numbers */ + int (*f_rng)(void *, unsigned char *, size_t); + void *p_rng; /*!< context for the RNG function */ + +#if defined(MBEDTLS_THREADING_C) + mbedtls_threading_mutex_t mutex; +#endif +} +mbedtls_ssl_ticket_context; + +/** + * \brief Initialize a ticket context. + * (Just make it ready for mbedtls_ssl_ticket_setup() + * or mbedtls_ssl_ticket_free().) + * + * \param ctx Context to be initialized + */ +void mbedtls_ssl_ticket_init(mbedtls_ssl_ticket_context *ctx); + +/** + * \brief Prepare context to be actually used + * + * \param ctx Context to be set up + * \param f_rng RNG callback function + * \param p_rng RNG callback context + * \param cipher AEAD cipher to use for ticket protection. + * Recommended value: MBEDTLS_CIPHER_AES_256_GCM. + * \param lifetime Tickets lifetime in seconds + * Recommended value: 86400 (one day). + * + * \note It is highly recommended to select a cipher that is at + * least as strong as the strongest ciphersuite + * supported. Usually that means a 256-bit key. + * + * \note The lifetime of the keys is twice the lifetime of tickets. + * It is recommended to pick a reasonable lifetime so as not + * to negate the benefits of forward secrecy. + * + * \return 0 if successful, + * or a specific MBEDTLS_ERR_XXX error code + */ +int mbedtls_ssl_ticket_setup(mbedtls_ssl_ticket_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + mbedtls_cipher_type_t cipher, + uint32_t lifetime); + +/** + * \brief Implementation of the ticket write callback + * + * \note See \c mbedtls_ssl_ticket_write_t for description + */ +mbedtls_ssl_ticket_write_t mbedtls_ssl_ticket_write; + +/** + * \brief Implementation of the ticket parse callback + * + * \note See \c mbedtls_ssl_ticket_parse_t for description + */ +mbedtls_ssl_ticket_parse_t mbedtls_ssl_ticket_parse; + +/** + * \brief Free a context's content and zeroize it. + * + * \param ctx Context to be cleaned up + */ +void mbedtls_ssl_ticket_free(mbedtls_ssl_ticket_context *ctx); + +#ifdef __cplusplus +} +#endif + +#endif /* ssl_ticket.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/threading.h b/ext/opcua_client/mbedtls/include/mbedtls/threading.h new file mode 100644 index 0000000..2a03afe --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/threading.h @@ -0,0 +1,113 @@ +/** + * \file threading.h + * + * \brief Threading abstraction layer + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_THREADING_H +#define MBEDTLS_THREADING_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE is deprecated and should not be + * used. */ +/** The selected feature is not available. */ +#define MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE -0x001A + +/** Bad input parameters to function. */ +#define MBEDTLS_ERR_THREADING_BAD_INPUT_DATA -0x001C +/** Locking / unlocking / free failed with error code. */ +#define MBEDTLS_ERR_THREADING_MUTEX_ERROR -0x001E + +#if defined(MBEDTLS_THREADING_PTHREAD) +#include +typedef struct mbedtls_threading_mutex_t { + pthread_mutex_t mutex; + /* is_valid is 0 after a failed init or a free, and nonzero after a + * successful init. This field is not considered part of the public + * API of Mbed TLS and may change without notice. */ + char is_valid; +} mbedtls_threading_mutex_t; +#endif + +#if defined(MBEDTLS_THREADING_ALT) +/* You should define the mbedtls_threading_mutex_t type in your header */ +#include "threading_alt.h" + +/** + * \brief Set your alternate threading implementation function + * pointers and initialize global mutexes. If used, this + * function must be called once in the main thread before any + * other Mbed TLS function is called, and + * mbedtls_threading_free_alt() must be called once in the main + * thread after all other Mbed TLS functions. + * + * \note mutex_init() and mutex_free() don't return a status code. + * If mutex_init() fails, it should leave its argument (the + * mutex) in a state such that mutex_lock() will fail when + * called with this argument. + * + * \param mutex_init the init function implementation + * \param mutex_free the free function implementation + * \param mutex_lock the lock function implementation + * \param mutex_unlock the unlock function implementation + */ +void mbedtls_threading_set_alt(void (*mutex_init)(mbedtls_threading_mutex_t *), + void (*mutex_free)(mbedtls_threading_mutex_t *), + int (*mutex_lock)(mbedtls_threading_mutex_t *), + int (*mutex_unlock)(mbedtls_threading_mutex_t *)); + +/** + * \brief Free global mutexes. + */ +void mbedtls_threading_free_alt(void); +#endif /* MBEDTLS_THREADING_ALT */ + +#if defined(MBEDTLS_THREADING_C) +/* + * The function pointers for mutex_init, mutex_free, mutex_ and mutex_unlock + * + * All these functions are expected to work or the result will be undefined. + */ +extern void (*mbedtls_mutex_init)(mbedtls_threading_mutex_t *mutex); +extern void (*mbedtls_mutex_free)(mbedtls_threading_mutex_t *mutex); +extern int (*mbedtls_mutex_lock)(mbedtls_threading_mutex_t *mutex); +extern int (*mbedtls_mutex_unlock)(mbedtls_threading_mutex_t *mutex); + +/* + * Global mutexes + */ +#if defined(MBEDTLS_FS_IO) +extern mbedtls_threading_mutex_t mbedtls_threading_readdir_mutex; +#endif + +#if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) +/* This mutex may or may not be used in the default definition of + * mbedtls_platform_gmtime_r(), but in order to determine that, + * we need to check POSIX features, hence modify _POSIX_C_SOURCE. + * With the current approach, this declaration is orphaned, lacking + * an accompanying definition, in case mbedtls_platform_gmtime_r() + * doesn't need it, but that's not a problem. */ +extern mbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex; +#endif /* MBEDTLS_HAVE_TIME_DATE && !MBEDTLS_PLATFORM_GMTIME_R_ALT */ + +#endif /* MBEDTLS_THREADING_C */ + +#ifdef __cplusplus +} +#endif + +#endif /* threading.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/timing.h b/ext/opcua_client/mbedtls/include/mbedtls/timing.h new file mode 100644 index 0000000..bbc8fff --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/timing.h @@ -0,0 +1,137 @@ +/** + * \file timing.h + * + * \brief Portable interface to timeouts and to the CPU cycle counter + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_TIMING_H +#define MBEDTLS_TIMING_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_TIMING_ALT) +// Regular implementation +// + +/** + * \brief timer structure + */ +struct mbedtls_timing_hr_time { + unsigned char opaque[32]; +}; + +/** + * \brief Context for mbedtls_timing_set/get_delay() + */ +typedef struct mbedtls_timing_delay_context { + struct mbedtls_timing_hr_time timer; + uint32_t int_ms; + uint32_t fin_ms; +} mbedtls_timing_delay_context; + +#else /* MBEDTLS_TIMING_ALT */ +#include "timing_alt.h" +#endif /* MBEDTLS_TIMING_ALT */ + +extern volatile int mbedtls_timing_alarmed; + +/** + * \brief Return the CPU cycle counter value + * + * \warning This is only a best effort! Do not rely on this! + * In particular, it is known to be unreliable on virtual + * machines. + * + * \note This value starts at an unspecified origin and + * may wrap around. + */ +unsigned long mbedtls_timing_hardclock(void); + +/** + * \brief Return the elapsed time in milliseconds + * + * \param val points to a timer structure + * \param reset If 0, query the elapsed time. Otherwise (re)start the timer. + * + * \return Elapsed time since the previous reset in ms. When + * restarting, this is always 0. + * + * \note To initialize a timer, call this function with reset=1. + * + * Determining the elapsed time and resetting the timer is not + * atomic on all platforms, so after the sequence + * `{ get_timer(1); ...; time1 = get_timer(1); ...; time2 = + * get_timer(0) }` the value time1+time2 is only approximately + * the delay since the first reset. + */ +unsigned long mbedtls_timing_get_timer(struct mbedtls_timing_hr_time *val, int reset); + +/** + * \brief Setup an alarm clock + * + * \param seconds delay before the "mbedtls_timing_alarmed" flag is set + * (must be >=0) + * + * \warning Only one alarm at a time is supported. In a threaded + * context, this means one for the whole process, not one per + * thread. + */ +void mbedtls_set_alarm(int seconds); + +/** + * \brief Set a pair of delays to watch + * (See \c mbedtls_timing_get_delay().) + * + * \param data Pointer to timing data. + * Must point to a valid \c mbedtls_timing_delay_context struct. + * \param int_ms First (intermediate) delay in milliseconds. + * The effect if int_ms > fin_ms is unspecified. + * \param fin_ms Second (final) delay in milliseconds. + * Pass 0 to cancel the current delay. + * + * \note To set a single delay, either use \c mbedtls_timing_set_timer + * directly or use this function with int_ms == fin_ms. + */ +void mbedtls_timing_set_delay(void *data, uint32_t int_ms, uint32_t fin_ms); + +/** + * \brief Get the status of delays + * (Memory helper: number of delays passed.) + * + * \param data Pointer to timing data + * Must point to a valid \c mbedtls_timing_delay_context struct. + * + * \return -1 if cancelled (fin_ms = 0), + * 0 if none of the delays are passed, + * 1 if only the intermediate delay is passed, + * 2 if the final delay is passed. + */ +int mbedtls_timing_get_delay(void *data); + +#if defined(MBEDTLS_SELF_TEST) +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if a test failed + */ +int mbedtls_timing_self_test(int verbose); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* timing.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/version.h b/ext/opcua_client/mbedtls/include/mbedtls/version.h new file mode 100644 index 0000000..4d30fcf --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/version.h @@ -0,0 +1,98 @@ +/** + * \file version.h + * + * \brief Run-time version information + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * This set of compile-time defines and run-time variables can be used to + * determine the version number of the Mbed TLS library used. + */ +#ifndef MBEDTLS_VERSION_H +#define MBEDTLS_VERSION_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +/** + * The version number x.y.z is split into three parts. + * Major, Minor, Patchlevel + */ +#define MBEDTLS_VERSION_MAJOR 2 +#define MBEDTLS_VERSION_MINOR 28 +#define MBEDTLS_VERSION_PATCH 10 + +/** + * The single version number has the following structure: + * MMNNPP00 + * Major version | Minor version | Patch version + */ +#define MBEDTLS_VERSION_NUMBER 0x021C0A00 +#define MBEDTLS_VERSION_STRING "2.28.10" +#define MBEDTLS_VERSION_STRING_FULL "Mbed TLS 2.28.10" + +#if defined(MBEDTLS_VERSION_C) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Get the version number. + * + * \return The constructed version number in the format + * MMNNPP00 (Major, Minor, Patch). + */ +unsigned int mbedtls_version_get_number(void); + +/** + * Get the version string ("x.y.z"). + * + * \param string The string that will receive the value. + * (Should be at least 9 bytes in size) + */ +void mbedtls_version_get_string(char *string); + +/** + * Get the full version string ("Mbed TLS x.y.z"). + * + * \param string The string that will receive the value. The Mbed TLS version + * string will use 18 bytes AT MOST including a terminating + * null byte. + * (So the buffer should be at least 18 bytes to receive this + * version string). + */ +void mbedtls_version_get_string_full(char *string); + +/** + * \brief Check if support for a feature was compiled into this + * Mbed TLS binary. This allows you to see at runtime if the + * library was for instance compiled with or without + * Multi-threading support. + * + * \note only checks against defines in the sections "System + * support", "Mbed TLS modules" and "Mbed TLS feature + * support" in config.h + * + * \param feature The string for the define to check (e.g. "MBEDTLS_AES_C") + * + * \return 0 if the feature is present, + * -1 if the feature is not present and + * -2 if support for feature checking as a whole was not + * compiled in. + */ +int mbedtls_version_check_feature(const char *feature); + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_VERSION_C */ + +#endif /* version.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/x509.h b/ext/opcua_client/mbedtls/include/mbedtls/x509.h new file mode 100644 index 0000000..bde998c --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/x509.h @@ -0,0 +1,368 @@ +/** + * \file x509.h + * + * \brief X.509 generic defines and structures + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_X509_H +#define MBEDTLS_X509_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/asn1.h" +#include "mbedtls/pk.h" + +#if defined(MBEDTLS_RSA_C) +#include "mbedtls/rsa.h" +#endif + +/** + * \addtogroup x509_module + * \{ + */ + +#if !defined(MBEDTLS_X509_MAX_INTERMEDIATE_CA) +/** + * Maximum number of intermediate CAs in a verification chain. + * That is, maximum length of the chain, excluding the end-entity certificate + * and the trusted root certificate. + * + * Set this to a low value to prevent an adversary from making you waste + * resources verifying an overlong certificate chain. + */ +#define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 +#endif + +/** + * \name X509 Error codes + * \{ + */ +/** Unavailable feature, e.g. RSA hashing/encryption combination. */ +#define MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE -0x2080 +/** Requested OID is unknown. */ +#define MBEDTLS_ERR_X509_UNKNOWN_OID -0x2100 +/** The CRT/CRL/CSR format is invalid, e.g. different type expected. */ +#define MBEDTLS_ERR_X509_INVALID_FORMAT -0x2180 +/** The CRT/CRL/CSR version element is invalid. */ +#define MBEDTLS_ERR_X509_INVALID_VERSION -0x2200 +/** The serial tag or value is invalid. */ +#define MBEDTLS_ERR_X509_INVALID_SERIAL -0x2280 +/** The algorithm tag or value is invalid. */ +#define MBEDTLS_ERR_X509_INVALID_ALG -0x2300 +/** The name tag or value is invalid. */ +#define MBEDTLS_ERR_X509_INVALID_NAME -0x2380 +/** The date tag or value is invalid. */ +#define MBEDTLS_ERR_X509_INVALID_DATE -0x2400 +/** The signature tag or value invalid. */ +#define MBEDTLS_ERR_X509_INVALID_SIGNATURE -0x2480 +/** The extension tag or value is invalid. */ +#define MBEDTLS_ERR_X509_INVALID_EXTENSIONS -0x2500 +/** CRT/CRL/CSR has an unsupported version number. */ +#define MBEDTLS_ERR_X509_UNKNOWN_VERSION -0x2580 +/** Signature algorithm (oid) is unsupported. */ +#define MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG -0x2600 +/** Signature algorithms do not match. (see \c ::mbedtls_x509_crt sig_oid) */ +#define MBEDTLS_ERR_X509_SIG_MISMATCH -0x2680 +/** Certificate verification failed, e.g. CRL, CA or signature check failed. */ +#define MBEDTLS_ERR_X509_CERT_VERIFY_FAILED -0x2700 +/** Format not recognized as DER or PEM. */ +#define MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT -0x2780 +/** Input invalid. */ +#define MBEDTLS_ERR_X509_BAD_INPUT_DATA -0x2800 +/** Allocation of memory failed. */ +#define MBEDTLS_ERR_X509_ALLOC_FAILED -0x2880 +/** Read/write of file failed. */ +#define MBEDTLS_ERR_X509_FILE_IO_ERROR -0x2900 +/** Destination buffer is too small. */ +#define MBEDTLS_ERR_X509_BUFFER_TOO_SMALL -0x2980 +/** A fatal error occurred, eg the chain is too long or the vrfy callback failed. */ +#define MBEDTLS_ERR_X509_FATAL_ERROR -0x3000 +/** \} name X509 Error codes */ + +/** + * \name X509 Verify codes + * \{ + */ +/* Reminder: update x509_crt_verify_strings[] in library/x509_crt.c */ +#define MBEDTLS_X509_BADCERT_EXPIRED 0x01 /**< The certificate validity has expired. */ +#define MBEDTLS_X509_BADCERT_REVOKED 0x02 /**< The certificate has been revoked (is on a CRL). */ +#define MBEDTLS_X509_BADCERT_CN_MISMATCH 0x04 /**< The certificate Common Name (CN) does not match with the expected CN. */ +#define MBEDTLS_X509_BADCERT_NOT_TRUSTED 0x08 /**< The certificate is not correctly signed by the trusted CA. */ +#define MBEDTLS_X509_BADCRL_NOT_TRUSTED 0x10 /**< The CRL is not correctly signed by the trusted CA. */ +#define MBEDTLS_X509_BADCRL_EXPIRED 0x20 /**< The CRL is expired. */ +#define MBEDTLS_X509_BADCERT_MISSING 0x40 /**< Certificate was missing. */ +#define MBEDTLS_X509_BADCERT_SKIP_VERIFY 0x80 /**< Certificate verification was skipped. */ +#define MBEDTLS_X509_BADCERT_OTHER 0x0100 /**< Other reason (can be used by verify callback) */ +#define MBEDTLS_X509_BADCERT_FUTURE 0x0200 /**< The certificate validity starts in the future. */ +#define MBEDTLS_X509_BADCRL_FUTURE 0x0400 /**< The CRL is from the future */ +#define MBEDTLS_X509_BADCERT_KEY_USAGE 0x0800 /**< Usage does not match the keyUsage extension. */ +#define MBEDTLS_X509_BADCERT_EXT_KEY_USAGE 0x1000 /**< Usage does not match the extendedKeyUsage extension. */ +#define MBEDTLS_X509_BADCERT_NS_CERT_TYPE 0x2000 /**< Usage does not match the nsCertType extension. */ +#define MBEDTLS_X509_BADCERT_BAD_MD 0x4000 /**< The certificate is signed with an unacceptable hash. */ +#define MBEDTLS_X509_BADCERT_BAD_PK 0x8000 /**< The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA). */ +#define MBEDTLS_X509_BADCERT_BAD_KEY 0x010000 /**< The certificate is signed with an unacceptable key (eg bad curve, RSA too short). */ +#define MBEDTLS_X509_BADCRL_BAD_MD 0x020000 /**< The CRL is signed with an unacceptable hash. */ +#define MBEDTLS_X509_BADCRL_BAD_PK 0x040000 /**< The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA). */ +#define MBEDTLS_X509_BADCRL_BAD_KEY 0x080000 /**< The CRL is signed with an unacceptable key (eg bad curve, RSA too short). */ + +/** \} name X509 Verify codes */ +/** \} addtogroup x509_module */ + +/* + * X.509 v3 Subject Alternative Name types. + * otherName [0] OtherName, + * rfc822Name [1] IA5String, + * dNSName [2] IA5String, + * x400Address [3] ORAddress, + * directoryName [4] Name, + * ediPartyName [5] EDIPartyName, + * uniformResourceIdentifier [6] IA5String, + * iPAddress [7] OCTET STRING, + * registeredID [8] OBJECT IDENTIFIER + */ +#define MBEDTLS_X509_SAN_OTHER_NAME 0 +#define MBEDTLS_X509_SAN_RFC822_NAME 1 +#define MBEDTLS_X509_SAN_DNS_NAME 2 +#define MBEDTLS_X509_SAN_X400_ADDRESS_NAME 3 +#define MBEDTLS_X509_SAN_DIRECTORY_NAME 4 +#define MBEDTLS_X509_SAN_EDI_PARTY_NAME 5 +#define MBEDTLS_X509_SAN_UNIFORM_RESOURCE_IDENTIFIER 6 +#define MBEDTLS_X509_SAN_IP_ADDRESS 7 +#define MBEDTLS_X509_SAN_REGISTERED_ID 8 + +/* + * X.509 v3 Key Usage Extension flags + * Reminder: update x509_info_key_usage() when adding new flags. + */ +#define MBEDTLS_X509_KU_DIGITAL_SIGNATURE (0x80) /* bit 0 */ +#define MBEDTLS_X509_KU_NON_REPUDIATION (0x40) /* bit 1 */ +#define MBEDTLS_X509_KU_KEY_ENCIPHERMENT (0x20) /* bit 2 */ +#define MBEDTLS_X509_KU_DATA_ENCIPHERMENT (0x10) /* bit 3 */ +#define MBEDTLS_X509_KU_KEY_AGREEMENT (0x08) /* bit 4 */ +#define MBEDTLS_X509_KU_KEY_CERT_SIGN (0x04) /* bit 5 */ +#define MBEDTLS_X509_KU_CRL_SIGN (0x02) /* bit 6 */ +#define MBEDTLS_X509_KU_ENCIPHER_ONLY (0x01) /* bit 7 */ +#define MBEDTLS_X509_KU_DECIPHER_ONLY (0x8000) /* bit 8 */ + +/* + * Netscape certificate types + * (http://www.mozilla.org/projects/security/pki/nss/tech-notes/tn3.html) + */ + +#define MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT (0x80) /* bit 0 */ +#define MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER (0x40) /* bit 1 */ +#define MBEDTLS_X509_NS_CERT_TYPE_EMAIL (0x20) /* bit 2 */ +#define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING (0x10) /* bit 3 */ +#define MBEDTLS_X509_NS_CERT_TYPE_RESERVED (0x08) /* bit 4 */ +#define MBEDTLS_X509_NS_CERT_TYPE_SSL_CA (0x04) /* bit 5 */ +#define MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA (0x02) /* bit 6 */ +#define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA (0x01) /* bit 7 */ + +/* + * X.509 extension types + * + * Comments refer to the status for using certificates. Status can be + * different for writing certificates or reading CRLs or CSRs. + * + * Those are defined in oid.h as oid.c needs them in a data structure. Since + * these were previously defined here, let's have aliases for compatibility. + */ +#define MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_X509_EXT_AUTHORITY_KEY_IDENTIFIER +#define MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_X509_EXT_SUBJECT_KEY_IDENTIFIER +#define MBEDTLS_X509_EXT_KEY_USAGE MBEDTLS_OID_X509_EXT_KEY_USAGE +#define MBEDTLS_X509_EXT_CERTIFICATE_POLICIES MBEDTLS_OID_X509_EXT_CERTIFICATE_POLICIES +#define MBEDTLS_X509_EXT_POLICY_MAPPINGS MBEDTLS_OID_X509_EXT_POLICY_MAPPINGS +#define MBEDTLS_X509_EXT_SUBJECT_ALT_NAME MBEDTLS_OID_X509_EXT_SUBJECT_ALT_NAME /* Supported (DNS) */ +#define MBEDTLS_X509_EXT_ISSUER_ALT_NAME MBEDTLS_OID_X509_EXT_ISSUER_ALT_NAME +#define MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_X509_EXT_SUBJECT_DIRECTORY_ATTRS +#define MBEDTLS_X509_EXT_BASIC_CONSTRAINTS MBEDTLS_OID_X509_EXT_BASIC_CONSTRAINTS /* Supported */ +#define MBEDTLS_X509_EXT_NAME_CONSTRAINTS MBEDTLS_OID_X509_EXT_NAME_CONSTRAINTS +#define MBEDTLS_X509_EXT_POLICY_CONSTRAINTS MBEDTLS_OID_X509_EXT_POLICY_CONSTRAINTS +#define MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE MBEDTLS_OID_X509_EXT_EXTENDED_KEY_USAGE +#define MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_X509_EXT_CRL_DISTRIBUTION_POINTS +#define MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY MBEDTLS_OID_X509_EXT_INIHIBIT_ANYPOLICY +#define MBEDTLS_X509_EXT_FRESHEST_CRL MBEDTLS_OID_X509_EXT_FRESHEST_CRL +#define MBEDTLS_X509_EXT_NS_CERT_TYPE MBEDTLS_OID_X509_EXT_NS_CERT_TYPE + +/* + * Storage format identifiers + * Recognized formats: PEM and DER + */ +#define MBEDTLS_X509_FORMAT_DER 1 +#define MBEDTLS_X509_FORMAT_PEM 2 + +#define MBEDTLS_X509_MAX_DN_NAME_SIZE 256 /**< Maximum value size of a DN entry */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \addtogroup x509_module + * \{ */ + +/** + * \name Structures for parsing X.509 certificates, CRLs and CSRs + * \{ + */ + +/** + * Type-length-value structure that allows for ASN1 using DER. + */ +typedef mbedtls_asn1_buf mbedtls_x509_buf; + +/** + * Container for ASN1 bit strings. + */ +typedef mbedtls_asn1_bitstring mbedtls_x509_bitstring; + +/** + * Container for ASN1 named information objects. + * It allows for Relative Distinguished Names (e.g. cn=localhost,ou=code,etc.). + */ +typedef mbedtls_asn1_named_data mbedtls_x509_name; + +/** + * Container for a sequence of ASN.1 items + */ +typedef mbedtls_asn1_sequence mbedtls_x509_sequence; + +/** Container for date and time (precision in seconds). */ +typedef struct mbedtls_x509_time { + int year, mon, day; /**< Date. */ + int hour, min, sec; /**< Time. */ +} +mbedtls_x509_time; + +/** \} name Structures for parsing X.509 certificates, CRLs and CSRs */ + +/** + * \brief Store the certificate DN in printable form into buf; + * no more than size characters will be written. + * + * \param buf Buffer to write to + * \param size Maximum size of buffer + * \param dn The X509 name to represent + * + * \return The length of the string written (not including the + * terminated nul byte), or a negative error code. + */ +int mbedtls_x509_dn_gets(char *buf, size_t size, const mbedtls_x509_name *dn); + +/** + * \brief Store the certificate serial in printable form into buf; + * no more than size characters will be written. + * + * \param buf Buffer to write to + * \param size Maximum size of buffer + * \param serial The X509 serial to represent + * + * \return The length of the string written (not including the + * terminated nul byte), or a negative error code. + */ +int mbedtls_x509_serial_gets(char *buf, size_t size, const mbedtls_x509_buf *serial); + +/** + * \brief Check a given mbedtls_x509_time against the system time + * and tell if it's in the past. + * + * \note Intended usage is "if( is_past( valid_to ) ) ERROR". + * Hence the return value of 1 if on internal errors. + * + * \param to mbedtls_x509_time to check + * + * \return 1 if the given time is in the past or an error occurred, + * 0 otherwise. + */ +int mbedtls_x509_time_is_past(const mbedtls_x509_time *to); + +/** + * \brief Check a given mbedtls_x509_time against the system time + * and tell if it's in the future. + * + * \note Intended usage is "if( is_future( valid_from ) ) ERROR". + * Hence the return value of 1 if on internal errors. + * + * \param from mbedtls_x509_time to check + * + * \return 1 if the given time is in the future or an error occurred, + * 0 otherwise. + */ +int mbedtls_x509_time_is_future(const mbedtls_x509_time *from); + +/** \} addtogroup x509_module */ + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int mbedtls_x509_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +/* + * Internal module functions. You probably do not want to use these unless you + * know you do. + */ +int mbedtls_x509_get_name(unsigned char **p, const unsigned char *end, + mbedtls_x509_name *cur); +int mbedtls_x509_get_alg_null(unsigned char **p, const unsigned char *end, + mbedtls_x509_buf *alg); +int mbedtls_x509_get_alg(unsigned char **p, const unsigned char *end, + mbedtls_x509_buf *alg, mbedtls_x509_buf *params); +#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) +int mbedtls_x509_get_rsassa_pss_params(const mbedtls_x509_buf *params, + mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md, + int *salt_len); +#endif +int mbedtls_x509_get_sig(unsigned char **p, const unsigned char *end, mbedtls_x509_buf *sig); +int mbedtls_x509_get_sig_alg(const mbedtls_x509_buf *sig_oid, const mbedtls_x509_buf *sig_params, + mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg, + void **sig_opts); +int mbedtls_x509_get_time(unsigned char **p, const unsigned char *end, + mbedtls_x509_time *t); +int mbedtls_x509_get_serial(unsigned char **p, const unsigned char *end, + mbedtls_x509_buf *serial); +int mbedtls_x509_get_ext(unsigned char **p, const unsigned char *end, + mbedtls_x509_buf *ext, int tag); +int mbedtls_x509_sig_alg_gets(char *buf, size_t size, const mbedtls_x509_buf *sig_oid, + mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, + const void *sig_opts); +int mbedtls_x509_key_size_helper(char *buf, size_t buf_size, const char *name); +int mbedtls_x509_string_to_names(mbedtls_asn1_named_data **head, const char *name); +int mbedtls_x509_set_extension(mbedtls_asn1_named_data **head, const char *oid, size_t oid_len, + int critical, const unsigned char *val, + size_t val_len); +int mbedtls_x509_write_extensions(unsigned char **p, unsigned char *start, + mbedtls_asn1_named_data *first); +int mbedtls_x509_write_names(unsigned char **p, unsigned char *start, + mbedtls_asn1_named_data *first); +int mbedtls_x509_write_sig(unsigned char **p, unsigned char *start, + const char *oid, size_t oid_len, + unsigned char *sig, size_t size, + mbedtls_pk_type_t pk_alg); + +#define MBEDTLS_X509_SAFE_SNPRINTF \ + do { \ + if (ret < 0 || (size_t) ret >= n) \ + return MBEDTLS_ERR_X509_BUFFER_TOO_SMALL; \ + \ + n -= (size_t) ret; \ + p += (size_t) ret; \ + } while (0) + +#ifdef __cplusplus +} +#endif + +#endif /* x509.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/x509_crl.h b/ext/opcua_client/mbedtls/include/mbedtls/x509_crl.h new file mode 100644 index 0000000..9f755f8 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/x509_crl.h @@ -0,0 +1,170 @@ +/** + * \file x509_crl.h + * + * \brief X.509 certificate revocation list parsing + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_X509_CRL_H +#define MBEDTLS_X509_CRL_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/x509.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \addtogroup x509_module + * \{ */ + +/** + * \name Structures and functions for parsing CRLs + * \{ + */ + +/** + * Certificate revocation list entry. + * Contains the CA-specific serial numbers and revocation dates. + */ +typedef struct mbedtls_x509_crl_entry { + mbedtls_x509_buf raw; + + mbedtls_x509_buf serial; + + mbedtls_x509_time revocation_date; + + mbedtls_x509_buf entry_ext; + + struct mbedtls_x509_crl_entry *next; +} +mbedtls_x509_crl_entry; + +/** + * Certificate revocation list structure. + * Every CRL may have multiple entries. + */ +typedef struct mbedtls_x509_crl { + mbedtls_x509_buf raw; /**< The raw certificate data (DER). */ + mbedtls_x509_buf tbs; /**< The raw certificate body (DER). The part that is To Be Signed. */ + + int version; /**< CRL version (1=v1, 2=v2) */ + mbedtls_x509_buf sig_oid; /**< CRL signature type identifier */ + + mbedtls_x509_buf issuer_raw; /**< The raw issuer data (DER). */ + + mbedtls_x509_name issuer; /**< The parsed issuer data (named information object). */ + + mbedtls_x509_time this_update; + mbedtls_x509_time next_update; + + mbedtls_x509_crl_entry entry; /**< The CRL entries containing the certificate revocation times for this CA. */ + + mbedtls_x509_buf crl_ext; + + mbedtls_x509_buf sig_oid2; + mbedtls_x509_buf sig; + mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ + mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ + void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ + + struct mbedtls_x509_crl *next; +} +mbedtls_x509_crl; + +/** + * \brief Parse a DER-encoded CRL and append it to the chained list + * + * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto + * subsystem must have been initialized by calling + * psa_crypto_init() before calling this function. + * + * \param chain points to the start of the chain + * \param buf buffer holding the CRL data in DER format + * \param buflen size of the buffer + * (including the terminating null byte for PEM data) + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int mbedtls_x509_crl_parse_der(mbedtls_x509_crl *chain, + const unsigned char *buf, size_t buflen); +/** + * \brief Parse one or more CRLs and append them to the chained list + * + * \note Multiple CRLs are accepted only if using PEM format + * + * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto + * subsystem must have been initialized by calling + * psa_crypto_init() before calling this function. + * + * \param chain points to the start of the chain + * \param buf buffer holding the CRL data in PEM or DER format + * \param buflen size of the buffer + * (including the terminating null byte for PEM data) + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int mbedtls_x509_crl_parse(mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen); + +#if defined(MBEDTLS_FS_IO) +/** + * \brief Load one or more CRLs and append them to the chained list + * + * \note Multiple CRLs are accepted only if using PEM format + * + * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto + * subsystem must have been initialized by calling + * psa_crypto_init() before calling this function. + * + * \param chain points to the start of the chain + * \param path filename to read the CRLs from (in PEM or DER encoding) + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int mbedtls_x509_crl_parse_file(mbedtls_x509_crl *chain, const char *path); +#endif /* MBEDTLS_FS_IO */ + +/** + * \brief Returns an informational string about the CRL. + * + * \param buf Buffer to write to + * \param size Maximum size of buffer + * \param prefix A line prefix + * \param crl The X509 CRL to represent + * + * \return The length of the string written (not including the + * terminated nul byte), or a negative error code. + */ +int mbedtls_x509_crl_info(char *buf, size_t size, const char *prefix, + const mbedtls_x509_crl *crl); + +/** + * \brief Initialize a CRL (chain) + * + * \param crl CRL chain to initialize + */ +void mbedtls_x509_crl_init(mbedtls_x509_crl *crl); + +/** + * \brief Unallocate all CRL data + * + * \param crl CRL chain to free + */ +void mbedtls_x509_crl_free(mbedtls_x509_crl *crl); + +/** \} name Structures and functions for parsing CRLs */ +/** \} addtogroup x509_module */ + +#ifdef __cplusplus +} +#endif + +#endif /* mbedtls_x509_crl.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/x509_crt.h b/ext/opcua_client/mbedtls/include/mbedtls/x509_crt.h new file mode 100644 index 0000000..e6d6a2c --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/x509_crt.h @@ -0,0 +1,1096 @@ +/** + * \file x509_crt.h + * + * \brief X.509 certificate parsing and writing + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_X509_CRT_H +#define MBEDTLS_X509_CRT_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/x509.h" +#include "mbedtls/x509_crl.h" +#include "mbedtls/bignum.h" + +/** + * \addtogroup x509_module + * \{ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name Structures and functions for parsing and writing X.509 certificates + * \{ + */ + +/** + * Container for an X.509 certificate. The certificate may be chained. + */ +typedef struct mbedtls_x509_crt { + int own_buffer; /**< Indicates if \c raw is owned + * by the structure or not. */ + mbedtls_x509_buf raw; /**< The raw certificate data (DER). */ + mbedtls_x509_buf tbs; /**< The raw certificate body (DER). The part that is To Be Signed. */ + + int version; /**< The X.509 version. (1=v1, 2=v2, 3=v3) */ + mbedtls_x509_buf serial; /**< Unique id for certificate issued by a specific CA. */ + mbedtls_x509_buf sig_oid; /**< Signature algorithm, e.g. sha1RSA */ + + mbedtls_x509_buf issuer_raw; /**< The raw issuer data (DER). Used for quick comparison. */ + mbedtls_x509_buf subject_raw; /**< The raw subject data (DER). Used for quick comparison. */ + + mbedtls_x509_name issuer; /**< The parsed issuer data (named information object). */ + mbedtls_x509_name subject; /**< The parsed subject data (named information object). */ + + mbedtls_x509_time valid_from; /**< Start time of certificate validity. */ + mbedtls_x509_time valid_to; /**< End time of certificate validity. */ + + mbedtls_x509_buf pk_raw; + mbedtls_pk_context pk; /**< Container for the public key context. */ + + mbedtls_x509_buf issuer_id; /**< Optional X.509 v2/v3 issuer unique identifier. */ + mbedtls_x509_buf subject_id; /**< Optional X.509 v2/v3 subject unique identifier. */ + mbedtls_x509_buf v3_ext; /**< Optional X.509 v3 extensions. */ + mbedtls_x509_sequence subject_alt_names; /**< Optional list of raw entries of Subject Alternative Names extension (currently only dNSName and OtherName are listed). */ + + mbedtls_x509_sequence certificate_policies; /**< Optional list of certificate policies (Only anyPolicy is printed and enforced, however the rest of the policies are still listed). */ + + int ext_types; /**< Bit string containing detected and parsed extensions */ + int ca_istrue; /**< Optional Basic Constraint extension value: 1 if this certificate belongs to a CA, 0 otherwise. */ + int max_pathlen; /**< Optional Basic Constraint extension value: The maximum path length to the root certificate. Path length is 1 higher than RFC 5280 'meaning', so 1+ */ + + unsigned int key_usage; /**< Optional key usage extension value: See the values in x509.h */ + + mbedtls_x509_sequence ext_key_usage; /**< Optional list of extended key usage OIDs. */ + + unsigned char ns_cert_type; /**< Optional Netscape certificate type extension value: See the values in x509.h */ + + mbedtls_x509_buf sig; /**< Signature: hash of the tbs part signed with the private key. */ + mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ + mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ + void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ + + struct mbedtls_x509_crt *next; /**< Next certificate in the CA-chain. */ +} +mbedtls_x509_crt; + +/** + * From RFC 5280 section 4.2.1.6: + * OtherName ::= SEQUENCE { + * type-id OBJECT IDENTIFIER, + * value [0] EXPLICIT ANY DEFINED BY type-id } + */ +typedef struct mbedtls_x509_san_other_name { + /** + * The type_id is an OID as defined in RFC 5280. + * To check the value of the type id, you should use + * \p MBEDTLS_OID_CMP with a known OID mbedtls_x509_buf. + */ + mbedtls_x509_buf type_id; /**< The type id. */ + union { + /** + * From RFC 4108 section 5: + * HardwareModuleName ::= SEQUENCE { + * hwType OBJECT IDENTIFIER, + * hwSerialNum OCTET STRING } + */ + struct { + mbedtls_x509_buf oid; /**< The object identifier. */ + mbedtls_x509_buf val; /**< The named value. */ + } + hardware_module_name; + } + value; +} +mbedtls_x509_san_other_name; + +/** + * A structure for holding the parsed Subject Alternative Name, according to type + */ +typedef struct mbedtls_x509_subject_alternative_name { + int type; /**< The SAN type, value of MBEDTLS_X509_SAN_XXX. */ + union { + mbedtls_x509_san_other_name other_name; /**< The otherName supported type. */ + mbedtls_x509_buf unstructured_name; /**< The buffer for the un constructed types. Only dnsName currently supported */ + } + san; /**< A union of the supported SAN types */ +} +mbedtls_x509_subject_alternative_name; + +/** + * Build flag from an algorithm/curve identifier (pk, md, ecp) + * Since 0 is always XXX_NONE, ignore it. + */ +#define MBEDTLS_X509_ID_FLAG(id) (1 << ((id) - 1)) + +/** + * Security profile for certificate verification. + * + * All lists are bitfields, built by ORing flags from MBEDTLS_X509_ID_FLAG(). + */ +typedef struct mbedtls_x509_crt_profile { + uint32_t allowed_mds; /**< MDs for signatures */ + uint32_t allowed_pks; /**< PK algs for public keys; + * this applies to all certificates + * in the provided chain. */ + uint32_t allowed_curves; /**< Elliptic curves for ECDSA */ + uint32_t rsa_min_bitlen; /**< Minimum size for RSA keys */ +} +mbedtls_x509_crt_profile; + +#define MBEDTLS_X509_CRT_VERSION_1 0 +#define MBEDTLS_X509_CRT_VERSION_2 1 +#define MBEDTLS_X509_CRT_VERSION_3 2 + +#define MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN 32 +#define MBEDTLS_X509_RFC5280_UTC_TIME_LEN 15 + +#if !defined(MBEDTLS_X509_MAX_FILE_PATH_LEN) +#define MBEDTLS_X509_MAX_FILE_PATH_LEN 512 +#endif + +/** + * Container for writing a certificate (CRT) + */ +typedef struct mbedtls_x509write_cert { + int version; + mbedtls_mpi serial; + mbedtls_pk_context *subject_key; + mbedtls_pk_context *issuer_key; + mbedtls_asn1_named_data *subject; + mbedtls_asn1_named_data *issuer; + mbedtls_md_type_t md_alg; + char not_before[MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1]; + char not_after[MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1]; + mbedtls_asn1_named_data *extensions; +} +mbedtls_x509write_cert; + +/** + * Item in a verification chain: cert and flags for it + */ +typedef struct { + mbedtls_x509_crt *crt; + uint32_t flags; +} mbedtls_x509_crt_verify_chain_item; + +/** + * Max size of verification chain: end-entity + intermediates + trusted root + */ +#define MBEDTLS_X509_MAX_VERIFY_CHAIN_SIZE (MBEDTLS_X509_MAX_INTERMEDIATE_CA + 2) + +/** + * Verification chain as built by \c mbedtls_crt_verify_chain() + */ +typedef struct { + mbedtls_x509_crt_verify_chain_item items[MBEDTLS_X509_MAX_VERIFY_CHAIN_SIZE]; + unsigned len; + +#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) + /* This stores the list of potential trusted signers obtained from + * the CA callback used for the CRT verification, if configured. + * We must track it somewhere because the callback passes its + * ownership to the caller. */ + mbedtls_x509_crt *trust_ca_cb_result; +#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ +} mbedtls_x509_crt_verify_chain; + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + +/** + * \brief Context for resuming X.509 verify operations + */ +typedef struct { + /* for check_signature() */ + mbedtls_pk_restart_ctx pk; + + /* for find_parent_in() */ + mbedtls_x509_crt *parent; /* non-null iff parent_in in progress */ + mbedtls_x509_crt *fallback_parent; + int fallback_signature_is_good; + + /* for find_parent() */ + int parent_is_trusted; /* -1 if find_parent is not in progress */ + + /* for verify_chain() */ + enum { + x509_crt_rs_none, + x509_crt_rs_find_parent, + } in_progress; /* none if no operation is in progress */ + int self_cnt; + mbedtls_x509_crt_verify_chain ver_chain; + +} mbedtls_x509_crt_restart_ctx; + +#else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + +/* Now we can declare functions that take a pointer to that */ +typedef void mbedtls_x509_crt_restart_ctx; + +#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +/** + * Default security profile. Should provide a good balance between security + * and compatibility with current deployments. + * + * This profile permits: + * - SHA2 hashes. + * - All supported elliptic curves. + * - RSA with 2048 bits and above. + * + * New minor versions of Mbed TLS may extend this profile, for example if + * new curves are added to the library. New minor versions of Mbed TLS will + * not reduce this profile unless serious security concerns require it. + */ +extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_default; + +/** + * Expected next default profile. Recommended for new deployments. + * Currently targets a 128-bit security level, except for allowing RSA-2048. + */ +extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_next; + +/** + * NSA Suite B profile. + */ +extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_suiteb; + +/** + * \brief Parse a single DER formatted certificate and add it + * to the end of the provided chained list. + * + * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto + * subsystem must have been initialized by calling + * psa_crypto_init() before calling this function. + * + * \param chain The pointer to the start of the CRT chain to attach to. + * When parsing the first CRT in a chain, this should point + * to an instance of ::mbedtls_x509_crt initialized through + * mbedtls_x509_crt_init(). + * \param buf The buffer holding the DER encoded certificate. + * \param buflen The size in Bytes of \p buf. + * + * \note This function makes an internal copy of the CRT buffer + * \p buf. In particular, \p buf may be destroyed or reused + * after this call returns. To avoid duplicating the CRT + * buffer (at the cost of stricter lifetime constraints), + * use mbedtls_x509_crt_parse_der_nocopy() instead. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_x509_crt_parse_der(mbedtls_x509_crt *chain, + const unsigned char *buf, + size_t buflen); + +/** + * \brief The type of certificate extension callbacks. + * + * Callbacks of this type are passed to and used by the + * mbedtls_x509_crt_parse_der_with_ext_cb() routine when + * it encounters either an unsupported extension or a + * "certificate policies" extension containing any + * unsupported certificate policies. + * Future versions of the library may invoke the callback + * in other cases, if and when the need arises. + * + * \param p_ctx An opaque context passed to the callback. + * \param crt The certificate being parsed. + * \param oid The OID of the extension. + * \param critical Whether the extension is critical. + * \param p Pointer to the start of the extension value + * (the content of the OCTET STRING). + * \param end End of extension value. + * + * \note The callback must fail and return a negative error code + * if it can not parse or does not support the extension. + * When the callback fails to parse a critical extension + * mbedtls_x509_crt_parse_der_with_ext_cb() also fails. + * When the callback fails to parse a non critical extension + * mbedtls_x509_crt_parse_der_with_ext_cb() simply skips + * the extension and continues parsing. + * + * \return \c 0 on success. + * \return A negative error code on failure. + */ +typedef int (*mbedtls_x509_crt_ext_cb_t)(void *p_ctx, + mbedtls_x509_crt const *crt, + mbedtls_x509_buf const *oid, + int critical, + const unsigned char *p, + const unsigned char *end); + +/** + * \brief Parse a single DER formatted certificate and add it + * to the end of the provided chained list. + * + * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto + * subsystem must have been initialized by calling + * psa_crypto_init() before calling this function. + * + * \param chain The pointer to the start of the CRT chain to attach to. + * When parsing the first CRT in a chain, this should point + * to an instance of ::mbedtls_x509_crt initialized through + * mbedtls_x509_crt_init(). + * \param buf The buffer holding the DER encoded certificate. + * \param buflen The size in Bytes of \p buf. + * \param make_copy When not zero this function makes an internal copy of the + * CRT buffer \p buf. In particular, \p buf may be destroyed + * or reused after this call returns. + * When zero this function avoids duplicating the CRT buffer + * by taking temporary ownership thereof until the CRT + * is destroyed (like mbedtls_x509_crt_parse_der_nocopy()) + * \param cb A callback invoked for every unsupported certificate + * extension. + * \param p_ctx An opaque context passed to the callback. + * + * \note This call is functionally equivalent to + * mbedtls_x509_crt_parse_der(), and/or + * mbedtls_x509_crt_parse_der_nocopy() + * but it calls the callback with every unsupported + * certificate extension and additionally the + * "certificate policies" extension if it contains any + * unsupported certificate policies. + * The callback must return a negative error code if it + * does not know how to handle such an extension. + * When the callback fails to parse a critical extension + * mbedtls_x509_crt_parse_der_with_ext_cb() also fails. + * When the callback fails to parse a non critical extension + * mbedtls_x509_crt_parse_der_with_ext_cb() simply skips + * the extension and continues parsing. + * Future versions of the library may invoke the callback + * in other cases, if and when the need arises. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_x509_crt_parse_der_with_ext_cb(mbedtls_x509_crt *chain, + const unsigned char *buf, + size_t buflen, + int make_copy, + mbedtls_x509_crt_ext_cb_t cb, + void *p_ctx); + +/** + * \brief Parse a single DER formatted certificate and add it + * to the end of the provided chained list. This is a + * variant of mbedtls_x509_crt_parse_der() which takes + * temporary ownership of the CRT buffer until the CRT + * is destroyed. + * + * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto + * subsystem must have been initialized by calling + * psa_crypto_init() before calling this function. + * + * \param chain The pointer to the start of the CRT chain to attach to. + * When parsing the first CRT in a chain, this should point + * to an instance of ::mbedtls_x509_crt initialized through + * mbedtls_x509_crt_init(). + * \param buf The address of the readable buffer holding the DER encoded + * certificate to use. On success, this buffer must be + * retained and not be changed for the liftetime of the + * CRT chain \p chain, that is, until \p chain is destroyed + * through a call to mbedtls_x509_crt_free(). + * \param buflen The size in Bytes of \p buf. + * + * \note This call is functionally equivalent to + * mbedtls_x509_crt_parse_der(), but it avoids creating a + * copy of the input buffer at the cost of stronger lifetime + * constraints. This is useful in constrained environments + * where duplication of the CRT cannot be tolerated. + * + * \return \c 0 if successful. + * \return A negative error code on failure. + */ +int mbedtls_x509_crt_parse_der_nocopy(mbedtls_x509_crt *chain, + const unsigned char *buf, + size_t buflen); + +/** + * \brief Parse one DER-encoded or one or more concatenated PEM-encoded + * certificates and add them to the chained list. + * + * For CRTs in PEM encoding, the function parses permissively: + * if at least one certificate can be parsed, the function + * returns the number of certificates for which parsing failed + * (hence \c 0 if all certificates were parsed successfully). + * If no certificate could be parsed, the function returns + * the first (negative) error encountered during parsing. + * + * PEM encoded certificates may be interleaved by other data + * such as human readable descriptions of their content, as + * long as the certificates are enclosed in the PEM specific + * '-----{BEGIN/END} CERTIFICATE-----' delimiters. + * + * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto + * subsystem must have been initialized by calling + * psa_crypto_init() before calling this function. + * + * \param chain The chain to which to add the parsed certificates. + * \param buf The buffer holding the certificate data in PEM or DER format. + * For certificates in PEM encoding, this may be a concatenation + * of multiple certificates; for DER encoding, the buffer must + * comprise exactly one certificate. + * \param buflen The size of \p buf, including the terminating \c NULL byte + * in case of PEM encoded data. + * + * \return \c 0 if all certificates were parsed successfully. + * \return The (positive) number of certificates that couldn't + * be parsed if parsing was partly successful (see above). + * \return A negative X509 or PEM error code otherwise. + * + */ +int mbedtls_x509_crt_parse(mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen); + +#if defined(MBEDTLS_FS_IO) +/** + * \brief Load one or more certificates and add them + * to the chained list. Parses permissively. If some + * certificates can be parsed, the result is the number + * of failed certificates it encountered. If none complete + * correctly, the first error is returned. + * + * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto + * subsystem must have been initialized by calling + * psa_crypto_init() before calling this function. + * + * \param chain points to the start of the chain + * \param path filename to read the certificates from + * + * \return 0 if all certificates parsed successfully, a positive number + * if partly successful or a specific X509 or PEM error code + */ +int mbedtls_x509_crt_parse_file(mbedtls_x509_crt *chain, const char *path); + +/** + * \brief Load one or more certificate files from a path and add them + * to the chained list. Parses permissively. If some + * certificates can be parsed, the result is the number + * of failed certificates it encountered. If none complete + * correctly, the first error is returned. + * + * \param chain points to the start of the chain + * \param path directory / folder to read the certificate files from + * + * \return 0 if all certificates parsed successfully, a positive number + * if partly successful or a specific X509 or PEM error code + */ +int mbedtls_x509_crt_parse_path(mbedtls_x509_crt *chain, const char *path); + +#endif /* MBEDTLS_FS_IO */ +/** + * \brief This function parses an item in the SubjectAlternativeNames + * extension. + * + * \param san_buf The buffer holding the raw data item of the subject + * alternative name. + * \param san The target structure to populate with the parsed presentation + * of the subject alternative name encoded in \p san_buf. + * + * \note Only "dnsName" and "otherName" of type hardware_module_name + * as defined in RFC 4180 is supported. + * + * \note This function should be called on a single raw data of + * subject alternative name. For example, after successful + * certificate parsing, one must iterate on every item in the + * \c crt->subject_alt_names sequence, and pass it to + * this function. + * + * \warning The target structure contains pointers to the raw data of the + * parsed certificate, and its lifetime is restricted by the + * lifetime of the certificate. + * + * \return \c 0 on success + * \return #MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE for an unsupported + * SAN type. + * \return Another negative value for any other failure. + */ +int mbedtls_x509_parse_subject_alt_name(const mbedtls_x509_buf *san_buf, + mbedtls_x509_subject_alternative_name *san); +/** + * \brief Returns an informational string about the + * certificate. + * + * \param buf Buffer to write to + * \param size Maximum size of buffer + * \param prefix A line prefix + * \param crt The X509 certificate to represent + * + * \return The length of the string written (not including the + * terminated nul byte), or a negative error code. + */ +int mbedtls_x509_crt_info(char *buf, size_t size, const char *prefix, + const mbedtls_x509_crt *crt); + +/** + * \brief Returns an informational string about the + * verification status of a certificate. + * + * \param buf Buffer to write to + * \param size Maximum size of buffer + * \param prefix A line prefix + * \param flags Verification flags created by mbedtls_x509_crt_verify() + * + * \return The length of the string written (not including the + * terminated nul byte), or a negative error code. + */ +int mbedtls_x509_crt_verify_info(char *buf, size_t size, const char *prefix, + uint32_t flags); + +/** + * \brief Verify a chain of certificates. + * + * The verify callback is a user-supplied callback that + * can clear / modify / add flags for a certificate. If set, + * the verification callback is called for each + * certificate in the chain (from the trust-ca down to the + * presented crt). The parameters for the callback are: + * (void *parameter, mbedtls_x509_crt *crt, int certificate_depth, + * int *flags). With the flags representing current flags for + * that specific certificate and the certificate depth from + * the bottom (Peer cert depth = 0). + * + * All flags left after returning from the callback + * are also returned to the application. The function should + * return 0 for anything (including invalid certificates) + * other than fatal error, as a non-zero return code + * immediately aborts the verification process. For fatal + * errors, a specific error code should be used (different + * from MBEDTLS_ERR_X509_CERT_VERIFY_FAILED which should not + * be returned at this point), or MBEDTLS_ERR_X509_FATAL_ERROR + * can be used if no better code is available. + * + * \note In case verification failed, the results can be displayed + * using \c mbedtls_x509_crt_verify_info() + * + * \note Same as \c mbedtls_x509_crt_verify_with_profile() with the + * default security profile. + * + * \note It is your responsibility to provide up-to-date CRLs for + * all trusted CAs. If no CRL is provided for the CA that was + * used to sign the certificate, CRL verification is skipped + * silently, that is *without* setting any flag. + * + * \note The \c trust_ca list can contain two types of certificates: + * (1) those of trusted root CAs, so that certificates + * chaining up to those CAs will be trusted, and (2) + * self-signed end-entity certificates to be trusted (for + * specific peers you know) - in that case, the self-signed + * certificate doesn't need to have the CA bit set. + * + * \param crt The certificate chain to be verified. + * \param trust_ca The list of trusted CAs. + * \param ca_crl The list of CRLs for trusted CAs. + * \param cn The expected Common Name. This will be checked to be + * present in the certificate's subjectAltNames extension or, + * if this extension is absent, as a CN component in its + * Subject name. Currently only DNS names are supported. This + * may be \c NULL if the CN need not be verified. + * \param flags The address at which to store the result of the verification. + * If the verification couldn't be completed, the flag value is + * set to (uint32_t) -1. + * \param f_vrfy The verification callback to use. See the documentation + * of mbedtls_x509_crt_verify() for more information. + * \param p_vrfy The context to be passed to \p f_vrfy. + * + * \return \c 0 if the chain is valid with respect to the + * passed CN, CAs, CRLs and security profile. + * \return #MBEDTLS_ERR_X509_CERT_VERIFY_FAILED in case the + * certificate chain verification failed. In this case, + * \c *flags will have one or more + * \c MBEDTLS_X509_BADCERT_XXX or \c MBEDTLS_X509_BADCRL_XXX + * flags set. + * \return Another negative error code in case of a fatal error + * encountered during the verification process. + */ +int mbedtls_x509_crt_verify(mbedtls_x509_crt *crt, + mbedtls_x509_crt *trust_ca, + mbedtls_x509_crl *ca_crl, + const char *cn, uint32_t *flags, + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), + void *p_vrfy); + +/** + * \brief Verify a chain of certificates with respect to + * a configurable security profile. + * + * \note Same as \c mbedtls_x509_crt_verify(), but with explicit + * security profile. + * + * \note The restrictions on keys (RSA minimum size, allowed curves + * for ECDSA) apply to all certificates: trusted root, + * intermediate CAs if any, and end entity certificate. + * + * \param crt The certificate chain to be verified. + * \param trust_ca The list of trusted CAs. + * \param ca_crl The list of CRLs for trusted CAs. + * \param profile The security profile to use for the verification. + * \param cn The expected Common Name. This may be \c NULL if the + * CN need not be verified. + * \param flags The address at which to store the result of the verification. + * If the verification couldn't be completed, the flag value is + * set to (uint32_t) -1. + * \param f_vrfy The verification callback to use. See the documentation + * of mbedtls_x509_crt_verify() for more information. + * \param p_vrfy The context to be passed to \p f_vrfy. + * + * \return \c 0 if the chain is valid with respect to the + * passed CN, CAs, CRLs and security profile. + * \return #MBEDTLS_ERR_X509_CERT_VERIFY_FAILED in case the + * certificate chain verification failed. In this case, + * \c *flags will have one or more + * \c MBEDTLS_X509_BADCERT_XXX or \c MBEDTLS_X509_BADCRL_XXX + * flags set. + * \return Another negative error code in case of a fatal error + * encountered during the verification process. + */ +int mbedtls_x509_crt_verify_with_profile(mbedtls_x509_crt *crt, + mbedtls_x509_crt *trust_ca, + mbedtls_x509_crl *ca_crl, + const mbedtls_x509_crt_profile *profile, + const char *cn, uint32_t *flags, + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), + void *p_vrfy); + +/** + * \brief Restartable version of \c mbedtls_crt_verify_with_profile() + * + * \note Performs the same job as \c mbedtls_crt_verify_with_profile() + * but can return early and restart according to the limit + * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. + * + * \param crt The certificate chain to be verified. + * \param trust_ca The list of trusted CAs. + * \param ca_crl The list of CRLs for trusted CAs. + * \param profile The security profile to use for the verification. + * \param cn The expected Common Name. This may be \c NULL if the + * CN need not be verified. + * \param flags The address at which to store the result of the verification. + * If the verification couldn't be completed, the flag value is + * set to (uint32_t) -1. + * \param f_vrfy The verification callback to use. See the documentation + * of mbedtls_x509_crt_verify() for more information. + * \param p_vrfy The context to be passed to \p f_vrfy. + * \param rs_ctx The restart context to use. This may be set to \c NULL + * to disable restartable ECC. + * + * \return See \c mbedtls_crt_verify_with_profile(), or + * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of + * operations was reached: see \c mbedtls_ecp_set_max_ops(). + */ +int mbedtls_x509_crt_verify_restartable(mbedtls_x509_crt *crt, + mbedtls_x509_crt *trust_ca, + mbedtls_x509_crl *ca_crl, + const mbedtls_x509_crt_profile *profile, + const char *cn, uint32_t *flags, + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), + void *p_vrfy, + mbedtls_x509_crt_restart_ctx *rs_ctx); + +/** + * \brief The type of trusted certificate callbacks. + * + * Callbacks of this type are passed to and used by the CRT + * verification routine mbedtls_x509_crt_verify_with_ca_cb() + * when looking for trusted signers of a given certificate. + * + * On success, the callback returns a list of trusted + * certificates to be considered as potential signers + * for the input certificate. + * + * \param p_ctx An opaque context passed to the callback. + * \param child The certificate for which to search a potential signer. + * This will point to a readable certificate. + * \param candidate_cas The address at which to store the address of the first + * entry in the generated linked list of candidate signers. + * This will not be \c NULL. + * + * \note The callback must only return a non-zero value on a + * fatal error. If, in contrast, the search for a potential + * signer completes without a single candidate, the + * callback must return \c 0 and set \c *candidate_cas + * to \c NULL. + * + * \return \c 0 on success. In this case, \c *candidate_cas points + * to a heap-allocated linked list of instances of + * ::mbedtls_x509_crt, and ownership of this list is passed + * to the caller. + * \return A negative error code on failure. + */ +typedef int (*mbedtls_x509_crt_ca_cb_t)(void *p_ctx, + mbedtls_x509_crt const *child, + mbedtls_x509_crt **candidate_cas); + +#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) +/** + * \brief Version of \c mbedtls_x509_crt_verify_with_profile() which + * uses a callback to acquire the list of trusted CA + * certificates. + * + * \param crt The certificate chain to be verified. + * \param f_ca_cb The callback to be used to query for potential signers + * of a given child certificate. See the documentation of + * ::mbedtls_x509_crt_ca_cb_t for more information. + * \param p_ca_cb The opaque context to be passed to \p f_ca_cb. + * \param profile The security profile for the verification. + * \param cn The expected Common Name. This may be \c NULL if the + * CN need not be verified. + * \param flags The address at which to store the result of the verification. + * If the verification couldn't be completed, the flag value is + * set to (uint32_t) -1. + * \param f_vrfy The verification callback to use. See the documentation + * of mbedtls_x509_crt_verify() for more information. + * \param p_vrfy The context to be passed to \p f_vrfy. + * + * \return See \c mbedtls_crt_verify_with_profile(). + */ +int mbedtls_x509_crt_verify_with_ca_cb(mbedtls_x509_crt *crt, + mbedtls_x509_crt_ca_cb_t f_ca_cb, + void *p_ca_cb, + const mbedtls_x509_crt_profile *profile, + const char *cn, uint32_t *flags, + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), + void *p_vrfy); + +#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ + +#if defined(MBEDTLS_X509_CHECK_KEY_USAGE) +/** + * \brief Check usage of certificate against keyUsage extension. + * + * \param crt Leaf certificate used. + * \param usage Intended usage(s) (eg MBEDTLS_X509_KU_KEY_ENCIPHERMENT + * before using the certificate to perform an RSA key + * exchange). + * + * \note Except for decipherOnly and encipherOnly, a bit set in the + * usage argument means this bit MUST be set in the + * certificate. For decipherOnly and encipherOnly, it means + * that bit MAY be set. + * + * \return 0 is these uses of the certificate are allowed, + * MBEDTLS_ERR_X509_BAD_INPUT_DATA if the keyUsage extension + * is present but does not match the usage argument. + * + * \note You should only call this function on leaf certificates, on + * (intermediate) CAs the keyUsage extension is automatically + * checked by \c mbedtls_x509_crt_verify(). + */ +int mbedtls_x509_crt_check_key_usage(const mbedtls_x509_crt *crt, + unsigned int usage); +#endif /* MBEDTLS_X509_CHECK_KEY_USAGE) */ + +#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) +/** + * \brief Check usage of certificate against extendedKeyUsage. + * + * \param crt Leaf certificate used. + * \param usage_oid Intended usage (eg MBEDTLS_OID_SERVER_AUTH or + * MBEDTLS_OID_CLIENT_AUTH). + * \param usage_len Length of usage_oid (eg given by MBEDTLS_OID_SIZE()). + * + * \return 0 if this use of the certificate is allowed, + * MBEDTLS_ERR_X509_BAD_INPUT_DATA if not. + * + * \note Usually only makes sense on leaf certificates. + */ +int mbedtls_x509_crt_check_extended_key_usage(const mbedtls_x509_crt *crt, + const char *usage_oid, + size_t usage_len); +#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */ + +#if defined(MBEDTLS_X509_CRL_PARSE_C) +/** + * \brief Verify the certificate revocation status + * + * \param crt a certificate to be verified + * \param crl the CRL to verify against + * + * \return 1 if the certificate is revoked, 0 otherwise + * + */ +int mbedtls_x509_crt_is_revoked(const mbedtls_x509_crt *crt, const mbedtls_x509_crl *crl); +#endif /* MBEDTLS_X509_CRL_PARSE_C */ + +/** + * \brief Initialize a certificate (chain) + * + * \param crt Certificate chain to initialize + */ +void mbedtls_x509_crt_init(mbedtls_x509_crt *crt); + +/** + * \brief Unallocate all certificate data + * + * \param crt Certificate chain to free + */ +void mbedtls_x509_crt_free(mbedtls_x509_crt *crt); + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) +/** + * \brief Initialize a restart context + */ +void mbedtls_x509_crt_restart_init(mbedtls_x509_crt_restart_ctx *ctx); + +/** + * \brief Free the components of a restart context + */ +void mbedtls_x509_crt_restart_free(mbedtls_x509_crt_restart_ctx *ctx); +#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +/** \} name Structures and functions for parsing and writing X.509 certificates */ + +#if defined(MBEDTLS_X509_CRT_WRITE_C) +/** + * \brief Initialize a CRT writing context + * + * \param ctx CRT context to initialize + */ +void mbedtls_x509write_crt_init(mbedtls_x509write_cert *ctx); + +/** + * \brief Set the version for a Certificate + * Default: MBEDTLS_X509_CRT_VERSION_3 + * + * \param ctx CRT context to use + * \param version version to set (MBEDTLS_X509_CRT_VERSION_1, MBEDTLS_X509_CRT_VERSION_2 or + * MBEDTLS_X509_CRT_VERSION_3) + */ +void mbedtls_x509write_crt_set_version(mbedtls_x509write_cert *ctx, int version); + +/** + * \brief Set the serial number for a Certificate. + * + * \param ctx CRT context to use + * \param serial serial number to set + * + * \return 0 if successful + */ +int mbedtls_x509write_crt_set_serial(mbedtls_x509write_cert *ctx, const mbedtls_mpi *serial); + +/** + * \brief Set the validity period for a Certificate + * Timestamps should be in string format for UTC timezone + * i.e. "YYYYMMDDhhmmss" + * e.g. "20131231235959" for December 31st 2013 + * at 23:59:59 + * + * \param ctx CRT context to use + * \param not_before not_before timestamp + * \param not_after not_after timestamp + * + * \return 0 if timestamp was parsed successfully, or + * a specific error code + */ +int mbedtls_x509write_crt_set_validity(mbedtls_x509write_cert *ctx, const char *not_before, + const char *not_after); + +/** + * \brief Set the issuer name for a Certificate + * Issuer names should contain a comma-separated list + * of OID types and values: + * e.g. "C=UK,O=ARM,CN=Mbed TLS CA" + * + * \param ctx CRT context to use + * \param issuer_name issuer name to set + * + * \return 0 if issuer name was parsed successfully, or + * a specific error code + */ +int mbedtls_x509write_crt_set_issuer_name(mbedtls_x509write_cert *ctx, + const char *issuer_name); + +/** + * \brief Set the subject name for a Certificate + * Subject names should contain a comma-separated list + * of OID types and values: + * e.g. "C=UK,O=ARM,CN=Mbed TLS Server 1" + * + * \param ctx CRT context to use + * \param subject_name subject name to set + * + * \return 0 if subject name was parsed successfully, or + * a specific error code + */ +int mbedtls_x509write_crt_set_subject_name(mbedtls_x509write_cert *ctx, + const char *subject_name); + +/** + * \brief Set the subject public key for the certificate + * + * \param ctx CRT context to use + * \param key public key to include + */ +void mbedtls_x509write_crt_set_subject_key(mbedtls_x509write_cert *ctx, mbedtls_pk_context *key); + +/** + * \brief Set the issuer key used for signing the certificate + * + * \param ctx CRT context to use + * \param key private key to sign with + */ +void mbedtls_x509write_crt_set_issuer_key(mbedtls_x509write_cert *ctx, mbedtls_pk_context *key); + +/** + * \brief Set the MD algorithm to use for the signature + * (e.g. MBEDTLS_MD_SHA1) + * + * \param ctx CRT context to use + * \param md_alg MD algorithm to use + */ +void mbedtls_x509write_crt_set_md_alg(mbedtls_x509write_cert *ctx, mbedtls_md_type_t md_alg); + +/** + * \brief Generic function to add to or replace an extension in the + * CRT + * + * \param ctx CRT context to use + * \param oid OID of the extension + * \param oid_len length of the OID + * \param critical if the extension is critical (per the RFC's definition) + * \param val value of the extension OCTET STRING + * \param val_len length of the value data + * + * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED + */ +int mbedtls_x509write_crt_set_extension(mbedtls_x509write_cert *ctx, + const char *oid, size_t oid_len, + int critical, + const unsigned char *val, size_t val_len); + +/** + * \brief Set the basicConstraints extension for a CRT + * + * \param ctx CRT context to use + * \param is_ca is this a CA certificate + * \param max_pathlen maximum length of certificate chains below this + * certificate (only for CA certificates, -1 is + * unlimited) + * + * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED + */ +int mbedtls_x509write_crt_set_basic_constraints(mbedtls_x509write_cert *ctx, + int is_ca, int max_pathlen); + +#if defined(MBEDTLS_SHA1_C) +/** + * \brief Set the subjectKeyIdentifier extension for a CRT + * Requires that mbedtls_x509write_crt_set_subject_key() has been + * called before + * + * \param ctx CRT context to use + * + * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED + */ +int mbedtls_x509write_crt_set_subject_key_identifier(mbedtls_x509write_cert *ctx); + +/** + * \brief Set the authorityKeyIdentifier extension for a CRT + * Requires that mbedtls_x509write_crt_set_issuer_key() has been + * called before + * + * \param ctx CRT context to use + * + * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED + */ +int mbedtls_x509write_crt_set_authority_key_identifier(mbedtls_x509write_cert *ctx); +#endif /* MBEDTLS_SHA1_C */ + +/** + * \brief Set the Key Usage Extension flags + * (e.g. MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN) + * + * \param ctx CRT context to use + * \param key_usage key usage flags to set + * + * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED + */ +int mbedtls_x509write_crt_set_key_usage(mbedtls_x509write_cert *ctx, + unsigned int key_usage); + +/** + * \brief Set the Netscape Cert Type flags + * (e.g. MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL) + * + * \param ctx CRT context to use + * \param ns_cert_type Netscape Cert Type flags to set + * + * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED + */ +int mbedtls_x509write_crt_set_ns_cert_type(mbedtls_x509write_cert *ctx, + unsigned char ns_cert_type); + +/** + * \brief Free the contents of a CRT write context + * + * \param ctx CRT context to free + */ +void mbedtls_x509write_crt_free(mbedtls_x509write_cert *ctx); + +/** + * \brief Write a built up certificate to a X509 DER structure + * Note: data is written at the end of the buffer! Use the + * return value to determine where you should start + * using the buffer + * + * \param ctx certificate to write away + * \param buf buffer to write to + * \param size size of the buffer + * \param f_rng RNG function (for signature, see note) + * \param p_rng RNG parameter + * + * \return length of data written if successful, or a specific + * error code + * + * \note f_rng may be NULL if RSA is used for signature and the + * signature is made offline (otherwise f_rng is desirable + * for countermeasures against timing attacks). + * ECDSA signatures always require a non-NULL f_rng. + */ +int mbedtls_x509write_crt_der(mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +#if defined(MBEDTLS_PEM_WRITE_C) +/** + * \brief Write a built up certificate to a X509 PEM string + * + * \param ctx certificate to write away + * \param buf buffer to write to + * \param size size of the buffer + * \param f_rng RNG function (for signature, see note) + * \param p_rng RNG parameter + * + * \return 0 if successful, or a specific error code + * + * \note f_rng may be NULL if RSA is used for signature and the + * signature is made offline (otherwise f_rng is desirable + * for countermeasures against timing attacks). + * ECDSA signatures always require a non-NULL f_rng. + */ +int mbedtls_x509write_crt_pem(mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); +#endif /* MBEDTLS_PEM_WRITE_C */ +#endif /* MBEDTLS_X509_CRT_WRITE_C */ + +/** \} addtogroup x509_module */ + +#ifdef __cplusplus +} +#endif + +#endif /* mbedtls_x509_crt.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/x509_csr.h b/ext/opcua_client/mbedtls/include/mbedtls/x509_csr.h new file mode 100644 index 0000000..97a9db4 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/x509_csr.h @@ -0,0 +1,300 @@ +/** + * \file x509_csr.h + * + * \brief X.509 certificate signing request parsing and writing + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_X509_CSR_H +#define MBEDTLS_X509_CSR_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/x509.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \addtogroup x509_module + * \{ */ + +/** + * \name Structures and functions for X.509 Certificate Signing Requests (CSR) + * \{ + */ + +/** + * Certificate Signing Request (CSR) structure. + */ +typedef struct mbedtls_x509_csr { + mbedtls_x509_buf raw; /**< The raw CSR data (DER). */ + mbedtls_x509_buf cri; /**< The raw CertificateRequestInfo body (DER). */ + + int version; /**< CSR version (1=v1). */ + + mbedtls_x509_buf subject_raw; /**< The raw subject data (DER). */ + mbedtls_x509_name subject; /**< The parsed subject data (named information object). */ + + mbedtls_pk_context pk; /**< Container for the public key context. */ + + mbedtls_x509_buf sig_oid; + mbedtls_x509_buf sig; + mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ + mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ + void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ +} +mbedtls_x509_csr; + +/** + * Container for writing a CSR + */ +typedef struct mbedtls_x509write_csr { + mbedtls_pk_context *key; + mbedtls_asn1_named_data *subject; + mbedtls_md_type_t md_alg; + mbedtls_asn1_named_data *extensions; +} +mbedtls_x509write_csr; + +#if defined(MBEDTLS_X509_CSR_PARSE_C) +/** + * \brief Load a Certificate Signing Request (CSR) in DER format + * + * \note CSR attributes (if any) are currently silently ignored. + * + * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto + * subsystem must have been initialized by calling + * psa_crypto_init() before calling this function. + * + * \param csr CSR context to fill + * \param buf buffer holding the CRL data + * \param buflen size of the buffer + * + * \return 0 if successful, or a specific X509 error code + */ +int mbedtls_x509_csr_parse_der(mbedtls_x509_csr *csr, + const unsigned char *buf, size_t buflen); + +/** + * \brief Load a Certificate Signing Request (CSR), DER or PEM format + * + * \note See notes for \c mbedtls_x509_csr_parse_der() + * + * \note If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto + * subsystem must have been initialized by calling + * psa_crypto_init() before calling this function. + * + * \param csr CSR context to fill + * \param buf buffer holding the CRL data + * \param buflen size of the buffer + * (including the terminating null byte for PEM data) + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int mbedtls_x509_csr_parse(mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen); + +#if defined(MBEDTLS_FS_IO) +/** + * \brief Load a Certificate Signing Request (CSR) + * + * \note See notes for \c mbedtls_x509_csr_parse() + * + * \param csr CSR context to fill + * \param path filename to read the CSR from + * + * \return 0 if successful, or a specific X509 or PEM error code + */ +int mbedtls_x509_csr_parse_file(mbedtls_x509_csr *csr, const char *path); +#endif /* MBEDTLS_FS_IO */ + +/** + * \brief Returns an informational string about the + * CSR. + * + * \param buf Buffer to write to + * \param size Maximum size of buffer + * \param prefix A line prefix + * \param csr The X509 CSR to represent + * + * \return The length of the string written (not including the + * terminated nul byte), or a negative error code. + */ +int mbedtls_x509_csr_info(char *buf, size_t size, const char *prefix, + const mbedtls_x509_csr *csr); + +/** + * \brief Initialize a CSR + * + * \param csr CSR to initialize + */ +void mbedtls_x509_csr_init(mbedtls_x509_csr *csr); + +/** + * \brief Unallocate all CSR data + * + * \param csr CSR to free + */ +void mbedtls_x509_csr_free(mbedtls_x509_csr *csr); +#endif /* MBEDTLS_X509_CSR_PARSE_C */ + +/** \} name Structures and functions for X.509 Certificate Signing Requests (CSR) */ + +#if defined(MBEDTLS_X509_CSR_WRITE_C) +/** + * \brief Initialize a CSR context + * + * \param ctx CSR context to initialize + */ +void mbedtls_x509write_csr_init(mbedtls_x509write_csr *ctx); + +/** + * \brief Set the subject name for a CSR + * Subject names should contain a comma-separated list + * of OID types and values: + * e.g. "C=UK,O=ARM,CN=Mbed TLS Server 1" + * + * \param ctx CSR context to use + * \param subject_name subject name to set + * + * \return 0 if subject name was parsed successfully, or + * a specific error code + */ +int mbedtls_x509write_csr_set_subject_name(mbedtls_x509write_csr *ctx, + const char *subject_name); + +/** + * \brief Set the key for a CSR (public key will be included, + * private key used to sign the CSR when writing it) + * + * \param ctx CSR context to use + * \param key Asymmetric key to include + */ +void mbedtls_x509write_csr_set_key(mbedtls_x509write_csr *ctx, mbedtls_pk_context *key); + +/** + * \brief Set the MD algorithm to use for the signature + * (e.g. MBEDTLS_MD_SHA1) + * + * \param ctx CSR context to use + * \param md_alg MD algorithm to use + */ +void mbedtls_x509write_csr_set_md_alg(mbedtls_x509write_csr *ctx, mbedtls_md_type_t md_alg); + +/** + * \brief Set the Key Usage Extension flags + * (e.g. MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN) + * + * \param ctx CSR context to use + * \param key_usage key usage flags to set + * + * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED + * + * \note The decipherOnly flag from the Key Usage + * extension is represented by bit 8 (i.e. + * 0x8000), which cannot typically be represented + * in an unsigned char. Therefore, the flag + * decipherOnly (i.e. + * #MBEDTLS_X509_KU_DECIPHER_ONLY) cannot be set using this + * function. + */ +int mbedtls_x509write_csr_set_key_usage(mbedtls_x509write_csr *ctx, unsigned char key_usage); + +/** + * \brief Set the Netscape Cert Type flags + * (e.g. MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL) + * + * \param ctx CSR context to use + * \param ns_cert_type Netscape Cert Type flags to set + * + * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED + */ +int mbedtls_x509write_csr_set_ns_cert_type(mbedtls_x509write_csr *ctx, + unsigned char ns_cert_type); + +/** + * \brief Generic function to add to or replace an extension in the + * CSR + * + * \param ctx CSR context to use + * \param oid OID of the extension + * \param oid_len length of the OID + * \param val value of the extension OCTET STRING + * \param val_len length of the value data + * + * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED + */ +int mbedtls_x509write_csr_set_extension(mbedtls_x509write_csr *ctx, + const char *oid, size_t oid_len, + const unsigned char *val, size_t val_len); + +/** + * \brief Free the contents of a CSR context + * + * \param ctx CSR context to free + */ +void mbedtls_x509write_csr_free(mbedtls_x509write_csr *ctx); + +/** + * \brief Write a CSR (Certificate Signing Request) to a + * DER structure + * Note: data is written at the end of the buffer! Use the + * return value to determine where you should start + * using the buffer + * + * \param ctx CSR to write away + * \param buf buffer to write to + * \param size size of the buffer + * \param f_rng RNG function (for signature, see note) + * \param p_rng RNG parameter + * + * \return length of data written if successful, or a specific + * error code + * + * \note f_rng may be NULL if RSA is used for signature and the + * signature is made offline (otherwise f_rng is desirable + * for countermeasures against timing attacks). + * ECDSA signatures always require a non-NULL f_rng. + */ +int mbedtls_x509write_csr_der(mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +#if defined(MBEDTLS_PEM_WRITE_C) +/** + * \brief Write a CSR (Certificate Signing Request) to a + * PEM string + * + * \param ctx CSR to write away + * \param buf buffer to write to + * \param size size of the buffer + * \param f_rng RNG function (for signature, see note) + * \param p_rng RNG parameter + * + * \return 0 if successful, or a specific error code + * + * \note f_rng may be NULL if RSA is used for signature and the + * signature is made offline (otherwise f_rng is desirable + * for countermeasures against timing attacks). + * ECDSA signatures always require a non-NULL f_rng. + */ +int mbedtls_x509write_csr_pem(mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); +#endif /* MBEDTLS_PEM_WRITE_C */ +#endif /* MBEDTLS_X509_CSR_WRITE_C */ + +/** \} addtogroup x509_module */ + +#ifdef __cplusplus +} +#endif + +#endif /* mbedtls_x509_csr.h */ diff --git a/ext/opcua_client/mbedtls/include/mbedtls/xtea.h b/ext/opcua_client/mbedtls/include/mbedtls/xtea.h new file mode 100644 index 0000000..b7242c7 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/mbedtls/xtea.h @@ -0,0 +1,126 @@ +/** + * \file xtea.h + * + * \brief XTEA block cipher (32-bit) + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_XTEA_H +#define MBEDTLS_XTEA_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include +#include + +#define MBEDTLS_XTEA_ENCRYPT 1 +#define MBEDTLS_XTEA_DECRYPT 0 + +/** The data input has an invalid length. */ +#define MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH -0x0028 + +/* MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED is deprecated and should not be used. */ +/** XTEA hardware accelerator failed. */ +#define MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED -0x0029 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_XTEA_ALT) +// Regular implementation +// + +/** + * \brief XTEA context structure + */ +typedef struct mbedtls_xtea_context { + uint32_t k[4]; /*!< key */ +} +mbedtls_xtea_context; + +#else /* MBEDTLS_XTEA_ALT */ +#include "xtea_alt.h" +#endif /* MBEDTLS_XTEA_ALT */ + +/** + * \brief Initialize XTEA context + * + * \param ctx XTEA context to be initialized + */ +void mbedtls_xtea_init(mbedtls_xtea_context *ctx); + +/** + * \brief Clear XTEA context + * + * \param ctx XTEA context to be cleared + */ +void mbedtls_xtea_free(mbedtls_xtea_context *ctx); + +/** + * \brief XTEA key schedule + * + * \param ctx XTEA context to be initialized + * \param key the secret key + */ +void mbedtls_xtea_setup(mbedtls_xtea_context *ctx, const unsigned char key[16]); + +/** + * \brief XTEA cipher function + * + * \param ctx XTEA context + * \param mode MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT + * \param input 8-byte input block + * \param output 8-byte output block + * + * \return 0 if successful + */ +int mbedtls_xtea_crypt_ecb(mbedtls_xtea_context *ctx, + int mode, + const unsigned char input[8], + unsigned char output[8]); + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/** + * \brief XTEA CBC cipher function + * + * \param ctx XTEA context + * \param mode MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT + * \param length the length of input, multiple of 8 + * \param iv initialization vector for CBC mode + * \param input input block + * \param output output block + * + * \return 0 if successful, + * MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH if the length % 8 != 0 + */ +int mbedtls_xtea_crypt_cbc(mbedtls_xtea_context *ctx, + int mode, + size_t length, + unsigned char iv[8], + const unsigned char *input, + unsigned char *output); +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_SELF_TEST) + +/** + * \brief Checkup routine + * + * \return 0 if successful, or 1 if the test failed + */ +int mbedtls_xtea_self_test(int verbose); + +#endif /* MBEDTLS_SELF_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* xtea.h */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto.h b/ext/opcua_client/mbedtls/include/psa/crypto.h new file mode 100644 index 0000000..5096748 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto.h @@ -0,0 +1,3901 @@ +/** + * \file psa/crypto.h + * \brief Platform Security Architecture cryptography module + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_H +#define PSA_CRYPTO_H + +#include "crypto_platform.h" + +#include + +#ifdef __DOXYGEN_ONLY__ +/* This __DOXYGEN_ONLY__ block contains mock definitions for things that + * must be defined in the crypto_platform.h header. These mock definitions + * are present in this file as a convenience to generate pretty-printed + * documentation that includes those definitions. */ + +/** \defgroup platform Implementation-specific definitions + * @{ + */ + +/**@}*/ +#endif /* __DOXYGEN_ONLY__ */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* The file "crypto_types.h" declares types that encode errors, + * algorithms, key types, policies, etc. */ +#include "crypto_types.h" + +/** \defgroup version API version + * @{ + */ + +/** + * The major version of this implementation of the PSA Crypto API + */ +#define PSA_CRYPTO_API_VERSION_MAJOR 1 + +/** + * The minor version of this implementation of the PSA Crypto API + */ +#define PSA_CRYPTO_API_VERSION_MINOR 0 + +/**@}*/ + +/* The file "crypto_values.h" declares macros to build and analyze values + * of integral types defined in "crypto_types.h". */ +#include "crypto_values.h" + +/** \defgroup initialization Library initialization + * @{ + */ + +/** + * \brief Library initialization. + * + * Applications must call this function before calling any other + * function in this module. + * + * Applications may call this function more than once. Once a call + * succeeds, subsequent calls are guaranteed to succeed. + * + * If the application calls other functions before calling psa_crypto_init(), + * the behavior is undefined. Implementations are encouraged to either perform + * the operation as if the library had been initialized or to return + * #PSA_ERROR_BAD_STATE or some other applicable error. In particular, + * implementations should not return a success status if the lack of + * initialization may have security implications, for example due to improper + * seeding of the random number generator. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + */ +psa_status_t psa_crypto_init(void); + +/**@}*/ + +/** \addtogroup attributes + * @{ + */ + +/** \def PSA_KEY_ATTRIBUTES_INIT + * + * This macro returns a suitable initializer for a key attribute structure + * of type #psa_key_attributes_t. + */ +#ifdef __DOXYGEN_ONLY__ +/* This is an example definition for documentation purposes. + * Implementations should define a suitable value in `crypto_struct.h`. + */ +#define PSA_KEY_ATTRIBUTES_INIT { 0 } +#endif + +/** Return an initial value for a key attributes structure. + */ +static psa_key_attributes_t psa_key_attributes_init(void); + +/** Declare a key as persistent and set its key identifier. + * + * If the attribute structure currently declares the key as volatile (which + * is the default content of an attribute structure), this function sets + * the lifetime attribute to #PSA_KEY_LIFETIME_PERSISTENT. + * + * This function does not access storage, it merely stores the given + * value in the structure. + * The persistent key will be written to storage when the attribute + * structure is passed to a key creation function such as + * psa_import_key(), psa_generate_key(), + * psa_key_derivation_output_key() or psa_copy_key(). + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate each of its arguments exactly once. + * + * \param[out] attributes The attribute structure to write to. + * \param key The persistent identifier for the key. + * This can be any value in the range from + * #PSA_KEY_ID_USER_MIN to #PSA_KEY_ID_USER_MAX + * inclusive. + */ +static void psa_set_key_id(psa_key_attributes_t *attributes, + mbedtls_svc_key_id_t key); + +#ifdef MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER +/** Set the owner identifier of a key. + * + * When key identifiers encode key owner identifiers, psa_set_key_id() does + * not allow to define in key attributes the owner of volatile keys as + * psa_set_key_id() enforces the key to be persistent. + * + * This function allows to set in key attributes the owner identifier of a + * key. It is intended to be used for volatile keys. For persistent keys, + * it is recommended to use the PSA Cryptography API psa_set_key_id() to define + * the owner of a key. + * + * \param[out] attributes The attribute structure to write to. + * \param owner The key owner identifier. + */ +static void mbedtls_set_key_owner_id(psa_key_attributes_t *attributes, + mbedtls_key_owner_id_t owner); +#endif + +/** Set the location of a persistent key. + * + * To make a key persistent, you must give it a persistent key identifier + * with psa_set_key_id(). By default, a key that has a persistent identifier + * is stored in the default storage area identifier by + * #PSA_KEY_LIFETIME_PERSISTENT. Call this function to choose a storage + * area, or to explicitly declare the key as volatile. + * + * This function does not access storage, it merely stores the given + * value in the structure. + * The persistent key will be written to storage when the attribute + * structure is passed to a key creation function such as + * psa_import_key(), psa_generate_key(), + * psa_key_derivation_output_key() or psa_copy_key(). + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate each of its arguments exactly once. + * + * \param[out] attributes The attribute structure to write to. + * \param lifetime The lifetime for the key. + * If this is #PSA_KEY_LIFETIME_VOLATILE, the + * key will be volatile, and the key identifier + * attribute is reset to 0. + */ +static void psa_set_key_lifetime(psa_key_attributes_t *attributes, + psa_key_lifetime_t lifetime); + +/** Retrieve the key identifier from key attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate its argument exactly once. + * + * \param[in] attributes The key attribute structure to query. + * + * \return The persistent identifier stored in the attribute structure. + * This value is unspecified if the attribute structure declares + * the key as volatile. + */ +static mbedtls_svc_key_id_t psa_get_key_id( + const psa_key_attributes_t *attributes); + +/** Retrieve the lifetime from key attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate its argument exactly once. + * + * \param[in] attributes The key attribute structure to query. + * + * \return The lifetime value stored in the attribute structure. + */ +static psa_key_lifetime_t psa_get_key_lifetime( + const psa_key_attributes_t *attributes); + +/** Declare usage flags for a key. + * + * Usage flags are part of a key's usage policy. They encode what + * kind of operations are permitted on the key. For more details, + * refer to the documentation of the type #psa_key_usage_t. + * + * This function overwrites any usage flags + * previously set in \p attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate each of its arguments exactly once. + * + * \param[out] attributes The attribute structure to write to. + * \param usage_flags The usage flags to write. + */ +static void psa_set_key_usage_flags(psa_key_attributes_t *attributes, + psa_key_usage_t usage_flags); + +/** Retrieve the usage flags from key attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate its argument exactly once. + * + * \param[in] attributes The key attribute structure to query. + * + * \return The usage flags stored in the attribute structure. + */ +static psa_key_usage_t psa_get_key_usage_flags( + const psa_key_attributes_t *attributes); + +/** Declare the permitted algorithm policy for a key. + * + * The permitted algorithm policy of a key encodes which algorithm or + * algorithms are permitted to be used with this key. The following + * algorithm policies are supported: + * - 0 does not allow any cryptographic operation with the key. The key + * may be used for non-cryptographic actions such as exporting (if + * permitted by the usage flags). + * - An algorithm value permits this particular algorithm. + * - An algorithm wildcard built from #PSA_ALG_ANY_HASH allows the specified + * signature scheme with any hash algorithm. + * - An algorithm built from #PSA_ALG_AT_LEAST_THIS_LENGTH_MAC allows + * any MAC algorithm from the same base class (e.g. CMAC) which + * generates/verifies a MAC length greater than or equal to the length + * encoded in the wildcard algorithm. + * - An algorithm built from #PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG + * allows any AEAD algorithm from the same base class (e.g. CCM) which + * generates/verifies a tag length greater than or equal to the length + * encoded in the wildcard algorithm. + * + * This function overwrites any algorithm policy + * previously set in \p attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate each of its arguments exactly once. + * + * \param[out] attributes The attribute structure to write to. + * \param alg The permitted algorithm policy to write. + */ +static void psa_set_key_algorithm(psa_key_attributes_t *attributes, + psa_algorithm_t alg); + + +/** Retrieve the algorithm policy from key attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate its argument exactly once. + * + * \param[in] attributes The key attribute structure to query. + * + * \return The algorithm stored in the attribute structure. + */ +static psa_algorithm_t psa_get_key_algorithm( + const psa_key_attributes_t *attributes); + +/** Declare the type of a key. + * + * This function overwrites any key type + * previously set in \p attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate each of its arguments exactly once. + * + * \param[out] attributes The attribute structure to write to. + * \param type The key type to write. + * If this is 0, the key type in \p attributes + * becomes unspecified. + */ +static void psa_set_key_type(psa_key_attributes_t *attributes, + psa_key_type_t type); + + +/** Declare the size of a key. + * + * This function overwrites any key size previously set in \p attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate each of its arguments exactly once. + * + * \param[out] attributes The attribute structure to write to. + * \param bits The key size in bits. + * If this is 0, the key size in \p attributes + * becomes unspecified. Keys of size 0 are + * not supported. + */ +static void psa_set_key_bits(psa_key_attributes_t *attributes, + size_t bits); + +/** Retrieve the key type from key attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate its argument exactly once. + * + * \param[in] attributes The key attribute structure to query. + * + * \return The key type stored in the attribute structure. + */ +static psa_key_type_t psa_get_key_type(const psa_key_attributes_t *attributes); + +/** Retrieve the key size from key attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate its argument exactly once. + * + * \param[in] attributes The key attribute structure to query. + * + * \return The key size stored in the attribute structure, in bits. + */ +static size_t psa_get_key_bits(const psa_key_attributes_t *attributes); + +/** Retrieve the attributes of a key. + * + * This function first resets the attribute structure as with + * psa_reset_key_attributes(). It then copies the attributes of + * the given key into the given attribute structure. + * + * \note This function may allocate memory or other resources. + * Once you have called this function on an attribute structure, + * you must call psa_reset_key_attributes() to free these resources. + * + * \param[in] key Identifier of the key to query. + * \param[in,out] attributes On success, the attributes of the key. + * On failure, equivalent to a + * freshly-initialized structure. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_get_key_attributes(mbedtls_svc_key_id_t key, + psa_key_attributes_t *attributes); + +/** Reset a key attribute structure to a freshly initialized state. + * + * You must initialize the attribute structure as described in the + * documentation of the type #psa_key_attributes_t before calling this + * function. Once the structure has been initialized, you may call this + * function at any time. + * + * This function frees any auxiliary resources that the structure + * may contain. + * + * \param[in,out] attributes The attribute structure to reset. + */ +void psa_reset_key_attributes(psa_key_attributes_t *attributes); + +/**@}*/ + +/** \defgroup key_management Key management + * @{ + */ + +/** Remove non-essential copies of key material from memory. + * + * If the key identifier designates a volatile key, this functions does not do + * anything and returns successfully. + * + * If the key identifier designates a persistent key, then this function will + * free all resources associated with the key in volatile memory. The key + * data in persistent storage is not affected and the key can still be used. + * + * \param key Identifier of the key to purge. + * + * \retval #PSA_SUCCESS + * The key material will have been removed from memory if it is not + * currently required. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p key is not a valid key identifier. + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_purge_key(mbedtls_svc_key_id_t key); + +/** Make a copy of a key. + * + * Copy key material from one location to another. + * + * This function is primarily useful to copy a key from one location + * to another, since it populates a key using the material from + * another key which may have a different lifetime. + * + * This function may be used to share a key with a different party, + * subject to implementation-defined restrictions on key sharing. + * + * The policy on the source key must have the usage flag + * #PSA_KEY_USAGE_COPY set. + * This flag is sufficient to permit the copy if the key has the lifetime + * #PSA_KEY_LIFETIME_VOLATILE or #PSA_KEY_LIFETIME_PERSISTENT. + * Some secure elements do not provide a way to copy a key without + * making it extractable from the secure element. If a key is located + * in such a secure element, then the key must have both usage flags + * #PSA_KEY_USAGE_COPY and #PSA_KEY_USAGE_EXPORT in order to make + * a copy of the key outside the secure element. + * + * The resulting key may only be used in a way that conforms to + * both the policy of the original key and the policy specified in + * the \p attributes parameter: + * - The usage flags on the resulting key are the bitwise-and of the + * usage flags on the source policy and the usage flags in \p attributes. + * - If both allow the same algorithm or wildcard-based + * algorithm policy, the resulting key has the same algorithm policy. + * - If either of the policies allows an algorithm and the other policy + * allows a wildcard-based algorithm policy that includes this algorithm, + * the resulting key allows the same algorithm. + * - If the policies do not allow any algorithm in common, this function + * fails with the status #PSA_ERROR_INVALID_ARGUMENT. + * + * The effect of this function on implementation-defined attributes is + * implementation-defined. + * + * \param source_key The key to copy. It must allow the usage + * #PSA_KEY_USAGE_COPY. If a private or secret key is + * being copied outside of a secure element it must + * also allow #PSA_KEY_USAGE_EXPORT. + * \param[in] attributes The attributes for the new key. + * They are used as follows: + * - The key type and size may be 0. If either is + * nonzero, it must match the corresponding + * attribute of the source key. + * - The key location (the lifetime and, for + * persistent keys, the key identifier) is + * used directly. + * - The policy constraints (usage flags and + * algorithm policy) are combined from + * the source key and \p attributes so that + * both sets of restrictions apply, as + * described in the documentation of this function. + * \param[out] target_key On success, an identifier for the newly created + * key. For persistent keys, this is the key + * identifier defined in \p attributes. + * \c 0 on failure. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_HANDLE + * \p source_key is invalid. + * \retval #PSA_ERROR_ALREADY_EXISTS + * This is an attempt to create a persistent key, and there is + * already a persistent key with the given identifier. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The lifetime or identifier in \p attributes are invalid, or + * the policy constraints on the source and specified in + * \p attributes are incompatible, or + * \p attributes specifies a key type or key size + * which does not match the attributes of the source key. + * \retval #PSA_ERROR_NOT_PERMITTED + * The source key does not have the #PSA_KEY_USAGE_COPY usage flag, or + * the source key is not exportable and its lifetime does not + * allow copying it to the target's lifetime. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_copy_key(mbedtls_svc_key_id_t source_key, + const psa_key_attributes_t *attributes, + mbedtls_svc_key_id_t *target_key); + + +/** + * \brief Destroy a key. + * + * This function destroys a key from both volatile + * memory and, if applicable, non-volatile storage. Implementations shall + * make a best effort to ensure that that the key material cannot be recovered. + * + * This function also erases any metadata such as policies and frees + * resources associated with the key. + * + * If a key is currently in use in a multipart operation, then destroying the + * key will cause the multipart operation to fail. + * + * \param key Identifier of the key to erase. If this is \c 0, do nothing and + * return #PSA_SUCCESS. + * + * \retval #PSA_SUCCESS + * \p key was a valid identifier and the key material that it + * referred to has been erased. Alternatively, \p key is \c 0. + * \retval #PSA_ERROR_NOT_PERMITTED + * The key cannot be erased because it is + * read-only, either due to a policy or due to physical restrictions. + * \retval #PSA_ERROR_INVALID_HANDLE + * \p key is not a valid identifier nor \c 0. + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * There was a failure in communication with the cryptoprocessor. + * The key material may still be present in the cryptoprocessor. + * \retval #PSA_ERROR_DATA_INVALID + * This error is typically a result of either storage corruption on a + * cleartext storage backend, or an attempt to read data that was + * written by an incompatible version of the library. + * \retval #PSA_ERROR_STORAGE_FAILURE + * The storage is corrupted. Implementations shall make a best effort + * to erase key material even in this stage, however applications + * should be aware that it may be impossible to guarantee that the + * key material is not recoverable in such cases. + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * An unexpected condition which is not a storage corruption or + * a communication failure occurred. The cryptoprocessor may have + * been compromised. + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_destroy_key(mbedtls_svc_key_id_t key); + +/**@}*/ + +/** \defgroup import_export Key import and export + * @{ + */ + +/** + * \brief Import a key in binary format. + * + * This function supports any output from psa_export_key(). Refer to the + * documentation of psa_export_public_key() for the format of public keys + * and to the documentation of psa_export_key() for the format for + * other key types. + * + * The key data determines the key size. The attributes may optionally + * specify a key size; in this case it must match the size determined + * from the key data. A key size of 0 in \p attributes indicates that + * the key size is solely determined by the key data. + * + * Implementations must reject an attempt to import a key of size 0. + * + * This specification supports a single format for each key type. + * Implementations may support other formats as long as the standard + * format is supported. Implementations that support other formats + * should ensure that the formats are clearly unambiguous so as to + * minimize the risk that an invalid input is accidentally interpreted + * according to a different format. + * + * \param[in] attributes The attributes for the new key. + * The key size is always determined from the + * \p data buffer. + * If the key size in \p attributes is nonzero, + * it must be equal to the size from \p data. + * \param[out] key On success, an identifier to the newly created key. + * For persistent keys, this is the key identifier + * defined in \p attributes. + * \c 0 on failure. + * \param[in] data Buffer containing the key data. The content of this + * buffer is interpreted according to the type declared + * in \p attributes. + * All implementations must support at least the format + * described in the documentation + * of psa_export_key() or psa_export_public_key() for + * the chosen type. Implementations may allow other + * formats, but should be conservative: implementations + * should err on the side of rejecting content if it + * may be erroneous (e.g. wrong type or truncated data). + * \param data_length Size of the \p data buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * If the key is persistent, the key material and the key's metadata + * have been saved to persistent storage. + * \retval #PSA_ERROR_ALREADY_EXISTS + * This is an attempt to create a persistent key, and there is + * already a persistent key with the given identifier. + * \retval #PSA_ERROR_NOT_SUPPORTED + * The key type or key size is not supported, either by the + * implementation in general or in this particular persistent location. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The key attributes, as a whole, are invalid, or + * the key data is not correctly formatted, or + * the size in \p attributes is nonzero and does not match the size + * of the key data. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_import_key(const psa_key_attributes_t *attributes, + const uint8_t *data, + size_t data_length, + mbedtls_svc_key_id_t *key); + + + +/** + * \brief Export a key in binary format. + * + * The output of this function can be passed to psa_import_key() to + * create an equivalent object. + * + * If the implementation of psa_import_key() supports other formats + * beyond the format specified here, the output from psa_export_key() + * must use the representation specified here, not the original + * representation. + * + * For standard key types, the output format is as follows: + * + * - For symmetric keys (including MAC keys), the format is the + * raw bytes of the key. + * - For DES, the key data consists of 8 bytes. The parity bits must be + * correct. + * - For Triple-DES, the format is the concatenation of the + * two or three DES keys. + * - For RSA key pairs (#PSA_KEY_TYPE_RSA_KEY_PAIR), the format + * is the non-encrypted DER encoding of the representation defined by + * PKCS\#1 (RFC 8017) as `RSAPrivateKey`, version 0. + * ``` + * RSAPrivateKey ::= SEQUENCE { + * version INTEGER, -- must be 0 + * modulus INTEGER, -- n + * publicExponent INTEGER, -- e + * privateExponent INTEGER, -- d + * prime1 INTEGER, -- p + * prime2 INTEGER, -- q + * exponent1 INTEGER, -- d mod (p-1) + * exponent2 INTEGER, -- d mod (q-1) + * coefficient INTEGER, -- (inverse of q) mod p + * } + * ``` + * - For elliptic curve key pairs (key types for which + * #PSA_KEY_TYPE_IS_ECC_KEY_PAIR is true), the format is + * a representation of the private value as a `ceiling(m/8)`-byte string + * where `m` is the bit size associated with the curve, i.e. the bit size + * of the order of the curve's coordinate field. This byte string is + * in little-endian order for Montgomery curves (curve types + * `PSA_ECC_FAMILY_CURVEXXX`), and in big-endian order for Weierstrass + * curves (curve types `PSA_ECC_FAMILY_SECTXXX`, `PSA_ECC_FAMILY_SECPXXX` + * and `PSA_ECC_FAMILY_BRAINPOOL_PXXX`). + * For Weierstrass curves, this is the content of the `privateKey` field of + * the `ECPrivateKey` format defined by RFC 5915. For Montgomery curves, + * the format is defined by RFC 7748, and output is masked according to §5. + * For twisted Edwards curves, the private key is as defined by RFC 8032 + * (a 32-byte string for Edwards25519, a 57-byte string for Edwards448). + * - For Diffie-Hellman key exchange key pairs (key types for which + * #PSA_KEY_TYPE_IS_DH_KEY_PAIR is true), the + * format is the representation of the private key `x` as a big-endian byte + * string. The length of the byte string is the private key size in bytes + * (leading zeroes are not stripped). + * - For public keys (key types for which #PSA_KEY_TYPE_IS_PUBLIC_KEY is + * true), the format is the same as for psa_export_public_key(). + * + * The policy on the key must have the usage flag #PSA_KEY_USAGE_EXPORT set. + * + * \param key Identifier of the key to export. It must allow the + * usage #PSA_KEY_USAGE_EXPORT, unless it is a public + * key. + * \param[out] data Buffer where the key data is to be written. + * \param data_size Size of the \p data buffer in bytes. + * \param[out] data_length On success, the number of bytes + * that make up the key data. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED + * The key does not have the #PSA_KEY_USAGE_EXPORT flag. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p data buffer is too small. You can determine a + * sufficient buffer size by calling + * #PSA_EXPORT_KEY_OUTPUT_SIZE(\c type, \c bits) + * where \c type is the key type + * and \c bits is the key size in bits. + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_export_key(mbedtls_svc_key_id_t key, + uint8_t *data, + size_t data_size, + size_t *data_length); + +/** + * \brief Export a public key or the public part of a key pair in binary format. + * + * The output of this function can be passed to psa_import_key() to + * create an object that is equivalent to the public key. + * + * This specification supports a single format for each key type. + * Implementations may support other formats as long as the standard + * format is supported. Implementations that support other formats + * should ensure that the formats are clearly unambiguous so as to + * minimize the risk that an invalid input is accidentally interpreted + * according to a different format. + * + * For standard key types, the output format is as follows: + * - For RSA public keys (#PSA_KEY_TYPE_RSA_PUBLIC_KEY), the DER encoding of + * the representation defined by RFC 3279 §2.3.1 as `RSAPublicKey`. + * ``` + * RSAPublicKey ::= SEQUENCE { + * modulus INTEGER, -- n + * publicExponent INTEGER } -- e + * ``` + * - For elliptic curve keys on a twisted Edwards curve (key types for which + * #PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY is true and #PSA_KEY_TYPE_ECC_GET_FAMILY + * returns #PSA_ECC_FAMILY_TWISTED_EDWARDS), the public key is as defined + * by RFC 8032 + * (a 32-byte string for Edwards25519, a 57-byte string for Edwards448). + * - For other elliptic curve public keys (key types for which + * #PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY is true), the format is the uncompressed + * representation defined by SEC1 §2.3.3 as the content of an ECPoint. + * Let `m` be the bit size associated with the curve, i.e. the bit size of + * `q` for a curve over `F_q`. The representation consists of: + * - The byte 0x04; + * - `x_P` as a `ceiling(m/8)`-byte string, big-endian; + * - `y_P` as a `ceiling(m/8)`-byte string, big-endian. + * - For Diffie-Hellman key exchange public keys (key types for which + * #PSA_KEY_TYPE_IS_DH_PUBLIC_KEY is true), + * the format is the representation of the public key `y = g^x mod p` as a + * big-endian byte string. The length of the byte string is the length of the + * base prime `p` in bytes. + * + * Exporting a public key object or the public part of a key pair is + * always permitted, regardless of the key's usage flags. + * + * \param key Identifier of the key to export. + * \param[out] data Buffer where the key data is to be written. + * \param data_size Size of the \p data buffer in bytes. + * \param[out] data_length On success, the number of bytes + * that make up the key data. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The key is neither a public key nor a key pair. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p data buffer is too small. You can determine a + * sufficient buffer size by calling + * #PSA_EXPORT_KEY_OUTPUT_SIZE(#PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(\c type), \c bits) + * where \c type is the key type + * and \c bits is the key size in bits. + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_export_public_key(mbedtls_svc_key_id_t key, + uint8_t *data, + size_t data_size, + size_t *data_length); + + + +/**@}*/ + +/** \defgroup hash Message digests + * @{ + */ + +/** Calculate the hash (digest) of a message. + * + * \note To verify the hash of a message against an + * expected value, use psa_hash_compare() instead. + * + * \param alg The hash algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_HASH(\p alg) is true). + * \param[in] input Buffer containing the message to hash. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] hash Buffer where the hash is to be written. + * \param hash_size Size of the \p hash buffer in bytes. + * \param[out] hash_length On success, the number of bytes + * that make up the hash value. This is always + * #PSA_HASH_LENGTH(\p alg). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a hash algorithm. + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \p hash_size is too small + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_compute(psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *hash, + size_t hash_size, + size_t *hash_length); + +/** Calculate the hash (digest) of a message and compare it with a + * reference value. + * + * \param alg The hash algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_HASH(\p alg) is true). + * \param[in] input Buffer containing the message to hash. + * \param input_length Size of the \p input buffer in bytes. + * \param[in] hash Buffer containing the expected hash value. + * \param hash_length Size of the \p hash buffer in bytes. + * + * \retval #PSA_SUCCESS + * The expected hash is identical to the actual hash of the input. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The hash of the message was calculated successfully, but it + * differs from the expected hash. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a hash algorithm. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p input_length or \p hash_length do not match the hash size for \p alg + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_compare(psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *hash, + size_t hash_length); + +/** The type of the state data structure for multipart hash operations. + * + * Before calling any function on a hash operation object, the application must + * initialize it by any of the following means: + * - Set the structure to all-bits-zero, for example: + * \code + * psa_hash_operation_t operation; + * memset(&operation, 0, sizeof(operation)); + * \endcode + * - Initialize the structure to logical zero values, for example: + * \code + * psa_hash_operation_t operation = {0}; + * \endcode + * - Initialize the structure to the initializer #PSA_HASH_OPERATION_INIT, + * for example: + * \code + * psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT; + * \endcode + * - Assign the result of the function psa_hash_operation_init() + * to the structure, for example: + * \code + * psa_hash_operation_t operation; + * operation = psa_hash_operation_init(); + * \endcode + * + * This is an implementation-defined \c struct. Applications should not + * make any assumptions about the content of this structure except + * as directed by the documentation of a specific implementation. */ +typedef struct psa_hash_operation_s psa_hash_operation_t; + +/** \def PSA_HASH_OPERATION_INIT + * + * This macro returns a suitable initializer for a hash operation object + * of type #psa_hash_operation_t. + */ +#ifdef __DOXYGEN_ONLY__ +/* This is an example definition for documentation purposes. + * Implementations should define a suitable value in `crypto_struct.h`. + */ +#define PSA_HASH_OPERATION_INIT { 0 } +#endif + +/** Return an initial value for a hash operation object. + */ +static psa_hash_operation_t psa_hash_operation_init(void); + +/** Set up a multipart hash operation. + * + * The sequence of operations to calculate a hash (message digest) + * is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_hash_operation_t, e.g. #PSA_HASH_OPERATION_INIT. + * -# Call psa_hash_setup() to specify the algorithm. + * -# Call psa_hash_update() zero, one or more times, passing a fragment + * of the message each time. The hash that is calculated is the hash + * of the concatenation of these messages in order. + * -# To calculate the hash, call psa_hash_finish(). + * To compare the hash with an expected value, call psa_hash_verify(). + * + * If an error occurs at any step after a call to psa_hash_setup(), the + * operation will need to be reset by a call to psa_hash_abort(). The + * application may call psa_hash_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_hash_setup(), the application must + * eventually terminate the operation. The following events terminate an + * operation: + * - A successful call to psa_hash_finish() or psa_hash_verify(). + * - A call to psa_hash_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_hash_operation_t and not yet in use. + * \param alg The hash algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_HASH(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not a supported hash algorithm. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p alg is not a hash algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive), or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_setup(psa_hash_operation_t *operation, + psa_algorithm_t alg); + +/** Add a message fragment to a multipart hash operation. + * + * The application must call psa_hash_setup() before calling this function. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_hash_abort(). + * + * \param[in,out] operation Active hash operation. + * \param[in] input Buffer containing the message fragment to hash. + * \param input_length Size of the \p input buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active), or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_update(psa_hash_operation_t *operation, + const uint8_t *input, + size_t input_length); + +/** Finish the calculation of the hash of a message. + * + * The application must call psa_hash_setup() before calling this function. + * This function calculates the hash of the message formed by concatenating + * the inputs passed to preceding calls to psa_hash_update(). + * + * When this function returns successfully, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_hash_abort(). + * + * \warning Applications should not call this function if they expect + * a specific value for the hash. Call psa_hash_verify() instead. + * Beware that comparing integrity or authenticity data such as + * hash values with a function such as \c memcmp is risky + * because the time taken by the comparison may leak information + * about the hashed data which could allow an attacker to guess + * a valid hash and thereby bypass security controls. + * + * \param[in,out] operation Active hash operation. + * \param[out] hash Buffer where the hash is to be written. + * \param hash_size Size of the \p hash buffer in bytes. + * \param[out] hash_length On success, the number of bytes + * that make up the hash value. This is always + * #PSA_HASH_LENGTH(\c alg) where \c alg is the + * hash algorithm that is calculated. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p hash buffer is too small. You can determine a + * sufficient buffer size by calling #PSA_HASH_LENGTH(\c alg) + * where \c alg is the hash algorithm that is calculated. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active), or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_finish(psa_hash_operation_t *operation, + uint8_t *hash, + size_t hash_size, + size_t *hash_length); + +/** Finish the calculation of the hash of a message and compare it with + * an expected value. + * + * The application must call psa_hash_setup() before calling this function. + * This function calculates the hash of the message formed by concatenating + * the inputs passed to preceding calls to psa_hash_update(). It then + * compares the calculated hash with the expected hash passed as a + * parameter to this function. + * + * When this function returns successfully, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_hash_abort(). + * + * \note Implementations shall make the best effort to ensure that the + * comparison between the actual hash and the expected hash is performed + * in constant time. + * + * \param[in,out] operation Active hash operation. + * \param[in] hash Buffer containing the expected hash value. + * \param hash_length Size of the \p hash buffer in bytes. + * + * \retval #PSA_SUCCESS + * The expected hash is identical to the actual hash of the message. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The hash of the message was calculated successfully, but it + * differs from the expected hash. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active), or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_verify(psa_hash_operation_t *operation, + const uint8_t *hash, + size_t hash_length); + +/** Abort a hash operation. + * + * Aborting an operation frees all associated resources except for the + * \p operation structure itself. Once aborted, the operation object + * can be reused for another operation by calling + * psa_hash_setup() again. + * + * You may call this function any time after the operation object has + * been initialized by one of the methods described in #psa_hash_operation_t. + * + * In particular, calling psa_hash_abort() after the operation has been + * terminated by a call to psa_hash_abort(), psa_hash_finish() or + * psa_hash_verify() is safe and has no effect. + * + * \param[in,out] operation Initialized hash operation. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_abort(psa_hash_operation_t *operation); + +/** Clone a hash operation. + * + * This function copies the state of an ongoing hash operation to + * a new operation object. In other words, this function is equivalent + * to calling psa_hash_setup() on \p target_operation with the same + * algorithm that \p source_operation was set up for, then + * psa_hash_update() on \p target_operation with the same input that + * that was passed to \p source_operation. After this function returns, the + * two objects are independent, i.e. subsequent calls involving one of + * the objects do not affect the other object. + * + * \param[in] source_operation The active hash operation to clone. + * \param[in,out] target_operation The operation object to set up. + * It must be initialized but not active. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The \p source_operation state is not valid (it must be active), or + * the \p target_operation state is not valid (it must be inactive), or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation, + psa_hash_operation_t *target_operation); + +/**@}*/ + +/** \defgroup MAC Message authentication codes + * @{ + */ + +/** Calculate the MAC (message authentication code) of a message. + * + * \note To verify the MAC of a message against an + * expected value, use psa_mac_verify() instead. + * Beware that comparing integrity or authenticity data such as + * MAC values with a function such as \c memcmp is risky + * because the time taken by the comparison may leak information + * about the MAC value which could allow an attacker to guess + * a valid MAC and thereby bypass security controls. + * + * \param key Identifier of the key to use for the operation. It + * must allow the usage PSA_KEY_USAGE_SIGN_MESSAGE. + * \param alg The MAC algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_MAC(\p alg) is true). + * \param[in] input Buffer containing the input message. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] mac Buffer where the MAC value is to be written. + * \param mac_size Size of the \p mac buffer in bytes. + * \param[out] mac_length On success, the number of bytes + * that make up the MAC value. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p key is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a MAC algorithm. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \p mac_size is too small + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE + * The key could not be retrieved from storage. + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_compute(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *mac, + size_t mac_size, + size_t *mac_length); + +/** Calculate the MAC of a message and compare it with a reference value. + * + * \param key Identifier of the key to use for the operation. It + * must allow the usage PSA_KEY_USAGE_VERIFY_MESSAGE. + * \param alg The MAC algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_MAC(\p alg) is true). + * \param[in] input Buffer containing the input message. + * \param input_length Size of the \p input buffer in bytes. + * \param[in] mac Buffer containing the expected MAC value. + * \param mac_length Size of the \p mac buffer in bytes. + * + * \retval #PSA_SUCCESS + * The expected MAC is identical to the actual MAC of the input. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The MAC of the message was calculated successfully, but it + * differs from the expected value. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p key is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a MAC algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE + * The key could not be retrieved from storage. + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_verify(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *mac, + size_t mac_length); + +/** The type of the state data structure for multipart MAC operations. + * + * Before calling any function on a MAC operation object, the application must + * initialize it by any of the following means: + * - Set the structure to all-bits-zero, for example: + * \code + * psa_mac_operation_t operation; + * memset(&operation, 0, sizeof(operation)); + * \endcode + * - Initialize the structure to logical zero values, for example: + * \code + * psa_mac_operation_t operation = {0}; + * \endcode + * - Initialize the structure to the initializer #PSA_MAC_OPERATION_INIT, + * for example: + * \code + * psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT; + * \endcode + * - Assign the result of the function psa_mac_operation_init() + * to the structure, for example: + * \code + * psa_mac_operation_t operation; + * operation = psa_mac_operation_init(); + * \endcode + * + * This is an implementation-defined \c struct. Applications should not + * make any assumptions about the content of this structure except + * as directed by the documentation of a specific implementation. */ +typedef struct psa_mac_operation_s psa_mac_operation_t; + +/** \def PSA_MAC_OPERATION_INIT + * + * This macro returns a suitable initializer for a MAC operation object of type + * #psa_mac_operation_t. + */ +#ifdef __DOXYGEN_ONLY__ +/* This is an example definition for documentation purposes. + * Implementations should define a suitable value in `crypto_struct.h`. + */ +#define PSA_MAC_OPERATION_INIT { 0 } +#endif + +/** Return an initial value for a MAC operation object. + */ +static psa_mac_operation_t psa_mac_operation_init(void); + +/** Set up a multipart MAC calculation operation. + * + * This function sets up the calculation of the MAC + * (message authentication code) of a byte string. + * To verify the MAC of a message against an + * expected value, use psa_mac_verify_setup() instead. + * + * The sequence of operations to calculate a MAC is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_mac_operation_t, e.g. #PSA_MAC_OPERATION_INIT. + * -# Call psa_mac_sign_setup() to specify the algorithm and key. + * -# Call psa_mac_update() zero, one or more times, passing a fragment + * of the message each time. The MAC that is calculated is the MAC + * of the concatenation of these messages in order. + * -# At the end of the message, call psa_mac_sign_finish() to finish + * calculating the MAC value and retrieve it. + * + * If an error occurs at any step after a call to psa_mac_sign_setup(), the + * operation will need to be reset by a call to psa_mac_abort(). The + * application may call psa_mac_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_mac_sign_setup(), the application must + * eventually terminate the operation through one of the following methods: + * - A successful call to psa_mac_sign_finish(). + * - A call to psa_mac_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_mac_operation_t and not yet in use. + * \param key Identifier of the key to use for the operation. It + * must remain valid until the operation terminates. + * It must allow the usage PSA_KEY_USAGE_SIGN_MESSAGE. + * \param alg The MAC algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_MAC(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p key is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a MAC algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE + * The key could not be retrieved from storage. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive), or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation, + mbedtls_svc_key_id_t key, + psa_algorithm_t alg); + +/** Set up a multipart MAC verification operation. + * + * This function sets up the verification of the MAC + * (message authentication code) of a byte string against an expected value. + * + * The sequence of operations to verify a MAC is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_mac_operation_t, e.g. #PSA_MAC_OPERATION_INIT. + * -# Call psa_mac_verify_setup() to specify the algorithm and key. + * -# Call psa_mac_update() zero, one or more times, passing a fragment + * of the message each time. The MAC that is calculated is the MAC + * of the concatenation of these messages in order. + * -# At the end of the message, call psa_mac_verify_finish() to finish + * calculating the actual MAC of the message and verify it against + * the expected value. + * + * If an error occurs at any step after a call to psa_mac_verify_setup(), the + * operation will need to be reset by a call to psa_mac_abort(). The + * application may call psa_mac_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_mac_verify_setup(), the application must + * eventually terminate the operation through one of the following methods: + * - A successful call to psa_mac_verify_finish(). + * - A call to psa_mac_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_mac_operation_t and not yet in use. + * \param key Identifier of the key to use for the operation. It + * must remain valid until the operation terminates. + * It must allow the usage + * PSA_KEY_USAGE_VERIFY_MESSAGE. + * \param alg The MAC algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_MAC(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c key is not compatible with \c alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \c alg is not supported or is not a MAC algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE + * The key could not be retrieved from storage. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive), or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation, + mbedtls_svc_key_id_t key, + psa_algorithm_t alg); + +/** Add a message fragment to a multipart MAC operation. + * + * The application must call psa_mac_sign_setup() or psa_mac_verify_setup() + * before calling this function. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_mac_abort(). + * + * \param[in,out] operation Active MAC operation. + * \param[in] input Buffer containing the message fragment to add to + * the MAC calculation. + * \param input_length Size of the \p input buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active), or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_update(psa_mac_operation_t *operation, + const uint8_t *input, + size_t input_length); + +/** Finish the calculation of the MAC of a message. + * + * The application must call psa_mac_sign_setup() before calling this function. + * This function calculates the MAC of the message formed by concatenating + * the inputs passed to preceding calls to psa_mac_update(). + * + * When this function returns successfully, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_mac_abort(). + * + * \warning Applications should not call this function if they expect + * a specific value for the MAC. Call psa_mac_verify_finish() instead. + * Beware that comparing integrity or authenticity data such as + * MAC values with a function such as \c memcmp is risky + * because the time taken by the comparison may leak information + * about the MAC value which could allow an attacker to guess + * a valid MAC and thereby bypass security controls. + * + * \param[in,out] operation Active MAC operation. + * \param[out] mac Buffer where the MAC value is to be written. + * \param mac_size Size of the \p mac buffer in bytes. + * \param[out] mac_length On success, the number of bytes + * that make up the MAC value. This is always + * #PSA_MAC_LENGTH(\c key_type, \c key_bits, \c alg) + * where \c key_type and \c key_bits are the type and + * bit-size respectively of the key and \c alg is the + * MAC algorithm that is calculated. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p mac buffer is too small. You can determine a + * sufficient buffer size by calling PSA_MAC_LENGTH(). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active mac sign + * operation), or the library has not been previously initialized + * by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation, + uint8_t *mac, + size_t mac_size, + size_t *mac_length); + +/** Finish the calculation of the MAC of a message and compare it with + * an expected value. + * + * The application must call psa_mac_verify_setup() before calling this function. + * This function calculates the MAC of the message formed by concatenating + * the inputs passed to preceding calls to psa_mac_update(). It then + * compares the calculated MAC with the expected MAC passed as a + * parameter to this function. + * + * When this function returns successfully, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_mac_abort(). + * + * \note Implementations shall make the best effort to ensure that the + * comparison between the actual MAC and the expected MAC is performed + * in constant time. + * + * \param[in,out] operation Active MAC operation. + * \param[in] mac Buffer containing the expected MAC value. + * \param mac_length Size of the \p mac buffer in bytes. + * + * \retval #PSA_SUCCESS + * The expected MAC is identical to the actual MAC of the message. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The MAC of the message was calculated successfully, but it + * differs from the expected MAC. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active mac verify + * operation), or the library has not been previously initialized + * by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation, + const uint8_t *mac, + size_t mac_length); + +/** Abort a MAC operation. + * + * Aborting an operation frees all associated resources except for the + * \p operation structure itself. Once aborted, the operation object + * can be reused for another operation by calling + * psa_mac_sign_setup() or psa_mac_verify_setup() again. + * + * You may call this function any time after the operation object has + * been initialized by one of the methods described in #psa_mac_operation_t. + * + * In particular, calling psa_mac_abort() after the operation has been + * terminated by a call to psa_mac_abort(), psa_mac_sign_finish() or + * psa_mac_verify_finish() is safe and has no effect. + * + * \param[in,out] operation Initialized MAC operation. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_abort(psa_mac_operation_t *operation); + +/**@}*/ + +/** \defgroup cipher Symmetric ciphers + * @{ + */ + +/** Encrypt a message using a symmetric cipher. + * + * This function encrypts a message with a random IV (initialization + * vector). Use the multipart operation interface with a + * #psa_cipher_operation_t object to provide other forms of IV. + * + * \param key Identifier of the key to use for the operation. + * It must allow the usage #PSA_KEY_USAGE_ENCRYPT. + * \param alg The cipher algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * \param[in] input Buffer containing the message to encrypt. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] output Buffer where the output is to be written. + * The output contains the IV followed by + * the ciphertext proper. + * \param output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the output. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p key is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a cipher algorithm. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_encrypt(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/** Decrypt a message using a symmetric cipher. + * + * This function decrypts a message encrypted with a symmetric cipher. + * + * \param key Identifier of the key to use for the operation. + * It must remain valid until the operation + * terminates. It must allow the usage + * #PSA_KEY_USAGE_DECRYPT. + * \param alg The cipher algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * \param[in] input Buffer containing the message to decrypt. + * This consists of the IV followed by the + * ciphertext proper. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] output Buffer where the plaintext is to be written. + * \param output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the output. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p key is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a cipher algorithm. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_decrypt(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/** The type of the state data structure for multipart cipher operations. + * + * Before calling any function on a cipher operation object, the application + * must initialize it by any of the following means: + * - Set the structure to all-bits-zero, for example: + * \code + * psa_cipher_operation_t operation; + * memset(&operation, 0, sizeof(operation)); + * \endcode + * - Initialize the structure to logical zero values, for example: + * \code + * psa_cipher_operation_t operation = {0}; + * \endcode + * - Initialize the structure to the initializer #PSA_CIPHER_OPERATION_INIT, + * for example: + * \code + * psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT; + * \endcode + * - Assign the result of the function psa_cipher_operation_init() + * to the structure, for example: + * \code + * psa_cipher_operation_t operation; + * operation = psa_cipher_operation_init(); + * \endcode + * + * This is an implementation-defined \c struct. Applications should not + * make any assumptions about the content of this structure except + * as directed by the documentation of a specific implementation. */ +typedef struct psa_cipher_operation_s psa_cipher_operation_t; + +/** \def PSA_CIPHER_OPERATION_INIT + * + * This macro returns a suitable initializer for a cipher operation object of + * type #psa_cipher_operation_t. + */ +#ifdef __DOXYGEN_ONLY__ +/* This is an example definition for documentation purposes. + * Implementations should define a suitable value in `crypto_struct.h`. + */ +#define PSA_CIPHER_OPERATION_INIT { 0 } +#endif + +/** Return an initial value for a cipher operation object. + */ +static psa_cipher_operation_t psa_cipher_operation_init(void); + +/** Set the key for a multipart symmetric encryption operation. + * + * The sequence of operations to encrypt a message with a symmetric cipher + * is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_cipher_operation_t, e.g. + * #PSA_CIPHER_OPERATION_INIT. + * -# Call psa_cipher_encrypt_setup() to specify the algorithm and key. + * -# Call either psa_cipher_generate_iv() or psa_cipher_set_iv() to + * generate or set the IV (initialization vector). You should use + * psa_cipher_generate_iv() unless the protocol you are implementing + * requires a specific IV value. + * -# Call psa_cipher_update() zero, one or more times, passing a fragment + * of the message each time. + * -# Call psa_cipher_finish(). + * + * If an error occurs at any step after a call to psa_cipher_encrypt_setup(), + * the operation will need to be reset by a call to psa_cipher_abort(). The + * application may call psa_cipher_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_cipher_encrypt_setup(), the application must + * eventually terminate the operation. The following events terminate an + * operation: + * - A successful call to psa_cipher_finish(). + * - A call to psa_cipher_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_cipher_operation_t and not yet in use. + * \param key Identifier of the key to use for the operation. + * It must remain valid until the operation + * terminates. It must allow the usage + * #PSA_KEY_USAGE_ENCRYPT. + * \param alg The cipher algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p key is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a cipher algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive), or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation, + mbedtls_svc_key_id_t key, + psa_algorithm_t alg); + +/** Set the key for a multipart symmetric decryption operation. + * + * The sequence of operations to decrypt a message with a symmetric cipher + * is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_cipher_operation_t, e.g. + * #PSA_CIPHER_OPERATION_INIT. + * -# Call psa_cipher_decrypt_setup() to specify the algorithm and key. + * -# Call psa_cipher_set_iv() with the IV (initialization vector) for the + * decryption. If the IV is prepended to the ciphertext, you can call + * psa_cipher_update() on a buffer containing the IV followed by the + * beginning of the message. + * -# Call psa_cipher_update() zero, one or more times, passing a fragment + * of the message each time. + * -# Call psa_cipher_finish(). + * + * If an error occurs at any step after a call to psa_cipher_decrypt_setup(), + * the operation will need to be reset by a call to psa_cipher_abort(). The + * application may call psa_cipher_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_cipher_decrypt_setup(), the application must + * eventually terminate the operation. The following events terminate an + * operation: + * - A successful call to psa_cipher_finish(). + * - A call to psa_cipher_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_cipher_operation_t and not yet in use. + * \param key Identifier of the key to use for the operation. + * It must remain valid until the operation + * terminates. It must allow the usage + * #PSA_KEY_USAGE_DECRYPT. + * \param alg The cipher algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p key is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a cipher algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive), or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation, + mbedtls_svc_key_id_t key, + psa_algorithm_t alg); + +/** Generate an IV for a symmetric encryption operation. + * + * This function generates a random IV (initialization vector), nonce + * or initial counter value for the encryption operation as appropriate + * for the chosen algorithm, key type and key size. + * + * The application must call psa_cipher_encrypt_setup() before + * calling this function. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_cipher_abort(). + * + * \param[in,out] operation Active cipher operation. + * \param[out] iv Buffer where the generated IV is to be written. + * \param iv_size Size of the \p iv buffer in bytes. + * \param[out] iv_length On success, the number of bytes of the + * generated IV. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p iv buffer is too small. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, with no IV set), + * or the library has not been previously initialized + * by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation, + uint8_t *iv, + size_t iv_size, + size_t *iv_length); + +/** Set the IV for a symmetric encryption or decryption operation. + * + * This function sets the IV (initialization vector), nonce + * or initial counter value for the encryption or decryption operation. + * + * The application must call psa_cipher_encrypt_setup() before + * calling this function. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_cipher_abort(). + * + * \note When encrypting, applications should use psa_cipher_generate_iv() + * instead of this function, unless implementing a protocol that requires + * a non-random IV. + * + * \param[in,out] operation Active cipher operation. + * \param[in] iv Buffer containing the IV to use. + * \param iv_length Size of the IV in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The size of \p iv is not acceptable for the chosen algorithm, + * or the chosen algorithm does not use an IV. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active cipher + * encrypt operation, with no IV set), or the library has not been + * previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation, + const uint8_t *iv, + size_t iv_length); + +/** Encrypt or decrypt a message fragment in an active cipher operation. + * + * Before calling this function, you must: + * 1. Call either psa_cipher_encrypt_setup() or psa_cipher_decrypt_setup(). + * The choice of setup function determines whether this function + * encrypts or decrypts its input. + * 2. If the algorithm requires an IV, call psa_cipher_generate_iv() + * (recommended when encrypting) or psa_cipher_set_iv(). + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_cipher_abort(). + * + * \param[in,out] operation Active cipher operation. + * \param[in] input Buffer containing the message fragment to + * encrypt or decrypt. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] output Buffer where the output is to be written. + * \param output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, with an IV set + * if required for the algorithm), or the library has not been + * previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_update(psa_cipher_operation_t *operation, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/** Finish encrypting or decrypting a message in a cipher operation. + * + * The application must call psa_cipher_encrypt_setup() or + * psa_cipher_decrypt_setup() before calling this function. The choice + * of setup function determines whether this function encrypts or + * decrypts its input. + * + * This function finishes the encryption or decryption of the message + * formed by concatenating the inputs passed to preceding calls to + * psa_cipher_update(). + * + * When this function returns successfully, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_cipher_abort(). + * + * \param[in,out] operation Active cipher operation. + * \param[out] output Buffer where the output is to be written. + * \param output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total input size passed to this operation is not valid for + * this particular algorithm. For example, the algorithm is a based + * on block cipher and requires a whole number of blocks, but the + * total input size is not a multiple of the block size. + * \retval #PSA_ERROR_INVALID_PADDING + * This is a decryption operation for an algorithm that includes + * padding, and the ciphertext does not contain valid padding. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, with an IV set + * if required for the algorithm), or the library has not been + * previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/** Abort a cipher operation. + * + * Aborting an operation frees all associated resources except for the + * \p operation structure itself. Once aborted, the operation object + * can be reused for another operation by calling + * psa_cipher_encrypt_setup() or psa_cipher_decrypt_setup() again. + * + * You may call this function any time after the operation object has + * been initialized as described in #psa_cipher_operation_t. + * + * In particular, calling psa_cipher_abort() after the operation has been + * terminated by a call to psa_cipher_abort() or psa_cipher_finish() + * is safe and has no effect. + * + * \param[in,out] operation Initialized cipher operation. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation); + +/**@}*/ + +/** \defgroup aead Authenticated encryption with associated data (AEAD) + * @{ + */ + +/** Process an authenticated encryption operation. + * + * \param key Identifier of the key to use for the + * operation. It must allow the usage + * #PSA_KEY_USAGE_ENCRYPT. + * \param alg The AEAD algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * \param[in] nonce Nonce or IV to use. + * \param nonce_length Size of the \p nonce buffer in bytes. + * \param[in] additional_data Additional data that will be authenticated + * but not encrypted. + * \param additional_data_length Size of \p additional_data in bytes. + * \param[in] plaintext Data that will be authenticated and + * encrypted. + * \param plaintext_length Size of \p plaintext in bytes. + * \param[out] ciphertext Output buffer for the authenticated and + * encrypted data. The additional data is not + * part of this output. For algorithms where the + * encrypted data and the authentication tag + * are defined as separate outputs, the + * authentication tag is appended to the + * encrypted data. + * \param ciphertext_size Size of the \p ciphertext buffer in bytes. + * This must be appropriate for the selected + * algorithm and key: + * - A sufficient output size is + * #PSA_AEAD_ENCRYPT_OUTPUT_SIZE(\c key_type, + * \p alg, \p plaintext_length) where + * \c key_type is the type of \p key. + * - #PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE(\p + * plaintext_length) evaluates to the maximum + * ciphertext size of any supported AEAD + * encryption. + * \param[out] ciphertext_length On success, the size of the output + * in the \p ciphertext buffer. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p key is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not an AEAD algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \p ciphertext_size is too small. + * #PSA_AEAD_ENCRYPT_OUTPUT_SIZE(\c key_type, \p alg, + * \p plaintext_length) or + * #PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE(\p plaintext_length) can be used to + * determine the required buffer size. + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_encrypt(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *nonce, + size_t nonce_length, + const uint8_t *additional_data, + size_t additional_data_length, + const uint8_t *plaintext, + size_t plaintext_length, + uint8_t *ciphertext, + size_t ciphertext_size, + size_t *ciphertext_length); + +/** Process an authenticated decryption operation. + * + * \param key Identifier of the key to use for the + * operation. It must allow the usage + * #PSA_KEY_USAGE_DECRYPT. + * \param alg The AEAD algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * \param[in] nonce Nonce or IV to use. + * \param nonce_length Size of the \p nonce buffer in bytes. + * \param[in] additional_data Additional data that has been authenticated + * but not encrypted. + * \param additional_data_length Size of \p additional_data in bytes. + * \param[in] ciphertext Data that has been authenticated and + * encrypted. For algorithms where the + * encrypted data and the authentication tag + * are defined as separate inputs, the buffer + * must contain the encrypted data followed + * by the authentication tag. + * \param ciphertext_length Size of \p ciphertext in bytes. + * \param[out] plaintext Output buffer for the decrypted data. + * \param plaintext_size Size of the \p plaintext buffer in bytes. + * This must be appropriate for the selected + * algorithm and key: + * - A sufficient output size is + * #PSA_AEAD_DECRYPT_OUTPUT_SIZE(\c key_type, + * \p alg, \p ciphertext_length) where + * \c key_type is the type of \p key. + * - #PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE(\p + * ciphertext_length) evaluates to the maximum + * plaintext size of any supported AEAD + * decryption. + * \param[out] plaintext_length On success, the size of the output + * in the \p plaintext buffer. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The ciphertext is not authentic. + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p key is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not an AEAD algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \p plaintext_size is too small. + * #PSA_AEAD_DECRYPT_OUTPUT_SIZE(\c key_type, \p alg, + * \p ciphertext_length) or + * #PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE(\p ciphertext_length) can be used + * to determine the required buffer size. + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_decrypt(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *nonce, + size_t nonce_length, + const uint8_t *additional_data, + size_t additional_data_length, + const uint8_t *ciphertext, + size_t ciphertext_length, + uint8_t *plaintext, + size_t plaintext_size, + size_t *plaintext_length); + +/** The type of the state data structure for multipart AEAD operations. + * + * Before calling any function on an AEAD operation object, the application + * must initialize it by any of the following means: + * - Set the structure to all-bits-zero, for example: + * \code + * psa_aead_operation_t operation; + * memset(&operation, 0, sizeof(operation)); + * \endcode + * - Initialize the structure to logical zero values, for example: + * \code + * psa_aead_operation_t operation = {0}; + * \endcode + * - Initialize the structure to the initializer #PSA_AEAD_OPERATION_INIT, + * for example: + * \code + * psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT; + * \endcode + * - Assign the result of the function psa_aead_operation_init() + * to the structure, for example: + * \code + * psa_aead_operation_t operation; + * operation = psa_aead_operation_init(); + * \endcode + * + * This is an implementation-defined \c struct. Applications should not + * make any assumptions about the content of this structure except + * as directed by the documentation of a specific implementation. */ +typedef struct psa_aead_operation_s psa_aead_operation_t; + +/** \def PSA_AEAD_OPERATION_INIT + * + * This macro returns a suitable initializer for an AEAD operation object of + * type #psa_aead_operation_t. + */ +#ifdef __DOXYGEN_ONLY__ +/* This is an example definition for documentation purposes. + * Implementations should define a suitable value in `crypto_struct.h`. + */ +#define PSA_AEAD_OPERATION_INIT { 0 } +#endif + +/** Return an initial value for an AEAD operation object. + */ +static psa_aead_operation_t psa_aead_operation_init(void); + +/** Set the key for a multipart authenticated encryption operation. + * + * The sequence of operations to encrypt a message with authentication + * is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_aead_operation_t, e.g. + * #PSA_AEAD_OPERATION_INIT. + * -# Call psa_aead_encrypt_setup() to specify the algorithm and key. + * -# If needed, call psa_aead_set_lengths() to specify the length of the + * inputs to the subsequent calls to psa_aead_update_ad() and + * psa_aead_update(). See the documentation of psa_aead_set_lengths() + * for details. + * -# Call either psa_aead_generate_nonce() or psa_aead_set_nonce() to + * generate or set the nonce. You should use + * psa_aead_generate_nonce() unless the protocol you are implementing + * requires a specific nonce value. + * -# Call psa_aead_update_ad() zero, one or more times, passing a fragment + * of the non-encrypted additional authenticated data each time. + * -# Call psa_aead_update() zero, one or more times, passing a fragment + * of the message to encrypt each time. + * -# Call psa_aead_finish(). + * + * If an error occurs at any step after a call to psa_aead_encrypt_setup(), + * the operation will need to be reset by a call to psa_aead_abort(). The + * application may call psa_aead_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_aead_encrypt_setup(), the application must + * eventually terminate the operation. The following events terminate an + * operation: + * - A successful call to psa_aead_finish(). + * - A call to psa_aead_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_aead_operation_t and not yet in use. + * \param key Identifier of the key to use for the operation. + * It must remain valid until the operation + * terminates. It must allow the usage + * #PSA_KEY_USAGE_ENCRYPT. + * \param alg The AEAD algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive), or + * the library has not been previously initialized by psa_crypto_init(). + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p key is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not an AEAD algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation, + mbedtls_svc_key_id_t key, + psa_algorithm_t alg); + +/** Set the key for a multipart authenticated decryption operation. + * + * The sequence of operations to decrypt a message with authentication + * is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_aead_operation_t, e.g. + * #PSA_AEAD_OPERATION_INIT. + * -# Call psa_aead_decrypt_setup() to specify the algorithm and key. + * -# If needed, call psa_aead_set_lengths() to specify the length of the + * inputs to the subsequent calls to psa_aead_update_ad() and + * psa_aead_update(). See the documentation of psa_aead_set_lengths() + * for details. + * -# Call psa_aead_set_nonce() with the nonce for the decryption. + * -# Call psa_aead_update_ad() zero, one or more times, passing a fragment + * of the non-encrypted additional authenticated data each time. + * -# Call psa_aead_update() zero, one or more times, passing a fragment + * of the ciphertext to decrypt each time. + * -# Call psa_aead_verify(). + * + * If an error occurs at any step after a call to psa_aead_decrypt_setup(), + * the operation will need to be reset by a call to psa_aead_abort(). The + * application may call psa_aead_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_aead_decrypt_setup(), the application must + * eventually terminate the operation. The following events terminate an + * operation: + * - A successful call to psa_aead_verify(). + * - A call to psa_aead_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_aead_operation_t and not yet in use. + * \param key Identifier of the key to use for the operation. + * It must remain valid until the operation + * terminates. It must allow the usage + * #PSA_KEY_USAGE_DECRYPT. + * \param alg The AEAD algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p key is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not an AEAD algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive), or the + * library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation, + mbedtls_svc_key_id_t key, + psa_algorithm_t alg); + +/** Generate a random nonce for an authenticated encryption operation. + * + * This function generates a random nonce for the authenticated encryption + * operation with an appropriate size for the chosen algorithm, key type + * and key size. + * + * The application must call psa_aead_encrypt_setup() before + * calling this function. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \param[in,out] operation Active AEAD operation. + * \param[out] nonce Buffer where the generated nonce is to be + * written. + * \param nonce_size Size of the \p nonce buffer in bytes. + * \param[out] nonce_length On success, the number of bytes of the + * generated nonce. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p nonce buffer is too small. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active aead encrypt + * operation, with no nonce set), or the library has not been + * previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation, + uint8_t *nonce, + size_t nonce_size, + size_t *nonce_length); + +/** Set the nonce for an authenticated encryption or decryption operation. + * + * This function sets the nonce for the authenticated + * encryption or decryption operation. + * + * The application must call psa_aead_encrypt_setup() or + * psa_aead_decrypt_setup() before calling this function. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \note When encrypting, applications should use psa_aead_generate_nonce() + * instead of this function, unless implementing a protocol that requires + * a non-random IV. + * + * \param[in,out] operation Active AEAD operation. + * \param[in] nonce Buffer containing the nonce to use. + * \param nonce_length Size of the nonce in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The size of \p nonce is not acceptable for the chosen algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, with no nonce + * set), or the library has not been previously initialized + * by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation, + const uint8_t *nonce, + size_t nonce_length); + +/** Declare the lengths of the message and additional data for AEAD. + * + * The application must call this function before calling + * psa_aead_update_ad() or psa_aead_update() if the algorithm for + * the operation requires it. If the algorithm does not require it, + * calling this function is optional, but if this function is called + * then the implementation must enforce the lengths. + * + * You may call this function before or after setting the nonce with + * psa_aead_set_nonce() or psa_aead_generate_nonce(). + * + * - For #PSA_ALG_CCM, calling this function is required. + * - For the other AEAD algorithms defined in this specification, calling + * this function is not required. + * - For vendor-defined algorithm, refer to the vendor documentation. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \param[in,out] operation Active AEAD operation. + * \param ad_length Size of the non-encrypted additional + * authenticated data in bytes. + * \param plaintext_length Size of the plaintext to encrypt in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * At least one of the lengths is not acceptable for the chosen + * algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, and + * psa_aead_update_ad() and psa_aead_update() must not have been + * called yet), or the library has not been previously initialized + * by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation, + size_t ad_length, + size_t plaintext_length); + +/** Pass additional data to an active AEAD operation. + * + * Additional data is authenticated, but not encrypted. + * + * You may call this function multiple times to pass successive fragments + * of the additional data. You may not call this function after passing + * data to encrypt or decrypt with psa_aead_update(). + * + * Before calling this function, you must: + * 1. Call either psa_aead_encrypt_setup() or psa_aead_decrypt_setup(). + * 2. Set the nonce with psa_aead_generate_nonce() or psa_aead_set_nonce(). + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \warning When decrypting, until psa_aead_verify() has returned #PSA_SUCCESS, + * there is no guarantee that the input is valid. Therefore, until + * you have called psa_aead_verify() and it has returned #PSA_SUCCESS, + * treat the input as untrusted and prepare to undo any action that + * depends on the input if psa_aead_verify() returns an error status. + * + * \param[in,out] operation Active AEAD operation. + * \param[in] input Buffer containing the fragment of + * additional data. + * \param input_length Size of the \p input buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total input length overflows the additional data length that + * was previously specified with psa_aead_set_lengths(). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, have a nonce + * set, have lengths set if required by the algorithm, and + * psa_aead_update() must not have been called yet), or the library + * has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation, + const uint8_t *input, + size_t input_length); + +/** Encrypt or decrypt a message fragment in an active AEAD operation. + * + * Before calling this function, you must: + * 1. Call either psa_aead_encrypt_setup() or psa_aead_decrypt_setup(). + * The choice of setup function determines whether this function + * encrypts or decrypts its input. + * 2. Set the nonce with psa_aead_generate_nonce() or psa_aead_set_nonce(). + * 3. Call psa_aead_update_ad() to pass all the additional data. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \warning When decrypting, until psa_aead_verify() has returned #PSA_SUCCESS, + * there is no guarantee that the input is valid. Therefore, until + * you have called psa_aead_verify() and it has returned #PSA_SUCCESS: + * - Do not use the output in any way other than storing it in a + * confidential location. If you take any action that depends + * on the tentative decrypted data, this action will need to be + * undone if the input turns out not to be valid. Furthermore, + * if an adversary can observe that this action took place + * (for example through timing), they may be able to use this + * fact as an oracle to decrypt any message encrypted with the + * same key. + * - In particular, do not copy the output anywhere but to a + * memory or storage space that you have exclusive access to. + * + * This function does not require the input to be aligned to any + * particular block boundary. If the implementation can only process + * a whole block at a time, it must consume all the input provided, but + * it may delay the end of the corresponding output until a subsequent + * call to psa_aead_update(), psa_aead_finish() or psa_aead_verify() + * provides sufficient input. The amount of data that can be delayed + * in this way is bounded by #PSA_AEAD_UPDATE_OUTPUT_SIZE. + * + * \param[in,out] operation Active AEAD operation. + * \param[in] input Buffer containing the message fragment to + * encrypt or decrypt. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] output Buffer where the output is to be written. + * \param output_size Size of the \p output buffer in bytes. + * This must be appropriate for the selected + * algorithm and key: + * - A sufficient output size is + * #PSA_AEAD_UPDATE_OUTPUT_SIZE(\c key_type, + * \c alg, \p input_length) where + * \c key_type is the type of key and \c alg is + * the algorithm that were used to set up the + * operation. + * - #PSA_AEAD_UPDATE_OUTPUT_MAX_SIZE(\p + * input_length) evaluates to the maximum + * output size of any supported AEAD + * algorithm. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. + * #PSA_AEAD_UPDATE_OUTPUT_SIZE(\c key_type, \c alg, \p input_length) or + * #PSA_AEAD_UPDATE_OUTPUT_MAX_SIZE(\p input_length) can be used to + * determine the required buffer size. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total length of input to psa_aead_update_ad() so far is + * less than the additional data length that was previously + * specified with psa_aead_set_lengths(), or + * the total input length overflows the plaintext length that + * was previously specified with psa_aead_set_lengths(). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, have a nonce + * set, and have lengths set if required by the algorithm), or the + * library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_update(psa_aead_operation_t *operation, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/** Finish encrypting a message in an AEAD operation. + * + * The operation must have been set up with psa_aead_encrypt_setup(). + * + * This function finishes the authentication of the additional data + * formed by concatenating the inputs passed to preceding calls to + * psa_aead_update_ad() with the plaintext formed by concatenating the + * inputs passed to preceding calls to psa_aead_update(). + * + * This function has two output buffers: + * - \p ciphertext contains trailing ciphertext that was buffered from + * preceding calls to psa_aead_update(). + * - \p tag contains the authentication tag. + * + * When this function returns successfully, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \param[in,out] operation Active AEAD operation. + * \param[out] ciphertext Buffer where the last part of the ciphertext + * is to be written. + * \param ciphertext_size Size of the \p ciphertext buffer in bytes. + * This must be appropriate for the selected + * algorithm and key: + * - A sufficient output size is + * #PSA_AEAD_FINISH_OUTPUT_SIZE(\c key_type, + * \c alg) where \c key_type is the type of key + * and \c alg is the algorithm that were used to + * set up the operation. + * - #PSA_AEAD_FINISH_OUTPUT_MAX_SIZE evaluates to + * the maximum output size of any supported AEAD + * algorithm. + * \param[out] ciphertext_length On success, the number of bytes of + * returned ciphertext. + * \param[out] tag Buffer where the authentication tag is + * to be written. + * \param tag_size Size of the \p tag buffer in bytes. + * This must be appropriate for the selected + * algorithm and key: + * - The exact tag size is #PSA_AEAD_TAG_LENGTH(\c + * key_type, \c key_bits, \c alg) where + * \c key_type and \c key_bits are the type and + * bit-size of the key, and \c alg is the + * algorithm that were used in the call to + * psa_aead_encrypt_setup(). + * - #PSA_AEAD_TAG_MAX_SIZE evaluates to the + * maximum tag size of any supported AEAD + * algorithm. + * \param[out] tag_length On success, the number of bytes + * that make up the returned tag. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p ciphertext or \p tag buffer is too small. + * #PSA_AEAD_FINISH_OUTPUT_SIZE(\c key_type, \c alg) or + * #PSA_AEAD_FINISH_OUTPUT_MAX_SIZE can be used to determine the + * required \p ciphertext buffer size. #PSA_AEAD_TAG_LENGTH(\c key_type, + * \c key_bits, \c alg) or #PSA_AEAD_TAG_MAX_SIZE can be used to + * determine the required \p tag buffer size. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total length of input to psa_aead_update_ad() so far is + * less than the additional data length that was previously + * specified with psa_aead_set_lengths(), or + * the total length of input to psa_aead_update() so far is + * less than the plaintext length that was previously + * specified with psa_aead_set_lengths(). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active encryption + * operation with a nonce set), or the library has not been previously + * initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_finish(psa_aead_operation_t *operation, + uint8_t *ciphertext, + size_t ciphertext_size, + size_t *ciphertext_length, + uint8_t *tag, + size_t tag_size, + size_t *tag_length); + +/** Finish authenticating and decrypting a message in an AEAD operation. + * + * The operation must have been set up with psa_aead_decrypt_setup(). + * + * This function finishes the authenticated decryption of the message + * components: + * + * - The additional data consisting of the concatenation of the inputs + * passed to preceding calls to psa_aead_update_ad(). + * - The ciphertext consisting of the concatenation of the inputs passed to + * preceding calls to psa_aead_update(). + * - The tag passed to this function call. + * + * If the authentication tag is correct, this function outputs any remaining + * plaintext and reports success. If the authentication tag is not correct, + * this function returns #PSA_ERROR_INVALID_SIGNATURE. + * + * When this function returns successfully, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \note Implementations shall make the best effort to ensure that the + * comparison between the actual tag and the expected tag is performed + * in constant time. + * + * \param[in,out] operation Active AEAD operation. + * \param[out] plaintext Buffer where the last part of the plaintext + * is to be written. This is the remaining data + * from previous calls to psa_aead_update() + * that could not be processed until the end + * of the input. + * \param plaintext_size Size of the \p plaintext buffer in bytes. + * This must be appropriate for the selected algorithm and key: + * - A sufficient output size is + * #PSA_AEAD_VERIFY_OUTPUT_SIZE(\c key_type, + * \c alg) where \c key_type is the type of key + * and \c alg is the algorithm that were used to + * set up the operation. + * - #PSA_AEAD_VERIFY_OUTPUT_MAX_SIZE evaluates to + * the maximum output size of any supported AEAD + * algorithm. + * \param[out] plaintext_length On success, the number of bytes of + * returned plaintext. + * \param[in] tag Buffer containing the authentication tag. + * \param tag_length Size of the \p tag buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The calculations were successful, but the authentication tag is + * not correct. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p plaintext buffer is too small. + * #PSA_AEAD_VERIFY_OUTPUT_SIZE(\c key_type, \c alg) or + * #PSA_AEAD_VERIFY_OUTPUT_MAX_SIZE can be used to determine the + * required buffer size. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total length of input to psa_aead_update_ad() so far is + * less than the additional data length that was previously + * specified with psa_aead_set_lengths(), or + * the total length of input to psa_aead_update() so far is + * less than the plaintext length that was previously + * specified with psa_aead_set_lengths(). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active decryption + * operation with a nonce set), or the library has not been previously + * initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_verify(psa_aead_operation_t *operation, + uint8_t *plaintext, + size_t plaintext_size, + size_t *plaintext_length, + const uint8_t *tag, + size_t tag_length); + +/** Abort an AEAD operation. + * + * Aborting an operation frees all associated resources except for the + * \p operation structure itself. Once aborted, the operation object + * can be reused for another operation by calling + * psa_aead_encrypt_setup() or psa_aead_decrypt_setup() again. + * + * You may call this function any time after the operation object has + * been initialized as described in #psa_aead_operation_t. + * + * In particular, calling psa_aead_abort() after the operation has been + * terminated by a call to psa_aead_abort(), psa_aead_finish() or + * psa_aead_verify() is safe and has no effect. + * + * \param[in,out] operation Initialized AEAD operation. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_abort(psa_aead_operation_t *operation); + +/**@}*/ + +/** \defgroup asymmetric Asymmetric cryptography + * @{ + */ + +/** + * \brief Sign a message with a private key. For hash-and-sign algorithms, + * this includes the hashing step. + * + * \note To perform a multi-part hash-and-sign signature algorithm, first use + * a multi-part hash operation and then pass the resulting hash to + * psa_sign_hash(). PSA_ALG_SIGN_GET_HASH(\p alg) can be used to determine the + * hash algorithm to use. + * + * \param[in] key Identifier of the key to use for the operation. + * It must be an asymmetric key pair. The key must + * allow the usage #PSA_KEY_USAGE_SIGN_MESSAGE. + * \param[in] alg An asymmetric signature algorithm (PSA_ALG_XXX + * value such that #PSA_ALG_IS_SIGN_MESSAGE(\p alg) + * is true), that is compatible with the type of + * \p key. + * \param[in] input The input message to sign. + * \param[in] input_length Size of the \p input buffer in bytes. + * \param[out] signature Buffer where the signature is to be written. + * \param[in] signature_size Size of the \p signature buffer in bytes. This + * must be appropriate for the selected + * algorithm and key: + * - The required signature size is + * #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg) + * where \c key_type and \c key_bits are the type and + * bit-size respectively of key. + * - #PSA_SIGNATURE_MAX_SIZE evaluates to the + * maximum signature size of any supported + * signature algorithm. + * \param[out] signature_length On success, the number of bytes that make up + * the returned signature value. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED + * The key does not have the #PSA_KEY_USAGE_SIGN_MESSAGE flag, + * or it does not permit the requested algorithm. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p signature buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg) + * where \c key_type and \c key_bits are the type and bit-size + * respectively of \p key. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_sign_message(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *signature, + size_t signature_size, + size_t *signature_length); + +/** \brief Verify the signature of a message with a public key, using + * a hash-and-sign verification algorithm. + * + * \note To perform a multi-part hash-and-sign signature verification + * algorithm, first use a multi-part hash operation to hash the message + * and then pass the resulting hash to psa_verify_hash(). + * PSA_ALG_SIGN_GET_HASH(\p alg) can be used to determine the hash algorithm + * to use. + * + * \param[in] key Identifier of the key to use for the operation. + * It must be a public key or an asymmetric key + * pair. The key must allow the usage + * #PSA_KEY_USAGE_VERIFY_MESSAGE. + * \param[in] alg An asymmetric signature algorithm (PSA_ALG_XXX + * value such that #PSA_ALG_IS_SIGN_MESSAGE(\p alg) + * is true), that is compatible with the type of + * \p key. + * \param[in] input The message whose signature is to be verified. + * \param[in] input_length Size of the \p input buffer in bytes. + * \param[in] signature Buffer containing the signature to verify. + * \param[in] signature_length Size of the \p signature buffer in bytes. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED + * The key does not have the #PSA_KEY_USAGE_SIGN_MESSAGE flag, + * or it does not permit the requested algorithm. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The calculation was performed successfully, but the passed signature + * is not a valid signature. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_verify_message(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *signature, + size_t signature_length); + +/** + * \brief Sign a hash or short message with a private key. + * + * Note that to perform a hash-and-sign signature algorithm, you must + * first calculate the hash by calling psa_hash_setup(), psa_hash_update() + * and psa_hash_finish(), or alternatively by calling psa_hash_compute(). + * Then pass the resulting hash as the \p hash + * parameter to this function. You can use #PSA_ALG_SIGN_GET_HASH(\p alg) + * to determine the hash algorithm to use. + * + * \param key Identifier of the key to use for the operation. + * It must be an asymmetric key pair. The key must + * allow the usage #PSA_KEY_USAGE_SIGN_HASH. + * \param alg A signature algorithm (PSA_ALG_XXX + * value such that #PSA_ALG_IS_SIGN_HASH(\p alg) + * is true), that is compatible with + * the type of \p key. + * \param[in] hash The hash or message to sign. + * \param hash_length Size of the \p hash buffer in bytes. + * \param[out] signature Buffer where the signature is to be written. + * \param signature_size Size of the \p signature buffer in bytes. + * \param[out] signature_length On success, the number of bytes + * that make up the returned signature value. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p signature buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg) + * where \c key_type and \c key_bits are the type and bit-size + * respectively of \p key. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_sign_hash(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *hash, + size_t hash_length, + uint8_t *signature, + size_t signature_size, + size_t *signature_length); + +/** + * \brief Verify the signature of a hash or short message using a public key. + * + * Note that to perform a hash-and-sign signature algorithm, you must + * first calculate the hash by calling psa_hash_setup(), psa_hash_update() + * and psa_hash_finish(), or alternatively by calling psa_hash_compute(). + * Then pass the resulting hash as the \p hash + * parameter to this function. You can use #PSA_ALG_SIGN_GET_HASH(\p alg) + * to determine the hash algorithm to use. + * + * \param key Identifier of the key to use for the operation. It + * must be a public key or an asymmetric key pair. The + * key must allow the usage + * #PSA_KEY_USAGE_VERIFY_HASH. + * \param alg A signature algorithm (PSA_ALG_XXX + * value such that #PSA_ALG_IS_SIGN_HASH(\p alg) + * is true), that is compatible with + * the type of \p key. + * \param[in] hash The hash or message whose signature is to be + * verified. + * \param hash_length Size of the \p hash buffer in bytes. + * \param[in] signature Buffer containing the signature to verify. + * \param signature_length Size of the \p signature buffer in bytes. + * + * \retval #PSA_SUCCESS + * The signature is valid. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The calculation was performed successfully, but the passed + * signature is not a valid signature. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_verify_hash(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *hash, + size_t hash_length, + const uint8_t *signature, + size_t signature_length); + +/** + * \brief Encrypt a short message with a public key. + * + * \param key Identifier of the key to use for the operation. + * It must be a public key or an asymmetric key + * pair. It must allow the usage + * #PSA_KEY_USAGE_ENCRYPT. + * \param alg An asymmetric encryption algorithm that is + * compatible with the type of \p key. + * \param[in] input The message to encrypt. + * \param input_length Size of the \p input buffer in bytes. + * \param[in] salt A salt or label, if supported by the + * encryption algorithm. + * If the algorithm does not support a + * salt, pass \c NULL. + * If the algorithm supports an optional + * salt and you do not want to pass a salt, + * pass \c NULL. + * + * - For #PSA_ALG_RSA_PKCS1V15_CRYPT, no salt is + * supported. + * \param salt_length Size of the \p salt buffer in bytes. + * If \p salt is \c NULL, pass 0. + * \param[out] output Buffer where the encrypted message is to + * be written. + * \param output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg) + * where \c key_type and \c key_bits are the type and bit-size + * respectively of \p key. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_asymmetric_encrypt(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *salt, + size_t salt_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/** + * \brief Decrypt a short message with a private key. + * + * \param key Identifier of the key to use for the operation. + * It must be an asymmetric key pair. It must + * allow the usage #PSA_KEY_USAGE_DECRYPT. + * \param alg An asymmetric encryption algorithm that is + * compatible with the type of \p key. + * \param[in] input The message to decrypt. + * \param input_length Size of the \p input buffer in bytes. + * \param[in] salt A salt or label, if supported by the + * encryption algorithm. + * If the algorithm does not support a + * salt, pass \c NULL. + * If the algorithm supports an optional + * salt and you do not want to pass a salt, + * pass \c NULL. + * + * - For #PSA_ALG_RSA_PKCS1V15_CRYPT, no salt is + * supported. + * \param salt_length Size of the \p salt buffer in bytes. + * If \p salt is \c NULL, pass 0. + * \param[out] output Buffer where the decrypted message is to + * be written. + * \param output_size Size of the \c output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg) + * where \c key_type and \c key_bits are the type and bit-size + * respectively of \p key. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + * \retval #PSA_ERROR_INVALID_PADDING \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_asymmetric_decrypt(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *salt, + size_t salt_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/**@}*/ + +/** \defgroup key_derivation Key derivation and pseudorandom generation + * @{ + */ + +/** The type of the state data structure for key derivation operations. + * + * Before calling any function on a key derivation operation object, the + * application must initialize it by any of the following means: + * - Set the structure to all-bits-zero, for example: + * \code + * psa_key_derivation_operation_t operation; + * memset(&operation, 0, sizeof(operation)); + * \endcode + * - Initialize the structure to logical zero values, for example: + * \code + * psa_key_derivation_operation_t operation = {0}; + * \endcode + * - Initialize the structure to the initializer #PSA_KEY_DERIVATION_OPERATION_INIT, + * for example: + * \code + * psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT; + * \endcode + * - Assign the result of the function psa_key_derivation_operation_init() + * to the structure, for example: + * \code + * psa_key_derivation_operation_t operation; + * operation = psa_key_derivation_operation_init(); + * \endcode + * + * This is an implementation-defined \c struct. Applications should not + * make any assumptions about the content of this structure except + * as directed by the documentation of a specific implementation. + */ +typedef struct psa_key_derivation_s psa_key_derivation_operation_t; + +/** \def PSA_KEY_DERIVATION_OPERATION_INIT + * + * This macro returns a suitable initializer for a key derivation operation + * object of type #psa_key_derivation_operation_t. + */ +#ifdef __DOXYGEN_ONLY__ +/* This is an example definition for documentation purposes. + * Implementations should define a suitable value in `crypto_struct.h`. + */ +#define PSA_KEY_DERIVATION_OPERATION_INIT { 0 } +#endif + +/** Return an initial value for a key derivation operation object. + */ +static psa_key_derivation_operation_t psa_key_derivation_operation_init(void); + +/** Set up a key derivation operation. + * + * A key derivation algorithm takes some inputs and uses them to generate + * a byte stream in a deterministic way. + * This byte stream can be used to produce keys and other + * cryptographic material. + * + * To derive a key: + * -# Start with an initialized object of type #psa_key_derivation_operation_t. + * -# Call psa_key_derivation_setup() to select the algorithm. + * -# Provide the inputs for the key derivation by calling + * psa_key_derivation_input_bytes() or psa_key_derivation_input_key() + * as appropriate. Which inputs are needed, in what order, and whether + * they may be keys and if so of what type depends on the algorithm. + * -# Optionally set the operation's maximum capacity with + * psa_key_derivation_set_capacity(). You may do this before, in the middle + * of or after providing inputs. For some algorithms, this step is mandatory + * because the output depends on the maximum capacity. + * -# To derive a key, call psa_key_derivation_output_key(). + * To derive a byte string for a different purpose, call + * psa_key_derivation_output_bytes(). + * Successive calls to these functions use successive output bytes + * calculated by the key derivation algorithm. + * -# Clean up the key derivation operation object with + * psa_key_derivation_abort(). + * + * If this function returns an error, the key derivation operation object is + * not changed. + * + * If an error occurs at any step after a call to psa_key_derivation_setup(), + * the operation will need to be reset by a call to psa_key_derivation_abort(). + * + * Implementations must reject an attempt to derive a key of size 0. + * + * \param[in,out] operation The key derivation operation object + * to set up. It must + * have been initialized but not set up yet. + * \param alg The key derivation algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_KEY_DERIVATION(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c alg is not a key derivation algorithm. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \c alg is not supported or is not a key derivation algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive), or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_setup( + psa_key_derivation_operation_t *operation, + psa_algorithm_t alg); + +/** Retrieve the current capacity of a key derivation operation. + * + * The capacity of a key derivation is the maximum number of bytes that it can + * return. When you get *N* bytes of output from a key derivation operation, + * this reduces its capacity by *N*. + * + * \param[in] operation The operation to query. + * \param[out] capacity On success, the capacity of the operation. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active), or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_get_capacity( + const psa_key_derivation_operation_t *operation, + size_t *capacity); + +/** Set the maximum capacity of a key derivation operation. + * + * The capacity of a key derivation operation is the maximum number of bytes + * that the key derivation operation can return from this point onwards. + * + * \param[in,out] operation The key derivation operation object to modify. + * \param capacity The new capacity of the operation. + * It must be less or equal to the operation's + * current capacity. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p capacity is larger than the operation's current capacity. + * In this case, the operation object remains valid and its capacity + * remains unchanged. + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active), or the + * library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_set_capacity( + psa_key_derivation_operation_t *operation, + size_t capacity); + +/** Use the maximum possible capacity for a key derivation operation. + * + * Use this value as the capacity argument when setting up a key derivation + * to indicate that the operation should have the maximum possible capacity. + * The value of the maximum possible capacity depends on the key derivation + * algorithm. + */ +#define PSA_KEY_DERIVATION_UNLIMITED_CAPACITY ((size_t) (-1)) + +/** Provide an input for key derivation or key agreement. + * + * Which inputs are required and in what order depends on the algorithm. + * Refer to the documentation of each key derivation or key agreement + * algorithm for information. + * + * This function passes direct inputs, which is usually correct for + * non-secret inputs. To pass a secret input, which should be in a key + * object, call psa_key_derivation_input_key() instead of this function. + * Refer to the documentation of individual step types + * (`PSA_KEY_DERIVATION_INPUT_xxx` values of type ::psa_key_derivation_step_t) + * for more information. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_key_derivation_abort(). + * + * \param[in,out] operation The key derivation operation object to use. + * It must have been set up with + * psa_key_derivation_setup() and must not + * have produced any output yet. + * \param step Which step the input data is for. + * \param[in] data Input data to use. + * \param data_length Size of the \p data buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c step is not compatible with the operation's algorithm, or + * \c step does not allow direct inputs. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid for this input \p step, or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_input_bytes( + psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + const uint8_t *data, + size_t data_length); + +/** Provide an input for key derivation in the form of a key. + * + * Which inputs are required and in what order depends on the algorithm. + * Refer to the documentation of each key derivation or key agreement + * algorithm for information. + * + * This function obtains input from a key object, which is usually correct for + * secret inputs or for non-secret personalization strings kept in the key + * store. To pass a non-secret parameter which is not in the key store, + * call psa_key_derivation_input_bytes() instead of this function. + * Refer to the documentation of individual step types + * (`PSA_KEY_DERIVATION_INPUT_xxx` values of type ::psa_key_derivation_step_t) + * for more information. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_key_derivation_abort(). + * + * \param[in,out] operation The key derivation operation object to use. + * It must have been set up with + * psa_key_derivation_setup() and must not + * have produced any output yet. + * \param step Which step the input data is for. + * \param key Identifier of the key. It must have an + * appropriate type for step and must allow the + * usage #PSA_KEY_USAGE_DERIVE. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c step is not compatible with the operation's algorithm, or + * \c step does not allow key inputs of the given type + * or does not allow key inputs at all. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid for this input \p step, or + * the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_input_key( + psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + mbedtls_svc_key_id_t key); + +/** Perform a key agreement and use the shared secret as input to a key + * derivation. + * + * A key agreement algorithm takes two inputs: a private key \p private_key + * a public key \p peer_key. + * The result of this function is passed as input to a key derivation. + * The output of this key derivation can be extracted by reading from the + * resulting operation to produce keys and other cryptographic material. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_key_derivation_abort(). + * + * \param[in,out] operation The key derivation operation object to use. + * It must have been set up with + * psa_key_derivation_setup() with a + * key agreement and derivation algorithm + * \c alg (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_KEY_AGREEMENT(\c alg) is true + * and #PSA_ALG_IS_RAW_KEY_AGREEMENT(\c alg) + * is false). + * The operation must be ready for an + * input of the type given by \p step. + * \param step Which step the input data is for. + * \param private_key Identifier of the private key to use. It must + * allow the usage #PSA_KEY_USAGE_DERIVE. + * \param[in] peer_key Public key of the peer. The peer key must be in the + * same format that psa_import_key() accepts for the + * public key type corresponding to the type of + * private_key. That is, this function performs the + * equivalent of + * #psa_import_key(..., + * `peer_key`, `peer_key_length`) where + * with key attributes indicating the public key + * type corresponding to the type of `private_key`. + * For example, for EC keys, this means that peer_key + * is interpreted as a point on the curve that the + * private key is on. The standard formats for public + * keys are documented in the documentation of + * psa_export_public_key(). + * \param peer_key_length Size of \p peer_key in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c private_key is not compatible with \c alg, + * or \p peer_key is not valid for \c alg or not compatible with + * \c private_key, or \c step does not allow an input resulting + * from a key agreement. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \c alg is not supported or is not a key derivation algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid for this key agreement \p step, + * or the library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_key_agreement( + psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + mbedtls_svc_key_id_t private_key, + const uint8_t *peer_key, + size_t peer_key_length); + +/** Read some data from a key derivation operation. + * + * This function calculates output bytes from a key derivation algorithm and + * return those bytes. + * If you view the key derivation's output as a stream of bytes, this + * function destructively reads the requested number of bytes from the + * stream. + * The operation's capacity decreases by the number of bytes read. + * + * If this function returns an error status other than + * #PSA_ERROR_INSUFFICIENT_DATA, the operation enters an error + * state and must be aborted by calling psa_key_derivation_abort(). + * + * \param[in,out] operation The key derivation operation object to read from. + * \param[out] output Buffer where the output will be written. + * \param output_length Number of bytes to output. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_DATA + * The operation's capacity was less than + * \p output_length bytes. Note that in this case, + * no output is written to the output buffer. + * The operation's capacity is set to 0, thus + * subsequent calls to this function will not + * succeed, even with a smaller output buffer. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active and completed + * all required input steps), or the library has not been previously + * initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_output_bytes( + psa_key_derivation_operation_t *operation, + uint8_t *output, + size_t output_length); + +/** Derive a key from an ongoing key derivation operation. + * + * This function calculates output bytes from a key derivation algorithm + * and uses those bytes to generate a key deterministically. + * The key's location, usage policy, type and size are taken from + * \p attributes. + * + * If you view the key derivation's output as a stream of bytes, this + * function destructively reads as many bytes as required from the + * stream. + * The operation's capacity decreases by the number of bytes read. + * + * If this function returns an error status other than + * #PSA_ERROR_INSUFFICIENT_DATA, the operation enters an error + * state and must be aborted by calling psa_key_derivation_abort(). + * + * How much output is produced and consumed from the operation, and how + * the key is derived, depends on the key type and on the key size + * (denoted \c bits below): + * + * - For key types for which the key is an arbitrary sequence of bytes + * of a given size, this function is functionally equivalent to + * calling #psa_key_derivation_output_bytes + * and passing the resulting output to #psa_import_key. + * However, this function has a security benefit: + * if the implementation provides an isolation boundary then + * the key material is not exposed outside the isolation boundary. + * As a consequence, for these key types, this function always consumes + * exactly (\c bits / 8) bytes from the operation. + * The following key types defined in this specification follow this scheme: + * + * - #PSA_KEY_TYPE_AES; + * - #PSA_KEY_TYPE_ARC4; + * - #PSA_KEY_TYPE_ARIA; + * - #PSA_KEY_TYPE_CAMELLIA; + * - #PSA_KEY_TYPE_DERIVE; + * - #PSA_KEY_TYPE_HMAC. + * + * - For ECC keys on a Montgomery elliptic curve + * (#PSA_KEY_TYPE_ECC_KEY_PAIR(\c curve) where \c curve designates a + * Montgomery curve), this function always draws a byte string whose + * length is determined by the curve, and sets the mandatory bits + * accordingly. That is: + * + * - Curve25519 (#PSA_ECC_FAMILY_MONTGOMERY, 255 bits): draw a 32-byte + * string and process it as specified in RFC 7748 §5. + * - Curve448 (#PSA_ECC_FAMILY_MONTGOMERY, 448 bits): draw a 56-byte + * string and process it as specified in RFC 7748 §5. + * + * - For key types for which the key is represented by a single sequence of + * \c bits bits with constraints as to which bit sequences are acceptable, + * this function draws a byte string of length (\c bits / 8) bytes rounded + * up to the nearest whole number of bytes. If the resulting byte string + * is acceptable, it becomes the key, otherwise the drawn bytes are discarded. + * This process is repeated until an acceptable byte string is drawn. + * The byte string drawn from the operation is interpreted as specified + * for the output produced by psa_export_key(). + * The following key types defined in this specification follow this scheme: + * + * - #PSA_KEY_TYPE_DES. + * Force-set the parity bits, but discard forbidden weak keys. + * For 2-key and 3-key triple-DES, the three keys are generated + * successively (for example, for 3-key triple-DES, + * if the first 8 bytes specify a weak key and the next 8 bytes do not, + * discard the first 8 bytes, use the next 8 bytes as the first key, + * and continue reading output from the operation to derive the other + * two keys). + * - Finite-field Diffie-Hellman keys (#PSA_KEY_TYPE_DH_KEY_PAIR(\c group) + * where \c group designates any Diffie-Hellman group) and + * ECC keys on a Weierstrass elliptic curve + * (#PSA_KEY_TYPE_ECC_KEY_PAIR(\c curve) where \c curve designates a + * Weierstrass curve). + * For these key types, interpret the byte string as integer + * in big-endian order. Discard it if it is not in the range + * [0, *N* - 2] where *N* is the boundary of the private key domain + * (the prime *p* for Diffie-Hellman, the subprime *q* for DSA, + * or the order of the curve's base point for ECC). + * Add 1 to the resulting integer and use this as the private key *x*. + * This method allows compliance to NIST standards, specifically + * the methods titled "key-pair generation by testing candidates" + * in NIST SP 800-56A §5.6.1.1.4 for Diffie-Hellman, + * in FIPS 186-4 §B.1.2 for DSA, and + * in NIST SP 800-56A §5.6.1.2.2 or + * FIPS 186-4 §B.4.2 for elliptic curve keys. + * + * - For other key types, including #PSA_KEY_TYPE_RSA_KEY_PAIR, + * the way in which the operation output is consumed is + * implementation-defined. + * + * In all cases, the data that is read is discarded from the operation. + * The operation's capacity is decreased by the number of bytes read. + * + * For algorithms that take an input step #PSA_KEY_DERIVATION_INPUT_SECRET, + * the input to that step must be provided with psa_key_derivation_input_key(). + * Future versions of this specification may include additional restrictions + * on the derived key based on the attributes and strength of the secret key. + * + * \param[in] attributes The attributes for the new key. + * \param[in,out] operation The key derivation operation object to read from. + * \param[out] key On success, an identifier for the newly created + * key. For persistent keys, this is the key + * identifier defined in \p attributes. + * \c 0 on failure. + * + * \retval #PSA_SUCCESS + * Success. + * If the key is persistent, the key material and the key's metadata + * have been saved to persistent storage. + * \retval #PSA_ERROR_ALREADY_EXISTS + * This is an attempt to create a persistent key, and there is + * already a persistent key with the given identifier. + * \retval #PSA_ERROR_INSUFFICIENT_DATA + * There was not enough data to create the desired key. + * Note that in this case, no output is written to the output buffer. + * The operation's capacity is set to 0, thus subsequent calls to + * this function will not succeed, even with a smaller output buffer. + * \retval #PSA_ERROR_NOT_SUPPORTED + * The key type or key size is not supported, either by the + * implementation in general or in this particular location. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The provided key attributes are not valid for the operation. + * \retval #PSA_ERROR_NOT_PERMITTED + * The #PSA_KEY_DERIVATION_INPUT_SECRET input was not provided through + * a key. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active and completed + * all required input steps), or the library has not been previously + * initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_output_key( + const psa_key_attributes_t *attributes, + psa_key_derivation_operation_t *operation, + mbedtls_svc_key_id_t *key); + +/** Abort a key derivation operation. + * + * Aborting an operation frees all associated resources except for the \c + * operation structure itself. Once aborted, the operation object can be reused + * for another operation by calling psa_key_derivation_setup() again. + * + * This function may be called at any time after the operation + * object has been initialized as described in #psa_key_derivation_operation_t. + * + * In particular, it is valid to call psa_key_derivation_abort() twice, or to + * call psa_key_derivation_abort() on an operation that has not been set up. + * + * \param[in,out] operation The operation to abort. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_abort( + psa_key_derivation_operation_t *operation); + +/** Perform a key agreement and return the raw shared secret. + * + * \warning The raw result of a key agreement algorithm such as finite-field + * Diffie-Hellman or elliptic curve Diffie-Hellman has biases and should + * not be used directly as key material. It should instead be passed as + * input to a key derivation algorithm. To chain a key agreement with + * a key derivation, use psa_key_derivation_key_agreement() and other + * functions from the key derivation interface. + * + * \param alg The key agreement algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_RAW_KEY_AGREEMENT(\p alg) + * is true). + * \param private_key Identifier of the private key to use. It must + * allow the usage #PSA_KEY_USAGE_DERIVE. + * \param[in] peer_key Public key of the peer. It must be + * in the same format that psa_import_key() + * accepts. The standard formats for public + * keys are documented in the documentation + * of psa_export_public_key(). + * \param peer_key_length Size of \p peer_key in bytes. + * \param[out] output Buffer where the decrypted message is to + * be written. + * \param output_size Size of the \c output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p alg is not a key agreement algorithm, or + * \p private_key is not compatible with \p alg, + * or \p peer_key is not valid for \p alg or not compatible with + * \p private_key. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \p output_size is too small + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not a supported key agreement algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_raw_key_agreement(psa_algorithm_t alg, + mbedtls_svc_key_id_t private_key, + const uint8_t *peer_key, + size_t peer_key_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/**@}*/ + +/** \defgroup random Random generation + * @{ + */ + +/** + * \brief Generate random bytes. + * + * \warning This function **can** fail! Callers MUST check the return status + * and MUST NOT use the content of the output buffer if the return + * status is not #PSA_SUCCESS. + * + * \note To generate a key, use psa_generate_key() instead. + * + * \param[out] output Output buffer for the generated data. + * \param output_size Number of bytes to generate and output. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_generate_random(uint8_t *output, + size_t output_size); + +/** + * \brief Generate a key or key pair. + * + * The key is generated randomly. + * Its location, usage policy, type and size are taken from \p attributes. + * + * Implementations must reject an attempt to generate a key of size 0. + * + * The following type-specific considerations apply: + * - For RSA keys (#PSA_KEY_TYPE_RSA_KEY_PAIR), + * the public exponent is 65537. + * The modulus is a product of two probabilistic primes + * between 2^{n-1} and 2^n where n is the bit size specified in the + * attributes. + * + * \param[in] attributes The attributes for the new key. + * \param[out] key On success, an identifier for the newly created + * key. For persistent keys, this is the key + * identifier defined in \p attributes. + * \c 0 on failure. + * + * \retval #PSA_SUCCESS + * Success. + * If the key is persistent, the key material and the key's metadata + * have been saved to persistent storage. + * \retval #PSA_ERROR_ALREADY_EXISTS + * This is an attempt to create a persistent key, and there is + * already a persistent key with the given identifier. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_generate_key(const psa_key_attributes_t *attributes, + mbedtls_svc_key_id_t *key); + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +/* The file "crypto_sizes.h" contains definitions for size calculation + * macros whose definitions are implementation-specific. */ +#include "crypto_sizes.h" + +/* The file "crypto_struct.h" contains definitions for + * implementation-specific structs that are declared above. */ +#include "crypto_struct.h" + +/* The file "crypto_extra.h" contains vendor-specific definitions. This + * can include vendor-defined algorithms, extra functions, etc. */ +#include "crypto_extra.h" + +#endif /* PSA_CRYPTO_H */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_builtin_composites.h b/ext/opcua_client/mbedtls/include/psa/crypto_builtin_composites.h new file mode 100644 index 0000000..f51ee1c --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_builtin_composites.h @@ -0,0 +1,70 @@ +/* + * Context structure declaration of the Mbed TLS software-based PSA drivers + * called through the PSA Crypto driver dispatch layer. + * This file contains the context structures of those algorithms which need to + * rely on other algorithms, i.e. are 'composite' algorithms. + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. + * + * \note This header and its content is not part of the Mbed TLS API and + * applications must not depend on it. Its main purpose is to define the + * multi-part state objects of the Mbed TLS software-based PSA drivers. The + * definition of these objects are then used by crypto_struct.h to define the + * implementation-defined types of PSA multi-part state objects. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_BUILTIN_COMPOSITES_H +#define PSA_CRYPTO_BUILTIN_COMPOSITES_H + +#include + +/* + * MAC multi-part operation definitions. + */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CMAC) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_HMAC) +#define MBEDTLS_PSA_BUILTIN_MAC +#endif + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_GCM) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_CCM) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305) +#define MBEDTLS_PSA_BUILTIN_AEAD 1 +#endif + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HMAC) || defined(PSA_CRYPTO_DRIVER_TEST) +typedef struct { + /** The HMAC algorithm in use */ + psa_algorithm_t alg; + /** The hash context. */ + struct psa_hash_operation_s hash_ctx; + /** The HMAC part of the context. */ + uint8_t opad[PSA_HMAC_MAX_HASH_BLOCK_SIZE]; +} mbedtls_psa_hmac_operation_t; + +#define MBEDTLS_PSA_HMAC_OPERATION_INIT { 0, PSA_HASH_OPERATION_INIT, { 0 } } +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HMAC */ + +#include "mbedtls/cmac.h" + +typedef struct { + psa_algorithm_t alg; + union { + unsigned dummy; /* Make the union non-empty even with no supported algorithms. */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HMAC) || defined(PSA_CRYPTO_DRIVER_TEST) + mbedtls_psa_hmac_operation_t hmac; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HMAC */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CMAC) || defined(PSA_CRYPTO_DRIVER_TEST) + mbedtls_cipher_context_t cmac; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CMAC */ + } ctx; +} mbedtls_psa_mac_operation_t; + +#define MBEDTLS_PSA_MAC_OPERATION_INIT { 0, { 0 } } + +#endif /* PSA_CRYPTO_BUILTIN_COMPOSITES_H */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_builtin_primitives.h b/ext/opcua_client/mbedtls/include/psa/crypto_builtin_primitives.h new file mode 100644 index 0000000..c5f620c --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_builtin_primitives.h @@ -0,0 +1,111 @@ +/* + * Context structure declaration of the Mbed TLS software-based PSA drivers + * called through the PSA Crypto driver dispatch layer. + * This file contains the context structures of those algorithms which do not + * rely on other algorithms, i.e. are 'primitive' algorithms. + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. + * + * \note This header and its content is not part of the Mbed TLS API and + * applications must not depend on it. Its main purpose is to define the + * multi-part state objects of the Mbed TLS software-based PSA drivers. The + * definition of these objects are then used by crypto_struct.h to define the + * implementation-defined types of PSA multi-part state objects. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_BUILTIN_PRIMITIVES_H +#define PSA_CRYPTO_BUILTIN_PRIMITIVES_H + +#include + +/* + * Hash multi-part operation definitions. + */ + +#include "mbedtls/md2.h" +#include "mbedtls/md4.h" +#include "mbedtls/md5.h" +#include "mbedtls/ripemd160.h" +#include "mbedtls/sha1.h" +#include "mbedtls/sha256.h" +#include "mbedtls/sha512.h" + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD2) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_MD4) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_MD5) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512) +#define MBEDTLS_PSA_BUILTIN_HASH +#endif + +typedef struct { + psa_algorithm_t alg; + union { + unsigned dummy; /* Make the union non-empty even with no supported algorithms. */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD2) + mbedtls_md2_context md2; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD4) + mbedtls_md4_context md4; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD5) + mbedtls_md5_context md5; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160) + mbedtls_ripemd160_context ripemd160; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1) + mbedtls_sha1_context sha1; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224) + mbedtls_sha256_context sha256; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384) + mbedtls_sha512_context sha512; +#endif + } ctx; +} mbedtls_psa_hash_operation_t; + +#define MBEDTLS_PSA_HASH_OPERATION_INIT { 0, { 0 } } + +/* + * Cipher multi-part operation definitions. + */ + +#include "mbedtls/cipher.h" + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_STREAM_CIPHER) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_CTR) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_CFB) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_OFB) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_ECB_NO_PADDING) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_CBC_NO_PADDING) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_CBC_PKCS7) +#define MBEDTLS_PSA_BUILTIN_CIPHER 1 +#endif + +typedef struct { + /* Context structure for the Mbed TLS cipher implementation. */ + psa_algorithm_t alg; + uint8_t iv_length; + uint8_t block_length; + union { + unsigned int dummy; + mbedtls_cipher_context_t cipher; + } ctx; +} mbedtls_psa_cipher_operation_t; + +#define MBEDTLS_PSA_CIPHER_OPERATION_INIT { 0, 0, 0, { 0 } } + +#endif /* PSA_CRYPTO_BUILTIN_PRIMITIVES_H */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_compat.h b/ext/opcua_client/mbedtls/include/psa/crypto_compat.h new file mode 100644 index 0000000..f014633 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_compat.h @@ -0,0 +1,518 @@ +/** + * \file psa/crypto_compat.h + * + * \brief PSA cryptography module: Backward compatibility aliases + * + * This header declares alternative names for macro and functions. + * New application code should not use these names. + * These names may be removed in a future version of Mbed TLS. + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_COMPAT_H +#define PSA_CRYPTO_COMPAT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * To support both openless APIs and psa_open_key() temporarily, define + * psa_key_handle_t to be equal to mbedtls_svc_key_id_t. Do not mark the + * type and its utility macros and functions deprecated yet. This will be done + * in a subsequent phase. + */ +typedef mbedtls_svc_key_id_t psa_key_handle_t; + +#define PSA_KEY_HANDLE_INIT MBEDTLS_SVC_KEY_ID_INIT + +/** Check whether a handle is null. + * + * \param handle Handle + * + * \return Non-zero if the handle is null, zero otherwise. + */ +static inline int psa_key_handle_is_null(psa_key_handle_t handle) +{ + return mbedtls_svc_key_id_is_null(handle); +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) + +/* + * Mechanism for declaring deprecated values + */ +#if defined(MBEDTLS_DEPRECATED_WARNING) && !defined(MBEDTLS_PSA_DEPRECATED) +#define MBEDTLS_PSA_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_PSA_DEPRECATED +#endif + +typedef MBEDTLS_PSA_DEPRECATED size_t mbedtls_deprecated_size_t; +typedef MBEDTLS_PSA_DEPRECATED psa_status_t mbedtls_deprecated_psa_status_t; +typedef MBEDTLS_PSA_DEPRECATED psa_key_usage_t mbedtls_deprecated_psa_key_usage_t; +typedef MBEDTLS_PSA_DEPRECATED psa_ecc_family_t mbedtls_deprecated_psa_ecc_family_t; +typedef MBEDTLS_PSA_DEPRECATED psa_dh_family_t mbedtls_deprecated_psa_dh_family_t; +typedef MBEDTLS_PSA_DEPRECATED psa_ecc_family_t psa_ecc_curve_t; +typedef MBEDTLS_PSA_DEPRECATED psa_dh_family_t psa_dh_group_t; +typedef MBEDTLS_PSA_DEPRECATED psa_algorithm_t mbedtls_deprecated_psa_algorithm_t; + +#define PSA_KEY_TYPE_GET_CURVE PSA_KEY_TYPE_ECC_GET_FAMILY +#define PSA_KEY_TYPE_GET_GROUP PSA_KEY_TYPE_DH_GET_FAMILY + +#define MBEDTLS_DEPRECATED_CONSTANT(type, value) \ + ((mbedtls_deprecated_##type) (value)) + +/* + * Deprecated PSA Crypto error code definitions (PSA Crypto API <= 1.0 beta2) + */ +#define PSA_ERROR_UNKNOWN_ERROR \ + MBEDTLS_DEPRECATED_CONSTANT(psa_status_t, PSA_ERROR_GENERIC_ERROR) +#define PSA_ERROR_OCCUPIED_SLOT \ + MBEDTLS_DEPRECATED_CONSTANT(psa_status_t, PSA_ERROR_ALREADY_EXISTS) +#define PSA_ERROR_EMPTY_SLOT \ + MBEDTLS_DEPRECATED_CONSTANT(psa_status_t, PSA_ERROR_DOES_NOT_EXIST) +#define PSA_ERROR_INSUFFICIENT_CAPACITY \ + MBEDTLS_DEPRECATED_CONSTANT(psa_status_t, PSA_ERROR_INSUFFICIENT_DATA) +#define PSA_ERROR_TAMPERING_DETECTED \ + MBEDTLS_DEPRECATED_CONSTANT(psa_status_t, PSA_ERROR_CORRUPTION_DETECTED) + +/* + * Deprecated PSA Crypto numerical encodings (PSA Crypto API <= 1.0 beta3) + */ +#define PSA_KEY_USAGE_SIGN \ + MBEDTLS_DEPRECATED_CONSTANT(psa_key_usage_t, PSA_KEY_USAGE_SIGN_HASH) +#define PSA_KEY_USAGE_VERIFY \ + MBEDTLS_DEPRECATED_CONSTANT(psa_key_usage_t, PSA_KEY_USAGE_VERIFY_HASH) + +/* + * Deprecated PSA Crypto size calculation macros (PSA Crypto API <= 1.0 beta3) + */ +#define PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, PSA_SIGNATURE_MAX_SIZE) +#define PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE(key_type, key_bits, alg) \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, PSA_SIGN_OUTPUT_SIZE(key_type, key_bits, alg)) +#define PSA_KEY_EXPORT_MAX_SIZE(key_type, key_bits) \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, PSA_EXPORT_KEY_OUTPUT_SIZE(key_type, key_bits)) +#define PSA_BLOCK_CIPHER_BLOCK_SIZE(type) \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, PSA_BLOCK_CIPHER_BLOCK_LENGTH(type)) +#define PSA_MAX_BLOCK_CIPHER_BLOCK_SIZE \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE) +#define PSA_HASH_SIZE(alg) \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, PSA_HASH_LENGTH(alg)) +#define PSA_MAC_FINAL_SIZE(key_type, key_bits, alg) \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, PSA_MAC_LENGTH(key_type, key_bits, alg)) +#define PSA_ALG_TLS12_PSK_TO_MS_MAX_PSK_LEN \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE) + +/* + * Deprecated PSA Crypto function names (PSA Crypto API <= 1.0 beta3) + */ +MBEDTLS_PSA_DEPRECATED static inline psa_status_t psa_asymmetric_sign(psa_key_handle_t key, + psa_algorithm_t alg, + const uint8_t *hash, + size_t hash_length, + uint8_t *signature, + size_t signature_size, + size_t *signature_length) +{ + return psa_sign_hash(key, alg, hash, hash_length, signature, signature_size, signature_length); +} + +MBEDTLS_PSA_DEPRECATED static inline psa_status_t psa_asymmetric_verify(psa_key_handle_t key, + psa_algorithm_t alg, + const uint8_t *hash, + size_t hash_length, + const uint8_t *signature, + size_t signature_length) +{ + return psa_verify_hash(key, alg, hash, hash_length, signature, signature_length); +} + +/* + * Size-specific elliptic curve families. + */ +#define PSA_ECC_CURVE_SECP160K1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_K1) +#define PSA_ECC_CURVE_SECP192K1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_K1) +#define PSA_ECC_CURVE_SECP224K1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_K1) +#define PSA_ECC_CURVE_SECP256K1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_K1) +#define PSA_ECC_CURVE_SECP160R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_R1) +#define PSA_ECC_CURVE_SECP192R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_R1) +#define PSA_ECC_CURVE_SECP224R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_R1) +#define PSA_ECC_CURVE_SECP256R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_R1) +#define PSA_ECC_CURVE_SECP384R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_R1) +#define PSA_ECC_CURVE_SECP521R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_R1) +#define PSA_ECC_CURVE_SECP160R2 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_R2) +#define PSA_ECC_CURVE_SECT163K1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_K1) +#define PSA_ECC_CURVE_SECT233K1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_K1) +#define PSA_ECC_CURVE_SECT239K1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_K1) +#define PSA_ECC_CURVE_SECT283K1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_K1) +#define PSA_ECC_CURVE_SECT409K1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_K1) +#define PSA_ECC_CURVE_SECT571K1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_K1) +#define PSA_ECC_CURVE_SECT163R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_R1) +#define PSA_ECC_CURVE_SECT193R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_R1) +#define PSA_ECC_CURVE_SECT233R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_R1) +#define PSA_ECC_CURVE_SECT283R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_R1) +#define PSA_ECC_CURVE_SECT409R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_R1) +#define PSA_ECC_CURVE_SECT571R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_R1) +#define PSA_ECC_CURVE_SECT163R2 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_R2) +#define PSA_ECC_CURVE_SECT193R2 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_R2) +#define PSA_ECC_CURVE_BRAINPOOL_P256R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_BRAINPOOL_P_R1) +#define PSA_ECC_CURVE_BRAINPOOL_P384R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_BRAINPOOL_P_R1) +#define PSA_ECC_CURVE_BRAINPOOL_P512R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_BRAINPOOL_P_R1) +#define PSA_ECC_CURVE_CURVE25519 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_MONTGOMERY) +#define PSA_ECC_CURVE_CURVE448 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_MONTGOMERY) + +/* + * Curves that changed name due to PSA specification. + */ +#define PSA_ECC_CURVE_SECP_K1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_K1) +#define PSA_ECC_CURVE_SECP_R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_R1) +#define PSA_ECC_CURVE_SECP_R2 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECP_R2) +#define PSA_ECC_CURVE_SECT_K1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_K1) +#define PSA_ECC_CURVE_SECT_R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_R1) +#define PSA_ECC_CURVE_SECT_R2 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_SECT_R2) +#define PSA_ECC_CURVE_BRAINPOOL_P_R1 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_BRAINPOOL_P_R1) +#define PSA_ECC_CURVE_MONTGOMERY \ + MBEDTLS_DEPRECATED_CONSTANT(psa_ecc_family_t, PSA_ECC_FAMILY_MONTGOMERY) + +/* + * Finite-field Diffie-Hellman families. + */ +#define PSA_DH_GROUP_FFDHE2048 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_dh_family_t, PSA_DH_FAMILY_RFC7919) +#define PSA_DH_GROUP_FFDHE3072 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_dh_family_t, PSA_DH_FAMILY_RFC7919) +#define PSA_DH_GROUP_FFDHE4096 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_dh_family_t, PSA_DH_FAMILY_RFC7919) +#define PSA_DH_GROUP_FFDHE6144 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_dh_family_t, PSA_DH_FAMILY_RFC7919) +#define PSA_DH_GROUP_FFDHE8192 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_dh_family_t, PSA_DH_FAMILY_RFC7919) + +/* + * Diffie-Hellman families that changed name due to PSA specification. + */ +#define PSA_DH_GROUP_RFC7919 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_dh_family_t, PSA_DH_FAMILY_RFC7919) +#define PSA_DH_GROUP_CUSTOM \ + MBEDTLS_DEPRECATED_CONSTANT(psa_dh_family_t, PSA_DH_FAMILY_CUSTOM) + +/* + * Deprecated PSA Crypto stream cipher algorithms (PSA Crypto API <= 1.0 beta3) + */ +#define PSA_ALG_ARC4 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_algorithm_t, PSA_ALG_STREAM_CIPHER) +#define PSA_ALG_CHACHA20 \ + MBEDTLS_DEPRECATED_CONSTANT(psa_algorithm_t, PSA_ALG_STREAM_CIPHER) + +/* + * Renamed AEAD tag length macros (PSA Crypto API <= 1.0 beta3) + */ +#define PSA_ALG_AEAD_WITH_DEFAULT_TAG_LENGTH(aead_alg) \ + MBEDTLS_DEPRECATED_CONSTANT(psa_algorithm_t, PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG(aead_alg)) +#define PSA_ALG_AEAD_WITH_TAG_LENGTH(aead_alg, tag_length) \ + MBEDTLS_DEPRECATED_CONSTANT(psa_algorithm_t, \ + PSA_ALG_AEAD_WITH_SHORTENED_TAG(aead_alg, tag_length)) + +/* + * Deprecated PSA AEAD output size macros (PSA Crypto API <= 1.0 beta3) + */ + +/** The tag size for an AEAD algorithm, in bytes. + * + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \return The tag size for the specified algorithm. + * If the AEAD algorithm does not have an identified + * tag that can be distinguished from the rest of + * the ciphertext, return 0. + * If the AEAD algorithm is not recognized, return 0. + */ +#define PSA_AEAD_TAG_LENGTH_1_ARG(alg) \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, \ + PSA_ALG_IS_AEAD(alg) ? \ + PSA_ALG_AEAD_GET_TAG_LENGTH(alg) : \ + 0) + +/** The maximum size of the output of psa_aead_encrypt(), in bytes. + * + * If the size of the ciphertext buffer is at least this large, it is + * guaranteed that psa_aead_encrypt() will not fail due to an + * insufficient buffer size. Depending on the algorithm, the actual size of + * the ciphertext may be smaller. + * + * \warning This macro may evaluate its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * \param plaintext_length Size of the plaintext in bytes. + * + * \return The AEAD ciphertext size for the specified + * algorithm. + * If the AEAD algorithm is not recognized, return 0. + */ +#define PSA_AEAD_ENCRYPT_OUTPUT_SIZE_2_ARG(alg, plaintext_length) \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, \ + PSA_ALG_IS_AEAD(alg) ? \ + (plaintext_length) + PSA_ALG_AEAD_GET_TAG_LENGTH(alg) : \ + 0) + +/** The maximum size of the output of psa_aead_decrypt(), in bytes. + * + * If the size of the plaintext buffer is at least this large, it is + * guaranteed that psa_aead_decrypt() will not fail due to an + * insufficient buffer size. Depending on the algorithm, the actual size of + * the plaintext may be smaller. + * + * \warning This macro may evaluate its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * \param ciphertext_length Size of the plaintext in bytes. + * + * \return The AEAD ciphertext size for the specified + * algorithm. + * If the AEAD algorithm is not recognized, return 0. + */ +#define PSA_AEAD_DECRYPT_OUTPUT_SIZE_2_ARG(alg, ciphertext_length) \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, \ + PSA_ALG_IS_AEAD(alg) && \ + (ciphertext_length) > PSA_ALG_AEAD_GET_TAG_LENGTH(alg) ? \ + (ciphertext_length) - PSA_ALG_AEAD_GET_TAG_LENGTH(alg) : \ + 0) + +/** A sufficient output buffer size for psa_aead_update(). + * + * If the size of the output buffer is at least this large, it is + * guaranteed that psa_aead_update() will not fail due to an + * insufficient buffer size. The actual size of the output may be smaller + * in any given call. + * + * \warning This macro may evaluate its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * \param input_length Size of the input in bytes. + * + * \return A sufficient output buffer size for the specified + * algorithm. + * If the AEAD algorithm is not recognized, return 0. + */ +/* For all the AEAD modes defined in this specification, it is possible + * to emit output without delay. However, hardware may not always be + * capable of this. So for modes based on a block cipher, allow the + * implementation to delay the output until it has a full block. */ +#define PSA_AEAD_UPDATE_OUTPUT_SIZE_2_ARG(alg, input_length) \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, \ + PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) ? \ + PSA_ROUND_UP_TO_MULTIPLE(PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE, \ + (input_length)) : \ + (input_length)) + +/** A sufficient ciphertext buffer size for psa_aead_finish(). + * + * If the size of the ciphertext buffer is at least this large, it is + * guaranteed that psa_aead_finish() will not fail due to an + * insufficient ciphertext buffer size. The actual size of the output may + * be smaller in any given call. + * + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \return A sufficient ciphertext buffer size for the + * specified algorithm. + * If the AEAD algorithm is not recognized, return 0. + */ +#define PSA_AEAD_FINISH_OUTPUT_SIZE_1_ARG(alg) \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, \ + PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) ? \ + PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE : \ + 0) + +/** A sufficient plaintext buffer size for psa_aead_verify(). + * + * If the size of the plaintext buffer is at least this large, it is + * guaranteed that psa_aead_verify() will not fail due to an + * insufficient plaintext buffer size. The actual size of the output may + * be smaller in any given call. + * + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \return A sufficient plaintext buffer size for the + * specified algorithm. + * If the AEAD algorithm is not recognized, return 0. + */ +#define PSA_AEAD_VERIFY_OUTPUT_SIZE_1_ARG(alg) \ + MBEDTLS_DEPRECATED_CONSTANT(size_t, \ + PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) ? \ + PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE : \ + 0) + +#endif /* MBEDTLS_DEPRECATED_REMOVED */ + +/** Open a handle to an existing persistent key. + * + * Open a handle to a persistent key. A key is persistent if it was created + * with a lifetime other than #PSA_KEY_LIFETIME_VOLATILE. A persistent key + * always has a nonzero key identifier, set with psa_set_key_id() when + * creating the key. Implementations may provide additional pre-provisioned + * keys that can be opened with psa_open_key(). Such keys have an application + * key identifier in the vendor range, as documented in the description of + * #psa_key_id_t. + * + * The application must eventually close the handle with psa_close_key() or + * psa_destroy_key() to release associated resources. If the application dies + * without calling one of these functions, the implementation should perform + * the equivalent of a call to psa_close_key(). + * + * Some implementations permit an application to open the same key multiple + * times. If this is successful, each call to psa_open_key() will return a + * different key handle. + * + * \note This API is not part of the PSA Cryptography API Release 1.0.0 + * specification. It was defined in the 1.0 Beta 3 version of the + * specification but was removed in the 1.0.0 released version. This API is + * kept for the time being to not break applications relying on it. It is not + * deprecated yet but will be in the near future. + * + * \note Applications that rely on opening a key multiple times will not be + * portable to implementations that only permit a single key handle to be + * opened. See also :ref:\`key-handles\`. + * + * + * \param key The persistent identifier of the key. + * \param[out] handle On success, a handle to the key. + * + * \retval #PSA_SUCCESS + * Success. The application can now use the value of `*handle` + * to access the key. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * The implementation does not have sufficient resources to open the + * key. This can be due to reaching an implementation limit on the + * number of open keys, the number of open key handles, or available + * memory. + * \retval #PSA_ERROR_DOES_NOT_EXIST + * There is no persistent key with key identifier \p key. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p key is not a valid persistent key identifier. + * \retval #PSA_ERROR_NOT_PERMITTED + * The specified key exists, but the application does not have the + * permission to access it. Note that this specification does not + * define any way to create such a key, but it may be possible + * through implementation-specific means. + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_open_key(mbedtls_svc_key_id_t key, + psa_key_handle_t *handle); + +/** Close a key handle. + * + * If the handle designates a volatile key, this will destroy the key material + * and free all associated resources, just like psa_destroy_key(). + * + * If this is the last open handle to a persistent key, then closing the handle + * will free all resources associated with the key in volatile memory. The key + * data in persistent storage is not affected and can be opened again later + * with a call to psa_open_key(). + * + * Closing the key handle makes the handle invalid, and the key handle + * must not be used again by the application. + * + * \note This API is not part of the PSA Cryptography API Release 1.0.0 + * specification. It was defined in the 1.0 Beta 3 version of the + * specification but was removed in the 1.0.0 released version. This API is + * kept for the time being to not break applications relying on it. It is not + * deprecated yet but will be in the near future. + * + * \note If the key handle was used to set up an active + * :ref:\`multipart operation \`, then closing the + * key handle can cause the multipart operation to fail. Applications should + * maintain the key handle until after the multipart operation has finished. + * + * \param handle The key handle to close. + * If this is \c 0, do nothing and return \c PSA_SUCCESS. + * + * \retval #PSA_SUCCESS + * \p handle was a valid handle or \c 0. It is now closed. + * \retval #PSA_ERROR_INVALID_HANDLE + * \p handle is not a valid handle nor \c 0. + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_close_key(psa_key_handle_t handle); + +#ifdef __cplusplus +} +#endif + +#endif /* PSA_CRYPTO_COMPAT_H */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_config.h b/ext/opcua_client/mbedtls/include/psa/crypto_config.h new file mode 100644 index 0000000..167ced5 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_config.h @@ -0,0 +1,118 @@ +/** + * \file psa/crypto_config.h + * \brief PSA crypto configuration options (set of defines) + * + */ +#if defined(MBEDTLS_PSA_CRYPTO_CONFIG) +/** + * When #MBEDTLS_PSA_CRYPTO_CONFIG is enabled in config.h, + * this file determines which cryptographic mechanisms are enabled + * through the PSA Cryptography API (\c psa_xxx() functions). + * + * To enable a cryptographic mechanism, uncomment the definition of + * the corresponding \c PSA_WANT_xxx preprocessor symbol. + * To disable a cryptographic mechanism, comment out the definition of + * the corresponding \c PSA_WANT_xxx preprocessor symbol. + * The names of cryptographic mechanisms correspond to values + * defined in psa/crypto_values.h, with the prefix \c PSA_WANT_ instead + * of \c PSA_. + * + * Note that many cryptographic mechanisms involve two symbols: one for + * the key type (\c PSA_WANT_KEY_TYPE_xxx) and one for the algorithm + * (\c PSA_WANT_ALG_xxx). Mechanisms with additional parameters may involve + * additional symbols. + */ +#else +/** + * When \c MBEDTLS_PSA_CRYPTO_CONFIG is disabled in config.h, + * this file is not used, and cryptographic mechanisms are supported + * through the PSA API if and only if they are supported through the + * mbedtls_xxx API. + */ +#endif +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_CONFIG_H +#define PSA_CRYPTO_CONFIG_H + +/* + * CBC-MAC is not yet supported via the PSA API in Mbed TLS. + */ +//#define PSA_WANT_ALG_CBC_MAC 1 +#define PSA_WANT_ALG_CBC_NO_PADDING 1 +#define PSA_WANT_ALG_CBC_PKCS7 1 +#define PSA_WANT_ALG_CCM 1 +#define PSA_WANT_ALG_CMAC 1 +#define PSA_WANT_ALG_CFB 1 +#define PSA_WANT_ALG_CHACHA20_POLY1305 1 +#define PSA_WANT_ALG_CTR 1 +#define PSA_WANT_ALG_DETERMINISTIC_ECDSA 1 +#define PSA_WANT_ALG_ECB_NO_PADDING 1 +#define PSA_WANT_ALG_ECDH 1 +#define PSA_WANT_ALG_ECDSA 1 +#define PSA_WANT_ALG_GCM 1 +#define PSA_WANT_ALG_HKDF 1 +#define PSA_WANT_ALG_HMAC 1 +#define PSA_WANT_ALG_MD2 1 +#define PSA_WANT_ALG_MD4 1 +#define PSA_WANT_ALG_MD5 1 +#define PSA_WANT_ALG_OFB 1 +#define PSA_WANT_ALG_RIPEMD160 1 +#define PSA_WANT_ALG_RSA_OAEP 1 +#define PSA_WANT_ALG_RSA_PKCS1V15_CRYPT 1 +#define PSA_WANT_ALG_RSA_PKCS1V15_SIGN 1 +#define PSA_WANT_ALG_RSA_PSS 1 +#define PSA_WANT_ALG_SHA_1 1 +#define PSA_WANT_ALG_SHA_224 1 +#define PSA_WANT_ALG_SHA_256 1 +#define PSA_WANT_ALG_SHA_384 1 +#define PSA_WANT_ALG_SHA_512 1 +#define PSA_WANT_ALG_STREAM_CIPHER 1 +#define PSA_WANT_ALG_TLS12_PRF 1 +#define PSA_WANT_ALG_TLS12_PSK_TO_MS 1 +/* PBKDF2-HMAC is not yet supported via the PSA API in Mbed TLS. + * Note: when adding support, also adjust include/mbedtls/config_psa.h */ +//#define PSA_WANT_ALG_XTS 1 + +#define PSA_WANT_ECC_BRAINPOOL_P_R1_256 1 +#define PSA_WANT_ECC_BRAINPOOL_P_R1_384 1 +#define PSA_WANT_ECC_BRAINPOOL_P_R1_512 1 +#define PSA_WANT_ECC_MONTGOMERY_255 1 +/* + * Curve448 is not yet supported via the PSA API in Mbed TLS + * (https://github.com/Mbed-TLS/mbedtls/issues/4249). Thus, do not enable it by + * default. + */ +//#define PSA_WANT_ECC_MONTGOMERY_448 1 +#define PSA_WANT_ECC_SECP_K1_192 1 +/* + * SECP224K1 is buggy via the PSA API in Mbed TLS + * (https://github.com/Mbed-TLS/mbedtls/issues/3541). Thus, do not enable it by + * default. + */ +//#define PSA_WANT_ECC_SECP_K1_224 1 +#define PSA_WANT_ECC_SECP_K1_256 1 +#define PSA_WANT_ECC_SECP_R1_192 1 +#define PSA_WANT_ECC_SECP_R1_224 1 +#define PSA_WANT_ECC_SECP_R1_256 1 +#define PSA_WANT_ECC_SECP_R1_384 1 +#define PSA_WANT_ECC_SECP_R1_521 1 + +#define PSA_WANT_KEY_TYPE_DERIVE 1 +#define PSA_WANT_KEY_TYPE_HMAC 1 +#define PSA_WANT_KEY_TYPE_AES 1 +#define PSA_WANT_KEY_TYPE_ARC4 1 +#define PSA_WANT_KEY_TYPE_ARIA 1 +#define PSA_WANT_KEY_TYPE_CAMELLIA 1 +#define PSA_WANT_KEY_TYPE_CHACHA20 1 +#define PSA_WANT_KEY_TYPE_DES 1 +#define PSA_WANT_KEY_TYPE_ECC_KEY_PAIR 1 +#define PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY 1 +#define PSA_WANT_KEY_TYPE_RAW_DATA 1 +#define PSA_WANT_KEY_TYPE_RSA_KEY_PAIR 1 +#define PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY 1 + +#endif /* PSA_CRYPTO_CONFIG_H */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_driver_common.h b/ext/opcua_client/mbedtls/include/psa/crypto_driver_common.h new file mode 100644 index 0000000..cc11d3b --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_driver_common.h @@ -0,0 +1,44 @@ +/** + * \file psa/crypto_driver_common.h + * \brief Definitions for all PSA crypto drivers + * + * This file contains common definitions shared by all PSA crypto drivers. + * Do not include it directly: instead, include the header file(s) for + * the type(s) of driver that you are implementing. For example, if + * you are writing a dynamically registered driver for a secure element, + * include `psa/crypto_se_driver.h`. + * + * This file is part of the PSA Crypto Driver Model, containing functions for + * driver developers to implement to enable hardware to be called in a + * standardized way by a PSA Cryptographic API implementation. The functions + * comprising the driver model, which driver authors implement, are not + * intended to be called by application developers. + */ + +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef PSA_CRYPTO_DRIVER_COMMON_H +#define PSA_CRYPTO_DRIVER_COMMON_H + +#include +#include + +/* Include type definitions (psa_status_t, psa_algorithm_t, + * psa_key_type_t, etc.) and macros to build and analyze values + * of these types. */ +#include "crypto_types.h" +#include "crypto_values.h" +/* Include size definitions which are used to size some arrays in operation + * structures. */ +#include + +/** For encrypt-decrypt functions, whether the operation is an encryption + * or a decryption. */ +typedef enum { + PSA_CRYPTO_DRIVER_DECRYPT, + PSA_CRYPTO_DRIVER_ENCRYPT +} psa_encrypt_or_decrypt_t; + +#endif /* PSA_CRYPTO_DRIVER_COMMON_H */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_driver_contexts_composites.h b/ext/opcua_client/mbedtls/include/psa/crypto_driver_contexts_composites.h new file mode 100644 index 0000000..1e37682 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_driver_contexts_composites.h @@ -0,0 +1,81 @@ +/* + * Declaration of context structures for use with the PSA driver wrapper + * interface. This file contains the context structures for 'composite' + * operations, i.e. those operations which need to make use of other operations + * from the primitives (crypto_driver_contexts_primitives.h) + * + * Warning: This file will be auto-generated in the future. + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. + * + * \note This header and its content is not part of the Mbed TLS API and + * applications must not depend on it. Its main purpose is to define the + * multi-part state objects of the PSA drivers included in the cryptographic + * library. The definition of these objects are then used by crypto_struct.h + * to define the implementation-defined types of PSA multi-part state objects. + */ +/* Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_DRIVER_CONTEXTS_COMPOSITES_H +#define PSA_CRYPTO_DRIVER_CONTEXTS_COMPOSITES_H + +#include "psa/crypto_driver_common.h" + +/* Include the context structure definitions for the Mbed TLS software drivers */ +#include "psa/crypto_builtin_composites.h" + +/* Include the context structure definitions for those drivers that were + * declared during the autogeneration process. */ + +#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) +#include +#endif + +#if defined(PSA_CRYPTO_DRIVER_TEST) +#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \ + defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_MAC) +typedef libtestdriver1_mbedtls_psa_mac_operation_t + mbedtls_transparent_test_driver_mac_operation_t; +typedef libtestdriver1_mbedtls_psa_mac_operation_t + mbedtls_opaque_test_driver_mac_operation_t; + +#define MBEDTLS_TRANSPARENT_TEST_DRIVER_MAC_OPERATION_INIT \ + LIBTESTDRIVER1_MBEDTLS_PSA_MAC_OPERATION_INIT +#define MBEDTLS_OPAQUE_TEST_DRIVER_MAC_OPERATION_INIT \ + LIBTESTDRIVER1_MBEDTLS_PSA_MAC_OPERATION_INIT + +#else +typedef mbedtls_psa_mac_operation_t + mbedtls_transparent_test_driver_mac_operation_t; +typedef mbedtls_psa_mac_operation_t + mbedtls_opaque_test_driver_mac_operation_t; + +#define MBEDTLS_TRANSPARENT_TEST_DRIVER_MAC_OPERATION_INIT \ + MBEDTLS_PSA_MAC_OPERATION_INIT +#define MBEDTLS_OPAQUE_TEST_DRIVER_MAC_OPERATION_INIT \ + MBEDTLS_PSA_MAC_OPERATION_INIT + +#endif /* MBEDTLS_TEST_LIBTESTDRIVER1 */ +#endif /* PSA_CRYPTO_DRIVER_TEST */ + +/* Define the context to be used for an operation that is executed through the + * PSA Driver wrapper layer as the union of all possible driver's contexts. + * + * The union members are the driver's context structures, and the member names + * are formatted as `'drivername'_ctx`. This allows for procedural generation + * of both this file and the content of psa_crypto_driver_wrappers.c */ + +typedef union { + unsigned dummy; /* Make sure this union is always non-empty */ + mbedtls_psa_mac_operation_t mbedtls_ctx; +#if defined(PSA_CRYPTO_DRIVER_TEST) + mbedtls_transparent_test_driver_mac_operation_t transparent_test_driver_ctx; + mbedtls_opaque_test_driver_mac_operation_t opaque_test_driver_ctx; +#endif +} psa_driver_mac_context_t; + +#endif /* PSA_CRYPTO_DRIVER_CONTEXTS_COMPOSITES_H */ +/* End of automatically generated file. */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_driver_contexts_primitives.h b/ext/opcua_client/mbedtls/include/psa/crypto_driver_contexts_primitives.h new file mode 100644 index 0000000..9a6db01 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_driver_contexts_primitives.h @@ -0,0 +1,105 @@ +/* + * Declaration of context structures for use with the PSA driver wrapper + * interface. This file contains the context structures for 'primitive' + * operations, i.e. those operations which do not rely on other contexts. + * + * Warning: This file will be auto-generated in the future. + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. + * + * \note This header and its content is not part of the Mbed TLS API and + * applications must not depend on it. Its main purpose is to define the + * multi-part state objects of the PSA drivers included in the cryptographic + * library. The definition of these objects are then used by crypto_struct.h + * to define the implementation-defined types of PSA multi-part state objects. + */ +/* Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_DRIVER_CONTEXTS_PRIMITIVES_H +#define PSA_CRYPTO_DRIVER_CONTEXTS_PRIMITIVES_H + +#include "psa/crypto_driver_common.h" + +/* Include the context structure definitions for the Mbed TLS software drivers */ +#include "psa/crypto_builtin_primitives.h" + +/* Include the context structure definitions for those drivers that were + * declared during the autogeneration process. */ + +#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) +#include +#endif + +#if defined(PSA_CRYPTO_DRIVER_TEST) + +#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \ + defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_CIPHER) +typedef libtestdriver1_mbedtls_psa_cipher_operation_t + mbedtls_transparent_test_driver_cipher_operation_t; + +#define MBEDTLS_TRANSPARENT_TEST_DRIVER_CIPHER_OPERATION_INIT \ + LIBTESTDRIVER1_MBEDTLS_PSA_CIPHER_OPERATION_INIT +#else +typedef mbedtls_psa_cipher_operation_t + mbedtls_transparent_test_driver_cipher_operation_t; + +#define MBEDTLS_TRANSPARENT_TEST_DRIVER_CIPHER_OPERATION_INIT \ + MBEDTLS_PSA_CIPHER_OPERATION_INIT +#endif /* MBEDTLS_TEST_LIBTESTDRIVER1 && + LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_CIPHER */ + +#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \ + defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_HASH) +typedef libtestdriver1_mbedtls_psa_hash_operation_t + mbedtls_transparent_test_driver_hash_operation_t; + +#define MBEDTLS_TRANSPARENT_TEST_DRIVER_HASH_OPERATION_INIT \ + LIBTESTDRIVER1_MBEDTLS_PSA_HASH_OPERATION_INIT +#else +typedef mbedtls_psa_hash_operation_t + mbedtls_transparent_test_driver_hash_operation_t; + +#define MBEDTLS_TRANSPARENT_TEST_DRIVER_HASH_OPERATION_INIT \ + MBEDTLS_PSA_HASH_OPERATION_INIT +#endif /* MBEDTLS_TEST_LIBTESTDRIVER1 && + LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_HASH */ + +typedef struct { + unsigned int initialised : 1; + mbedtls_transparent_test_driver_cipher_operation_t ctx; +} mbedtls_opaque_test_driver_cipher_operation_t; + +#define MBEDTLS_OPAQUE_TEST_DRIVER_CIPHER_OPERATION_INIT \ + { 0, MBEDTLS_TRANSPARENT_TEST_DRIVER_CIPHER_OPERATION_INIT } + +#endif /* PSA_CRYPTO_DRIVER_TEST */ + +/* Define the context to be used for an operation that is executed through the + * PSA Driver wrapper layer as the union of all possible driver's contexts. + * + * The union members are the driver's context structures, and the member names + * are formatted as `'drivername'_ctx`. This allows for procedural generation + * of both this file and the content of psa_crypto_driver_wrappers.c */ + +typedef union { + unsigned dummy; /* Make sure this union is always non-empty */ + mbedtls_psa_hash_operation_t mbedtls_ctx; +#if defined(PSA_CRYPTO_DRIVER_TEST) + mbedtls_transparent_test_driver_hash_operation_t test_driver_ctx; +#endif +} psa_driver_hash_context_t; + +typedef union { + unsigned dummy; /* Make sure this union is always non-empty */ + mbedtls_psa_cipher_operation_t mbedtls_ctx; +#if defined(PSA_CRYPTO_DRIVER_TEST) + mbedtls_transparent_test_driver_cipher_operation_t transparent_test_driver_ctx; + mbedtls_opaque_test_driver_cipher_operation_t opaque_test_driver_ctx; +#endif +} psa_driver_cipher_context_t; + +#endif /* PSA_CRYPTO_DRIVER_CONTEXTS_PRIMITIVES_H */ +/* End of automatically generated file. */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_extra.h b/ext/opcua_client/mbedtls/include/psa/crypto_extra.h new file mode 100644 index 0000000..ea58e87 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_extra.h @@ -0,0 +1,810 @@ +/** + * \file psa/crypto_extra.h + * + * \brief PSA cryptography module: Mbed TLS vendor extensions + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. + * + * This file is reserved for vendor-specific definitions. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_EXTRA_H +#define PSA_CRYPTO_EXTRA_H + +#include "mbedtls/platform_util.h" + +#include "crypto_types.h" +#include "crypto_compat.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* UID for secure storage seed */ +#define PSA_CRYPTO_ITS_RANDOM_SEED_UID 0xFFFFFF52 + +/* See config.h for definition */ +#if !defined(MBEDTLS_PSA_KEY_SLOT_COUNT) +#define MBEDTLS_PSA_KEY_SLOT_COUNT 32 +#endif + +/** \addtogroup attributes + * @{ + */ + +/** \brief Declare the enrollment algorithm for a key. + * + * An operation on a key may indifferently use the algorithm set with + * psa_set_key_algorithm() or with this function. + * + * \param[out] attributes The attribute structure to write to. + * \param alg2 A second algorithm that the key may be used + * for, in addition to the algorithm set with + * psa_set_key_algorithm(). + * + * \warning Setting an enrollment algorithm is not recommended, because + * using the same key with different algorithms can allow some + * attacks based on arithmetic relations between different + * computations made with the same key, or can escalate harmless + * side channels into exploitable ones. Use this function only + * if it is necessary to support a protocol for which it has been + * verified that the usage of the key with multiple algorithms + * is safe. + */ +static inline void psa_set_key_enrollment_algorithm( + psa_key_attributes_t *attributes, + psa_algorithm_t alg2) +{ + attributes->core.policy.alg2 = alg2; +} + +/** Retrieve the enrollment algorithm policy from key attributes. + * + * \param[in] attributes The key attribute structure to query. + * + * \return The enrollment algorithm stored in the attribute structure. + */ +static inline psa_algorithm_t psa_get_key_enrollment_algorithm( + const psa_key_attributes_t *attributes) +{ + return attributes->core.policy.alg2; +} + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + +/** Retrieve the slot number where a key is stored. + * + * A slot number is only defined for keys that are stored in a secure + * element. + * + * This information is only useful if the secure element is not entirely + * managed through the PSA Cryptography API. It is up to the secure + * element driver to decide how PSA slot numbers map to any other interface + * that the secure element may have. + * + * \param[in] attributes The key attribute structure to query. + * \param[out] slot_number On success, the slot number containing the key. + * + * \retval #PSA_SUCCESS + * The key is located in a secure element, and \p *slot_number + * indicates the slot number that contains it. + * \retval #PSA_ERROR_NOT_PERMITTED + * The caller is not permitted to query the slot number. + * Mbed TLS currently does not return this error. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The key is not located in a secure element. + */ +psa_status_t psa_get_key_slot_number( + const psa_key_attributes_t *attributes, + psa_key_slot_number_t *slot_number); + +/** Choose the slot number where a key is stored. + * + * This function declares a slot number in the specified attribute + * structure. + * + * A slot number is only meaningful for keys that are stored in a secure + * element. It is up to the secure element driver to decide how PSA slot + * numbers map to any other interface that the secure element may have. + * + * \note Setting a slot number in key attributes for a key creation can + * cause the following errors when creating the key: + * - #PSA_ERROR_NOT_SUPPORTED if the selected secure element does + * not support choosing a specific slot number. + * - #PSA_ERROR_NOT_PERMITTED if the caller is not permitted to + * choose slot numbers in general or to choose this specific slot. + * - #PSA_ERROR_INVALID_ARGUMENT if the chosen slot number is not + * valid in general or not valid for this specific key. + * - #PSA_ERROR_ALREADY_EXISTS if there is already a key in the + * selected slot. + * + * \param[out] attributes The attribute structure to write to. + * \param slot_number The slot number to set. + */ +static inline void psa_set_key_slot_number( + psa_key_attributes_t *attributes, + psa_key_slot_number_t slot_number) +{ + attributes->core.flags |= MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER; + attributes->slot_number = slot_number; +} + +/** Remove the slot number attribute from a key attribute structure. + * + * This function undoes the action of psa_set_key_slot_number(). + * + * \param[out] attributes The attribute structure to write to. + */ +static inline void psa_clear_key_slot_number( + psa_key_attributes_t *attributes) +{ + attributes->core.flags &= ~MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER; +} + +/** Register a key that is already present in a secure element. + * + * The key must be located in a secure element designated by the + * lifetime field in \p attributes, in the slot set with + * psa_set_key_slot_number() in the attribute structure. + * This function makes the key available through the key identifier + * specified in \p attributes. + * + * \param[in] attributes The attributes of the existing key. + * - The lifetime must be a persistent lifetime + * in a secure element. Volatile lifetimes are + * not currently supported. + * - The key identifier must be in the valid + * range for persistent keys. + * - The key type and size must be specified and + * must be consistent with the key material + * in the secure element. + * + * \retval #PSA_SUCCESS + * The key was successfully registered. + * Note that depending on the design of the driver, this may or may + * not guarantee that a key actually exists in the designated slot + * and is compatible with the specified attributes. + * \retval #PSA_ERROR_ALREADY_EXISTS + * There is already a key with the identifier specified in + * \p attributes. + * \retval #PSA_ERROR_NOT_SUPPORTED + * The secure element driver for the specified lifetime does not + * support registering a key. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The identifier in \p attributes is invalid, namely the identifier is + * not in the user range, or + * \p attributes specifies a lifetime which is not located + * in a secure element, or no slot number is specified in \p attributes, + * or the specified slot number is not valid. + * \retval #PSA_ERROR_NOT_PERMITTED + * The caller is not authorized to register the specified key slot. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t mbedtls_psa_register_se_key( + const psa_key_attributes_t *attributes); + +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + +/**@}*/ + +/** + * \brief Library deinitialization. + * + * This function clears all data associated with the PSA layer, + * including the whole key store. + * + * This is an Mbed TLS extension. + */ +void mbedtls_psa_crypto_free(void); + +/** \brief Statistics about + * resource consumption related to the PSA keystore. + * + * \note The content of this structure is not part of the stable API and ABI + * of Mbed TLS and may change arbitrarily from version to version. + */ +typedef struct mbedtls_psa_stats_s { + /** Number of slots containing key material for a volatile key. */ + size_t volatile_slots; + /** Number of slots containing key material for a key which is in + * internal persistent storage. */ + size_t persistent_slots; + /** Number of slots containing a reference to a key in a + * secure element. */ + size_t external_slots; + /** Number of slots which are occupied, but do not contain + * key material yet. */ + size_t half_filled_slots; + /** Number of slots that contain cache data. */ + size_t cache_slots; + /** Number of slots that are not used for anything. */ + size_t empty_slots; + /** Number of slots that are locked. */ + size_t locked_slots; + /** Largest key id value among open keys in internal persistent storage. */ + psa_key_id_t max_open_internal_key_id; + /** Largest key id value among open keys in secure elements. */ + psa_key_id_t max_open_external_key_id; +} mbedtls_psa_stats_t; + +/** \brief Get statistics about + * resource consumption related to the PSA keystore. + * + * \note When Mbed TLS is built as part of a service, with isolation + * between the application and the keystore, the service may or + * may not expose this function. + */ +void mbedtls_psa_get_stats(mbedtls_psa_stats_t *stats); + +/** + * \brief Inject an initial entropy seed for the random generator into + * secure storage. + * + * This function injects data to be used as a seed for the random generator + * used by the PSA Crypto implementation. On devices that lack a trusted + * entropy source (preferably a hardware random number generator), + * the Mbed PSA Crypto implementation uses this value to seed its + * random generator. + * + * On devices without a trusted entropy source, this function must be + * called exactly once in the lifetime of the device. On devices with + * a trusted entropy source, calling this function is optional. + * In all cases, this function may only be called before calling any + * other function in the PSA Crypto API, including psa_crypto_init(). + * + * When this function returns successfully, it populates a file in + * persistent storage. Once the file has been created, this function + * can no longer succeed. + * + * If any error occurs, this function does not change the system state. + * You can call this function again after correcting the reason for the + * error if possible. + * + * \warning This function **can** fail! Callers MUST check the return status. + * + * \warning If you use this function, you should use it as part of a + * factory provisioning process. The value of the injected seed + * is critical to the security of the device. It must be + * *secret*, *unpredictable* and (statistically) *unique per device*. + * You should be generate it randomly using a cryptographically + * secure random generator seeded from trusted entropy sources. + * You should transmit it securely to the device and ensure + * that its value is not leaked or stored anywhere beyond the + * needs of transmitting it from the point of generation to + * the call of this function, and erase all copies of the value + * once this function returns. + * + * This is an Mbed TLS extension. + * + * \note This function is only available on the following platforms: + * * If the compile-time option MBEDTLS_PSA_INJECT_ENTROPY is enabled. + * Note that you must provide compatible implementations of + * mbedtls_nv_seed_read and mbedtls_nv_seed_write. + * * In a client-server integration of PSA Cryptography, on the client side, + * if the server supports this feature. + * \param[in] seed Buffer containing the seed value to inject. + * \param[in] seed_size Size of the \p seed buffer. + * The size of the seed in bytes must be greater + * or equal to both #MBEDTLS_ENTROPY_MIN_PLATFORM + * and #MBEDTLS_ENTROPY_BLOCK_SIZE. + * It must be less or equal to + * #MBEDTLS_ENTROPY_MAX_SEED_SIZE. + * + * \retval #PSA_SUCCESS + * The seed value was injected successfully. The random generator + * of the PSA Crypto implementation is now ready for use. + * You may now call psa_crypto_init() and use the PSA Crypto + * implementation. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p seed_size is out of range. + * \retval #PSA_ERROR_STORAGE_FAILURE + * There was a failure reading or writing from storage. + * \retval #PSA_ERROR_NOT_PERMITTED + * The library has already been initialized. It is no longer + * possible to call this function. + */ +psa_status_t mbedtls_psa_inject_entropy(const uint8_t *seed, + size_t seed_size); + +/** \addtogroup crypto_types + * @{ + */ + +/** DSA public key. + * + * The import and export format is the + * representation of the public key `y = g^x mod p` as a big-endian byte + * string. The length of the byte string is the length of the base prime `p` + * in bytes. + */ +#define PSA_KEY_TYPE_DSA_PUBLIC_KEY ((psa_key_type_t) 0x4002) + +/** DSA key pair (private and public key). + * + * The import and export format is the + * representation of the private key `x` as a big-endian byte string. The + * length of the byte string is the private key size in bytes (leading zeroes + * are not stripped). + * + * Deterministic DSA key derivation with psa_generate_derived_key follows + * FIPS 186-4 §B.1.2: interpret the byte string as integer + * in big-endian order. Discard it if it is not in the range + * [0, *N* - 2] where *N* is the boundary of the private key domain + * (the prime *p* for Diffie-Hellman, the subprime *q* for DSA, + * or the order of the curve's base point for ECC). + * Add 1 to the resulting integer and use this as the private key *x*. + * + */ +#define PSA_KEY_TYPE_DSA_KEY_PAIR ((psa_key_type_t) 0x7002) + +/** Whether a key type is a DSA key (pair or public-only). */ +#define PSA_KEY_TYPE_IS_DSA(type) \ + (PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) == PSA_KEY_TYPE_DSA_PUBLIC_KEY) + +#define PSA_ALG_DSA_BASE ((psa_algorithm_t) 0x06000400) +/** DSA signature with hashing. + * + * This is the signature scheme defined by FIPS 186-4, + * with a random per-message secret number (*k*). + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * This includes #PSA_ALG_ANY_HASH + * when specifying the algorithm in a usage policy. + * + * \return The corresponding DSA signature algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_DSA(hash_alg) \ + (PSA_ALG_DSA_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) +#define PSA_ALG_DETERMINISTIC_DSA_BASE ((psa_algorithm_t) 0x06000500) +#define PSA_ALG_DSA_DETERMINISTIC_FLAG PSA_ALG_ECDSA_DETERMINISTIC_FLAG +/** Deterministic DSA signature with hashing. + * + * This is the deterministic variant defined by RFC 6979 of + * the signature scheme defined by FIPS 186-4. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * This includes #PSA_ALG_ANY_HASH + * when specifying the algorithm in a usage policy. + * + * \return The corresponding DSA signature algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_DETERMINISTIC_DSA(hash_alg) \ + (PSA_ALG_DETERMINISTIC_DSA_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) +#define PSA_ALG_IS_DSA(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK & ~PSA_ALG_DSA_DETERMINISTIC_FLAG) == \ + PSA_ALG_DSA_BASE) +#define PSA_ALG_DSA_IS_DETERMINISTIC(alg) \ + (((alg) & PSA_ALG_DSA_DETERMINISTIC_FLAG) != 0) +#define PSA_ALG_IS_DETERMINISTIC_DSA(alg) \ + (PSA_ALG_IS_DSA(alg) && PSA_ALG_DSA_IS_DETERMINISTIC(alg)) +#define PSA_ALG_IS_RANDOMIZED_DSA(alg) \ + (PSA_ALG_IS_DSA(alg) && !PSA_ALG_DSA_IS_DETERMINISTIC(alg)) + + +/* We need to expand the sample definition of this macro from + * the API definition. */ +#undef PSA_ALG_IS_VENDOR_HASH_AND_SIGN +#define PSA_ALG_IS_VENDOR_HASH_AND_SIGN(alg) \ + PSA_ALG_IS_DSA(alg) + +/**@}*/ + +/** \addtogroup attributes + * @{ + */ + +/** Custom Diffie-Hellman group. + * + * For keys of type #PSA_KEY_TYPE_DH_PUBLIC_KEY(#PSA_DH_FAMILY_CUSTOM) or + * #PSA_KEY_TYPE_DH_KEY_PAIR(#PSA_DH_FAMILY_CUSTOM), the group data comes + * from domain parameters set by psa_set_key_domain_parameters(). + */ +#define PSA_DH_FAMILY_CUSTOM ((psa_dh_family_t) 0x7e) + + +/** + * \brief Set domain parameters for a key. + * + * Some key types require additional domain parameters in addition to + * the key type identifier and the key size. Use this function instead + * of psa_set_key_type() when you need to specify domain parameters. + * + * The format for the required domain parameters varies based on the key type. + * + * - For RSA keys (#PSA_KEY_TYPE_RSA_PUBLIC_KEY or #PSA_KEY_TYPE_RSA_KEY_PAIR), + * the domain parameter data consists of the public exponent, + * represented as a big-endian integer with no leading zeros. + * This information is used when generating an RSA key pair. + * When importing a key, the public exponent is read from the imported + * key data and the exponent recorded in the attribute structure is ignored. + * As an exception, the public exponent 65537 is represented by an empty + * byte string. + * - For DSA keys (#PSA_KEY_TYPE_DSA_PUBLIC_KEY or #PSA_KEY_TYPE_DSA_KEY_PAIR), + * the `Dss-Params` format as defined by RFC 3279 §2.3.2. + * ``` + * Dss-Params ::= SEQUENCE { + * p INTEGER, + * q INTEGER, + * g INTEGER + * } + * ``` + * - For Diffie-Hellman key exchange keys + * (#PSA_KEY_TYPE_DH_PUBLIC_KEY(#PSA_DH_FAMILY_CUSTOM) or + * #PSA_KEY_TYPE_DH_KEY_PAIR(#PSA_DH_FAMILY_CUSTOM)), the + * `DomainParameters` format as defined by RFC 3279 §2.3.3. + * ``` + * DomainParameters ::= SEQUENCE { + * p INTEGER, -- odd prime, p=jq +1 + * g INTEGER, -- generator, g + * q INTEGER, -- factor of p-1 + * j INTEGER OPTIONAL, -- subgroup factor + * validationParams ValidationParams OPTIONAL + * } + * ValidationParams ::= SEQUENCE { + * seed BIT STRING, + * pgenCounter INTEGER + * } + * ``` + * + * \note This function may allocate memory or other resources. + * Once you have called this function on an attribute structure, + * you must call psa_reset_key_attributes() to free these resources. + * + * \note This is an experimental extension to the interface. It may change + * in future versions of the library. + * + * \param[in,out] attributes Attribute structure where the specified domain + * parameters will be stored. + * If this function fails, the content of + * \p attributes is not modified. + * \param type Key type (a \c PSA_KEY_TYPE_XXX value). + * \param[in] data Buffer containing the key domain parameters. + * The content of this buffer is interpreted + * according to \p type as described above. + * \param data_length Size of the \p data buffer in bytes. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes, + psa_key_type_t type, + const uint8_t *data, + size_t data_length); + +/** + * \brief Get domain parameters for a key. + * + * Get the domain parameters for a key with this function, if any. The format + * of the domain parameters written to \p data is specified in the + * documentation for psa_set_key_domain_parameters(). + * + * \note This is an experimental extension to the interface. It may change + * in future versions of the library. + * + * \param[in] attributes The key attribute structure to query. + * \param[out] data On success, the key domain parameters. + * \param data_size Size of the \p data buffer in bytes. + * The buffer is guaranteed to be large + * enough if its size in bytes is at least + * the value given by + * PSA_KEY_DOMAIN_PARAMETERS_SIZE(). + * \param[out] data_length On success, the number of bytes + * that make up the key domain parameters data. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL \emptydescription + */ +psa_status_t psa_get_key_domain_parameters( + const psa_key_attributes_t *attributes, + uint8_t *data, + size_t data_size, + size_t *data_length); + +/** Safe output buffer size for psa_get_key_domain_parameters(). + * + * This macro returns a compile-time constant if its arguments are + * compile-time constants. + * + * \warning This function may call its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \note This is an experimental extension to the interface. It may change + * in future versions of the library. + * + * \param key_type A supported key type. + * \param key_bits The size of the key in bits. + * + * \return If the parameters are valid and supported, return + * a buffer size in bytes that guarantees that + * psa_get_key_domain_parameters() will not fail with + * #PSA_ERROR_BUFFER_TOO_SMALL. + * If the parameters are a valid combination that is not supported + * by the implementation, this macro shall return either a + * sensible size or 0. + * If the parameters are not valid, the + * return value is unspecified. + */ +#define PSA_KEY_DOMAIN_PARAMETERS_SIZE(key_type, key_bits) \ + (PSA_KEY_TYPE_IS_RSA(key_type) ? sizeof(int) : \ + PSA_KEY_TYPE_IS_DH(key_type) ? PSA_DH_KEY_DOMAIN_PARAMETERS_SIZE(key_bits) : \ + PSA_KEY_TYPE_IS_DSA(key_type) ? PSA_DSA_KEY_DOMAIN_PARAMETERS_SIZE(key_bits) : \ + 0) +#define PSA_DH_KEY_DOMAIN_PARAMETERS_SIZE(key_bits) \ + (4 + (PSA_BITS_TO_BYTES(key_bits) + 5) * 3 /*without optional parts*/) +#define PSA_DSA_KEY_DOMAIN_PARAMETERS_SIZE(key_bits) \ + (4 + (PSA_BITS_TO_BYTES(key_bits) + 5) * 2 /*p, g*/ + 34 /*q*/) + +/**@}*/ + +/** \defgroup psa_tls_helpers TLS helper functions + * @{ + */ + +#if defined(MBEDTLS_ECP_C) +#include + +/** Convert an ECC curve identifier from the Mbed TLS encoding to PSA. + * + * \note This function is provided solely for the convenience of + * Mbed TLS and may be removed at any time without notice. + * + * \param grpid An Mbed TLS elliptic curve identifier + * (`MBEDTLS_ECP_DP_xxx`). + * \param[out] bits On success, the bit size of the curve. + * + * \return The corresponding PSA elliptic curve identifier + * (`PSA_ECC_FAMILY_xxx`). + * \return \c 0 on failure (\p grpid is not recognized). + */ +static inline psa_ecc_family_t mbedtls_ecc_group_to_psa(mbedtls_ecp_group_id grpid, + size_t *bits) +{ + switch (grpid) { + case MBEDTLS_ECP_DP_SECP192R1: + *bits = 192; + return PSA_ECC_FAMILY_SECP_R1; + case MBEDTLS_ECP_DP_SECP224R1: + *bits = 224; + return PSA_ECC_FAMILY_SECP_R1; + case MBEDTLS_ECP_DP_SECP256R1: + *bits = 256; + return PSA_ECC_FAMILY_SECP_R1; + case MBEDTLS_ECP_DP_SECP384R1: + *bits = 384; + return PSA_ECC_FAMILY_SECP_R1; + case MBEDTLS_ECP_DP_SECP521R1: + *bits = 521; + return PSA_ECC_FAMILY_SECP_R1; + case MBEDTLS_ECP_DP_BP256R1: + *bits = 256; + return PSA_ECC_FAMILY_BRAINPOOL_P_R1; + case MBEDTLS_ECP_DP_BP384R1: + *bits = 384; + return PSA_ECC_FAMILY_BRAINPOOL_P_R1; + case MBEDTLS_ECP_DP_BP512R1: + *bits = 512; + return PSA_ECC_FAMILY_BRAINPOOL_P_R1; + case MBEDTLS_ECP_DP_CURVE25519: + *bits = 255; + return PSA_ECC_FAMILY_MONTGOMERY; + case MBEDTLS_ECP_DP_SECP192K1: + *bits = 192; + return PSA_ECC_FAMILY_SECP_K1; + case MBEDTLS_ECP_DP_SECP224K1: + *bits = 224; + return PSA_ECC_FAMILY_SECP_K1; + case MBEDTLS_ECP_DP_SECP256K1: + *bits = 256; + return PSA_ECC_FAMILY_SECP_K1; + case MBEDTLS_ECP_DP_CURVE448: + *bits = 448; + return PSA_ECC_FAMILY_MONTGOMERY; + default: + *bits = 0; + return 0; + } +} + +/** Convert an ECC curve identifier from the PSA encoding to Mbed TLS. + * + * \note This function is provided solely for the convenience of + * Mbed TLS and may be removed at any time without notice. + * + * \param curve A PSA elliptic curve identifier + * (`PSA_ECC_FAMILY_xxx`). + * \param bits The bit-length of a private key on \p curve. + * \param bits_is_sloppy If true, \p bits may be the bit-length rounded up + * to the nearest multiple of 8. This allows the caller + * to infer the exact curve from the length of a key + * which is supplied as a byte string. + * + * \return The corresponding Mbed TLS elliptic curve identifier + * (`MBEDTLS_ECP_DP_xxx`). + * \return #MBEDTLS_ECP_DP_NONE if \c curve is not recognized. + * \return #MBEDTLS_ECP_DP_NONE if \p bits is not + * correct for \p curve. + */ +mbedtls_ecp_group_id mbedtls_ecc_group_of_psa(psa_ecc_family_t curve, + size_t bits, + int bits_is_sloppy); +#endif /* MBEDTLS_ECP_C */ + +/**@}*/ + +/** \defgroup psa_external_rng External random generator + * @{ + */ + +#if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) +/** External random generator function, implemented by the platform. + * + * When the compile-time option #MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG is enabled, + * this function replaces Mbed TLS's entropy and DRBG modules for all + * random generation triggered via PSA crypto interfaces. + * + * \note This random generator must deliver random numbers with cryptographic + * quality and high performance. It must supply unpredictable numbers + * with a uniform distribution. The implementation of this function + * is responsible for ensuring that the random generator is seeded + * with sufficient entropy. If you have a hardware TRNG which is slow + * or delivers non-uniform output, declare it as an entropy source + * with mbedtls_entropy_add_source() instead of enabling this option. + * + * \param[in,out] context Pointer to the random generator context. + * This is all-bits-zero on the first call + * and preserved between successive calls. + * \param[out] output Output buffer. On success, this buffer + * contains random data with a uniform + * distribution. + * \param output_size The size of the \p output buffer in bytes. + * \param[out] output_length On success, set this value to \p output_size. + * + * \retval #PSA_SUCCESS + * Success. The output buffer contains \p output_size bytes of + * cryptographic-quality random data, and \c *output_length is + * set to \p output_size. + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY + * The random generator requires extra entropy and there is no + * way to obtain entropy under current environment conditions. + * This error should not happen under normal circumstances since + * this function is responsible for obtaining as much entropy as + * it needs. However implementations of this function may return + * #PSA_ERROR_INSUFFICIENT_ENTROPY if there is no way to obtain + * entropy without blocking indefinitely. + * \retval #PSA_ERROR_HARDWARE_FAILURE + * A failure of the random generator hardware that isn't covered + * by #PSA_ERROR_INSUFFICIENT_ENTROPY. + */ +psa_status_t mbedtls_psa_external_get_random( + mbedtls_psa_external_random_context_t *context, + uint8_t *output, size_t output_size, size_t *output_length); +#endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ + +/**@}*/ + +/** \defgroup psa_builtin_keys Built-in keys + * @{ + */ + +/** The minimum value for a key identifier that is built into the + * implementation. + * + * The range of key identifiers from #MBEDTLS_PSA_KEY_ID_BUILTIN_MIN + * to #MBEDTLS_PSA_KEY_ID_BUILTIN_MAX within the range from + * #PSA_KEY_ID_VENDOR_MIN and #PSA_KEY_ID_VENDOR_MAX and must not intersect + * with any other set of implementation-chosen key identifiers. + * + * This value is part of the library's API since changing it would invalidate + * the values of built-in key identifiers in applications. + */ +#define MBEDTLS_PSA_KEY_ID_BUILTIN_MIN ((psa_key_id_t) 0x7fff0000) + +/** The maximum value for a key identifier that is built into the + * implementation. + * + * See #MBEDTLS_PSA_KEY_ID_BUILTIN_MIN for more information. + */ +#define MBEDTLS_PSA_KEY_ID_BUILTIN_MAX ((psa_key_id_t) 0x7fffefff) + +/** A slot number identifying a key in a driver. + * + * Values of this type are used to identify built-in keys. + */ +typedef uint64_t psa_drv_slot_number_t; + +#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS) +/** Test whether a key identifier belongs to the builtin key range. + * + * \param key_id Key identifier to test. + * + * \retval 1 + * The key identifier is a builtin key identifier. + * \retval 0 + * The key identifier is not a builtin key identifier. + */ +static inline int psa_key_id_is_builtin(psa_key_id_t key_id) +{ + return (key_id >= MBEDTLS_PSA_KEY_ID_BUILTIN_MIN) && + (key_id <= MBEDTLS_PSA_KEY_ID_BUILTIN_MAX); +} + +/** Platform function to obtain the location and slot number of a built-in key. + * + * An application-specific implementation of this function must be provided if + * #MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS is enabled. This would typically be provided + * as part of a platform's system image. + * + * #MBEDTLS_SVC_KEY_ID_GET_KEY_ID(\p key_id) needs to be in the range from + * #MBEDTLS_PSA_KEY_ID_BUILTIN_MIN to #MBEDTLS_PSA_KEY_ID_BUILTIN_MAX. + * + * In a multi-application configuration + * (\c MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER is defined), + * this function should check that #MBEDTLS_SVC_KEY_ID_GET_OWNER_ID(\p key_id) + * is allowed to use the given key. + * + * \param key_id The key ID for which to retrieve the + * location and slot attributes. + * \param[out] lifetime On success, the lifetime associated with the key + * corresponding to \p key_id. Lifetime is a + * combination of which driver contains the key, + * and with what persistence level the key is + * intended to be used. If the platform + * implementation does not contain specific + * information about the intended key persistence + * level, the persistence level may be reported as + * #PSA_KEY_PERSISTENCE_DEFAULT. + * \param[out] slot_number On success, the slot number known to the driver + * registered at the lifetime location reported + * through \p lifetime which corresponds to the + * requested built-in key. + * + * \retval #PSA_SUCCESS + * The requested key identifier designates a built-in key. + * In a multi-application configuration, the requested owner + * is allowed to access it. + * \retval #PSA_ERROR_DOES_NOT_EXIST + * The requested key identifier is not a built-in key which is known + * to this function. If a key exists in the key storage with this + * identifier, the data from the storage will be used. + * \return (any other error) + * Any other error is propagated to the function that requested the key. + * Common errors include: + * - #PSA_ERROR_NOT_PERMITTED: the key exists but the requested owner + * is not allowed to access it. + */ +psa_status_t mbedtls_psa_platform_get_builtin_key( + mbedtls_svc_key_id_t key_id, + psa_key_lifetime_t *lifetime, + psa_drv_slot_number_t *slot_number); +#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */ + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* PSA_CRYPTO_EXTRA_H */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_platform.h b/ext/opcua_client/mbedtls/include/psa/crypto_platform.h new file mode 100644 index 0000000..ab6f1e8 --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_platform.h @@ -0,0 +1,99 @@ +/** + * \file psa/crypto_platform.h + * + * \brief PSA cryptography module: Mbed TLS platform definitions + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. + * + * This file contains platform-dependent type definitions. + * + * In implementations with isolation between the application and the + * cryptography module, implementers should take care to ensure that + * the definitions that are exposed to applications match what the + * module implements. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_PLATFORM_H +#define PSA_CRYPTO_PLATFORM_H + +/* Include the Mbed TLS configuration file, the way Mbed TLS does it + * in each of its header files. */ +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +/* Translate between classic MBEDTLS_xxx feature symbols and PSA_xxx + * feature symbols. */ +#include "mbedtls/config_psa.h" + +/* PSA requires several types which C99 provides in stdint.h. */ +#include + +#if (defined(__ARMCC_VERSION) || defined(_MSC_VER)) && \ + !defined(inline) && !defined(__cplusplus) +#define inline __inline +#endif + +#if defined(MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER) + +/* Building for the PSA Crypto service on a PSA platform, a key owner is a PSA + * partition identifier. + * + * The function psa_its_identifier_of_slot() in psa_crypto_storage.c that + * translates a key identifier to a key storage file name assumes that + * mbedtls_key_owner_id_t is a 32-bit integer. This function thus needs + * reworking if mbedtls_key_owner_id_t is not defined as a 32-bit integer + * here anymore. + */ +typedef int32_t mbedtls_key_owner_id_t; + +/** Compare two key owner identifiers. + * + * \param id1 First key owner identifier. + * \param id2 Second key owner identifier. + * + * \return Non-zero if the two key owner identifiers are equal, zero otherwise. + */ +static inline int mbedtls_key_owner_id_equal(mbedtls_key_owner_id_t id1, + mbedtls_key_owner_id_t id2) +{ + return id1 == id2; +} + +#endif /* MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER */ + +/* + * When MBEDTLS_PSA_CRYPTO_SPM is defined, the code is being built for SPM + * (Secure Partition Manager) integration which separates the code into two + * parts: NSPE (Non-Secure Processing Environment) and SPE (Secure Processing + * Environment). When building for the SPE, an additional header file should be + * included. + */ +#if defined(MBEDTLS_PSA_CRYPTO_SPM) +#define PSA_CRYPTO_SECURE 1 +#include "crypto_spe.h" +#endif // MBEDTLS_PSA_CRYPTO_SPM + +#if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) +/** The type of the context passed to mbedtls_psa_external_get_random(). + * + * Mbed TLS initializes the context to all-bits-zero before calling + * mbedtls_psa_external_get_random() for the first time. + * + * The definition of this type in the Mbed TLS source code is for + * demonstration purposes. Implementers of mbedtls_psa_external_get_random() + * are expected to replace it with a custom definition. + */ +typedef struct { + uintptr_t opaque[2]; +} mbedtls_psa_external_random_context_t; +#endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ + +#endif /* PSA_CRYPTO_PLATFORM_H */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_se_driver.h b/ext/opcua_client/mbedtls/include/psa/crypto_se_driver.h new file mode 100644 index 0000000..616850f --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_se_driver.h @@ -0,0 +1,1382 @@ +/** + * \file psa/crypto_se_driver.h + * \brief PSA external cryptoprocessor driver module + * + * This header declares types and function signatures for cryptography + * drivers that access key material via opaque references. + * This is meant for cryptoprocessors that have a separate key storage from the + * space in which the PSA Crypto implementation runs, typically secure + * elements (SEs). + * + * This file is part of the PSA Crypto Driver HAL (hardware abstraction layer), + * containing functions for driver developers to implement to enable hardware + * to be called in a standardized way by a PSA Cryptography API + * implementation. The functions comprising the driver HAL, which driver + * authors implement, are not intended to be called by application developers. + */ + +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef PSA_CRYPTO_SE_DRIVER_H +#define PSA_CRYPTO_SE_DRIVER_H + +#include "crypto_driver_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup se_init Secure element driver initialization + */ +/**@{*/ + +/** \brief Driver context structure + * + * Driver functions receive a pointer to this structure. + * Each registered driver has one instance of this structure. + * + * Implementations must include the fields specified here and + * may include other fields. + */ +typedef struct { + /** A read-only pointer to the driver's persistent data. + * + * Drivers typically use this persistent data to keep track of + * which slot numbers are available. This is only a guideline: + * drivers may use the persistent data for any purpose, keeping + * in mind the restrictions on when the persistent data is saved + * to storage: the persistent data is only saved after calling + * certain functions that receive a writable pointer to the + * persistent data. + * + * The core allocates a memory buffer for the persistent data. + * The pointer is guaranteed to be suitably aligned for any data type, + * like a pointer returned by `malloc` (but the core can use any + * method to allocate the buffer, not necessarily `malloc`). + * + * The size of this buffer is in the \c persistent_data_size field of + * this structure. + * + * Before the driver is initialized for the first time, the content of + * the persistent data is all-bits-zero. After a driver upgrade, if the + * size of the persistent data has increased, the original data is padded + * on the right with zeros; if the size has decreased, the original data + * is truncated to the new size. + * + * This pointer is to read-only data. Only a few driver functions are + * allowed to modify the persistent data. These functions receive a + * writable pointer. These functions are: + * - psa_drv_se_t::p_init + * - psa_drv_se_key_management_t::p_allocate + * - psa_drv_se_key_management_t::p_destroy + * + * The PSA Cryptography core saves the persistent data from one + * session to the next. It does this before returning from API functions + * that call a driver method that is allowed to modify the persistent + * data, specifically: + * - psa_crypto_init() causes a call to psa_drv_se_t::p_init, and may call + * psa_drv_se_key_management_t::p_destroy to complete an action + * that was interrupted by a power failure. + * - Key creation functions cause a call to + * psa_drv_se_key_management_t::p_allocate, and may cause a call to + * psa_drv_se_key_management_t::p_destroy in case an error occurs. + * - psa_destroy_key() causes a call to + * psa_drv_se_key_management_t::p_destroy. + */ + const void *const persistent_data; + + /** The size of \c persistent_data in bytes. + * + * This is always equal to the value of the `persistent_data_size` field + * of the ::psa_drv_se_t structure when the driver is registered. + */ + const size_t persistent_data_size; + + /** Driver transient data. + * + * The core initializes this value to 0 and does not read or modify it + * afterwards. The driver may store whatever it wants in this field. + */ + uintptr_t transient_data; +} psa_drv_se_context_t; + +/** \brief A driver initialization function. + * + * \param[in,out] drv_context The driver context structure. + * \param[in,out] persistent_data A pointer to the persistent data + * that allows writing. + * \param location The location value for which this driver + * is registered. The driver will be invoked + * for all keys whose lifetime is in this + * location. + * + * \retval #PSA_SUCCESS + * The driver is operational. + * The core will update the persistent data in storage. + * \return + * Any other return value prevents the driver from being used in + * this session. + * The core will NOT update the persistent data in storage. + */ +typedef psa_status_t (*psa_drv_se_init_t)(psa_drv_se_context_t *drv_context, + void *persistent_data, + psa_key_location_t location); + +#if defined(__DOXYGEN_ONLY__) || !defined(MBEDTLS_PSA_CRYPTO_SE_C) +/* Mbed TLS with secure element support enabled defines this type in + * crypto_types.h because it is also visible to applications through an + * implementation-specific extension. + * For the PSA Cryptography specification, this type is only visible + * via crypto_se_driver.h. */ +/** An internal designation of a key slot between the core part of the + * PSA Crypto implementation and the driver. The meaning of this value + * is driver-dependent. */ +typedef uint64_t psa_key_slot_number_t; +#endif /* __DOXYGEN_ONLY__ || !MBEDTLS_PSA_CRYPTO_SE_C */ + +/**@}*/ + +/** \defgroup se_mac Secure Element Message Authentication Codes + * Generation and authentication of Message Authentication Codes (MACs) using + * a secure element can be done either as a single function call (via the + * `psa_drv_se_mac_generate_t` or `psa_drv_se_mac_verify_t` functions), or in + * parts using the following sequence: + * - `psa_drv_se_mac_setup_t` + * - `psa_drv_se_mac_update_t` + * - `psa_drv_se_mac_update_t` + * - ... + * - `psa_drv_se_mac_finish_t` or `psa_drv_se_mac_finish_verify_t` + * + * If a previously started secure element MAC operation needs to be terminated, + * it should be done so by the `psa_drv_se_mac_abort_t`. Failure to do so may + * result in allocated resources not being freed or in other undefined + * behavior. + */ +/**@{*/ +/** \brief A function that starts a secure element MAC operation for a PSA + * Crypto Driver implementation + * + * \param[in,out] drv_context The driver context structure. + * \param[in,out] op_context A structure that will contain the + * hardware-specific MAC context + * \param[in] key_slot The slot of the key to be used for the + * operation + * \param[in] algorithm The algorithm to be used to underly the MAC + * operation + * + * \retval #PSA_SUCCESS + * Success. + */ +typedef psa_status_t (*psa_drv_se_mac_setup_t)(psa_drv_se_context_t *drv_context, + void *op_context, + psa_key_slot_number_t key_slot, + psa_algorithm_t algorithm); + +/** \brief A function that continues a previously started secure element MAC + * operation + * + * \param[in,out] op_context A hardware-specific structure for the + * previously-established MAC operation to be + * updated + * \param[in] p_input A buffer containing the message to be appended + * to the MAC operation + * \param[in] input_length The size in bytes of the input message buffer + */ +typedef psa_status_t (*psa_drv_se_mac_update_t)(void *op_context, + const uint8_t *p_input, + size_t input_length); + +/** \brief a function that completes a previously started secure element MAC + * operation by returning the resulting MAC. + * + * \param[in,out] op_context A hardware-specific structure for the + * previously started MAC operation to be + * finished + * \param[out] p_mac A buffer where the generated MAC will be + * placed + * \param[in] mac_size The size in bytes of the buffer that has been + * allocated for the `output` buffer + * \param[out] p_mac_length After completion, will contain the number of + * bytes placed in the `p_mac` buffer + * + * \retval #PSA_SUCCESS + * Success. + */ +typedef psa_status_t (*psa_drv_se_mac_finish_t)(void *op_context, + uint8_t *p_mac, + size_t mac_size, + size_t *p_mac_length); + +/** \brief A function that completes a previously started secure element MAC + * operation by comparing the resulting MAC against a provided value + * + * \param[in,out] op_context A hardware-specific structure for the previously + * started MAC operation to be finished + * \param[in] p_mac The MAC value against which the resulting MAC + * will be compared against + * \param[in] mac_length The size in bytes of the value stored in `p_mac` + * + * \retval #PSA_SUCCESS + * The operation completed successfully and the MACs matched each + * other + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The operation completed successfully, but the calculated MAC did + * not match the provided MAC + */ +typedef psa_status_t (*psa_drv_se_mac_finish_verify_t)(void *op_context, + const uint8_t *p_mac, + size_t mac_length); + +/** \brief A function that aborts a previous started secure element MAC + * operation + * + * \param[in,out] op_context A hardware-specific structure for the previously + * started MAC operation to be aborted + */ +typedef psa_status_t (*psa_drv_se_mac_abort_t)(void *op_context); + +/** \brief A function that performs a secure element MAC operation in one + * command and returns the calculated MAC + * + * \param[in,out] drv_context The driver context structure. + * \param[in] p_input A buffer containing the message to be MACed + * \param[in] input_length The size in bytes of `p_input` + * \param[in] key_slot The slot of the key to be used + * \param[in] alg The algorithm to be used to underlie the MAC + * operation + * \param[out] p_mac A buffer where the generated MAC will be + * placed + * \param[in] mac_size The size in bytes of the `p_mac` buffer + * \param[out] p_mac_length After completion, will contain the number of + * bytes placed in the `output` buffer + * + * \retval #PSA_SUCCESS + * Success. + */ +typedef psa_status_t (*psa_drv_se_mac_generate_t)(psa_drv_se_context_t *drv_context, + const uint8_t *p_input, + size_t input_length, + psa_key_slot_number_t key_slot, + psa_algorithm_t alg, + uint8_t *p_mac, + size_t mac_size, + size_t *p_mac_length); + +/** \brief A function that performs a secure element MAC operation in one + * command and compares the resulting MAC against a provided value + * + * \param[in,out] drv_context The driver context structure. + * \param[in] p_input A buffer containing the message to be MACed + * \param[in] input_length The size in bytes of `input` + * \param[in] key_slot The slot of the key to be used + * \param[in] alg The algorithm to be used to underlie the MAC + * operation + * \param[in] p_mac The MAC value against which the resulting MAC will + * be compared against + * \param[in] mac_length The size in bytes of `mac` + * + * \retval #PSA_SUCCESS + * The operation completed successfully and the MACs matched each + * other + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The operation completed successfully, but the calculated MAC did + * not match the provided MAC + */ +typedef psa_status_t (*psa_drv_se_mac_verify_t)(psa_drv_se_context_t *drv_context, + const uint8_t *p_input, + size_t input_length, + psa_key_slot_number_t key_slot, + psa_algorithm_t alg, + const uint8_t *p_mac, + size_t mac_length); + +/** \brief A struct containing all of the function pointers needed to + * perform secure element MAC operations + * + * PSA Crypto API implementations should populate the table as appropriate + * upon startup. + * + * If one of the functions is not implemented (such as + * `psa_drv_se_mac_generate_t`), it should be set to NULL. + * + * Driver implementers should ensure that they implement all of the functions + * that make sense for their hardware, and that they provide a full solution + * (for example, if they support `p_setup`, they should also support + * `p_update` and at least one of `p_finish` or `p_finish_verify`). + * + */ +typedef struct { + /**The size in bytes of the hardware-specific secure element MAC context + * structure + */ + size_t context_size; + /** Function that performs a MAC setup operation + */ + psa_drv_se_mac_setup_t p_setup; + /** Function that performs a MAC update operation + */ + psa_drv_se_mac_update_t p_update; + /** Function that completes a MAC operation + */ + psa_drv_se_mac_finish_t p_finish; + /** Function that completes a MAC operation with a verify check + */ + psa_drv_se_mac_finish_verify_t p_finish_verify; + /** Function that aborts a previously started MAC operation + */ + psa_drv_se_mac_abort_t p_abort; + /** Function that performs a MAC operation in one call + */ + psa_drv_se_mac_generate_t p_mac; + /** Function that performs a MAC and verify operation in one call + */ + psa_drv_se_mac_verify_t p_mac_verify; +} psa_drv_se_mac_t; +/**@}*/ + +/** \defgroup se_cipher Secure Element Symmetric Ciphers + * + * Encryption and Decryption using secure element keys in block modes other + * than ECB must be done in multiple parts, using the following flow: + * - `psa_drv_se_cipher_setup_t` + * - `psa_drv_se_cipher_set_iv_t` (optional depending upon block mode) + * - `psa_drv_se_cipher_update_t` + * - `psa_drv_se_cipher_update_t` + * - ... + * - `psa_drv_se_cipher_finish_t` + * + * If a previously started secure element Cipher operation needs to be + * terminated, it should be done so by the `psa_drv_se_cipher_abort_t`. Failure + * to do so may result in allocated resources not being freed or in other + * undefined behavior. + * + * In situations where a PSA Cryptographic API implementation is using a block + * mode not-supported by the underlying hardware or driver, it can construct + * the block mode itself, while calling the `psa_drv_se_cipher_ecb_t` function + * for the cipher operations. + */ +/**@{*/ + +/** \brief A function that provides the cipher setup function for a + * secure element driver + * + * \param[in,out] drv_context The driver context structure. + * \param[in,out] op_context A structure that will contain the + * hardware-specific cipher context. + * \param[in] key_slot The slot of the key to be used for the + * operation + * \param[in] algorithm The algorithm to be used in the cipher + * operation + * \param[in] direction Indicates whether the operation is an encrypt + * or decrypt + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + */ +typedef psa_status_t (*psa_drv_se_cipher_setup_t)(psa_drv_se_context_t *drv_context, + void *op_context, + psa_key_slot_number_t key_slot, + psa_algorithm_t algorithm, + psa_encrypt_or_decrypt_t direction); + +/** \brief A function that sets the initialization vector (if + * necessary) for a secure element cipher operation + * + * Rationale: The `psa_se_cipher_*` operation in the PSA Cryptographic API has + * two IV functions: one to set the IV, and one to generate it internally. The + * generate function is not necessary for the drivers to implement as the PSA + * Crypto implementation can do the generation using its RNG features. + * + * \param[in,out] op_context A structure that contains the previously set up + * hardware-specific cipher context + * \param[in] p_iv A buffer containing the initialization vector + * \param[in] iv_length The size (in bytes) of the `p_iv` buffer + * + * \retval #PSA_SUCCESS \emptydescription + */ +typedef psa_status_t (*psa_drv_se_cipher_set_iv_t)(void *op_context, + const uint8_t *p_iv, + size_t iv_length); + +/** \brief A function that continues a previously started secure element cipher + * operation + * + * \param[in,out] op_context A hardware-specific structure for the + * previously started cipher operation + * \param[in] p_input A buffer containing the data to be + * encrypted/decrypted + * \param[in] input_size The size in bytes of the buffer pointed to + * by `p_input` + * \param[out] p_output The caller-allocated buffer where the + * output will be placed + * \param[in] output_size The allocated size in bytes of the + * `p_output` buffer + * \param[out] p_output_length After completion, will contain the number + * of bytes placed in the `p_output` buffer + * + * \retval #PSA_SUCCESS \emptydescription + */ +typedef psa_status_t (*psa_drv_se_cipher_update_t)(void *op_context, + const uint8_t *p_input, + size_t input_size, + uint8_t *p_output, + size_t output_size, + size_t *p_output_length); + +/** \brief A function that completes a previously started secure element cipher + * operation + * + * \param[in,out] op_context A hardware-specific structure for the + * previously started cipher operation + * \param[out] p_output The caller-allocated buffer where the output + * will be placed + * \param[in] output_size The allocated size in bytes of the `p_output` + * buffer + * \param[out] p_output_length After completion, will contain the number of + * bytes placed in the `p_output` buffer + * + * \retval #PSA_SUCCESS \emptydescription + */ +typedef psa_status_t (*psa_drv_se_cipher_finish_t)(void *op_context, + uint8_t *p_output, + size_t output_size, + size_t *p_output_length); + +/** \brief A function that aborts a previously started secure element cipher + * operation + * + * \param[in,out] op_context A hardware-specific structure for the + * previously started cipher operation + */ +typedef psa_status_t (*psa_drv_se_cipher_abort_t)(void *op_context); + +/** \brief A function that performs the ECB block mode for secure element + * cipher operations + * + * Note: this function should only be used with implementations that do not + * provide a needed higher-level operation. + * + * \param[in,out] drv_context The driver context structure. + * \param[in] key_slot The slot of the key to be used for the operation + * \param[in] algorithm The algorithm to be used in the cipher operation + * \param[in] direction Indicates whether the operation is an encrypt or + * decrypt + * \param[in] p_input A buffer containing the data to be + * encrypted/decrypted + * \param[in] input_size The size in bytes of the buffer pointed to by + * `p_input` + * \param[out] p_output The caller-allocated buffer where the output + * will be placed + * \param[in] output_size The allocated size in bytes of the `p_output` + * buffer + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + */ +typedef psa_status_t (*psa_drv_se_cipher_ecb_t)(psa_drv_se_context_t *drv_context, + psa_key_slot_number_t key_slot, + psa_algorithm_t algorithm, + psa_encrypt_or_decrypt_t direction, + const uint8_t *p_input, + size_t input_size, + uint8_t *p_output, + size_t output_size); + +/** + * \brief A struct containing all of the function pointers needed to implement + * cipher operations using secure elements. + * + * PSA Crypto API implementations should populate instances of the table as + * appropriate upon startup or at build time. + * + * If one of the functions is not implemented (such as + * `psa_drv_se_cipher_ecb_t`), it should be set to NULL. + */ +typedef struct { + /** The size in bytes of the hardware-specific secure element cipher + * context structure + */ + size_t context_size; + /** Function that performs a cipher setup operation */ + psa_drv_se_cipher_setup_t p_setup; + /** Function that sets a cipher IV (if necessary) */ + psa_drv_se_cipher_set_iv_t p_set_iv; + /** Function that performs a cipher update operation */ + psa_drv_se_cipher_update_t p_update; + /** Function that completes a cipher operation */ + psa_drv_se_cipher_finish_t p_finish; + /** Function that aborts a cipher operation */ + psa_drv_se_cipher_abort_t p_abort; + /** Function that performs ECB mode for a cipher operation + * (Danger: ECB mode should not be used directly by clients of the PSA + * Crypto Client API) + */ + psa_drv_se_cipher_ecb_t p_ecb; +} psa_drv_se_cipher_t; + +/**@}*/ + +/** \defgroup se_asymmetric Secure Element Asymmetric Cryptography + * + * Since the amount of data that can (or should) be encrypted or signed using + * asymmetric keys is limited by the key size, asymmetric key operations using + * keys in a secure element must be done in single function calls. + */ +/**@{*/ + +/** + * \brief A function that signs a hash or short message with a private key in + * a secure element + * + * \param[in,out] drv_context The driver context structure. + * \param[in] key_slot Key slot of an asymmetric key pair + * \param[in] alg A signature algorithm that is compatible + * with the type of `key` + * \param[in] p_hash The hash to sign + * \param[in] hash_length Size of the `p_hash` buffer in bytes + * \param[out] p_signature Buffer where the signature is to be written + * \param[in] signature_size Size of the `p_signature` buffer in bytes + * \param[out] p_signature_length On success, the number of bytes + * that make up the returned signature value + * + * \retval #PSA_SUCCESS \emptydescription + */ +typedef psa_status_t (*psa_drv_se_asymmetric_sign_t)(psa_drv_se_context_t *drv_context, + psa_key_slot_number_t key_slot, + psa_algorithm_t alg, + const uint8_t *p_hash, + size_t hash_length, + uint8_t *p_signature, + size_t signature_size, + size_t *p_signature_length); + +/** + * \brief A function that verifies the signature a hash or short message using + * an asymmetric public key in a secure element + * + * \param[in,out] drv_context The driver context structure. + * \param[in] key_slot Key slot of a public key or an asymmetric key + * pair + * \param[in] alg A signature algorithm that is compatible with + * the type of `key` + * \param[in] p_hash The hash whose signature is to be verified + * \param[in] hash_length Size of the `p_hash` buffer in bytes + * \param[in] p_signature Buffer containing the signature to verify + * \param[in] signature_length Size of the `p_signature` buffer in bytes + * + * \retval #PSA_SUCCESS + * The signature is valid. + */ +typedef psa_status_t (*psa_drv_se_asymmetric_verify_t)(psa_drv_se_context_t *drv_context, + psa_key_slot_number_t key_slot, + psa_algorithm_t alg, + const uint8_t *p_hash, + size_t hash_length, + const uint8_t *p_signature, + size_t signature_length); + +/** + * \brief A function that encrypts a short message with an asymmetric public + * key in a secure element + * + * \param[in,out] drv_context The driver context structure. + * \param[in] key_slot Key slot of a public key or an asymmetric key + * pair + * \param[in] alg An asymmetric encryption algorithm that is + * compatible with the type of `key` + * \param[in] p_input The message to encrypt + * \param[in] input_length Size of the `p_input` buffer in bytes + * \param[in] p_salt A salt or label, if supported by the + * encryption algorithm + * If the algorithm does not support a + * salt, pass `NULL`. + * If the algorithm supports an optional + * salt and you do not want to pass a salt, + * pass `NULL`. + * For #PSA_ALG_RSA_PKCS1V15_CRYPT, no salt is + * supported. + * \param[in] salt_length Size of the `p_salt` buffer in bytes + * If `p_salt` is `NULL`, pass 0. + * \param[out] p_output Buffer where the encrypted message is to + * be written + * \param[in] output_size Size of the `p_output` buffer in bytes + * \param[out] p_output_length On success, the number of bytes that make up + * the returned output + * + * \retval #PSA_SUCCESS \emptydescription + */ +typedef psa_status_t (*psa_drv_se_asymmetric_encrypt_t)(psa_drv_se_context_t *drv_context, + psa_key_slot_number_t key_slot, + psa_algorithm_t alg, + const uint8_t *p_input, + size_t input_length, + const uint8_t *p_salt, + size_t salt_length, + uint8_t *p_output, + size_t output_size, + size_t *p_output_length); + +/** + * \brief A function that decrypts a short message with an asymmetric private + * key in a secure element. + * + * \param[in,out] drv_context The driver context structure. + * \param[in] key_slot Key slot of an asymmetric key pair + * \param[in] alg An asymmetric encryption algorithm that is + * compatible with the type of `key` + * \param[in] p_input The message to decrypt + * \param[in] input_length Size of the `p_input` buffer in bytes + * \param[in] p_salt A salt or label, if supported by the + * encryption algorithm + * If the algorithm does not support a + * salt, pass `NULL`. + * If the algorithm supports an optional + * salt and you do not want to pass a salt, + * pass `NULL`. + * For #PSA_ALG_RSA_PKCS1V15_CRYPT, no salt is + * supported. + * \param[in] salt_length Size of the `p_salt` buffer in bytes + * If `p_salt` is `NULL`, pass 0. + * \param[out] p_output Buffer where the decrypted message is to + * be written + * \param[in] output_size Size of the `p_output` buffer in bytes + * \param[out] p_output_length On success, the number of bytes + * that make up the returned output + * + * \retval #PSA_SUCCESS \emptydescription + */ +typedef psa_status_t (*psa_drv_se_asymmetric_decrypt_t)(psa_drv_se_context_t *drv_context, + psa_key_slot_number_t key_slot, + psa_algorithm_t alg, + const uint8_t *p_input, + size_t input_length, + const uint8_t *p_salt, + size_t salt_length, + uint8_t *p_output, + size_t output_size, + size_t *p_output_length); + +/** + * \brief A struct containing all of the function pointers needed to implement + * asymmetric cryptographic operations using secure elements. + * + * PSA Crypto API implementations should populate instances of the table as + * appropriate upon startup or at build time. + * + * If one of the functions is not implemented, it should be set to NULL. + */ +typedef struct { + /** Function that performs an asymmetric sign operation */ + psa_drv_se_asymmetric_sign_t p_sign; + /** Function that performs an asymmetric verify operation */ + psa_drv_se_asymmetric_verify_t p_verify; + /** Function that performs an asymmetric encrypt operation */ + psa_drv_se_asymmetric_encrypt_t p_encrypt; + /** Function that performs an asymmetric decrypt operation */ + psa_drv_se_asymmetric_decrypt_t p_decrypt; +} psa_drv_se_asymmetric_t; + +/**@}*/ + +/** \defgroup se_aead Secure Element Authenticated Encryption with Additional Data + * Authenticated Encryption with Additional Data (AEAD) operations with secure + * elements must be done in one function call. While this creates a burden for + * implementers as there must be sufficient space in memory for the entire + * message, it prevents decrypted data from being made available before the + * authentication operation is complete and the data is known to be authentic. + */ +/**@{*/ + +/** \brief A function that performs a secure element authenticated encryption + * operation + * + * \param[in,out] drv_context The driver context structure. + * \param[in] key_slot Slot containing the key to use. + * \param[in] algorithm The AEAD algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(`alg`) is true) + * \param[in] p_nonce Nonce or IV to use + * \param[in] nonce_length Size of the `p_nonce` buffer in bytes + * \param[in] p_additional_data Additional data that will be + * authenticated but not encrypted + * \param[in] additional_data_length Size of `p_additional_data` in bytes + * \param[in] p_plaintext Data that will be authenticated and + * encrypted + * \param[in] plaintext_length Size of `p_plaintext` in bytes + * \param[out] p_ciphertext Output buffer for the authenticated and + * encrypted data. The additional data is + * not part of this output. For algorithms + * where the encrypted data and the + * authentication tag are defined as + * separate outputs, the authentication + * tag is appended to the encrypted data. + * \param[in] ciphertext_size Size of the `p_ciphertext` buffer in + * bytes + * \param[out] p_ciphertext_length On success, the size of the output in + * the `p_ciphertext` buffer + * + * \retval #PSA_SUCCESS + * Success. + */ +typedef psa_status_t (*psa_drv_se_aead_encrypt_t)(psa_drv_se_context_t *drv_context, + psa_key_slot_number_t key_slot, + psa_algorithm_t algorithm, + const uint8_t *p_nonce, + size_t nonce_length, + const uint8_t *p_additional_data, + size_t additional_data_length, + const uint8_t *p_plaintext, + size_t plaintext_length, + uint8_t *p_ciphertext, + size_t ciphertext_size, + size_t *p_ciphertext_length); + +/** A function that performs a secure element authenticated decryption operation + * + * \param[in,out] drv_context The driver context structure. + * \param[in] key_slot Slot containing the key to use + * \param[in] algorithm The AEAD algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(`alg`) is true) + * \param[in] p_nonce Nonce or IV to use + * \param[in] nonce_length Size of the `p_nonce` buffer in bytes + * \param[in] p_additional_data Additional data that has been + * authenticated but not encrypted + * \param[in] additional_data_length Size of `p_additional_data` in bytes + * \param[in] p_ciphertext Data that has been authenticated and + * encrypted. + * For algorithms where the encrypted data + * and the authentication tag are defined + * as separate inputs, the buffer must + * contain the encrypted data followed by + * the authentication tag. + * \param[in] ciphertext_length Size of `p_ciphertext` in bytes + * \param[out] p_plaintext Output buffer for the decrypted data + * \param[in] plaintext_size Size of the `p_plaintext` buffer in + * bytes + * \param[out] p_plaintext_length On success, the size of the output in + * the `p_plaintext` buffer + * + * \retval #PSA_SUCCESS + * Success. + */ +typedef psa_status_t (*psa_drv_se_aead_decrypt_t)(psa_drv_se_context_t *drv_context, + psa_key_slot_number_t key_slot, + psa_algorithm_t algorithm, + const uint8_t *p_nonce, + size_t nonce_length, + const uint8_t *p_additional_data, + size_t additional_data_length, + const uint8_t *p_ciphertext, + size_t ciphertext_length, + uint8_t *p_plaintext, + size_t plaintext_size, + size_t *p_plaintext_length); + +/** + * \brief A struct containing all of the function pointers needed to implement + * secure element Authenticated Encryption with Additional Data operations + * + * PSA Crypto API implementations should populate instances of the table as + * appropriate upon startup. + * + * If one of the functions is not implemented, it should be set to NULL. + */ +typedef struct { + /** Function that performs the AEAD encrypt operation */ + psa_drv_se_aead_encrypt_t p_encrypt; + /** Function that performs the AEAD decrypt operation */ + psa_drv_se_aead_decrypt_t p_decrypt; +} psa_drv_se_aead_t; +/**@}*/ + +/** \defgroup se_key_management Secure Element Key Management + * Currently, key management is limited to importing keys in the clear, + * destroying keys, and exporting keys in the clear. + * Whether a key may be exported is determined by the key policies in place + * on the key slot. + */ +/**@{*/ + +/** An enumeration indicating how a key is created. + */ +typedef enum { + PSA_KEY_CREATION_IMPORT, /**< During psa_import_key() */ + PSA_KEY_CREATION_GENERATE, /**< During psa_generate_key() */ + PSA_KEY_CREATION_DERIVE, /**< During psa_key_derivation_output_key() */ + PSA_KEY_CREATION_COPY, /**< During psa_copy_key() */ + +#ifndef __DOXYGEN_ONLY__ + /** A key is being registered with mbedtls_psa_register_se_key(). + * + * The core only passes this value to + * psa_drv_se_key_management_t::p_validate_slot_number, not to + * psa_drv_se_key_management_t::p_allocate. The call to + * `p_validate_slot_number` is not followed by any other call to the + * driver: the key is considered successfully registered if the call to + * `p_validate_slot_number` succeeds, or if `p_validate_slot_number` is + * null. + * + * With this creation method, the driver must return #PSA_SUCCESS if + * the given attributes are compatible with the existing key in the slot, + * and #PSA_ERROR_DOES_NOT_EXIST if the driver can determine that there + * is no key with the specified slot number. + * + * This is an Mbed TLS extension. + */ + PSA_KEY_CREATION_REGISTER, +#endif +} psa_key_creation_method_t; + +/** \brief A function that allocates a slot for a key. + * + * To create a key in a specific slot in a secure element, the core + * first calls this function to determine a valid slot number, + * then calls a function to create the key material in that slot. + * In nominal conditions (that is, if no error occurs), + * the effect of a call to a key creation function in the PSA Cryptography + * API with a lifetime that places the key in a secure element is the + * following: + * -# The core calls psa_drv_se_key_management_t::p_allocate + * (or in some implementations + * psa_drv_se_key_management_t::p_validate_slot_number). The driver + * selects (or validates) a suitable slot number given the key attributes + * and the state of the secure element. + * -# The core calls a key creation function in the driver. + * + * The key creation functions in the PSA Cryptography API are: + * - psa_import_key(), which causes + * a call to `p_allocate` with \p method = #PSA_KEY_CREATION_IMPORT + * then a call to psa_drv_se_key_management_t::p_import. + * - psa_generate_key(), which causes + * a call to `p_allocate` with \p method = #PSA_KEY_CREATION_GENERATE + * then a call to psa_drv_se_key_management_t::p_import. + * - psa_key_derivation_output_key(), which causes + * a call to `p_allocate` with \p method = #PSA_KEY_CREATION_DERIVE + * then a call to psa_drv_se_key_derivation_t::p_derive. + * - psa_copy_key(), which causes + * a call to `p_allocate` with \p method = #PSA_KEY_CREATION_COPY + * then a call to psa_drv_se_key_management_t::p_export. + * + * In case of errors, other behaviors are possible. + * - If the PSA Cryptography subsystem dies after the first step, + * for example because the device has lost power abruptly, + * the second step may never happen, or may happen after a reset + * and re-initialization. Alternatively, after a reset and + * re-initialization, the core may call + * psa_drv_se_key_management_t::p_destroy on the slot number that + * was allocated (or validated) instead of calling a key creation function. + * - If an error occurs, the core may call + * psa_drv_se_key_management_t::p_destroy on the slot number that + * was allocated (or validated) instead of calling a key creation function. + * + * Errors and system resets also have an impact on the driver's persistent + * data. If a reset happens before the overall key creation process is + * completed (before or after the second step above), it is unspecified + * whether the persistent data after the reset is identical to what it + * was before or after the call to `p_allocate` (or `p_validate_slot_number`). + * + * \param[in,out] drv_context The driver context structure. + * \param[in,out] persistent_data A pointer to the persistent data + * that allows writing. + * \param[in] attributes Attributes of the key. + * \param method The way in which the key is being created. + * \param[out] key_slot Slot where the key will be stored. + * This must be a valid slot for a key of the + * chosen type. It must be unoccupied. + * + * \retval #PSA_SUCCESS + * Success. + * The core will record \c *key_slot as the key slot where the key + * is stored and will update the persistent data in storage. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription + */ +typedef psa_status_t (*psa_drv_se_allocate_key_t)( + psa_drv_se_context_t *drv_context, + void *persistent_data, + const psa_key_attributes_t *attributes, + psa_key_creation_method_t method, + psa_key_slot_number_t *key_slot); + +/** \brief A function that determines whether a slot number is valid + * for a key. + * + * To create a key in a specific slot in a secure element, the core + * first calls this function to validate the choice of slot number, + * then calls a function to create the key material in that slot. + * See the documentation of #psa_drv_se_allocate_key_t for more details. + * + * As of the PSA Cryptography API specification version 1.0, there is no way + * for applications to trigger a call to this function. However some + * implementations offer the capability to create or declare a key in + * a specific slot via implementation-specific means, generally for the + * sake of initial device provisioning or onboarding. Such a mechanism may + * be added to a future version of the PSA Cryptography API specification. + * + * This function may update the driver's persistent data through + * \p persistent_data. The core will save the updated persistent data at the + * end of the key creation process. See the description of + * ::psa_drv_se_allocate_key_t for more information. + * + * \param[in,out] drv_context The driver context structure. + * \param[in,out] persistent_data A pointer to the persistent data + * that allows writing. + * \param[in] attributes Attributes of the key. + * \param method The way in which the key is being created. + * \param[in] key_slot Slot where the key is to be stored. + * + * \retval #PSA_SUCCESS + * The given slot number is valid for a key with the given + * attributes. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The given slot number is not valid for a key with the + * given attributes. This includes the case where the slot + * number is not valid at all. + * \retval #PSA_ERROR_ALREADY_EXISTS + * There is already a key with the specified slot number. + * Drivers may choose to return this error from the key + * creation function instead. + */ +typedef psa_status_t (*psa_drv_se_validate_slot_number_t)( + psa_drv_se_context_t *drv_context, + void *persistent_data, + const psa_key_attributes_t *attributes, + psa_key_creation_method_t method, + psa_key_slot_number_t key_slot); + +/** \brief A function that imports a key into a secure element in binary format + * + * This function can support any output from psa_export_key(). Refer to the + * documentation of psa_export_key() for the format for each key type. + * + * \param[in,out] drv_context The driver context structure. + * \param key_slot Slot where the key will be stored. + * This must be a valid slot for a key of the + * chosen type. It must be unoccupied. + * \param[in] attributes The key attributes, including the lifetime, + * the key type and the usage policy. + * Drivers should not access the key size stored + * in the attributes: it may not match the + * data passed in \p data. + * Drivers can call psa_get_key_lifetime(), + * psa_get_key_type(), + * psa_get_key_usage_flags() and + * psa_get_key_algorithm() to access this + * information. + * \param[in] data Buffer containing the key data. + * \param[in] data_length Size of the \p data buffer in bytes. + * \param[out] bits On success, the key size in bits. The driver + * must determine this value after parsing the + * key according to the key type. + * This value is not used if the function fails. + * + * \retval #PSA_SUCCESS + * Success. + */ +typedef psa_status_t (*psa_drv_se_import_key_t)( + psa_drv_se_context_t *drv_context, + psa_key_slot_number_t key_slot, + const psa_key_attributes_t *attributes, + const uint8_t *data, + size_t data_length, + size_t *bits); + +/** + * \brief A function that destroys a secure element key and restore the slot to + * its default state + * + * This function destroys the content of the key from a secure element. + * Implementations shall make a best effort to ensure that any previous content + * of the slot is unrecoverable. + * + * This function returns the specified slot to its default state. + * + * \param[in,out] drv_context The driver context structure. + * \param[in,out] persistent_data A pointer to the persistent data + * that allows writing. + * \param key_slot The key slot to erase. + * + * \retval #PSA_SUCCESS + * The slot's content, if any, has been erased. + */ +typedef psa_status_t (*psa_drv_se_destroy_key_t)( + psa_drv_se_context_t *drv_context, + void *persistent_data, + psa_key_slot_number_t key_slot); + +/** + * \brief A function that exports a secure element key in binary format + * + * The output of this function can be passed to psa_import_key() to + * create an equivalent object. + * + * If a key is created with `psa_import_key()` and then exported with + * this function, it is not guaranteed that the resulting data is + * identical: the implementation may choose a different representation + * of the same key if the format permits it. + * + * This function should generate output in the same format that + * `psa_export_key()` does. Refer to the + * documentation of `psa_export_key()` for the format for each key type. + * + * \param[in,out] drv_context The driver context structure. + * \param[in] key Slot whose content is to be exported. This must + * be an occupied key slot. + * \param[out] p_data Buffer where the key data is to be written. + * \param[in] data_size Size of the `p_data` buffer in bytes. + * \param[out] p_data_length On success, the number of bytes + * that make up the key data. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_DOES_NOT_EXIST \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +typedef psa_status_t (*psa_drv_se_export_key_t)(psa_drv_se_context_t *drv_context, + psa_key_slot_number_t key, + uint8_t *p_data, + size_t data_size, + size_t *p_data_length); + +/** + * \brief A function that generates a symmetric or asymmetric key on a secure + * element + * + * If the key type \c type recorded in \p attributes + * is asymmetric (#PSA_KEY_TYPE_IS_ASYMMETRIC(\c type) = 1), + * the driver may export the public key at the time of generation, + * in the format documented for psa_export_public_key() by writing it + * to the \p pubkey buffer. + * This is optional, intended for secure elements that output the + * public key at generation time and that cannot export the public key + * later. Drivers that do not need this feature should leave + * \p *pubkey_length set to 0 and should + * implement the psa_drv_key_management_t::p_export_public function. + * Some implementations do not support this feature, in which case + * \p pubkey is \c NULL and \p pubkey_size is 0. + * + * \param[in,out] drv_context The driver context structure. + * \param key_slot Slot where the key will be stored. + * This must be a valid slot for a key of the + * chosen type. It must be unoccupied. + * \param[in] attributes The key attributes, including the lifetime, + * the key type and size, and the usage policy. + * Drivers can call psa_get_key_lifetime(), + * psa_get_key_type(), psa_get_key_bits(), + * psa_get_key_usage_flags() and + * psa_get_key_algorithm() to access this + * information. + * \param[out] pubkey A buffer where the driver can write the + * public key, when generating an asymmetric + * key pair. + * This is \c NULL when generating a symmetric + * key or if the core does not support + * exporting the public key at generation time. + * \param pubkey_size The size of the `pubkey` buffer in bytes. + * This is 0 when generating a symmetric + * key or if the core does not support + * exporting the public key at generation time. + * \param[out] pubkey_length On entry, this is always 0. + * On success, the number of bytes written to + * \p pubkey. If this is 0 or unchanged on return, + * the core will not read the \p pubkey buffer, + * and will instead call the driver's + * psa_drv_key_management_t::p_export_public + * function to export the public key when needed. + */ +typedef psa_status_t (*psa_drv_se_generate_key_t)( + psa_drv_se_context_t *drv_context, + psa_key_slot_number_t key_slot, + const psa_key_attributes_t *attributes, + uint8_t *pubkey, size_t pubkey_size, size_t *pubkey_length); + +/** + * \brief A struct containing all of the function pointers needed to for secure + * element key management + * + * PSA Crypto API implementations should populate instances of the table as + * appropriate upon startup or at build time. + * + * If one of the functions is not implemented, it should be set to NULL. + */ +typedef struct { + /** Function that allocates a slot for a key. */ + psa_drv_se_allocate_key_t p_allocate; + /** Function that checks the validity of a slot for a key. */ + psa_drv_se_validate_slot_number_t p_validate_slot_number; + /** Function that performs a key import operation */ + psa_drv_se_import_key_t p_import; + /** Function that performs a generation */ + psa_drv_se_generate_key_t p_generate; + /** Function that performs a key destroy operation */ + psa_drv_se_destroy_key_t p_destroy; + /** Function that performs a key export operation */ + psa_drv_se_export_key_t p_export; + /** Function that performs a public key export operation */ + psa_drv_se_export_key_t p_export_public; +} psa_drv_se_key_management_t; + +/**@}*/ + +/** \defgroup driver_derivation Secure Element Key Derivation and Agreement + * Key derivation is the process of generating new key material using an + * existing key and additional parameters, iterating through a basic + * cryptographic function, such as a hash. + * Key agreement is a part of cryptographic protocols that allows two parties + * to agree on the same key value, but starting from different original key + * material. + * The flows are similar, and the PSA Crypto Driver Model uses the same functions + * for both of the flows. + * + * There are two different final functions for the flows, + * `psa_drv_se_key_derivation_derive` and `psa_drv_se_key_derivation_export`. + * `psa_drv_se_key_derivation_derive` is used when the key material should be + * placed in a slot on the hardware and not exposed to the caller. + * `psa_drv_se_key_derivation_export` is used when the key material should be + * returned to the PSA Cryptographic API implementation. + * + * Different key derivation algorithms require a different number of inputs. + * Instead of having an API that takes as input variable length arrays, which + * can be problematic to manage on embedded platforms, the inputs are passed + * to the driver via a function, `psa_drv_se_key_derivation_collateral`, that + * is called multiple times with different `collateral_id`s. Thus, for a key + * derivation algorithm that required 3 parameter inputs, the flow would look + * something like: + * ~~~~~~~~~~~~~{.c} + * psa_drv_se_key_derivation_setup(kdf_algorithm, source_key, dest_key_size_bytes); + * psa_drv_se_key_derivation_collateral(kdf_algorithm_collateral_id_0, + * p_collateral_0, + * collateral_0_size); + * psa_drv_se_key_derivation_collateral(kdf_algorithm_collateral_id_1, + * p_collateral_1, + * collateral_1_size); + * psa_drv_se_key_derivation_collateral(kdf_algorithm_collateral_id_2, + * p_collateral_2, + * collateral_2_size); + * psa_drv_se_key_derivation_derive(); + * ~~~~~~~~~~~~~ + * + * key agreement example: + * ~~~~~~~~~~~~~{.c} + * psa_drv_se_key_derivation_setup(alg, source_key. dest_key_size_bytes); + * psa_drv_se_key_derivation_collateral(DHE_PUBKEY, p_pubkey, pubkey_size); + * psa_drv_se_key_derivation_export(p_session_key, + * session_key_size, + * &session_key_length); + * ~~~~~~~~~~~~~ + */ +/**@{*/ + +/** \brief A function that Sets up a secure element key derivation operation by + * specifying the algorithm and the source key sot + * + * \param[in,out] drv_context The driver context structure. + * \param[in,out] op_context A hardware-specific structure containing any + * context information for the implementation + * \param[in] kdf_alg The algorithm to be used for the key derivation + * \param[in] source_key The key to be used as the source material for + * the key derivation + * + * \retval #PSA_SUCCESS \emptydescription + */ +typedef psa_status_t (*psa_drv_se_key_derivation_setup_t)(psa_drv_se_context_t *drv_context, + void *op_context, + psa_algorithm_t kdf_alg, + psa_key_slot_number_t source_key); + +/** \brief A function that provides collateral (parameters) needed for a secure + * element key derivation or key agreement operation + * + * Since many key derivation algorithms require multiple parameters, it is + * expected that this function may be called multiple times for the same + * operation, each with a different algorithm-specific `collateral_id` + * + * \param[in,out] op_context A hardware-specific structure containing any + * context information for the implementation + * \param[in] collateral_id An ID for the collateral being provided + * \param[in] p_collateral A buffer containing the collateral data + * \param[in] collateral_size The size in bytes of the collateral + * + * \retval #PSA_SUCCESS \emptydescription + */ +typedef psa_status_t (*psa_drv_se_key_derivation_collateral_t)(void *op_context, + uint32_t collateral_id, + const uint8_t *p_collateral, + size_t collateral_size); + +/** \brief A function that performs the final secure element key derivation + * step and place the generated key material in a slot + * + * \param[in,out] op_context A hardware-specific structure containing any + * context information for the implementation + * \param[in] dest_key The slot where the generated key material + * should be placed + * + * \retval #PSA_SUCCESS \emptydescription + */ +typedef psa_status_t (*psa_drv_se_key_derivation_derive_t)(void *op_context, + psa_key_slot_number_t dest_key); + +/** \brief A function that performs the final step of a secure element key + * agreement and place the generated key material in a buffer + * + * \param[out] p_output Buffer in which to place the generated key + * material + * \param[in] output_size The size in bytes of `p_output` + * \param[out] p_output_length Upon success, contains the number of bytes of + * key material placed in `p_output` + * + * \retval #PSA_SUCCESS \emptydescription + */ +typedef psa_status_t (*psa_drv_se_key_derivation_export_t)(void *op_context, + uint8_t *p_output, + size_t output_size, + size_t *p_output_length); + +/** + * \brief A struct containing all of the function pointers needed to for secure + * element key derivation and agreement + * + * PSA Crypto API implementations should populate instances of the table as + * appropriate upon startup. + * + * If one of the functions is not implemented, it should be set to NULL. + */ +typedef struct { + /** The driver-specific size of the key derivation context */ + size_t context_size; + /** Function that performs a key derivation setup */ + psa_drv_se_key_derivation_setup_t p_setup; + /** Function that sets key derivation collateral */ + psa_drv_se_key_derivation_collateral_t p_collateral; + /** Function that performs a final key derivation step */ + psa_drv_se_key_derivation_derive_t p_derive; + /** Function that performs a final key derivation or agreement and + * exports the key */ + psa_drv_se_key_derivation_export_t p_export; +} psa_drv_se_key_derivation_t; + +/**@}*/ + +/** \defgroup se_registration Secure element driver registration + */ +/**@{*/ + +/** A structure containing pointers to all the entry points of a + * secure element driver. + * + * Future versions of this specification may add extra substructures at + * the end of this structure. + */ +typedef struct { + /** The version of the driver HAL that this driver implements. + * This is a protection against loading driver binaries built against + * a different version of this specification. + * Use #PSA_DRV_SE_HAL_VERSION. + */ + uint32_t hal_version; + + /** The size of the driver's persistent data in bytes. + * + * This can be 0 if the driver does not need persistent data. + * + * See the documentation of psa_drv_se_context_t::persistent_data + * for more information about why and how a driver can use + * persistent data. + */ + size_t persistent_data_size; + + /** The driver initialization function. + * + * This function is called once during the initialization of the + * PSA Cryptography subsystem, before any other function of the + * driver is called. If this function returns a failure status, + * the driver will be unusable, at least until the next system reset. + * + * If this field is \c NULL, it is equivalent to a function that does + * nothing and returns #PSA_SUCCESS. + */ + psa_drv_se_init_t p_init; + + const psa_drv_se_key_management_t *key_management; + const psa_drv_se_mac_t *mac; + const psa_drv_se_cipher_t *cipher; + const psa_drv_se_aead_t *aead; + const psa_drv_se_asymmetric_t *asymmetric; + const psa_drv_se_key_derivation_t *derivation; +} psa_drv_se_t; + +/** The current version of the secure element driver HAL. + */ +/* 0.0.0 patchlevel 5 */ +#define PSA_DRV_SE_HAL_VERSION 0x00000005 + +/** Register an external cryptoprocessor (secure element) driver. + * + * This function is only intended to be used by driver code, not by + * application code. In implementations with separation between the + * PSA cryptography module and applications, this function should + * only be available to callers that run in the same memory space as + * the cryptography module, and should not be exposed to applications + * running in a different memory space. + * + * This function may be called before psa_crypto_init(). It is + * implementation-defined whether this function may be called + * after psa_crypto_init(). + * + * \note Implementations store metadata about keys including the lifetime + * value, which contains the driver's location indicator. Therefore, + * from one instantiation of the PSA Cryptography + * library to the next one, if there is a key in storage with a certain + * lifetime value, you must always register the same driver (or an + * updated version that communicates with the same secure element) + * with the same location value. + * + * \param location The location value through which this driver will + * be exposed to applications. + * This driver will be used for all keys such that + * `location == #PSA_KEY_LIFETIME_GET_LOCATION( lifetime )`. + * The value #PSA_KEY_LOCATION_LOCAL_STORAGE is reserved + * and may not be used for drivers. Implementations + * may reserve other values. + * \param[in] methods The method table of the driver. This structure must + * remain valid for as long as the cryptography + * module keeps running. It is typically a global + * constant. + * + * \return #PSA_SUCCESS + * The driver was successfully registered. Applications can now + * use \p location to access keys through the methods passed to + * this function. + * \return #PSA_ERROR_BAD_STATE + * This function was called after the initialization of the + * cryptography module, and this implementation does not support + * driver registration at this stage. + * \return #PSA_ERROR_ALREADY_EXISTS + * There is already a registered driver for this value of \p location. + * \return #PSA_ERROR_INVALID_ARGUMENT + * \p location is a reserved value. + * \return #PSA_ERROR_NOT_SUPPORTED + * `methods->hal_version` is not supported by this implementation. + * \return #PSA_ERROR_INSUFFICIENT_MEMORY + * \return #PSA_ERROR_NOT_PERMITTED + * \return #PSA_ERROR_STORAGE_FAILURE + * \return #PSA_ERROR_DATA_CORRUPT + */ +psa_status_t psa_register_se_driver( + psa_key_location_t location, + const psa_drv_se_t *methods); + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* PSA_CRYPTO_SE_DRIVER_H */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_sizes.h b/ext/opcua_client/mbedtls/include/psa/crypto_sizes.h new file mode 100644 index 0000000..43f2f7b --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_sizes.h @@ -0,0 +1,1159 @@ +/** + * \file psa/crypto_sizes.h + * + * \brief PSA cryptography module: Mbed TLS buffer size macros + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. + * + * This file contains the definitions of macros that are useful to + * compute buffer sizes. The signatures and semantics of these macros + * are standardized, but the definitions are not, because they depend on + * the available algorithms and, in some cases, on permitted tolerances + * on buffer sizes. + * + * In implementations with isolation between the application and the + * cryptography module, implementers should take care to ensure that + * the definitions that are exposed to applications match what the + * module implements. + * + * Macros that compute sizes whose values do not depend on the + * implementation are in crypto.h. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_SIZES_H +#define PSA_CRYPTO_SIZES_H + +/* Include the Mbed TLS configuration file, the way Mbed TLS does it + * in each of its header files. */ +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#define PSA_BITS_TO_BYTES(bits) (((bits) + 7) / 8) +#define PSA_BYTES_TO_BITS(bytes) ((bytes) * 8) + +#define PSA_ROUND_UP_TO_MULTIPLE(block_size, length) \ + (((length) + (block_size) - 1) / (block_size) * (block_size)) + +/** The size of the output of psa_hash_finish(), in bytes. + * + * This is also the hash size that psa_hash_verify() expects. + * + * \param alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p alg) is true), or an HMAC algorithm + * (#PSA_ALG_HMAC(\c hash_alg) where \c hash_alg is a + * hash algorithm). + * + * \return The hash size for the specified hash algorithm. + * If the hash algorithm is not recognized, return 0. + */ +#define PSA_HASH_LENGTH(alg) \ + ( \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD2 ? 16 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD4 ? 16 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD5 ? 16 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_RIPEMD160 ? 20 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_1 ? 20 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_224 ? 28 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_256 ? 32 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_384 ? 48 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512 ? 64 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_224 ? 28 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_256 ? 32 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_224 ? 28 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_256 ? 32 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_384 ? 48 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_512 ? 64 : \ + 0) + +/** The input block size of a hash algorithm, in bytes. + * + * Hash algorithms process their input data in blocks. Hash operations will + * retain any partial blocks until they have enough input to fill the block or + * until the operation is finished. + * This affects the output from psa_hash_suspend(). + * + * \param alg A hash algorithm (\c PSA_ALG_XXX value such that + * PSA_ALG_IS_HASH(\p alg) is true). + * + * \return The block size in bytes for the specified hash algorithm. + * If the hash algorithm is not recognized, return 0. + * An implementation can return either 0 or the correct size for a + * hash algorithm that it recognizes, but does not support. + */ +#define PSA_HASH_BLOCK_LENGTH(alg) \ + ( \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD2 ? 16 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD4 ? 64 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD5 ? 64 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_RIPEMD160 ? 64 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_1 ? 64 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_224 ? 64 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_256 ? 64 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_384 ? 128 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512 ? 128 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_224 ? 128 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_256 ? 128 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_224 ? 144 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_256 ? 136 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_384 ? 104 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_512 ? 72 : \ + 0) + +/** \def PSA_HASH_MAX_SIZE + * + * Maximum size of a hash. + * + * This macro expands to a compile-time constant integer. This value + * is the maximum size of a hash in bytes. + */ +/* Note: for HMAC-SHA-3, the block size is 144 bytes for HMAC-SHA3-226, + * 136 bytes for HMAC-SHA3-256, 104 bytes for SHA3-384, 72 bytes for + * HMAC-SHA3-512. */ +#if defined(PSA_WANT_ALG_SHA_512) || defined(PSA_WANT_ALG_SHA_384) +#define PSA_HASH_MAX_SIZE 64 +#define PSA_HMAC_MAX_HASH_BLOCK_SIZE 128 +#else +#define PSA_HASH_MAX_SIZE 32 +#define PSA_HMAC_MAX_HASH_BLOCK_SIZE 64 +#endif + +/** \def PSA_MAC_MAX_SIZE + * + * Maximum size of a MAC. + * + * This macro expands to a compile-time constant integer. This value + * is the maximum size of a MAC in bytes. + */ +/* All non-HMAC MACs have a maximum size that's smaller than the + * minimum possible value of PSA_HASH_MAX_SIZE in this implementation. */ +/* Note that the encoding of truncated MAC algorithms limits this value + * to 64 bytes. + */ +#define PSA_MAC_MAX_SIZE PSA_HASH_MAX_SIZE + +/** The length of a tag for an AEAD algorithm, in bytes. + * + * This macro can be used to allocate a buffer of sufficient size to store the + * tag output from psa_aead_finish(). + * + * See also #PSA_AEAD_TAG_MAX_SIZE. + * + * \param key_type The type of the AEAD key. + * \param key_bits The size of the AEAD key in bits. + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \return The tag length for the specified algorithm and key. + * If the AEAD algorithm does not have an identified + * tag that can be distinguished from the rest of + * the ciphertext, return 0. + * If the key type or AEAD algorithm is not + * recognized, or the parameters are incompatible, + * return 0. + */ +#define PSA_AEAD_TAG_LENGTH(key_type, key_bits, alg) \ + (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 ? \ + PSA_ALG_AEAD_GET_TAG_LENGTH(alg) : \ + ((void) (key_bits), 0)) + +/** The maximum tag size for all supported AEAD algorithms, in bytes. + * + * See also #PSA_AEAD_TAG_LENGTH(\p key_type, \p key_bits, \p alg). + */ +#define PSA_AEAD_TAG_MAX_SIZE 16 + +/* The maximum size of an RSA key on this implementation, in bits. + * This is a vendor-specific macro. + * + * Mbed TLS does not set a hard limit on the size of RSA keys: any key + * whose parameters fit in a bignum is accepted. However large keys can + * induce a large memory usage and long computation times. Unlike other + * auxiliary macros in this file and in crypto.h, which reflect how the + * library is configured, this macro defines how the library is + * configured. This implementation refuses to import or generate an + * RSA key whose size is larger than the value defined here. + * + * Note that an implementation may set different size limits for different + * operations, and does not need to accept all key sizes up to the limit. */ +#define PSA_VENDOR_RSA_MAX_KEY_BITS 4096 + +/* The maximum size of an ECC key on this implementation, in bits. + * This is a vendor-specific macro. */ +#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 521 +#elif defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 512 +#elif defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 448 +#elif defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 384 +#elif defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 384 +#elif defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 256 +#elif defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 256 +#elif defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 256 +#elif defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 255 +#elif defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 224 +#elif defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 224 +#elif defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 192 +#elif defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 192 +#else +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 0 +#endif + +/** This macro returns the maximum supported length of the PSK for the + * TLS-1.2 PSK-to-MS key derivation + * (#PSA_ALG_TLS12_PSK_TO_MS(\c hash_alg)). + * + * The maximum supported length does not depend on the chosen hash algorithm. + * + * Quoting RFC 4279, Sect 5.3: + * TLS implementations supporting these ciphersuites MUST support + * arbitrary PSK identities up to 128 octets in length, and arbitrary + * PSKs up to 64 octets in length. Supporting longer identities and + * keys is RECOMMENDED. + * + * Therefore, no implementation should define a value smaller than 64 + * for #PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE. + */ +#define PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE 128 + +/** The maximum size of a block cipher. */ +#define PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE 16 + +/** The size of the output of psa_mac_sign_finish(), in bytes. + * + * This is also the MAC size that psa_mac_verify_finish() expects. + * + * \warning This macro may evaluate its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param key_type The type of the MAC key. + * \param key_bits The size of the MAC key in bits. + * \param alg A MAC algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_MAC(\p alg) is true). + * + * \return The MAC size for the specified algorithm with + * the specified key parameters. + * \return 0 if the MAC algorithm is not recognized. + * \return Either 0 or the correct size for a MAC algorithm that + * the implementation recognizes, but does not support. + * \return Unspecified if the key parameters are not consistent + * with the algorithm. + */ +#define PSA_MAC_LENGTH(key_type, key_bits, alg) \ + ((alg) & PSA_ALG_MAC_TRUNCATION_MASK ? PSA_MAC_TRUNCATED_LENGTH(alg) : \ + PSA_ALG_IS_HMAC(alg) ? PSA_HASH_LENGTH(PSA_ALG_HMAC_GET_HASH(alg)) : \ + PSA_ALG_IS_BLOCK_CIPHER_MAC(alg) ? PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) : \ + ((void) (key_type), (void) (key_bits), 0)) + +/** The maximum size of the output of psa_aead_encrypt(), in bytes. + * + * If the size of the ciphertext buffer is at least this large, it is + * guaranteed that psa_aead_encrypt() will not fail due to an + * insufficient buffer size. Depending on the algorithm, the actual size of + * the ciphertext may be smaller. + * + * See also #PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE(\p plaintext_length). + * + * \warning This macro may evaluate its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param key_type A symmetric key type that is + * compatible with algorithm \p alg. + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * \param plaintext_length Size of the plaintext in bytes. + * + * \return The AEAD ciphertext size for the specified + * algorithm. + * If the key type or AEAD algorithm is not + * recognized, or the parameters are incompatible, + * return 0. + */ +#define PSA_AEAD_ENCRYPT_OUTPUT_SIZE(key_type, alg, plaintext_length) \ + (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 ? \ + (plaintext_length) + PSA_ALG_AEAD_GET_TAG_LENGTH(alg) : \ + 0) + +/** A sufficient output buffer size for psa_aead_encrypt(), for any of the + * supported key types and AEAD algorithms. + * + * If the size of the ciphertext buffer is at least this large, it is guaranteed + * that psa_aead_encrypt() will not fail due to an insufficient buffer size. + * + * \note This macro returns a compile-time constant if its arguments are + * compile-time constants. + * + * See also #PSA_AEAD_ENCRYPT_OUTPUT_SIZE(\p key_type, \p alg, + * \p plaintext_length). + * + * \param plaintext_length Size of the plaintext in bytes. + * + * \return A sufficient output buffer size for any of the + * supported key types and AEAD algorithms. + * + */ +#define PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE(plaintext_length) \ + ((plaintext_length) + PSA_AEAD_TAG_MAX_SIZE) + + +/** The maximum size of the output of psa_aead_decrypt(), in bytes. + * + * If the size of the plaintext buffer is at least this large, it is + * guaranteed that psa_aead_decrypt() will not fail due to an + * insufficient buffer size. Depending on the algorithm, the actual size of + * the plaintext may be smaller. + * + * See also #PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE(\p ciphertext_length). + * + * \warning This macro may evaluate its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param key_type A symmetric key type that is + * compatible with algorithm \p alg. + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * \param ciphertext_length Size of the plaintext in bytes. + * + * \return The AEAD ciphertext size for the specified + * algorithm. + * If the key type or AEAD algorithm is not + * recognized, or the parameters are incompatible, + * return 0. + */ +#define PSA_AEAD_DECRYPT_OUTPUT_SIZE(key_type, alg, ciphertext_length) \ + (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 && \ + (ciphertext_length) > PSA_ALG_AEAD_GET_TAG_LENGTH(alg) ? \ + (ciphertext_length) - PSA_ALG_AEAD_GET_TAG_LENGTH(alg) : \ + 0) + +/** A sufficient output buffer size for psa_aead_decrypt(), for any of the + * supported key types and AEAD algorithms. + * + * If the size of the plaintext buffer is at least this large, it is guaranteed + * that psa_aead_decrypt() will not fail due to an insufficient buffer size. + * + * \note This macro returns a compile-time constant if its arguments are + * compile-time constants. + * + * See also #PSA_AEAD_DECRYPT_OUTPUT_SIZE(\p key_type, \p alg, + * \p ciphertext_length). + * + * \param ciphertext_length Size of the ciphertext in bytes. + * + * \return A sufficient output buffer size for any of the + * supported key types and AEAD algorithms. + * + */ +#define PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE(ciphertext_length) \ + (ciphertext_length) + +/** The default nonce size for an AEAD algorithm, in bytes. + * + * This macro can be used to allocate a buffer of sufficient size to + * store the nonce output from #psa_aead_generate_nonce(). + * + * See also #PSA_AEAD_NONCE_MAX_SIZE. + * + * \note This is not the maximum size of nonce supported as input to + * #psa_aead_set_nonce(), #psa_aead_encrypt() or #psa_aead_decrypt(), + * just the default size that is generated by #psa_aead_generate_nonce(). + * + * \warning This macro may evaluate its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param key_type A symmetric key type that is compatible with + * algorithm \p alg. + * + * \param alg An AEAD algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \return The default nonce size for the specified key type and algorithm. + * If the key type or AEAD algorithm is not recognized, + * or the parameters are incompatible, return 0. + */ +#define PSA_AEAD_NONCE_LENGTH(key_type, alg) \ + (PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) == 16 ? \ + MBEDTLS_PSA_ALG_AEAD_EQUAL(alg, PSA_ALG_CCM) ? 13 : \ + MBEDTLS_PSA_ALG_AEAD_EQUAL(alg, PSA_ALG_GCM) ? 12 : \ + 0 : \ + (key_type) == PSA_KEY_TYPE_CHACHA20 && \ + MBEDTLS_PSA_ALG_AEAD_EQUAL(alg, PSA_ALG_CHACHA20_POLY1305) ? 12 : \ + 0) + +/** The maximum default nonce size among all supported pairs of key types and + * AEAD algorithms, in bytes. + * + * This is equal to or greater than any value that #PSA_AEAD_NONCE_LENGTH() + * may return. + * + * \note This is not the maximum size of nonce supported as input to + * #psa_aead_set_nonce(), #psa_aead_encrypt() or #psa_aead_decrypt(), + * just the largest size that may be generated by + * #psa_aead_generate_nonce(). + */ +#define PSA_AEAD_NONCE_MAX_SIZE 13 + +/** A sufficient output buffer size for psa_aead_update(). + * + * If the size of the output buffer is at least this large, it is + * guaranteed that psa_aead_update() will not fail due to an + * insufficient buffer size. The actual size of the output may be smaller + * in any given call. + * + * See also #PSA_AEAD_UPDATE_OUTPUT_MAX_SIZE(\p input_length). + * + * \warning This macro may evaluate its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param key_type A symmetric key type that is + * compatible with algorithm \p alg. + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * \param input_length Size of the input in bytes. + * + * \return A sufficient output buffer size for the specified + * algorithm. + * If the key type or AEAD algorithm is not + * recognized, or the parameters are incompatible, + * return 0. + */ +/* For all the AEAD modes defined in this specification, it is possible + * to emit output without delay. However, hardware may not always be + * capable of this. So for modes based on a block cipher, allow the + * implementation to delay the output until it has a full block. */ +#define PSA_AEAD_UPDATE_OUTPUT_SIZE(key_type, alg, input_length) \ + (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 ? \ + PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) ? \ + PSA_ROUND_UP_TO_MULTIPLE(PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type), (input_length)) : \ + (input_length) : \ + 0) + +/** A sufficient output buffer size for psa_aead_update(), for any of the + * supported key types and AEAD algorithms. + * + * If the size of the output buffer is at least this large, it is guaranteed + * that psa_aead_update() will not fail due to an insufficient buffer size. + * + * See also #PSA_AEAD_UPDATE_OUTPUT_SIZE(\p key_type, \p alg, \p input_length). + * + * \param input_length Size of the input in bytes. + */ +#define PSA_AEAD_UPDATE_OUTPUT_MAX_SIZE(input_length) \ + (PSA_ROUND_UP_TO_MULTIPLE(PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE, (input_length))) + +/** A sufficient ciphertext buffer size for psa_aead_finish(). + * + * If the size of the ciphertext buffer is at least this large, it is + * guaranteed that psa_aead_finish() will not fail due to an + * insufficient ciphertext buffer size. The actual size of the output may + * be smaller in any given call. + * + * See also #PSA_AEAD_FINISH_OUTPUT_MAX_SIZE. + * + * \param key_type A symmetric key type that is + compatible with algorithm \p alg. + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \return A sufficient ciphertext buffer size for the + * specified algorithm. + * If the key type or AEAD algorithm is not + * recognized, or the parameters are incompatible, + * return 0. + */ +#define PSA_AEAD_FINISH_OUTPUT_SIZE(key_type, alg) \ + (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 && \ + PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) ? \ + PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) : \ + 0) + +/** A sufficient ciphertext buffer size for psa_aead_finish(), for any of the + * supported key types and AEAD algorithms. + * + * See also #PSA_AEAD_FINISH_OUTPUT_SIZE(\p key_type, \p alg). + */ +#define PSA_AEAD_FINISH_OUTPUT_MAX_SIZE (PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE) + +/** A sufficient plaintext buffer size for psa_aead_verify(). + * + * If the size of the plaintext buffer is at least this large, it is + * guaranteed that psa_aead_verify() will not fail due to an + * insufficient plaintext buffer size. The actual size of the output may + * be smaller in any given call. + * + * See also #PSA_AEAD_VERIFY_OUTPUT_MAX_SIZE. + * + * \param key_type A symmetric key type that is + * compatible with algorithm \p alg. + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \return A sufficient plaintext buffer size for the + * specified algorithm. + * If the key type or AEAD algorithm is not + * recognized, or the parameters are incompatible, + * return 0. + */ +#define PSA_AEAD_VERIFY_OUTPUT_SIZE(key_type, alg) \ + (PSA_AEAD_NONCE_LENGTH(key_type, alg) != 0 && \ + PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) ? \ + PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) : \ + 0) + +/** A sufficient plaintext buffer size for psa_aead_verify(), for any of the + * supported key types and AEAD algorithms. + * + * See also #PSA_AEAD_VERIFY_OUTPUT_SIZE(\p key_type, \p alg). + */ +#define PSA_AEAD_VERIFY_OUTPUT_MAX_SIZE (PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE) + +#define PSA_RSA_MINIMUM_PADDING_SIZE(alg) \ + (PSA_ALG_IS_RSA_OAEP(alg) ? \ + 2 * PSA_HASH_LENGTH(PSA_ALG_RSA_OAEP_GET_HASH(alg)) + 1 : \ + 11 /*PKCS#1v1.5*/) + +/** + * \brief ECDSA signature size for a given curve bit size + * + * \param curve_bits Curve size in bits. + * \return Signature size in bytes. + * + * \note This macro returns a compile-time constant if its argument is one. + */ +#define PSA_ECDSA_SIGNATURE_SIZE(curve_bits) \ + (PSA_BITS_TO_BYTES(curve_bits) * 2) + +/** Sufficient signature buffer size for psa_sign_hash(). + * + * This macro returns a sufficient buffer size for a signature using a key + * of the specified type and size, with the specified algorithm. + * Note that the actual size of the signature may be smaller + * (some algorithms produce a variable-size signature). + * + * \warning This function may call its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param key_type An asymmetric key type (this may indifferently be a + * key pair type or a public key type). + * \param key_bits The size of the key in bits. + * \param alg The signature algorithm. + * + * \return If the parameters are valid and supported, return + * a buffer size in bytes that guarantees that + * psa_sign_hash() will not fail with + * #PSA_ERROR_BUFFER_TOO_SMALL. + * If the parameters are a valid combination that is not supported, + * return either a sensible size or 0. + * If the parameters are not valid, the + * return value is unspecified. + */ +#define PSA_SIGN_OUTPUT_SIZE(key_type, key_bits, alg) \ + (PSA_KEY_TYPE_IS_RSA(key_type) ? ((void) alg, PSA_BITS_TO_BYTES(key_bits)) : \ + PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_ECDSA_SIGNATURE_SIZE(key_bits) : \ + ((void) alg, 0)) + +#define PSA_VENDOR_ECDSA_SIGNATURE_MAX_SIZE \ + PSA_ECDSA_SIGNATURE_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS) + +/** \def PSA_SIGNATURE_MAX_SIZE + * + * Maximum size of an asymmetric signature. + * + * This macro expands to a compile-time constant integer. This value + * is the maximum size of a signature in bytes. + */ +#define PSA_SIGNATURE_MAX_SIZE \ + (PSA_BITS_TO_BYTES(PSA_VENDOR_RSA_MAX_KEY_BITS) > PSA_VENDOR_ECDSA_SIGNATURE_MAX_SIZE ? \ + PSA_BITS_TO_BYTES(PSA_VENDOR_RSA_MAX_KEY_BITS) : \ + PSA_VENDOR_ECDSA_SIGNATURE_MAX_SIZE) + +/** Sufficient output buffer size for psa_asymmetric_encrypt(). + * + * This macro returns a sufficient buffer size for a ciphertext produced using + * a key of the specified type and size, with the specified algorithm. + * Note that the actual size of the ciphertext may be smaller, depending + * on the algorithm. + * + * \warning This function may call its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param key_type An asymmetric key type (this may indifferently be a + * key pair type or a public key type). + * \param key_bits The size of the key in bits. + * \param alg The asymmetric encryption algorithm. + * + * \return If the parameters are valid and supported, return + * a buffer size in bytes that guarantees that + * psa_asymmetric_encrypt() will not fail with + * #PSA_ERROR_BUFFER_TOO_SMALL. + * If the parameters are a valid combination that is not supported, + * return either a sensible size or 0. + * If the parameters are not valid, the + * return value is unspecified. + */ +#define PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(key_type, key_bits, alg) \ + (PSA_KEY_TYPE_IS_RSA(key_type) ? \ + ((void) alg, PSA_BITS_TO_BYTES(key_bits)) : \ + 0) + +/** A sufficient output buffer size for psa_asymmetric_encrypt(), for any + * supported asymmetric encryption. + * + * See also #PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(\p key_type, \p key_bits, \p alg). + */ +/* This macro assumes that RSA is the only supported asymmetric encryption. */ +#define PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE \ + (PSA_BITS_TO_BYTES(PSA_VENDOR_RSA_MAX_KEY_BITS)) + +/** Sufficient output buffer size for psa_asymmetric_decrypt(). + * + * This macro returns a sufficient buffer size for a plaintext produced using + * a key of the specified type and size, with the specified algorithm. + * Note that the actual size of the plaintext may be smaller, depending + * on the algorithm. + * + * \warning This function may call its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param key_type An asymmetric key type (this may indifferently be a + * key pair type or a public key type). + * \param key_bits The size of the key in bits. + * \param alg The asymmetric encryption algorithm. + * + * \return If the parameters are valid and supported, return + * a buffer size in bytes that guarantees that + * psa_asymmetric_decrypt() will not fail with + * #PSA_ERROR_BUFFER_TOO_SMALL. + * If the parameters are a valid combination that is not supported, + * return either a sensible size or 0. + * If the parameters are not valid, the + * return value is unspecified. + */ +#define PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(key_type, key_bits, alg) \ + (PSA_KEY_TYPE_IS_RSA(key_type) ? \ + PSA_BITS_TO_BYTES(key_bits) - PSA_RSA_MINIMUM_PADDING_SIZE(alg) : \ + 0) + +/** A sufficient output buffer size for psa_asymmetric_decrypt(), for any + * supported asymmetric decryption. + * + * This macro assumes that RSA is the only supported asymmetric encryption. + * + * See also #PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(\p key_type, \p key_bits, \p alg). + */ +#define PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE \ + (PSA_BITS_TO_BYTES(PSA_VENDOR_RSA_MAX_KEY_BITS)) + +/* Maximum size of the ASN.1 encoding of an INTEGER with the specified + * number of bits. + * + * This definition assumes that bits <= 2^19 - 9 so that the length field + * is at most 3 bytes. The length of the encoding is the length of the + * bit string padded to a whole number of bytes plus: + * - 1 type byte; + * - 1 to 3 length bytes; + * - 0 to 1 bytes of leading 0 due to the sign bit. + */ +#define PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE(bits) \ + ((bits) / 8 + 5) + +/* Maximum size of the export encoding of an RSA public key. + * Assumes that the public exponent is less than 2^32. + * + * RSAPublicKey ::= SEQUENCE { + * modulus INTEGER, -- n + * publicExponent INTEGER } -- e + * + * - 4 bytes of SEQUENCE overhead; + * - n : INTEGER; + * - 7 bytes for the public exponent. + */ +#define PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(key_bits) \ + (PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE(key_bits) + 11) + +/* Maximum size of the export encoding of an RSA key pair. + * Assumes that the public exponent is less than 2^32 and that the size + * difference between the two primes is at most 1 bit. + * + * RSAPrivateKey ::= SEQUENCE { + * version Version, -- 0 + * modulus INTEGER, -- N-bit + * publicExponent INTEGER, -- 32-bit + * privateExponent INTEGER, -- N-bit + * prime1 INTEGER, -- N/2-bit + * prime2 INTEGER, -- N/2-bit + * exponent1 INTEGER, -- N/2-bit + * exponent2 INTEGER, -- N/2-bit + * coefficient INTEGER, -- N/2-bit + * } + * + * - 4 bytes of SEQUENCE overhead; + * - 3 bytes of version; + * - 7 half-size INTEGERs plus 2 full-size INTEGERs, + * overapproximated as 9 half-size INTEGERS; + * - 7 bytes for the public exponent. + */ +#define PSA_KEY_EXPORT_RSA_KEY_PAIR_MAX_SIZE(key_bits) \ + (9 * PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE((key_bits) / 2 + 1) + 14) + +/* Maximum size of the export encoding of a DSA public key. + * + * SubjectPublicKeyInfo ::= SEQUENCE { + * algorithm AlgorithmIdentifier, + * subjectPublicKey BIT STRING } -- contains DSAPublicKey + * AlgorithmIdentifier ::= SEQUENCE { + * algorithm OBJECT IDENTIFIER, + * parameters Dss-Params } -- SEQUENCE of 3 INTEGERs + * DSAPublicKey ::= INTEGER -- public key, Y + * + * - 3 * 4 bytes of SEQUENCE overhead; + * - 1 + 1 + 7 bytes of algorithm (DSA OID); + * - 4 bytes of BIT STRING overhead; + * - 3 full-size INTEGERs (p, g, y); + * - 1 + 1 + 32 bytes for 1 sub-size INTEGER (q <= 256 bits). + */ +#define PSA_KEY_EXPORT_DSA_PUBLIC_KEY_MAX_SIZE(key_bits) \ + (PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE(key_bits) * 3 + 59) + +/* Maximum size of the export encoding of a DSA key pair. + * + * DSAPrivateKey ::= SEQUENCE { + * version Version, -- 0 + * prime INTEGER, -- p + * subprime INTEGER, -- q + * generator INTEGER, -- g + * public INTEGER, -- y + * private INTEGER, -- x + * } + * + * - 4 bytes of SEQUENCE overhead; + * - 3 bytes of version; + * - 3 full-size INTEGERs (p, g, y); + * - 2 * (1 + 1 + 32) bytes for 2 sub-size INTEGERs (q, x <= 256 bits). + */ +#define PSA_KEY_EXPORT_DSA_KEY_PAIR_MAX_SIZE(key_bits) \ + (PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE(key_bits) * 3 + 75) + +/* Maximum size of the export encoding of an ECC public key. + * + * The representation of an ECC public key is: + * - The byte 0x04; + * - `x_P` as a `ceiling(m/8)`-byte string, big-endian; + * - `y_P` as a `ceiling(m/8)`-byte string, big-endian; + * - where m is the bit size associated with the curve. + * + * - 1 byte + 2 * point size. + */ +#define PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_bits) \ + (2 * PSA_BITS_TO_BYTES(key_bits) + 1) + +/* Maximum size of the export encoding of an ECC key pair. + * + * An ECC key pair is represented by the secret value. + */ +#define PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(key_bits) \ + (PSA_BITS_TO_BYTES(key_bits)) + +/** Sufficient output buffer size for psa_export_key() or + * psa_export_public_key(). + * + * This macro returns a compile-time constant if its arguments are + * compile-time constants. + * + * \warning This macro may evaluate its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * The following code illustrates how to allocate enough memory to export + * a key by querying the key type and size at runtime. + * \code{c} + * psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + * psa_status_t status; + * status = psa_get_key_attributes(key, &attributes); + * if (status != PSA_SUCCESS) handle_error(...); + * psa_key_type_t key_type = psa_get_key_type(&attributes); + * size_t key_bits = psa_get_key_bits(&attributes); + * size_t buffer_size = PSA_EXPORT_KEY_OUTPUT_SIZE(key_type, key_bits); + * psa_reset_key_attributes(&attributes); + * uint8_t *buffer = malloc(buffer_size); + * if (buffer == NULL) handle_error(...); + * size_t buffer_length; + * status = psa_export_key(key, buffer, buffer_size, &buffer_length); + * if (status != PSA_SUCCESS) handle_error(...); + * \endcode + * + * \param key_type A supported key type. + * \param key_bits The size of the key in bits. + * + * \return If the parameters are valid and supported, return + * a buffer size in bytes that guarantees that + * psa_export_key() or psa_export_public_key() will not fail with + * #PSA_ERROR_BUFFER_TOO_SMALL. + * If the parameters are a valid combination that is not supported, + * return either a sensible size or 0. + * If the parameters are not valid, the return value is unspecified. + */ +#define PSA_EXPORT_KEY_OUTPUT_SIZE(key_type, key_bits) \ + (PSA_KEY_TYPE_IS_UNSTRUCTURED(key_type) ? PSA_BITS_TO_BYTES(key_bits) : \ + (key_type) == PSA_KEY_TYPE_RSA_KEY_PAIR ? PSA_KEY_EXPORT_RSA_KEY_PAIR_MAX_SIZE(key_bits) : \ + (key_type) == PSA_KEY_TYPE_RSA_PUBLIC_KEY ? PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(key_bits) : \ + (key_type) == PSA_KEY_TYPE_DSA_KEY_PAIR ? PSA_KEY_EXPORT_DSA_KEY_PAIR_MAX_SIZE(key_bits) : \ + (key_type) == PSA_KEY_TYPE_DSA_PUBLIC_KEY ? PSA_KEY_EXPORT_DSA_PUBLIC_KEY_MAX_SIZE(key_bits) : \ + PSA_KEY_TYPE_IS_ECC_KEY_PAIR(key_type) ? PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(key_bits) : \ + PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY(key_type) ? PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_bits) : \ + 0) + +/** Sufficient output buffer size for psa_export_public_key(). + * + * This macro returns a compile-time constant if its arguments are + * compile-time constants. + * + * \warning This macro may evaluate its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * The following code illustrates how to allocate enough memory to export + * a public key by querying the key type and size at runtime. + * \code{c} + * psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + * psa_status_t status; + * status = psa_get_key_attributes(key, &attributes); + * if (status != PSA_SUCCESS) handle_error(...); + * psa_key_type_t key_type = psa_get_key_type(&attributes); + * size_t key_bits = psa_get_key_bits(&attributes); + * size_t buffer_size = PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(key_type, key_bits); + * psa_reset_key_attributes(&attributes); + * uint8_t *buffer = malloc(buffer_size); + * if (buffer == NULL) handle_error(...); + * size_t buffer_length; + * status = psa_export_public_key(key, buffer, buffer_size, &buffer_length); + * if (status != PSA_SUCCESS) handle_error(...); + * \endcode + * + * \param key_type A public key or key pair key type. + * \param key_bits The size of the key in bits. + * + * \return If the parameters are valid and supported, return + * a buffer size in bytes that guarantees that + * psa_export_public_key() will not fail with + * #PSA_ERROR_BUFFER_TOO_SMALL. + * If the parameters are a valid combination that is not + * supported, return either a sensible size or 0. + * If the parameters are not valid, + * the return value is unspecified. + * + * If the parameters are valid and supported, + * return the same result as + * #PSA_EXPORT_KEY_OUTPUT_SIZE( + * \p #PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(\p key_type), + * \p key_bits). + */ +#define PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(key_type, key_bits) \ + (PSA_KEY_TYPE_IS_RSA(key_type) ? PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(key_bits) : \ + PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_bits) : \ + 0) + +/** Sufficient buffer size for exporting any asymmetric key pair. + * + * This macro expands to a compile-time constant integer. This value is + * a sufficient buffer size when calling psa_export_key() to export any + * asymmetric key pair, regardless of the exact key type and key size. + * + * See also #PSA_EXPORT_KEY_OUTPUT_SIZE(\p key_type, \p key_bits). + */ +#define PSA_EXPORT_KEY_PAIR_MAX_SIZE \ + (PSA_KEY_EXPORT_RSA_KEY_PAIR_MAX_SIZE(PSA_VENDOR_RSA_MAX_KEY_BITS) > \ + PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS) ? \ + PSA_KEY_EXPORT_RSA_KEY_PAIR_MAX_SIZE(PSA_VENDOR_RSA_MAX_KEY_BITS) : \ + PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)) + +/** Sufficient buffer size for exporting any asymmetric public key. + * + * This macro expands to a compile-time constant integer. This value is + * a sufficient buffer size when calling psa_export_key() or + * psa_export_public_key() to export any asymmetric public key, + * regardless of the exact key type and key size. + * + * See also #PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(\p key_type, \p key_bits). + */ +#define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE \ + (PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(PSA_VENDOR_RSA_MAX_KEY_BITS) > \ + PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS) ? \ + PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(PSA_VENDOR_RSA_MAX_KEY_BITS) : \ + PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)) + +/** Sufficient output buffer size for psa_raw_key_agreement(). + * + * This macro returns a compile-time constant if its arguments are + * compile-time constants. + * + * \warning This macro may evaluate its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * See also #PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE. + * + * \param key_type A supported key type. + * \param key_bits The size of the key in bits. + * + * \return If the parameters are valid and supported, return + * a buffer size in bytes that guarantees that + * psa_raw_key_agreement() will not fail with + * #PSA_ERROR_BUFFER_TOO_SMALL. + * If the parameters are a valid combination that + * is not supported, return either a sensible size or 0. + * If the parameters are not valid, + * the return value is unspecified. + */ +/* FFDH is not yet supported in PSA. */ +#define PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE(key_type, key_bits) \ + (PSA_KEY_TYPE_IS_ECC_KEY_PAIR(key_type) ? \ + PSA_BITS_TO_BYTES(key_bits) : \ + 0) + +/** Maximum size of the output from psa_raw_key_agreement(). + * + * This macro expands to a compile-time constant integer. This value is the + * maximum size of the output any raw key agreement algorithm, in bytes. + * + * See also #PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE(\p key_type, \p key_bits). + */ +#define PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE \ + (PSA_BITS_TO_BYTES(PSA_VENDOR_ECC_MAX_CURVE_BITS)) + +/** The default IV size for a cipher algorithm, in bytes. + * + * The IV that is generated as part of a call to #psa_cipher_encrypt() is always + * the default IV length for the algorithm. + * + * This macro can be used to allocate a buffer of sufficient size to + * store the IV output from #psa_cipher_generate_iv() when using + * a multi-part cipher operation. + * + * See also #PSA_CIPHER_IV_MAX_SIZE. + * + * \warning This macro may evaluate its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param key_type A symmetric key type that is compatible with algorithm \p alg. + * + * \param alg A cipher algorithm (\c PSA_ALG_XXX value such that #PSA_ALG_IS_CIPHER(\p alg) is true). + * + * \return The default IV size for the specified key type and algorithm. + * If the algorithm does not use an IV, return 0. + * If the key type or cipher algorithm is not recognized, + * or the parameters are incompatible, return 0. + */ +#define PSA_CIPHER_IV_LENGTH(key_type, alg) \ + (PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) > 1 && \ + ((alg) == PSA_ALG_CTR || \ + (alg) == PSA_ALG_CFB || \ + (alg) == PSA_ALG_OFB || \ + (alg) == PSA_ALG_XTS || \ + (alg) == PSA_ALG_CBC_NO_PADDING || \ + (alg) == PSA_ALG_CBC_PKCS7) ? PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) : \ + (key_type) == PSA_KEY_TYPE_CHACHA20 && \ + (alg) == PSA_ALG_STREAM_CIPHER ? 12 : \ + 0) + +/** The maximum IV size for all supported cipher algorithms, in bytes. + * + * See also #PSA_CIPHER_IV_LENGTH(). + */ +#define PSA_CIPHER_IV_MAX_SIZE 16 + +/** The maximum size of the output of psa_cipher_encrypt(), in bytes. + * + * If the size of the output buffer is at least this large, it is guaranteed + * that psa_cipher_encrypt() will not fail due to an insufficient buffer size. + * Depending on the algorithm, the actual size of the output might be smaller. + * + * See also #PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE(\p input_length). + * + * \warning This macro may evaluate its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param key_type A symmetric key type that is compatible with algorithm + * alg. + * \param alg A cipher algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * \param input_length Size of the input in bytes. + * + * \return A sufficient output size for the specified key type and + * algorithm. If the key type or cipher algorithm is not + * recognized, or the parameters are incompatible, + * return 0. + */ +#define PSA_CIPHER_ENCRYPT_OUTPUT_SIZE(key_type, alg, input_length) \ + (alg == PSA_ALG_CBC_PKCS7 ? \ + (PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) != 0 ? \ + PSA_ROUND_UP_TO_MULTIPLE(PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type), \ + (input_length) + 1) + \ + PSA_CIPHER_IV_LENGTH((key_type), (alg)) : 0) : \ + (PSA_ALG_IS_CIPHER(alg) ? \ + (input_length) + PSA_CIPHER_IV_LENGTH((key_type), (alg)) : \ + 0)) + +/** A sufficient output buffer size for psa_cipher_encrypt(), for any of the + * supported key types and cipher algorithms. + * + * If the size of the output buffer is at least this large, it is guaranteed + * that psa_cipher_encrypt() will not fail due to an insufficient buffer size. + * + * See also #PSA_CIPHER_ENCRYPT_OUTPUT_SIZE(\p key_type, \p alg, \p input_length). + * + * \param input_length Size of the input in bytes. + * + */ +#define PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE(input_length) \ + (PSA_ROUND_UP_TO_MULTIPLE(PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE, \ + (input_length) + 1) + \ + PSA_CIPHER_IV_MAX_SIZE) + +/** The maximum size of the output of psa_cipher_decrypt(), in bytes. + * + * If the size of the output buffer is at least this large, it is guaranteed + * that psa_cipher_decrypt() will not fail due to an insufficient buffer size. + * Depending on the algorithm, the actual size of the output might be smaller. + * + * See also #PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE(\p input_length). + * + * \param key_type A symmetric key type that is compatible with algorithm + * alg. + * \param alg A cipher algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * \param input_length Size of the input in bytes. + * + * \return A sufficient output size for the specified key type and + * algorithm. If the key type or cipher algorithm is not + * recognized, or the parameters are incompatible, + * return 0. + */ +#define PSA_CIPHER_DECRYPT_OUTPUT_SIZE(key_type, alg, input_length) \ + (PSA_ALG_IS_CIPHER(alg) && \ + ((key_type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_SYMMETRIC ? \ + (input_length) : \ + 0) + +/** A sufficient output buffer size for psa_cipher_decrypt(), for any of the + * supported key types and cipher algorithms. + * + * If the size of the output buffer is at least this large, it is guaranteed + * that psa_cipher_decrypt() will not fail due to an insufficient buffer size. + * + * See also #PSA_CIPHER_DECRYPT_OUTPUT_SIZE(\p key_type, \p alg, \p input_length). + * + * \param input_length Size of the input in bytes. + */ +#define PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE(input_length) \ + (input_length) + +/** A sufficient output buffer size for psa_cipher_update(). + * + * If the size of the output buffer is at least this large, it is guaranteed + * that psa_cipher_update() will not fail due to an insufficient buffer size. + * The actual size of the output might be smaller in any given call. + * + * See also #PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE(\p input_length). + * + * \param key_type A symmetric key type that is compatible with algorithm + * alg. + * \param alg A cipher algorithm (PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * \param input_length Size of the input in bytes. + * + * \return A sufficient output size for the specified key type and + * algorithm. If the key type or cipher algorithm is not + * recognized, or the parameters are incompatible, return 0. + */ +#define PSA_CIPHER_UPDATE_OUTPUT_SIZE(key_type, alg, input_length) \ + (PSA_ALG_IS_CIPHER(alg) ? \ + (PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) != 0 ? \ + (((alg) == PSA_ALG_CBC_PKCS7 || \ + (alg) == PSA_ALG_CBC_NO_PADDING || \ + (alg) == PSA_ALG_ECB_NO_PADDING) ? \ + PSA_ROUND_UP_TO_MULTIPLE(PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type), \ + input_length) : \ + (input_length)) : 0) : \ + 0) + +/** A sufficient output buffer size for psa_cipher_update(), for any of the + * supported key types and cipher algorithms. + * + * If the size of the output buffer is at least this large, it is guaranteed + * that psa_cipher_update() will not fail due to an insufficient buffer size. + * + * See also #PSA_CIPHER_UPDATE_OUTPUT_SIZE(\p key_type, \p alg, \p input_length). + * + * \param input_length Size of the input in bytes. + */ +#define PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE(input_length) \ + (PSA_ROUND_UP_TO_MULTIPLE(PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE, input_length)) + +/** A sufficient ciphertext buffer size for psa_cipher_finish(). + * + * If the size of the ciphertext buffer is at least this large, it is + * guaranteed that psa_cipher_finish() will not fail due to an insufficient + * ciphertext buffer size. The actual size of the output might be smaller in + * any given call. + * + * See also #PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE(). + * + * \param key_type A symmetric key type that is compatible with algorithm + * alg. + * \param alg A cipher algorithm (PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * \return A sufficient output size for the specified key type and + * algorithm. If the key type or cipher algorithm is not + * recognized, or the parameters are incompatible, return 0. + */ +#define PSA_CIPHER_FINISH_OUTPUT_SIZE(key_type, alg) \ + (PSA_ALG_IS_CIPHER(alg) ? \ + (alg == PSA_ALG_CBC_PKCS7 ? \ + PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) : \ + 0) : \ + 0) + +/** A sufficient ciphertext buffer size for psa_cipher_finish(), for any of the + * supported key types and cipher algorithms. + * + * See also #PSA_CIPHER_FINISH_OUTPUT_SIZE(\p key_type, \p alg). + */ +#define PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE \ + (PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE) + +#endif /* PSA_CRYPTO_SIZES_H */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_struct.h b/ext/opcua_client/mbedtls/include/psa/crypto_struct.h new file mode 100644 index 0000000..213625f --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_struct.h @@ -0,0 +1,452 @@ +/** + * \file psa/crypto_struct.h + * + * \brief PSA cryptography module: Mbed TLS structured type implementations + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. + * + * This file contains the definitions of some data structures with + * implementation-specific definitions. + * + * In implementations with isolation between the application and the + * cryptography module, it is expected that the front-end and the back-end + * would have different versions of this file. + * + *

Design notes about multipart operation structures

+ * + * For multipart operations without driver delegation support, each multipart + * operation structure contains a `psa_algorithm_t alg` field which indicates + * which specific algorithm the structure is for. When the structure is not in + * use, `alg` is 0. Most of the structure consists of a union which is + * discriminated by `alg`. + * + * For multipart operations with driver delegation support, each multipart + * operation structure contains an `unsigned int id` field indicating which + * driver got assigned to do the operation. When the structure is not in use, + * 'id' is 0. The structure contains also a driver context which is the union + * of the contexts of all drivers able to handle the type of multipart + * operation. + * + * Note that when `alg` or `id` is 0, the content of other fields is undefined. + * In particular, it is not guaranteed that a freshly-initialized structure + * is all-zero: we initialize structures to something like `{0, 0}`, which + * is only guaranteed to initializes the first member of the union; + * GCC and Clang initialize the whole structure to 0 (at the time of writing), + * but MSVC and CompCert don't. + * + * In Mbed TLS, multipart operation structures live independently from + * the key. This allows Mbed TLS to free the key objects when destroying + * a key slot. If a multipart operation needs to remember the key after + * the setup function returns, the operation structure needs to contain a + * copy of the key. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_STRUCT_H +#define PSA_CRYPTO_STRUCT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Include the Mbed TLS configuration file, the way Mbed TLS does it + * in each of its header files. */ +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "mbedtls/cmac.h" +#include "mbedtls/gcm.h" + +/* Include the context definition for the compiled-in drivers for the primitive + * algorithms. */ +#include "psa/crypto_driver_contexts_primitives.h" + +struct psa_hash_operation_s { + /** Unique ID indicating which driver got assigned to do the + * operation. Since driver contexts are driver-specific, swapping + * drivers halfway through the operation is not supported. + * ID values are auto-generated in psa_driver_wrappers.h. + * ID value zero means the context is not valid or not assigned to + * any driver (i.e. the driver context is not active, in use). */ + unsigned int id; + psa_driver_hash_context_t ctx; +}; + +#define PSA_HASH_OPERATION_INIT { 0, { 0 } } +static inline struct psa_hash_operation_s psa_hash_operation_init(void) +{ + const struct psa_hash_operation_s v = PSA_HASH_OPERATION_INIT; + return v; +} + +struct psa_cipher_operation_s { + /** Unique ID indicating which driver got assigned to do the + * operation. Since driver contexts are driver-specific, swapping + * drivers halfway through the operation is not supported. + * ID values are auto-generated in psa_crypto_driver_wrappers.h + * ID value zero means the context is not valid or not assigned to + * any driver (i.e. none of the driver contexts are active). */ + unsigned int id; + + unsigned int iv_required : 1; + unsigned int iv_set : 1; + + uint8_t default_iv_length; + + psa_driver_cipher_context_t ctx; +}; + +#define PSA_CIPHER_OPERATION_INIT { 0, 0, 0, 0, { 0 } } +static inline struct psa_cipher_operation_s psa_cipher_operation_init(void) +{ + const struct psa_cipher_operation_s v = PSA_CIPHER_OPERATION_INIT; + return v; +} + +/* Include the context definition for the compiled-in drivers for the composite + * algorithms. */ +#include "psa/crypto_driver_contexts_composites.h" + +struct psa_mac_operation_s { + /** Unique ID indicating which driver got assigned to do the + * operation. Since driver contexts are driver-specific, swapping + * drivers halfway through the operation is not supported. + * ID values are auto-generated in psa_driver_wrappers.h + * ID value zero means the context is not valid or not assigned to + * any driver (i.e. none of the driver contexts are active). */ + unsigned int id; + uint8_t mac_size; + unsigned int is_sign : 1; + psa_driver_mac_context_t ctx; +}; + +#define PSA_MAC_OPERATION_INIT { 0, 0, 0, { 0 } } +static inline struct psa_mac_operation_s psa_mac_operation_init(void) +{ + const struct psa_mac_operation_s v = PSA_MAC_OPERATION_INIT; + return v; +} + +struct psa_aead_operation_s { + psa_algorithm_t alg; + unsigned int key_set : 1; + unsigned int iv_set : 1; + uint8_t iv_size; + uint8_t block_size; + union { + unsigned dummy; /* Enable easier initializing of the union. */ + mbedtls_cipher_context_t cipher; + } ctx; +}; + +#define PSA_AEAD_OPERATION_INIT { 0, 0, 0, 0, 0, { 0 } } +static inline struct psa_aead_operation_s psa_aead_operation_init(void) +{ + const struct psa_aead_operation_s v = PSA_AEAD_OPERATION_INIT; + return v; +} + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF) +typedef struct { + uint8_t *info; + size_t info_length; +#if PSA_HASH_MAX_SIZE > 0xff +#error "PSA_HASH_MAX_SIZE does not fit in uint8_t" +#endif + uint8_t offset_in_block; + uint8_t block_number; + unsigned int state : 2; + unsigned int info_set : 1; + uint8_t output_block[PSA_HASH_MAX_SIZE]; + uint8_t prk[PSA_HASH_MAX_SIZE]; + struct psa_mac_operation_s hmac; +} psa_hkdf_key_derivation_t; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF */ + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) +typedef enum { + PSA_TLS12_PRF_STATE_INIT, /* no input provided */ + PSA_TLS12_PRF_STATE_SEED_SET, /* seed has been set */ + PSA_TLS12_PRF_STATE_KEY_SET, /* key has been set */ + PSA_TLS12_PRF_STATE_LABEL_SET, /* label has been set */ + PSA_TLS12_PRF_STATE_OUTPUT /* output has been started */ +} psa_tls12_prf_key_derivation_state_t; + +typedef struct psa_tls12_prf_key_derivation_s { +#if PSA_HASH_MAX_SIZE > 0xff +#error "PSA_HASH_MAX_SIZE does not fit in uint8_t" +#endif + + /* Indicates how many bytes in the current HMAC block have + * not yet been read by the user. */ + uint8_t left_in_block; + + /* The 1-based number of the block. */ + uint8_t block_number; + + psa_tls12_prf_key_derivation_state_t state; + + uint8_t *secret; + size_t secret_length; + uint8_t *seed; + size_t seed_length; + uint8_t *label; + size_t label_length; + + uint8_t Ai[PSA_HASH_MAX_SIZE]; + + /* `HMAC_hash( prk, A(i) + seed )` in the notation of RFC 5246, Sect. 5. */ + uint8_t output_block[PSA_HASH_MAX_SIZE]; +} psa_tls12_prf_key_derivation_t; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || + * MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS */ + +struct psa_key_derivation_s { + psa_algorithm_t alg; + unsigned int can_output_key : 1; + size_t capacity; + union { + /* Make the union non-empty even with no supported algorithms. */ + uint8_t dummy; +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF) + psa_hkdf_key_derivation_t hkdf; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) + psa_tls12_prf_key_derivation_t tls12_prf; +#endif + } ctx; +}; + +/* This only zeroes out the first byte in the union, the rest is unspecified. */ +#define PSA_KEY_DERIVATION_OPERATION_INIT { 0, 0, 0, { 0 } } +static inline struct psa_key_derivation_s psa_key_derivation_operation_init(void) +{ + const struct psa_key_derivation_s v = PSA_KEY_DERIVATION_OPERATION_INIT; + return v; +} + +struct psa_key_policy_s { + psa_key_usage_t usage; + psa_algorithm_t alg; + psa_algorithm_t alg2; +}; +typedef struct psa_key_policy_s psa_key_policy_t; + +#define PSA_KEY_POLICY_INIT { 0, 0, 0 } +static inline struct psa_key_policy_s psa_key_policy_init(void) +{ + const struct psa_key_policy_s v = PSA_KEY_POLICY_INIT; + return v; +} + +/* The type used internally for key sizes. + * Public interfaces use size_t, but internally we use a smaller type. */ +typedef uint16_t psa_key_bits_t; +/* The maximum value of the type used to represent bit-sizes. + * This is used to mark an invalid key size. */ +#define PSA_KEY_BITS_TOO_LARGE ((psa_key_bits_t) (-1)) +/* The maximum size of a key in bits. + * Currently defined as the maximum that can be represented, rounded down + * to a whole number of bytes. + * This is an uncast value so that it can be used in preprocessor + * conditionals. */ +#define PSA_MAX_KEY_BITS 0xfff8 + +/** A mask of flags that can be stored in key attributes. + * + * This type is also used internally to store flags in slots. Internal + * flags are defined in library/psa_crypto_core.h. Internal flags may have + * the same value as external flags if they are properly handled during + * key creation and in psa_get_key_attributes. + */ +typedef uint16_t psa_key_attributes_flag_t; + +#define MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER \ + ((psa_key_attributes_flag_t) 0x0001) + +/* A mask of key attribute flags used externally only. + * Only meant for internal checks inside the library. */ +#define MBEDTLS_PSA_KA_MASK_EXTERNAL_ONLY ( \ + MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER | \ + 0) + +/* A mask of key attribute flags used both internally and externally. + * Currently there aren't any. */ +#define MBEDTLS_PSA_KA_MASK_DUAL_USE ( \ + 0) + +typedef struct { + psa_key_type_t type; + psa_key_bits_t bits; + psa_key_lifetime_t lifetime; + mbedtls_svc_key_id_t id; + psa_key_policy_t policy; + psa_key_attributes_flag_t flags; +} psa_core_key_attributes_t; + +#define PSA_CORE_KEY_ATTRIBUTES_INIT { PSA_KEY_TYPE_NONE, 0, PSA_KEY_LIFETIME_VOLATILE, \ + MBEDTLS_SVC_KEY_ID_INIT, PSA_KEY_POLICY_INIT, 0 } + +struct psa_key_attributes_s { + psa_core_key_attributes_t core; +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + psa_key_slot_number_t slot_number; +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + void *domain_parameters; + size_t domain_parameters_size; +}; + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) +#define PSA_KEY_ATTRIBUTES_INIT { PSA_CORE_KEY_ATTRIBUTES_INIT, 0, NULL, 0 } +#else +#define PSA_KEY_ATTRIBUTES_INIT { PSA_CORE_KEY_ATTRIBUTES_INIT, NULL, 0 } +#endif + +static inline struct psa_key_attributes_s psa_key_attributes_init(void) +{ + const struct psa_key_attributes_s v = PSA_KEY_ATTRIBUTES_INIT; + return v; +} + +static inline void psa_set_key_id(psa_key_attributes_t *attributes, + mbedtls_svc_key_id_t key) +{ + psa_key_lifetime_t lifetime = attributes->core.lifetime; + + attributes->core.id = key; + + if (PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)) { + attributes->core.lifetime = + PSA_KEY_LIFETIME_FROM_PERSISTENCE_AND_LOCATION( + PSA_KEY_LIFETIME_PERSISTENT, + PSA_KEY_LIFETIME_GET_LOCATION(lifetime)); + } +} + +static inline mbedtls_svc_key_id_t psa_get_key_id( + const psa_key_attributes_t *attributes) +{ + return attributes->core.id; +} + +#ifdef MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER +static inline void mbedtls_set_key_owner_id(psa_key_attributes_t *attributes, + mbedtls_key_owner_id_t owner) +{ + attributes->core.id.owner = owner; +} +#endif + +static inline void psa_set_key_lifetime(psa_key_attributes_t *attributes, + psa_key_lifetime_t lifetime) +{ + attributes->core.lifetime = lifetime; + if (PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)) { +#ifdef MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER + attributes->core.id.key_id = 0; +#else + attributes->core.id = 0; +#endif + } +} + +static inline psa_key_lifetime_t psa_get_key_lifetime( + const psa_key_attributes_t *attributes) +{ + return attributes->core.lifetime; +} + +static inline void psa_extend_key_usage_flags(psa_key_usage_t *usage_flags) +{ + if (*usage_flags & PSA_KEY_USAGE_SIGN_HASH) { + *usage_flags |= PSA_KEY_USAGE_SIGN_MESSAGE; + } + + if (*usage_flags & PSA_KEY_USAGE_VERIFY_HASH) { + *usage_flags |= PSA_KEY_USAGE_VERIFY_MESSAGE; + } +} + +static inline void psa_set_key_usage_flags(psa_key_attributes_t *attributes, + psa_key_usage_t usage_flags) +{ + psa_extend_key_usage_flags(&usage_flags); + attributes->core.policy.usage = usage_flags; +} + +static inline psa_key_usage_t psa_get_key_usage_flags( + const psa_key_attributes_t *attributes) +{ + return attributes->core.policy.usage; +} + +static inline void psa_set_key_algorithm(psa_key_attributes_t *attributes, + psa_algorithm_t alg) +{ + attributes->core.policy.alg = alg; +} + +static inline psa_algorithm_t psa_get_key_algorithm( + const psa_key_attributes_t *attributes) +{ + return attributes->core.policy.alg; +} + +/* This function is declared in crypto_extra.h, which comes after this + * header file, but we need the function here, so repeat the declaration. */ +psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes, + psa_key_type_t type, + const uint8_t *data, + size_t data_length); + +static inline void psa_set_key_type(psa_key_attributes_t *attributes, + psa_key_type_t type) +{ + if (attributes->domain_parameters == NULL) { + /* Common case: quick path */ + attributes->core.type = type; + } else { + /* Call the bigger function to free the old domain parameters. + * Ignore any errors which may arise due to type requiring + * non-default domain parameters, since this function can't + * report errors. */ + (void) psa_set_key_domain_parameters(attributes, type, NULL, 0); + } +} + +static inline psa_key_type_t psa_get_key_type( + const psa_key_attributes_t *attributes) +{ + return attributes->core.type; +} + +static inline void psa_set_key_bits(psa_key_attributes_t *attributes, + size_t bits) +{ + if (bits > PSA_MAX_KEY_BITS) { + attributes->core.bits = PSA_KEY_BITS_TOO_LARGE; + } else { + attributes->core.bits = (psa_key_bits_t) bits; + } +} + +static inline size_t psa_get_key_bits( + const psa_key_attributes_t *attributes) +{ + return attributes->core.bits; +} + +#ifdef __cplusplus +} +#endif + +#endif /* PSA_CRYPTO_STRUCT_H */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_types.h b/ext/opcua_client/mbedtls/include/psa/crypto_types.h new file mode 100644 index 0000000..90cda1a --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_types.h @@ -0,0 +1,451 @@ +/** + * \file psa/crypto_types.h + * + * \brief PSA cryptography module: type aliases. + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. Drivers must include the appropriate driver + * header file. + * + * This file contains portable definitions of integral types for properties + * of cryptographic keys, designations of cryptographic algorithms, and + * error codes returned by the library. + * + * This header file does not declare any function. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_TYPES_H +#define PSA_CRYPTO_TYPES_H + +#include "crypto_platform.h" + +/* If MBEDTLS_PSA_CRYPTO_C is defined, make sure MBEDTLS_PSA_CRYPTO_CLIENT + * is defined as well to include all PSA code. + */ +#if defined(MBEDTLS_PSA_CRYPTO_C) +#define MBEDTLS_PSA_CRYPTO_CLIENT +#endif /* MBEDTLS_PSA_CRYPTO_C */ + +#include + +/** \defgroup error Error codes + * @{ + */ + +/** + * \brief Function return status. + * + * This is either #PSA_SUCCESS (which is zero), indicating success, + * or a small negative value indicating that an error occurred. Errors are + * encoded as one of the \c PSA_ERROR_xxx values defined here. */ +/* If #PSA_SUCCESS is already defined, it means that #psa_status_t + * is also defined in an external header, so prevent its multiple + * definition. + */ +#ifndef PSA_SUCCESS +typedef int32_t psa_status_t; +#endif + +/**@}*/ + +/** \defgroup crypto_types Key and algorithm types + * @{ + */ + +/** \brief Encoding of a key type. + * + * Values of this type are generally constructed by macros called + * `PSA_KEY_TYPE_xxx`. + * + * \note Values of this type are encoded in the persistent key store. + * Any changes to existing values will require bumping the storage + * format version and providing a translation when reading the old + * format. + */ +typedef uint16_t psa_key_type_t; + +/** The type of PSA elliptic curve family identifiers. + * + * Values of this type are generally constructed by macros called + * `PSA_ECC_FAMILY_xxx`. + * + * The curve identifier is required to create an ECC key using the + * PSA_KEY_TYPE_ECC_KEY_PAIR() or PSA_KEY_TYPE_ECC_PUBLIC_KEY() + * macros. + * + * Values defined by this standard will never be in the range 0x80-0xff. + * Vendors who define additional families must use an encoding in this range. + * + * \note Values of this type are encoded in the persistent key store. + * Any changes to existing values will require bumping the storage + * format version and providing a translation when reading the old + * format. + */ +typedef uint8_t psa_ecc_family_t; + +/** The type of PSA Diffie-Hellman group family identifiers. + * + * Values of this type are generally constructed by macros called + * `PSA_DH_FAMILY_xxx`. + * + * The group identifier is required to create a Diffie-Hellman key using the + * PSA_KEY_TYPE_DH_KEY_PAIR() or PSA_KEY_TYPE_DH_PUBLIC_KEY() + * macros. + * + * Values defined by this standard will never be in the range 0x80-0xff. + * Vendors who define additional families must use an encoding in this range. + * + * \note Values of this type are encoded in the persistent key store. + * Any changes to existing values will require bumping the storage + * format version and providing a translation when reading the old + * format. + */ +typedef uint8_t psa_dh_family_t; + +/** \brief Encoding of a cryptographic algorithm. + * + * Values of this type are generally constructed by macros called + * `PSA_ALG_xxx`. + * + * For algorithms that can be applied to multiple key types, this type + * does not encode the key type. For example, for symmetric ciphers + * based on a block cipher, #psa_algorithm_t encodes the block cipher + * mode and the padding mode while the block cipher itself is encoded + * via #psa_key_type_t. + * + * \note Values of this type are encoded in the persistent key store. + * Any changes to existing values will require bumping the storage + * format version and providing a translation when reading the old + * format. + */ +typedef uint32_t psa_algorithm_t; + +/**@}*/ + +/** \defgroup key_lifetimes Key lifetimes + * @{ + */ + +/** Encoding of key lifetimes. + * + * The lifetime of a key indicates where it is stored and what system actions + * may create and destroy it. + * + * Lifetime values have the following structure: + * - Bits 0-7 (#PSA_KEY_LIFETIME_GET_PERSISTENCE(\c lifetime)): + * persistence level. This value indicates what device management + * actions can cause it to be destroyed. In particular, it indicates + * whether the key is _volatile_ or _persistent_. + * See ::psa_key_persistence_t for more information. + * - Bits 8-31 (#PSA_KEY_LIFETIME_GET_LOCATION(\c lifetime)): + * location indicator. This value indicates which part of the system + * has access to the key material and can perform operations using the key. + * See ::psa_key_location_t for more information. + * + * Volatile keys are automatically destroyed when the application instance + * terminates or on a power reset of the device. Persistent keys are + * preserved until the application explicitly destroys them or until an + * integration-specific device management event occurs (for example, + * a factory reset). + * + * Persistent keys have a key identifier of type #mbedtls_svc_key_id_t. + * This identifier remains valid throughout the lifetime of the key, + * even if the application instance that created the key terminates. + * The application can call psa_open_key() to open a persistent key that + * it created previously. + * + * The default lifetime of a key is #PSA_KEY_LIFETIME_VOLATILE. The lifetime + * #PSA_KEY_LIFETIME_PERSISTENT is supported if persistent storage is + * available. Other lifetime values may be supported depending on the + * library configuration. + * + * Values of this type are generally constructed by macros called + * `PSA_KEY_LIFETIME_xxx`. + * + * \note Values of this type are encoded in the persistent key store. + * Any changes to existing values will require bumping the storage + * format version and providing a translation when reading the old + * format. + */ +typedef uint32_t psa_key_lifetime_t; + +/** Encoding of key persistence levels. + * + * What distinguishes different persistence levels is what device management + * events may cause keys to be destroyed. _Volatile_ keys are destroyed + * by a power reset. Persistent keys may be destroyed by events such as + * a transfer of ownership or a factory reset. What management events + * actually affect persistent keys at different levels is outside the + * scope of the PSA Cryptography specification. + * + * The PSA Cryptography specification defines the following values of + * persistence levels: + * - \c 0 = #PSA_KEY_PERSISTENCE_VOLATILE: volatile key. + * A volatile key is automatically destroyed by the implementation when + * the application instance terminates. In particular, a volatile key + * is automatically destroyed on a power reset of the device. + * - \c 1 = #PSA_KEY_PERSISTENCE_DEFAULT: + * persistent key with a default lifetime. + * - \c 2-254: currently not supported by Mbed TLS. + * - \c 255 = #PSA_KEY_PERSISTENCE_READ_ONLY: + * read-only or write-once key. + * A key with this persistence level cannot be destroyed. + * Mbed TLS does not currently offer a way to create such keys, but + * integrations of Mbed TLS can use it for built-in keys that the + * application cannot modify (for example, a hardware unique key (HUK)). + * + * \note Key persistence levels are 8-bit values. Key management + * interfaces operate on lifetimes (type ::psa_key_lifetime_t) which + * encode the persistence as the lower 8 bits of a 32-bit value. + * + * \note Values of this type are encoded in the persistent key store. + * Any changes to existing values will require bumping the storage + * format version and providing a translation when reading the old + * format. + */ +typedef uint8_t psa_key_persistence_t; + +/** Encoding of key location indicators. + * + * If an integration of Mbed TLS can make calls to external + * cryptoprocessors such as secure elements, the location of a key + * indicates which secure element performs the operations on the key. + * Depending on the design of the secure element, the key + * material may be stored either in the secure element, or + * in wrapped (encrypted) form alongside the key metadata in the + * primary local storage. + * + * The PSA Cryptography API specification defines the following values of + * location indicators: + * - \c 0: primary local storage. + * This location is always available. + * The primary local storage is typically the same storage area that + * contains the key metadata. + * - \c 1: primary secure element. + * Integrations of Mbed TLS should support this value if there is a secure + * element attached to the operating environment. + * As a guideline, secure elements may provide higher resistance against + * side channel and physical attacks than the primary local storage, but may + * have restrictions on supported key types, sizes, policies and operations + * and may have different performance characteristics. + * - \c 2-0x7fffff: other locations defined by a PSA specification. + * The PSA Cryptography API does not currently assign any meaning to these + * locations, but future versions of that specification or other PSA + * specifications may do so. + * - \c 0x800000-0xffffff: vendor-defined locations. + * No PSA specification will assign a meaning to locations in this range. + * + * \note Key location indicators are 24-bit values. Key management + * interfaces operate on lifetimes (type ::psa_key_lifetime_t) which + * encode the location as the upper 24 bits of a 32-bit value. + * + * \note Values of this type are encoded in the persistent key store. + * Any changes to existing values will require bumping the storage + * format version and providing a translation when reading the old + * format. + */ +typedef uint32_t psa_key_location_t; + +/** Encoding of identifiers of persistent keys. + * + * - Applications may freely choose key identifiers in the range + * #PSA_KEY_ID_USER_MIN to #PSA_KEY_ID_USER_MAX. + * - The implementation may define additional key identifiers in the range + * #PSA_KEY_ID_VENDOR_MIN to #PSA_KEY_ID_VENDOR_MAX. + * - 0 is reserved as an invalid key identifier. + * - Key identifiers outside these ranges are reserved for future use. + * + * \note Values of this type are encoded in the persistent key store. + * Any changes to how values are allocated must require careful + * consideration to allow backward compatibility. + */ +typedef uint32_t psa_key_id_t; + +/** Encoding of key identifiers as seen inside the PSA Crypto implementation. + * + * When PSA Crypto is built as a library inside an application, this type + * is identical to #psa_key_id_t. When PSA Crypto is built as a service + * that can store keys on behalf of multiple clients, this type + * encodes the #psa_key_id_t value seen by each client application as + * well as extra information that identifies the client that owns + * the key. + * + * \note Values of this type are encoded in the persistent key store. + * Any changes to existing values will require bumping the storage + * format version and providing a translation when reading the old + * format. + */ +#if !defined(MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER) +typedef psa_key_id_t mbedtls_svc_key_id_t; + +#else /* MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER */ +/* Implementation-specific: The Mbed TLS library can be built as + * part of a multi-client service that exposes the PSA Cryptography API in each + * client and encodes the client identity in the key identifier argument of + * functions such as psa_open_key(). + */ +typedef struct { + psa_key_id_t key_id; + mbedtls_key_owner_id_t owner; +} mbedtls_svc_key_id_t; + +#endif /* !MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER */ + +/**@}*/ + +/** \defgroup policy Key policies + * @{ + */ + +/** \brief Encoding of permitted usage on a key. + * + * Values of this type are generally constructed as bitwise-ors of macros + * called `PSA_KEY_USAGE_xxx`. + * + * \note Values of this type are encoded in the persistent key store. + * Any changes to existing values will require bumping the storage + * format version and providing a translation when reading the old + * format. + */ +typedef uint32_t psa_key_usage_t; + +/**@}*/ + +/** \defgroup attributes Key attributes + * @{ + */ + +/** The type of a structure containing key attributes. + * + * This is an opaque structure that can represent the metadata of a key + * object. Metadata that can be stored in attributes includes: + * - The location of the key in storage, indicated by its key identifier + * and its lifetime. + * - The key's policy, comprising usage flags and a specification of + * the permitted algorithm(s). + * - Information about the key itself: the key type and its size. + * - Additional implementation-defined attributes. + * + * The actual key material is not considered an attribute of a key. + * Key attributes do not contain information that is generally considered + * highly confidential. + * + * An attribute structure works like a simple data structure where each function + * `psa_set_key_xxx` sets a field and the corresponding function + * `psa_get_key_xxx` retrieves the value of the corresponding field. + * However, a future version of the library may report values that are + * equivalent to the original one, but have a different encoding. Invalid + * values may be mapped to different, also invalid values. + * + * An attribute structure may contain references to auxiliary resources, + * for example pointers to allocated memory or indirect references to + * pre-calculated values. In order to free such resources, the application + * must call psa_reset_key_attributes(). As an exception, calling + * psa_reset_key_attributes() on an attribute structure is optional if + * the structure has only been modified by the following functions + * since it was initialized or last reset with psa_reset_key_attributes(): + * - psa_set_key_id() + * - psa_set_key_lifetime() + * - psa_set_key_type() + * - psa_set_key_bits() + * - psa_set_key_usage_flags() + * - psa_set_key_algorithm() + * + * Before calling any function on a key attribute structure, the application + * must initialize it by any of the following means: + * - Set the structure to all-bits-zero, for example: + * \code + * psa_key_attributes_t attributes; + * memset(&attributes, 0, sizeof(attributes)); + * \endcode + * - Initialize the structure to logical zero values, for example: + * \code + * psa_key_attributes_t attributes = {0}; + * \endcode + * - Initialize the structure to the initializer #PSA_KEY_ATTRIBUTES_INIT, + * for example: + * \code + * psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + * \endcode + * - Assign the result of the function psa_key_attributes_init() + * to the structure, for example: + * \code + * psa_key_attributes_t attributes; + * attributes = psa_key_attributes_init(); + * \endcode + * + * A freshly initialized attribute structure contains the following + * values: + * + * - lifetime: #PSA_KEY_LIFETIME_VOLATILE. + * - key identifier: 0 (which is not a valid key identifier). + * - type: \c 0 (meaning that the type is unspecified). + * - key size: \c 0 (meaning that the size is unspecified). + * - usage flags: \c 0 (which allows no usage except exporting a public key). + * - algorithm: \c 0 (which allows no cryptographic usage, but allows + * exporting). + * + * A typical sequence to create a key is as follows: + * -# Create and initialize an attribute structure. + * -# If the key is persistent, call psa_set_key_id(). + * Also call psa_set_key_lifetime() to place the key in a non-default + * location. + * -# Set the key policy with psa_set_key_usage_flags() and + * psa_set_key_algorithm(). + * -# Set the key type with psa_set_key_type(). + * Skip this step if copying an existing key with psa_copy_key(). + * -# When generating a random key with psa_generate_key() or deriving a key + * with psa_key_derivation_output_key(), set the desired key size with + * psa_set_key_bits(). + * -# Call a key creation function: psa_import_key(), psa_generate_key(), + * psa_key_derivation_output_key() or psa_copy_key(). This function reads + * the attribute structure, creates a key with these attributes, and + * outputs a key identifier to the newly created key. + * -# The attribute structure is now no longer necessary. + * You may call psa_reset_key_attributes(), although this is optional + * with the workflow presented here because the attributes currently + * defined in this specification do not require any additional resources + * beyond the structure itself. + * + * A typical sequence to query a key's attributes is as follows: + * -# Call psa_get_key_attributes(). + * -# Call `psa_get_key_xxx` functions to retrieve the attribute(s) that + * you are interested in. + * -# Call psa_reset_key_attributes() to free any resources that may be + * used by the attribute structure. + * + * Once a key has been created, it is impossible to change its attributes. + */ +typedef struct psa_key_attributes_s psa_key_attributes_t; + + +#ifndef __DOXYGEN_ONLY__ +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) +/* Mbed TLS defines this type in crypto_types.h because it is also + * visible to applications through an implementation-specific extension. + * For the PSA Cryptography specification, this type is only visible + * via crypto_se_driver.h. */ +typedef uint64_t psa_key_slot_number_t; +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ +#endif /* !__DOXYGEN_ONLY__ */ + +/**@}*/ + +/** \defgroup derivation Key derivation + * @{ + */ + +/** \brief Encoding of the step of a key derivation. + * + * Values of this type are generally constructed by macros called + * `PSA_KEY_DERIVATION_INPUT_xxx`. + */ +typedef uint16_t psa_key_derivation_step_t; + +/**@}*/ + +#endif /* PSA_CRYPTO_TYPES_H */ diff --git a/ext/opcua_client/mbedtls/include/psa/crypto_values.h b/ext/opcua_client/mbedtls/include/psa/crypto_values.h new file mode 100644 index 0000000..773c01e --- /dev/null +++ b/ext/opcua_client/mbedtls/include/psa/crypto_values.h @@ -0,0 +1,2396 @@ +/** + * \file psa/crypto_values.h + * + * \brief PSA cryptography module: macros to build and analyze integer values. + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. Drivers must include the appropriate driver + * header file. + * + * This file contains portable definitions of macros to build and analyze + * values of integral types that encode properties of cryptographic keys, + * designations of cryptographic algorithms, and error codes returned by + * the library. + * + * Note that many of the constants defined in this file are embedded in + * the persistent key store, as part of key metadata (including usage + * policies). As a consequence, they must not be changed (unless the storage + * format version changes). + * + * This header file only defines preprocessor macros. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_VALUES_H +#define PSA_CRYPTO_VALUES_H + +/** \defgroup error Error codes + * @{ + */ + +/* PSA error codes */ + +/* Error codes are standardized across PSA domains (framework, crypto, storage, + * etc.). Do not change the values in this section or even the expansions + * of each macro: it must be possible to `#include` both this header + * and some other PSA component's headers in the same C source, + * which will lead to duplicate definitions of the `PSA_SUCCESS` and + * `PSA_ERROR_xxx` macros, which is ok if and only if the macros expand + * to the same sequence of tokens. + * + * If you must add a new + * value, check with the Arm PSA framework group to pick one that other + * domains aren't already using. */ + +/* Tell uncrustify not to touch the constant definitions, otherwise + * it might change the spacing to something that is not PSA-compliant + * (e.g. adding a space after casts). + * + * *INDENT-OFF* + */ + +/** The action was completed successfully. */ +#define PSA_SUCCESS ((psa_status_t)0) + +/** An error occurred that does not correspond to any defined + * failure cause. + * + * Implementations may use this error code if none of the other standard + * error codes are applicable. */ +#define PSA_ERROR_GENERIC_ERROR ((psa_status_t)-132) + +/** The requested operation or a parameter is not supported + * by this implementation. + * + * Implementations should return this error code when an enumeration + * parameter such as a key type, algorithm, etc. is not recognized. + * If a combination of parameters is recognized and identified as + * not valid, return #PSA_ERROR_INVALID_ARGUMENT instead. */ +#define PSA_ERROR_NOT_SUPPORTED ((psa_status_t)-134) + +/** The requested action is denied by a policy. + * + * Implementations should return this error code when the parameters + * are recognized as valid and supported, and a policy explicitly + * denies the requested operation. + * + * If a subset of the parameters of a function call identify a + * forbidden operation, and another subset of the parameters are + * not valid or not supported, it is unspecified whether the function + * returns #PSA_ERROR_NOT_PERMITTED, #PSA_ERROR_NOT_SUPPORTED or + * #PSA_ERROR_INVALID_ARGUMENT. */ +#define PSA_ERROR_NOT_PERMITTED ((psa_status_t)-133) + +/** An output buffer is too small. + * + * Applications can call the \c PSA_xxx_SIZE macro listed in the function + * description to determine a sufficient buffer size. + * + * Implementations should preferably return this error code only + * in cases when performing the operation with a larger output + * buffer would succeed. However implementations may return this + * error if a function has invalid or unsupported parameters in addition + * to the parameters that determine the necessary output buffer size. */ +#define PSA_ERROR_BUFFER_TOO_SMALL ((psa_status_t)-138) + +/** Asking for an item that already exists + * + * Implementations should return this error, when attempting + * to write an item (like a key) that already exists. */ +#define PSA_ERROR_ALREADY_EXISTS ((psa_status_t)-139) + +/** Asking for an item that doesn't exist + * + * Implementations should return this error, if a requested item (like + * a key) does not exist. */ +#define PSA_ERROR_DOES_NOT_EXIST ((psa_status_t)-140) + +/** The requested action cannot be performed in the current state. + * + * Multipart operations return this error when one of the + * functions is called out of sequence. Refer to the function + * descriptions for permitted sequencing of functions. + * + * Implementations shall not return this error code to indicate + * that a key either exists or not, + * but shall instead return #PSA_ERROR_ALREADY_EXISTS or #PSA_ERROR_DOES_NOT_EXIST + * as applicable. + * + * Implementations shall not return this error code to indicate that a + * key identifier is invalid, but shall return #PSA_ERROR_INVALID_HANDLE + * instead. */ +#define PSA_ERROR_BAD_STATE ((psa_status_t)-137) + +/** The parameters passed to the function are invalid. + * + * Implementations may return this error any time a parameter or + * combination of parameters are recognized as invalid. + * + * Implementations shall not return this error code to indicate that a + * key identifier is invalid, but shall return #PSA_ERROR_INVALID_HANDLE + * instead. + */ +#define PSA_ERROR_INVALID_ARGUMENT ((psa_status_t)-135) + +/** There is not enough runtime memory. + * + * If the action is carried out across multiple security realms, this + * error can refer to available memory in any of the security realms. */ +#define PSA_ERROR_INSUFFICIENT_MEMORY ((psa_status_t)-141) + +/** There is not enough persistent storage. + * + * Functions that modify the key storage return this error code if + * there is insufficient storage space on the host media. In addition, + * many functions that do not otherwise access storage may return this + * error code if the implementation requires a mandatory log entry for + * the requested action and the log storage space is full. */ +#define PSA_ERROR_INSUFFICIENT_STORAGE ((psa_status_t)-142) + +/** There was a communication failure inside the implementation. + * + * This can indicate a communication failure between the application + * and an external cryptoprocessor or between the cryptoprocessor and + * an external volatile or persistent memory. A communication failure + * may be transient or permanent depending on the cause. + * + * \warning If a function returns this error, it is undetermined + * whether the requested action has completed or not. Implementations + * should return #PSA_SUCCESS on successful completion whenever + * possible, however functions may return #PSA_ERROR_COMMUNICATION_FAILURE + * if the requested action was completed successfully in an external + * cryptoprocessor but there was a breakdown of communication before + * the cryptoprocessor could report the status to the application. + */ +#define PSA_ERROR_COMMUNICATION_FAILURE ((psa_status_t)-145) + +/** There was a storage failure that may have led to data loss. + * + * This error indicates that some persistent storage is corrupted. + * It should not be used for a corruption of volatile memory + * (use #PSA_ERROR_CORRUPTION_DETECTED), for a communication error + * between the cryptoprocessor and its external storage (use + * #PSA_ERROR_COMMUNICATION_FAILURE), or when the storage is + * in a valid state but is full (use #PSA_ERROR_INSUFFICIENT_STORAGE). + * + * Note that a storage failure does not indicate that any data that was + * previously read is invalid. However this previously read data may no + * longer be readable from storage. + * + * When a storage failure occurs, it is no longer possible to ensure + * the global integrity of the keystore. Depending on the global + * integrity guarantees offered by the implementation, access to other + * data may or may not fail even if the data is still readable but + * its integrity cannot be guaranteed. + * + * Implementations should only use this error code to report a + * permanent storage corruption. However application writers should + * keep in mind that transient errors while reading the storage may be + * reported using this error code. */ +#define PSA_ERROR_STORAGE_FAILURE ((psa_status_t)-146) + +/** A hardware failure was detected. + * + * A hardware failure may be transient or permanent depending on the + * cause. */ +#define PSA_ERROR_HARDWARE_FAILURE ((psa_status_t)-147) + +/** A tampering attempt was detected. + * + * If an application receives this error code, there is no guarantee + * that previously accessed or computed data was correct and remains + * confidential. Applications should not perform any security function + * and should enter a safe failure state. + * + * Implementations may return this error code if they detect an invalid + * state that cannot happen during normal operation and that indicates + * that the implementation's security guarantees no longer hold. Depending + * on the implementation architecture and on its security and safety goals, + * the implementation may forcibly terminate the application. + * + * This error code is intended as a last resort when a security breach + * is detected and it is unsure whether the keystore data is still + * protected. Implementations shall only return this error code + * to report an alarm from a tampering detector, to indicate that + * the confidentiality of stored data can no longer be guaranteed, + * or to indicate that the integrity of previously returned data is now + * considered compromised. Implementations shall not use this error code + * to indicate a hardware failure that merely makes it impossible to + * perform the requested operation (use #PSA_ERROR_COMMUNICATION_FAILURE, + * #PSA_ERROR_STORAGE_FAILURE, #PSA_ERROR_HARDWARE_FAILURE, + * #PSA_ERROR_INSUFFICIENT_ENTROPY or other applicable error code + * instead). + * + * This error indicates an attack against the application. Implementations + * shall not return this error code as a consequence of the behavior of + * the application itself. */ +#define PSA_ERROR_CORRUPTION_DETECTED ((psa_status_t)-151) + +/** There is not enough entropy to generate random data needed + * for the requested action. + * + * This error indicates a failure of a hardware random generator. + * Application writers should note that this error can be returned not + * only by functions whose purpose is to generate random data, such + * as key, IV or nonce generation, but also by functions that execute + * an algorithm with a randomized result, as well as functions that + * use randomization of intermediate computations as a countermeasure + * to certain attacks. + * + * Implementations should avoid returning this error after psa_crypto_init() + * has succeeded. Implementations should generate sufficient + * entropy during initialization and subsequently use a cryptographically + * secure pseudorandom generator (PRNG). However implementations may return + * this error at any time if a policy requires the PRNG to be reseeded + * during normal operation. */ +#define PSA_ERROR_INSUFFICIENT_ENTROPY ((psa_status_t)-148) + +/** The signature, MAC or hash is incorrect. + * + * Verification functions return this error if the verification + * calculations completed successfully, and the value to be verified + * was determined to be incorrect. + * + * If the value to verify has an invalid size, implementations may return + * either #PSA_ERROR_INVALID_ARGUMENT or #PSA_ERROR_INVALID_SIGNATURE. */ +#define PSA_ERROR_INVALID_SIGNATURE ((psa_status_t)-149) + +/** The decrypted padding is incorrect. + * + * \warning In some protocols, when decrypting data, it is essential that + * the behavior of the application does not depend on whether the padding + * is correct, down to precise timing. Applications should prefer + * protocols that use authenticated encryption rather than plain + * encryption. If the application must perform a decryption of + * unauthenticated data, the application writer should take care not + * to reveal whether the padding is invalid. + * + * Implementations should strive to make valid and invalid padding + * as close as possible to indistinguishable to an external observer. + * In particular, the timing of a decryption operation should not + * depend on the validity of the padding. */ +#define PSA_ERROR_INVALID_PADDING ((psa_status_t)-150) + +/** Return this error when there's insufficient data when attempting + * to read from a resource. */ +#define PSA_ERROR_INSUFFICIENT_DATA ((psa_status_t)-143) + +/** The key identifier is not valid. See also :ref:\`key-handles\`. + */ +#define PSA_ERROR_INVALID_HANDLE ((psa_status_t)-136) + +/** Stored data has been corrupted. + * + * This error indicates that some persistent storage has suffered corruption. + * It does not indicate the following situations, which have specific error + * codes: + * + * - A corruption of volatile memory - use #PSA_ERROR_CORRUPTION_DETECTED. + * - A communication error between the cryptoprocessor and its external + * storage - use #PSA_ERROR_COMMUNICATION_FAILURE. + * - When the storage is in a valid state but is full - use + * #PSA_ERROR_INSUFFICIENT_STORAGE. + * - When the storage fails for other reasons - use + * #PSA_ERROR_STORAGE_FAILURE. + * - When the stored data is not valid - use #PSA_ERROR_DATA_INVALID. + * + * \note A storage corruption does not indicate that any data that was + * previously read is invalid. However this previously read data might no + * longer be readable from storage. + * + * When a storage failure occurs, it is no longer possible to ensure the + * global integrity of the keystore. + */ +#define PSA_ERROR_DATA_CORRUPT ((psa_status_t)-152) + +/** Data read from storage is not valid for the implementation. + * + * This error indicates that some data read from storage does not have a valid + * format. It does not indicate the following situations, which have specific + * error codes: + * + * - When the storage or stored data is corrupted - use #PSA_ERROR_DATA_CORRUPT + * - When the storage fails for other reasons - use #PSA_ERROR_STORAGE_FAILURE + * - An invalid argument to the API - use #PSA_ERROR_INVALID_ARGUMENT + * + * This error is typically a result of either storage corruption on a + * cleartext storage backend, or an attempt to read data that was + * written by an incompatible version of the library. + */ +#define PSA_ERROR_DATA_INVALID ((psa_status_t)-153) + +/* *INDENT-ON* */ + +/**@}*/ + +/** \defgroup crypto_types Key and algorithm types + * @{ + */ + +/* Note that key type values, including ECC family and DH group values, are + * embedded in the persistent key store, as part of key metadata. As a + * consequence, they must not be changed (unless the storage format version + * changes). + */ + +/** An invalid key type value. + * + * Zero is not the encoding of any key type. + */ +#define PSA_KEY_TYPE_NONE ((psa_key_type_t) 0x0000) + +/** Vendor-defined key type flag. + * + * Key types defined by this standard will never have the + * #PSA_KEY_TYPE_VENDOR_FLAG bit set. Vendors who define additional key types + * must use an encoding with the #PSA_KEY_TYPE_VENDOR_FLAG bit set and should + * respect the bitwise structure used by standard encodings whenever practical. + */ +#define PSA_KEY_TYPE_VENDOR_FLAG ((psa_key_type_t) 0x8000) + +#define PSA_KEY_TYPE_CATEGORY_MASK ((psa_key_type_t) 0x7000) +#define PSA_KEY_TYPE_CATEGORY_RAW ((psa_key_type_t) 0x1000) +#define PSA_KEY_TYPE_CATEGORY_SYMMETRIC ((psa_key_type_t) 0x2000) +#define PSA_KEY_TYPE_CATEGORY_PUBLIC_KEY ((psa_key_type_t) 0x4000) +#define PSA_KEY_TYPE_CATEGORY_KEY_PAIR ((psa_key_type_t) 0x7000) + +#define PSA_KEY_TYPE_CATEGORY_FLAG_PAIR ((psa_key_type_t) 0x3000) + +/** Whether a key type is vendor-defined. + * + * See also #PSA_KEY_TYPE_VENDOR_FLAG. + */ +#define PSA_KEY_TYPE_IS_VENDOR_DEFINED(type) \ + (((type) & PSA_KEY_TYPE_VENDOR_FLAG) != 0) + +/** Whether a key type is an unstructured array of bytes. + * + * This encompasses both symmetric keys and non-key data. + */ +#define PSA_KEY_TYPE_IS_UNSTRUCTURED(type) \ + (((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_RAW || \ + ((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_SYMMETRIC) + +/** Whether a key type is asymmetric: either a key pair or a public key. */ +#define PSA_KEY_TYPE_IS_ASYMMETRIC(type) \ + (((type) & PSA_KEY_TYPE_CATEGORY_MASK \ + & ~PSA_KEY_TYPE_CATEGORY_FLAG_PAIR) == \ + PSA_KEY_TYPE_CATEGORY_PUBLIC_KEY) +/** Whether a key type is the public part of a key pair. */ +#define PSA_KEY_TYPE_IS_PUBLIC_KEY(type) \ + (((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_PUBLIC_KEY) +/** Whether a key type is a key pair containing a private part and a public + * part. */ +#define PSA_KEY_TYPE_IS_KEY_PAIR(type) \ + (((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_KEY_PAIR) +/** The key pair type corresponding to a public key type. + * + * You may also pass a key pair type as \p type, it will be left unchanged. + * + * \param type A public key type or key pair type. + * + * \return The corresponding key pair type. + * If \p type is not a public key or a key pair, + * the return value is undefined. + */ +#define PSA_KEY_TYPE_KEY_PAIR_OF_PUBLIC_KEY(type) \ + ((type) | PSA_KEY_TYPE_CATEGORY_FLAG_PAIR) +/** The public key type corresponding to a key pair type. + * + * You may also pass a public key type as \p type, it will be left unchanged. + * + * \param type A public key type or key pair type. + * + * \return The corresponding public key type. + * If \p type is not a public key or a key pair, + * the return value is undefined. + */ +#define PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) \ + ((type) & ~PSA_KEY_TYPE_CATEGORY_FLAG_PAIR) + +/** Raw data. + * + * A "key" of this type cannot be used for any cryptographic operation. + * Applications may use this type to store arbitrary data in the keystore. */ +#define PSA_KEY_TYPE_RAW_DATA ((psa_key_type_t) 0x1001) + +/** HMAC key. + * + * The key policy determines which underlying hash algorithm the key can be + * used for. + * + * HMAC keys should generally have the same size as the underlying hash. + * This size can be calculated with #PSA_HASH_LENGTH(\c alg) where + * \c alg is the HMAC algorithm or the underlying hash algorithm. */ +#define PSA_KEY_TYPE_HMAC ((psa_key_type_t) 0x1100) + +/** A secret for key derivation. + * + * The key policy determines which key derivation algorithm the key + * can be used for. + */ +#define PSA_KEY_TYPE_DERIVE ((psa_key_type_t) 0x1200) + +/** Key for a cipher, AEAD or MAC algorithm based on the AES block cipher. + * + * The size of the key can be 16 bytes (AES-128), 24 bytes (AES-192) or + * 32 bytes (AES-256). + */ +#define PSA_KEY_TYPE_AES ((psa_key_type_t) 0x2400) + +/** Key for a cipher, AEAD or MAC algorithm based on the + * ARIA block cipher. */ +#define PSA_KEY_TYPE_ARIA ((psa_key_type_t) 0x2406) + +/** Key for a cipher or MAC algorithm based on DES or 3DES (Triple-DES). + * + * The size of the key can be 64 bits (single DES), 128 bits (2-key 3DES) or + * 192 bits (3-key 3DES). + * + * Note that single DES and 2-key 3DES are weak and strongly + * deprecated and should only be used to decrypt legacy data. 3-key 3DES + * is weak and deprecated and should only be used in legacy protocols. + */ +#define PSA_KEY_TYPE_DES ((psa_key_type_t) 0x2301) + +/** Key for a cipher, AEAD or MAC algorithm based on the + * Camellia block cipher. */ +#define PSA_KEY_TYPE_CAMELLIA ((psa_key_type_t) 0x2403) + +/** Key for the ARC4 stream cipher (also known as RC4 or ARCFOUR). + * + * Note that ARC4 is weak and deprecated and should only be used in + * legacy protocols. */ +#define PSA_KEY_TYPE_ARC4 ((psa_key_type_t) 0x2002) + +/** Key for the ChaCha20 stream cipher or the Chacha20-Poly1305 AEAD algorithm. + * + * ChaCha20 and the ChaCha20_Poly1305 construction are defined in RFC 7539. + * + * Implementations must support 12-byte nonces, may support 8-byte nonces, + * and should reject other sizes. + */ +#define PSA_KEY_TYPE_CHACHA20 ((psa_key_type_t) 0x2004) + +/** RSA public key. + * + * The size of an RSA key is the bit size of the modulus. + */ +#define PSA_KEY_TYPE_RSA_PUBLIC_KEY ((psa_key_type_t) 0x4001) +/** RSA key pair (private and public key). + * + * The size of an RSA key is the bit size of the modulus. + */ +#define PSA_KEY_TYPE_RSA_KEY_PAIR ((psa_key_type_t) 0x7001) +/** Whether a key type is an RSA key (pair or public-only). */ +#define PSA_KEY_TYPE_IS_RSA(type) \ + (PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) == PSA_KEY_TYPE_RSA_PUBLIC_KEY) + +#define PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE ((psa_key_type_t) 0x4100) +#define PSA_KEY_TYPE_ECC_KEY_PAIR_BASE ((psa_key_type_t) 0x7100) +#define PSA_KEY_TYPE_ECC_CURVE_MASK ((psa_key_type_t) 0x00ff) +/** Elliptic curve key pair. + * + * The size of an elliptic curve key is the bit size associated with the curve, + * i.e. the bit size of *q* for a curve over a field *Fq*. + * See the documentation of `PSA_ECC_FAMILY_xxx` curve families for details. + * + * \param curve A value of type ::psa_ecc_family_t that + * identifies the ECC curve to be used. + */ +#define PSA_KEY_TYPE_ECC_KEY_PAIR(curve) \ + (PSA_KEY_TYPE_ECC_KEY_PAIR_BASE | (curve)) +/** Elliptic curve public key. + * + * The size of an elliptic curve public key is the same as the corresponding + * private key (see #PSA_KEY_TYPE_ECC_KEY_PAIR and the documentation of + * `PSA_ECC_FAMILY_xxx` curve families). + * + * \param curve A value of type ::psa_ecc_family_t that + * identifies the ECC curve to be used. + */ +#define PSA_KEY_TYPE_ECC_PUBLIC_KEY(curve) \ + (PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE | (curve)) + +/** Whether a key type is an elliptic curve key (pair or public-only). */ +#define PSA_KEY_TYPE_IS_ECC(type) \ + ((PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) & \ + ~PSA_KEY_TYPE_ECC_CURVE_MASK) == PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE) +/** Whether a key type is an elliptic curve key pair. */ +#define PSA_KEY_TYPE_IS_ECC_KEY_PAIR(type) \ + (((type) & ~PSA_KEY_TYPE_ECC_CURVE_MASK) == \ + PSA_KEY_TYPE_ECC_KEY_PAIR_BASE) +/** Whether a key type is an elliptic curve public key. */ +#define PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY(type) \ + (((type) & ~PSA_KEY_TYPE_ECC_CURVE_MASK) == \ + PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE) + +/** Extract the curve from an elliptic curve key type. */ +#define PSA_KEY_TYPE_ECC_GET_FAMILY(type) \ + ((psa_ecc_family_t) (PSA_KEY_TYPE_IS_ECC(type) ? \ + ((type) & PSA_KEY_TYPE_ECC_CURVE_MASK) : \ + 0)) + +/** SEC Koblitz curves over prime fields. + * + * This family comprises the following curves: + * secp192k1, secp224k1, secp256k1. + * They are defined in _Standards for Efficient Cryptography_, + * _SEC 2: Recommended Elliptic Curve Domain Parameters_. + * https://www.secg.org/sec2-v2.pdf + * + * \note For secp224k1, the bit-size is 225 (size of a private value). + * + * \note Mbed TLS only supports secp192k1 and secp256k1. + */ +#define PSA_ECC_FAMILY_SECP_K1 ((psa_ecc_family_t) 0x17) + +/** SEC random curves over prime fields. + * + * This family comprises the following curves: + * secp192r1, secp224r1, secp256r1, secp384r1, secp521r1. + * They are defined in _Standards for Efficient Cryptography_, + * _SEC 2: Recommended Elliptic Curve Domain Parameters_. + * https://www.secg.org/sec2-v2.pdf + */ +#define PSA_ECC_FAMILY_SECP_R1 ((psa_ecc_family_t) 0x12) +/* SECP160R2 (SEC2 v1, obsolete, not supported in Mbed TLS) */ +#define PSA_ECC_FAMILY_SECP_R2 ((psa_ecc_family_t) 0x1b) + +/** SEC Koblitz curves over binary fields. + * + * This family comprises the following curves: + * sect163k1, sect233k1, sect239k1, sect283k1, sect409k1, sect571k1. + * They are defined in _Standards for Efficient Cryptography_, + * _SEC 2: Recommended Elliptic Curve Domain Parameters_. + * https://www.secg.org/sec2-v2.pdf + * + * \note Mbed TLS does not support any curve in this family. + */ +#define PSA_ECC_FAMILY_SECT_K1 ((psa_ecc_family_t) 0x27) + +/** SEC random curves over binary fields. + * + * This family comprises the following curves: + * sect163r1, sect233r1, sect283r1, sect409r1, sect571r1. + * They are defined in _Standards for Efficient Cryptography_, + * _SEC 2: Recommended Elliptic Curve Domain Parameters_. + * https://www.secg.org/sec2-v2.pdf + * + * \note Mbed TLS does not support any curve in this family. + */ +#define PSA_ECC_FAMILY_SECT_R1 ((psa_ecc_family_t) 0x22) + +/** SEC additional random curves over binary fields. + * + * This family comprises the following curve: + * sect163r2. + * It is defined in _Standards for Efficient Cryptography_, + * _SEC 2: Recommended Elliptic Curve Domain Parameters_. + * https://www.secg.org/sec2-v2.pdf + * + * \note Mbed TLS does not support any curve in this family. + */ +#define PSA_ECC_FAMILY_SECT_R2 ((psa_ecc_family_t) 0x2b) + +/** Brainpool P random curves. + * + * This family comprises the following curves: + * brainpoolP160r1, brainpoolP192r1, brainpoolP224r1, brainpoolP256r1, + * brainpoolP320r1, brainpoolP384r1, brainpoolP512r1. + * It is defined in RFC 5639. + * + * \note Mbed TLS only supports the 256-bit, 384-bit and 512-bit curves + * in this family. + */ +#define PSA_ECC_FAMILY_BRAINPOOL_P_R1 ((psa_ecc_family_t) 0x30) + +/** Curve25519 and Curve448. + * + * This family comprises the following Montgomery curves: + * - 255-bit: Bernstein et al., + * _Curve25519: new Diffie-Hellman speed records_, LNCS 3958, 2006. + * The algorithm #PSA_ALG_ECDH performs X25519 when used with this curve. + * - 448-bit: Hamburg, + * _Ed448-Goldilocks, a new elliptic curve_, NIST ECC Workshop, 2015. + * The algorithm #PSA_ALG_ECDH performs X448 when used with this curve. + */ +#define PSA_ECC_FAMILY_MONTGOMERY ((psa_ecc_family_t) 0x41) + +/** The twisted Edwards curves Ed25519 and Ed448. + * + * These curves are suitable for EdDSA (#PSA_ALG_PURE_EDDSA for both curves, + * #PSA_ALG_ED25519PH for the 255-bit curve, + * #PSA_ALG_ED448PH for the 448-bit curve). + * + * This family comprises the following twisted Edwards curves: + * - 255-bit: Edwards25519, the twisted Edwards curve birationally equivalent + * to Curve25519. + * Bernstein et al., _Twisted Edwards curves_, Africacrypt 2008. + * - 448-bit: Edwards448, the twisted Edwards curve birationally equivalent + * to Curve448. + * Hamburg, _Ed448-Goldilocks, a new elliptic curve_, NIST ECC Workshop, 2015. + * + * \note Mbed TLS does not support Edwards curves yet. + */ +#define PSA_ECC_FAMILY_TWISTED_EDWARDS ((psa_ecc_family_t) 0x42) + +#define PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE ((psa_key_type_t) 0x4200) +#define PSA_KEY_TYPE_DH_KEY_PAIR_BASE ((psa_key_type_t) 0x7200) +#define PSA_KEY_TYPE_DH_GROUP_MASK ((psa_key_type_t) 0x00ff) +/** Diffie-Hellman key pair. + * + * \param group A value of type ::psa_dh_family_t that identifies the + * Diffie-Hellman group to be used. + */ +#define PSA_KEY_TYPE_DH_KEY_PAIR(group) \ + (PSA_KEY_TYPE_DH_KEY_PAIR_BASE | (group)) +/** Diffie-Hellman public key. + * + * \param group A value of type ::psa_dh_family_t that identifies the + * Diffie-Hellman group to be used. + */ +#define PSA_KEY_TYPE_DH_PUBLIC_KEY(group) \ + (PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE | (group)) + +/** Whether a key type is a Diffie-Hellman key (pair or public-only). */ +#define PSA_KEY_TYPE_IS_DH(type) \ + ((PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) & \ + ~PSA_KEY_TYPE_DH_GROUP_MASK) == PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE) +/** Whether a key type is a Diffie-Hellman key pair. */ +#define PSA_KEY_TYPE_IS_DH_KEY_PAIR(type) \ + (((type) & ~PSA_KEY_TYPE_DH_GROUP_MASK) == \ + PSA_KEY_TYPE_DH_KEY_PAIR_BASE) +/** Whether a key type is a Diffie-Hellman public key. */ +#define PSA_KEY_TYPE_IS_DH_PUBLIC_KEY(type) \ + (((type) & ~PSA_KEY_TYPE_DH_GROUP_MASK) == \ + PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE) + +/** Extract the group from a Diffie-Hellman key type. */ +#define PSA_KEY_TYPE_DH_GET_FAMILY(type) \ + ((psa_dh_family_t) (PSA_KEY_TYPE_IS_DH(type) ? \ + ((type) & PSA_KEY_TYPE_DH_GROUP_MASK) : \ + 0)) + +/** Diffie-Hellman groups defined in RFC 7919 Appendix A. + * + * This family includes groups with the following key sizes (in bits): + * 2048, 3072, 4096, 6144, 8192. A given implementation may support + * all of these sizes or only a subset. + */ +#define PSA_DH_FAMILY_RFC7919 ((psa_dh_family_t) 0x03) + +#define PSA_GET_KEY_TYPE_BLOCK_SIZE_EXPONENT(type) \ + (((type) >> 8) & 7) +/** The block size of a block cipher. + * + * \param type A cipher key type (value of type #psa_key_type_t). + * + * \return The block size for a block cipher, or 1 for a stream cipher. + * The return value is undefined if \p type is not a supported + * cipher key type. + * + * \note It is possible to build stream cipher algorithms on top of a block + * cipher, for example CTR mode (#PSA_ALG_CTR). + * This macro only takes the key type into account, so it cannot be + * used to determine the size of the data that #psa_cipher_update() + * might buffer for future processing in general. + * + * \note This macro returns a compile-time constant if its argument is one. + * + * \warning This macro may evaluate its argument multiple times. + */ +#define PSA_BLOCK_CIPHER_BLOCK_LENGTH(type) \ + (((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_SYMMETRIC ? \ + 1u << PSA_GET_KEY_TYPE_BLOCK_SIZE_EXPONENT(type) : \ + 0u) + +/* Note that algorithm values are embedded in the persistent key store, + * as part of key metadata. As a consequence, they must not be changed + * (unless the storage format version changes). + */ + +/** Vendor-defined algorithm flag. + * + * Algorithms defined by this standard will never have the #PSA_ALG_VENDOR_FLAG + * bit set. Vendors who define additional algorithms must use an encoding with + * the #PSA_ALG_VENDOR_FLAG bit set and should respect the bitwise structure + * used by standard encodings whenever practical. + */ +#define PSA_ALG_VENDOR_FLAG ((psa_algorithm_t) 0x80000000) + +#define PSA_ALG_CATEGORY_MASK ((psa_algorithm_t) 0x7f000000) +#define PSA_ALG_CATEGORY_HASH ((psa_algorithm_t) 0x02000000) +#define PSA_ALG_CATEGORY_MAC ((psa_algorithm_t) 0x03000000) +#define PSA_ALG_CATEGORY_CIPHER ((psa_algorithm_t) 0x04000000) +#define PSA_ALG_CATEGORY_AEAD ((psa_algorithm_t) 0x05000000) +#define PSA_ALG_CATEGORY_SIGN ((psa_algorithm_t) 0x06000000) +#define PSA_ALG_CATEGORY_ASYMMETRIC_ENCRYPTION ((psa_algorithm_t) 0x07000000) +#define PSA_ALG_CATEGORY_KEY_DERIVATION ((psa_algorithm_t) 0x08000000) +#define PSA_ALG_CATEGORY_KEY_AGREEMENT ((psa_algorithm_t) 0x09000000) + +/** Whether an algorithm is vendor-defined. + * + * See also #PSA_ALG_VENDOR_FLAG. + */ +#define PSA_ALG_IS_VENDOR_DEFINED(alg) \ + (((alg) & PSA_ALG_VENDOR_FLAG) != 0) + +/** Whether the specified algorithm is a hash algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a hash algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_HASH(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_HASH) + +/** Whether the specified algorithm is a MAC algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a MAC algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_MAC(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_MAC) + +/** Whether the specified algorithm is a symmetric cipher algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a symmetric cipher algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_CIPHER(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_CIPHER) + +/** Whether the specified algorithm is an authenticated encryption + * with associated data (AEAD) algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is an AEAD algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_AEAD(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_AEAD) + +/** Whether the specified algorithm is an asymmetric signature algorithm, + * also known as public-key signature algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is an asymmetric signature algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_SIGN(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_SIGN) + +/** Whether the specified algorithm is an asymmetric encryption algorithm, + * also known as public-key encryption algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is an asymmetric encryption algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_ASYMMETRIC_ENCRYPTION) + +/** Whether the specified algorithm is a key agreement algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a key agreement algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_KEY_AGREEMENT(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_KEY_AGREEMENT) + +/** Whether the specified algorithm is a key derivation algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a key derivation algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_KEY_DERIVATION(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_KEY_DERIVATION) + +/** An invalid algorithm identifier value. */ +/* *INDENT-OFF* (https://github.com/ARM-software/psa-arch-tests/issues/337) */ +#define PSA_ALG_NONE ((psa_algorithm_t)0) +/* *INDENT-ON* */ + +#define PSA_ALG_HASH_MASK ((psa_algorithm_t) 0x000000ff) +/** MD2 */ +#define PSA_ALG_MD2 ((psa_algorithm_t) 0x02000001) +/** MD4 */ +#define PSA_ALG_MD4 ((psa_algorithm_t) 0x02000002) +/** MD5 */ +#define PSA_ALG_MD5 ((psa_algorithm_t) 0x02000003) +/** PSA_ALG_RIPEMD160 */ +#define PSA_ALG_RIPEMD160 ((psa_algorithm_t) 0x02000004) +/** SHA1 */ +#define PSA_ALG_SHA_1 ((psa_algorithm_t) 0x02000005) +/** SHA2-224 */ +#define PSA_ALG_SHA_224 ((psa_algorithm_t) 0x02000008) +/** SHA2-256 */ +#define PSA_ALG_SHA_256 ((psa_algorithm_t) 0x02000009) +/** SHA2-384 */ +#define PSA_ALG_SHA_384 ((psa_algorithm_t) 0x0200000a) +/** SHA2-512 */ +#define PSA_ALG_SHA_512 ((psa_algorithm_t) 0x0200000b) +/** SHA2-512/224 */ +#define PSA_ALG_SHA_512_224 ((psa_algorithm_t) 0x0200000c) +/** SHA2-512/256 */ +#define PSA_ALG_SHA_512_256 ((psa_algorithm_t) 0x0200000d) +/** SHA3-224 */ +#define PSA_ALG_SHA3_224 ((psa_algorithm_t) 0x02000010) +/** SHA3-256 */ +#define PSA_ALG_SHA3_256 ((psa_algorithm_t) 0x02000011) +/** SHA3-384 */ +#define PSA_ALG_SHA3_384 ((psa_algorithm_t) 0x02000012) +/** SHA3-512 */ +#define PSA_ALG_SHA3_512 ((psa_algorithm_t) 0x02000013) +/** The first 512 bits (64 bytes) of the SHAKE256 output. + * + * This is the prehashing for Ed448ph (see #PSA_ALG_ED448PH). For other + * scenarios where a hash function based on SHA3/SHAKE is desired, SHA3-512 + * has the same output size and a (theoretically) higher security strength. + */ +#define PSA_ALG_SHAKE256_512 ((psa_algorithm_t) 0x02000015) + +/** In a hash-and-sign algorithm policy, allow any hash algorithm. + * + * This value may be used to form the algorithm usage field of a policy + * for a signature algorithm that is parametrized by a hash. The key + * may then be used to perform operations using the same signature + * algorithm parametrized with any supported hash. + * + * That is, suppose that `PSA_xxx_SIGNATURE` is one of the following macros: + * - #PSA_ALG_RSA_PKCS1V15_SIGN, #PSA_ALG_RSA_PSS, #PSA_ALG_RSA_PSS_ANY_SALT, + * - #PSA_ALG_ECDSA, #PSA_ALG_DETERMINISTIC_ECDSA. + * Then you may create and use a key as follows: + * - Set the key usage field using #PSA_ALG_ANY_HASH, for example: + * ``` + * psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH); // or VERIFY + * psa_set_key_algorithm(&attributes, PSA_xxx_SIGNATURE(PSA_ALG_ANY_HASH)); + * ``` + * - Import or generate key material. + * - Call psa_sign_hash() or psa_verify_hash(), passing + * an algorithm built from `PSA_xxx_SIGNATURE` and a specific hash. Each + * call to sign or verify a message may use a different hash. + * ``` + * psa_sign_hash(key, PSA_xxx_SIGNATURE(PSA_ALG_SHA_256), ...); + * psa_sign_hash(key, PSA_xxx_SIGNATURE(PSA_ALG_SHA_512), ...); + * psa_sign_hash(key, PSA_xxx_SIGNATURE(PSA_ALG_SHA3_256), ...); + * ``` + * + * This value may not be used to build other algorithms that are + * parametrized over a hash. For any valid use of this macro to build + * an algorithm \c alg, #PSA_ALG_IS_HASH_AND_SIGN(\c alg) is true. + * + * This value may not be used to build an algorithm specification to + * perform an operation. It is only valid to build policies. + */ +#define PSA_ALG_ANY_HASH ((psa_algorithm_t) 0x020000ff) + +#define PSA_ALG_MAC_SUBCATEGORY_MASK ((psa_algorithm_t) 0x00c00000) +#define PSA_ALG_HMAC_BASE ((psa_algorithm_t) 0x03800000) +/** Macro to build an HMAC algorithm. + * + * For example, #PSA_ALG_HMAC(#PSA_ALG_SHA_256) is HMAC-SHA-256. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * + * \return The corresponding HMAC algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_HMAC(hash_alg) \ + (PSA_ALG_HMAC_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) + +#define PSA_ALG_HMAC_GET_HASH(hmac_alg) \ + (PSA_ALG_CATEGORY_HASH | ((hmac_alg) & PSA_ALG_HASH_MASK)) + +/** Whether the specified algorithm is an HMAC algorithm. + * + * HMAC is a family of MAC algorithms that are based on a hash function. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is an HMAC algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_HMAC(alg) \ + (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_MAC_SUBCATEGORY_MASK)) == \ + PSA_ALG_HMAC_BASE) + +/* In the encoding of a MAC algorithm, the bits corresponding to + * PSA_ALG_MAC_TRUNCATION_MASK encode the length to which the MAC is + * truncated. As an exception, the value 0 means the untruncated algorithm, + * whatever its length is. The length is encoded in 6 bits, so it can + * reach up to 63; the largest MAC is 64 bytes so its trivial truncation + * to full length is correctly encoded as 0 and any non-trivial truncation + * is correctly encoded as a value between 1 and 63. */ +#define PSA_ALG_MAC_TRUNCATION_MASK ((psa_algorithm_t) 0x003f0000) +#define PSA_MAC_TRUNCATION_OFFSET 16 + +/* In the encoding of a MAC algorithm, the bit corresponding to + * #PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG encodes the fact that the algorithm + * is a wildcard algorithm. A key with such wildcard algorithm as permitted + * algorithm policy can be used with any algorithm corresponding to the + * same base class and having a (potentially truncated) MAC length greater or + * equal than the one encoded in #PSA_ALG_MAC_TRUNCATION_MASK. */ +#define PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG ((psa_algorithm_t) 0x00008000) + +/** Macro to build a truncated MAC algorithm. + * + * A truncated MAC algorithm is identical to the corresponding MAC + * algorithm except that the MAC value for the truncated algorithm + * consists of only the first \p mac_length bytes of the MAC value + * for the untruncated algorithm. + * + * \note This macro may allow constructing algorithm identifiers that + * are not valid, either because the specified length is larger + * than the untruncated MAC or because the specified length is + * smaller than permitted by the implementation. + * + * \note It is implementation-defined whether a truncated MAC that + * is truncated to the same length as the MAC of the untruncated + * algorithm is considered identical to the untruncated algorithm + * for policy comparison purposes. + * + * \param mac_alg A MAC algorithm identifier (value of type + * #psa_algorithm_t such that #PSA_ALG_IS_MAC(\p mac_alg) + * is true). This may be a truncated or untruncated + * MAC algorithm. + * \param mac_length Desired length of the truncated MAC in bytes. + * This must be at most the full length of the MAC + * and must be at least an implementation-specified + * minimum. The implementation-specified minimum + * shall not be zero. + * + * \return The corresponding MAC algorithm with the specified + * length. + * \return Unspecified if \p mac_alg is not a supported + * MAC algorithm or if \p mac_length is too small or + * too large for the specified MAC algorithm. + */ +#define PSA_ALG_TRUNCATED_MAC(mac_alg, mac_length) \ + (((mac_alg) & ~(PSA_ALG_MAC_TRUNCATION_MASK | \ + PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG)) | \ + ((mac_length) << PSA_MAC_TRUNCATION_OFFSET & PSA_ALG_MAC_TRUNCATION_MASK)) + +/** Macro to build the base MAC algorithm corresponding to a truncated + * MAC algorithm. + * + * \param mac_alg A MAC algorithm identifier (value of type + * #psa_algorithm_t such that #PSA_ALG_IS_MAC(\p mac_alg) + * is true). This may be a truncated or untruncated + * MAC algorithm. + * + * \return The corresponding base MAC algorithm. + * \return Unspecified if \p mac_alg is not a supported + * MAC algorithm. + */ +#define PSA_ALG_FULL_LENGTH_MAC(mac_alg) \ + ((mac_alg) & ~(PSA_ALG_MAC_TRUNCATION_MASK | \ + PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG)) + +/** Length to which a MAC algorithm is truncated. + * + * \param mac_alg A MAC algorithm identifier (value of type + * #psa_algorithm_t such that #PSA_ALG_IS_MAC(\p mac_alg) + * is true). + * + * \return Length of the truncated MAC in bytes. + * \return 0 if \p mac_alg is a non-truncated MAC algorithm. + * \return Unspecified if \p mac_alg is not a supported + * MAC algorithm. + */ +#define PSA_MAC_TRUNCATED_LENGTH(mac_alg) \ + (((mac_alg) & PSA_ALG_MAC_TRUNCATION_MASK) >> PSA_MAC_TRUNCATION_OFFSET) + +/** Macro to build a MAC minimum-MAC-length wildcard algorithm. + * + * A minimum-MAC-length MAC wildcard algorithm permits all MAC algorithms + * sharing the same base algorithm, and where the (potentially truncated) MAC + * length of the specific algorithm is equal to or larger then the wildcard + * algorithm's minimum MAC length. + * + * \note When setting the minimum required MAC length to less than the + * smallest MAC length allowed by the base algorithm, this effectively + * becomes an 'any-MAC-length-allowed' policy for that base algorithm. + * + * \param mac_alg A MAC algorithm identifier (value of type + * #psa_algorithm_t such that #PSA_ALG_IS_MAC(\p mac_alg) + * is true). + * \param min_mac_length Desired minimum length of the message authentication + * code in bytes. This must be at most the untruncated + * length of the MAC and must be at least 1. + * + * \return The corresponding MAC wildcard algorithm with the + * specified minimum length. + * \return Unspecified if \p mac_alg is not a supported MAC + * algorithm or if \p min_mac_length is less than 1 or + * too large for the specified MAC algorithm. + */ +#define PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(mac_alg, min_mac_length) \ + (PSA_ALG_TRUNCATED_MAC(mac_alg, min_mac_length) | \ + PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) + +#define PSA_ALG_CIPHER_MAC_BASE ((psa_algorithm_t) 0x03c00000) +/** The CBC-MAC construction over a block cipher + * + * \warning CBC-MAC is insecure in many cases. + * A more secure mode, such as #PSA_ALG_CMAC, is recommended. + */ +#define PSA_ALG_CBC_MAC ((psa_algorithm_t) 0x03c00100) +/** The CMAC construction over a block cipher */ +#define PSA_ALG_CMAC ((psa_algorithm_t) 0x03c00200) + +/** Whether the specified algorithm is a MAC algorithm based on a block cipher. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a MAC algorithm based on a block cipher, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_BLOCK_CIPHER_MAC(alg) \ + (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_MAC_SUBCATEGORY_MASK)) == \ + PSA_ALG_CIPHER_MAC_BASE) + +#define PSA_ALG_CIPHER_STREAM_FLAG ((psa_algorithm_t) 0x00800000) +#define PSA_ALG_CIPHER_FROM_BLOCK_FLAG ((psa_algorithm_t) 0x00400000) + +/** Whether the specified algorithm is a stream cipher. + * + * A stream cipher is a symmetric cipher that encrypts or decrypts messages + * by applying a bitwise-xor with a stream of bytes that is generated + * from a key. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a stream cipher algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier or if it is not a symmetric cipher algorithm. + */ +#define PSA_ALG_IS_STREAM_CIPHER(alg) \ + (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_CIPHER_STREAM_FLAG)) == \ + (PSA_ALG_CATEGORY_CIPHER | PSA_ALG_CIPHER_STREAM_FLAG)) + +/** The stream cipher mode of a stream cipher algorithm. + * + * The underlying stream cipher is determined by the key type. + * - To use ChaCha20, use a key type of #PSA_KEY_TYPE_CHACHA20. + * - To use ARC4, use a key type of #PSA_KEY_TYPE_ARC4. + */ +#define PSA_ALG_STREAM_CIPHER ((psa_algorithm_t) 0x04800100) + +/** The CTR stream cipher mode. + * + * CTR is a stream cipher which is built from a block cipher. + * The underlying block cipher is determined by the key type. + * For example, to use AES-128-CTR, use this algorithm with + * a key of type #PSA_KEY_TYPE_AES and a length of 128 bits (16 bytes). + */ +#define PSA_ALG_CTR ((psa_algorithm_t) 0x04c01000) + +/** The CFB stream cipher mode. + * + * The underlying block cipher is determined by the key type. + */ +#define PSA_ALG_CFB ((psa_algorithm_t) 0x04c01100) + +/** The OFB stream cipher mode. + * + * The underlying block cipher is determined by the key type. + */ +#define PSA_ALG_OFB ((psa_algorithm_t) 0x04c01200) + +/** The XTS cipher mode. + * + * XTS is a cipher mode which is built from a block cipher. It requires at + * least one full block of input, but beyond this minimum the input + * does not need to be a whole number of blocks. + */ +#define PSA_ALG_XTS ((psa_algorithm_t) 0x0440ff00) + +/** The Electronic Code Book (ECB) mode of a block cipher, with no padding. + * + * \warning ECB mode does not protect the confidentiality of the encrypted data + * except in extremely narrow circumstances. It is recommended that applications + * only use ECB if they need to construct an operating mode that the + * implementation does not provide. Implementations are encouraged to provide + * the modes that applications need in preference to supporting direct access + * to ECB. + * + * The underlying block cipher is determined by the key type. + * + * This symmetric cipher mode can only be used with messages whose lengths are a + * multiple of the block size of the chosen block cipher. + * + * ECB mode does not accept an initialization vector (IV). When using a + * multi-part cipher operation with this algorithm, psa_cipher_generate_iv() + * and psa_cipher_set_iv() must not be called. + */ +#define PSA_ALG_ECB_NO_PADDING ((psa_algorithm_t) 0x04404400) + +/** The CBC block cipher chaining mode, with no padding. + * + * The underlying block cipher is determined by the key type. + * + * This symmetric cipher mode can only be used with messages whose lengths + * are whole number of blocks for the chosen block cipher. + */ +#define PSA_ALG_CBC_NO_PADDING ((psa_algorithm_t) 0x04404000) + +/** The CBC block cipher chaining mode with PKCS#7 padding. + * + * The underlying block cipher is determined by the key type. + * + * This is the padding method defined by PKCS#7 (RFC 2315) §10.3. + */ +#define PSA_ALG_CBC_PKCS7 ((psa_algorithm_t) 0x04404100) + +#define PSA_ALG_AEAD_FROM_BLOCK_FLAG ((psa_algorithm_t) 0x00400000) + +/** Whether the specified algorithm is an AEAD mode on a block cipher. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is an AEAD algorithm which is an AEAD mode based on + * a block cipher, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) \ + (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_AEAD_FROM_BLOCK_FLAG)) == \ + (PSA_ALG_CATEGORY_AEAD | PSA_ALG_AEAD_FROM_BLOCK_FLAG)) + +/** The CCM authenticated encryption algorithm. + * + * The underlying block cipher is determined by the key type. + */ +#define PSA_ALG_CCM ((psa_algorithm_t) 0x05500100) + +/** The GCM authenticated encryption algorithm. + * + * The underlying block cipher is determined by the key type. + */ +#define PSA_ALG_GCM ((psa_algorithm_t) 0x05500200) + +/** The Chacha20-Poly1305 AEAD algorithm. + * + * The ChaCha20_Poly1305 construction is defined in RFC 7539. + * + * Implementations must support 12-byte nonces, may support 8-byte nonces, + * and should reject other sizes. + * + * Implementations must support 16-byte tags and should reject other sizes. + */ +#define PSA_ALG_CHACHA20_POLY1305 ((psa_algorithm_t) 0x05100500) + +/* In the encoding of an AEAD algorithm, the bits corresponding to + * PSA_ALG_AEAD_TAG_LENGTH_MASK encode the length of the AEAD tag. + * The constants for default lengths follow this encoding. + */ +#define PSA_ALG_AEAD_TAG_LENGTH_MASK ((psa_algorithm_t) 0x003f0000) +#define PSA_AEAD_TAG_LENGTH_OFFSET 16 + +/* In the encoding of an AEAD algorithm, the bit corresponding to + * #PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG encodes the fact that the algorithm + * is a wildcard algorithm. A key with such wildcard algorithm as permitted + * algorithm policy can be used with any algorithm corresponding to the + * same base class and having a tag length greater than or equal to the one + * encoded in #PSA_ALG_AEAD_TAG_LENGTH_MASK. */ +#define PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG ((psa_algorithm_t) 0x00008000) + +/** Macro to build a shortened AEAD algorithm. + * + * A shortened AEAD algorithm is similar to the corresponding AEAD + * algorithm, but has an authentication tag that consists of fewer bytes. + * Depending on the algorithm, the tag length may affect the calculation + * of the ciphertext. + * + * \param aead_alg An AEAD algorithm identifier (value of type + * #psa_algorithm_t such that #PSA_ALG_IS_AEAD(\p aead_alg) + * is true). + * \param tag_length Desired length of the authentication tag in bytes. + * + * \return The corresponding AEAD algorithm with the specified + * length. + * \return Unspecified if \p aead_alg is not a supported + * AEAD algorithm or if \p tag_length is not valid + * for the specified AEAD algorithm. + */ +#define PSA_ALG_AEAD_WITH_SHORTENED_TAG(aead_alg, tag_length) \ + (((aead_alg) & ~(PSA_ALG_AEAD_TAG_LENGTH_MASK | \ + PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG)) | \ + ((tag_length) << PSA_AEAD_TAG_LENGTH_OFFSET & \ + PSA_ALG_AEAD_TAG_LENGTH_MASK)) + +/** Retrieve the tag length of a specified AEAD algorithm + * + * \param aead_alg An AEAD algorithm identifier (value of type + * #psa_algorithm_t such that #PSA_ALG_IS_AEAD(\p aead_alg) + * is true). + * + * \return The tag length specified by the input algorithm. + * \return Unspecified if \p aead_alg is not a supported + * AEAD algorithm. + */ +#define PSA_ALG_AEAD_GET_TAG_LENGTH(aead_alg) \ + (((aead_alg) & PSA_ALG_AEAD_TAG_LENGTH_MASK) >> \ + PSA_AEAD_TAG_LENGTH_OFFSET) + +/** Calculate the corresponding AEAD algorithm with the default tag length. + * + * \param aead_alg An AEAD algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p aead_alg) is true). + * + * \return The corresponding AEAD algorithm with the default + * tag length for that algorithm. + */ +#define PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG(aead_alg) \ + ( \ + PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG_CASE(aead_alg, PSA_ALG_CCM) \ + PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG_CASE(aead_alg, PSA_ALG_GCM) \ + PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG_CASE(aead_alg, PSA_ALG_CHACHA20_POLY1305) \ + 0) +#define PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG_CASE(aead_alg, ref) \ + PSA_ALG_AEAD_WITH_SHORTENED_TAG(aead_alg, 0) == \ + PSA_ALG_AEAD_WITH_SHORTENED_TAG(ref, 0) ? \ + ref : + +/** Macro to build an AEAD minimum-tag-length wildcard algorithm. + * + * A minimum-tag-length AEAD wildcard algorithm permits all AEAD algorithms + * sharing the same base algorithm, and where the tag length of the specific + * algorithm is equal to or larger then the minimum tag length specified by the + * wildcard algorithm. + * + * \note When setting the minimum required tag length to less than the + * smallest tag length allowed by the base algorithm, this effectively + * becomes an 'any-tag-length-allowed' policy for that base algorithm. + * + * \param aead_alg An AEAD algorithm identifier (value of type + * #psa_algorithm_t such that + * #PSA_ALG_IS_AEAD(\p aead_alg) is true). + * \param min_tag_length Desired minimum length of the authentication tag in + * bytes. This must be at least 1 and at most the largest + * allowed tag length of the algorithm. + * + * \return The corresponding AEAD wildcard algorithm with the + * specified minimum length. + * \return Unspecified if \p aead_alg is not a supported + * AEAD algorithm or if \p min_tag_length is less than 1 + * or too large for the specified AEAD algorithm. + */ +#define PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(aead_alg, min_tag_length) \ + (PSA_ALG_AEAD_WITH_SHORTENED_TAG(aead_alg, min_tag_length) | \ + PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) + +#define PSA_ALG_RSA_PKCS1V15_SIGN_BASE ((psa_algorithm_t) 0x06000200) +/** RSA PKCS#1 v1.5 signature with hashing. + * + * This is the signature scheme defined by RFC 8017 + * (PKCS#1: RSA Cryptography Specifications) under the name + * RSASSA-PKCS1-v1_5. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * This includes #PSA_ALG_ANY_HASH + * when specifying the algorithm in a usage policy. + * + * \return The corresponding RSA PKCS#1 v1.5 signature algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_RSA_PKCS1V15_SIGN(hash_alg) \ + (PSA_ALG_RSA_PKCS1V15_SIGN_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) +/** Raw PKCS#1 v1.5 signature. + * + * The input to this algorithm is the DigestInfo structure used by + * RFC 8017 (PKCS#1: RSA Cryptography Specifications), §9.2 + * steps 3–6. + */ +#define PSA_ALG_RSA_PKCS1V15_SIGN_RAW PSA_ALG_RSA_PKCS1V15_SIGN_BASE +#define PSA_ALG_IS_RSA_PKCS1V15_SIGN(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_RSA_PKCS1V15_SIGN_BASE) + +#define PSA_ALG_RSA_PSS_BASE ((psa_algorithm_t) 0x06000300) +#define PSA_ALG_RSA_PSS_ANY_SALT_BASE ((psa_algorithm_t) 0x06001300) +/** RSA PSS signature with hashing. + * + * This is the signature scheme defined by RFC 8017 + * (PKCS#1: RSA Cryptography Specifications) under the name + * RSASSA-PSS, with the message generation function MGF1, and with + * a salt length equal to the length of the hash, or the largest + * possible salt length for the algorithm and key size if that is + * smaller than the hash length. The specified hash algorithm is + * used to hash the input message, to create the salted hash, and + * for the mask generation. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * This includes #PSA_ALG_ANY_HASH + * when specifying the algorithm in a usage policy. + * + * \return The corresponding RSA PSS signature algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_RSA_PSS(hash_alg) \ + (PSA_ALG_RSA_PSS_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) + +/** RSA PSS signature with hashing with relaxed verification. + * + * This algorithm has the same behavior as #PSA_ALG_RSA_PSS when signing, + * but allows an arbitrary salt length (including \c 0) when verifying a + * signature. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * This includes #PSA_ALG_ANY_HASH + * when specifying the algorithm in a usage policy. + * + * \return The corresponding RSA PSS signature algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_RSA_PSS_ANY_SALT(hash_alg) \ + (PSA_ALG_RSA_PSS_ANY_SALT_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) + +/** Whether the specified algorithm is RSA PSS with standard salt. + * + * \param alg An algorithm value or an algorithm policy wildcard. + * + * \return 1 if \p alg is of the form + * #PSA_ALG_RSA_PSS(\c hash_alg), + * where \c hash_alg is a hash algorithm or + * #PSA_ALG_ANY_HASH. 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not + * a supported algorithm identifier or policy. + */ +#define PSA_ALG_IS_RSA_PSS_STANDARD_SALT(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_RSA_PSS_BASE) + +/** Whether the specified algorithm is RSA PSS with any salt. + * + * \param alg An algorithm value or an algorithm policy wildcard. + * + * \return 1 if \p alg is of the form + * #PSA_ALG_RSA_PSS_ANY_SALT_BASE(\c hash_alg), + * where \c hash_alg is a hash algorithm or + * #PSA_ALG_ANY_HASH. 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not + * a supported algorithm identifier or policy. + */ +#define PSA_ALG_IS_RSA_PSS_ANY_SALT(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_RSA_PSS_ANY_SALT_BASE) + +/** Whether the specified algorithm is RSA PSS. + * + * This includes any of the RSA PSS algorithm variants, regardless of the + * constraints on salt length. + * + * \param alg An algorithm value or an algorithm policy wildcard. + * + * \return 1 if \p alg is of the form + * #PSA_ALG_RSA_PSS(\c hash_alg) or + * #PSA_ALG_RSA_PSS_ANY_SALT_BASE(\c hash_alg), + * where \c hash_alg is a hash algorithm or + * #PSA_ALG_ANY_HASH. 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not + * a supported algorithm identifier or policy. + */ +#define PSA_ALG_IS_RSA_PSS(alg) \ + (PSA_ALG_IS_RSA_PSS_STANDARD_SALT(alg) || \ + PSA_ALG_IS_RSA_PSS_ANY_SALT(alg)) + +#define PSA_ALG_ECDSA_BASE ((psa_algorithm_t) 0x06000600) +/** ECDSA signature with hashing. + * + * This is the ECDSA signature scheme defined by ANSI X9.62, + * with a random per-message secret number (*k*). + * + * The representation of the signature as a byte string consists of + * the concatenation of the signature values *r* and *s*. Each of + * *r* and *s* is encoded as an *N*-octet string, where *N* is the length + * of the base point of the curve in octets. Each value is represented + * in big-endian order (most significant octet first). + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * This includes #PSA_ALG_ANY_HASH + * when specifying the algorithm in a usage policy. + * + * \return The corresponding ECDSA signature algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_ECDSA(hash_alg) \ + (PSA_ALG_ECDSA_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) +/** ECDSA signature without hashing. + * + * This is the same signature scheme as #PSA_ALG_ECDSA(), but + * without specifying a hash algorithm. This algorithm may only be + * used to sign or verify a sequence of bytes that should be an + * already-calculated hash. Note that the input is padded with + * zeros on the left or truncated on the left as required to fit + * the curve size. + */ +#define PSA_ALG_ECDSA_ANY PSA_ALG_ECDSA_BASE +#define PSA_ALG_DETERMINISTIC_ECDSA_BASE ((psa_algorithm_t) 0x06000700) +/** Deterministic ECDSA signature with hashing. + * + * This is the deterministic ECDSA signature scheme defined by RFC 6979. + * + * The representation of a signature is the same as with #PSA_ALG_ECDSA(). + * + * Note that when this algorithm is used for verification, signatures + * made with randomized ECDSA (#PSA_ALG_ECDSA(\p hash_alg)) with the + * same private key are accepted. In other words, + * #PSA_ALG_DETERMINISTIC_ECDSA(\p hash_alg) differs from + * #PSA_ALG_ECDSA(\p hash_alg) only for signature, not for verification. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * This includes #PSA_ALG_ANY_HASH + * when specifying the algorithm in a usage policy. + * + * \return The corresponding deterministic ECDSA signature + * algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_DETERMINISTIC_ECDSA(hash_alg) \ + (PSA_ALG_DETERMINISTIC_ECDSA_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) +#define PSA_ALG_ECDSA_DETERMINISTIC_FLAG ((psa_algorithm_t) 0x00000100) +#define PSA_ALG_IS_ECDSA(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK & ~PSA_ALG_ECDSA_DETERMINISTIC_FLAG) == \ + PSA_ALG_ECDSA_BASE) +#define PSA_ALG_ECDSA_IS_DETERMINISTIC(alg) \ + (((alg) & PSA_ALG_ECDSA_DETERMINISTIC_FLAG) != 0) +#define PSA_ALG_IS_DETERMINISTIC_ECDSA(alg) \ + (PSA_ALG_IS_ECDSA(alg) && PSA_ALG_ECDSA_IS_DETERMINISTIC(alg)) +#define PSA_ALG_IS_RANDOMIZED_ECDSA(alg) \ + (PSA_ALG_IS_ECDSA(alg) && !PSA_ALG_ECDSA_IS_DETERMINISTIC(alg)) + +/** Edwards-curve digital signature algorithm without prehashing (PureEdDSA), + * using standard parameters. + * + * Contexts are not supported in the current version of this specification + * because there is no suitable signature interface that can take the + * context as a parameter. A future version of this specification may add + * suitable functions and extend this algorithm to support contexts. + * + * PureEdDSA requires an elliptic curve key on a twisted Edwards curve. + * In this specification, the following curves are supported: + * - #PSA_ECC_FAMILY_TWISTED_EDWARDS, 255-bit: Ed25519 as specified + * in RFC 8032. + * The curve is Edwards25519. + * The hash function used internally is SHA-512. + * - #PSA_ECC_FAMILY_TWISTED_EDWARDS, 448-bit: Ed448 as specified + * in RFC 8032. + * The curve is Edwards448. + * The hash function used internally is the first 114 bytes of the + * SHAKE256 output. + * + * This algorithm can be used with psa_sign_message() and + * psa_verify_message(). Since there is no prehashing, it cannot be used + * with psa_sign_hash() or psa_verify_hash(). + * + * The signature format is the concatenation of R and S as defined by + * RFC 8032 §5.1.6 and §5.2.6 (a 64-byte string for Ed25519, a 114-byte + * string for Ed448). + */ +#define PSA_ALG_PURE_EDDSA ((psa_algorithm_t) 0x06000800) + +#define PSA_ALG_HASH_EDDSA_BASE ((psa_algorithm_t) 0x06000900) +#define PSA_ALG_IS_HASH_EDDSA(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_HASH_EDDSA_BASE) + +/** Edwards-curve digital signature algorithm with prehashing (HashEdDSA), + * using SHA-512 and the Edwards25519 curve. + * + * See #PSA_ALG_PURE_EDDSA regarding context support and the signature format. + * + * This algorithm is Ed25519 as specified in RFC 8032. + * The curve is Edwards25519. + * The prehash is SHA-512. + * The hash function used internally is SHA-512. + * + * This is a hash-and-sign algorithm: to calculate a signature, + * you can either: + * - call psa_sign_message() on the message; + * - or calculate the SHA-512 hash of the message + * with psa_hash_compute() + * or with a multi-part hash operation started with psa_hash_setup(), + * using the hash algorithm #PSA_ALG_SHA_512, + * then sign the calculated hash with psa_sign_hash(). + * Verifying a signature is similar, using psa_verify_message() or + * psa_verify_hash() instead of the signature function. + */ +#define PSA_ALG_ED25519PH \ + (PSA_ALG_HASH_EDDSA_BASE | (PSA_ALG_SHA_512 & PSA_ALG_HASH_MASK)) + +/** Edwards-curve digital signature algorithm with prehashing (HashEdDSA), + * using SHAKE256 and the Edwards448 curve. + * + * See #PSA_ALG_PURE_EDDSA regarding context support and the signature format. + * + * This algorithm is Ed448 as specified in RFC 8032. + * The curve is Edwards448. + * The prehash is the first 64 bytes of the SHAKE256 output. + * The hash function used internally is the first 114 bytes of the + * SHAKE256 output. + * + * This is a hash-and-sign algorithm: to calculate a signature, + * you can either: + * - call psa_sign_message() on the message; + * - or calculate the first 64 bytes of the SHAKE256 output of the message + * with psa_hash_compute() + * or with a multi-part hash operation started with psa_hash_setup(), + * using the hash algorithm #PSA_ALG_SHAKE256_512, + * then sign the calculated hash with psa_sign_hash(). + * Verifying a signature is similar, using psa_verify_message() or + * psa_verify_hash() instead of the signature function. + */ +#define PSA_ALG_ED448PH \ + (PSA_ALG_HASH_EDDSA_BASE | (PSA_ALG_SHAKE256_512 & PSA_ALG_HASH_MASK)) + +/* Default definition, to be overridden if the library is extended with + * more hash-and-sign algorithms that we want to keep out of this header + * file. */ +#define PSA_ALG_IS_VENDOR_HASH_AND_SIGN(alg) 0 + +/** Whether the specified algorithm is a signature algorithm that can be used + * with psa_sign_hash() and psa_verify_hash(). + * + * This encompasses all strict hash-and-sign algorithms categorized by + * PSA_ALG_IS_HASH_AND_SIGN(), as well as algorithms that follow the + * paradigm more loosely: + * - #PSA_ALG_RSA_PKCS1V15_SIGN_RAW (expects its input to be an encoded hash) + * - #PSA_ALG_ECDSA_ANY (doesn't specify what kind of hash the input is) + * + * \param alg An algorithm identifier (value of type psa_algorithm_t). + * + * \return 1 if alg is a signature algorithm that can be used to sign a + * hash. 0 if alg is a signature algorithm that can only be used + * to sign a message. 0 if alg is not a signature algorithm. + * This macro can return either 0 or 1 if alg is not a + * supported algorithm identifier. + */ +#define PSA_ALG_IS_SIGN_HASH(alg) \ + (PSA_ALG_IS_RSA_PSS(alg) || PSA_ALG_IS_RSA_PKCS1V15_SIGN(alg) || \ + PSA_ALG_IS_ECDSA(alg) || PSA_ALG_IS_HASH_EDDSA(alg) || \ + PSA_ALG_IS_VENDOR_HASH_AND_SIGN(alg)) + +/** Whether the specified algorithm is a signature algorithm that can be used + * with psa_sign_message() and psa_verify_message(). + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if alg is a signature algorithm that can be used to sign a + * message. 0 if \p alg is a signature algorithm that can only be used + * to sign an already-calculated hash. 0 if \p alg is not a signature + * algorithm. This macro can return either 0 or 1 if \p alg is not a + * supported algorithm identifier. + */ +#define PSA_ALG_IS_SIGN_MESSAGE(alg) \ + (PSA_ALG_IS_SIGN_HASH(alg) || (alg) == PSA_ALG_PURE_EDDSA) + +/** Whether the specified algorithm is a hash-and-sign algorithm. + * + * Hash-and-sign algorithms are asymmetric (public-key) signature algorithms + * structured in two parts: first the calculation of a hash in a way that + * does not depend on the key, then the calculation of a signature from the + * hash value and the key. Hash-and-sign algorithms encode the hash + * used for the hashing step, and you can call #PSA_ALG_SIGN_GET_HASH + * to extract this algorithm. + * + * Thus, for a hash-and-sign algorithm, + * `psa_sign_message(key, alg, input, ...)` is equivalent to + * ``` + * psa_hash_compute(PSA_ALG_SIGN_GET_HASH(alg), input, ..., hash, ...); + * psa_sign_hash(key, alg, hash, ..., signature, ...); + * ``` + * Most usefully, separating the hash from the signature allows the hash + * to be calculated in multiple steps with psa_hash_setup(), psa_hash_update() + * and psa_hash_finish(). Likewise psa_verify_message() is equivalent to + * calculating the hash and then calling psa_verify_hash(). + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a hash-and-sign algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_HASH_AND_SIGN(alg) \ + (PSA_ALG_IS_SIGN_HASH(alg) && \ + ((alg) & PSA_ALG_HASH_MASK) != 0) + +/** Get the hash used by a hash-and-sign signature algorithm. + * + * A hash-and-sign algorithm is a signature algorithm which is + * composed of two phases: first a hashing phase which does not use + * the key and produces a hash of the input message, then a signing + * phase which only uses the hash and the key and not the message + * itself. + * + * \param alg A signature algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_SIGN(\p alg) is true). + * + * \return The underlying hash algorithm if \p alg is a hash-and-sign + * algorithm. + * \return 0 if \p alg is a signature algorithm that does not + * follow the hash-and-sign structure. + * \return Unspecified if \p alg is not a signature algorithm or + * if it is not supported by the implementation. + */ +#define PSA_ALG_SIGN_GET_HASH(alg) \ + (PSA_ALG_IS_HASH_AND_SIGN(alg) ? \ + ((alg) & PSA_ALG_HASH_MASK) | PSA_ALG_CATEGORY_HASH : \ + 0) + +/** RSA PKCS#1 v1.5 encryption. + * + * \warning Calling psa_asymmetric_decrypt() with this algorithm as a + * parameter is considered an inherently dangerous function + * (CWE-242). Unless it is used in a side channel free and safe + * way (eg. implementing the TLS protocol as per 7.4.7.1 of + * RFC 5246), the calling code is vulnerable. + * + */ +#define PSA_ALG_RSA_PKCS1V15_CRYPT ((psa_algorithm_t) 0x07000200) + +#define PSA_ALG_RSA_OAEP_BASE ((psa_algorithm_t) 0x07000300) +/** RSA OAEP encryption. + * + * This is the encryption scheme defined by RFC 8017 + * (PKCS#1: RSA Cryptography Specifications) under the name + * RSAES-OAEP, with the message generation function MGF1. + * + * \param hash_alg The hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true) to use + * for MGF1. + * + * \return The corresponding RSA OAEP encryption algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_RSA_OAEP(hash_alg) \ + (PSA_ALG_RSA_OAEP_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) +#define PSA_ALG_IS_RSA_OAEP(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_RSA_OAEP_BASE) +#define PSA_ALG_RSA_OAEP_GET_HASH(alg) \ + (PSA_ALG_IS_RSA_OAEP(alg) ? \ + ((alg) & PSA_ALG_HASH_MASK) | PSA_ALG_CATEGORY_HASH : \ + 0) + +#define PSA_ALG_HKDF_BASE ((psa_algorithm_t) 0x08000100) +/** Macro to build an HKDF algorithm. + * + * For example, `PSA_ALG_HKDF(PSA_ALG_SHA_256)` is HKDF using HMAC-SHA-256. + * + * This key derivation algorithm uses the following inputs: + * - #PSA_KEY_DERIVATION_INPUT_SALT is the salt used in the "extract" step. + * It is optional; if omitted, the derivation uses an empty salt. + * - #PSA_KEY_DERIVATION_INPUT_SECRET is the secret key used in the "extract" step. + * - #PSA_KEY_DERIVATION_INPUT_INFO is the info string used in the "expand" step. + * You must pass #PSA_KEY_DERIVATION_INPUT_SALT before #PSA_KEY_DERIVATION_INPUT_SECRET. + * You may pass #PSA_KEY_DERIVATION_INPUT_INFO at any time after steup and before + * starting to generate output. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * + * \return The corresponding HKDF algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_HKDF(hash_alg) \ + (PSA_ALG_HKDF_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) +/** Whether the specified algorithm is an HKDF algorithm. + * + * HKDF is a family of key derivation algorithms that are based on a hash + * function and the HMAC construction. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \c alg is an HKDF algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \c alg is not a supported + * key derivation algorithm identifier. + */ +#define PSA_ALG_IS_HKDF(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_HKDF_BASE) +#define PSA_ALG_HKDF_GET_HASH(hkdf_alg) \ + (PSA_ALG_CATEGORY_HASH | ((hkdf_alg) & PSA_ALG_HASH_MASK)) + +#define PSA_ALG_TLS12_PRF_BASE ((psa_algorithm_t) 0x08000200) +/** Macro to build a TLS-1.2 PRF algorithm. + * + * TLS 1.2 uses a custom pseudorandom function (PRF) for key schedule, + * specified in Section 5 of RFC 5246. It is based on HMAC and can be + * used with either SHA-256 or SHA-384. + * + * This key derivation algorithm uses the following inputs, which must be + * passed in the order given here: + * - #PSA_KEY_DERIVATION_INPUT_SEED is the seed. + * - #PSA_KEY_DERIVATION_INPUT_SECRET is the secret key. + * - #PSA_KEY_DERIVATION_INPUT_LABEL is the label. + * + * For the application to TLS-1.2 key expansion, the seed is the + * concatenation of ServerHello.Random + ClientHello.Random, + * and the label is "key expansion". + * + * For example, `PSA_ALG_TLS12_PRF(PSA_ALG_SHA_256)` represents the + * TLS 1.2 PRF using HMAC-SHA-256. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * + * \return The corresponding TLS-1.2 PRF algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_TLS12_PRF(hash_alg) \ + (PSA_ALG_TLS12_PRF_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) + +/** Whether the specified algorithm is a TLS-1.2 PRF algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \c alg is a TLS-1.2 PRF algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \c alg is not a supported + * key derivation algorithm identifier. + */ +#define PSA_ALG_IS_TLS12_PRF(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_TLS12_PRF_BASE) +#define PSA_ALG_TLS12_PRF_GET_HASH(hkdf_alg) \ + (PSA_ALG_CATEGORY_HASH | ((hkdf_alg) & PSA_ALG_HASH_MASK)) + +#define PSA_ALG_TLS12_PSK_TO_MS_BASE ((psa_algorithm_t) 0x08000300) +/** Macro to build a TLS-1.2 PSK-to-MasterSecret algorithm. + * + * In a pure-PSK handshake in TLS 1.2, the master secret is derived + * from the PreSharedKey (PSK) through the application of padding + * (RFC 4279, Section 2) and the TLS-1.2 PRF (RFC 5246, Section 5). + * The latter is based on HMAC and can be used with either SHA-256 + * or SHA-384. + * + * This key derivation algorithm uses the following inputs, which must be + * passed in the order given here: + * - #PSA_KEY_DERIVATION_INPUT_SEED is the seed. + * - #PSA_KEY_DERIVATION_INPUT_SECRET is the secret key. + * - #PSA_KEY_DERIVATION_INPUT_LABEL is the label. + * + * For the application to TLS-1.2, the seed (which is + * forwarded to the TLS-1.2 PRF) is the concatenation of the + * ClientHello.Random + ServerHello.Random, + * and the label is "master secret" or "extended master secret". + * + * For example, `PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_256)` represents the + * TLS-1.2 PSK to MasterSecret derivation PRF using HMAC-SHA-256. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * + * \return The corresponding TLS-1.2 PSK to MS algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_TLS12_PSK_TO_MS(hash_alg) \ + (PSA_ALG_TLS12_PSK_TO_MS_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) + +/** Whether the specified algorithm is a TLS-1.2 PSK to MS algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \c alg is a TLS-1.2 PSK to MS algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \c alg is not a supported + * key derivation algorithm identifier. + */ +#define PSA_ALG_IS_TLS12_PSK_TO_MS(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_TLS12_PSK_TO_MS_BASE) +#define PSA_ALG_TLS12_PSK_TO_MS_GET_HASH(hkdf_alg) \ + (PSA_ALG_CATEGORY_HASH | ((hkdf_alg) & PSA_ALG_HASH_MASK)) + +#define PSA_ALG_KEY_DERIVATION_MASK ((psa_algorithm_t) 0xfe00ffff) +#define PSA_ALG_KEY_AGREEMENT_MASK ((psa_algorithm_t) 0xffff0000) + +/** Macro to build a combined algorithm that chains a key agreement with + * a key derivation. + * + * \param ka_alg A key agreement algorithm (\c PSA_ALG_XXX value such + * that #PSA_ALG_IS_KEY_AGREEMENT(\p ka_alg) is true). + * \param kdf_alg A key derivation algorithm (\c PSA_ALG_XXX value such + * that #PSA_ALG_IS_KEY_DERIVATION(\p kdf_alg) is true). + * + * \return The corresponding key agreement and derivation + * algorithm. + * \return Unspecified if \p ka_alg is not a supported + * key agreement algorithm or \p kdf_alg is not a + * supported key derivation algorithm. + */ +#define PSA_ALG_KEY_AGREEMENT(ka_alg, kdf_alg) \ + ((ka_alg) | (kdf_alg)) + +#define PSA_ALG_KEY_AGREEMENT_GET_KDF(alg) \ + (((alg) & PSA_ALG_KEY_DERIVATION_MASK) | PSA_ALG_CATEGORY_KEY_DERIVATION) + +#define PSA_ALG_KEY_AGREEMENT_GET_BASE(alg) \ + (((alg) & PSA_ALG_KEY_AGREEMENT_MASK) | PSA_ALG_CATEGORY_KEY_AGREEMENT) + +/** Whether the specified algorithm is a raw key agreement algorithm. + * + * A raw key agreement algorithm is one that does not specify + * a key derivation function. + * Usually, raw key agreement algorithms are constructed directly with + * a \c PSA_ALG_xxx macro while non-raw key agreement algorithms are + * constructed with #PSA_ALG_KEY_AGREEMENT(). + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a raw key agreement algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_RAW_KEY_AGREEMENT(alg) \ + (PSA_ALG_IS_KEY_AGREEMENT(alg) && \ + PSA_ALG_KEY_AGREEMENT_GET_KDF(alg) == PSA_ALG_CATEGORY_KEY_DERIVATION) + +#define PSA_ALG_IS_KEY_DERIVATION_OR_AGREEMENT(alg) \ + ((PSA_ALG_IS_KEY_DERIVATION(alg) || PSA_ALG_IS_KEY_AGREEMENT(alg))) + +/** The finite-field Diffie-Hellman (DH) key agreement algorithm. + * + * The shared secret produced by key agreement is + * `g^{ab}` in big-endian format. + * It is `ceiling(m / 8)` bytes long where `m` is the size of the prime `p` + * in bits. + */ +#define PSA_ALG_FFDH ((psa_algorithm_t) 0x09010000) + +/** Whether the specified algorithm is a finite field Diffie-Hellman algorithm. + * + * This includes the raw finite field Diffie-Hellman algorithm as well as + * finite-field Diffie-Hellman followed by any supporter key derivation + * algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \c alg is a finite field Diffie-Hellman algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \c alg is not a supported + * key agreement algorithm identifier. + */ +#define PSA_ALG_IS_FFDH(alg) \ + (PSA_ALG_KEY_AGREEMENT_GET_BASE(alg) == PSA_ALG_FFDH) + +/** The elliptic curve Diffie-Hellman (ECDH) key agreement algorithm. + * + * The shared secret produced by key agreement is the x-coordinate of + * the shared secret point. It is always `ceiling(m / 8)` bytes long where + * `m` is the bit size associated with the curve, i.e. the bit size of the + * order of the curve's coordinate field. When `m` is not a multiple of 8, + * the byte containing the most significant bit of the shared secret + * is padded with zero bits. The byte order is either little-endian + * or big-endian depending on the curve type. + * + * - For Montgomery curves (curve types `PSA_ECC_FAMILY_CURVEXXX`), + * the shared secret is the x-coordinate of `d_A Q_B = d_B Q_A` + * in little-endian byte order. + * The bit size is 448 for Curve448 and 255 for Curve25519. + * - For Weierstrass curves over prime fields (curve types + * `PSA_ECC_FAMILY_SECPXXX` and `PSA_ECC_FAMILY_BRAINPOOL_PXXX`), + * the shared secret is the x-coordinate of `d_A Q_B = d_B Q_A` + * in big-endian byte order. + * The bit size is `m = ceiling(log_2(p))` for the field `F_p`. + * - For Weierstrass curves over binary fields (curve types + * `PSA_ECC_FAMILY_SECTXXX`), + * the shared secret is the x-coordinate of `d_A Q_B = d_B Q_A` + * in big-endian byte order. + * The bit size is `m` for the field `F_{2^m}`. + */ +#define PSA_ALG_ECDH ((psa_algorithm_t) 0x09020000) + +/** Whether the specified algorithm is an elliptic curve Diffie-Hellman + * algorithm. + * + * This includes the raw elliptic curve Diffie-Hellman algorithm as well as + * elliptic curve Diffie-Hellman followed by any supporter key derivation + * algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \c alg is an elliptic curve Diffie-Hellman algorithm, + * 0 otherwise. + * This macro may return either 0 or 1 if \c alg is not a supported + * key agreement algorithm identifier. + */ +#define PSA_ALG_IS_ECDH(alg) \ + (PSA_ALG_KEY_AGREEMENT_GET_BASE(alg) == PSA_ALG_ECDH) + +/** Whether the specified algorithm encoding is a wildcard. + * + * Wildcard values may only be used to set the usage algorithm field in + * a policy, not to perform an operation. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \c alg is a wildcard algorithm encoding. + * \return 0 if \c alg is a non-wildcard algorithm encoding (suitable for + * an operation). + * \return This macro may return either 0 or 1 if \c alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_WILDCARD(alg) \ + (PSA_ALG_IS_HASH_AND_SIGN(alg) ? \ + PSA_ALG_SIGN_GET_HASH(alg) == PSA_ALG_ANY_HASH : \ + PSA_ALG_IS_MAC(alg) ? \ + (alg & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) != 0 : \ + PSA_ALG_IS_AEAD(alg) ? \ + (alg & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) != 0 : \ + (alg) == PSA_ALG_ANY_HASH) + +/**@}*/ + +/** \defgroup key_lifetimes Key lifetimes + * @{ + */ + +/* Note that location and persistence level values are embedded in the + * persistent key store, as part of key metadata. As a consequence, they + * must not be changed (unless the storage format version changes). + */ + +/** The default lifetime for volatile keys. + * + * A volatile key only exists as long as the identifier to it is not destroyed. + * The key material is guaranteed to be erased on a power reset. + * + * A key with this lifetime is typically stored in the RAM area of the + * PSA Crypto subsystem. However this is an implementation choice. + * If an implementation stores data about the key in a non-volatile memory, + * it must release all the resources associated with the key and erase the + * key material if the calling application terminates. + */ +#define PSA_KEY_LIFETIME_VOLATILE ((psa_key_lifetime_t) 0x00000000) + +/** The default lifetime for persistent keys. + * + * A persistent key remains in storage until it is explicitly destroyed or + * until the corresponding storage area is wiped. This specification does + * not define any mechanism to wipe a storage area, but integrations may + * provide their own mechanism (for example to perform a factory reset, + * to prepare for device refurbishment, or to uninstall an application). + * + * This lifetime value is the default storage area for the calling + * application. Integrations of Mbed TLS may support other persistent lifetimes. + * See ::psa_key_lifetime_t for more information. + */ +#define PSA_KEY_LIFETIME_PERSISTENT ((psa_key_lifetime_t) 0x00000001) + +/** The persistence level of volatile keys. + * + * See ::psa_key_persistence_t for more information. + */ +#define PSA_KEY_PERSISTENCE_VOLATILE ((psa_key_persistence_t) 0x00) + +/** The default persistence level for persistent keys. + * + * See ::psa_key_persistence_t for more information. + */ +#define PSA_KEY_PERSISTENCE_DEFAULT ((psa_key_persistence_t) 0x01) + +/** A persistence level indicating that a key is never destroyed. + * + * See ::psa_key_persistence_t for more information. + */ +#define PSA_KEY_PERSISTENCE_READ_ONLY ((psa_key_persistence_t) 0xff) + +#define PSA_KEY_LIFETIME_GET_PERSISTENCE(lifetime) \ + ((psa_key_persistence_t) ((lifetime) & 0x000000ff)) + +#define PSA_KEY_LIFETIME_GET_LOCATION(lifetime) \ + ((psa_key_location_t) ((lifetime) >> 8)) + +/** Whether a key lifetime indicates that the key is volatile. + * + * A volatile key is automatically destroyed by the implementation when + * the application instance terminates. In particular, a volatile key + * is automatically destroyed on a power reset of the device. + * + * A key that is not volatile is persistent. Persistent keys are + * preserved until the application explicitly destroys them or until an + * implementation-specific device management event occurs (for example, + * a factory reset). + * + * \param lifetime The lifetime value to query (value of type + * ::psa_key_lifetime_t). + * + * \return \c 1 if the key is volatile, otherwise \c 0. + */ +#define PSA_KEY_LIFETIME_IS_VOLATILE(lifetime) \ + (PSA_KEY_LIFETIME_GET_PERSISTENCE(lifetime) == \ + PSA_KEY_PERSISTENCE_VOLATILE) + +/** Whether a key lifetime indicates that the key is read-only. + * + * Read-only keys cannot be created or destroyed through the PSA Crypto API. + * They must be created through platform-specific means that bypass the API. + * + * Some platforms may offer ways to destroy read-only keys. For example, + * consider a platform with multiple levels of privilege, where a + * low-privilege application can use a key but is not allowed to destroy + * it, and the platform exposes the key to the application with a read-only + * lifetime. High-privilege code can destroy the key even though the + * application sees the key as read-only. + * + * \param lifetime The lifetime value to query (value of type + * ::psa_key_lifetime_t). + * + * \return \c 1 if the key is read-only, otherwise \c 0. + */ +#define PSA_KEY_LIFETIME_IS_READ_ONLY(lifetime) \ + (PSA_KEY_LIFETIME_GET_PERSISTENCE(lifetime) == \ + PSA_KEY_PERSISTENCE_READ_ONLY) + +/** Construct a lifetime from a persistence level and a location. + * + * \param persistence The persistence level + * (value of type ::psa_key_persistence_t). + * \param location The location indicator + * (value of type ::psa_key_location_t). + * + * \return The constructed lifetime value. + */ +#define PSA_KEY_LIFETIME_FROM_PERSISTENCE_AND_LOCATION(persistence, location) \ + ((location) << 8 | (persistence)) + +/** The local storage area for persistent keys. + * + * This storage area is available on all systems that can store persistent + * keys without delegating the storage to a third-party cryptoprocessor. + * + * See ::psa_key_location_t for more information. + */ +#define PSA_KEY_LOCATION_LOCAL_STORAGE ((psa_key_location_t) 0x000000) + +#define PSA_KEY_LOCATION_VENDOR_FLAG ((psa_key_location_t) 0x800000) + +/* Note that key identifier values are embedded in the + * persistent key store, as part of key metadata. As a consequence, they + * must not be changed (unless the storage format version changes). + */ + +/** The null key identifier. + */ +/* *INDENT-OFF* (https://github.com/ARM-software/psa-arch-tests/issues/337) */ +#define PSA_KEY_ID_NULL ((psa_key_id_t)0) +/* *INDENT-ON* */ +/** The minimum value for a key identifier chosen by the application. + */ +#define PSA_KEY_ID_USER_MIN ((psa_key_id_t) 0x00000001) +/** The maximum value for a key identifier chosen by the application. + */ +#define PSA_KEY_ID_USER_MAX ((psa_key_id_t) 0x3fffffff) +/** The minimum value for a key identifier chosen by the implementation. + */ +#define PSA_KEY_ID_VENDOR_MIN ((psa_key_id_t) 0x40000000) +/** The maximum value for a key identifier chosen by the implementation. + */ +#define PSA_KEY_ID_VENDOR_MAX ((psa_key_id_t) 0x7fffffff) + + +#if !defined(MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER) + +#define MBEDTLS_SVC_KEY_ID_INIT ((psa_key_id_t) 0) +#define MBEDTLS_SVC_KEY_ID_GET_KEY_ID(id) (id) +#define MBEDTLS_SVC_KEY_ID_GET_OWNER_ID(id) (0) + +/** Utility to initialize a key identifier at runtime. + * + * \param unused Unused parameter. + * \param key_id Identifier of the key. + */ +static inline mbedtls_svc_key_id_t mbedtls_svc_key_id_make( + unsigned int unused, psa_key_id_t key_id) +{ + (void) unused; + + return key_id; +} + +/** Compare two key identifiers. + * + * \param id1 First key identifier. + * \param id2 Second key identifier. + * + * \return Non-zero if the two key identifier are equal, zero otherwise. + */ +static inline int mbedtls_svc_key_id_equal(mbedtls_svc_key_id_t id1, + mbedtls_svc_key_id_t id2) +{ + return id1 == id2; +} + +/** Check whether a key identifier is null. + * + * \param key Key identifier. + * + * \return Non-zero if the key identifier is null, zero otherwise. + */ +static inline int mbedtls_svc_key_id_is_null(mbedtls_svc_key_id_t key) +{ + return key == 0; +} + +#else /* MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER */ + +#define MBEDTLS_SVC_KEY_ID_INIT ((mbedtls_svc_key_id_t){ 0, 0 }) +#define MBEDTLS_SVC_KEY_ID_GET_KEY_ID(id) ((id).key_id) +#define MBEDTLS_SVC_KEY_ID_GET_OWNER_ID(id) ((id).owner) + +/** Utility to initialize a key identifier at runtime. + * + * \param owner_id Identifier of the key owner. + * \param key_id Identifier of the key. + */ +static inline mbedtls_svc_key_id_t mbedtls_svc_key_id_make( + mbedtls_key_owner_id_t owner_id, psa_key_id_t key_id) +{ + return (mbedtls_svc_key_id_t){ .key_id = key_id, + .owner = owner_id }; +} + +/** Compare two key identifiers. + * + * \param id1 First key identifier. + * \param id2 Second key identifier. + * + * \return Non-zero if the two key identifier are equal, zero otherwise. + */ +static inline int mbedtls_svc_key_id_equal(mbedtls_svc_key_id_t id1, + mbedtls_svc_key_id_t id2) +{ + return (id1.key_id == id2.key_id) && + mbedtls_key_owner_id_equal(id1.owner, id2.owner); +} + +/** Check whether a key identifier is null. + * + * \param key Key identifier. + * + * \return Non-zero if the key identifier is null, zero otherwise. + */ +static inline int mbedtls_svc_key_id_is_null(mbedtls_svc_key_id_t key) +{ + return key.key_id == 0; +} + +#endif /* !MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER */ + +/**@}*/ + +/** \defgroup policy Key policies + * @{ + */ + +/* Note that key usage flags are embedded in the + * persistent key store, as part of key metadata. As a consequence, they + * must not be changed (unless the storage format version changes). + */ + +/** Whether the key may be exported. + * + * A public key or the public part of a key pair may always be exported + * regardless of the value of this permission flag. + * + * If a key does not have export permission, implementations shall not + * allow the key to be exported in plain form from the cryptoprocessor, + * whether through psa_export_key() or through a proprietary interface. + * The key may however be exportable in a wrapped form, i.e. in a form + * where it is encrypted by another key. + */ +#define PSA_KEY_USAGE_EXPORT ((psa_key_usage_t) 0x00000001) + +/** Whether the key may be copied. + * + * This flag allows the use of psa_copy_key() to make a copy of the key + * with the same policy or a more restrictive policy. + * + * For lifetimes for which the key is located in a secure element which + * enforce the non-exportability of keys, copying a key outside the secure + * element also requires the usage flag #PSA_KEY_USAGE_EXPORT. + * Copying the key inside the secure element is permitted with just + * #PSA_KEY_USAGE_COPY if the secure element supports it. + * For keys with the lifetime #PSA_KEY_LIFETIME_VOLATILE or + * #PSA_KEY_LIFETIME_PERSISTENT, the usage flag #PSA_KEY_USAGE_COPY + * is sufficient to permit the copy. + */ +#define PSA_KEY_USAGE_COPY ((psa_key_usage_t) 0x00000002) + +/** Whether the key may be used to encrypt a message. + * + * This flag allows the key to be used for a symmetric encryption operation, + * for an AEAD encryption-and-authentication operation, + * or for an asymmetric encryption operation, + * if otherwise permitted by the key's type and policy. + * + * For a key pair, this concerns the public key. + */ +#define PSA_KEY_USAGE_ENCRYPT ((psa_key_usage_t) 0x00000100) + +/** Whether the key may be used to decrypt a message. + * + * This flag allows the key to be used for a symmetric decryption operation, + * for an AEAD decryption-and-verification operation, + * or for an asymmetric decryption operation, + * if otherwise permitted by the key's type and policy. + * + * For a key pair, this concerns the private key. + */ +#define PSA_KEY_USAGE_DECRYPT ((psa_key_usage_t) 0x00000200) + +/** Whether the key may be used to sign a message. + * + * This flag allows the key to be used for a MAC calculation operation or for + * an asymmetric message signature operation, if otherwise permitted by the + * key’s type and policy. + * + * For a key pair, this concerns the private key. + */ +#define PSA_KEY_USAGE_SIGN_MESSAGE ((psa_key_usage_t) 0x00000400) + +/** Whether the key may be used to verify a message. + * + * This flag allows the key to be used for a MAC verification operation or for + * an asymmetric message signature verification operation, if otherwise + * permitted by the key’s type and policy. + * + * For a key pair, this concerns the public key. + */ +#define PSA_KEY_USAGE_VERIFY_MESSAGE ((psa_key_usage_t) 0x00000800) + +/** Whether the key may be used to sign a message. + * + * This flag allows the key to be used for a MAC calculation operation + * or for an asymmetric signature operation, + * if otherwise permitted by the key's type and policy. + * + * For a key pair, this concerns the private key. + */ +#define PSA_KEY_USAGE_SIGN_HASH ((psa_key_usage_t) 0x00001000) + +/** Whether the key may be used to verify a message signature. + * + * This flag allows the key to be used for a MAC verification operation + * or for an asymmetric signature verification operation, + * if otherwise permitted by by the key's type and policy. + * + * For a key pair, this concerns the public key. + */ +#define PSA_KEY_USAGE_VERIFY_HASH ((psa_key_usage_t) 0x00002000) + +/** Whether the key may be used to derive other keys. + */ +#define PSA_KEY_USAGE_DERIVE ((psa_key_usage_t) 0x00004000) + +/**@}*/ + +/** \defgroup derivation Key derivation + * @{ + */ + +/* Key input steps are not embedded in the persistent storage, so you can + * change them if needed: it's only an ABI change. */ + +/** A secret input for key derivation. + * + * This should be a key of type #PSA_KEY_TYPE_DERIVE + * (passed to psa_key_derivation_input_key()) + * or the shared secret resulting from a key agreement + * (obtained via psa_key_derivation_key_agreement()). + * + * The secret can also be a direct input (passed to + * key_derivation_input_bytes()). In this case, the derivation operation + * may not be used to derive keys: the operation will only allow + * psa_key_derivation_output_bytes(), not psa_key_derivation_output_key(). + */ +#define PSA_KEY_DERIVATION_INPUT_SECRET ((psa_key_derivation_step_t) 0x0101) + +/** A label for key derivation. + * + * This should be a direct input. + * It can also be a key of type #PSA_KEY_TYPE_RAW_DATA. + */ +#define PSA_KEY_DERIVATION_INPUT_LABEL ((psa_key_derivation_step_t) 0x0201) + +/** A salt for key derivation. + * + * This should be a direct input. + * It can also be a key of type #PSA_KEY_TYPE_RAW_DATA. + */ +#define PSA_KEY_DERIVATION_INPUT_SALT ((psa_key_derivation_step_t) 0x0202) + +/** An information string for key derivation. + * + * This should be a direct input. + * It can also be a key of type #PSA_KEY_TYPE_RAW_DATA. + */ +#define PSA_KEY_DERIVATION_INPUT_INFO ((psa_key_derivation_step_t) 0x0203) + +/** A seed for key derivation. + * + * This should be a direct input. + * It can also be a key of type #PSA_KEY_TYPE_RAW_DATA. + */ +#define PSA_KEY_DERIVATION_INPUT_SEED ((psa_key_derivation_step_t) 0x0204) + +/**@}*/ + +/** \defgroup helper_macros Helper macros + * @{ + */ + +/* Helper macros */ + +/** Check if two AEAD algorithm identifiers refer to the same AEAD algorithm + * regardless of the tag length they encode. + * + * \param aead_alg_1 An AEAD algorithm identifier. + * \param aead_alg_2 An AEAD algorithm identifier. + * + * \return 1 if both identifiers refer to the same AEAD algorithm, + * 0 otherwise. + * Unspecified if neither \p aead_alg_1 nor \p aead_alg_2 are + * a supported AEAD algorithm. + */ +#define MBEDTLS_PSA_ALG_AEAD_EQUAL(aead_alg_1, aead_alg_2) \ + (!(((aead_alg_1) ^ (aead_alg_2)) & \ + ~(PSA_ALG_AEAD_TAG_LENGTH_MASK | PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG))) + +/**@}*/ + +#endif /* PSA_CRYPTO_VALUES_H */ diff --git a/ext/opcua_client/mbedtls/library/.gitignore b/ext/opcua_client/mbedtls/library/.gitignore new file mode 100644 index 0000000..9aa6322 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/.gitignore @@ -0,0 +1,3 @@ +libmbed* +*.sln +*.vcxproj diff --git a/ext/opcua_client/mbedtls/library/CMakeLists.txt b/ext/opcua_client/mbedtls/library/CMakeLists.txt new file mode 100644 index 0000000..b66b3c8 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/CMakeLists.txt @@ -0,0 +1,255 @@ +option(USE_STATIC_MBEDTLS_LIBRARY "Build Mbed TLS static library." ON) +option(USE_SHARED_MBEDTLS_LIBRARY "Build Mbed TLS shared library." OFF) +option(LINK_WITH_PTHREAD "Explicitly link Mbed TLS library to pthread." OFF) +option(LINK_WITH_TRUSTED_STORAGE "Explicitly link Mbed TLS library to trusted_storage." OFF) + +# Set the project root directory if it's not already defined, as may happen if +# the library folder is included directly by a parent project, without +# including the top level CMakeLists.txt. +if(NOT DEFINED MBEDTLS_DIR) + set(MBEDTLS_DIR ${CMAKE_SOURCE_DIR}) +endif() + +set(src_crypto + aes.c + aesni.c + arc4.c + aria.c + asn1parse.c + asn1write.c + base64.c + bignum.c + blowfish.c + camellia.c + ccm.c + chacha20.c + chachapoly.c + cipher.c + cipher_wrap.c + constant_time.c + cmac.c + ctr_drbg.c + des.c + dhm.c + ecdh.c + ecdsa.c + ecjpake.c + ecp.c + ecp_curves.c + entropy.c + entropy_poll.c + error.c + gcm.c + havege.c + hkdf.c + hmac_drbg.c + md.c + md2.c + md4.c + md5.c + memory_buffer_alloc.c + mps_reader.c + mps_trace.c + nist_kw.c + oid.c + padlock.c + pem.c + pk.c + pk_wrap.c + pkcs12.c + pkcs5.c + pkparse.c + pkwrite.c + platform.c + platform_util.c + poly1305.c + psa_crypto.c + psa_crypto_aead.c + psa_crypto_cipher.c + psa_crypto_client.c + psa_crypto_driver_wrappers.c + psa_crypto_ecp.c + psa_crypto_hash.c + psa_crypto_mac.c + psa_crypto_rsa.c + psa_crypto_se.c + psa_crypto_slot_management.c + psa_crypto_storage.c + psa_its_file.c + ripemd160.c + rsa.c + rsa_internal.c + sha1.c + sha256.c + sha512.c + threading.c + timing.c + version.c + version_features.c + xtea.c +) + +list(APPEND src_crypto ${thirdparty_src}) + +set(src_x509 + certs.c + pkcs11.c + x509.c + x509_create.c + x509_crl.c + x509_crt.c + x509_csr.c + x509write_crt.c + x509write_csr.c +) + +set(src_tls + debug.c + net_sockets.c + ssl_cache.c + ssl_ciphersuites.c + ssl_cli.c + ssl_cookie.c + ssl_msg.c + ssl_srv.c + ssl_ticket.c + ssl_tls.c + ssl_tls13_keys.c +) + +if(CMAKE_COMPILER_IS_GNUCC) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes") +endif(CMAKE_COMPILER_IS_GNUCC) + +if(CMAKE_COMPILER_IS_CLANG) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes -Wdocumentation -Wno-documentation-deprecated-sync -Wunreachable-code") +endif(CMAKE_COMPILER_IS_CLANG) + +if(WIN32) + set(libs ${libs} ws2_32) +endif(WIN32) + +if(CMAKE_C_COMPILER_ID MATCHES "AppleClang") + set(CMAKE_C_ARCHIVE_CREATE " Scr ") + set(CMAKE_C_ARCHIVE_FINISH " -no_warning_for_no_symbols -c ") +endif() +if(CMAKE_CXX_COMPILER_ID MATCHES "AppleClang") + set(CMAKE_CXX_ARCHIVE_CREATE " Scr ") + set(CMAKE_CXX_ARCHIVE_FINISH " -no_warning_for_no_symbols -c ") +endif() + +if(HAIKU) + set(libs ${libs} network) +endif(HAIKU) + +if(USE_PKCS11_HELPER_LIBRARY) + set(libs ${libs} pkcs11-helper) +endif(USE_PKCS11_HELPER_LIBRARY) + +if(ENABLE_ZLIB_SUPPORT) + set(libs ${libs} ${ZLIB_LIBRARIES}) +endif(ENABLE_ZLIB_SUPPORT) + +if(LINK_WITH_PTHREAD) + set(libs ${libs} pthread) +endif() + +if(LINK_WITH_TRUSTED_STORAGE) + set(libs ${libs} trusted_storage) +endif() + +if (NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY) + message(FATAL_ERROR "Need to choose static or shared mbedtls build!") +endif(NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY) + +set(mbedtls_target "${MBEDTLS_TARGET_PREFIX}mbedtls") +set(mbedx509_target "${MBEDTLS_TARGET_PREFIX}mbedx509") +set(mbedcrypto_target "${MBEDTLS_TARGET_PREFIX}mbedcrypto") + +set(mbedtls_target ${mbedtls_target} PARENT_SCOPE) +set(mbedx509_target ${mbedx509_target} PARENT_SCOPE) +set(mbedcrypto_target ${mbedcrypto_target} PARENT_SCOPE) + +if (USE_STATIC_MBEDTLS_LIBRARY) + set(mbedtls_static_target ${mbedtls_target}) + set(mbedx509_static_target ${mbedx509_target}) + set(mbedcrypto_static_target ${mbedcrypto_target}) +endif() + +set(target_libraries ${mbedcrypto_target} ${mbedx509_target} ${mbedtls_target}) + +if(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY) + string(APPEND mbedtls_static_target "_static") + string(APPEND mbedx509_static_target "_static") + string(APPEND mbedcrypto_static_target "_static") + + list(APPEND target_libraries + ${mbedcrypto_static_target} + ${mbedx509_static_target} + ${mbedtls_static_target}) +endif() + +if(USE_STATIC_MBEDTLS_LIBRARY) + add_library(${mbedcrypto_static_target} STATIC ${src_crypto}) + set_target_properties(${mbedcrypto_static_target} PROPERTIES OUTPUT_NAME mbedcrypto) + target_link_libraries(${mbedcrypto_static_target} PUBLIC ${libs}) + + add_library(${mbedx509_static_target} STATIC ${src_x509}) + set_target_properties(${mbedx509_static_target} PROPERTIES OUTPUT_NAME mbedx509) + target_link_libraries(${mbedx509_static_target} PUBLIC ${libs} ${mbedcrypto_static_target}) + + add_library(${mbedtls_static_target} STATIC ${src_tls}) + set_target_properties(${mbedtls_static_target} PROPERTIES OUTPUT_NAME mbedtls) + target_link_libraries(${mbedtls_static_target} PUBLIC ${libs} ${mbedx509_static_target}) +endif(USE_STATIC_MBEDTLS_LIBRARY) + +if(USE_SHARED_MBEDTLS_LIBRARY) + set(CMAKE_LIBRARY_PATH ${CMAKE_CURRENT_BINARY_DIR}) + add_library(${mbedcrypto_target} SHARED ${src_crypto}) + set_target_properties(${mbedcrypto_target} PROPERTIES VERSION 2.28.10 SOVERSION 7) + target_link_libraries(${mbedcrypto_target} PUBLIC ${libs}) + + add_library(${mbedx509_target} SHARED ${src_x509}) + set_target_properties(${mbedx509_target} PROPERTIES VERSION 2.28.10 SOVERSION 1) + target_link_libraries(${mbedx509_target} PUBLIC ${libs} ${mbedcrypto_target}) + + add_library(${mbedtls_target} SHARED ${src_tls}) + set_target_properties(${mbedtls_target} PROPERTIES VERSION 2.28.10 SOVERSION 14) + target_link_libraries(${mbedtls_target} PUBLIC ${libs} ${mbedx509_target}) +endif(USE_SHARED_MBEDTLS_LIBRARY) + +foreach(target IN LISTS target_libraries) + # Include public header files from /include and other directories + # declared by /3rdparty/**/CMakeLists.txt. Include private header files + # from /library and others declared by /3rdparty/**/CMakeLists.txt. + # /library needs to be listed explicitly when building .c files outside + # of /library (which currently means: under /3rdparty). + target_include_directories(${target} + PUBLIC ${MBEDTLS_DIR}/include/ + PUBLIC ${thirdparty_inc_public} + PRIVATE ${MBEDTLS_DIR}/library/ + PRIVATE ${thirdparty_inc} + # Needed to include psa_crypto_driver_wrappers.h + ${CMAKE_CURRENT_BINARY_DIR}) + target_compile_definitions(${target} + PRIVATE ${thirdparty_def}) + # Pass-through MBEDTLS_CONFIG_FILE and MBEDTLS_USER_CONFIG_FILE + if(MBEDTLS_CONFIG_FILE) + target_compile_definitions(${target} + PUBLIC MBEDTLS_CONFIG_FILE="${MBEDTLS_CONFIG_FILE}") + endif() + if(MBEDTLS_USER_CONFIG_FILE) + target_compile_definitions(${target} + PUBLIC MBEDTLS_USER_CONFIG_FILE="${MBEDTLS_USER_CONFIG_FILE}") + endif() + install(TARGETS ${target} + DESTINATION ${CMAKE_INSTALL_LIBDIR} + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) +endforeach(target) + +set(lib_target "${MBEDTLS_TARGET_PREFIX}lib") + +add_custom_target(${lib_target} DEPENDS ${mbedcrypto_target} ${mbedx509_target} ${mbedtls_target}) +if(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY) + add_dependencies(${lib_target} ${mbedcrypto_static_target} ${mbedx509_static_target} ${mbedtls_static_target}) +endif() diff --git a/ext/opcua_client/mbedtls/library/Makefile b/ext/opcua_client/mbedtls/library/Makefile new file mode 100644 index 0000000..b011e88 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/Makefile @@ -0,0 +1,302 @@ + +# Also see "include/mbedtls/config.h" + +CFLAGS ?= -O2 +WARNING_CFLAGS ?= -Wall -Wextra -Wformat=2 -Wno-format-nonliteral +LDFLAGS ?= + +# Include ../include for public headers and . for private headers. +# Note that . needs to be included explicitly for the sake of library +# files that are not in the /library directory (which currently means +# under /3rdparty). +LOCAL_CFLAGS = $(WARNING_CFLAGS) -I. -I../include -D_FILE_OFFSET_BITS=64 +LOCAL_LDFLAGS = + +ifdef DEBUG +LOCAL_CFLAGS += -g3 +endif + +# MicroBlaze specific options: +# CFLAGS += -mno-xl-soft-mul -mxl-barrel-shift + +# To compile on Plan9: +# CFLAGS += -D_BSD_EXTENSION + +# if were running on Windows build for Windows +ifdef WINDOWS +WINDOWS_BUILD=1 +else ifeq ($(shell uname -s),Darwin) +ifeq ($(AR),ar) +APPLE_BUILD ?= 1 +endif +endif + +# To compile as a shared library: +ifdef SHARED +# all code is position-indep with mingw, avoid warning about useless flag +ifndef WINDOWS_BUILD +LOCAL_CFLAGS += -fPIC -fpic +endif +endif + +SOEXT_TLS=so.14 +SOEXT_X509=so.1 +SOEXT_CRYPTO=so.7 + +# Set AR_DASH= (empty string) to use an ar implementation that does not accept +# the - prefix for command line options (e.g. llvm-ar) +AR_DASH ?= - + +ARFLAGS = $(AR_DASH)src +ifdef APPLE_BUILD +ifneq ($(APPLE_BUILD),0) +ARFLAGS = $(AR_DASH)Src +RLFLAGS = -no_warning_for_no_symbols -c +RL ?= ranlib +endif +endif + +DLEXT ?= so +ifdef WINDOWS_BUILD +# Windows shared library extension: +DLEXT = dll +else ifdef APPLE_BUILD +ifneq ($(APPLE_BUILD),0) +# Mac OS X shared library extension: +DLEXT = dylib +endif +endif + +OBJS_CRYPTO= \ + aes.o \ + aesni.o \ + arc4.o \ + aria.o \ + asn1parse.o \ + asn1write.o \ + base64.o \ + bignum.o \ + blowfish.o \ + camellia.o \ + ccm.o \ + chacha20.o \ + chachapoly.o \ + cipher.o \ + cipher_wrap.o \ + cmac.o \ + constant_time.o \ + ctr_drbg.o \ + des.o \ + dhm.o \ + ecdh.o \ + ecdsa.o \ + ecjpake.o \ + ecp.o \ + ecp_curves.o \ + entropy.o \ + entropy_poll.o \ + error.o \ + gcm.o \ + havege.o \ + hkdf.o \ + hmac_drbg.o \ + md.o \ + md2.o \ + md4.o \ + md5.o \ + memory_buffer_alloc.o \ + mps_reader.o \ + mps_trace.o \ + nist_kw.o \ + oid.o \ + padlock.o \ + pem.o \ + pk.o \ + pk_wrap.o \ + pkcs12.o \ + pkcs5.o \ + pkparse.o \ + pkwrite.o \ + platform.o \ + platform_util.o \ + poly1305.o \ + psa_crypto.o \ + psa_crypto_aead.o \ + psa_crypto_cipher.o \ + psa_crypto_client.o \ + psa_crypto_driver_wrappers.o \ + psa_crypto_ecp.o \ + psa_crypto_hash.o \ + psa_crypto_mac.o \ + psa_crypto_rsa.o \ + psa_crypto_se.o \ + psa_crypto_slot_management.o \ + psa_crypto_storage.o \ + psa_its_file.o \ + ripemd160.o \ + rsa.o \ + rsa_internal.o \ + sha1.o \ + sha256.o \ + sha512.o \ + threading.o \ + timing.o \ + version.o \ + version_features.o \ + xtea.o \ + # This line is intentionally left blank + +include ../3rdparty/Makefile.inc +LOCAL_CFLAGS+=$(THIRDPARTY_INCLUDES) +OBJS_CRYPTO+=$(THIRDPARTY_CRYPTO_OBJECTS) + +OBJS_X509= \ + certs.o \ + pkcs11.o \ + x509.o \ + x509_create.o \ + x509_crl.o \ + x509_crt.o \ + x509_csr.o \ + x509write_crt.o \ + x509write_csr.o \ + # This line is intentionally left blank + +OBJS_TLS= \ + debug.o \ + net_sockets.o \ + ssl_cache.o \ + ssl_ciphersuites.o \ + ssl_cli.o \ + ssl_cookie.o \ + ssl_msg.o \ + ssl_srv.o \ + ssl_ticket.o \ + ssl_tls.o \ + ssl_tls13_keys.o \ + # This line is intentionally left blank + +.SILENT: + +.PHONY: all static shared clean + +ifndef SHARED +all: static +else +all: shared static +endif + +ifdef TEST_TIMING_ALT_IMPL +OBJS_CRYPTO += external_timing_for_test.o +external_timing_for_test.o: ../tests/src/external_timing/external_timing_for_test.c + echo " CC $<" + $(CC) $(LOCAL_CFLAGS) $(CFLAGS) -o $@ -c $< +endif + +static: libmbedcrypto.a libmbedx509.a libmbedtls.a + cd ../tests && echo "This is a seedfile that contains 64 bytes (65 on Windows)......" > seedfile + +shared: libmbedcrypto.$(DLEXT) libmbedx509.$(DLEXT) libmbedtls.$(DLEXT) + +# Windows builds under Mingw can fail if make tries to create archives in the same +# directory at the same time - see https://bugs.launchpad.net/gcc-arm-embedded/+bug/1848002. +# This forces builds of the .a files to be serialised. +ifdef WINDOWS +libmbedtls.a: | libmbedx509.a +libmbedx509.a: | libmbedcrypto.a +endif + +# tls +libmbedtls.a: $(OBJS_TLS) + echo " AR $@" + $(AR) $(ARFLAGS) $@ $(OBJS_TLS) +ifdef APPLE_BUILD +ifneq ($(APPLE_BUILD),0) + echo " RL $@" + $(RL) $(RLFLAGS) $@ +endif +endif + +libmbedtls.$(SOEXT_TLS): $(OBJS_TLS) libmbedx509.so + echo " LD $@" + $(CC) -shared -Wl,-soname,$@ -o $@ $(OBJS_TLS) -L. -lmbedx509 -lmbedcrypto $(LOCAL_LDFLAGS) $(LDFLAGS) + +libmbedtls.so: libmbedtls.$(SOEXT_TLS) + echo " LN $@ -> $<" + ln -sf $< $@ + +libmbedtls.dylib: $(OBJS_TLS) libmbedx509.dylib + echo " LD $@" + $(CC) -dynamiclib -o $@ $(OBJS_TLS) -L. -lmbedx509 -lmbedcrypto $(LOCAL_LDFLAGS) $(LDFLAGS) + +libmbedtls.dll: $(OBJS_TLS) libmbedx509.dll + echo " LD $@" + $(CC) -shared -Wl,-soname,$@ -Wl,--out-implib,$@.a -o $@ $(OBJS_TLS) -lws2_32 -lwinmm -lgdi32 -L. -lmbedx509 -lmbedcrypto -static-libgcc $(LOCAL_LDFLAGS) $(LDFLAGS) + +# x509 +libmbedx509.a: $(OBJS_X509) + echo " AR $@" + $(AR) $(ARFLAGS) $@ $(OBJS_X509) +ifdef APPLE_BUILD +ifneq ($(APPLE_BUILD),0) + echo " RL $@" + $(RL) $(RLFLAGS) $@ +endif +endif + +libmbedx509.$(SOEXT_X509): $(OBJS_X509) libmbedcrypto.so + echo " LD $@" + $(CC) -shared -Wl,-soname,$@ -o $@ $(OBJS_X509) -L. -lmbedcrypto $(LOCAL_LDFLAGS) $(LDFLAGS) + +libmbedx509.so: libmbedx509.$(SOEXT_X509) + echo " LN $@ -> $<" + ln -sf $< $@ + +libmbedx509.dylib: $(OBJS_X509) libmbedcrypto.dylib + echo " LD $@" + $(CC) -dynamiclib -o $@ $(OBJS_X509) -L. -lmbedcrypto $(LOCAL_LDFLAGS) $(LDFLAGS) + +libmbedx509.dll: $(OBJS_X509) libmbedcrypto.dll + echo " LD $@" + $(CC) -shared -Wl,-soname,$@ -Wl,--out-implib,$@.a -o $@ $(OBJS_X509) -lws2_32 -lwinmm -lgdi32 -L. -lmbedcrypto -static-libgcc $(LOCAL_LDFLAGS) $(LDFLAGS) + +# crypto +libmbedcrypto.a: $(OBJS_CRYPTO) + echo " AR $@" + $(AR) $(ARFLAGS) $@ $(OBJS_CRYPTO) +ifdef APPLE_BUILD +ifneq ($(APPLE_BUILD),0) + echo " RL $@" + $(RL) $(RLFLAGS) $@ +endif +endif + +libmbedcrypto.$(SOEXT_CRYPTO): $(OBJS_CRYPTO) + echo " LD $@" + $(CC) -shared -Wl,-soname,$@ -o $@ $(OBJS_CRYPTO) $(LOCAL_LDFLAGS) $(LDFLAGS) + +libmbedcrypto.so: libmbedcrypto.$(SOEXT_CRYPTO) + echo " LN $@ -> $<" + ln -sf $< $@ + +libmbedcrypto.dylib: $(OBJS_CRYPTO) + echo " LD $@" + $(CC) -dynamiclib -o $@ $(OBJS_CRYPTO) $(LOCAL_LDFLAGS) $(LDFLAGS) + +libmbedcrypto.dll: $(OBJS_CRYPTO) + echo " LD $@" + $(CC) -shared -Wl,-soname,$@ -Wl,--out-implib,$@.a -o $@ $(OBJS_CRYPTO) -lws2_32 -lwinmm -lgdi32 -static-libgcc $(LOCAL_LDFLAGS) $(LDFLAGS) + +.c.o: + echo " CC $<" + $(CC) $(LOCAL_CFLAGS) $(CFLAGS) -o $@ -c $< + +clean: +ifndef WINDOWS + rm -f *.o libmbed* + rm -f $(THIRDPARTY_CRYPTO_OBJECTS) +else + if exist *.o del /Q /F *.o + if exist libmbed* del /Q /F libmbed* + del /Q /F del_errors_out_if_the_file_list_is_empty_but_not_if_a_file_does_not_exist $(subst /,\,$(THIRDPARTY_CRYPTO_OBJECTS)) +endif diff --git a/ext/opcua_client/mbedtls/library/aes.c b/ext/opcua_client/mbedtls/library/aes.c new file mode 100644 index 0000000..836367c --- /dev/null +++ b/ext/opcua_client/mbedtls/library/aes.c @@ -0,0 +1,2265 @@ +/* + * FIPS-197 compliant AES implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The AES block cipher was designed by Vincent Rijmen and Joan Daemen. + * + * https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/aes-development/rijndael-ammended.pdf + * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf + */ + +#include "common.h" + +#if defined(MBEDTLS_AES_C) + +#include + +#include "mbedtls/aes.h" +#include "mbedtls/platform.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" +#if defined(MBEDTLS_PADLOCK_C) +#include "mbedtls/padlock.h" +#endif +#if defined(MBEDTLS_AESNI_C) +#include "mbedtls/aesni.h" +#endif + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_AES_ALT) + +/* Parameter validation macros based on platform_util.h */ +#define AES_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA) +#define AES_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +#if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE) +static int aes_padlock_ace = -1; +#endif + +#if defined(MBEDTLS_AES_ROM_TABLES) +/* + * Forward S-box + */ +#if !defined(MBEDTLS_AES_ENCRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) || \ + !defined(MBEDTLS_AES_SETKEY_DEC_ALT) +static const unsigned char FSb[256] = +{ + 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, + 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, + 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, + 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, + 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, + 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, + 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, + 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, + 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, + 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, + 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, + 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, + 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, + 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, + 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, + 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, + 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, + 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, + 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, + 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, + 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, + 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, + 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, + 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, + 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, + 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, + 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, + 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, + 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, + 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, + 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, + 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 +}; +#endif /* !defined(MBEDTLS_AES_ENCRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) || \ + !defined(MBEDTLS_AES_SETKEY_DEC_ALT) */ + +/* + * Forward tables + */ +#define FT \ +\ + V(A5, 63, 63, C6), V(84, 7C, 7C, F8), V(99, 77, 77, EE), V(8D, 7B, 7B, F6), \ + V(0D, F2, F2, FF), V(BD, 6B, 6B, D6), V(B1, 6F, 6F, DE), V(54, C5, C5, 91), \ + V(50, 30, 30, 60), V(03, 01, 01, 02), V(A9, 67, 67, CE), V(7D, 2B, 2B, 56), \ + V(19, FE, FE, E7), V(62, D7, D7, B5), V(E6, AB, AB, 4D), V(9A, 76, 76, EC), \ + V(45, CA, CA, 8F), V(9D, 82, 82, 1F), V(40, C9, C9, 89), V(87, 7D, 7D, FA), \ + V(15, FA, FA, EF), V(EB, 59, 59, B2), V(C9, 47, 47, 8E), V(0B, F0, F0, FB), \ + V(EC, AD, AD, 41), V(67, D4, D4, B3), V(FD, A2, A2, 5F), V(EA, AF, AF, 45), \ + V(BF, 9C, 9C, 23), V(F7, A4, A4, 53), V(96, 72, 72, E4), V(5B, C0, C0, 9B), \ + V(C2, B7, B7, 75), V(1C, FD, FD, E1), V(AE, 93, 93, 3D), V(6A, 26, 26, 4C), \ + V(5A, 36, 36, 6C), V(41, 3F, 3F, 7E), V(02, F7, F7, F5), V(4F, CC, CC, 83), \ + V(5C, 34, 34, 68), V(F4, A5, A5, 51), V(34, E5, E5, D1), V(08, F1, F1, F9), \ + V(93, 71, 71, E2), V(73, D8, D8, AB), V(53, 31, 31, 62), V(3F, 15, 15, 2A), \ + V(0C, 04, 04, 08), V(52, C7, C7, 95), V(65, 23, 23, 46), V(5E, C3, C3, 9D), \ + V(28, 18, 18, 30), V(A1, 96, 96, 37), V(0F, 05, 05, 0A), V(B5, 9A, 9A, 2F), \ + V(09, 07, 07, 0E), V(36, 12, 12, 24), V(9B, 80, 80, 1B), V(3D, E2, E2, DF), \ + V(26, EB, EB, CD), V(69, 27, 27, 4E), V(CD, B2, B2, 7F), V(9F, 75, 75, EA), \ + V(1B, 09, 09, 12), V(9E, 83, 83, 1D), V(74, 2C, 2C, 58), V(2E, 1A, 1A, 34), \ + V(2D, 1B, 1B, 36), V(B2, 6E, 6E, DC), V(EE, 5A, 5A, B4), V(FB, A0, A0, 5B), \ + V(F6, 52, 52, A4), V(4D, 3B, 3B, 76), V(61, D6, D6, B7), V(CE, B3, B3, 7D), \ + V(7B, 29, 29, 52), V(3E, E3, E3, DD), V(71, 2F, 2F, 5E), V(97, 84, 84, 13), \ + V(F5, 53, 53, A6), V(68, D1, D1, B9), V(00, 00, 00, 00), V(2C, ED, ED, C1), \ + V(60, 20, 20, 40), V(1F, FC, FC, E3), V(C8, B1, B1, 79), V(ED, 5B, 5B, B6), \ + V(BE, 6A, 6A, D4), V(46, CB, CB, 8D), V(D9, BE, BE, 67), V(4B, 39, 39, 72), \ + V(DE, 4A, 4A, 94), V(D4, 4C, 4C, 98), V(E8, 58, 58, B0), V(4A, CF, CF, 85), \ + V(6B, D0, D0, BB), V(2A, EF, EF, C5), V(E5, AA, AA, 4F), V(16, FB, FB, ED), \ + V(C5, 43, 43, 86), V(D7, 4D, 4D, 9A), V(55, 33, 33, 66), V(94, 85, 85, 11), \ + V(CF, 45, 45, 8A), V(10, F9, F9, E9), V(06, 02, 02, 04), V(81, 7F, 7F, FE), \ + V(F0, 50, 50, A0), V(44, 3C, 3C, 78), V(BA, 9F, 9F, 25), V(E3, A8, A8, 4B), \ + V(F3, 51, 51, A2), V(FE, A3, A3, 5D), V(C0, 40, 40, 80), V(8A, 8F, 8F, 05), \ + V(AD, 92, 92, 3F), V(BC, 9D, 9D, 21), V(48, 38, 38, 70), V(04, F5, F5, F1), \ + V(DF, BC, BC, 63), V(C1, B6, B6, 77), V(75, DA, DA, AF), V(63, 21, 21, 42), \ + V(30, 10, 10, 20), V(1A, FF, FF, E5), V(0E, F3, F3, FD), V(6D, D2, D2, BF), \ + V(4C, CD, CD, 81), V(14, 0C, 0C, 18), V(35, 13, 13, 26), V(2F, EC, EC, C3), \ + V(E1, 5F, 5F, BE), V(A2, 97, 97, 35), V(CC, 44, 44, 88), V(39, 17, 17, 2E), \ + V(57, C4, C4, 93), V(F2, A7, A7, 55), V(82, 7E, 7E, FC), V(47, 3D, 3D, 7A), \ + V(AC, 64, 64, C8), V(E7, 5D, 5D, BA), V(2B, 19, 19, 32), V(95, 73, 73, E6), \ + V(A0, 60, 60, C0), V(98, 81, 81, 19), V(D1, 4F, 4F, 9E), V(7F, DC, DC, A3), \ + V(66, 22, 22, 44), V(7E, 2A, 2A, 54), V(AB, 90, 90, 3B), V(83, 88, 88, 0B), \ + V(CA, 46, 46, 8C), V(29, EE, EE, C7), V(D3, B8, B8, 6B), V(3C, 14, 14, 28), \ + V(79, DE, DE, A7), V(E2, 5E, 5E, BC), V(1D, 0B, 0B, 16), V(76, DB, DB, AD), \ + V(3B, E0, E0, DB), V(56, 32, 32, 64), V(4E, 3A, 3A, 74), V(1E, 0A, 0A, 14), \ + V(DB, 49, 49, 92), V(0A, 06, 06, 0C), V(6C, 24, 24, 48), V(E4, 5C, 5C, B8), \ + V(5D, C2, C2, 9F), V(6E, D3, D3, BD), V(EF, AC, AC, 43), V(A6, 62, 62, C4), \ + V(A8, 91, 91, 39), V(A4, 95, 95, 31), V(37, E4, E4, D3), V(8B, 79, 79, F2), \ + V(32, E7, E7, D5), V(43, C8, C8, 8B), V(59, 37, 37, 6E), V(B7, 6D, 6D, DA), \ + V(8C, 8D, 8D, 01), V(64, D5, D5, B1), V(D2, 4E, 4E, 9C), V(E0, A9, A9, 49), \ + V(B4, 6C, 6C, D8), V(FA, 56, 56, AC), V(07, F4, F4, F3), V(25, EA, EA, CF), \ + V(AF, 65, 65, CA), V(8E, 7A, 7A, F4), V(E9, AE, AE, 47), V(18, 08, 08, 10), \ + V(D5, BA, BA, 6F), V(88, 78, 78, F0), V(6F, 25, 25, 4A), V(72, 2E, 2E, 5C), \ + V(24, 1C, 1C, 38), V(F1, A6, A6, 57), V(C7, B4, B4, 73), V(51, C6, C6, 97), \ + V(23, E8, E8, CB), V(7C, DD, DD, A1), V(9C, 74, 74, E8), V(21, 1F, 1F, 3E), \ + V(DD, 4B, 4B, 96), V(DC, BD, BD, 61), V(86, 8B, 8B, 0D), V(85, 8A, 8A, 0F), \ + V(90, 70, 70, E0), V(42, 3E, 3E, 7C), V(C4, B5, B5, 71), V(AA, 66, 66, CC), \ + V(D8, 48, 48, 90), V(05, 03, 03, 06), V(01, F6, F6, F7), V(12, 0E, 0E, 1C), \ + V(A3, 61, 61, C2), V(5F, 35, 35, 6A), V(F9, 57, 57, AE), V(D0, B9, B9, 69), \ + V(91, 86, 86, 17), V(58, C1, C1, 99), V(27, 1D, 1D, 3A), V(B9, 9E, 9E, 27), \ + V(38, E1, E1, D9), V(13, F8, F8, EB), V(B3, 98, 98, 2B), V(33, 11, 11, 22), \ + V(BB, 69, 69, D2), V(70, D9, D9, A9), V(89, 8E, 8E, 07), V(A7, 94, 94, 33), \ + V(B6, 9B, 9B, 2D), V(22, 1E, 1E, 3C), V(92, 87, 87, 15), V(20, E9, E9, C9), \ + V(49, CE, CE, 87), V(FF, 55, 55, AA), V(78, 28, 28, 50), V(7A, DF, DF, A5), \ + V(8F, 8C, 8C, 03), V(F8, A1, A1, 59), V(80, 89, 89, 09), V(17, 0D, 0D, 1A), \ + V(DA, BF, BF, 65), V(31, E6, E6, D7), V(C6, 42, 42, 84), V(B8, 68, 68, D0), \ + V(C3, 41, 41, 82), V(B0, 99, 99, 29), V(77, 2D, 2D, 5A), V(11, 0F, 0F, 1E), \ + V(CB, B0, B0, 7B), V(FC, 54, 54, A8), V(D6, BB, BB, 6D), V(3A, 16, 16, 2C) + +#if !defined(MBEDTLS_AES_ENCRYPT_ALT) +#define V(a, b, c, d) 0x##a##b##c##d +static const uint32_t FT0[256] = { FT }; +#undef V + +#if !defined(MBEDTLS_AES_FEWER_TABLES) + +#define V(a, b, c, d) 0x##b##c##d##a +static const uint32_t FT1[256] = { FT }; +#undef V + +#define V(a, b, c, d) 0x##c##d##a##b +static const uint32_t FT2[256] = { FT }; +#undef V + +#define V(a, b, c, d) 0x##d##a##b##c +static const uint32_t FT3[256] = { FT }; +#undef V + +#endif /* !MBEDTLS_AES_FEWER_TABLES */ + +#endif /* !defined(MBEDTLS_AES_ENCRYPT_ALT) */ + +#undef FT + +#if !defined(MBEDTLS_AES_DECRYPT_ALT) +/* + * Reverse S-box + */ +static const unsigned char RSb[256] = +{ + 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, + 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, + 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, + 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, + 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, + 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, + 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, + 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, + 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, + 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, + 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, + 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, + 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, + 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, + 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, + 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, + 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, + 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, + 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, + 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, + 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, + 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, + 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, + 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, + 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, + 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, + 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, + 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, + 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, + 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D +}; +#endif /* defined(MBEDTLS_AES_DECRYPT_ALT)) */ + +/* + * Reverse tables + */ +#define RT \ +\ + V(50, A7, F4, 51), V(53, 65, 41, 7E), V(C3, A4, 17, 1A), V(96, 5E, 27, 3A), \ + V(CB, 6B, AB, 3B), V(F1, 45, 9D, 1F), V(AB, 58, FA, AC), V(93, 03, E3, 4B), \ + V(55, FA, 30, 20), V(F6, 6D, 76, AD), V(91, 76, CC, 88), V(25, 4C, 02, F5), \ + V(FC, D7, E5, 4F), V(D7, CB, 2A, C5), V(80, 44, 35, 26), V(8F, A3, 62, B5), \ + V(49, 5A, B1, DE), V(67, 1B, BA, 25), V(98, 0E, EA, 45), V(E1, C0, FE, 5D), \ + V(02, 75, 2F, C3), V(12, F0, 4C, 81), V(A3, 97, 46, 8D), V(C6, F9, D3, 6B), \ + V(E7, 5F, 8F, 03), V(95, 9C, 92, 15), V(EB, 7A, 6D, BF), V(DA, 59, 52, 95), \ + V(2D, 83, BE, D4), V(D3, 21, 74, 58), V(29, 69, E0, 49), V(44, C8, C9, 8E), \ + V(6A, 89, C2, 75), V(78, 79, 8E, F4), V(6B, 3E, 58, 99), V(DD, 71, B9, 27), \ + V(B6, 4F, E1, BE), V(17, AD, 88, F0), V(66, AC, 20, C9), V(B4, 3A, CE, 7D), \ + V(18, 4A, DF, 63), V(82, 31, 1A, E5), V(60, 33, 51, 97), V(45, 7F, 53, 62), \ + V(E0, 77, 64, B1), V(84, AE, 6B, BB), V(1C, A0, 81, FE), V(94, 2B, 08, F9), \ + V(58, 68, 48, 70), V(19, FD, 45, 8F), V(87, 6C, DE, 94), V(B7, F8, 7B, 52), \ + V(23, D3, 73, AB), V(E2, 02, 4B, 72), V(57, 8F, 1F, E3), V(2A, AB, 55, 66), \ + V(07, 28, EB, B2), V(03, C2, B5, 2F), V(9A, 7B, C5, 86), V(A5, 08, 37, D3), \ + V(F2, 87, 28, 30), V(B2, A5, BF, 23), V(BA, 6A, 03, 02), V(5C, 82, 16, ED), \ + V(2B, 1C, CF, 8A), V(92, B4, 79, A7), V(F0, F2, 07, F3), V(A1, E2, 69, 4E), \ + V(CD, F4, DA, 65), V(D5, BE, 05, 06), V(1F, 62, 34, D1), V(8A, FE, A6, C4), \ + V(9D, 53, 2E, 34), V(A0, 55, F3, A2), V(32, E1, 8A, 05), V(75, EB, F6, A4), \ + V(39, EC, 83, 0B), V(AA, EF, 60, 40), V(06, 9F, 71, 5E), V(51, 10, 6E, BD), \ + V(F9, 8A, 21, 3E), V(3D, 06, DD, 96), V(AE, 05, 3E, DD), V(46, BD, E6, 4D), \ + V(B5, 8D, 54, 91), V(05, 5D, C4, 71), V(6F, D4, 06, 04), V(FF, 15, 50, 60), \ + V(24, FB, 98, 19), V(97, E9, BD, D6), V(CC, 43, 40, 89), V(77, 9E, D9, 67), \ + V(BD, 42, E8, B0), V(88, 8B, 89, 07), V(38, 5B, 19, E7), V(DB, EE, C8, 79), \ + V(47, 0A, 7C, A1), V(E9, 0F, 42, 7C), V(C9, 1E, 84, F8), V(00, 00, 00, 00), \ + V(83, 86, 80, 09), V(48, ED, 2B, 32), V(AC, 70, 11, 1E), V(4E, 72, 5A, 6C), \ + V(FB, FF, 0E, FD), V(56, 38, 85, 0F), V(1E, D5, AE, 3D), V(27, 39, 2D, 36), \ + V(64, D9, 0F, 0A), V(21, A6, 5C, 68), V(D1, 54, 5B, 9B), V(3A, 2E, 36, 24), \ + V(B1, 67, 0A, 0C), V(0F, E7, 57, 93), V(D2, 96, EE, B4), V(9E, 91, 9B, 1B), \ + V(4F, C5, C0, 80), V(A2, 20, DC, 61), V(69, 4B, 77, 5A), V(16, 1A, 12, 1C), \ + V(0A, BA, 93, E2), V(E5, 2A, A0, C0), V(43, E0, 22, 3C), V(1D, 17, 1B, 12), \ + V(0B, 0D, 09, 0E), V(AD, C7, 8B, F2), V(B9, A8, B6, 2D), V(C8, A9, 1E, 14), \ + V(85, 19, F1, 57), V(4C, 07, 75, AF), V(BB, DD, 99, EE), V(FD, 60, 7F, A3), \ + V(9F, 26, 01, F7), V(BC, F5, 72, 5C), V(C5, 3B, 66, 44), V(34, 7E, FB, 5B), \ + V(76, 29, 43, 8B), V(DC, C6, 23, CB), V(68, FC, ED, B6), V(63, F1, E4, B8), \ + V(CA, DC, 31, D7), V(10, 85, 63, 42), V(40, 22, 97, 13), V(20, 11, C6, 84), \ + V(7D, 24, 4A, 85), V(F8, 3D, BB, D2), V(11, 32, F9, AE), V(6D, A1, 29, C7), \ + V(4B, 2F, 9E, 1D), V(F3, 30, B2, DC), V(EC, 52, 86, 0D), V(D0, E3, C1, 77), \ + V(6C, 16, B3, 2B), V(99, B9, 70, A9), V(FA, 48, 94, 11), V(22, 64, E9, 47), \ + V(C4, 8C, FC, A8), V(1A, 3F, F0, A0), V(D8, 2C, 7D, 56), V(EF, 90, 33, 22), \ + V(C7, 4E, 49, 87), V(C1, D1, 38, D9), V(FE, A2, CA, 8C), V(36, 0B, D4, 98), \ + V(CF, 81, F5, A6), V(28, DE, 7A, A5), V(26, 8E, B7, DA), V(A4, BF, AD, 3F), \ + V(E4, 9D, 3A, 2C), V(0D, 92, 78, 50), V(9B, CC, 5F, 6A), V(62, 46, 7E, 54), \ + V(C2, 13, 8D, F6), V(E8, B8, D8, 90), V(5E, F7, 39, 2E), V(F5, AF, C3, 82), \ + V(BE, 80, 5D, 9F), V(7C, 93, D0, 69), V(A9, 2D, D5, 6F), V(B3, 12, 25, CF), \ + V(3B, 99, AC, C8), V(A7, 7D, 18, 10), V(6E, 63, 9C, E8), V(7B, BB, 3B, DB), \ + V(09, 78, 26, CD), V(F4, 18, 59, 6E), V(01, B7, 9A, EC), V(A8, 9A, 4F, 83), \ + V(65, 6E, 95, E6), V(7E, E6, FF, AA), V(08, CF, BC, 21), V(E6, E8, 15, EF), \ + V(D9, 9B, E7, BA), V(CE, 36, 6F, 4A), V(D4, 09, 9F, EA), V(D6, 7C, B0, 29), \ + V(AF, B2, A4, 31), V(31, 23, 3F, 2A), V(30, 94, A5, C6), V(C0, 66, A2, 35), \ + V(37, BC, 4E, 74), V(A6, CA, 82, FC), V(B0, D0, 90, E0), V(15, D8, A7, 33), \ + V(4A, 98, 04, F1), V(F7, DA, EC, 41), V(0E, 50, CD, 7F), V(2F, F6, 91, 17), \ + V(8D, D6, 4D, 76), V(4D, B0, EF, 43), V(54, 4D, AA, CC), V(DF, 04, 96, E4), \ + V(E3, B5, D1, 9E), V(1B, 88, 6A, 4C), V(B8, 1F, 2C, C1), V(7F, 51, 65, 46), \ + V(04, EA, 5E, 9D), V(5D, 35, 8C, 01), V(73, 74, 87, FA), V(2E, 41, 0B, FB), \ + V(5A, 1D, 67, B3), V(52, D2, DB, 92), V(33, 56, 10, E9), V(13, 47, D6, 6D), \ + V(8C, 61, D7, 9A), V(7A, 0C, A1, 37), V(8E, 14, F8, 59), V(89, 3C, 13, EB), \ + V(EE, 27, A9, CE), V(35, C9, 61, B7), V(ED, E5, 1C, E1), V(3C, B1, 47, 7A), \ + V(59, DF, D2, 9C), V(3F, 73, F2, 55), V(79, CE, 14, 18), V(BF, 37, C7, 73), \ + V(EA, CD, F7, 53), V(5B, AA, FD, 5F), V(14, 6F, 3D, DF), V(86, DB, 44, 78), \ + V(81, F3, AF, CA), V(3E, C4, 68, B9), V(2C, 34, 24, 38), V(5F, 40, A3, C2), \ + V(72, C3, 1D, 16), V(0C, 25, E2, BC), V(8B, 49, 3C, 28), V(41, 95, 0D, FF), \ + V(71, 01, A8, 39), V(DE, B3, 0C, 08), V(9C, E4, B4, D8), V(90, C1, 56, 64), \ + V(61, 84, CB, 7B), V(70, B6, 32, D5), V(74, 5C, 6C, 48), V(42, 57, B8, D0) + +#if !defined(MBEDTLS_AES_DECRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) + +#define V(a, b, c, d) 0x##a##b##c##d +static const uint32_t RT0[256] = { RT }; +#undef V + +#if !defined(MBEDTLS_AES_FEWER_TABLES) + +#define V(a, b, c, d) 0x##b##c##d##a +static const uint32_t RT1[256] = { RT }; +#undef V + +#define V(a, b, c, d) 0x##c##d##a##b +static const uint32_t RT2[256] = { RT }; +#undef V + +#define V(a, b, c, d) 0x##d##a##b##c +static const uint32_t RT3[256] = { RT }; +#undef V + +#endif /* !MBEDTLS_AES_FEWER_TABLES */ + +#endif /* !defined(MBEDTLS_AES_DECRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) */ + +#undef RT + +#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT) +/* + * Round constants + */ +static const uint32_t round_constants[10] = +{ + 0x00000001, 0x00000002, 0x00000004, 0x00000008, + 0x00000010, 0x00000020, 0x00000040, 0x00000080, + 0x0000001B, 0x00000036 +}; +#endif /* !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */ + +#else /* MBEDTLS_AES_ROM_TABLES */ + +/* + * Forward S-box & tables + */ +#if !defined(MBEDTLS_AES_ENCRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) || \ + !defined(MBEDTLS_AES_SETKEY_DEC_ALT) +static unsigned char FSb[256]; +#endif /* !defined(MBEDTLS_AES_ENCRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) || \ + !defined(MBEDTLS_AES_SETKEY_DEC_ALT) */ +#if !defined(MBEDTLS_AES_ENCRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) +static uint32_t FT0[256]; +#if !defined(MBEDTLS_AES_FEWER_TABLES) +static uint32_t FT1[256]; +static uint32_t FT2[256]; +static uint32_t FT3[256]; +#endif /* !MBEDTLS_AES_FEWER_TABLES */ +#endif /* !defined(MBEDTLS_AES_ENCRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */ + +/* + * Reverse S-box & tables + */ +#if !(defined(MBEDTLS_AES_SETKEY_ENC_ALT) && defined(MBEDTLS_AES_DECRYPT_ALT)) +static unsigned char RSb[256]; +#endif /* !(defined(MBEDTLS_AES_SETKEY_ENC_ALT) && defined(MBEDTLS_AES_DECRYPT_ALT)) */ + +#if !defined(MBEDTLS_AES_DECRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) +static uint32_t RT0[256]; +#if !defined(MBEDTLS_AES_FEWER_TABLES) +static uint32_t RT1[256]; +static uint32_t RT2[256]; +static uint32_t RT3[256]; +#endif /* !MBEDTLS_AES_FEWER_TABLES */ +#endif /* !defined(MBEDTLS_AES_DECRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) */ + +#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT) +/* + * Round constants + */ +static uint32_t round_constants[10]; + +/* + * Tables generation code + */ +#define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24) +#define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00)) +#define MUL(x, y) (((x) && (y)) ? pow[(log[(x)]+log[(y)]) % 255] : 0) + +static int aes_init_done = 0; + +static void aes_gen_tables(void) +{ + int i, x, y, z; + int pow[256]; + int log[256]; + + /* + * compute pow and log tables over GF(2^8) + */ + for (i = 0, x = 1; i < 256; i++) { + pow[i] = x; + log[x] = i; + x = MBEDTLS_BYTE_0(x ^ XTIME(x)); + } + + /* + * calculate the round constants + */ + for (i = 0, x = 1; i < 10; i++) { + round_constants[i] = (uint32_t) x; + x = MBEDTLS_BYTE_0(XTIME(x)); + } + + /* + * generate the forward and reverse S-boxes + */ + FSb[0x00] = 0x63; + RSb[0x63] = 0x00; + + for (i = 1; i < 256; i++) { + x = pow[255 - log[i]]; + + y = x; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7)); + x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7)); + x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7)); + x ^= y; y = MBEDTLS_BYTE_0((y << 1) | (y >> 7)); + x ^= y ^ 0x63; + + FSb[i] = (unsigned char) x; + RSb[x] = (unsigned char) i; + } + + /* + * generate the forward and reverse tables + */ + for (i = 0; i < 256; i++) { + x = FSb[i]; + y = MBEDTLS_BYTE_0(XTIME(x)); + z = MBEDTLS_BYTE_0(y ^ x); + + FT0[i] = ((uint32_t) y) ^ + ((uint32_t) x << 8) ^ + ((uint32_t) x << 16) ^ + ((uint32_t) z << 24); + +#if !defined(MBEDTLS_AES_FEWER_TABLES) + FT1[i] = ROTL8(FT0[i]); + FT2[i] = ROTL8(FT1[i]); + FT3[i] = ROTL8(FT2[i]); +#endif /* !MBEDTLS_AES_FEWER_TABLES */ + + x = RSb[i]; + +#if !defined(MBEDTLS_AES_DECRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) + RT0[i] = ((uint32_t) MUL(0x0E, x)) ^ + ((uint32_t) MUL(0x09, x) << 8) ^ + ((uint32_t) MUL(0x0D, x) << 16) ^ + ((uint32_t) MUL(0x0B, x) << 24); + +#if !defined(MBEDTLS_AES_FEWER_TABLES) + RT1[i] = ROTL8(RT0[i]); + RT2[i] = ROTL8(RT1[i]); + RT3[i] = ROTL8(RT2[i]); +#endif /* !MBEDTLS_AES_FEWER_TABLES */ +#endif /* !defined(MBEDTLS_AES_DECRYPT_ALT) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) */ + } +} + +#endif /* !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */ + +#undef ROTL8 + +#endif /* MBEDTLS_AES_ROM_TABLES */ + +#if defined(MBEDTLS_AES_FEWER_TABLES) + +#define ROTL8(x) ((uint32_t) ((x) << 8) + (uint32_t) ((x) >> 24)) +#define ROTL16(x) ((uint32_t) ((x) << 16) + (uint32_t) ((x) >> 16)) +#define ROTL24(x) ((uint32_t) ((x) << 24) + (uint32_t) ((x) >> 8)) + +#define AES_RT0(idx) RT0[idx] +#define AES_RT1(idx) ROTL8(RT0[idx]) +#define AES_RT2(idx) ROTL16(RT0[idx]) +#define AES_RT3(idx) ROTL24(RT0[idx]) + +#define AES_FT0(idx) FT0[idx] +#define AES_FT1(idx) ROTL8(FT0[idx]) +#define AES_FT2(idx) ROTL16(FT0[idx]) +#define AES_FT3(idx) ROTL24(FT0[idx]) + +#else /* MBEDTLS_AES_FEWER_TABLES */ + +#define AES_RT0(idx) RT0[idx] +#define AES_RT1(idx) RT1[idx] +#define AES_RT2(idx) RT2[idx] +#define AES_RT3(idx) RT3[idx] + +#define AES_FT0(idx) FT0[idx] +#define AES_FT1(idx) FT1[idx] +#define AES_FT2(idx) FT2[idx] +#define AES_FT3(idx) FT3[idx] + +#endif /* MBEDTLS_AES_FEWER_TABLES */ + +void mbedtls_aes_init(mbedtls_aes_context *ctx) +{ + AES_VALIDATE(ctx != NULL); + + memset(ctx, 0, sizeof(mbedtls_aes_context)); +} + +void mbedtls_aes_free(mbedtls_aes_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aes_context)); +} + +#if defined(MBEDTLS_CIPHER_MODE_XTS) +void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx) +{ + AES_VALIDATE(ctx != NULL); + + mbedtls_aes_init(&ctx->crypt); + mbedtls_aes_init(&ctx->tweak); +} + +void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_aes_free(&ctx->crypt); + mbedtls_aes_free(&ctx->tweak); +} +#endif /* MBEDTLS_CIPHER_MODE_XTS */ + +/* Some implementations need the round keys to be aligned. + * Return an offset to be added to buf, such that (buf + offset) is + * correctly aligned. + * Note that the offset is in units of elements of buf, i.e. 32-bit words, + * i.e. an offset of 1 means 4 bytes and so on. + */ +#if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE) || \ + (defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2) +#define MAY_NEED_TO_ALIGN +#endif + +#if defined(MAY_NEED_TO_ALIGN) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) || \ + !defined(MBEDTLS_AES_SETKEY_ENC_ALT) +static unsigned mbedtls_aes_rk_offset(uint32_t *buf) +{ +#if defined(MAY_NEED_TO_ALIGN) + int align_16_bytes = 0; + +#if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE) + if (aes_padlock_ace == -1) { + aes_padlock_ace = mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE); + } + if (aes_padlock_ace) { + align_16_bytes = 1; + } +#endif + +#if defined(MBEDTLS_AESNI_C) && MBEDTLS_AESNI_HAVE_CODE == 2 + if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) { + align_16_bytes = 1; + } +#endif + + if (align_16_bytes) { + /* These implementations needs 16-byte alignment + * for the round key array. */ + unsigned delta = ((uintptr_t) buf & 0x0000000fU) / 4; + if (delta == 0) { + return 0; + } else { + return 4 - delta; // 16 bytes = 4 uint32_t + } + } +#else /* MAY_NEED_TO_ALIGN */ + (void) buf; +#endif /* MAY_NEED_TO_ALIGN */ + + return 0; +} +#endif /* defined(MAY_NEED_TO_ALIGN) || !defined(MBEDTLS_AES_SETKEY_DEC_ALT) || \ + !defined(MBEDTLS_AES_SETKEY_ENC_ALT) */ + +/* + * AES key schedule (encryption) + */ +#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT) +int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key, + unsigned int keybits) +{ + unsigned int i; + uint32_t *RK; + + AES_VALIDATE_RET(ctx != NULL); + AES_VALIDATE_RET(key != NULL); + + switch (keybits) { + case 128: ctx->nr = 10; break; + case 192: ctx->nr = 12; break; + case 256: ctx->nr = 14; break; + default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH; + } + +#if !defined(MBEDTLS_AES_ROM_TABLES) + if (aes_init_done == 0) { + aes_gen_tables(); + aes_init_done = 1; + } +#endif + + ctx->rk = RK = ctx->buf + mbedtls_aes_rk_offset(ctx->buf); + +#if defined(MBEDTLS_AESNI_HAVE_CODE) + if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) { + return mbedtls_aesni_setkey_enc((unsigned char *) ctx->rk, key, keybits); + } +#endif + + for (i = 0; i < (keybits >> 5); i++) { + RK[i] = MBEDTLS_GET_UINT32_LE(key, i << 2); + } + + switch (ctx->nr) { + case 10: + + for (i = 0; i < 10; i++, RK += 4) { + RK[4] = RK[0] ^ round_constants[i] ^ + ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[3])]) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[3])] << 8) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[3])] << 16) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[3])] << 24); + + RK[5] = RK[1] ^ RK[4]; + RK[6] = RK[2] ^ RK[5]; + RK[7] = RK[3] ^ RK[6]; + } + break; + + case 12: + + for (i = 0; i < 8; i++, RK += 6) { + RK[6] = RK[0] ^ round_constants[i] ^ + ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[5])]) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[5])] << 8) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[5])] << 16) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[5])] << 24); + + RK[7] = RK[1] ^ RK[6]; + RK[8] = RK[2] ^ RK[7]; + RK[9] = RK[3] ^ RK[8]; + RK[10] = RK[4] ^ RK[9]; + RK[11] = RK[5] ^ RK[10]; + } + break; + + case 14: + + for (i = 0; i < 7; i++, RK += 8) { + RK[8] = RK[0] ^ round_constants[i] ^ + ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[7])]) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[7])] << 8) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[7])] << 16) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[7])] << 24); + + RK[9] = RK[1] ^ RK[8]; + RK[10] = RK[2] ^ RK[9]; + RK[11] = RK[3] ^ RK[10]; + + RK[12] = RK[4] ^ + ((uint32_t) FSb[MBEDTLS_BYTE_0(RK[11])]) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_1(RK[11])] << 8) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_2(RK[11])] << 16) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_3(RK[11])] << 24); + + RK[13] = RK[5] ^ RK[12]; + RK[14] = RK[6] ^ RK[13]; + RK[15] = RK[7] ^ RK[14]; + } + break; + } + + return 0; +} +#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */ + +/* + * AES key schedule (decryption) + */ +#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT) +int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key, + unsigned int keybits) +{ + int i, j, ret; + mbedtls_aes_context cty; + uint32_t *RK; + uint32_t *SK; + + AES_VALIDATE_RET(ctx != NULL); + AES_VALIDATE_RET(key != NULL); + + mbedtls_aes_init(&cty); + + ctx->rk = RK = ctx->buf + mbedtls_aes_rk_offset(ctx->buf); + + /* Also checks keybits */ + if ((ret = mbedtls_aes_setkey_enc(&cty, key, keybits)) != 0) { + goto exit; + } + + ctx->nr = cty.nr; + +#if defined(MBEDTLS_AESNI_HAVE_CODE) + if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) { + mbedtls_aesni_inverse_key((unsigned char *) ctx->rk, + (const unsigned char *) cty.rk, ctx->nr); + goto exit; + } +#endif + + SK = cty.rk + cty.nr * 4; + + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + + for (i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8) { + for (j = 0; j < 4; j++, SK++) { + *RK++ = AES_RT0(FSb[MBEDTLS_BYTE_0(*SK)]) ^ + AES_RT1(FSb[MBEDTLS_BYTE_1(*SK)]) ^ + AES_RT2(FSb[MBEDTLS_BYTE_2(*SK)]) ^ + AES_RT3(FSb[MBEDTLS_BYTE_3(*SK)]); + } + } + + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + +exit: + mbedtls_aes_free(&cty); + + return ret; +} +#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */ + +#if defined(MBEDTLS_CIPHER_MODE_XTS) +static int mbedtls_aes_xts_decode_keys(const unsigned char *key, + unsigned int keybits, + const unsigned char **key1, + unsigned int *key1bits, + const unsigned char **key2, + unsigned int *key2bits) +{ + const unsigned int half_keybits = keybits / 2; + const unsigned int half_keybytes = half_keybits / 8; + + switch (keybits) { + case 256: break; + case 512: break; + default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH; + } + + *key1bits = half_keybits; + *key2bits = half_keybits; + *key1 = &key[0]; + *key2 = &key[half_keybytes]; + + return 0; +} + +int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx, + const unsigned char *key, + unsigned int keybits) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const unsigned char *key1, *key2; + unsigned int key1bits, key2bits; + + AES_VALIDATE_RET(ctx != NULL); + AES_VALIDATE_RET(key != NULL); + + ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits, + &key2, &key2bits); + if (ret != 0) { + return ret; + } + + /* Set the tweak key. Always set tweak key for the encryption mode. */ + ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits); + if (ret != 0) { + return ret; + } + + /* Set crypt key for encryption. */ + return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits); +} + +int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx, + const unsigned char *key, + unsigned int keybits) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const unsigned char *key1, *key2; + unsigned int key1bits, key2bits; + + AES_VALIDATE_RET(ctx != NULL); + AES_VALIDATE_RET(key != NULL); + + ret = mbedtls_aes_xts_decode_keys(key, keybits, &key1, &key1bits, + &key2, &key2bits); + if (ret != 0) { + return ret; + } + + /* Set the tweak key. Always set tweak key for encryption. */ + ret = mbedtls_aes_setkey_enc(&ctx->tweak, key2, key2bits); + if (ret != 0) { + return ret; + } + + /* Set crypt key for decryption. */ + return mbedtls_aes_setkey_dec(&ctx->crypt, key1, key1bits); +} +#endif /* MBEDTLS_CIPHER_MODE_XTS */ + +#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \ + do \ + { \ + (X0) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y0)) ^ \ + AES_FT1(MBEDTLS_BYTE_1(Y1)) ^ \ + AES_FT2(MBEDTLS_BYTE_2(Y2)) ^ \ + AES_FT3(MBEDTLS_BYTE_3(Y3)); \ + \ + (X1) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y1)) ^ \ + AES_FT1(MBEDTLS_BYTE_1(Y2)) ^ \ + AES_FT2(MBEDTLS_BYTE_2(Y3)) ^ \ + AES_FT3(MBEDTLS_BYTE_3(Y0)); \ + \ + (X2) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y2)) ^ \ + AES_FT1(MBEDTLS_BYTE_1(Y3)) ^ \ + AES_FT2(MBEDTLS_BYTE_2(Y0)) ^ \ + AES_FT3(MBEDTLS_BYTE_3(Y1)); \ + \ + (X3) = *RK++ ^ AES_FT0(MBEDTLS_BYTE_0(Y3)) ^ \ + AES_FT1(MBEDTLS_BYTE_1(Y0)) ^ \ + AES_FT2(MBEDTLS_BYTE_2(Y1)) ^ \ + AES_FT3(MBEDTLS_BYTE_3(Y2)); \ + } while (0) + +#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3) \ + do \ + { \ + (X0) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y0)) ^ \ + AES_RT1(MBEDTLS_BYTE_1(Y3)) ^ \ + AES_RT2(MBEDTLS_BYTE_2(Y2)) ^ \ + AES_RT3(MBEDTLS_BYTE_3(Y1)); \ + \ + (X1) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y1)) ^ \ + AES_RT1(MBEDTLS_BYTE_1(Y0)) ^ \ + AES_RT2(MBEDTLS_BYTE_2(Y3)) ^ \ + AES_RT3(MBEDTLS_BYTE_3(Y2)); \ + \ + (X2) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y2)) ^ \ + AES_RT1(MBEDTLS_BYTE_1(Y1)) ^ \ + AES_RT2(MBEDTLS_BYTE_2(Y0)) ^ \ + AES_RT3(MBEDTLS_BYTE_3(Y3)); \ + \ + (X3) = *RK++ ^ AES_RT0(MBEDTLS_BYTE_0(Y3)) ^ \ + AES_RT1(MBEDTLS_BYTE_1(Y2)) ^ \ + AES_RT2(MBEDTLS_BYTE_2(Y1)) ^ \ + AES_RT3(MBEDTLS_BYTE_3(Y0)); \ + } while (0) + +/* + * AES-ECB block encryption + */ +#if !defined(MBEDTLS_AES_ENCRYPT_ALT) +int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx, + const unsigned char input[16], + unsigned char output[16]) +{ + int i; + uint32_t *RK = ctx->rk; + struct { + uint32_t X[4]; + uint32_t Y[4]; + } t; + + t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++; + t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++; + t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++; + t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++; + + for (i = (ctx->nr >> 1) - 1; i > 0; i--) { + AES_FROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]); + AES_FROUND(t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3]); + } + + AES_FROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]); + + t.X[0] = *RK++ ^ \ + ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[0])]) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[3])] << 24); + + t.X[1] = *RK++ ^ \ + ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[1])]) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[0])] << 24); + + t.X[2] = *RK++ ^ \ + ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[2])]) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[1])] << 24); + + t.X[3] = *RK++ ^ \ + ((uint32_t) FSb[MBEDTLS_BYTE_0(t.Y[3])]) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^ + ((uint32_t) FSb[MBEDTLS_BYTE_3(t.Y[2])] << 24); + + MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0); + MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4); + MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8); + MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12); + + mbedtls_platform_zeroize(&t, sizeof(t)); + + return 0; +} +#endif /* !MBEDTLS_AES_ENCRYPT_ALT */ + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_aes_encrypt(mbedtls_aes_context *ctx, + const unsigned char input[16], + unsigned char output[16]) +{ + MBEDTLS_IGNORE_RETURN(mbedtls_internal_aes_encrypt(ctx, input, output)); +} +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +/* + * AES-ECB block decryption + */ +#if !defined(MBEDTLS_AES_DECRYPT_ALT) +int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx, + const unsigned char input[16], + unsigned char output[16]) +{ + int i; + uint32_t *RK = ctx->rk; + struct { + uint32_t X[4]; + uint32_t Y[4]; + } t; + + t.X[0] = MBEDTLS_GET_UINT32_LE(input, 0); t.X[0] ^= *RK++; + t.X[1] = MBEDTLS_GET_UINT32_LE(input, 4); t.X[1] ^= *RK++; + t.X[2] = MBEDTLS_GET_UINT32_LE(input, 8); t.X[2] ^= *RK++; + t.X[3] = MBEDTLS_GET_UINT32_LE(input, 12); t.X[3] ^= *RK++; + + for (i = (ctx->nr >> 1) - 1; i > 0; i--) { + AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]); + AES_RROUND(t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3]); + } + + AES_RROUND(t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3]); + + t.X[0] = *RK++ ^ \ + ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[0])]) ^ + ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[3])] << 8) ^ + ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[2])] << 16) ^ + ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[1])] << 24); + + t.X[1] = *RK++ ^ \ + ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[1])]) ^ + ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[0])] << 8) ^ + ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[3])] << 16) ^ + ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[2])] << 24); + + t.X[2] = *RK++ ^ \ + ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[2])]) ^ + ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[1])] << 8) ^ + ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[0])] << 16) ^ + ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[3])] << 24); + + t.X[3] = *RK++ ^ \ + ((uint32_t) RSb[MBEDTLS_BYTE_0(t.Y[3])]) ^ + ((uint32_t) RSb[MBEDTLS_BYTE_1(t.Y[2])] << 8) ^ + ((uint32_t) RSb[MBEDTLS_BYTE_2(t.Y[1])] << 16) ^ + ((uint32_t) RSb[MBEDTLS_BYTE_3(t.Y[0])] << 24); + + MBEDTLS_PUT_UINT32_LE(t.X[0], output, 0); + MBEDTLS_PUT_UINT32_LE(t.X[1], output, 4); + MBEDTLS_PUT_UINT32_LE(t.X[2], output, 8); + MBEDTLS_PUT_UINT32_LE(t.X[3], output, 12); + + mbedtls_platform_zeroize(&t, sizeof(t)); + + return 0; +} +#endif /* !MBEDTLS_AES_DECRYPT_ALT */ + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_aes_decrypt(mbedtls_aes_context *ctx, + const unsigned char input[16], + unsigned char output[16]) +{ + MBEDTLS_IGNORE_RETURN(mbedtls_internal_aes_decrypt(ctx, input, output)); +} +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +#if defined(MAY_NEED_TO_ALIGN) +/* VIA Padlock and our intrinsics-based implementation of AESNI require + * the round keys to be aligned on a 16-byte boundary. We take care of this + * before creating them, but the AES context may have moved (this can happen + * if the library is called from a language with managed memory), and in later + * calls it might have a different alignment with respect to 16-byte memory. + * So we may need to realign. + * NOTE: In the LTS branch, the context contains a pointer to within itself, + * so if it has been moved, things will probably go pear-shaped. We keep this + * code for compatibility with the development branch, in case of future changes. + */ +static void aes_maybe_realign(mbedtls_aes_context *ctx) +{ + unsigned current_offset = (unsigned) (ctx->rk - ctx->buf); + unsigned new_offset = mbedtls_aes_rk_offset(ctx->buf); + if (new_offset != current_offset) { + memmove(ctx->buf + new_offset, // new address + ctx->buf + current_offset, // current address + (ctx->nr + 1) * 16); // number of round keys * bytes per rk + ctx->rk = ctx->buf + new_offset; + } +} +#endif + +/* + * AES-ECB block encryption/decryption + */ +int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16]) +{ + AES_VALIDATE_RET(ctx != NULL); + AES_VALIDATE_RET(input != NULL); + AES_VALIDATE_RET(output != NULL); + AES_VALIDATE_RET(mode == MBEDTLS_AES_ENCRYPT || + mode == MBEDTLS_AES_DECRYPT); + +#if defined(MAY_NEED_TO_ALIGN) + aes_maybe_realign(ctx); +#endif + +#if defined(MBEDTLS_AESNI_HAVE_CODE) + if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) { + return mbedtls_aesni_crypt_ecb(ctx, mode, input, output); + } +#endif + +#if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE) + if (aes_padlock_ace) { + return mbedtls_padlock_xcryptecb(ctx, mode, input, output); + } +#endif + + if (mode == MBEDTLS_AES_ENCRYPT) { + return mbedtls_internal_aes_encrypt(ctx, input, output); + } else { + return mbedtls_internal_aes_decrypt(ctx, input, output); + } +} + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/* + * AES-CBC buffer encryption/decryption + */ +int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output) +{ + int i; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char temp[16]; + + AES_VALIDATE_RET(ctx != NULL); + AES_VALIDATE_RET(mode == MBEDTLS_AES_ENCRYPT || + mode == MBEDTLS_AES_DECRYPT); + AES_VALIDATE_RET(iv != NULL); + AES_VALIDATE_RET(input != NULL); + AES_VALIDATE_RET(output != NULL); + + if (length % 16) { + return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH; + } + +#if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE) + if (aes_padlock_ace) { + if (mbedtls_padlock_xcryptcbc(ctx, mode, length, iv, input, output) == 0) { + return 0; + } + + // If padlock data misaligned, we just fall back to + // unaccelerated mode + // + } +#endif + + if (mode == MBEDTLS_AES_DECRYPT) { + while (length > 0) { + memcpy(temp, input, 16); + ret = mbedtls_aes_crypt_ecb(ctx, mode, input, output); + if (ret != 0) { + goto exit; + } + + for (i = 0; i < 16; i++) { + output[i] = (unsigned char) (output[i] ^ iv[i]); + } + + memcpy(iv, temp, 16); + + input += 16; + output += 16; + length -= 16; + } + } else { + while (length > 0) { + for (i = 0; i < 16; i++) { + output[i] = (unsigned char) (input[i] ^ iv[i]); + } + + ret = mbedtls_aes_crypt_ecb(ctx, mode, output, output); + if (ret != 0) { + goto exit; + } + memcpy(iv, output, 16); + + input += 16; + output += 16; + length -= 16; + } + } + ret = 0; + +exit: + return ret; +} +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_XTS) + +typedef unsigned char mbedtls_be128[16]; + +/* + * GF(2^128) multiplication function + * + * This function multiplies a field element by x in the polynomial field + * representation. It uses 64-bit word operations to gain speed but compensates + * for machine endianness and hence works correctly on both big and little + * endian machines. + */ +static void mbedtls_gf128mul_x_ble(unsigned char r[16], + const unsigned char x[16]) +{ + uint64_t a, b, ra, rb; + + a = MBEDTLS_GET_UINT64_LE(x, 0); + b = MBEDTLS_GET_UINT64_LE(x, 8); + + ra = (a << 1) ^ 0x0087 >> (8 - ((b >> 63) << 3)); + rb = (a >> 63) | (b << 1); + + MBEDTLS_PUT_UINT64_LE(ra, r, 0); + MBEDTLS_PUT_UINT64_LE(rb, r, 8); +} + +/* + * AES-XTS buffer encryption/decryption + */ +int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx, + int mode, + size_t length, + const unsigned char data_unit[16], + const unsigned char *input, + unsigned char *output) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t blocks = length / 16; + size_t leftover = length % 16; + unsigned char tweak[16]; + unsigned char prev_tweak[16]; + unsigned char tmp[16]; + + AES_VALIDATE_RET(ctx != NULL); + AES_VALIDATE_RET(mode == MBEDTLS_AES_ENCRYPT || + mode == MBEDTLS_AES_DECRYPT); + AES_VALIDATE_RET(data_unit != NULL); + AES_VALIDATE_RET(input != NULL); + AES_VALIDATE_RET(output != NULL); + + /* Data units must be at least 16 bytes long. */ + if (length < 16) { + return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH; + } + + /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */ + if (length > (1 << 20) * 16) { + return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH; + } + + /* Compute the tweak. */ + ret = mbedtls_aes_crypt_ecb(&ctx->tweak, MBEDTLS_AES_ENCRYPT, + data_unit, tweak); + if (ret != 0) { + return ret; + } + + while (blocks--) { + size_t i; + + if (leftover && (mode == MBEDTLS_AES_DECRYPT) && blocks == 0) { + /* We are on the last block in a decrypt operation that has + * leftover bytes, so we need to use the next tweak for this block, + * and this tweak for the leftover bytes. Save the current tweak for + * the leftovers and then update the current tweak for use on this, + * the last full block. */ + memcpy(prev_tweak, tweak, sizeof(tweak)); + mbedtls_gf128mul_x_ble(tweak, tweak); + } + + for (i = 0; i < 16; i++) { + tmp[i] = input[i] ^ tweak[i]; + } + + ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp); + if (ret != 0) { + return ret; + } + + for (i = 0; i < 16; i++) { + output[i] = tmp[i] ^ tweak[i]; + } + + /* Update the tweak for the next block. */ + mbedtls_gf128mul_x_ble(tweak, tweak); + + output += 16; + input += 16; + } + + if (leftover) { + /* If we are on the leftover bytes in a decrypt operation, we need to + * use the previous tweak for these bytes (as saved in prev_tweak). */ + unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak; + + /* We are now on the final part of the data unit, which doesn't divide + * evenly by 16. It's time for ciphertext stealing. */ + size_t i; + unsigned char *prev_output = output - 16; + + /* Copy ciphertext bytes from the previous block to our output for each + * byte of ciphertext we won't steal. At the same time, copy the + * remainder of the input for this final round (since the loop bounds + * are the same). */ + for (i = 0; i < leftover; i++) { + output[i] = prev_output[i]; + tmp[i] = input[i] ^ t[i]; + } + + /* Copy ciphertext bytes from the previous block for input in this + * round. */ + for (; i < 16; i++) { + tmp[i] = prev_output[i] ^ t[i]; + } + + ret = mbedtls_aes_crypt_ecb(&ctx->crypt, mode, tmp, tmp); + if (ret != 0) { + return ret; + } + + /* Write the result back to the previous block, overriding the previous + * output we copied. */ + for (i = 0; i < 16; i++) { + prev_output[i] = tmp[i] ^ t[i]; + } + } + + return 0; +} +#endif /* MBEDTLS_CIPHER_MODE_XTS */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +/* + * AES-CFB128 buffer encryption/decryption + */ +int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output) +{ + int c; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n; + + AES_VALIDATE_RET(ctx != NULL); + AES_VALIDATE_RET(mode == MBEDTLS_AES_ENCRYPT || + mode == MBEDTLS_AES_DECRYPT); + AES_VALIDATE_RET(iv_off != NULL); + AES_VALIDATE_RET(iv != NULL); + AES_VALIDATE_RET(input != NULL); + AES_VALIDATE_RET(output != NULL); + + n = *iv_off; + + if (n > 15) { + return MBEDTLS_ERR_AES_BAD_INPUT_DATA; + } + + if (mode == MBEDTLS_AES_DECRYPT) { + while (length--) { + if (n == 0) { + ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv); + if (ret != 0) { + goto exit; + } + } + + c = *input++; + *output++ = (unsigned char) (c ^ iv[n]); + iv[n] = (unsigned char) c; + + n = (n + 1) & 0x0F; + } + } else { + while (length--) { + if (n == 0) { + ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv); + if (ret != 0) { + goto exit; + } + } + + iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++); + + n = (n + 1) & 0x0F; + } + } + + *iv_off = n; + ret = 0; + +exit: + return ret; +} + +/* + * AES-CFB8 buffer encryption/decryption + */ +int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char c; + unsigned char ov[17]; + + AES_VALIDATE_RET(ctx != NULL); + AES_VALIDATE_RET(mode == MBEDTLS_AES_ENCRYPT || + mode == MBEDTLS_AES_DECRYPT); + AES_VALIDATE_RET(iv != NULL); + AES_VALIDATE_RET(input != NULL); + AES_VALIDATE_RET(output != NULL); + while (length--) { + memcpy(ov, iv, 16); + ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv); + if (ret != 0) { + goto exit; + } + + if (mode == MBEDTLS_AES_DECRYPT) { + ov[16] = *input; + } + + c = *output++ = (unsigned char) (iv[0] ^ *input++); + + if (mode == MBEDTLS_AES_ENCRYPT) { + ov[16] = c; + } + + memcpy(iv, ov + 1, 16); + } + ret = 0; + +exit: + return ret; +} +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_OFB) +/* + * AES-OFB (Output Feedback Mode) buffer encryption/decryption + */ +int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx, + size_t length, + size_t *iv_off, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output) +{ + int ret = 0; + size_t n; + + AES_VALIDATE_RET(ctx != NULL); + AES_VALIDATE_RET(iv_off != NULL); + AES_VALIDATE_RET(iv != NULL); + AES_VALIDATE_RET(input != NULL); + AES_VALIDATE_RET(output != NULL); + + n = *iv_off; + + if (n > 15) { + return MBEDTLS_ERR_AES_BAD_INPUT_DATA; + } + + while (length--) { + if (n == 0) { + ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, iv, iv); + if (ret != 0) { + goto exit; + } + } + *output++ = *input++ ^ iv[n]; + + n = (n + 1) & 0x0F; + } + + *iv_off = n; + +exit: + return ret; +} +#endif /* MBEDTLS_CIPHER_MODE_OFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +/* + * AES-CTR buffer encryption/decryption + */ +int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[16], + unsigned char stream_block[16], + const unsigned char *input, + unsigned char *output) +{ + int c, i; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n; + + AES_VALIDATE_RET(ctx != NULL); + AES_VALIDATE_RET(nc_off != NULL); + AES_VALIDATE_RET(nonce_counter != NULL); + AES_VALIDATE_RET(stream_block != NULL); + AES_VALIDATE_RET(input != NULL); + AES_VALIDATE_RET(output != NULL); + + n = *nc_off; + + if (n > 0x0F) { + return MBEDTLS_ERR_AES_BAD_INPUT_DATA; + } + + while (length--) { + if (n == 0) { + ret = mbedtls_aes_crypt_ecb(ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block); + if (ret != 0) { + goto exit; + } + + for (i = 16; i > 0; i--) { + if (++nonce_counter[i - 1] != 0) { + break; + } + } + } + c = *input++; + *output++ = (unsigned char) (c ^ stream_block[n]); + + n = (n + 1) & 0x0F; + } + + *nc_off = n; + ret = 0; + +exit: + return ret; +} +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +#endif /* !MBEDTLS_AES_ALT */ + +#if defined(MBEDTLS_SELF_TEST) +/* + * AES test vectors from: + * + * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip + */ +static const unsigned char aes_test_ecb_dec[3][16] = +{ + { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58, + 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 }, + { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2, + 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 }, + { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D, + 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE } +}; + +static const unsigned char aes_test_ecb_enc[3][16] = +{ + { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73, + 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F }, + { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11, + 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 }, + { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D, + 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 } +}; + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static const unsigned char aes_test_cbc_dec[3][16] = +{ + { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73, + 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 }, + { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75, + 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B }, + { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75, + 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 } +}; + +static const unsigned char aes_test_cbc_enc[3][16] = +{ + { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84, + 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D }, + { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB, + 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 }, + { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5, + 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 } +}; +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +/* + * AES-CFB128 test vectors from: + * + * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + */ +static const unsigned char aes_test_cfb128_key[3][32] = +{ + { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, + 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }, + { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, + 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, + 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }, + { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, + 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, + 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, + 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 } +}; + +static const unsigned char aes_test_cfb128_iv[16] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F +}; + +static const unsigned char aes_test_cfb128_pt[64] = +{ + 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, + 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A, + 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, + 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51, + 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11, + 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF, + 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17, + 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10 +}; + +static const unsigned char aes_test_cfb128_ct[3][64] = +{ + { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20, + 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A, + 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F, + 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B, + 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40, + 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF, + 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E, + 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 }, + { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB, + 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74, + 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21, + 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A, + 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1, + 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9, + 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0, + 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF }, + { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B, + 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60, + 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8, + 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B, + 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92, + 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9, + 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8, + 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 } +}; +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_OFB) +/* + * AES-OFB test vectors from: + * + * https://csrc.nist.gov/publications/detail/sp/800-38a/final + */ +static const unsigned char aes_test_ofb_key[3][32] = +{ + { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, + 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }, + { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, + 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, + 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }, + { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, + 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, + 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, + 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 } +}; + +static const unsigned char aes_test_ofb_iv[16] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F +}; + +static const unsigned char aes_test_ofb_pt[64] = +{ + 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, + 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A, + 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, + 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51, + 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11, + 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF, + 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17, + 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10 +}; + +static const unsigned char aes_test_ofb_ct[3][64] = +{ + { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20, + 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A, + 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03, + 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25, + 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6, + 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc, + 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78, + 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e }, + { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB, + 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74, + 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c, + 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01, + 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f, + 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2, + 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e, + 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a }, + { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B, + 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60, + 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a, + 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d, + 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed, + 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08, + 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8, + 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 } +}; +#endif /* MBEDTLS_CIPHER_MODE_OFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +/* + * AES-CTR test vectors from: + * + * http://www.faqs.org/rfcs/rfc3686.html + */ + +static const unsigned char aes_test_ctr_key[3][16] = +{ + { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC, + 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E }, + { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7, + 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 }, + { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8, + 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC } +}; + +static const unsigned char aes_test_ctr_nonce_counter[3][16] = +{ + { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, + { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59, + 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 }, + { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F, + 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 } +}; + +static const unsigned char aes_test_ctr_pt[3][48] = +{ + { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62, + 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 }, + + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }, + + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23 } +}; + +static const unsigned char aes_test_ctr_ct[3][48] = +{ + { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79, + 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 }, + { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9, + 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88, + 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8, + 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 }, + { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9, + 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7, + 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36, + 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53, + 0x25, 0xB2, 0x07, 0x2F } +}; + +static const int aes_test_ctr_len[3] = +{ 16, 32, 36 }; +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +#if defined(MBEDTLS_CIPHER_MODE_XTS) +/* + * AES-XTS test vectors from: + * + * IEEE P1619/D16 Annex B + * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf + * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf) + */ +static const unsigned char aes_test_xts_key[][32] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 }, + { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, + 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 }, +}; + +static const unsigned char aes_test_xts_pt32[][32] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 }, + { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 }, +}; + +static const unsigned char aes_test_xts_ct32[][32] = +{ + { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec, + 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92, + 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85, + 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e }, + { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e, + 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b, + 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4, + 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 }, + { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a, + 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2, + 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53, + 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 }, +}; + +static const unsigned char aes_test_xts_data_unit[][16] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, +}; + +#endif /* MBEDTLS_CIPHER_MODE_XTS */ + +/* + * Checkup routine + */ +int mbedtls_aes_self_test(int verbose) +{ + int ret = 0, i, j, u, mode; + unsigned int keybits; + unsigned char key[32]; + unsigned char buf[64]; + const unsigned char *aes_tests; +#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \ + defined(MBEDTLS_CIPHER_MODE_OFB) + unsigned char iv[16]; +#endif +#if defined(MBEDTLS_CIPHER_MODE_CBC) + unsigned char prv[16]; +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \ + defined(MBEDTLS_CIPHER_MODE_OFB) + size_t offset; +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS) + int len; +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + unsigned char nonce_counter[16]; + unsigned char stream_block[16]; +#endif + mbedtls_aes_context ctx; + + memset(key, 0, 32); + mbedtls_aes_init(&ctx); + + if (verbose != 0) { +#if defined(MBEDTLS_AES_ALT) + mbedtls_printf(" AES note: alternative implementation.\n"); +#else /* MBEDTLS_AES_ALT */ +#if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE) + if (mbedtls_padlock_has_support(MBEDTLS_PADLOCK_ACE)) { + mbedtls_printf(" AES note: using VIA Padlock.\n"); + } else +#endif +#if defined(MBEDTLS_AESNI_HAVE_CODE) + if (mbedtls_aesni_has_support(MBEDTLS_AESNI_AES)) { + mbedtls_printf(" AES note: using AESNI via "); +#if MBEDTLS_AESNI_HAVE_CODE == 1 + mbedtls_printf("assembly"); +#elif MBEDTLS_AESNI_HAVE_CODE == 2 + mbedtls_printf("intrinsics"); +#else + mbedtls_printf("(unknown)"); +#endif + mbedtls_printf(".\n"); + } else +#endif + mbedtls_printf(" AES note: built-in implementation.\n"); +#endif /* MBEDTLS_AES_ALT */ + } + + /* + * ECB mode + */ + for (i = 0; i < 6; i++) { + u = i >> 1; + keybits = 128 + u * 64; + mode = i & 1; + + if (verbose != 0) { + mbedtls_printf(" AES-ECB-%3u (%s): ", keybits, + (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); + } + + memset(buf, 0, 16); + + if (mode == MBEDTLS_AES_DECRYPT) { + ret = mbedtls_aes_setkey_dec(&ctx, key, keybits); + aes_tests = aes_test_ecb_dec[u]; + } else { + ret = mbedtls_aes_setkey_enc(&ctx, key, keybits); + aes_tests = aes_test_ecb_enc[u]; + } + + /* + * AES-192 is an optional feature that may be unavailable when + * there is an alternative underlying implementation i.e. when + * MBEDTLS_AES_ALT is defined. + */ + if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) { + mbedtls_printf("skipped\n"); + continue; + } else if (ret != 0) { + goto exit; + } + + for (j = 0; j < 10000; j++) { + ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf); + if (ret != 0) { + goto exit; + } + } + + if (memcmp(buf, aes_tests, 16) != 0) { + ret = 1; + goto exit; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + +#if defined(MBEDTLS_CIPHER_MODE_CBC) + /* + * CBC mode + */ + for (i = 0; i < 6; i++) { + u = i >> 1; + keybits = 128 + u * 64; + mode = i & 1; + + if (verbose != 0) { + mbedtls_printf(" AES-CBC-%3u (%s): ", keybits, + (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); + } + + memset(iv, 0, 16); + memset(prv, 0, 16); + memset(buf, 0, 16); + + if (mode == MBEDTLS_AES_DECRYPT) { + ret = mbedtls_aes_setkey_dec(&ctx, key, keybits); + aes_tests = aes_test_cbc_dec[u]; + } else { + ret = mbedtls_aes_setkey_enc(&ctx, key, keybits); + aes_tests = aes_test_cbc_enc[u]; + } + + /* + * AES-192 is an optional feature that may be unavailable when + * there is an alternative underlying implementation i.e. when + * MBEDTLS_AES_ALT is defined. + */ + if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) { + mbedtls_printf("skipped\n"); + continue; + } else if (ret != 0) { + goto exit; + } + + for (j = 0; j < 10000; j++) { + if (mode == MBEDTLS_AES_ENCRYPT) { + unsigned char tmp[16]; + + memcpy(tmp, prv, 16); + memcpy(prv, buf, 16); + memcpy(buf, tmp, 16); + } + + ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf); + if (ret != 0) { + goto exit; + } + + } + + if (memcmp(buf, aes_tests, 16) != 0) { + ret = 1; + goto exit; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) + /* + * CFB128 mode + */ + for (i = 0; i < 6; i++) { + u = i >> 1; + keybits = 128 + u * 64; + mode = i & 1; + + if (verbose != 0) { + mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits, + (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); + } + + memcpy(iv, aes_test_cfb128_iv, 16); + memcpy(key, aes_test_cfb128_key[u], keybits / 8); + + offset = 0; + ret = mbedtls_aes_setkey_enc(&ctx, key, keybits); + /* + * AES-192 is an optional feature that may be unavailable when + * there is an alternative underlying implementation i.e. when + * MBEDTLS_AES_ALT is defined. + */ + if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) { + mbedtls_printf("skipped\n"); + continue; + } else if (ret != 0) { + goto exit; + } + + if (mode == MBEDTLS_AES_DECRYPT) { + memcpy(buf, aes_test_cfb128_ct[u], 64); + aes_tests = aes_test_cfb128_pt; + } else { + memcpy(buf, aes_test_cfb128_pt, 64); + aes_tests = aes_test_cfb128_ct[u]; + } + + ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf); + if (ret != 0) { + goto exit; + } + + if (memcmp(buf, aes_tests, 64) != 0) { + ret = 1; + goto exit; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_OFB) + /* + * OFB mode + */ + for (i = 0; i < 6; i++) { + u = i >> 1; + keybits = 128 + u * 64; + mode = i & 1; + + if (verbose != 0) { + mbedtls_printf(" AES-OFB-%3u (%s): ", keybits, + (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); + } + + memcpy(iv, aes_test_ofb_iv, 16); + memcpy(key, aes_test_ofb_key[u], keybits / 8); + + offset = 0; + ret = mbedtls_aes_setkey_enc(&ctx, key, keybits); + /* + * AES-192 is an optional feature that may be unavailable when + * there is an alternative underlying implementation i.e. when + * MBEDTLS_AES_ALT is defined. + */ + if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) { + mbedtls_printf("skipped\n"); + continue; + } else if (ret != 0) { + goto exit; + } + + if (mode == MBEDTLS_AES_DECRYPT) { + memcpy(buf, aes_test_ofb_ct[u], 64); + aes_tests = aes_test_ofb_pt; + } else { + memcpy(buf, aes_test_ofb_pt, 64); + aes_tests = aes_test_ofb_ct[u]; + } + + ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf); + if (ret != 0) { + goto exit; + } + + if (memcmp(buf, aes_tests, 64) != 0) { + ret = 1; + goto exit; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } +#endif /* MBEDTLS_CIPHER_MODE_OFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) + /* + * CTR mode + */ + for (i = 0; i < 6; i++) { + u = i >> 1; + mode = i & 1; + + if (verbose != 0) { + mbedtls_printf(" AES-CTR-128 (%s): ", + (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); + } + + memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16); + memcpy(key, aes_test_ctr_key[u], 16); + + offset = 0; + if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) { + goto exit; + } + + len = aes_test_ctr_len[u]; + + if (mode == MBEDTLS_AES_DECRYPT) { + memcpy(buf, aes_test_ctr_ct[u], len); + aes_tests = aes_test_ctr_pt[u]; + } else { + memcpy(buf, aes_test_ctr_pt[u], len); + aes_tests = aes_test_ctr_ct[u]; + } + + ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter, + stream_block, buf, buf); + if (ret != 0) { + goto exit; + } + + if (memcmp(buf, aes_tests, len) != 0) { + ret = 1; + goto exit; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +#if defined(MBEDTLS_CIPHER_MODE_XTS) + { + static const int num_tests = + sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key); + mbedtls_aes_xts_context ctx_xts; + + /* + * XTS mode + */ + mbedtls_aes_xts_init(&ctx_xts); + + for (i = 0; i < num_tests << 1; i++) { + const unsigned char *data_unit; + u = i >> 1; + mode = i & 1; + + if (verbose != 0) { + mbedtls_printf(" AES-XTS-128 (%s): ", + (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); + } + + memset(key, 0, sizeof(key)); + memcpy(key, aes_test_xts_key[u], 32); + data_unit = aes_test_xts_data_unit[u]; + + len = sizeof(*aes_test_xts_ct32); + + if (mode == MBEDTLS_AES_DECRYPT) { + ret = mbedtls_aes_xts_setkey_dec(&ctx_xts, key, 256); + if (ret != 0) { + goto exit; + } + memcpy(buf, aes_test_xts_ct32[u], len); + aes_tests = aes_test_xts_pt32[u]; + } else { + ret = mbedtls_aes_xts_setkey_enc(&ctx_xts, key, 256); + if (ret != 0) { + goto exit; + } + memcpy(buf, aes_test_xts_pt32[u], len); + aes_tests = aes_test_xts_ct32[u]; + } + + + ret = mbedtls_aes_crypt_xts(&ctx_xts, mode, len, data_unit, + buf, buf); + if (ret != 0) { + goto exit; + } + + if (memcmp(buf, aes_tests, len) != 0) { + ret = 1; + goto exit; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + mbedtls_aes_xts_free(&ctx_xts); + } +#endif /* MBEDTLS_CIPHER_MODE_XTS */ + + ret = 0; + +exit: + if (ret != 0 && verbose != 0) { + mbedtls_printf("failed\n"); + } + + mbedtls_aes_free(&ctx); + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_AES_C */ diff --git a/ext/opcua_client/mbedtls/library/aesni.c b/ext/opcua_client/mbedtls/library/aesni.c new file mode 100644 index 0000000..7491f8d --- /dev/null +++ b/ext/opcua_client/mbedtls/library/aesni.c @@ -0,0 +1,798 @@ +/* + * AES-NI support functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * [AES-WP] https://www.intel.com/content/www/us/en/developer/articles/tool/intel-advanced-encryption-standard-aes-instructions-set.html + * [CLMUL-WP] https://www.intel.com/content/www/us/en/develop/download/intel-carry-less-multiplication-instruction-and-its-usage-for-computing-the-gcm-mode.html + */ + +#include "common.h" + +#if defined(MBEDTLS_AESNI_C) + +#include "mbedtls/aesni.h" + +#include + +/* *INDENT-OFF* */ +#ifndef asm +#define asm __asm +#endif +/* *INDENT-ON* */ + +#if defined(MBEDTLS_AESNI_HAVE_CODE) + +#if MBEDTLS_AESNI_HAVE_CODE == 2 +#if defined(__GNUC__) +#include +#elif defined(_MSC_VER) +#include +#else +#error "`__cpuid` required by MBEDTLS_AESNI_C is not supported by the compiler" +#endif +#include +#endif + +/* + * AES-NI support detection routine + */ +int mbedtls_aesni_has_support(unsigned int what) +{ + static int done = 0; + static unsigned int c = 0; + + if (!done) { +#if MBEDTLS_AESNI_HAVE_CODE == 2 + static int info[4] = { 0, 0, 0, 0 }; +#if defined(_MSC_VER) + __cpuid(info, 1); +#else + __cpuid(1, info[0], info[1], info[2], info[3]); +#endif + c = info[2]; +#else /* AESNI using asm */ + asm ("movl $1, %%eax \n\t" + "cpuid \n\t" + : "=c" (c) + : + : "eax", "ebx", "edx"); +#endif /* MBEDTLS_AESNI_HAVE_CODE */ + done = 1; + } + + return (c & what) != 0; +} + +#if MBEDTLS_AESNI_HAVE_CODE == 2 + +/* + * AES-NI AES-ECB block en(de)cryption + */ +int mbedtls_aesni_crypt_ecb(mbedtls_aes_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16]) +{ + const __m128i *rk = (const __m128i *) (ctx->rk); + unsigned nr = ctx->nr; // Number of remaining rounds + + // Load round key 0 + __m128i state; + memcpy(&state, input, 16); + state = _mm_xor_si128(state, rk[0]); // state ^= *rk; + ++rk; + --nr; + + if (mode == 0) { + while (nr != 0) { + state = _mm_aesdec_si128(state, *rk); + ++rk; + --nr; + } + state = _mm_aesdeclast_si128(state, *rk); + } else { + while (nr != 0) { + state = _mm_aesenc_si128(state, *rk); + ++rk; + --nr; + } + state = _mm_aesenclast_si128(state, *rk); + } + + memcpy(output, &state, 16); + return 0; +} + +/* + * GCM multiplication: c = a times b in GF(2^128) + * Based on [CLMUL-WP] algorithms 1 (with equation 27) and 5. + */ + +static void gcm_clmul(const __m128i aa, const __m128i bb, + __m128i *cc, __m128i *dd) +{ + /* + * Caryless multiplication dd:cc = aa * bb + * using [CLMUL-WP] algorithm 1 (p. 12). + */ + *cc = _mm_clmulepi64_si128(aa, bb, 0x00); // a0*b0 = c1:c0 + *dd = _mm_clmulepi64_si128(aa, bb, 0x11); // a1*b1 = d1:d0 + __m128i ee = _mm_clmulepi64_si128(aa, bb, 0x10); // a0*b1 = e1:e0 + __m128i ff = _mm_clmulepi64_si128(aa, bb, 0x01); // a1*b0 = f1:f0 + ff = _mm_xor_si128(ff, ee); // e1+f1:e0+f0 + ee = ff; // e1+f1:e0+f0 + ff = _mm_srli_si128(ff, 8); // 0:e1+f1 + ee = _mm_slli_si128(ee, 8); // e0+f0:0 + *dd = _mm_xor_si128(*dd, ff); // d1:d0+e1+f1 + *cc = _mm_xor_si128(*cc, ee); // c1+e0+f0:c0 +} + +static void gcm_shift(__m128i *cc, __m128i *dd) +{ + /* [CMUCL-WP] Algorithm 5 Step 1: shift cc:dd one bit to the left, + * taking advantage of [CLMUL-WP] eq 27 (p. 18). */ + // // *cc = r1:r0 + // // *dd = r3:r2 + __m128i cc_lo = _mm_slli_epi64(*cc, 1); // r1<<1:r0<<1 + __m128i dd_lo = _mm_slli_epi64(*dd, 1); // r3<<1:r2<<1 + __m128i cc_hi = _mm_srli_epi64(*cc, 63); // r1>>63:r0>>63 + __m128i dd_hi = _mm_srli_epi64(*dd, 63); // r3>>63:r2>>63 + __m128i xmm5 = _mm_srli_si128(cc_hi, 8); // 0:r1>>63 + cc_hi = _mm_slli_si128(cc_hi, 8); // r0>>63:0 + dd_hi = _mm_slli_si128(dd_hi, 8); // 0:r1>>63 + + *cc = _mm_or_si128(cc_lo, cc_hi); // r1<<1|r0>>63:r0<<1 + *dd = _mm_or_si128(_mm_or_si128(dd_lo, dd_hi), xmm5); // r3<<1|r2>>62:r2<<1|r1>>63 +} + +static __m128i gcm_reduce(__m128i xx) +{ + // // xx = x1:x0 + /* [CLMUL-WP] Algorithm 5 Step 2 */ + __m128i aa = _mm_slli_epi64(xx, 63); // x1<<63:x0<<63 = stuff:a + __m128i bb = _mm_slli_epi64(xx, 62); // x1<<62:x0<<62 = stuff:b + __m128i cc = _mm_slli_epi64(xx, 57); // x1<<57:x0<<57 = stuff:c + __m128i dd = _mm_slli_si128(_mm_xor_si128(_mm_xor_si128(aa, bb), cc), 8); // a+b+c:0 + return _mm_xor_si128(dd, xx); // x1+a+b+c:x0 = d:x0 +} + +static __m128i gcm_mix(__m128i dx) +{ + /* [CLMUL-WP] Algorithm 5 Steps 3 and 4 */ + __m128i ee = _mm_srli_epi64(dx, 1); // e1:x0>>1 = e1:e0' + __m128i ff = _mm_srli_epi64(dx, 2); // f1:x0>>2 = f1:f0' + __m128i gg = _mm_srli_epi64(dx, 7); // g1:x0>>7 = g1:g0' + + // e0'+f0'+g0' is almost e0+f0+g0, except for some missing + // bits carried from d. Now get those bits back in. + __m128i eh = _mm_slli_epi64(dx, 63); // d<<63:stuff + __m128i fh = _mm_slli_epi64(dx, 62); // d<<62:stuff + __m128i gh = _mm_slli_epi64(dx, 57); // d<<57:stuff + __m128i hh = _mm_srli_si128(_mm_xor_si128(_mm_xor_si128(eh, fh), gh), 8); // 0:missing bits of d + + return _mm_xor_si128(_mm_xor_si128(_mm_xor_si128(_mm_xor_si128(ee, ff), gg), hh), dx); +} + +void mbedtls_aesni_gcm_mult(unsigned char c[16], + const unsigned char a[16], + const unsigned char b[16]) +{ + __m128i aa = { 0 }, bb = { 0 }, cc, dd; + + /* The inputs are in big-endian order, so byte-reverse them */ + for (size_t i = 0; i < 16; i++) { + ((uint8_t *) &aa)[i] = a[15 - i]; + ((uint8_t *) &bb)[i] = b[15 - i]; + } + + gcm_clmul(aa, bb, &cc, &dd); + gcm_shift(&cc, &dd); + /* + * Now reduce modulo the GCM polynomial x^128 + x^7 + x^2 + x + 1 + * using [CLMUL-WP] algorithm 5 (p. 18). + * Currently dd:cc holds x3:x2:x1:x0 (already shifted). + */ + __m128i dx = gcm_reduce(cc); + __m128i xh = gcm_mix(dx); + cc = _mm_xor_si128(xh, dd); // x3+h1:x2+h0 + + /* Now byte-reverse the outputs */ + for (size_t i = 0; i < 16; i++) { + c[i] = ((uint8_t *) &cc)[15 - i]; + } + + return; +} + +/* + * Compute decryption round keys from encryption round keys + */ +void mbedtls_aesni_inverse_key(unsigned char *invkey, + const unsigned char *fwdkey, int nr) +{ + __m128i *ik = (__m128i *) invkey; + const __m128i *fk = (const __m128i *) fwdkey + nr; + + *ik = *fk; + for (--fk, ++ik; fk > (const __m128i *) fwdkey; --fk, ++ik) { + *ik = _mm_aesimc_si128(*fk); + } + *ik = *fk; +} + +/* + * Key expansion, 128-bit case + */ +static __m128i aesni_set_rk_128(__m128i state, __m128i xword) +{ + /* + * Finish generating the next round key. + * + * On entry state is r3:r2:r1:r0 and xword is X:stuff:stuff:stuff + * with X = rot( sub( r3 ) ) ^ RCON (obtained with AESKEYGENASSIST). + * + * On exit, xword is r7:r6:r5:r4 + * with r4 = X + r0, r5 = r4 + r1, r6 = r5 + r2, r7 = r6 + r3 + * and this is returned, to be written to the round key buffer. + */ + xword = _mm_shuffle_epi32(xword, 0xff); // X:X:X:X + xword = _mm_xor_si128(xword, state); // X+r3:X+r2:X+r1:r4 + state = _mm_slli_si128(state, 4); // r2:r1:r0:0 + xword = _mm_xor_si128(xword, state); // X+r3+r2:X+r2+r1:r5:r4 + state = _mm_slli_si128(state, 4); // r1:r0:0:0 + xword = _mm_xor_si128(xword, state); // X+r3+r2+r1:r6:r5:r4 + state = _mm_slli_si128(state, 4); // r0:0:0:0 + state = _mm_xor_si128(xword, state); // r7:r6:r5:r4 + return state; +} + +static void aesni_setkey_enc_128(unsigned char *rk_bytes, + const unsigned char *key) +{ + __m128i *rk = (__m128i *) rk_bytes; + + memcpy(&rk[0], key, 16); + rk[1] = aesni_set_rk_128(rk[0], _mm_aeskeygenassist_si128(rk[0], 0x01)); + rk[2] = aesni_set_rk_128(rk[1], _mm_aeskeygenassist_si128(rk[1], 0x02)); + rk[3] = aesni_set_rk_128(rk[2], _mm_aeskeygenassist_si128(rk[2], 0x04)); + rk[4] = aesni_set_rk_128(rk[3], _mm_aeskeygenassist_si128(rk[3], 0x08)); + rk[5] = aesni_set_rk_128(rk[4], _mm_aeskeygenassist_si128(rk[4], 0x10)); + rk[6] = aesni_set_rk_128(rk[5], _mm_aeskeygenassist_si128(rk[5], 0x20)); + rk[7] = aesni_set_rk_128(rk[6], _mm_aeskeygenassist_si128(rk[6], 0x40)); + rk[8] = aesni_set_rk_128(rk[7], _mm_aeskeygenassist_si128(rk[7], 0x80)); + rk[9] = aesni_set_rk_128(rk[8], _mm_aeskeygenassist_si128(rk[8], 0x1B)); + rk[10] = aesni_set_rk_128(rk[9], _mm_aeskeygenassist_si128(rk[9], 0x36)); +} + +/* + * Key expansion, 192-bit case + */ +static void aesni_set_rk_192(__m128i *state0, __m128i *state1, __m128i xword, + unsigned char *rk) +{ + /* + * Finish generating the next 6 quarter-keys. + * + * On entry state0 is r3:r2:r1:r0, state1 is stuff:stuff:r5:r4 + * and xword is stuff:stuff:X:stuff with X = rot( sub( r3 ) ) ^ RCON + * (obtained with AESKEYGENASSIST). + * + * On exit, state0 is r9:r8:r7:r6 and state1 is stuff:stuff:r11:r10 + * and those are written to the round key buffer. + */ + xword = _mm_shuffle_epi32(xword, 0x55); // X:X:X:X + xword = _mm_xor_si128(xword, *state0); // X+r3:X+r2:X+r1:X+r0 + *state0 = _mm_slli_si128(*state0, 4); // r2:r1:r0:0 + xword = _mm_xor_si128(xword, *state0); // X+r3+r2:X+r2+r1:X+r1+r0:X+r0 + *state0 = _mm_slli_si128(*state0, 4); // r1:r0:0:0 + xword = _mm_xor_si128(xword, *state0); // X+r3+r2+r1:X+r2+r1+r0:X+r1+r0:X+r0 + *state0 = _mm_slli_si128(*state0, 4); // r0:0:0:0 + xword = _mm_xor_si128(xword, *state0); // X+r3+r2+r1+r0:X+r2+r1+r0:X+r1+r0:X+r0 + *state0 = xword; // = r9:r8:r7:r6 + + xword = _mm_shuffle_epi32(xword, 0xff); // r9:r9:r9:r9 + xword = _mm_xor_si128(xword, *state1); // stuff:stuff:r9+r5:r9+r4 + *state1 = _mm_slli_si128(*state1, 4); // stuff:stuff:r4:0 + xword = _mm_xor_si128(xword, *state1); // stuff:stuff:r9+r5+r4:r9+r4 + *state1 = xword; // = stuff:stuff:r11:r10 + + /* Store state0 and the low half of state1 into rk, which is conceptually + * an array of 24-byte elements. Since 24 is not a multiple of 16, + * rk is not necessarily aligned so just `*rk = *state0` doesn't work. */ + memcpy(rk, state0, 16); + memcpy(rk + 16, state1, 8); +} + +static void aesni_setkey_enc_192(unsigned char *rk, + const unsigned char *key) +{ + /* First round: use original key */ + memcpy(rk, key, 24); + /* aes.c guarantees that rk is aligned on a 16-byte boundary. */ + __m128i state0 = ((__m128i *) rk)[0]; + __m128i state1 = _mm_loadl_epi64(((__m128i *) rk) + 1); + + aesni_set_rk_192(&state0, &state1, _mm_aeskeygenassist_si128(state1, 0x01), rk + 24 * 1); + aesni_set_rk_192(&state0, &state1, _mm_aeskeygenassist_si128(state1, 0x02), rk + 24 * 2); + aesni_set_rk_192(&state0, &state1, _mm_aeskeygenassist_si128(state1, 0x04), rk + 24 * 3); + aesni_set_rk_192(&state0, &state1, _mm_aeskeygenassist_si128(state1, 0x08), rk + 24 * 4); + aesni_set_rk_192(&state0, &state1, _mm_aeskeygenassist_si128(state1, 0x10), rk + 24 * 5); + aesni_set_rk_192(&state0, &state1, _mm_aeskeygenassist_si128(state1, 0x20), rk + 24 * 6); + aesni_set_rk_192(&state0, &state1, _mm_aeskeygenassist_si128(state1, 0x40), rk + 24 * 7); + aesni_set_rk_192(&state0, &state1, _mm_aeskeygenassist_si128(state1, 0x80), rk + 24 * 8); +} + +/* + * Key expansion, 256-bit case + */ +static void aesni_set_rk_256(__m128i state0, __m128i state1, __m128i xword, + __m128i *rk0, __m128i *rk1) +{ + /* + * Finish generating the next two round keys. + * + * On entry state0 is r3:r2:r1:r0, state1 is r7:r6:r5:r4 and + * xword is X:stuff:stuff:stuff with X = rot( sub( r7 )) ^ RCON + * (obtained with AESKEYGENASSIST). + * + * On exit, *rk0 is r11:r10:r9:r8 and *rk1 is r15:r14:r13:r12 + */ + xword = _mm_shuffle_epi32(xword, 0xff); + xword = _mm_xor_si128(xword, state0); + state0 = _mm_slli_si128(state0, 4); + xword = _mm_xor_si128(xword, state0); + state0 = _mm_slli_si128(state0, 4); + xword = _mm_xor_si128(xword, state0); + state0 = _mm_slli_si128(state0, 4); + state0 = _mm_xor_si128(state0, xword); + *rk0 = state0; + + /* Set xword to stuff:Y:stuff:stuff with Y = subword( r11 ) + * and proceed to generate next round key from there */ + xword = _mm_aeskeygenassist_si128(state0, 0x00); + xword = _mm_shuffle_epi32(xword, 0xaa); + xword = _mm_xor_si128(xword, state1); + state1 = _mm_slli_si128(state1, 4); + xword = _mm_xor_si128(xword, state1); + state1 = _mm_slli_si128(state1, 4); + xword = _mm_xor_si128(xword, state1); + state1 = _mm_slli_si128(state1, 4); + state1 = _mm_xor_si128(state1, xword); + *rk1 = state1; +} + +static void aesni_setkey_enc_256(unsigned char *rk_bytes, + const unsigned char *key) +{ + __m128i *rk = (__m128i *) rk_bytes; + + memcpy(&rk[0], key, 16); + memcpy(&rk[1], key + 16, 16); + + /* + * Main "loop" - Generating one more key than necessary, + * see definition of mbedtls_aes_context.buf + */ + aesni_set_rk_256(rk[0], rk[1], _mm_aeskeygenassist_si128(rk[1], 0x01), &rk[2], &rk[3]); + aesni_set_rk_256(rk[2], rk[3], _mm_aeskeygenassist_si128(rk[3], 0x02), &rk[4], &rk[5]); + aesni_set_rk_256(rk[4], rk[5], _mm_aeskeygenassist_si128(rk[5], 0x04), &rk[6], &rk[7]); + aesni_set_rk_256(rk[6], rk[7], _mm_aeskeygenassist_si128(rk[7], 0x08), &rk[8], &rk[9]); + aesni_set_rk_256(rk[8], rk[9], _mm_aeskeygenassist_si128(rk[9], 0x10), &rk[10], &rk[11]); + aesni_set_rk_256(rk[10], rk[11], _mm_aeskeygenassist_si128(rk[11], 0x20), &rk[12], &rk[13]); + aesni_set_rk_256(rk[12], rk[13], _mm_aeskeygenassist_si128(rk[13], 0x40), &rk[14], &rk[15]); +} + +#else /* MBEDTLS_AESNI_HAVE_CODE == 1 */ + +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) +#warning \ + "MBEDTLS_AESNI_C is known to cause spurious error reports with some memory sanitizers as they do not understand the assembly code." +#endif +#endif + +/* + * Binutils needs to be at least 2.19 to support AES-NI instructions. + * Unfortunately, a lot of users have a lower version now (2014-04). + * Emit bytecode directly in order to support "old" version of gas. + * + * Opcodes from the Intel architecture reference manual, vol. 3. + * We always use registers, so we don't need prefixes for memory operands. + * Operand macros are in gas order (src, dst) as opposed to Intel order + * (dst, src) in order to blend better into the surrounding assembly code. + */ +#define AESDEC(regs) ".byte 0x66,0x0F,0x38,0xDE," regs "\n\t" +#define AESDECLAST(regs) ".byte 0x66,0x0F,0x38,0xDF," regs "\n\t" +#define AESENC(regs) ".byte 0x66,0x0F,0x38,0xDC," regs "\n\t" +#define AESENCLAST(regs) ".byte 0x66,0x0F,0x38,0xDD," regs "\n\t" +#define AESIMC(regs) ".byte 0x66,0x0F,0x38,0xDB," regs "\n\t" +#define AESKEYGENA(regs, imm) ".byte 0x66,0x0F,0x3A,0xDF," regs "," imm "\n\t" +#define PCLMULQDQ(regs, imm) ".byte 0x66,0x0F,0x3A,0x44," regs "," imm "\n\t" + +#define xmm0_xmm0 "0xC0" +#define xmm0_xmm1 "0xC8" +#define xmm0_xmm2 "0xD0" +#define xmm0_xmm3 "0xD8" +#define xmm0_xmm4 "0xE0" +#define xmm1_xmm0 "0xC1" +#define xmm1_xmm2 "0xD1" + +/* + * AES-NI AES-ECB block en(de)cryption + */ +int mbedtls_aesni_crypt_ecb(mbedtls_aes_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16]) +{ + asm ("movdqu (%3), %%xmm0 \n\t" // load input + "movdqu (%1), %%xmm1 \n\t" // load round key 0 + "pxor %%xmm1, %%xmm0 \n\t" // round 0 + "add $16, %1 \n\t" // point to next round key + "subl $1, %0 \n\t" // normal rounds = nr - 1 + "test %2, %2 \n\t" // mode? + "jz 2f \n\t" // 0 = decrypt + + "1: \n\t" // encryption loop + "movdqu (%1), %%xmm1 \n\t" // load round key + AESENC(xmm1_xmm0) // do round + "add $16, %1 \n\t" // point to next round key + "subl $1, %0 \n\t" // loop + "jnz 1b \n\t" + "movdqu (%1), %%xmm1 \n\t" // load round key + AESENCLAST(xmm1_xmm0) // last round + "jmp 3f \n\t" + + "2: \n\t" // decryption loop + "movdqu (%1), %%xmm1 \n\t" + AESDEC(xmm1_xmm0) // do round + "add $16, %1 \n\t" + "subl $1, %0 \n\t" + "jnz 2b \n\t" + "movdqu (%1), %%xmm1 \n\t" // load round key + AESDECLAST(xmm1_xmm0) // last round + + "3: \n\t" + "movdqu %%xmm0, (%4) \n\t" // export output + : + : "r" (ctx->nr), "r" (ctx->rk), "r" (mode), "r" (input), "r" (output) + : "memory", "cc", "xmm0", "xmm1", "0", "1"); + + + return 0; +} + +/* + * GCM multiplication: c = a times b in GF(2^128) + * Based on [CLMUL-WP] algorithms 1 (with equation 27) and 5. + */ +void mbedtls_aesni_gcm_mult(unsigned char c[16], + const unsigned char a[16], + const unsigned char b[16]) +{ + unsigned char aa[16], bb[16], cc[16]; + size_t i; + + /* The inputs are in big-endian order, so byte-reverse them */ + for (i = 0; i < 16; i++) { + aa[i] = a[15 - i]; + bb[i] = b[15 - i]; + } + + asm ("movdqu (%0), %%xmm0 \n\t" // a1:a0 + "movdqu (%1), %%xmm1 \n\t" // b1:b0 + + /* + * Caryless multiplication xmm2:xmm1 = xmm0 * xmm1 + * using [CLMUL-WP] algorithm 1 (p. 12). + */ + "movdqa %%xmm1, %%xmm2 \n\t" // copy of b1:b0 + "movdqa %%xmm1, %%xmm3 \n\t" // same + "movdqa %%xmm1, %%xmm4 \n\t" // same + PCLMULQDQ(xmm0_xmm1, "0x00") // a0*b0 = c1:c0 + PCLMULQDQ(xmm0_xmm2, "0x11") // a1*b1 = d1:d0 + PCLMULQDQ(xmm0_xmm3, "0x10") // a0*b1 = e1:e0 + PCLMULQDQ(xmm0_xmm4, "0x01") // a1*b0 = f1:f0 + "pxor %%xmm3, %%xmm4 \n\t" // e1+f1:e0+f0 + "movdqa %%xmm4, %%xmm3 \n\t" // same + "psrldq $8, %%xmm4 \n\t" // 0:e1+f1 + "pslldq $8, %%xmm3 \n\t" // e0+f0:0 + "pxor %%xmm4, %%xmm2 \n\t" // d1:d0+e1+f1 + "pxor %%xmm3, %%xmm1 \n\t" // c1+e0+f1:c0 + + /* + * Now shift the result one bit to the left, + * taking advantage of [CLMUL-WP] eq 27 (p. 18) + */ + "movdqa %%xmm1, %%xmm3 \n\t" // r1:r0 + "movdqa %%xmm2, %%xmm4 \n\t" // r3:r2 + "psllq $1, %%xmm1 \n\t" // r1<<1:r0<<1 + "psllq $1, %%xmm2 \n\t" // r3<<1:r2<<1 + "psrlq $63, %%xmm3 \n\t" // r1>>63:r0>>63 + "psrlq $63, %%xmm4 \n\t" // r3>>63:r2>>63 + "movdqa %%xmm3, %%xmm5 \n\t" // r1>>63:r0>>63 + "pslldq $8, %%xmm3 \n\t" // r0>>63:0 + "pslldq $8, %%xmm4 \n\t" // r2>>63:0 + "psrldq $8, %%xmm5 \n\t" // 0:r1>>63 + "por %%xmm3, %%xmm1 \n\t" // r1<<1|r0>>63:r0<<1 + "por %%xmm4, %%xmm2 \n\t" // r3<<1|r2>>62:r2<<1 + "por %%xmm5, %%xmm2 \n\t" // r3<<1|r2>>62:r2<<1|r1>>63 + + /* + * Now reduce modulo the GCM polynomial x^128 + x^7 + x^2 + x + 1 + * using [CLMUL-WP] algorithm 5 (p. 18). + * Currently xmm2:xmm1 holds x3:x2:x1:x0 (already shifted). + */ + /* Step 2 (1) */ + "movdqa %%xmm1, %%xmm3 \n\t" // x1:x0 + "movdqa %%xmm1, %%xmm4 \n\t" // same + "movdqa %%xmm1, %%xmm5 \n\t" // same + "psllq $63, %%xmm3 \n\t" // x1<<63:x0<<63 = stuff:a + "psllq $62, %%xmm4 \n\t" // x1<<62:x0<<62 = stuff:b + "psllq $57, %%xmm5 \n\t" // x1<<57:x0<<57 = stuff:c + + /* Step 2 (2) */ + "pxor %%xmm4, %%xmm3 \n\t" // stuff:a+b + "pxor %%xmm5, %%xmm3 \n\t" // stuff:a+b+c + "pslldq $8, %%xmm3 \n\t" // a+b+c:0 + "pxor %%xmm3, %%xmm1 \n\t" // x1+a+b+c:x0 = d:x0 + + /* Steps 3 and 4 */ + "movdqa %%xmm1,%%xmm0 \n\t" // d:x0 + "movdqa %%xmm1,%%xmm4 \n\t" // same + "movdqa %%xmm1,%%xmm5 \n\t" // same + "psrlq $1, %%xmm0 \n\t" // e1:x0>>1 = e1:e0' + "psrlq $2, %%xmm4 \n\t" // f1:x0>>2 = f1:f0' + "psrlq $7, %%xmm5 \n\t" // g1:x0>>7 = g1:g0' + "pxor %%xmm4, %%xmm0 \n\t" // e1+f1:e0'+f0' + "pxor %%xmm5, %%xmm0 \n\t" // e1+f1+g1:e0'+f0'+g0' + // e0'+f0'+g0' is almost e0+f0+g0, ex\tcept for some missing + // bits carried from d. Now get those\t bits back in. + "movdqa %%xmm1,%%xmm3 \n\t" // d:x0 + "movdqa %%xmm1,%%xmm4 \n\t" // same + "movdqa %%xmm1,%%xmm5 \n\t" // same + "psllq $63, %%xmm3 \n\t" // d<<63:stuff + "psllq $62, %%xmm4 \n\t" // d<<62:stuff + "psllq $57, %%xmm5 \n\t" // d<<57:stuff + "pxor %%xmm4, %%xmm3 \n\t" // d<<63+d<<62:stuff + "pxor %%xmm5, %%xmm3 \n\t" // missing bits of d:stuff + "psrldq $8, %%xmm3 \n\t" // 0:missing bits of d + "pxor %%xmm3, %%xmm0 \n\t" // e1+f1+g1:e0+f0+g0 + "pxor %%xmm1, %%xmm0 \n\t" // h1:h0 + "pxor %%xmm2, %%xmm0 \n\t" // x3+h1:x2+h0 + + "movdqu %%xmm0, (%2) \n\t" // done + : + : "r" (aa), "r" (bb), "r" (cc) + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); + + /* Now byte-reverse the outputs */ + for (i = 0; i < 16; i++) { + c[i] = cc[15 - i]; + } + + return; +} + +/* + * Compute decryption round keys from encryption round keys + */ +void mbedtls_aesni_inverse_key(unsigned char *invkey, + const unsigned char *fwdkey, int nr) +{ + unsigned char *ik = invkey; + const unsigned char *fk = fwdkey + 16 * nr; + + memcpy(ik, fk, 16); + + for (fk -= 16, ik += 16; fk > fwdkey; fk -= 16, ik += 16) { + asm ("movdqu (%0), %%xmm0 \n\t" + AESIMC(xmm0_xmm0) + "movdqu %%xmm0, (%1) \n\t" + : + : "r" (fk), "r" (ik) + : "memory", "xmm0"); + } + + memcpy(ik, fk, 16); +} + +/* + * Key expansion, 128-bit case + */ +static void aesni_setkey_enc_128(unsigned char *rk, + const unsigned char *key) +{ + asm ("movdqu (%1), %%xmm0 \n\t" // copy the original key + "movdqu %%xmm0, (%0) \n\t" // as round key 0 + "jmp 2f \n\t" // skip auxiliary routine + + /* + * Finish generating the next round key. + * + * On entry xmm0 is r3:r2:r1:r0 and xmm1 is X:stuff:stuff:stuff + * with X = rot( sub( r3 ) ) ^ RCON. + * + * On exit, xmm0 is r7:r6:r5:r4 + * with r4 = X + r0, r5 = r4 + r1, r6 = r5 + r2, r7 = r6 + r3 + * and those are written to the round key buffer. + */ + "1: \n\t" + "pshufd $0xff, %%xmm1, %%xmm1 \n\t" // X:X:X:X + "pxor %%xmm0, %%xmm1 \n\t" // X+r3:X+r2:X+r1:r4 + "pslldq $4, %%xmm0 \n\t" // r2:r1:r0:0 + "pxor %%xmm0, %%xmm1 \n\t" // X+r3+r2:X+r2+r1:r5:r4 + "pslldq $4, %%xmm0 \n\t" // etc + "pxor %%xmm0, %%xmm1 \n\t" + "pslldq $4, %%xmm0 \n\t" + "pxor %%xmm1, %%xmm0 \n\t" // update xmm0 for next time! + "add $16, %0 \n\t" // point to next round key + "movdqu %%xmm0, (%0) \n\t" // write it + "ret \n\t" + + /* Main "loop" */ + "2: \n\t" + AESKEYGENA(xmm0_xmm1, "0x01") "call 1b \n\t" + AESKEYGENA(xmm0_xmm1, "0x02") "call 1b \n\t" + AESKEYGENA(xmm0_xmm1, "0x04") "call 1b \n\t" + AESKEYGENA(xmm0_xmm1, "0x08") "call 1b \n\t" + AESKEYGENA(xmm0_xmm1, "0x10") "call 1b \n\t" + AESKEYGENA(xmm0_xmm1, "0x20") "call 1b \n\t" + AESKEYGENA(xmm0_xmm1, "0x40") "call 1b \n\t" + AESKEYGENA(xmm0_xmm1, "0x80") "call 1b \n\t" + AESKEYGENA(xmm0_xmm1, "0x1B") "call 1b \n\t" + AESKEYGENA(xmm0_xmm1, "0x36") "call 1b \n\t" + : + : "r" (rk), "r" (key) + : "memory", "cc", "xmm0", "xmm1", "0"); +} + +/* + * Key expansion, 192-bit case + */ +static void aesni_setkey_enc_192(unsigned char *rk, + const unsigned char *key) +{ + asm ("movdqu (%1), %%xmm0 \n\t" // copy original round key + "movdqu %%xmm0, (%0) \n\t" + "add $16, %0 \n\t" + "movq 16(%1), %%xmm1 \n\t" + "movq %%xmm1, (%0) \n\t" + "add $8, %0 \n\t" + "jmp 2f \n\t" // skip auxiliary routine + + /* + * Finish generating the next 6 quarter-keys. + * + * On entry xmm0 is r3:r2:r1:r0, xmm1 is stuff:stuff:r5:r4 + * and xmm2 is stuff:stuff:X:stuff with X = rot( sub( r3 ) ) ^ RCON. + * + * On exit, xmm0 is r9:r8:r7:r6 and xmm1 is stuff:stuff:r11:r10 + * and those are written to the round key buffer. + */ + "1: \n\t" + "pshufd $0x55, %%xmm2, %%xmm2 \n\t" // X:X:X:X + "pxor %%xmm0, %%xmm2 \n\t" // X+r3:X+r2:X+r1:r4 + "pslldq $4, %%xmm0 \n\t" // etc + "pxor %%xmm0, %%xmm2 \n\t" + "pslldq $4, %%xmm0 \n\t" + "pxor %%xmm0, %%xmm2 \n\t" + "pslldq $4, %%xmm0 \n\t" + "pxor %%xmm2, %%xmm0 \n\t" // update xmm0 = r9:r8:r7:r6 + "movdqu %%xmm0, (%0) \n\t" + "add $16, %0 \n\t" + "pshufd $0xff, %%xmm0, %%xmm2 \n\t" // r9:r9:r9:r9 + "pxor %%xmm1, %%xmm2 \n\t" // stuff:stuff:r9+r5:r10 + "pslldq $4, %%xmm1 \n\t" // r2:r1:r0:0 + "pxor %%xmm2, %%xmm1 \n\t" // xmm1 = stuff:stuff:r11:r10 + "movq %%xmm1, (%0) \n\t" + "add $8, %0 \n\t" + "ret \n\t" + + "2: \n\t" + AESKEYGENA(xmm1_xmm2, "0x01") "call 1b \n\t" + AESKEYGENA(xmm1_xmm2, "0x02") "call 1b \n\t" + AESKEYGENA(xmm1_xmm2, "0x04") "call 1b \n\t" + AESKEYGENA(xmm1_xmm2, "0x08") "call 1b \n\t" + AESKEYGENA(xmm1_xmm2, "0x10") "call 1b \n\t" + AESKEYGENA(xmm1_xmm2, "0x20") "call 1b \n\t" + AESKEYGENA(xmm1_xmm2, "0x40") "call 1b \n\t" + AESKEYGENA(xmm1_xmm2, "0x80") "call 1b \n\t" + + : + : "r" (rk), "r" (key) + : "memory", "cc", "xmm0", "xmm1", "xmm2", "0"); +} + +/* + * Key expansion, 256-bit case + */ +static void aesni_setkey_enc_256(unsigned char *rk, + const unsigned char *key) +{ + asm ("movdqu (%1), %%xmm0 \n\t" + "movdqu %%xmm0, (%0) \n\t" + "add $16, %0 \n\t" + "movdqu 16(%1), %%xmm1 \n\t" + "movdqu %%xmm1, (%0) \n\t" + "jmp 2f \n\t" // skip auxiliary routine + + /* + * Finish generating the next two round keys. + * + * On entry xmm0 is r3:r2:r1:r0, xmm1 is r7:r6:r5:r4 and + * xmm2 is X:stuff:stuff:stuff with X = rot( sub( r7 )) ^ RCON + * + * On exit, xmm0 is r11:r10:r9:r8 and xmm1 is r15:r14:r13:r12 + * and those have been written to the output buffer. + */ + "1: \n\t" + "pshufd $0xff, %%xmm2, %%xmm2 \n\t" + "pxor %%xmm0, %%xmm2 \n\t" + "pslldq $4, %%xmm0 \n\t" + "pxor %%xmm0, %%xmm2 \n\t" + "pslldq $4, %%xmm0 \n\t" + "pxor %%xmm0, %%xmm2 \n\t" + "pslldq $4, %%xmm0 \n\t" + "pxor %%xmm2, %%xmm0 \n\t" + "add $16, %0 \n\t" + "movdqu %%xmm0, (%0) \n\t" + + /* Set xmm2 to stuff:Y:stuff:stuff with Y = subword( r11 ) + * and proceed to generate next round key from there */ + AESKEYGENA(xmm0_xmm2, "0x00") + "pshufd $0xaa, %%xmm2, %%xmm2 \n\t" + "pxor %%xmm1, %%xmm2 \n\t" + "pslldq $4, %%xmm1 \n\t" + "pxor %%xmm1, %%xmm2 \n\t" + "pslldq $4, %%xmm1 \n\t" + "pxor %%xmm1, %%xmm2 \n\t" + "pslldq $4, %%xmm1 \n\t" + "pxor %%xmm2, %%xmm1 \n\t" + "add $16, %0 \n\t" + "movdqu %%xmm1, (%0) \n\t" + "ret \n\t" + + /* + * Main "loop" - Generating one more key than necessary, + * see definition of mbedtls_aes_context.buf + */ + "2: \n\t" + AESKEYGENA(xmm1_xmm2, "0x01") "call 1b \n\t" + AESKEYGENA(xmm1_xmm2, "0x02") "call 1b \n\t" + AESKEYGENA(xmm1_xmm2, "0x04") "call 1b \n\t" + AESKEYGENA(xmm1_xmm2, "0x08") "call 1b \n\t" + AESKEYGENA(xmm1_xmm2, "0x10") "call 1b \n\t" + AESKEYGENA(xmm1_xmm2, "0x20") "call 1b \n\t" + AESKEYGENA(xmm1_xmm2, "0x40") "call 1b \n\t" + : + : "r" (rk), "r" (key) + : "memory", "cc", "xmm0", "xmm1", "xmm2", "0"); +} + +#endif /* MBEDTLS_AESNI_HAVE_CODE */ + +/* + * Key expansion, wrapper + */ +int mbedtls_aesni_setkey_enc(unsigned char *rk, + const unsigned char *key, + size_t bits) +{ + switch (bits) { + case 128: aesni_setkey_enc_128(rk, key); break; + case 192: aesni_setkey_enc_192(rk, key); break; + case 256: aesni_setkey_enc_256(rk, key); break; + default: return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH; + } + + return 0; +} + +#endif /* MBEDTLS_AESNI_HAVE_CODE */ + +#endif /* MBEDTLS_AESNI_C */ diff --git a/ext/opcua_client/mbedtls/library/arc4.c b/ext/opcua_client/mbedtls/library/arc4.c new file mode 100644 index 0000000..7ff747d --- /dev/null +++ b/ext/opcua_client/mbedtls/library/arc4.c @@ -0,0 +1,180 @@ +/* + * An implementation of the ARCFOUR algorithm + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The ARCFOUR algorithm was publicly disclosed on 94/09. + * + * http://groups.google.com/group/sci.crypt/msg/10a300c9d21afca0 + */ + +#include "common.h" + +#if defined(MBEDTLS_ARC4_C) + +#include "mbedtls/arc4.h" +#include "mbedtls/platform_util.h" + +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_ARC4_ALT) + +void mbedtls_arc4_init(mbedtls_arc4_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_arc4_context)); +} + +void mbedtls_arc4_free(mbedtls_arc4_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_arc4_context)); +} + +/* + * ARC4 key schedule + */ +void mbedtls_arc4_setup(mbedtls_arc4_context *ctx, const unsigned char *key, + unsigned int keylen) +{ + int i, j, a; + unsigned int k; + unsigned char *m; + + ctx->x = 0; + ctx->y = 0; + m = ctx->m; + + for (i = 0; i < 256; i++) { + m[i] = (unsigned char) i; + } + + j = k = 0; + + for (i = 0; i < 256; i++, k++) { + if (k >= keylen) { + k = 0; + } + + a = m[i]; + j = (j + a + key[k]) & 0xFF; + m[i] = m[j]; + m[j] = (unsigned char) a; + } +} + +/* + * ARC4 cipher function + */ +int mbedtls_arc4_crypt(mbedtls_arc4_context *ctx, size_t length, const unsigned char *input, + unsigned char *output) +{ + int x, y, a, b; + size_t i; + unsigned char *m; + + x = ctx->x; + y = ctx->y; + m = ctx->m; + + for (i = 0; i < length; i++) { + x = (x + 1) & 0xFF; a = m[x]; + y = (y + a) & 0xFF; b = m[y]; + + m[x] = (unsigned char) b; + m[y] = (unsigned char) a; + + output[i] = (unsigned char) + (input[i] ^ m[(unsigned char) (a + b)]); + } + + ctx->x = x; + ctx->y = y; + + return 0; +} + +#endif /* !MBEDTLS_ARC4_ALT */ + +#if defined(MBEDTLS_SELF_TEST) +/* + * ARC4 tests vectors as posted by Eric Rescorla in sep. 1994: + * + * http://groups.google.com/group/comp.security.misc/msg/10a300c9d21afca0 + */ +static const unsigned char arc4_test_key[3][8] = +{ + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } +}; + +static const unsigned char arc4_test_pt[3][8] = +{ + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } +}; + +static const unsigned char arc4_test_ct[3][8] = +{ + { 0x75, 0xB7, 0x87, 0x80, 0x99, 0xE0, 0xC5, 0x96 }, + { 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79 }, + { 0xDE, 0x18, 0x89, 0x41, 0xA3, 0x37, 0x5D, 0x3A } +}; + +/* + * Checkup routine + */ +int mbedtls_arc4_self_test(int verbose) +{ + int i, ret = 0; + unsigned char ibuf[8]; + unsigned char obuf[8]; + mbedtls_arc4_context ctx; + + mbedtls_arc4_init(&ctx); + + for (i = 0; i < 3; i++) { + if (verbose != 0) { + mbedtls_printf(" ARC4 test #%d: ", i + 1); + } + + memcpy(ibuf, arc4_test_pt[i], 8); + + mbedtls_arc4_setup(&ctx, arc4_test_key[i], 8); + mbedtls_arc4_crypt(&ctx, 8, ibuf, obuf); + + if (memcmp(obuf, arc4_test_ct[i], 8) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto exit; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + +exit: + mbedtls_arc4_free(&ctx); + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_ARC4_C */ diff --git a/ext/opcua_client/mbedtls/library/aria.c b/ext/opcua_client/mbedtls/library/aria.c new file mode 100644 index 0000000..c944105 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/aria.c @@ -0,0 +1,1035 @@ +/* + * ARIA implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * This implementation is based on the following standards: + * [1] http://210.104.33.10/ARIA/doc/ARIA-specification-e.pdf + * [2] https://tools.ietf.org/html/rfc5794 + */ + +#include "common.h" + +#if defined(MBEDTLS_ARIA_C) + +#include "mbedtls/aria.h" + +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_ARIA_ALT) + +#include "mbedtls/platform_util.h" + +/* Parameter validation macros */ +#define ARIA_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_ARIA_BAD_INPUT_DATA) +#define ARIA_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +/* + * modify byte order: ( A B C D ) -> ( B A D C ), i.e. swap pairs of bytes + * + * This is submatrix P1 in [1] Appendix B.1 + * + * Common compilers fail to translate this to minimal number of instructions, + * so let's provide asm versions for common platforms with C fallback. + */ +#if defined(MBEDTLS_HAVE_ASM) +#if defined(__arm__) /* rev16 available from v6 up */ +/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */ +#if defined(__GNUC__) && \ + (!defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000) && \ + __ARM_ARCH >= 6 +static inline uint32_t aria_p1(uint32_t x) +{ + uint32_t r; + __asm("rev16 %0, %1" : "=l" (r) : "l" (x)); + return r; +} +#define ARIA_P1 aria_p1 +#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \ + (__TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3) +static inline uint32_t aria_p1(uint32_t x) +{ + uint32_t r; + __asm("rev16 r, x"); + return r; +} +#define ARIA_P1 aria_p1 +#endif +#endif /* arm */ +#if defined(__GNUC__) && \ + defined(__i386__) || defined(__amd64__) || defined(__x86_64__) +/* I couldn't find an Intel equivalent of rev16, so two instructions */ +#define ARIA_P1(x) ARIA_P2(ARIA_P3(x)) +#endif /* x86 gnuc */ +#endif /* MBEDTLS_HAVE_ASM && GNUC */ +#if !defined(ARIA_P1) +#define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8)) +#endif + +/* + * modify byte order: ( A B C D ) -> ( C D A B ), i.e. rotate by 16 bits + * + * This is submatrix P2 in [1] Appendix B.1 + * + * Common compilers will translate this to a single instruction. + */ +#define ARIA_P2(x) (((x) >> 16) ^ ((x) << 16)) + +/* + * modify byte order: ( A B C D ) -> ( D C B A ), i.e. change endianness + * + * This is submatrix P3 in [1] Appendix B.1 + * + * Some compilers fail to translate this to a single instruction, + * so let's provide asm versions for common platforms with C fallback. + */ +#if defined(MBEDTLS_HAVE_ASM) +#if defined(__arm__) /* rev available from v6 up */ +/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */ +#if defined(__GNUC__) && \ + (!defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000) && \ + __ARM_ARCH >= 6 +static inline uint32_t aria_p3(uint32_t x) +{ + uint32_t r; + __asm("rev %0, %1" : "=l" (r) : "l" (x)); + return r; +} +#define ARIA_P3 aria_p3 +#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \ + (__TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3) +static inline uint32_t aria_p3(uint32_t x) +{ + uint32_t r; + __asm("rev r, x"); + return r; +} +#define ARIA_P3 aria_p3 +#endif +#endif /* arm */ +#if defined(__GNUC__) && \ + defined(__i386__) || defined(__amd64__) || defined(__x86_64__) +static inline uint32_t aria_p3(uint32_t x) +{ + __asm("bswap %0" : "=r" (x) : "0" (x)); + return x; +} +#define ARIA_P3 aria_p3 +#endif /* x86 gnuc */ +#endif /* MBEDTLS_HAVE_ASM && GNUC */ +#if !defined(ARIA_P3) +#define ARIA_P3(x) ARIA_P2(ARIA_P1(x)) +#endif + +/* + * ARIA Affine Transform + * (a, b, c, d) = state in/out + * + * If we denote the first byte of input by 0, ..., the last byte by f, + * then inputs are: a = 0123, b = 4567, c = 89ab, d = cdef. + * + * Reading [1] 2.4 or [2] 2.4.3 in columns and performing simple + * rearrangements on adjacent pairs, output is: + * + * a = 3210 + 4545 + 6767 + 88aa + 99bb + dccd + effe + * = 3210 + 4567 + 6745 + 89ab + 98ba + dcfe + efcd + * b = 0101 + 2323 + 5476 + 8998 + baab + eecc + ffdd + * = 0123 + 2301 + 5476 + 89ab + ba98 + efcd + fedc + * c = 0022 + 1133 + 4554 + 7667 + ab89 + dcdc + fefe + * = 0123 + 1032 + 4567 + 7654 + ab89 + dcfe + fedc + * d = 1001 + 2332 + 6644 + 7755 + 9898 + baba + cdef + * = 1032 + 2301 + 6745 + 7654 + 98ba + ba98 + cdef + * + * Note: another presentation of the A transform can be found as the first + * half of App. B.1 in [1] in terms of 4-byte operators P1, P2, P3 and P4. + * The implementation below uses only P1 and P2 as they are sufficient. + */ +static inline void aria_a(uint32_t *a, uint32_t *b, + uint32_t *c, uint32_t *d) +{ + uint32_t ta, tb, tc; + ta = *b; // 4567 + *b = *a; // 0123 + *a = ARIA_P2(ta); // 6745 + tb = ARIA_P2(*d); // efcd + *d = ARIA_P1(*c); // 98ba + *c = ARIA_P1(tb); // fedc + ta ^= *d; // 4567+98ba + tc = ARIA_P2(*b); // 2301 + ta = ARIA_P1(ta) ^ tc ^ *c; // 2301+5476+89ab+fedc + tb ^= ARIA_P2(*d); // ba98+efcd + tc ^= ARIA_P1(*a); // 2301+7654 + *b ^= ta ^ tb; // 0123+2301+5476+89ab+ba98+efcd+fedc OUT + tb = ARIA_P2(tb) ^ ta; // 2301+5476+89ab+98ba+cdef+fedc + *a ^= ARIA_P1(tb); // 3210+4567+6745+89ab+98ba+dcfe+efcd OUT + ta = ARIA_P2(ta); // 0123+7654+ab89+dcfe + *d ^= ARIA_P1(ta) ^ tc; // 1032+2301+6745+7654+98ba+ba98+cdef OUT + tc = ARIA_P2(tc); // 0123+5476 + *c ^= ARIA_P1(tc) ^ ta; // 0123+1032+4567+7654+ab89+dcfe+fedc OUT +} + +/* + * ARIA Substitution Layer SL1 / SL2 + * (a, b, c, d) = state in/out + * (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below) + * + * By passing sb1, sb2, is1, is2 as S-Boxes you get SL1 + * By passing is1, is2, sb1, sb2 as S-Boxes you get SL2 + */ +static inline void aria_sl(uint32_t *a, uint32_t *b, + uint32_t *c, uint32_t *d, + const uint8_t sa[256], const uint8_t sb[256], + const uint8_t sc[256], const uint8_t sd[256]) +{ + *a = ((uint32_t) sa[MBEDTLS_BYTE_0(*a)]) ^ + (((uint32_t) sb[MBEDTLS_BYTE_1(*a)]) << 8) ^ + (((uint32_t) sc[MBEDTLS_BYTE_2(*a)]) << 16) ^ + (((uint32_t) sd[MBEDTLS_BYTE_3(*a)]) << 24); + *b = ((uint32_t) sa[MBEDTLS_BYTE_0(*b)]) ^ + (((uint32_t) sb[MBEDTLS_BYTE_1(*b)]) << 8) ^ + (((uint32_t) sc[MBEDTLS_BYTE_2(*b)]) << 16) ^ + (((uint32_t) sd[MBEDTLS_BYTE_3(*b)]) << 24); + *c = ((uint32_t) sa[MBEDTLS_BYTE_0(*c)]) ^ + (((uint32_t) sb[MBEDTLS_BYTE_1(*c)]) << 8) ^ + (((uint32_t) sc[MBEDTLS_BYTE_2(*c)]) << 16) ^ + (((uint32_t) sd[MBEDTLS_BYTE_3(*c)]) << 24); + *d = ((uint32_t) sa[MBEDTLS_BYTE_0(*d)]) ^ + (((uint32_t) sb[MBEDTLS_BYTE_1(*d)]) << 8) ^ + (((uint32_t) sc[MBEDTLS_BYTE_2(*d)]) << 16) ^ + (((uint32_t) sd[MBEDTLS_BYTE_3(*d)]) << 24); +} + +/* + * S-Boxes + */ +static const uint8_t aria_sb1[256] = +{ + 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, + 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, + 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, + 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, + 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, + 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, + 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, + 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, + 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, + 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, + 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, + 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, + 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, + 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, + 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, + 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, + 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, + 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, + 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, + 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, + 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, + 0xB0, 0x54, 0xBB, 0x16 +}; + +static const uint8_t aria_sb2[256] = +{ + 0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46, + 0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64, 0xCB, 0xB4, 0x97, 0xBE, 0x2B, + 0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B, + 0x55, 0xF0, 0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB, + 0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A, 0x09, 0x45, 0xAA, + 0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91, + 0x8D, 0x78, 0xC8, 0x95, 0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38, + 0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12, 0x53, + 0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74, + 0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB, 0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26, + 0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD, + 0xA0, 0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC, + 0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65, 0x3B, 0x02, 0x8F, 0x3E, + 0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A, + 0x7E, 0xC5, 0x39, 0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5, + 0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79, 0x86, 0xA8, + 0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24, + 0x16, 0x82, 0x5F, 0xDA, 0xE6, 0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F, + 0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33, + 0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D, + 0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3, 0xF8, 0x89, 0xDE, 0x71, 0x1A, + 0xAF, 0xBA, 0xB5, 0x81 +}; + +static const uint8_t aria_is1[256] = +{ + 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, + 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, + 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, + 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, + 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, + 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, + 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, + 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, + 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, + 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, + 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, + 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, + 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, + 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, + 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, + 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, + 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, + 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, + 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, + 0x55, 0x21, 0x0C, 0x7D +}; + +static const uint8_t aria_is2[256] = +{ + 0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1, + 0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E, 0x8E, 0xF1, 0xA0, 0xCC, 0xA3, + 0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89, + 0xCB, 0x9D, 0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D, + 0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53, 0xAA, 0x38, 0x98, + 0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58, + 0x67, 0x88, 0x06, 0xC3, 0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F, + 0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10, 0xCE, + 0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23, + 0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA, 0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19, + 0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55, + 0x86, 0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A, + 0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15, 0x79, 0x26, 0xA7, 0xDE, + 0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0, + 0xBF, 0xA4, 0x3B, 0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6, + 0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83, 0x16, 0xA5, + 0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13, + 0x07, 0x4F, 0x4E, 0x45, 0xB2, 0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73, + 0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94, + 0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3, + 0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7, 0xEA, 0xF7, 0x4C, 0x11, 0x33, + 0x03, 0xA2, 0xAC, 0x60 +}; + +/* + * Helper for key schedule: r = FO( p, k ) ^ x + */ +static void aria_fo_xor(uint32_t r[4], const uint32_t p[4], + const uint32_t k[4], const uint32_t x[4]) +{ + uint32_t a, b, c, d; + + a = p[0] ^ k[0]; + b = p[1] ^ k[1]; + c = p[2] ^ k[2]; + d = p[3] ^ k[3]; + + aria_sl(&a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2); + aria_a(&a, &b, &c, &d); + + r[0] = a ^ x[0]; + r[1] = b ^ x[1]; + r[2] = c ^ x[2]; + r[3] = d ^ x[3]; +} + +/* + * Helper for key schedule: r = FE( p, k ) ^ x + */ +static void aria_fe_xor(uint32_t r[4], const uint32_t p[4], + const uint32_t k[4], const uint32_t x[4]) +{ + uint32_t a, b, c, d; + + a = p[0] ^ k[0]; + b = p[1] ^ k[1]; + c = p[2] ^ k[2]; + d = p[3] ^ k[3]; + + aria_sl(&a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2); + aria_a(&a, &b, &c, &d); + + r[0] = a ^ x[0]; + r[1] = b ^ x[1]; + r[2] = c ^ x[2]; + r[3] = d ^ x[3]; +} + +/* + * Big endian 128-bit rotation: r = a ^ (b <<< n), used only in key setup. + * + * We chose to store bytes into 32-bit words in little-endian format (see + * MBEDTLS_GET_UINT32_LE / MBEDTLS_PUT_UINT32_LE ) so we need to reverse + * bytes here. + */ +static void aria_rot128(uint32_t r[4], const uint32_t a[4], + const uint32_t b[4], uint8_t n) +{ + uint8_t i, j; + uint32_t t, u; + + const uint8_t n1 = n % 32; // bit offset + const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset + + j = (n / 32) % 4; // initial word offset + t = ARIA_P3(b[j]); // big endian + for (i = 0; i < 4; i++) { + j = (j + 1) % 4; // get next word, big endian + u = ARIA_P3(b[j]); + t <<= n1; // rotate + t |= u >> n2; + t = ARIA_P3(t); // back to little endian + r[i] = a[i] ^ t; // store + t = u; // move to next word + } +} + +/* + * Set encryption key + */ +int mbedtls_aria_setkey_enc(mbedtls_aria_context *ctx, + const unsigned char *key, unsigned int keybits) +{ + /* round constant masks */ + const uint32_t rc[3][4] = + { + { 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA }, + { 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF }, + { 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 } + }; + + int i; + uint32_t w[4][4], *w2; + ARIA_VALIDATE_RET(ctx != NULL); + ARIA_VALIDATE_RET(key != NULL); + + if (keybits != 128 && keybits != 192 && keybits != 256) { + return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA; + } + + /* Copy key to W0 (and potential remainder to W1) */ + w[0][0] = MBEDTLS_GET_UINT32_LE(key, 0); + w[0][1] = MBEDTLS_GET_UINT32_LE(key, 4); + w[0][2] = MBEDTLS_GET_UINT32_LE(key, 8); + w[0][3] = MBEDTLS_GET_UINT32_LE(key, 12); + + memset(w[1], 0, 16); + if (keybits >= 192) { + w[1][0] = MBEDTLS_GET_UINT32_LE(key, 16); // 192 bit key + w[1][1] = MBEDTLS_GET_UINT32_LE(key, 20); + } + if (keybits == 256) { + w[1][2] = MBEDTLS_GET_UINT32_LE(key, 24); // 256 bit key + w[1][3] = MBEDTLS_GET_UINT32_LE(key, 28); + } + + i = (keybits - 128) >> 6; // index: 0, 1, 2 + ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16 + + aria_fo_xor(w[1], w[0], rc[i], w[1]); // W1 = FO(W0, CK1) ^ KR + i = i < 2 ? i + 1 : 0; + aria_fe_xor(w[2], w[1], rc[i], w[0]); // W2 = FE(W1, CK2) ^ W0 + i = i < 2 ? i + 1 : 0; + aria_fo_xor(w[3], w[2], rc[i], w[1]); // W3 = FO(W2, CK3) ^ W1 + + for (i = 0; i < 4; i++) { // create round keys + w2 = w[(i + 1) & 3]; + aria_rot128(ctx->rk[i], w[i], w2, 128 - 19); + aria_rot128(ctx->rk[i + 4], w[i], w2, 128 - 31); + aria_rot128(ctx->rk[i + 8], w[i], w2, 61); + aria_rot128(ctx->rk[i + 12], w[i], w2, 31); + } + aria_rot128(ctx->rk[16], w[0], w[1], 19); + + /* w holds enough info to reconstruct the round keys */ + mbedtls_platform_zeroize(w, sizeof(w)); + + return 0; +} + +/* + * Set decryption key + */ +int mbedtls_aria_setkey_dec(mbedtls_aria_context *ctx, + const unsigned char *key, unsigned int keybits) +{ + int i, j, k, ret; + ARIA_VALIDATE_RET(ctx != NULL); + ARIA_VALIDATE_RET(key != NULL); + + ret = mbedtls_aria_setkey_enc(ctx, key, keybits); + if (ret != 0) { + return ret; + } + + /* flip the order of round keys */ + for (i = 0, j = ctx->nr; i < j; i++, j--) { + for (k = 0; k < 4; k++) { + uint32_t t = ctx->rk[i][k]; + ctx->rk[i][k] = ctx->rk[j][k]; + ctx->rk[j][k] = t; + } + } + + /* apply affine transform to middle keys */ + for (i = 1; i < ctx->nr; i++) { + aria_a(&ctx->rk[i][0], &ctx->rk[i][1], + &ctx->rk[i][2], &ctx->rk[i][3]); + } + + return 0; +} + +/* + * Encrypt a block + */ +int mbedtls_aria_crypt_ecb(mbedtls_aria_context *ctx, + const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE], + unsigned char output[MBEDTLS_ARIA_BLOCKSIZE]) +{ + int i; + + uint32_t a, b, c, d; + ARIA_VALIDATE_RET(ctx != NULL); + ARIA_VALIDATE_RET(input != NULL); + ARIA_VALIDATE_RET(output != NULL); + + a = MBEDTLS_GET_UINT32_LE(input, 0); + b = MBEDTLS_GET_UINT32_LE(input, 4); + c = MBEDTLS_GET_UINT32_LE(input, 8); + d = MBEDTLS_GET_UINT32_LE(input, 12); + + i = 0; + while (1) { + a ^= ctx->rk[i][0]; + b ^= ctx->rk[i][1]; + c ^= ctx->rk[i][2]; + d ^= ctx->rk[i][3]; + i++; + + aria_sl(&a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2); + aria_a(&a, &b, &c, &d); + + a ^= ctx->rk[i][0]; + b ^= ctx->rk[i][1]; + c ^= ctx->rk[i][2]; + d ^= ctx->rk[i][3]; + i++; + + aria_sl(&a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2); + if (i >= ctx->nr) { + break; + } + aria_a(&a, &b, &c, &d); + } + + /* final key mixing */ + a ^= ctx->rk[i][0]; + b ^= ctx->rk[i][1]; + c ^= ctx->rk[i][2]; + d ^= ctx->rk[i][3]; + + MBEDTLS_PUT_UINT32_LE(a, output, 0); + MBEDTLS_PUT_UINT32_LE(b, output, 4); + MBEDTLS_PUT_UINT32_LE(c, output, 8); + MBEDTLS_PUT_UINT32_LE(d, output, 12); + + return 0; +} + +/* Initialize context */ +void mbedtls_aria_init(mbedtls_aria_context *ctx) +{ + ARIA_VALIDATE(ctx != NULL); + memset(ctx, 0, sizeof(mbedtls_aria_context)); +} + +/* Clear context */ +void mbedtls_aria_free(mbedtls_aria_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aria_context)); +} + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/* + * ARIA-CBC buffer encryption/decryption + */ +int mbedtls_aria_crypt_cbc(mbedtls_aria_context *ctx, + int mode, + size_t length, + unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE], + const unsigned char *input, + unsigned char *output) +{ + int i; + unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE]; + + ARIA_VALIDATE_RET(ctx != NULL); + ARIA_VALIDATE_RET(mode == MBEDTLS_ARIA_ENCRYPT || + mode == MBEDTLS_ARIA_DECRYPT); + ARIA_VALIDATE_RET(length == 0 || input != NULL); + ARIA_VALIDATE_RET(length == 0 || output != NULL); + ARIA_VALIDATE_RET(iv != NULL); + + if (length % MBEDTLS_ARIA_BLOCKSIZE) { + return MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH; + } + + if (mode == MBEDTLS_ARIA_DECRYPT) { + while (length > 0) { + memcpy(temp, input, MBEDTLS_ARIA_BLOCKSIZE); + mbedtls_aria_crypt_ecb(ctx, input, output); + + for (i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++) { + output[i] = (unsigned char) (output[i] ^ iv[i]); + } + + memcpy(iv, temp, MBEDTLS_ARIA_BLOCKSIZE); + + input += MBEDTLS_ARIA_BLOCKSIZE; + output += MBEDTLS_ARIA_BLOCKSIZE; + length -= MBEDTLS_ARIA_BLOCKSIZE; + } + } else { + while (length > 0) { + for (i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++) { + output[i] = (unsigned char) (input[i] ^ iv[i]); + } + + mbedtls_aria_crypt_ecb(ctx, output, output); + memcpy(iv, output, MBEDTLS_ARIA_BLOCKSIZE); + + input += MBEDTLS_ARIA_BLOCKSIZE; + output += MBEDTLS_ARIA_BLOCKSIZE; + length -= MBEDTLS_ARIA_BLOCKSIZE; + } + } + + return 0; +} +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +/* + * ARIA-CFB128 buffer encryption/decryption + */ +int mbedtls_aria_crypt_cfb128(mbedtls_aria_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE], + const unsigned char *input, + unsigned char *output) +{ + unsigned char c; + size_t n; + + ARIA_VALIDATE_RET(ctx != NULL); + ARIA_VALIDATE_RET(mode == MBEDTLS_ARIA_ENCRYPT || + mode == MBEDTLS_ARIA_DECRYPT); + ARIA_VALIDATE_RET(length == 0 || input != NULL); + ARIA_VALIDATE_RET(length == 0 || output != NULL); + ARIA_VALIDATE_RET(iv != NULL); + ARIA_VALIDATE_RET(iv_off != NULL); + + n = *iv_off; + + /* An overly large value of n can lead to an unlimited + * buffer overflow. Therefore, guard against this + * outside of parameter validation. */ + if (n >= MBEDTLS_ARIA_BLOCKSIZE) { + return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA; + } + + if (mode == MBEDTLS_ARIA_DECRYPT) { + while (length--) { + if (n == 0) { + mbedtls_aria_crypt_ecb(ctx, iv, iv); + } + + c = *input++; + *output++ = c ^ iv[n]; + iv[n] = c; + + n = (n + 1) & 0x0F; + } + } else { + while (length--) { + if (n == 0) { + mbedtls_aria_crypt_ecb(ctx, iv, iv); + } + + iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++); + + n = (n + 1) & 0x0F; + } + } + + *iv_off = n; + + return 0; +} +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +/* + * ARIA-CTR buffer encryption/decryption + */ +int mbedtls_aria_crypt_ctr(mbedtls_aria_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE], + unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE], + const unsigned char *input, + unsigned char *output) +{ + int c, i; + size_t n; + + ARIA_VALIDATE_RET(ctx != NULL); + ARIA_VALIDATE_RET(length == 0 || input != NULL); + ARIA_VALIDATE_RET(length == 0 || output != NULL); + ARIA_VALIDATE_RET(nonce_counter != NULL); + ARIA_VALIDATE_RET(stream_block != NULL); + ARIA_VALIDATE_RET(nc_off != NULL); + + n = *nc_off; + /* An overly large value of n can lead to an unlimited + * buffer overflow. Therefore, guard against this + * outside of parameter validation. */ + if (n >= MBEDTLS_ARIA_BLOCKSIZE) { + return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA; + } + + while (length--) { + if (n == 0) { + mbedtls_aria_crypt_ecb(ctx, nonce_counter, + stream_block); + + for (i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i--) { + if (++nonce_counter[i - 1] != 0) { + break; + } + } + } + c = *input++; + *output++ = (unsigned char) (c ^ stream_block[n]); + + n = (n + 1) & 0x0F; + } + + *nc_off = n; + + return 0; +} +#endif /* MBEDTLS_CIPHER_MODE_CTR */ +#endif /* !MBEDTLS_ARIA_ALT */ + +#if defined(MBEDTLS_SELF_TEST) + +/* + * Basic ARIA ECB test vectors from RFC 5794 + */ +static const uint8_t aria_test1_ecb_key[32] = // test key +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit +}; + +static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext +{ + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all + 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes +}; + +static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext +{ + { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit + 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 }, + { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit + 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 }, + { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit + 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC } +}; + +/* + * Mode tests from "Test Vectors for ARIA" Version 1.0 + * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf + */ +#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \ + defined(MBEDTLS_CIPHER_MODE_CTR)) +static const uint8_t aria_test2_key[32] = +{ + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit + 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit + 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit +}; + +static const uint8_t aria_test2_pt[48] = +{ + 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all + 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb, + 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc, + 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd, + 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa, + 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb, +}; +#endif + +#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)) +static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] = +{ + 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB + 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV +}; +#endif + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext +{ + { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key + 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34, + 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64, + 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38, + 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c, + 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 }, + { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key + 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f, + 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1, + 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5, + 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92, + 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e }, + { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key + 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab, + 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef, + 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52, + 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5, + 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b } +}; +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext +{ + { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key + 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00, + 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a, + 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01, + 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96, + 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b }, + { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key + 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c, + 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94, + 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59, + 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86, + 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b }, + { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key + 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35, + 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70, + 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa, + 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c, + 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 } +}; +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext +{ + { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key + 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1, + 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1, + 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f, + 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71, + 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 }, + { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key + 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce, + 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde, + 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79, + 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce, + 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf }, + { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key + 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2, + 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89, + 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f, + 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7, + 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 } +}; +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#define ARIA_SELF_TEST_ASSERT(cond) \ + do { \ + if (cond) { \ + if (verbose) \ + mbedtls_printf("failed\n"); \ + goto exit; \ + } else { \ + if (verbose) \ + mbedtls_printf("passed\n"); \ + } \ + } while (0) + +/* + * Checkup routine + */ +int mbedtls_aria_self_test(int verbose) +{ + int i; + uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE]; + mbedtls_aria_context ctx; + int ret = 1; + +#if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR)) + size_t j; +#endif + +#if (defined(MBEDTLS_CIPHER_MODE_CBC) || \ + defined(MBEDTLS_CIPHER_MODE_CFB) || \ + defined(MBEDTLS_CIPHER_MODE_CTR)) + uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE]; +#endif + + mbedtls_aria_init(&ctx); + + /* + * Test set 1 + */ + for (i = 0; i < 3; i++) { + /* test ECB encryption */ + if (verbose) { + mbedtls_printf(" ARIA-ECB-%d (enc): ", 128 + 64 * i); + } + mbedtls_aria_setkey_enc(&ctx, aria_test1_ecb_key, 128 + 64 * i); + mbedtls_aria_crypt_ecb(&ctx, aria_test1_ecb_pt, blk); + ARIA_SELF_TEST_ASSERT( + memcmp(blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE) + != 0); + + /* test ECB decryption */ + if (verbose) { + mbedtls_printf(" ARIA-ECB-%d (dec): ", 128 + 64 * i); + } + mbedtls_aria_setkey_dec(&ctx, aria_test1_ecb_key, 128 + 64 * i); + mbedtls_aria_crypt_ecb(&ctx, aria_test1_ecb_ct[i], blk); + ARIA_SELF_TEST_ASSERT( + memcmp(blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE) + != 0); + } + if (verbose) { + mbedtls_printf("\n"); + } + + /* + * Test set 2 + */ +#if defined(MBEDTLS_CIPHER_MODE_CBC) + for (i = 0; i < 3; i++) { + /* Test CBC encryption */ + if (verbose) { + mbedtls_printf(" ARIA-CBC-%d (enc): ", 128 + 64 * i); + } + mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i); + memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE); + memset(buf, 0x55, sizeof(buf)); + mbedtls_aria_crypt_cbc(&ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv, + aria_test2_pt, buf); + ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_cbc_ct[i], 48) + != 0); + + /* Test CBC decryption */ + if (verbose) { + mbedtls_printf(" ARIA-CBC-%d (dec): ", 128 + 64 * i); + } + mbedtls_aria_setkey_dec(&ctx, aria_test2_key, 128 + 64 * i); + memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE); + memset(buf, 0xAA, sizeof(buf)); + mbedtls_aria_crypt_cbc(&ctx, MBEDTLS_ARIA_DECRYPT, 48, iv, + aria_test2_cbc_ct[i], buf); + ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_pt, 48) != 0); + } + if (verbose) { + mbedtls_printf("\n"); + } + +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) + for (i = 0; i < 3; i++) { + /* Test CFB encryption */ + if (verbose) { + mbedtls_printf(" ARIA-CFB-%d (enc): ", 128 + 64 * i); + } + mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i); + memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE); + memset(buf, 0x55, sizeof(buf)); + j = 0; + mbedtls_aria_crypt_cfb128(&ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv, + aria_test2_pt, buf); + ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_cfb_ct[i], 48) != 0); + + /* Test CFB decryption */ + if (verbose) { + mbedtls_printf(" ARIA-CFB-%d (dec): ", 128 + 64 * i); + } + mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i); + memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE); + memset(buf, 0xAA, sizeof(buf)); + j = 0; + mbedtls_aria_crypt_cfb128(&ctx, MBEDTLS_ARIA_DECRYPT, 48, &j, + iv, aria_test2_cfb_ct[i], buf); + ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_pt, 48) != 0); + } + if (verbose) { + mbedtls_printf("\n"); + } +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) + for (i = 0; i < 3; i++) { + /* Test CTR encryption */ + if (verbose) { + mbedtls_printf(" ARIA-CTR-%d (enc): ", 128 + 64 * i); + } + mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i); + memset(iv, 0, MBEDTLS_ARIA_BLOCKSIZE); // IV = 0 + memset(buf, 0x55, sizeof(buf)); + j = 0; + mbedtls_aria_crypt_ctr(&ctx, 48, &j, iv, blk, + aria_test2_pt, buf); + ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_ctr_ct[i], 48) != 0); + + /* Test CTR decryption */ + if (verbose) { + mbedtls_printf(" ARIA-CTR-%d (dec): ", 128 + 64 * i); + } + mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i); + memset(iv, 0, MBEDTLS_ARIA_BLOCKSIZE); // IV = 0 + memset(buf, 0xAA, sizeof(buf)); + j = 0; + mbedtls_aria_crypt_ctr(&ctx, 48, &j, iv, blk, + aria_test2_ctr_ct[i], buf); + ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_pt, 48) != 0); + } + if (verbose) { + mbedtls_printf("\n"); + } +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + + ret = 0; + +exit: + mbedtls_aria_free(&ctx); + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_ARIA_C */ diff --git a/ext/opcua_client/mbedtls/library/asn1parse.c b/ext/opcua_client/mbedtls/library/asn1parse.c new file mode 100644 index 0000000..c7f7f0b --- /dev/null +++ b/ext/opcua_client/mbedtls/library/asn1parse.c @@ -0,0 +1,484 @@ +/* + * Generic ASN.1 parsing + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_ASN1_PARSE_C) + +#include "mbedtls/asn1.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#if defined(MBEDTLS_BIGNUM_C) +#include "mbedtls/bignum.h" +#endif + +#include "mbedtls/platform.h" + +/* + * ASN.1 DER decoding routines + */ +int mbedtls_asn1_get_len(unsigned char **p, + const unsigned char *end, + size_t *len) +{ + if ((end - *p) < 1) { + return MBEDTLS_ERR_ASN1_OUT_OF_DATA; + } + + if ((**p & 0x80) == 0) { + *len = *(*p)++; + } else { + switch (**p & 0x7F) { + case 1: + if ((end - *p) < 2) { + return MBEDTLS_ERR_ASN1_OUT_OF_DATA; + } + + *len = (*p)[1]; + (*p) += 2; + break; + + case 2: + if ((end - *p) < 3) { + return MBEDTLS_ERR_ASN1_OUT_OF_DATA; + } + + *len = ((size_t) (*p)[1] << 8) | (*p)[2]; + (*p) += 3; + break; + + case 3: + if ((end - *p) < 4) { + return MBEDTLS_ERR_ASN1_OUT_OF_DATA; + } + + *len = ((size_t) (*p)[1] << 16) | + ((size_t) (*p)[2] << 8) | (*p)[3]; + (*p) += 4; + break; + + case 4: + if ((end - *p) < 5) { + return MBEDTLS_ERR_ASN1_OUT_OF_DATA; + } + + *len = ((size_t) (*p)[1] << 24) | ((size_t) (*p)[2] << 16) | + ((size_t) (*p)[3] << 8) | (*p)[4]; + (*p) += 5; + break; + + default: + return MBEDTLS_ERR_ASN1_INVALID_LENGTH; + } + } + + if (*len > (size_t) (end - *p)) { + return MBEDTLS_ERR_ASN1_OUT_OF_DATA; + } + + return 0; +} + +int mbedtls_asn1_get_tag(unsigned char **p, + const unsigned char *end, + size_t *len, int tag) +{ + if ((end - *p) < 1) { + return MBEDTLS_ERR_ASN1_OUT_OF_DATA; + } + + if (**p != tag) { + return MBEDTLS_ERR_ASN1_UNEXPECTED_TAG; + } + + (*p)++; + + return mbedtls_asn1_get_len(p, end, len); +} + +int mbedtls_asn1_get_bool(unsigned char **p, + const unsigned char *end, + int *val) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + + if ((ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_BOOLEAN)) != 0) { + return ret; + } + + if (len != 1) { + return MBEDTLS_ERR_ASN1_INVALID_LENGTH; + } + + *val = (**p != 0) ? 1 : 0; + (*p)++; + + return 0; +} + +static int asn1_get_tagged_int(unsigned char **p, + const unsigned char *end, + int tag, int *val) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + + if ((ret = mbedtls_asn1_get_tag(p, end, &len, tag)) != 0) { + return ret; + } + + /* + * len==0 is malformed (0 must be represented as 020100 for INTEGER, + * or 0A0100 for ENUMERATED tags + */ + if (len == 0) { + return MBEDTLS_ERR_ASN1_INVALID_LENGTH; + } + /* This is a cryptography library. Reject negative integers. */ + if ((**p & 0x80) != 0) { + return MBEDTLS_ERR_ASN1_INVALID_LENGTH; + } + + /* Skip leading zeros. */ + while (len > 0 && **p == 0) { + ++(*p); + --len; + } + + /* Reject integers that don't fit in an int. This code assumes that + * the int type has no padding bit. */ + if (len > sizeof(int)) { + return MBEDTLS_ERR_ASN1_INVALID_LENGTH; + } + if (len == sizeof(int) && (**p & 0x80) != 0) { + return MBEDTLS_ERR_ASN1_INVALID_LENGTH; + } + + *val = 0; + while (len-- > 0) { + *val = (*val << 8) | **p; + (*p)++; + } + + return 0; +} + +int mbedtls_asn1_get_int(unsigned char **p, + const unsigned char *end, + int *val) +{ + return asn1_get_tagged_int(p, end, MBEDTLS_ASN1_INTEGER, val); +} + +int mbedtls_asn1_get_enum(unsigned char **p, + const unsigned char *end, + int *val) +{ + return asn1_get_tagged_int(p, end, MBEDTLS_ASN1_ENUMERATED, val); +} + +#if defined(MBEDTLS_BIGNUM_C) +int mbedtls_asn1_get_mpi(unsigned char **p, + const unsigned char *end, + mbedtls_mpi *X) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + + if ((ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_INTEGER)) != 0) { + return ret; + } + + ret = mbedtls_mpi_read_binary(X, *p, len); + + *p += len; + + return ret; +} +#endif /* MBEDTLS_BIGNUM_C */ + +int mbedtls_asn1_get_bitstring(unsigned char **p, const unsigned char *end, + mbedtls_asn1_bitstring *bs) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + /* Certificate type is a single byte bitstring */ + if ((ret = mbedtls_asn1_get_tag(p, end, &bs->len, MBEDTLS_ASN1_BIT_STRING)) != 0) { + return ret; + } + + /* Check length, subtract one for actual bit string length */ + if (bs->len < 1) { + return MBEDTLS_ERR_ASN1_OUT_OF_DATA; + } + bs->len -= 1; + + /* Get number of unused bits, ensure unused bits <= 7 */ + bs->unused_bits = **p; + if (bs->unused_bits > 7) { + return MBEDTLS_ERR_ASN1_INVALID_LENGTH; + } + (*p)++; + + /* Get actual bitstring */ + bs->p = *p; + *p += bs->len; + + if (*p != end) { + return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH; + } + + return 0; +} + +/* + * Traverse an ASN.1 "SEQUENCE OF " + * and call a callback for each entry found. + */ +int mbedtls_asn1_traverse_sequence_of( + unsigned char **p, + const unsigned char *end, + unsigned char tag_must_mask, unsigned char tag_must_val, + unsigned char tag_may_mask, unsigned char tag_may_val, + int (*cb)(void *ctx, int tag, + unsigned char *start, size_t len), + void *ctx) +{ + int ret; + size_t len; + + /* Get main sequence tag */ + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return ret; + } + + if (*p + len != end) { + return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH; + } + + while (*p < end) { + unsigned char const tag = *(*p)++; + + if ((tag & tag_must_mask) != tag_must_val) { + return MBEDTLS_ERR_ASN1_UNEXPECTED_TAG; + } + + if ((ret = mbedtls_asn1_get_len(p, end, &len)) != 0) { + return ret; + } + + if ((tag & tag_may_mask) == tag_may_val) { + if (cb != NULL) { + ret = cb(ctx, tag, *p, len); + if (ret != 0) { + return ret; + } + } + } + + *p += len; + } + + return 0; +} + +/* + * Get a bit string without unused bits + */ +int mbedtls_asn1_get_bitstring_null(unsigned char **p, const unsigned char *end, + size_t *len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if ((ret = mbedtls_asn1_get_tag(p, end, len, MBEDTLS_ASN1_BIT_STRING)) != 0) { + return ret; + } + + if (*len == 0) { + return MBEDTLS_ERR_ASN1_INVALID_DATA; + } + --(*len); + + if (**p != 0) { + return MBEDTLS_ERR_ASN1_INVALID_DATA; + } + ++(*p); + + return 0; +} + +void mbedtls_asn1_sequence_free(mbedtls_asn1_sequence *seq) +{ + while (seq != NULL) { + mbedtls_asn1_sequence *next = seq->next; + mbedtls_platform_zeroize(seq, sizeof(*seq)); + mbedtls_free(seq); + seq = next; + } +} + +typedef struct { + int tag; + mbedtls_asn1_sequence *cur; +} asn1_get_sequence_of_cb_ctx_t; + +static int asn1_get_sequence_of_cb(void *ctx, + int tag, + unsigned char *start, + size_t len) +{ + asn1_get_sequence_of_cb_ctx_t *cb_ctx = + (asn1_get_sequence_of_cb_ctx_t *) ctx; + mbedtls_asn1_sequence *cur = + cb_ctx->cur; + + if (cur->buf.p != NULL) { + cur->next = + mbedtls_calloc(1, sizeof(mbedtls_asn1_sequence)); + + if (cur->next == NULL) { + return MBEDTLS_ERR_ASN1_ALLOC_FAILED; + } + + cur = cur->next; + } + + cur->buf.p = start; + cur->buf.len = len; + cur->buf.tag = tag; + + cb_ctx->cur = cur; + return 0; +} + +/* + * Parses and splits an ASN.1 "SEQUENCE OF " + */ +int mbedtls_asn1_get_sequence_of(unsigned char **p, + const unsigned char *end, + mbedtls_asn1_sequence *cur, + int tag) +{ + asn1_get_sequence_of_cb_ctx_t cb_ctx = { tag, cur }; + memset(cur, 0, sizeof(mbedtls_asn1_sequence)); + return mbedtls_asn1_traverse_sequence_of( + p, end, 0xFF, tag, 0, 0, + asn1_get_sequence_of_cb, &cb_ctx); +} + +int mbedtls_asn1_get_alg(unsigned char **p, + const unsigned char *end, + mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return ret; + } + + if ((end - *p) < 1) { + return MBEDTLS_ERR_ASN1_OUT_OF_DATA; + } + + alg->tag = **p; + end = *p + len; + + if ((ret = mbedtls_asn1_get_tag(p, end, &alg->len, MBEDTLS_ASN1_OID)) != 0) { + return ret; + } + + alg->p = *p; + *p += alg->len; + + if (*p == end) { + mbedtls_platform_zeroize(params, sizeof(mbedtls_asn1_buf)); + return 0; + } + + params->tag = **p; + (*p)++; + + if ((ret = mbedtls_asn1_get_len(p, end, ¶ms->len)) != 0) { + return ret; + } + + params->p = *p; + *p += params->len; + + if (*p != end) { + return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH; + } + + return 0; +} + +int mbedtls_asn1_get_alg_null(unsigned char **p, + const unsigned char *end, + mbedtls_asn1_buf *alg) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_asn1_buf params; + + memset(¶ms, 0, sizeof(mbedtls_asn1_buf)); + + if ((ret = mbedtls_asn1_get_alg(p, end, alg, ¶ms)) != 0) { + return ret; + } + + if ((params.tag != MBEDTLS_ASN1_NULL && params.tag != 0) || params.len != 0) { + return MBEDTLS_ERR_ASN1_INVALID_DATA; + } + + return 0; +} + +void mbedtls_asn1_free_named_data(mbedtls_asn1_named_data *cur) +{ + if (cur == NULL) { + return; + } + + mbedtls_free(cur->oid.p); + mbedtls_free(cur->val.p); + + mbedtls_platform_zeroize(cur, sizeof(mbedtls_asn1_named_data)); +} + +void mbedtls_asn1_free_named_data_list(mbedtls_asn1_named_data **head) +{ + mbedtls_asn1_named_data *cur; + + while ((cur = *head) != NULL) { + *head = cur->next; + mbedtls_asn1_free_named_data(cur); + mbedtls_free(cur); + } +} + +mbedtls_asn1_named_data *mbedtls_asn1_find_named_data(mbedtls_asn1_named_data *list, + const char *oid, size_t len) +{ + while (list != NULL) { + if (list->oid.len == len && + memcmp(list->oid.p, oid, len) == 0) { + break; + } + + list = list->next; + } + + return list; +} + +#endif /* MBEDTLS_ASN1_PARSE_C */ diff --git a/ext/opcua_client/mbedtls/library/asn1write.c b/ext/opcua_client/mbedtls/library/asn1write.c new file mode 100644 index 0000000..0147c49 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/asn1write.c @@ -0,0 +1,478 @@ +/* + * ASN.1 buffer writing functionality + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_ASN1_WRITE_C) + +#include "mbedtls/asn1write.h" +#include "mbedtls/error.h" + +#include + +#include "mbedtls/platform.h" + +int mbedtls_asn1_write_len(unsigned char **p, unsigned char *start, size_t len) +{ + if (len < 0x80) { + if (*p - start < 1) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + *--(*p) = (unsigned char) len; + return 1; + } + + if (len <= 0xFF) { + if (*p - start < 2) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + *--(*p) = (unsigned char) len; + *--(*p) = 0x81; + return 2; + } + + if (len <= 0xFFFF) { + if (*p - start < 3) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + *--(*p) = MBEDTLS_BYTE_0(len); + *--(*p) = MBEDTLS_BYTE_1(len); + *--(*p) = 0x82; + return 3; + } + + if (len <= 0xFFFFFF) { + if (*p - start < 4) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + *--(*p) = MBEDTLS_BYTE_0(len); + *--(*p) = MBEDTLS_BYTE_1(len); + *--(*p) = MBEDTLS_BYTE_2(len); + *--(*p) = 0x83; + return 4; + } + + int len_is_valid = 1; +#if SIZE_MAX > 0xFFFFFFFF + len_is_valid = (len <= 0xFFFFFFFF); +#endif + if (len_is_valid) { + if (*p - start < 5) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + *--(*p) = MBEDTLS_BYTE_0(len); + *--(*p) = MBEDTLS_BYTE_1(len); + *--(*p) = MBEDTLS_BYTE_2(len); + *--(*p) = MBEDTLS_BYTE_3(len); + *--(*p) = 0x84; + return 5; + } + + return MBEDTLS_ERR_ASN1_INVALID_LENGTH; +} + +int mbedtls_asn1_write_tag(unsigned char **p, unsigned char *start, unsigned char tag) +{ + if (*p - start < 1) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + *--(*p) = tag; + + return 1; +} + +int mbedtls_asn1_write_raw_buffer(unsigned char **p, unsigned char *start, + const unsigned char *buf, size_t size) +{ + size_t len = 0; + + if (*p < start || (size_t) (*p - start) < size) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + len = size; + (*p) -= len; + memcpy(*p, buf, len); + + return (int) len; +} + +#if defined(MBEDTLS_BIGNUM_C) +int mbedtls_asn1_write_mpi(unsigned char **p, unsigned char *start, const mbedtls_mpi *X) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + // Write the MPI + // + len = mbedtls_mpi_size(X); + + /* DER represents 0 with a sign bit (0=nonnegative) and 7 value bits, not + * as 0 digits. We need to end up with 020100, not with 0200. */ + if (len == 0) { + len = 1; + } + + if (*p < start || (size_t) (*p - start) < len) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + (*p) -= len; + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(X, *p, len)); + + // DER format assumes 2s complement for numbers, so the leftmost bit + // should be 0 for positive numbers and 1 for negative numbers. + // + if (X->s == 1 && **p & 0x80) { + if (*p - start < 1) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + *--(*p) = 0x00; + len += 1; + } + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, MBEDTLS_ASN1_INTEGER)); + + ret = (int) len; + +cleanup: + return ret; +} +#endif /* MBEDTLS_BIGNUM_C */ + +int mbedtls_asn1_write_null(unsigned char **p, unsigned char *start) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + // Write NULL + // + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, 0)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, MBEDTLS_ASN1_NULL)); + + return (int) len; +} + +int mbedtls_asn1_write_oid(unsigned char **p, unsigned char *start, + const char *oid, size_t oid_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_raw_buffer(p, start, + (const unsigned char *) oid, oid_len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, MBEDTLS_ASN1_OID)); + + return (int) len; +} + +int mbedtls_asn1_write_algorithm_identifier(unsigned char **p, unsigned char *start, + const char *oid, size_t oid_len, + size_t par_len) +{ + return mbedtls_asn1_write_algorithm_identifier_ext(p, start, oid, oid_len, par_len, 1); +} + +int mbedtls_asn1_write_algorithm_identifier_ext(unsigned char **p, unsigned char *start, + const char *oid, size_t oid_len, + size_t par_len, int has_par) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + if (has_par) { + if (par_len == 0) { + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_null(p, start)); + } else { + len += par_len; + } + } + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_oid(p, start, oid, oid_len)); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, + MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + + return (int) len; +} + +int mbedtls_asn1_write_bool(unsigned char **p, unsigned char *start, int boolean) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + if (*p - start < 1) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + *--(*p) = (boolean) ? 255 : 0; + len++; + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, MBEDTLS_ASN1_BOOLEAN)); + + return (int) len; +} + +static int asn1_write_tagged_int(unsigned char **p, unsigned char *start, int val, int tag) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + do { + if (*p - start < 1) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + len += 1; + *--(*p) = val & 0xff; + val >>= 8; + } while (val > 0); + + if (**p & 0x80) { + if (*p - start < 1) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + *--(*p) = 0x00; + len += 1; + } + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, tag)); + + return (int) len; +} + +int mbedtls_asn1_write_int(unsigned char **p, unsigned char *start, int val) +{ + return asn1_write_tagged_int(p, start, val, MBEDTLS_ASN1_INTEGER); +} + +int mbedtls_asn1_write_enum(unsigned char **p, unsigned char *start, int val) +{ + return asn1_write_tagged_int(p, start, val, MBEDTLS_ASN1_ENUMERATED); +} + +int mbedtls_asn1_write_tagged_string(unsigned char **p, unsigned char *start, int tag, + const char *text, size_t text_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_raw_buffer(p, start, + (const unsigned char *) text, + text_len)); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, tag)); + + return (int) len; +} + +int mbedtls_asn1_write_utf8_string(unsigned char **p, unsigned char *start, + const char *text, size_t text_len) +{ + return mbedtls_asn1_write_tagged_string(p, start, MBEDTLS_ASN1_UTF8_STRING, text, text_len); +} + +int mbedtls_asn1_write_printable_string(unsigned char **p, unsigned char *start, + const char *text, size_t text_len) +{ + return mbedtls_asn1_write_tagged_string(p, start, MBEDTLS_ASN1_PRINTABLE_STRING, text, + text_len); +} + +int mbedtls_asn1_write_ia5_string(unsigned char **p, unsigned char *start, + const char *text, size_t text_len) +{ + return mbedtls_asn1_write_tagged_string(p, start, MBEDTLS_ASN1_IA5_STRING, text, text_len); +} + +int mbedtls_asn1_write_named_bitstring(unsigned char **p, + unsigned char *start, + const unsigned char *buf, + size_t bits) +{ + size_t unused_bits, byte_len; + const unsigned char *cur_byte; + unsigned char cur_byte_shifted; + unsigned char bit; + + byte_len = (bits + 7) / 8; + unused_bits = (byte_len * 8) - bits; + + /* + * Named bitstrings require that trailing 0s are excluded in the encoding + * of the bitstring. Trailing 0s are considered part of the 'unused' bits + * when encoding this value in the first content octet + */ + if (bits != 0) { + cur_byte = buf + byte_len - 1; + cur_byte_shifted = *cur_byte >> unused_bits; + + for (;;) { + bit = cur_byte_shifted & 0x1; + cur_byte_shifted >>= 1; + + if (bit != 0) { + break; + } + + bits--; + if (bits == 0) { + break; + } + + if (bits % 8 == 0) { + cur_byte_shifted = *--cur_byte; + } + } + } + + return mbedtls_asn1_write_bitstring(p, start, buf, bits); +} + +int mbedtls_asn1_write_bitstring(unsigned char **p, unsigned char *start, + const unsigned char *buf, size_t bits) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + size_t unused_bits, byte_len; + + byte_len = (bits + 7) / 8; + unused_bits = (byte_len * 8) - bits; + + if (*p < start || (size_t) (*p - start) < byte_len + 1) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + len = byte_len + 1; + + /* Write the bitstring. Ensure the unused bits are zeroed */ + if (byte_len > 0) { + byte_len--; + *--(*p) = buf[byte_len] & ~((0x1 << unused_bits) - 1); + (*p) -= byte_len; + memcpy(*p, buf, byte_len); + } + + /* Write unused bits */ + *--(*p) = (unsigned char) unused_bits; + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, MBEDTLS_ASN1_BIT_STRING)); + + return (int) len; +} + +int mbedtls_asn1_write_octet_string(unsigned char **p, unsigned char *start, + const unsigned char *buf, size_t size) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_raw_buffer(p, start, buf, size)); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, MBEDTLS_ASN1_OCTET_STRING)); + + return (int) len; +} + + +/* This is a copy of the ASN.1 parsing function mbedtls_asn1_find_named_data(), + * which is replicated to avoid a dependency ASN1_WRITE_C on ASN1_PARSE_C. */ +static mbedtls_asn1_named_data *asn1_find_named_data( + mbedtls_asn1_named_data *list, + const char *oid, size_t len) +{ + while (list != NULL) { + if (list->oid.len == len && + memcmp(list->oid.p, oid, len) == 0) { + break; + } + + list = list->next; + } + + return list; +} + +mbedtls_asn1_named_data *mbedtls_asn1_store_named_data( + mbedtls_asn1_named_data **head, + const char *oid, size_t oid_len, + const unsigned char *val, + size_t val_len) +{ + mbedtls_asn1_named_data *cur; + + if ((cur = asn1_find_named_data(*head, oid, oid_len)) == NULL) { + // Add new entry if not present yet based on OID + // + cur = (mbedtls_asn1_named_data *) mbedtls_calloc(1, + sizeof(mbedtls_asn1_named_data)); + if (cur == NULL) { + return NULL; + } + + cur->oid.len = oid_len; + cur->oid.p = mbedtls_calloc(1, oid_len); + if (cur->oid.p == NULL) { + mbedtls_free(cur); + return NULL; + } + + memcpy(cur->oid.p, oid, oid_len); + + cur->val.len = val_len; + if (val_len != 0) { + cur->val.p = mbedtls_calloc(1, val_len); + if (cur->val.p == NULL) { + mbedtls_free(cur->oid.p); + mbedtls_free(cur); + return NULL; + } + } + + cur->next = *head; + *head = cur; + } else if (val_len == 0) { + mbedtls_free(cur->val.p); + cur->val.p = NULL; + } else if (cur->val.len != val_len) { + /* + * Enlarge existing value buffer if needed + * Preserve old data until the allocation succeeded, to leave list in + * a consistent state in case allocation fails. + */ + void *p = mbedtls_calloc(1, val_len); + if (p == NULL) { + return NULL; + } + + mbedtls_free(cur->val.p); + cur->val.p = p; + cur->val.len = val_len; + } + + if (val != NULL && val_len != 0) { + memcpy(cur->val.p, val, val_len); + } + + return cur; +} +#endif /* MBEDTLS_ASN1_WRITE_C */ diff --git a/ext/opcua_client/mbedtls/library/base64.c b/ext/opcua_client/mbedtls/library/base64.c new file mode 100644 index 0000000..1f1a90a --- /dev/null +++ b/ext/opcua_client/mbedtls/library/base64.c @@ -0,0 +1,265 @@ +/* + * RFC 1521 base64 encoding/decoding + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_BASE64_C) + +#include "mbedtls/base64.h" +#include "constant_time_internal.h" + +#include + +#if defined(MBEDTLS_SELF_TEST) +#include +#include "mbedtls/platform.h" +#endif /* MBEDTLS_SELF_TEST */ + +#define BASE64_SIZE_T_MAX ((size_t) -1) /* SIZE_T_MAX is not standard */ + +/* + * Encode a buffer into base64 format + */ +int mbedtls_base64_encode(unsigned char *dst, size_t dlen, size_t *olen, + const unsigned char *src, size_t slen) +{ + size_t i, n; + int C1, C2, C3; + unsigned char *p; + + if (slen == 0) { + *olen = 0; + return 0; + } + + n = slen / 3 + (slen % 3 != 0); + + if (n > (BASE64_SIZE_T_MAX - 1) / 4) { + *olen = BASE64_SIZE_T_MAX; + return MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL; + } + + n *= 4; + + if ((dlen < n + 1) || (NULL == dst)) { + *olen = n + 1; + return MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL; + } + + n = (slen / 3) * 3; + + for (i = 0, p = dst; i < n; i += 3) { + C1 = *src++; + C2 = *src++; + C3 = *src++; + + *p++ = mbedtls_ct_base64_enc_char((C1 >> 2) & 0x3F); + *p++ = mbedtls_ct_base64_enc_char((((C1 & 3) << 4) + (C2 >> 4)) + & 0x3F); + *p++ = mbedtls_ct_base64_enc_char((((C2 & 15) << 2) + (C3 >> 6)) + & 0x3F); + *p++ = mbedtls_ct_base64_enc_char(C3 & 0x3F); + } + + if (i < slen) { + C1 = *src++; + C2 = ((i + 1) < slen) ? *src++ : 0; + + *p++ = mbedtls_ct_base64_enc_char((C1 >> 2) & 0x3F); + *p++ = mbedtls_ct_base64_enc_char((((C1 & 3) << 4) + (C2 >> 4)) + & 0x3F); + + if ((i + 1) < slen) { + *p++ = mbedtls_ct_base64_enc_char(((C2 & 15) << 2) & 0x3F); + } else { + *p++ = '='; + } + + *p++ = '='; + } + + *olen = p - dst; + *p = 0; + + return 0; +} + +/* + * Decode a base64-formatted buffer + */ +int mbedtls_base64_decode(unsigned char *dst, size_t dlen, size_t *olen, + const unsigned char *src, size_t slen) +{ + size_t i; /* index in source */ + size_t n; /* number of digits or trailing = in source */ + uint32_t x; /* value accumulator */ + unsigned accumulated_digits = 0; + unsigned equals = 0; + int spaces_present = 0; + unsigned char *p; + + /* First pass: check for validity and get output length */ + for (i = n = 0; i < slen; i++) { + /* Skip spaces before checking for EOL */ + spaces_present = 0; + while (i < slen && src[i] == ' ') { + ++i; + spaces_present = 1; + } + + /* Spaces at end of buffer are OK */ + if (i == slen) { + break; + } + + if ((slen - i) >= 2 && + src[i] == '\r' && src[i + 1] == '\n') { + continue; + } + + if (src[i] == '\n') { + continue; + } + + /* Space inside a line is an error */ + if (spaces_present) { + return MBEDTLS_ERR_BASE64_INVALID_CHARACTER; + } + + if (src[i] > 127) { + return MBEDTLS_ERR_BASE64_INVALID_CHARACTER; + } + + if (src[i] == '=') { + if (++equals > 2) { + return MBEDTLS_ERR_BASE64_INVALID_CHARACTER; + } + } else { + if (equals != 0) { + return MBEDTLS_ERR_BASE64_INVALID_CHARACTER; + } + if (mbedtls_ct_base64_dec_value(src[i]) < 0) { + return MBEDTLS_ERR_BASE64_INVALID_CHARACTER; + } + } + n++; + } + + if (n == 0) { + *olen = 0; + return 0; + } + + /* The following expression is to calculate the following formula without + * risk of integer overflow in n: + * n = ( ( n * 6 ) + 7 ) >> 3; + */ + n = (6 * (n >> 3)) + ((6 * (n & 0x7) + 7) >> 3); + n -= equals; + + if (dst == NULL || dlen < n) { + *olen = n; + return MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL; + } + + equals = 0; + for (x = 0, p = dst; i > 0; i--, src++) { + if (*src == '\r' || *src == '\n' || *src == ' ') { + continue; + } + + x = x << 6; + if (*src == '=') { + ++equals; + } else { + x |= mbedtls_ct_base64_dec_value(*src); + } + + if (++accumulated_digits == 4) { + accumulated_digits = 0; + *p++ = MBEDTLS_BYTE_2(x); + if (equals <= 1) { + *p++ = MBEDTLS_BYTE_1(x); + } + if (equals <= 0) { + *p++ = MBEDTLS_BYTE_0(x); + } + } + } + + *olen = p - dst; + + return 0; +} + +#if defined(MBEDTLS_SELF_TEST) + +static const unsigned char base64_test_dec[64] = +{ + 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD, + 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01, + 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09, + 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13, + 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31, + 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38, + 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B, + 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97 +}; + +static const unsigned char base64_test_enc[] = + "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK" + "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw=="; + +/* + * Checkup routine + */ +int mbedtls_base64_self_test(int verbose) +{ + size_t len; + const unsigned char *src; + unsigned char buffer[128]; + + if (verbose != 0) { + mbedtls_printf(" Base64 encoding test: "); + } + + src = base64_test_dec; + + if (mbedtls_base64_encode(buffer, sizeof(buffer), &len, src, 64) != 0 || + memcmp(base64_test_enc, buffer, 88) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + return 1; + } + + if (verbose != 0) { + mbedtls_printf("passed\n Base64 decoding test: "); + } + + src = base64_test_enc; + + if (mbedtls_base64_decode(buffer, sizeof(buffer), &len, src, 88) != 0 || + memcmp(base64_test_dec, buffer, 64) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + return 1; + } + + if (verbose != 0) { + mbedtls_printf("passed\n\n"); + } + + return 0; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_BASE64_C */ diff --git a/ext/opcua_client/mbedtls/library/bignum.c b/ext/opcua_client/mbedtls/library/bignum.c new file mode 100644 index 0000000..fadd9e9 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/bignum.c @@ -0,0 +1,3187 @@ +/* + * Multi-precision integer library + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * The following sources were referenced in the design of this Multi-precision + * Integer library: + * + * [1] Handbook of Applied Cryptography - 1997 + * Menezes, van Oorschot and Vanstone + * + * [2] Multi-Precision Math + * Tom St Denis + * https://github.com/libtom/libtommath/blob/develop/tommath.pdf + * + * [3] GNU Multi-Precision Arithmetic Library + * https://gmplib.org/manual/index.html + * + */ + +#include "common.h" + +#if defined(MBEDTLS_BIGNUM_C) + +#include "mbedtls/bignum.h" +#include "mbedtls/bn_mul.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" +#include "constant_time_internal.h" +#include "bignum_internal.h" + +#include +#include + +#include "mbedtls/platform.h" + +#define MPI_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_MPI_BAD_INPUT_DATA) +#define MPI_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +#define ciL (sizeof(mbedtls_mpi_uint)) /* chars in limb */ +#define biL (ciL << 3) /* bits in limb */ +#define biH (ciL << 2) /* half limb size */ + +#define MPI_SIZE_T_MAX ((size_t) -1) /* SIZE_T_MAX is not standard */ + +/* + * Convert between bits/chars and number of limbs + * Divide first in order to avoid potential overflows + */ +#define BITS_TO_LIMBS(i) ((i) / biL + ((i) % biL != 0)) +#define CHARS_TO_LIMBS(i) ((i) / ciL + ((i) % ciL != 0)) + +/* Implementation that should never be optimized out by the compiler */ +static void mbedtls_mpi_zeroize(mbedtls_mpi_uint *v, size_t n) +{ + mbedtls_platform_zeroize(v, ciL * n); +} + +/* + * Initialize one MPI + */ +void mbedtls_mpi_init(mbedtls_mpi *X) +{ + MPI_VALIDATE(X != NULL); + + X->s = 1; + X->n = 0; + X->p = NULL; +} + +/* + * Unallocate one MPI + */ +void mbedtls_mpi_free(mbedtls_mpi *X) +{ + if (X == NULL) { + return; + } + + if (X->p != NULL) { + mbedtls_mpi_zeroize(X->p, X->n); + mbedtls_free(X->p); + } + + X->s = 1; + X->n = 0; + X->p = NULL; +} + +/* + * Enlarge to the specified number of limbs + */ +int mbedtls_mpi_grow(mbedtls_mpi *X, size_t nblimbs) +{ + mbedtls_mpi_uint *p; + MPI_VALIDATE_RET(X != NULL); + + if (nblimbs > MBEDTLS_MPI_MAX_LIMBS) { + return MBEDTLS_ERR_MPI_ALLOC_FAILED; + } + + if (X->n < nblimbs) { + if ((p = (mbedtls_mpi_uint *) mbedtls_calloc(nblimbs, ciL)) == NULL) { + return MBEDTLS_ERR_MPI_ALLOC_FAILED; + } + + if (X->p != NULL) { + memcpy(p, X->p, X->n * ciL); + mbedtls_mpi_zeroize(X->p, X->n); + mbedtls_free(X->p); + } + + X->n = nblimbs; + X->p = p; + } + + return 0; +} + +/* + * Resize down as much as possible, + * while keeping at least the specified number of limbs + */ +int mbedtls_mpi_shrink(mbedtls_mpi *X, size_t nblimbs) +{ + mbedtls_mpi_uint *p; + size_t i; + MPI_VALIDATE_RET(X != NULL); + + if (nblimbs > MBEDTLS_MPI_MAX_LIMBS) { + return MBEDTLS_ERR_MPI_ALLOC_FAILED; + } + + /* Actually resize up if there are currently fewer than nblimbs limbs. */ + if (X->n <= nblimbs) { + return mbedtls_mpi_grow(X, nblimbs); + } + /* After this point, then X->n > nblimbs and in particular X->n > 0. */ + + for (i = X->n - 1; i > 0; i--) { + if (X->p[i] != 0) { + break; + } + } + i++; + + if (i < nblimbs) { + i = nblimbs; + } + + if ((p = (mbedtls_mpi_uint *) mbedtls_calloc(i, ciL)) == NULL) { + return MBEDTLS_ERR_MPI_ALLOC_FAILED; + } + + if (X->p != NULL) { + memcpy(p, X->p, i * ciL); + mbedtls_mpi_zeroize(X->p, X->n); + mbedtls_free(X->p); + } + + X->n = i; + X->p = p; + + return 0; +} + +/* Resize X to have exactly n limbs and set it to 0. */ +static int mbedtls_mpi_resize_clear(mbedtls_mpi *X, size_t limbs) +{ + if (limbs == 0) { + mbedtls_mpi_free(X); + return 0; + } else if (X->n == limbs) { + memset(X->p, 0, limbs * ciL); + X->s = 1; + return 0; + } else { + mbedtls_mpi_free(X); + return mbedtls_mpi_grow(X, limbs); + } +} + +/* + * Copy the contents of Y into X. + * + * This function is not constant-time. Leading zeros in Y may be removed. + * + * Ensure that X does not shrink. This is not guaranteed by the public API, + * but some code in the bignum module relies on this property, for example + * in mbedtls_mpi_exp_mod(). + */ +int mbedtls_mpi_copy(mbedtls_mpi *X, const mbedtls_mpi *Y) +{ + int ret = 0; + size_t i; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(Y != NULL); + + if (X == Y) { + return 0; + } + + if (Y->n == 0) { + if (X->n != 0) { + X->s = 1; + memset(X->p, 0, X->n * ciL); + } + return 0; + } + + for (i = Y->n - 1; i > 0; i--) { + if (Y->p[i] != 0) { + break; + } + } + i++; + + X->s = Y->s; + + if (X->n < i) { + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, i)); + } else { + memset(X->p + i, 0, (X->n - i) * ciL); + } + + memcpy(X->p, Y->p, i * ciL); + +cleanup: + + return ret; +} + +/* + * Swap the contents of X and Y + */ +void mbedtls_mpi_swap(mbedtls_mpi *X, mbedtls_mpi *Y) +{ + mbedtls_mpi T; + MPI_VALIDATE(X != NULL); + MPI_VALIDATE(Y != NULL); + + memcpy(&T, X, sizeof(mbedtls_mpi)); + memcpy(X, Y, sizeof(mbedtls_mpi)); + memcpy(Y, &T, sizeof(mbedtls_mpi)); +} + +static inline mbedtls_mpi_uint mpi_sint_abs(mbedtls_mpi_sint z) +{ + if (z >= 0) { + return z; + } + /* Take care to handle the most negative value (-2^(biL-1)) correctly. + * A naive -z would have undefined behavior. + * Write this in a way that makes popular compilers happy (GCC, Clang, + * MSVC). */ + return (mbedtls_mpi_uint) 0 - (mbedtls_mpi_uint) z; +} + +/* + * Set value from integer + */ +int mbedtls_mpi_lset(mbedtls_mpi *X, mbedtls_mpi_sint z) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + MPI_VALIDATE_RET(X != NULL); + + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, 1)); + memset(X->p, 0, X->n * ciL); + + X->p[0] = mpi_sint_abs(z); + X->s = (z < 0) ? -1 : 1; + +cleanup: + + return ret; +} + +/* + * Get a specific bit + */ +int mbedtls_mpi_get_bit(const mbedtls_mpi *X, size_t pos) +{ + MPI_VALIDATE_RET(X != NULL); + + if (X->n * biL <= pos) { + return 0; + } + + return (X->p[pos / biL] >> (pos % biL)) & 0x01; +} + +/* Get a specific byte, without range checks. */ +#define GET_BYTE(X, i) \ + (((X)->p[(i) / ciL] >> (((i) % ciL) * 8)) & 0xff) + +/* + * Set a bit to a specific value of 0 or 1 + */ +int mbedtls_mpi_set_bit(mbedtls_mpi *X, size_t pos, unsigned char val) +{ + int ret = 0; + size_t off = pos / biL; + size_t idx = pos % biL; + MPI_VALIDATE_RET(X != NULL); + + if (val != 0 && val != 1) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + if (X->n * biL <= pos) { + if (val == 0) { + return 0; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, off + 1)); + } + + X->p[off] &= ~((mbedtls_mpi_uint) 0x01 << idx); + X->p[off] |= (mbedtls_mpi_uint) val << idx; + +cleanup: + + return ret; +} + +/* + * Return the number of less significant zero-bits + */ +size_t mbedtls_mpi_lsb(const mbedtls_mpi *X) +{ + size_t i, j, count = 0; + MBEDTLS_INTERNAL_VALIDATE_RET(X != NULL, 0); + + for (i = 0; i < X->n; i++) { + for (j = 0; j < biL; j++, count++) { + if (((X->p[i] >> j) & 1) != 0) { + return count; + } + } + } + + return 0; +} + +/* + * Count leading zero bits in a given integer + */ +static size_t mbedtls_clz(const mbedtls_mpi_uint x) +{ + size_t j; + mbedtls_mpi_uint mask = (mbedtls_mpi_uint) 1 << (biL - 1); + + for (j = 0; j < biL; j++) { + if (x & mask) { + break; + } + + mask >>= 1; + } + + return j; +} + +/* + * Return the number of bits + */ +size_t mbedtls_mpi_bitlen(const mbedtls_mpi *X) +{ + size_t i, j; + + if (X->n == 0) { + return 0; + } + + for (i = X->n - 1; i > 0; i--) { + if (X->p[i] != 0) { + break; + } + } + + j = biL - mbedtls_clz(X->p[i]); + + return (i * biL) + j; +} + +/* + * Return the total size in bytes + */ +size_t mbedtls_mpi_size(const mbedtls_mpi *X) +{ + return (mbedtls_mpi_bitlen(X) + 7) >> 3; +} + +/* + * Convert an ASCII character to digit value + */ +static int mpi_get_digit(mbedtls_mpi_uint *d, int radix, char c) +{ + *d = 255; + + if (c >= 0x30 && c <= 0x39) { + *d = c - 0x30; + } + if (c >= 0x41 && c <= 0x46) { + *d = c - 0x37; + } + if (c >= 0x61 && c <= 0x66) { + *d = c - 0x57; + } + + if (*d >= (mbedtls_mpi_uint) radix) { + return MBEDTLS_ERR_MPI_INVALID_CHARACTER; + } + + return 0; +} + +/* + * Import from an ASCII string + */ +int mbedtls_mpi_read_string(mbedtls_mpi *X, int radix, const char *s) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i, j, slen, n; + int sign = 1; + mbedtls_mpi_uint d; + mbedtls_mpi T; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(s != NULL); + + if (radix < 2 || radix > 16) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + mbedtls_mpi_init(&T); + + if (s[0] == 0) { + mbedtls_mpi_free(X); + return 0; + } + + if (s[0] == '-') { + ++s; + sign = -1; + } + + slen = strlen(s); + + if (radix == 16) { + if (slen > MPI_SIZE_T_MAX >> 2) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + n = BITS_TO_LIMBS(slen << 2); + + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, n)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(X, 0)); + + for (i = slen, j = 0; i > 0; i--, j++) { + MBEDTLS_MPI_CHK(mpi_get_digit(&d, radix, s[i - 1])); + X->p[j / (2 * ciL)] |= d << ((j % (2 * ciL)) << 2); + } + } else { + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(X, 0)); + + for (i = 0; i < slen; i++) { + MBEDTLS_MPI_CHK(mpi_get_digit(&d, radix, s[i])); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_int(&T, X, radix)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(X, &T, d)); + } + } + + if (sign < 0 && mbedtls_mpi_bitlen(X) != 0) { + X->s = -1; + } + +cleanup: + + mbedtls_mpi_free(&T); + + return ret; +} + +/* + * Helper to write the digits high-order first. + */ +static int mpi_write_hlp(mbedtls_mpi *X, int radix, + char **p, const size_t buflen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi_uint r; + size_t length = 0; + char *p_end = *p + buflen; + + do { + if (length >= buflen) { + return MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_int(&r, X, radix)); + MBEDTLS_MPI_CHK(mbedtls_mpi_div_int(X, NULL, X, radix)); + /* + * Write the residue in the current position, as an ASCII character. + */ + if (r < 0xA) { + *(--p_end) = (char) ('0' + r); + } else { + *(--p_end) = (char) ('A' + (r - 0xA)); + } + + length++; + } while (mbedtls_mpi_cmp_int(X, 0) != 0); + + memmove(*p, p_end, length); + *p += length; + +cleanup: + + return ret; +} + +/* + * Export into an ASCII string + */ +int mbedtls_mpi_write_string(const mbedtls_mpi *X, int radix, + char *buf, size_t buflen, size_t *olen) +{ + int ret = 0; + size_t n; + char *p; + mbedtls_mpi T; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(olen != NULL); + MPI_VALIDATE_RET(buflen == 0 || buf != NULL); + + if (radix < 2 || radix > 16) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + n = mbedtls_mpi_bitlen(X); /* Number of bits necessary to present `n`. */ + if (radix >= 4) { + n >>= 1; /* Number of 4-adic digits necessary to present + * `n`. If radix > 4, this might be a strict + * overapproximation of the number of + * radix-adic digits needed to present `n`. */ + } + if (radix >= 16) { + n >>= 1; /* Number of hexadecimal digits necessary to + * present `n`. */ + + } + n += 1; /* Terminating null byte */ + n += 1; /* Compensate for the divisions above, which round down `n` + * in case it's not even. */ + n += 1; /* Potential '-'-sign. */ + n += (n & 1); /* Make n even to have enough space for hexadecimal writing, + * which always uses an even number of hex-digits. */ + + if (buflen < n) { + *olen = n; + return MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL; + } + + p = buf; + mbedtls_mpi_init(&T); + + if (X->s == -1) { + *p++ = '-'; + buflen--; + } + + if (radix == 16) { + int c; + size_t i, j, k; + + for (i = X->n, k = 0; i > 0; i--) { + for (j = ciL; j > 0; j--) { + c = (X->p[i - 1] >> ((j - 1) << 3)) & 0xFF; + + if (c == 0 && k == 0 && (i + j) != 2) { + continue; + } + + *(p++) = "0123456789ABCDEF" [c / 16]; + *(p++) = "0123456789ABCDEF" [c % 16]; + k = 1; + } + } + } else { + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&T, X)); + + if (T.s == -1) { + T.s = 1; + } + + MBEDTLS_MPI_CHK(mpi_write_hlp(&T, radix, &p, buflen)); + } + + *p++ = '\0'; + *olen = p - buf; + +cleanup: + + mbedtls_mpi_free(&T); + + return ret; +} + +#if defined(MBEDTLS_FS_IO) +/* + * Read X from an opened file + */ +int mbedtls_mpi_read_file(mbedtls_mpi *X, int radix, FILE *fin) +{ + mbedtls_mpi_uint d; + size_t slen; + char *p; + /* + * Buffer should have space for (short) label and decimal formatted MPI, + * newline characters and '\0' + */ + char s[MBEDTLS_MPI_RW_BUFFER_SIZE]; + + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(fin != NULL); + + if (radix < 2 || radix > 16) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + memset(s, 0, sizeof(s)); + if (fgets(s, sizeof(s) - 1, fin) == NULL) { + return MBEDTLS_ERR_MPI_FILE_IO_ERROR; + } + + slen = strlen(s); + if (slen == sizeof(s) - 2) { + return MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL; + } + + if (slen > 0 && s[slen - 1] == '\n') { + slen--; s[slen] = '\0'; + } + if (slen > 0 && s[slen - 1] == '\r') { + slen--; s[slen] = '\0'; + } + + p = s + slen; + while (p-- > s) { + if (mpi_get_digit(&d, radix, *p) != 0) { + break; + } + } + + return mbedtls_mpi_read_string(X, radix, p + 1); +} + +/* + * Write X into an opened file (or stdout if fout == NULL) + */ +int mbedtls_mpi_write_file(const char *p, const mbedtls_mpi *X, int radix, FILE *fout) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n, slen, plen; + /* + * Buffer should have space for (short) label and decimal formatted MPI, + * newline characters and '\0' + */ + char s[MBEDTLS_MPI_RW_BUFFER_SIZE]; + MPI_VALIDATE_RET(X != NULL); + + if (radix < 2 || radix > 16) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + memset(s, 0, sizeof(s)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_write_string(X, radix, s, sizeof(s) - 2, &n)); + + if (p == NULL) { + p = ""; + } + + plen = strlen(p); + slen = strlen(s); + s[slen++] = '\r'; + s[slen++] = '\n'; + + if (fout != NULL) { + if (fwrite(p, 1, plen, fout) != plen || + fwrite(s, 1, slen, fout) != slen) { + return MBEDTLS_ERR_MPI_FILE_IO_ERROR; + } + } else { + mbedtls_printf("%s%s", p, s); + } + +cleanup: + + return ret; +} +#endif /* MBEDTLS_FS_IO */ + + +/* Convert a big-endian byte array aligned to the size of mbedtls_mpi_uint + * into the storage form used by mbedtls_mpi. */ + +static mbedtls_mpi_uint mpi_uint_bigendian_to_host_c(mbedtls_mpi_uint x) +{ + uint8_t i; + unsigned char *x_ptr; + mbedtls_mpi_uint tmp = 0; + + for (i = 0, x_ptr = (unsigned char *) &x; i < ciL; i++, x_ptr++) { + tmp <<= CHAR_BIT; + tmp |= (mbedtls_mpi_uint) *x_ptr; + } + + return tmp; +} + +static mbedtls_mpi_uint mpi_uint_bigendian_to_host(mbedtls_mpi_uint x) +{ +#if defined(__BYTE_ORDER__) + +/* Nothing to do on bigendian systems. */ +#if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) + return x; +#endif /* __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ */ + +#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) + +/* For GCC and Clang, have builtins for byte swapping. */ +#if defined(__GNUC__) && defined(__GNUC_PREREQ) +#if __GNUC_PREREQ(4, 3) +#define have_bswap +#endif +#endif + +#if defined(__clang__) && defined(__has_builtin) +#if __has_builtin(__builtin_bswap32) && \ + __has_builtin(__builtin_bswap64) +#define have_bswap +#endif +#endif + +#if defined(have_bswap) + /* The compiler is hopefully able to statically evaluate this! */ + switch (sizeof(mbedtls_mpi_uint)) { + case 4: + return __builtin_bswap32(x); + case 8: + return __builtin_bswap64(x); + } +#endif +#endif /* __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ */ +#endif /* __BYTE_ORDER__ */ + + /* Fall back to C-based reordering if we don't know the byte order + * or we couldn't use a compiler-specific builtin. */ + return mpi_uint_bigendian_to_host_c(x); +} + +static void mpi_bigendian_to_host(mbedtls_mpi_uint * const p, size_t limbs) +{ + mbedtls_mpi_uint *cur_limb_left; + mbedtls_mpi_uint *cur_limb_right; + if (limbs == 0) { + return; + } + + /* + * Traverse limbs and + * - adapt byte-order in each limb + * - swap the limbs themselves. + * For that, simultaneously traverse the limbs from left to right + * and from right to left, as long as the left index is not bigger + * than the right index (it's not a problem if limbs is odd and the + * indices coincide in the last iteration). + */ + for (cur_limb_left = p, cur_limb_right = p + (limbs - 1); + cur_limb_left <= cur_limb_right; + cur_limb_left++, cur_limb_right--) { + mbedtls_mpi_uint tmp; + /* Note that if cur_limb_left == cur_limb_right, + * this code effectively swaps the bytes only once. */ + tmp = mpi_uint_bigendian_to_host(*cur_limb_left); + *cur_limb_left = mpi_uint_bigendian_to_host(*cur_limb_right); + *cur_limb_right = tmp; + } +} + +/* + * Import X from unsigned binary data, little endian + */ +int mbedtls_mpi_read_binary_le(mbedtls_mpi *X, + const unsigned char *buf, size_t buflen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i; + size_t const limbs = CHARS_TO_LIMBS(buflen); + + /* Ensure that target MPI has exactly the necessary number of limbs */ + MBEDTLS_MPI_CHK(mbedtls_mpi_resize_clear(X, limbs)); + + for (i = 0; i < buflen; i++) { + X->p[i / ciL] |= ((mbedtls_mpi_uint) buf[i]) << ((i % ciL) << 3); + } + +cleanup: + + /* + * This function is also used to import keys. However, wiping the buffers + * upon failure is not necessary because failure only can happen before any + * input is copied. + */ + return ret; +} + +/* + * Import X from unsigned binary data, big endian + */ +int mbedtls_mpi_read_binary(mbedtls_mpi *X, const unsigned char *buf, size_t buflen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t const limbs = CHARS_TO_LIMBS(buflen); + size_t const overhead = (limbs * ciL) - buflen; + unsigned char *Xp; + + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(buflen == 0 || buf != NULL); + + /* Ensure that target MPI has exactly the necessary number of limbs */ + MBEDTLS_MPI_CHK(mbedtls_mpi_resize_clear(X, limbs)); + + /* Avoid calling `memcpy` with NULL source or destination argument, + * even if buflen is 0. */ + if (buflen != 0) { + Xp = (unsigned char *) X->p; + memcpy(Xp + overhead, buf, buflen); + + mpi_bigendian_to_host(X->p, limbs); + } + +cleanup: + + /* + * This function is also used to import keys. However, wiping the buffers + * upon failure is not necessary because failure only can happen before any + * input is copied. + */ + return ret; +} + +/* + * Export X into unsigned binary data, little endian + */ +int mbedtls_mpi_write_binary_le(const mbedtls_mpi *X, + unsigned char *buf, size_t buflen) +{ + size_t stored_bytes = X->n * ciL; + size_t bytes_to_copy; + size_t i; + + if (stored_bytes < buflen) { + bytes_to_copy = stored_bytes; + } else { + bytes_to_copy = buflen; + + /* The output buffer is smaller than the allocated size of X. + * However X may fit if its leading bytes are zero. */ + for (i = bytes_to_copy; i < stored_bytes; i++) { + if (GET_BYTE(X, i) != 0) { + return MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL; + } + } + } + + for (i = 0; i < bytes_to_copy; i++) { + buf[i] = GET_BYTE(X, i); + } + + if (stored_bytes < buflen) { + /* Write trailing 0 bytes */ + memset(buf + stored_bytes, 0, buflen - stored_bytes); + } + + return 0; +} + +/* + * Export X into unsigned binary data, big endian + */ +int mbedtls_mpi_write_binary(const mbedtls_mpi *X, + unsigned char *buf, size_t buflen) +{ + size_t stored_bytes; + size_t bytes_to_copy; + unsigned char *p; + size_t i; + + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(buflen == 0 || buf != NULL); + + stored_bytes = X->n * ciL; + + if (stored_bytes < buflen) { + /* There is enough space in the output buffer. Write initial + * null bytes and record the position at which to start + * writing the significant bytes. In this case, the execution + * trace of this function does not depend on the value of the + * number. */ + bytes_to_copy = stored_bytes; + p = buf + buflen - stored_bytes; + memset(buf, 0, buflen - stored_bytes); + } else { + /* The output buffer is smaller than the allocated size of X. + * However X may fit if its leading bytes are zero. */ + bytes_to_copy = buflen; + p = buf; + for (i = bytes_to_copy; i < stored_bytes; i++) { + if (GET_BYTE(X, i) != 0) { + return MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL; + } + } + } + + for (i = 0; i < bytes_to_copy; i++) { + p[bytes_to_copy - i - 1] = GET_BYTE(X, i); + } + + return 0; +} + +/* + * Left-shift: X <<= count + */ +int mbedtls_mpi_shift_l(mbedtls_mpi *X, size_t count) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i, v0, t1; + mbedtls_mpi_uint r0 = 0, r1; + MPI_VALIDATE_RET(X != NULL); + + v0 = count / (biL); + t1 = count & (biL - 1); + + i = mbedtls_mpi_bitlen(X) + count; + + if (X->n * biL < i) { + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, BITS_TO_LIMBS(i))); + } + + ret = 0; + + /* + * shift by count / limb_size + */ + if (v0 > 0) { + for (i = X->n; i > v0; i--) { + X->p[i - 1] = X->p[i - v0 - 1]; + } + + for (; i > 0; i--) { + X->p[i - 1] = 0; + } + } + + /* + * shift by count % limb_size + */ + if (t1 > 0) { + for (i = v0; i < X->n; i++) { + r1 = X->p[i] >> (biL - t1); + X->p[i] <<= t1; + X->p[i] |= r0; + r0 = r1; + } + } + +cleanup: + + return ret; +} + +/* + * Right-shift: X >>= count + */ +int mbedtls_mpi_shift_r(mbedtls_mpi *X, size_t count) +{ + size_t i, v0, v1; + mbedtls_mpi_uint r0 = 0, r1; + MPI_VALIDATE_RET(X != NULL); + + v0 = count / biL; + v1 = count & (biL - 1); + + if (v0 > X->n || (v0 == X->n && v1 > 0)) { + return mbedtls_mpi_lset(X, 0); + } + + /* + * shift by count / limb_size + */ + if (v0 > 0) { + for (i = 0; i < X->n - v0; i++) { + X->p[i] = X->p[i + v0]; + } + + for (; i < X->n; i++) { + X->p[i] = 0; + } + } + + /* + * shift by count % limb_size + */ + if (v1 > 0) { + for (i = X->n; i > 0; i--) { + r1 = X->p[i - 1] << (biL - v1); + X->p[i - 1] >>= v1; + X->p[i - 1] |= r0; + r0 = r1; + } + } + + return 0; +} + +/* + * Compare unsigned values + */ +int mbedtls_mpi_cmp_abs(const mbedtls_mpi *X, const mbedtls_mpi *Y) +{ + size_t i, j; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(Y != NULL); + + for (i = X->n; i > 0; i--) { + if (X->p[i - 1] != 0) { + break; + } + } + + for (j = Y->n; j > 0; j--) { + if (Y->p[j - 1] != 0) { + break; + } + } + + if (i == 0 && j == 0) { + return 0; + } + + if (i > j) { + return 1; + } + if (j > i) { + return -1; + } + + for (; i > 0; i--) { + if (X->p[i - 1] > Y->p[i - 1]) { + return 1; + } + if (X->p[i - 1] < Y->p[i - 1]) { + return -1; + } + } + + return 0; +} + +/* + * Compare signed values + */ +int mbedtls_mpi_cmp_mpi(const mbedtls_mpi *X, const mbedtls_mpi *Y) +{ + size_t i, j; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(Y != NULL); + + for (i = X->n; i > 0; i--) { + if (X->p[i - 1] != 0) { + break; + } + } + + for (j = Y->n; j > 0; j--) { + if (Y->p[j - 1] != 0) { + break; + } + } + + if (i == 0 && j == 0) { + return 0; + } + + if (i > j) { + return X->s; + } + if (j > i) { + return -Y->s; + } + + if (X->s > 0 && Y->s < 0) { + return 1; + } + if (Y->s > 0 && X->s < 0) { + return -1; + } + + for (; i > 0; i--) { + if (X->p[i - 1] > Y->p[i - 1]) { + return X->s; + } + if (X->p[i - 1] < Y->p[i - 1]) { + return -X->s; + } + } + + return 0; +} + +/* + * Compare signed values + */ +int mbedtls_mpi_cmp_int(const mbedtls_mpi *X, mbedtls_mpi_sint z) +{ + mbedtls_mpi Y; + mbedtls_mpi_uint p[1]; + MPI_VALIDATE_RET(X != NULL); + + *p = mpi_sint_abs(z); + Y.s = (z < 0) ? -1 : 1; + Y.n = 1; + Y.p = p; + + return mbedtls_mpi_cmp_mpi(X, &Y); +} + +/* + * Unsigned addition: X = |A| + |B| (HAC 14.7) + */ +int mbedtls_mpi_add_abs(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i, j; + mbedtls_mpi_uint *o, *p, c, tmp; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(A != NULL); + MPI_VALIDATE_RET(B != NULL); + + if (X == B) { + const mbedtls_mpi *T = A; A = X; B = T; + } + + if (X != A) { + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(X, A)); + } + + /* + * X should always be positive as a result of unsigned additions. + */ + X->s = 1; + + for (j = B->n; j > 0; j--) { + if (B->p[j - 1] != 0) { + break; + } + } + + /* Exit early to avoid undefined behavior on NULL+0 when X->n == 0 + * and B is 0 (of any size). */ + if (j == 0) { + return 0; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, j)); + + o = B->p; p = X->p; c = 0; + + /* + * tmp is used because it might happen that p == o + */ + for (i = 0; i < j; i++, o++, p++) { + tmp = *o; + *p += c; c = (*p < c); + *p += tmp; c += (*p < tmp); + } + + while (c != 0) { + if (i >= X->n) { + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, i + 1)); + p = X->p + i; + } + + *p += c; c = (*p < c); i++; p++; + } + +cleanup: + + return ret; +} + +/** + * Helper for mbedtls_mpi subtraction. + * + * Calculate l - r where l and r have the same size. + * This function operates modulo (2^ciL)^n and returns the carry + * (1 if there was a wraparound, i.e. if `l < r`, and 0 otherwise). + * + * d may be aliased to l or r. + * + * \param n Number of limbs of \p d, \p l and \p r. + * \param[out] d The result of the subtraction. + * \param[in] l The left operand. + * \param[in] r The right operand. + * + * \return 1 if `l < r`. + * 0 if `l >= r`. + */ +static mbedtls_mpi_uint mpi_sub_hlp(size_t n, + mbedtls_mpi_uint *d, + const mbedtls_mpi_uint *l, + const mbedtls_mpi_uint *r) +{ + size_t i; + mbedtls_mpi_uint c = 0, t, z; + + for (i = 0; i < n; i++) { + z = (l[i] < c); t = l[i] - c; + c = (t < r[i]) + z; d[i] = t - r[i]; + } + + return c; +} + +/* + * Unsigned subtraction: X = |A| - |B| (HAC 14.9, 14.10) + */ +int mbedtls_mpi_sub_abs(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n; + mbedtls_mpi_uint carry; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(A != NULL); + MPI_VALIDATE_RET(B != NULL); + + for (n = B->n; n > 0; n--) { + if (B->p[n - 1] != 0) { + break; + } + } + if (n > A->n) { + /* B >= (2^ciL)^n > A */ + ret = MBEDTLS_ERR_MPI_NEGATIVE_VALUE; + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, A->n)); + + /* Set the high limbs of X to match A. Don't touch the lower limbs + * because X might be aliased to B, and we must not overwrite the + * significant digits of B. */ + if (A->n > n && A != X) { + memcpy(X->p + n, A->p + n, (A->n - n) * ciL); + } + if (X->n > A->n) { + memset(X->p + A->n, 0, (X->n - A->n) * ciL); + } + + carry = mpi_sub_hlp(n, X->p, A->p, B->p); + if (carry != 0) { + /* Propagate the carry to the first nonzero limb of X. */ + for (; n < X->n && X->p[n] == 0; n++) { + --X->p[n]; + } + /* If we ran out of space for the carry, it means that the result + * is negative. */ + if (n == X->n) { + ret = MBEDTLS_ERR_MPI_NEGATIVE_VALUE; + goto cleanup; + } + --X->p[n]; + } + + /* X should always be positive as a result of unsigned subtractions. */ + X->s = 1; + +cleanup: + return ret; +} + +/* Common function for signed addition and subtraction. + * Calculate A + B * flip_B where flip_B is 1 or -1. + */ +static int add_sub_mpi(mbedtls_mpi *X, + const mbedtls_mpi *A, const mbedtls_mpi *B, + int flip_B) +{ + int ret, s; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(A != NULL); + MPI_VALIDATE_RET(B != NULL); + + s = A->s; + if (A->s * B->s * flip_B < 0) { + int cmp = mbedtls_mpi_cmp_abs(A, B); + if (cmp >= 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_abs(X, A, B)); + /* If |A| = |B|, the result is 0 and we must set the sign bit + * to +1 regardless of which of A or B was negative. Otherwise, + * since |A| > |B|, the sign is the sign of A. */ + X->s = cmp == 0 ? 1 : s; + } else { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_abs(X, B, A)); + /* Since |A| < |B|, the sign is the opposite of A. */ + X->s = -s; + } + } else { + MBEDTLS_MPI_CHK(mbedtls_mpi_add_abs(X, A, B)); + X->s = s; + } + +cleanup: + + return ret; +} + +/* + * Signed addition: X = A + B + */ +int mbedtls_mpi_add_mpi(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B) +{ + return add_sub_mpi(X, A, B, 1); +} + +/* + * Signed subtraction: X = A - B + */ +int mbedtls_mpi_sub_mpi(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B) +{ + return add_sub_mpi(X, A, B, -1); +} + +/* + * Signed addition: X = A + b + */ +int mbedtls_mpi_add_int(mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b) +{ + mbedtls_mpi B; + mbedtls_mpi_uint p[1]; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(A != NULL); + + p[0] = mpi_sint_abs(b); + B.s = (b < 0) ? -1 : 1; + B.n = 1; + B.p = p; + + return mbedtls_mpi_add_mpi(X, A, &B); +} + +/* + * Signed subtraction: X = A - b + */ +int mbedtls_mpi_sub_int(mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b) +{ + mbedtls_mpi B; + mbedtls_mpi_uint p[1]; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(A != NULL); + + p[0] = mpi_sint_abs(b); + B.s = (b < 0) ? -1 : 1; + B.n = 1; + B.p = p; + + return mbedtls_mpi_sub_mpi(X, A, &B); +} + +/** Helper for mbedtls_mpi multiplication. + * + * Add \p b * \p s to \p d. + * + * \param i The number of limbs of \p s. + * \param[in] s A bignum to multiply, of size \p i. + * It may overlap with \p d, but only if + * \p d <= \p s. + * Its leading limb must not be \c 0. + * \param[in,out] d The bignum to add to. + * It must be sufficiently large to store the + * result of the multiplication. This means + * \p i + 1 limbs if \p d[\p i - 1] started as 0 and \p b + * is not known a priori. + * \param b A scalar to multiply. + */ +static +#if defined(__APPLE__) && defined(__arm__) +/* + * Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn) + * appears to need this to prevent bad ARM code generation at -O3. + */ +__attribute__((noinline)) +#endif +void mpi_mul_hlp(size_t i, + const mbedtls_mpi_uint *s, + mbedtls_mpi_uint *d, + mbedtls_mpi_uint b) +{ + mbedtls_mpi_uint c = 0, t = 0; + (void) t; /* Unused in some architectures */ + +#if defined(MULADDC_HUIT) + for (; i >= 8; i -= 8) { + MULADDC_INIT + MULADDC_HUIT + MULADDC_STOP + } + + for (; i > 0; i--) { + MULADDC_INIT + MULADDC_CORE + MULADDC_STOP + } +#else /* MULADDC_HUIT */ + for (; i >= 16; i -= 16) { + MULADDC_INIT + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_STOP + } + + for (; i >= 8; i -= 8) { + MULADDC_INIT + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_STOP + } + + for (; i > 0; i--) { + MULADDC_INIT + MULADDC_CORE + MULADDC_STOP + } +#endif /* MULADDC_HUIT */ + + while (c != 0) { + *d += c; c = (*d < c); d++; + } +} + +/* + * Baseline multiplication: X = A * B (HAC 14.12) + */ +int mbedtls_mpi_mul_mpi(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i, j; + mbedtls_mpi TA, TB; + int result_is_zero = 0; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(A != NULL); + MPI_VALIDATE_RET(B != NULL); + + mbedtls_mpi_init(&TA); mbedtls_mpi_init(&TB); + + if (X == A) { + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TA, A)); A = &TA; + } + if (X == B) { + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TB, B)); B = &TB; + } + + for (i = A->n; i > 0; i--) { + if (A->p[i - 1] != 0) { + break; + } + } + if (i == 0) { + result_is_zero = 1; + } + + for (j = B->n; j > 0; j--) { + if (B->p[j - 1] != 0) { + break; + } + } + if (j == 0) { + result_is_zero = 1; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, i + j)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(X, 0)); + + for (; j > 0; j--) { + mpi_mul_hlp(i, A->p, X->p + j - 1, B->p[j - 1]); + } + + /* If the result is 0, we don't shortcut the operation, which reduces + * but does not eliminate side channels leaking the zero-ness. We do + * need to take care to set the sign bit properly since the library does + * not fully support an MPI object with a value of 0 and s == -1. */ + if (result_is_zero) { + X->s = 1; + } else { + X->s = A->s * B->s; + } + +cleanup: + + mbedtls_mpi_free(&TB); mbedtls_mpi_free(&TA); + + return ret; +} + +/* + * Baseline multiplication: X = A * b + */ +int mbedtls_mpi_mul_int(mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b) +{ + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(A != NULL); + + /* mpi_mul_hlp can't deal with a leading 0. */ + size_t n = A->n; + while (n > 0 && A->p[n - 1] == 0) { + --n; + } + + /* The general method below doesn't work if n==0 or b==0. By chance + * calculating the result is trivial in those cases. */ + if (b == 0 || n == 0) { + return mbedtls_mpi_lset(X, 0); + } + + /* Calculate A*b as A + A*(b-1) to take advantage of mpi_mul_hlp */ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + /* In general, A * b requires 1 limb more than b. If + * A->p[n - 1] * b / b == A->p[n - 1], then A * b fits in the same + * number of limbs as A and the call to grow() is not required since + * copy() will take care of the growth if needed. However, experimentally, + * making the call to grow() unconditional causes slightly fewer + * calls to calloc() in ECP code, presumably because it reuses the + * same mpi for a while and this way the mpi is more likely to directly + * grow to its final size. */ + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, n + 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(X, A)); + mpi_mul_hlp(n, A->p, X->p, b - 1); + +cleanup: + return ret; +} + +/* + * Unsigned integer divide - double mbedtls_mpi_uint dividend, u1/u0, and + * mbedtls_mpi_uint divisor, d + */ +static mbedtls_mpi_uint mbedtls_int_div_int(mbedtls_mpi_uint u1, + mbedtls_mpi_uint u0, + mbedtls_mpi_uint d, + mbedtls_mpi_uint *r) +{ +#if defined(MBEDTLS_HAVE_UDBL) + mbedtls_t_udbl dividend, quotient; +#else + const mbedtls_mpi_uint radix = (mbedtls_mpi_uint) 1 << biH; + const mbedtls_mpi_uint uint_halfword_mask = ((mbedtls_mpi_uint) 1 << biH) - 1; + mbedtls_mpi_uint d0, d1, q0, q1, rAX, r0, quotient; + mbedtls_mpi_uint u0_msw, u0_lsw; + size_t s; +#endif + + /* + * Check for overflow + */ + if (0 == d || u1 >= d) { + if (r != NULL) { + *r = ~(mbedtls_mpi_uint) 0u; + } + + return ~(mbedtls_mpi_uint) 0u; + } + +#if defined(MBEDTLS_HAVE_UDBL) + dividend = (mbedtls_t_udbl) u1 << biL; + dividend |= (mbedtls_t_udbl) u0; + quotient = dividend / d; + if (quotient > ((mbedtls_t_udbl) 1 << biL) - 1) { + quotient = ((mbedtls_t_udbl) 1 << biL) - 1; + } + + if (r != NULL) { + *r = (mbedtls_mpi_uint) (dividend - (quotient * d)); + } + + return (mbedtls_mpi_uint) quotient; +#else + + /* + * Algorithm D, Section 4.3.1 - The Art of Computer Programming + * Vol. 2 - Seminumerical Algorithms, Knuth + */ + + /* + * Normalize the divisor, d, and dividend, u0, u1 + */ + s = mbedtls_clz(d); + d = d << s; + + u1 = u1 << s; + u1 |= (u0 >> (biL - s)) & (-(mbedtls_mpi_sint) s >> (biL - 1)); + u0 = u0 << s; + + d1 = d >> biH; + d0 = d & uint_halfword_mask; + + u0_msw = u0 >> biH; + u0_lsw = u0 & uint_halfword_mask; + + /* + * Find the first quotient and remainder + */ + q1 = u1 / d1; + r0 = u1 - d1 * q1; + + while (q1 >= radix || (q1 * d0 > radix * r0 + u0_msw)) { + q1 -= 1; + r0 += d1; + + if (r0 >= radix) { + break; + } + } + + rAX = (u1 * radix) + (u0_msw - q1 * d); + q0 = rAX / d1; + r0 = rAX - q0 * d1; + + while (q0 >= radix || (q0 * d0 > radix * r0 + u0_lsw)) { + q0 -= 1; + r0 += d1; + + if (r0 >= radix) { + break; + } + } + + if (r != NULL) { + *r = (rAX * radix + u0_lsw - q0 * d) >> s; + } + + quotient = q1 * radix + q0; + + return quotient; +#endif +} + +/* + * Division by mbedtls_mpi: A = Q * B + R (HAC 14.20) + */ +int mbedtls_mpi_div_mpi(mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, + const mbedtls_mpi *B) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i, n, t, k; + mbedtls_mpi X, Y, Z, T1, T2; + mbedtls_mpi_uint TP2[3]; + MPI_VALIDATE_RET(A != NULL); + MPI_VALIDATE_RET(B != NULL); + + if (mbedtls_mpi_cmp_int(B, 0) == 0) { + return MBEDTLS_ERR_MPI_DIVISION_BY_ZERO; + } + + mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&Z); + mbedtls_mpi_init(&T1); + /* + * Avoid dynamic memory allocations for constant-size T2. + * + * T2 is used for comparison only and the 3 limbs are assigned explicitly, + * so nobody increase the size of the MPI and we're safe to use an on-stack + * buffer. + */ + T2.s = 1; + T2.n = sizeof(TP2) / sizeof(*TP2); + T2.p = TP2; + + if (mbedtls_mpi_cmp_abs(A, B) < 0) { + if (Q != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(Q, 0)); + } + if (R != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(R, A)); + } + return 0; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&X, A)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&Y, B)); + X.s = Y.s = 1; + + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(&Z, A->n + 2)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&Z, 0)); + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(&T1, A->n + 2)); + + k = mbedtls_mpi_bitlen(&Y) % biL; + if (k < biL - 1) { + k = biL - 1 - k; + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&X, k)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&Y, k)); + } else { + k = 0; + } + + n = X.n - 1; + t = Y.n - 1; + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&Y, biL * (n - t))); + + while (mbedtls_mpi_cmp_mpi(&X, &Y) >= 0) { + Z.p[n - t]++; + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&X, &X, &Y)); + } + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&Y, biL * (n - t))); + + for (i = n; i > t; i--) { + if (X.p[i] >= Y.p[t]) { + Z.p[i - t - 1] = ~(mbedtls_mpi_uint) 0u; + } else { + Z.p[i - t - 1] = mbedtls_int_div_int(X.p[i], X.p[i - 1], + Y.p[t], NULL); + } + + T2.p[0] = (i < 2) ? 0 : X.p[i - 2]; + T2.p[1] = (i < 1) ? 0 : X.p[i - 1]; + T2.p[2] = X.p[i]; + + Z.p[i - t - 1]++; + do { + Z.p[i - t - 1]--; + + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&T1, 0)); + T1.p[0] = (t < 1) ? 0 : Y.p[t - 1]; + T1.p[1] = Y.p[t]; + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_int(&T1, &T1, Z.p[i - t - 1])); + } while (mbedtls_mpi_cmp_mpi(&T1, &T2) > 0); + + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_int(&T1, &Y, Z.p[i - t - 1])); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&T1, biL * (i - t - 1))); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&X, &X, &T1)); + + if (mbedtls_mpi_cmp_int(&X, 0) < 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&T1, &Y)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&T1, biL * (i - t - 1))); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&X, &X, &T1)); + Z.p[i - t - 1]--; + } + } + + if (Q != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(Q, &Z)); + Q->s = A->s * B->s; + } + + if (R != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&X, k)); + X.s = A->s; + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(R, &X)); + + if (mbedtls_mpi_cmp_int(R, 0) == 0) { + R->s = 1; + } + } + +cleanup: + + mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&Z); + mbedtls_mpi_free(&T1); + mbedtls_platform_zeroize(TP2, sizeof(TP2)); + + return ret; +} + +/* + * Division by int: A = Q * b + R + */ +int mbedtls_mpi_div_int(mbedtls_mpi *Q, mbedtls_mpi *R, + const mbedtls_mpi *A, + mbedtls_mpi_sint b) +{ + mbedtls_mpi B; + mbedtls_mpi_uint p[1]; + MPI_VALIDATE_RET(A != NULL); + + p[0] = mpi_sint_abs(b); + B.s = (b < 0) ? -1 : 1; + B.n = 1; + B.p = p; + + return mbedtls_mpi_div_mpi(Q, R, A, &B); +} + +/* + * Modulo: R = A mod B + */ +int mbedtls_mpi_mod_mpi(mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + MPI_VALIDATE_RET(R != NULL); + MPI_VALIDATE_RET(A != NULL); + MPI_VALIDATE_RET(B != NULL); + + if (mbedtls_mpi_cmp_int(B, 0) < 0) { + return MBEDTLS_ERR_MPI_NEGATIVE_VALUE; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_div_mpi(NULL, R, A, B)); + + while (mbedtls_mpi_cmp_int(R, 0) < 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(R, R, B)); + } + + while (mbedtls_mpi_cmp_mpi(R, B) >= 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(R, R, B)); + } + +cleanup: + + return ret; +} + +/* + * Modulo: r = A mod b + */ +int mbedtls_mpi_mod_int(mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b) +{ + size_t i; + mbedtls_mpi_uint x, y, z; + MPI_VALIDATE_RET(r != NULL); + MPI_VALIDATE_RET(A != NULL); + + if (b == 0) { + return MBEDTLS_ERR_MPI_DIVISION_BY_ZERO; + } + + if (b < 0) { + return MBEDTLS_ERR_MPI_NEGATIVE_VALUE; + } + + /* + * handle trivial cases + */ + if (b == 1 || A->n == 0) { + *r = 0; + return 0; + } + + if (b == 2) { + *r = A->p[0] & 1; + return 0; + } + + /* + * general case + */ + for (i = A->n, y = 0; i > 0; i--) { + x = A->p[i - 1]; + y = (y << biH) | (x >> biH); + z = y / b; + y -= z * b; + + x <<= biH; + y = (y << biH) | (x >> biH); + z = y / b; + y -= z * b; + } + + /* + * If A is negative, then the current y represents a negative value. + * Flipping it to the positive side. + */ + if (A->s < 0 && y != 0) { + y = b - y; + } + + *r = y; + + return 0; +} + +/* + * Fast Montgomery initialization (thanks to Tom St Denis) + */ +mbedtls_mpi_uint mbedtls_mpi_montmul_init(const mbedtls_mpi_uint *N) +{ + mbedtls_mpi_uint x = N[0]; + + x += ((N[0] + 2) & 4) << 1; + + for (unsigned int i = biL; i >= 8; i /= 2) { + x *= (2 - (N[0] * x)); + } + + return ~x + 1; +} + +void mbedtls_mpi_montmul(mbedtls_mpi *A, + const mbedtls_mpi *B, + const mbedtls_mpi *N, + mbedtls_mpi_uint mm, + const mbedtls_mpi *T) +{ + size_t i, n, m; + mbedtls_mpi_uint u0, u1, *d; + + memset(T->p, 0, T->n * ciL); + + d = T->p; + n = N->n; + m = (B->n < n) ? B->n : n; + + for (i = 0; i < n; i++) { + /* + * T = (T + u0*B + u1*N) / 2^biL + */ + u0 = A->p[i]; + u1 = (d[0] + u0 * B->p[0]) * mm; + + mpi_mul_hlp(m, B->p, d, u0); + mpi_mul_hlp(n, N->p, d, u1); + + *d++ = u0; d[n + 1] = 0; + } + + /* At this point, d is either the desired result or the desired result + * plus N. We now potentially subtract N, avoiding leaking whether the + * subtraction is performed through side channels. */ + + /* Copy the n least significant limbs of d to A, so that + * A = d if d < N (recall that N has n limbs). */ + memcpy(A->p, d, n * ciL); + /* If d >= N then we want to set A to d - N. To prevent timing attacks, + * do the calculation without using conditional tests. */ + /* Set d to d0 + (2^biL)^n - N where d0 is the current value of d. */ + d[n] += 1; + d[n] -= mpi_sub_hlp(n, d, d, N->p); + /* If d0 < N then d < (2^biL)^n + * so d[n] == 0 and we want to keep A as it is. + * If d0 >= N then d >= (2^biL)^n, and d <= (2^biL)^n + N < 2 * (2^biL)^n + * so d[n] == 1 and we want to set A to the result of the subtraction + * which is d - (2^biL)^n, i.e. the n least significant limbs of d. + * This exactly corresponds to a conditional assignment. */ + mbedtls_ct_mpi_uint_cond_assign(n, A->p, d, (unsigned char) d[n]); +} + +/* + * Montgomery reduction: A = A * R^-1 mod N + * + * See mbedtls_mpi_montmul() regarding constraints and guarantees on the + * parameters. + */ +static void mpi_montred(mbedtls_mpi *A, const mbedtls_mpi *N, + mbedtls_mpi_uint mm, const mbedtls_mpi *T) +{ + mbedtls_mpi_uint z = 1; + mbedtls_mpi U; + + U.n = U.s = (int) z; + U.p = &z; + + mbedtls_mpi_montmul(A, &U, N, mm, T); +} + +/** + * Select an MPI from a table without leaking the index. + * + * This is functionally equivalent to mbedtls_mpi_copy(R, T[idx]) except it + * reads the entire table in order to avoid leaking the value of idx to an + * attacker able to observe memory access patterns. + * + * \param[out] R Where to write the selected MPI. + * \param[in] T The table to read from. + * \param[in] T_size The number of elements in the table. + * \param[in] idx The index of the element to select; + * this must satisfy 0 <= idx < T_size. + * + * \return \c 0 on success, or a negative error code. + */ +static int mpi_select(mbedtls_mpi *R, const mbedtls_mpi *T, size_t T_size, size_t idx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + for (size_t i = 0; i < T_size; i++) { + MBEDTLS_MPI_CHK(mbedtls_mpi_safe_cond_assign(R, &T[i], + (unsigned char) mbedtls_ct_size_bool_eq(i, + idx))); + } + +cleanup: + return ret; +} + +int mbedtls_mpi_get_mont_r2_unsafe(mbedtls_mpi *X, + const mbedtls_mpi *N) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(X, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(X, N->n * 2 * biL)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(X, X, N)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shrink(X, N->n)); + +cleanup: + return ret; +} + +/* + * Sliding-window exponentiation: X = A^E mod N (HAC 14.85) + */ +int mbedtls_mpi_exp_mod(mbedtls_mpi *X, const mbedtls_mpi *A, + const mbedtls_mpi *E, const mbedtls_mpi *N, + mbedtls_mpi *prec_RR) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t window_bitsize; + size_t i, j, nblimbs; + size_t bufsize, nbits; + size_t exponent_bits_in_window = 0; + mbedtls_mpi_uint ei, mm, state; + mbedtls_mpi RR, T, W[(size_t) 1 << MBEDTLS_MPI_WINDOW_SIZE], WW, Apos; + int neg; + + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(A != NULL); + MPI_VALIDATE_RET(E != NULL); + MPI_VALIDATE_RET(N != NULL); + + if (mbedtls_mpi_cmp_int(N, 0) <= 0 || (N->p[0] & 1) == 0) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + if (mbedtls_mpi_cmp_int(E, 0) < 0) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + if (mbedtls_mpi_bitlen(E) > MBEDTLS_MPI_MAX_BITS || + mbedtls_mpi_bitlen(N) > MBEDTLS_MPI_MAX_BITS) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + /* + * Init temps and window size + */ + mm = mbedtls_mpi_montmul_init(N->p); + mbedtls_mpi_init(&RR); mbedtls_mpi_init(&T); + mbedtls_mpi_init(&Apos); + mbedtls_mpi_init(&WW); + memset(W, 0, sizeof(W)); + + i = mbedtls_mpi_bitlen(E); + + window_bitsize = (i > 671) ? 6 : (i > 239) ? 5 : + (i > 79) ? 4 : (i > 23) ? 3 : 1; + +#if (MBEDTLS_MPI_WINDOW_SIZE < 6) + if (window_bitsize > MBEDTLS_MPI_WINDOW_SIZE) { + window_bitsize = MBEDTLS_MPI_WINDOW_SIZE; + } +#endif + + const size_t w_table_used_size = (size_t) 1 << window_bitsize; + + /* + * This function is not constant-trace: its memory accesses depend on the + * exponent value. To defend against timing attacks, callers (such as RSA + * and DHM) should use exponent blinding. However this is not enough if the + * adversary can find the exponent in a single trace, so this function + * takes extra precautions against adversaries who can observe memory + * access patterns. + * + * This function performs a series of multiplications by table elements and + * squarings, and we want the prevent the adversary from finding out which + * table element was used, and from distinguishing between multiplications + * and squarings. Firstly, when multiplying by an element of the window + * W[i], we do a constant-trace table lookup to obfuscate i. This leaves + * squarings as having a different memory access patterns from other + * multiplications. So secondly, we put the accumulator in the table as + * well, and also do a constant-trace table lookup to multiply by the + * accumulator which is W[x_index]. + * + * This way, all multiplications take the form of a lookup-and-multiply. + * The number of lookup-and-multiply operations inside each iteration of + * the main loop still depends on the bits of the exponent, but since the + * other operations in the loop don't have an easily recognizable memory + * trace, an adversary is unlikely to be able to observe the exact + * patterns. + * + * An adversary may still be able to recover the exponent if they can + * observe both memory accesses and branches. However, branch prediction + * exploitation typically requires many traces of execution over the same + * data, which is defeated by randomized blinding. + */ + const size_t x_index = 0; + mbedtls_mpi_init(&W[x_index]); + + j = N->n + 1; + /* All W[i] including the accumulator must have at least N->n limbs for + * the mbedtls_mpi_montmul() and mpi_montred() calls later. Here we ensure + * that W[1] and the accumulator W[x_index] are large enough. later we'll + * grow other W[i] to the same length. They must not be shrunk midway + * through this function! + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(&W[x_index], j)); + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(&W[1], j)); + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(&T, j * 2)); + + /* + * Compensate for negative A (and correct at the end) + */ + neg = (A->s == -1); + if (neg) { + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&Apos, A)); + Apos.s = 1; + A = &Apos; + } + + /* + * If 1st call, pre-compute R^2 mod N + */ + if (prec_RR == NULL || prec_RR->p == NULL) { + mbedtls_mpi_get_mont_r2_unsafe(&RR, N); + + if (prec_RR != NULL) { + memcpy(prec_RR, &RR, sizeof(mbedtls_mpi)); + } + } else { + memcpy(&RR, prec_RR, sizeof(mbedtls_mpi)); + } + + /* + * W[1] = A * R^2 * R^-1 mod N = A * R mod N + */ + if (mbedtls_mpi_cmp_mpi(A, N) >= 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&W[1], A, N)); + /* This should be a no-op because W[1] is already that large before + * mbedtls_mpi_mod_mpi(), but it's necessary to avoid an overflow + * in mbedtls_mpi_montmul() below, so let's make sure. */ + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(&W[1], N->n + 1)); + } else { + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&W[1], A)); + } + + /* Note that this is safe because W[1] always has at least N->n limbs + * (it grew above and was preserved by mbedtls_mpi_copy()). */ + mbedtls_mpi_montmul(&W[1], &RR, N, mm, &T); + + /* + * W[x_index] = R^2 * R^-1 mod N = R mod N + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&W[x_index], &RR)); + mpi_montred(&W[x_index], N, mm, &T); + + + if (window_bitsize > 1) { + /* + * W[i] = W[1] ^ i + * + * The first bit of the sliding window is always 1 and therefore we + * only need to store the second half of the table. + * + * (There are two special elements in the table: W[0] for the + * accumulator/result and W[1] for A in Montgomery form. Both of these + * are already set at this point.) + */ + j = w_table_used_size / 2; + + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(&W[j], N->n + 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&W[j], &W[1])); + + for (i = 0; i < window_bitsize - 1; i++) { + mbedtls_mpi_montmul(&W[j], &W[j], N, mm, &T); + } + + /* + * W[i] = W[i - 1] * W[1] + */ + for (i = j + 1; i < w_table_used_size; i++) { + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(&W[i], N->n + 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&W[i], &W[i - 1])); + + mbedtls_mpi_montmul(&W[i], &W[1], N, mm, &T); + } + } + + nblimbs = E->n; + bufsize = 0; + nbits = 0; + state = 0; + + while (1) { + if (bufsize == 0) { + if (nblimbs == 0) { + break; + } + + nblimbs--; + + bufsize = sizeof(mbedtls_mpi_uint) << 3; + } + + bufsize--; + + ei = (E->p[nblimbs] >> bufsize) & 1; + + /* + * skip leading 0s + */ + if (ei == 0 && state == 0) { + continue; + } + + if (ei == 0 && state == 1) { + /* + * out of window, square W[x_index] + */ + MBEDTLS_MPI_CHK(mpi_select(&WW, W, w_table_used_size, x_index)); + mbedtls_mpi_montmul(&W[x_index], &WW, N, mm, &T); + continue; + } + + /* + * add ei to current window + */ + state = 2; + + nbits++; + exponent_bits_in_window |= (ei << (window_bitsize - nbits)); + + if (nbits == window_bitsize) { + /* + * W[x_index] = W[x_index]^window_bitsize R^-1 mod N + */ + for (i = 0; i < window_bitsize; i++) { + MBEDTLS_MPI_CHK(mpi_select(&WW, W, w_table_used_size, + x_index)); + mbedtls_mpi_montmul(&W[x_index], &WW, N, mm, &T); + } + + /* + * W[x_index] = W[x_index] * W[exponent_bits_in_window] R^-1 mod N + */ + MBEDTLS_MPI_CHK(mpi_select(&WW, W, w_table_used_size, + exponent_bits_in_window)); + mbedtls_mpi_montmul(&W[x_index], &WW, N, mm, &T); + + state--; + nbits = 0; + exponent_bits_in_window = 0; + } + } + + /* + * process the remaining bits + */ + for (i = 0; i < nbits; i++) { + MBEDTLS_MPI_CHK(mpi_select(&WW, W, w_table_used_size, x_index)); + mbedtls_mpi_montmul(&W[x_index], &WW, N, mm, &T); + + exponent_bits_in_window <<= 1; + + if ((exponent_bits_in_window & ((size_t) 1 << window_bitsize)) != 0) { + MBEDTLS_MPI_CHK(mpi_select(&WW, W, w_table_used_size, 1)); + mbedtls_mpi_montmul(&W[x_index], &WW, N, mm, &T); + } + } + + /* + * W[x_index] = A^E * R * R^-1 mod N = A^E mod N + */ + mpi_montred(&W[x_index], N, mm, &T); + + if (neg && E->n != 0 && (E->p[0] & 1) != 0) { + W[x_index].s = -1; + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&W[x_index], N, &W[x_index])); + } + + /* + * Load the result in the output variable. + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(X, &W[x_index])); + +cleanup: + + /* The first bit of the sliding window is always 1 and therefore the first + * half of the table was unused. */ + for (i = w_table_used_size/2; i < w_table_used_size; i++) { + mbedtls_mpi_free(&W[i]); + } + + mbedtls_mpi_free(&W[x_index]); + mbedtls_mpi_free(&W[1]); + mbedtls_mpi_free(&T); + mbedtls_mpi_free(&Apos); + mbedtls_mpi_free(&WW); + + if (prec_RR == NULL || prec_RR->p == NULL) { + mbedtls_mpi_free(&RR); + } + + return ret; +} + +/* + * Greatest common divisor: G = gcd(A, B) (HAC 14.54) + */ +int mbedtls_mpi_gcd(mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t lz, lzt; + mbedtls_mpi TA, TB; + + MPI_VALIDATE_RET(G != NULL); + MPI_VALIDATE_RET(A != NULL); + MPI_VALIDATE_RET(B != NULL); + + mbedtls_mpi_init(&TA); mbedtls_mpi_init(&TB); + + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TA, A)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TB, B)); + + lz = mbedtls_mpi_lsb(&TA); + lzt = mbedtls_mpi_lsb(&TB); + + /* The loop below gives the correct result when A==0 but not when B==0. + * So have a special case for B==0. Leverage the fact that we just + * calculated the lsb and lsb(B)==0 iff B is odd or 0 to make the test + * slightly more efficient than cmp_int(). */ + if (lzt == 0 && mbedtls_mpi_get_bit(&TB, 0) == 0) { + ret = mbedtls_mpi_copy(G, A); + goto cleanup; + } + + if (lzt < lz) { + lz = lzt; + } + + TA.s = TB.s = 1; + + /* We mostly follow the procedure described in HAC 14.54, but with some + * minor differences: + * - Sequences of multiplications or divisions by 2 are grouped into a + * single shift operation. + * - The procedure in HAC assumes that 0 < TB <= TA. + * - The condition TB <= TA is not actually necessary for correctness. + * TA and TB have symmetric roles except for the loop termination + * condition, and the shifts at the beginning of the loop body + * remove any significance from the ordering of TA vs TB before + * the shifts. + * - If TA = 0, the loop goes through 0 iterations and the result is + * correctly TB. + * - The case TB = 0 was short-circuited above. + * + * For the correctness proof below, decompose the original values of + * A and B as + * A = sa * 2^a * A' with A'=0 or A' odd, and sa = +-1 + * B = sb * 2^b * B' with B'=0 or B' odd, and sb = +-1 + * Then gcd(A, B) = 2^{min(a,b)} * gcd(A',B'), + * and gcd(A',B') is odd or 0. + * + * At the beginning, we have TA = |A| and TB = |B| so gcd(A,B) = gcd(TA,TB). + * The code maintains the following invariant: + * gcd(A,B) = 2^k * gcd(TA,TB) for some k (I) + */ + + /* Proof that the loop terminates: + * At each iteration, either the right-shift by 1 is made on a nonzero + * value and the nonnegative integer bitlen(TA) + bitlen(TB) decreases + * by at least 1, or the right-shift by 1 is made on zero and then + * TA becomes 0 which ends the loop (TB cannot be 0 if it is right-shifted + * since in that case TB is calculated from TB-TA with the condition TB>TA). + */ + while (mbedtls_mpi_cmp_int(&TA, 0) != 0) { + /* Divisions by 2 preserve the invariant (I). */ + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&TA, mbedtls_mpi_lsb(&TA))); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&TB, mbedtls_mpi_lsb(&TB))); + + /* Set either TA or TB to |TA-TB|/2. Since TA and TB are both odd, + * TA-TB is even so the division by 2 has an integer result. + * Invariant (I) is preserved since any odd divisor of both TA and TB + * also divides |TA-TB|/2, and any odd divisor of both TA and |TA-TB|/2 + * also divides TB, and any odd divisor of both TB and |TA-TB|/2 also + * divides TA. + */ + if (mbedtls_mpi_cmp_mpi(&TA, &TB) >= 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_abs(&TA, &TA, &TB)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&TA, 1)); + } else { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_abs(&TB, &TB, &TA)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&TB, 1)); + } + /* Note that one of TA or TB is still odd. */ + } + + /* By invariant (I), gcd(A,B) = 2^k * gcd(TA,TB) for some k. + * At the loop exit, TA = 0, so gcd(TA,TB) = TB. + * - If there was at least one loop iteration, then one of TA or TB is odd, + * and TA = 0, so TB is odd and gcd(TA,TB) = gcd(A',B'). In this case, + * lz = min(a,b) so gcd(A,B) = 2^lz * TB. + * - If there was no loop iteration, then A was 0, and gcd(A,B) = B. + * In this case, lz = 0 and B = TB so gcd(A,B) = B = 2^lz * TB as well. + */ + + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&TB, lz)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(G, &TB)); + +cleanup: + + mbedtls_mpi_free(&TA); mbedtls_mpi_free(&TB); + + return ret; +} + +/* Fill X with n_bytes random bytes. + * X must already have room for those bytes. + * The ordering of the bytes returned from the RNG is suitable for + * deterministic ECDSA (see RFC 6979 §3.3 and mbedtls_mpi_random()). + * The size and sign of X are unchanged. + * n_bytes must not be 0. + */ +static int mpi_fill_random_internal( + mbedtls_mpi *X, size_t n_bytes, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const size_t limbs = CHARS_TO_LIMBS(n_bytes); + const size_t overhead = (limbs * ciL) - n_bytes; + + if (X->n < limbs) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + memset(X->p, 0, overhead); + memset((unsigned char *) X->p + limbs * ciL, 0, (X->n - limbs) * ciL); + MBEDTLS_MPI_CHK(f_rng(p_rng, (unsigned char *) X->p + overhead, n_bytes)); + mpi_bigendian_to_host(X->p, limbs); + +cleanup: + return ret; +} + +/* + * Fill X with size bytes of random. + * + * Use a temporary bytes representation to make sure the result is the same + * regardless of the platform endianness (useful when f_rng is actually + * deterministic, eg for tests). + */ +int mbedtls_mpi_fill_random(mbedtls_mpi *X, size_t size, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t const limbs = CHARS_TO_LIMBS(size); + + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(f_rng != NULL); + + /* Ensure that target MPI has exactly the necessary number of limbs */ + MBEDTLS_MPI_CHK(mbedtls_mpi_resize_clear(X, limbs)); + if (size == 0) { + return 0; + } + + ret = mpi_fill_random_internal(X, size, f_rng, p_rng); + +cleanup: + return ret; +} + +int mbedtls_mpi_random(mbedtls_mpi *X, + mbedtls_mpi_sint min, + const mbedtls_mpi *N, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + int count; + unsigned lt_lower = 1, lt_upper = 0; + size_t n_bits = mbedtls_mpi_bitlen(N); + size_t n_bytes = (n_bits + 7) / 8; + mbedtls_mpi lower_bound; + + if (min < 0) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + if (mbedtls_mpi_cmp_int(N, min) <= 0) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + /* + * When min == 0, each try has at worst a probability 1/2 of failing + * (the msb has a probability 1/2 of being 0, and then the result will + * be < N), so after 30 tries failure probability is a most 2**(-30). + * + * When N is just below a power of 2, as is the case when generating + * a random scalar on most elliptic curves, 1 try is enough with + * overwhelming probability. When N is just above a power of 2, + * as when generating a random scalar on secp224k1, each try has + * a probability of failing that is almost 1/2. + * + * The probabilities are almost the same if min is nonzero but negligible + * compared to N. This is always the case when N is crypto-sized, but + * it's convenient to support small N for testing purposes. When N + * is small, use a higher repeat count, otherwise the probability of + * failure is macroscopic. + */ + count = (n_bytes > 4 ? 30 : 250); + + mbedtls_mpi_init(&lower_bound); + + /* Ensure that target MPI has exactly the same number of limbs + * as the upper bound, even if the upper bound has leading zeros. + * This is necessary for the mbedtls_mpi_lt_mpi_ct() check. */ + MBEDTLS_MPI_CHK(mbedtls_mpi_resize_clear(X, N->n)); + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(&lower_bound, N->n)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&lower_bound, min)); + + /* + * Match the procedure given in RFC 6979 §3.3 (deterministic ECDSA) + * when f_rng is a suitably parametrized instance of HMAC_DRBG: + * - use the same byte ordering; + * - keep the leftmost n_bits bits of the generated octet string; + * - try until result is in the desired range. + * This also avoids any bias, which is especially important for ECDSA. + */ + do { + MBEDTLS_MPI_CHK(mpi_fill_random_internal(X, n_bytes, f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(X, 8 * n_bytes - n_bits)); + + if (--count == 0) { + ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_lt_mpi_ct(X, &lower_bound, <_lower)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lt_mpi_ct(X, N, <_upper)); + } while (lt_lower != 0 || lt_upper == 0); + +cleanup: + mbedtls_mpi_free(&lower_bound); + return ret; +} + +/* + * Modular inverse: X = A^-1 mod N (HAC 14.61 / 14.64) + */ +int mbedtls_mpi_inv_mod(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi G, TA, TU, U1, U2, TB, TV, V1, V2; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(A != NULL); + MPI_VALIDATE_RET(N != NULL); + + if (mbedtls_mpi_cmp_int(N, 1) <= 0) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + mbedtls_mpi_init(&TA); mbedtls_mpi_init(&TU); mbedtls_mpi_init(&U1); mbedtls_mpi_init(&U2); + mbedtls_mpi_init(&G); mbedtls_mpi_init(&TB); mbedtls_mpi_init(&TV); + mbedtls_mpi_init(&V1); mbedtls_mpi_init(&V2); + + MBEDTLS_MPI_CHK(mbedtls_mpi_gcd(&G, A, N)); + + if (mbedtls_mpi_cmp_int(&G, 1) != 0) { + ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&TA, A, N)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TU, &TA)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TB, N)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TV, N)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&U1, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&U2, 0)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&V1, 0)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&V2, 1)); + + do { + while ((TU.p[0] & 1) == 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&TU, 1)); + + if ((U1.p[0] & 1) != 0 || (U2.p[0] & 1) != 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&U1, &U1, &TB)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&U2, &U2, &TA)); + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&U1, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&U2, 1)); + } + + while ((TV.p[0] & 1) == 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&TV, 1)); + + if ((V1.p[0] & 1) != 0 || (V2.p[0] & 1) != 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&V1, &V1, &TB)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&V2, &V2, &TA)); + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&V1, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&V2, 1)); + } + + if (mbedtls_mpi_cmp_mpi(&TU, &TV) >= 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&TU, &TU, &TV)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&U1, &U1, &V1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&U2, &U2, &V2)); + } else { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&TV, &TV, &TU)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&V1, &V1, &U1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&V2, &V2, &U2)); + } + } while (mbedtls_mpi_cmp_int(&TU, 0) != 0); + + while (mbedtls_mpi_cmp_int(&V1, 0) < 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&V1, &V1, N)); + } + + while (mbedtls_mpi_cmp_mpi(&V1, N) >= 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&V1, &V1, N)); + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(X, &V1)); + +cleanup: + + mbedtls_mpi_free(&TA); mbedtls_mpi_free(&TU); mbedtls_mpi_free(&U1); mbedtls_mpi_free(&U2); + mbedtls_mpi_free(&G); mbedtls_mpi_free(&TB); mbedtls_mpi_free(&TV); + mbedtls_mpi_free(&V1); mbedtls_mpi_free(&V2); + + return ret; +} + +#if defined(MBEDTLS_GENPRIME) + +static const int small_prime[] = +{ + 3, 5, 7, 11, 13, 17, 19, 23, + 29, 31, 37, 41, 43, 47, 53, 59, + 61, 67, 71, 73, 79, 83, 89, 97, + 101, 103, 107, 109, 113, 127, 131, 137, + 139, 149, 151, 157, 163, 167, 173, 179, + 181, 191, 193, 197, 199, 211, 223, 227, + 229, 233, 239, 241, 251, 257, 263, 269, + 271, 277, 281, 283, 293, 307, 311, 313, + 317, 331, 337, 347, 349, 353, 359, 367, + 373, 379, 383, 389, 397, 401, 409, 419, + 421, 431, 433, 439, 443, 449, 457, 461, + 463, 467, 479, 487, 491, 499, 503, 509, + 521, 523, 541, 547, 557, 563, 569, 571, + 577, 587, 593, 599, 601, 607, 613, 617, + 619, 631, 641, 643, 647, 653, 659, 661, + 673, 677, 683, 691, 701, 709, 719, 727, + 733, 739, 743, 751, 757, 761, 769, 773, + 787, 797, 809, 811, 821, 823, 827, 829, + 839, 853, 857, 859, 863, 877, 881, 883, + 887, 907, 911, 919, 929, 937, 941, 947, + 953, 967, 971, 977, 983, 991, 997, -103 +}; + +/* + * Small divisors test (X must be positive) + * + * Return values: + * 0: no small factor (possible prime, more tests needed) + * 1: certain prime + * MBEDTLS_ERR_MPI_NOT_ACCEPTABLE: certain non-prime + * other negative: error + */ +static int mpi_check_small_factors(const mbedtls_mpi *X) +{ + int ret = 0; + size_t i; + mbedtls_mpi_uint r; + + if ((X->p[0] & 1) == 0) { + return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; + } + + for (i = 0; small_prime[i] > 0; i++) { + if (mbedtls_mpi_cmp_int(X, small_prime[i]) <= 0) { + return 1; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_int(&r, X, small_prime[i])); + + if (r == 0) { + return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; + } + } + +cleanup: + return ret; +} + +/* + * Miller-Rabin pseudo-primality test (HAC 4.24) + */ +static int mpi_miller_rabin(const mbedtls_mpi *X, size_t rounds, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret, count; + size_t i, j, k, s; + mbedtls_mpi W, R, T, A, RR; + + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(f_rng != NULL); + + mbedtls_mpi_init(&W); mbedtls_mpi_init(&R); + mbedtls_mpi_init(&T); mbedtls_mpi_init(&A); + mbedtls_mpi_init(&RR); + + /* + * W = |X| - 1 + * R = W >> lsb( W ) + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&W, X, 1)); + s = mbedtls_mpi_lsb(&W); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&R, &W)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&R, s)); + + for (i = 0; i < rounds; i++) { + /* + * pick a random A, 1 < A < |X| - 1 + */ + count = 0; + do { + MBEDTLS_MPI_CHK(mbedtls_mpi_fill_random(&A, X->n * ciL, f_rng, p_rng)); + + j = mbedtls_mpi_bitlen(&A); + k = mbedtls_mpi_bitlen(&W); + if (j > k) { + A.p[A.n - 1] &= ((mbedtls_mpi_uint) 1 << (k - (A.n - 1) * biL - 1)) - 1; + } + + if (count++ > 30) { + ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; + goto cleanup; + } + + } while (mbedtls_mpi_cmp_mpi(&A, &W) >= 0 || + mbedtls_mpi_cmp_int(&A, 1) <= 0); + + /* + * A = A^R mod |X| + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&A, &A, &R, X, &RR)); + + if (mbedtls_mpi_cmp_mpi(&A, &W) == 0 || + mbedtls_mpi_cmp_int(&A, 1) == 0) { + continue; + } + + j = 1; + while (j < s && mbedtls_mpi_cmp_mpi(&A, &W) != 0) { + /* + * A = A * A mod |X| + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&T, &A, &A)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&A, &T, X)); + + if (mbedtls_mpi_cmp_int(&A, 1) == 0) { + break; + } + + j++; + } + + /* + * not prime if A != |X| - 1 or A == 1 + */ + if (mbedtls_mpi_cmp_mpi(&A, &W) != 0 || + mbedtls_mpi_cmp_int(&A, 1) == 0) { + ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; + break; + } + } + +cleanup: + mbedtls_mpi_free(&W); mbedtls_mpi_free(&R); + mbedtls_mpi_free(&T); mbedtls_mpi_free(&A); + mbedtls_mpi_free(&RR); + + return ret; +} + +/* + * Pseudo-primality test: small factors, then Miller-Rabin + */ +int mbedtls_mpi_is_prime_ext(const mbedtls_mpi *X, int rounds, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi XX; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(f_rng != NULL); + + XX.s = 1; + XX.n = X->n; + XX.p = X->p; + + if (mbedtls_mpi_cmp_int(&XX, 0) == 0 || + mbedtls_mpi_cmp_int(&XX, 1) == 0) { + return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; + } + + if (mbedtls_mpi_cmp_int(&XX, 2) == 0) { + return 0; + } + + if ((ret = mpi_check_small_factors(&XX)) != 0) { + if (ret == 1) { + return 0; + } + + return ret; + } + + return mpi_miller_rabin(&XX, rounds, f_rng, p_rng); +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +/* + * Pseudo-primality test, error probability 2^-80 + */ +int mbedtls_mpi_is_prime(const mbedtls_mpi *X, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(f_rng != NULL); + + /* + * In the past our key generation aimed for an error rate of at most + * 2^-80. Since this function is deprecated, aim for the same certainty + * here as well. + */ + return mbedtls_mpi_is_prime_ext(X, 40, f_rng, p_rng); +} +#endif + +/* + * Prime number generation + * + * To generate an RSA key in a way recommended by FIPS 186-4, both primes must + * be either 1024 bits or 1536 bits long, and flags must contain + * MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR. + */ +int mbedtls_mpi_gen_prime(mbedtls_mpi *X, size_t nbits, int flags, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ +#ifdef MBEDTLS_HAVE_INT64 +// ceil(2^63.5) +#define CEIL_MAXUINT_DIV_SQRT2 0xb504f333f9de6485ULL +#else +// ceil(2^31.5) +#define CEIL_MAXUINT_DIV_SQRT2 0xb504f334U +#endif + int ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; + size_t k, n; + int rounds; + mbedtls_mpi_uint r; + mbedtls_mpi Y; + + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(f_rng != NULL); + + if (nbits < 3 || nbits > MBEDTLS_MPI_MAX_BITS) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + mbedtls_mpi_init(&Y); + + n = BITS_TO_LIMBS(nbits); + + if ((flags & MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR) == 0) { + /* + * 2^-80 error probability, number of rounds chosen per HAC, table 4.4 + */ + rounds = ((nbits >= 1300) ? 2 : (nbits >= 850) ? 3 : + (nbits >= 650) ? 4 : (nbits >= 350) ? 8 : + (nbits >= 250) ? 12 : (nbits >= 150) ? 18 : 27); + } else { + /* + * 2^-100 error probability, number of rounds computed based on HAC, + * fact 4.48 + */ + rounds = ((nbits >= 1450) ? 4 : (nbits >= 1150) ? 5 : + (nbits >= 1000) ? 6 : (nbits >= 850) ? 7 : + (nbits >= 750) ? 8 : (nbits >= 500) ? 13 : + (nbits >= 250) ? 28 : (nbits >= 150) ? 40 : 51); + } + + while (1) { + MBEDTLS_MPI_CHK(mbedtls_mpi_fill_random(X, n * ciL, f_rng, p_rng)); + /* make sure generated number is at least (nbits-1)+0.5 bits (FIPS 186-4 §B.3.3 steps 4.4, 5.5) */ + if (X->p[n-1] < CEIL_MAXUINT_DIV_SQRT2) { + continue; + } + + k = n * biL; + if (k > nbits) { + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(X, k - nbits)); + } + X->p[0] |= 1; + + if ((flags & MBEDTLS_MPI_GEN_PRIME_FLAG_DH) == 0) { + ret = mbedtls_mpi_is_prime_ext(X, rounds, f_rng, p_rng); + + if (ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE) { + goto cleanup; + } + } else { + /* + * A necessary condition for Y and X = 2Y + 1 to be prime + * is X = 2 mod 3 (which is equivalent to Y = 2 mod 3). + * Make sure it is satisfied, while keeping X = 3 mod 4 + */ + + X->p[0] |= 2; + + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_int(&r, X, 3)); + if (r == 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(X, X, 8)); + } else if (r == 1) { + MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(X, X, 4)); + } + + /* Set Y = (X-1) / 2, which is X / 2 because X is odd */ + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&Y, X)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&Y, 1)); + + while (1) { + /* + * First, check small factors for X and Y + * before doing Miller-Rabin on any of them + */ + if ((ret = mpi_check_small_factors(X)) == 0 && + (ret = mpi_check_small_factors(&Y)) == 0 && + (ret = mpi_miller_rabin(X, rounds, f_rng, p_rng)) + == 0 && + (ret = mpi_miller_rabin(&Y, rounds, f_rng, p_rng)) + == 0) { + goto cleanup; + } + + if (ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE) { + goto cleanup; + } + + /* + * Next candidates. We want to preserve Y = (X-1) / 2 and + * Y = 1 mod 2 and Y = 2 mod 3 (eq X = 3 mod 4 and X = 2 mod 3) + * so up Y by 6 and X by 12. + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(X, X, 12)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(&Y, &Y, 6)); + } + } + } + +cleanup: + + mbedtls_mpi_free(&Y); + + return ret; +} + +#endif /* MBEDTLS_GENPRIME */ + +#if defined(MBEDTLS_SELF_TEST) + +#define GCD_PAIR_COUNT 3 + +static const int gcd_pairs[GCD_PAIR_COUNT][3] = +{ + { 693, 609, 21 }, + { 1764, 868, 28 }, + { 768454923, 542167814, 1 } +}; + +/* + * Checkup routine + */ +int mbedtls_mpi_self_test(int verbose) +{ + int ret, i; + mbedtls_mpi A, E, N, X, Y, U, V; + + mbedtls_mpi_init(&A); mbedtls_mpi_init(&E); mbedtls_mpi_init(&N); mbedtls_mpi_init(&X); + mbedtls_mpi_init(&Y); mbedtls_mpi_init(&U); mbedtls_mpi_init(&V); + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&A, 16, + "EFE021C2645FD1DC586E69184AF4A31E" \ + "D5F53E93B5F123FA41680867BA110131" \ + "944FE7952E2517337780CB0DB80E61AA" \ + "E7C8DDC6C5C6AADEB34EB38A2F40D5E6")); + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&E, 16, + "B2E7EFD37075B9F03FF989C7C5051C20" \ + "34D2A323810251127E7BF8625A4F49A5" \ + "F3E27F4DA8BD59C47D6DAABA4C8127BD" \ + "5B5C25763222FEFCCFC38B832366C29E")); + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&N, 16, + "0066A198186C18C10B2F5ED9B522752A" \ + "9830B69916E535C8F047518A889A43A5" \ + "94B6BED27A168D31D4A52F88925AA8F5")); + + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&X, &A, &N)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&U, 16, + "602AB7ECA597A3D6B56FF9829A5E8B85" \ + "9E857EA95A03512E2BAE7391688D264A" \ + "A5663B0341DB9CCFD2C4C5F421FEC814" \ + "8001B72E848A38CAE1C65F78E56ABDEF" \ + "E12D3C039B8A02D6BE593F0BBBDA56F1" \ + "ECF677152EF804370C1A305CAF3B5BF1" \ + "30879B56C61DE584A0F53A2447A51E")); + + if (verbose != 0) { + mbedtls_printf(" MPI test #1 (mul_mpi): "); + } + + if (mbedtls_mpi_cmp_mpi(&X, &U) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto cleanup; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_div_mpi(&X, &Y, &A, &N)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&U, 16, + "256567336059E52CAE22925474705F39A94")); + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&V, 16, + "6613F26162223DF488E9CD48CC132C7A" \ + "0AC93C701B001B092E4E5B9F73BCD27B" \ + "9EE50D0657C77F374E903CDFA4C642")); + + if (verbose != 0) { + mbedtls_printf(" MPI test #2 (div_mpi): "); + } + + if (mbedtls_mpi_cmp_mpi(&X, &U) != 0 || + mbedtls_mpi_cmp_mpi(&Y, &V) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto cleanup; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&X, &A, &E, &N, NULL)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&U, 16, + "36E139AEA55215609D2816998ED020BB" \ + "BD96C37890F65171D948E9BC7CBAA4D9" \ + "325D24D6A3C12710F10A09FA08AB87")); + + if (verbose != 0) { + mbedtls_printf(" MPI test #3 (exp_mod): "); + } + + if (mbedtls_mpi_cmp_mpi(&X, &U) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto cleanup; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(&X, &A, &N)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&U, 16, + "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \ + "C3DBA76456363A10869622EAC2DD84EC" \ + "C5B8A74DAC4D09E03B5E0BE779F2DF61")); + + if (verbose != 0) { + mbedtls_printf(" MPI test #4 (inv_mod): "); + } + + if (mbedtls_mpi_cmp_mpi(&X, &U) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto cleanup; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + if (verbose != 0) { + mbedtls_printf(" MPI test #5 (simple gcd): "); + } + + for (i = 0; i < GCD_PAIR_COUNT; i++) { + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&X, gcd_pairs[i][0])); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&Y, gcd_pairs[i][1])); + + MBEDTLS_MPI_CHK(mbedtls_mpi_gcd(&A, &X, &Y)); + + if (mbedtls_mpi_cmp_int(&A, gcd_pairs[i][2]) != 0) { + if (verbose != 0) { + mbedtls_printf("failed at %d\n", i); + } + + ret = 1; + goto cleanup; + } + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + +cleanup: + + if (ret != 0 && verbose != 0) { + mbedtls_printf("Unexpected error, return code = %08X\n", (unsigned int) ret); + } + + mbedtls_mpi_free(&A); mbedtls_mpi_free(&E); mbedtls_mpi_free(&N); mbedtls_mpi_free(&X); + mbedtls_mpi_free(&Y); mbedtls_mpi_free(&U); mbedtls_mpi_free(&V); + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_BIGNUM_C */ diff --git a/ext/opcua_client/mbedtls/library/bignum_internal.h b/ext/opcua_client/mbedtls/library/bignum_internal.h new file mode 100644 index 0000000..5435ebb --- /dev/null +++ b/ext/opcua_client/mbedtls/library/bignum_internal.h @@ -0,0 +1,71 @@ +/** + * Low level bignum functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_BIGNUM_INTERNAL_H +#define MBEDTLS_BIGNUM_INTERNAL_H + +#include "mbedtls/bignum.h" + +/** + * \brief Calculate the square of the Montgomery constant. (Needed + * for conversion and operations in Montgomery form.) + * + * \param[out] X A pointer to the result of the calculation of + * the square of the Montgomery constant: + * 2^{2*n*biL} mod N. + * \param[in] N Little-endian presentation of the modulus, which must be odd. + * + * \return 0 if successful. + * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if there is not enough space + * to store the value of Montgomery constant squared. + * \return #MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if \p N modulus is zero. + * \return #MBEDTLS_ERR_MPI_NEGATIVE_VALUE if \p N modulus is negative. + */ +int mbedtls_mpi_get_mont_r2_unsafe(mbedtls_mpi *X, + const mbedtls_mpi *N); + +/** + * \brief Calculate initialisation value for fast Montgomery modular + * multiplication + * + * \param[in] N Little-endian presentation of the modulus. This must have + * at least one limb. + * + * \return The initialisation value for fast Montgomery modular multiplication + */ +mbedtls_mpi_uint mbedtls_mpi_montmul_init(const mbedtls_mpi_uint *N); + +/** Montgomery multiplication: A = A * B * R^-1 mod N (HAC 14.36) + * + * \param[in,out] A One of the numbers to multiply. + * It must have at least as many limbs as N + * (A->n >= N->n), and any limbs beyond n are ignored. + * On successful completion, A contains the result of + * the multiplication A * B * R^-1 mod N where + * R = (2^ciL)^n. + * \param[in] B One of the numbers to multiply. + * It must be nonzero and must not have more limbs than N + * (B->n <= N->n). + * \param[in] N The modulo. N must be odd. + * \param mm The value calculated by + * `mbedtls_mpi_montg_init(&mm, N)`. + * This is -N^-1 mod 2^ciL. + * \param[in,out] T A bignum for temporary storage. + * It must be at least twice the limb size of N plus 2 + * (T->n >= 2 * (N->n + 1)). + * Its initial content is unused and + * its final content is indeterminate. + * Note that unlike the usual convention in the library + * for `const mbedtls_mpi*`, the content of T can change. + */ +void mbedtls_mpi_montmul(mbedtls_mpi *A, + const mbedtls_mpi *B, + const mbedtls_mpi *N, + mbedtls_mpi_uint mm, + const mbedtls_mpi *T); + +#endif /* MBEDTLS_BIGNUM_INTERNAL_H */ diff --git a/ext/opcua_client/mbedtls/library/blowfish.c b/ext/opcua_client/mbedtls/library/blowfish.c new file mode 100644 index 0000000..d90456b --- /dev/null +++ b/ext/opcua_client/mbedtls/library/blowfish.c @@ -0,0 +1,644 @@ +/* + * Blowfish implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The Blowfish block cipher was designed by Bruce Schneier in 1993. + * http://www.schneier.com/blowfish.html + * http://en.wikipedia.org/wiki/Blowfish_%28cipher%29 + * + */ + +#include "common.h" + +#if defined(MBEDTLS_BLOWFISH_C) + +#include "mbedtls/blowfish.h" +#include "mbedtls/platform_util.h" + +#include + +#if !defined(MBEDTLS_BLOWFISH_ALT) + +/* Parameter validation macros */ +#define BLOWFISH_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA) +#define BLOWFISH_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +static const uint32_t P[MBEDTLS_BLOWFISH_ROUNDS + 2] = { + 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L, + 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L, + 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL, + 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L, + 0x9216D5D9L, 0x8979FB1BL +}; + +/* declarations of data at the end of this file */ +static const uint32_t S[4][256]; + +static uint32_t F(mbedtls_blowfish_context *ctx, uint32_t x) +{ + unsigned short a, b, c, d; + uint32_t y; + + d = MBEDTLS_BYTE_0(x); + x >>= 8; + c = MBEDTLS_BYTE_0(x); + x >>= 8; + b = MBEDTLS_BYTE_0(x); + x >>= 8; + a = MBEDTLS_BYTE_0(x); + y = ctx->S[0][a] + ctx->S[1][b]; + y = y ^ ctx->S[2][c]; + y = y + ctx->S[3][d]; + + return y; +} + +static void blowfish_enc(mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr) +{ + uint32_t Xl, Xr, temp; + short i; + + Xl = *xl; + Xr = *xr; + + for (i = 0; i < MBEDTLS_BLOWFISH_ROUNDS; ++i) { + Xl = Xl ^ ctx->P[i]; + Xr = F(ctx, Xl) ^ Xr; + + temp = Xl; + Xl = Xr; + Xr = temp; + } + + temp = Xl; + Xl = Xr; + Xr = temp; + + Xr = Xr ^ ctx->P[MBEDTLS_BLOWFISH_ROUNDS]; + Xl = Xl ^ ctx->P[MBEDTLS_BLOWFISH_ROUNDS + 1]; + + *xl = Xl; + *xr = Xr; +} + +static void blowfish_dec(mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr) +{ + uint32_t Xl, Xr, temp; + short i; + + Xl = *xl; + Xr = *xr; + + for (i = MBEDTLS_BLOWFISH_ROUNDS + 1; i > 1; --i) { + Xl = Xl ^ ctx->P[i]; + Xr = F(ctx, Xl) ^ Xr; + + temp = Xl; + Xl = Xr; + Xr = temp; + } + + temp = Xl; + Xl = Xr; + Xr = temp; + + Xr = Xr ^ ctx->P[1]; + Xl = Xl ^ ctx->P[0]; + + *xl = Xl; + *xr = Xr; +} + +void mbedtls_blowfish_init(mbedtls_blowfish_context *ctx) +{ + BLOWFISH_VALIDATE(ctx != NULL); + memset(ctx, 0, sizeof(mbedtls_blowfish_context)); +} + +void mbedtls_blowfish_free(mbedtls_blowfish_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_blowfish_context)); +} + +/* + * Blowfish key schedule + */ +int mbedtls_blowfish_setkey(mbedtls_blowfish_context *ctx, + const unsigned char *key, + unsigned int keybits) +{ + unsigned int i, j, k; + uint32_t data, datal, datar; + BLOWFISH_VALIDATE_RET(ctx != NULL); + BLOWFISH_VALIDATE_RET(key != NULL); + + if (keybits < MBEDTLS_BLOWFISH_MIN_KEY_BITS || + keybits > MBEDTLS_BLOWFISH_MAX_KEY_BITS || + keybits % 8 != 0) { + return MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA; + } + + keybits >>= 3; + + for (i = 0; i < 4; i++) { + for (j = 0; j < 256; j++) { + ctx->S[i][j] = S[i][j]; + } + } + + j = 0; + for (i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; ++i) { + data = 0x00000000; + for (k = 0; k < 4; ++k) { + data = (data << 8) | key[j++]; + if (j >= keybits) { + j = 0; + } + } + ctx->P[i] = P[i] ^ data; + } + + datal = 0x00000000; + datar = 0x00000000; + + for (i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; i += 2) { + blowfish_enc(ctx, &datal, &datar); + ctx->P[i] = datal; + ctx->P[i + 1] = datar; + } + + for (i = 0; i < 4; i++) { + for (j = 0; j < 256; j += 2) { + blowfish_enc(ctx, &datal, &datar); + ctx->S[i][j] = datal; + ctx->S[i][j + 1] = datar; + } + } + return 0; +} + +/* + * Blowfish-ECB block encryption/decryption + */ +int mbedtls_blowfish_crypt_ecb(mbedtls_blowfish_context *ctx, + int mode, + const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE], + unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE]) +{ + uint32_t X0, X1; + BLOWFISH_VALIDATE_RET(ctx != NULL); + BLOWFISH_VALIDATE_RET(mode == MBEDTLS_BLOWFISH_ENCRYPT || + mode == MBEDTLS_BLOWFISH_DECRYPT); + BLOWFISH_VALIDATE_RET(input != NULL); + BLOWFISH_VALIDATE_RET(output != NULL); + + X0 = MBEDTLS_GET_UINT32_BE(input, 0); + X1 = MBEDTLS_GET_UINT32_BE(input, 4); + + if (mode == MBEDTLS_BLOWFISH_DECRYPT) { + blowfish_dec(ctx, &X0, &X1); + } else { /* MBEDTLS_BLOWFISH_ENCRYPT */ + blowfish_enc(ctx, &X0, &X1); + } + + MBEDTLS_PUT_UINT32_BE(X0, output, 0); + MBEDTLS_PUT_UINT32_BE(X1, output, 4); + + return 0; +} + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/* + * Blowfish-CBC buffer encryption/decryption + */ +int mbedtls_blowfish_crypt_cbc(mbedtls_blowfish_context *ctx, + int mode, + size_t length, + unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], + const unsigned char *input, + unsigned char *output) +{ + int i; + unsigned char temp[MBEDTLS_BLOWFISH_BLOCKSIZE]; + BLOWFISH_VALIDATE_RET(ctx != NULL); + BLOWFISH_VALIDATE_RET(mode == MBEDTLS_BLOWFISH_ENCRYPT || + mode == MBEDTLS_BLOWFISH_DECRYPT); + BLOWFISH_VALIDATE_RET(iv != NULL); + BLOWFISH_VALIDATE_RET(length == 0 || input != NULL); + BLOWFISH_VALIDATE_RET(length == 0 || output != NULL); + + if (length % MBEDTLS_BLOWFISH_BLOCKSIZE) { + return MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH; + } + + if (mode == MBEDTLS_BLOWFISH_DECRYPT) { + while (length > 0) { + memcpy(temp, input, MBEDTLS_BLOWFISH_BLOCKSIZE); + mbedtls_blowfish_crypt_ecb(ctx, mode, input, output); + + for (i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE; i++) { + output[i] = (unsigned char) (output[i] ^ iv[i]); + } + + memcpy(iv, temp, MBEDTLS_BLOWFISH_BLOCKSIZE); + + input += MBEDTLS_BLOWFISH_BLOCKSIZE; + output += MBEDTLS_BLOWFISH_BLOCKSIZE; + length -= MBEDTLS_BLOWFISH_BLOCKSIZE; + } + } else { + while (length > 0) { + for (i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE; i++) { + output[i] = (unsigned char) (input[i] ^ iv[i]); + } + + mbedtls_blowfish_crypt_ecb(ctx, mode, output, output); + memcpy(iv, output, MBEDTLS_BLOWFISH_BLOCKSIZE); + + input += MBEDTLS_BLOWFISH_BLOCKSIZE; + output += MBEDTLS_BLOWFISH_BLOCKSIZE; + length -= MBEDTLS_BLOWFISH_BLOCKSIZE; + } + } + + return 0; +} +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +/* + * Blowfish CFB buffer encryption/decryption + */ +int mbedtls_blowfish_crypt_cfb64(mbedtls_blowfish_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], + const unsigned char *input, + unsigned char *output) +{ + int c; + size_t n; + + BLOWFISH_VALIDATE_RET(ctx != NULL); + BLOWFISH_VALIDATE_RET(mode == MBEDTLS_BLOWFISH_ENCRYPT || + mode == MBEDTLS_BLOWFISH_DECRYPT); + BLOWFISH_VALIDATE_RET(iv != NULL); + BLOWFISH_VALIDATE_RET(iv_off != NULL); + BLOWFISH_VALIDATE_RET(length == 0 || input != NULL); + BLOWFISH_VALIDATE_RET(length == 0 || output != NULL); + + n = *iv_off; + if (n >= 8) { + return MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA; + } + + if (mode == MBEDTLS_BLOWFISH_DECRYPT) { + while (length--) { + if (n == 0) { + mbedtls_blowfish_crypt_ecb(ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv); + } + + c = *input++; + *output++ = (unsigned char) (c ^ iv[n]); + iv[n] = (unsigned char) c; + + n = (n + 1) % MBEDTLS_BLOWFISH_BLOCKSIZE; + } + } else { + while (length--) { + if (n == 0) { + mbedtls_blowfish_crypt_ecb(ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv); + } + + iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++); + + n = (n + 1) % MBEDTLS_BLOWFISH_BLOCKSIZE; + } + } + + *iv_off = n; + + return 0; +} +#endif /*MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +/* + * Blowfish CTR buffer encryption/decryption + */ +int mbedtls_blowfish_crypt_ctr(mbedtls_blowfish_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[MBEDTLS_BLOWFISH_BLOCKSIZE], + unsigned char stream_block[MBEDTLS_BLOWFISH_BLOCKSIZE], + const unsigned char *input, + unsigned char *output) +{ + int c, i; + size_t n; + BLOWFISH_VALIDATE_RET(ctx != NULL); + BLOWFISH_VALIDATE_RET(nonce_counter != NULL); + BLOWFISH_VALIDATE_RET(stream_block != NULL); + BLOWFISH_VALIDATE_RET(nc_off != NULL); + BLOWFISH_VALIDATE_RET(length == 0 || input != NULL); + BLOWFISH_VALIDATE_RET(length == 0 || output != NULL); + + n = *nc_off; + if (n >= 8) { + return MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA; + } + + while (length--) { + if (n == 0) { + mbedtls_blowfish_crypt_ecb(ctx, MBEDTLS_BLOWFISH_ENCRYPT, nonce_counter, + stream_block); + + for (i = MBEDTLS_BLOWFISH_BLOCKSIZE; i > 0; i--) { + if (++nonce_counter[i - 1] != 0) { + break; + } + } + } + c = *input++; + *output++ = (unsigned char) (c ^ stream_block[n]); + + n = (n + 1) % MBEDTLS_BLOWFISH_BLOCKSIZE; + } + + *nc_off = n; + + return 0; +} +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +static const uint32_t S[4][256] = { + { 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L, + 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L, + 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L, + 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL, + 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL, + 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L, + 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL, + 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL, + 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L, + 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L, + 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL, + 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL, + 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL, + 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L, + 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L, + 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L, + 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L, + 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L, + 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL, + 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L, + 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L, + 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L, + 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L, + 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL, + 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L, + 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL, + 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL, + 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L, + 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL, + 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L, + 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL, + 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L, + 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L, + 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL, + 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L, + 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L, + 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL, + 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L, + 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL, + 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L, + 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L, + 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL, + 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L, + 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L, + 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L, + 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L, + 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L, + 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL, + 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL, + 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L, + 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L, + 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L, + 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L, + 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL, + 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L, + 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL, + 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL, + 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L, + 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L, + 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L, + 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L, + 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L, + 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L, + 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL }, + { 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L, + 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L, + 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L, + 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL, + 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L, + 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L, + 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL, + 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L, + 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L, + 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L, + 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL, + 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL, + 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L, + 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L, + 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L, + 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L, + 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL, + 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL, + 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL, + 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L, + 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL, + 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L, + 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L, + 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL, + 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL, + 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L, + 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL, + 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L, + 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL, + 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL, + 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L, + 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L, + 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L, + 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L, + 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L, + 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L, + 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L, + 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL, + 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L, + 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL, + 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L, + 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L, + 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L, + 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L, + 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L, + 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L, + 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L, + 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L, + 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L, + 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L, + 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L, + 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L, + 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L, + 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L, + 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L, + 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L, + 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL, + 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL, + 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L, + 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL, + 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L, + 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L, + 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L, + 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L }, + { 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L, + 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L, + 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL, + 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L, + 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L, + 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L, + 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL, + 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL, + 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL, + 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L, + 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L, + 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL, + 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L, + 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL, + 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L, + 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL, + 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L, + 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL, + 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L, + 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL, + 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L, + 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L, + 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL, + 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L, + 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L, + 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L, + 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L, + 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL, + 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L, + 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL, + 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L, + 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL, + 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L, + 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL, + 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL, + 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL, + 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L, + 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L, + 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL, + 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL, + 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL, + 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL, + 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL, + 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L, + 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L, + 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L, + 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L, + 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL, + 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL, + 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L, + 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L, + 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L, + 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L, + 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L, + 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L, + 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L, + 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L, + 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L, + 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L, + 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL, + 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L, + 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL, + 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L, + 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L }, + { 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL, + 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL, + 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL, + 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L, + 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L, + 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L, + 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L, + 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L, + 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L, + 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L, + 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L, + 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L, + 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L, + 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L, + 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L, + 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL, + 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL, + 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L, + 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL, + 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL, + 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL, + 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L, + 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL, + 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL, + 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L, + 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L, + 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L, + 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L, + 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL, + 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL, + 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L, + 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L, + 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L, + 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL, + 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L, + 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L, + 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L, + 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL, + 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L, + 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L, + 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L, + 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL, + 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL, + 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L, + 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L, + 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L, + 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L, + 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL, + 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L, + 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL, + 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL, + 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L, + 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L, + 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL, + 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L, + 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL, + 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L, + 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL, + 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L, + 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L, + 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL, + 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L, + 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL, + 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L } +}; + +#endif /* !MBEDTLS_BLOWFISH_ALT */ +#endif /* MBEDTLS_BLOWFISH_C */ diff --git a/ext/opcua_client/mbedtls/library/camellia.c b/ext/opcua_client/mbedtls/library/camellia.c new file mode 100644 index 0000000..bd76ea8 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/camellia.c @@ -0,0 +1,1076 @@ +/* + * Camellia implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The Camellia block cipher was designed by NTT and Mitsubishi Electric + * Corporation. + * + * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf + */ + +#include "common.h" + +#if defined(MBEDTLS_CAMELLIA_C) + +#include "mbedtls/camellia.h" +#include "mbedtls/platform_util.h" + +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_CAMELLIA_ALT) + +/* Parameter validation macros */ +#define CAMELLIA_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA) +#define CAMELLIA_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +static const unsigned char SIGMA_CHARS[6][8] = +{ + { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b }, + { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 }, + { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe }, + { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c }, + { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d }, + { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd } +}; + +#if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY) + +static const unsigned char FSb[256] = +{ + 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65, + 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189, + 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26, + 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77, + 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153, + 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215, + 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34, + 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80, + 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210, + 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148, + 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226, + 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46, + 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89, + 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250, + 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164, + 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158 +}; + +#define SBOX1(n) FSb[(n)] +#define SBOX2(n) (unsigned char) ((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff) +#define SBOX3(n) (unsigned char) ((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff) +#define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff] + +#else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */ + +static const unsigned char FSb[256] = +{ + 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65, + 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189, + 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26, + 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77, + 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153, + 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215, + 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34, + 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80, + 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210, + 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148, + 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226, + 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46, + 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89, + 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250, + 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164, + 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158 +}; + +static const unsigned char FSb2[256] = +{ + 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130, + 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123, + 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52, + 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154, + 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51, + 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175, + 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68, + 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160, + 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165, + 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41, + 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197, + 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92, + 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178, + 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245, + 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73, + 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61 +}; + +static const unsigned char FSb3[256] = +{ + 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160, + 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222, + 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13, + 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166, + 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204, + 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235, + 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17, + 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40, + 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105, + 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74, + 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113, + 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23, + 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172, + 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125, + 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82, + 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79 +}; + +static const unsigned char FSb4[256] = +{ + 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146, + 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108, + 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4, + 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105, + 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221, + 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99, + 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141, + 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128, + 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189, + 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77, + 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215, + 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80, + 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148, + 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46, + 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250, + 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158 +}; + +#define SBOX1(n) FSb[(n)] +#define SBOX2(n) FSb2[(n)] +#define SBOX3(n) FSb3[(n)] +#define SBOX4(n) FSb4[(n)] + +#endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */ + +static const unsigned char shifts[2][4][4] = +{ + { + { 1, 1, 1, 1 }, /* KL */ + { 0, 0, 0, 0 }, /* KR */ + { 1, 1, 1, 1 }, /* KA */ + { 0, 0, 0, 0 } /* KB */ + }, + { + { 1, 0, 1, 1 }, /* KL */ + { 1, 1, 0, 1 }, /* KR */ + { 1, 1, 1, 0 }, /* KA */ + { 1, 1, 0, 1 } /* KB */ + } +}; + +static const signed char indexes[2][4][20] = +{ + { + { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39, + 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */ + { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */ + { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17, + 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */ + { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */ + }, + { + { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1, + -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */ + { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17, + 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */ + { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59, + 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */ + { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21, + 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */ + } +}; + +static const signed char transposes[2][20] = +{ + { + 21, 22, 23, 20, + -1, -1, -1, -1, + 18, 19, 16, 17, + 11, 8, 9, 10, + 15, 12, 13, 14 + }, + { + 25, 26, 27, 24, + 29, 30, 31, 28, + 18, 19, 16, 17, + -1, -1, -1, -1, + -1, -1, -1, -1 + } +}; + +/* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */ +#define ROTL(DEST, SRC, SHIFT) \ + { \ + (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \ + (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \ + (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \ + (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \ + } + +#define FL(XL, XR, KL, KR) \ + { \ + (XR) = ((((XL) &(KL)) << 1) | (((XL) &(KL)) >> 31)) ^ (XR); \ + (XL) = ((XR) | (KR)) ^ (XL); \ + } + +#define FLInv(YL, YR, KL, KR) \ + { \ + (YL) = ((YR) | (KR)) ^ (YL); \ + (YR) = ((((YL) &(KL)) << 1) | (((YL) &(KL)) >> 31)) ^ (YR); \ + } + +#define SHIFT_AND_PLACE(INDEX, OFFSET) \ + { \ + TK[0] = KC[(OFFSET) * 4 + 0]; \ + TK[1] = KC[(OFFSET) * 4 + 1]; \ + TK[2] = KC[(OFFSET) * 4 + 2]; \ + TK[3] = KC[(OFFSET) * 4 + 3]; \ + \ + for (i = 1; i <= 4; i++) \ + if (shifts[(INDEX)][(OFFSET)][i -1]) \ + ROTL(TK + i * 4, TK, (15 * i) % 32); \ + \ + for (i = 0; i < 20; i++) \ + if (indexes[(INDEX)][(OFFSET)][i] != -1) { \ + RK[indexes[(INDEX)][(OFFSET)][i]] = TK[i]; \ + } \ + } + +static void camellia_feistel(const uint32_t x[2], const uint32_t k[2], + uint32_t z[2]) +{ + uint32_t I0, I1; + I0 = x[0] ^ k[0]; + I1 = x[1] ^ k[1]; + + I0 = ((uint32_t) SBOX1(MBEDTLS_BYTE_3(I0)) << 24) | + ((uint32_t) SBOX2(MBEDTLS_BYTE_2(I0)) << 16) | + ((uint32_t) SBOX3(MBEDTLS_BYTE_1(I0)) << 8) | + ((uint32_t) SBOX4(MBEDTLS_BYTE_0(I0))); + I1 = ((uint32_t) SBOX2(MBEDTLS_BYTE_3(I1)) << 24) | + ((uint32_t) SBOX3(MBEDTLS_BYTE_2(I1)) << 16) | + ((uint32_t) SBOX4(MBEDTLS_BYTE_1(I1)) << 8) | + ((uint32_t) SBOX1(MBEDTLS_BYTE_0(I1))); + + I0 ^= (I1 << 8) | (I1 >> 24); + I1 ^= (I0 << 16) | (I0 >> 16); + I0 ^= (I1 >> 8) | (I1 << 24); + I1 ^= (I0 >> 8) | (I0 << 24); + + z[0] ^= I1; + z[1] ^= I0; +} + +void mbedtls_camellia_init(mbedtls_camellia_context *ctx) +{ + CAMELLIA_VALIDATE(ctx != NULL); + memset(ctx, 0, sizeof(mbedtls_camellia_context)); +} + +void mbedtls_camellia_free(mbedtls_camellia_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_camellia_context)); +} + +/* + * Camellia key schedule (encryption) + */ +int mbedtls_camellia_setkey_enc(mbedtls_camellia_context *ctx, + const unsigned char *key, + unsigned int keybits) +{ + int idx; + size_t i; + uint32_t *RK; + unsigned char t[64]; + uint32_t SIGMA[6][2]; + uint32_t KC[16]; + uint32_t TK[20]; + + CAMELLIA_VALIDATE_RET(ctx != NULL); + CAMELLIA_VALIDATE_RET(key != NULL); + + RK = ctx->rk; + + memset(t, 0, 64); + memset(RK, 0, sizeof(ctx->rk)); + + switch (keybits) { + case 128: ctx->nr = 3; idx = 0; break; + case 192: + case 256: ctx->nr = 4; idx = 1; break; + default: return MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA; + } + + for (i = 0; i < keybits / 8; ++i) { + t[i] = key[i]; + } + + if (keybits == 192) { + for (i = 0; i < 8; i++) { + t[24 + i] = ~t[16 + i]; + } + } + + /* + * Prepare SIGMA values + */ + for (i = 0; i < 6; i++) { + SIGMA[i][0] = MBEDTLS_GET_UINT32_BE(SIGMA_CHARS[i], 0); + SIGMA[i][1] = MBEDTLS_GET_UINT32_BE(SIGMA_CHARS[i], 4); + } + + /* + * Key storage in KC + * Order: KL, KR, KA, KB + */ + memset(KC, 0, sizeof(KC)); + + /* Store KL, KR */ + for (i = 0; i < 8; i++) { + KC[i] = MBEDTLS_GET_UINT32_BE(t, i * 4); + } + + /* Generate KA */ + for (i = 0; i < 4; ++i) { + KC[8 + i] = KC[i] ^ KC[4 + i]; + } + + camellia_feistel(KC + 8, SIGMA[0], KC + 10); + camellia_feistel(KC + 10, SIGMA[1], KC + 8); + + for (i = 0; i < 4; ++i) { + KC[8 + i] ^= KC[i]; + } + + camellia_feistel(KC + 8, SIGMA[2], KC + 10); + camellia_feistel(KC + 10, SIGMA[3], KC + 8); + + if (keybits > 128) { + /* Generate KB */ + for (i = 0; i < 4; ++i) { + KC[12 + i] = KC[4 + i] ^ KC[8 + i]; + } + + camellia_feistel(KC + 12, SIGMA[4], KC + 14); + camellia_feistel(KC + 14, SIGMA[5], KC + 12); + } + + /* + * Generating subkeys + */ + + /* Manipulating KL */ + SHIFT_AND_PLACE(idx, 0); + + /* Manipulating KR */ + if (keybits > 128) { + SHIFT_AND_PLACE(idx, 1); + } + + /* Manipulating KA */ + SHIFT_AND_PLACE(idx, 2); + + /* Manipulating KB */ + if (keybits > 128) { + SHIFT_AND_PLACE(idx, 3); + } + + /* Do transpositions */ + for (i = 0; i < 20; i++) { + if (transposes[idx][i] != -1) { + RK[32 + 12 * idx + i] = RK[transposes[idx][i]]; + } + } + + return 0; +} + +/* + * Camellia key schedule (decryption) + */ +int mbedtls_camellia_setkey_dec(mbedtls_camellia_context *ctx, + const unsigned char *key, + unsigned int keybits) +{ + int idx, ret; + size_t i; + mbedtls_camellia_context cty; + uint32_t *RK; + uint32_t *SK; + CAMELLIA_VALIDATE_RET(ctx != NULL); + CAMELLIA_VALIDATE_RET(key != NULL); + + mbedtls_camellia_init(&cty); + + /* Also checks keybits */ + if ((ret = mbedtls_camellia_setkey_enc(&cty, key, keybits)) != 0) { + goto exit; + } + + ctx->nr = cty.nr; + idx = (ctx->nr == 4); + + RK = ctx->rk; + SK = cty.rk + 24 * 2 + 8 * idx * 2; + + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + + for (i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4) { + *RK++ = *SK++; + *RK++ = *SK++; + } + + SK -= 2; + + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + *RK++ = *SK++; + +exit: + mbedtls_camellia_free(&cty); + + return ret; +} + +/* + * Camellia-ECB block encryption/decryption + */ +int mbedtls_camellia_crypt_ecb(mbedtls_camellia_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16]) +{ + int NR; + uint32_t *RK, X[4]; + CAMELLIA_VALIDATE_RET(ctx != NULL); + CAMELLIA_VALIDATE_RET(mode == MBEDTLS_CAMELLIA_ENCRYPT || + mode == MBEDTLS_CAMELLIA_DECRYPT); + CAMELLIA_VALIDATE_RET(input != NULL); + CAMELLIA_VALIDATE_RET(output != NULL); + + ((void) mode); + + NR = ctx->nr; + RK = ctx->rk; + + X[0] = MBEDTLS_GET_UINT32_BE(input, 0); + X[1] = MBEDTLS_GET_UINT32_BE(input, 4); + X[2] = MBEDTLS_GET_UINT32_BE(input, 8); + X[3] = MBEDTLS_GET_UINT32_BE(input, 12); + + X[0] ^= *RK++; + X[1] ^= *RK++; + X[2] ^= *RK++; + X[3] ^= *RK++; + + while (NR) { + --NR; + camellia_feistel(X, RK, X + 2); + RK += 2; + camellia_feistel(X + 2, RK, X); + RK += 2; + camellia_feistel(X, RK, X + 2); + RK += 2; + camellia_feistel(X + 2, RK, X); + RK += 2; + camellia_feistel(X, RK, X + 2); + RK += 2; + camellia_feistel(X + 2, RK, X); + RK += 2; + + if (NR) { + FL(X[0], X[1], RK[0], RK[1]); + RK += 2; + FLInv(X[2], X[3], RK[0], RK[1]); + RK += 2; + } + } + + X[2] ^= *RK++; + X[3] ^= *RK++; + X[0] ^= *RK++; + X[1] ^= *RK++; + + MBEDTLS_PUT_UINT32_BE(X[2], output, 0); + MBEDTLS_PUT_UINT32_BE(X[3], output, 4); + MBEDTLS_PUT_UINT32_BE(X[0], output, 8); + MBEDTLS_PUT_UINT32_BE(X[1], output, 12); + + return 0; +} + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/* + * Camellia-CBC buffer encryption/decryption + */ +int mbedtls_camellia_crypt_cbc(mbedtls_camellia_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output) +{ + int i; + unsigned char temp[16]; + CAMELLIA_VALIDATE_RET(ctx != NULL); + CAMELLIA_VALIDATE_RET(mode == MBEDTLS_CAMELLIA_ENCRYPT || + mode == MBEDTLS_CAMELLIA_DECRYPT); + CAMELLIA_VALIDATE_RET(iv != NULL); + CAMELLIA_VALIDATE_RET(length == 0 || input != NULL); + CAMELLIA_VALIDATE_RET(length == 0 || output != NULL); + + if (length % 16) { + return MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH; + } + + if (mode == MBEDTLS_CAMELLIA_DECRYPT) { + while (length > 0) { + memcpy(temp, input, 16); + mbedtls_camellia_crypt_ecb(ctx, mode, input, output); + + for (i = 0; i < 16; i++) { + output[i] = (unsigned char) (output[i] ^ iv[i]); + } + + memcpy(iv, temp, 16); + + input += 16; + output += 16; + length -= 16; + } + } else { + while (length > 0) { + for (i = 0; i < 16; i++) { + output[i] = (unsigned char) (input[i] ^ iv[i]); + } + + mbedtls_camellia_crypt_ecb(ctx, mode, output, output); + memcpy(iv, output, 16); + + input += 16; + output += 16; + length -= 16; + } + } + + return 0; +} +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +/* + * Camellia-CFB128 buffer encryption/decryption + */ +int mbedtls_camellia_crypt_cfb128(mbedtls_camellia_context *ctx, + int mode, + size_t length, + size_t *iv_off, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output) +{ + int c; + size_t n; + CAMELLIA_VALIDATE_RET(ctx != NULL); + CAMELLIA_VALIDATE_RET(mode == MBEDTLS_CAMELLIA_ENCRYPT || + mode == MBEDTLS_CAMELLIA_DECRYPT); + CAMELLIA_VALIDATE_RET(iv != NULL); + CAMELLIA_VALIDATE_RET(iv_off != NULL); + CAMELLIA_VALIDATE_RET(length == 0 || input != NULL); + CAMELLIA_VALIDATE_RET(length == 0 || output != NULL); + + n = *iv_off; + if (n >= 16) { + return MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA; + } + + if (mode == MBEDTLS_CAMELLIA_DECRYPT) { + while (length--) { + if (n == 0) { + mbedtls_camellia_crypt_ecb(ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv); + } + + c = *input++; + *output++ = (unsigned char) (c ^ iv[n]); + iv[n] = (unsigned char) c; + + n = (n + 1) & 0x0F; + } + } else { + while (length--) { + if (n == 0) { + mbedtls_camellia_crypt_ecb(ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv); + } + + iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++); + + n = (n + 1) & 0x0F; + } + } + + *iv_off = n; + + return 0; +} +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +/* + * Camellia-CTR buffer encryption/decryption + */ +int mbedtls_camellia_crypt_ctr(mbedtls_camellia_context *ctx, + size_t length, + size_t *nc_off, + unsigned char nonce_counter[16], + unsigned char stream_block[16], + const unsigned char *input, + unsigned char *output) +{ + int c, i; + size_t n; + CAMELLIA_VALIDATE_RET(ctx != NULL); + CAMELLIA_VALIDATE_RET(nonce_counter != NULL); + CAMELLIA_VALIDATE_RET(stream_block != NULL); + CAMELLIA_VALIDATE_RET(nc_off != NULL); + CAMELLIA_VALIDATE_RET(length == 0 || input != NULL); + CAMELLIA_VALIDATE_RET(length == 0 || output != NULL); + + n = *nc_off; + if (n >= 16) { + return MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA; + } + + while (length--) { + if (n == 0) { + mbedtls_camellia_crypt_ecb(ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter, + stream_block); + + for (i = 16; i > 0; i--) { + if (++nonce_counter[i - 1] != 0) { + break; + } + } + } + c = *input++; + *output++ = (unsigned char) (c ^ stream_block[n]); + + n = (n + 1) & 0x0F; + } + + *nc_off = n; + + return 0; +} +#endif /* MBEDTLS_CIPHER_MODE_CTR */ +#endif /* !MBEDTLS_CAMELLIA_ALT */ + +#if defined(MBEDTLS_SELF_TEST) + +/* + * Camellia test vectors from: + * + * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html: + * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt + * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt + * (For each bitlength: Key 0, Nr 39) + */ +#define CAMELLIA_TESTS_ECB 2 + +static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] = +{ + { + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, + 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, + { + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, + 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, + { + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, + 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } + }, +}; + +static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] = +{ + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, + 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, + { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } +}; + +static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] = +{ + { + { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73, + 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 }, + { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE, + 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 } + }, + { + { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8, + 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 }, + { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9, + 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 } + }, + { + { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c, + 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 }, + { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C, + 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 } + } +}; + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#define CAMELLIA_TESTS_CBC 3 + +static const unsigned char camellia_test_cbc_key[3][32] = +{ + { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, + 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C } + , + { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, + 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, + 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B } + , + { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, + 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, + 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, + 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 } +}; + +static const unsigned char camellia_test_cbc_iv[16] = + +{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F } +; + +static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] = +{ + { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, + 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A }, + { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, + 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 }, + { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11, + 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF } + +}; + +static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] = +{ + { + { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0, + 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB }, + { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78, + 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 }, + { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B, + 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 } + }, + { + { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2, + 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 }, + { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42, + 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 }, + { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8, + 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 } + }, + { + { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A, + 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA }, + { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40, + 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 }, + { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA, + 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 } + } +}; +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +/* + * Camellia-CTR test vectors from: + * + * http://www.faqs.org/rfcs/rfc5528.html + */ + +static const unsigned char camellia_test_ctr_key[3][16] = +{ + { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC, + 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E }, + { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7, + 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 }, + { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8, + 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC } +}; + +static const unsigned char camellia_test_ctr_nonce_counter[3][16] = +{ + { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, + { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59, + 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 }, + { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F, + 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 } +}; + +static const unsigned char camellia_test_ctr_pt[3][48] = +{ + { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62, + 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 }, + + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }, + + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23 } +}; + +static const unsigned char camellia_test_ctr_ct[3][48] = +{ + { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A, + 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F }, + { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4, + 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44, + 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7, + 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 }, + { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88, + 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73, + 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1, + 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD, + 0xDF, 0x50, 0x86, 0x96 } +}; + +static const int camellia_test_ctr_len[3] = +{ 16, 32, 36 }; +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +/* + * Checkup routine + */ +int mbedtls_camellia_self_test(int verbose) +{ + int i, j, u, v; + unsigned char key[32]; + unsigned char buf[64]; + unsigned char src[16]; + unsigned char dst[16]; +#if defined(MBEDTLS_CIPHER_MODE_CBC) + unsigned char iv[16]; +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + size_t offset, len; + unsigned char nonce_counter[16]; + unsigned char stream_block[16]; +#endif + int ret = 1; + + mbedtls_camellia_context ctx; + + mbedtls_camellia_init(&ctx); + memset(key, 0, 32); + + for (j = 0; j < 6; j++) { + u = j >> 1; + v = j & 1; + + if (verbose != 0) { + mbedtls_printf(" CAMELLIA-ECB-%3d (%s): ", 128 + u * 64, + (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc"); + } + + for (i = 0; i < CAMELLIA_TESTS_ECB; i++) { + memcpy(key, camellia_test_ecb_key[u][i], 16 + 8 * u); + + if (v == MBEDTLS_CAMELLIA_DECRYPT) { + mbedtls_camellia_setkey_dec(&ctx, key, 128 + u * 64); + memcpy(src, camellia_test_ecb_cipher[u][i], 16); + memcpy(dst, camellia_test_ecb_plain[i], 16); + } else { /* MBEDTLS_CAMELLIA_ENCRYPT */ + mbedtls_camellia_setkey_enc(&ctx, key, 128 + u * 64); + memcpy(src, camellia_test_ecb_plain[i], 16); + memcpy(dst, camellia_test_ecb_cipher[u][i], 16); + } + + mbedtls_camellia_crypt_ecb(&ctx, v, src, buf); + + if (memcmp(buf, dst, 16) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + goto exit; + } + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + +#if defined(MBEDTLS_CIPHER_MODE_CBC) + /* + * CBC mode + */ + for (j = 0; j < 6; j++) { + u = j >> 1; + v = j & 1; + + if (verbose != 0) { + mbedtls_printf(" CAMELLIA-CBC-%3d (%s): ", 128 + u * 64, + (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc"); + } + + memcpy(src, camellia_test_cbc_iv, 16); + memcpy(dst, camellia_test_cbc_iv, 16); + memcpy(key, camellia_test_cbc_key[u], 16 + 8 * u); + + if (v == MBEDTLS_CAMELLIA_DECRYPT) { + mbedtls_camellia_setkey_dec(&ctx, key, 128 + u * 64); + } else { + mbedtls_camellia_setkey_enc(&ctx, key, 128 + u * 64); + } + + for (i = 0; i < CAMELLIA_TESTS_CBC; i++) { + + if (v == MBEDTLS_CAMELLIA_DECRYPT) { + memcpy(iv, src, 16); + memcpy(src, camellia_test_cbc_cipher[u][i], 16); + memcpy(dst, camellia_test_cbc_plain[i], 16); + } else { /* MBEDTLS_CAMELLIA_ENCRYPT */ + memcpy(iv, dst, 16); + memcpy(src, camellia_test_cbc_plain[i], 16); + memcpy(dst, camellia_test_cbc_cipher[u][i], 16); + } + + mbedtls_camellia_crypt_cbc(&ctx, v, 16, iv, src, buf); + + if (memcmp(buf, dst, 16) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + goto exit; + } + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + + if (verbose != 0) { + mbedtls_printf("\n"); + } + +#if defined(MBEDTLS_CIPHER_MODE_CTR) + /* + * CTR mode + */ + for (i = 0; i < 6; i++) { + u = i >> 1; + v = i & 1; + + if (verbose != 0) { + mbedtls_printf(" CAMELLIA-CTR-128 (%s): ", + (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc"); + } + + memcpy(nonce_counter, camellia_test_ctr_nonce_counter[u], 16); + memcpy(key, camellia_test_ctr_key[u], 16); + + offset = 0; + mbedtls_camellia_setkey_enc(&ctx, key, 128); + + if (v == MBEDTLS_CAMELLIA_DECRYPT) { + len = camellia_test_ctr_len[u]; + memcpy(buf, camellia_test_ctr_ct[u], len); + + mbedtls_camellia_crypt_ctr(&ctx, len, &offset, nonce_counter, stream_block, + buf, buf); + + if (memcmp(buf, camellia_test_ctr_pt[u], len) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + goto exit; + } + } else { + len = camellia_test_ctr_len[u]; + memcpy(buf, camellia_test_ctr_pt[u], len); + + mbedtls_camellia_crypt_ctr(&ctx, len, &offset, nonce_counter, stream_block, + buf, buf); + + if (memcmp(buf, camellia_test_ctr_ct[u], len) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + goto exit; + } + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + + ret = 0; + +exit: + mbedtls_camellia_free(&ctx); + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_CAMELLIA_C */ diff --git a/ext/opcua_client/mbedtls/library/ccm.c b/ext/opcua_client/mbedtls/library/ccm.c new file mode 100644 index 0000000..2ba21c7 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ccm.c @@ -0,0 +1,534 @@ +/* + * NIST SP800-38C compliant CCM implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * Definition of CCM: + * http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf + * RFC 3610 "Counter with CBC-MAC (CCM)" + * + * Related: + * RFC 5116 "An Interface and Algorithms for Authenticated Encryption" + */ + +#include "common.h" + +#if defined(MBEDTLS_CCM_C) + +#include "mbedtls/ccm.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" +#include "mbedtls/constant_time.h" + +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_CCM_ALT) + +#define CCM_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_CCM_BAD_INPUT) +#define CCM_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +#define CCM_ENCRYPT 0 +#define CCM_DECRYPT 1 + +/* + * Initialize context + */ +void mbedtls_ccm_init(mbedtls_ccm_context *ctx) +{ + CCM_VALIDATE(ctx != NULL); + memset(ctx, 0, sizeof(mbedtls_ccm_context)); +} + +int mbedtls_ccm_setkey(mbedtls_ccm_context *ctx, + mbedtls_cipher_id_t cipher, + const unsigned char *key, + unsigned int keybits) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const mbedtls_cipher_info_t *cipher_info; + + CCM_VALIDATE_RET(ctx != NULL); + CCM_VALIDATE_RET(key != NULL); + + cipher_info = mbedtls_cipher_info_from_values(cipher, keybits, + MBEDTLS_MODE_ECB); + if (cipher_info == NULL) { + return MBEDTLS_ERR_CCM_BAD_INPUT; + } + + if (cipher_info->block_size != 16) { + return MBEDTLS_ERR_CCM_BAD_INPUT; + } + + mbedtls_cipher_free(&ctx->cipher_ctx); + + if ((ret = mbedtls_cipher_setup(&ctx->cipher_ctx, cipher_info)) != 0) { + return ret; + } + + if ((ret = mbedtls_cipher_setkey(&ctx->cipher_ctx, key, keybits, + MBEDTLS_ENCRYPT)) != 0) { + return ret; + } + + return 0; +} + +/* + * Free context + */ +void mbedtls_ccm_free(mbedtls_ccm_context *ctx) +{ + if (ctx == NULL) { + return; + } + mbedtls_cipher_free(&ctx->cipher_ctx); + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_ccm_context)); +} + +/* + * Macros for common operations. + * Results in smaller compiled code than static inline functions. + */ + +/* + * Update the CBC-MAC state in y using a block in b + * (Always using b as the source helps the compiler optimise a bit better.) + */ +#define UPDATE_CBC_MAC \ + for (i = 0; i < 16; i++) \ + y[i] ^= b[i]; \ + \ + if ((ret = mbedtls_cipher_update(&ctx->cipher_ctx, y, 16, y, &olen)) != 0) \ + return ret; + +/* + * Encrypt or decrypt a partial block with CTR + * Warning: using b for temporary storage! src and dst must not be b! + * This avoids allocating one more 16 bytes buffer while allowing src == dst. + */ +#define CTR_CRYPT(dst, src, len) \ + do \ + { \ + if ((ret = mbedtls_cipher_update(&ctx->cipher_ctx, ctr, \ + 16, b, &olen)) != 0) \ + { \ + return ret; \ + } \ + \ + for (i = 0; i < (len); i++) \ + (dst)[i] = (src)[i] ^ b[i]; \ + } while (0) + +/* + * Authenticated encryption or decryption + */ +static int ccm_auth_crypt(mbedtls_ccm_context *ctx, int mode, size_t length, + const unsigned char *iv, size_t iv_len, + const unsigned char *add, size_t add_len, + const unsigned char *input, unsigned char *output, + unsigned char *tag, size_t tag_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char i; + unsigned char q; + size_t len_left, olen; + unsigned char b[16]; + unsigned char y[16]; + unsigned char ctr[16]; + const unsigned char *src; + unsigned char *dst; + + /* + * Check length requirements: SP800-38C A.1 + * Additional requirement: a < 2^16 - 2^8 to simplify the code. + * 'length' checked later (when writing it to the first block) + * + * Also, loosen the requirements to enable support for CCM* (IEEE 802.15.4). + */ + if (tag_len == 2 || tag_len > 16 || tag_len % 2 != 0) { + return MBEDTLS_ERR_CCM_BAD_INPUT; + } + + /* Also implies q is within bounds */ + if (iv_len < 7 || iv_len > 13) { + return MBEDTLS_ERR_CCM_BAD_INPUT; + } + + if (add_len >= 0xFF00) { + return MBEDTLS_ERR_CCM_BAD_INPUT; + } + + q = 16 - 1 - (unsigned char) iv_len; + + /* + * First block B_0: + * 0 .. 0 flags + * 1 .. iv_len nonce (aka iv) + * iv_len+1 .. 15 length + * + * With flags as (bits): + * 7 0 + * 6 add present? + * 5 .. 3 (t - 2) / 2 + * 2 .. 0 q - 1 + */ + b[0] = 0; + b[0] |= (add_len > 0) << 6; + b[0] |= ((tag_len - 2) / 2) << 3; + b[0] |= q - 1; + + memcpy(b + 1, iv, iv_len); + + for (i = 0, len_left = length; i < q; i++, len_left >>= 8) { + b[15-i] = MBEDTLS_BYTE_0(len_left); + } + + if (len_left > 0) { + return MBEDTLS_ERR_CCM_BAD_INPUT; + } + + + /* Start CBC-MAC with first block */ + memset(y, 0, 16); + UPDATE_CBC_MAC; + + /* + * If there is additional data, update CBC-MAC with + * add_len, add, 0 (padding to a block boundary) + */ + if (add_len > 0) { + size_t use_len; + len_left = add_len; + src = add; + + memset(b, 0, 16); + MBEDTLS_PUT_UINT16_BE(add_len, b, 0); + + use_len = len_left < 16 - 2 ? len_left : 16 - 2; + memcpy(b + 2, src, use_len); + len_left -= use_len; + src += use_len; + + UPDATE_CBC_MAC; + + while (len_left > 0) { + use_len = len_left > 16 ? 16 : len_left; + + memset(b, 0, 16); + memcpy(b, src, use_len); + UPDATE_CBC_MAC; + + len_left -= use_len; + src += use_len; + } + } + + /* + * Prepare counter block for encryption: + * 0 .. 0 flags + * 1 .. iv_len nonce (aka iv) + * iv_len+1 .. 15 counter (initially 1) + * + * With flags as (bits): + * 7 .. 3 0 + * 2 .. 0 q - 1 + */ + ctr[0] = q - 1; + memcpy(ctr + 1, iv, iv_len); + memset(ctr + 1 + iv_len, 0, q); + ctr[15] = 1; + + /* + * Authenticate and {en,de}crypt the message. + * + * The only difference between encryption and decryption is + * the respective order of authentication and {en,de}cryption. + */ + len_left = length; + src = input; + dst = output; + + while (len_left > 0) { + size_t use_len = len_left > 16 ? 16 : len_left; + + if (mode == CCM_ENCRYPT) { + memset(b, 0, 16); + memcpy(b, src, use_len); + UPDATE_CBC_MAC; + } + + CTR_CRYPT(dst, src, use_len); + + if (mode == CCM_DECRYPT) { + memset(b, 0, 16); + memcpy(b, dst, use_len); + UPDATE_CBC_MAC; + } + + dst += use_len; + src += use_len; + len_left -= use_len; + + /* + * Increment counter. + * No need to check for overflow thanks to the length check above. + */ + for (i = 0; i < q; i++) { + if (++ctr[15-i] != 0) { + break; + } + } + } + + /* + * Authentication: reset counter and crypt/mask internal tag + */ + for (i = 0; i < q; i++) { + ctr[15-i] = 0; + } + + CTR_CRYPT(y, y, 16); + memcpy(tag, y, tag_len); + + return 0; +} + +/* + * Authenticated encryption + */ +int mbedtls_ccm_star_encrypt_and_tag(mbedtls_ccm_context *ctx, size_t length, + const unsigned char *iv, size_t iv_len, + const unsigned char *add, size_t add_len, + const unsigned char *input, unsigned char *output, + unsigned char *tag, size_t tag_len) +{ + CCM_VALIDATE_RET(ctx != NULL); + CCM_VALIDATE_RET(iv != NULL); + CCM_VALIDATE_RET(add_len == 0 || add != NULL); + CCM_VALIDATE_RET(length == 0 || input != NULL); + CCM_VALIDATE_RET(length == 0 || output != NULL); + CCM_VALIDATE_RET(tag_len == 0 || tag != NULL); + return ccm_auth_crypt(ctx, CCM_ENCRYPT, length, iv, iv_len, + add, add_len, input, output, tag, tag_len); +} + +int mbedtls_ccm_encrypt_and_tag(mbedtls_ccm_context *ctx, size_t length, + const unsigned char *iv, size_t iv_len, + const unsigned char *add, size_t add_len, + const unsigned char *input, unsigned char *output, + unsigned char *tag, size_t tag_len) +{ + CCM_VALIDATE_RET(ctx != NULL); + CCM_VALIDATE_RET(iv != NULL); + CCM_VALIDATE_RET(add_len == 0 || add != NULL); + CCM_VALIDATE_RET(length == 0 || input != NULL); + CCM_VALIDATE_RET(length == 0 || output != NULL); + CCM_VALIDATE_RET(tag_len == 0 || tag != NULL); + if (tag_len == 0) { + return MBEDTLS_ERR_CCM_BAD_INPUT; + } + + return mbedtls_ccm_star_encrypt_and_tag(ctx, length, iv, iv_len, add, + add_len, input, output, tag, tag_len); +} + +/* + * Authenticated decryption + */ +int mbedtls_ccm_star_auth_decrypt(mbedtls_ccm_context *ctx, size_t length, + const unsigned char *iv, size_t iv_len, + const unsigned char *add, size_t add_len, + const unsigned char *input, unsigned char *output, + const unsigned char *tag, size_t tag_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char check_tag[16]; + int diff; + + CCM_VALIDATE_RET(ctx != NULL); + CCM_VALIDATE_RET(iv != NULL); + CCM_VALIDATE_RET(add_len == 0 || add != NULL); + CCM_VALIDATE_RET(length == 0 || input != NULL); + CCM_VALIDATE_RET(length == 0 || output != NULL); + CCM_VALIDATE_RET(tag_len == 0 || tag != NULL); + + if ((ret = ccm_auth_crypt(ctx, CCM_DECRYPT, length, + iv, iv_len, add, add_len, + input, output, check_tag, tag_len)) != 0) { + return ret; + } + + /* Check tag in "constant-time" */ + diff = mbedtls_ct_memcmp(tag, check_tag, tag_len); + + if (diff != 0) { + mbedtls_platform_zeroize(output, length); + return MBEDTLS_ERR_CCM_AUTH_FAILED; + } + + return 0; +} + +int mbedtls_ccm_auth_decrypt(mbedtls_ccm_context *ctx, size_t length, + const unsigned char *iv, size_t iv_len, + const unsigned char *add, size_t add_len, + const unsigned char *input, unsigned char *output, + const unsigned char *tag, size_t tag_len) +{ + CCM_VALIDATE_RET(ctx != NULL); + CCM_VALIDATE_RET(iv != NULL); + CCM_VALIDATE_RET(add_len == 0 || add != NULL); + CCM_VALIDATE_RET(length == 0 || input != NULL); + CCM_VALIDATE_RET(length == 0 || output != NULL); + CCM_VALIDATE_RET(tag_len == 0 || tag != NULL); + + if (tag_len == 0) { + return MBEDTLS_ERR_CCM_BAD_INPUT; + } + + return mbedtls_ccm_star_auth_decrypt(ctx, length, iv, iv_len, add, + add_len, input, output, tag, tag_len); +} +#endif /* !MBEDTLS_CCM_ALT */ + +#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) +/* + * Examples 1 to 3 from SP800-38C Appendix C + */ + +#define NB_TESTS 3 +#define CCM_SELFTEST_PT_MAX_LEN 24 +#define CCM_SELFTEST_CT_MAX_LEN 32 +/* + * The data is the same for all tests, only the used length changes + */ +static const unsigned char key_test_data[] = { + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f +}; + +static const unsigned char iv_test_data[] = { + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b +}; + +static const unsigned char ad_test_data[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13 +}; + +static const unsigned char msg_test_data[CCM_SELFTEST_PT_MAX_LEN] = { + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, +}; + +static const size_t iv_len_test_data[NB_TESTS] = { 7, 8, 12 }; +static const size_t add_len_test_data[NB_TESTS] = { 8, 16, 20 }; +static const size_t msg_len_test_data[NB_TESTS] = { 4, 16, 24 }; +static const size_t tag_len_test_data[NB_TESTS] = { 4, 6, 8 }; + +static const unsigned char res_test_data[NB_TESTS][CCM_SELFTEST_CT_MAX_LEN] = { + { 0x71, 0x62, 0x01, 0x5b, 0x4d, 0xac, 0x25, 0x5d }, + { 0xd2, 0xa1, 0xf0, 0xe0, 0x51, 0xea, 0x5f, 0x62, + 0x08, 0x1a, 0x77, 0x92, 0x07, 0x3d, 0x59, 0x3d, + 0x1f, 0xc6, 0x4f, 0xbf, 0xac, 0xcd }, + { 0xe3, 0xb2, 0x01, 0xa9, 0xf5, 0xb7, 0x1a, 0x7a, + 0x9b, 0x1c, 0xea, 0xec, 0xcd, 0x97, 0xe7, 0x0b, + 0x61, 0x76, 0xaa, 0xd9, 0xa4, 0x42, 0x8a, 0xa5, + 0x48, 0x43, 0x92, 0xfb, 0xc1, 0xb0, 0x99, 0x51 } +}; + +int mbedtls_ccm_self_test(int verbose) +{ + mbedtls_ccm_context ctx; + /* + * Some hardware accelerators require the input and output buffers + * would be in RAM, because the flash is not accessible. + * Use buffers on the stack to hold the test vectors data. + */ + unsigned char plaintext[CCM_SELFTEST_PT_MAX_LEN]; + unsigned char ciphertext[CCM_SELFTEST_CT_MAX_LEN]; + size_t i; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + mbedtls_ccm_init(&ctx); + + if (mbedtls_ccm_setkey(&ctx, MBEDTLS_CIPHER_ID_AES, key_test_data, + 8 * sizeof(key_test_data)) != 0) { + if (verbose != 0) { + mbedtls_printf(" CCM: setup failed"); + } + + return 1; + } + + for (i = 0; i < NB_TESTS; i++) { + if (verbose != 0) { + mbedtls_printf(" CCM-AES #%u: ", (unsigned int) i + 1); + } + + memset(plaintext, 0, CCM_SELFTEST_PT_MAX_LEN); + memset(ciphertext, 0, CCM_SELFTEST_CT_MAX_LEN); + memcpy(plaintext, msg_test_data, msg_len_test_data[i]); + + ret = mbedtls_ccm_encrypt_and_tag(&ctx, msg_len_test_data[i], + iv_test_data, iv_len_test_data[i], + ad_test_data, add_len_test_data[i], + plaintext, ciphertext, + ciphertext + msg_len_test_data[i], + tag_len_test_data[i]); + + if (ret != 0 || + memcmp(ciphertext, res_test_data[i], + msg_len_test_data[i] + tag_len_test_data[i]) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + return 1; + } + memset(plaintext, 0, CCM_SELFTEST_PT_MAX_LEN); + + ret = mbedtls_ccm_auth_decrypt(&ctx, msg_len_test_data[i], + iv_test_data, iv_len_test_data[i], + ad_test_data, add_len_test_data[i], + ciphertext, plaintext, + ciphertext + msg_len_test_data[i], + tag_len_test_data[i]); + + if (ret != 0 || + memcmp(plaintext, msg_test_data, msg_len_test_data[i]) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + return 1; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + mbedtls_ccm_free(&ctx); + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return 0; +} + +#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ + +#endif /* MBEDTLS_CCM_C */ diff --git a/ext/opcua_client/mbedtls/library/certs.c b/ext/opcua_client/mbedtls/library/certs.c new file mode 100644 index 0000000..79856cd --- /dev/null +++ b/ext/opcua_client/mbedtls/library/certs.c @@ -0,0 +1,1734 @@ +/* + * X.509 test certificates + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#include "mbedtls/certs.h" + +#if defined(MBEDTLS_CERTS_C) + +/* + * Test CA Certificates + * + * We define test CA certificates for each choice of the following parameters: + * - PEM or DER encoding + * - SHA-1 or SHA-256 hash + * - RSA or EC key + * + * Things to add: + * - multiple EC curve types + * + */ + +/* This is taken from tests/data_files/test-ca2.crt */ +/* BEGIN FILE string macro TEST_CA_CRT_EC_PEM tests/data_files/test-ca2.crt */ +#define TEST_CA_CRT_EC_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIICBDCCAYigAwIBAgIJAMFD4n5iQ8zoMAwGCCqGSM49BAMCBQAwPjELMAkGA1UE\r\n" \ + "BhMCTkwxETAPBgNVBAoMCFBvbGFyU1NMMRwwGgYDVQQDDBNQb2xhcnNzbCBUZXN0\r\n" \ + "IEVDIENBMB4XDTE5MDIxMDE0NDQwMFoXDTI5MDIxMDE0NDQwMFowPjELMAkGA1UE\r\n" \ + "BhMCTkwxETAPBgNVBAoMCFBvbGFyU1NMMRwwGgYDVQQDDBNQb2xhcnNzbCBUZXN0\r\n" \ + "IEVDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEw9orNEE3WC+HVv78ibopQ0tO\r\n" \ + "4G7DDldTMzlY1FK0kZU5CyPfXxckYkj8GpUpziwth8KIUoCv1mqrId240xxuWLjK\r\n" \ + "6LJpjvNBrSnDtF91p0dv1RkpVWmaUzsgtGYWYDMeo1AwTjAMBgNVHRMEBTADAQH/\r\n" \ + "MB0GA1UdDgQWBBSdbSAkSQE/K8t4tRm8fiTJ2/s2fDAfBgNVHSMEGDAWgBSdbSAk\r\n" \ + "SQE/K8t4tRm8fiTJ2/s2fDAMBggqhkjOPQQDAgUAA2gAMGUCMFHKrjAPpHB0BN1a\r\n" \ + "LH8TwcJ3vh0AxeKZj30mRdOKBmg/jLS3rU3g8VQBHpn8sOTTBwIxANxPO5AerimZ\r\n" \ + "hCjMe0d4CTHf1gFZMF70+IqEP+o5VHsIp2Cqvflb0VGWFC5l9a4cQg==\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is generated from tests/data_files/test-ca2.crt.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CA_CRT_EC_DER tests/data_files/test-ca2.crt.der */ +#define TEST_CA_CRT_EC_DER { \ + 0x30, 0x82, 0x02, 0x04, 0x30, 0x82, 0x01, 0x88, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, \ + 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, \ + 0x05, 0x00, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, \ + 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, \ + 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, \ + 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x13, 0x50, \ + 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, \ + 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x39, \ + 0x30, 0x32, 0x31, 0x30, 0x31, 0x34, 0x34, 0x34, 0x30, 0x30, 0x5a, 0x17, \ + 0x0d, 0x32, 0x39, 0x30, 0x32, 0x31, 0x30, 0x31, 0x34, 0x34, 0x34, 0x30, \ + 0x30, 0x5a, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, \ + 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, \ + 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, \ + 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x13, 0x50, \ + 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, \ + 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, \ + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, \ + 0x00, 0x22, 0x03, 0x62, 0x00, 0x04, 0xc3, 0xda, 0x2b, 0x34, 0x41, 0x37, \ + 0x58, 0x2f, 0x87, 0x56, 0xfe, 0xfc, 0x89, 0xba, 0x29, 0x43, 0x4b, 0x4e, \ + 0xe0, 0x6e, 0xc3, 0x0e, 0x57, 0x53, 0x33, 0x39, 0x58, 0xd4, 0x52, 0xb4, \ + 0x91, 0x95, 0x39, 0x0b, 0x23, 0xdf, 0x5f, 0x17, 0x24, 0x62, 0x48, 0xfc, \ + 0x1a, 0x95, 0x29, 0xce, 0x2c, 0x2d, 0x87, 0xc2, 0x88, 0x52, 0x80, 0xaf, \ + 0xd6, 0x6a, 0xab, 0x21, 0xdd, 0xb8, 0xd3, 0x1c, 0x6e, 0x58, 0xb8, 0xca, \ + 0xe8, 0xb2, 0x69, 0x8e, 0xf3, 0x41, 0xad, 0x29, 0xc3, 0xb4, 0x5f, 0x75, \ + 0xa7, 0x47, 0x6f, 0xd5, 0x19, 0x29, 0x55, 0x69, 0x9a, 0x53, 0x3b, 0x20, \ + 0xb4, 0x66, 0x16, 0x60, 0x33, 0x1e, 0xa3, 0x50, 0x30, 0x4e, 0x30, 0x0c, \ + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, \ + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, \ + 0x6d, 0x20, 0x24, 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, \ + 0x7e, 0x24, 0xc9, 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x1f, 0x06, 0x03, 0x55, \ + 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, \ + 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, \ + 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, \ + 0x3d, 0x04, 0x03, 0x02, 0x05, 0x00, 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, \ + 0x30, 0x51, 0xca, 0xae, 0x30, 0x0f, 0xa4, 0x70, 0x74, 0x04, 0xdd, 0x5a, \ + 0x2c, 0x7f, 0x13, 0xc1, 0xc2, 0x77, 0xbe, 0x1d, 0x00, 0xc5, 0xe2, 0x99, \ + 0x8f, 0x7d, 0x26, 0x45, 0xd3, 0x8a, 0x06, 0x68, 0x3f, 0x8c, 0xb4, 0xb7, \ + 0xad, 0x4d, 0xe0, 0xf1, 0x54, 0x01, 0x1e, 0x99, 0xfc, 0xb0, 0xe4, 0xd3, \ + 0x07, 0x02, 0x31, 0x00, 0xdc, 0x4f, 0x3b, 0x90, 0x1e, 0xae, 0x29, 0x99, \ + 0x84, 0x28, 0xcc, 0x7b, 0x47, 0x78, 0x09, 0x31, 0xdf, 0xd6, 0x01, 0x59, \ + 0x30, 0x5e, 0xf4, 0xf8, 0x8a, 0x84, 0x3f, 0xea, 0x39, 0x54, 0x7b, 0x08, \ + 0xa7, 0x60, 0xaa, 0xbd, 0xf9, 0x5b, 0xd1, 0x51, 0x96, 0x14, 0x2e, 0x65, \ + 0xf5, 0xae, 0x1c, 0x42 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/test-ca2.key.enc */ +/* BEGIN FILE string macro TEST_CA_KEY_EC_PEM tests/data_files/test-ca2.key.enc */ +#define TEST_CA_KEY_EC_PEM \ + "-----BEGIN EC PRIVATE KEY-----\r\n" \ + "Proc-Type: 4,ENCRYPTED\r\n" \ + "DEK-Info: DES-EDE3-CBC,307EAB469933D64E\r\n" \ + "\r\n" \ + "IxbrRmKcAzctJqPdTQLA4SWyBYYGYJVkYEna+F7Pa5t5Yg/gKADrFKcm6B72e7DG\r\n" \ + "ihExtZI648s0zdYw6qSJ74vrPSuWDe5qm93BqsfVH9svtCzWHW0pm1p0KTBCFfUq\r\n" \ + "UsuWTITwJImcnlAs1gaRZ3sAWm7cOUidL0fo2G0fYUFNcYoCSLffCFTEHBuPnagb\r\n" \ + "a77x/sY1Bvii8S9/XhDTb6pTMx06wzrm\r\n" \ + "-----END EC PRIVATE KEY-----\r\n" +/* END FILE */ + +#define TEST_CA_PWD_EC_PEM "PolarSSLTest" + +/* This is generated from tests/data_files/test-ca2.key.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CA_KEY_EC_DER tests/data_files/test-ca2.key.der */ +#define TEST_CA_KEY_EC_DER { \ + 0x30, 0x81, 0xa4, 0x02, 0x01, 0x01, 0x04, 0x30, 0x83, 0xd9, 0x15, 0x0e, \ + 0xa0, 0x71, 0xf0, 0x57, 0x10, 0x33, 0xa3, 0x38, 0xb8, 0x86, 0xc1, 0xa6, \ + 0x11, 0x5d, 0x6d, 0xb4, 0x03, 0xe1, 0x29, 0x76, 0x45, 0xd7, 0x87, 0x6f, \ + 0x23, 0xab, 0x44, 0x20, 0xea, 0x64, 0x7b, 0x85, 0xb1, 0x76, 0xe7, 0x85, \ + 0x95, 0xaa, 0x74, 0xd6, 0xd1, 0xa4, 0x5e, 0xea, 0xa0, 0x07, 0x06, 0x05, \ + 0x2b, 0x81, 0x04, 0x00, 0x22, 0xa1, 0x64, 0x03, 0x62, 0x00, 0x04, 0xc3, \ + 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f, 0x87, 0x56, 0xfe, 0xfc, 0x89, \ + 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e, 0xc3, 0x0e, 0x57, 0x53, 0x33, \ + 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95, 0x39, 0x0b, 0x23, 0xdf, 0x5f, \ + 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95, 0x29, 0xce, 0x2c, 0x2d, 0x87, \ + 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a, 0xab, 0x21, 0xdd, 0xb8, 0xd3, \ + 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2, 0x69, 0x8e, 0xf3, 0x41, 0xad, \ + 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47, 0x6f, 0xd5, 0x19, 0x29, 0x55, \ + 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66, 0x16, 0x60, 0x33, 0x1e \ +} +/* END FILE */ + +/* This is taken from tests/data_files/test-ca-sha256.crt. */ +/* BEGIN FILE string macro TEST_CA_CRT_RSA_SHA256_PEM tests/data_files/test-ca-sha256.crt */ +#define TEST_CA_CRT_RSA_SHA256_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIIDQTCCAimgAwIBAgIBAzANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\r\n" \ + "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ + "MTkwMjEwMTQ0NDAwWhcNMjkwMjEwMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\r\n" \ + "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\r\n" \ + "mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\r\n" \ + "50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\r\n" \ + "YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\r\n" \ + "R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\r\n" \ + "KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\r\n" \ + "UDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/\r\n" \ + "MB8GA1UdIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MA0GCSqGSIb3DQEBCwUA\r\n" \ + "A4IBAQA4qFSCth2q22uJIdE4KGHJsJjVEfw2/xn+MkTvCMfxVrvmRvqCtjE4tKDl\r\n" \ + "oK4MxFOek07oDZwvtAT9ijn1hHftTNS7RH9zd/fxNpfcHnMZXVC4w4DNA1fSANtW\r\n" \ + "5sY1JB5Je9jScrsLSS+mAjyv0Ow3Hb2Bix8wu7xNNrV5fIf7Ubm+wt6SqEBxu3Kb\r\n" \ + "+EfObAT4huf3czznhH3C17ed6NSbXwoXfby7stWUDeRJv08RaFOykf/Aae7bY5PL\r\n" \ + "yTVrkAnikMntJ9YI+hNNYt3inqq11A5cN0+rVTst8UKCxzQ4GpvroSwPKTFkbMw4\r\n" \ + "/anT1dVxr/BtwJfiESoK3/4CeXR1\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is generated from tests/data_files/test-ca-sha256.crt.der + * using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CA_CRT_RSA_SHA256_DER tests/data_files/test-ca-sha256.crt.der */ +#define TEST_CA_CRT_RSA_SHA256_DER { \ + 0x30, 0x82, 0x03, 0x41, 0x30, 0x82, 0x02, 0x29, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x03, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, \ + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, \ + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, \ + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, \ + 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, \ + 0x04, 0x03, 0x0c, 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, \ + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, \ + 0x31, 0x39, 0x30, 0x32, 0x31, 0x30, 0x31, 0x34, 0x34, 0x34, 0x30, 0x30, \ + 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x32, 0x31, 0x30, 0x31, 0x34, 0x34, \ + 0x34, 0x30, 0x30, 0x5a, 0x30, 0x3b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, \ + 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x20, 0x54, 0x65, \ + 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, \ + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, \ + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, \ + 0x01, 0x00, 0xc0, 0xdf, 0x37, 0xfc, 0x17, 0xbb, 0xe0, 0x96, 0x9d, 0x3f, \ + 0x86, 0xde, 0x96, 0x32, 0x7d, 0x44, 0xa5, 0x16, 0xa0, 0xcd, 0x21, 0xf1, \ + 0x99, 0xd4, 0xec, 0xea, 0xcb, 0x7c, 0x18, 0x58, 0x08, 0x94, 0xa5, 0xec, \ + 0x9b, 0xc5, 0x8b, 0xdf, 0x1a, 0x1e, 0x99, 0x38, 0x99, 0x87, 0x1e, 0x7b, \ + 0xc0, 0x8d, 0x39, 0xdf, 0x38, 0x5d, 0x70, 0x78, 0x07, 0xd3, 0x9e, 0xd9, \ + 0x93, 0xe8, 0xb9, 0x72, 0x51, 0xc5, 0xce, 0xa3, 0x30, 0x52, 0xa9, 0xf2, \ + 0xe7, 0x40, 0x70, 0x14, 0xcb, 0x44, 0xa2, 0x72, 0x0b, 0xc2, 0xe5, 0x40, \ + 0xf9, 0x3e, 0xe5, 0xa6, 0x0e, 0xb3, 0xf9, 0xec, 0x4a, 0x63, 0xc0, 0xb8, \ + 0x29, 0x00, 0x74, 0x9c, 0x57, 0x3b, 0xa8, 0xa5, 0x04, 0x90, 0x71, 0xf1, \ + 0xbd, 0x83, 0xd9, 0x3f, 0xd6, 0xa5, 0xe2, 0x3c, 0x2a, 0x8f, 0xef, 0x27, \ + 0x60, 0xc3, 0xc6, 0x9f, 0xcb, 0xba, 0xec, 0x60, 0x7d, 0xb7, 0xe6, 0x84, \ + 0x32, 0xbe, 0x4f, 0xfb, 0x58, 0x26, 0x22, 0x03, 0x5b, 0xd4, 0xb4, 0xd5, \ + 0xfb, 0xf5, 0xe3, 0x96, 0x2e, 0x70, 0xc0, 0xe4, 0x2e, 0xbd, 0xfc, 0x2e, \ + 0xee, 0xe2, 0x41, 0x55, 0xc0, 0x34, 0x2e, 0x7d, 0x24, 0x72, 0x69, 0xcb, \ + 0x47, 0xb1, 0x14, 0x40, 0x83, 0x7d, 0x67, 0xf4, 0x86, 0xf6, 0x31, 0xab, \ + 0xf1, 0x79, 0xa4, 0xb2, 0xb5, 0x2e, 0x12, 0xf9, 0x84, 0x17, 0xf0, 0x62, \ + 0x6f, 0x27, 0x3e, 0x13, 0x58, 0xb1, 0x54, 0x0d, 0x21, 0x9a, 0x73, 0x37, \ + 0xa1, 0x30, 0xcf, 0x6f, 0x92, 0xdc, 0xf6, 0xe9, 0xfc, 0xac, 0xdb, 0x2e, \ + 0x28, 0xd1, 0x7e, 0x02, 0x4b, 0x23, 0xa0, 0x15, 0xf2, 0x38, 0x65, 0x64, \ + 0x09, 0xea, 0x0c, 0x6e, 0x8e, 0x1b, 0x17, 0xa0, 0x71, 0xc8, 0xb3, 0x9b, \ + 0xc9, 0xab, 0xe9, 0xc3, 0xf2, 0xcf, 0x87, 0x96, 0x8f, 0x80, 0x02, 0x32, \ + 0x9e, 0x99, 0x58, 0x6f, 0xa2, 0xd5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, \ + 0x50, 0x30, 0x4e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, \ + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, \ + 0x04, 0x16, 0x04, 0x14, 0xb4, 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, \ + 0xf6, 0xb9, 0xd5, 0xa6, 0x95, 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, \ + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, \ + 0x14, 0xb4, 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, 0xf6, 0xb9, 0xd5, \ + 0xa6, 0x95, 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, 0x30, 0x0d, 0x06, \ + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, \ + 0x03, 0x82, 0x01, 0x01, 0x00, 0x38, 0xa8, 0x54, 0x82, 0xb6, 0x1d, 0xaa, \ + 0xdb, 0x6b, 0x89, 0x21, 0xd1, 0x38, 0x28, 0x61, 0xc9, 0xb0, 0x98, 0xd5, \ + 0x11, 0xfc, 0x36, 0xff, 0x19, 0xfe, 0x32, 0x44, 0xef, 0x08, 0xc7, 0xf1, \ + 0x56, 0xbb, 0xe6, 0x46, 0xfa, 0x82, 0xb6, 0x31, 0x38, 0xb4, 0xa0, 0xe5, \ + 0xa0, 0xae, 0x0c, 0xc4, 0x53, 0x9e, 0x93, 0x4e, 0xe8, 0x0d, 0x9c, 0x2f, \ + 0xb4, 0x04, 0xfd, 0x8a, 0x39, 0xf5, 0x84, 0x77, 0xed, 0x4c, 0xd4, 0xbb, \ + 0x44, 0x7f, 0x73, 0x77, 0xf7, 0xf1, 0x36, 0x97, 0xdc, 0x1e, 0x73, 0x19, \ + 0x5d, 0x50, 0xb8, 0xc3, 0x80, 0xcd, 0x03, 0x57, 0xd2, 0x00, 0xdb, 0x56, \ + 0xe6, 0xc6, 0x35, 0x24, 0x1e, 0x49, 0x7b, 0xd8, 0xd2, 0x72, 0xbb, 0x0b, \ + 0x49, 0x2f, 0xa6, 0x02, 0x3c, 0xaf, 0xd0, 0xec, 0x37, 0x1d, 0xbd, 0x81, \ + 0x8b, 0x1f, 0x30, 0xbb, 0xbc, 0x4d, 0x36, 0xb5, 0x79, 0x7c, 0x87, 0xfb, \ + 0x51, 0xb9, 0xbe, 0xc2, 0xde, 0x92, 0xa8, 0x40, 0x71, 0xbb, 0x72, 0x9b, \ + 0xf8, 0x47, 0xce, 0x6c, 0x04, 0xf8, 0x86, 0xe7, 0xf7, 0x73, 0x3c, 0xe7, \ + 0x84, 0x7d, 0xc2, 0xd7, 0xb7, 0x9d, 0xe8, 0xd4, 0x9b, 0x5f, 0x0a, 0x17, \ + 0x7d, 0xbc, 0xbb, 0xb2, 0xd5, 0x94, 0x0d, 0xe4, 0x49, 0xbf, 0x4f, 0x11, \ + 0x68, 0x53, 0xb2, 0x91, 0xff, 0xc0, 0x69, 0xee, 0xdb, 0x63, 0x93, 0xcb, \ + 0xc9, 0x35, 0x6b, 0x90, 0x09, 0xe2, 0x90, 0xc9, 0xed, 0x27, 0xd6, 0x08, \ + 0xfa, 0x13, 0x4d, 0x62, 0xdd, 0xe2, 0x9e, 0xaa, 0xb5, 0xd4, 0x0e, 0x5c, \ + 0x37, 0x4f, 0xab, 0x55, 0x3b, 0x2d, 0xf1, 0x42, 0x82, 0xc7, 0x34, 0x38, \ + 0x1a, 0x9b, 0xeb, 0xa1, 0x2c, 0x0f, 0x29, 0x31, 0x64, 0x6c, 0xcc, 0x38, \ + 0xfd, 0xa9, 0xd3, 0xd5, 0xd5, 0x71, 0xaf, 0xf0, 0x6d, 0xc0, 0x97, 0xe2, \ + 0x11, 0x2a, 0x0a, 0xdf, 0xfe, 0x02, 0x79, 0x74, 0x75 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/test-ca-sha1.crt. */ +/* BEGIN FILE string macro TEST_CA_CRT_RSA_SHA1_PEM tests/data_files/test-ca-sha1.crt */ +#define TEST_CA_CRT_RSA_SHA1_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIIDQTCCAimgAwIBAgIBAzANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" \ + "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ + "MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\r\n" \ + "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\r\n" \ + "mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\r\n" \ + "50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\r\n" \ + "YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\r\n" \ + "R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\r\n" \ + "KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\r\n" \ + "UDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/\r\n" \ + "MB8GA1UdIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MA0GCSqGSIb3DQEBBQUA\r\n" \ + "A4IBAQABE3OEPfEd/bcJW5ZdU3/VgPNS4tMzh8gnJP/V2FcvFtGylMpQq6YnEBYI\r\n" \ + "yBHAL4DRvlMY5rnXGBp3ODR8MpqHC6AquRTCLzjS57iYff//4QFQqW9n92zctspv\r\n" \ + "czkaPKgjqo1No3Uq0Xaz10rcxyTUPrf5wNVRZ2V0KvllvAAVSzbI4mpdUXztjhST\r\n" \ + "S5A2BeWQAAOr0zq1F7TSRVJpJs7jmB2ai/igkh1IAjcuwV6VwlP+sbw0gjQ0NpGM\r\n" \ + "iHpnlzRAi/tIbtOvMIGOBU2TIfax/5jq1agUx5aPmT5TWAiJPOOP6l5xXnDwxeYS\r\n" \ + "NWqiX9GyusBZjezaCaHabjDLU0qQ\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is taken from tests/data_files/test-ca-sha1.crt.der. */ +/* BEGIN FILE binary macro TEST_CA_CRT_RSA_SHA1_DER tests/data_files/test-ca-sha1.crt.der */ +#define TEST_CA_CRT_RSA_SHA1_DER { \ + 0x30, 0x82, 0x03, 0x41, 0x30, 0x82, 0x02, 0x29, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x03, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, \ + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, \ + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, \ + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, \ + 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, \ + 0x04, 0x03, 0x0c, 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, \ + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, \ + 0x31, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, 0x34, 0x30, 0x30, \ + 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, \ + 0x34, 0x30, 0x30, 0x5a, 0x30, 0x3b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, \ + 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x20, 0x54, 0x65, \ + 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, \ + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, \ + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, \ + 0x01, 0x00, 0xc0, 0xdf, 0x37, 0xfc, 0x17, 0xbb, 0xe0, 0x96, 0x9d, 0x3f, \ + 0x86, 0xde, 0x96, 0x32, 0x7d, 0x44, 0xa5, 0x16, 0xa0, 0xcd, 0x21, 0xf1, \ + 0x99, 0xd4, 0xec, 0xea, 0xcb, 0x7c, 0x18, 0x58, 0x08, 0x94, 0xa5, 0xec, \ + 0x9b, 0xc5, 0x8b, 0xdf, 0x1a, 0x1e, 0x99, 0x38, 0x99, 0x87, 0x1e, 0x7b, \ + 0xc0, 0x8d, 0x39, 0xdf, 0x38, 0x5d, 0x70, 0x78, 0x07, 0xd3, 0x9e, 0xd9, \ + 0x93, 0xe8, 0xb9, 0x72, 0x51, 0xc5, 0xce, 0xa3, 0x30, 0x52, 0xa9, 0xf2, \ + 0xe7, 0x40, 0x70, 0x14, 0xcb, 0x44, 0xa2, 0x72, 0x0b, 0xc2, 0xe5, 0x40, \ + 0xf9, 0x3e, 0xe5, 0xa6, 0x0e, 0xb3, 0xf9, 0xec, 0x4a, 0x63, 0xc0, 0xb8, \ + 0x29, 0x00, 0x74, 0x9c, 0x57, 0x3b, 0xa8, 0xa5, 0x04, 0x90, 0x71, 0xf1, \ + 0xbd, 0x83, 0xd9, 0x3f, 0xd6, 0xa5, 0xe2, 0x3c, 0x2a, 0x8f, 0xef, 0x27, \ + 0x60, 0xc3, 0xc6, 0x9f, 0xcb, 0xba, 0xec, 0x60, 0x7d, 0xb7, 0xe6, 0x84, \ + 0x32, 0xbe, 0x4f, 0xfb, 0x58, 0x26, 0x22, 0x03, 0x5b, 0xd4, 0xb4, 0xd5, \ + 0xfb, 0xf5, 0xe3, 0x96, 0x2e, 0x70, 0xc0, 0xe4, 0x2e, 0xbd, 0xfc, 0x2e, \ + 0xee, 0xe2, 0x41, 0x55, 0xc0, 0x34, 0x2e, 0x7d, 0x24, 0x72, 0x69, 0xcb, \ + 0x47, 0xb1, 0x14, 0x40, 0x83, 0x7d, 0x67, 0xf4, 0x86, 0xf6, 0x31, 0xab, \ + 0xf1, 0x79, 0xa4, 0xb2, 0xb5, 0x2e, 0x12, 0xf9, 0x84, 0x17, 0xf0, 0x62, \ + 0x6f, 0x27, 0x3e, 0x13, 0x58, 0xb1, 0x54, 0x0d, 0x21, 0x9a, 0x73, 0x37, \ + 0xa1, 0x30, 0xcf, 0x6f, 0x92, 0xdc, 0xf6, 0xe9, 0xfc, 0xac, 0xdb, 0x2e, \ + 0x28, 0xd1, 0x7e, 0x02, 0x4b, 0x23, 0xa0, 0x15, 0xf2, 0x38, 0x65, 0x64, \ + 0x09, 0xea, 0x0c, 0x6e, 0x8e, 0x1b, 0x17, 0xa0, 0x71, 0xc8, 0xb3, 0x9b, \ + 0xc9, 0xab, 0xe9, 0xc3, 0xf2, 0xcf, 0x87, 0x96, 0x8f, 0x80, 0x02, 0x32, \ + 0x9e, 0x99, 0x58, 0x6f, 0xa2, 0xd5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, \ + 0x50, 0x30, 0x4e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, \ + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, \ + 0x04, 0x16, 0x04, 0x14, 0xb4, 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, \ + 0xf6, 0xb9, 0xd5, 0xa6, 0x95, 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, \ + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, \ + 0x14, 0xb4, 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, 0xf6, 0xb9, 0xd5, \ + 0xa6, 0x95, 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, 0x30, 0x0d, 0x06, \ + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, \ + 0x03, 0x82, 0x01, 0x01, 0x00, 0x01, 0x13, 0x73, 0x84, 0x3d, 0xf1, 0x1d, \ + 0xfd, 0xb7, 0x09, 0x5b, 0x96, 0x5d, 0x53, 0x7f, 0xd5, 0x80, 0xf3, 0x52, \ + 0xe2, 0xd3, 0x33, 0x87, 0xc8, 0x27, 0x24, 0xff, 0xd5, 0xd8, 0x57, 0x2f, \ + 0x16, 0xd1, 0xb2, 0x94, 0xca, 0x50, 0xab, 0xa6, 0x27, 0x10, 0x16, 0x08, \ + 0xc8, 0x11, 0xc0, 0x2f, 0x80, 0xd1, 0xbe, 0x53, 0x18, 0xe6, 0xb9, 0xd7, \ + 0x18, 0x1a, 0x77, 0x38, 0x34, 0x7c, 0x32, 0x9a, 0x87, 0x0b, 0xa0, 0x2a, \ + 0xb9, 0x14, 0xc2, 0x2f, 0x38, 0xd2, 0xe7, 0xb8, 0x98, 0x7d, 0xff, 0xff, \ + 0xe1, 0x01, 0x50, 0xa9, 0x6f, 0x67, 0xf7, 0x6c, 0xdc, 0xb6, 0xca, 0x6f, \ + 0x73, 0x39, 0x1a, 0x3c, 0xa8, 0x23, 0xaa, 0x8d, 0x4d, 0xa3, 0x75, 0x2a, \ + 0xd1, 0x76, 0xb3, 0xd7, 0x4a, 0xdc, 0xc7, 0x24, 0xd4, 0x3e, 0xb7, 0xf9, \ + 0xc0, 0xd5, 0x51, 0x67, 0x65, 0x74, 0x2a, 0xf9, 0x65, 0xbc, 0x00, 0x15, \ + 0x4b, 0x36, 0xc8, 0xe2, 0x6a, 0x5d, 0x51, 0x7c, 0xed, 0x8e, 0x14, 0x93, \ + 0x4b, 0x90, 0x36, 0x05, 0xe5, 0x90, 0x00, 0x03, 0xab, 0xd3, 0x3a, 0xb5, \ + 0x17, 0xb4, 0xd2, 0x45, 0x52, 0x69, 0x26, 0xce, 0xe3, 0x98, 0x1d, 0x9a, \ + 0x8b, 0xf8, 0xa0, 0x92, 0x1d, 0x48, 0x02, 0x37, 0x2e, 0xc1, 0x5e, 0x95, \ + 0xc2, 0x53, 0xfe, 0xb1, 0xbc, 0x34, 0x82, 0x34, 0x34, 0x36, 0x91, 0x8c, \ + 0x88, 0x7a, 0x67, 0x97, 0x34, 0x40, 0x8b, 0xfb, 0x48, 0x6e, 0xd3, 0xaf, \ + 0x30, 0x81, 0x8e, 0x05, 0x4d, 0x93, 0x21, 0xf6, 0xb1, 0xff, 0x98, 0xea, \ + 0xd5, 0xa8, 0x14, 0xc7, 0x96, 0x8f, 0x99, 0x3e, 0x53, 0x58, 0x08, 0x89, \ + 0x3c, 0xe3, 0x8f, 0xea, 0x5e, 0x71, 0x5e, 0x70, 0xf0, 0xc5, 0xe6, 0x12, \ + 0x35, 0x6a, 0xa2, 0x5f, 0xd1, 0xb2, 0xba, 0xc0, 0x59, 0x8d, 0xec, 0xda, \ + 0x09, 0xa1, 0xda, 0x6e, 0x30, 0xcb, 0x53, 0x4a, 0x90 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/test-ca.key */ +/* BEGIN FILE string macro TEST_CA_KEY_RSA_PEM tests/data_files/test-ca.key */ +#define TEST_CA_KEY_RSA_PEM \ + "-----BEGIN RSA PRIVATE KEY-----\r\n" \ + "Proc-Type: 4,ENCRYPTED\r\n" \ + "AES-128-CBC,781840E6B804AE83D2AF71127C4CE314\r\n" \ + "\r\n" \ + "etQ3xgGLbuYF9vR1km03TH5fwfly1hOlix0PtfQ+t9HG065vTtSEHYc/OyHwdy79\r\n" \ + "NCLX5RUrPh06E/XlKzMNVHAXqkwFnIwNzRLsOozeP1L7iZEZb9QMeiN5Org+btCO\r\n" \ + "bylXPB4YirfuE7GSJalWY/pq3FQtD33zTIKmNhXfVj3sbwGI/8D9XjaKUb8PODOB\r\n" \ + "skOalmx6RvYRvg0lmRxB3+T3wejIsrrDPweYqte9B6dVHIVG1ZmvoA6/wnKZZZeV\r\n" \ + "sjj8OpL3OwUBrjuGSknE9Rs6kCuSCbHOYVK8VzcZmCYpie0TFnb3Sk8M6vjfW+45\r\n" \ + "U7WUMlSAPxKH6lJDzWdwHqLvsVJwuNnaAaBXg9/8U/rzQEWuq8Ar3s8fw2Jg3F1G\r\n" \ + "L6N5ZAEfCz3Sa0N9WKafR/RSQj+rq8Z3w4POAafhbzk249uo5K8B1Z3cQwLxeXIl\r\n" \ + "UbRQz1TZy4oNTfQzCahYruPNyvwgTkfwAFFvbLAdaiJd2ZtLBoqYE64TYakYnvcC\r\n" \ + "itim1bmySIKoxlMfBGFmMuF03epT0pSx701jlGzGi0l0m16NEjoVxDwo5j93SmiM\r\n" \ + "sQdjC1lOGk2iCLkphIQqHFjFJYWjvh1UUIqWZf+ZWOOxlf4x9a1pUVj6FvtECxNB\r\n" \ + "/mA/m4Iq4LAuVXHE1MpHeq067lJ6wWlrsb2WVmiNGfQ2AC7fMtpcPuunBVT9NV1m\r\n" \ + "1rbDzIgLIWAzqz/cy3N8Q8vfxnrFtmNUyM191Zyq+YF14hIKWX9J1qR4LXwWAzVV\r\n" \ + "UrC8IL4pA2mtRkW4qFsB0EmHAxO/cedDTPjVFty5WSzhNuvYZxX45HAkGIfK6d21\r\n" \ + "7WHPhHG+zaaUTWMUVixB0IcKp6RecjYPFzBHS0YeX88Ue2cyT/90jMiQ9ssOgRrG\r\n" \ + "ZJRJvZAc3TSCnY9sNPYoGrJPiZuCnlUj3ENNurYVy12ai0WFxwnNUZjRUhDS6hjm\r\n" \ + "cDHD5TlI9MZ6M+Mb/Bw4Ig8HuTHOtQBYD9vhtXsG+B7H/j6cS+1umaKjrnG/kK4W\r\n" \ + "R6YXwM2faAi+DwgjjoMXSzRqSTF8PdTIWbAXo3bc2qsXPTMBA8PEp4nb5scHZ4Ts\r\n" \ + "EcBNp2jv0j4gBkRmGIab17cWMrlagjFy89DhqZUFwKdeZs+yJ92A5xstWxOUfpEP\r\n" \ + "90T/bsp1G5d7WW5fl2TRJvYJNDM+djkKIh0zCkduiZ36oVM6nDdbjmXqjQXopeSD\r\n" \ + "gtOourBRF8g99W0fW8QT+yPhP0Pkyz6EG8eQO6Zwh439xdoVwu9jUzQAPmZ0uNeR\r\n" \ + "xTXXihYyv72z27rInjLiIPXL25K9eDVLlcSR3RyG7YYgjdQAL2VJDLcBz5jox1uQ\r\n" \ + "0guoD5wmfu2FWLqYE7HeTYntdY53lCflwq0GHRMjrrsVpx+5VDQ6Yi47Ny9SWLcp\r\n" \ + "fPI3iBkXuGRWupzs6N4pQdSO0dU28KfpMM5QvFoLIn67brCHEQij4dgFrCTYEyBX\r\n" \ + "9+jiNImUFYUhAFuxvUbfZt4O/ABLIElvHLfJs1oYCmI/nWpvLFqXB5rnzPNfEi0H\r\n" \ + "PGGe1Hj/t+CJIp/6ios3yNy2QtXO754TZH2UVu51Ykyig5PFjZVoUkbRvHQYcWfU\r\n" \ + "-----END RSA PRIVATE KEY-----\r\n" +/* END FILE */ + +#define TEST_CA_PWD_RSA_PEM "PolarSSLTest" + +/* This was generated from test-ca.key.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CA_KEY_RSA_DER tests/data_files/test-ca.key.der */ +#define TEST_CA_KEY_RSA_DER { \ + 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, \ + 0xc0, 0xdf, 0x37, 0xfc, 0x17, 0xbb, 0xe0, 0x96, 0x9d, 0x3f, 0x86, 0xde, \ + 0x96, 0x32, 0x7d, 0x44, 0xa5, 0x16, 0xa0, 0xcd, 0x21, 0xf1, 0x99, 0xd4, \ + 0xec, 0xea, 0xcb, 0x7c, 0x18, 0x58, 0x08, 0x94, 0xa5, 0xec, 0x9b, 0xc5, \ + 0x8b, 0xdf, 0x1a, 0x1e, 0x99, 0x38, 0x99, 0x87, 0x1e, 0x7b, 0xc0, 0x8d, \ + 0x39, 0xdf, 0x38, 0x5d, 0x70, 0x78, 0x07, 0xd3, 0x9e, 0xd9, 0x93, 0xe8, \ + 0xb9, 0x72, 0x51, 0xc5, 0xce, 0xa3, 0x30, 0x52, 0xa9, 0xf2, 0xe7, 0x40, \ + 0x70, 0x14, 0xcb, 0x44, 0xa2, 0x72, 0x0b, 0xc2, 0xe5, 0x40, 0xf9, 0x3e, \ + 0xe5, 0xa6, 0x0e, 0xb3, 0xf9, 0xec, 0x4a, 0x63, 0xc0, 0xb8, 0x29, 0x00, \ + 0x74, 0x9c, 0x57, 0x3b, 0xa8, 0xa5, 0x04, 0x90, 0x71, 0xf1, 0xbd, 0x83, \ + 0xd9, 0x3f, 0xd6, 0xa5, 0xe2, 0x3c, 0x2a, 0x8f, 0xef, 0x27, 0x60, 0xc3, \ + 0xc6, 0x9f, 0xcb, 0xba, 0xec, 0x60, 0x7d, 0xb7, 0xe6, 0x84, 0x32, 0xbe, \ + 0x4f, 0xfb, 0x58, 0x26, 0x22, 0x03, 0x5b, 0xd4, 0xb4, 0xd5, 0xfb, 0xf5, \ + 0xe3, 0x96, 0x2e, 0x70, 0xc0, 0xe4, 0x2e, 0xbd, 0xfc, 0x2e, 0xee, 0xe2, \ + 0x41, 0x55, 0xc0, 0x34, 0x2e, 0x7d, 0x24, 0x72, 0x69, 0xcb, 0x47, 0xb1, \ + 0x14, 0x40, 0x83, 0x7d, 0x67, 0xf4, 0x86, 0xf6, 0x31, 0xab, 0xf1, 0x79, \ + 0xa4, 0xb2, 0xb5, 0x2e, 0x12, 0xf9, 0x84, 0x17, 0xf0, 0x62, 0x6f, 0x27, \ + 0x3e, 0x13, 0x58, 0xb1, 0x54, 0x0d, 0x21, 0x9a, 0x73, 0x37, 0xa1, 0x30, \ + 0xcf, 0x6f, 0x92, 0xdc, 0xf6, 0xe9, 0xfc, 0xac, 0xdb, 0x2e, 0x28, 0xd1, \ + 0x7e, 0x02, 0x4b, 0x23, 0xa0, 0x15, 0xf2, 0x38, 0x65, 0x64, 0x09, 0xea, \ + 0x0c, 0x6e, 0x8e, 0x1b, 0x17, 0xa0, 0x71, 0xc8, 0xb3, 0x9b, 0xc9, 0xab, \ + 0xe9, 0xc3, 0xf2, 0xcf, 0x87, 0x96, 0x8f, 0x80, 0x02, 0x32, 0x9e, 0x99, \ + 0x58, 0x6f, 0xa2, 0xd5, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, \ + 0x00, 0x3f, 0xf7, 0x07, 0xd3, 0x34, 0x6f, 0xdb, 0xc9, 0x37, 0xb7, 0x84, \ + 0xdc, 0x37, 0x45, 0xe1, 0x63, 0xad, 0xb8, 0xb6, 0x75, 0xb1, 0xc7, 0x35, \ + 0xb4, 0x77, 0x2a, 0x5b, 0x77, 0xf9, 0x7e, 0xe0, 0xc1, 0xa3, 0xd1, 0xb7, \ + 0xcb, 0xa9, 0x5a, 0xc1, 0x87, 0xda, 0x5a, 0xfa, 0x17, 0xe4, 0xd5, 0x38, \ + 0x03, 0xde, 0x68, 0x98, 0x81, 0xec, 0xb5, 0xf2, 0x2a, 0x8d, 0xe9, 0x2c, \ + 0xf3, 0xa6, 0xe5, 0x32, 0x17, 0x7f, 0x33, 0x81, 0xe8, 0x38, 0x72, 0xd5, \ + 0x9c, 0xfa, 0x4e, 0xfb, 0x26, 0xf5, 0x15, 0x0b, 0xaf, 0x84, 0x66, 0xab, \ + 0x02, 0xe0, 0x18, 0xd5, 0x91, 0x7c, 0xd6, 0x8f, 0xc9, 0x4b, 0x76, 0x08, \ + 0x2b, 0x1d, 0x81, 0x68, 0x30, 0xe1, 0xfa, 0x70, 0x6c, 0x13, 0x4e, 0x10, \ + 0x03, 0x35, 0x3e, 0xc5, 0xca, 0x58, 0x20, 0x8a, 0x21, 0x18, 0x38, 0xa0, \ + 0x0f, 0xed, 0xc4, 0xbb, 0x45, 0x6f, 0xf5, 0x84, 0x5b, 0xb0, 0xcf, 0x4e, \ + 0x9d, 0x58, 0x13, 0x6b, 0x35, 0x35, 0x69, 0xa1, 0xd2, 0xc4, 0xf2, 0xc1, \ + 0x48, 0x04, 0x20, 0x51, 0xb9, 0x6b, 0xa4, 0x5d, 0xa5, 0x4b, 0x84, 0x88, \ + 0x43, 0x48, 0x99, 0x2c, 0xbb, 0xa4, 0x97, 0xd6, 0xd6, 0x18, 0xf6, 0xec, \ + 0x5c, 0xd1, 0x31, 0x49, 0xc9, 0xf2, 0x8f, 0x0b, 0x4d, 0xef, 0x09, 0x02, \ + 0xfe, 0x7d, 0xfd, 0xbb, 0xaf, 0x2b, 0x83, 0x94, 0x22, 0xc4, 0xa7, 0x3e, \ + 0x66, 0xf5, 0xe0, 0x57, 0xdc, 0xf2, 0xed, 0x2c, 0x3e, 0x81, 0x74, 0x76, \ + 0x1e, 0x96, 0x6f, 0x74, 0x1e, 0x32, 0x0e, 0x14, 0x31, 0xd0, 0x74, 0xf0, \ + 0xf4, 0x07, 0xbd, 0xc3, 0xd1, 0x22, 0xc2, 0xa8, 0x95, 0x92, 0x06, 0x7f, \ + 0x43, 0x02, 0x91, 0xbc, 0xdd, 0x23, 0x01, 0x89, 0x94, 0x20, 0x44, 0x64, \ + 0xf5, 0x1d, 0x67, 0xd2, 0x8f, 0xe8, 0x69, 0xa5, 0x29, 0x25, 0xe6, 0x50, \ + 0x9c, 0xe3, 0xe9, 0xcb, 0x75, 0x02, 0x81, 0x81, 0x00, 0xe2, 0x29, 0x3e, \ + 0xaa, 0x6b, 0xd5, 0x59, 0x1e, 0x9c, 0xe6, 0x47, 0xd5, 0xb6, 0xd7, 0xe3, \ + 0xf1, 0x8e, 0x9e, 0xe9, 0x83, 0x5f, 0x10, 0x9f, 0x63, 0xec, 0x04, 0x44, \ + 0xcc, 0x3f, 0xf8, 0xd9, 0x3a, 0x17, 0xe0, 0x4f, 0xfe, 0xd8, 0x4d, 0xcd, \ + 0x46, 0x54, 0x74, 0xbf, 0x0a, 0xc4, 0x67, 0x9c, 0xa7, 0xd8, 0x89, 0x65, \ + 0x4c, 0xfd, 0x58, 0x2a, 0x47, 0x0f, 0xf4, 0x37, 0xb6, 0x55, 0xb0, 0x1d, \ + 0xed, 0xa7, 0x39, 0xfc, 0x4f, 0xa3, 0xc4, 0x75, 0x3a, 0xa3, 0x98, 0xa7, \ + 0x45, 0xf5, 0x66, 0xcb, 0x7c, 0x65, 0xfb, 0x80, 0x23, 0xe6, 0xff, 0xfd, \ + 0x99, 0x1f, 0x8e, 0x6b, 0xff, 0x5e, 0x93, 0x66, 0xdf, 0x6c, 0x6f, 0xc3, \ + 0xf6, 0x38, 0x2e, 0xff, 0x69, 0xb5, 0xac, 0xae, 0xbb, 0xc6, 0x71, 0x16, \ + 0x6b, 0xd0, 0xf8, 0x22, 0xd9, 0xf8, 0xa2, 0x72, 0x20, 0xd2, 0xe2, 0x3a, \ + 0x70, 0x4b, 0xde, 0xab, 0x2f, 0x02, 0x81, 0x81, 0x00, 0xda, 0x51, 0x9b, \ + 0xb8, 0xb2, 0x2a, 0x14, 0x75, 0x58, 0x40, 0x8d, 0x27, 0x70, 0xfa, 0x31, \ + 0x48, 0xb0, 0x20, 0x21, 0x34, 0xfa, 0x4c, 0x57, 0xa8, 0x11, 0x88, 0xf3, \ + 0xa7, 0xae, 0x21, 0xe9, 0xb6, 0x2b, 0xd1, 0xcd, 0xa7, 0xf8, 0xd8, 0x0c, \ + 0x8a, 0x76, 0x22, 0x35, 0x44, 0xce, 0x3f, 0x25, 0x29, 0x83, 0x7d, 0x79, \ + 0xa7, 0x31, 0xd6, 0xec, 0xb2, 0xbf, 0xda, 0x34, 0xb6, 0xf6, 0xb2, 0x3b, \ + 0xf3, 0x78, 0x5a, 0x04, 0x83, 0x33, 0x3e, 0xa2, 0xe2, 0x81, 0x82, 0x13, \ + 0xd4, 0x35, 0x17, 0x63, 0x9b, 0x9e, 0xc4, 0x8d, 0x91, 0x4c, 0x03, 0x77, \ + 0xc7, 0x71, 0x5b, 0xee, 0x83, 0x6d, 0xd5, 0x78, 0x88, 0xf6, 0x2c, 0x79, \ + 0xc2, 0x4a, 0xb4, 0x79, 0x90, 0x70, 0xbf, 0xdf, 0x34, 0x56, 0x96, 0x71, \ + 0xe3, 0x0e, 0x68, 0x91, 0xbc, 0xea, 0xcb, 0x33, 0xc0, 0xbe, 0x45, 0xd7, \ + 0xfc, 0x30, 0xfd, 0x01, 0x3b, 0x02, 0x81, 0x81, 0x00, 0xd2, 0x9f, 0x2a, \ + 0xb7, 0x38, 0x19, 0xc7, 0x17, 0x95, 0x73, 0x78, 0xae, 0xf5, 0xcb, 0x75, \ + 0x83, 0x7f, 0x19, 0x4b, 0xcb, 0x86, 0xfb, 0x4a, 0x15, 0x9a, 0xb6, 0x17, \ + 0x04, 0x49, 0x07, 0x8d, 0xf6, 0x66, 0x4a, 0x06, 0xf6, 0x05, 0xa7, 0xdf, \ + 0x66, 0x82, 0x3c, 0xff, 0xb6, 0x1d, 0x57, 0x89, 0x33, 0x5f, 0x9c, 0x05, \ + 0x75, 0x7f, 0xf3, 0x5d, 0xdc, 0x34, 0x65, 0x72, 0x85, 0x22, 0xa4, 0x14, \ + 0x1b, 0x41, 0xc3, 0xe4, 0xd0, 0x9e, 0x69, 0xd5, 0xeb, 0x38, 0x74, 0x70, \ + 0x43, 0xdc, 0xd9, 0x50, 0xe4, 0x97, 0x6d, 0x73, 0xd6, 0xfb, 0xc8, 0xa7, \ + 0xfa, 0xb4, 0xc2, 0xc4, 0x9d, 0x5d, 0x0c, 0xd5, 0x9f, 0x79, 0xb3, 0x54, \ + 0xc2, 0xb7, 0x6c, 0x3d, 0x7d, 0xcb, 0x2d, 0xf8, 0xc4, 0xf3, 0x78, 0x5a, \ + 0x33, 0x2a, 0xb8, 0x0c, 0x6d, 0x06, 0xfa, 0xf2, 0x62, 0xd3, 0x42, 0xd0, \ + 0xbd, 0xc8, 0x4a, 0xa5, 0x0d, 0x02, 0x81, 0x81, 0x00, 0xd4, 0xa9, 0x90, \ + 0x15, 0xde, 0xbf, 0x2c, 0xc4, 0x8d, 0x9d, 0xfb, 0xa1, 0xc2, 0xe4, 0x83, \ + 0xe3, 0x79, 0x65, 0x22, 0xd3, 0xb7, 0x49, 0x6c, 0x4d, 0x94, 0x1f, 0x22, \ + 0xb1, 0x60, 0xe7, 0x3a, 0x00, 0xb1, 0x38, 0xa2, 0xab, 0x0f, 0xb4, 0x6c, \ + 0xaa, 0xe7, 0x9e, 0x34, 0xe3, 0x7c, 0x40, 0x78, 0x53, 0xb2, 0xf9, 0x23, \ + 0xea, 0xa0, 0x9a, 0xea, 0x60, 0xc8, 0x8f, 0xa6, 0xaf, 0xdf, 0x29, 0x09, \ + 0x4b, 0x06, 0x1e, 0x31, 0xad, 0x17, 0xda, 0xd8, 0xd1, 0xe9, 0x33, 0xab, \ + 0x5b, 0x18, 0x08, 0x5b, 0x87, 0xf8, 0xa5, 0x1f, 0xfd, 0xbb, 0xdc, 0xd8, \ + 0xed, 0x97, 0x57, 0xe4, 0xc3, 0x73, 0xd6, 0xf0, 0x9e, 0x01, 0xa6, 0x9b, \ + 0x48, 0x8e, 0x7a, 0xb4, 0xbb, 0xe5, 0x88, 0x91, 0xc5, 0x2a, 0xdf, 0x4b, \ + 0xba, 0xd0, 0x8b, 0x3e, 0x03, 0x97, 0x77, 0x2f, 0x47, 0x7e, 0x51, 0x0c, \ + 0xae, 0x65, 0x8d, 0xde, 0x87, 0x02, 0x81, 0x80, 0x20, 0x24, 0x0f, 0xd2, \ + 0xaf, 0xc2, 0x28, 0x3b, 0x97, 0x20, 0xb2, 0x92, 0x49, 0xeb, 0x09, 0x68, \ + 0x40, 0xb2, 0xbe, 0xd1, 0xc3, 0x83, 0x94, 0x34, 0x38, 0xd6, 0xc9, 0xec, \ + 0x34, 0x09, 0xf9, 0x41, 0x6d, 0x5c, 0x42, 0x94, 0xf7, 0x04, 0xfc, 0x32, \ + 0x39, 0x69, 0xbc, 0x1c, 0xfb, 0x3e, 0x61, 0x98, 0xc0, 0x80, 0xd8, 0x36, \ + 0x47, 0xc3, 0x6d, 0xc2, 0x2e, 0xe7, 0x81, 0x2a, 0x17, 0x34, 0x64, 0x30, \ + 0x4e, 0x96, 0xbb, 0x26, 0x16, 0xb9, 0x41, 0x36, 0xfe, 0x8a, 0xd6, 0x53, \ + 0x7c, 0xaa, 0xec, 0x39, 0x42, 0x50, 0xef, 0xe3, 0xb3, 0x01, 0x28, 0x32, \ + 0xca, 0x6d, 0xf5, 0x9a, 0x1e, 0x9f, 0x37, 0xbe, 0xfe, 0x38, 0x20, 0x22, \ + 0x91, 0x8c, 0xcd, 0x95, 0x02, 0xf2, 0x4d, 0x6f, 0x1a, 0xb4, 0x43, 0xf0, \ + 0x19, 0xdf, 0x65, 0xc0, 0x92, 0xe7, 0x9d, 0x2f, 0x09, 0xe7, 0xec, 0x69, \ + 0xa8, 0xc2, 0x8f, 0x0d \ +} +/* END FILE */ + +/* + * Test server Certificates + * + * Test server certificates are defined for each choice + * of the following parameters: + * - PEM or DER encoding + * - SHA-1 or SHA-256 hash + * - RSA or EC key + * + * Things to add: + * - multiple EC curve types + */ + +/* This is taken from tests/data_files/server5.crt. */ +/* BEGIN FILE string macro TEST_SRV_CRT_EC_PEM tests/data_files/server5.crt */ +#define TEST_SRV_CRT_EC_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIICHzCCAaWgAwIBAgIBCTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UECgwIUG9sYXJTU0wxHDAaBgNVBAMME1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\r\n" \ + "MjMwNjE1MDMzNDE4WhcNMzMwNjEyMDMzNDE4WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDBZMBMGByqGSM49AgEG\r\n" \ + "CCqGSM49AwEHA0IABDfMVtl2CR5acj7HWS3/IG7ufPkGkXTQrRS192giWWKSTuUA\r\n" \ + "2CMR/+ov0jRdXRa9iojCa3cNVc2KKg76Aci07f+jgZ0wgZowCQYDVR0TBAIwADAd\r\n" \ + "BgNVHQ4EFgQUUGGlj9QH2deCAQzlZX+MY0anE74wbgYDVR0jBGcwZYAUnW0gJEkB\r\n" \ + "PyvLeLUZvH4kydv7NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKDAhQb2xh\r\n" \ + "clNTTDEcMBoGA1UEAwwTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAoG\r\n" \ + "CCqGSM49BAMCA2gAMGUCMAHFbGEzx8dZaUlIltT5s1QO9FvKmvFer4uRY3ntEy9S\r\n" \ + "k7DCCozM86WWLjfzbJ78bwIxAJYRPF1CzNEiXPHb9O46ZPHKo2S5x//g/54RowAK\r\n" \ + "uZz+hKPuMi6YY6cIm81jfeaSZQ==\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is generated from tests/data_files/server5.crt.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_SRV_CRT_EC_DER tests/data_files/server5.crt.der */ +#define TEST_SRV_CRT_EC_DER { \ + 0x30, 0x82, 0x02, 0x1f, 0x30, 0x82, 0x01, 0xa5, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x09, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, \ + 0x3d, 0x04, 0x03, 0x02, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, \ + 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, \ + 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, \ + 0x32, 0x33, 0x30, 0x36, 0x31, 0x35, 0x30, 0x33, 0x33, 0x34, 0x31, 0x38, \ + 0x5a, 0x17, 0x0d, 0x33, 0x33, 0x30, 0x36, 0x31, 0x32, 0x30, 0x33, 0x33, \ + 0x34, 0x31, 0x38, 0x5a, 0x30, 0x34, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, \ + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x30, 0x59, \ + 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, \ + 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, \ + 0x04, 0x37, 0xcc, 0x56, 0xd9, 0x76, 0x09, 0x1e, 0x5a, 0x72, 0x3e, 0xc7, \ + 0x59, 0x2d, 0xff, 0x20, 0x6e, 0xee, 0x7c, 0xf9, 0x06, 0x91, 0x74, 0xd0, \ + 0xad, 0x14, 0xb5, 0xf7, 0x68, 0x22, 0x59, 0x62, 0x92, 0x4e, 0xe5, 0x00, \ + 0xd8, 0x23, 0x11, 0xff, 0xea, 0x2f, 0xd2, 0x34, 0x5d, 0x5d, 0x16, 0xbd, \ + 0x8a, 0x88, 0xc2, 0x6b, 0x77, 0x0d, 0x55, 0xcd, 0x8a, 0x2a, 0x0e, 0xfa, \ + 0x01, 0xc8, 0xb4, 0xed, 0xff, 0xa3, 0x81, 0x9d, 0x30, 0x81, 0x9a, 0x30, \ + 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1d, \ + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x50, 0x61, 0xa5, \ + 0x8f, 0xd4, 0x07, 0xd9, 0xd7, 0x82, 0x01, 0x0c, 0xe5, 0x65, 0x7f, 0x8c, \ + 0x63, 0x46, 0xa7, 0x13, 0xbe, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23, \ + 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01, \ + 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb, \ + 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, \ + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, \ + 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, \ + 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, \ + 0x03, 0x0c, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, \ + 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09, \ + 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0a, 0x06, \ + 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x68, 0x00, \ + 0x30, 0x65, 0x02, 0x30, 0x01, 0xc5, 0x6c, 0x61, 0x33, 0xc7, 0xc7, 0x59, \ + 0x69, 0x49, 0x48, 0x96, 0xd4, 0xf9, 0xb3, 0x54, 0x0e, 0xf4, 0x5b, 0xca, \ + 0x9a, 0xf1, 0x5e, 0xaf, 0x8b, 0x91, 0x63, 0x79, 0xed, 0x13, 0x2f, 0x52, \ + 0x93, 0xb0, 0xc2, 0x0a, 0x8c, 0xcc, 0xf3, 0xa5, 0x96, 0x2e, 0x37, 0xf3, \ + 0x6c, 0x9e, 0xfc, 0x6f, 0x02, 0x31, 0x00, 0x96, 0x11, 0x3c, 0x5d, 0x42, \ + 0xcc, 0xd1, 0x22, 0x5c, 0xf1, 0xdb, 0xf4, 0xee, 0x3a, 0x64, 0xf1, 0xca, \ + 0xa3, 0x64, 0xb9, 0xc7, 0xff, 0xe0, 0xff, 0x9e, 0x11, 0xa3, 0x00, 0x0a, \ + 0xb9, 0x9c, 0xfe, 0x84, 0xa3, 0xee, 0x32, 0x2e, 0x98, 0x63, 0xa7, 0x08, \ + 0x9b, 0xcd, 0x63, 0x7d, 0xe6, 0x92, 0x65 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/server5.key. */ +/* BEGIN FILE string macro TEST_SRV_KEY_EC_PEM tests/data_files/server5.key */ +#define TEST_SRV_KEY_EC_PEM \ + "-----BEGIN EC PRIVATE KEY-----\r\n" \ + "MHcCAQEEIPEqEyB2AnCoPL/9U/YDHvdqXYbIogTywwyp6/UfDw6noAoGCCqGSM49\r\n" \ + "AwEHoUQDQgAEN8xW2XYJHlpyPsdZLf8gbu58+QaRdNCtFLX3aCJZYpJO5QDYIxH/\r\n" \ + "6i/SNF1dFr2KiMJrdw1VzYoqDvoByLTt/w==\r\n" \ + "-----END EC PRIVATE KEY-----\r\n" +/* END FILE */ + +/* This is generated from tests/data_files/server5.key.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_SRV_KEY_EC_DER tests/data_files/server5.key.der */ +#define TEST_SRV_KEY_EC_DER { \ + 0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0xf1, 0x2a, 0x13, 0x20, 0x76, \ + 0x02, 0x70, 0xa8, 0x3c, 0xbf, 0xfd, 0x53, 0xf6, 0x03, 0x1e, 0xf7, 0x6a, \ + 0x5d, 0x86, 0xc8, 0xa2, 0x04, 0xf2, 0xc3, 0x0c, 0xa9, 0xeb, 0xf5, 0x1f, \ + 0x0f, 0x0e, 0xa7, 0xa0, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, \ + 0x03, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42, 0x00, 0x04, 0x37, 0xcc, 0x56, \ + 0xd9, 0x76, 0x09, 0x1e, 0x5a, 0x72, 0x3e, 0xc7, 0x59, 0x2d, 0xff, 0x20, \ + 0x6e, 0xee, 0x7c, 0xf9, 0x06, 0x91, 0x74, 0xd0, 0xad, 0x14, 0xb5, 0xf7, \ + 0x68, 0x22, 0x59, 0x62, 0x92, 0x4e, 0xe5, 0x00, 0xd8, 0x23, 0x11, 0xff, \ + 0xea, 0x2f, 0xd2, 0x34, 0x5d, 0x5d, 0x16, 0xbd, 0x8a, 0x88, 0xc2, 0x6b, \ + 0x77, 0x0d, 0x55, 0xcd, 0x8a, 0x2a, 0x0e, 0xfa, 0x01, 0xc8, 0xb4, 0xed, \ + 0xff \ +} +/* END FILE */ + +/* This is taken from tests/data_files/server2-sha256.crt. */ +/* BEGIN FILE string macro TEST_SRV_CRT_RSA_SHA256_PEM tests/data_files/server2-sha256.crt */ +#define TEST_SRV_CRT_RSA_SHA256_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\r\n" \ + "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ + "MTkwMjEwMTQ0NDA2WhcNMjkwMjEwMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN\r\n" \ + "AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN\r\n" \ + "owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz\r\n" \ + "NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM\r\n" \ + "tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P\r\n" \ + "hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya\r\n" \ + "HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD\r\n" \ + "VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw\r\n" \ + "FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQELBQADggEBAC465FJh\r\n" \ + "Pqel7zJngHIHJrqj/wVAxGAFOTF396XKATGAp+HRCqJ81Ry60CNK1jDzk8dv6M6U\r\n" \ + "HoS7RIFiM/9rXQCbJfiPD5xMTejZp5n5UYHAmxsxDaazfA5FuBhkfokKK6jD4Eq9\r\n" \ + "1C94xGKb6X4/VkaPF7cqoBBw/bHxawXc0UEPjqayiBpCYU/rJoVZgLqFVP7Px3sv\r\n" \ + "a1nOrNx8rPPI1hJ+ZOg8maiPTxHZnBVLakSSLQy/sWeWyazO1RnrbxjrbgQtYKz0\r\n" \ + "e3nwGpu1w13vfckFmUSBhHXH7AAS/HpKC4IH7G2GAk3+n8iSSN71sZzpxonQwVbo\r\n" \ + "pMZqLmbBm/7WPLc=\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is taken from tests/data_files/server2-sha256.crt.der. */ +/* BEGIN FILE binary macro TEST_SRV_CRT_RSA_SHA256_DER tests/data_files/server2-sha256.crt.der */ +#define TEST_SRV_CRT_RSA_SHA256_DER { \ + 0x30, 0x82, 0x03, 0x37, 0x30, 0x82, 0x02, 0x1f, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, \ + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, \ + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, \ + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, \ + 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, \ + 0x04, 0x03, 0x0c, 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, \ + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, \ + 0x31, 0x39, 0x30, 0x32, 0x31, 0x30, 0x31, 0x34, 0x34, 0x34, 0x30, 0x36, \ + 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x32, 0x31, 0x30, 0x31, 0x34, 0x34, \ + 0x34, 0x30, 0x36, 0x5a, 0x30, 0x34, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, \ + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x30, 0x82, \ + 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, \ + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, \ + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc1, 0x4d, 0xa3, 0xdd, 0xe7, \ + 0xcd, 0x1d, 0xd1, 0x04, 0xd7, 0x49, 0x72, 0xb8, 0x99, 0xac, 0x0e, 0x78, \ + 0xe4, 0x3a, 0x3c, 0x4a, 0xcf, 0x3a, 0x13, 0x16, 0xd0, 0x5a, 0xe4, 0xcd, \ + 0xa3, 0x00, 0x88, 0xa7, 0xee, 0x1e, 0x6b, 0x96, 0xa7, 0x52, 0xb4, 0x90, \ + 0xef, 0x2d, 0x72, 0x7a, 0x3e, 0x24, 0x9a, 0xfc, 0xb6, 0x34, 0xac, 0x24, \ + 0xf5, 0x77, 0xe0, 0x26, 0x64, 0x8c, 0x9c, 0xb0, 0x28, 0x7d, 0xa1, 0xda, \ + 0xea, 0x8c, 0xe6, 0xc9, 0x1c, 0x96, 0xbc, 0xfe, 0xc1, 0x04, 0x52, 0xb3, \ + 0x36, 0xd4, 0xa3, 0xfa, 0xe1, 0xb1, 0x76, 0xd8, 0x90, 0xc1, 0x61, 0xb4, \ + 0x66, 0x52, 0x36, 0xa2, 0x26, 0x53, 0xaa, 0xab, 0x74, 0x5e, 0x07, 0x7d, \ + 0x19, 0x82, 0xdb, 0x2a, 0xd8, 0x1f, 0xa0, 0xd9, 0x0d, 0x1c, 0x2d, 0x49, \ + 0x66, 0xf7, 0x5b, 0x25, 0x73, 0x46, 0xe8, 0x0b, 0x8a, 0x4f, 0x69, 0x0c, \ + 0xb5, 0x00, 0x90, 0xe1, 0xda, 0x82, 0x10, 0x66, 0x7d, 0xae, 0x54, 0x2b, \ + 0x8b, 0x65, 0x79, 0x91, 0xa1, 0xe2, 0x61, 0xc3, 0xcd, 0x40, 0x49, 0x08, \ + 0xee, 0x68, 0x0c, 0xf1, 0x8b, 0x86, 0xd2, 0x46, 0xbf, 0xd0, 0xb8, 0xaa, \ + 0x11, 0x03, 0x1e, 0x7f, 0x56, 0xa8, 0x1a, 0x1e, 0x44, 0x18, 0x0f, 0x0f, \ + 0x85, 0x8b, 0xda, 0x8b, 0x44, 0x5e, 0xe2, 0x18, 0xc6, 0x62, 0x2f, 0xc7, \ + 0x66, 0x8d, 0xfa, 0x5d, 0xd8, 0x7d, 0xf3, 0x27, 0x89, 0x29, 0x01, 0xc5, \ + 0x90, 0x0e, 0x3f, 0x27, 0xf1, 0x30, 0xc8, 0x4a, 0x0e, 0xef, 0xd6, 0xde, \ + 0xc7, 0xc7, 0x27, 0x6b, 0xc7, 0x05, 0x3d, 0x7a, 0xc4, 0x02, 0x3c, 0x9a, \ + 0x1d, 0x3e, 0x0f, 0xe8, 0x34, 0x98, 0x5b, 0xcb, 0x73, 0x4b, 0x52, 0x96, \ + 0xd8, 0x11, 0xa2, 0x2c, 0x80, 0x88, 0x69, 0x39, 0x5a, 0xd3, 0x0f, 0xb0, \ + 0xde, 0x59, 0x2f, 0x11, 0xc7, 0xf7, 0xea, 0x12, 0x01, 0x30, 0x97, 0x02, \ + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x4d, 0x30, 0x4b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, \ + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa5, 0x05, 0xe8, 0x64, 0xb8, 0xdc, \ + 0xdf, 0x60, 0x0f, 0x50, 0x12, 0x4d, 0x60, 0xa8, 0x64, 0xaf, 0x4d, 0x8b, \ + 0x43, 0x93, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, \ + 0x16, 0x80, 0x14, 0xb4, 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, 0xf6, \ + 0xb9, 0xd5, 0xa6, 0x95, 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, 0x30, \ + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, \ + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x2e, 0x3a, 0xe4, 0x52, 0x61, \ + 0x3e, 0xa7, 0xa5, 0xef, 0x32, 0x67, 0x80, 0x72, 0x07, 0x26, 0xba, 0xa3, \ + 0xff, 0x05, 0x40, 0xc4, 0x60, 0x05, 0x39, 0x31, 0x77, 0xf7, 0xa5, 0xca, \ + 0x01, 0x31, 0x80, 0xa7, 0xe1, 0xd1, 0x0a, 0xa2, 0x7c, 0xd5, 0x1c, 0xba, \ + 0xd0, 0x23, 0x4a, 0xd6, 0x30, 0xf3, 0x93, 0xc7, 0x6f, 0xe8, 0xce, 0x94, \ + 0x1e, 0x84, 0xbb, 0x44, 0x81, 0x62, 0x33, 0xff, 0x6b, 0x5d, 0x00, 0x9b, \ + 0x25, 0xf8, 0x8f, 0x0f, 0x9c, 0x4c, 0x4d, 0xe8, 0xd9, 0xa7, 0x99, 0xf9, \ + 0x51, 0x81, 0xc0, 0x9b, 0x1b, 0x31, 0x0d, 0xa6, 0xb3, 0x7c, 0x0e, 0x45, \ + 0xb8, 0x18, 0x64, 0x7e, 0x89, 0x0a, 0x2b, 0xa8, 0xc3, 0xe0, 0x4a, 0xbd, \ + 0xd4, 0x2f, 0x78, 0xc4, 0x62, 0x9b, 0xe9, 0x7e, 0x3f, 0x56, 0x46, 0x8f, \ + 0x17, 0xb7, 0x2a, 0xa0, 0x10, 0x70, 0xfd, 0xb1, 0xf1, 0x6b, 0x05, 0xdc, \ + 0xd1, 0x41, 0x0f, 0x8e, 0xa6, 0xb2, 0x88, 0x1a, 0x42, 0x61, 0x4f, 0xeb, \ + 0x26, 0x85, 0x59, 0x80, 0xba, 0x85, 0x54, 0xfe, 0xcf, 0xc7, 0x7b, 0x2f, \ + 0x6b, 0x59, 0xce, 0xac, 0xdc, 0x7c, 0xac, 0xf3, 0xc8, 0xd6, 0x12, 0x7e, \ + 0x64, 0xe8, 0x3c, 0x99, 0xa8, 0x8f, 0x4f, 0x11, 0xd9, 0x9c, 0x15, 0x4b, \ + 0x6a, 0x44, 0x92, 0x2d, 0x0c, 0xbf, 0xb1, 0x67, 0x96, 0xc9, 0xac, 0xce, \ + 0xd5, 0x19, 0xeb, 0x6f, 0x18, 0xeb, 0x6e, 0x04, 0x2d, 0x60, 0xac, 0xf4, \ + 0x7b, 0x79, 0xf0, 0x1a, 0x9b, 0xb5, 0xc3, 0x5d, 0xef, 0x7d, 0xc9, 0x05, \ + 0x99, 0x44, 0x81, 0x84, 0x75, 0xc7, 0xec, 0x00, 0x12, 0xfc, 0x7a, 0x4a, \ + 0x0b, 0x82, 0x07, 0xec, 0x6d, 0x86, 0x02, 0x4d, 0xfe, 0x9f, 0xc8, 0x92, \ + 0x48, 0xde, 0xf5, 0xb1, 0x9c, 0xe9, 0xc6, 0x89, 0xd0, 0xc1, 0x56, 0xe8, \ + 0xa4, 0xc6, 0x6a, 0x2e, 0x66, 0xc1, 0x9b, 0xfe, 0xd6, 0x3c, 0xb7 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/server2.crt. */ +/* BEGIN FILE string macro TEST_SRV_CRT_RSA_SHA1_PEM tests/data_files/server2.crt */ +#define TEST_SRV_CRT_RSA_SHA1_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" \ + "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ + "MTkwMjEwMTQ0NDA2WhcNMjkwMjEwMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN\r\n" \ + "AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN\r\n" \ + "owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz\r\n" \ + "NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM\r\n" \ + "tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P\r\n" \ + "hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya\r\n" \ + "HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD\r\n" \ + "VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw\r\n" \ + "FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQEFBQADggEBAJklg3Q4\r\n" \ + "cB7v7BzsxM/vLyKccO6op0/gZzM4ghuLq2Y32kl0sM6kSNUUmduuq3u/+GmUZN2A\r\n" \ + "O/7c+Hw7hDFEIvZk98aBGjCLqn3DmgHIv8ToQ67nellQxx2Uj309PdgjNi/r9HOc\r\n" \ + "KNAYPbBcg6MJGWWj2TI6vNaceios/DhOYx5V0j5nfqSJ/pnU0g9Ign2LAhgYpGJE\r\n" \ + "iEM9wW7hEMkwmk0h/sqZsrJsGH5YsF/VThSq/JVO1e2mZH2vruyZKJVBq+8tDNYp\r\n" \ + "HkK6tSyVYQhzIt3StMJWKMl/o5k2AYz6tSC164+1oG+ML3LWg8XrGKa91H4UOKap\r\n" \ + "Awgk0+4m0T25cNs=\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is taken from tests/data_files/server2.crt.der. */ +/* BEGIN FILE binary macro TEST_SRV_CRT_RSA_SHA1_DER tests/data_files/server2.crt.der */ +#define TEST_SRV_CRT_RSA_SHA1_DER { \ + 0x30, 0x82, 0x03, 0x37, 0x30, 0x82, 0x02, 0x1f, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, \ + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, \ + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, \ + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, \ + 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, \ + 0x04, 0x03, 0x0c, 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, \ + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, \ + 0x31, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, 0x34, 0x30, 0x36, \ + 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, \ + 0x34, 0x30, 0x36, 0x5a, 0x30, 0x34, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, \ + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x30, 0x82, \ + 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, \ + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, \ + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc1, 0x4d, 0xa3, 0xdd, 0xe7, \ + 0xcd, 0x1d, 0xd1, 0x04, 0xd7, 0x49, 0x72, 0xb8, 0x99, 0xac, 0x0e, 0x78, \ + 0xe4, 0x3a, 0x3c, 0x4a, 0xcf, 0x3a, 0x13, 0x16, 0xd0, 0x5a, 0xe4, 0xcd, \ + 0xa3, 0x00, 0x88, 0xa7, 0xee, 0x1e, 0x6b, 0x96, 0xa7, 0x52, 0xb4, 0x90, \ + 0xef, 0x2d, 0x72, 0x7a, 0x3e, 0x24, 0x9a, 0xfc, 0xb6, 0x34, 0xac, 0x24, \ + 0xf5, 0x77, 0xe0, 0x26, 0x64, 0x8c, 0x9c, 0xb0, 0x28, 0x7d, 0xa1, 0xda, \ + 0xea, 0x8c, 0xe6, 0xc9, 0x1c, 0x96, 0xbc, 0xfe, 0xc1, 0x04, 0x52, 0xb3, \ + 0x36, 0xd4, 0xa3, 0xfa, 0xe1, 0xb1, 0x76, 0xd8, 0x90, 0xc1, 0x61, 0xb4, \ + 0x66, 0x52, 0x36, 0xa2, 0x26, 0x53, 0xaa, 0xab, 0x74, 0x5e, 0x07, 0x7d, \ + 0x19, 0x82, 0xdb, 0x2a, 0xd8, 0x1f, 0xa0, 0xd9, 0x0d, 0x1c, 0x2d, 0x49, \ + 0x66, 0xf7, 0x5b, 0x25, 0x73, 0x46, 0xe8, 0x0b, 0x8a, 0x4f, 0x69, 0x0c, \ + 0xb5, 0x00, 0x90, 0xe1, 0xda, 0x82, 0x10, 0x66, 0x7d, 0xae, 0x54, 0x2b, \ + 0x8b, 0x65, 0x79, 0x91, 0xa1, 0xe2, 0x61, 0xc3, 0xcd, 0x40, 0x49, 0x08, \ + 0xee, 0x68, 0x0c, 0xf1, 0x8b, 0x86, 0xd2, 0x46, 0xbf, 0xd0, 0xb8, 0xaa, \ + 0x11, 0x03, 0x1e, 0x7f, 0x56, 0xa8, 0x1a, 0x1e, 0x44, 0x18, 0x0f, 0x0f, \ + 0x85, 0x8b, 0xda, 0x8b, 0x44, 0x5e, 0xe2, 0x18, 0xc6, 0x62, 0x2f, 0xc7, \ + 0x66, 0x8d, 0xfa, 0x5d, 0xd8, 0x7d, 0xf3, 0x27, 0x89, 0x29, 0x01, 0xc5, \ + 0x90, 0x0e, 0x3f, 0x27, 0xf1, 0x30, 0xc8, 0x4a, 0x0e, 0xef, 0xd6, 0xde, \ + 0xc7, 0xc7, 0x27, 0x6b, 0xc7, 0x05, 0x3d, 0x7a, 0xc4, 0x02, 0x3c, 0x9a, \ + 0x1d, 0x3e, 0x0f, 0xe8, 0x34, 0x98, 0x5b, 0xcb, 0x73, 0x4b, 0x52, 0x96, \ + 0xd8, 0x11, 0xa2, 0x2c, 0x80, 0x88, 0x69, 0x39, 0x5a, 0xd3, 0x0f, 0xb0, \ + 0xde, 0x59, 0x2f, 0x11, 0xc7, 0xf7, 0xea, 0x12, 0x01, 0x30, 0x97, 0x02, \ + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x4d, 0x30, 0x4b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, \ + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa5, 0x05, 0xe8, 0x64, 0xb8, 0xdc, \ + 0xdf, 0x60, 0x0f, 0x50, 0x12, 0x4d, 0x60, 0xa8, 0x64, 0xaf, 0x4d, 0x8b, \ + 0x43, 0x93, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, \ + 0x16, 0x80, 0x14, 0xb4, 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, 0xf6, \ + 0xb9, 0xd5, 0xa6, 0x95, 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, 0x30, \ + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, \ + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x01, 0x73, 0x0b, 0x4a, 0xc5, \ + 0xcb, 0xa0, 0xde, 0xf1, 0x63, 0x1c, 0x76, 0x04, 0x2b, 0x13, 0x0d, 0xc0, \ + 0x84, 0x11, 0xc5, 0x8f, 0x3a, 0xa7, 0xc5, 0x9c, 0x35, 0x7a, 0x77, 0xb8, \ + 0x20, 0x14, 0x82, 0xee, 0x54, 0xf0, 0xf2, 0xb0, 0x52, 0xcb, 0x78, 0xce, \ + 0x59, 0x07, 0x4f, 0x51, 0x69, 0xfe, 0xd3, 0x2f, 0xe9, 0x09, 0xe7, 0x85, \ + 0x92, 0xd8, 0xba, 0xb1, 0xeb, 0xc5, 0x76, 0x5d, 0x61, 0x2d, 0xe9, 0x86, \ + 0xb5, 0xde, 0x2a, 0xf9, 0x3f, 0x53, 0x28, 0x42, 0x86, 0x83, 0x73, 0x43, \ + 0xe0, 0x04, 0x5f, 0x07, 0x90, 0x14, 0x65, 0x9f, 0x6e, 0x10, 0x7a, 0xbc, \ + 0x58, 0x19, 0x22, 0xc2, 0xeb, 0x39, 0x72, 0x51, 0x92, 0xd7, 0xb4, 0x1d, \ + 0x75, 0x2f, 0xd3, 0x3a, 0x2b, 0x01, 0xe7, 0xdb, 0x50, 0xae, 0xe2, 0xf1, \ + 0xd4, 0x4d, 0x5b, 0x3c, 0xbb, 0x41, 0x2b, 0x2a, 0xa4, 0xe2, 0x4a, 0x02, \ + 0xe5, 0x60, 0x14, 0x2c, 0x9c, 0x1f, 0xa6, 0xcc, 0x06, 0x4b, 0x25, 0x89, \ + 0x4e, 0x96, 0x30, 0x22, 0x9c, 0x5c, 0x58, 0x4d, 0xc3, 0xda, 0xd0, 0x6e, \ + 0x50, 0x1e, 0x8c, 0x65, 0xf5, 0xd9, 0x17, 0x35, 0xa6, 0x58, 0x43, 0xb2, \ + 0x29, 0xb7, 0xa8, 0x5e, 0x35, 0xde, 0xf0, 0x60, 0x42, 0x1a, 0x01, 0xcb, \ + 0xcb, 0x0b, 0xd8, 0x0e, 0xc1, 0x90, 0xdf, 0xa1, 0xd2, 0x1a, 0xd1, 0x2c, \ + 0x02, 0xf4, 0x76, 0x41, 0xa4, 0xcb, 0x4b, 0x15, 0x98, 0x71, 0xf9, 0x35, \ + 0x7d, 0xb0, 0xe7, 0xe2, 0x34, 0x96, 0x91, 0xbe, 0x32, 0x67, 0x2d, 0x6b, \ + 0xd3, 0x55, 0x04, 0x8a, 0x01, 0x50, 0xb4, 0xe3, 0x62, 0x78, 0x6c, 0x11, \ + 0x15, 0xa5, 0x2a, 0x11, 0xc1, 0x49, 0x1c, 0x9b, 0xc4, 0x10, 0x65, 0x60, \ + 0x87, 0xd9, 0x1e, 0x69, 0x59, 0x4e, 0x8f, 0x6b, 0xeb, 0xc1, 0xfe, 0x6b, \ + 0xe2, 0x63, 0x78, 0x95, 0x6e, 0xe0, 0x2d, 0xd7, 0xa7, 0x37, 0xa8 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/server2.key. */ +/* BEGIN FILE string macro TEST_SRV_KEY_RSA_PEM tests/data_files/server2.key */ +#define TEST_SRV_KEY_RSA_PEM \ + "-----BEGIN RSA PRIVATE KEY-----\r\n" \ + "MIIEpAIBAAKCAQEAwU2j3efNHdEE10lyuJmsDnjkOjxKzzoTFtBa5M2jAIin7h5r\r\n" \ + "lqdStJDvLXJ6PiSa/LY0rCT1d+AmZIycsCh9odrqjObJHJa8/sEEUrM21KP64bF2\r\n" \ + "2JDBYbRmUjaiJlOqq3ReB30Zgtsq2B+g2Q0cLUlm91slc0boC4pPaQy1AJDh2oIQ\r\n" \ + "Zn2uVCuLZXmRoeJhw81ASQjuaAzxi4bSRr/QuKoRAx5/VqgaHkQYDw+Fi9qLRF7i\r\n" \ + "GMZiL8dmjfpd2H3zJ4kpAcWQDj8n8TDISg7v1t7HxydrxwU9esQCPJodPg/oNJhb\r\n" \ + "y3NLUpbYEaIsgIhpOVrTD7DeWS8Rx/fqEgEwlwIDAQABAoIBAQCXR0S8EIHFGORZ\r\n" \ + "++AtOg6eENxD+xVs0f1IeGz57Tjo3QnXX7VBZNdj+p1ECvhCE/G7XnkgU5hLZX+G\r\n" \ + "Z0jkz/tqJOI0vRSdLBbipHnWouyBQ4e/A1yIJdlBtqXxJ1KE/ituHRbNc4j4kL8Z\r\n" \ + "/r6pvwnTI0PSx2Eqs048YdS92LT6qAv4flbNDxMn2uY7s4ycS4Q8w1JXnCeaAnYm\r\n" \ + "WYI5wxO+bvRELR2Mcz5DmVnL8jRyml6l6582bSv5oufReFIbyPZbQWlXgYnpu6He\r\n" \ + "GTc7E1zKYQGG/9+DQUl/1vQuCPqQwny0tQoX2w5tdYpdMdVm+zkLtbajzdTviJJa\r\n" \ + "TWzL6lt5AoGBAN86+SVeJDcmQJcv4Eq6UhtRr4QGMiQMz0Sod6ettYxYzMgxtw28\r\n" \ + "CIrgpozCc+UaZJLo7UxvC6an85r1b2nKPCLQFaggJ0H4Q0J/sZOhBIXaoBzWxveK\r\n" \ + "nupceKdVxGsFi8CDy86DBfiyFivfBj+47BbaQzPBj7C4rK7UlLjab2rDAoGBAN2u\r\n" \ + "AM2gchoFiu4v1HFL8D7lweEpi6ZnMJjnEu/dEgGQJFjwdpLnPbsj4c75odQ4Gz8g\r\n" \ + "sw9lao9VVzbusoRE/JGI4aTdO0pATXyG7eG1Qu+5Yc1YGXcCrliA2xM9xx+d7f+s\r\n" \ + "mPzN+WIEg5GJDYZDjAzHG5BNvi/FfM1C9dOtjv2dAoGAF0t5KmwbjWHBhcVqO4Ic\r\n" \ + "BVvN3BIlc1ue2YRXEDlxY5b0r8N4XceMgKmW18OHApZxfl8uPDauWZLXOgl4uepv\r\n" \ + "whZC3EuWrSyyICNhLY21Ah7hbIEBPF3L3ZsOwC+UErL+dXWLdB56Jgy3gZaBeW7b\r\n" \ + "vDrEnocJbqCm7IukhXHOBK8CgYEAwqdHB0hqyNSzIOGY7v9abzB6pUdA3BZiQvEs\r\n" \ + "3LjHVd4HPJ2x0N8CgrBIWOE0q8+0hSMmeE96WW/7jD3fPWwCR5zlXknxBQsfv0gP\r\n" \ + "3BC5PR0Qdypz+d+9zfMf625kyit4T/hzwhDveZUzHnk1Cf+IG7Q+TOEnLnWAWBED\r\n" \ + "ISOWmrUCgYAFEmRxgwAc/u+D6t0syCwAYh6POtscq9Y0i9GyWk89NzgC4NdwwbBH\r\n" \ + "4AgahOxIxXx2gxJnq3yfkJfIjwf0s2DyP0kY2y6Ua1OeomPeY9mrIS4tCuDQ6LrE\r\n" \ + "TB6l9VGoxJL4fyHnZb8L5gGvnB1bbD8cL6YPaDiOhcRseC9vBiEuVg==\r\n" \ + "-----END RSA PRIVATE KEY-----\r\n" +/* END FILE */ + +/* This was generated from tests/data_files/server2.key.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_SRV_KEY_RSA_DER tests/data_files/server2.key.der */ +#define TEST_SRV_KEY_RSA_DER { \ + 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, \ + 0xc1, 0x4d, 0xa3, 0xdd, 0xe7, 0xcd, 0x1d, 0xd1, 0x04, 0xd7, 0x49, 0x72, \ + 0xb8, 0x99, 0xac, 0x0e, 0x78, 0xe4, 0x3a, 0x3c, 0x4a, 0xcf, 0x3a, 0x13, \ + 0x16, 0xd0, 0x5a, 0xe4, 0xcd, 0xa3, 0x00, 0x88, 0xa7, 0xee, 0x1e, 0x6b, \ + 0x96, 0xa7, 0x52, 0xb4, 0x90, 0xef, 0x2d, 0x72, 0x7a, 0x3e, 0x24, 0x9a, \ + 0xfc, 0xb6, 0x34, 0xac, 0x24, 0xf5, 0x77, 0xe0, 0x26, 0x64, 0x8c, 0x9c, \ + 0xb0, 0x28, 0x7d, 0xa1, 0xda, 0xea, 0x8c, 0xe6, 0xc9, 0x1c, 0x96, 0xbc, \ + 0xfe, 0xc1, 0x04, 0x52, 0xb3, 0x36, 0xd4, 0xa3, 0xfa, 0xe1, 0xb1, 0x76, \ + 0xd8, 0x90, 0xc1, 0x61, 0xb4, 0x66, 0x52, 0x36, 0xa2, 0x26, 0x53, 0xaa, \ + 0xab, 0x74, 0x5e, 0x07, 0x7d, 0x19, 0x82, 0xdb, 0x2a, 0xd8, 0x1f, 0xa0, \ + 0xd9, 0x0d, 0x1c, 0x2d, 0x49, 0x66, 0xf7, 0x5b, 0x25, 0x73, 0x46, 0xe8, \ + 0x0b, 0x8a, 0x4f, 0x69, 0x0c, 0xb5, 0x00, 0x90, 0xe1, 0xda, 0x82, 0x10, \ + 0x66, 0x7d, 0xae, 0x54, 0x2b, 0x8b, 0x65, 0x79, 0x91, 0xa1, 0xe2, 0x61, \ + 0xc3, 0xcd, 0x40, 0x49, 0x08, 0xee, 0x68, 0x0c, 0xf1, 0x8b, 0x86, 0xd2, \ + 0x46, 0xbf, 0xd0, 0xb8, 0xaa, 0x11, 0x03, 0x1e, 0x7f, 0x56, 0xa8, 0x1a, \ + 0x1e, 0x44, 0x18, 0x0f, 0x0f, 0x85, 0x8b, 0xda, 0x8b, 0x44, 0x5e, 0xe2, \ + 0x18, 0xc6, 0x62, 0x2f, 0xc7, 0x66, 0x8d, 0xfa, 0x5d, 0xd8, 0x7d, 0xf3, \ + 0x27, 0x89, 0x29, 0x01, 0xc5, 0x90, 0x0e, 0x3f, 0x27, 0xf1, 0x30, 0xc8, \ + 0x4a, 0x0e, 0xef, 0xd6, 0xde, 0xc7, 0xc7, 0x27, 0x6b, 0xc7, 0x05, 0x3d, \ + 0x7a, 0xc4, 0x02, 0x3c, 0x9a, 0x1d, 0x3e, 0x0f, 0xe8, 0x34, 0x98, 0x5b, \ + 0xcb, 0x73, 0x4b, 0x52, 0x96, 0xd8, 0x11, 0xa2, 0x2c, 0x80, 0x88, 0x69, \ + 0x39, 0x5a, 0xd3, 0x0f, 0xb0, 0xde, 0x59, 0x2f, 0x11, 0xc7, 0xf7, 0xea, \ + 0x12, 0x01, 0x30, 0x97, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, \ + 0x01, 0x00, 0x97, 0x47, 0x44, 0xbc, 0x10, 0x81, 0xc5, 0x18, 0xe4, 0x59, \ + 0xfb, 0xe0, 0x2d, 0x3a, 0x0e, 0x9e, 0x10, 0xdc, 0x43, 0xfb, 0x15, 0x6c, \ + 0xd1, 0xfd, 0x48, 0x78, 0x6c, 0xf9, 0xed, 0x38, 0xe8, 0xdd, 0x09, 0xd7, \ + 0x5f, 0xb5, 0x41, 0x64, 0xd7, 0x63, 0xfa, 0x9d, 0x44, 0x0a, 0xf8, 0x42, \ + 0x13, 0xf1, 0xbb, 0x5e, 0x79, 0x20, 0x53, 0x98, 0x4b, 0x65, 0x7f, 0x86, \ + 0x67, 0x48, 0xe4, 0xcf, 0xfb, 0x6a, 0x24, 0xe2, 0x34, 0xbd, 0x14, 0x9d, \ + 0x2c, 0x16, 0xe2, 0xa4, 0x79, 0xd6, 0xa2, 0xec, 0x81, 0x43, 0x87, 0xbf, \ + 0x03, 0x5c, 0x88, 0x25, 0xd9, 0x41, 0xb6, 0xa5, 0xf1, 0x27, 0x52, 0x84, \ + 0xfe, 0x2b, 0x6e, 0x1d, 0x16, 0xcd, 0x73, 0x88, 0xf8, 0x90, 0xbf, 0x19, \ + 0xfe, 0xbe, 0xa9, 0xbf, 0x09, 0xd3, 0x23, 0x43, 0xd2, 0xc7, 0x61, 0x2a, \ + 0xb3, 0x4e, 0x3c, 0x61, 0xd4, 0xbd, 0xd8, 0xb4, 0xfa, 0xa8, 0x0b, 0xf8, \ + 0x7e, 0x56, 0xcd, 0x0f, 0x13, 0x27, 0xda, 0xe6, 0x3b, 0xb3, 0x8c, 0x9c, \ + 0x4b, 0x84, 0x3c, 0xc3, 0x52, 0x57, 0x9c, 0x27, 0x9a, 0x02, 0x76, 0x26, \ + 0x59, 0x82, 0x39, 0xc3, 0x13, 0xbe, 0x6e, 0xf4, 0x44, 0x2d, 0x1d, 0x8c, \ + 0x73, 0x3e, 0x43, 0x99, 0x59, 0xcb, 0xf2, 0x34, 0x72, 0x9a, 0x5e, 0xa5, \ + 0xeb, 0x9f, 0x36, 0x6d, 0x2b, 0xf9, 0xa2, 0xe7, 0xd1, 0x78, 0x52, 0x1b, \ + 0xc8, 0xf6, 0x5b, 0x41, 0x69, 0x57, 0x81, 0x89, 0xe9, 0xbb, 0xa1, 0xde, \ + 0x19, 0x37, 0x3b, 0x13, 0x5c, 0xca, 0x61, 0x01, 0x86, 0xff, 0xdf, 0x83, \ + 0x41, 0x49, 0x7f, 0xd6, 0xf4, 0x2e, 0x08, 0xfa, 0x90, 0xc2, 0x7c, 0xb4, \ + 0xb5, 0x0a, 0x17, 0xdb, 0x0e, 0x6d, 0x75, 0x8a, 0x5d, 0x31, 0xd5, 0x66, \ + 0xfb, 0x39, 0x0b, 0xb5, 0xb6, 0xa3, 0xcd, 0xd4, 0xef, 0x88, 0x92, 0x5a, \ + 0x4d, 0x6c, 0xcb, 0xea, 0x5b, 0x79, 0x02, 0x81, 0x81, 0x00, 0xdf, 0x3a, \ + 0xf9, 0x25, 0x5e, 0x24, 0x37, 0x26, 0x40, 0x97, 0x2f, 0xe0, 0x4a, 0xba, \ + 0x52, 0x1b, 0x51, 0xaf, 0x84, 0x06, 0x32, 0x24, 0x0c, 0xcf, 0x44, 0xa8, \ + 0x77, 0xa7, 0xad, 0xb5, 0x8c, 0x58, 0xcc, 0xc8, 0x31, 0xb7, 0x0d, 0xbc, \ + 0x08, 0x8a, 0xe0, 0xa6, 0x8c, 0xc2, 0x73, 0xe5, 0x1a, 0x64, 0x92, 0xe8, \ + 0xed, 0x4c, 0x6f, 0x0b, 0xa6, 0xa7, 0xf3, 0x9a, 0xf5, 0x6f, 0x69, 0xca, \ + 0x3c, 0x22, 0xd0, 0x15, 0xa8, 0x20, 0x27, 0x41, 0xf8, 0x43, 0x42, 0x7f, \ + 0xb1, 0x93, 0xa1, 0x04, 0x85, 0xda, 0xa0, 0x1c, 0xd6, 0xc6, 0xf7, 0x8a, \ + 0x9e, 0xea, 0x5c, 0x78, 0xa7, 0x55, 0xc4, 0x6b, 0x05, 0x8b, 0xc0, 0x83, \ + 0xcb, 0xce, 0x83, 0x05, 0xf8, 0xb2, 0x16, 0x2b, 0xdf, 0x06, 0x3f, 0xb8, \ + 0xec, 0x16, 0xda, 0x43, 0x33, 0xc1, 0x8f, 0xb0, 0xb8, 0xac, 0xae, 0xd4, \ + 0x94, 0xb8, 0xda, 0x6f, 0x6a, 0xc3, 0x02, 0x81, 0x81, 0x00, 0xdd, 0xae, \ + 0x00, 0xcd, 0xa0, 0x72, 0x1a, 0x05, 0x8a, 0xee, 0x2f, 0xd4, 0x71, 0x4b, \ + 0xf0, 0x3e, 0xe5, 0xc1, 0xe1, 0x29, 0x8b, 0xa6, 0x67, 0x30, 0x98, 0xe7, \ + 0x12, 0xef, 0xdd, 0x12, 0x01, 0x90, 0x24, 0x58, 0xf0, 0x76, 0x92, 0xe7, \ + 0x3d, 0xbb, 0x23, 0xe1, 0xce, 0xf9, 0xa1, 0xd4, 0x38, 0x1b, 0x3f, 0x20, \ + 0xb3, 0x0f, 0x65, 0x6a, 0x8f, 0x55, 0x57, 0x36, 0xee, 0xb2, 0x84, 0x44, \ + 0xfc, 0x91, 0x88, 0xe1, 0xa4, 0xdd, 0x3b, 0x4a, 0x40, 0x4d, 0x7c, 0x86, \ + 0xed, 0xe1, 0xb5, 0x42, 0xef, 0xb9, 0x61, 0xcd, 0x58, 0x19, 0x77, 0x02, \ + 0xae, 0x58, 0x80, 0xdb, 0x13, 0x3d, 0xc7, 0x1f, 0x9d, 0xed, 0xff, 0xac, \ + 0x98, 0xfc, 0xcd, 0xf9, 0x62, 0x04, 0x83, 0x91, 0x89, 0x0d, 0x86, 0x43, \ + 0x8c, 0x0c, 0xc7, 0x1b, 0x90, 0x4d, 0xbe, 0x2f, 0xc5, 0x7c, 0xcd, 0x42, \ + 0xf5, 0xd3, 0xad, 0x8e, 0xfd, 0x9d, 0x02, 0x81, 0x80, 0x17, 0x4b, 0x79, \ + 0x2a, 0x6c, 0x1b, 0x8d, 0x61, 0xc1, 0x85, 0xc5, 0x6a, 0x3b, 0x82, 0x1c, \ + 0x05, 0x5b, 0xcd, 0xdc, 0x12, 0x25, 0x73, 0x5b, 0x9e, 0xd9, 0x84, 0x57, \ + 0x10, 0x39, 0x71, 0x63, 0x96, 0xf4, 0xaf, 0xc3, 0x78, 0x5d, 0xc7, 0x8c, \ + 0x80, 0xa9, 0x96, 0xd7, 0xc3, 0x87, 0x02, 0x96, 0x71, 0x7e, 0x5f, 0x2e, \ + 0x3c, 0x36, 0xae, 0x59, 0x92, 0xd7, 0x3a, 0x09, 0x78, 0xb9, 0xea, 0x6f, \ + 0xc2, 0x16, 0x42, 0xdc, 0x4b, 0x96, 0xad, 0x2c, 0xb2, 0x20, 0x23, 0x61, \ + 0x2d, 0x8d, 0xb5, 0x02, 0x1e, 0xe1, 0x6c, 0x81, 0x01, 0x3c, 0x5d, 0xcb, \ + 0xdd, 0x9b, 0x0e, 0xc0, 0x2f, 0x94, 0x12, 0xb2, 0xfe, 0x75, 0x75, 0x8b, \ + 0x74, 0x1e, 0x7a, 0x26, 0x0c, 0xb7, 0x81, 0x96, 0x81, 0x79, 0x6e, 0xdb, \ + 0xbc, 0x3a, 0xc4, 0x9e, 0x87, 0x09, 0x6e, 0xa0, 0xa6, 0xec, 0x8b, 0xa4, \ + 0x85, 0x71, 0xce, 0x04, 0xaf, 0x02, 0x81, 0x81, 0x00, 0xc2, 0xa7, 0x47, \ + 0x07, 0x48, 0x6a, 0xc8, 0xd4, 0xb3, 0x20, 0xe1, 0x98, 0xee, 0xff, 0x5a, \ + 0x6f, 0x30, 0x7a, 0xa5, 0x47, 0x40, 0xdc, 0x16, 0x62, 0x42, 0xf1, 0x2c, \ + 0xdc, 0xb8, 0xc7, 0x55, 0xde, 0x07, 0x3c, 0x9d, 0xb1, 0xd0, 0xdf, 0x02, \ + 0x82, 0xb0, 0x48, 0x58, 0xe1, 0x34, 0xab, 0xcf, 0xb4, 0x85, 0x23, 0x26, \ + 0x78, 0x4f, 0x7a, 0x59, 0x6f, 0xfb, 0x8c, 0x3d, 0xdf, 0x3d, 0x6c, 0x02, \ + 0x47, 0x9c, 0xe5, 0x5e, 0x49, 0xf1, 0x05, 0x0b, 0x1f, 0xbf, 0x48, 0x0f, \ + 0xdc, 0x10, 0xb9, 0x3d, 0x1d, 0x10, 0x77, 0x2a, 0x73, 0xf9, 0xdf, 0xbd, \ + 0xcd, 0xf3, 0x1f, 0xeb, 0x6e, 0x64, 0xca, 0x2b, 0x78, 0x4f, 0xf8, 0x73, \ + 0xc2, 0x10, 0xef, 0x79, 0x95, 0x33, 0x1e, 0x79, 0x35, 0x09, 0xff, 0x88, \ + 0x1b, 0xb4, 0x3e, 0x4c, 0xe1, 0x27, 0x2e, 0x75, 0x80, 0x58, 0x11, 0x03, \ + 0x21, 0x23, 0x96, 0x9a, 0xb5, 0x02, 0x81, 0x80, 0x05, 0x12, 0x64, 0x71, \ + 0x83, 0x00, 0x1c, 0xfe, 0xef, 0x83, 0xea, 0xdd, 0x2c, 0xc8, 0x2c, 0x00, \ + 0x62, 0x1e, 0x8f, 0x3a, 0xdb, 0x1c, 0xab, 0xd6, 0x34, 0x8b, 0xd1, 0xb2, \ + 0x5a, 0x4f, 0x3d, 0x37, 0x38, 0x02, 0xe0, 0xd7, 0x70, 0xc1, 0xb0, 0x47, \ + 0xe0, 0x08, 0x1a, 0x84, 0xec, 0x48, 0xc5, 0x7c, 0x76, 0x83, 0x12, 0x67, \ + 0xab, 0x7c, 0x9f, 0x90, 0x97, 0xc8, 0x8f, 0x07, 0xf4, 0xb3, 0x60, 0xf2, \ + 0x3f, 0x49, 0x18, 0xdb, 0x2e, 0x94, 0x6b, 0x53, 0x9e, 0xa2, 0x63, 0xde, \ + 0x63, 0xd9, 0xab, 0x21, 0x2e, 0x2d, 0x0a, 0xe0, 0xd0, 0xe8, 0xba, 0xc4, \ + 0x4c, 0x1e, 0xa5, 0xf5, 0x51, 0xa8, 0xc4, 0x92, 0xf8, 0x7f, 0x21, 0xe7, \ + 0x65, 0xbf, 0x0b, 0xe6, 0x01, 0xaf, 0x9c, 0x1d, 0x5b, 0x6c, 0x3f, 0x1c, \ + 0x2f, 0xa6, 0x0f, 0x68, 0x38, 0x8e, 0x85, 0xc4, 0x6c, 0x78, 0x2f, 0x6f, \ + 0x06, 0x21, 0x2e, 0x56 \ +} +/* END FILE */ + +/* + * Test client Certificates + * + * Test client certificates are defined for each choice + * of the following parameters: + * - PEM or DER encoding + * - RSA or EC key + * + * Things to add: + * - hash type + * - multiple EC curve types + */ + +/* This is taken from tests/data_files/cli2.crt. */ +/* BEGIN FILE string macro TEST_CLI_CRT_EC_PEM tests/data_files/cli2.crt */ +#define TEST_CLI_CRT_EC_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIIB3zCCAWOgAwIBAgIBDTAMBggqhkjOPQQDAgUAMD4xCzAJBgNVBAYTAk5MMREw\r\n" \ + "DwYDVQQKDAhQb2xhclNTTDEcMBoGA1UEAwwTUG9sYXJTU0wgVGVzdCBFQyBDQTAe\r\n" \ + "Fw0xOTAyMTAxNDQ0MDBaFw0yOTAyMTAxNDQ0MDBaMEExCzAJBgNVBAYTAk5MMREw\r\n" \ + "DwYDVQQKDAhQb2xhclNTTDEfMB0GA1UEAwwWUG9sYXJTU0wgVGVzdCBDbGllbnQg\r\n" \ + "MjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFflrrFz39Osu5O4gf8Sru7mU6zO\r\n" \ + "VVP2NA7MLuNjJQvfmOLzXGA2lsDVGBRw5X+f1UtFGOWwbNVc+JaPh3Cj5MejTTBL\r\n" \ + "MAkGA1UdEwQCMAAwHQYDVR0OBBYEFHoAX4Zk/OBd5REQO7LmO8QmP8/iMB8GA1Ud\r\n" \ + "IwQYMBaAFJ1tICRJAT8ry3i1Gbx+JMnb+zZ8MAwGCCqGSM49BAMCBQADaAAwZQIx\r\n" \ + "AMqme4DKMldUlplDET9Q6Eptre7uUWKhsLOF+zPkKDlfzpIkJYEFgcloDHGYw80u\r\n" \ + "IgIwNftyPXsabTqMM7iEHgVpX/GRozKklY9yQI/5eoA6gGW7Y+imuGR/oao5ySOb\r\n" \ + "a9Vk\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is generated from tests/data_files/cli2.crt.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CLI_CRT_EC_DER tests/data_files/cli2.crt.der */ +#define TEST_CLI_CRT_EC_DER { \ + 0x30, 0x82, 0x01, 0xdf, 0x30, 0x82, 0x01, 0x63, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x0d, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, \ + 0x3d, 0x04, 0x03, 0x02, 0x05, 0x00, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, \ + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, \ + 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, \ + 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, \ + 0x03, 0x0c, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x20, \ + 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, \ + 0x17, 0x0d, 0x31, 0x39, 0x30, 0x32, 0x31, 0x30, 0x31, 0x34, 0x34, 0x34, \ + 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x32, 0x31, 0x30, 0x31, \ + 0x34, 0x34, 0x34, 0x30, 0x30, 0x5a, 0x30, 0x41, 0x31, 0x0b, 0x30, 0x09, \ + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, \ + 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, \ + 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, \ + 0x03, 0x0c, 0x16, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x20, \ + 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, \ + 0x32, 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, \ + 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, \ + 0x03, 0x42, 0x00, 0x04, 0x57, 0xe5, 0xae, 0xb1, 0x73, 0xdf, 0xd3, 0xac, \ + 0xbb, 0x93, 0xb8, 0x81, 0xff, 0x12, 0xae, 0xee, 0xe6, 0x53, 0xac, 0xce, \ + 0x55, 0x53, 0xf6, 0x34, 0x0e, 0xcc, 0x2e, 0xe3, 0x63, 0x25, 0x0b, 0xdf, \ + 0x98, 0xe2, 0xf3, 0x5c, 0x60, 0x36, 0x96, 0xc0, 0xd5, 0x18, 0x14, 0x70, \ + 0xe5, 0x7f, 0x9f, 0xd5, 0x4b, 0x45, 0x18, 0xe5, 0xb0, 0x6c, 0xd5, 0x5c, \ + 0xf8, 0x96, 0x8f, 0x87, 0x70, 0xa3, 0xe4, 0xc7, 0xa3, 0x4d, 0x30, 0x4b, \ + 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, \ + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x7a, 0x00, \ + 0x5f, 0x86, 0x64, 0xfc, 0xe0, 0x5d, 0xe5, 0x11, 0x10, 0x3b, 0xb2, 0xe6, \ + 0x3b, 0xc4, 0x26, 0x3f, 0xcf, 0xe2, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, \ + 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, \ + 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, \ + 0xfb, 0x36, 0x7c, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, \ + 0x04, 0x03, 0x02, 0x05, 0x00, 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, 0x31, \ + 0x00, 0xca, 0xa6, 0x7b, 0x80, 0xca, 0x32, 0x57, 0x54, 0x96, 0x99, 0x43, \ + 0x11, 0x3f, 0x50, 0xe8, 0x4a, 0x6d, 0xad, 0xee, 0xee, 0x51, 0x62, 0xa1, \ + 0xb0, 0xb3, 0x85, 0xfb, 0x33, 0xe4, 0x28, 0x39, 0x5f, 0xce, 0x92, 0x24, \ + 0x25, 0x81, 0x05, 0x81, 0xc9, 0x68, 0x0c, 0x71, 0x98, 0xc3, 0xcd, 0x2e, \ + 0x22, 0x02, 0x30, 0x35, 0xfb, 0x72, 0x3d, 0x7b, 0x1a, 0x6d, 0x3a, 0x8c, \ + 0x33, 0xb8, 0x84, 0x1e, 0x05, 0x69, 0x5f, 0xf1, 0x91, 0xa3, 0x32, 0xa4, \ + 0x95, 0x8f, 0x72, 0x40, 0x8f, 0xf9, 0x7a, 0x80, 0x3a, 0x80, 0x65, 0xbb, \ + 0x63, 0xe8, 0xa6, 0xb8, 0x64, 0x7f, 0xa1, 0xaa, 0x39, 0xc9, 0x23, 0x9b, \ + 0x6b, 0xd5, 0x64 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/cli2.key. */ +/* BEGIN FILE string macro TEST_CLI_KEY_EC_PEM tests/data_files/cli2.key */ +#define TEST_CLI_KEY_EC_PEM \ + "-----BEGIN EC PRIVATE KEY-----\r\n" \ + "MHcCAQEEIPb3hmTxZ3/mZI3vyk7p3U3wBf+WIop6hDhkFzJhmLcqoAoGCCqGSM49\r\n" \ + "AwEHoUQDQgAEV+WusXPf06y7k7iB/xKu7uZTrM5VU/Y0Dswu42MlC9+Y4vNcYDaW\r\n" \ + "wNUYFHDlf5/VS0UY5bBs1Vz4lo+HcKPkxw==\r\n" \ + "-----END EC PRIVATE KEY-----\r\n" +/* END FILE */ + +/* This is generated from tests/data_files/cli2.key.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CLI_KEY_EC_DER tests/data_files/cli2.key.der */ +#define TEST_CLI_KEY_EC_DER { \ + 0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0xf6, 0xf7, 0x86, 0x64, 0xf1, \ + 0x67, 0x7f, 0xe6, 0x64, 0x8d, 0xef, 0xca, 0x4e, 0xe9, 0xdd, 0x4d, 0xf0, \ + 0x05, 0xff, 0x96, 0x22, 0x8a, 0x7a, 0x84, 0x38, 0x64, 0x17, 0x32, 0x61, \ + 0x98, 0xb7, 0x2a, 0xa0, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, \ + 0x03, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42, 0x00, 0x04, 0x57, 0xe5, 0xae, \ + 0xb1, 0x73, 0xdf, 0xd3, 0xac, 0xbb, 0x93, 0xb8, 0x81, 0xff, 0x12, 0xae, \ + 0xee, 0xe6, 0x53, 0xac, 0xce, 0x55, 0x53, 0xf6, 0x34, 0x0e, 0xcc, 0x2e, \ + 0xe3, 0x63, 0x25, 0x0b, 0xdf, 0x98, 0xe2, 0xf3, 0x5c, 0x60, 0x36, 0x96, \ + 0xc0, 0xd5, 0x18, 0x14, 0x70, 0xe5, 0x7f, 0x9f, 0xd5, 0x4b, 0x45, 0x18, \ + 0xe5, 0xb0, 0x6c, 0xd5, 0x5c, 0xf8, 0x96, 0x8f, 0x87, 0x70, 0xa3, 0xe4, \ + 0xc7 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/cli-rsa-sha256.crt. */ +/* BEGIN FILE string macro TEST_CLI_CRT_RSA_PEM tests/data_files/cli-rsa-sha256.crt */ +#define TEST_CLI_CRT_RSA_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIIDPzCCAiegAwIBAgIBBDANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\r\n" \ + "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ + "MTkwMjEwMTQ0NDA2WhcNMjkwMjEwMTQ0NDA2WjA8MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UECgwIUG9sYXJTU0wxGjAYBgNVBAMMEVBvbGFyU1NMIENsaWVudCAyMIIBIjAN\r\n" \ + "BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6f\r\n" \ + "M60Nj4o8VmXl3ETZzGaFB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu\r\n" \ + "1C93KYRhTYJQj6eVSHD1bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEw\r\n" \ + "MjDV0/YI0FZPRo7yX/k9Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v\r\n" \ + "4Jv4EFbMs44TFeY0BGbH7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx/\r\n" \ + "/DZrtenNLQNiTrM9AM+vdqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQAB\r\n" \ + "o00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBRxoQBzckAvVHZeM/xSj7zx3WtGITAf\r\n" \ + "BgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQsFAAOC\r\n" \ + "AQEAXidv1d4pLlBiKWED95rMycBdgDcgyNqJxakFkRfRyA2y1mlyTn7uBXRkNLY5\r\n" \ + "ZFzK82GCjk2Q2OD4RZSCPAJJqLpHHU34t71ciffvy2KK81YvrxczRhMAE64i+qna\r\n" \ + "yP3Td2XuWJR05PVPoSemsNELs9gWttdnYy3ce+EY2Y0n7Rsi7982EeLIAA7H6ca4\r\n" \ + "2Es/NUH//JZJT32OP0doMxeDRA+vplkKqTLLWf7dX26LIriBkBaRCgR5Yv9LBPFc\r\n" \ + "NOtpzu/LbrY7QFXKJMI+JXDudCsOn8KCmiA4d6Emisqfh3V3485l7HEQNcvLTxlD\r\n" \ + "6zDQyi0/ykYUYZkwQTK1N2Nvlw==\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This was generated from tests/data_files/cli-rsa-sha256.crt.der + using `xxd -i.` */ +/* BEGIN FILE binary macro TEST_CLI_CRT_RSA_DER tests/data_files/cli-rsa-sha256.crt.der */ +#define TEST_CLI_CRT_RSA_DER { \ + 0x30, 0x82, 0x03, 0x3f, 0x30, 0x82, 0x02, 0x27, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x04, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, \ + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, \ + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, \ + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, \ + 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, \ + 0x04, 0x03, 0x0c, 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, \ + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, \ + 0x31, 0x39, 0x30, 0x32, 0x31, 0x30, 0x31, 0x34, 0x34, 0x34, 0x30, 0x36, \ + 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x32, 0x31, 0x30, 0x31, 0x34, 0x34, \ + 0x34, 0x30, 0x36, 0x5a, 0x30, 0x3c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, \ + 0x11, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x6c, \ + 0x69, 0x65, 0x6e, 0x74, 0x20, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, \ + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, \ + 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, \ + 0x01, 0x01, 0x00, 0xc8, 0x74, 0xc4, 0xcc, 0xb9, 0xf9, 0xb5, 0x79, 0xe9, \ + 0x45, 0xd9, 0x14, 0x60, 0xb0, 0x7d, 0xbb, 0x93, 0xf2, 0x6b, 0x1e, 0x9f, \ + 0x33, 0xad, 0x0d, 0x8f, 0x8a, 0x3c, 0x56, 0x65, 0xe5, 0xdc, 0x44, 0xd9, \ + 0xcc, 0x66, 0x85, 0x07, 0xd5, 0xf8, 0x27, 0xb0, 0x4a, 0x35, 0xd0, 0x63, \ + 0x9e, 0x0a, 0x6e, 0x1b, 0xb7, 0xda, 0xf0, 0x7e, 0xab, 0xee, 0x0c, 0x10, \ + 0x93, 0x86, 0x49, 0x18, 0x34, 0xf3, 0xa8, 0x2a, 0xd2, 0x57, 0xf5, 0x2e, \ + 0xd4, 0x2f, 0x77, 0x29, 0x84, 0x61, 0x4d, 0x82, 0x50, 0x8f, 0xa7, 0x95, \ + 0x48, 0x70, 0xf5, 0x6e, 0x4d, 0xb2, 0xd5, 0x13, 0xc3, 0xd2, 0x1a, 0xed, \ + 0xe6, 0x43, 0xea, 0x42, 0x14, 0xeb, 0x74, 0xea, 0xc0, 0xed, 0x1f, 0xd4, \ + 0x57, 0x4e, 0xa9, 0xf3, 0xa8, 0xed, 0xd2, 0xe0, 0xc1, 0x30, 0x71, 0x30, \ + 0x32, 0x30, 0xd5, 0xd3, 0xf6, 0x08, 0xd0, 0x56, 0x4f, 0x46, 0x8e, 0xf2, \ + 0x5f, 0xf9, 0x3d, 0x67, 0x91, 0x88, 0x30, 0x2e, 0x42, 0xb2, 0xdf, 0x7d, \ + 0xfb, 0xe5, 0x0c, 0x77, 0xff, 0xec, 0x31, 0xc0, 0x78, 0x8f, 0xbf, 0xc2, \ + 0x7f, 0xca, 0xad, 0x6c, 0x21, 0xd6, 0x8d, 0xd9, 0x8b, 0x6a, 0x8e, 0x6f, \ + 0xe0, 0x9b, 0xf8, 0x10, 0x56, 0xcc, 0xb3, 0x8e, 0x13, 0x15, 0xe6, 0x34, \ + 0x04, 0x66, 0xc7, 0xee, 0xf9, 0x36, 0x0e, 0x6a, 0x95, 0xf6, 0x09, 0x9a, \ + 0x06, 0x67, 0xf4, 0x65, 0x71, 0xf8, 0xca, 0xa4, 0xb1, 0x25, 0xe0, 0xfe, \ + 0x3c, 0x8b, 0x35, 0x04, 0x67, 0xba, 0xe0, 0x4f, 0x76, 0x85, 0xfc, 0x7f, \ + 0xfc, 0x36, 0x6b, 0xb5, 0xe9, 0xcd, 0x2d, 0x03, 0x62, 0x4e, 0xb3, 0x3d, \ + 0x00, 0xcf, 0xaf, 0x76, 0xa0, 0x69, 0x56, 0x83, 0x6a, 0xd2, 0xa8, 0xd4, \ + 0xe7, 0x50, 0x71, 0xe6, 0xb5, 0x36, 0x05, 0x77, 0x05, 0x6d, 0x7b, 0xc8, \ + 0xe4, 0xc4, 0xfd, 0x4c, 0xd5, 0x21, 0x5f, 0x02, 0x03, 0x01, 0x00, 0x01, \ + 0xa3, 0x4d, 0x30, 0x4b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, \ + 0x02, 0x30, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, \ + 0x04, 0x14, 0x71, 0xa1, 0x00, 0x73, 0x72, 0x40, 0x2f, 0x54, 0x76, 0x5e, \ + 0x33, 0xfc, 0x52, 0x8f, 0xbc, 0xf1, 0xdd, 0x6b, 0x46, 0x21, 0x30, 0x1f, \ + 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xb4, \ + 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, 0xf6, 0xb9, 0xd5, 0xa6, 0x95, \ + 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, \ + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, \ + 0x01, 0x01, 0x00, 0x5e, 0x27, 0x6f, 0xd5, 0xde, 0x29, 0x2e, 0x50, 0x62, \ + 0x29, 0x61, 0x03, 0xf7, 0x9a, 0xcc, 0xc9, 0xc0, 0x5d, 0x80, 0x37, 0x20, \ + 0xc8, 0xda, 0x89, 0xc5, 0xa9, 0x05, 0x91, 0x17, 0xd1, 0xc8, 0x0d, 0xb2, \ + 0xd6, 0x69, 0x72, 0x4e, 0x7e, 0xee, 0x05, 0x74, 0x64, 0x34, 0xb6, 0x39, \ + 0x64, 0x5c, 0xca, 0xf3, 0x61, 0x82, 0x8e, 0x4d, 0x90, 0xd8, 0xe0, 0xf8, \ + 0x45, 0x94, 0x82, 0x3c, 0x02, 0x49, 0xa8, 0xba, 0x47, 0x1d, 0x4d, 0xf8, \ + 0xb7, 0xbd, 0x5c, 0x89, 0xf7, 0xef, 0xcb, 0x62, 0x8a, 0xf3, 0x56, 0x2f, \ + 0xaf, 0x17, 0x33, 0x46, 0x13, 0x00, 0x13, 0xae, 0x22, 0xfa, 0xa9, 0xda, \ + 0xc8, 0xfd, 0xd3, 0x77, 0x65, 0xee, 0x58, 0x94, 0x74, 0xe4, 0xf5, 0x4f, \ + 0xa1, 0x27, 0xa6, 0xb0, 0xd1, 0x0b, 0xb3, 0xd8, 0x16, 0xb6, 0xd7, 0x67, \ + 0x63, 0x2d, 0xdc, 0x7b, 0xe1, 0x18, 0xd9, 0x8d, 0x27, 0xed, 0x1b, 0x22, \ + 0xef, 0xdf, 0x36, 0x11, 0xe2, 0xc8, 0x00, 0x0e, 0xc7, 0xe9, 0xc6, 0xb8, \ + 0xd8, 0x4b, 0x3f, 0x35, 0x41, 0xff, 0xfc, 0x96, 0x49, 0x4f, 0x7d, 0x8e, \ + 0x3f, 0x47, 0x68, 0x33, 0x17, 0x83, 0x44, 0x0f, 0xaf, 0xa6, 0x59, 0x0a, \ + 0xa9, 0x32, 0xcb, 0x59, 0xfe, 0xdd, 0x5f, 0x6e, 0x8b, 0x22, 0xb8, 0x81, \ + 0x90, 0x16, 0x91, 0x0a, 0x04, 0x79, 0x62, 0xff, 0x4b, 0x04, 0xf1, 0x5c, \ + 0x34, 0xeb, 0x69, 0xce, 0xef, 0xcb, 0x6e, 0xb6, 0x3b, 0x40, 0x55, 0xca, \ + 0x24, 0xc2, 0x3e, 0x25, 0x70, 0xee, 0x74, 0x2b, 0x0e, 0x9f, 0xc2, 0x82, \ + 0x9a, 0x20, 0x38, 0x77, 0xa1, 0x26, 0x8a, 0xca, 0x9f, 0x87, 0x75, 0x77, \ + 0xe3, 0xce, 0x65, 0xec, 0x71, 0x10, 0x35, 0xcb, 0xcb, 0x4f, 0x19, 0x43, \ + 0xeb, 0x30, 0xd0, 0xca, 0x2d, 0x3f, 0xca, 0x46, 0x14, 0x61, 0x99, 0x30, \ + 0x41, 0x32, 0xb5, 0x37, 0x63, 0x6f, 0x97 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/cli-rsa.key. */ +/* BEGIN FILE string macro TEST_CLI_KEY_RSA_PEM tests/data_files/cli-rsa.key */ +#define TEST_CLI_KEY_RSA_PEM \ + "-----BEGIN RSA PRIVATE KEY-----\r\n" \ + "MIIEpAIBAAKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6fM60Nj4o8VmXl3ETZzGaF\r\n" \ + "B9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu1C93KYRhTYJQj6eVSHD1\r\n" \ + "bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEwMjDV0/YI0FZPRo7yX/k9\r\n" \ + "Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v4Jv4EFbMs44TFeY0BGbH\r\n" \ + "7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx//DZrtenNLQNiTrM9AM+v\r\n" \ + "dqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQABAoIBAGdNtfYDiap6bzst\r\n" \ + "yhCiI8m9TtrhZw4MisaEaN/ll3XSjaOG2dvV6xMZCMV+5TeXDHOAZnY18Yi18vzz\r\n" \ + "4Ut2TnNFzizCECYNaA2fST3WgInnxUkV3YXAyP6CNxJaCmv2aA0yFr2kFVSeaKGt\r\n" \ + "ymvljNp2NVkvm7Th8fBQBO7I7AXhz43k0mR7XmPgewe8ApZOG3hstkOaMvbWAvWA\r\n" \ + "zCZupdDjZYjOJqlA4eEA4H8/w7F83r5CugeBE8LgEREjLPiyejrU5H1fubEY+h0d\r\n" \ + "l5HZBJ68ybTXfQ5U9o/QKA3dd0toBEhhdRUDGzWtjvwkEQfqF1reGWj/tod/gCpf\r\n" \ + "DFi6X0ECgYEA4wOv/pjSC3ty6TuOvKX2rOUiBrLXXv2JSxZnMoMiWI5ipLQt+RYT\r\n" \ + "VPafL/m7Dn6MbwjayOkcZhBwk5CNz5A6Q4lJ64Mq/lqHznRCQQ2Mc1G8eyDF/fYL\r\n" \ + "Ze2pLvwP9VD5jTc2miDfw+MnvJhywRRLcemDFP8k4hQVtm8PMp3ZmNECgYEA4gz7\r\n" \ + "wzObR4gn8ibe617uQPZjWzUj9dUHYd+in1gwBCIrtNnaRn9I9U/Q6tegRYpii4ys\r\n" \ + "c176NmU+umy6XmuSKV5qD9bSpZWG2nLFnslrN15Lm3fhZxoeMNhBaEDTnLT26yoi\r\n" \ + "33gp0mSSWy94ZEqipms+ULF6sY1ZtFW6tpGFoy8CgYAQHhnnvJflIs2ky4q10B60\r\n" \ + "ZcxFp3rtDpkp0JxhFLhiizFrujMtZSjYNm5U7KkgPVHhLELEUvCmOnKTt4ap/vZ0\r\n" \ + "BxJNe1GZH3pW6SAvGDQpl9sG7uu/vTFP+lCxukmzxB0DrrDcvorEkKMom7ZCCRvW\r\n" \ + "KZsZ6YeH2Z81BauRj218kQKBgQCUV/DgKP2985xDTT79N08jUo3hTP5MVYCCuj/+\r\n" \ + "UeEw1TvZcx3LJby7P6Xad6a1/BqveaGyFKIfEFIaBUBItk801sDDpDaYc4gL00Xc\r\n" \ + "7lFuBHOZkxJYlss5QrGpuOEl9ZwUt5IrFLBdYaKqNHzNVC1pCPfb/JyH6Dr2HUxq\r\n" \ + "gxUwAQKBgQCcU6G2L8AG9d9c0UpOyL1tMvFe5Ttw0KjlQVdsh1MP6yigYo9DYuwu\r\n" \ + "bHFVW2r0dBTqegP2/KTOxKzaHfC1qf0RGDsUoJCNJrd1cwoCLG8P2EF4w3OBrKqv\r\n" \ + "8u4ytY0F+Vlanj5lm3TaoHSVF1+NWPyOTiwevIECGKwSxvlki4fDAA==\r\n" \ + "-----END RSA PRIVATE KEY-----\r\n"/* END FILE */ + +/* This was generated from tests/data_files/cli-rsa.key.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CLI_KEY_RSA_DER tests/data_files/cli-rsa.key.der */ +#define TEST_CLI_KEY_RSA_DER { \ + 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, \ + 0xc8, 0x74, 0xc4, 0xcc, 0xb9, 0xf9, 0xb5, 0x79, 0xe9, 0x45, 0xd9, 0x14, \ + 0x60, 0xb0, 0x7d, 0xbb, 0x93, 0xf2, 0x6b, 0x1e, 0x9f, 0x33, 0xad, 0x0d, \ + 0x8f, 0x8a, 0x3c, 0x56, 0x65, 0xe5, 0xdc, 0x44, 0xd9, 0xcc, 0x66, 0x85, \ + 0x07, 0xd5, 0xf8, 0x27, 0xb0, 0x4a, 0x35, 0xd0, 0x63, 0x9e, 0x0a, 0x6e, \ + 0x1b, 0xb7, 0xda, 0xf0, 0x7e, 0xab, 0xee, 0x0c, 0x10, 0x93, 0x86, 0x49, \ + 0x18, 0x34, 0xf3, 0xa8, 0x2a, 0xd2, 0x57, 0xf5, 0x2e, 0xd4, 0x2f, 0x77, \ + 0x29, 0x84, 0x61, 0x4d, 0x82, 0x50, 0x8f, 0xa7, 0x95, 0x48, 0x70, 0xf5, \ + 0x6e, 0x4d, 0xb2, 0xd5, 0x13, 0xc3, 0xd2, 0x1a, 0xed, 0xe6, 0x43, 0xea, \ + 0x42, 0x14, 0xeb, 0x74, 0xea, 0xc0, 0xed, 0x1f, 0xd4, 0x57, 0x4e, 0xa9, \ + 0xf3, 0xa8, 0xed, 0xd2, 0xe0, 0xc1, 0x30, 0x71, 0x30, 0x32, 0x30, 0xd5, \ + 0xd3, 0xf6, 0x08, 0xd0, 0x56, 0x4f, 0x46, 0x8e, 0xf2, 0x5f, 0xf9, 0x3d, \ + 0x67, 0x91, 0x88, 0x30, 0x2e, 0x42, 0xb2, 0xdf, 0x7d, 0xfb, 0xe5, 0x0c, \ + 0x77, 0xff, 0xec, 0x31, 0xc0, 0x78, 0x8f, 0xbf, 0xc2, 0x7f, 0xca, 0xad, \ + 0x6c, 0x21, 0xd6, 0x8d, 0xd9, 0x8b, 0x6a, 0x8e, 0x6f, 0xe0, 0x9b, 0xf8, \ + 0x10, 0x56, 0xcc, 0xb3, 0x8e, 0x13, 0x15, 0xe6, 0x34, 0x04, 0x66, 0xc7, \ + 0xee, 0xf9, 0x36, 0x0e, 0x6a, 0x95, 0xf6, 0x09, 0x9a, 0x06, 0x67, 0xf4, \ + 0x65, 0x71, 0xf8, 0xca, 0xa4, 0xb1, 0x25, 0xe0, 0xfe, 0x3c, 0x8b, 0x35, \ + 0x04, 0x67, 0xba, 0xe0, 0x4f, 0x76, 0x85, 0xfc, 0x7f, 0xfc, 0x36, 0x6b, \ + 0xb5, 0xe9, 0xcd, 0x2d, 0x03, 0x62, 0x4e, 0xb3, 0x3d, 0x00, 0xcf, 0xaf, \ + 0x76, 0xa0, 0x69, 0x56, 0x83, 0x6a, 0xd2, 0xa8, 0xd4, 0xe7, 0x50, 0x71, \ + 0xe6, 0xb5, 0x36, 0x05, 0x77, 0x05, 0x6d, 0x7b, 0xc8, 0xe4, 0xc4, 0xfd, \ + 0x4c, 0xd5, 0x21, 0x5f, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, \ + 0x00, 0x67, 0x4d, 0xb5, 0xf6, 0x03, 0x89, 0xaa, 0x7a, 0x6f, 0x3b, 0x2d, \ + 0xca, 0x10, 0xa2, 0x23, 0xc9, 0xbd, 0x4e, 0xda, 0xe1, 0x67, 0x0e, 0x0c, \ + 0x8a, 0xc6, 0x84, 0x68, 0xdf, 0xe5, 0x97, 0x75, 0xd2, 0x8d, 0xa3, 0x86, \ + 0xd9, 0xdb, 0xd5, 0xeb, 0x13, 0x19, 0x08, 0xc5, 0x7e, 0xe5, 0x37, 0x97, \ + 0x0c, 0x73, 0x80, 0x66, 0x76, 0x35, 0xf1, 0x88, 0xb5, 0xf2, 0xfc, 0xf3, \ + 0xe1, 0x4b, 0x76, 0x4e, 0x73, 0x45, 0xce, 0x2c, 0xc2, 0x10, 0x26, 0x0d, \ + 0x68, 0x0d, 0x9f, 0x49, 0x3d, 0xd6, 0x80, 0x89, 0xe7, 0xc5, 0x49, 0x15, \ + 0xdd, 0x85, 0xc0, 0xc8, 0xfe, 0x82, 0x37, 0x12, 0x5a, 0x0a, 0x6b, 0xf6, \ + 0x68, 0x0d, 0x32, 0x16, 0xbd, 0xa4, 0x15, 0x54, 0x9e, 0x68, 0xa1, 0xad, \ + 0xca, 0x6b, 0xe5, 0x8c, 0xda, 0x76, 0x35, 0x59, 0x2f, 0x9b, 0xb4, 0xe1, \ + 0xf1, 0xf0, 0x50, 0x04, 0xee, 0xc8, 0xec, 0x05, 0xe1, 0xcf, 0x8d, 0xe4, \ + 0xd2, 0x64, 0x7b, 0x5e, 0x63, 0xe0, 0x7b, 0x07, 0xbc, 0x02, 0x96, 0x4e, \ + 0x1b, 0x78, 0x6c, 0xb6, 0x43, 0x9a, 0x32, 0xf6, 0xd6, 0x02, 0xf5, 0x80, \ + 0xcc, 0x26, 0x6e, 0xa5, 0xd0, 0xe3, 0x65, 0x88, 0xce, 0x26, 0xa9, 0x40, \ + 0xe1, 0xe1, 0x00, 0xe0, 0x7f, 0x3f, 0xc3, 0xb1, 0x7c, 0xde, 0xbe, 0x42, \ + 0xba, 0x07, 0x81, 0x13, 0xc2, 0xe0, 0x11, 0x11, 0x23, 0x2c, 0xf8, 0xb2, \ + 0x7a, 0x3a, 0xd4, 0xe4, 0x7d, 0x5f, 0xb9, 0xb1, 0x18, 0xfa, 0x1d, 0x1d, \ + 0x97, 0x91, 0xd9, 0x04, 0x9e, 0xbc, 0xc9, 0xb4, 0xd7, 0x7d, 0x0e, 0x54, \ + 0xf6, 0x8f, 0xd0, 0x28, 0x0d, 0xdd, 0x77, 0x4b, 0x68, 0x04, 0x48, 0x61, \ + 0x75, 0x15, 0x03, 0x1b, 0x35, 0xad, 0x8e, 0xfc, 0x24, 0x11, 0x07, 0xea, \ + 0x17, 0x5a, 0xde, 0x19, 0x68, 0xff, 0xb6, 0x87, 0x7f, 0x80, 0x2a, 0x5f, \ + 0x0c, 0x58, 0xba, 0x5f, 0x41, 0x02, 0x81, 0x81, 0x00, 0xe3, 0x03, 0xaf, \ + 0xfe, 0x98, 0xd2, 0x0b, 0x7b, 0x72, 0xe9, 0x3b, 0x8e, 0xbc, 0xa5, 0xf6, \ + 0xac, 0xe5, 0x22, 0x06, 0xb2, 0xd7, 0x5e, 0xfd, 0x89, 0x4b, 0x16, 0x67, \ + 0x32, 0x83, 0x22, 0x58, 0x8e, 0x62, 0xa4, 0xb4, 0x2d, 0xf9, 0x16, 0x13, \ + 0x54, 0xf6, 0x9f, 0x2f, 0xf9, 0xbb, 0x0e, 0x7e, 0x8c, 0x6f, 0x08, 0xda, \ + 0xc8, 0xe9, 0x1c, 0x66, 0x10, 0x70, 0x93, 0x90, 0x8d, 0xcf, 0x90, 0x3a, \ + 0x43, 0x89, 0x49, 0xeb, 0x83, 0x2a, 0xfe, 0x5a, 0x87, 0xce, 0x74, 0x42, \ + 0x41, 0x0d, 0x8c, 0x73, 0x51, 0xbc, 0x7b, 0x20, 0xc5, 0xfd, 0xf6, 0x0b, \ + 0x65, 0xed, 0xa9, 0x2e, 0xfc, 0x0f, 0xf5, 0x50, 0xf9, 0x8d, 0x37, 0x36, \ + 0x9a, 0x20, 0xdf, 0xc3, 0xe3, 0x27, 0xbc, 0x98, 0x72, 0xc1, 0x14, 0x4b, \ + 0x71, 0xe9, 0x83, 0x14, 0xff, 0x24, 0xe2, 0x14, 0x15, 0xb6, 0x6f, 0x0f, \ + 0x32, 0x9d, 0xd9, 0x98, 0xd1, 0x02, 0x81, 0x81, 0x00, 0xe2, 0x0c, 0xfb, \ + 0xc3, 0x33, 0x9b, 0x47, 0x88, 0x27, 0xf2, 0x26, 0xde, 0xeb, 0x5e, 0xee, \ + 0x40, 0xf6, 0x63, 0x5b, 0x35, 0x23, 0xf5, 0xd5, 0x07, 0x61, 0xdf, 0xa2, \ + 0x9f, 0x58, 0x30, 0x04, 0x22, 0x2b, 0xb4, 0xd9, 0xda, 0x46, 0x7f, 0x48, \ + 0xf5, 0x4f, 0xd0, 0xea, 0xd7, 0xa0, 0x45, 0x8a, 0x62, 0x8b, 0x8c, 0xac, \ + 0x73, 0x5e, 0xfa, 0x36, 0x65, 0x3e, 0xba, 0x6c, 0xba, 0x5e, 0x6b, 0x92, \ + 0x29, 0x5e, 0x6a, 0x0f, 0xd6, 0xd2, 0xa5, 0x95, 0x86, 0xda, 0x72, 0xc5, \ + 0x9e, 0xc9, 0x6b, 0x37, 0x5e, 0x4b, 0x9b, 0x77, 0xe1, 0x67, 0x1a, 0x1e, \ + 0x30, 0xd8, 0x41, 0x68, 0x40, 0xd3, 0x9c, 0xb4, 0xf6, 0xeb, 0x2a, 0x22, \ + 0xdf, 0x78, 0x29, 0xd2, 0x64, 0x92, 0x5b, 0x2f, 0x78, 0x64, 0x4a, 0xa2, \ + 0xa6, 0x6b, 0x3e, 0x50, 0xb1, 0x7a, 0xb1, 0x8d, 0x59, 0xb4, 0x55, 0xba, \ + 0xb6, 0x91, 0x85, 0xa3, 0x2f, 0x02, 0x81, 0x80, 0x10, 0x1e, 0x19, 0xe7, \ + 0xbc, 0x97, 0xe5, 0x22, 0xcd, 0xa4, 0xcb, 0x8a, 0xb5, 0xd0, 0x1e, 0xb4, \ + 0x65, 0xcc, 0x45, 0xa7, 0x7a, 0xed, 0x0e, 0x99, 0x29, 0xd0, 0x9c, 0x61, \ + 0x14, 0xb8, 0x62, 0x8b, 0x31, 0x6b, 0xba, 0x33, 0x2d, 0x65, 0x28, 0xd8, \ + 0x36, 0x6e, 0x54, 0xec, 0xa9, 0x20, 0x3d, 0x51, 0xe1, 0x2c, 0x42, 0xc4, \ + 0x52, 0xf0, 0xa6, 0x3a, 0x72, 0x93, 0xb7, 0x86, 0xa9, 0xfe, 0xf6, 0x74, \ + 0x07, 0x12, 0x4d, 0x7b, 0x51, 0x99, 0x1f, 0x7a, 0x56, 0xe9, 0x20, 0x2f, \ + 0x18, 0x34, 0x29, 0x97, 0xdb, 0x06, 0xee, 0xeb, 0xbf, 0xbd, 0x31, 0x4f, \ + 0xfa, 0x50, 0xb1, 0xba, 0x49, 0xb3, 0xc4, 0x1d, 0x03, 0xae, 0xb0, 0xdc, \ + 0xbe, 0x8a, 0xc4, 0x90, 0xa3, 0x28, 0x9b, 0xb6, 0x42, 0x09, 0x1b, 0xd6, \ + 0x29, 0x9b, 0x19, 0xe9, 0x87, 0x87, 0xd9, 0x9f, 0x35, 0x05, 0xab, 0x91, \ + 0x8f, 0x6d, 0x7c, 0x91, 0x02, 0x81, 0x81, 0x00, 0x94, 0x57, 0xf0, 0xe0, \ + 0x28, 0xfd, 0xbd, 0xf3, 0x9c, 0x43, 0x4d, 0x3e, 0xfd, 0x37, 0x4f, 0x23, \ + 0x52, 0x8d, 0xe1, 0x4c, 0xfe, 0x4c, 0x55, 0x80, 0x82, 0xba, 0x3f, 0xfe, \ + 0x51, 0xe1, 0x30, 0xd5, 0x3b, 0xd9, 0x73, 0x1d, 0xcb, 0x25, 0xbc, 0xbb, \ + 0x3f, 0xa5, 0xda, 0x77, 0xa6, 0xb5, 0xfc, 0x1a, 0xaf, 0x79, 0xa1, 0xb2, \ + 0x14, 0xa2, 0x1f, 0x10, 0x52, 0x1a, 0x05, 0x40, 0x48, 0xb6, 0x4f, 0x34, \ + 0xd6, 0xc0, 0xc3, 0xa4, 0x36, 0x98, 0x73, 0x88, 0x0b, 0xd3, 0x45, 0xdc, \ + 0xee, 0x51, 0x6e, 0x04, 0x73, 0x99, 0x93, 0x12, 0x58, 0x96, 0xcb, 0x39, \ + 0x42, 0xb1, 0xa9, 0xb8, 0xe1, 0x25, 0xf5, 0x9c, 0x14, 0xb7, 0x92, 0x2b, \ + 0x14, 0xb0, 0x5d, 0x61, 0xa2, 0xaa, 0x34, 0x7c, 0xcd, 0x54, 0x2d, 0x69, \ + 0x08, 0xf7, 0xdb, 0xfc, 0x9c, 0x87, 0xe8, 0x3a, 0xf6, 0x1d, 0x4c, 0x6a, \ + 0x83, 0x15, 0x30, 0x01, 0x02, 0x81, 0x81, 0x00, 0x9c, 0x53, 0xa1, 0xb6, \ + 0x2f, 0xc0, 0x06, 0xf5, 0xdf, 0x5c, 0xd1, 0x4a, 0x4e, 0xc8, 0xbd, 0x6d, \ + 0x32, 0xf1, 0x5e, 0xe5, 0x3b, 0x70, 0xd0, 0xa8, 0xe5, 0x41, 0x57, 0x6c, \ + 0x87, 0x53, 0x0f, 0xeb, 0x28, 0xa0, 0x62, 0x8f, 0x43, 0x62, 0xec, 0x2e, \ + 0x6c, 0x71, 0x55, 0x5b, 0x6a, 0xf4, 0x74, 0x14, 0xea, 0x7a, 0x03, 0xf6, \ + 0xfc, 0xa4, 0xce, 0xc4, 0xac, 0xda, 0x1d, 0xf0, 0xb5, 0xa9, 0xfd, 0x11, \ + 0x18, 0x3b, 0x14, 0xa0, 0x90, 0x8d, 0x26, 0xb7, 0x75, 0x73, 0x0a, 0x02, \ + 0x2c, 0x6f, 0x0f, 0xd8, 0x41, 0x78, 0xc3, 0x73, 0x81, 0xac, 0xaa, 0xaf, \ + 0xf2, 0xee, 0x32, 0xb5, 0x8d, 0x05, 0xf9, 0x59, 0x5a, 0x9e, 0x3e, 0x65, \ + 0x9b, 0x74, 0xda, 0xa0, 0x74, 0x95, 0x17, 0x5f, 0x8d, 0x58, 0xfc, 0x8e, \ + 0x4e, 0x2c, 0x1e, 0xbc, 0x81, 0x02, 0x18, 0xac, 0x12, 0xc6, 0xf9, 0x64, \ + 0x8b, 0x87, 0xc3, 0x00 \ +} +/* END FILE */ + +/* + * + * Test certificates and keys as C variables + * + */ + +/* + * CA + */ + +const char mbedtls_test_ca_crt_ec_pem[] = TEST_CA_CRT_EC_PEM; +const char mbedtls_test_ca_key_ec_pem[] = TEST_CA_KEY_EC_PEM; +const char mbedtls_test_ca_pwd_ec_pem[] = TEST_CA_PWD_EC_PEM; +const char mbedtls_test_ca_key_rsa_pem[] = TEST_CA_KEY_RSA_PEM; +const char mbedtls_test_ca_pwd_rsa_pem[] = TEST_CA_PWD_RSA_PEM; +const char mbedtls_test_ca_crt_rsa_sha1_pem[] = TEST_CA_CRT_RSA_SHA1_PEM; +const char mbedtls_test_ca_crt_rsa_sha256_pem[] = TEST_CA_CRT_RSA_SHA256_PEM; + +const unsigned char mbedtls_test_ca_crt_ec_der[] = TEST_CA_CRT_EC_DER; +const unsigned char mbedtls_test_ca_key_ec_der[] = TEST_CA_KEY_EC_DER; +const unsigned char mbedtls_test_ca_key_rsa_der[] = TEST_CA_KEY_RSA_DER; +const unsigned char mbedtls_test_ca_crt_rsa_sha1_der[] = + TEST_CA_CRT_RSA_SHA1_DER; +const unsigned char mbedtls_test_ca_crt_rsa_sha256_der[] = + TEST_CA_CRT_RSA_SHA256_DER; + +const size_t mbedtls_test_ca_crt_ec_pem_len = + sizeof(mbedtls_test_ca_crt_ec_pem); +const size_t mbedtls_test_ca_key_ec_pem_len = + sizeof(mbedtls_test_ca_key_ec_pem); +const size_t mbedtls_test_ca_pwd_ec_pem_len = + sizeof(mbedtls_test_ca_pwd_ec_pem) - 1; +const size_t mbedtls_test_ca_key_rsa_pem_len = + sizeof(mbedtls_test_ca_key_rsa_pem); +const size_t mbedtls_test_ca_pwd_rsa_pem_len = + sizeof(mbedtls_test_ca_pwd_rsa_pem) - 1; +const size_t mbedtls_test_ca_crt_rsa_sha1_pem_len = + sizeof(mbedtls_test_ca_crt_rsa_sha1_pem); +const size_t mbedtls_test_ca_crt_rsa_sha256_pem_len = + sizeof(mbedtls_test_ca_crt_rsa_sha256_pem); + +const size_t mbedtls_test_ca_crt_ec_der_len = + sizeof(mbedtls_test_ca_crt_ec_der); +const size_t mbedtls_test_ca_key_ec_der_len = + sizeof(mbedtls_test_ca_key_ec_der); +const size_t mbedtls_test_ca_pwd_ec_der_len = 0; +const size_t mbedtls_test_ca_key_rsa_der_len = + sizeof(mbedtls_test_ca_key_rsa_der); +const size_t mbedtls_test_ca_pwd_rsa_der_len = 0; +const size_t mbedtls_test_ca_crt_rsa_sha1_der_len = + sizeof(mbedtls_test_ca_crt_rsa_sha1_der); +const size_t mbedtls_test_ca_crt_rsa_sha256_der_len = + sizeof(mbedtls_test_ca_crt_rsa_sha256_der); + +/* + * Server + */ + +const char mbedtls_test_srv_crt_ec_pem[] = TEST_SRV_CRT_EC_PEM; +const char mbedtls_test_srv_key_ec_pem[] = TEST_SRV_KEY_EC_PEM; +const char mbedtls_test_srv_pwd_ec_pem[] = ""; +const char mbedtls_test_srv_key_rsa_pem[] = TEST_SRV_KEY_RSA_PEM; +const char mbedtls_test_srv_pwd_rsa_pem[] = ""; +const char mbedtls_test_srv_crt_rsa_sha1_pem[] = TEST_SRV_CRT_RSA_SHA1_PEM; +const char mbedtls_test_srv_crt_rsa_sha256_pem[] = TEST_SRV_CRT_RSA_SHA256_PEM; + +const unsigned char mbedtls_test_srv_crt_ec_der[] = TEST_SRV_CRT_EC_DER; +const unsigned char mbedtls_test_srv_key_ec_der[] = TEST_SRV_KEY_EC_DER; +const unsigned char mbedtls_test_srv_key_rsa_der[] = TEST_SRV_KEY_RSA_DER; +const unsigned char mbedtls_test_srv_crt_rsa_sha1_der[] = + TEST_SRV_CRT_RSA_SHA1_DER; +const unsigned char mbedtls_test_srv_crt_rsa_sha256_der[] = + TEST_SRV_CRT_RSA_SHA256_DER; + +const size_t mbedtls_test_srv_crt_ec_pem_len = + sizeof(mbedtls_test_srv_crt_ec_pem); +const size_t mbedtls_test_srv_key_ec_pem_len = + sizeof(mbedtls_test_srv_key_ec_pem); +const size_t mbedtls_test_srv_pwd_ec_pem_len = + sizeof(mbedtls_test_srv_pwd_ec_pem) - 1; +const size_t mbedtls_test_srv_key_rsa_pem_len = + sizeof(mbedtls_test_srv_key_rsa_pem); +const size_t mbedtls_test_srv_pwd_rsa_pem_len = + sizeof(mbedtls_test_srv_pwd_rsa_pem) - 1; +const size_t mbedtls_test_srv_crt_rsa_sha1_pem_len = + sizeof(mbedtls_test_srv_crt_rsa_sha1_pem); +const size_t mbedtls_test_srv_crt_rsa_sha256_pem_len = + sizeof(mbedtls_test_srv_crt_rsa_sha256_pem); + +const size_t mbedtls_test_srv_crt_ec_der_len = + sizeof(mbedtls_test_srv_crt_ec_der); +const size_t mbedtls_test_srv_key_ec_der_len = + sizeof(mbedtls_test_srv_key_ec_der); +const size_t mbedtls_test_srv_pwd_ec_der_len = 0; +const size_t mbedtls_test_srv_key_rsa_der_len = + sizeof(mbedtls_test_srv_key_rsa_der); +const size_t mbedtls_test_srv_pwd_rsa_der_len = 0; +const size_t mbedtls_test_srv_crt_rsa_sha1_der_len = + sizeof(mbedtls_test_srv_crt_rsa_sha1_der); +const size_t mbedtls_test_srv_crt_rsa_sha256_der_len = + sizeof(mbedtls_test_srv_crt_rsa_sha256_der); + +/* + * Client + */ + +const char mbedtls_test_cli_crt_ec_pem[] = TEST_CLI_CRT_EC_PEM; +const char mbedtls_test_cli_key_ec_pem[] = TEST_CLI_KEY_EC_PEM; +const char mbedtls_test_cli_pwd_ec_pem[] = ""; +const char mbedtls_test_cli_key_rsa_pem[] = TEST_CLI_KEY_RSA_PEM; +const char mbedtls_test_cli_pwd_rsa_pem[] = ""; +const char mbedtls_test_cli_crt_rsa_pem[] = TEST_CLI_CRT_RSA_PEM; + +const unsigned char mbedtls_test_cli_crt_ec_der[] = TEST_CLI_CRT_EC_DER; +const unsigned char mbedtls_test_cli_key_ec_der[] = TEST_CLI_KEY_EC_DER; +const unsigned char mbedtls_test_cli_key_rsa_der[] = TEST_CLI_KEY_RSA_DER; +const unsigned char mbedtls_test_cli_crt_rsa_der[] = TEST_CLI_CRT_RSA_DER; + +const size_t mbedtls_test_cli_crt_ec_pem_len = + sizeof(mbedtls_test_cli_crt_ec_pem); +const size_t mbedtls_test_cli_key_ec_pem_len = + sizeof(mbedtls_test_cli_key_ec_pem); +const size_t mbedtls_test_cli_pwd_ec_pem_len = + sizeof(mbedtls_test_cli_pwd_ec_pem) - 1; +const size_t mbedtls_test_cli_key_rsa_pem_len = + sizeof(mbedtls_test_cli_key_rsa_pem); +const size_t mbedtls_test_cli_pwd_rsa_pem_len = + sizeof(mbedtls_test_cli_pwd_rsa_pem) - 1; +const size_t mbedtls_test_cli_crt_rsa_pem_len = + sizeof(mbedtls_test_cli_crt_rsa_pem); + +const size_t mbedtls_test_cli_crt_ec_der_len = + sizeof(mbedtls_test_cli_crt_ec_der); +const size_t mbedtls_test_cli_key_ec_der_len = + sizeof(mbedtls_test_cli_key_ec_der); +const size_t mbedtls_test_cli_key_rsa_der_len = + sizeof(mbedtls_test_cli_key_rsa_der); +const size_t mbedtls_test_cli_crt_rsa_der_len = + sizeof(mbedtls_test_cli_crt_rsa_der); + +/* + * + * Definitions of test CRTs without specification of all parameters, choosing + * them automatically according to the config. For example, mbedtls_test_ca_crt + * is one of mbedtls_test_ca_crt_{rsa|ec}_{sha1|sha256}_{pem|der}. + * + */ + +/* + * Dispatch between PEM and DER according to config + */ + +#if defined(MBEDTLS_PEM_PARSE_C) + +/* PEM encoded test CA certificates and keys */ + +#define TEST_CA_KEY_RSA TEST_CA_KEY_RSA_PEM +#define TEST_CA_PWD_RSA TEST_CA_PWD_RSA_PEM +#define TEST_CA_CRT_RSA_SHA256 TEST_CA_CRT_RSA_SHA256_PEM +#define TEST_CA_CRT_RSA_SHA1 TEST_CA_CRT_RSA_SHA1_PEM +#define TEST_CA_KEY_EC TEST_CA_KEY_EC_PEM +#define TEST_CA_PWD_EC TEST_CA_PWD_EC_PEM +#define TEST_CA_CRT_EC TEST_CA_CRT_EC_PEM + +/* PEM encoded test server certificates and keys */ + +#define TEST_SRV_KEY_RSA TEST_SRV_KEY_RSA_PEM +#define TEST_SRV_PWD_RSA "" +#define TEST_SRV_CRT_RSA_SHA256 TEST_SRV_CRT_RSA_SHA256_PEM +#define TEST_SRV_CRT_RSA_SHA1 TEST_SRV_CRT_RSA_SHA1_PEM +#define TEST_SRV_KEY_EC TEST_SRV_KEY_EC_PEM +#define TEST_SRV_PWD_EC "" +#define TEST_SRV_CRT_EC TEST_SRV_CRT_EC_PEM + +/* PEM encoded test client certificates and keys */ + +#define TEST_CLI_KEY_RSA TEST_CLI_KEY_RSA_PEM +#define TEST_CLI_PWD_RSA "" +#define TEST_CLI_CRT_RSA TEST_CLI_CRT_RSA_PEM +#define TEST_CLI_KEY_EC TEST_CLI_KEY_EC_PEM +#define TEST_CLI_PWD_EC "" +#define TEST_CLI_CRT_EC TEST_CLI_CRT_EC_PEM + +#else /* MBEDTLS_PEM_PARSE_C */ + +/* DER encoded test CA certificates and keys */ + +#define TEST_CA_KEY_RSA TEST_CA_KEY_RSA_DER +#define TEST_CA_PWD_RSA "" +#define TEST_CA_CRT_RSA_SHA256 TEST_CA_CRT_RSA_SHA256_DER +#define TEST_CA_CRT_RSA_SHA1 TEST_CA_CRT_RSA_SHA1_DER +#define TEST_CA_KEY_EC TEST_CA_KEY_EC_DER +#define TEST_CA_PWD_EC "" +#define TEST_CA_CRT_EC TEST_CA_CRT_EC_DER + +/* DER encoded test server certificates and keys */ + +#define TEST_SRV_KEY_RSA TEST_SRV_KEY_RSA_DER +#define TEST_SRV_PWD_RSA "" +#define TEST_SRV_CRT_RSA_SHA256 TEST_SRV_CRT_RSA_SHA256_DER +#define TEST_SRV_CRT_RSA_SHA1 TEST_SRV_CRT_RSA_SHA1_DER +#define TEST_SRV_KEY_EC TEST_SRV_KEY_EC_DER +#define TEST_SRV_PWD_EC "" +#define TEST_SRV_CRT_EC TEST_SRV_CRT_EC_DER + +/* DER encoded test client certificates and keys */ + +#define TEST_CLI_KEY_RSA TEST_CLI_KEY_RSA_DER +#define TEST_CLI_PWD_RSA "" +#define TEST_CLI_CRT_RSA TEST_CLI_CRT_RSA_DER +#define TEST_CLI_KEY_EC TEST_CLI_KEY_EC_DER +#define TEST_CLI_PWD_EC "" +#define TEST_CLI_CRT_EC TEST_CLI_CRT_EC_DER + +#endif /* MBEDTLS_PEM_PARSE_C */ + +const char mbedtls_test_ca_key_rsa[] = TEST_CA_KEY_RSA; +const char mbedtls_test_ca_pwd_rsa[] = TEST_CA_PWD_RSA; +const char mbedtls_test_ca_crt_rsa_sha256[] = TEST_CA_CRT_RSA_SHA256; +const char mbedtls_test_ca_crt_rsa_sha1[] = TEST_CA_CRT_RSA_SHA1; +const char mbedtls_test_ca_key_ec[] = TEST_CA_KEY_EC; +const char mbedtls_test_ca_pwd_ec[] = TEST_CA_PWD_EC; +const char mbedtls_test_ca_crt_ec[] = TEST_CA_CRT_EC; + +const char mbedtls_test_srv_key_rsa[] = TEST_SRV_KEY_RSA; +const char mbedtls_test_srv_pwd_rsa[] = TEST_SRV_PWD_RSA; +const char mbedtls_test_srv_crt_rsa_sha256[] = TEST_SRV_CRT_RSA_SHA256; +const char mbedtls_test_srv_crt_rsa_sha1[] = TEST_SRV_CRT_RSA_SHA1; +const char mbedtls_test_srv_key_ec[] = TEST_SRV_KEY_EC; +const char mbedtls_test_srv_pwd_ec[] = TEST_SRV_PWD_EC; +const char mbedtls_test_srv_crt_ec[] = TEST_SRV_CRT_EC; + +const char mbedtls_test_cli_key_rsa[] = TEST_CLI_KEY_RSA; +const char mbedtls_test_cli_pwd_rsa[] = TEST_CLI_PWD_RSA; +const char mbedtls_test_cli_crt_rsa[] = TEST_CLI_CRT_RSA; +const char mbedtls_test_cli_key_ec[] = TEST_CLI_KEY_EC; +const char mbedtls_test_cli_pwd_ec[] = TEST_CLI_PWD_EC; +const char mbedtls_test_cli_crt_ec[] = TEST_CLI_CRT_EC; + +const size_t mbedtls_test_ca_key_rsa_len = + sizeof(mbedtls_test_ca_key_rsa); +const size_t mbedtls_test_ca_pwd_rsa_len = + sizeof(mbedtls_test_ca_pwd_rsa) - 1; +const size_t mbedtls_test_ca_crt_rsa_sha256_len = + sizeof(mbedtls_test_ca_crt_rsa_sha256); +const size_t mbedtls_test_ca_crt_rsa_sha1_len = + sizeof(mbedtls_test_ca_crt_rsa_sha1); +const size_t mbedtls_test_ca_key_ec_len = + sizeof(mbedtls_test_ca_key_ec); +const size_t mbedtls_test_ca_pwd_ec_len = + sizeof(mbedtls_test_ca_pwd_ec) - 1; +const size_t mbedtls_test_ca_crt_ec_len = + sizeof(mbedtls_test_ca_crt_ec); + +const size_t mbedtls_test_srv_key_rsa_len = + sizeof(mbedtls_test_srv_key_rsa); +const size_t mbedtls_test_srv_pwd_rsa_len = + sizeof(mbedtls_test_srv_pwd_rsa) -1; +const size_t mbedtls_test_srv_crt_rsa_sha256_len = + sizeof(mbedtls_test_srv_crt_rsa_sha256); +const size_t mbedtls_test_srv_crt_rsa_sha1_len = + sizeof(mbedtls_test_srv_crt_rsa_sha1); +const size_t mbedtls_test_srv_key_ec_len = + sizeof(mbedtls_test_srv_key_ec); +const size_t mbedtls_test_srv_pwd_ec_len = + sizeof(mbedtls_test_srv_pwd_ec) - 1; +const size_t mbedtls_test_srv_crt_ec_len = + sizeof(mbedtls_test_srv_crt_ec); + +const size_t mbedtls_test_cli_key_rsa_len = + sizeof(mbedtls_test_cli_key_rsa); +const size_t mbedtls_test_cli_pwd_rsa_len = + sizeof(mbedtls_test_cli_pwd_rsa) - 1; +const size_t mbedtls_test_cli_crt_rsa_len = + sizeof(mbedtls_test_cli_crt_rsa); +const size_t mbedtls_test_cli_key_ec_len = + sizeof(mbedtls_test_cli_key_ec); +const size_t mbedtls_test_cli_pwd_ec_len = + sizeof(mbedtls_test_cli_pwd_ec) - 1; +const size_t mbedtls_test_cli_crt_ec_len = + sizeof(mbedtls_test_cli_crt_ec); + +/* + * Dispatch between SHA-1 and SHA-256 + */ + +#if defined(MBEDTLS_SHA256_C) +#define TEST_CA_CRT_RSA TEST_CA_CRT_RSA_SHA256 +#define TEST_SRV_CRT_RSA TEST_SRV_CRT_RSA_SHA256 +#else +#define TEST_CA_CRT_RSA TEST_CA_CRT_RSA_SHA1 +#define TEST_SRV_CRT_RSA TEST_SRV_CRT_RSA_SHA1 +#endif /* MBEDTLS_SHA256_C */ + +const char mbedtls_test_ca_crt_rsa[] = TEST_CA_CRT_RSA; +const char mbedtls_test_srv_crt_rsa[] = TEST_SRV_CRT_RSA; + +const size_t mbedtls_test_ca_crt_rsa_len = + sizeof(mbedtls_test_ca_crt_rsa); +const size_t mbedtls_test_srv_crt_rsa_len = + sizeof(mbedtls_test_srv_crt_rsa); + +/* + * Dispatch between RSA and EC + */ + +#if defined(MBEDTLS_RSA_C) + +#define TEST_CA_KEY TEST_CA_KEY_RSA +#define TEST_CA_PWD TEST_CA_PWD_RSA +#define TEST_CA_CRT TEST_CA_CRT_RSA + +#define TEST_SRV_KEY TEST_SRV_KEY_RSA +#define TEST_SRV_PWD TEST_SRV_PWD_RSA +#define TEST_SRV_CRT TEST_SRV_CRT_RSA + +#define TEST_CLI_KEY TEST_CLI_KEY_RSA +#define TEST_CLI_PWD TEST_CLI_PWD_RSA +#define TEST_CLI_CRT TEST_CLI_CRT_RSA + +#else /* no RSA, so assume ECDSA */ + +#define TEST_CA_KEY TEST_CA_KEY_EC +#define TEST_CA_PWD TEST_CA_PWD_EC +#define TEST_CA_CRT TEST_CA_CRT_EC + +#define TEST_SRV_KEY TEST_SRV_KEY_EC +#define TEST_SRV_PWD TEST_SRV_PWD_EC +#define TEST_SRV_CRT TEST_SRV_CRT_EC + +#define TEST_CLI_KEY TEST_CLI_KEY_EC +#define TEST_CLI_PWD TEST_CLI_PWD_EC +#define TEST_CLI_CRT TEST_CLI_CRT_EC +#endif /* MBEDTLS_RSA_C */ + +/* API stability forces us to declare + * mbedtls_test_{ca|srv|cli}_{key|pwd|crt} + * as pointers. */ +static const char test_ca_key[] = TEST_CA_KEY; +static const char test_ca_pwd[] = TEST_CA_PWD; +static const char test_ca_crt[] = TEST_CA_CRT; + +static const char test_srv_key[] = TEST_SRV_KEY; +static const char test_srv_pwd[] = TEST_SRV_PWD; +static const char test_srv_crt[] = TEST_SRV_CRT; + +static const char test_cli_key[] = TEST_CLI_KEY; +static const char test_cli_pwd[] = TEST_CLI_PWD; +static const char test_cli_crt[] = TEST_CLI_CRT; + +const char *mbedtls_test_ca_key = test_ca_key; +const char *mbedtls_test_ca_pwd = test_ca_pwd; +const char *mbedtls_test_ca_crt = test_ca_crt; + +const char *mbedtls_test_srv_key = test_srv_key; +const char *mbedtls_test_srv_pwd = test_srv_pwd; +const char *mbedtls_test_srv_crt = test_srv_crt; + +const char *mbedtls_test_cli_key = test_cli_key; +const char *mbedtls_test_cli_pwd = test_cli_pwd; +const char *mbedtls_test_cli_crt = test_cli_crt; + +const size_t mbedtls_test_ca_key_len = + sizeof(test_ca_key); +const size_t mbedtls_test_ca_pwd_len = + sizeof(test_ca_pwd) - 1; +const size_t mbedtls_test_ca_crt_len = + sizeof(test_ca_crt); + +const size_t mbedtls_test_srv_key_len = + sizeof(test_srv_key); +const size_t mbedtls_test_srv_pwd_len = + sizeof(test_srv_pwd) - 1; +const size_t mbedtls_test_srv_crt_len = + sizeof(test_srv_crt); + +const size_t mbedtls_test_cli_key_len = + sizeof(test_cli_key); +const size_t mbedtls_test_cli_pwd_len = + sizeof(test_cli_pwd) - 1; +const size_t mbedtls_test_cli_crt_len = + sizeof(test_cli_crt); + +/* + * + * Lists of certificates + * + */ + +/* List of CAs in PEM or DER, depending on config */ +const char *mbedtls_test_cas[] = { +#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA1_C) + mbedtls_test_ca_crt_rsa_sha1, +#endif +#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA256_C) + mbedtls_test_ca_crt_rsa_sha256, +#endif +#if defined(MBEDTLS_ECDSA_C) + mbedtls_test_ca_crt_ec, +#endif + NULL +}; +const size_t mbedtls_test_cas_len[] = { +#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA1_C) + sizeof(mbedtls_test_ca_crt_rsa_sha1), +#endif +#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA256_C) + sizeof(mbedtls_test_ca_crt_rsa_sha256), +#endif +#if defined(MBEDTLS_ECDSA_C) + sizeof(mbedtls_test_ca_crt_ec), +#endif + 0 +}; + +/* List of all available CA certificates in DER format */ +const unsigned char *mbedtls_test_cas_der[] = { +#if defined(MBEDTLS_RSA_C) +#if defined(MBEDTLS_SHA256_C) + mbedtls_test_ca_crt_rsa_sha256_der, +#endif /* MBEDTLS_SHA256_C */ +#if defined(MBEDTLS_SHA1_C) + mbedtls_test_ca_crt_rsa_sha1_der, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_RSA_C */ +#if defined(MBEDTLS_ECDSA_C) + mbedtls_test_ca_crt_ec_der, +#endif /* MBEDTLS_ECDSA_C */ + NULL +}; + +const size_t mbedtls_test_cas_der_len[] = { +#if defined(MBEDTLS_RSA_C) +#if defined(MBEDTLS_SHA256_C) + sizeof(mbedtls_test_ca_crt_rsa_sha256_der), +#endif /* MBEDTLS_SHA256_C */ +#if defined(MBEDTLS_SHA1_C) + sizeof(mbedtls_test_ca_crt_rsa_sha1_der), +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_RSA_C */ +#if defined(MBEDTLS_ECDSA_C) + sizeof(mbedtls_test_ca_crt_ec_der), +#endif /* MBEDTLS_ECDSA_C */ + 0 +}; + +/* Concatenation of all available CA certificates in PEM format */ +#if defined(MBEDTLS_PEM_PARSE_C) +const char mbedtls_test_cas_pem[] = +#if defined(MBEDTLS_RSA_C) +#if defined(MBEDTLS_SHA256_C) + TEST_CA_CRT_RSA_SHA256_PEM +#endif /* MBEDTLS_SHA256_C */ +#if defined(MBEDTLS_SHA1_C) + TEST_CA_CRT_RSA_SHA1_PEM +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_RSA_C */ +#if defined(MBEDTLS_ECDSA_C) + TEST_CA_CRT_EC_PEM +#endif /* MBEDTLS_ECDSA_C */ + ""; +const size_t mbedtls_test_cas_pem_len = sizeof(mbedtls_test_cas_pem); +#endif /* MBEDTLS_PEM_PARSE_C */ + +#endif /* MBEDTLS_CERTS_C */ diff --git a/ext/opcua_client/mbedtls/library/chacha20.c b/ext/opcua_client/mbedtls/library/chacha20.c new file mode 100644 index 0000000..82b7b1d --- /dev/null +++ b/ext/opcua_client/mbedtls/library/chacha20.c @@ -0,0 +1,532 @@ +/** + * \file chacha20.c + * + * \brief ChaCha20 cipher. + * + * \author Daniel King + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_CHACHA20_C) + +#include "mbedtls/chacha20.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_CHACHA20_ALT) + +/* Parameter validation macros */ +#define CHACHA20_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA) +#define CHACHA20_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +#define ROTL32(value, amount) \ + ((uint32_t) ((value) << (amount)) | ((value) >> (32 - (amount)))) + +#define CHACHA20_CTR_INDEX (12U) + +#define CHACHA20_BLOCK_SIZE_BYTES (4U * 16U) + +/** + * \brief ChaCha20 quarter round operation. + * + * The quarter round is defined as follows (from RFC 7539): + * 1. a += b; d ^= a; d <<<= 16; + * 2. c += d; b ^= c; b <<<= 12; + * 3. a += b; d ^= a; d <<<= 8; + * 4. c += d; b ^= c; b <<<= 7; + * + * \param state ChaCha20 state to modify. + * \param a The index of 'a' in the state. + * \param b The index of 'b' in the state. + * \param c The index of 'c' in the state. + * \param d The index of 'd' in the state. + */ +static inline void chacha20_quarter_round(uint32_t state[16], + size_t a, + size_t b, + size_t c, + size_t d) +{ + /* a += b; d ^= a; d <<<= 16; */ + state[a] += state[b]; + state[d] ^= state[a]; + state[d] = ROTL32(state[d], 16); + + /* c += d; b ^= c; b <<<= 12 */ + state[c] += state[d]; + state[b] ^= state[c]; + state[b] = ROTL32(state[b], 12); + + /* a += b; d ^= a; d <<<= 8; */ + state[a] += state[b]; + state[d] ^= state[a]; + state[d] = ROTL32(state[d], 8); + + /* c += d; b ^= c; b <<<= 7; */ + state[c] += state[d]; + state[b] ^= state[c]; + state[b] = ROTL32(state[b], 7); +} + +/** + * \brief Perform the ChaCha20 inner block operation. + * + * This function performs two rounds: the column round and the + * diagonal round. + * + * \param state The ChaCha20 state to update. + */ +static void chacha20_inner_block(uint32_t state[16]) +{ + chacha20_quarter_round(state, 0, 4, 8, 12); + chacha20_quarter_round(state, 1, 5, 9, 13); + chacha20_quarter_round(state, 2, 6, 10, 14); + chacha20_quarter_round(state, 3, 7, 11, 15); + + chacha20_quarter_round(state, 0, 5, 10, 15); + chacha20_quarter_round(state, 1, 6, 11, 12); + chacha20_quarter_round(state, 2, 7, 8, 13); + chacha20_quarter_round(state, 3, 4, 9, 14); +} + +/** + * \brief Generates a keystream block. + * + * \param initial_state The initial ChaCha20 state (key, nonce, counter). + * \param keystream Generated keystream bytes are written to this buffer. + */ +static void chacha20_block(const uint32_t initial_state[16], + unsigned char keystream[64]) +{ + uint32_t working_state[16]; + size_t i; + + memcpy(working_state, + initial_state, + CHACHA20_BLOCK_SIZE_BYTES); + + for (i = 0U; i < 10U; i++) { + chacha20_inner_block(working_state); + } + + working_state[0] += initial_state[0]; + working_state[1] += initial_state[1]; + working_state[2] += initial_state[2]; + working_state[3] += initial_state[3]; + working_state[4] += initial_state[4]; + working_state[5] += initial_state[5]; + working_state[6] += initial_state[6]; + working_state[7] += initial_state[7]; + working_state[8] += initial_state[8]; + working_state[9] += initial_state[9]; + working_state[10] += initial_state[10]; + working_state[11] += initial_state[11]; + working_state[12] += initial_state[12]; + working_state[13] += initial_state[13]; + working_state[14] += initial_state[14]; + working_state[15] += initial_state[15]; + + for (i = 0U; i < 16; i++) { + size_t offset = i * 4U; + + MBEDTLS_PUT_UINT32_LE(working_state[i], keystream, offset); + } + + mbedtls_platform_zeroize(working_state, sizeof(working_state)); +} + +void mbedtls_chacha20_init(mbedtls_chacha20_context *ctx) +{ + CHACHA20_VALIDATE(ctx != NULL); + + mbedtls_platform_zeroize(ctx->state, sizeof(ctx->state)); + mbedtls_platform_zeroize(ctx->keystream8, sizeof(ctx->keystream8)); + + /* Initially, there's no keystream bytes available */ + ctx->keystream_bytes_used = CHACHA20_BLOCK_SIZE_BYTES; +} + +void mbedtls_chacha20_free(mbedtls_chacha20_context *ctx) +{ + if (ctx != NULL) { + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_chacha20_context)); + } +} + +int mbedtls_chacha20_setkey(mbedtls_chacha20_context *ctx, + const unsigned char key[32]) +{ + CHACHA20_VALIDATE_RET(ctx != NULL); + CHACHA20_VALIDATE_RET(key != NULL); + + /* ChaCha20 constants - the string "expand 32-byte k" */ + ctx->state[0] = 0x61707865; + ctx->state[1] = 0x3320646e; + ctx->state[2] = 0x79622d32; + ctx->state[3] = 0x6b206574; + + /* Set key */ + ctx->state[4] = MBEDTLS_GET_UINT32_LE(key, 0); + ctx->state[5] = MBEDTLS_GET_UINT32_LE(key, 4); + ctx->state[6] = MBEDTLS_GET_UINT32_LE(key, 8); + ctx->state[7] = MBEDTLS_GET_UINT32_LE(key, 12); + ctx->state[8] = MBEDTLS_GET_UINT32_LE(key, 16); + ctx->state[9] = MBEDTLS_GET_UINT32_LE(key, 20); + ctx->state[10] = MBEDTLS_GET_UINT32_LE(key, 24); + ctx->state[11] = MBEDTLS_GET_UINT32_LE(key, 28); + + return 0; +} + +int mbedtls_chacha20_starts(mbedtls_chacha20_context *ctx, + const unsigned char nonce[12], + uint32_t counter) +{ + CHACHA20_VALIDATE_RET(ctx != NULL); + CHACHA20_VALIDATE_RET(nonce != NULL); + + /* Counter */ + ctx->state[12] = counter; + + /* Nonce */ + ctx->state[13] = MBEDTLS_GET_UINT32_LE(nonce, 0); + ctx->state[14] = MBEDTLS_GET_UINT32_LE(nonce, 4); + ctx->state[15] = MBEDTLS_GET_UINT32_LE(nonce, 8); + + mbedtls_platform_zeroize(ctx->keystream8, sizeof(ctx->keystream8)); + + /* Initially, there's no keystream bytes available */ + ctx->keystream_bytes_used = CHACHA20_BLOCK_SIZE_BYTES; + + return 0; +} + +int mbedtls_chacha20_update(mbedtls_chacha20_context *ctx, + size_t size, + const unsigned char *input, + unsigned char *output) +{ + size_t offset = 0U; + size_t i; + + CHACHA20_VALIDATE_RET(ctx != NULL); + CHACHA20_VALIDATE_RET(size == 0 || input != NULL); + CHACHA20_VALIDATE_RET(size == 0 || output != NULL); + + /* Use leftover keystream bytes, if available */ + while (size > 0U && ctx->keystream_bytes_used < CHACHA20_BLOCK_SIZE_BYTES) { + output[offset] = input[offset] + ^ ctx->keystream8[ctx->keystream_bytes_used]; + + ctx->keystream_bytes_used++; + offset++; + size--; + } + + /* Process full blocks */ + while (size >= CHACHA20_BLOCK_SIZE_BYTES) { + /* Generate new keystream block and increment counter */ + chacha20_block(ctx->state, ctx->keystream8); + ctx->state[CHACHA20_CTR_INDEX]++; + + for (i = 0U; i < 64U; i += 8U) { + output[offset + i] = input[offset + i] ^ ctx->keystream8[i]; + output[offset + i+1] = input[offset + i+1] ^ ctx->keystream8[i+1]; + output[offset + i+2] = input[offset + i+2] ^ ctx->keystream8[i+2]; + output[offset + i+3] = input[offset + i+3] ^ ctx->keystream8[i+3]; + output[offset + i+4] = input[offset + i+4] ^ ctx->keystream8[i+4]; + output[offset + i+5] = input[offset + i+5] ^ ctx->keystream8[i+5]; + output[offset + i+6] = input[offset + i+6] ^ ctx->keystream8[i+6]; + output[offset + i+7] = input[offset + i+7] ^ ctx->keystream8[i+7]; + } + + offset += CHACHA20_BLOCK_SIZE_BYTES; + size -= CHACHA20_BLOCK_SIZE_BYTES; + } + + /* Last (partial) block */ + if (size > 0U) { + /* Generate new keystream block and increment counter */ + chacha20_block(ctx->state, ctx->keystream8); + ctx->state[CHACHA20_CTR_INDEX]++; + + for (i = 0U; i < size; i++) { + output[offset + i] = input[offset + i] ^ ctx->keystream8[i]; + } + + ctx->keystream_bytes_used = size; + + } + + return 0; +} + +int mbedtls_chacha20_crypt(const unsigned char key[32], + const unsigned char nonce[12], + uint32_t counter, + size_t data_len, + const unsigned char *input, + unsigned char *output) +{ + mbedtls_chacha20_context ctx; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + CHACHA20_VALIDATE_RET(key != NULL); + CHACHA20_VALIDATE_RET(nonce != NULL); + CHACHA20_VALIDATE_RET(data_len == 0 || input != NULL); + CHACHA20_VALIDATE_RET(data_len == 0 || output != NULL); + + mbedtls_chacha20_init(&ctx); + + ret = mbedtls_chacha20_setkey(&ctx, key); + if (ret != 0) { + goto cleanup; + } + + ret = mbedtls_chacha20_starts(&ctx, nonce, counter); + if (ret != 0) { + goto cleanup; + } + + ret = mbedtls_chacha20_update(&ctx, data_len, input, output); + +cleanup: + mbedtls_chacha20_free(&ctx); + return ret; +} + +#endif /* !MBEDTLS_CHACHA20_ALT */ + +#if defined(MBEDTLS_SELF_TEST) + +static const unsigned char test_keys[2][32] = +{ + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 + } +}; + +static const unsigned char test_nonces[2][12] = +{ + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02 + } +}; + +static const uint32_t test_counters[2] = +{ + 0U, + 1U +}; + +static const unsigned char test_input[2][375] = +{ + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }, + { + 0x41, 0x6e, 0x79, 0x20, 0x73, 0x75, 0x62, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x45, + 0x54, 0x46, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x72, + 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x6e, 0x20, 0x49, 0x45, 0x54, 0x46, + 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, + 0x74, 0x2d, 0x44, 0x72, 0x61, 0x66, 0x74, 0x20, + 0x6f, 0x72, 0x20, 0x52, 0x46, 0x43, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x49, + 0x45, 0x54, 0x46, 0x20, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, + 0x65, 0x64, 0x20, 0x61, 0x6e, 0x20, 0x22, 0x49, + 0x45, 0x54, 0x46, 0x20, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x2e, 0x20, 0x53, 0x75, 0x63, 0x68, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x20, 0x6f, 0x72, 0x61, 0x6c, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x45, + 0x54, 0x46, 0x20, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x20, + 0x77, 0x65, 0x6c, 0x6c, 0x20, 0x61, 0x73, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x63, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, + 0x64, 0x65, 0x20, 0x61, 0x74, 0x20, 0x61, 0x6e, + 0x79, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2c, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f + } +}; + +static const unsigned char test_output[2][375] = +{ + { + 0x76, 0xb8, 0xe0, 0xad, 0xa0, 0xf1, 0x3d, 0x90, + 0x40, 0x5d, 0x6a, 0xe5, 0x53, 0x86, 0xbd, 0x28, + 0xbd, 0xd2, 0x19, 0xb8, 0xa0, 0x8d, 0xed, 0x1a, + 0xa8, 0x36, 0xef, 0xcc, 0x8b, 0x77, 0x0d, 0xc7, + 0xda, 0x41, 0x59, 0x7c, 0x51, 0x57, 0x48, 0x8d, + 0x77, 0x24, 0xe0, 0x3f, 0xb8, 0xd8, 0x4a, 0x37, + 0x6a, 0x43, 0xb8, 0xf4, 0x15, 0x18, 0xa1, 0x1c, + 0xc3, 0x87, 0xb6, 0x69, 0xb2, 0xee, 0x65, 0x86 + }, + { + 0xa3, 0xfb, 0xf0, 0x7d, 0xf3, 0xfa, 0x2f, 0xde, + 0x4f, 0x37, 0x6c, 0xa2, 0x3e, 0x82, 0x73, 0x70, + 0x41, 0x60, 0x5d, 0x9f, 0x4f, 0x4f, 0x57, 0xbd, + 0x8c, 0xff, 0x2c, 0x1d, 0x4b, 0x79, 0x55, 0xec, + 0x2a, 0x97, 0x94, 0x8b, 0xd3, 0x72, 0x29, 0x15, + 0xc8, 0xf3, 0xd3, 0x37, 0xf7, 0xd3, 0x70, 0x05, + 0x0e, 0x9e, 0x96, 0xd6, 0x47, 0xb7, 0xc3, 0x9f, + 0x56, 0xe0, 0x31, 0xca, 0x5e, 0xb6, 0x25, 0x0d, + 0x40, 0x42, 0xe0, 0x27, 0x85, 0xec, 0xec, 0xfa, + 0x4b, 0x4b, 0xb5, 0xe8, 0xea, 0xd0, 0x44, 0x0e, + 0x20, 0xb6, 0xe8, 0xdb, 0x09, 0xd8, 0x81, 0xa7, + 0xc6, 0x13, 0x2f, 0x42, 0x0e, 0x52, 0x79, 0x50, + 0x42, 0xbd, 0xfa, 0x77, 0x73, 0xd8, 0xa9, 0x05, + 0x14, 0x47, 0xb3, 0x29, 0x1c, 0xe1, 0x41, 0x1c, + 0x68, 0x04, 0x65, 0x55, 0x2a, 0xa6, 0xc4, 0x05, + 0xb7, 0x76, 0x4d, 0x5e, 0x87, 0xbe, 0xa8, 0x5a, + 0xd0, 0x0f, 0x84, 0x49, 0xed, 0x8f, 0x72, 0xd0, + 0xd6, 0x62, 0xab, 0x05, 0x26, 0x91, 0xca, 0x66, + 0x42, 0x4b, 0xc8, 0x6d, 0x2d, 0xf8, 0x0e, 0xa4, + 0x1f, 0x43, 0xab, 0xf9, 0x37, 0xd3, 0x25, 0x9d, + 0xc4, 0xb2, 0xd0, 0xdf, 0xb4, 0x8a, 0x6c, 0x91, + 0x39, 0xdd, 0xd7, 0xf7, 0x69, 0x66, 0xe9, 0x28, + 0xe6, 0x35, 0x55, 0x3b, 0xa7, 0x6c, 0x5c, 0x87, + 0x9d, 0x7b, 0x35, 0xd4, 0x9e, 0xb2, 0xe6, 0x2b, + 0x08, 0x71, 0xcd, 0xac, 0x63, 0x89, 0x39, 0xe2, + 0x5e, 0x8a, 0x1e, 0x0e, 0xf9, 0xd5, 0x28, 0x0f, + 0xa8, 0xca, 0x32, 0x8b, 0x35, 0x1c, 0x3c, 0x76, + 0x59, 0x89, 0xcb, 0xcf, 0x3d, 0xaa, 0x8b, 0x6c, + 0xcc, 0x3a, 0xaf, 0x9f, 0x39, 0x79, 0xc9, 0x2b, + 0x37, 0x20, 0xfc, 0x88, 0xdc, 0x95, 0xed, 0x84, + 0xa1, 0xbe, 0x05, 0x9c, 0x64, 0x99, 0xb9, 0xfd, + 0xa2, 0x36, 0xe7, 0xe8, 0x18, 0xb0, 0x4b, 0x0b, + 0xc3, 0x9c, 0x1e, 0x87, 0x6b, 0x19, 0x3b, 0xfe, + 0x55, 0x69, 0x75, 0x3f, 0x88, 0x12, 0x8c, 0xc0, + 0x8a, 0xaa, 0x9b, 0x63, 0xd1, 0xa1, 0x6f, 0x80, + 0xef, 0x25, 0x54, 0xd7, 0x18, 0x9c, 0x41, 0x1f, + 0x58, 0x69, 0xca, 0x52, 0xc5, 0xb8, 0x3f, 0xa3, + 0x6f, 0xf2, 0x16, 0xb9, 0xc1, 0xd3, 0x00, 0x62, + 0xbe, 0xbc, 0xfd, 0x2d, 0xc5, 0xbc, 0xe0, 0x91, + 0x19, 0x34, 0xfd, 0xa7, 0x9a, 0x86, 0xf6, 0xe6, + 0x98, 0xce, 0xd7, 0x59, 0xc3, 0xff, 0x9b, 0x64, + 0x77, 0x33, 0x8f, 0x3d, 0xa4, 0xf9, 0xcd, 0x85, + 0x14, 0xea, 0x99, 0x82, 0xcc, 0xaf, 0xb3, 0x41, + 0xb2, 0x38, 0x4d, 0xd9, 0x02, 0xf3, 0xd1, 0xab, + 0x7a, 0xc6, 0x1d, 0xd2, 0x9c, 0x6f, 0x21, 0xba, + 0x5b, 0x86, 0x2f, 0x37, 0x30, 0xe3, 0x7c, 0xfd, + 0xc4, 0xfd, 0x80, 0x6c, 0x22, 0xf2, 0x21 + } +}; + +static const size_t test_lengths[2] = +{ + 64U, + 375U +}; + +/* Make sure no other definition is already present. */ +#undef ASSERT + +#define ASSERT(cond, args) \ + do \ + { \ + if (!(cond)) \ + { \ + if (verbose != 0) \ + mbedtls_printf args; \ + \ + return -1; \ + } \ + } \ + while (0) + +int mbedtls_chacha20_self_test(int verbose) +{ + unsigned char output[381]; + unsigned i; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + for (i = 0U; i < 2U; i++) { + if (verbose != 0) { + mbedtls_printf(" ChaCha20 test %u ", i); + } + + ret = mbedtls_chacha20_crypt(test_keys[i], + test_nonces[i], + test_counters[i], + test_lengths[i], + test_input[i], + output); + + ASSERT(0 == ret, ("error code: %i\n", ret)); + + ASSERT(0 == memcmp(output, test_output[i], test_lengths[i]), + ("failed (output)\n")); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return 0; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* !MBEDTLS_CHACHA20_C */ diff --git a/ext/opcua_client/mbedtls/library/chachapoly.c b/ext/opcua_client/mbedtls/library/chachapoly.c new file mode 100644 index 0000000..dd678f4 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/chachapoly.c @@ -0,0 +1,511 @@ +/** + * \file chachapoly.c + * + * \brief ChaCha20-Poly1305 AEAD construction based on RFC 7539. + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#include "common.h" + +#if defined(MBEDTLS_CHACHAPOLY_C) + +#include "mbedtls/chachapoly.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" +#include "mbedtls/constant_time.h" + +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_CHACHAPOLY_ALT) + +/* Parameter validation macros */ +#define CHACHAPOLY_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA) +#define CHACHAPOLY_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +#define CHACHAPOLY_STATE_INIT (0) +#define CHACHAPOLY_STATE_AAD (1) +#define CHACHAPOLY_STATE_CIPHERTEXT (2) /* Encrypting or decrypting */ +#define CHACHAPOLY_STATE_FINISHED (3) + +/** + * \brief Adds nul bytes to pad the AAD for Poly1305. + * + * \param ctx The ChaCha20-Poly1305 context. + */ +static int chachapoly_pad_aad(mbedtls_chachapoly_context *ctx) +{ + uint32_t partial_block_len = (uint32_t) (ctx->aad_len % 16U); + unsigned char zeroes[15]; + + if (partial_block_len == 0U) { + return 0; + } + + memset(zeroes, 0, sizeof(zeroes)); + + return mbedtls_poly1305_update(&ctx->poly1305_ctx, + zeroes, + 16U - partial_block_len); +} + +/** + * \brief Adds nul bytes to pad the ciphertext for Poly1305. + * + * \param ctx The ChaCha20-Poly1305 context. + */ +static int chachapoly_pad_ciphertext(mbedtls_chachapoly_context *ctx) +{ + uint32_t partial_block_len = (uint32_t) (ctx->ciphertext_len % 16U); + unsigned char zeroes[15]; + + if (partial_block_len == 0U) { + return 0; + } + + memset(zeroes, 0, sizeof(zeroes)); + return mbedtls_poly1305_update(&ctx->poly1305_ctx, + zeroes, + 16U - partial_block_len); +} + +void mbedtls_chachapoly_init(mbedtls_chachapoly_context *ctx) +{ + CHACHAPOLY_VALIDATE(ctx != NULL); + + mbedtls_chacha20_init(&ctx->chacha20_ctx); + mbedtls_poly1305_init(&ctx->poly1305_ctx); + ctx->aad_len = 0U; + ctx->ciphertext_len = 0U; + ctx->state = CHACHAPOLY_STATE_INIT; + ctx->mode = MBEDTLS_CHACHAPOLY_ENCRYPT; +} + +void mbedtls_chachapoly_free(mbedtls_chachapoly_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_chacha20_free(&ctx->chacha20_ctx); + mbedtls_poly1305_free(&ctx->poly1305_ctx); + ctx->aad_len = 0U; + ctx->ciphertext_len = 0U; + ctx->state = CHACHAPOLY_STATE_INIT; + ctx->mode = MBEDTLS_CHACHAPOLY_ENCRYPT; +} + +int mbedtls_chachapoly_setkey(mbedtls_chachapoly_context *ctx, + const unsigned char key[32]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + CHACHAPOLY_VALIDATE_RET(ctx != NULL); + CHACHAPOLY_VALIDATE_RET(key != NULL); + + ret = mbedtls_chacha20_setkey(&ctx->chacha20_ctx, key); + + return ret; +} + +int mbedtls_chachapoly_starts(mbedtls_chachapoly_context *ctx, + const unsigned char nonce[12], + mbedtls_chachapoly_mode_t mode) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char poly1305_key[64]; + CHACHAPOLY_VALIDATE_RET(ctx != NULL); + CHACHAPOLY_VALIDATE_RET(nonce != NULL); + + /* Set counter = 0, will be update to 1 when generating Poly1305 key */ + ret = mbedtls_chacha20_starts(&ctx->chacha20_ctx, nonce, 0U); + if (ret != 0) { + goto cleanup; + } + + /* Generate the Poly1305 key by getting the ChaCha20 keystream output with + * counter = 0. This is the same as encrypting a buffer of zeroes. + * Only the first 256-bits (32 bytes) of the key is used for Poly1305. + * The other 256 bits are discarded. + */ + memset(poly1305_key, 0, sizeof(poly1305_key)); + ret = mbedtls_chacha20_update(&ctx->chacha20_ctx, sizeof(poly1305_key), + poly1305_key, poly1305_key); + if (ret != 0) { + goto cleanup; + } + + ret = mbedtls_poly1305_starts(&ctx->poly1305_ctx, poly1305_key); + + if (ret == 0) { + ctx->aad_len = 0U; + ctx->ciphertext_len = 0U; + ctx->state = CHACHAPOLY_STATE_AAD; + ctx->mode = mode; + } + +cleanup: + mbedtls_platform_zeroize(poly1305_key, 64U); + return ret; +} + +int mbedtls_chachapoly_update_aad(mbedtls_chachapoly_context *ctx, + const unsigned char *aad, + size_t aad_len) +{ + CHACHAPOLY_VALIDATE_RET(ctx != NULL); + CHACHAPOLY_VALIDATE_RET(aad_len == 0 || aad != NULL); + + if (ctx->state != CHACHAPOLY_STATE_AAD) { + return MBEDTLS_ERR_CHACHAPOLY_BAD_STATE; + } + + ctx->aad_len += aad_len; + + return mbedtls_poly1305_update(&ctx->poly1305_ctx, aad, aad_len); +} + +int mbedtls_chachapoly_update(mbedtls_chachapoly_context *ctx, + size_t len, + const unsigned char *input, + unsigned char *output) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + CHACHAPOLY_VALIDATE_RET(ctx != NULL); + CHACHAPOLY_VALIDATE_RET(len == 0 || input != NULL); + CHACHAPOLY_VALIDATE_RET(len == 0 || output != NULL); + + if ((ctx->state != CHACHAPOLY_STATE_AAD) && + (ctx->state != CHACHAPOLY_STATE_CIPHERTEXT)) { + return MBEDTLS_ERR_CHACHAPOLY_BAD_STATE; + } + + if (ctx->state == CHACHAPOLY_STATE_AAD) { + ctx->state = CHACHAPOLY_STATE_CIPHERTEXT; + + ret = chachapoly_pad_aad(ctx); + if (ret != 0) { + return ret; + } + } + + ctx->ciphertext_len += len; + + if (ctx->mode == MBEDTLS_CHACHAPOLY_ENCRYPT) { + ret = mbedtls_chacha20_update(&ctx->chacha20_ctx, len, input, output); + if (ret != 0) { + return ret; + } + + ret = mbedtls_poly1305_update(&ctx->poly1305_ctx, output, len); + if (ret != 0) { + return ret; + } + } else { /* DECRYPT */ + ret = mbedtls_poly1305_update(&ctx->poly1305_ctx, input, len); + if (ret != 0) { + return ret; + } + + ret = mbedtls_chacha20_update(&ctx->chacha20_ctx, len, input, output); + if (ret != 0) { + return ret; + } + } + + return 0; +} + +int mbedtls_chachapoly_finish(mbedtls_chachapoly_context *ctx, + unsigned char mac[16]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char len_block[16]; + CHACHAPOLY_VALIDATE_RET(ctx != NULL); + CHACHAPOLY_VALIDATE_RET(mac != NULL); + + if (ctx->state == CHACHAPOLY_STATE_INIT) { + return MBEDTLS_ERR_CHACHAPOLY_BAD_STATE; + } + + if (ctx->state == CHACHAPOLY_STATE_AAD) { + ret = chachapoly_pad_aad(ctx); + if (ret != 0) { + return ret; + } + } else if (ctx->state == CHACHAPOLY_STATE_CIPHERTEXT) { + ret = chachapoly_pad_ciphertext(ctx); + if (ret != 0) { + return ret; + } + } + + ctx->state = CHACHAPOLY_STATE_FINISHED; + + /* The lengths of the AAD and ciphertext are processed by + * Poly1305 as the final 128-bit block, encoded as little-endian integers. + */ + MBEDTLS_PUT_UINT64_LE(ctx->aad_len, len_block, 0); + MBEDTLS_PUT_UINT64_LE(ctx->ciphertext_len, len_block, 8); + + ret = mbedtls_poly1305_update(&ctx->poly1305_ctx, len_block, 16U); + if (ret != 0) { + return ret; + } + + ret = mbedtls_poly1305_finish(&ctx->poly1305_ctx, mac); + + return ret; +} + +static int chachapoly_crypt_and_tag(mbedtls_chachapoly_context *ctx, + mbedtls_chachapoly_mode_t mode, + size_t length, + const unsigned char nonce[12], + const unsigned char *aad, + size_t aad_len, + const unsigned char *input, + unsigned char *output, + unsigned char tag[16]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + ret = mbedtls_chachapoly_starts(ctx, nonce, mode); + if (ret != 0) { + goto cleanup; + } + + ret = mbedtls_chachapoly_update_aad(ctx, aad, aad_len); + if (ret != 0) { + goto cleanup; + } + + ret = mbedtls_chachapoly_update(ctx, length, input, output); + if (ret != 0) { + goto cleanup; + } + + ret = mbedtls_chachapoly_finish(ctx, tag); + +cleanup: + return ret; +} + +int mbedtls_chachapoly_encrypt_and_tag(mbedtls_chachapoly_context *ctx, + size_t length, + const unsigned char nonce[12], + const unsigned char *aad, + size_t aad_len, + const unsigned char *input, + unsigned char *output, + unsigned char tag[16]) +{ + CHACHAPOLY_VALIDATE_RET(ctx != NULL); + CHACHAPOLY_VALIDATE_RET(nonce != NULL); + CHACHAPOLY_VALIDATE_RET(tag != NULL); + CHACHAPOLY_VALIDATE_RET(aad_len == 0 || aad != NULL); + CHACHAPOLY_VALIDATE_RET(length == 0 || input != NULL); + CHACHAPOLY_VALIDATE_RET(length == 0 || output != NULL); + + return chachapoly_crypt_and_tag(ctx, MBEDTLS_CHACHAPOLY_ENCRYPT, + length, nonce, aad, aad_len, + input, output, tag); +} + +int mbedtls_chachapoly_auth_decrypt(mbedtls_chachapoly_context *ctx, + size_t length, + const unsigned char nonce[12], + const unsigned char *aad, + size_t aad_len, + const unsigned char tag[16], + const unsigned char *input, + unsigned char *output) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char check_tag[16]; + int diff; + CHACHAPOLY_VALIDATE_RET(ctx != NULL); + CHACHAPOLY_VALIDATE_RET(nonce != NULL); + CHACHAPOLY_VALIDATE_RET(tag != NULL); + CHACHAPOLY_VALIDATE_RET(aad_len == 0 || aad != NULL); + CHACHAPOLY_VALIDATE_RET(length == 0 || input != NULL); + CHACHAPOLY_VALIDATE_RET(length == 0 || output != NULL); + + if ((ret = chachapoly_crypt_and_tag(ctx, + MBEDTLS_CHACHAPOLY_DECRYPT, length, nonce, + aad, aad_len, input, output, check_tag)) != 0) { + return ret; + } + + /* Check tag in "constant-time" */ + diff = mbedtls_ct_memcmp(tag, check_tag, sizeof(check_tag)); + + if (diff != 0) { + mbedtls_platform_zeroize(output, length); + return MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED; + } + + return 0; +} + +#endif /* MBEDTLS_CHACHAPOLY_ALT */ + +#if defined(MBEDTLS_SELF_TEST) + +static const unsigned char test_key[1][32] = +{ + { + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f + } +}; + +static const unsigned char test_nonce[1][12] = +{ + { + 0x07, 0x00, 0x00, 0x00, /* 32-bit common part */ + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47 /* 64-bit IV */ + } +}; + +static const unsigned char test_aad[1][12] = +{ + { + 0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7 + } +}; + +static const size_t test_aad_len[1] = +{ + 12U +}; + +static const unsigned char test_input[1][114] = +{ + { + 0x4c, 0x61, 0x64, 0x69, 0x65, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x47, 0x65, 0x6e, 0x74, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x27, 0x39, 0x39, + 0x3a, 0x20, 0x49, 0x66, 0x20, 0x49, 0x20, 0x63, + 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6f, + 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x74, 0x69, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, + 0x72, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x6e, 0x73, + 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x77, 0x6f, + 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x69, + 0x74, 0x2e + } +}; + +static const unsigned char test_output[1][114] = +{ + { + 0xd3, 0x1a, 0x8d, 0x34, 0x64, 0x8e, 0x60, 0xdb, + 0x7b, 0x86, 0xaf, 0xbc, 0x53, 0xef, 0x7e, 0xc2, + 0xa4, 0xad, 0xed, 0x51, 0x29, 0x6e, 0x08, 0xfe, + 0xa9, 0xe2, 0xb5, 0xa7, 0x36, 0xee, 0x62, 0xd6, + 0x3d, 0xbe, 0xa4, 0x5e, 0x8c, 0xa9, 0x67, 0x12, + 0x82, 0xfa, 0xfb, 0x69, 0xda, 0x92, 0x72, 0x8b, + 0x1a, 0x71, 0xde, 0x0a, 0x9e, 0x06, 0x0b, 0x29, + 0x05, 0xd6, 0xa5, 0xb6, 0x7e, 0xcd, 0x3b, 0x36, + 0x92, 0xdd, 0xbd, 0x7f, 0x2d, 0x77, 0x8b, 0x8c, + 0x98, 0x03, 0xae, 0xe3, 0x28, 0x09, 0x1b, 0x58, + 0xfa, 0xb3, 0x24, 0xe4, 0xfa, 0xd6, 0x75, 0x94, + 0x55, 0x85, 0x80, 0x8b, 0x48, 0x31, 0xd7, 0xbc, + 0x3f, 0xf4, 0xde, 0xf0, 0x8e, 0x4b, 0x7a, 0x9d, + 0xe5, 0x76, 0xd2, 0x65, 0x86, 0xce, 0xc6, 0x4b, + 0x61, 0x16 + } +}; + +static const size_t test_input_len[1] = +{ + 114U +}; + +static const unsigned char test_mac[1][16] = +{ + { + 0x1a, 0xe1, 0x0b, 0x59, 0x4f, 0x09, 0xe2, 0x6a, + 0x7e, 0x90, 0x2e, 0xcb, 0xd0, 0x60, 0x06, 0x91 + } +}; + +/* Make sure no other definition is already present. */ +#undef ASSERT + +#define ASSERT(cond, args) \ + do \ + { \ + if (!(cond)) \ + { \ + if (verbose != 0) \ + mbedtls_printf args; \ + \ + return -1; \ + } \ + } \ + while (0) + +int mbedtls_chachapoly_self_test(int verbose) +{ + mbedtls_chachapoly_context ctx; + unsigned i; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char output[200]; + unsigned char mac[16]; + + for (i = 0U; i < 1U; i++) { + if (verbose != 0) { + mbedtls_printf(" ChaCha20-Poly1305 test %u ", i); + } + + mbedtls_chachapoly_init(&ctx); + + ret = mbedtls_chachapoly_setkey(&ctx, test_key[i]); + ASSERT(0 == ret, ("setkey() error code: %i\n", ret)); + + ret = mbedtls_chachapoly_encrypt_and_tag(&ctx, + test_input_len[i], + test_nonce[i], + test_aad[i], + test_aad_len[i], + test_input[i], + output, + mac); + + ASSERT(0 == ret, ("crypt_and_tag() error code: %i\n", ret)); + + ASSERT(0 == memcmp(output, test_output[i], test_input_len[i]), + ("failure (wrong output)\n")); + + ASSERT(0 == memcmp(mac, test_mac[i], 16U), + ("failure (wrong MAC)\n")); + + mbedtls_chachapoly_free(&ctx); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return 0; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_CHACHAPOLY_C */ diff --git a/ext/opcua_client/mbedtls/library/check_crypto_config.h b/ext/opcua_client/mbedtls/library/check_crypto_config.h new file mode 100644 index 0000000..0ba32bf --- /dev/null +++ b/ext/opcua_client/mbedtls/library/check_crypto_config.h @@ -0,0 +1,79 @@ +/** + * \file check_crypto_config.h + * + * \brief Consistency checks for PSA configuration options + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * It is recommended to include this file from your crypto_config.h + * in order to catch dependency issues early. + */ + +#ifndef MBEDTLS_CHECK_CRYPTO_CONFIG_H +#define MBEDTLS_CHECK_CRYPTO_CONFIG_H + +#if defined(PSA_WANT_ALG_CCM) && \ + !(defined(PSA_WANT_KEY_TYPE_AES) || \ + defined(PSA_WANT_KEY_TYPE_CAMELLIA)) +#error "PSA_WANT_ALG_CCM defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_CMAC) && \ + !(defined(PSA_WANT_KEY_TYPE_AES) || \ + defined(PSA_WANT_KEY_TYPE_CAMELLIA) || \ + defined(PSA_WANT_KEY_TYPE_DES)) +#error "PSA_WANT_ALG_CMAC defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_DETERMINISTIC_ECDSA) && \ + !(defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR) || \ + defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)) +#error "PSA_WANT_ALG_DETERMINISTIC_ECDSA defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_ECDSA) && \ + !(defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR) || \ + defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)) +#error "PSA_WANT_ALG_ECDSA defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_GCM) && \ + !(defined(PSA_WANT_KEY_TYPE_AES) || \ + defined(PSA_WANT_KEY_TYPE_CAMELLIA)) +#error "PSA_WANT_ALG_GCM defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_RSA_PKCS1V15_CRYPT) && \ + !(defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR) || \ + defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY)) +#error "PSA_WANT_ALG_RSA_PKCS1V15_CRYPT defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_RSA_PKCS1V15_SIGN) && \ + !(defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR) || \ + defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY)) +#error "PSA_WANT_ALG_RSA_PKCS1V15_SIGN defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_RSA_OAEP) && \ + !(defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR) || \ + defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY)) +#error "PSA_WANT_ALG_RSA_OAEP defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_RSA_PSS) && \ + !(defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR) || \ + defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY)) +#error "PSA_WANT_ALG_RSA_PSS defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR) && \ + !defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY) +#error "PSA_WANT_KEY_TYPE_ECC_KEY_PAIR defined, but not all prerequisites" +#endif + +#endif /* MBEDTLS_CHECK_CRYPTO_CONFIG_H */ diff --git a/ext/opcua_client/mbedtls/library/cipher.c b/ext/opcua_client/mbedtls/library/cipher.c new file mode 100644 index 0000000..37a2eff --- /dev/null +++ b/ext/opcua_client/mbedtls/library/cipher.c @@ -0,0 +1,1622 @@ +/** + * \file cipher.c + * + * \brief Generic cipher wrapper for Mbed TLS + * + * \author Adriaan de Jong + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_CIPHER_C) + +#include "mbedtls/cipher.h" +#include "mbedtls/cipher_internal.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" +#include "mbedtls/constant_time.h" +#include "constant_time_internal.h" + +#include +#include + +#if defined(MBEDTLS_CHACHAPOLY_C) +#include "mbedtls/chachapoly.h" +#endif + +#if defined(MBEDTLS_GCM_C) +#include "mbedtls/gcm.h" +#endif + +#if defined(MBEDTLS_CCM_C) +#include "mbedtls/ccm.h" +#endif + +#if defined(MBEDTLS_CHACHA20_C) +#include "mbedtls/chacha20.h" +#endif + +#if defined(MBEDTLS_CMAC_C) +#include "mbedtls/cmac.h" +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "psa/crypto.h" +#include "mbedtls/psa_util.h" +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#if defined(MBEDTLS_NIST_KW_C) +#include "mbedtls/nist_kw.h" +#endif + +#include "mbedtls/platform.h" + +#define CIPHER_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA) +#define CIPHER_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +static int supported_init = 0; + +const int *mbedtls_cipher_list(void) +{ + const mbedtls_cipher_definition_t *def; + int *type; + + if (!supported_init) { + def = mbedtls_cipher_definitions; + type = mbedtls_cipher_supported; + + while (def->type != 0) { + *type++ = (*def++).type; + } + + *type = 0; + + supported_init = 1; + } + + return mbedtls_cipher_supported; +} + +const mbedtls_cipher_info_t *mbedtls_cipher_info_from_type( + const mbedtls_cipher_type_t cipher_type) +{ + const mbedtls_cipher_definition_t *def; + + for (def = mbedtls_cipher_definitions; def->info != NULL; def++) { + if (def->type == cipher_type) { + return def->info; + } + } + + return NULL; +} + +const mbedtls_cipher_info_t *mbedtls_cipher_info_from_string( + const char *cipher_name) +{ + const mbedtls_cipher_definition_t *def; + + if (NULL == cipher_name) { + return NULL; + } + + for (def = mbedtls_cipher_definitions; def->info != NULL; def++) { + if (!strcmp(def->info->name, cipher_name)) { + return def->info; + } + } + + return NULL; +} + +const mbedtls_cipher_info_t *mbedtls_cipher_info_from_values( + const mbedtls_cipher_id_t cipher_id, + int key_bitlen, + const mbedtls_cipher_mode_t mode) +{ + const mbedtls_cipher_definition_t *def; + + for (def = mbedtls_cipher_definitions; def->info != NULL; def++) { + if (def->info->base->cipher == cipher_id && + def->info->key_bitlen == (unsigned) key_bitlen && + def->info->mode == mode) { + return def->info; + } + } + + return NULL; +} + +void mbedtls_cipher_init(mbedtls_cipher_context_t *ctx) +{ + CIPHER_VALIDATE(ctx != NULL); + memset(ctx, 0, sizeof(mbedtls_cipher_context_t)); +} + +void mbedtls_cipher_free(mbedtls_cipher_context_t *ctx) +{ + if (ctx == NULL) { + return; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (ctx->psa_enabled == 1) { + if (ctx->cipher_ctx != NULL) { + mbedtls_cipher_context_psa * const cipher_psa = + (mbedtls_cipher_context_psa *) ctx->cipher_ctx; + + if (cipher_psa->slot_state == MBEDTLS_CIPHER_PSA_KEY_OWNED) { + /* xxx_free() doesn't allow to return failures. */ + (void) psa_destroy_key(cipher_psa->slot); + } + + mbedtls_platform_zeroize(cipher_psa, sizeof(*cipher_psa)); + mbedtls_free(cipher_psa); + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_cipher_context_t)); + return; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#if defined(MBEDTLS_CMAC_C) + if (ctx->cmac_ctx) { + mbedtls_platform_zeroize(ctx->cmac_ctx, + sizeof(mbedtls_cmac_context_t)); + mbedtls_free(ctx->cmac_ctx); + } +#endif + + if (ctx->cipher_ctx) { + ctx->cipher_info->base->ctx_free_func(ctx->cipher_ctx); + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_cipher_context_t)); +} + +int mbedtls_cipher_setup(mbedtls_cipher_context_t *ctx, + const mbedtls_cipher_info_t *cipher_info) +{ + CIPHER_VALIDATE_RET(ctx != NULL); + if (cipher_info == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + memset(ctx, 0, sizeof(mbedtls_cipher_context_t)); + + if (NULL == (ctx->cipher_ctx = cipher_info->base->ctx_alloc_func())) { + return MBEDTLS_ERR_CIPHER_ALLOC_FAILED; + } + + ctx->cipher_info = cipher_info; + +#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) + /* + * Ignore possible errors caused by a cipher mode that doesn't use padding + */ +#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) + (void) mbedtls_cipher_set_padding_mode(ctx, MBEDTLS_PADDING_PKCS7); +#else + (void) mbedtls_cipher_set_padding_mode(ctx, MBEDTLS_PADDING_NONE); +#endif +#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ + + return 0; +} + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +int mbedtls_cipher_setup_psa(mbedtls_cipher_context_t *ctx, + const mbedtls_cipher_info_t *cipher_info, + size_t taglen) +{ + psa_algorithm_t alg; + mbedtls_cipher_context_psa *cipher_psa; + + if (NULL == cipher_info || NULL == ctx) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + /* Check that the underlying cipher mode and cipher type are + * supported by the underlying PSA Crypto implementation. */ + alg = mbedtls_psa_translate_cipher_mode(cipher_info->mode, taglen); + if (alg == 0) { + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } + if (mbedtls_psa_translate_cipher_type(cipher_info->type) == 0) { + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } + + memset(ctx, 0, sizeof(mbedtls_cipher_context_t)); + + cipher_psa = mbedtls_calloc(1, sizeof(mbedtls_cipher_context_psa)); + if (cipher_psa == NULL) { + return MBEDTLS_ERR_CIPHER_ALLOC_FAILED; + } + cipher_psa->alg = alg; + ctx->cipher_ctx = cipher_psa; + ctx->cipher_info = cipher_info; + ctx->psa_enabled = 1; + return 0; +} +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +int mbedtls_cipher_setkey(mbedtls_cipher_context_t *ctx, + const unsigned char *key, + int key_bitlen, + const mbedtls_operation_t operation) +{ + CIPHER_VALIDATE_RET(ctx != NULL); + CIPHER_VALIDATE_RET(key != NULL); + CIPHER_VALIDATE_RET(operation == MBEDTLS_ENCRYPT || + operation == MBEDTLS_DECRYPT); + if (ctx->cipher_info == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (ctx->psa_enabled == 1) { + mbedtls_cipher_context_psa * const cipher_psa = + (mbedtls_cipher_context_psa *) ctx->cipher_ctx; + + size_t const key_bytelen = ((size_t) key_bitlen + 7) / 8; + + psa_status_t status; + psa_key_type_t key_type; + psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + + /* PSA Crypto API only accepts byte-aligned keys. */ + if (key_bitlen % 8 != 0) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + /* Don't allow keys to be set multiple times. */ + if (cipher_psa->slot_state != MBEDTLS_CIPHER_PSA_KEY_UNSET) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + key_type = mbedtls_psa_translate_cipher_type( + ctx->cipher_info->type); + if (key_type == 0) { + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } + psa_set_key_type(&attributes, key_type); + + /* Mbed TLS' cipher layer doesn't enforce the mode of operation + * (encrypt vs. decrypt): it is possible to setup a key for encryption + * and use it for AEAD decryption. Until tests relying on this + * are changed, allow any usage in PSA. */ + psa_set_key_usage_flags(&attributes, + /* mbedtls_psa_translate_cipher_operation( operation ); */ + PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT); + psa_set_key_algorithm(&attributes, cipher_psa->alg); + + status = psa_import_key(&attributes, key, key_bytelen, + &cipher_psa->slot); + switch (status) { + case PSA_SUCCESS: + break; + case PSA_ERROR_INSUFFICIENT_MEMORY: + return MBEDTLS_ERR_CIPHER_ALLOC_FAILED; + case PSA_ERROR_NOT_SUPPORTED: + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + default: + return MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED; + } + /* Indicate that we own the key slot and need to + * destroy it in mbedtls_cipher_free(). */ + cipher_psa->slot_state = MBEDTLS_CIPHER_PSA_KEY_OWNED; + + ctx->key_bitlen = key_bitlen; + ctx->operation = operation; + return 0; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + if ((ctx->cipher_info->flags & MBEDTLS_CIPHER_VARIABLE_KEY_LEN) == 0 && + (int) ctx->cipher_info->key_bitlen != key_bitlen) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + ctx->key_bitlen = key_bitlen; + ctx->operation = operation; + + /* + * For OFB, CFB and CTR mode always use the encryption key schedule + */ + if (MBEDTLS_ENCRYPT == operation || + MBEDTLS_MODE_CFB == ctx->cipher_info->mode || + MBEDTLS_MODE_OFB == ctx->cipher_info->mode || + MBEDTLS_MODE_CTR == ctx->cipher_info->mode) { + return ctx->cipher_info->base->setkey_enc_func(ctx->cipher_ctx, key, + ctx->key_bitlen); + } + + if (MBEDTLS_DECRYPT == operation) { + return ctx->cipher_info->base->setkey_dec_func(ctx->cipher_ctx, key, + ctx->key_bitlen); + } + + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; +} + +int mbedtls_cipher_set_iv(mbedtls_cipher_context_t *ctx, + const unsigned char *iv, + size_t iv_len) +{ + size_t actual_iv_size; + + CIPHER_VALIDATE_RET(ctx != NULL); + CIPHER_VALIDATE_RET(iv_len == 0 || iv != NULL); + if (ctx->cipher_info == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (ctx->psa_enabled == 1) { + /* While PSA Crypto has an API for multipart + * operations, we currently don't make it + * accessible through the cipher layer. */ + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + /* avoid buffer overflow in ctx->iv */ + if (iv_len > MBEDTLS_MAX_IV_LENGTH) { + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } + + if ((ctx->cipher_info->flags & MBEDTLS_CIPHER_VARIABLE_IV_LEN) != 0) { + actual_iv_size = iv_len; + } else { + actual_iv_size = ctx->cipher_info->iv_size; + + /* avoid reading past the end of input buffer */ + if (actual_iv_size > iv_len) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + } + +#if defined(MBEDTLS_CHACHA20_C) + if (ctx->cipher_info->type == MBEDTLS_CIPHER_CHACHA20) { + /* Even though the actual_iv_size is overwritten with a correct value + * of 12 from the cipher info, return an error to indicate that + * the input iv_len is wrong. */ + if (iv_len != 12) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + if (0 != mbedtls_chacha20_starts((mbedtls_chacha20_context *) ctx->cipher_ctx, + iv, + 0U)) { /* Initial counter value */ + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + } +#if defined(MBEDTLS_CHACHAPOLY_C) + if (ctx->cipher_info->type == MBEDTLS_CIPHER_CHACHA20_POLY1305 && + iv_len != 12) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } +#endif +#endif + + if (actual_iv_size != 0) { + memcpy(ctx->iv, iv, actual_iv_size); + ctx->iv_size = actual_iv_size; + } + + return 0; +} + +int mbedtls_cipher_reset(mbedtls_cipher_context_t *ctx) +{ + CIPHER_VALIDATE_RET(ctx != NULL); + if (ctx->cipher_info == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (ctx->psa_enabled == 1) { + /* We don't support resetting PSA-based + * cipher contexts, yet. */ + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + ctx->unprocessed_len = 0; + + return 0; +} + +#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) +int mbedtls_cipher_update_ad(mbedtls_cipher_context_t *ctx, + const unsigned char *ad, size_t ad_len) +{ + CIPHER_VALIDATE_RET(ctx != NULL); + CIPHER_VALIDATE_RET(ad_len == 0 || ad != NULL); + if (ctx->cipher_info == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (ctx->psa_enabled == 1) { + /* While PSA Crypto has an API for multipart + * operations, we currently don't make it + * accessible through the cipher layer. */ + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#if defined(MBEDTLS_GCM_C) + if (MBEDTLS_MODE_GCM == ctx->cipher_info->mode) { + return mbedtls_gcm_starts((mbedtls_gcm_context *) ctx->cipher_ctx, ctx->operation, + ctx->iv, ctx->iv_size, ad, ad_len); + } +#endif + +#if defined(MBEDTLS_CHACHAPOLY_C) + if (MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type) { + int result; + mbedtls_chachapoly_mode_t mode; + + mode = (ctx->operation == MBEDTLS_ENCRYPT) + ? MBEDTLS_CHACHAPOLY_ENCRYPT + : MBEDTLS_CHACHAPOLY_DECRYPT; + + result = mbedtls_chachapoly_starts((mbedtls_chachapoly_context *) ctx->cipher_ctx, + ctx->iv, + mode); + if (result != 0) { + return result; + } + + return mbedtls_chachapoly_update_aad((mbedtls_chachapoly_context *) ctx->cipher_ctx, + ad, ad_len); + } +#endif + + return 0; +} +#endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ + +int mbedtls_cipher_update(mbedtls_cipher_context_t *ctx, const unsigned char *input, + size_t ilen, unsigned char *output, size_t *olen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t block_size; + + CIPHER_VALIDATE_RET(ctx != NULL); + CIPHER_VALIDATE_RET(ilen == 0 || input != NULL); + CIPHER_VALIDATE_RET(output != NULL); + CIPHER_VALIDATE_RET(olen != NULL); + if (ctx->cipher_info == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (ctx->psa_enabled == 1) { + /* While PSA Crypto has an API for multipart + * operations, we currently don't make it + * accessible through the cipher layer. */ + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + *olen = 0; + block_size = mbedtls_cipher_get_block_size(ctx); + if (0 == block_size) { + return MBEDTLS_ERR_CIPHER_INVALID_CONTEXT; + } + + if (ctx->cipher_info->mode == MBEDTLS_MODE_ECB) { + if (ilen != block_size) { + return MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED; + } + + *olen = ilen; + + if (0 != (ret = ctx->cipher_info->base->ecb_func(ctx->cipher_ctx, + ctx->operation, input, output))) { + return ret; + } + + return 0; + } + +#if defined(MBEDTLS_GCM_C) + if (ctx->cipher_info->mode == MBEDTLS_MODE_GCM) { + *olen = ilen; + return mbedtls_gcm_update((mbedtls_gcm_context *) ctx->cipher_ctx, ilen, input, + output); + } +#endif + +#if defined(MBEDTLS_CHACHAPOLY_C) + if (ctx->cipher_info->type == MBEDTLS_CIPHER_CHACHA20_POLY1305) { + *olen = ilen; + return mbedtls_chachapoly_update((mbedtls_chachapoly_context *) ctx->cipher_ctx, + ilen, input, output); + } +#endif + + if (input == output && + (ctx->unprocessed_len != 0 || ilen % block_size)) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_CIPHER_MODE_CBC) + if (ctx->cipher_info->mode == MBEDTLS_MODE_CBC) { + size_t copy_len = 0; + + /* + * If there is not enough data for a full block, cache it. + */ + if ((ctx->operation == MBEDTLS_DECRYPT && NULL != ctx->add_padding && + ilen <= block_size - ctx->unprocessed_len) || + (ctx->operation == MBEDTLS_DECRYPT && NULL == ctx->add_padding && + ilen < block_size - ctx->unprocessed_len) || + (ctx->operation == MBEDTLS_ENCRYPT && + ilen < block_size - ctx->unprocessed_len)) { + memcpy(&(ctx->unprocessed_data[ctx->unprocessed_len]), input, + ilen); + + ctx->unprocessed_len += ilen; + return 0; + } + + /* + * Process cached data first + */ + if (0 != ctx->unprocessed_len) { + copy_len = block_size - ctx->unprocessed_len; + + memcpy(&(ctx->unprocessed_data[ctx->unprocessed_len]), input, + copy_len); + + if (0 != (ret = ctx->cipher_info->base->cbc_func(ctx->cipher_ctx, + ctx->operation, block_size, ctx->iv, + ctx->unprocessed_data, output))) { + return ret; + } + + *olen += block_size; + output += block_size; + ctx->unprocessed_len = 0; + + input += copy_len; + ilen -= copy_len; + } + + /* + * Cache final, incomplete block + */ + if (0 != ilen) { + /* Encryption: only cache partial blocks + * Decryption w/ padding: always keep at least one whole block + * Decryption w/o padding: only cache partial blocks + */ + copy_len = ilen % block_size; + if (copy_len == 0 && + ctx->operation == MBEDTLS_DECRYPT && + NULL != ctx->add_padding) { + copy_len = block_size; + } + + memcpy(ctx->unprocessed_data, &(input[ilen - copy_len]), + copy_len); + + ctx->unprocessed_len += copy_len; + ilen -= copy_len; + } + + /* + * Process remaining full blocks + */ + if (ilen) { + if (0 != (ret = ctx->cipher_info->base->cbc_func(ctx->cipher_ctx, + ctx->operation, ilen, ctx->iv, input, + output))) { + return ret; + } + + *olen += ilen; + } + + return 0; + } +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) + if (ctx->cipher_info->mode == MBEDTLS_MODE_CFB) { + if (0 != (ret = ctx->cipher_info->base->cfb_func(ctx->cipher_ctx, + ctx->operation, ilen, + &ctx->unprocessed_len, ctx->iv, + input, output))) { + return ret; + } + + *olen = ilen; + + return 0; + } +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_OFB) + if (ctx->cipher_info->mode == MBEDTLS_MODE_OFB) { + if (0 != (ret = ctx->cipher_info->base->ofb_func(ctx->cipher_ctx, + ilen, &ctx->unprocessed_len, ctx->iv, + input, output))) { + return ret; + } + + *olen = ilen; + + return 0; + } +#endif /* MBEDTLS_CIPHER_MODE_OFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) + if (ctx->cipher_info->mode == MBEDTLS_MODE_CTR) { + if (0 != (ret = ctx->cipher_info->base->ctr_func(ctx->cipher_ctx, + ilen, &ctx->unprocessed_len, ctx->iv, + ctx->unprocessed_data, input, output))) { + return ret; + } + + *olen = ilen; + + return 0; + } +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +#if defined(MBEDTLS_CIPHER_MODE_XTS) + if (ctx->cipher_info->mode == MBEDTLS_MODE_XTS) { + if (ctx->unprocessed_len > 0) { + /* We can only process an entire data unit at a time. */ + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } + + ret = ctx->cipher_info->base->xts_func(ctx->cipher_ctx, + ctx->operation, ilen, ctx->iv, input, output); + if (ret != 0) { + return ret; + } + + *olen = ilen; + + return 0; + } +#endif /* MBEDTLS_CIPHER_MODE_XTS */ + +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + if (ctx->cipher_info->mode == MBEDTLS_MODE_STREAM) { + if (0 != (ret = ctx->cipher_info->base->stream_func(ctx->cipher_ctx, + ilen, input, output))) { + return ret; + } + + *olen = ilen; + + return 0; + } +#endif /* MBEDTLS_CIPHER_MODE_STREAM */ + + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; +} + +#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) +#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) +/* + * PKCS7 (and PKCS5) padding: fill with ll bytes, with ll = padding_len + */ +static void add_pkcs_padding(unsigned char *output, size_t output_len, + size_t data_len) +{ + size_t padding_len = output_len - data_len; + unsigned char i; + + for (i = 0; i < padding_len; i++) { + output[data_len + i] = (unsigned char) padding_len; + } +} + +static int get_pkcs_padding(unsigned char *input, size_t input_len, + size_t *data_len) +{ + size_t i, pad_idx; + unsigned char padding_len, bad = 0; + + if (NULL == input || NULL == data_len) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + padding_len = input[input_len - 1]; + *data_len = input_len - padding_len; + + /* Avoid logical || since it results in a branch */ + bad |= ~mbedtls_ct_size_mask_ge(input_len, padding_len); + bad |= mbedtls_ct_size_bool_eq(padding_len, 0); + + /* The number of bytes checked must be independent of padding_len, + * so pick input_len, which is usually 8 or 16 (one block) */ + pad_idx = input_len - padding_len; + for (i = 0; i < input_len; i++) { + size_t mask = mbedtls_ct_size_mask_ge(i, pad_idx); + bad |= (input[i] ^ padding_len) & mask; + } + return -(int) mbedtls_ct_uint_if(bad, -MBEDTLS_ERR_CIPHER_INVALID_PADDING, 0); +} +#endif /* MBEDTLS_CIPHER_PADDING_PKCS7 */ + +#if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS) +/* + * One and zeros padding: fill with 80 00 ... 00 + */ +static void add_one_and_zeros_padding(unsigned char *output, + size_t output_len, size_t data_len) +{ + size_t padding_len = output_len - data_len; + unsigned char i = 0; + + output[data_len] = 0x80; + for (i = 1; i < padding_len; i++) { + output[data_len + i] = 0x00; + } +} + +static int get_one_and_zeros_padding(unsigned char *input, size_t input_len, + size_t *data_len) +{ + unsigned int bad = 1; + + if (NULL == input || NULL == data_len) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + *data_len = 0; + size_t in_padding = ~0; + + for (ptrdiff_t i = (ptrdiff_t) (input_len) - 1; i >= 0; i--) { + size_t is_nonzero = mbedtls_ct_uint_mask(input[i]); + + size_t hit_first_nonzero = is_nonzero & in_padding; + + *data_len = (*data_len & ~hit_first_nonzero) | ((size_t) i & hit_first_nonzero); + + bad = mbedtls_ct_uint_if((unsigned int) hit_first_nonzero, + !mbedtls_ct_size_bool_eq(input[i], 0x80), bad); + + in_padding = in_padding & ~is_nonzero; + } + + return -(int) mbedtls_ct_uint_if(bad, -MBEDTLS_ERR_CIPHER_INVALID_PADDING, 0); +} +#endif /* MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS */ + +#if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN) +/* + * Zeros and len padding: fill with 00 ... 00 ll, where ll is padding length + */ +static void add_zeros_and_len_padding(unsigned char *output, + size_t output_len, size_t data_len) +{ + size_t padding_len = output_len - data_len; + unsigned char i = 0; + + for (i = 1; i < padding_len; i++) { + output[data_len + i - 1] = 0x00; + } + output[output_len - 1] = (unsigned char) padding_len; +} + +static int get_zeros_and_len_padding(unsigned char *input, size_t input_len, + size_t *data_len) +{ + size_t i, pad_idx; + unsigned char padding_len, bad = 0; + + if (NULL == input || NULL == data_len) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + padding_len = input[input_len - 1]; + *data_len = input_len - padding_len; + + /* Avoid logical || since it results in a branch */ + bad |= mbedtls_ct_size_mask_ge(padding_len, input_len + 1); + bad |= mbedtls_ct_size_bool_eq(padding_len, 0); + + /* The number of bytes checked must be independent of padding_len */ + pad_idx = input_len - padding_len; + for (i = 0; i < input_len - 1; i++) { + size_t mask = mbedtls_ct_size_mask_ge(i, pad_idx); + bad |= input[i] & mask; + } + + return -(int) mbedtls_ct_uint_if(bad, -MBEDTLS_ERR_CIPHER_INVALID_PADDING, 0); +} +#endif /* MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN */ + +#if defined(MBEDTLS_CIPHER_PADDING_ZEROS) +/* + * Zero padding: fill with 00 ... 00 + */ +static void add_zeros_padding(unsigned char *output, + size_t output_len, size_t data_len) +{ + size_t i; + + for (i = data_len; i < output_len; i++) { + output[i] = 0x00; + } +} + +static int get_zeros_padding(unsigned char *input, size_t input_len, + size_t *data_len) +{ + size_t i; + unsigned char done = 0, prev_done; + + if (NULL == input || NULL == data_len) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + *data_len = 0; + for (i = input_len; i > 0; i--) { + prev_done = done; + done |= !mbedtls_ct_size_bool_eq(input[i-1], 0); + size_t mask = mbedtls_ct_size_mask(done ^ prev_done); + *data_len |= i & mask; + } + + return 0; +} +#endif /* MBEDTLS_CIPHER_PADDING_ZEROS */ + +/* + * No padding: don't pad :) + * + * There is no add_padding function (check for NULL in mbedtls_cipher_finish) + * but a trivial get_padding function + */ +static int get_no_padding(unsigned char *input, size_t input_len, + size_t *data_len) +{ + if (NULL == input || NULL == data_len) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + *data_len = input_len; + + return 0; +} +#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ + +int mbedtls_cipher_finish(mbedtls_cipher_context_t *ctx, + unsigned char *output, size_t *olen) +{ + CIPHER_VALIDATE_RET(ctx != NULL); + CIPHER_VALIDATE_RET(output != NULL); + CIPHER_VALIDATE_RET(olen != NULL); + if (ctx->cipher_info == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (ctx->psa_enabled == 1) { + /* While PSA Crypto has an API for multipart + * operations, we currently don't make it + * accessible through the cipher layer. */ + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + *olen = 0; + + if (MBEDTLS_MODE_CFB == ctx->cipher_info->mode || + MBEDTLS_MODE_OFB == ctx->cipher_info->mode || + MBEDTLS_MODE_CTR == ctx->cipher_info->mode || + MBEDTLS_MODE_GCM == ctx->cipher_info->mode || + MBEDTLS_MODE_XTS == ctx->cipher_info->mode || + MBEDTLS_MODE_STREAM == ctx->cipher_info->mode) { + return 0; + } + + if ((MBEDTLS_CIPHER_CHACHA20 == ctx->cipher_info->type) || + (MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type)) { + return 0; + } + + if (MBEDTLS_MODE_ECB == ctx->cipher_info->mode) { + if (ctx->unprocessed_len != 0) { + return MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED; + } + + return 0; + } + +#if defined(MBEDTLS_CIPHER_MODE_CBC) + if (MBEDTLS_MODE_CBC == ctx->cipher_info->mode) { + int ret = 0; + + if (MBEDTLS_ENCRYPT == ctx->operation) { + /* check for 'no padding' mode */ + if (NULL == ctx->add_padding) { + if (0 != ctx->unprocessed_len) { + return MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED; + } + + return 0; + } + + ctx->add_padding(ctx->unprocessed_data, mbedtls_cipher_get_iv_size(ctx), + ctx->unprocessed_len); + } else if (mbedtls_cipher_get_block_size(ctx) != ctx->unprocessed_len) { + /* + * For decrypt operations, expect a full block, + * or an empty block if no padding + */ + if (NULL == ctx->add_padding && 0 == ctx->unprocessed_len) { + return 0; + } + + return MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED; + } + + /* cipher block */ + if (0 != (ret = ctx->cipher_info->base->cbc_func(ctx->cipher_ctx, + ctx->operation, + mbedtls_cipher_get_block_size(ctx), + ctx->iv, + ctx->unprocessed_data, output))) { + return ret; + } + + /* Set output size for decryption */ + if (MBEDTLS_DECRYPT == ctx->operation) { + return ctx->get_padding(output, mbedtls_cipher_get_block_size(ctx), + olen); + } + + /* Set output size for encryption */ + *olen = mbedtls_cipher_get_block_size(ctx); + return 0; + } +#else + ((void) output); +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; +} + +#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) +int mbedtls_cipher_set_padding_mode(mbedtls_cipher_context_t *ctx, + mbedtls_cipher_padding_t mode) +{ + CIPHER_VALIDATE_RET(ctx != NULL); + + if (NULL == ctx->cipher_info || MBEDTLS_MODE_CBC != ctx->cipher_info->mode) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (ctx->psa_enabled == 1) { + /* While PSA Crypto knows about CBC padding + * schemes, we currently don't make them + * accessible through the cipher layer. */ + if (mode != MBEDTLS_PADDING_NONE) { + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } + + return 0; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + switch (mode) { +#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) + case MBEDTLS_PADDING_PKCS7: + ctx->add_padding = add_pkcs_padding; + ctx->get_padding = get_pkcs_padding; + break; +#endif +#if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS) + case MBEDTLS_PADDING_ONE_AND_ZEROS: + ctx->add_padding = add_one_and_zeros_padding; + ctx->get_padding = get_one_and_zeros_padding; + break; +#endif +#if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN) + case MBEDTLS_PADDING_ZEROS_AND_LEN: + ctx->add_padding = add_zeros_and_len_padding; + ctx->get_padding = get_zeros_and_len_padding; + break; +#endif +#if defined(MBEDTLS_CIPHER_PADDING_ZEROS) + case MBEDTLS_PADDING_ZEROS: + ctx->add_padding = add_zeros_padding; + ctx->get_padding = get_zeros_padding; + break; +#endif + case MBEDTLS_PADDING_NONE: + ctx->add_padding = NULL; + ctx->get_padding = get_no_padding; + break; + + default: + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } + + return 0; +} +#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ + +#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) +int mbedtls_cipher_write_tag(mbedtls_cipher_context_t *ctx, + unsigned char *tag, size_t tag_len) +{ + CIPHER_VALIDATE_RET(ctx != NULL); + CIPHER_VALIDATE_RET(tag_len == 0 || tag != NULL); + if (ctx->cipher_info == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + if (MBEDTLS_ENCRYPT != ctx->operation) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (ctx->psa_enabled == 1) { + /* While PSA Crypto has an API for multipart + * operations, we currently don't make it + * accessible through the cipher layer. */ + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#if defined(MBEDTLS_GCM_C) + if (MBEDTLS_MODE_GCM == ctx->cipher_info->mode) { + return mbedtls_gcm_finish((mbedtls_gcm_context *) ctx->cipher_ctx, + tag, tag_len); + } +#endif + +#if defined(MBEDTLS_CHACHAPOLY_C) + if (MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type) { + /* Don't allow truncated MAC for Poly1305 */ + if (tag_len != 16U) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + return mbedtls_chachapoly_finish( + (mbedtls_chachapoly_context *) ctx->cipher_ctx, tag); + } +#endif + + return 0; +} + +int mbedtls_cipher_check_tag(mbedtls_cipher_context_t *ctx, + const unsigned char *tag, size_t tag_len) +{ + unsigned char check_tag[16]; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + CIPHER_VALIDATE_RET(ctx != NULL); + CIPHER_VALIDATE_RET(tag_len == 0 || tag != NULL); + if (ctx->cipher_info == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + if (MBEDTLS_DECRYPT != ctx->operation) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (ctx->psa_enabled == 1) { + /* While PSA Crypto has an API for multipart + * operations, we currently don't make it + * accessible through the cipher layer. */ + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + /* Status to return on a non-authenticated algorithm. It would make sense + * to return MBEDTLS_ERR_CIPHER_INVALID_CONTEXT or perhaps + * MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, but at the time I write this our + * unit tests assume 0. */ + ret = 0; + +#if defined(MBEDTLS_GCM_C) + if (MBEDTLS_MODE_GCM == ctx->cipher_info->mode) { + if (tag_len > sizeof(check_tag)) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + if (0 != (ret = mbedtls_gcm_finish( + (mbedtls_gcm_context *) ctx->cipher_ctx, + check_tag, tag_len))) { + return ret; + } + + /* Check the tag in "constant-time" */ + if (mbedtls_ct_memcmp(tag, check_tag, tag_len) != 0) { + ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; + goto exit; + } + } +#endif /* MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_CHACHAPOLY_C) + if (MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type) { + /* Don't allow truncated MAC for Poly1305 */ + if (tag_len != sizeof(check_tag)) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + ret = mbedtls_chachapoly_finish( + (mbedtls_chachapoly_context *) ctx->cipher_ctx, check_tag); + if (ret != 0) { + return ret; + } + + /* Check the tag in "constant-time" */ + if (mbedtls_ct_memcmp(tag, check_tag, tag_len) != 0) { + ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; + goto exit; + } + } +#endif /* MBEDTLS_CHACHAPOLY_C */ + +exit: + mbedtls_platform_zeroize(check_tag, tag_len); + return ret; +} +#endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ + +/* + * Packet-oriented wrapper for non-AEAD modes + */ +int mbedtls_cipher_crypt(mbedtls_cipher_context_t *ctx, + const unsigned char *iv, size_t iv_len, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t finish_olen; + + CIPHER_VALIDATE_RET(ctx != NULL); + CIPHER_VALIDATE_RET(iv_len == 0 || iv != NULL); + CIPHER_VALIDATE_RET(ilen == 0 || input != NULL); + CIPHER_VALIDATE_RET(output != NULL); + CIPHER_VALIDATE_RET(olen != NULL); + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (ctx->psa_enabled == 1) { + /* As in the non-PSA case, we don't check that + * a key has been set. If not, the key slot will + * still be in its default state of 0, which is + * guaranteed to be invalid, hence the PSA-call + * below will gracefully fail. */ + mbedtls_cipher_context_psa * const cipher_psa = + (mbedtls_cipher_context_psa *) ctx->cipher_ctx; + + psa_status_t status; + psa_cipher_operation_t cipher_op = PSA_CIPHER_OPERATION_INIT; + size_t part_len; + + if (ctx->operation == MBEDTLS_DECRYPT) { + status = psa_cipher_decrypt_setup(&cipher_op, + cipher_psa->slot, + cipher_psa->alg); + } else if (ctx->operation == MBEDTLS_ENCRYPT) { + status = psa_cipher_encrypt_setup(&cipher_op, + cipher_psa->slot, + cipher_psa->alg); + } else { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + /* In the following, we can immediately return on an error, + * because the PSA Crypto API guarantees that cipher operations + * are terminated by unsuccessful calls to psa_cipher_update(), + * and by any call to psa_cipher_finish(). */ + if (status != PSA_SUCCESS) { + return MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED; + } + + if (ctx->cipher_info->mode != MBEDTLS_MODE_ECB) { + status = psa_cipher_set_iv(&cipher_op, iv, iv_len); + if (status != PSA_SUCCESS) { + return MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED; + } + } + + status = psa_cipher_update(&cipher_op, + input, ilen, + output, ilen, olen); + if (status != PSA_SUCCESS) { + return MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED; + } + + status = psa_cipher_finish(&cipher_op, + output + *olen, ilen - *olen, + &part_len); + if (status != PSA_SUCCESS) { + return MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED; + } + + *olen += part_len; + return 0; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + if ((ret = mbedtls_cipher_set_iv(ctx, iv, iv_len)) != 0) { + return ret; + } + + if ((ret = mbedtls_cipher_reset(ctx)) != 0) { + return ret; + } + + if ((ret = mbedtls_cipher_update(ctx, input, ilen, + output, olen)) != 0) { + return ret; + } + + if ((ret = mbedtls_cipher_finish(ctx, output + *olen, + &finish_olen)) != 0) { + return ret; + } + + *olen += finish_olen; + + return 0; +} + +#if defined(MBEDTLS_CIPHER_MODE_AEAD) +/* + * Packet-oriented encryption for AEAD modes: internal function shared by + * mbedtls_cipher_auth_encrypt() and mbedtls_cipher_auth_encrypt_ext(). + */ +static int mbedtls_cipher_aead_encrypt(mbedtls_cipher_context_t *ctx, + const unsigned char *iv, size_t iv_len, + const unsigned char *ad, size_t ad_len, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, + unsigned char *tag, size_t tag_len) +{ +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (ctx->psa_enabled == 1) { + /* As in the non-PSA case, we don't check that + * a key has been set. If not, the key slot will + * still be in its default state of 0, which is + * guaranteed to be invalid, hence the PSA-call + * below will gracefully fail. */ + mbedtls_cipher_context_psa * const cipher_psa = + (mbedtls_cipher_context_psa *) ctx->cipher_ctx; + + psa_status_t status; + + /* PSA Crypto API always writes the authentication tag + * at the end of the encrypted message. */ + if (output == NULL || tag != output + ilen) { + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } + + status = psa_aead_encrypt(cipher_psa->slot, + cipher_psa->alg, + iv, iv_len, + ad, ad_len, + input, ilen, + output, ilen + tag_len, olen); + if (status != PSA_SUCCESS) { + return MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED; + } + + *olen -= tag_len; + return 0; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#if defined(MBEDTLS_GCM_C) + if (MBEDTLS_MODE_GCM == ctx->cipher_info->mode) { + *olen = ilen; + return mbedtls_gcm_crypt_and_tag(ctx->cipher_ctx, MBEDTLS_GCM_ENCRYPT, + ilen, iv, iv_len, ad, ad_len, + input, output, tag_len, tag); + } +#endif /* MBEDTLS_GCM_C */ +#if defined(MBEDTLS_CCM_C) + if (MBEDTLS_MODE_CCM == ctx->cipher_info->mode) { + *olen = ilen; + return mbedtls_ccm_encrypt_and_tag(ctx->cipher_ctx, ilen, + iv, iv_len, ad, ad_len, input, output, + tag, tag_len); + } +#endif /* MBEDTLS_CCM_C */ +#if defined(MBEDTLS_CHACHAPOLY_C) + if (MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type) { + /* ChachaPoly has fixed length nonce and MAC (tag) */ + if ((iv_len != ctx->cipher_info->iv_size) || + (tag_len != 16U)) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + *olen = ilen; + return mbedtls_chachapoly_encrypt_and_tag(ctx->cipher_ctx, + ilen, iv, ad, ad_len, input, output, tag); + } +#endif /* MBEDTLS_CHACHAPOLY_C */ + + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; +} + +/* + * Packet-oriented encryption for AEAD modes: internal function shared by + * mbedtls_cipher_auth_encrypt() and mbedtls_cipher_auth_encrypt_ext(). + */ +static int mbedtls_cipher_aead_decrypt(mbedtls_cipher_context_t *ctx, + const unsigned char *iv, size_t iv_len, + const unsigned char *ad, size_t ad_len, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, + const unsigned char *tag, size_t tag_len) +{ +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (ctx->psa_enabled == 1) { + /* As in the non-PSA case, we don't check that + * a key has been set. If not, the key slot will + * still be in its default state of 0, which is + * guaranteed to be invalid, hence the PSA-call + * below will gracefully fail. */ + mbedtls_cipher_context_psa * const cipher_psa = + (mbedtls_cipher_context_psa *) ctx->cipher_ctx; + + psa_status_t status; + + /* PSA Crypto API always writes the authentication tag + * at the end of the encrypted message. */ + if (input == NULL || tag != input + ilen) { + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } + + status = psa_aead_decrypt(cipher_psa->slot, + cipher_psa->alg, + iv, iv_len, + ad, ad_len, + input, ilen + tag_len, + output, ilen, olen); + if (status == PSA_ERROR_INVALID_SIGNATURE) { + return MBEDTLS_ERR_CIPHER_AUTH_FAILED; + } else if (status != PSA_SUCCESS) { + return MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED; + } + + return 0; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#if defined(MBEDTLS_GCM_C) + if (MBEDTLS_MODE_GCM == ctx->cipher_info->mode) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + *olen = ilen; + ret = mbedtls_gcm_auth_decrypt(ctx->cipher_ctx, ilen, + iv, iv_len, ad, ad_len, + tag, tag_len, input, output); + + if (ret == MBEDTLS_ERR_GCM_AUTH_FAILED) { + ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; + } + + return ret; + } +#endif /* MBEDTLS_GCM_C */ +#if defined(MBEDTLS_CCM_C) + if (MBEDTLS_MODE_CCM == ctx->cipher_info->mode) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + *olen = ilen; + ret = mbedtls_ccm_auth_decrypt(ctx->cipher_ctx, ilen, + iv, iv_len, ad, ad_len, + input, output, tag, tag_len); + + if (ret == MBEDTLS_ERR_CCM_AUTH_FAILED) { + ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; + } + + return ret; + } +#endif /* MBEDTLS_CCM_C */ +#if defined(MBEDTLS_CHACHAPOLY_C) + if (MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + /* ChachaPoly has fixed length nonce and MAC (tag) */ + if ((iv_len != ctx->cipher_info->iv_size) || + (tag_len != 16U)) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + *olen = ilen; + ret = mbedtls_chachapoly_auth_decrypt(ctx->cipher_ctx, ilen, + iv, ad, ad_len, tag, input, output); + + if (ret == MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED) { + ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; + } + + return ret; + } +#endif /* MBEDTLS_CHACHAPOLY_C */ + + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +/* + * Packet-oriented encryption for AEAD modes: public legacy function. + */ +int mbedtls_cipher_auth_encrypt(mbedtls_cipher_context_t *ctx, + const unsigned char *iv, size_t iv_len, + const unsigned char *ad, size_t ad_len, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, + unsigned char *tag, size_t tag_len) +{ + CIPHER_VALIDATE_RET(ctx != NULL); + CIPHER_VALIDATE_RET(iv_len == 0 || iv != NULL); + CIPHER_VALIDATE_RET(ad_len == 0 || ad != NULL); + CIPHER_VALIDATE_RET(ilen == 0 || input != NULL); + CIPHER_VALIDATE_RET(ilen == 0 || output != NULL); + CIPHER_VALIDATE_RET(olen != NULL); + CIPHER_VALIDATE_RET(tag_len == 0 || tag != NULL); + + return mbedtls_cipher_aead_encrypt(ctx, iv, iv_len, ad, ad_len, + input, ilen, output, olen, + tag, tag_len); +} + +/* + * Packet-oriented decryption for AEAD modes: public legacy function. + */ +int mbedtls_cipher_auth_decrypt(mbedtls_cipher_context_t *ctx, + const unsigned char *iv, size_t iv_len, + const unsigned char *ad, size_t ad_len, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, + const unsigned char *tag, size_t tag_len) +{ + CIPHER_VALIDATE_RET(ctx != NULL); + CIPHER_VALIDATE_RET(iv_len == 0 || iv != NULL); + CIPHER_VALIDATE_RET(ad_len == 0 || ad != NULL); + CIPHER_VALIDATE_RET(ilen == 0 || input != NULL); + CIPHER_VALIDATE_RET(ilen == 0 || output != NULL); + CIPHER_VALIDATE_RET(olen != NULL); + CIPHER_VALIDATE_RET(tag_len == 0 || tag != NULL); + + return mbedtls_cipher_aead_decrypt(ctx, iv, iv_len, ad, ad_len, + input, ilen, output, olen, + tag, tag_len); +} +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ +#endif /* MBEDTLS_CIPHER_MODE_AEAD */ + +#if defined(MBEDTLS_CIPHER_MODE_AEAD) || defined(MBEDTLS_NIST_KW_C) +/* + * Packet-oriented encryption for AEAD/NIST_KW: public function. + */ +int mbedtls_cipher_auth_encrypt_ext(mbedtls_cipher_context_t *ctx, + const unsigned char *iv, size_t iv_len, + const unsigned char *ad, size_t ad_len, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t output_len, + size_t *olen, size_t tag_len) +{ + CIPHER_VALIDATE_RET(ctx != NULL); + CIPHER_VALIDATE_RET(iv_len == 0 || iv != NULL); + CIPHER_VALIDATE_RET(ad_len == 0 || ad != NULL); + CIPHER_VALIDATE_RET(ilen == 0 || input != NULL); + CIPHER_VALIDATE_RET(output != NULL); + CIPHER_VALIDATE_RET(olen != NULL); + +#if defined(MBEDTLS_NIST_KW_C) + if ( +#if defined(MBEDTLS_USE_PSA_CRYPTO) + ctx->psa_enabled == 0 && +#endif + (MBEDTLS_MODE_KW == ctx->cipher_info->mode || + MBEDTLS_MODE_KWP == ctx->cipher_info->mode)) { + mbedtls_nist_kw_mode_t mode = (MBEDTLS_MODE_KW == ctx->cipher_info->mode) ? + MBEDTLS_KW_MODE_KW : MBEDTLS_KW_MODE_KWP; + + /* There is no iv, tag or ad associated with KW and KWP, + * so these length should be 0 as documented. */ + if (iv_len != 0 || tag_len != 0 || ad_len != 0) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + (void) iv; + (void) ad; + + return mbedtls_nist_kw_wrap(ctx->cipher_ctx, mode, input, ilen, + output, olen, output_len); + } +#endif /* MBEDTLS_NIST_KW_C */ + +#if defined(MBEDTLS_CIPHER_MODE_AEAD) + /* AEAD case: check length before passing on to shared function */ + if (output_len < ilen + tag_len) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + int ret = mbedtls_cipher_aead_encrypt(ctx, iv, iv_len, ad, ad_len, + input, ilen, output, olen, + output + ilen, tag_len); + *olen += tag_len; + return ret; +#else + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; +#endif /* MBEDTLS_CIPHER_MODE_AEAD */ +} + +/* + * Packet-oriented decryption for AEAD/NIST_KW: public function. + */ +int mbedtls_cipher_auth_decrypt_ext(mbedtls_cipher_context_t *ctx, + const unsigned char *iv, size_t iv_len, + const unsigned char *ad, size_t ad_len, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t output_len, + size_t *olen, size_t tag_len) +{ + CIPHER_VALIDATE_RET(ctx != NULL); + CIPHER_VALIDATE_RET(iv_len == 0 || iv != NULL); + CIPHER_VALIDATE_RET(ad_len == 0 || ad != NULL); + CIPHER_VALIDATE_RET(ilen == 0 || input != NULL); + CIPHER_VALIDATE_RET(output_len == 0 || output != NULL); + CIPHER_VALIDATE_RET(olen != NULL); + +#if defined(MBEDTLS_NIST_KW_C) + if ( +#if defined(MBEDTLS_USE_PSA_CRYPTO) + ctx->psa_enabled == 0 && +#endif + (MBEDTLS_MODE_KW == ctx->cipher_info->mode || + MBEDTLS_MODE_KWP == ctx->cipher_info->mode)) { + mbedtls_nist_kw_mode_t mode = (MBEDTLS_MODE_KW == ctx->cipher_info->mode) ? + MBEDTLS_KW_MODE_KW : MBEDTLS_KW_MODE_KWP; + + /* There is no iv, tag or ad associated with KW and KWP, + * so these length should be 0 as documented. */ + if (iv_len != 0 || tag_len != 0 || ad_len != 0) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + (void) iv; + (void) ad; + + return mbedtls_nist_kw_unwrap(ctx->cipher_ctx, mode, input, ilen, + output, olen, output_len); + } +#endif /* MBEDTLS_NIST_KW_C */ + +#if defined(MBEDTLS_CIPHER_MODE_AEAD) + /* AEAD case: check length before passing on to shared function */ + if (ilen < tag_len || output_len < ilen - tag_len) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + return mbedtls_cipher_aead_decrypt(ctx, iv, iv_len, ad, ad_len, + input, ilen - tag_len, output, olen, + input + ilen - tag_len, tag_len); +#else + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; +#endif /* MBEDTLS_CIPHER_MODE_AEAD */ +} +#endif /* MBEDTLS_CIPHER_MODE_AEAD || MBEDTLS_NIST_KW_C */ + +#endif /* MBEDTLS_CIPHER_C */ diff --git a/ext/opcua_client/mbedtls/library/cipher_wrap.c b/ext/opcua_client/mbedtls/library/cipher_wrap.c new file mode 100644 index 0000000..5f8dde3 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/cipher_wrap.c @@ -0,0 +1,2407 @@ +/** + * \file cipher_wrap.c + * + * \brief Generic cipher wrapper for Mbed TLS + * + * \author Adriaan de Jong + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_CIPHER_C) + +#include "mbedtls/cipher_internal.h" +#include "mbedtls/error.h" + +#if defined(MBEDTLS_CHACHAPOLY_C) +#include "mbedtls/chachapoly.h" +#endif + +#if defined(MBEDTLS_AES_C) +#include "mbedtls/aes.h" +#endif + +#if defined(MBEDTLS_ARC4_C) +#include "mbedtls/arc4.h" +#endif + +#if defined(MBEDTLS_CAMELLIA_C) +#include "mbedtls/camellia.h" +#endif + +#if defined(MBEDTLS_ARIA_C) +#include "mbedtls/aria.h" +#endif + +#if defined(MBEDTLS_DES_C) +#include "mbedtls/des.h" +#endif + +#if defined(MBEDTLS_BLOWFISH_C) +#include "mbedtls/blowfish.h" +#endif + +#if defined(MBEDTLS_CHACHA20_C) +#include "mbedtls/chacha20.h" +#endif + +#if defined(MBEDTLS_GCM_C) +#include "mbedtls/gcm.h" +#endif + +#if defined(MBEDTLS_CCM_C) +#include "mbedtls/ccm.h" +#endif + +#if defined(MBEDTLS_NIST_KW_C) +#include "mbedtls/nist_kw.h" +#endif + +#if defined(MBEDTLS_CIPHER_NULL_CIPHER) +#include +#endif + +#include "mbedtls/platform.h" + +#if defined(MBEDTLS_GCM_C) +/* shared by all GCM ciphers */ +static void *gcm_ctx_alloc(void) +{ + void *ctx = mbedtls_calloc(1, sizeof(mbedtls_gcm_context)); + + if (ctx != NULL) { + mbedtls_gcm_init((mbedtls_gcm_context *) ctx); + } + + return ctx; +} + +static void gcm_ctx_free(void *ctx) +{ + mbedtls_gcm_free(ctx); + mbedtls_free(ctx); +} +#endif /* MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_CCM_C) +/* shared by all CCM ciphers */ +static void *ccm_ctx_alloc(void) +{ + void *ctx = mbedtls_calloc(1, sizeof(mbedtls_ccm_context)); + + if (ctx != NULL) { + mbedtls_ccm_init((mbedtls_ccm_context *) ctx); + } + + return ctx; +} + +static void ccm_ctx_free(void *ctx) +{ + mbedtls_ccm_free(ctx); + mbedtls_free(ctx); +} +#endif /* MBEDTLS_CCM_C */ + +#if defined(MBEDTLS_AES_C) + +static int aes_crypt_ecb_wrap(void *ctx, mbedtls_operation_t operation, + const unsigned char *input, unsigned char *output) +{ + return mbedtls_aes_crypt_ecb((mbedtls_aes_context *) ctx, operation, input, output); +} + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static int aes_crypt_cbc_wrap(void *ctx, mbedtls_operation_t operation, size_t length, + unsigned char *iv, const unsigned char *input, unsigned char *output) +{ + return mbedtls_aes_crypt_cbc((mbedtls_aes_context *) ctx, operation, length, iv, input, + output); +} +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +static int aes_crypt_cfb128_wrap(void *ctx, mbedtls_operation_t operation, + size_t length, size_t *iv_off, unsigned char *iv, + const unsigned char *input, unsigned char *output) +{ + return mbedtls_aes_crypt_cfb128((mbedtls_aes_context *) ctx, operation, length, iv_off, iv, + input, output); +} +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_OFB) +static int aes_crypt_ofb_wrap(void *ctx, size_t length, size_t *iv_off, + unsigned char *iv, const unsigned char *input, unsigned char *output) +{ + return mbedtls_aes_crypt_ofb((mbedtls_aes_context *) ctx, length, iv_off, + iv, input, output); +} +#endif /* MBEDTLS_CIPHER_MODE_OFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +static int aes_crypt_ctr_wrap(void *ctx, size_t length, size_t *nc_off, + unsigned char *nonce_counter, unsigned char *stream_block, + const unsigned char *input, unsigned char *output) +{ + return mbedtls_aes_crypt_ctr((mbedtls_aes_context *) ctx, length, nc_off, nonce_counter, + stream_block, input, output); +} +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +#if defined(MBEDTLS_CIPHER_MODE_XTS) +static int aes_crypt_xts_wrap(void *ctx, mbedtls_operation_t operation, + size_t length, + const unsigned char data_unit[16], + const unsigned char *input, + unsigned char *output) +{ + mbedtls_aes_xts_context *xts_ctx = ctx; + int mode; + + switch (operation) { + case MBEDTLS_ENCRYPT: + mode = MBEDTLS_AES_ENCRYPT; + break; + case MBEDTLS_DECRYPT: + mode = MBEDTLS_AES_DECRYPT; + break; + default: + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + return mbedtls_aes_crypt_xts(xts_ctx, mode, length, + data_unit, input, output); +} +#endif /* MBEDTLS_CIPHER_MODE_XTS */ + +static int aes_setkey_dec_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_aes_setkey_dec((mbedtls_aes_context *) ctx, key, key_bitlen); +} + +static int aes_setkey_enc_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_aes_setkey_enc((mbedtls_aes_context *) ctx, key, key_bitlen); +} + +static void *aes_ctx_alloc(void) +{ + mbedtls_aes_context *aes = mbedtls_calloc(1, sizeof(mbedtls_aes_context)); + + if (aes == NULL) { + return NULL; + } + + mbedtls_aes_init(aes); + + return aes; +} + +static void aes_ctx_free(void *ctx) +{ + mbedtls_aes_free((mbedtls_aes_context *) ctx); + mbedtls_free(ctx); +} + +static const mbedtls_cipher_base_t aes_info = { + MBEDTLS_CIPHER_ID_AES, + aes_crypt_ecb_wrap, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + aes_crypt_cbc_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + aes_crypt_cfb128_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + aes_crypt_ofb_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + aes_crypt_ctr_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + aes_setkey_enc_wrap, + aes_setkey_dec_wrap, + aes_ctx_alloc, + aes_ctx_free +}; + +static const mbedtls_cipher_info_t aes_128_ecb_info = { + MBEDTLS_CIPHER_AES_128_ECB, + MBEDTLS_MODE_ECB, + 128, + "AES-128-ECB", + 0, + 0, + 16, + &aes_info +}; + +static const mbedtls_cipher_info_t aes_192_ecb_info = { + MBEDTLS_CIPHER_AES_192_ECB, + MBEDTLS_MODE_ECB, + 192, + "AES-192-ECB", + 0, + 0, + 16, + &aes_info +}; + +static const mbedtls_cipher_info_t aes_256_ecb_info = { + MBEDTLS_CIPHER_AES_256_ECB, + MBEDTLS_MODE_ECB, + 256, + "AES-256-ECB", + 0, + 0, + 16, + &aes_info +}; + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static const mbedtls_cipher_info_t aes_128_cbc_info = { + MBEDTLS_CIPHER_AES_128_CBC, + MBEDTLS_MODE_CBC, + 128, + "AES-128-CBC", + 16, + 0, + 16, + &aes_info +}; + +static const mbedtls_cipher_info_t aes_192_cbc_info = { + MBEDTLS_CIPHER_AES_192_CBC, + MBEDTLS_MODE_CBC, + 192, + "AES-192-CBC", + 16, + 0, + 16, + &aes_info +}; + +static const mbedtls_cipher_info_t aes_256_cbc_info = { + MBEDTLS_CIPHER_AES_256_CBC, + MBEDTLS_MODE_CBC, + 256, + "AES-256-CBC", + 16, + 0, + 16, + &aes_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +static const mbedtls_cipher_info_t aes_128_cfb128_info = { + MBEDTLS_CIPHER_AES_128_CFB128, + MBEDTLS_MODE_CFB, + 128, + "AES-128-CFB128", + 16, + 0, + 16, + &aes_info +}; + +static const mbedtls_cipher_info_t aes_192_cfb128_info = { + MBEDTLS_CIPHER_AES_192_CFB128, + MBEDTLS_MODE_CFB, + 192, + "AES-192-CFB128", + 16, + 0, + 16, + &aes_info +}; + +static const mbedtls_cipher_info_t aes_256_cfb128_info = { + MBEDTLS_CIPHER_AES_256_CFB128, + MBEDTLS_MODE_CFB, + 256, + "AES-256-CFB128", + 16, + 0, + 16, + &aes_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_OFB) +static const mbedtls_cipher_info_t aes_128_ofb_info = { + MBEDTLS_CIPHER_AES_128_OFB, + MBEDTLS_MODE_OFB, + 128, + "AES-128-OFB", + 16, + 0, + 16, + &aes_info +}; + +static const mbedtls_cipher_info_t aes_192_ofb_info = { + MBEDTLS_CIPHER_AES_192_OFB, + MBEDTLS_MODE_OFB, + 192, + "AES-192-OFB", + 16, + 0, + 16, + &aes_info +}; + +static const mbedtls_cipher_info_t aes_256_ofb_info = { + MBEDTLS_CIPHER_AES_256_OFB, + MBEDTLS_MODE_OFB, + 256, + "AES-256-OFB", + 16, + 0, + 16, + &aes_info +}; +#endif /* MBEDTLS_CIPHER_MODE_OFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +static const mbedtls_cipher_info_t aes_128_ctr_info = { + MBEDTLS_CIPHER_AES_128_CTR, + MBEDTLS_MODE_CTR, + 128, + "AES-128-CTR", + 16, + 0, + 16, + &aes_info +}; + +static const mbedtls_cipher_info_t aes_192_ctr_info = { + MBEDTLS_CIPHER_AES_192_CTR, + MBEDTLS_MODE_CTR, + 192, + "AES-192-CTR", + 16, + 0, + 16, + &aes_info +}; + +static const mbedtls_cipher_info_t aes_256_ctr_info = { + MBEDTLS_CIPHER_AES_256_CTR, + MBEDTLS_MODE_CTR, + 256, + "AES-256-CTR", + 16, + 0, + 16, + &aes_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +#if defined(MBEDTLS_CIPHER_MODE_XTS) +static int xts_aes_setkey_enc_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + mbedtls_aes_xts_context *xts_ctx = ctx; + return mbedtls_aes_xts_setkey_enc(xts_ctx, key, key_bitlen); +} + +static int xts_aes_setkey_dec_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + mbedtls_aes_xts_context *xts_ctx = ctx; + return mbedtls_aes_xts_setkey_dec(xts_ctx, key, key_bitlen); +} + +static void *xts_aes_ctx_alloc(void) +{ + mbedtls_aes_xts_context *xts_ctx = mbedtls_calloc(1, sizeof(*xts_ctx)); + + if (xts_ctx != NULL) { + mbedtls_aes_xts_init(xts_ctx); + } + + return xts_ctx; +} + +static void xts_aes_ctx_free(void *ctx) +{ + mbedtls_aes_xts_context *xts_ctx = ctx; + + if (xts_ctx == NULL) { + return; + } + + mbedtls_aes_xts_free(xts_ctx); + mbedtls_free(xts_ctx); +} + +static const mbedtls_cipher_base_t xts_aes_info = { + MBEDTLS_CIPHER_ID_AES, + NULL, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + aes_crypt_xts_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + xts_aes_setkey_enc_wrap, + xts_aes_setkey_dec_wrap, + xts_aes_ctx_alloc, + xts_aes_ctx_free +}; + +static const mbedtls_cipher_info_t aes_128_xts_info = { + MBEDTLS_CIPHER_AES_128_XTS, + MBEDTLS_MODE_XTS, + 256, + "AES-128-XTS", + 16, + 0, + 16, + &xts_aes_info +}; + +static const mbedtls_cipher_info_t aes_256_xts_info = { + MBEDTLS_CIPHER_AES_256_XTS, + MBEDTLS_MODE_XTS, + 512, + "AES-256-XTS", + 16, + 0, + 16, + &xts_aes_info +}; +#endif /* MBEDTLS_CIPHER_MODE_XTS */ + +#if defined(MBEDTLS_GCM_C) +static int gcm_aes_setkey_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_gcm_setkey((mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_AES, + key, key_bitlen); +} + +static const mbedtls_cipher_base_t gcm_aes_info = { + MBEDTLS_CIPHER_ID_AES, + NULL, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + gcm_aes_setkey_wrap, + gcm_aes_setkey_wrap, + gcm_ctx_alloc, + gcm_ctx_free, +}; + +static const mbedtls_cipher_info_t aes_128_gcm_info = { + MBEDTLS_CIPHER_AES_128_GCM, + MBEDTLS_MODE_GCM, + 128, + "AES-128-GCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &gcm_aes_info +}; + +static const mbedtls_cipher_info_t aes_192_gcm_info = { + MBEDTLS_CIPHER_AES_192_GCM, + MBEDTLS_MODE_GCM, + 192, + "AES-192-GCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &gcm_aes_info +}; + +static const mbedtls_cipher_info_t aes_256_gcm_info = { + MBEDTLS_CIPHER_AES_256_GCM, + MBEDTLS_MODE_GCM, + 256, + "AES-256-GCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &gcm_aes_info +}; +#endif /* MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_CCM_C) +static int ccm_aes_setkey_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_ccm_setkey((mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_AES, + key, key_bitlen); +} + +static const mbedtls_cipher_base_t ccm_aes_info = { + MBEDTLS_CIPHER_ID_AES, + NULL, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + ccm_aes_setkey_wrap, + ccm_aes_setkey_wrap, + ccm_ctx_alloc, + ccm_ctx_free, +}; + +static const mbedtls_cipher_info_t aes_128_ccm_info = { + MBEDTLS_CIPHER_AES_128_CCM, + MBEDTLS_MODE_CCM, + 128, + "AES-128-CCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &ccm_aes_info +}; + +static const mbedtls_cipher_info_t aes_192_ccm_info = { + MBEDTLS_CIPHER_AES_192_CCM, + MBEDTLS_MODE_CCM, + 192, + "AES-192-CCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &ccm_aes_info +}; + +static const mbedtls_cipher_info_t aes_256_ccm_info = { + MBEDTLS_CIPHER_AES_256_CCM, + MBEDTLS_MODE_CCM, + 256, + "AES-256-CCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &ccm_aes_info +}; +#endif /* MBEDTLS_CCM_C */ + +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_CAMELLIA_C) + +static int camellia_crypt_ecb_wrap(void *ctx, mbedtls_operation_t operation, + const unsigned char *input, unsigned char *output) +{ + return mbedtls_camellia_crypt_ecb((mbedtls_camellia_context *) ctx, operation, input, + output); +} + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static int camellia_crypt_cbc_wrap(void *ctx, mbedtls_operation_t operation, + size_t length, unsigned char *iv, + const unsigned char *input, unsigned char *output) +{ + return mbedtls_camellia_crypt_cbc((mbedtls_camellia_context *) ctx, operation, length, iv, + input, output); +} +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +static int camellia_crypt_cfb128_wrap(void *ctx, mbedtls_operation_t operation, + size_t length, size_t *iv_off, unsigned char *iv, + const unsigned char *input, unsigned char *output) +{ + return mbedtls_camellia_crypt_cfb128((mbedtls_camellia_context *) ctx, operation, length, + iv_off, iv, input, output); +} +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +static int camellia_crypt_ctr_wrap(void *ctx, size_t length, size_t *nc_off, + unsigned char *nonce_counter, unsigned char *stream_block, + const unsigned char *input, unsigned char *output) +{ + return mbedtls_camellia_crypt_ctr((mbedtls_camellia_context *) ctx, length, nc_off, + nonce_counter, stream_block, input, output); +} +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +static int camellia_setkey_dec_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_camellia_setkey_dec((mbedtls_camellia_context *) ctx, key, key_bitlen); +} + +static int camellia_setkey_enc_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_camellia_setkey_enc((mbedtls_camellia_context *) ctx, key, key_bitlen); +} + +static void *camellia_ctx_alloc(void) +{ + mbedtls_camellia_context *ctx; + ctx = mbedtls_calloc(1, sizeof(mbedtls_camellia_context)); + + if (ctx == NULL) { + return NULL; + } + + mbedtls_camellia_init(ctx); + + return ctx; +} + +static void camellia_ctx_free(void *ctx) +{ + mbedtls_camellia_free((mbedtls_camellia_context *) ctx); + mbedtls_free(ctx); +} + +static const mbedtls_cipher_base_t camellia_info = { + MBEDTLS_CIPHER_ID_CAMELLIA, + camellia_crypt_ecb_wrap, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + camellia_crypt_cbc_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + camellia_crypt_cfb128_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + camellia_crypt_ctr_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + camellia_setkey_enc_wrap, + camellia_setkey_dec_wrap, + camellia_ctx_alloc, + camellia_ctx_free +}; + +static const mbedtls_cipher_info_t camellia_128_ecb_info = { + MBEDTLS_CIPHER_CAMELLIA_128_ECB, + MBEDTLS_MODE_ECB, + 128, + "CAMELLIA-128-ECB", + 0, + 0, + 16, + &camellia_info +}; + +static const mbedtls_cipher_info_t camellia_192_ecb_info = { + MBEDTLS_CIPHER_CAMELLIA_192_ECB, + MBEDTLS_MODE_ECB, + 192, + "CAMELLIA-192-ECB", + 0, + 0, + 16, + &camellia_info +}; + +static const mbedtls_cipher_info_t camellia_256_ecb_info = { + MBEDTLS_CIPHER_CAMELLIA_256_ECB, + MBEDTLS_MODE_ECB, + 256, + "CAMELLIA-256-ECB", + 0, + 0, + 16, + &camellia_info +}; + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static const mbedtls_cipher_info_t camellia_128_cbc_info = { + MBEDTLS_CIPHER_CAMELLIA_128_CBC, + MBEDTLS_MODE_CBC, + 128, + "CAMELLIA-128-CBC", + 16, + 0, + 16, + &camellia_info +}; + +static const mbedtls_cipher_info_t camellia_192_cbc_info = { + MBEDTLS_CIPHER_CAMELLIA_192_CBC, + MBEDTLS_MODE_CBC, + 192, + "CAMELLIA-192-CBC", + 16, + 0, + 16, + &camellia_info +}; + +static const mbedtls_cipher_info_t camellia_256_cbc_info = { + MBEDTLS_CIPHER_CAMELLIA_256_CBC, + MBEDTLS_MODE_CBC, + 256, + "CAMELLIA-256-CBC", + 16, + 0, + 16, + &camellia_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +static const mbedtls_cipher_info_t camellia_128_cfb128_info = { + MBEDTLS_CIPHER_CAMELLIA_128_CFB128, + MBEDTLS_MODE_CFB, + 128, + "CAMELLIA-128-CFB128", + 16, + 0, + 16, + &camellia_info +}; + +static const mbedtls_cipher_info_t camellia_192_cfb128_info = { + MBEDTLS_CIPHER_CAMELLIA_192_CFB128, + MBEDTLS_MODE_CFB, + 192, + "CAMELLIA-192-CFB128", + 16, + 0, + 16, + &camellia_info +}; + +static const mbedtls_cipher_info_t camellia_256_cfb128_info = { + MBEDTLS_CIPHER_CAMELLIA_256_CFB128, + MBEDTLS_MODE_CFB, + 256, + "CAMELLIA-256-CFB128", + 16, + 0, + 16, + &camellia_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +static const mbedtls_cipher_info_t camellia_128_ctr_info = { + MBEDTLS_CIPHER_CAMELLIA_128_CTR, + MBEDTLS_MODE_CTR, + 128, + "CAMELLIA-128-CTR", + 16, + 0, + 16, + &camellia_info +}; + +static const mbedtls_cipher_info_t camellia_192_ctr_info = { + MBEDTLS_CIPHER_CAMELLIA_192_CTR, + MBEDTLS_MODE_CTR, + 192, + "CAMELLIA-192-CTR", + 16, + 0, + 16, + &camellia_info +}; + +static const mbedtls_cipher_info_t camellia_256_ctr_info = { + MBEDTLS_CIPHER_CAMELLIA_256_CTR, + MBEDTLS_MODE_CTR, + 256, + "CAMELLIA-256-CTR", + 16, + 0, + 16, + &camellia_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +#if defined(MBEDTLS_GCM_C) +static int gcm_camellia_setkey_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_gcm_setkey((mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA, + key, key_bitlen); +} + +static const mbedtls_cipher_base_t gcm_camellia_info = { + MBEDTLS_CIPHER_ID_CAMELLIA, + NULL, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + gcm_camellia_setkey_wrap, + gcm_camellia_setkey_wrap, + gcm_ctx_alloc, + gcm_ctx_free, +}; + +static const mbedtls_cipher_info_t camellia_128_gcm_info = { + MBEDTLS_CIPHER_CAMELLIA_128_GCM, + MBEDTLS_MODE_GCM, + 128, + "CAMELLIA-128-GCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &gcm_camellia_info +}; + +static const mbedtls_cipher_info_t camellia_192_gcm_info = { + MBEDTLS_CIPHER_CAMELLIA_192_GCM, + MBEDTLS_MODE_GCM, + 192, + "CAMELLIA-192-GCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &gcm_camellia_info +}; + +static const mbedtls_cipher_info_t camellia_256_gcm_info = { + MBEDTLS_CIPHER_CAMELLIA_256_GCM, + MBEDTLS_MODE_GCM, + 256, + "CAMELLIA-256-GCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &gcm_camellia_info +}; +#endif /* MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_CCM_C) +static int ccm_camellia_setkey_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_ccm_setkey((mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA, + key, key_bitlen); +} + +static const mbedtls_cipher_base_t ccm_camellia_info = { + MBEDTLS_CIPHER_ID_CAMELLIA, + NULL, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + ccm_camellia_setkey_wrap, + ccm_camellia_setkey_wrap, + ccm_ctx_alloc, + ccm_ctx_free, +}; + +static const mbedtls_cipher_info_t camellia_128_ccm_info = { + MBEDTLS_CIPHER_CAMELLIA_128_CCM, + MBEDTLS_MODE_CCM, + 128, + "CAMELLIA-128-CCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &ccm_camellia_info +}; + +static const mbedtls_cipher_info_t camellia_192_ccm_info = { + MBEDTLS_CIPHER_CAMELLIA_192_CCM, + MBEDTLS_MODE_CCM, + 192, + "CAMELLIA-192-CCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &ccm_camellia_info +}; + +static const mbedtls_cipher_info_t camellia_256_ccm_info = { + MBEDTLS_CIPHER_CAMELLIA_256_CCM, + MBEDTLS_MODE_CCM, + 256, + "CAMELLIA-256-CCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &ccm_camellia_info +}; +#endif /* MBEDTLS_CCM_C */ + +#endif /* MBEDTLS_CAMELLIA_C */ + +#if defined(MBEDTLS_ARIA_C) + +static int aria_crypt_ecb_wrap(void *ctx, mbedtls_operation_t operation, + const unsigned char *input, unsigned char *output) +{ + (void) operation; + return mbedtls_aria_crypt_ecb((mbedtls_aria_context *) ctx, input, + output); +} + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static int aria_crypt_cbc_wrap(void *ctx, mbedtls_operation_t operation, + size_t length, unsigned char *iv, + const unsigned char *input, unsigned char *output) +{ + return mbedtls_aria_crypt_cbc((mbedtls_aria_context *) ctx, operation, length, iv, + input, output); +} +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +static int aria_crypt_cfb128_wrap(void *ctx, mbedtls_operation_t operation, + size_t length, size_t *iv_off, unsigned char *iv, + const unsigned char *input, unsigned char *output) +{ + return mbedtls_aria_crypt_cfb128((mbedtls_aria_context *) ctx, operation, length, + iv_off, iv, input, output); +} +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +static int aria_crypt_ctr_wrap(void *ctx, size_t length, size_t *nc_off, + unsigned char *nonce_counter, unsigned char *stream_block, + const unsigned char *input, unsigned char *output) +{ + return mbedtls_aria_crypt_ctr((mbedtls_aria_context *) ctx, length, nc_off, + nonce_counter, stream_block, input, output); +} +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +static int aria_setkey_dec_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_aria_setkey_dec((mbedtls_aria_context *) ctx, key, key_bitlen); +} + +static int aria_setkey_enc_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_aria_setkey_enc((mbedtls_aria_context *) ctx, key, key_bitlen); +} + +static void *aria_ctx_alloc(void) +{ + mbedtls_aria_context *ctx; + ctx = mbedtls_calloc(1, sizeof(mbedtls_aria_context)); + + if (ctx == NULL) { + return NULL; + } + + mbedtls_aria_init(ctx); + + return ctx; +} + +static void aria_ctx_free(void *ctx) +{ + mbedtls_aria_free((mbedtls_aria_context *) ctx); + mbedtls_free(ctx); +} + +static const mbedtls_cipher_base_t aria_info = { + MBEDTLS_CIPHER_ID_ARIA, + aria_crypt_ecb_wrap, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + aria_crypt_cbc_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + aria_crypt_cfb128_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + aria_crypt_ctr_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + aria_setkey_enc_wrap, + aria_setkey_dec_wrap, + aria_ctx_alloc, + aria_ctx_free +}; + +static const mbedtls_cipher_info_t aria_128_ecb_info = { + MBEDTLS_CIPHER_ARIA_128_ECB, + MBEDTLS_MODE_ECB, + 128, + "ARIA-128-ECB", + 0, + 0, + 16, + &aria_info +}; + +static const mbedtls_cipher_info_t aria_192_ecb_info = { + MBEDTLS_CIPHER_ARIA_192_ECB, + MBEDTLS_MODE_ECB, + 192, + "ARIA-192-ECB", + 0, + 0, + 16, + &aria_info +}; + +static const mbedtls_cipher_info_t aria_256_ecb_info = { + MBEDTLS_CIPHER_ARIA_256_ECB, + MBEDTLS_MODE_ECB, + 256, + "ARIA-256-ECB", + 0, + 0, + 16, + &aria_info +}; + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static const mbedtls_cipher_info_t aria_128_cbc_info = { + MBEDTLS_CIPHER_ARIA_128_CBC, + MBEDTLS_MODE_CBC, + 128, + "ARIA-128-CBC", + 16, + 0, + 16, + &aria_info +}; + +static const mbedtls_cipher_info_t aria_192_cbc_info = { + MBEDTLS_CIPHER_ARIA_192_CBC, + MBEDTLS_MODE_CBC, + 192, + "ARIA-192-CBC", + 16, + 0, + 16, + &aria_info +}; + +static const mbedtls_cipher_info_t aria_256_cbc_info = { + MBEDTLS_CIPHER_ARIA_256_CBC, + MBEDTLS_MODE_CBC, + 256, + "ARIA-256-CBC", + 16, + 0, + 16, + &aria_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +static const mbedtls_cipher_info_t aria_128_cfb128_info = { + MBEDTLS_CIPHER_ARIA_128_CFB128, + MBEDTLS_MODE_CFB, + 128, + "ARIA-128-CFB128", + 16, + 0, + 16, + &aria_info +}; + +static const mbedtls_cipher_info_t aria_192_cfb128_info = { + MBEDTLS_CIPHER_ARIA_192_CFB128, + MBEDTLS_MODE_CFB, + 192, + "ARIA-192-CFB128", + 16, + 0, + 16, + &aria_info +}; + +static const mbedtls_cipher_info_t aria_256_cfb128_info = { + MBEDTLS_CIPHER_ARIA_256_CFB128, + MBEDTLS_MODE_CFB, + 256, + "ARIA-256-CFB128", + 16, + 0, + 16, + &aria_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +static const mbedtls_cipher_info_t aria_128_ctr_info = { + MBEDTLS_CIPHER_ARIA_128_CTR, + MBEDTLS_MODE_CTR, + 128, + "ARIA-128-CTR", + 16, + 0, + 16, + &aria_info +}; + +static const mbedtls_cipher_info_t aria_192_ctr_info = { + MBEDTLS_CIPHER_ARIA_192_CTR, + MBEDTLS_MODE_CTR, + 192, + "ARIA-192-CTR", + 16, + 0, + 16, + &aria_info +}; + +static const mbedtls_cipher_info_t aria_256_ctr_info = { + MBEDTLS_CIPHER_ARIA_256_CTR, + MBEDTLS_MODE_CTR, + 256, + "ARIA-256-CTR", + 16, + 0, + 16, + &aria_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +#if defined(MBEDTLS_GCM_C) +static int gcm_aria_setkey_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_gcm_setkey((mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_ARIA, + key, key_bitlen); +} + +static const mbedtls_cipher_base_t gcm_aria_info = { + MBEDTLS_CIPHER_ID_ARIA, + NULL, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + gcm_aria_setkey_wrap, + gcm_aria_setkey_wrap, + gcm_ctx_alloc, + gcm_ctx_free, +}; + +static const mbedtls_cipher_info_t aria_128_gcm_info = { + MBEDTLS_CIPHER_ARIA_128_GCM, + MBEDTLS_MODE_GCM, + 128, + "ARIA-128-GCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &gcm_aria_info +}; + +static const mbedtls_cipher_info_t aria_192_gcm_info = { + MBEDTLS_CIPHER_ARIA_192_GCM, + MBEDTLS_MODE_GCM, + 192, + "ARIA-192-GCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &gcm_aria_info +}; + +static const mbedtls_cipher_info_t aria_256_gcm_info = { + MBEDTLS_CIPHER_ARIA_256_GCM, + MBEDTLS_MODE_GCM, + 256, + "ARIA-256-GCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &gcm_aria_info +}; +#endif /* MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_CCM_C) +static int ccm_aria_setkey_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_ccm_setkey((mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_ARIA, + key, key_bitlen); +} + +static const mbedtls_cipher_base_t ccm_aria_info = { + MBEDTLS_CIPHER_ID_ARIA, + NULL, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + ccm_aria_setkey_wrap, + ccm_aria_setkey_wrap, + ccm_ctx_alloc, + ccm_ctx_free, +}; + +static const mbedtls_cipher_info_t aria_128_ccm_info = { + MBEDTLS_CIPHER_ARIA_128_CCM, + MBEDTLS_MODE_CCM, + 128, + "ARIA-128-CCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &ccm_aria_info +}; + +static const mbedtls_cipher_info_t aria_192_ccm_info = { + MBEDTLS_CIPHER_ARIA_192_CCM, + MBEDTLS_MODE_CCM, + 192, + "ARIA-192-CCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &ccm_aria_info +}; + +static const mbedtls_cipher_info_t aria_256_ccm_info = { + MBEDTLS_CIPHER_ARIA_256_CCM, + MBEDTLS_MODE_CCM, + 256, + "ARIA-256-CCM", + 12, + MBEDTLS_CIPHER_VARIABLE_IV_LEN, + 16, + &ccm_aria_info +}; +#endif /* MBEDTLS_CCM_C */ + +#endif /* MBEDTLS_ARIA_C */ + +#if defined(MBEDTLS_DES_C) + +static int des_crypt_ecb_wrap(void *ctx, mbedtls_operation_t operation, + const unsigned char *input, unsigned char *output) +{ + ((void) operation); + return mbedtls_des_crypt_ecb((mbedtls_des_context *) ctx, input, output); +} + +static int des3_crypt_ecb_wrap(void *ctx, mbedtls_operation_t operation, + const unsigned char *input, unsigned char *output) +{ + ((void) operation); + return mbedtls_des3_crypt_ecb((mbedtls_des3_context *) ctx, input, output); +} + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static int des_crypt_cbc_wrap(void *ctx, mbedtls_operation_t operation, size_t length, + unsigned char *iv, const unsigned char *input, unsigned char *output) +{ + return mbedtls_des_crypt_cbc((mbedtls_des_context *) ctx, operation, length, iv, input, + output); +} +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static int des3_crypt_cbc_wrap(void *ctx, mbedtls_operation_t operation, size_t length, + unsigned char *iv, const unsigned char *input, unsigned char *output) +{ + return mbedtls_des3_crypt_cbc((mbedtls_des3_context *) ctx, operation, length, iv, input, + output); +} +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +static int des_setkey_dec_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + ((void) key_bitlen); + + return mbedtls_des_setkey_dec((mbedtls_des_context *) ctx, key); +} + +static int des_setkey_enc_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + ((void) key_bitlen); + + return mbedtls_des_setkey_enc((mbedtls_des_context *) ctx, key); +} + +static int des3_set2key_dec_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + ((void) key_bitlen); + + return mbedtls_des3_set2key_dec((mbedtls_des3_context *) ctx, key); +} + +static int des3_set2key_enc_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + ((void) key_bitlen); + + return mbedtls_des3_set2key_enc((mbedtls_des3_context *) ctx, key); +} + +static int des3_set3key_dec_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + ((void) key_bitlen); + + return mbedtls_des3_set3key_dec((mbedtls_des3_context *) ctx, key); +} + +static int des3_set3key_enc_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + ((void) key_bitlen); + + return mbedtls_des3_set3key_enc((mbedtls_des3_context *) ctx, key); +} + +static void *des_ctx_alloc(void) +{ + mbedtls_des_context *des = mbedtls_calloc(1, sizeof(mbedtls_des_context)); + + if (des == NULL) { + return NULL; + } + + mbedtls_des_init(des); + + return des; +} + +static void des_ctx_free(void *ctx) +{ + mbedtls_des_free((mbedtls_des_context *) ctx); + mbedtls_free(ctx); +} + +static void *des3_ctx_alloc(void) +{ + mbedtls_des3_context *des3; + des3 = mbedtls_calloc(1, sizeof(mbedtls_des3_context)); + + if (des3 == NULL) { + return NULL; + } + + mbedtls_des3_init(des3); + + return des3; +} + +static void des3_ctx_free(void *ctx) +{ + mbedtls_des3_free((mbedtls_des3_context *) ctx); + mbedtls_free(ctx); +} + +static const mbedtls_cipher_base_t des_info = { + MBEDTLS_CIPHER_ID_DES, + des_crypt_ecb_wrap, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + des_crypt_cbc_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + des_setkey_enc_wrap, + des_setkey_dec_wrap, + des_ctx_alloc, + des_ctx_free +}; + +static const mbedtls_cipher_info_t des_ecb_info = { + MBEDTLS_CIPHER_DES_ECB, + MBEDTLS_MODE_ECB, + MBEDTLS_KEY_LENGTH_DES, + "DES-ECB", + 0, + 0, + 8, + &des_info +}; + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static const mbedtls_cipher_info_t des_cbc_info = { + MBEDTLS_CIPHER_DES_CBC, + MBEDTLS_MODE_CBC, + MBEDTLS_KEY_LENGTH_DES, + "DES-CBC", + 8, + 0, + 8, + &des_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +static const mbedtls_cipher_base_t des_ede_info = { + MBEDTLS_CIPHER_ID_DES, + des3_crypt_ecb_wrap, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + des3_crypt_cbc_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + des3_set2key_enc_wrap, + des3_set2key_dec_wrap, + des3_ctx_alloc, + des3_ctx_free +}; + +static const mbedtls_cipher_info_t des_ede_ecb_info = { + MBEDTLS_CIPHER_DES_EDE_ECB, + MBEDTLS_MODE_ECB, + MBEDTLS_KEY_LENGTH_DES_EDE, + "DES-EDE-ECB", + 0, + 0, + 8, + &des_ede_info +}; + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static const mbedtls_cipher_info_t des_ede_cbc_info = { + MBEDTLS_CIPHER_DES_EDE_CBC, + MBEDTLS_MODE_CBC, + MBEDTLS_KEY_LENGTH_DES_EDE, + "DES-EDE-CBC", + 8, + 0, + 8, + &des_ede_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +static const mbedtls_cipher_base_t des_ede3_info = { + MBEDTLS_CIPHER_ID_3DES, + des3_crypt_ecb_wrap, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + des3_crypt_cbc_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + des3_set3key_enc_wrap, + des3_set3key_dec_wrap, + des3_ctx_alloc, + des3_ctx_free +}; + +static const mbedtls_cipher_info_t des_ede3_ecb_info = { + MBEDTLS_CIPHER_DES_EDE3_ECB, + MBEDTLS_MODE_ECB, + MBEDTLS_KEY_LENGTH_DES_EDE3, + "DES-EDE3-ECB", + 0, + 0, + 8, + &des_ede3_info +}; +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static const mbedtls_cipher_info_t des_ede3_cbc_info = { + MBEDTLS_CIPHER_DES_EDE3_CBC, + MBEDTLS_MODE_CBC, + MBEDTLS_KEY_LENGTH_DES_EDE3, + "DES-EDE3-CBC", + 8, + 0, + 8, + &des_ede3_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_BLOWFISH_C) + +static int blowfish_crypt_ecb_wrap(void *ctx, mbedtls_operation_t operation, + const unsigned char *input, unsigned char *output) +{ + return mbedtls_blowfish_crypt_ecb((mbedtls_blowfish_context *) ctx, operation, input, + output); +} + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static int blowfish_crypt_cbc_wrap(void *ctx, mbedtls_operation_t operation, + size_t length, unsigned char *iv, const unsigned char *input, + unsigned char *output) +{ + return mbedtls_blowfish_crypt_cbc((mbedtls_blowfish_context *) ctx, operation, length, iv, + input, output); +} +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +static int blowfish_crypt_cfb64_wrap(void *ctx, mbedtls_operation_t operation, + size_t length, size_t *iv_off, unsigned char *iv, + const unsigned char *input, unsigned char *output) +{ + return mbedtls_blowfish_crypt_cfb64((mbedtls_blowfish_context *) ctx, operation, length, + iv_off, iv, input, output); +} +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +static int blowfish_crypt_ctr_wrap(void *ctx, size_t length, size_t *nc_off, + unsigned char *nonce_counter, unsigned char *stream_block, + const unsigned char *input, unsigned char *output) +{ + return mbedtls_blowfish_crypt_ctr((mbedtls_blowfish_context *) ctx, length, nc_off, + nonce_counter, stream_block, input, output); +} +#endif /* MBEDTLS_CIPHER_MODE_CTR */ + +static int blowfish_setkey_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_blowfish_setkey((mbedtls_blowfish_context *) ctx, key, key_bitlen); +} + +static void *blowfish_ctx_alloc(void) +{ + mbedtls_blowfish_context *ctx; + ctx = mbedtls_calloc(1, sizeof(mbedtls_blowfish_context)); + + if (ctx == NULL) { + return NULL; + } + + mbedtls_blowfish_init(ctx); + + return ctx; +} + +static void blowfish_ctx_free(void *ctx) +{ + mbedtls_blowfish_free((mbedtls_blowfish_context *) ctx); + mbedtls_free(ctx); +} + +static const mbedtls_cipher_base_t blowfish_info = { + MBEDTLS_CIPHER_ID_BLOWFISH, + blowfish_crypt_ecb_wrap, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + blowfish_crypt_cbc_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + blowfish_crypt_cfb64_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + blowfish_crypt_ctr_wrap, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + blowfish_setkey_wrap, + blowfish_setkey_wrap, + blowfish_ctx_alloc, + blowfish_ctx_free +}; + +static const mbedtls_cipher_info_t blowfish_ecb_info = { + MBEDTLS_CIPHER_BLOWFISH_ECB, + MBEDTLS_MODE_ECB, + 128, + "BLOWFISH-ECB", + 0, + MBEDTLS_CIPHER_VARIABLE_KEY_LEN, + 8, + &blowfish_info +}; + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static const mbedtls_cipher_info_t blowfish_cbc_info = { + MBEDTLS_CIPHER_BLOWFISH_CBC, + MBEDTLS_MODE_CBC, + 128, + "BLOWFISH-CBC", + 8, + MBEDTLS_CIPHER_VARIABLE_KEY_LEN, + 8, + &blowfish_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_CIPHER_MODE_CFB) +static const mbedtls_cipher_info_t blowfish_cfb64_info = { + MBEDTLS_CIPHER_BLOWFISH_CFB64, + MBEDTLS_MODE_CFB, + 128, + "BLOWFISH-CFB64", + 8, + MBEDTLS_CIPHER_VARIABLE_KEY_LEN, + 8, + &blowfish_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CFB */ + +#if defined(MBEDTLS_CIPHER_MODE_CTR) +static const mbedtls_cipher_info_t blowfish_ctr_info = { + MBEDTLS_CIPHER_BLOWFISH_CTR, + MBEDTLS_MODE_CTR, + 128, + "BLOWFISH-CTR", + 8, + MBEDTLS_CIPHER_VARIABLE_KEY_LEN, + 8, + &blowfish_info +}; +#endif /* MBEDTLS_CIPHER_MODE_CTR */ +#endif /* MBEDTLS_BLOWFISH_C */ + +#if defined(MBEDTLS_ARC4_C) +static int arc4_crypt_stream_wrap(void *ctx, size_t length, + const unsigned char *input, + unsigned char *output) +{ + return mbedtls_arc4_crypt((mbedtls_arc4_context *) ctx, length, input, output); +} + +static int arc4_setkey_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + /* we get key_bitlen in bits, arc4 expects it in bytes */ + if (key_bitlen % 8 != 0) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + mbedtls_arc4_setup((mbedtls_arc4_context *) ctx, key, key_bitlen / 8); + return 0; +} + +static void *arc4_ctx_alloc(void) +{ + mbedtls_arc4_context *ctx; + ctx = mbedtls_calloc(1, sizeof(mbedtls_arc4_context)); + + if (ctx == NULL) { + return NULL; + } + + mbedtls_arc4_init(ctx); + + return ctx; +} + +static void arc4_ctx_free(void *ctx) +{ + mbedtls_arc4_free((mbedtls_arc4_context *) ctx); + mbedtls_free(ctx); +} + +static const mbedtls_cipher_base_t arc4_base_info = { + MBEDTLS_CIPHER_ID_ARC4, + NULL, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + arc4_crypt_stream_wrap, +#endif + arc4_setkey_wrap, + arc4_setkey_wrap, + arc4_ctx_alloc, + arc4_ctx_free +}; + +static const mbedtls_cipher_info_t arc4_128_info = { + MBEDTLS_CIPHER_ARC4_128, + MBEDTLS_MODE_STREAM, + 128, + "ARC4-128", + 0, + 0, + 1, + &arc4_base_info +}; +#endif /* MBEDTLS_ARC4_C */ + +#if defined(MBEDTLS_CHACHA20_C) + +static int chacha20_setkey_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + if (key_bitlen != 256U) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + if (0 != mbedtls_chacha20_setkey((mbedtls_chacha20_context *) ctx, key)) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + return 0; +} + +static int chacha20_stream_wrap(void *ctx, size_t length, + const unsigned char *input, + unsigned char *output) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + ret = mbedtls_chacha20_update(ctx, length, input, output); + if (ret == MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + return ret; +} + +static void *chacha20_ctx_alloc(void) +{ + mbedtls_chacha20_context *ctx; + ctx = mbedtls_calloc(1, sizeof(mbedtls_chacha20_context)); + + if (ctx == NULL) { + return NULL; + } + + mbedtls_chacha20_init(ctx); + + return ctx; +} + +static void chacha20_ctx_free(void *ctx) +{ + mbedtls_chacha20_free((mbedtls_chacha20_context *) ctx); + mbedtls_free(ctx); +} + +static const mbedtls_cipher_base_t chacha20_base_info = { + MBEDTLS_CIPHER_ID_CHACHA20, + NULL, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + chacha20_stream_wrap, +#endif + chacha20_setkey_wrap, + chacha20_setkey_wrap, + chacha20_ctx_alloc, + chacha20_ctx_free +}; +static const mbedtls_cipher_info_t chacha20_info = { + MBEDTLS_CIPHER_CHACHA20, + MBEDTLS_MODE_STREAM, + 256, + "CHACHA20", + 12, + 0, + 1, + &chacha20_base_info +}; +#endif /* MBEDTLS_CHACHA20_C */ + +#if defined(MBEDTLS_CHACHAPOLY_C) + +static int chachapoly_setkey_wrap(void *ctx, + const unsigned char *key, + unsigned int key_bitlen) +{ + if (key_bitlen != 256U) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + if (0 != mbedtls_chachapoly_setkey((mbedtls_chachapoly_context *) ctx, key)) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + return 0; +} + +static void *chachapoly_ctx_alloc(void) +{ + mbedtls_chachapoly_context *ctx; + ctx = mbedtls_calloc(1, sizeof(mbedtls_chachapoly_context)); + + if (ctx == NULL) { + return NULL; + } + + mbedtls_chachapoly_init(ctx); + + return ctx; +} + +static void chachapoly_ctx_free(void *ctx) +{ + mbedtls_chachapoly_free((mbedtls_chachapoly_context *) ctx); + mbedtls_free(ctx); +} + +static const mbedtls_cipher_base_t chachapoly_base_info = { + MBEDTLS_CIPHER_ID_CHACHA20, + NULL, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + chachapoly_setkey_wrap, + chachapoly_setkey_wrap, + chachapoly_ctx_alloc, + chachapoly_ctx_free +}; +static const mbedtls_cipher_info_t chachapoly_info = { + MBEDTLS_CIPHER_CHACHA20_POLY1305, + MBEDTLS_MODE_CHACHAPOLY, + 256, + "CHACHA20-POLY1305", + 12, + 0, + 1, + &chachapoly_base_info +}; +#endif /* MBEDTLS_CHACHAPOLY_C */ + +#if defined(MBEDTLS_CIPHER_NULL_CIPHER) +static int null_crypt_stream(void *ctx, size_t length, + const unsigned char *input, + unsigned char *output) +{ + ((void) ctx); + memmove(output, input, length); + return 0; +} + +static int null_setkey(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + ((void) ctx); + ((void) key); + ((void) key_bitlen); + + return 0; +} + +static void *null_ctx_alloc(void) +{ + return (void *) 1; +} + +static void null_ctx_free(void *ctx) +{ + ((void) ctx); +} + +static const mbedtls_cipher_base_t null_base_info = { + MBEDTLS_CIPHER_ID_NULL, + NULL, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + null_crypt_stream, +#endif + null_setkey, + null_setkey, + null_ctx_alloc, + null_ctx_free +}; + +static const mbedtls_cipher_info_t null_cipher_info = { + MBEDTLS_CIPHER_NULL, + MBEDTLS_MODE_STREAM, + 0, + "NULL", + 0, + 0, + 1, + &null_base_info +}; +#endif /* defined(MBEDTLS_CIPHER_NULL_CIPHER) */ + +#if defined(MBEDTLS_NIST_KW_C) +static void *kw_ctx_alloc(void) +{ + void *ctx = mbedtls_calloc(1, sizeof(mbedtls_nist_kw_context)); + + if (ctx != NULL) { + mbedtls_nist_kw_init((mbedtls_nist_kw_context *) ctx); + } + + return ctx; +} + +static void kw_ctx_free(void *ctx) +{ + mbedtls_nist_kw_free(ctx); + mbedtls_free(ctx); +} + +static int kw_aes_setkey_wrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_nist_kw_setkey((mbedtls_nist_kw_context *) ctx, + MBEDTLS_CIPHER_ID_AES, key, key_bitlen, 1); +} + +static int kw_aes_setkey_unwrap(void *ctx, const unsigned char *key, + unsigned int key_bitlen) +{ + return mbedtls_nist_kw_setkey((mbedtls_nist_kw_context *) ctx, + MBEDTLS_CIPHER_ID_AES, key, key_bitlen, 0); +} + +static const mbedtls_cipher_base_t kw_aes_info = { + MBEDTLS_CIPHER_ID_AES, + NULL, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + NULL, +#endif +#if defined(MBEDTLS_CIPHER_MODE_STREAM) + NULL, +#endif + kw_aes_setkey_wrap, + kw_aes_setkey_unwrap, + kw_ctx_alloc, + kw_ctx_free, +}; + +static const mbedtls_cipher_info_t aes_128_nist_kw_info = { + MBEDTLS_CIPHER_AES_128_KW, + MBEDTLS_MODE_KW, + 128, + "AES-128-KW", + 0, + 0, + 16, + &kw_aes_info +}; + +static const mbedtls_cipher_info_t aes_192_nist_kw_info = { + MBEDTLS_CIPHER_AES_192_KW, + MBEDTLS_MODE_KW, + 192, + "AES-192-KW", + 0, + 0, + 16, + &kw_aes_info +}; + +static const mbedtls_cipher_info_t aes_256_nist_kw_info = { + MBEDTLS_CIPHER_AES_256_KW, + MBEDTLS_MODE_KW, + 256, + "AES-256-KW", + 0, + 0, + 16, + &kw_aes_info +}; + +static const mbedtls_cipher_info_t aes_128_nist_kwp_info = { + MBEDTLS_CIPHER_AES_128_KWP, + MBEDTLS_MODE_KWP, + 128, + "AES-128-KWP", + 0, + 0, + 16, + &kw_aes_info +}; + +static const mbedtls_cipher_info_t aes_192_nist_kwp_info = { + MBEDTLS_CIPHER_AES_192_KWP, + MBEDTLS_MODE_KWP, + 192, + "AES-192-KWP", + 0, + 0, + 16, + &kw_aes_info +}; + +static const mbedtls_cipher_info_t aes_256_nist_kwp_info = { + MBEDTLS_CIPHER_AES_256_KWP, + MBEDTLS_MODE_KWP, + 256, + "AES-256-KWP", + 0, + 0, + 16, + &kw_aes_info +}; +#endif /* MBEDTLS_NIST_KW_C */ + +const mbedtls_cipher_definition_t mbedtls_cipher_definitions[] = +{ +#if defined(MBEDTLS_AES_C) + { MBEDTLS_CIPHER_AES_128_ECB, &aes_128_ecb_info }, + { MBEDTLS_CIPHER_AES_192_ECB, &aes_192_ecb_info }, + { MBEDTLS_CIPHER_AES_256_ECB, &aes_256_ecb_info }, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_CIPHER_AES_128_CBC, &aes_128_cbc_info }, + { MBEDTLS_CIPHER_AES_192_CBC, &aes_192_cbc_info }, + { MBEDTLS_CIPHER_AES_256_CBC, &aes_256_cbc_info }, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + { MBEDTLS_CIPHER_AES_128_CFB128, &aes_128_cfb128_info }, + { MBEDTLS_CIPHER_AES_192_CFB128, &aes_192_cfb128_info }, + { MBEDTLS_CIPHER_AES_256_CFB128, &aes_256_cfb128_info }, +#endif +#if defined(MBEDTLS_CIPHER_MODE_OFB) + { MBEDTLS_CIPHER_AES_128_OFB, &aes_128_ofb_info }, + { MBEDTLS_CIPHER_AES_192_OFB, &aes_192_ofb_info }, + { MBEDTLS_CIPHER_AES_256_OFB, &aes_256_ofb_info }, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + { MBEDTLS_CIPHER_AES_128_CTR, &aes_128_ctr_info }, + { MBEDTLS_CIPHER_AES_192_CTR, &aes_192_ctr_info }, + { MBEDTLS_CIPHER_AES_256_CTR, &aes_256_ctr_info }, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) + { MBEDTLS_CIPHER_AES_128_XTS, &aes_128_xts_info }, + { MBEDTLS_CIPHER_AES_256_XTS, &aes_256_xts_info }, +#endif +#if defined(MBEDTLS_GCM_C) + { MBEDTLS_CIPHER_AES_128_GCM, &aes_128_gcm_info }, + { MBEDTLS_CIPHER_AES_192_GCM, &aes_192_gcm_info }, + { MBEDTLS_CIPHER_AES_256_GCM, &aes_256_gcm_info }, +#endif +#if defined(MBEDTLS_CCM_C) + { MBEDTLS_CIPHER_AES_128_CCM, &aes_128_ccm_info }, + { MBEDTLS_CIPHER_AES_192_CCM, &aes_192_ccm_info }, + { MBEDTLS_CIPHER_AES_256_CCM, &aes_256_ccm_info }, +#endif +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_ARC4_C) + { MBEDTLS_CIPHER_ARC4_128, &arc4_128_info }, +#endif + +#if defined(MBEDTLS_BLOWFISH_C) + { MBEDTLS_CIPHER_BLOWFISH_ECB, &blowfish_ecb_info }, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_CIPHER_BLOWFISH_CBC, &blowfish_cbc_info }, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + { MBEDTLS_CIPHER_BLOWFISH_CFB64, &blowfish_cfb64_info }, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + { MBEDTLS_CIPHER_BLOWFISH_CTR, &blowfish_ctr_info }, +#endif +#endif /* MBEDTLS_BLOWFISH_C */ + +#if defined(MBEDTLS_CAMELLIA_C) + { MBEDTLS_CIPHER_CAMELLIA_128_ECB, &camellia_128_ecb_info }, + { MBEDTLS_CIPHER_CAMELLIA_192_ECB, &camellia_192_ecb_info }, + { MBEDTLS_CIPHER_CAMELLIA_256_ECB, &camellia_256_ecb_info }, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_CIPHER_CAMELLIA_128_CBC, &camellia_128_cbc_info }, + { MBEDTLS_CIPHER_CAMELLIA_192_CBC, &camellia_192_cbc_info }, + { MBEDTLS_CIPHER_CAMELLIA_256_CBC, &camellia_256_cbc_info }, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + { MBEDTLS_CIPHER_CAMELLIA_128_CFB128, &camellia_128_cfb128_info }, + { MBEDTLS_CIPHER_CAMELLIA_192_CFB128, &camellia_192_cfb128_info }, + { MBEDTLS_CIPHER_CAMELLIA_256_CFB128, &camellia_256_cfb128_info }, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + { MBEDTLS_CIPHER_CAMELLIA_128_CTR, &camellia_128_ctr_info }, + { MBEDTLS_CIPHER_CAMELLIA_192_CTR, &camellia_192_ctr_info }, + { MBEDTLS_CIPHER_CAMELLIA_256_CTR, &camellia_256_ctr_info }, +#endif +#if defined(MBEDTLS_GCM_C) + { MBEDTLS_CIPHER_CAMELLIA_128_GCM, &camellia_128_gcm_info }, + { MBEDTLS_CIPHER_CAMELLIA_192_GCM, &camellia_192_gcm_info }, + { MBEDTLS_CIPHER_CAMELLIA_256_GCM, &camellia_256_gcm_info }, +#endif +#if defined(MBEDTLS_CCM_C) + { MBEDTLS_CIPHER_CAMELLIA_128_CCM, &camellia_128_ccm_info }, + { MBEDTLS_CIPHER_CAMELLIA_192_CCM, &camellia_192_ccm_info }, + { MBEDTLS_CIPHER_CAMELLIA_256_CCM, &camellia_256_ccm_info }, +#endif +#endif /* MBEDTLS_CAMELLIA_C */ + +#if defined(MBEDTLS_ARIA_C) + { MBEDTLS_CIPHER_ARIA_128_ECB, &aria_128_ecb_info }, + { MBEDTLS_CIPHER_ARIA_192_ECB, &aria_192_ecb_info }, + { MBEDTLS_CIPHER_ARIA_256_ECB, &aria_256_ecb_info }, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_CIPHER_ARIA_128_CBC, &aria_128_cbc_info }, + { MBEDTLS_CIPHER_ARIA_192_CBC, &aria_192_cbc_info }, + { MBEDTLS_CIPHER_ARIA_256_CBC, &aria_256_cbc_info }, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CFB) + { MBEDTLS_CIPHER_ARIA_128_CFB128, &aria_128_cfb128_info }, + { MBEDTLS_CIPHER_ARIA_192_CFB128, &aria_192_cfb128_info }, + { MBEDTLS_CIPHER_ARIA_256_CFB128, &aria_256_cfb128_info }, +#endif +#if defined(MBEDTLS_CIPHER_MODE_CTR) + { MBEDTLS_CIPHER_ARIA_128_CTR, &aria_128_ctr_info }, + { MBEDTLS_CIPHER_ARIA_192_CTR, &aria_192_ctr_info }, + { MBEDTLS_CIPHER_ARIA_256_CTR, &aria_256_ctr_info }, +#endif +#if defined(MBEDTLS_GCM_C) + { MBEDTLS_CIPHER_ARIA_128_GCM, &aria_128_gcm_info }, + { MBEDTLS_CIPHER_ARIA_192_GCM, &aria_192_gcm_info }, + { MBEDTLS_CIPHER_ARIA_256_GCM, &aria_256_gcm_info }, +#endif +#if defined(MBEDTLS_CCM_C) + { MBEDTLS_CIPHER_ARIA_128_CCM, &aria_128_ccm_info }, + { MBEDTLS_CIPHER_ARIA_192_CCM, &aria_192_ccm_info }, + { MBEDTLS_CIPHER_ARIA_256_CCM, &aria_256_ccm_info }, +#endif +#endif /* MBEDTLS_ARIA_C */ + +#if defined(MBEDTLS_DES_C) + { MBEDTLS_CIPHER_DES_ECB, &des_ecb_info }, + { MBEDTLS_CIPHER_DES_EDE_ECB, &des_ede_ecb_info }, + { MBEDTLS_CIPHER_DES_EDE3_ECB, &des_ede3_ecb_info }, +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_CIPHER_DES_CBC, &des_cbc_info }, + { MBEDTLS_CIPHER_DES_EDE_CBC, &des_ede_cbc_info }, + { MBEDTLS_CIPHER_DES_EDE3_CBC, &des_ede3_cbc_info }, +#endif +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_CHACHA20_C) + { MBEDTLS_CIPHER_CHACHA20, &chacha20_info }, +#endif + +#if defined(MBEDTLS_CHACHAPOLY_C) + { MBEDTLS_CIPHER_CHACHA20_POLY1305, &chachapoly_info }, +#endif + +#if defined(MBEDTLS_NIST_KW_C) + { MBEDTLS_CIPHER_AES_128_KW, &aes_128_nist_kw_info }, + { MBEDTLS_CIPHER_AES_192_KW, &aes_192_nist_kw_info }, + { MBEDTLS_CIPHER_AES_256_KW, &aes_256_nist_kw_info }, + { MBEDTLS_CIPHER_AES_128_KWP, &aes_128_nist_kwp_info }, + { MBEDTLS_CIPHER_AES_192_KWP, &aes_192_nist_kwp_info }, + { MBEDTLS_CIPHER_AES_256_KWP, &aes_256_nist_kwp_info }, +#endif + +#if defined(MBEDTLS_CIPHER_NULL_CIPHER) + { MBEDTLS_CIPHER_NULL, &null_cipher_info }, +#endif /* MBEDTLS_CIPHER_NULL_CIPHER */ + + { MBEDTLS_CIPHER_NONE, NULL } +}; + +#define NUM_CIPHERS (sizeof(mbedtls_cipher_definitions) / \ + sizeof(mbedtls_cipher_definitions[0])) +int mbedtls_cipher_supported[NUM_CIPHERS]; + +#endif /* MBEDTLS_CIPHER_C */ diff --git a/ext/opcua_client/mbedtls/library/cmac.c b/ext/opcua_client/mbedtls/library/cmac.c new file mode 100644 index 0000000..32a9a0e --- /dev/null +++ b/ext/opcua_client/mbedtls/library/cmac.c @@ -0,0 +1,1069 @@ +/** + * \file cmac.c + * + * \brief NIST SP800-38B compliant CMAC implementation for AES and 3DES + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * References: + * + * - NIST SP 800-38B Recommendation for Block Cipher Modes of Operation: The + * CMAC Mode for Authentication + * http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38b.pdf + * + * - RFC 4493 - The AES-CMAC Algorithm + * https://tools.ietf.org/html/rfc4493 + * + * - RFC 4615 - The Advanced Encryption Standard-Cipher-based Message + * Authentication Code-Pseudo-Random Function-128 (AES-CMAC-PRF-128) + * Algorithm for the Internet Key Exchange Protocol (IKE) + * https://tools.ietf.org/html/rfc4615 + * + * Additional test vectors: ISO/IEC 9797-1 + * + */ + +#include "common.h" + +#if defined(MBEDTLS_CMAC_C) + +#include "mbedtls/cmac.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" +#include "mbedtls/platform.h" + +#include + +#if !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST) + +/* + * Multiplication by u in the Galois field of GF(2^n) + * + * As explained in NIST SP 800-38B, this can be computed: + * + * If MSB(p) = 0, then p = (p << 1) + * If MSB(p) = 1, then p = (p << 1) ^ R_n + * with R_64 = 0x1B and R_128 = 0x87 + * + * Input and output MUST NOT point to the same buffer + * Block size must be 8 bytes or 16 bytes - the block sizes for DES and AES. + */ +static int cmac_multiply_by_u(unsigned char *output, + const unsigned char *input, + size_t blocksize) +{ + const unsigned char R_128 = 0x87; + const unsigned char R_64 = 0x1B; + unsigned char R_n, mask; + unsigned char overflow = 0x00; + int i; + + if (blocksize == MBEDTLS_AES_BLOCK_SIZE) { + R_n = R_128; + } else if (blocksize == MBEDTLS_DES3_BLOCK_SIZE) { + R_n = R_64; + } else { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + for (i = (int) blocksize - 1; i >= 0; i--) { + output[i] = input[i] << 1 | overflow; + overflow = input[i] >> 7; + } + + /* mask = ( input[0] >> 7 ) ? 0xff : 0x00 + * using bit operations to avoid branches */ + + /* MSVC has a warning about unary minus on unsigned, but this is + * well-defined and precisely what we want to do here */ +#if defined(_MSC_VER) +#pragma warning( push ) +#pragma warning( disable : 4146 ) +#endif + mask = -(input[0] >> 7); +#if defined(_MSC_VER) +#pragma warning( pop ) +#endif + + output[blocksize - 1] ^= R_n & mask; + + return 0; +} + +/* + * Generate subkeys + * + * - as specified by RFC 4493, section 2.3 Subkey Generation Algorithm + */ +static int cmac_generate_subkeys(mbedtls_cipher_context_t *ctx, + unsigned char *K1, unsigned char *K2) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char L[MBEDTLS_CIPHER_BLKSIZE_MAX]; + size_t olen, block_size; + + mbedtls_platform_zeroize(L, sizeof(L)); + + block_size = ctx->cipher_info->block_size; + + /* Calculate Ek(0) */ + if ((ret = mbedtls_cipher_update(ctx, L, block_size, L, &olen)) != 0) { + goto exit; + } + + /* + * Generate K1 and K2 + */ + if ((ret = cmac_multiply_by_u(K1, L, block_size)) != 0) { + goto exit; + } + + if ((ret = cmac_multiply_by_u(K2, K1, block_size)) != 0) { + goto exit; + } + +exit: + mbedtls_platform_zeroize(L, sizeof(L)); + + return ret; +} +#endif /* !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST) */ + +#if !defined(MBEDTLS_CMAC_ALT) +static void cmac_xor_block(unsigned char *output, const unsigned char *input1, + const unsigned char *input2, + const size_t block_size) +{ + size_t idx; + + for (idx = 0; idx < block_size; idx++) { + output[idx] = input1[idx] ^ input2[idx]; + } +} + +/* + * Create padded last block from (partial) last block. + * + * We can't use the padding option from the cipher layer, as it only works for + * CBC and we use ECB mode, and anyway we need to XOR K1 or K2 in addition. + */ +static void cmac_pad(unsigned char padded_block[MBEDTLS_CIPHER_BLKSIZE_MAX], + size_t padded_block_len, + const unsigned char *last_block, + size_t last_block_len) +{ + size_t j; + + for (j = 0; j < padded_block_len; j++) { + if (j < last_block_len) { + padded_block[j] = last_block[j]; + } else if (j == last_block_len) { + padded_block[j] = 0x80; + } else { + padded_block[j] = 0x00; + } + } +} + +int mbedtls_cipher_cmac_starts(mbedtls_cipher_context_t *ctx, + const unsigned char *key, size_t keybits) +{ + mbedtls_cipher_type_t type; + mbedtls_cmac_context_t *cmac_ctx; + int retval; + + if (ctx == NULL || ctx->cipher_info == NULL || key == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + if ((retval = mbedtls_cipher_setkey(ctx, key, (int) keybits, + MBEDTLS_ENCRYPT)) != 0) { + return retval; + } + + type = ctx->cipher_info->type; + + switch (type) { + case MBEDTLS_CIPHER_AES_128_ECB: + case MBEDTLS_CIPHER_AES_192_ECB: + case MBEDTLS_CIPHER_AES_256_ECB: + case MBEDTLS_CIPHER_DES_EDE3_ECB: + break; + default: + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + /* Allocated and initialise in the cipher context memory for the CMAC + * context */ + cmac_ctx = mbedtls_calloc(1, sizeof(mbedtls_cmac_context_t)); + if (cmac_ctx == NULL) { + return MBEDTLS_ERR_CIPHER_ALLOC_FAILED; + } + + ctx->cmac_ctx = cmac_ctx; + + mbedtls_platform_zeroize(cmac_ctx->state, sizeof(cmac_ctx->state)); + + return 0; +} + +int mbedtls_cipher_cmac_update(mbedtls_cipher_context_t *ctx, + const unsigned char *input, size_t ilen) +{ + mbedtls_cmac_context_t *cmac_ctx; + unsigned char *state; + int ret = 0; + size_t n, j, olen, block_size; + + if (ctx == NULL || ctx->cipher_info == NULL || input == NULL || + ctx->cmac_ctx == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + cmac_ctx = ctx->cmac_ctx; + block_size = ctx->cipher_info->block_size; + state = ctx->cmac_ctx->state; + + /* Is there data still to process from the last call, that's greater in + * size than a block? */ + if (cmac_ctx->unprocessed_len > 0 && + ilen > block_size - cmac_ctx->unprocessed_len) { + memcpy(&cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len], + input, + block_size - cmac_ctx->unprocessed_len); + + cmac_xor_block(state, cmac_ctx->unprocessed_block, state, block_size); + + if ((ret = mbedtls_cipher_update(ctx, state, block_size, state, + &olen)) != 0) { + goto exit; + } + + input += block_size - cmac_ctx->unprocessed_len; + ilen -= block_size - cmac_ctx->unprocessed_len; + cmac_ctx->unprocessed_len = 0; + } + + /* n is the number of blocks including any final partial block */ + n = (ilen + block_size - 1) / block_size; + + /* Iterate across the input data in block sized chunks, excluding any + * final partial or complete block */ + for (j = 1; j < n; j++) { + cmac_xor_block(state, input, state, block_size); + + if ((ret = mbedtls_cipher_update(ctx, state, block_size, state, + &olen)) != 0) { + goto exit; + } + + ilen -= block_size; + input += block_size; + } + + /* If there is data left over that wasn't aligned to a block */ + if (ilen > 0) { + memcpy(&cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len], + input, + ilen); + cmac_ctx->unprocessed_len += ilen; + } + +exit: + return ret; +} + +int mbedtls_cipher_cmac_finish(mbedtls_cipher_context_t *ctx, + unsigned char *output) +{ + mbedtls_cmac_context_t *cmac_ctx; + unsigned char *state, *last_block; + unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX]; + unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX]; + unsigned char M_last[MBEDTLS_CIPHER_BLKSIZE_MAX]; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t olen, block_size; + + if (ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL || + output == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + cmac_ctx = ctx->cmac_ctx; + block_size = ctx->cipher_info->block_size; + state = cmac_ctx->state; + + mbedtls_platform_zeroize(K1, sizeof(K1)); + mbedtls_platform_zeroize(K2, sizeof(K2)); + cmac_generate_subkeys(ctx, K1, K2); + + last_block = cmac_ctx->unprocessed_block; + + /* Calculate last block */ + if (cmac_ctx->unprocessed_len < block_size) { + cmac_pad(M_last, block_size, last_block, cmac_ctx->unprocessed_len); + cmac_xor_block(M_last, M_last, K2, block_size); + } else { + /* Last block is complete block */ + cmac_xor_block(M_last, last_block, K1, block_size); + } + + + cmac_xor_block(state, M_last, state, block_size); + if ((ret = mbedtls_cipher_update(ctx, state, block_size, state, + &olen)) != 0) { + goto exit; + } + + memcpy(output, state, block_size); + +exit: + /* Wipe the generated keys on the stack, and any other transients to avoid + * side channel leakage */ + mbedtls_platform_zeroize(K1, sizeof(K1)); + mbedtls_platform_zeroize(K2, sizeof(K2)); + + cmac_ctx->unprocessed_len = 0; + mbedtls_platform_zeroize(cmac_ctx->unprocessed_block, + sizeof(cmac_ctx->unprocessed_block)); + + mbedtls_platform_zeroize(state, MBEDTLS_CIPHER_BLKSIZE_MAX); + return ret; +} + +int mbedtls_cipher_cmac_reset(mbedtls_cipher_context_t *ctx) +{ + mbedtls_cmac_context_t *cmac_ctx; + + if (ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + cmac_ctx = ctx->cmac_ctx; + + /* Reset the internal state */ + cmac_ctx->unprocessed_len = 0; + mbedtls_platform_zeroize(cmac_ctx->unprocessed_block, + sizeof(cmac_ctx->unprocessed_block)); + mbedtls_platform_zeroize(cmac_ctx->state, + sizeof(cmac_ctx->state)); + + return 0; +} + +int mbedtls_cipher_cmac(const mbedtls_cipher_info_t *cipher_info, + const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char *output) +{ + mbedtls_cipher_context_t ctx; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (cipher_info == NULL || key == NULL || input == NULL || output == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + mbedtls_cipher_init(&ctx); + + if ((ret = mbedtls_cipher_setup(&ctx, cipher_info)) != 0) { + goto exit; + } + + ret = mbedtls_cipher_cmac_starts(&ctx, key, keylen); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_cipher_cmac_update(&ctx, input, ilen); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_cipher_cmac_finish(&ctx, output); + +exit: + mbedtls_cipher_free(&ctx); + + return ret; +} + +#if defined(MBEDTLS_AES_C) +/* + * Implementation of AES-CMAC-PRF-128 defined in RFC 4615 + */ +int mbedtls_aes_cmac_prf_128(const unsigned char *key, size_t key_length, + const unsigned char *input, size_t in_len, + unsigned char output[16]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const mbedtls_cipher_info_t *cipher_info; + unsigned char zero_key[MBEDTLS_AES_BLOCK_SIZE]; + unsigned char int_key[MBEDTLS_AES_BLOCK_SIZE]; + + if (key == NULL || input == NULL || output == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_ECB); + if (cipher_info == NULL) { + /* Failing at this point must be due to a build issue */ + ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + goto exit; + } + + if (key_length == MBEDTLS_AES_BLOCK_SIZE) { + /* Use key as is */ + memcpy(int_key, key, MBEDTLS_AES_BLOCK_SIZE); + } else { + memset(zero_key, 0, MBEDTLS_AES_BLOCK_SIZE); + + ret = mbedtls_cipher_cmac(cipher_info, zero_key, 128, key, + key_length, int_key); + if (ret != 0) { + goto exit; + } + } + + ret = mbedtls_cipher_cmac(cipher_info, int_key, 128, input, in_len, + output); + +exit: + mbedtls_platform_zeroize(int_key, sizeof(int_key)); + + return ret; +} +#endif /* MBEDTLS_AES_C */ + +#endif /* !MBEDTLS_CMAC_ALT */ + +#if defined(MBEDTLS_SELF_TEST) +/* + * CMAC test data for SP800-38B + * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/AES_CMAC.pdf + * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/TDES_CMAC.pdf + * + * AES-CMAC-PRF-128 test data from RFC 4615 + * https://tools.ietf.org/html/rfc4615#page-4 + */ + +#define NB_CMAC_TESTS_PER_KEY 4 +#define NB_PRF_TESTS 3 + +#if defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C) +/* All CMAC test inputs are truncated from the same 64 byte buffer. */ +static const unsigned char test_message[] = { + /* PT */ + 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, + 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, + 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, + 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, + 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, + 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, + 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, + 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 +}; +#endif /* MBEDTLS_AES_C || MBEDTLS_DES_C */ + +#if defined(MBEDTLS_AES_C) +/* Truncation point of message for AES CMAC tests */ +static const unsigned int aes_message_lengths[NB_CMAC_TESTS_PER_KEY] = { + /* Mlen */ + 0, + 16, + 20, + 64 +}; + +/* CMAC-AES128 Test Data */ +static const unsigned char aes_128_key[16] = { + 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, + 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c +}; +static const unsigned char aes_128_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = { + { + /* K1 */ + 0xfb, 0xee, 0xd6, 0x18, 0x35, 0x71, 0x33, 0x66, + 0x7c, 0x85, 0xe0, 0x8f, 0x72, 0x36, 0xa8, 0xde + }, + { + /* K2 */ + 0xf7, 0xdd, 0xac, 0x30, 0x6a, 0xe2, 0x66, 0xcc, + 0xf9, 0x0b, 0xc1, 0x1e, 0xe4, 0x6d, 0x51, 0x3b + } +}; +static const unsigned char aes_128_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = +{ + { + /* Example #1 */ + 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28, + 0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46 + }, + { + /* Example #2 */ + 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44, + 0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c + }, + { + /* Example #3 */ + 0x7d, 0x85, 0x44, 0x9e, 0xa6, 0xea, 0x19, 0xc8, + 0x23, 0xa7, 0xbf, 0x78, 0x83, 0x7d, 0xfa, 0xde + }, + { + /* Example #4 */ + 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92, + 0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe + } +}; + +/* CMAC-AES192 Test Data */ +static const unsigned char aes_192_key[24] = { + 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, + 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5, + 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b +}; +static const unsigned char aes_192_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = { + { + /* K1 */ + 0x44, 0x8a, 0x5b, 0x1c, 0x93, 0x51, 0x4b, 0x27, + 0x3e, 0xe6, 0x43, 0x9d, 0xd4, 0xda, 0xa2, 0x96 + }, + { + /* K2 */ + 0x89, 0x14, 0xb6, 0x39, 0x26, 0xa2, 0x96, 0x4e, + 0x7d, 0xcc, 0x87, 0x3b, 0xa9, 0xb5, 0x45, 0x2c + } +}; +static const unsigned char aes_192_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = +{ + { + /* Example #1 */ + 0xd1, 0x7d, 0xdf, 0x46, 0xad, 0xaa, 0xcd, 0xe5, + 0x31, 0xca, 0xc4, 0x83, 0xde, 0x7a, 0x93, 0x67 + }, + { + /* Example #2 */ + 0x9e, 0x99, 0xa7, 0xbf, 0x31, 0xe7, 0x10, 0x90, + 0x06, 0x62, 0xf6, 0x5e, 0x61, 0x7c, 0x51, 0x84 + }, + { + /* Example #3 */ + 0x3d, 0x75, 0xc1, 0x94, 0xed, 0x96, 0x07, 0x04, + 0x44, 0xa9, 0xfa, 0x7e, 0xc7, 0x40, 0xec, 0xf8 + }, + { + /* Example #4 */ + 0xa1, 0xd5, 0xdf, 0x0e, 0xed, 0x79, 0x0f, 0x79, + 0x4d, 0x77, 0x58, 0x96, 0x59, 0xf3, 0x9a, 0x11 + } +}; + +/* CMAC-AES256 Test Data */ +static const unsigned char aes_256_key[32] = { + 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, + 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, + 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, + 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4 +}; +static const unsigned char aes_256_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = { + { + /* K1 */ + 0xca, 0xd1, 0xed, 0x03, 0x29, 0x9e, 0xed, 0xac, + 0x2e, 0x9a, 0x99, 0x80, 0x86, 0x21, 0x50, 0x2f + }, + { + /* K2 */ + 0x95, 0xa3, 0xda, 0x06, 0x53, 0x3d, 0xdb, 0x58, + 0x5d, 0x35, 0x33, 0x01, 0x0c, 0x42, 0xa0, 0xd9 + } +}; +static const unsigned char aes_256_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = +{ + { + /* Example #1 */ + 0x02, 0x89, 0x62, 0xf6, 0x1b, 0x7b, 0xf8, 0x9e, + 0xfc, 0x6b, 0x55, 0x1f, 0x46, 0x67, 0xd9, 0x83 + }, + { + /* Example #2 */ + 0x28, 0xa7, 0x02, 0x3f, 0x45, 0x2e, 0x8f, 0x82, + 0xbd, 0x4b, 0xf2, 0x8d, 0x8c, 0x37, 0xc3, 0x5c + }, + { + /* Example #3 */ + 0x15, 0x67, 0x27, 0xdc, 0x08, 0x78, 0x94, 0x4a, + 0x02, 0x3c, 0x1f, 0xe0, 0x3b, 0xad, 0x6d, 0x93 + }, + { + /* Example #4 */ + 0xe1, 0x99, 0x21, 0x90, 0x54, 0x9f, 0x6e, 0xd5, + 0x69, 0x6a, 0x2c, 0x05, 0x6c, 0x31, 0x54, 0x10 + } +}; +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_DES_C) +/* Truncation point of message for 3DES CMAC tests */ +static const unsigned int des3_message_lengths[NB_CMAC_TESTS_PER_KEY] = { + 0, + 16, + 20, + 32 +}; + +/* CMAC-TDES (Generation) - 2 Key Test Data */ +static const unsigned char des3_2key_key[24] = { + /* Key1 */ + 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, + /* Key2 */ + 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xEF, 0x01, + /* Key3 */ + 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef +}; +static const unsigned char des3_2key_subkeys[2][8] = { + { + /* K1 */ + 0x0d, 0xd2, 0xcb, 0x7a, 0x3d, 0x88, 0x88, 0xd9 + }, + { + /* K2 */ + 0x1b, 0xa5, 0x96, 0xf4, 0x7b, 0x11, 0x11, 0xb2 + } +}; +static const unsigned char des3_2key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] + = { + { + /* Sample #1 */ + 0x79, 0xce, 0x52, 0xa7, 0xf7, 0x86, 0xa9, 0x60 + }, + { + /* Sample #2 */ + 0xcc, 0x18, 0xa0, 0xb7, 0x9a, 0xf2, 0x41, 0x3b + }, + { + /* Sample #3 */ + 0xc0, 0x6d, 0x37, 0x7e, 0xcd, 0x10, 0x19, 0x69 + }, + { + /* Sample #4 */ + 0x9c, 0xd3, 0x35, 0x80, 0xf9, 0xb6, 0x4d, 0xfb + } + }; + +/* CMAC-TDES (Generation) - 3 Key Test Data */ +static const unsigned char des3_3key_key[24] = { + /* Key1 */ + 0x01, 0x23, 0x45, 0x67, 0x89, 0xaa, 0xcd, 0xef, + /* Key2 */ + 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, + /* Key3 */ + 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23 +}; +static const unsigned char des3_3key_subkeys[2][8] = { + { + /* K1 */ + 0x9d, 0x74, 0xe7, 0x39, 0x33, 0x17, 0x96, 0xc0 + }, + { + /* K2 */ + 0x3a, 0xe9, 0xce, 0x72, 0x66, 0x2f, 0x2d, 0x9b + } +}; +static const unsigned char des3_3key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] + = { + { + /* Sample #1 */ + 0x7d, 0xb0, 0xd3, 0x7d, 0xf9, 0x36, 0xc5, 0x50 + }, + { + /* Sample #2 */ + 0x30, 0x23, 0x9c, 0xf1, 0xf5, 0x2e, 0x66, 0x09 + }, + { + /* Sample #3 */ + 0x6c, 0x9f, 0x3e, 0xe4, 0x92, 0x3f, 0x6b, 0xe2 + }, + { + /* Sample #4 */ + 0x99, 0x42, 0x9b, 0xd0, 0xbF, 0x79, 0x04, 0xe5 + } + }; + +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_AES_C) +/* AES AES-CMAC-PRF-128 Test Data */ +static const unsigned char PRFK[] = { + /* Key */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0xed, 0xcb +}; + +/* Sizes in bytes */ +static const size_t PRFKlen[NB_PRF_TESTS] = { + 18, + 16, + 10 +}; + +/* Message */ +static const unsigned char PRFM[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13 +}; + +static const unsigned char PRFT[NB_PRF_TESTS][16] = { + { + 0x84, 0xa3, 0x48, 0xa4, 0xa4, 0x5d, 0x23, 0x5b, + 0xab, 0xff, 0xfc, 0x0d, 0x2b, 0x4d, 0xa0, 0x9a + }, + { + 0x98, 0x0a, 0xe8, 0x7b, 0x5f, 0x4c, 0x9c, 0x52, + 0x14, 0xf5, 0xb6, 0xa8, 0x45, 0x5e, 0x4c, 0x2d + }, + { + 0x29, 0x0d, 0x9e, 0x11, 0x2e, 0xdb, 0x09, 0xee, + 0x14, 0x1f, 0xcf, 0x64, 0xc0, 0xb7, 0x2f, 0x3d + } +}; +#endif /* MBEDTLS_AES_C */ + +static int cmac_test_subkeys(int verbose, + const char *testname, + const unsigned char *key, + int keybits, + const unsigned char *subkeys, + mbedtls_cipher_type_t cipher_type, + int block_size, + int num_tests) +{ + int i, ret = 0; + mbedtls_cipher_context_t ctx; + const mbedtls_cipher_info_t *cipher_info; + unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX]; + unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX]; + + cipher_info = mbedtls_cipher_info_from_type(cipher_type); + if (cipher_info == NULL) { + /* Failing at this point must be due to a build issue */ + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } + + for (i = 0; i < num_tests; i++) { + if (verbose != 0) { + mbedtls_printf(" %s CMAC subkey #%d: ", testname, i + 1); + } + + mbedtls_cipher_init(&ctx); + + if ((ret = mbedtls_cipher_setup(&ctx, cipher_info)) != 0) { + if (verbose != 0) { + mbedtls_printf("test execution failed\n"); + } + + goto cleanup; + } + + if ((ret = mbedtls_cipher_setkey(&ctx, key, keybits, + MBEDTLS_ENCRYPT)) != 0) { + /* When CMAC is implemented by an alternative implementation, or + * the underlying primitive itself is implemented alternatively, + * AES-192 may be unavailable. This should not cause the selftest + * function to fail. */ + if ((ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED || + ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) && + cipher_type == MBEDTLS_CIPHER_AES_192_ECB) { + if (verbose != 0) { + mbedtls_printf("skipped\n"); + } + goto next_test; + } + + if (verbose != 0) { + mbedtls_printf("test execution failed\n"); + } + + goto cleanup; + } + + ret = cmac_generate_subkeys(&ctx, K1, K2); + if (ret != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + goto cleanup; + } + + if ((ret = memcmp(K1, subkeys, block_size)) != 0 || + (ret = memcmp(K2, &subkeys[block_size], block_size)) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + goto cleanup; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + +next_test: + mbedtls_cipher_free(&ctx); + } + + ret = 0; + goto exit; + +cleanup: + mbedtls_cipher_free(&ctx); + +exit: + return ret; +} + +static int cmac_test_wth_cipher(int verbose, + const char *testname, + const unsigned char *key, + int keybits, + const unsigned char *messages, + const unsigned int message_lengths[4], + const unsigned char *expected_result, + mbedtls_cipher_type_t cipher_type, + int block_size, + int num_tests) +{ + const mbedtls_cipher_info_t *cipher_info; + int i, ret = 0; + unsigned char output[MBEDTLS_CIPHER_BLKSIZE_MAX]; + + cipher_info = mbedtls_cipher_info_from_type(cipher_type); + if (cipher_info == NULL) { + /* Failing at this point must be due to a build issue */ + ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + goto exit; + } + + for (i = 0; i < num_tests; i++) { + if (verbose != 0) { + mbedtls_printf(" %s CMAC #%d: ", testname, i + 1); + } + + if ((ret = mbedtls_cipher_cmac(cipher_info, key, keybits, messages, + message_lengths[i], output)) != 0) { + /* When CMAC is implemented by an alternative implementation, or + * the underlying primitive itself is implemented alternatively, + * AES-192 and/or 3DES may be unavailable. This should not cause + * the selftest function to fail. */ + if ((ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED || + ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) && + (cipher_type == MBEDTLS_CIPHER_AES_192_ECB || + cipher_type == MBEDTLS_CIPHER_DES_EDE3_ECB)) { + if (verbose != 0) { + mbedtls_printf("skipped\n"); + } + continue; + } + + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + goto exit; + } + + if ((ret = memcmp(output, &expected_result[i * block_size], block_size)) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + goto exit; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + ret = 0; + +exit: + return ret; +} + +#if defined(MBEDTLS_AES_C) +static int test_aes128_cmac_prf(int verbose) +{ + int i; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char output[MBEDTLS_AES_BLOCK_SIZE]; + + for (i = 0; i < NB_PRF_TESTS; i++) { + mbedtls_printf(" AES CMAC 128 PRF #%d: ", i); + ret = mbedtls_aes_cmac_prf_128(PRFK, PRFKlen[i], PRFM, 20, output); + if (ret != 0 || + memcmp(output, PRFT[i], MBEDTLS_AES_BLOCK_SIZE) != 0) { + + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + return ret; + } else if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + return ret; +} +#endif /* MBEDTLS_AES_C */ + +int mbedtls_cmac_self_test(int verbose) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + +#if defined(MBEDTLS_AES_C) + /* AES-128 */ + if ((ret = cmac_test_subkeys(verbose, + "AES 128", + aes_128_key, + 128, + (const unsigned char *) aes_128_subkeys, + MBEDTLS_CIPHER_AES_128_ECB, + MBEDTLS_AES_BLOCK_SIZE, + NB_CMAC_TESTS_PER_KEY)) != 0) { + return ret; + } + + if ((ret = cmac_test_wth_cipher(verbose, + "AES 128", + aes_128_key, + 128, + test_message, + aes_message_lengths, + (const unsigned char *) aes_128_expected_result, + MBEDTLS_CIPHER_AES_128_ECB, + MBEDTLS_AES_BLOCK_SIZE, + NB_CMAC_TESTS_PER_KEY)) != 0) { + return ret; + } + + /* AES-192 */ + if ((ret = cmac_test_subkeys(verbose, + "AES 192", + aes_192_key, + 192, + (const unsigned char *) aes_192_subkeys, + MBEDTLS_CIPHER_AES_192_ECB, + MBEDTLS_AES_BLOCK_SIZE, + NB_CMAC_TESTS_PER_KEY)) != 0) { + return ret; + } + + if ((ret = cmac_test_wth_cipher(verbose, + "AES 192", + aes_192_key, + 192, + test_message, + aes_message_lengths, + (const unsigned char *) aes_192_expected_result, + MBEDTLS_CIPHER_AES_192_ECB, + MBEDTLS_AES_BLOCK_SIZE, + NB_CMAC_TESTS_PER_KEY)) != 0) { + return ret; + } + + /* AES-256 */ + if ((ret = cmac_test_subkeys(verbose, + "AES 256", + aes_256_key, + 256, + (const unsigned char *) aes_256_subkeys, + MBEDTLS_CIPHER_AES_256_ECB, + MBEDTLS_AES_BLOCK_SIZE, + NB_CMAC_TESTS_PER_KEY)) != 0) { + return ret; + } + + if ((ret = cmac_test_wth_cipher(verbose, + "AES 256", + aes_256_key, + 256, + test_message, + aes_message_lengths, + (const unsigned char *) aes_256_expected_result, + MBEDTLS_CIPHER_AES_256_ECB, + MBEDTLS_AES_BLOCK_SIZE, + NB_CMAC_TESTS_PER_KEY)) != 0) { + return ret; + } +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_DES_C) + /* 3DES 2 key */ + if ((ret = cmac_test_subkeys(verbose, + "3DES 2 key", + des3_2key_key, + 192, + (const unsigned char *) des3_2key_subkeys, + MBEDTLS_CIPHER_DES_EDE3_ECB, + MBEDTLS_DES3_BLOCK_SIZE, + NB_CMAC_TESTS_PER_KEY)) != 0) { + return ret; + } + + if ((ret = cmac_test_wth_cipher(verbose, + "3DES 2 key", + des3_2key_key, + 192, + test_message, + des3_message_lengths, + (const unsigned char *) des3_2key_expected_result, + MBEDTLS_CIPHER_DES_EDE3_ECB, + MBEDTLS_DES3_BLOCK_SIZE, + NB_CMAC_TESTS_PER_KEY)) != 0) { + return ret; + } + + /* 3DES 3 key */ + if ((ret = cmac_test_subkeys(verbose, + "3DES 3 key", + des3_3key_key, + 192, + (const unsigned char *) des3_3key_subkeys, + MBEDTLS_CIPHER_DES_EDE3_ECB, + MBEDTLS_DES3_BLOCK_SIZE, + NB_CMAC_TESTS_PER_KEY)) != 0) { + return ret; + } + + if ((ret = cmac_test_wth_cipher(verbose, + "3DES 3 key", + des3_3key_key, + 192, + test_message, + des3_message_lengths, + (const unsigned char *) des3_3key_expected_result, + MBEDTLS_CIPHER_DES_EDE3_ECB, + MBEDTLS_DES3_BLOCK_SIZE, + NB_CMAC_TESTS_PER_KEY)) != 0) { + return ret; + } +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_AES_C) + if ((ret = test_aes128_cmac_prf(verbose)) != 0) { + return ret; + } +#endif /* MBEDTLS_AES_C */ + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return 0; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_CMAC_C */ diff --git a/ext/opcua_client/mbedtls/library/common.h b/ext/opcua_client/mbedtls/library/common.h new file mode 100644 index 0000000..5565b30 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/common.h @@ -0,0 +1,381 @@ +/** + * \file common.h + * + * \brief Utility macros for internal use in the library + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_LIBRARY_COMMON_H +#define MBEDTLS_LIBRARY_COMMON_H + +#if defined(MBEDTLS_CONFIG_FILE) +#include MBEDTLS_CONFIG_FILE +#else +#include "mbedtls/config.h" +#endif + +#include +#include +#include + +/* Define `inline` on some non-C99-compliant compilers. */ +#if (defined(__ARMCC_VERSION) || defined(_MSC_VER)) && \ + !defined(inline) && !defined(__cplusplus) +#define inline __inline +#endif + +/** Helper to define a function as static except when building invasive tests. + * + * If a function is only used inside its own source file and should be + * declared `static` to allow the compiler to optimize for code size, + * but that function has unit tests, define it with + * ``` + * MBEDTLS_STATIC_TESTABLE int mbedtls_foo(...) { ... } + * ``` + * and declare it in a header in the `library/` directory with + * ``` + * #if defined(MBEDTLS_TEST_HOOKS) + * int mbedtls_foo(...); + * #endif + * ``` + */ +#if defined(MBEDTLS_TEST_HOOKS) +#define MBEDTLS_STATIC_TESTABLE +#else +#define MBEDTLS_STATIC_TESTABLE static +#endif + +/** Return an offset into a buffer. + * + * This is just the addition of an offset to a pointer, except that this + * function also accepts an offset of 0 into a buffer whose pointer is null. + * (`p + n` has undefined behavior when `p` is null, even when `n == 0`. + * A null pointer is a valid buffer pointer when the size is 0, for example + * as the result of `malloc(0)` on some platforms.) + * + * \param p Pointer to a buffer of at least n bytes. + * This may be \p NULL if \p n is zero. + * \param n An offset in bytes. + * \return Pointer to offset \p n in the buffer \p p. + * Note that this is only a valid pointer if the size of the + * buffer is at least \p n + 1. + */ +static inline unsigned char *mbedtls_buffer_offset( + unsigned char *p, size_t n) +{ + return p == NULL ? NULL : p + n; +} + +/** Return an offset into a read-only buffer. + * + * Similar to mbedtls_buffer_offset(), but for const pointers. + * + * \param p Pointer to a buffer of at least n bytes. + * This may be \p NULL if \p n is zero. + * \param n An offset in bytes. + * \return Pointer to offset \p n in the buffer \p p. + * Note that this is only a valid pointer if the size of the + * buffer is at least \p n + 1. + */ +static inline const unsigned char *mbedtls_buffer_offset_const( + const unsigned char *p, size_t n) +{ + return p == NULL ? NULL : p + n; +} + +/** Byte Reading Macros + * + * Given a multi-byte integer \p x, MBEDTLS_BYTE_n retrieves the n-th + * byte from x, where byte 0 is the least significant byte. + */ +#define MBEDTLS_BYTE_0(x) ((uint8_t) ((x) & 0xff)) +#define MBEDTLS_BYTE_1(x) ((uint8_t) (((x) >> 8) & 0xff)) +#define MBEDTLS_BYTE_2(x) ((uint8_t) (((x) >> 16) & 0xff)) +#define MBEDTLS_BYTE_3(x) ((uint8_t) (((x) >> 24) & 0xff)) +#define MBEDTLS_BYTE_4(x) ((uint8_t) (((x) >> 32) & 0xff)) +#define MBEDTLS_BYTE_5(x) ((uint8_t) (((x) >> 40) & 0xff)) +#define MBEDTLS_BYTE_6(x) ((uint8_t) (((x) >> 48) & 0xff)) +#define MBEDTLS_BYTE_7(x) ((uint8_t) (((x) >> 56) & 0xff)) + +/** + * Get the unsigned 32 bits integer corresponding to four bytes in + * big-endian order (MSB first). + * + * \param data Base address of the memory to get the four bytes from. + * \param offset Offset from \p base of the first and most significant + * byte of the four bytes to build the 32 bits unsigned + * integer from. + */ +#ifndef MBEDTLS_GET_UINT32_BE +#define MBEDTLS_GET_UINT32_BE(data, offset) \ + ( \ + ((uint32_t) (data)[(offset)] << 24) \ + | ((uint32_t) (data)[(offset) + 1] << 16) \ + | ((uint32_t) (data)[(offset) + 2] << 8) \ + | ((uint32_t) (data)[(offset) + 3]) \ + ) +#endif + +/** + * Put in memory a 32 bits unsigned integer in big-endian order. + * + * \param n 32 bits unsigned integer to put in memory. + * \param data Base address of the memory where to put the 32 + * bits unsigned integer in. + * \param offset Offset from \p base where to put the most significant + * byte of the 32 bits unsigned integer \p n. + */ +#ifndef MBEDTLS_PUT_UINT32_BE +#define MBEDTLS_PUT_UINT32_BE(n, data, offset) \ + { \ + (data)[(offset)] = MBEDTLS_BYTE_3(n); \ + (data)[(offset) + 1] = MBEDTLS_BYTE_2(n); \ + (data)[(offset) + 2] = MBEDTLS_BYTE_1(n); \ + (data)[(offset) + 3] = MBEDTLS_BYTE_0(n); \ + } +#endif + +/** + * Get the unsigned 32 bits integer corresponding to four bytes in + * little-endian order (LSB first). + * + * \param data Base address of the memory to get the four bytes from. + * \param offset Offset from \p base of the first and least significant + * byte of the four bytes to build the 32 bits unsigned + * integer from. + */ +#ifndef MBEDTLS_GET_UINT32_LE +#define MBEDTLS_GET_UINT32_LE(data, offset) \ + ( \ + ((uint32_t) (data)[(offset)]) \ + | ((uint32_t) (data)[(offset) + 1] << 8) \ + | ((uint32_t) (data)[(offset) + 2] << 16) \ + | ((uint32_t) (data)[(offset) + 3] << 24) \ + ) +#endif + +/** + * Put in memory a 32 bits unsigned integer in little-endian order. + * + * \param n 32 bits unsigned integer to put in memory. + * \param data Base address of the memory where to put the 32 + * bits unsigned integer in. + * \param offset Offset from \p base where to put the least significant + * byte of the 32 bits unsigned integer \p n. + */ +#ifndef MBEDTLS_PUT_UINT32_LE +#define MBEDTLS_PUT_UINT32_LE(n, data, offset) \ + { \ + (data)[(offset)] = MBEDTLS_BYTE_0(n); \ + (data)[(offset) + 1] = MBEDTLS_BYTE_1(n); \ + (data)[(offset) + 2] = MBEDTLS_BYTE_2(n); \ + (data)[(offset) + 3] = MBEDTLS_BYTE_3(n); \ + } +#endif + +/** + * Get the unsigned 16 bits integer corresponding to two bytes in + * little-endian order (LSB first). + * + * \param data Base address of the memory to get the two bytes from. + * \param offset Offset from \p base of the first and least significant + * byte of the two bytes to build the 16 bits unsigned + * integer from. + */ +#ifndef MBEDTLS_GET_UINT16_LE +#define MBEDTLS_GET_UINT16_LE(data, offset) \ + ( \ + ((uint16_t) (data)[(offset)]) \ + | ((uint16_t) (data)[(offset) + 1] << 8) \ + ) +#endif + +/** + * Put in memory a 16 bits unsigned integer in little-endian order. + * + * \param n 16 bits unsigned integer to put in memory. + * \param data Base address of the memory where to put the 16 + * bits unsigned integer in. + * \param offset Offset from \p base where to put the least significant + * byte of the 16 bits unsigned integer \p n. + */ +#ifndef MBEDTLS_PUT_UINT16_LE +#define MBEDTLS_PUT_UINT16_LE(n, data, offset) \ + { \ + (data)[(offset)] = MBEDTLS_BYTE_0(n); \ + (data)[(offset) + 1] = MBEDTLS_BYTE_1(n); \ + } +#endif + +/** + * Get the unsigned 16 bits integer corresponding to two bytes in + * big-endian order (MSB first). + * + * \param data Base address of the memory to get the two bytes from. + * \param offset Offset from \p base of the first and most significant + * byte of the two bytes to build the 16 bits unsigned + * integer from. + */ +#ifndef MBEDTLS_GET_UINT16_BE +#define MBEDTLS_GET_UINT16_BE(data, offset) \ + ( \ + ((uint16_t) (data)[(offset)] << 8) \ + | ((uint16_t) (data)[(offset) + 1]) \ + ) +#endif + +/** + * Put in memory a 16 bits unsigned integer in big-endian order. + * + * \param n 16 bits unsigned integer to put in memory. + * \param data Base address of the memory where to put the 16 + * bits unsigned integer in. + * \param offset Offset from \p base where to put the most significant + * byte of the 16 bits unsigned integer \p n. + */ +#ifndef MBEDTLS_PUT_UINT16_BE +#define MBEDTLS_PUT_UINT16_BE(n, data, offset) \ + { \ + (data)[(offset)] = MBEDTLS_BYTE_1(n); \ + (data)[(offset) + 1] = MBEDTLS_BYTE_0(n); \ + } +#endif + +/** + * Get the unsigned 64 bits integer corresponding to eight bytes in + * big-endian order (MSB first). + * + * \param data Base address of the memory to get the eight bytes from. + * \param offset Offset from \p base of the first and most significant + * byte of the eight bytes to build the 64 bits unsigned + * integer from. + */ +#ifndef MBEDTLS_GET_UINT64_BE +#define MBEDTLS_GET_UINT64_BE(data, offset) \ + ( \ + ((uint64_t) (data)[(offset)] << 56) \ + | ((uint64_t) (data)[(offset) + 1] << 48) \ + | ((uint64_t) (data)[(offset) + 2] << 40) \ + | ((uint64_t) (data)[(offset) + 3] << 32) \ + | ((uint64_t) (data)[(offset) + 4] << 24) \ + | ((uint64_t) (data)[(offset) + 5] << 16) \ + | ((uint64_t) (data)[(offset) + 6] << 8) \ + | ((uint64_t) (data)[(offset) + 7]) \ + ) +#endif + +/** + * Put in memory a 64 bits unsigned integer in big-endian order. + * + * \param n 64 bits unsigned integer to put in memory. + * \param data Base address of the memory where to put the 64 + * bits unsigned integer in. + * \param offset Offset from \p base where to put the most significant + * byte of the 64 bits unsigned integer \p n. + */ +#ifndef MBEDTLS_PUT_UINT64_BE +#define MBEDTLS_PUT_UINT64_BE(n, data, offset) \ + { \ + (data)[(offset)] = MBEDTLS_BYTE_7(n); \ + (data)[(offset) + 1] = MBEDTLS_BYTE_6(n); \ + (data)[(offset) + 2] = MBEDTLS_BYTE_5(n); \ + (data)[(offset) + 3] = MBEDTLS_BYTE_4(n); \ + (data)[(offset) + 4] = MBEDTLS_BYTE_3(n); \ + (data)[(offset) + 5] = MBEDTLS_BYTE_2(n); \ + (data)[(offset) + 6] = MBEDTLS_BYTE_1(n); \ + (data)[(offset) + 7] = MBEDTLS_BYTE_0(n); \ + } +#endif + +/** + * Get the unsigned 64 bits integer corresponding to eight bytes in + * little-endian order (LSB first). + * + * \param data Base address of the memory to get the eight bytes from. + * \param offset Offset from \p base of the first and least significant + * byte of the eight bytes to build the 64 bits unsigned + * integer from. + */ +#ifndef MBEDTLS_GET_UINT64_LE +#define MBEDTLS_GET_UINT64_LE(data, offset) \ + ( \ + ((uint64_t) (data)[(offset) + 7] << 56) \ + | ((uint64_t) (data)[(offset) + 6] << 48) \ + | ((uint64_t) (data)[(offset) + 5] << 40) \ + | ((uint64_t) (data)[(offset) + 4] << 32) \ + | ((uint64_t) (data)[(offset) + 3] << 24) \ + | ((uint64_t) (data)[(offset) + 2] << 16) \ + | ((uint64_t) (data)[(offset) + 1] << 8) \ + | ((uint64_t) (data)[(offset)]) \ + ) +#endif + +/** + * Put in memory a 64 bits unsigned integer in little-endian order. + * + * \param n 64 bits unsigned integer to put in memory. + * \param data Base address of the memory where to put the 64 + * bits unsigned integer in. + * \param offset Offset from \p base where to put the least significant + * byte of the 64 bits unsigned integer \p n. + */ +#ifndef MBEDTLS_PUT_UINT64_LE +#define MBEDTLS_PUT_UINT64_LE(n, data, offset) \ + { \ + (data)[(offset)] = MBEDTLS_BYTE_0(n); \ + (data)[(offset) + 1] = MBEDTLS_BYTE_1(n); \ + (data)[(offset) + 2] = MBEDTLS_BYTE_2(n); \ + (data)[(offset) + 3] = MBEDTLS_BYTE_3(n); \ + (data)[(offset) + 4] = MBEDTLS_BYTE_4(n); \ + (data)[(offset) + 5] = MBEDTLS_BYTE_5(n); \ + (data)[(offset) + 6] = MBEDTLS_BYTE_6(n); \ + (data)[(offset) + 7] = MBEDTLS_BYTE_7(n); \ + } +#endif + +/* Always provide a static assert macro, so it can be used unconditionally. + * It will expand to nothing on some systems. */ +/* Can't use the C11-style `defined(static_assert)` on FreeBSD, since it + * defines static_assert even with -std=c99, but then complains about it. + */ +#if defined(static_assert) && !defined(__FreeBSD__) +#define MBEDTLS_STATIC_ASSERT(expr, msg) static_assert(expr, msg) +#else +/* Make sure `MBEDTLS_STATIC_ASSERT(expr, msg);` is valid both inside and + * outside a function. We choose a struct declaration, which can be repeated + * any number of times and does not need a matching definition. */ +#define MBEDTLS_STATIC_ASSERT(expr, msg) \ + struct ISO_C_does_not_allow_extra_semicolon_outside_of_a_function +#endif + +/* Suppress compiler warnings for unused functions and variables. */ +#if !defined(MBEDTLS_MAYBE_UNUSED) && defined(__has_attribute) +# if __has_attribute(unused) +# define MBEDTLS_MAYBE_UNUSED __attribute__((unused)) +# endif +#endif +#if !defined(MBEDTLS_MAYBE_UNUSED) && defined(__GNUC__) +# define MBEDTLS_MAYBE_UNUSED __attribute__((unused)) +#endif +#if !defined(MBEDTLS_MAYBE_UNUSED) && defined(__IAR_SYSTEMS_ICC__) && defined(__VER__) +/* IAR does support __attribute__((unused)), but only if the -e flag (extended language support) + * is given; the pragma always works. + * Unfortunately the pragma affects the rest of the file where it is used, but this is harmless. + * Check for version 5.2 or later - this pragma may be supported by earlier versions, but I wasn't + * able to find documentation). + */ +# if (__VER__ >= 5020000) +# define MBEDTLS_MAYBE_UNUSED _Pragma("diag_suppress=Pe177") +# endif +#endif +#if !defined(MBEDTLS_MAYBE_UNUSED) && defined(_MSC_VER) +# define MBEDTLS_MAYBE_UNUSED __pragma(warning(suppress:4189)) +#endif +#if !defined(MBEDTLS_MAYBE_UNUSED) +# define MBEDTLS_MAYBE_UNUSED +#endif + +#endif /* MBEDTLS_LIBRARY_COMMON_H */ diff --git a/ext/opcua_client/mbedtls/library/constant_time.c b/ext/opcua_client/mbedtls/library/constant_time.c new file mode 100644 index 0000000..002ca49 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/constant_time.c @@ -0,0 +1,786 @@ +/** + * Constant-time functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * The following functions are implemented without using comparison operators, as those + * might be translated to branches by some compilers on some platforms. + */ + +#include "common.h" +#include "constant_time_internal.h" +#include "mbedtls/constant_time.h" +#include "mbedtls/error.h" +#include "mbedtls/platform_util.h" + +#if defined(MBEDTLS_BIGNUM_C) +#include "mbedtls/bignum.h" +#endif + +#if defined(MBEDTLS_SSL_TLS_C) +#include "mbedtls/ssl_internal.h" +#endif + +#if defined(MBEDTLS_RSA_C) +#include "mbedtls/rsa.h" +#endif + +#if defined(MBEDTLS_BASE64_C) +#include "constant_time_invasive.h" +#endif + +#include + +int mbedtls_ct_memcmp(const void *a, + const void *b, + size_t n) +{ + size_t i; + volatile const unsigned char *A = (volatile const unsigned char *) a; + volatile const unsigned char *B = (volatile const unsigned char *) b; + volatile unsigned char diff = 0; + + for (i = 0; i < n; i++) { + /* Read volatile data in order before computing diff. + * This avoids IAR compiler warning: + * 'the order of volatile accesses is undefined ..' */ + unsigned char x = A[i], y = B[i]; + diff |= x ^ y; + } + + return (int) diff; +} + +unsigned mbedtls_ct_uint_mask(unsigned value) +{ + /* MSVC has a warning about unary minus on unsigned, but this is + * well-defined and precisely what we want to do here */ +#if defined(_MSC_VER) +#pragma warning( push ) +#pragma warning( disable : 4146 ) +#endif + return -((value | -value) >> (sizeof(value) * 8 - 1)); +#if defined(_MSC_VER) +#pragma warning( pop ) +#endif +} + +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) || defined(MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC) || \ + defined(MBEDTLS_NIST_KW_C) || defined(MBEDTLS_CIPHER_MODE_CBC) + +size_t mbedtls_ct_size_mask(size_t value) +{ + /* MSVC has a warning about unary minus on unsigned integer types, + * but this is well-defined and precisely what we want to do here. */ +#if defined(_MSC_VER) +#pragma warning( push ) +#pragma warning( disable : 4146 ) +#endif + return -((value | -value) >> (sizeof(value) * 8 - 1)); +#if defined(_MSC_VER) +#pragma warning( pop ) +#endif +} + +#endif /* defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) || defined(MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC) || + defined(MBEDTLS_NIST_KW_C) || defined(MBEDTLS_CIPHER_MODE_CBC) */ + +#if defined(MBEDTLS_BIGNUM_C) + +mbedtls_mpi_uint mbedtls_ct_mpi_uint_mask(mbedtls_mpi_uint value) +{ + /* MSVC has a warning about unary minus on unsigned, but this is + * well-defined and precisely what we want to do here */ +#if defined(_MSC_VER) +#pragma warning( push ) +#pragma warning( disable : 4146 ) +#endif + return -((value | -value) >> (sizeof(value) * 8 - 1)); +#if defined(_MSC_VER) +#pragma warning( pop ) +#endif +} + +#endif /* MBEDTLS_BIGNUM_C */ + +#if defined(MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC) || defined(MBEDTLS_NIST_KW_C) || \ + defined(MBEDTLS_CIPHER_MODE_CBC) + +/** Constant-flow mask generation for "less than" comparison: + * - if \p x < \p y, return all-bits 1, that is (size_t) -1 + * - otherwise, return all bits 0, that is 0 + * + * This function can be used to write constant-time code by replacing branches + * with bit operations using masks. + * + * \param x The first value to analyze. + * \param y The second value to analyze. + * + * \return All-bits-one if \p x is less than \p y, otherwise zero. + */ +static size_t mbedtls_ct_size_mask_lt(size_t x, + size_t y) +{ + /* This has the most significant bit set if and only if x < y */ + const size_t sub = x - y; + + /* sub1 = (x < y) ? 1 : 0 */ + const size_t sub1 = sub >> (sizeof(sub) * 8 - 1); + + /* mask = (x < y) ? 0xff... : 0x00... */ + const size_t mask = mbedtls_ct_size_mask(sub1); + + return mask; +} + +size_t mbedtls_ct_size_mask_ge(size_t x, + size_t y) +{ + return ~mbedtls_ct_size_mask_lt(x, y); +} + +#endif /* defined(MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC) || defined(MBEDTLS_NIST_KW_C) || + defined(MBEDTLS_CIPHER_MODE_CBC) */ + +#if defined(MBEDTLS_BASE64_C) + +/* Return 0xff if low <= c <= high, 0 otherwise. + * + * Constant flow with respect to c. + */ +MBEDTLS_STATIC_TESTABLE +unsigned char mbedtls_ct_uchar_mask_of_range(unsigned char low, + unsigned char high, + unsigned char c) +{ + /* low_mask is: 0 if low <= c, 0x...ff if low > c */ + unsigned low_mask = ((unsigned) c - low) >> 8; + /* high_mask is: 0 if c <= high, 0x...ff if c > high */ + unsigned high_mask = ((unsigned) high - c) >> 8; + return ~(low_mask | high_mask) & 0xff; +} + +#endif /* MBEDTLS_BASE64_C */ + +unsigned mbedtls_ct_size_bool_eq(size_t x, + size_t y) +{ + /* diff = 0 if x == y, non-zero otherwise */ + const size_t diff = x ^ y; + + /* MSVC has a warning about unary minus on unsigned integer types, + * but this is well-defined and precisely what we want to do here. */ +#if defined(_MSC_VER) +#pragma warning( push ) +#pragma warning( disable : 4146 ) +#endif + + /* diff_msb's most significant bit is equal to x != y */ + const size_t diff_msb = (diff | (size_t) -diff); + +#if defined(_MSC_VER) +#pragma warning( pop ) +#endif + + /* diff1 = (x != y) ? 1 : 0 */ + const unsigned diff1 = diff_msb >> (sizeof(diff_msb) * 8 - 1); + + return 1 ^ diff1; +} + +#if defined(MBEDTLS_PKCS1_V15) && defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_RSA_ALT) + +/** Constant-flow "greater than" comparison: + * return x > y + * + * This is equivalent to \p x > \p y, but is likely to be compiled + * to code using bitwise operation rather than a branch. + * + * \param x The first value to analyze. + * \param y The second value to analyze. + * + * \return 1 if \p x greater than \p y, otherwise 0. + */ +static unsigned mbedtls_ct_size_gt(size_t x, + size_t y) +{ + /* Return the sign bit (1 for negative) of (y - x). */ + return (y - x) >> (sizeof(size_t) * 8 - 1); +} + +#endif /* MBEDTLS_PKCS1_V15 && MBEDTLS_RSA_C && ! MBEDTLS_RSA_ALT */ + +#if defined(MBEDTLS_BIGNUM_C) + +unsigned mbedtls_ct_mpi_uint_lt(const mbedtls_mpi_uint x, + const mbedtls_mpi_uint y) +{ + mbedtls_mpi_uint ret; + mbedtls_mpi_uint cond; + + /* + * Check if the most significant bits (MSB) of the operands are different. + */ + cond = (x ^ y); + /* + * If the MSB are the same then the difference x-y will be negative (and + * have its MSB set to 1 during conversion to unsigned) if and only if x> (sizeof(mbedtls_mpi_uint) * 8 - 1); + + return (unsigned) ret; +} + +#endif /* MBEDTLS_BIGNUM_C */ + +unsigned mbedtls_ct_uint_if(unsigned condition, + unsigned if1, + unsigned if0) +{ + unsigned mask = mbedtls_ct_uint_mask(condition); + return (mask & if1) | (~mask & if0); +} + +#if defined(MBEDTLS_BIGNUM_C) + +void mbedtls_ct_mpi_uint_cond_assign(size_t n, + mbedtls_mpi_uint *dest, + const mbedtls_mpi_uint *src, + unsigned char condition) +{ + size_t i; + + /* MSVC has a warning about unary minus on unsigned integer types, + * but this is well-defined and precisely what we want to do here. */ +#if defined(_MSC_VER) +#pragma warning( push ) +#pragma warning( disable : 4146 ) +#endif + + /* all-bits 1 if condition is 1, all-bits 0 if condition is 0 */ + const mbedtls_mpi_uint mask = -condition; + +#if defined(_MSC_VER) +#pragma warning( pop ) +#endif + + for (i = 0; i < n; i++) { + dest[i] = (src[i] & mask) | (dest[i] & ~mask); + } +} + +#endif /* MBEDTLS_BIGNUM_C */ + +#if defined(MBEDTLS_BASE64_C) + +unsigned char mbedtls_ct_base64_enc_char(unsigned char value) +{ + unsigned char digit = 0; + /* For each range of values, if value is in that range, mask digit with + * the corresponding value. Since value can only be in a single range, + * only at most one masking will change digit. */ + digit |= mbedtls_ct_uchar_mask_of_range(0, 25, value) & ('A' + value); + digit |= mbedtls_ct_uchar_mask_of_range(26, 51, value) & ('a' + value - 26); + digit |= mbedtls_ct_uchar_mask_of_range(52, 61, value) & ('0' + value - 52); + digit |= mbedtls_ct_uchar_mask_of_range(62, 62, value) & '+'; + digit |= mbedtls_ct_uchar_mask_of_range(63, 63, value) & '/'; + return digit; +} + +signed char mbedtls_ct_base64_dec_value(unsigned char c) +{ + unsigned char val = 0; + /* For each range of digits, if c is in that range, mask val with + * the corresponding value. Since c can only be in a single range, + * only at most one masking will change val. Set val to one plus + * the desired value so that it stays 0 if c is in none of the ranges. */ + val |= mbedtls_ct_uchar_mask_of_range('A', 'Z', c) & (c - 'A' + 0 + 1); + val |= mbedtls_ct_uchar_mask_of_range('a', 'z', c) & (c - 'a' + 26 + 1); + val |= mbedtls_ct_uchar_mask_of_range('0', '9', c) & (c - '0' + 52 + 1); + val |= mbedtls_ct_uchar_mask_of_range('+', '+', c) & (c - '+' + 62 + 1); + val |= mbedtls_ct_uchar_mask_of_range('/', '/', c) & (c - '/' + 63 + 1); + /* At this point, val is 0 if c is an invalid digit and v+1 if c is + * a digit with the value v. */ + return val - 1; +} + +#endif /* MBEDTLS_BASE64_C */ + +#if defined(MBEDTLS_PKCS1_V15) && defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_RSA_ALT) + +/** Shift some data towards the left inside a buffer. + * + * `mbedtls_ct_mem_move_to_left(start, total, offset)` is functionally + * equivalent to + * ``` + * memmove(start, start + offset, total - offset); + * memset(start + offset, 0, total - offset); + * ``` + * but it strives to use a memory access pattern (and thus total timing) + * that does not depend on \p offset. This timing independence comes at + * the expense of performance. + * + * \param start Pointer to the start of the buffer. + * \param total Total size of the buffer. + * \param offset Offset from which to copy \p total - \p offset bytes. + */ +static void mbedtls_ct_mem_move_to_left(void *start, + size_t total, + size_t offset) +{ + volatile unsigned char *buf = start; + size_t i, n; + if (total == 0) { + return; + } + for (i = 0; i < total; i++) { + unsigned no_op = mbedtls_ct_size_gt(total - offset, i); + /* The first `total - offset` passes are a no-op. The last + * `offset` passes shift the data one byte to the left and + * zero out the last byte. */ + for (n = 0; n < total - 1; n++) { + unsigned char current = buf[n]; + unsigned char next = buf[n+1]; + buf[n] = mbedtls_ct_uint_if(no_op, current, next); + } + buf[total-1] = mbedtls_ct_uint_if(no_op, buf[total-1], 0); + } +} + +#endif /* MBEDTLS_PKCS1_V15 && MBEDTLS_RSA_C && ! MBEDTLS_RSA_ALT */ + +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) +void mbedtls_ct_memcpy_if_eq(unsigned char *dest, + const unsigned char *src, + size_t len, + size_t c1, + size_t c2) +{ + /* mask = c1 == c2 ? 0xff : 0x00 */ + const size_t equal = mbedtls_ct_size_bool_eq(c1, c2); + const unsigned char mask = (unsigned char) mbedtls_ct_size_mask(equal); + + /* dest[i] = c1 == c2 ? src[i] : dest[i] */ + for (size_t i = 0; i < len; i++) { + dest[i] = (src[i] & mask) | (dest[i] & ~mask); + } +} + +void mbedtls_ct_memcpy_offset(unsigned char *dest, + const unsigned char *src, + size_t offset, + size_t offset_min, + size_t offset_max, + size_t len) +{ + size_t offsetval; + + for (offsetval = offset_min; offsetval <= offset_max; offsetval++) { + mbedtls_ct_memcpy_if_eq(dest, src + offsetval, len, + offsetval, offset); + } +} + +int mbedtls_ct_hmac(mbedtls_md_context_t *ctx, + const unsigned char *add_data, + size_t add_data_len, + const unsigned char *data, + size_t data_len_secret, + size_t min_data_len, + size_t max_data_len, + unsigned char *output) +{ + /* + * This function breaks the HMAC abstraction and uses the md_clone() + * extension to the MD API in order to get constant-flow behaviour. + * + * HMAC(msg) is defined as HASH(okey + HASH(ikey + msg)) where + means + * concatenation, and okey/ikey are the XOR of the key with some fixed bit + * patterns (see RFC 2104, sec. 2), which are stored in ctx->hmac_ctx. + * + * We'll first compute inner_hash = HASH(ikey + msg) by hashing up to + * minlen, then cloning the context, and for each byte up to maxlen + * finishing up the hash computation, keeping only the correct result. + * + * Then we only need to compute HASH(okey + inner_hash) and we're done. + */ + const mbedtls_md_type_t md_alg = mbedtls_md_get_type(ctx->md_info); + /* TLS 1.0-1.2 only support SHA-384, SHA-256, SHA-1, MD-5, + * all of which have the same block size except SHA-384. */ + const size_t block_size = md_alg == MBEDTLS_MD_SHA384 ? 128 : 64; + const unsigned char * const ikey = ctx->hmac_ctx; + const unsigned char * const okey = ikey + block_size; + const size_t hash_size = mbedtls_md_get_size(ctx->md_info); + + unsigned char aux_out[MBEDTLS_MD_MAX_SIZE]; + mbedtls_md_context_t aux; + size_t offset; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + mbedtls_md_init(&aux); + +#define MD_CHK(func_call) \ + do { \ + ret = (func_call); \ + if (ret != 0) \ + goto cleanup; \ + } while (0) + + MD_CHK(mbedtls_md_setup(&aux, ctx->md_info, 0)); + + /* After hmac_start() of hmac_reset(), ikey has already been hashed, + * so we can start directly with the message */ + MD_CHK(mbedtls_md_update(ctx, add_data, add_data_len)); + MD_CHK(mbedtls_md_update(ctx, data, min_data_len)); + + /* Fill the hash buffer in advance with something that is + * not a valid hash (barring an attack on the hash and + * deliberately-crafted input), in case the caller doesn't + * check the return status properly. */ + memset(output, '!', hash_size); + + /* For each possible length, compute the hash up to that point */ + for (offset = min_data_len; offset <= max_data_len; offset++) { + MD_CHK(mbedtls_md_clone(&aux, ctx)); + MD_CHK(mbedtls_md_finish(&aux, aux_out)); + /* Keep only the correct inner_hash in the output buffer */ + mbedtls_ct_memcpy_if_eq(output, aux_out, hash_size, + offset, data_len_secret); + + if (offset < max_data_len) { + MD_CHK(mbedtls_md_update(ctx, data + offset, 1)); + } + } + + /* The context needs to finish() before it starts() again */ + MD_CHK(mbedtls_md_finish(ctx, aux_out)); + + /* Now compute HASH(okey + inner_hash) */ + MD_CHK(mbedtls_md_starts(ctx)); + MD_CHK(mbedtls_md_update(ctx, okey, block_size)); + MD_CHK(mbedtls_md_update(ctx, output, hash_size)); + MD_CHK(mbedtls_md_finish(ctx, output)); + + /* Done, get ready for next time */ + MD_CHK(mbedtls_md_hmac_reset(ctx)); + +#undef MD_CHK + +cleanup: + mbedtls_md_free(&aux); + return ret; +} + +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ + +#if defined(MBEDTLS_BIGNUM_C) + +#define MPI_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_MPI_BAD_INPUT_DATA) + +/* + * Conditionally assign X = Y, without leaking information + * about whether the assignment was made or not. + * (Leaking information about the respective sizes of X and Y is ok however.) + */ +#if defined(_MSC_VER) && defined(_M_ARM64) && (_MSC_FULL_VER < 193131103) +/* + * MSVC miscompiles this function if it's inlined prior to Visual Studio 2022 version 17.1. See: + * https://developercommunity.visualstudio.com/t/c-compiler-miscompiles-part-of-mbedtls-library-on/1646989 + */ +__declspec(noinline) +#endif +int mbedtls_mpi_safe_cond_assign(mbedtls_mpi *X, + const mbedtls_mpi *Y, + unsigned char assign) +{ + int ret = 0; + size_t i; + mbedtls_mpi_uint limb_mask; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(Y != NULL); + + /* all-bits 1 if assign is 1, all-bits 0 if assign is 0 */ + limb_mask = mbedtls_ct_mpi_uint_mask(assign);; + + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, Y->n)); + + X->s = (int) mbedtls_ct_uint_if(assign, Y->s, X->s); + + mbedtls_ct_mpi_uint_cond_assign(Y->n, X->p, Y->p, assign); + + for (i = Y->n; i < X->n; i++) { + X->p[i] &= ~limb_mask; + } + +cleanup: + return ret; +} + +/* + * Conditionally swap X and Y, without leaking information + * about whether the swap was made or not. + * Here it is not ok to simply swap the pointers, which would lead to + * different memory access patterns when X and Y are used afterwards. + */ +int mbedtls_mpi_safe_cond_swap(mbedtls_mpi *X, + mbedtls_mpi *Y, + unsigned char swap) +{ + int ret, s; + size_t i; + mbedtls_mpi_uint limb_mask; + mbedtls_mpi_uint tmp; + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(Y != NULL); + + if (X == Y) { + return 0; + } + + /* all-bits 1 if swap is 1, all-bits 0 if swap is 0 */ + limb_mask = mbedtls_ct_mpi_uint_mask(swap); + + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, Y->n)); + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(Y, X->n)); + + s = X->s; + X->s = (int) mbedtls_ct_uint_if(swap, Y->s, X->s); + Y->s = (int) mbedtls_ct_uint_if(swap, s, Y->s); + + + for (i = 0; i < X->n; i++) { + tmp = X->p[i]; + X->p[i] = (X->p[i] & ~limb_mask) | (Y->p[i] & limb_mask); + Y->p[i] = (Y->p[i] & ~limb_mask) | (tmp & limb_mask); + } + +cleanup: + return ret; +} + +/* + * Compare signed values in constant time + */ +int mbedtls_mpi_lt_mpi_ct(const mbedtls_mpi *X, + const mbedtls_mpi *Y, + unsigned *ret) +{ + size_t i; + /* The value of any of these variables is either 0 or 1 at all times. */ + unsigned cond, done, X_is_negative, Y_is_negative; + + MPI_VALIDATE_RET(X != NULL); + MPI_VALIDATE_RET(Y != NULL); + MPI_VALIDATE_RET(ret != NULL); + + if (X->n != Y->n) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + /* + * Set sign_N to 1 if N >= 0, 0 if N < 0. + * We know that N->s == 1 if N >= 0 and N->s == -1 if N < 0. + */ + X_is_negative = (X->s & 2) >> 1; + Y_is_negative = (Y->s & 2) >> 1; + + /* + * If the signs are different, then the positive operand is the bigger. + * That is if X is negative (X_is_negative == 1), then X < Y is true and it + * is false if X is positive (X_is_negative == 0). + */ + cond = (X_is_negative ^ Y_is_negative); + *ret = cond & X_is_negative; + + /* + * This is a constant-time function. We might have the result, but we still + * need to go through the loop. Record if we have the result already. + */ + done = cond; + + for (i = X->n; i > 0; i--) { + /* + * If Y->p[i - 1] < X->p[i - 1] then X < Y is true if and only if both + * X and Y are negative. + * + * Again even if we can make a decision, we just mark the result and + * the fact that we are done and continue looping. + */ + cond = mbedtls_ct_mpi_uint_lt(Y->p[i - 1], X->p[i - 1]); + *ret |= cond & (1 - done) & X_is_negative; + done |= cond; + + /* + * If X->p[i - 1] < Y->p[i - 1] then X < Y is true if and only if both + * X and Y are positive. + * + * Again even if we can make a decision, we just mark the result and + * the fact that we are done and continue looping. + */ + cond = mbedtls_ct_mpi_uint_lt(X->p[i - 1], Y->p[i - 1]); + *ret |= cond & (1 - done) & (1 - X_is_negative); + done |= cond; + } + + return 0; +} + +#endif /* MBEDTLS_BIGNUM_C */ + +#if defined(MBEDTLS_PKCS1_V15) && defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_RSA_ALT) + +int mbedtls_ct_rsaes_pkcs1_v15_unpadding(int mode, + unsigned char *input, + size_t ilen, + unsigned char *output, + size_t output_max_len, + size_t *olen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i, plaintext_max_size; + + /* The following variables take sensitive values: their value must + * not leak into the observable behavior of the function other than + * the designated outputs (output, olen, return value). Otherwise + * this would open the execution of the function to + * side-channel-based variants of the Bleichenbacher padding oracle + * attack. Potential side channels include overall timing, memory + * access patterns (especially visible to an adversary who has access + * to a shared memory cache), and branches (especially visible to + * an adversary who has access to a shared code cache or to a shared + * branch predictor). */ + size_t pad_count = 0; + unsigned bad = 0; + unsigned char pad_done = 0; + size_t plaintext_size = 0; + unsigned output_too_large; + + plaintext_max_size = (output_max_len > ilen - 11) ? ilen - 11 + : output_max_len; + + /* Check and get padding length in constant time and constant + * memory trace. The first byte must be 0. */ + bad |= input[0]; + + if (mode == MBEDTLS_RSA_PRIVATE) { + /* Decode EME-PKCS1-v1_5 padding: 0x00 || 0x02 || PS || 0x00 + * where PS must be at least 8 nonzero bytes. */ + bad |= input[1] ^ MBEDTLS_RSA_CRYPT; + + /* Read the whole buffer. Set pad_done to nonzero if we find + * the 0x00 byte and remember the padding length in pad_count. */ + for (i = 2; i < ilen; i++) { + pad_done |= ((input[i] | (unsigned char) -input[i]) >> 7) ^ 1; + pad_count += ((pad_done | (unsigned char) -pad_done) >> 7) ^ 1; + } + } else { + /* Decode EMSA-PKCS1-v1_5 padding: 0x00 || 0x01 || PS || 0x00 + * where PS must be at least 8 bytes with the value 0xFF. */ + bad |= input[1] ^ MBEDTLS_RSA_SIGN; + + /* Read the whole buffer. Set pad_done to nonzero if we find + * the 0x00 byte and remember the padding length in pad_count. + * If there's a non-0xff byte in the padding, the padding is bad. */ + for (i = 2; i < ilen; i++) { + pad_done |= mbedtls_ct_uint_if(input[i], 0, 1); + pad_count += mbedtls_ct_uint_if(pad_done, 0, 1); + bad |= mbedtls_ct_uint_if(pad_done, 0, input[i] ^ 0xFF); + } + } + + /* If pad_done is still zero, there's no data, only unfinished padding. */ + bad |= mbedtls_ct_uint_if(pad_done, 0, 1); + + /* There must be at least 8 bytes of padding. */ + bad |= mbedtls_ct_size_gt(8, pad_count); + + /* If the padding is valid, set plaintext_size to the number of + * remaining bytes after stripping the padding. If the padding + * is invalid, avoid leaking this fact through the size of the + * output: use the maximum message size that fits in the output + * buffer. Do it without branches to avoid leaking the padding + * validity through timing. RSA keys are small enough that all the + * size_t values involved fit in unsigned int. */ + plaintext_size = mbedtls_ct_uint_if( + bad, (unsigned) plaintext_max_size, + (unsigned) (ilen - pad_count - 3)); + + /* Set output_too_large to 0 if the plaintext fits in the output + * buffer and to 1 otherwise. */ + output_too_large = mbedtls_ct_size_gt(plaintext_size, + plaintext_max_size); + + /* Set ret without branches to avoid timing attacks. Return: + * - INVALID_PADDING if the padding is bad (bad != 0). + * - OUTPUT_TOO_LARGE if the padding is good but the decrypted + * plaintext does not fit in the output buffer. + * - 0 if the padding is correct. */ + ret = -(int) mbedtls_ct_uint_if( + bad, -MBEDTLS_ERR_RSA_INVALID_PADDING, + mbedtls_ct_uint_if(output_too_large, + -MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE, + 0)); + + /* If the padding is bad or the plaintext is too large, zero the + * data that we're about to copy to the output buffer. + * We need to copy the same amount of data + * from the same buffer whether the padding is good or not to + * avoid leaking the padding validity through overall timing or + * through memory or cache access patterns. */ + bad = mbedtls_ct_uint_mask(bad | output_too_large); + for (i = 11; i < ilen; i++) { + input[i] &= ~bad; + } + + /* If the plaintext is too large, truncate it to the buffer size. + * Copy anyway to avoid revealing the length through timing, because + * revealing the length is as bad as revealing the padding validity + * for a Bleichenbacher attack. */ + plaintext_size = mbedtls_ct_uint_if(output_too_large, + (unsigned) plaintext_max_size, + (unsigned) plaintext_size); + + /* Move the plaintext to the leftmost position where it can start in + * the working buffer, i.e. make it start plaintext_max_size from + * the end of the buffer. Do this with a memory access trace that + * does not depend on the plaintext size. After this move, the + * starting location of the plaintext is no longer sensitive + * information. */ + mbedtls_ct_mem_move_to_left(input + ilen - plaintext_max_size, + plaintext_max_size, + plaintext_max_size - plaintext_size); + + /* Finally copy the decrypted plaintext plus trailing zeros into the output + * buffer. If output_max_len is 0, then output may be an invalid pointer + * and the result of memcpy() would be undefined; prevent undefined + * behavior making sure to depend only on output_max_len (the size of the + * user-provided output buffer), which is independent from plaintext + * length, validity of padding, success of the decryption, and other + * secrets. */ + if (output_max_len != 0) { + memcpy(output, input + ilen - plaintext_max_size, plaintext_max_size); + } + + /* Report the amount of data we copied to the output buffer. In case + * of errors (bad padding or output too large), the value of *olen + * when this function returns is not specified. Making it equivalent + * to the good case limits the risks of leaking the padding validity. */ + *olen = plaintext_size; + + return ret; +} + +#endif /* MBEDTLS_PKCS1_V15 && MBEDTLS_RSA_C && ! MBEDTLS_RSA_ALT */ diff --git a/ext/opcua_client/mbedtls/library/constant_time_internal.h b/ext/opcua_client/mbedtls/library/constant_time_internal.h new file mode 100644 index 0000000..82e65cc --- /dev/null +++ b/ext/opcua_client/mbedtls/library/constant_time_internal.h @@ -0,0 +1,327 @@ +/** + * Constant-time functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_CONSTANT_TIME_INTERNAL_H +#define MBEDTLS_CONSTANT_TIME_INTERNAL_H + +#include "common.h" + +#if defined(MBEDTLS_BIGNUM_C) +#include "mbedtls/bignum.h" +#endif + +#if defined(MBEDTLS_SSL_TLS_C) +#include "mbedtls/ssl_internal.h" +#endif + +#include + +/** Turn a value into a mask: + * - if \p value == 0, return the all-bits 0 mask, aka 0 + * - otherwise, return the all-bits 1 mask, aka (unsigned) -1 + * + * This function can be used to write constant-time code by replacing branches + * with bit operations using masks. + * + * \param value The value to analyze. + * + * \return Zero if \p value is zero, otherwise all-bits-one. + */ +unsigned mbedtls_ct_uint_mask(unsigned value); + +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) || defined(MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC) || \ + defined(MBEDTLS_NIST_KW_C) || defined(MBEDTLS_CIPHER_MODE_CBC) + +/** Turn a value into a mask: + * - if \p value == 0, return the all-bits 0 mask, aka 0 + * - otherwise, return the all-bits 1 mask, aka (size_t) -1 + * + * This function can be used to write constant-time code by replacing branches + * with bit operations using masks. + * + * \param value The value to analyze. + * + * \return Zero if \p value is zero, otherwise all-bits-one. + */ +size_t mbedtls_ct_size_mask(size_t value); + +#endif /* defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) || defined(MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC) || + defined(MBEDTLS_NIST_KW_C) || defined(MBEDTLS_CIPHER_MODE_CBC) */ + +#if defined(MBEDTLS_BIGNUM_C) + +/** Turn a value into a mask: + * - if \p value == 0, return the all-bits 0 mask, aka 0 + * - otherwise, return the all-bits 1 mask, aka (mbedtls_mpi_uint) -1 + * + * This function can be used to write constant-time code by replacing branches + * with bit operations using masks. + * + * \param value The value to analyze. + * + * \return Zero if \p value is zero, otherwise all-bits-one. + */ +mbedtls_mpi_uint mbedtls_ct_mpi_uint_mask(mbedtls_mpi_uint value); + +#endif /* MBEDTLS_BIGNUM_C */ + +#if defined(MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC) || defined(MBEDTLS_NIST_KW_C) || \ + defined(MBEDTLS_CIPHER_MODE_CBC) + +/** Constant-flow mask generation for "greater or equal" comparison: + * - if \p x >= \p y, return all-bits 1, that is (size_t) -1 + * - otherwise, return all bits 0, that is 0 + * + * This function can be used to write constant-time code by replacing branches + * with bit operations using masks. + * + * \param x The first value to analyze. + * \param y The second value to analyze. + * + * \return All-bits-one if \p x is greater or equal than \p y, + * otherwise zero. + */ +size_t mbedtls_ct_size_mask_ge(size_t x, + size_t y); + +#endif /* defined(MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC) || defined(MBEDTLS_NIST_KW_C) || + defined(MBEDTLS_CIPHER_MODE_CBC) */ + +/** Constant-flow boolean "equal" comparison: + * return x == y + * + * This is equivalent to \p x == \p y, but is likely to be compiled + * to code using bitwise operation rather than a branch. + * + * \param x The first value to analyze. + * \param y The second value to analyze. + * + * \return 1 if \p x equals to \p y, otherwise 0. + */ +unsigned mbedtls_ct_size_bool_eq(size_t x, + size_t y); + +#if defined(MBEDTLS_BIGNUM_C) + +/** Decide if an integer is less than the other, without branches. + * + * This is equivalent to \p x < \p y, but is likely to be compiled + * to code using bitwise operation rather than a branch. + * + * \param x The first value to analyze. + * \param y The second value to analyze. + * + * \return 1 if \p x is less than \p y, otherwise 0. + */ +unsigned mbedtls_ct_mpi_uint_lt(const mbedtls_mpi_uint x, + const mbedtls_mpi_uint y); + +#endif /* MBEDTLS_BIGNUM_C */ + +/** Choose between two integer values without branches. + * + * This is equivalent to `condition ? if1 : if0`, but is likely to be compiled + * to code using bitwise operation rather than a branch. + * + * \param condition Condition to test. + * \param if1 Value to use if \p condition is nonzero. + * \param if0 Value to use if \p condition is zero. + * + * \return \c if1 if \p condition is nonzero, otherwise \c if0. + */ +unsigned mbedtls_ct_uint_if(unsigned condition, + unsigned if1, + unsigned if0); + +#if defined(MBEDTLS_BIGNUM_C) + +/** Conditionally assign a value without branches. + * + * This is equivalent to `if ( condition ) dest = src`, but is likely + * to be compiled to code using bitwise operation rather than a branch. + * + * \param n \p dest and \p src must be arrays of limbs of size n. + * \param dest The MPI to conditionally assign to. This must point + * to an initialized MPI. + * \param src The MPI to be assigned from. This must point to an + * initialized MPI. + * \param condition Condition to test, must be 0 or 1. + */ +void mbedtls_ct_mpi_uint_cond_assign(size_t n, + mbedtls_mpi_uint *dest, + const mbedtls_mpi_uint *src, + unsigned char condition); + +#endif /* MBEDTLS_BIGNUM_C */ + +#if defined(MBEDTLS_BASE64_C) + +/** Given a value in the range 0..63, return the corresponding Base64 digit. + * + * The implementation assumes that letters are consecutive (e.g. ASCII + * but not EBCDIC). + * + * \param value A value in the range 0..63. + * + * \return A base64 digit converted from \p value. + */ +unsigned char mbedtls_ct_base64_enc_char(unsigned char value); + +/** Given a Base64 digit, return its value. + * + * If c is not a Base64 digit ('A'..'Z', 'a'..'z', '0'..'9', '+' or '/'), + * return -1. + * + * The implementation assumes that letters are consecutive (e.g. ASCII + * but not EBCDIC). + * + * \param c A base64 digit. + * + * \return The value of the base64 digit \p c. + */ +signed char mbedtls_ct_base64_dec_value(unsigned char c); + +#endif /* MBEDTLS_BASE64_C */ + +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) + +/** Conditional memcpy without branches. + * + * This is equivalent to `if ( c1 == c2 ) memcpy(dest, src, len)`, but is likely + * to be compiled to code using bitwise operation rather than a branch. + * + * \param dest The pointer to conditionally copy to. + * \param src The pointer to copy from. Shouldn't overlap with \p dest. + * \param len The number of bytes to copy. + * \param c1 The first value to analyze in the condition. + * \param c2 The second value to analyze in the condition. + */ +void mbedtls_ct_memcpy_if_eq(unsigned char *dest, + const unsigned char *src, + size_t len, + size_t c1, size_t c2); + +/** Copy data from a secret position with constant flow. + * + * This function copies \p len bytes from \p src_base + \p offset_secret to \p + * dst, with a code flow and memory access pattern that does not depend on \p + * offset_secret, but only on \p offset_min, \p offset_max and \p len. + * Functionally equivalent to `memcpy(dst, src + offset_secret, len)`. + * + * \note This function reads from \p dest, but the value that + * is read does not influence the result and this + * function's behavior is well-defined regardless of the + * contents of the buffers. This may result in false + * positives from static or dynamic analyzers, especially + * if \p dest is not initialized. + * + * \param dest The destination buffer. This must point to a writable + * buffer of at least \p len bytes. + * \param src The base of the source buffer. This must point to a + * readable buffer of at least \p offset_max + \p len + * bytes. Shouldn't overlap with \p dest. + * \param offset The offset in the source buffer from which to copy. + * This must be no less than \p offset_min and no greater + * than \p offset_max. + * \param offset_min The minimal value of \p offset. + * \param offset_max The maximal value of \p offset. + * \param len The number of bytes to copy. + */ +void mbedtls_ct_memcpy_offset(unsigned char *dest, + const unsigned char *src, + size_t offset, + size_t offset_min, + size_t offset_max, + size_t len); + +/** Compute the HMAC of variable-length data with constant flow. + * + * This function computes the HMAC of the concatenation of \p add_data and \p + * data, and does with a code flow and memory access pattern that does not + * depend on \p data_len_secret, but only on \p min_data_len and \p + * max_data_len. In particular, this function always reads exactly \p + * max_data_len bytes from \p data. + * + * \param ctx The HMAC context. It must have keys configured + * with mbedtls_md_hmac_starts() and use one of the + * following hashes: SHA-384, SHA-256, SHA-1 or MD-5. + * It is reset using mbedtls_md_hmac_reset() after + * the computation is complete to prepare for the + * next computation. + * \param add_data The first part of the message whose HMAC is being + * calculated. This must point to a readable buffer + * of \p add_data_len bytes. + * \param add_data_len The length of \p add_data in bytes. + * \param data The buffer containing the second part of the + * message. This must point to a readable buffer + * of \p max_data_len bytes. + * \param data_len_secret The length of the data to process in \p data. + * This must be no less than \p min_data_len and no + * greater than \p max_data_len. + * \param min_data_len The minimal length of the second part of the + * message, read from \p data. + * \param max_data_len The maximal length of the second part of the + * message, read from \p data. + * \param output The HMAC will be written here. This must point to + * a writable buffer of sufficient size to hold the + * HMAC value. + * + * \retval 0 on success. + * \retval #MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED + * The hardware accelerator failed. + */ +int mbedtls_ct_hmac(mbedtls_md_context_t *ctx, + const unsigned char *add_data, + size_t add_data_len, + const unsigned char *data, + size_t data_len_secret, + size_t min_data_len, + size_t max_data_len, + unsigned char *output); + +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ + +#if defined(MBEDTLS_PKCS1_V15) && defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_RSA_ALT) + +/** This function performs the unpadding part of a PKCS#1 v1.5 decryption + * operation (EME-PKCS1-v1_5 decoding). + * + * \note The return value from this function is a sensitive value + * (this is unusual). #MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE shouldn't happen + * in a well-written application, but 0 vs #MBEDTLS_ERR_RSA_INVALID_PADDING + * is often a situation that an attacker can provoke and leaking which + * one is the result is precisely the information the attacker wants. + * + * \param mode The mode of operation. This must be either + * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). + * \param input The input buffer which is the payload inside PKCS#1v1.5 + * encryption padding, called the "encoded message EM" + * by the terminology. + * \param ilen The length of the payload in the \p input buffer. + * \param output The buffer for the payload, called "message M" by the + * PKCS#1 terminology. This must be a writable buffer of + * length \p output_max_len bytes. + * \param olen The address at which to store the length of + * the payload. This must not be \c NULL. + * \param output_max_len The length in bytes of the output buffer \p output. + * + * \return \c 0 on success. + * \return #MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE + * The output buffer is too small for the unpadded payload. + * \return #MBEDTLS_ERR_RSA_INVALID_PADDING + * The input doesn't contain properly formatted padding. + */ +int mbedtls_ct_rsaes_pkcs1_v15_unpadding(int mode, + unsigned char *input, + size_t ilen, + unsigned char *output, + size_t output_max_len, + size_t *olen); + +#endif /* MBEDTLS_PKCS1_V15 && MBEDTLS_RSA_C && ! MBEDTLS_RSA_ALT */ + +#endif /* MBEDTLS_CONSTANT_TIME_INTERNAL_H */ diff --git a/ext/opcua_client/mbedtls/library/constant_time_invasive.h b/ext/opcua_client/mbedtls/library/constant_time_invasive.h new file mode 100644 index 0000000..14e0bec --- /dev/null +++ b/ext/opcua_client/mbedtls/library/constant_time_invasive.h @@ -0,0 +1,39 @@ +/** + * \file constant_time_invasive.h + * + * \brief Constant-time module: interfaces for invasive testing only. + * + * The interfaces in this file are intended for testing purposes only. + * They SHOULD NOT be made available in library integrations except when + * building the library for testing. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_CONSTANT_TIME_INVASIVE_H +#define MBEDTLS_CONSTANT_TIME_INVASIVE_H + +#include "common.h" + +#if defined(MBEDTLS_TEST_HOOKS) + +/** Turn a value into a mask: + * - if \p low <= \p c <= \p high, + * return the all-bits 1 mask, aka (unsigned) -1 + * - otherwise, return the all-bits 0 mask, aka 0 + * + * \param low The value to analyze. + * \param high The value to analyze. + * \param c The value to analyze. + * + * \return All-bits-one if \p low <= \p c <= \p high, otherwise zero. + */ +unsigned char mbedtls_ct_uchar_mask_of_range(unsigned char low, + unsigned char high, + unsigned char c); + +#endif /* MBEDTLS_TEST_HOOKS */ + +#endif /* MBEDTLS_CONSTANT_TIME_INVASIVE_H */ diff --git a/ext/opcua_client/mbedtls/library/ctr_drbg.c b/ext/opcua_client/mbedtls/library/ctr_drbg.c new file mode 100644 index 0000000..53987a2 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ctr_drbg.c @@ -0,0 +1,894 @@ +/* + * CTR_DRBG implementation based on AES-256 (NIST SP 800-90) + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The NIST SP 800-90 DRBGs are described in the following publication. + * + * https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-90r.pdf + */ + +#include "common.h" + +#if defined(MBEDTLS_CTR_DRBG_C) + +#include "mbedtls/ctr_drbg.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include +#include + +#if defined(MBEDTLS_FS_IO) +#include +#endif + +#include "mbedtls/platform.h" + +/* + * CTR_DRBG context initialization + */ +void mbedtls_ctr_drbg_init(mbedtls_ctr_drbg_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_ctr_drbg_context)); + /* Indicate that the entropy nonce length is not set explicitly. + * See mbedtls_ctr_drbg_set_nonce_len(). */ + ctx->reseed_counter = -1; + + ctx->reseed_interval = MBEDTLS_CTR_DRBG_RESEED_INTERVAL; +} + +/* + * This function resets CTR_DRBG context to the state immediately + * after initial call of mbedtls_ctr_drbg_init(). + */ +void mbedtls_ctr_drbg_free(mbedtls_ctr_drbg_context *ctx) +{ + if (ctx == NULL) { + return; + } + +#if defined(MBEDTLS_THREADING_C) + /* The mutex is initialized iff f_entropy is set. */ + if (ctx->f_entropy != NULL) { + mbedtls_mutex_free(&ctx->mutex); + } +#endif + mbedtls_aes_free(&ctx->aes_ctx); + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_ctr_drbg_context)); + ctx->reseed_interval = MBEDTLS_CTR_DRBG_RESEED_INTERVAL; + ctx->reseed_counter = -1; +} + +void mbedtls_ctr_drbg_set_prediction_resistance(mbedtls_ctr_drbg_context *ctx, + int resistance) +{ + ctx->prediction_resistance = resistance; +} + +void mbedtls_ctr_drbg_set_entropy_len(mbedtls_ctr_drbg_context *ctx, + size_t len) +{ + ctx->entropy_len = len; +} + +int mbedtls_ctr_drbg_set_nonce_len(mbedtls_ctr_drbg_context *ctx, + size_t len) +{ + /* If mbedtls_ctr_drbg_seed() has already been called, it's + * too late. Return the error code that's closest to making sense. */ + if (ctx->f_entropy != NULL) { + return MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED; + } + + if (len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT) { + return MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG; + } +#if SIZE_MAX > INT_MAX + /* This shouldn't be an issue because + * MBEDTLS_CTR_DRBG_MAX_SEED_INPUT < INT_MAX in any sensible + * configuration, but make sure anyway. */ + if (len > INT_MAX) { + return MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG; + } +#endif + + /* For backward compatibility with Mbed TLS <= 2.19, store the + * entropy nonce length in a field that already exists, but isn't + * used until after the initial seeding. */ + /* Due to the capping of len above, the value fits in an int. */ + ctx->reseed_counter = (int) len; + return 0; +} + +void mbedtls_ctr_drbg_set_reseed_interval(mbedtls_ctr_drbg_context *ctx, + int interval) +{ + ctx->reseed_interval = interval; +} + +static int block_cipher_df(unsigned char *output, + const unsigned char *data, size_t data_len) +{ + unsigned char buf[MBEDTLS_CTR_DRBG_MAX_SEED_INPUT + + MBEDTLS_CTR_DRBG_BLOCKSIZE + 16]; + unsigned char tmp[MBEDTLS_CTR_DRBG_SEEDLEN]; + unsigned char key[MBEDTLS_CTR_DRBG_KEYSIZE]; + unsigned char chain[MBEDTLS_CTR_DRBG_BLOCKSIZE]; + unsigned char *p, *iv; + mbedtls_aes_context aes_ctx; + int ret = 0; + + int i, j; + size_t buf_len, use_len; + + if (data_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT) { + return MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG; + } + + memset(buf, 0, MBEDTLS_CTR_DRBG_MAX_SEED_INPUT + + MBEDTLS_CTR_DRBG_BLOCKSIZE + 16); + mbedtls_aes_init(&aes_ctx); + + /* + * Construct IV (16 bytes) and S in buffer + * IV = Counter (in 32-bits) padded to 16 with zeroes + * S = Length input string (in 32-bits) || Length of output (in 32-bits) || + * data || 0x80 + * (Total is padded to a multiple of 16-bytes with zeroes) + */ + p = buf + MBEDTLS_CTR_DRBG_BLOCKSIZE; + MBEDTLS_PUT_UINT32_BE(data_len, p, 0); + p += 4 + 3; + *p++ = MBEDTLS_CTR_DRBG_SEEDLEN; + memcpy(p, data, data_len); + p[data_len] = 0x80; + + buf_len = MBEDTLS_CTR_DRBG_BLOCKSIZE + 8 + data_len + 1; + + for (i = 0; i < MBEDTLS_CTR_DRBG_KEYSIZE; i++) { + key[i] = i; + } + + if ((ret = mbedtls_aes_setkey_enc(&aes_ctx, key, + MBEDTLS_CTR_DRBG_KEYBITS)) != 0) { + goto exit; + } + + /* + * Reduce data to MBEDTLS_CTR_DRBG_SEEDLEN bytes of data + */ + for (j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE) { + p = buf; + memset(chain, 0, MBEDTLS_CTR_DRBG_BLOCKSIZE); + use_len = buf_len; + + while (use_len > 0) { + for (i = 0; i < MBEDTLS_CTR_DRBG_BLOCKSIZE; i++) { + chain[i] ^= p[i]; + } + p += MBEDTLS_CTR_DRBG_BLOCKSIZE; + use_len -= (use_len >= MBEDTLS_CTR_DRBG_BLOCKSIZE) ? + MBEDTLS_CTR_DRBG_BLOCKSIZE : use_len; + + if ((ret = mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_ENCRYPT, + chain, chain)) != 0) { + goto exit; + } + } + + memcpy(tmp + j, chain, MBEDTLS_CTR_DRBG_BLOCKSIZE); + + /* + * Update IV + */ + buf[3]++; + } + + /* + * Do final encryption with reduced data + */ + if ((ret = mbedtls_aes_setkey_enc(&aes_ctx, tmp, + MBEDTLS_CTR_DRBG_KEYBITS)) != 0) { + goto exit; + } + iv = tmp + MBEDTLS_CTR_DRBG_KEYSIZE; + p = output; + + for (j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE) { + if ((ret = mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_ENCRYPT, + iv, iv)) != 0) { + goto exit; + } + memcpy(p, iv, MBEDTLS_CTR_DRBG_BLOCKSIZE); + p += MBEDTLS_CTR_DRBG_BLOCKSIZE; + } +exit: + mbedtls_aes_free(&aes_ctx); + /* + * tidy up the stack + */ + mbedtls_platform_zeroize(buf, sizeof(buf)); + mbedtls_platform_zeroize(tmp, sizeof(tmp)); + mbedtls_platform_zeroize(key, sizeof(key)); + mbedtls_platform_zeroize(chain, sizeof(chain)); + if (0 != ret) { + /* + * wipe partial seed from memory + */ + mbedtls_platform_zeroize(output, MBEDTLS_CTR_DRBG_SEEDLEN); + } + + return ret; +} + +/* CTR_DRBG_Update (SP 800-90A §10.2.1.2) + * ctr_drbg_update_internal(ctx, provided_data) + * implements + * CTR_DRBG_Update(provided_data, Key, V) + * with inputs and outputs + * ctx->aes_ctx = Key + * ctx->counter = V + */ +static int ctr_drbg_update_internal(mbedtls_ctr_drbg_context *ctx, + const unsigned char data[MBEDTLS_CTR_DRBG_SEEDLEN]) +{ + unsigned char tmp[MBEDTLS_CTR_DRBG_SEEDLEN]; + unsigned char *p = tmp; + int i, j; + int ret = 0; + + memset(tmp, 0, MBEDTLS_CTR_DRBG_SEEDLEN); + + for (j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE) { + /* + * Increase counter + */ + for (i = MBEDTLS_CTR_DRBG_BLOCKSIZE; i > 0; i--) { + if (++ctx->counter[i - 1] != 0) { + break; + } + } + + /* + * Crypt counter block + */ + if ((ret = mbedtls_aes_crypt_ecb(&ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, + ctx->counter, p)) != 0) { + goto exit; + } + + p += MBEDTLS_CTR_DRBG_BLOCKSIZE; + } + + for (i = 0; i < MBEDTLS_CTR_DRBG_SEEDLEN; i++) { + tmp[i] ^= data[i]; + } + + /* + * Update key and counter + */ + if ((ret = mbedtls_aes_setkey_enc(&ctx->aes_ctx, tmp, + MBEDTLS_CTR_DRBG_KEYBITS)) != 0) { + goto exit; + } + memcpy(ctx->counter, tmp + MBEDTLS_CTR_DRBG_KEYSIZE, + MBEDTLS_CTR_DRBG_BLOCKSIZE); + +exit: + mbedtls_platform_zeroize(tmp, sizeof(tmp)); + return ret; +} + +/* CTR_DRBG_Instantiate with derivation function (SP 800-90A §10.2.1.3.2) + * mbedtls_ctr_drbg_update(ctx, additional, add_len) + * implements + * CTR_DRBG_Instantiate(entropy_input, nonce, personalization_string, + * security_strength) -> initial_working_state + * with inputs + * ctx->counter = all-bits-0 + * ctx->aes_ctx = context from all-bits-0 key + * additional[:add_len] = entropy_input || nonce || personalization_string + * and with outputs + * ctx = initial_working_state + */ +int mbedtls_ctr_drbg_update_ret(mbedtls_ctr_drbg_context *ctx, + const unsigned char *additional, + size_t add_len) +{ + unsigned char add_input[MBEDTLS_CTR_DRBG_SEEDLEN]; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (add_len == 0) { + return 0; + } + + if ((ret = block_cipher_df(add_input, additional, add_len)) != 0) { + goto exit; + } + if ((ret = ctr_drbg_update_internal(ctx, add_input)) != 0) { + goto exit; + } + +exit: + mbedtls_platform_zeroize(add_input, sizeof(add_input)); + return ret; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_ctr_drbg_update(mbedtls_ctr_drbg_context *ctx, + const unsigned char *additional, + size_t add_len) +{ + /* MAX_INPUT would be more logical here, but we have to match + * block_cipher_df()'s limits since we can't propagate errors */ + if (add_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT) { + add_len = MBEDTLS_CTR_DRBG_MAX_SEED_INPUT; + } + (void) mbedtls_ctr_drbg_update_ret(ctx, additional, add_len); +} +#endif /* MBEDTLS_DEPRECATED_REMOVED */ + +/* CTR_DRBG_Reseed with derivation function (SP 800-90A §10.2.1.4.2) + * mbedtls_ctr_drbg_reseed(ctx, additional, len, nonce_len) + * implements + * CTR_DRBG_Reseed(working_state, entropy_input, additional_input) + * -> new_working_state + * with inputs + * ctx contains working_state + * additional[:len] = additional_input + * and entropy_input comes from calling ctx->f_entropy + * for (ctx->entropy_len + nonce_len) bytes + * and with output + * ctx contains new_working_state + */ +static int mbedtls_ctr_drbg_reseed_internal(mbedtls_ctr_drbg_context *ctx, + const unsigned char *additional, + size_t len, + size_t nonce_len) +{ + unsigned char seed[MBEDTLS_CTR_DRBG_MAX_SEED_INPUT]; + size_t seedlen = 0; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (ctx->entropy_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT) { + return MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG; + } + if (nonce_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT - ctx->entropy_len) { + return MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG; + } + if (len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT - ctx->entropy_len - nonce_len) { + return MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG; + } + + memset(seed, 0, MBEDTLS_CTR_DRBG_MAX_SEED_INPUT); + + /* Gather entropy_len bytes of entropy to seed state. */ + if (0 != ctx->f_entropy(ctx->p_entropy, seed, ctx->entropy_len)) { + return MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED; + } + seedlen += ctx->entropy_len; + + /* Gather entropy for a nonce if requested. */ + if (nonce_len != 0) { + if (0 != ctx->f_entropy(ctx->p_entropy, seed + seedlen, nonce_len)) { + return MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED; + } + seedlen += nonce_len; + } + + /* Add additional data if provided. */ + if (additional != NULL && len != 0) { + memcpy(seed + seedlen, additional, len); + seedlen += len; + } + + /* Reduce to 384 bits. */ + if ((ret = block_cipher_df(seed, seed, seedlen)) != 0) { + goto exit; + } + + /* Update state. */ + if ((ret = ctr_drbg_update_internal(ctx, seed)) != 0) { + goto exit; + } + ctx->reseed_counter = 1; + +exit: + mbedtls_platform_zeroize(seed, sizeof(seed)); + return ret; +} + +int mbedtls_ctr_drbg_reseed(mbedtls_ctr_drbg_context *ctx, + const unsigned char *additional, size_t len) +{ + return mbedtls_ctr_drbg_reseed_internal(ctx, additional, len, 0); +} + +/* Return a "good" nonce length for CTR_DRBG. The chosen nonce length + * is sufficient to achieve the maximum security strength given the key + * size and entropy length. If there is enough entropy in the initial + * call to the entropy function to serve as both the entropy input and + * the nonce, don't make a second call to get a nonce. */ +static size_t good_nonce_len(size_t entropy_len) +{ + if (entropy_len >= MBEDTLS_CTR_DRBG_KEYSIZE * 3 / 2) { + return 0; + } else { + return (entropy_len + 1) / 2; + } +} + +/* CTR_DRBG_Instantiate with derivation function (SP 800-90A §10.2.1.3.2) + * mbedtls_ctr_drbg_seed(ctx, f_entropy, p_entropy, custom, len) + * implements + * CTR_DRBG_Instantiate(entropy_input, nonce, personalization_string, + * security_strength) -> initial_working_state + * with inputs + * custom[:len] = nonce || personalization_string + * where entropy_input comes from f_entropy for ctx->entropy_len bytes + * and with outputs + * ctx = initial_working_state + */ +int mbedtls_ctr_drbg_seed(mbedtls_ctr_drbg_context *ctx, + int (*f_entropy)(void *, unsigned char *, size_t), + void *p_entropy, + const unsigned char *custom, + size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char key[MBEDTLS_CTR_DRBG_KEYSIZE]; + size_t nonce_len; + + memset(key, 0, MBEDTLS_CTR_DRBG_KEYSIZE); + + /* The mutex is initialized iff f_entropy is set. */ +#if defined(MBEDTLS_THREADING_C) + mbedtls_mutex_init(&ctx->mutex); +#endif + + mbedtls_aes_init(&ctx->aes_ctx); + + ctx->f_entropy = f_entropy; + ctx->p_entropy = p_entropy; + + if (ctx->entropy_len == 0) { + ctx->entropy_len = MBEDTLS_CTR_DRBG_ENTROPY_LEN; + } + /* ctx->reseed_counter contains the desired amount of entropy to + * grab for a nonce (see mbedtls_ctr_drbg_set_nonce_len()). + * If it's -1, indicating that the entropy nonce length was not set + * explicitly, use a sufficiently large nonce for security. */ + nonce_len = (ctx->reseed_counter >= 0 ? + (size_t) ctx->reseed_counter : + good_nonce_len(ctx->entropy_len)); + + /* Initialize with an empty key. */ + if ((ret = mbedtls_aes_setkey_enc(&ctx->aes_ctx, key, + MBEDTLS_CTR_DRBG_KEYBITS)) != 0) { + return ret; + } + + /* Do the initial seeding. */ + if ((ret = mbedtls_ctr_drbg_reseed_internal(ctx, custom, len, + nonce_len)) != 0) { + return ret; + } + return 0; +} + +/* CTR_DRBG_Generate with derivation function (SP 800-90A §10.2.1.5.2) + * mbedtls_ctr_drbg_random_with_add(ctx, output, output_len, additional, add_len) + * implements + * CTR_DRBG_Reseed(working_state, entropy_input, additional[:add_len]) + * -> working_state_after_reseed + * if required, then + * CTR_DRBG_Generate(working_state_after_reseed, + * requested_number_of_bits, additional_input) + * -> status, returned_bits, new_working_state + * with inputs + * ctx contains working_state + * requested_number_of_bits = 8 * output_len + * additional[:add_len] = additional_input + * and entropy_input comes from calling ctx->f_entropy + * and with outputs + * status = SUCCESS (this function does the reseed internally) + * returned_bits = output[:output_len] + * ctx contains new_working_state + */ +int mbedtls_ctr_drbg_random_with_add(void *p_rng, + unsigned char *output, size_t output_len, + const unsigned char *additional, size_t add_len) +{ + int ret = 0; + mbedtls_ctr_drbg_context *ctx = (mbedtls_ctr_drbg_context *) p_rng; + unsigned char add_input[MBEDTLS_CTR_DRBG_SEEDLEN]; + unsigned char *p = output; + unsigned char tmp[MBEDTLS_CTR_DRBG_BLOCKSIZE]; + int i; + size_t use_len; + + if (output_len > MBEDTLS_CTR_DRBG_MAX_REQUEST) { + return MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG; + } + + if (add_len > MBEDTLS_CTR_DRBG_MAX_INPUT) { + return MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG; + } + + memset(add_input, 0, MBEDTLS_CTR_DRBG_SEEDLEN); + + if (ctx->reseed_counter > ctx->reseed_interval || + ctx->prediction_resistance) { + if ((ret = mbedtls_ctr_drbg_reseed(ctx, additional, add_len)) != 0) { + return ret; + } + add_len = 0; + } + + if (add_len > 0) { + if ((ret = block_cipher_df(add_input, additional, add_len)) != 0) { + goto exit; + } + if ((ret = ctr_drbg_update_internal(ctx, add_input)) != 0) { + goto exit; + } + } + + while (output_len > 0) { + /* + * Increase counter + */ + for (i = MBEDTLS_CTR_DRBG_BLOCKSIZE; i > 0; i--) { + if (++ctx->counter[i - 1] != 0) { + break; + } + } + + /* + * Crypt counter block + */ + if ((ret = mbedtls_aes_crypt_ecb(&ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, + ctx->counter, tmp)) != 0) { + goto exit; + } + + use_len = (output_len > MBEDTLS_CTR_DRBG_BLOCKSIZE) + ? MBEDTLS_CTR_DRBG_BLOCKSIZE : output_len; + /* + * Copy random block to destination + */ + memcpy(p, tmp, use_len); + p += use_len; + output_len -= use_len; + } + + if ((ret = ctr_drbg_update_internal(ctx, add_input)) != 0) { + goto exit; + } + + ctx->reseed_counter++; + +exit: + mbedtls_platform_zeroize(add_input, sizeof(add_input)); + mbedtls_platform_zeroize(tmp, sizeof(tmp)); + return ret; +} + +int mbedtls_ctr_drbg_random(void *p_rng, unsigned char *output, + size_t output_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ctr_drbg_context *ctx = (mbedtls_ctr_drbg_context *) p_rng; + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&ctx->mutex)) != 0) { + return ret; + } +#endif + + ret = mbedtls_ctr_drbg_random_with_add(ctx, output, output_len, NULL, 0); + +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&ctx->mutex) != 0) { + return MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } +#endif + + return ret; +} + +#if defined(MBEDTLS_FS_IO) +int mbedtls_ctr_drbg_write_seed_file(mbedtls_ctr_drbg_context *ctx, + const char *path) +{ + int ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR; + FILE *f; + unsigned char buf[MBEDTLS_CTR_DRBG_MAX_INPUT]; + + if ((f = fopen(path, "wb")) == NULL) { + return MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR; + } + + if ((ret = mbedtls_ctr_drbg_random(ctx, buf, + MBEDTLS_CTR_DRBG_MAX_INPUT)) != 0) { + goto exit; + } + + if (fwrite(buf, 1, MBEDTLS_CTR_DRBG_MAX_INPUT, f) != + MBEDTLS_CTR_DRBG_MAX_INPUT) { + ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR; + } else { + ret = 0; + } + +exit: + mbedtls_platform_zeroize(buf, sizeof(buf)); + + fclose(f); + return ret; +} + +int mbedtls_ctr_drbg_update_seed_file(mbedtls_ctr_drbg_context *ctx, + const char *path) +{ + int ret = 0; + FILE *f = NULL; + size_t n; + unsigned char buf[MBEDTLS_CTR_DRBG_MAX_INPUT]; + unsigned char c; + + if ((f = fopen(path, "rb")) == NULL) { + return MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR; + } + + n = fread(buf, 1, sizeof(buf), f); + if (fread(&c, 1, 1, f) != 0) { + ret = MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG; + goto exit; + } + if (n == 0 || ferror(f)) { + ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR; + goto exit; + } + fclose(f); + f = NULL; + + ret = mbedtls_ctr_drbg_update_ret(ctx, buf, n); + +exit: + mbedtls_platform_zeroize(buf, sizeof(buf)); + if (f != NULL) { + fclose(f); + } + if (ret != 0) { + return ret; + } + return mbedtls_ctr_drbg_write_seed_file(ctx, path); +} +#endif /* MBEDTLS_FS_IO */ + +#if defined(MBEDTLS_SELF_TEST) + +/* The CTR_DRBG NIST test vectors used here are available at + * https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/drbg/drbgtestvectors.zip + * + * The parameters used to derive the test data are: + * + * [AES-128 use df] + * [PredictionResistance = True/False] + * [EntropyInputLen = 128] + * [NonceLen = 64] + * [PersonalizationStringLen = 128] + * [AdditionalInputLen = 0] + * [ReturnedBitsLen = 512] + * + * [AES-256 use df] + * [PredictionResistance = True/False] + * [EntropyInputLen = 256] + * [NonceLen = 128] + * [PersonalizationStringLen = 256] + * [AdditionalInputLen = 0] + * [ReturnedBitsLen = 512] + * + */ + +#if defined(MBEDTLS_CTR_DRBG_USE_128_BIT_KEY) +static const unsigned char entropy_source_pr[] = +{ 0x04, 0xd9, 0x49, 0xa6, 0xdc, 0xe8, 0x6e, 0xbb, + 0xf1, 0x08, 0x77, 0x2b, 0x9e, 0x08, 0xca, 0x92, + 0x65, 0x16, 0xda, 0x99, 0xa2, 0x59, 0xf3, 0xe8, + 0x38, 0x7e, 0x3f, 0x6b, 0x51, 0x70, 0x7b, 0x20, + 0xec, 0x53, 0xd0, 0x66, 0xc3, 0x0f, 0xe3, 0xb0, + 0xe0, 0x86, 0xa6, 0xaa, 0x5f, 0x72, 0x2f, 0xad, + 0xf7, 0xef, 0x06, 0xb8, 0xd6, 0x9c, 0x9d, 0xe8 }; + +static const unsigned char entropy_source_nopr[] = +{ 0x07, 0x0d, 0x59, 0x63, 0x98, 0x73, 0xa5, 0x45, + 0x27, 0x38, 0x22, 0x7b, 0x76, 0x85, 0xd1, 0xa9, + 0x74, 0x18, 0x1f, 0x3c, 0x22, 0xf6, 0x49, 0x20, + 0x4a, 0x47, 0xc2, 0xf3, 0x85, 0x16, 0xb4, 0x6f, + 0x00, 0x2e, 0x71, 0xda, 0xed, 0x16, 0x9b, 0x5c }; + +static const unsigned char pers_pr[] = +{ 0xbf, 0xa4, 0x9a, 0x8f, 0x7b, 0xd8, 0xb1, 0x7a, + 0x9d, 0xfa, 0x45, 0xed, 0x21, 0x52, 0xb3, 0xad }; + +static const unsigned char pers_nopr[] = +{ 0x4e, 0x61, 0x79, 0xd4, 0xc2, 0x72, 0xa1, 0x4c, + 0xf1, 0x3d, 0xf6, 0x5e, 0xa3, 0xa6, 0xe5, 0x0f }; + +static const unsigned char result_pr[] = +{ 0xc9, 0x0a, 0xaf, 0x85, 0x89, 0x71, 0x44, 0x66, + 0x4f, 0x25, 0x0b, 0x2b, 0xde, 0xd8, 0xfa, 0xff, + 0x52, 0x5a, 0x1b, 0x32, 0x5e, 0x41, 0x7a, 0x10, + 0x1f, 0xef, 0x1e, 0x62, 0x23, 0xe9, 0x20, 0x30, + 0xc9, 0x0d, 0xad, 0x69, 0xb4, 0x9c, 0x5b, 0xf4, + 0x87, 0x42, 0xd5, 0xae, 0x5e, 0x5e, 0x43, 0xcc, + 0xd9, 0xfd, 0x0b, 0x93, 0x4a, 0xe3, 0xd4, 0x06, + 0x37, 0x36, 0x0f, 0x3f, 0x72, 0x82, 0x0c, 0xcf }; + +static const unsigned char result_nopr[] = +{ 0x31, 0xc9, 0x91, 0x09, 0xf8, 0xc5, 0x10, 0x13, + 0x3c, 0xd3, 0x96, 0xf9, 0xbc, 0x2c, 0x12, 0xc0, + 0x7c, 0xc1, 0x61, 0x5f, 0xa3, 0x09, 0x99, 0xaf, + 0xd7, 0xf2, 0x36, 0xfd, 0x40, 0x1a, 0x8b, 0xf2, + 0x33, 0x38, 0xee, 0x1d, 0x03, 0x5f, 0x83, 0xb7, + 0xa2, 0x53, 0xdc, 0xee, 0x18, 0xfc, 0xa7, 0xf2, + 0xee, 0x96, 0xc6, 0xc2, 0xcd, 0x0c, 0xff, 0x02, + 0x76, 0x70, 0x69, 0xaa, 0x69, 0xd1, 0x3b, 0xe8 }; +#else /* MBEDTLS_CTR_DRBG_USE_128_BIT_KEY */ + +static const unsigned char entropy_source_pr[] = +{ 0xca, 0x58, 0xfd, 0xf2, 0xb9, 0x77, 0xcb, 0x49, + 0xd4, 0xe0, 0x5b, 0xe2, 0x39, 0x50, 0xd9, 0x8a, + 0x6a, 0xb3, 0xc5, 0x2f, 0xdf, 0x74, 0xd5, 0x85, + 0x8f, 0xd1, 0xba, 0x64, 0x54, 0x7b, 0xdb, 0x1e, + 0xc5, 0xea, 0x24, 0xc0, 0xfa, 0x0c, 0x90, 0x15, + 0x09, 0x20, 0x92, 0x42, 0x32, 0x36, 0x45, 0x45, + 0x7d, 0x20, 0x76, 0x6b, 0xcf, 0xa2, 0x15, 0xc8, + 0x2f, 0x9f, 0xbc, 0x88, 0x3f, 0x80, 0xd1, 0x2c, + 0xb7, 0x16, 0xd1, 0x80, 0x9e, 0xe1, 0xc9, 0xb3, + 0x88, 0x1b, 0x21, 0x45, 0xef, 0xa1, 0x7f, 0xce, + 0xc8, 0x92, 0x35, 0x55, 0x2a, 0xd9, 0x1d, 0x8e, + 0x12, 0x38, 0xac, 0x01, 0x4e, 0x38, 0x18, 0x76, + 0x9c, 0xf2, 0xb6, 0xd4, 0x13, 0xb6, 0x2c, 0x77, + 0xc0, 0xe7, 0xe6, 0x0c, 0x47, 0x44, 0x95, 0xbe }; + +static const unsigned char entropy_source_nopr[] = +{ 0x4c, 0xfb, 0x21, 0x86, 0x73, 0x34, 0x6d, 0x9d, + 0x50, 0xc9, 0x22, 0xe4, 0x9b, 0x0d, 0xfc, 0xd0, + 0x90, 0xad, 0xf0, 0x4f, 0x5c, 0x3b, 0xa4, 0x73, + 0x27, 0xdf, 0xcd, 0x6f, 0xa6, 0x3a, 0x78, 0x5c, + 0x01, 0x69, 0x62, 0xa7, 0xfd, 0x27, 0x87, 0xa2, + 0x4b, 0xf6, 0xbe, 0x47, 0xef, 0x37, 0x83, 0xf1, + 0xb7, 0xec, 0x46, 0x07, 0x23, 0x63, 0x83, 0x4a, + 0x1b, 0x01, 0x33, 0xf2, 0xc2, 0x38, 0x91, 0xdb, + 0x4f, 0x11, 0xa6, 0x86, 0x51, 0xf2, 0x3e, 0x3a, + 0x8b, 0x1f, 0xdc, 0x03, 0xb1, 0x92, 0xc7, 0xe7 }; + +static const unsigned char pers_pr[] = +{ 0x5a, 0x70, 0x95, 0xe9, 0x81, 0x40, 0x52, 0x33, + 0x91, 0x53, 0x7e, 0x75, 0xd6, 0x19, 0x9d, 0x1e, + 0xad, 0x0d, 0xc6, 0xa7, 0xde, 0x6c, 0x1f, 0xe0, + 0xea, 0x18, 0x33, 0xa8, 0x7e, 0x06, 0x20, 0xe9 }; + +static const unsigned char pers_nopr[] = +{ 0x88, 0xee, 0xb8, 0xe0, 0xe8, 0x3b, 0xf3, 0x29, + 0x4b, 0xda, 0xcd, 0x60, 0x99, 0xeb, 0xe4, 0xbf, + 0x55, 0xec, 0xd9, 0x11, 0x3f, 0x71, 0xe5, 0xeb, + 0xcb, 0x45, 0x75, 0xf3, 0xd6, 0xa6, 0x8a, 0x6b }; + +static const unsigned char result_pr[] = +{ 0xce, 0x2f, 0xdb, 0xb6, 0xd9, 0xb7, 0x39, 0x85, + 0x04, 0xc5, 0xc0, 0x42, 0xc2, 0x31, 0xc6, 0x1d, + 0x9b, 0x5a, 0x59, 0xf8, 0x7e, 0x0d, 0xcc, 0x62, + 0x7b, 0x65, 0x11, 0x55, 0x10, 0xeb, 0x9e, 0x3d, + 0xa4, 0xfb, 0x1c, 0x6a, 0x18, 0xc0, 0x74, 0xdb, + 0xdd, 0xe7, 0x02, 0x23, 0x63, 0x21, 0xd0, 0x39, + 0xf9, 0xa7, 0xc4, 0x52, 0x84, 0x3b, 0x49, 0x40, + 0x72, 0x2b, 0xb0, 0x6c, 0x9c, 0xdb, 0xc3, 0x43 }; + +static const unsigned char result_nopr[] = +{ 0xa5, 0x51, 0x80, 0xa1, 0x90, 0xbe, 0xf3, 0xad, + 0xaf, 0x28, 0xf6, 0xb7, 0x95, 0xe9, 0xf1, 0xf3, + 0xd6, 0xdf, 0xa1, 0xb2, 0x7d, 0xd0, 0x46, 0x7b, + 0x0c, 0x75, 0xf5, 0xfa, 0x93, 0x1e, 0x97, 0x14, + 0x75, 0xb2, 0x7c, 0xae, 0x03, 0xa2, 0x96, 0x54, + 0xe2, 0xf4, 0x09, 0x66, 0xea, 0x33, 0x64, 0x30, + 0x40, 0xd1, 0x40, 0x0f, 0xe6, 0x77, 0x87, 0x3a, + 0xf8, 0x09, 0x7c, 0x1f, 0xe9, 0xf0, 0x02, 0x98 }; +#endif /* MBEDTLS_CTR_DRBG_USE_128_BIT_KEY */ + +static size_t test_offset; +static int ctr_drbg_self_test_entropy(void *data, unsigned char *buf, + size_t len) +{ + const unsigned char *p = data; + memcpy(buf, p + test_offset, len); + test_offset += len; + return 0; +} + +#define CHK(c) if ((c) != 0) \ + { \ + if (verbose != 0) \ + mbedtls_printf("failed\n"); \ + return 1; \ + } + +#define SELF_TEST_OUTPUT_DISCARD_LENGTH 64 + +/* + * Checkup routine + */ +int mbedtls_ctr_drbg_self_test(int verbose) +{ + mbedtls_ctr_drbg_context ctx; + unsigned char buf[sizeof(result_pr)]; + + mbedtls_ctr_drbg_init(&ctx); + + /* + * Based on a NIST CTR_DRBG test vector (PR = True) + */ + if (verbose != 0) { + mbedtls_printf(" CTR_DRBG (PR = TRUE) : "); + } + + test_offset = 0; + mbedtls_ctr_drbg_set_entropy_len(&ctx, MBEDTLS_CTR_DRBG_KEYSIZE); + mbedtls_ctr_drbg_set_nonce_len(&ctx, MBEDTLS_CTR_DRBG_KEYSIZE / 2); + CHK(mbedtls_ctr_drbg_seed(&ctx, + ctr_drbg_self_test_entropy, + (void *) entropy_source_pr, + pers_pr, MBEDTLS_CTR_DRBG_KEYSIZE)); + mbedtls_ctr_drbg_set_prediction_resistance(&ctx, MBEDTLS_CTR_DRBG_PR_ON); + CHK(mbedtls_ctr_drbg_random(&ctx, buf, SELF_TEST_OUTPUT_DISCARD_LENGTH)); + CHK(mbedtls_ctr_drbg_random(&ctx, buf, sizeof(result_pr))); + CHK(memcmp(buf, result_pr, sizeof(result_pr))); + + mbedtls_ctr_drbg_free(&ctx); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + /* + * Based on a NIST CTR_DRBG test vector (PR = FALSE) + */ + if (verbose != 0) { + mbedtls_printf(" CTR_DRBG (PR = FALSE): "); + } + + mbedtls_ctr_drbg_init(&ctx); + + test_offset = 0; + mbedtls_ctr_drbg_set_entropy_len(&ctx, MBEDTLS_CTR_DRBG_KEYSIZE); + mbedtls_ctr_drbg_set_nonce_len(&ctx, MBEDTLS_CTR_DRBG_KEYSIZE / 2); + CHK(mbedtls_ctr_drbg_seed(&ctx, + ctr_drbg_self_test_entropy, + (void *) entropy_source_nopr, + pers_nopr, MBEDTLS_CTR_DRBG_KEYSIZE)); + CHK(mbedtls_ctr_drbg_reseed(&ctx, NULL, 0)); + CHK(mbedtls_ctr_drbg_random(&ctx, buf, SELF_TEST_OUTPUT_DISCARD_LENGTH)); + CHK(mbedtls_ctr_drbg_random(&ctx, buf, sizeof(result_nopr))); + CHK(memcmp(buf, result_nopr, sizeof(result_nopr))); + + mbedtls_ctr_drbg_free(&ctx); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return 0; +} +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_CTR_DRBG_C */ diff --git a/ext/opcua_client/mbedtls/library/debug.c b/ext/opcua_client/mbedtls/library/debug.c new file mode 100644 index 0000000..f2d8dce --- /dev/null +++ b/ext/opcua_client/mbedtls/library/debug.c @@ -0,0 +1,385 @@ +/* + * Debugging routines + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_DEBUG_C) + +#include "mbedtls/platform.h" + +#include "mbedtls/debug.h" +#include "mbedtls/error.h" + +#include +#include +#include + +/* DEBUG_BUF_SIZE must be at least 2 */ +#define DEBUG_BUF_SIZE 512 + +static int debug_threshold = 0; + +void mbedtls_debug_set_threshold(int threshold) +{ + debug_threshold = threshold; +} + +/* + * All calls to f_dbg must be made via this function + */ +static inline void debug_send_line(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const char *str) +{ + /* + * If in a threaded environment, we need a thread identifier. + * Since there is no portable way to get one, use the address of the ssl + * context instead, as it shouldn't be shared between threads. + */ +#if defined(MBEDTLS_THREADING_C) + char idstr[20 + DEBUG_BUF_SIZE]; /* 0x + 16 nibbles + ': ' */ + mbedtls_snprintf(idstr, sizeof(idstr), "%p: %s", (void *) ssl, str); + ssl->conf->f_dbg(ssl->conf->p_dbg, level, file, line, idstr); +#else + ssl->conf->f_dbg(ssl->conf->p_dbg, level, file, line, str); +#endif +} + +MBEDTLS_PRINTF_ATTRIBUTE(5, 6) +void mbedtls_debug_print_msg(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const char *format, ...) +{ + va_list argp; + char str[DEBUG_BUF_SIZE]; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + MBEDTLS_STATIC_ASSERT(DEBUG_BUF_SIZE >= 2, "DEBUG_BUF_SIZE too small"); + + if (NULL == ssl || + NULL == ssl->conf || + NULL == ssl->conf->f_dbg || + level > debug_threshold) { + return; + } + + va_start(argp, format); + ret = mbedtls_vsnprintf(str, DEBUG_BUF_SIZE, format, argp); + va_end(argp); + + if (ret < 0) { + ret = 0; + } else { + if (ret >= DEBUG_BUF_SIZE - 1) { + ret = DEBUG_BUF_SIZE - 2; + } + } + str[ret] = '\n'; + str[ret + 1] = '\0'; + + debug_send_line(ssl, level, file, line, str); +} + +void mbedtls_debug_print_ret(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const char *text, int ret) +{ + char str[DEBUG_BUF_SIZE]; + + if (NULL == ssl || + NULL == ssl->conf || + NULL == ssl->conf->f_dbg || + level > debug_threshold) { + return; + } + + /* + * With non-blocking I/O and examples that just retry immediately, + * the logs would be quickly flooded with WANT_READ, so ignore that. + * Don't ignore WANT_WRITE however, since is is usually rare. + */ + if (ret == MBEDTLS_ERR_SSL_WANT_READ) { + return; + } + + mbedtls_snprintf(str, sizeof(str), "%s() returned %d (-0x%04x)\n", + text, ret, (unsigned int) -ret); + + debug_send_line(ssl, level, file, line, str); +} + +void mbedtls_debug_print_buf(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, const char *text, + const unsigned char *buf, size_t len) +{ + char str[DEBUG_BUF_SIZE]; + char txt[17]; + size_t i, idx = 0; + + if (NULL == ssl || + NULL == ssl->conf || + NULL == ssl->conf->f_dbg || + level > debug_threshold) { + return; + } + + mbedtls_snprintf(str + idx, sizeof(str) - idx, "dumping '%s' (%u bytes)\n", + text, (unsigned int) len); + + debug_send_line(ssl, level, file, line, str); + + idx = 0; + memset(txt, 0, sizeof(txt)); + for (i = 0; i < len; i++) { + if (i >= 4096) { + break; + } + + if (i % 16 == 0) { + if (i > 0) { + mbedtls_snprintf(str + idx, sizeof(str) - idx, " %s\n", txt); + debug_send_line(ssl, level, file, line, str); + + idx = 0; + memset(txt, 0, sizeof(txt)); + } + + idx += mbedtls_snprintf(str + idx, sizeof(str) - idx, "%04x: ", + (unsigned int) i); + + } + + idx += mbedtls_snprintf(str + idx, sizeof(str) - idx, " %02x", + (unsigned int) buf[i]); + txt[i % 16] = (buf[i] > 31 && buf[i] < 127) ? buf[i] : '.'; + } + + if (len > 0) { + for (/* i = i */; i % 16 != 0; i++) { + idx += mbedtls_snprintf(str + idx, sizeof(str) - idx, " "); + } + + mbedtls_snprintf(str + idx, sizeof(str) - idx, " %s\n", txt); + debug_send_line(ssl, level, file, line, str); + } +} + +#if defined(MBEDTLS_ECP_C) +void mbedtls_debug_print_ecp(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const char *text, const mbedtls_ecp_point *X) +{ + char str[DEBUG_BUF_SIZE]; + + if (NULL == ssl || + NULL == ssl->conf || + NULL == ssl->conf->f_dbg || + level > debug_threshold) { + return; + } + + mbedtls_snprintf(str, sizeof(str), "%s(X)", text); + mbedtls_debug_print_mpi(ssl, level, file, line, str, &X->X); + + mbedtls_snprintf(str, sizeof(str), "%s(Y)", text); + mbedtls_debug_print_mpi(ssl, level, file, line, str, &X->Y); +} +#endif /* MBEDTLS_ECP_C */ + +#if defined(MBEDTLS_BIGNUM_C) +void mbedtls_debug_print_mpi(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const char *text, const mbedtls_mpi *X) +{ + char str[DEBUG_BUF_SIZE]; + size_t bitlen; + size_t idx = 0; + + if (NULL == ssl || + NULL == ssl->conf || + NULL == ssl->conf->f_dbg || + NULL == X || + level > debug_threshold) { + return; + } + + bitlen = mbedtls_mpi_bitlen(X); + + mbedtls_snprintf(str, sizeof(str), "value of '%s' (%u bits) is:\n", + text, (unsigned) bitlen); + debug_send_line(ssl, level, file, line, str); + + if (bitlen == 0) { + str[0] = ' '; str[1] = '0'; str[2] = '0'; + idx = 3; + } else { + int n; + for (n = (int) ((bitlen - 1) / 8); n >= 0; n--) { + size_t limb_offset = n / sizeof(mbedtls_mpi_uint); + size_t offset_in_limb = n % sizeof(mbedtls_mpi_uint); + unsigned char octet = + (X->p[limb_offset] >> (offset_in_limb * 8)) & 0xff; + mbedtls_snprintf(str + idx, sizeof(str) - idx, " %02x", octet); + idx += 3; + /* Wrap lines after 16 octets that each take 3 columns */ + if (idx >= 3 * 16) { + mbedtls_snprintf(str + idx, sizeof(str) - idx, "\n"); + debug_send_line(ssl, level, file, line, str); + idx = 0; + } + } + } + + if (idx != 0) { + mbedtls_snprintf(str + idx, sizeof(str) - idx, "\n"); + debug_send_line(ssl, level, file, line, str); + } +} +#endif /* MBEDTLS_BIGNUM_C */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +static void debug_print_pk(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const char *text, const mbedtls_pk_context *pk) +{ + size_t i; + mbedtls_pk_debug_item items[MBEDTLS_PK_DEBUG_MAX_ITEMS]; + char name[16]; + + memset(items, 0, sizeof(items)); + + if (mbedtls_pk_debug(pk, items) != 0) { + debug_send_line(ssl, level, file, line, + "invalid PK context\n"); + return; + } + + for (i = 0; i < MBEDTLS_PK_DEBUG_MAX_ITEMS; i++) { + if (items[i].type == MBEDTLS_PK_DEBUG_NONE) { + return; + } + + mbedtls_snprintf(name, sizeof(name), "%s%s", text, items[i].name); + name[sizeof(name) - 1] = '\0'; + + if (items[i].type == MBEDTLS_PK_DEBUG_MPI) { + mbedtls_debug_print_mpi(ssl, level, file, line, name, items[i].value); + } else +#if defined(MBEDTLS_ECP_C) + if (items[i].type == MBEDTLS_PK_DEBUG_ECP) { + mbedtls_debug_print_ecp(ssl, level, file, line, name, items[i].value); + } else +#endif + { debug_send_line(ssl, level, file, line, + "should not happen\n"); } + } +} + +static void debug_print_line_by_line(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, const char *text) +{ + char str[DEBUG_BUF_SIZE]; + const char *start, *cur; + + start = text; + for (cur = text; *cur != '\0'; cur++) { + if (*cur == '\n') { + size_t len = cur - start + 1; + if (len > DEBUG_BUF_SIZE - 1) { + len = DEBUG_BUF_SIZE - 1; + } + + memcpy(str, start, len); + str[len] = '\0'; + + debug_send_line(ssl, level, file, line, str); + + start = cur + 1; + } + } +} + +void mbedtls_debug_print_crt(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const char *text, const mbedtls_x509_crt *crt) +{ + char str[DEBUG_BUF_SIZE]; + int i = 0; + + if (NULL == ssl || + NULL == ssl->conf || + NULL == ssl->conf->f_dbg || + NULL == crt || + level > debug_threshold) { + return; + } + + while (crt != NULL) { + char buf[1024]; + + mbedtls_snprintf(str, sizeof(str), "%s #%d:\n", text, ++i); + debug_send_line(ssl, level, file, line, str); + + mbedtls_x509_crt_info(buf, sizeof(buf) - 1, "", crt); + debug_print_line_by_line(ssl, level, file, line, buf); + + debug_print_pk(ssl, level, file, line, "crt->", &crt->pk); + + crt = crt->next; + } +} +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +#if defined(MBEDTLS_ECDH_C) +static void mbedtls_debug_printf_ecdh_internal(const mbedtls_ssl_context *ssl, + int level, const char *file, + int line, + const mbedtls_ecdh_context *ecdh, + mbedtls_debug_ecdh_attr attr) +{ +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + const mbedtls_ecdh_context *ctx = ecdh; +#else + const mbedtls_ecdh_context_mbed *ctx = &ecdh->ctx.mbed_ecdh; +#endif + + switch (attr) { + case MBEDTLS_DEBUG_ECDH_Q: + mbedtls_debug_print_ecp(ssl, level, file, line, "ECDH: Q", + &ctx->Q); + break; + case MBEDTLS_DEBUG_ECDH_QP: + mbedtls_debug_print_ecp(ssl, level, file, line, "ECDH: Qp", + &ctx->Qp); + break; + case MBEDTLS_DEBUG_ECDH_Z: + mbedtls_debug_print_mpi(ssl, level, file, line, "ECDH: z", + &ctx->z); + break; + default: + break; + } +} + +void mbedtls_debug_printf_ecdh(const mbedtls_ssl_context *ssl, int level, + const char *file, int line, + const mbedtls_ecdh_context *ecdh, + mbedtls_debug_ecdh_attr attr) +{ +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + mbedtls_debug_printf_ecdh_internal(ssl, level, file, line, ecdh, attr); +#else + switch (ecdh->var) { + default: + mbedtls_debug_printf_ecdh_internal(ssl, level, file, line, ecdh, + attr); + } +#endif +} +#endif /* MBEDTLS_ECDH_C */ + +#endif /* MBEDTLS_DEBUG_C */ diff --git a/ext/opcua_client/mbedtls/library/des.c b/ext/opcua_client/mbedtls/library/des.c new file mode 100644 index 0000000..afe72ce --- /dev/null +++ b/ext/opcua_client/mbedtls/library/des.c @@ -0,0 +1,1052 @@ +/* + * FIPS-46-3 compliant Triple-DES implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * DES, on which TDES is based, was originally designed by Horst Feistel + * at IBM in 1974, and was adopted as a standard by NIST (formerly NBS). + * + * http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf + */ + +#include "common.h" + +#if defined(MBEDTLS_DES_C) + +#include "mbedtls/des.h" +#include "mbedtls/error.h" +#include "mbedtls/platform_util.h" + +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_DES_ALT) + +/* + * Expanded DES S-boxes + */ +static const uint32_t SB1[64] = +{ + 0x01010400, 0x00000000, 0x00010000, 0x01010404, + 0x01010004, 0x00010404, 0x00000004, 0x00010000, + 0x00000400, 0x01010400, 0x01010404, 0x00000400, + 0x01000404, 0x01010004, 0x01000000, 0x00000004, + 0x00000404, 0x01000400, 0x01000400, 0x00010400, + 0x00010400, 0x01010000, 0x01010000, 0x01000404, + 0x00010004, 0x01000004, 0x01000004, 0x00010004, + 0x00000000, 0x00000404, 0x00010404, 0x01000000, + 0x00010000, 0x01010404, 0x00000004, 0x01010000, + 0x01010400, 0x01000000, 0x01000000, 0x00000400, + 0x01010004, 0x00010000, 0x00010400, 0x01000004, + 0x00000400, 0x00000004, 0x01000404, 0x00010404, + 0x01010404, 0x00010004, 0x01010000, 0x01000404, + 0x01000004, 0x00000404, 0x00010404, 0x01010400, + 0x00000404, 0x01000400, 0x01000400, 0x00000000, + 0x00010004, 0x00010400, 0x00000000, 0x01010004 +}; + +static const uint32_t SB2[64] = +{ + 0x80108020, 0x80008000, 0x00008000, 0x00108020, + 0x00100000, 0x00000020, 0x80100020, 0x80008020, + 0x80000020, 0x80108020, 0x80108000, 0x80000000, + 0x80008000, 0x00100000, 0x00000020, 0x80100020, + 0x00108000, 0x00100020, 0x80008020, 0x00000000, + 0x80000000, 0x00008000, 0x00108020, 0x80100000, + 0x00100020, 0x80000020, 0x00000000, 0x00108000, + 0x00008020, 0x80108000, 0x80100000, 0x00008020, + 0x00000000, 0x00108020, 0x80100020, 0x00100000, + 0x80008020, 0x80100000, 0x80108000, 0x00008000, + 0x80100000, 0x80008000, 0x00000020, 0x80108020, + 0x00108020, 0x00000020, 0x00008000, 0x80000000, + 0x00008020, 0x80108000, 0x00100000, 0x80000020, + 0x00100020, 0x80008020, 0x80000020, 0x00100020, + 0x00108000, 0x00000000, 0x80008000, 0x00008020, + 0x80000000, 0x80100020, 0x80108020, 0x00108000 +}; + +static const uint32_t SB3[64] = +{ + 0x00000208, 0x08020200, 0x00000000, 0x08020008, + 0x08000200, 0x00000000, 0x00020208, 0x08000200, + 0x00020008, 0x08000008, 0x08000008, 0x00020000, + 0x08020208, 0x00020008, 0x08020000, 0x00000208, + 0x08000000, 0x00000008, 0x08020200, 0x00000200, + 0x00020200, 0x08020000, 0x08020008, 0x00020208, + 0x08000208, 0x00020200, 0x00020000, 0x08000208, + 0x00000008, 0x08020208, 0x00000200, 0x08000000, + 0x08020200, 0x08000000, 0x00020008, 0x00000208, + 0x00020000, 0x08020200, 0x08000200, 0x00000000, + 0x00000200, 0x00020008, 0x08020208, 0x08000200, + 0x08000008, 0x00000200, 0x00000000, 0x08020008, + 0x08000208, 0x00020000, 0x08000000, 0x08020208, + 0x00000008, 0x00020208, 0x00020200, 0x08000008, + 0x08020000, 0x08000208, 0x00000208, 0x08020000, + 0x00020208, 0x00000008, 0x08020008, 0x00020200 +}; + +static const uint32_t SB4[64] = +{ + 0x00802001, 0x00002081, 0x00002081, 0x00000080, + 0x00802080, 0x00800081, 0x00800001, 0x00002001, + 0x00000000, 0x00802000, 0x00802000, 0x00802081, + 0x00000081, 0x00000000, 0x00800080, 0x00800001, + 0x00000001, 0x00002000, 0x00800000, 0x00802001, + 0x00000080, 0x00800000, 0x00002001, 0x00002080, + 0x00800081, 0x00000001, 0x00002080, 0x00800080, + 0x00002000, 0x00802080, 0x00802081, 0x00000081, + 0x00800080, 0x00800001, 0x00802000, 0x00802081, + 0x00000081, 0x00000000, 0x00000000, 0x00802000, + 0x00002080, 0x00800080, 0x00800081, 0x00000001, + 0x00802001, 0x00002081, 0x00002081, 0x00000080, + 0x00802081, 0x00000081, 0x00000001, 0x00002000, + 0x00800001, 0x00002001, 0x00802080, 0x00800081, + 0x00002001, 0x00002080, 0x00800000, 0x00802001, + 0x00000080, 0x00800000, 0x00002000, 0x00802080 +}; + +static const uint32_t SB5[64] = +{ + 0x00000100, 0x02080100, 0x02080000, 0x42000100, + 0x00080000, 0x00000100, 0x40000000, 0x02080000, + 0x40080100, 0x00080000, 0x02000100, 0x40080100, + 0x42000100, 0x42080000, 0x00080100, 0x40000000, + 0x02000000, 0x40080000, 0x40080000, 0x00000000, + 0x40000100, 0x42080100, 0x42080100, 0x02000100, + 0x42080000, 0x40000100, 0x00000000, 0x42000000, + 0x02080100, 0x02000000, 0x42000000, 0x00080100, + 0x00080000, 0x42000100, 0x00000100, 0x02000000, + 0x40000000, 0x02080000, 0x42000100, 0x40080100, + 0x02000100, 0x40000000, 0x42080000, 0x02080100, + 0x40080100, 0x00000100, 0x02000000, 0x42080000, + 0x42080100, 0x00080100, 0x42000000, 0x42080100, + 0x02080000, 0x00000000, 0x40080000, 0x42000000, + 0x00080100, 0x02000100, 0x40000100, 0x00080000, + 0x00000000, 0x40080000, 0x02080100, 0x40000100 +}; + +static const uint32_t SB6[64] = +{ + 0x20000010, 0x20400000, 0x00004000, 0x20404010, + 0x20400000, 0x00000010, 0x20404010, 0x00400000, + 0x20004000, 0x00404010, 0x00400000, 0x20000010, + 0x00400010, 0x20004000, 0x20000000, 0x00004010, + 0x00000000, 0x00400010, 0x20004010, 0x00004000, + 0x00404000, 0x20004010, 0x00000010, 0x20400010, + 0x20400010, 0x00000000, 0x00404010, 0x20404000, + 0x00004010, 0x00404000, 0x20404000, 0x20000000, + 0x20004000, 0x00000010, 0x20400010, 0x00404000, + 0x20404010, 0x00400000, 0x00004010, 0x20000010, + 0x00400000, 0x20004000, 0x20000000, 0x00004010, + 0x20000010, 0x20404010, 0x00404000, 0x20400000, + 0x00404010, 0x20404000, 0x00000000, 0x20400010, + 0x00000010, 0x00004000, 0x20400000, 0x00404010, + 0x00004000, 0x00400010, 0x20004010, 0x00000000, + 0x20404000, 0x20000000, 0x00400010, 0x20004010 +}; + +static const uint32_t SB7[64] = +{ + 0x00200000, 0x04200002, 0x04000802, 0x00000000, + 0x00000800, 0x04000802, 0x00200802, 0x04200800, + 0x04200802, 0x00200000, 0x00000000, 0x04000002, + 0x00000002, 0x04000000, 0x04200002, 0x00000802, + 0x04000800, 0x00200802, 0x00200002, 0x04000800, + 0x04000002, 0x04200000, 0x04200800, 0x00200002, + 0x04200000, 0x00000800, 0x00000802, 0x04200802, + 0x00200800, 0x00000002, 0x04000000, 0x00200800, + 0x04000000, 0x00200800, 0x00200000, 0x04000802, + 0x04000802, 0x04200002, 0x04200002, 0x00000002, + 0x00200002, 0x04000000, 0x04000800, 0x00200000, + 0x04200800, 0x00000802, 0x00200802, 0x04200800, + 0x00000802, 0x04000002, 0x04200802, 0x04200000, + 0x00200800, 0x00000000, 0x00000002, 0x04200802, + 0x00000000, 0x00200802, 0x04200000, 0x00000800, + 0x04000002, 0x04000800, 0x00000800, 0x00200002 +}; + +static const uint32_t SB8[64] = +{ + 0x10001040, 0x00001000, 0x00040000, 0x10041040, + 0x10000000, 0x10001040, 0x00000040, 0x10000000, + 0x00040040, 0x10040000, 0x10041040, 0x00041000, + 0x10041000, 0x00041040, 0x00001000, 0x00000040, + 0x10040000, 0x10000040, 0x10001000, 0x00001040, + 0x00041000, 0x00040040, 0x10040040, 0x10041000, + 0x00001040, 0x00000000, 0x00000000, 0x10040040, + 0x10000040, 0x10001000, 0x00041040, 0x00040000, + 0x00041040, 0x00040000, 0x10041000, 0x00001000, + 0x00000040, 0x10040040, 0x00001000, 0x00041040, + 0x10001000, 0x00000040, 0x10000040, 0x10040000, + 0x10040040, 0x10000000, 0x00040000, 0x10001040, + 0x00000000, 0x10041040, 0x00040040, 0x10000040, + 0x10040000, 0x10001000, 0x10001040, 0x00000000, + 0x10041040, 0x00041000, 0x00041000, 0x00001040, + 0x00001040, 0x00040040, 0x10000000, 0x10041000 +}; + +/* + * PC1: left and right halves bit-swap + */ +static const uint32_t LHs[16] = +{ + 0x00000000, 0x00000001, 0x00000100, 0x00000101, + 0x00010000, 0x00010001, 0x00010100, 0x00010101, + 0x01000000, 0x01000001, 0x01000100, 0x01000101, + 0x01010000, 0x01010001, 0x01010100, 0x01010101 +}; + +static const uint32_t RHs[16] = +{ + 0x00000000, 0x01000000, 0x00010000, 0x01010000, + 0x00000100, 0x01000100, 0x00010100, 0x01010100, + 0x00000001, 0x01000001, 0x00010001, 0x01010001, + 0x00000101, 0x01000101, 0x00010101, 0x01010101, +}; + +/* + * Initial Permutation macro + */ +#define DES_IP(X, Y) \ + do \ + { \ + T = (((X) >> 4) ^ (Y)) & 0x0F0F0F0F; (Y) ^= T; (X) ^= (T << 4); \ + T = (((X) >> 16) ^ (Y)) & 0x0000FFFF; (Y) ^= T; (X) ^= (T << 16); \ + T = (((Y) >> 2) ^ (X)) & 0x33333333; (X) ^= T; (Y) ^= (T << 2); \ + T = (((Y) >> 8) ^ (X)) & 0x00FF00FF; (X) ^= T; (Y) ^= (T << 8); \ + (Y) = (((Y) << 1) | ((Y) >> 31)) & 0xFFFFFFFF; \ + T = ((X) ^ (Y)) & 0xAAAAAAAA; (Y) ^= T; (X) ^= T; \ + (X) = (((X) << 1) | ((X) >> 31)) & 0xFFFFFFFF; \ + } while (0) + +/* + * Final Permutation macro + */ +#define DES_FP(X, Y) \ + do \ + { \ + (X) = (((X) << 31) | ((X) >> 1)) & 0xFFFFFFFF; \ + T = ((X) ^ (Y)) & 0xAAAAAAAA; (X) ^= T; (Y) ^= T; \ + (Y) = (((Y) << 31) | ((Y) >> 1)) & 0xFFFFFFFF; \ + T = (((Y) >> 8) ^ (X)) & 0x00FF00FF; (X) ^= T; (Y) ^= (T << 8); \ + T = (((Y) >> 2) ^ (X)) & 0x33333333; (X) ^= T; (Y) ^= (T << 2); \ + T = (((X) >> 16) ^ (Y)) & 0x0000FFFF; (Y) ^= T; (X) ^= (T << 16); \ + T = (((X) >> 4) ^ (Y)) & 0x0F0F0F0F; (Y) ^= T; (X) ^= (T << 4); \ + } while (0) + +/* + * DES round macro + */ +#define DES_ROUND(X, Y) \ + do \ + { \ + T = *SK++ ^ (X); \ + (Y) ^= SB8[(T) & 0x3F] ^ \ + SB6[(T >> 8) & 0x3F] ^ \ + SB4[(T >> 16) & 0x3F] ^ \ + SB2[(T >> 24) & 0x3F]; \ + \ + T = *SK++ ^ (((X) << 28) | ((X) >> 4)); \ + (Y) ^= SB7[(T) & 0x3F] ^ \ + SB5[(T >> 8) & 0x3F] ^ \ + SB3[(T >> 16) & 0x3F] ^ \ + SB1[(T >> 24) & 0x3F]; \ + } while (0) + +#define SWAP(a, b) \ + do \ + { \ + uint32_t t = (a); (a) = (b); (b) = t; t = 0; \ + } while (0) + +void mbedtls_des_init(mbedtls_des_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_des_context)); +} + +void mbedtls_des_free(mbedtls_des_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_des_context)); +} + +void mbedtls_des3_init(mbedtls_des3_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_des3_context)); +} + +void mbedtls_des3_free(mbedtls_des3_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_des3_context)); +} + +static const unsigned char odd_parity_table[128] = { 1, 2, 4, 7, 8, + 11, 13, 14, 16, 19, 21, 22, 25, 26, 28, 31, 32, + 35, 37, 38, 41, 42, 44, + 47, 49, 50, 52, 55, 56, 59, 61, 62, 64, 67, 69, + 70, 73, 74, 76, 79, 81, + 82, 84, 87, 88, 91, 93, 94, 97, 98, 100, 103, + 104, 107, 109, 110, 112, + 115, 117, 118, 121, 122, 124, 127, 128, 131, + 133, 134, 137, 138, 140, + 143, 145, 146, 148, 151, 152, 155, 157, 158, + 161, 162, 164, 167, 168, + 171, 173, 174, 176, 179, 181, 182, 185, 186, + 188, 191, 193, 194, 196, + 199, 200, 203, 205, 206, 208, 211, 213, 214, + 217, 218, 220, 223, 224, + 227, 229, 230, 233, 234, 236, 239, 241, 242, + 244, 247, 248, 251, 253, + 254 }; + +void mbedtls_des_key_set_parity(unsigned char key[MBEDTLS_DES_KEY_SIZE]) +{ + int i; + + for (i = 0; i < MBEDTLS_DES_KEY_SIZE; i++) { + key[i] = odd_parity_table[key[i] / 2]; + } +} + +/* + * Check the given key's parity, returns 1 on failure, 0 on SUCCESS + */ +int mbedtls_des_key_check_key_parity(const unsigned char key[MBEDTLS_DES_KEY_SIZE]) +{ + int i; + + for (i = 0; i < MBEDTLS_DES_KEY_SIZE; i++) { + if (key[i] != odd_parity_table[key[i] / 2]) { + return 1; + } + } + + return 0; +} + +/* + * Table of weak and semi-weak keys + * + * Source: http://en.wikipedia.org/wiki/Weak_key + * + * Weak: + * Alternating ones + zeros (0x0101010101010101) + * Alternating 'F' + 'E' (0xFEFEFEFEFEFEFEFE) + * '0xE0E0E0E0F1F1F1F1' + * '0x1F1F1F1F0E0E0E0E' + * + * Semi-weak: + * 0x011F011F010E010E and 0x1F011F010E010E01 + * 0x01E001E001F101F1 and 0xE001E001F101F101 + * 0x01FE01FE01FE01FE and 0xFE01FE01FE01FE01 + * 0x1FE01FE00EF10EF1 and 0xE01FE01FF10EF10E + * 0x1FFE1FFE0EFE0EFE and 0xFE1FFE1FFE0EFE0E + * 0xE0FEE0FEF1FEF1FE and 0xFEE0FEE0FEF1FEF1 + * + */ + +#define WEAK_KEY_COUNT 16 + +static const unsigned char weak_key_table[WEAK_KEY_COUNT][MBEDTLS_DES_KEY_SIZE] = +{ + { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE }, + { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E }, + { 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 }, + + { 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E }, + { 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 }, + { 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 }, + { 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 }, + { 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE }, + { 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 }, + { 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 }, + { 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E }, + { 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE }, + { 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E }, + { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE }, + { 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 } +}; + +int mbedtls_des_key_check_weak(const unsigned char key[MBEDTLS_DES_KEY_SIZE]) +{ + int i; + + for (i = 0; i < WEAK_KEY_COUNT; i++) { + if (memcmp(weak_key_table[i], key, MBEDTLS_DES_KEY_SIZE) == 0) { + return 1; + } + } + + return 0; +} + +#if !defined(MBEDTLS_DES_SETKEY_ALT) +void mbedtls_des_setkey(uint32_t SK[32], const unsigned char key[MBEDTLS_DES_KEY_SIZE]) +{ + int i; + uint32_t X, Y, T; + + X = MBEDTLS_GET_UINT32_BE(key, 0); + Y = MBEDTLS_GET_UINT32_BE(key, 4); + + /* + * Permuted Choice 1 + */ + T = ((Y >> 4) ^ X) & 0x0F0F0F0F; X ^= T; Y ^= (T << 4); + T = ((Y) ^ X) & 0x10101010; X ^= T; Y ^= (T); + + X = (LHs[(X) & 0xF] << 3) | (LHs[(X >> 8) & 0xF] << 2) + | (LHs[(X >> 16) & 0xF] << 1) | (LHs[(X >> 24) & 0xF]) + | (LHs[(X >> 5) & 0xF] << 7) | (LHs[(X >> 13) & 0xF] << 6) + | (LHs[(X >> 21) & 0xF] << 5) | (LHs[(X >> 29) & 0xF] << 4); + + Y = (RHs[(Y >> 1) & 0xF] << 3) | (RHs[(Y >> 9) & 0xF] << 2) + | (RHs[(Y >> 17) & 0xF] << 1) | (RHs[(Y >> 25) & 0xF]) + | (RHs[(Y >> 4) & 0xF] << 7) | (RHs[(Y >> 12) & 0xF] << 6) + | (RHs[(Y >> 20) & 0xF] << 5) | (RHs[(Y >> 28) & 0xF] << 4); + + X &= 0x0FFFFFFF; + Y &= 0x0FFFFFFF; + + /* + * calculate subkeys + */ + for (i = 0; i < 16; i++) { + if (i < 2 || i == 8 || i == 15) { + X = ((X << 1) | (X >> 27)) & 0x0FFFFFFF; + Y = ((Y << 1) | (Y >> 27)) & 0x0FFFFFFF; + } else { + X = ((X << 2) | (X >> 26)) & 0x0FFFFFFF; + Y = ((Y << 2) | (Y >> 26)) & 0x0FFFFFFF; + } + + *SK++ = ((X << 4) & 0x24000000) | ((X << 28) & 0x10000000) + | ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000) + | ((X << 6) & 0x01000000) | ((X << 9) & 0x00200000) + | ((X >> 1) & 0x00100000) | ((X << 10) & 0x00040000) + | ((X << 2) & 0x00020000) | ((X >> 10) & 0x00010000) + | ((Y >> 13) & 0x00002000) | ((Y >> 4) & 0x00001000) + | ((Y << 6) & 0x00000800) | ((Y >> 1) & 0x00000400) + | ((Y >> 14) & 0x00000200) | ((Y) & 0x00000100) + | ((Y >> 5) & 0x00000020) | ((Y >> 10) & 0x00000010) + | ((Y >> 3) & 0x00000008) | ((Y >> 18) & 0x00000004) + | ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001); + + *SK++ = ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000) + | ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000) + | ((X >> 2) & 0x02000000) | ((X << 1) & 0x01000000) + | ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000) + | ((X << 3) & 0x00080000) | ((X >> 6) & 0x00040000) + | ((X << 15) & 0x00020000) | ((X >> 4) & 0x00010000) + | ((Y >> 2) & 0x00002000) | ((Y << 8) & 0x00001000) + | ((Y >> 14) & 0x00000808) | ((Y >> 9) & 0x00000400) + | ((Y) & 0x00000200) | ((Y << 7) & 0x00000100) + | ((Y >> 7) & 0x00000020) | ((Y >> 3) & 0x00000011) + | ((Y << 2) & 0x00000004) | ((Y >> 21) & 0x00000002); + } +} +#endif /* !MBEDTLS_DES_SETKEY_ALT */ + +/* + * DES key schedule (56-bit, encryption) + */ +int mbedtls_des_setkey_enc(mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE]) +{ + mbedtls_des_setkey(ctx->sk, key); + + return 0; +} + +/* + * DES key schedule (56-bit, decryption) + */ +int mbedtls_des_setkey_dec(mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE]) +{ + int i; + + mbedtls_des_setkey(ctx->sk, key); + + for (i = 0; i < 16; i += 2) { + SWAP(ctx->sk[i], ctx->sk[30 - i]); + SWAP(ctx->sk[i + 1], ctx->sk[31 - i]); + } + + return 0; +} + +static void des3_set2key(uint32_t esk[96], + uint32_t dsk[96], + const unsigned char key[MBEDTLS_DES_KEY_SIZE*2]) +{ + int i; + + mbedtls_des_setkey(esk, key); + mbedtls_des_setkey(dsk + 32, key + 8); + + for (i = 0; i < 32; i += 2) { + dsk[i] = esk[30 - i]; + dsk[i + 1] = esk[31 - i]; + + esk[i + 32] = dsk[62 - i]; + esk[i + 33] = dsk[63 - i]; + + esk[i + 64] = esk[i]; + esk[i + 65] = esk[i + 1]; + + dsk[i + 64] = dsk[i]; + dsk[i + 65] = dsk[i + 1]; + } +} + +/* + * Triple-DES key schedule (112-bit, encryption) + */ +int mbedtls_des3_set2key_enc(mbedtls_des3_context *ctx, + const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2]) +{ + uint32_t sk[96]; + + des3_set2key(ctx->sk, sk, key); + mbedtls_platform_zeroize(sk, sizeof(sk)); + + return 0; +} + +/* + * Triple-DES key schedule (112-bit, decryption) + */ +int mbedtls_des3_set2key_dec(mbedtls_des3_context *ctx, + const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2]) +{ + uint32_t sk[96]; + + des3_set2key(sk, ctx->sk, key); + mbedtls_platform_zeroize(sk, sizeof(sk)); + + return 0; +} + +static void des3_set3key(uint32_t esk[96], + uint32_t dsk[96], + const unsigned char key[24]) +{ + int i; + + mbedtls_des_setkey(esk, key); + mbedtls_des_setkey(dsk + 32, key + 8); + mbedtls_des_setkey(esk + 64, key + 16); + + for (i = 0; i < 32; i += 2) { + dsk[i] = esk[94 - i]; + dsk[i + 1] = esk[95 - i]; + + esk[i + 32] = dsk[62 - i]; + esk[i + 33] = dsk[63 - i]; + + dsk[i + 64] = esk[30 - i]; + dsk[i + 65] = esk[31 - i]; + } +} + +/* + * Triple-DES key schedule (168-bit, encryption) + */ +int mbedtls_des3_set3key_enc(mbedtls_des3_context *ctx, + const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3]) +{ + uint32_t sk[96]; + + des3_set3key(ctx->sk, sk, key); + mbedtls_platform_zeroize(sk, sizeof(sk)); + + return 0; +} + +/* + * Triple-DES key schedule (168-bit, decryption) + */ +int mbedtls_des3_set3key_dec(mbedtls_des3_context *ctx, + const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3]) +{ + uint32_t sk[96]; + + des3_set3key(sk, ctx->sk, key); + mbedtls_platform_zeroize(sk, sizeof(sk)); + + return 0; +} + +/* + * DES-ECB block encryption/decryption + */ +#if !defined(MBEDTLS_DES_CRYPT_ECB_ALT) +int mbedtls_des_crypt_ecb(mbedtls_des_context *ctx, + const unsigned char input[8], + unsigned char output[8]) +{ + int i; + uint32_t X, Y, T, *SK; + + SK = ctx->sk; + + X = MBEDTLS_GET_UINT32_BE(input, 0); + Y = MBEDTLS_GET_UINT32_BE(input, 4); + + DES_IP(X, Y); + + for (i = 0; i < 8; i++) { + DES_ROUND(Y, X); + DES_ROUND(X, Y); + } + + DES_FP(Y, X); + + MBEDTLS_PUT_UINT32_BE(Y, output, 0); + MBEDTLS_PUT_UINT32_BE(X, output, 4); + + return 0; +} +#endif /* !MBEDTLS_DES_CRYPT_ECB_ALT */ + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/* + * DES-CBC buffer encryption/decryption + */ +int mbedtls_des_crypt_cbc(mbedtls_des_context *ctx, + int mode, + size_t length, + unsigned char iv[8], + const unsigned char *input, + unsigned char *output) +{ + int i; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char temp[8]; + + if (length % 8) { + return MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH; + } + + if (mode == MBEDTLS_DES_ENCRYPT) { + while (length > 0) { + for (i = 0; i < 8; i++) { + output[i] = (unsigned char) (input[i] ^ iv[i]); + } + + ret = mbedtls_des_crypt_ecb(ctx, output, output); + if (ret != 0) { + goto exit; + } + memcpy(iv, output, 8); + + input += 8; + output += 8; + length -= 8; + } + } else { /* MBEDTLS_DES_DECRYPT */ + while (length > 0) { + memcpy(temp, input, 8); + ret = mbedtls_des_crypt_ecb(ctx, input, output); + if (ret != 0) { + goto exit; + } + + for (i = 0; i < 8; i++) { + output[i] = (unsigned char) (output[i] ^ iv[i]); + } + + memcpy(iv, temp, 8); + + input += 8; + output += 8; + length -= 8; + } + } + ret = 0; + +exit: + return ret; +} +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +/* + * 3DES-ECB block encryption/decryption + */ +#if !defined(MBEDTLS_DES3_CRYPT_ECB_ALT) +int mbedtls_des3_crypt_ecb(mbedtls_des3_context *ctx, + const unsigned char input[8], + unsigned char output[8]) +{ + int i; + uint32_t X, Y, T, *SK; + + SK = ctx->sk; + + X = MBEDTLS_GET_UINT32_BE(input, 0); + Y = MBEDTLS_GET_UINT32_BE(input, 4); + + DES_IP(X, Y); + + for (i = 0; i < 8; i++) { + DES_ROUND(Y, X); + DES_ROUND(X, Y); + } + + for (i = 0; i < 8; i++) { + DES_ROUND(X, Y); + DES_ROUND(Y, X); + } + + for (i = 0; i < 8; i++) { + DES_ROUND(Y, X); + DES_ROUND(X, Y); + } + + DES_FP(Y, X); + + MBEDTLS_PUT_UINT32_BE(Y, output, 0); + MBEDTLS_PUT_UINT32_BE(X, output, 4); + + return 0; +} +#endif /* !MBEDTLS_DES3_CRYPT_ECB_ALT */ + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/* + * 3DES-CBC buffer encryption/decryption + */ +int mbedtls_des3_crypt_cbc(mbedtls_des3_context *ctx, + int mode, + size_t length, + unsigned char iv[8], + const unsigned char *input, + unsigned char *output) +{ + int i; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char temp[8]; + + if (length % 8) { + return MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH; + } + + if (mode == MBEDTLS_DES_ENCRYPT) { + while (length > 0) { + for (i = 0; i < 8; i++) { + output[i] = (unsigned char) (input[i] ^ iv[i]); + } + + ret = mbedtls_des3_crypt_ecb(ctx, output, output); + if (ret != 0) { + goto exit; + } + memcpy(iv, output, 8); + + input += 8; + output += 8; + length -= 8; + } + } else { /* MBEDTLS_DES_DECRYPT */ + while (length > 0) { + memcpy(temp, input, 8); + ret = mbedtls_des3_crypt_ecb(ctx, input, output); + if (ret != 0) { + goto exit; + } + + for (i = 0; i < 8; i++) { + output[i] = (unsigned char) (output[i] ^ iv[i]); + } + + memcpy(iv, temp, 8); + + input += 8; + output += 8; + length -= 8; + } + } + ret = 0; + +exit: + return ret; +} +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#endif /* !MBEDTLS_DES_ALT */ + +#if defined(MBEDTLS_SELF_TEST) +/* + * DES and 3DES test vectors from: + * + * http://csrc.nist.gov/groups/STM/cavp/documents/des/tripledes-vectors.zip + */ +static const unsigned char des3_test_keys[24] = +{ + 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, + 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, + 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23 +}; + +static const unsigned char des3_test_buf[8] = +{ + 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 +}; + +static const unsigned char des3_test_ecb_dec[3][8] = +{ + { 0x37, 0x2B, 0x98, 0xBF, 0x52, 0x65, 0xB0, 0x59 }, + { 0xC2, 0x10, 0x19, 0x9C, 0x38, 0x5A, 0x65, 0xA1 }, + { 0xA2, 0x70, 0x56, 0x68, 0x69, 0xE5, 0x15, 0x1D } +}; + +static const unsigned char des3_test_ecb_enc[3][8] = +{ + { 0x1C, 0xD5, 0x97, 0xEA, 0x84, 0x26, 0x73, 0xFB }, + { 0xB3, 0x92, 0x4D, 0xF3, 0xC5, 0xB5, 0x42, 0x93 }, + { 0xDA, 0x37, 0x64, 0x41, 0xBA, 0x6F, 0x62, 0x6F } +}; + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +static const unsigned char des3_test_iv[8] = +{ + 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, +}; + +static const unsigned char des3_test_cbc_dec[3][8] = +{ + { 0x58, 0xD9, 0x48, 0xEF, 0x85, 0x14, 0x65, 0x9A }, + { 0x5F, 0xC8, 0x78, 0xD4, 0xD7, 0x92, 0xD9, 0x54 }, + { 0x25, 0xF9, 0x75, 0x85, 0xA8, 0x1E, 0x48, 0xBF } +}; + +static const unsigned char des3_test_cbc_enc[3][8] = +{ + { 0x91, 0x1C, 0x6D, 0xCF, 0x48, 0xA7, 0xC3, 0x4D }, + { 0x60, 0x1A, 0x76, 0x8F, 0xA1, 0xF9, 0x66, 0xF1 }, + { 0xA1, 0x50, 0x0F, 0x99, 0xB2, 0xCD, 0x64, 0x76 } +}; +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +/* + * Checkup routine + */ +int mbedtls_des_self_test(int verbose) +{ + int i, j, u, v, ret = 0; + mbedtls_des_context ctx; + mbedtls_des3_context ctx3; + unsigned char buf[8]; +#if defined(MBEDTLS_CIPHER_MODE_CBC) + unsigned char prv[8]; + unsigned char iv[8]; +#endif + + mbedtls_des_init(&ctx); + mbedtls_des3_init(&ctx3); + /* + * ECB mode + */ + for (i = 0; i < 6; i++) { + u = i >> 1; + v = i & 1; + + if (verbose != 0) { + mbedtls_printf(" DES%c-ECB-%3d (%s): ", + (u == 0) ? ' ' : '3', 56 + u * 56, + (v == MBEDTLS_DES_DECRYPT) ? "dec" : "enc"); + } + + memcpy(buf, des3_test_buf, 8); + + switch (i) { + case 0: + ret = mbedtls_des_setkey_dec(&ctx, des3_test_keys); + break; + + case 1: + ret = mbedtls_des_setkey_enc(&ctx, des3_test_keys); + break; + + case 2: + ret = mbedtls_des3_set2key_dec(&ctx3, des3_test_keys); + break; + + case 3: + ret = mbedtls_des3_set2key_enc(&ctx3, des3_test_keys); + break; + + case 4: + ret = mbedtls_des3_set3key_dec(&ctx3, des3_test_keys); + break; + + case 5: + ret = mbedtls_des3_set3key_enc(&ctx3, des3_test_keys); + break; + + default: + return 1; + } + if (ret != 0) { + goto exit; + } + + for (j = 0; j < 100; j++) { + if (u == 0) { + ret = mbedtls_des_crypt_ecb(&ctx, buf, buf); + } else { + ret = mbedtls_des3_crypt_ecb(&ctx3, buf, buf); + } + if (ret != 0) { + goto exit; + } + } + + if ((v == MBEDTLS_DES_DECRYPT && + memcmp(buf, des3_test_ecb_dec[u], 8) != 0) || + (v != MBEDTLS_DES_DECRYPT && + memcmp(buf, des3_test_ecb_enc[u], 8) != 0)) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto exit; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + +#if defined(MBEDTLS_CIPHER_MODE_CBC) + /* + * CBC mode + */ + for (i = 0; i < 6; i++) { + u = i >> 1; + v = i & 1; + + if (verbose != 0) { + mbedtls_printf(" DES%c-CBC-%3d (%s): ", + (u == 0) ? ' ' : '3', 56 + u * 56, + (v == MBEDTLS_DES_DECRYPT) ? "dec" : "enc"); + } + + memcpy(iv, des3_test_iv, 8); + memcpy(prv, des3_test_iv, 8); + memcpy(buf, des3_test_buf, 8); + + switch (i) { + case 0: + ret = mbedtls_des_setkey_dec(&ctx, des3_test_keys); + break; + + case 1: + ret = mbedtls_des_setkey_enc(&ctx, des3_test_keys); + break; + + case 2: + ret = mbedtls_des3_set2key_dec(&ctx3, des3_test_keys); + break; + + case 3: + ret = mbedtls_des3_set2key_enc(&ctx3, des3_test_keys); + break; + + case 4: + ret = mbedtls_des3_set3key_dec(&ctx3, des3_test_keys); + break; + + case 5: + ret = mbedtls_des3_set3key_enc(&ctx3, des3_test_keys); + break; + + default: + return 1; + } + if (ret != 0) { + goto exit; + } + + if (v == MBEDTLS_DES_DECRYPT) { + for (j = 0; j < 100; j++) { + if (u == 0) { + ret = mbedtls_des_crypt_cbc(&ctx, v, 8, iv, buf, buf); + } else { + ret = mbedtls_des3_crypt_cbc(&ctx3, v, 8, iv, buf, buf); + } + if (ret != 0) { + goto exit; + } + } + } else { + for (j = 0; j < 100; j++) { + unsigned char tmp[8]; + + if (u == 0) { + ret = mbedtls_des_crypt_cbc(&ctx, v, 8, iv, buf, buf); + } else { + ret = mbedtls_des3_crypt_cbc(&ctx3, v, 8, iv, buf, buf); + } + if (ret != 0) { + goto exit; + } + + memcpy(tmp, prv, 8); + memcpy(prv, buf, 8); + memcpy(buf, tmp, 8); + } + + memcpy(buf, prv, 8); + } + + if ((v == MBEDTLS_DES_DECRYPT && + memcmp(buf, des3_test_cbc_dec[u], 8) != 0) || + (v != MBEDTLS_DES_DECRYPT && + memcmp(buf, des3_test_cbc_enc[u], 8) != 0)) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto exit; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + + if (verbose != 0) { + mbedtls_printf("\n"); + } + +exit: + mbedtls_des_free(&ctx); + mbedtls_des3_free(&ctx3); + + if (ret != 0) { + ret = 1; + } + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_DES_C */ diff --git a/ext/opcua_client/mbedtls/library/dhm.c b/ext/opcua_client/mbedtls/library/dhm.c new file mode 100644 index 0000000..1a41b91 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/dhm.c @@ -0,0 +1,711 @@ +/* + * Diffie-Hellman-Merkle key exchange + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The following sources were referenced in the design of this implementation + * of the Diffie-Hellman-Merkle algorithm: + * + * [1] Handbook of Applied Cryptography - 1997, Chapter 12 + * Menezes, van Oorschot and Vanstone + * + */ + +#include "common.h" + +#if defined(MBEDTLS_DHM_C) + +#include "mbedtls/dhm.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#if defined(MBEDTLS_PEM_PARSE_C) +#include "mbedtls/pem.h" +#endif + +#if defined(MBEDTLS_ASN1_PARSE_C) +#include "mbedtls/asn1.h" +#endif + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_DHM_ALT) + +#define DHM_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_DHM_BAD_INPUT_DATA) +#define DHM_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +/* + * helper to validate the mbedtls_mpi size and import it + */ +static int dhm_read_bignum(mbedtls_mpi *X, + unsigned char **p, + const unsigned char *end) +{ + int ret, n; + + if (end - *p < 2) { + return MBEDTLS_ERR_DHM_BAD_INPUT_DATA; + } + + n = ((*p)[0] << 8) | (*p)[1]; + (*p) += 2; + + if ((int) (end - *p) < n) { + return MBEDTLS_ERR_DHM_BAD_INPUT_DATA; + } + + if ((ret = mbedtls_mpi_read_binary(X, *p, n)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_DHM_READ_PARAMS_FAILED, ret); + } + + (*p) += n; + + return 0; +} + +/* + * Verify sanity of parameter with regards to P + * + * Parameter should be: 2 <= public_param <= P - 2 + * + * This means that we need to return an error if + * public_param < 2 or public_param > P-2 + * + * For more information on the attack, see: + * http://www.cl.cam.ac.uk/~rja14/Papers/psandqs.pdf + * http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2005-2643 + */ +static int dhm_check_range(const mbedtls_mpi *param, const mbedtls_mpi *P) +{ + mbedtls_mpi U; + int ret = 0; + + mbedtls_mpi_init(&U); + + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&U, P, 2)); + + if (mbedtls_mpi_cmp_int(param, 2) < 0 || + mbedtls_mpi_cmp_mpi(param, &U) > 0) { + ret = MBEDTLS_ERR_DHM_BAD_INPUT_DATA; + } + +cleanup: + mbedtls_mpi_free(&U); + return ret; +} + +void mbedtls_dhm_init(mbedtls_dhm_context *ctx) +{ + DHM_VALIDATE(ctx != NULL); + memset(ctx, 0, sizeof(mbedtls_dhm_context)); +} + +/* + * Parse the ServerKeyExchange parameters + */ +int mbedtls_dhm_read_params(mbedtls_dhm_context *ctx, + unsigned char **p, + const unsigned char *end) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + DHM_VALIDATE_RET(ctx != NULL); + DHM_VALIDATE_RET(p != NULL && *p != NULL); + DHM_VALIDATE_RET(end != NULL); + + if ((ret = dhm_read_bignum(&ctx->P, p, end)) != 0 || + (ret = dhm_read_bignum(&ctx->G, p, end)) != 0 || + (ret = dhm_read_bignum(&ctx->GY, p, end)) != 0) { + return ret; + } + + if ((ret = dhm_check_range(&ctx->GY, &ctx->P)) != 0) { + return ret; + } + + ctx->len = mbedtls_mpi_size(&ctx->P); + + return 0; +} + +/* + * Pick a random R in the range [2, M-2] for blinding or key generation. + */ +static int dhm_random_below(mbedtls_mpi *R, const mbedtls_mpi *M, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + int ret; + + MBEDTLS_MPI_CHK(mbedtls_mpi_random(R, 3, M, f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(R, R, 1)); + +cleanup: + return ret; +} + +static int dhm_make_common(mbedtls_dhm_context *ctx, int x_size, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = 0; + + if (mbedtls_mpi_cmp_int(&ctx->P, 0) == 0) { + return MBEDTLS_ERR_DHM_BAD_INPUT_DATA; + } + if (x_size < 0) { + return MBEDTLS_ERR_DHM_BAD_INPUT_DATA; + } + + if ((unsigned) x_size < mbedtls_mpi_size(&ctx->P)) { + MBEDTLS_MPI_CHK(mbedtls_mpi_fill_random(&ctx->X, x_size, f_rng, p_rng)); + } else { + /* Generate X as large as possible ( <= P - 2 ) */ + ret = dhm_random_below(&ctx->X, &ctx->P, f_rng, p_rng); + if (ret == MBEDTLS_ERR_MPI_NOT_ACCEPTABLE) { + return MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED; + } + if (ret != 0) { + return ret; + } + } + + /* + * Calculate GX = G^X mod P + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&ctx->GX, &ctx->G, &ctx->X, + &ctx->P, &ctx->RP)); + + if ((ret = dhm_check_range(&ctx->GX, &ctx->P)) != 0) { + return ret; + } + +cleanup: + return ret; +} + +/* + * Setup and write the ServerKeyExchange parameters + */ +int mbedtls_dhm_make_params(mbedtls_dhm_context *ctx, int x_size, + unsigned char *output, size_t *olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret; + size_t n1, n2, n3; + unsigned char *p; + DHM_VALIDATE_RET(ctx != NULL); + DHM_VALIDATE_RET(output != NULL); + DHM_VALIDATE_RET(olen != NULL); + DHM_VALIDATE_RET(f_rng != NULL); + + ret = dhm_make_common(ctx, x_size, f_rng, p_rng); + if (ret != 0) { + goto cleanup; + } + + /* + * Export P, G, GX. RFC 5246 §4.4 states that "leading zero octets are + * not required". We omit leading zeros for compactness. + */ +#define DHM_MPI_EXPORT(X, n) \ + do { \ + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary((X), \ + p + 2, \ + (n))); \ + *p++ = MBEDTLS_BYTE_1(n); \ + *p++ = MBEDTLS_BYTE_0(n); \ + p += (n); \ + } while (0) + + n1 = mbedtls_mpi_size(&ctx->P); + n2 = mbedtls_mpi_size(&ctx->G); + n3 = mbedtls_mpi_size(&ctx->GX); + + p = output; + DHM_MPI_EXPORT(&ctx->P, n1); + DHM_MPI_EXPORT(&ctx->G, n2); + DHM_MPI_EXPORT(&ctx->GX, n3); + + *olen = p - output; + + ctx->len = n1; + +cleanup: + if (ret != 0 && ret > -128) { + ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED, ret); + } + return ret; +} + +/* + * Set prime modulus and generator + */ +int mbedtls_dhm_set_group(mbedtls_dhm_context *ctx, + const mbedtls_mpi *P, + const mbedtls_mpi *G) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + DHM_VALIDATE_RET(ctx != NULL); + DHM_VALIDATE_RET(P != NULL); + DHM_VALIDATE_RET(G != NULL); + + if ((ret = mbedtls_mpi_copy(&ctx->P, P)) != 0 || + (ret = mbedtls_mpi_copy(&ctx->G, G)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_DHM_SET_GROUP_FAILED, ret); + } + + ctx->len = mbedtls_mpi_size(&ctx->P); + return 0; +} + +/* + * Import the peer's public value G^Y + */ +int mbedtls_dhm_read_public(mbedtls_dhm_context *ctx, + const unsigned char *input, size_t ilen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + DHM_VALIDATE_RET(ctx != NULL); + DHM_VALIDATE_RET(input != NULL); + + if (ilen < 1 || ilen > ctx->len) { + return MBEDTLS_ERR_DHM_BAD_INPUT_DATA; + } + + if ((ret = mbedtls_mpi_read_binary(&ctx->GY, input, ilen)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED, ret); + } + + return 0; +} + +/* + * Create own private value X and export G^X + */ +int mbedtls_dhm_make_public(mbedtls_dhm_context *ctx, int x_size, + unsigned char *output, size_t olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret; + DHM_VALIDATE_RET(ctx != NULL); + DHM_VALIDATE_RET(output != NULL); + DHM_VALIDATE_RET(f_rng != NULL); + + if (olen < 1 || olen > ctx->len) { + return MBEDTLS_ERR_DHM_BAD_INPUT_DATA; + } + + ret = dhm_make_common(ctx, x_size, f_rng, p_rng); + if (ret == MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED) { + return MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED; + } + if (ret != 0) { + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&ctx->GX, output, olen)); + +cleanup: + if (ret != 0 && ret > -128) { + ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED, ret); + } + return ret; +} + + +/* + * Use the blinding method and optimisation suggested in section 10 of: + * KOCHER, Paul C. Timing attacks on implementations of Diffie-Hellman, RSA, + * DSS, and other systems. In : Advances in Cryptology-CRYPTO'96. Springer + * Berlin Heidelberg, 1996. p. 104-113. + */ +static int dhm_update_blinding(mbedtls_dhm_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + int ret; + mbedtls_mpi R; + + mbedtls_mpi_init(&R); + + /* + * Don't use any blinding the first time a particular X is used, + * but remember it to use blinding next time. + */ + if (mbedtls_mpi_cmp_mpi(&ctx->X, &ctx->pX) != 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&ctx->pX, &ctx->X)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&ctx->Vi, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&ctx->Vf, 1)); + + return 0; + } + + /* + * Ok, we need blinding. Can we re-use existing values? + * If yes, just update them by squaring them. + */ + if (mbedtls_mpi_cmp_int(&ctx->Vi, 1) != 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&ctx->Vi, &ctx->Vi, &ctx->Vi)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&ctx->Vi, &ctx->Vi, &ctx->P)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&ctx->Vf, &ctx->Vf, &ctx->Vf)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&ctx->Vf, &ctx->Vf, &ctx->P)); + + return 0; + } + + /* + * We need to generate blinding values from scratch + */ + + /* Vi = random( 2, P-2 ) */ + MBEDTLS_MPI_CHK(dhm_random_below(&ctx->Vi, &ctx->P, f_rng, p_rng)); + + /* Vf = Vi^-X mod P + * First compute Vi^-1 = R * (R Vi)^-1, (avoiding leaks from inv_mod), + * then elevate to the Xth power. */ + MBEDTLS_MPI_CHK(dhm_random_below(&R, &ctx->P, f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&ctx->Vf, &ctx->Vi, &R)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&ctx->Vf, &ctx->Vf, &ctx->P)); + MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(&ctx->Vf, &ctx->Vf, &ctx->P)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&ctx->Vf, &ctx->Vf, &R)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&ctx->Vf, &ctx->Vf, &ctx->P)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&ctx->Vf, &ctx->Vf, &ctx->X, &ctx->P, &ctx->RP)); + +cleanup: + mbedtls_mpi_free(&R); + + return ret; +} + +/* + * Derive and export the shared secret (G^Y)^X mod P + */ +int mbedtls_dhm_calc_secret(mbedtls_dhm_context *ctx, + unsigned char *output, size_t output_size, size_t *olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi GYb; + DHM_VALIDATE_RET(ctx != NULL); + DHM_VALIDATE_RET(output != NULL); + DHM_VALIDATE_RET(olen != NULL); + + if (output_size < ctx->len) { + return MBEDTLS_ERR_DHM_BAD_INPUT_DATA; + } + + if ((ret = dhm_check_range(&ctx->GY, &ctx->P)) != 0) { + return ret; + } + + mbedtls_mpi_init(&GYb); + + /* Blind peer's value */ + if (f_rng != NULL) { + MBEDTLS_MPI_CHK(dhm_update_blinding(ctx, f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&GYb, &ctx->GY, &ctx->Vi)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&GYb, &GYb, &ctx->P)); + } else { + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&GYb, &ctx->GY)); + } + + /* Do modular exponentiation */ + MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&ctx->K, &GYb, &ctx->X, + &ctx->P, &ctx->RP)); + + /* Unblind secret value */ + if (f_rng != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&ctx->K, &ctx->K, &ctx->Vf)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&ctx->K, &ctx->K, &ctx->P)); + } + + /* Output the secret without any leading zero byte. This is mandatory + * for TLS per RFC 5246 §8.1.2. */ + *olen = mbedtls_mpi_size(&ctx->K); + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&ctx->K, output, *olen)); + +cleanup: + mbedtls_mpi_free(&GYb); + + if (ret != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_DHM_CALC_SECRET_FAILED, ret); + } + + return 0; +} + +/* + * Free the components of a DHM key + */ +void mbedtls_dhm_free(mbedtls_dhm_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_mpi_free(&ctx->pX); + mbedtls_mpi_free(&ctx->Vf); + mbedtls_mpi_free(&ctx->Vi); + mbedtls_mpi_free(&ctx->RP); + mbedtls_mpi_free(&ctx->K); + mbedtls_mpi_free(&ctx->GY); + mbedtls_mpi_free(&ctx->GX); + mbedtls_mpi_free(&ctx->X); + mbedtls_mpi_free(&ctx->G); + mbedtls_mpi_free(&ctx->P); + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_dhm_context)); +} + +#if defined(MBEDTLS_ASN1_PARSE_C) +/* + * Parse DHM parameters + */ +int mbedtls_dhm_parse_dhm(mbedtls_dhm_context *dhm, const unsigned char *dhmin, + size_t dhminlen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + unsigned char *p, *end; +#if defined(MBEDTLS_PEM_PARSE_C) + mbedtls_pem_context pem; +#endif /* MBEDTLS_PEM_PARSE_C */ + + DHM_VALIDATE_RET(dhm != NULL); + DHM_VALIDATE_RET(dhmin != NULL); + +#if defined(MBEDTLS_PEM_PARSE_C) + mbedtls_pem_init(&pem); + + /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ + if (dhminlen == 0 || dhmin[dhminlen - 1] != '\0') { + ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; + } else { + ret = mbedtls_pem_read_buffer(&pem, + "-----BEGIN DH PARAMETERS-----", + "-----END DH PARAMETERS-----", + dhmin, NULL, 0, &dhminlen); + } + + if (ret == 0) { + /* + * Was PEM encoded + */ + dhminlen = pem.buflen; + } else if (ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) { + goto exit; + } + + p = (ret == 0) ? pem.buf : (unsigned char *) dhmin; +#else + p = (unsigned char *) dhmin; +#endif /* MBEDTLS_PEM_PARSE_C */ + end = p + dhminlen; + + /* + * DHParams ::= SEQUENCE { + * prime INTEGER, -- P + * generator INTEGER, -- g + * privateValueLength INTEGER OPTIONAL + * } + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_DHM_INVALID_FORMAT, ret); + goto exit; + } + + end = p + len; + + if ((ret = mbedtls_asn1_get_mpi(&p, end, &dhm->P)) != 0 || + (ret = mbedtls_asn1_get_mpi(&p, end, &dhm->G)) != 0) { + ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_DHM_INVALID_FORMAT, ret); + goto exit; + } + + if (p != end) { + /* This might be the optional privateValueLength. + * If so, we can cleanly discard it */ + mbedtls_mpi rec; + mbedtls_mpi_init(&rec); + ret = mbedtls_asn1_get_mpi(&p, end, &rec); + mbedtls_mpi_free(&rec); + if (ret != 0) { + ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_DHM_INVALID_FORMAT, ret); + goto exit; + } + if (p != end) { + ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_DHM_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + goto exit; + } + } + + ret = 0; + + dhm->len = mbedtls_mpi_size(&dhm->P); + +exit: +#if defined(MBEDTLS_PEM_PARSE_C) + mbedtls_pem_free(&pem); +#endif + if (ret != 0) { + mbedtls_dhm_free(dhm); + } + + return ret; +} + +#if defined(MBEDTLS_FS_IO) +/* + * Load all data from a file into a given buffer. + * + * The file is expected to contain either PEM or DER encoded data. + * A terminating null byte is always appended. It is included in the announced + * length only if the data looks like it is PEM encoded. + */ +static int load_file(const char *path, unsigned char **buf, size_t *n) +{ + FILE *f; + long size; + + if ((f = fopen(path, "rb")) == NULL) { + return MBEDTLS_ERR_DHM_FILE_IO_ERROR; + } + + fseek(f, 0, SEEK_END); + if ((size = ftell(f)) == -1) { + fclose(f); + return MBEDTLS_ERR_DHM_FILE_IO_ERROR; + } + fseek(f, 0, SEEK_SET); + + *n = (size_t) size; + + if (*n + 1 == 0 || + (*buf = mbedtls_calloc(1, *n + 1)) == NULL) { + fclose(f); + return MBEDTLS_ERR_DHM_ALLOC_FAILED; + } + + if (fread(*buf, 1, *n, f) != *n) { + fclose(f); + + mbedtls_platform_zeroize(*buf, *n + 1); + mbedtls_free(*buf); + + return MBEDTLS_ERR_DHM_FILE_IO_ERROR; + } + + fclose(f); + + (*buf)[*n] = '\0'; + + if (strstr((const char *) *buf, "-----BEGIN ") != NULL) { + ++*n; + } + + return 0; +} + +/* + * Load and parse DHM parameters + */ +int mbedtls_dhm_parse_dhmfile(mbedtls_dhm_context *dhm, const char *path) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n; + unsigned char *buf; + DHM_VALIDATE_RET(dhm != NULL); + DHM_VALIDATE_RET(path != NULL); + + if ((ret = load_file(path, &buf, &n)) != 0) { + return ret; + } + + ret = mbedtls_dhm_parse_dhm(dhm, buf, n); + + mbedtls_platform_zeroize(buf, n); + mbedtls_free(buf); + + return ret; +} +#endif /* MBEDTLS_FS_IO */ +#endif /* MBEDTLS_ASN1_PARSE_C */ +#endif /* MBEDTLS_DHM_ALT */ + +#if defined(MBEDTLS_SELF_TEST) + +#if defined(MBEDTLS_PEM_PARSE_C) +static const char mbedtls_test_dhm_params[] = + "-----BEGIN DH PARAMETERS-----\r\n" + "MIGHAoGBAJ419DBEOgmQTzo5qXl5fQcN9TN455wkOL7052HzxxRVMyhYmwQcgJvh\r\n" + "1sa18fyfR9OiVEMYglOpkqVoGLN7qd5aQNNi5W7/C+VBdHTBJcGZJyyP5B3qcz32\r\n" + "9mLJKudlVudV0Qxk5qUJaPZ/xupz0NyoVpviuiBOI1gNi8ovSXWzAgEC\r\n" + "-----END DH PARAMETERS-----\r\n"; +#else /* MBEDTLS_PEM_PARSE_C */ +static const char mbedtls_test_dhm_params[] = { + 0x30, 0x81, 0x87, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x35, 0xf4, 0x30, 0x44, + 0x3a, 0x09, 0x90, 0x4f, 0x3a, 0x39, 0xa9, 0x79, 0x79, 0x7d, 0x07, 0x0d, + 0xf5, 0x33, 0x78, 0xe7, 0x9c, 0x24, 0x38, 0xbe, 0xf4, 0xe7, 0x61, 0xf3, + 0xc7, 0x14, 0x55, 0x33, 0x28, 0x58, 0x9b, 0x04, 0x1c, 0x80, 0x9b, 0xe1, + 0xd6, 0xc6, 0xb5, 0xf1, 0xfc, 0x9f, 0x47, 0xd3, 0xa2, 0x54, 0x43, 0x18, + 0x82, 0x53, 0xa9, 0x92, 0xa5, 0x68, 0x18, 0xb3, 0x7b, 0xa9, 0xde, 0x5a, + 0x40, 0xd3, 0x62, 0xe5, 0x6e, 0xff, 0x0b, 0xe5, 0x41, 0x74, 0x74, 0xc1, + 0x25, 0xc1, 0x99, 0x27, 0x2c, 0x8f, 0xe4, 0x1d, 0xea, 0x73, 0x3d, 0xf6, + 0xf6, 0x62, 0xc9, 0x2a, 0xe7, 0x65, 0x56, 0xe7, 0x55, 0xd1, 0x0c, 0x64, + 0xe6, 0xa5, 0x09, 0x68, 0xf6, 0x7f, 0xc6, 0xea, 0x73, 0xd0, 0xdc, 0xa8, + 0x56, 0x9b, 0xe2, 0xba, 0x20, 0x4e, 0x23, 0x58, 0x0d, 0x8b, 0xca, 0x2f, + 0x49, 0x75, 0xb3, 0x02, 0x01, 0x02 +}; +#endif /* MBEDTLS_PEM_PARSE_C */ + +static const size_t mbedtls_test_dhm_params_len = sizeof(mbedtls_test_dhm_params); + +/* + * Checkup routine + */ +int mbedtls_dhm_self_test(int verbose) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_dhm_context dhm; + + mbedtls_dhm_init(&dhm); + + if (verbose != 0) { + mbedtls_printf(" DHM parameter load: "); + } + + if ((ret = mbedtls_dhm_parse_dhm(&dhm, + (const unsigned char *) mbedtls_test_dhm_params, + mbedtls_test_dhm_params_len)) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto exit; + } + + if (verbose != 0) { + mbedtls_printf("passed\n\n"); + } + +exit: + mbedtls_dhm_free(&dhm); + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_DHM_C */ diff --git a/ext/opcua_client/mbedtls/library/ecdh.c b/ext/opcua_client/mbedtls/library/ecdh.c new file mode 100644 index 0000000..29a732a --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ecdh.c @@ -0,0 +1,729 @@ +/* + * Elliptic curve Diffie-Hellman + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * References: + * + * SEC1 https://www.secg.org/sec1-v2.pdf + * RFC 4492 + */ + +#include "common.h" + +#if defined(MBEDTLS_ECDH_C) + +#include "mbedtls/ecdh.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +/* Parameter validation macros based on platform_util.h */ +#define ECDH_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA) +#define ECDH_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) +typedef mbedtls_ecdh_context mbedtls_ecdh_context_mbed; +#endif + +static mbedtls_ecp_group_id mbedtls_ecdh_grp_id( + const mbedtls_ecdh_context *ctx) +{ +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + return ctx->grp.id; +#else + return ctx->grp_id; +#endif +} + +int mbedtls_ecdh_can_do(mbedtls_ecp_group_id gid) +{ + /* At this time, all groups support ECDH. */ + (void) gid; + return 1; +} + +#if !defined(MBEDTLS_ECDH_GEN_PUBLIC_ALT) +/* + * Generate public key (restartable version) + * + * Note: this internal function relies on its caller preserving the value of + * the output parameter 'd' across continuation calls. This would not be + * acceptable for a public function but is OK here as we control call sites. + */ +static int ecdh_gen_public_restartable(mbedtls_ecp_group *grp, + mbedtls_mpi *d, mbedtls_ecp_point *Q, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + mbedtls_ecp_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + int restarting = 0; +#if defined(MBEDTLS_ECP_RESTARTABLE) + restarting = (rs_ctx != NULL && rs_ctx->rsm != NULL); +#endif + /* If multiplication is in progress, we already generated a privkey */ + if (!restarting) { + MBEDTLS_MPI_CHK(mbedtls_ecp_gen_privkey(grp, d, f_rng, p_rng)); + } + + MBEDTLS_MPI_CHK(mbedtls_ecp_mul_restartable(grp, Q, d, &grp->G, + f_rng, p_rng, rs_ctx)); + +cleanup: + return ret; +} + +/* + * Generate public key + */ +int mbedtls_ecdh_gen_public(mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + ECDH_VALIDATE_RET(grp != NULL); + ECDH_VALIDATE_RET(d != NULL); + ECDH_VALIDATE_RET(Q != NULL); + ECDH_VALIDATE_RET(f_rng != NULL); + return ecdh_gen_public_restartable(grp, d, Q, f_rng, p_rng, NULL); +} +#endif /* !MBEDTLS_ECDH_GEN_PUBLIC_ALT */ + +#if !defined(MBEDTLS_ECDH_COMPUTE_SHARED_ALT) +/* + * Compute shared secret (SEC1 3.3.1) + */ +static int ecdh_compute_shared_restartable(mbedtls_ecp_group *grp, + mbedtls_mpi *z, + const mbedtls_ecp_point *Q, const mbedtls_mpi *d, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + mbedtls_ecp_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_point P; + + mbedtls_ecp_point_init(&P); + + MBEDTLS_MPI_CHK(mbedtls_ecp_mul_restartable(grp, &P, d, Q, + f_rng, p_rng, rs_ctx)); + + if (mbedtls_ecp_is_zero(&P)) { + ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(z, &P.X)); + +cleanup: + mbedtls_ecp_point_free(&P); + + return ret; +} + +/* + * Compute shared secret (SEC1 3.3.1) + */ +int mbedtls_ecdh_compute_shared(mbedtls_ecp_group *grp, mbedtls_mpi *z, + const mbedtls_ecp_point *Q, const mbedtls_mpi *d, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + ECDH_VALIDATE_RET(grp != NULL); + ECDH_VALIDATE_RET(Q != NULL); + ECDH_VALIDATE_RET(d != NULL); + ECDH_VALIDATE_RET(z != NULL); + return ecdh_compute_shared_restartable(grp, z, Q, d, + f_rng, p_rng, NULL); +} +#endif /* !MBEDTLS_ECDH_COMPUTE_SHARED_ALT */ + +static void ecdh_init_internal(mbedtls_ecdh_context_mbed *ctx) +{ + mbedtls_ecp_group_init(&ctx->grp); + mbedtls_mpi_init(&ctx->d); + mbedtls_ecp_point_init(&ctx->Q); + mbedtls_ecp_point_init(&ctx->Qp); + mbedtls_mpi_init(&ctx->z); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + mbedtls_ecp_restart_init(&ctx->rs); +#endif +} + +/* + * Initialize context + */ +void mbedtls_ecdh_init(mbedtls_ecdh_context *ctx) +{ + ECDH_VALIDATE(ctx != NULL); + +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + ecdh_init_internal(ctx); + mbedtls_ecp_point_init(&ctx->Vi); + mbedtls_ecp_point_init(&ctx->Vf); + mbedtls_mpi_init(&ctx->_d); +#else + memset(ctx, 0, sizeof(mbedtls_ecdh_context)); + + ctx->var = MBEDTLS_ECDH_VARIANT_NONE; +#endif + ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED; +#if defined(MBEDTLS_ECP_RESTARTABLE) + ctx->restart_enabled = 0; +#endif +} + +static int ecdh_setup_internal(mbedtls_ecdh_context_mbed *ctx, + mbedtls_ecp_group_id grp_id) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + ret = mbedtls_ecp_group_load(&ctx->grp, grp_id); + if (ret != 0) { + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + } + + return 0; +} + +/* + * Setup context + */ +int mbedtls_ecdh_setup(mbedtls_ecdh_context *ctx, mbedtls_ecp_group_id grp_id) +{ + ECDH_VALIDATE_RET(ctx != NULL); + +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + return ecdh_setup_internal(ctx, grp_id); +#else + switch (grp_id) { +#if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED) + case MBEDTLS_ECP_DP_CURVE25519: + ctx->point_format = MBEDTLS_ECP_PF_COMPRESSED; + ctx->var = MBEDTLS_ECDH_VARIANT_EVEREST; + ctx->grp_id = grp_id; + return mbedtls_everest_setup(&ctx->ctx.everest_ecdh, grp_id); +#endif + default: + ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED; + ctx->var = MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0; + ctx->grp_id = grp_id; + ecdh_init_internal(&ctx->ctx.mbed_ecdh); + return ecdh_setup_internal(&ctx->ctx.mbed_ecdh, grp_id); + } +#endif +} + +static void ecdh_free_internal(mbedtls_ecdh_context_mbed *ctx) +{ + mbedtls_ecp_group_free(&ctx->grp); + mbedtls_mpi_free(&ctx->d); + mbedtls_ecp_point_free(&ctx->Q); + mbedtls_ecp_point_free(&ctx->Qp); + mbedtls_mpi_free(&ctx->z); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + mbedtls_ecp_restart_free(&ctx->rs); +#endif +} + +#if defined(MBEDTLS_ECP_RESTARTABLE) +/* + * Enable restartable operations for context + */ +void mbedtls_ecdh_enable_restart(mbedtls_ecdh_context *ctx) +{ + ECDH_VALIDATE(ctx != NULL); + + ctx->restart_enabled = 1; +} +#endif + +/* + * Free context + */ +void mbedtls_ecdh_free(mbedtls_ecdh_context *ctx) +{ + if (ctx == NULL) { + return; + } + +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + mbedtls_ecp_point_free(&ctx->Vi); + mbedtls_ecp_point_free(&ctx->Vf); + mbedtls_mpi_free(&ctx->_d); + ecdh_free_internal(ctx); +#else + switch (ctx->var) { +#if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED) + case MBEDTLS_ECDH_VARIANT_EVEREST: + mbedtls_everest_free(&ctx->ctx.everest_ecdh); + break; +#endif + case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: + ecdh_free_internal(&ctx->ctx.mbed_ecdh); + break; + default: + break; + } + + ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED; + ctx->var = MBEDTLS_ECDH_VARIANT_NONE; + ctx->grp_id = MBEDTLS_ECP_DP_NONE; +#endif +} + +static int ecdh_make_params_internal(mbedtls_ecdh_context_mbed *ctx, + size_t *olen, int point_format, + unsigned char *buf, size_t blen, + int (*f_rng)(void *, + unsigned char *, + size_t), + void *p_rng, + int restart_enabled) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t grp_len, pt_len; +#if defined(MBEDTLS_ECP_RESTARTABLE) + mbedtls_ecp_restart_ctx *rs_ctx = NULL; +#endif + + if (ctx->grp.pbits == 0) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (restart_enabled) { + rs_ctx = &ctx->rs; + } +#else + (void) restart_enabled; +#endif + + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if ((ret = ecdh_gen_public_restartable(&ctx->grp, &ctx->d, &ctx->Q, + f_rng, p_rng, rs_ctx)) != 0) { + return ret; + } +#else + if ((ret = mbedtls_ecdh_gen_public(&ctx->grp, &ctx->d, &ctx->Q, + f_rng, p_rng)) != 0) { + return ret; + } +#endif /* MBEDTLS_ECP_RESTARTABLE */ + + if ((ret = mbedtls_ecp_tls_write_group(&ctx->grp, &grp_len, buf, + blen)) != 0) { + return ret; + } + + buf += grp_len; + blen -= grp_len; + + if ((ret = mbedtls_ecp_tls_write_point(&ctx->grp, &ctx->Q, point_format, + &pt_len, buf, blen)) != 0) { + return ret; + } + + *olen = grp_len + pt_len; + return 0; +} + +/* + * Setup and write the ServerKeyExchange parameters (RFC 4492) + * struct { + * ECParameters curve_params; + * ECPoint public; + * } ServerECDHParams; + */ +int mbedtls_ecdh_make_params(mbedtls_ecdh_context *ctx, size_t *olen, + unsigned char *buf, size_t blen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int restart_enabled = 0; + ECDH_VALIDATE_RET(ctx != NULL); + ECDH_VALIDATE_RET(olen != NULL); + ECDH_VALIDATE_RET(buf != NULL); + ECDH_VALIDATE_RET(f_rng != NULL); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + restart_enabled = ctx->restart_enabled; +#else + (void) restart_enabled; +#endif + +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + return ecdh_make_params_internal(ctx, olen, ctx->point_format, buf, blen, + f_rng, p_rng, restart_enabled); +#else + switch (ctx->var) { +#if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED) + case MBEDTLS_ECDH_VARIANT_EVEREST: + return mbedtls_everest_make_params(&ctx->ctx.everest_ecdh, olen, + buf, blen, f_rng, p_rng); +#endif + case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: + return ecdh_make_params_internal(&ctx->ctx.mbed_ecdh, olen, + ctx->point_format, buf, blen, + f_rng, p_rng, + restart_enabled); + default: + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } +#endif +} + +static int ecdh_read_params_internal(mbedtls_ecdh_context_mbed *ctx, + const unsigned char **buf, + const unsigned char *end) +{ + return mbedtls_ecp_tls_read_point(&ctx->grp, &ctx->Qp, buf, + end - *buf); +} + +/* + * Read the ServerKeyExchange parameters (RFC 4492) + * struct { + * ECParameters curve_params; + * ECPoint public; + * } ServerECDHParams; + */ +int mbedtls_ecdh_read_params(mbedtls_ecdh_context *ctx, + const unsigned char **buf, + const unsigned char *end) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_group_id grp_id; + ECDH_VALIDATE_RET(ctx != NULL); + ECDH_VALIDATE_RET(buf != NULL); + ECDH_VALIDATE_RET(*buf != NULL); + ECDH_VALIDATE_RET(end != NULL); + + if ((ret = mbedtls_ecp_tls_read_group_id(&grp_id, buf, end - *buf)) + != 0) { + return ret; + } + + if ((ret = mbedtls_ecdh_setup(ctx, grp_id)) != 0) { + return ret; + } + +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + return ecdh_read_params_internal(ctx, buf, end); +#else + switch (ctx->var) { +#if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED) + case MBEDTLS_ECDH_VARIANT_EVEREST: + return mbedtls_everest_read_params(&ctx->ctx.everest_ecdh, + buf, end); +#endif + case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: + return ecdh_read_params_internal(&ctx->ctx.mbed_ecdh, + buf, end); + default: + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } +#endif +} + +static int ecdh_get_params_internal(mbedtls_ecdh_context_mbed *ctx, + const mbedtls_ecp_keypair *key, + mbedtls_ecdh_side side) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + /* If it's not our key, just import the public part as Qp */ + if (side == MBEDTLS_ECDH_THEIRS) { + return mbedtls_ecp_copy(&ctx->Qp, &key->Q); + } + + /* Our key: import public (as Q) and private parts */ + if (side != MBEDTLS_ECDH_OURS) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + if ((ret = mbedtls_ecp_copy(&ctx->Q, &key->Q)) != 0 || + (ret = mbedtls_mpi_copy(&ctx->d, &key->d)) != 0) { + return ret; + } + + return 0; +} + +/* + * Get parameters from a keypair + */ +int mbedtls_ecdh_get_params(mbedtls_ecdh_context *ctx, + const mbedtls_ecp_keypair *key, + mbedtls_ecdh_side side) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + ECDH_VALIDATE_RET(ctx != NULL); + ECDH_VALIDATE_RET(key != NULL); + ECDH_VALIDATE_RET(side == MBEDTLS_ECDH_OURS || + side == MBEDTLS_ECDH_THEIRS); + + if (mbedtls_ecdh_grp_id(ctx) == MBEDTLS_ECP_DP_NONE) { + /* This is the first call to get_params(). Set up the context + * for use with the group. */ + if ((ret = mbedtls_ecdh_setup(ctx, key->grp.id)) != 0) { + return ret; + } + } else { + /* This is not the first call to get_params(). Check that the + * current key's group is the same as the context's, which was set + * from the first key's group. */ + if (mbedtls_ecdh_grp_id(ctx) != key->grp.id) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + } + +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + return ecdh_get_params_internal(ctx, key, side); +#else + switch (ctx->var) { +#if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED) + case MBEDTLS_ECDH_VARIANT_EVEREST: + { + mbedtls_everest_ecdh_side s = side == MBEDTLS_ECDH_OURS ? + MBEDTLS_EVEREST_ECDH_OURS : + MBEDTLS_EVEREST_ECDH_THEIRS; + return mbedtls_everest_get_params(&ctx->ctx.everest_ecdh, + key, s); + } +#endif + case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: + return ecdh_get_params_internal(&ctx->ctx.mbed_ecdh, + key, side); + default: + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } +#endif +} + +static int ecdh_make_public_internal(mbedtls_ecdh_context_mbed *ctx, + size_t *olen, int point_format, + unsigned char *buf, size_t blen, + int (*f_rng)(void *, + unsigned char *, + size_t), + void *p_rng, + int restart_enabled) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; +#if defined(MBEDTLS_ECP_RESTARTABLE) + mbedtls_ecp_restart_ctx *rs_ctx = NULL; +#endif + + if (ctx->grp.pbits == 0) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (restart_enabled) { + rs_ctx = &ctx->rs; + } +#else + (void) restart_enabled; +#endif + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if ((ret = ecdh_gen_public_restartable(&ctx->grp, &ctx->d, &ctx->Q, + f_rng, p_rng, rs_ctx)) != 0) { + return ret; + } +#else + if ((ret = mbedtls_ecdh_gen_public(&ctx->grp, &ctx->d, &ctx->Q, + f_rng, p_rng)) != 0) { + return ret; + } +#endif /* MBEDTLS_ECP_RESTARTABLE */ + + return mbedtls_ecp_tls_write_point(&ctx->grp, &ctx->Q, point_format, olen, + buf, blen); +} + +/* + * Setup and export the client public value + */ +int mbedtls_ecdh_make_public(mbedtls_ecdh_context *ctx, size_t *olen, + unsigned char *buf, size_t blen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int restart_enabled = 0; + ECDH_VALIDATE_RET(ctx != NULL); + ECDH_VALIDATE_RET(olen != NULL); + ECDH_VALIDATE_RET(buf != NULL); + ECDH_VALIDATE_RET(f_rng != NULL); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + restart_enabled = ctx->restart_enabled; +#endif + +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + return ecdh_make_public_internal(ctx, olen, ctx->point_format, buf, blen, + f_rng, p_rng, restart_enabled); +#else + switch (ctx->var) { +#if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED) + case MBEDTLS_ECDH_VARIANT_EVEREST: + return mbedtls_everest_make_public(&ctx->ctx.everest_ecdh, olen, + buf, blen, f_rng, p_rng); +#endif + case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: + return ecdh_make_public_internal(&ctx->ctx.mbed_ecdh, olen, + ctx->point_format, buf, blen, + f_rng, p_rng, + restart_enabled); + default: + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } +#endif +} + +static int ecdh_read_public_internal(mbedtls_ecdh_context_mbed *ctx, + const unsigned char *buf, size_t blen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const unsigned char *p = buf; + + if ((ret = mbedtls_ecp_tls_read_point(&ctx->grp, &ctx->Qp, &p, + blen)) != 0) { + return ret; + } + + if ((size_t) (p - buf) != blen) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + return 0; +} + +/* + * Parse and import the client's public value + */ +int mbedtls_ecdh_read_public(mbedtls_ecdh_context *ctx, + const unsigned char *buf, size_t blen) +{ + ECDH_VALIDATE_RET(ctx != NULL); + ECDH_VALIDATE_RET(buf != NULL); + +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + return ecdh_read_public_internal(ctx, buf, blen); +#else + switch (ctx->var) { +#if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED) + case MBEDTLS_ECDH_VARIANT_EVEREST: + return mbedtls_everest_read_public(&ctx->ctx.everest_ecdh, + buf, blen); +#endif + case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: + return ecdh_read_public_internal(&ctx->ctx.mbed_ecdh, + buf, blen); + default: + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } +#endif +} + +static int ecdh_calc_secret_internal(mbedtls_ecdh_context_mbed *ctx, + size_t *olen, unsigned char *buf, + size_t blen, + int (*f_rng)(void *, + unsigned char *, + size_t), + void *p_rng, + int restart_enabled) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; +#if defined(MBEDTLS_ECP_RESTARTABLE) + mbedtls_ecp_restart_ctx *rs_ctx = NULL; +#endif + + if (ctx == NULL || ctx->grp.pbits == 0) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (restart_enabled) { + rs_ctx = &ctx->rs; + } +#else + (void) restart_enabled; +#endif + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if ((ret = ecdh_compute_shared_restartable(&ctx->grp, &ctx->z, &ctx->Qp, + &ctx->d, f_rng, p_rng, + rs_ctx)) != 0) { + return ret; + } +#else + if ((ret = mbedtls_ecdh_compute_shared(&ctx->grp, &ctx->z, &ctx->Qp, + &ctx->d, f_rng, p_rng)) != 0) { + return ret; + } +#endif /* MBEDTLS_ECP_RESTARTABLE */ + + if (mbedtls_mpi_size(&ctx->z) > blen) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + *olen = ctx->grp.pbits / 8 + ((ctx->grp.pbits % 8) != 0); + + if (mbedtls_ecp_get_type(&ctx->grp) == MBEDTLS_ECP_TYPE_MONTGOMERY) { + return mbedtls_mpi_write_binary_le(&ctx->z, buf, *olen); + } + + return mbedtls_mpi_write_binary(&ctx->z, buf, *olen); +} + +/* + * Derive and export the shared secret + */ +int mbedtls_ecdh_calc_secret(mbedtls_ecdh_context *ctx, size_t *olen, + unsigned char *buf, size_t blen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int restart_enabled = 0; + ECDH_VALIDATE_RET(ctx != NULL); + ECDH_VALIDATE_RET(olen != NULL); + ECDH_VALIDATE_RET(buf != NULL); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + restart_enabled = ctx->restart_enabled; +#endif + +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + return ecdh_calc_secret_internal(ctx, olen, buf, blen, f_rng, p_rng, + restart_enabled); +#else + switch (ctx->var) { +#if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED) + case MBEDTLS_ECDH_VARIANT_EVEREST: + return mbedtls_everest_calc_secret(&ctx->ctx.everest_ecdh, olen, + buf, blen, f_rng, p_rng); +#endif + case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: + return ecdh_calc_secret_internal(&ctx->ctx.mbed_ecdh, olen, buf, + blen, f_rng, p_rng, + restart_enabled); + default: + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } +#endif +} + +#endif /* MBEDTLS_ECDH_C */ diff --git a/ext/opcua_client/mbedtls/library/ecdsa.c b/ext/opcua_client/mbedtls/library/ecdsa.c new file mode 100644 index 0000000..51aba0e --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ecdsa.c @@ -0,0 +1,997 @@ +/* + * Elliptic curve DSA + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * References: + * + * SEC1 https://www.secg.org/sec1-v2.pdf + */ + +#include "common.h" + +#if defined(MBEDTLS_ECDSA_C) + +#include "mbedtls/ecdsa.h" +#include "mbedtls/asn1write.h" + +#include + +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) +#include "mbedtls/hmac_drbg.h" +#endif + +#include "mbedtls/platform.h" + +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +/* Parameter validation macros based on platform_util.h */ +#define ECDSA_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA) +#define ECDSA_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +#if defined(MBEDTLS_ECP_RESTARTABLE) + +/* + * Sub-context for ecdsa_verify() + */ +struct mbedtls_ecdsa_restart_ver { + mbedtls_mpi u1, u2; /* intermediate values */ + enum { /* what to do next? */ + ecdsa_ver_init = 0, /* getting started */ + ecdsa_ver_muladd, /* muladd step */ + } state; +}; + +/* + * Init verify restart sub-context + */ +static void ecdsa_restart_ver_init(mbedtls_ecdsa_restart_ver_ctx *ctx) +{ + mbedtls_mpi_init(&ctx->u1); + mbedtls_mpi_init(&ctx->u2); + ctx->state = ecdsa_ver_init; +} + +/* + * Free the components of a verify restart sub-context + */ +static void ecdsa_restart_ver_free(mbedtls_ecdsa_restart_ver_ctx *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_mpi_free(&ctx->u1); + mbedtls_mpi_free(&ctx->u2); + + ecdsa_restart_ver_init(ctx); +} + +/* + * Sub-context for ecdsa_sign() + */ +struct mbedtls_ecdsa_restart_sig { + int sign_tries; + int key_tries; + mbedtls_mpi k; /* per-signature random */ + mbedtls_mpi r; /* r value */ + enum { /* what to do next? */ + ecdsa_sig_init = 0, /* getting started */ + ecdsa_sig_mul, /* doing ecp_mul() */ + ecdsa_sig_modn, /* mod N computations */ + } state; +}; + +/* + * Init verify sign sub-context + */ +static void ecdsa_restart_sig_init(mbedtls_ecdsa_restart_sig_ctx *ctx) +{ + ctx->sign_tries = 0; + ctx->key_tries = 0; + mbedtls_mpi_init(&ctx->k); + mbedtls_mpi_init(&ctx->r); + ctx->state = ecdsa_sig_init; +} + +/* + * Free the components of a sign restart sub-context + */ +static void ecdsa_restart_sig_free(mbedtls_ecdsa_restart_sig_ctx *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_mpi_free(&ctx->k); + mbedtls_mpi_free(&ctx->r); +} + +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) +/* + * Sub-context for ecdsa_sign_det() + */ +struct mbedtls_ecdsa_restart_det { + mbedtls_hmac_drbg_context rng_ctx; /* DRBG state */ + enum { /* what to do next? */ + ecdsa_det_init = 0, /* getting started */ + ecdsa_det_sign, /* make signature */ + } state; +}; + +/* + * Init verify sign_det sub-context + */ +static void ecdsa_restart_det_init(mbedtls_ecdsa_restart_det_ctx *ctx) +{ + mbedtls_hmac_drbg_init(&ctx->rng_ctx); + ctx->state = ecdsa_det_init; +} + +/* + * Free the components of a sign_det restart sub-context + */ +static void ecdsa_restart_det_free(mbedtls_ecdsa_restart_det_ctx *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_hmac_drbg_free(&ctx->rng_ctx); + + ecdsa_restart_det_init(ctx); +} +#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ + +#define ECDSA_RS_ECP (rs_ctx == NULL ? NULL : &rs_ctx->ecp) + +/* Utility macro for checking and updating ops budget */ +#define ECDSA_BUDGET(ops) \ + MBEDTLS_MPI_CHK(mbedtls_ecp_check_budget(grp, ECDSA_RS_ECP, ops)); + +/* Call this when entering a function that needs its own sub-context */ +#define ECDSA_RS_ENTER(SUB) do { \ + /* reset ops count for this call if top-level */ \ + if (rs_ctx != NULL && rs_ctx->ecp.depth++ == 0) \ + rs_ctx->ecp.ops_done = 0; \ + \ + /* set up our own sub-context if needed */ \ + if (mbedtls_ecp_restart_is_enabled() && \ + rs_ctx != NULL && rs_ctx->SUB == NULL) \ + { \ + rs_ctx->SUB = mbedtls_calloc(1, sizeof(*rs_ctx->SUB)); \ + if (rs_ctx->SUB == NULL) \ + return MBEDTLS_ERR_ECP_ALLOC_FAILED; \ + \ + ecdsa_restart_## SUB ##_init(rs_ctx->SUB); \ + } \ +} while (0) + +/* Call this when leaving a function that needs its own sub-context */ +#define ECDSA_RS_LEAVE(SUB) do { \ + /* clear our sub-context when not in progress (done or error) */ \ + if (rs_ctx != NULL && rs_ctx->SUB != NULL && \ + ret != MBEDTLS_ERR_ECP_IN_PROGRESS) \ + { \ + ecdsa_restart_## SUB ##_free(rs_ctx->SUB); \ + mbedtls_free(rs_ctx->SUB); \ + rs_ctx->SUB = NULL; \ + } \ + \ + if (rs_ctx != NULL) \ + rs_ctx->ecp.depth--; \ +} while (0) + +#else /* MBEDTLS_ECP_RESTARTABLE */ + +#define ECDSA_RS_ECP NULL + +#define ECDSA_BUDGET(ops) /* no-op; for compatibility */ + +#define ECDSA_RS_ENTER(SUB) (void) rs_ctx +#define ECDSA_RS_LEAVE(SUB) (void) rs_ctx + +#endif /* MBEDTLS_ECP_RESTARTABLE */ + +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) || \ + !defined(MBEDTLS_ECDSA_SIGN_ALT) || \ + !defined(MBEDTLS_ECDSA_VERIFY_ALT) +/* + * Derive a suitable integer for group grp from a buffer of length len + * SEC1 4.1.3 step 5 aka SEC1 4.1.4 step 3 + */ +static int derive_mpi(const mbedtls_ecp_group *grp, mbedtls_mpi *x, + const unsigned char *buf, size_t blen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n_size = (grp->nbits + 7) / 8; + size_t use_size = blen > n_size ? n_size : blen; + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(x, buf, use_size)); + if (use_size * 8 > grp->nbits) { + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(x, use_size * 8 - grp->nbits)); + } + + /* While at it, reduce modulo N */ + if (mbedtls_mpi_cmp_mpi(x, &grp->N) >= 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(x, x, &grp->N)); + } + +cleanup: + return ret; +} +#endif /* ECDSA_DETERMINISTIC || !ECDSA_SIGN_ALT || !ECDSA_VERIFY_ALT */ + +int mbedtls_ecdsa_can_do(mbedtls_ecp_group_id gid) +{ + switch (gid) { +#ifdef MBEDTLS_ECP_DP_CURVE25519_ENABLED + case MBEDTLS_ECP_DP_CURVE25519: return 0; +#endif +#ifdef MBEDTLS_ECP_DP_CURVE448_ENABLED + case MBEDTLS_ECP_DP_CURVE448: return 0; +#endif + default: return 1; + } +} + +#if !defined(MBEDTLS_ECDSA_SIGN_ALT) +/* + * Compute ECDSA signature of a hashed message (SEC1 4.1.3) + * Obviously, compared to SEC1 4.1.3, we skip step 4 (hash message) + */ +static int ecdsa_sign_restartable(mbedtls_ecp_group *grp, + mbedtls_mpi *r, mbedtls_mpi *s, + const mbedtls_mpi *d, const unsigned char *buf, size_t blen, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + int (*f_rng_blind)(void *, unsigned char *, size_t), + void *p_rng_blind, + mbedtls_ecdsa_restart_ctx *rs_ctx) +{ + int ret, key_tries, sign_tries; + int *p_sign_tries = &sign_tries, *p_key_tries = &key_tries; + mbedtls_ecp_point R; + mbedtls_mpi k, e, t; + mbedtls_mpi *pk = &k, *pr = r; + + /* Fail cleanly on curves such as Curve25519 that can't be used for ECDSA */ + if (!mbedtls_ecdsa_can_do(grp->id) || grp->N.p == NULL) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + /* Make sure d is in range 1..n-1 */ + if (mbedtls_mpi_cmp_int(d, 1) < 0 || mbedtls_mpi_cmp_mpi(d, &grp->N) >= 0) { + return MBEDTLS_ERR_ECP_INVALID_KEY; + } + + mbedtls_ecp_point_init(&R); + mbedtls_mpi_init(&k); mbedtls_mpi_init(&e); mbedtls_mpi_init(&t); + + ECDSA_RS_ENTER(sig); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->sig != NULL) { + /* redirect to our context */ + p_sign_tries = &rs_ctx->sig->sign_tries; + p_key_tries = &rs_ctx->sig->key_tries; + pk = &rs_ctx->sig->k; + pr = &rs_ctx->sig->r; + + /* jump to current step */ + if (rs_ctx->sig->state == ecdsa_sig_mul) { + goto mul; + } + if (rs_ctx->sig->state == ecdsa_sig_modn) { + goto modn; + } + } +#endif /* MBEDTLS_ECP_RESTARTABLE */ + + *p_sign_tries = 0; + do { + if ((*p_sign_tries)++ > 10) { + ret = MBEDTLS_ERR_ECP_RANDOM_FAILED; + goto cleanup; + } + + /* + * Steps 1-3: generate a suitable ephemeral keypair + * and set r = xR mod n + */ + *p_key_tries = 0; + do { + if ((*p_key_tries)++ > 10) { + ret = MBEDTLS_ERR_ECP_RANDOM_FAILED; + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_ecp_gen_privkey(grp, pk, f_rng, p_rng)); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->sig != NULL) { + rs_ctx->sig->state = ecdsa_sig_mul; + } + +mul: +#endif + MBEDTLS_MPI_CHK(mbedtls_ecp_mul_restartable(grp, &R, pk, &grp->G, + f_rng_blind, + p_rng_blind, + ECDSA_RS_ECP)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(pr, &R.X, &grp->N)); + } while (mbedtls_mpi_cmp_int(pr, 0) == 0); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->sig != NULL) { + rs_ctx->sig->state = ecdsa_sig_modn; + } + +modn: +#endif + /* + * Accounting for everything up to the end of the loop + * (step 6, but checking now avoids saving e and t) + */ + ECDSA_BUDGET(MBEDTLS_ECP_OPS_INV + 4); + + /* + * Step 5: derive MPI from hashed message + */ + MBEDTLS_MPI_CHK(derive_mpi(grp, &e, buf, blen)); + + /* + * Generate a random value to blind inv_mod in next step, + * avoiding a potential timing leak. + */ + MBEDTLS_MPI_CHK(mbedtls_ecp_gen_privkey(grp, &t, f_rng_blind, + p_rng_blind)); + + /* + * Step 6: compute s = (e + r * d) / k = t (e + rd) / (kt) mod n + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(s, pr, d)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&e, &e, s)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&e, &e, &t)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(pk, pk, &t)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(pk, pk, &grp->N)); + MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(s, pk, &grp->N)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(s, s, &e)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(s, s, &grp->N)); + } while (mbedtls_mpi_cmp_int(s, 0) == 0); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->sig != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(r, pr)); + } +#endif + +cleanup: + mbedtls_ecp_point_free(&R); + mbedtls_mpi_free(&k); mbedtls_mpi_free(&e); mbedtls_mpi_free(&t); + + ECDSA_RS_LEAVE(sig); + + return ret; +} + +/* + * Compute ECDSA signature of a hashed message + */ +int mbedtls_ecdsa_sign(mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, + const mbedtls_mpi *d, const unsigned char *buf, size_t blen, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + ECDSA_VALIDATE_RET(grp != NULL); + ECDSA_VALIDATE_RET(r != NULL); + ECDSA_VALIDATE_RET(s != NULL); + ECDSA_VALIDATE_RET(d != NULL); + ECDSA_VALIDATE_RET(f_rng != NULL); + ECDSA_VALIDATE_RET(buf != NULL || blen == 0); + + /* Use the same RNG for both blinding and ephemeral key generation */ + return ecdsa_sign_restartable(grp, r, s, d, buf, blen, + f_rng, p_rng, f_rng, p_rng, NULL); +} +#endif /* !MBEDTLS_ECDSA_SIGN_ALT */ + +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) +/* + * Deterministic signature wrapper + */ +static int ecdsa_sign_det_restartable(mbedtls_ecp_group *grp, + mbedtls_mpi *r, mbedtls_mpi *s, + const mbedtls_mpi *d, const unsigned char *buf, size_t blen, + mbedtls_md_type_t md_alg, + int (*f_rng_blind)(void *, unsigned char *, size_t), + void *p_rng_blind, + mbedtls_ecdsa_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_hmac_drbg_context rng_ctx; + mbedtls_hmac_drbg_context *p_rng = &rng_ctx; + unsigned char data[2 * MBEDTLS_ECP_MAX_BYTES]; + size_t grp_len = (grp->nbits + 7) / 8; + const mbedtls_md_info_t *md_info; + mbedtls_mpi h; + + if ((md_info = mbedtls_md_info_from_type(md_alg)) == NULL) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + mbedtls_mpi_init(&h); + mbedtls_hmac_drbg_init(&rng_ctx); + + ECDSA_RS_ENTER(det); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->det != NULL) { + /* redirect to our context */ + p_rng = &rs_ctx->det->rng_ctx; + + /* jump to current step */ + if (rs_ctx->det->state == ecdsa_det_sign) { + goto sign; + } + } +#endif /* MBEDTLS_ECP_RESTARTABLE */ + + /* Use private key and message hash (reduced) to initialize HMAC_DRBG */ + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(d, data, grp_len)); + MBEDTLS_MPI_CHK(derive_mpi(grp, &h, buf, blen)); + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&h, data + grp_len, grp_len)); + MBEDTLS_MPI_CHK(mbedtls_hmac_drbg_seed_buf(p_rng, md_info, data, 2 * grp_len)); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->det != NULL) { + rs_ctx->det->state = ecdsa_det_sign; + } + +sign: +#endif +#if defined(MBEDTLS_ECDSA_SIGN_ALT) + (void) f_rng_blind; + (void) p_rng_blind; + ret = mbedtls_ecdsa_sign(grp, r, s, d, buf, blen, + mbedtls_hmac_drbg_random, p_rng); +#else + if (f_rng_blind != NULL) { + ret = ecdsa_sign_restartable(grp, r, s, d, buf, blen, + mbedtls_hmac_drbg_random, p_rng, + f_rng_blind, p_rng_blind, rs_ctx); + } else { + mbedtls_hmac_drbg_context *p_rng_blind_det; + +#if !defined(MBEDTLS_ECP_RESTARTABLE) + /* + * To avoid reusing rng_ctx and risking incorrect behavior we seed a + * second HMAC-DRBG with the same seed. We also apply a label to avoid + * reusing the bits of the ephemeral key for blinding and eliminate the + * risk that they leak this way. + */ + const char *blind_label = "BLINDING CONTEXT"; + mbedtls_hmac_drbg_context rng_ctx_blind; + + mbedtls_hmac_drbg_init(&rng_ctx_blind); + p_rng_blind_det = &rng_ctx_blind; + mbedtls_hmac_drbg_seed_buf(p_rng_blind_det, md_info, + data, 2 * grp_len); + ret = mbedtls_hmac_drbg_update_ret(p_rng_blind_det, + (const unsigned char *) blind_label, + strlen(blind_label)); + if (ret != 0) { + mbedtls_hmac_drbg_free(&rng_ctx_blind); + goto cleanup; + } +#else + /* + * In the case of restartable computations we would either need to store + * the second RNG in the restart context too or set it up at every + * restart. The first option would penalize the correct application of + * the function and the second would defeat the purpose of the + * restartable feature. + * + * Therefore in this case we reuse the original RNG. This comes with the + * price that the resulting signature might not be a valid deterministic + * ECDSA signature with a very low probability (same magnitude as + * successfully guessing the private key). However even then it is still + * a valid ECDSA signature. + */ + p_rng_blind_det = p_rng; +#endif /* MBEDTLS_ECP_RESTARTABLE */ + + /* + * Since the output of the RNGs is always the same for the same key and + * message, this limits the efficiency of blinding and leaks information + * through side channels. After mbedtls_ecdsa_sign_det() is removed NULL + * won't be a valid value for f_rng_blind anymore. Therefore it should + * be checked by the caller and this branch and check can be removed. + */ + ret = ecdsa_sign_restartable(grp, r, s, d, buf, blen, + mbedtls_hmac_drbg_random, p_rng, + mbedtls_hmac_drbg_random, p_rng_blind_det, + rs_ctx); + +#if !defined(MBEDTLS_ECP_RESTARTABLE) + mbedtls_hmac_drbg_free(&rng_ctx_blind); +#endif + } +#endif /* MBEDTLS_ECDSA_SIGN_ALT */ + +cleanup: + mbedtls_hmac_drbg_free(&rng_ctx); + mbedtls_mpi_free(&h); + + ECDSA_RS_LEAVE(det); + + return ret; +} + +/* + * Deterministic signature wrappers + */ + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +int mbedtls_ecdsa_sign_det(mbedtls_ecp_group *grp, mbedtls_mpi *r, + mbedtls_mpi *s, const mbedtls_mpi *d, + const unsigned char *buf, size_t blen, + mbedtls_md_type_t md_alg) +{ + ECDSA_VALIDATE_RET(grp != NULL); + ECDSA_VALIDATE_RET(r != NULL); + ECDSA_VALIDATE_RET(s != NULL); + ECDSA_VALIDATE_RET(d != NULL); + ECDSA_VALIDATE_RET(buf != NULL || blen == 0); + + return ecdsa_sign_det_restartable(grp, r, s, d, buf, blen, md_alg, + NULL, NULL, NULL); +} +#endif /* MBEDTLS_DEPRECATED_REMOVED */ + +int mbedtls_ecdsa_sign_det_ext(mbedtls_ecp_group *grp, mbedtls_mpi *r, + mbedtls_mpi *s, const mbedtls_mpi *d, + const unsigned char *buf, size_t blen, + mbedtls_md_type_t md_alg, + int (*f_rng_blind)(void *, unsigned char *, + size_t), + void *p_rng_blind) +{ + ECDSA_VALIDATE_RET(grp != NULL); + ECDSA_VALIDATE_RET(r != NULL); + ECDSA_VALIDATE_RET(s != NULL); + ECDSA_VALIDATE_RET(d != NULL); + ECDSA_VALIDATE_RET(buf != NULL || blen == 0); + ECDSA_VALIDATE_RET(f_rng_blind != NULL); + + return ecdsa_sign_det_restartable(grp, r, s, d, buf, blen, md_alg, + f_rng_blind, p_rng_blind, NULL); +} +#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ + +#if !defined(MBEDTLS_ECDSA_VERIFY_ALT) +/* + * Verify ECDSA signature of hashed message (SEC1 4.1.4) + * Obviously, compared to SEC1 4.1.3, we skip step 2 (hash message) + */ +static int ecdsa_verify_restartable(mbedtls_ecp_group *grp, + const unsigned char *buf, size_t blen, + const mbedtls_ecp_point *Q, + const mbedtls_mpi *r, const mbedtls_mpi *s, + mbedtls_ecdsa_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi e, s_inv, u1, u2; + mbedtls_ecp_point R; + mbedtls_mpi *pu1 = &u1, *pu2 = &u2; + + mbedtls_ecp_point_init(&R); + mbedtls_mpi_init(&e); mbedtls_mpi_init(&s_inv); + mbedtls_mpi_init(&u1); mbedtls_mpi_init(&u2); + + /* Fail cleanly on curves such as Curve25519 that can't be used for ECDSA */ + if (!mbedtls_ecdsa_can_do(grp->id) || grp->N.p == NULL) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + ECDSA_RS_ENTER(ver); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->ver != NULL) { + /* redirect to our context */ + pu1 = &rs_ctx->ver->u1; + pu2 = &rs_ctx->ver->u2; + + /* jump to current step */ + if (rs_ctx->ver->state == ecdsa_ver_muladd) { + goto muladd; + } + } +#endif /* MBEDTLS_ECP_RESTARTABLE */ + + /* + * Step 1: make sure r and s are in range 1..n-1 + */ + if (mbedtls_mpi_cmp_int(r, 1) < 0 || mbedtls_mpi_cmp_mpi(r, &grp->N) >= 0 || + mbedtls_mpi_cmp_int(s, 1) < 0 || mbedtls_mpi_cmp_mpi(s, &grp->N) >= 0) { + ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; + goto cleanup; + } + + /* + * Step 3: derive MPI from hashed message + */ + MBEDTLS_MPI_CHK(derive_mpi(grp, &e, buf, blen)); + + /* + * Step 4: u1 = e / s mod n, u2 = r / s mod n + */ + ECDSA_BUDGET(MBEDTLS_ECP_OPS_CHK + MBEDTLS_ECP_OPS_INV + 2); + + MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(&s_inv, s, &grp->N)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(pu1, &e, &s_inv)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(pu1, pu1, &grp->N)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(pu2, r, &s_inv)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(pu2, pu2, &grp->N)); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->ver != NULL) { + rs_ctx->ver->state = ecdsa_ver_muladd; + } + +muladd: +#endif + /* + * Step 5: R = u1 G + u2 Q + */ + MBEDTLS_MPI_CHK(mbedtls_ecp_muladd_restartable(grp, + &R, pu1, &grp->G, pu2, Q, ECDSA_RS_ECP)); + + if (mbedtls_ecp_is_zero(&R)) { + ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; + goto cleanup; + } + + /* + * Step 6: convert xR to an integer (no-op) + * Step 7: reduce xR mod n (gives v) + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&R.X, &R.X, &grp->N)); + + /* + * Step 8: check if v (that is, R.X) is equal to r + */ + if (mbedtls_mpi_cmp_mpi(&R.X, r) != 0) { + ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; + goto cleanup; + } + +cleanup: + mbedtls_ecp_point_free(&R); + mbedtls_mpi_free(&e); mbedtls_mpi_free(&s_inv); + mbedtls_mpi_free(&u1); mbedtls_mpi_free(&u2); + + ECDSA_RS_LEAVE(ver); + + return ret; +} + +/* + * Verify ECDSA signature of hashed message + */ +int mbedtls_ecdsa_verify(mbedtls_ecp_group *grp, + const unsigned char *buf, size_t blen, + const mbedtls_ecp_point *Q, + const mbedtls_mpi *r, + const mbedtls_mpi *s) +{ + ECDSA_VALIDATE_RET(grp != NULL); + ECDSA_VALIDATE_RET(Q != NULL); + ECDSA_VALIDATE_RET(r != NULL); + ECDSA_VALIDATE_RET(s != NULL); + ECDSA_VALIDATE_RET(buf != NULL || blen == 0); + + return ecdsa_verify_restartable(grp, buf, blen, Q, r, s, NULL); +} +#endif /* !MBEDTLS_ECDSA_VERIFY_ALT */ + +/* + * Convert a signature (given by context) to ASN.1 + */ +static int ecdsa_signature_to_asn1(const mbedtls_mpi *r, const mbedtls_mpi *s, + unsigned char *sig, size_t *slen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char buf[MBEDTLS_ECDSA_MAX_LEN] = { 0 }; + unsigned char *p = buf + sizeof(buf); + size_t len = 0; + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_mpi(&p, buf, s)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_mpi(&p, buf, r)); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&p, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(&p, buf, + MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + + memcpy(sig, p, len); + *slen = len; + + return 0; +} + +/* + * Compute and write signature + */ +int mbedtls_ecdsa_write_signature_restartable(mbedtls_ecdsa_context *ctx, + mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hlen, + unsigned char *sig, size_t *slen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + mbedtls_ecdsa_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi r, s; + ECDSA_VALIDATE_RET(ctx != NULL); + ECDSA_VALIDATE_RET(hash != NULL); + ECDSA_VALIDATE_RET(sig != NULL); + ECDSA_VALIDATE_RET(slen != NULL); + + mbedtls_mpi_init(&r); + mbedtls_mpi_init(&s); + +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) + MBEDTLS_MPI_CHK(ecdsa_sign_det_restartable(&ctx->grp, &r, &s, &ctx->d, + hash, hlen, md_alg, f_rng, + p_rng, rs_ctx)); +#else + (void) md_alg; + +#if defined(MBEDTLS_ECDSA_SIGN_ALT) + (void) rs_ctx; + + MBEDTLS_MPI_CHK(mbedtls_ecdsa_sign(&ctx->grp, &r, &s, &ctx->d, + hash, hlen, f_rng, p_rng)); +#else + /* Use the same RNG for both blinding and ephemeral key generation */ + MBEDTLS_MPI_CHK(ecdsa_sign_restartable(&ctx->grp, &r, &s, &ctx->d, + hash, hlen, f_rng, p_rng, f_rng, + p_rng, rs_ctx)); +#endif /* MBEDTLS_ECDSA_SIGN_ALT */ +#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ + + MBEDTLS_MPI_CHK(ecdsa_signature_to_asn1(&r, &s, sig, slen)); + +cleanup: + mbedtls_mpi_free(&r); + mbedtls_mpi_free(&s); + + return ret; +} + +/* + * Compute and write signature + */ +int mbedtls_ecdsa_write_signature(mbedtls_ecdsa_context *ctx, + mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hlen, + unsigned char *sig, size_t *slen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + ECDSA_VALIDATE_RET(ctx != NULL); + ECDSA_VALIDATE_RET(hash != NULL); + ECDSA_VALIDATE_RET(sig != NULL); + ECDSA_VALIDATE_RET(slen != NULL); + return mbedtls_ecdsa_write_signature_restartable( + ctx, md_alg, hash, hlen, sig, slen, f_rng, p_rng, NULL); +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) && \ + defined(MBEDTLS_ECDSA_DETERMINISTIC) +int mbedtls_ecdsa_write_signature_det(mbedtls_ecdsa_context *ctx, + const unsigned char *hash, size_t hlen, + unsigned char *sig, size_t *slen, + mbedtls_md_type_t md_alg) +{ + ECDSA_VALIDATE_RET(ctx != NULL); + ECDSA_VALIDATE_RET(hash != NULL); + ECDSA_VALIDATE_RET(sig != NULL); + ECDSA_VALIDATE_RET(slen != NULL); + return mbedtls_ecdsa_write_signature(ctx, md_alg, hash, hlen, sig, slen, + NULL, NULL); +} +#endif + +/* + * Read and check signature + */ +int mbedtls_ecdsa_read_signature(mbedtls_ecdsa_context *ctx, + const unsigned char *hash, size_t hlen, + const unsigned char *sig, size_t slen) +{ + ECDSA_VALIDATE_RET(ctx != NULL); + ECDSA_VALIDATE_RET(hash != NULL); + ECDSA_VALIDATE_RET(sig != NULL); + return mbedtls_ecdsa_read_signature_restartable( + ctx, hash, hlen, sig, slen, NULL); +} + +/* + * Restartable read and check signature + */ +int mbedtls_ecdsa_read_signature_restartable(mbedtls_ecdsa_context *ctx, + const unsigned char *hash, size_t hlen, + const unsigned char *sig, size_t slen, + mbedtls_ecdsa_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *p = (unsigned char *) sig; + const unsigned char *end = sig + slen; + size_t len; + mbedtls_mpi r, s; + ECDSA_VALIDATE_RET(ctx != NULL); + ECDSA_VALIDATE_RET(hash != NULL); + ECDSA_VALIDATE_RET(sig != NULL); + + mbedtls_mpi_init(&r); + mbedtls_mpi_init(&s); + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + goto cleanup; + } + + if (p + len != end) { + ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_ECP_BAD_INPUT_DATA, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + goto cleanup; + } + + if ((ret = mbedtls_asn1_get_mpi(&p, end, &r)) != 0 || + (ret = mbedtls_asn1_get_mpi(&p, end, &s)) != 0) { + ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + goto cleanup; + } +#if defined(MBEDTLS_ECDSA_VERIFY_ALT) + (void) rs_ctx; + + if ((ret = mbedtls_ecdsa_verify(&ctx->grp, hash, hlen, + &ctx->Q, &r, &s)) != 0) { + goto cleanup; + } +#else + if ((ret = ecdsa_verify_restartable(&ctx->grp, hash, hlen, + &ctx->Q, &r, &s, rs_ctx)) != 0) { + goto cleanup; + } +#endif /* MBEDTLS_ECDSA_VERIFY_ALT */ + + /* At this point we know that the buffer starts with a valid signature. + * Return 0 if the buffer just contains the signature, and a specific + * error code if the valid signature is followed by more data. */ + if (p != end) { + ret = MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH; + } + +cleanup: + mbedtls_mpi_free(&r); + mbedtls_mpi_free(&s); + + return ret; +} + +#if !defined(MBEDTLS_ECDSA_GENKEY_ALT) +/* + * Generate key pair + */ +int mbedtls_ecdsa_genkey(mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + int ret = 0; + ECDSA_VALIDATE_RET(ctx != NULL); + ECDSA_VALIDATE_RET(f_rng != NULL); + + ret = mbedtls_ecp_group_load(&ctx->grp, gid); + if (ret != 0) { + return ret; + } + + return mbedtls_ecp_gen_keypair(&ctx->grp, &ctx->d, + &ctx->Q, f_rng, p_rng); +} +#endif /* !MBEDTLS_ECDSA_GENKEY_ALT */ + +/* + * Set context from an mbedtls_ecp_keypair + */ +int mbedtls_ecdsa_from_keypair(mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + ECDSA_VALIDATE_RET(ctx != NULL); + ECDSA_VALIDATE_RET(key != NULL); + + if ((ret = mbedtls_ecp_group_copy(&ctx->grp, &key->grp)) != 0 || + (ret = mbedtls_mpi_copy(&ctx->d, &key->d)) != 0 || + (ret = mbedtls_ecp_copy(&ctx->Q, &key->Q)) != 0) { + mbedtls_ecdsa_free(ctx); + } + + return ret; +} + +/* + * Initialize context + */ +void mbedtls_ecdsa_init(mbedtls_ecdsa_context *ctx) +{ + ECDSA_VALIDATE(ctx != NULL); + + mbedtls_ecp_keypair_init(ctx); +} + +/* + * Free context + */ +void mbedtls_ecdsa_free(mbedtls_ecdsa_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_ecp_keypair_free(ctx); +} + +#if defined(MBEDTLS_ECP_RESTARTABLE) +/* + * Initialize a restart context + */ +void mbedtls_ecdsa_restart_init(mbedtls_ecdsa_restart_ctx *ctx) +{ + ECDSA_VALIDATE(ctx != NULL); + + mbedtls_ecp_restart_init(&ctx->ecp); + + ctx->ver = NULL; + ctx->sig = NULL; +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) + ctx->det = NULL; +#endif +} + +/* + * Free the components of a restart context + */ +void mbedtls_ecdsa_restart_free(mbedtls_ecdsa_restart_ctx *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_ecp_restart_free(&ctx->ecp); + + ecdsa_restart_ver_free(ctx->ver); + mbedtls_free(ctx->ver); + ctx->ver = NULL; + + ecdsa_restart_sig_free(ctx->sig); + mbedtls_free(ctx->sig); + ctx->sig = NULL; + +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) + ecdsa_restart_det_free(ctx->det); + mbedtls_free(ctx->det); + ctx->det = NULL; +#endif +} +#endif /* MBEDTLS_ECP_RESTARTABLE */ + +#endif /* MBEDTLS_ECDSA_C */ diff --git a/ext/opcua_client/mbedtls/library/ecjpake.c b/ext/opcua_client/mbedtls/library/ecjpake.c new file mode 100644 index 0000000..102c24a --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ecjpake.c @@ -0,0 +1,1131 @@ +/* + * Elliptic curve J-PAKE + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * References in the code are to the Thread v1.0 Specification, + * available to members of the Thread Group http://threadgroup.org/ + */ + +#include "common.h" + +#if defined(MBEDTLS_ECJPAKE_C) + +#include "mbedtls/ecjpake.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#if !defined(MBEDTLS_ECJPAKE_ALT) + +/* Parameter validation macros based on platform_util.h */ +#define ECJPAKE_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA) +#define ECJPAKE_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +/* + * Convert a mbedtls_ecjpake_role to identifier string + */ +static const char * const ecjpake_id[] = { + "client", + "server" +}; + +#define ID_MINE (ecjpake_id[ctx->role]) +#define ID_PEER (ecjpake_id[1 - ctx->role]) + +/* + * Initialize context + */ +void mbedtls_ecjpake_init(mbedtls_ecjpake_context *ctx) +{ + ECJPAKE_VALIDATE(ctx != NULL); + + ctx->md_info = NULL; + mbedtls_ecp_group_init(&ctx->grp); + ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED; + + mbedtls_ecp_point_init(&ctx->Xm1); + mbedtls_ecp_point_init(&ctx->Xm2); + mbedtls_ecp_point_init(&ctx->Xp1); + mbedtls_ecp_point_init(&ctx->Xp2); + mbedtls_ecp_point_init(&ctx->Xp); + + mbedtls_mpi_init(&ctx->xm1); + mbedtls_mpi_init(&ctx->xm2); + mbedtls_mpi_init(&ctx->s); +} + +/* + * Free context + */ +void mbedtls_ecjpake_free(mbedtls_ecjpake_context *ctx) +{ + if (ctx == NULL) { + return; + } + + ctx->md_info = NULL; + mbedtls_ecp_group_free(&ctx->grp); + + mbedtls_ecp_point_free(&ctx->Xm1); + mbedtls_ecp_point_free(&ctx->Xm2); + mbedtls_ecp_point_free(&ctx->Xp1); + mbedtls_ecp_point_free(&ctx->Xp2); + mbedtls_ecp_point_free(&ctx->Xp); + + mbedtls_mpi_free(&ctx->xm1); + mbedtls_mpi_free(&ctx->xm2); + mbedtls_mpi_free(&ctx->s); +} + +/* + * Setup context + */ +int mbedtls_ecjpake_setup(mbedtls_ecjpake_context *ctx, + mbedtls_ecjpake_role role, + mbedtls_md_type_t hash, + mbedtls_ecp_group_id curve, + const unsigned char *secret, + size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + ECJPAKE_VALIDATE_RET(ctx != NULL); + ECJPAKE_VALIDATE_RET(role == MBEDTLS_ECJPAKE_CLIENT || + role == MBEDTLS_ECJPAKE_SERVER); + ECJPAKE_VALIDATE_RET(secret != NULL || len == 0); + + ctx->role = role; + + if ((ctx->md_info = mbedtls_md_info_from_type(hash)) == NULL) { + return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE; + } + + MBEDTLS_MPI_CHK(mbedtls_ecp_group_load(&ctx->grp, curve)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&ctx->s, secret, len)); + +cleanup: + if (ret != 0) { + mbedtls_ecjpake_free(ctx); + } + + return ret; +} + +/* + * Check if context is ready for use + */ +int mbedtls_ecjpake_check(const mbedtls_ecjpake_context *ctx) +{ + ECJPAKE_VALIDATE_RET(ctx != NULL); + + if (ctx->md_info == NULL || + ctx->grp.id == MBEDTLS_ECP_DP_NONE || + ctx->s.p == NULL) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + return 0; +} + +/* + * Write a point plus its length to a buffer + */ +static int ecjpake_write_len_point(unsigned char **p, + const unsigned char *end, + const mbedtls_ecp_group *grp, + const int pf, + const mbedtls_ecp_point *P) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + + /* Need at least 4 for length plus 1 for point */ + if (end < *p || end - *p < 5) { + return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + } + + ret = mbedtls_ecp_point_write_binary(grp, P, pf, + &len, *p + 4, end - (*p + 4)); + if (ret != 0) { + return ret; + } + + MBEDTLS_PUT_UINT32_BE(len, *p, 0); + + *p += 4 + len; + + return 0; +} + +/* + * Size of the temporary buffer for ecjpake_hash: + * 3 EC points plus their length, plus ID and its length (4 + 6 bytes) + */ +#define ECJPAKE_HASH_BUF_LEN (3 * (4 + MBEDTLS_ECP_MAX_PT_LEN) + 4 + 6) + +/* + * Compute hash for ZKP (7.4.2.2.2.1) + */ +static int ecjpake_hash(const mbedtls_md_info_t *md_info, + const mbedtls_ecp_group *grp, + const int pf, + const mbedtls_ecp_point *G, + const mbedtls_ecp_point *V, + const mbedtls_ecp_point *X, + const char *id, + mbedtls_mpi *h) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char buf[ECJPAKE_HASH_BUF_LEN]; + unsigned char *p = buf; + const unsigned char *end = buf + sizeof(buf); + const size_t id_len = strlen(id); + unsigned char hash[MBEDTLS_MD_MAX_SIZE]; + + /* Write things to temporary buffer */ + MBEDTLS_MPI_CHK(ecjpake_write_len_point(&p, end, grp, pf, G)); + MBEDTLS_MPI_CHK(ecjpake_write_len_point(&p, end, grp, pf, V)); + MBEDTLS_MPI_CHK(ecjpake_write_len_point(&p, end, grp, pf, X)); + + if (end - p < 4) { + return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + } + + MBEDTLS_PUT_UINT32_BE(id_len, p, 0); + p += 4; + + if (end < p || (size_t) (end - p) < id_len) { + return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + } + + memcpy(p, id, id_len); + p += id_len; + + /* Compute hash */ + MBEDTLS_MPI_CHK(mbedtls_md(md_info, buf, p - buf, hash)); + + /* Turn it into an integer mod n */ + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(h, hash, + mbedtls_md_get_size(md_info))); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(h, h, &grp->N)); + +cleanup: + return ret; +} + +/* + * Parse a ECShnorrZKP (7.4.2.2.2) and verify it (7.4.2.3.3) + */ +static int ecjpake_zkp_read(const mbedtls_md_info_t *md_info, + const mbedtls_ecp_group *grp, + const int pf, + const mbedtls_ecp_point *G, + const mbedtls_ecp_point *X, + const char *id, + const unsigned char **p, + const unsigned char *end) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_point V, VV; + mbedtls_mpi r, h; + size_t r_len; + + mbedtls_ecp_point_init(&V); + mbedtls_ecp_point_init(&VV); + mbedtls_mpi_init(&r); + mbedtls_mpi_init(&h); + + /* + * struct { + * ECPoint V; + * opaque r<1..2^8-1>; + * } ECSchnorrZKP; + */ + if (end < *p) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + MBEDTLS_MPI_CHK(mbedtls_ecp_tls_read_point(grp, &V, p, end - *p)); + + if (end < *p || (size_t) (end - *p) < 1) { + ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + goto cleanup; + } + + r_len = *(*p)++; + + if (end < *p || (size_t) (end - *p) < r_len || r_len == 0) { + ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&r, *p, r_len)); + *p += r_len; + + /* + * Verification + */ + MBEDTLS_MPI_CHK(ecjpake_hash(md_info, grp, pf, G, &V, X, id, &h)); + MBEDTLS_MPI_CHK(mbedtls_ecp_muladd((mbedtls_ecp_group *) grp, + &VV, &h, X, &r, G)); + + if (mbedtls_ecp_point_cmp(&VV, &V) != 0) { + ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; + goto cleanup; + } + +cleanup: + mbedtls_ecp_point_free(&V); + mbedtls_ecp_point_free(&VV); + mbedtls_mpi_free(&r); + mbedtls_mpi_free(&h); + + return ret; +} + +/* + * Generate ZKP (7.4.2.3.2) and write it as ECSchnorrZKP (7.4.2.2.2) + */ +static int ecjpake_zkp_write(const mbedtls_md_info_t *md_info, + const mbedtls_ecp_group *grp, + const int pf, + const mbedtls_ecp_point *G, + const mbedtls_mpi *x, + const mbedtls_ecp_point *X, + const char *id, + unsigned char **p, + const unsigned char *end, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_point V; + mbedtls_mpi v; + mbedtls_mpi h; /* later recycled to hold r */ + size_t len; + + if (end < *p) { + return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + } + + mbedtls_ecp_point_init(&V); + mbedtls_mpi_init(&v); + mbedtls_mpi_init(&h); + + /* Compute signature */ + MBEDTLS_MPI_CHK(mbedtls_ecp_gen_keypair_base((mbedtls_ecp_group *) grp, + G, &v, &V, f_rng, p_rng)); + MBEDTLS_MPI_CHK(ecjpake_hash(md_info, grp, pf, G, &V, X, id, &h)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&h, &h, x)); /* x*h */ + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&h, &v, &h)); /* v - x*h */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&h, &h, &grp->N)); /* r */ + + /* Write it out */ + MBEDTLS_MPI_CHK(mbedtls_ecp_tls_write_point(grp, &V, + pf, &len, *p, end - *p)); + *p += len; + + len = mbedtls_mpi_size(&h); /* actually r */ + if (end < *p || (size_t) (end - *p) < 1 + len || len > 255) { + ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + goto cleanup; + } + + *(*p)++ = MBEDTLS_BYTE_0(len); + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&h, *p, len)); /* r */ + *p += len; + +cleanup: + mbedtls_ecp_point_free(&V); + mbedtls_mpi_free(&v); + mbedtls_mpi_free(&h); + + return ret; +} + +/* + * Parse a ECJPAKEKeyKP (7.4.2.2.1) and check proof + * Output: verified public key X + */ +static int ecjpake_kkp_read(const mbedtls_md_info_t *md_info, + const mbedtls_ecp_group *grp, + const int pf, + const mbedtls_ecp_point *G, + mbedtls_ecp_point *X, + const char *id, + const unsigned char **p, + const unsigned char *end) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (end < *p) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + /* + * struct { + * ECPoint X; + * ECSchnorrZKP zkp; + * } ECJPAKEKeyKP; + */ + MBEDTLS_MPI_CHK(mbedtls_ecp_tls_read_point(grp, X, p, end - *p)); + if (mbedtls_ecp_is_zero(X)) { + ret = MBEDTLS_ERR_ECP_INVALID_KEY; + goto cleanup; + } + + MBEDTLS_MPI_CHK(ecjpake_zkp_read(md_info, grp, pf, G, X, id, p, end)); + +cleanup: + return ret; +} + +/* + * Generate an ECJPAKEKeyKP + * Output: the serialized structure, plus private/public key pair + */ +static int ecjpake_kkp_write(const mbedtls_md_info_t *md_info, + const mbedtls_ecp_group *grp, + const int pf, + const mbedtls_ecp_point *G, + mbedtls_mpi *x, + mbedtls_ecp_point *X, + const char *id, + unsigned char **p, + const unsigned char *end, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + + if (end < *p) { + return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + } + + /* Generate key (7.4.2.3.1) and write it out */ + MBEDTLS_MPI_CHK(mbedtls_ecp_gen_keypair_base((mbedtls_ecp_group *) grp, G, x, X, + f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_ecp_tls_write_point(grp, X, + pf, &len, *p, end - *p)); + *p += len; + + /* Generate and write proof */ + MBEDTLS_MPI_CHK(ecjpake_zkp_write(md_info, grp, pf, G, x, X, id, + p, end, f_rng, p_rng)); + +cleanup: + return ret; +} + +/* + * Read a ECJPAKEKeyKPPairList (7.4.2.3) and check proofs + * Outputs: verified peer public keys Xa, Xb + */ +static int ecjpake_kkpp_read(const mbedtls_md_info_t *md_info, + const mbedtls_ecp_group *grp, + const int pf, + const mbedtls_ecp_point *G, + mbedtls_ecp_point *Xa, + mbedtls_ecp_point *Xb, + const char *id, + const unsigned char *buf, + size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const unsigned char *p = buf; + const unsigned char *end = buf + len; + + /* + * struct { + * ECJPAKEKeyKP ecjpake_key_kp_pair_list[2]; + * } ECJPAKEKeyKPPairList; + */ + MBEDTLS_MPI_CHK(ecjpake_kkp_read(md_info, grp, pf, G, Xa, id, &p, end)); + MBEDTLS_MPI_CHK(ecjpake_kkp_read(md_info, grp, pf, G, Xb, id, &p, end)); + + if (p != end) { + ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + +cleanup: + return ret; +} + +/* + * Generate a ECJPAKEKeyKPPairList + * Outputs: the serialized structure, plus two private/public key pairs + */ +static int ecjpake_kkpp_write(const mbedtls_md_info_t *md_info, + const mbedtls_ecp_group *grp, + const int pf, + const mbedtls_ecp_point *G, + mbedtls_mpi *xm1, + mbedtls_ecp_point *Xa, + mbedtls_mpi *xm2, + mbedtls_ecp_point *Xb, + const char *id, + unsigned char *buf, + size_t len, + size_t *olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *p = buf; + const unsigned char *end = buf + len; + + MBEDTLS_MPI_CHK(ecjpake_kkp_write(md_info, grp, pf, G, xm1, Xa, id, + &p, end, f_rng, p_rng)); + MBEDTLS_MPI_CHK(ecjpake_kkp_write(md_info, grp, pf, G, xm2, Xb, id, + &p, end, f_rng, p_rng)); + + *olen = p - buf; + +cleanup: + return ret; +} + +/* + * Read and process the first round message + */ +int mbedtls_ecjpake_read_round_one(mbedtls_ecjpake_context *ctx, + const unsigned char *buf, + size_t len) +{ + ECJPAKE_VALIDATE_RET(ctx != NULL); + ECJPAKE_VALIDATE_RET(buf != NULL); + + return ecjpake_kkpp_read(ctx->md_info, &ctx->grp, ctx->point_format, + &ctx->grp.G, + &ctx->Xp1, &ctx->Xp2, ID_PEER, + buf, len); +} + +/* + * Generate and write the first round message + */ +int mbedtls_ecjpake_write_round_one(mbedtls_ecjpake_context *ctx, + unsigned char *buf, size_t len, size_t *olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + ECJPAKE_VALIDATE_RET(ctx != NULL); + ECJPAKE_VALIDATE_RET(buf != NULL); + ECJPAKE_VALIDATE_RET(olen != NULL); + ECJPAKE_VALIDATE_RET(f_rng != NULL); + + return ecjpake_kkpp_write(ctx->md_info, &ctx->grp, ctx->point_format, + &ctx->grp.G, + &ctx->xm1, &ctx->Xm1, &ctx->xm2, &ctx->Xm2, + ID_MINE, buf, len, olen, f_rng, p_rng); +} + +/* + * Compute the sum of three points R = A + B + C + */ +static int ecjpake_ecp_add3(mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_ecp_point *A, + const mbedtls_ecp_point *B, + const mbedtls_ecp_point *C) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi one; + + mbedtls_mpi_init(&one); + + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&one, 1)); + MBEDTLS_MPI_CHK(mbedtls_ecp_muladd(grp, R, &one, A, &one, B)); + MBEDTLS_MPI_CHK(mbedtls_ecp_muladd(grp, R, &one, R, &one, C)); + +cleanup: + mbedtls_mpi_free(&one); + + return ret; +} + +/* + * Read and process second round message (C: 7.4.2.5, S: 7.4.2.6) + */ +int mbedtls_ecjpake_read_round_two(mbedtls_ecjpake_context *ctx, + const unsigned char *buf, + size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const unsigned char *p = buf; + const unsigned char *end = buf + len; + mbedtls_ecp_group grp; + mbedtls_ecp_point G; /* C: GB, S: GA */ + + ECJPAKE_VALIDATE_RET(ctx != NULL); + ECJPAKE_VALIDATE_RET(buf != NULL); + + mbedtls_ecp_group_init(&grp); + mbedtls_ecp_point_init(&G); + + /* + * Server: GA = X3 + X4 + X1 (7.4.2.6.1) + * Client: GB = X1 + X2 + X3 (7.4.2.5.1) + * Unified: G = Xm1 + Xm2 + Xp1 + * We need that before parsing in order to check Xp as we read it + */ + MBEDTLS_MPI_CHK(ecjpake_ecp_add3(&ctx->grp, &G, + &ctx->Xm1, &ctx->Xm2, &ctx->Xp1)); + + /* + * struct { + * ECParameters curve_params; // only client reading server msg + * ECJPAKEKeyKP ecjpake_key_kp; + * } Client/ServerECJPAKEParams; + */ + if (ctx->role == MBEDTLS_ECJPAKE_CLIENT) { + MBEDTLS_MPI_CHK(mbedtls_ecp_tls_read_group(&grp, &p, len)); + if (grp.id != ctx->grp.id) { + ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + goto cleanup; + } + } + + MBEDTLS_MPI_CHK(ecjpake_kkp_read(ctx->md_info, &ctx->grp, + ctx->point_format, + &G, &ctx->Xp, ID_PEER, &p, end)); + + if (p != end) { + ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + goto cleanup; + } + +cleanup: + mbedtls_ecp_group_free(&grp); + mbedtls_ecp_point_free(&G); + + return ret; +} + +/* + * Compute R = +/- X * S mod N, taking care not to leak S + */ +static int ecjpake_mul_secret(mbedtls_mpi *R, int sign, + const mbedtls_mpi *X, + const mbedtls_mpi *S, + const mbedtls_mpi *N, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi b; /* Blinding value, then s + N * blinding */ + + mbedtls_mpi_init(&b); + + /* b = s + rnd-128-bit * N */ + MBEDTLS_MPI_CHK(mbedtls_mpi_fill_random(&b, 16, f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&b, &b, N)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&b, &b, S)); + + /* R = sign * X * b mod N */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(R, X, &b)); + R->s *= sign; + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(R, R, N)); + +cleanup: + mbedtls_mpi_free(&b); + + return ret; +} + +/* + * Generate and write the second round message (S: 7.4.2.5, C: 7.4.2.6) + */ +int mbedtls_ecjpake_write_round_two(mbedtls_ecjpake_context *ctx, + unsigned char *buf, size_t len, size_t *olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_point G; /* C: GA, S: GB */ + mbedtls_ecp_point Xm; /* C: Xc, S: Xs */ + mbedtls_mpi xm; /* C: xc, S: xs */ + unsigned char *p = buf; + const unsigned char *end = buf + len; + size_t ec_len; + + ECJPAKE_VALIDATE_RET(ctx != NULL); + ECJPAKE_VALIDATE_RET(buf != NULL); + ECJPAKE_VALIDATE_RET(olen != NULL); + ECJPAKE_VALIDATE_RET(f_rng != NULL); + + mbedtls_ecp_point_init(&G); + mbedtls_ecp_point_init(&Xm); + mbedtls_mpi_init(&xm); + + /* + * First generate private/public key pair (S: 7.4.2.5.1, C: 7.4.2.6.1) + * + * Client: GA = X1 + X3 + X4 | xs = x2 * s | Xc = xc * GA + * Server: GB = X3 + X1 + X2 | xs = x4 * s | Xs = xs * GB + * Unified: G = Xm1 + Xp1 + Xp2 | xm = xm2 * s | Xm = xm * G + */ + MBEDTLS_MPI_CHK(ecjpake_ecp_add3(&ctx->grp, &G, + &ctx->Xp1, &ctx->Xp2, &ctx->Xm1)); + MBEDTLS_MPI_CHK(ecjpake_mul_secret(&xm, 1, &ctx->xm2, &ctx->s, + &ctx->grp.N, f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_ecp_mul(&ctx->grp, &Xm, &xm, &G, f_rng, p_rng)); + + /* + * Now write things out + * + * struct { + * ECParameters curve_params; // only server writing its message + * ECJPAKEKeyKP ecjpake_key_kp; + * } Client/ServerECJPAKEParams; + */ + if (ctx->role == MBEDTLS_ECJPAKE_SERVER) { + if (end < p) { + ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + goto cleanup; + } + MBEDTLS_MPI_CHK(mbedtls_ecp_tls_write_group(&ctx->grp, &ec_len, + p, end - p)); + p += ec_len; + } + + if (end < p) { + ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + goto cleanup; + } + MBEDTLS_MPI_CHK(mbedtls_ecp_tls_write_point(&ctx->grp, &Xm, + ctx->point_format, &ec_len, p, end - p)); + p += ec_len; + + MBEDTLS_MPI_CHK(ecjpake_zkp_write(ctx->md_info, &ctx->grp, + ctx->point_format, + &G, &xm, &Xm, ID_MINE, + &p, end, f_rng, p_rng)); + + *olen = p - buf; + +cleanup: + mbedtls_ecp_point_free(&G); + mbedtls_ecp_point_free(&Xm); + mbedtls_mpi_free(&xm); + + return ret; +} + +/* + * Derive PMS (7.4.2.7 / 7.4.2.8) + */ +int mbedtls_ecjpake_derive_secret(mbedtls_ecjpake_context *ctx, + unsigned char *buf, size_t len, size_t *olen, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_point K; + mbedtls_mpi m_xm2_s, one; + unsigned char kx[MBEDTLS_ECP_MAX_BYTES]; + size_t x_bytes; + + ECJPAKE_VALIDATE_RET(ctx != NULL); + ECJPAKE_VALIDATE_RET(buf != NULL); + ECJPAKE_VALIDATE_RET(olen != NULL); + ECJPAKE_VALIDATE_RET(f_rng != NULL); + + *olen = mbedtls_md_get_size(ctx->md_info); + if (len < *olen) { + return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + } + + mbedtls_ecp_point_init(&K); + mbedtls_mpi_init(&m_xm2_s); + mbedtls_mpi_init(&one); + + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&one, 1)); + + /* + * Client: K = ( Xs - X4 * x2 * s ) * x2 + * Server: K = ( Xc - X2 * x4 * s ) * x4 + * Unified: K = ( Xp - Xp2 * xm2 * s ) * xm2 + */ + MBEDTLS_MPI_CHK(ecjpake_mul_secret(&m_xm2_s, -1, &ctx->xm2, &ctx->s, + &ctx->grp.N, f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_ecp_muladd(&ctx->grp, &K, + &one, &ctx->Xp, + &m_xm2_s, &ctx->Xp2)); + MBEDTLS_MPI_CHK(mbedtls_ecp_mul(&ctx->grp, &K, &ctx->xm2, &K, + f_rng, p_rng)); + + /* PMS = SHA-256( K.X ) */ + x_bytes = (ctx->grp.pbits + 7) / 8; + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&K.X, kx, x_bytes)); + MBEDTLS_MPI_CHK(mbedtls_md(ctx->md_info, kx, x_bytes, buf)); + +cleanup: + mbedtls_ecp_point_free(&K); + mbedtls_mpi_free(&m_xm2_s); + mbedtls_mpi_free(&one); + + return ret; +} + +#undef ID_MINE +#undef ID_PEER + +#endif /* ! MBEDTLS_ECJPAKE_ALT */ + +#if defined(MBEDTLS_SELF_TEST) + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \ + !defined(MBEDTLS_SHA256_C) +int mbedtls_ecjpake_self_test(int verbose) +{ + (void) verbose; + return 0; +} +#else + +static const unsigned char ecjpake_test_password[] = { + 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x6a, 0x70, 0x61, 0x6b, 0x65, 0x74, + 0x65, 0x73, 0x74 +}; + +#if !defined(MBEDTLS_ECJPAKE_ALT) + +static const unsigned char ecjpake_test_x1[] = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, + 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x21 +}; + +static const unsigned char ecjpake_test_x2[] = { + 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, + 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x81 +}; + +static const unsigned char ecjpake_test_x3[] = { + 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, + 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x81 +}; + +static const unsigned char ecjpake_test_x4[] = { + 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, + 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, + 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe1 +}; + +static const unsigned char ecjpake_test_cli_one[] = { + 0x41, 0x04, 0xac, 0xcf, 0x01, 0x06, 0xef, 0x85, 0x8f, 0xa2, 0xd9, 0x19, + 0x33, 0x13, 0x46, 0x80, 0x5a, 0x78, 0xb5, 0x8b, 0xba, 0xd0, 0xb8, 0x44, + 0xe5, 0xc7, 0x89, 0x28, 0x79, 0x14, 0x61, 0x87, 0xdd, 0x26, 0x66, 0xad, + 0xa7, 0x81, 0xbb, 0x7f, 0x11, 0x13, 0x72, 0x25, 0x1a, 0x89, 0x10, 0x62, + 0x1f, 0x63, 0x4d, 0xf1, 0x28, 0xac, 0x48, 0xe3, 0x81, 0xfd, 0x6e, 0xf9, + 0x06, 0x07, 0x31, 0xf6, 0x94, 0xa4, 0x41, 0x04, 0x1d, 0xd0, 0xbd, 0x5d, + 0x45, 0x66, 0xc9, 0xbe, 0xd9, 0xce, 0x7d, 0xe7, 0x01, 0xb5, 0xe8, 0x2e, + 0x08, 0xe8, 0x4b, 0x73, 0x04, 0x66, 0x01, 0x8a, 0xb9, 0x03, 0xc7, 0x9e, + 0xb9, 0x82, 0x17, 0x22, 0x36, 0xc0, 0xc1, 0x72, 0x8a, 0xe4, 0xbf, 0x73, + 0x61, 0x0d, 0x34, 0xde, 0x44, 0x24, 0x6e, 0xf3, 0xd9, 0xc0, 0x5a, 0x22, + 0x36, 0xfb, 0x66, 0xa6, 0x58, 0x3d, 0x74, 0x49, 0x30, 0x8b, 0xab, 0xce, + 0x20, 0x72, 0xfe, 0x16, 0x66, 0x29, 0x92, 0xe9, 0x23, 0x5c, 0x25, 0x00, + 0x2f, 0x11, 0xb1, 0x50, 0x87, 0xb8, 0x27, 0x38, 0xe0, 0x3c, 0x94, 0x5b, + 0xf7, 0xa2, 0x99, 0x5d, 0xda, 0x1e, 0x98, 0x34, 0x58, 0x41, 0x04, 0x7e, + 0xa6, 0xe3, 0xa4, 0x48, 0x70, 0x37, 0xa9, 0xe0, 0xdb, 0xd7, 0x92, 0x62, + 0xb2, 0xcc, 0x27, 0x3e, 0x77, 0x99, 0x30, 0xfc, 0x18, 0x40, 0x9a, 0xc5, + 0x36, 0x1c, 0x5f, 0xe6, 0x69, 0xd7, 0x02, 0xe1, 0x47, 0x79, 0x0a, 0xeb, + 0x4c, 0xe7, 0xfd, 0x65, 0x75, 0xab, 0x0f, 0x6c, 0x7f, 0xd1, 0xc3, 0x35, + 0x93, 0x9a, 0xa8, 0x63, 0xba, 0x37, 0xec, 0x91, 0xb7, 0xe3, 0x2b, 0xb0, + 0x13, 0xbb, 0x2b, 0x41, 0x04, 0xa4, 0x95, 0x58, 0xd3, 0x2e, 0xd1, 0xeb, + 0xfc, 0x18, 0x16, 0xaf, 0x4f, 0xf0, 0x9b, 0x55, 0xfc, 0xb4, 0xca, 0x47, + 0xb2, 0xa0, 0x2d, 0x1e, 0x7c, 0xaf, 0x11, 0x79, 0xea, 0x3f, 0xe1, 0x39, + 0x5b, 0x22, 0xb8, 0x61, 0x96, 0x40, 0x16, 0xfa, 0xba, 0xf7, 0x2c, 0x97, + 0x56, 0x95, 0xd9, 0x3d, 0x4d, 0xf0, 0xe5, 0x19, 0x7f, 0xe9, 0xf0, 0x40, + 0x63, 0x4e, 0xd5, 0x97, 0x64, 0x93, 0x77, 0x87, 0xbe, 0x20, 0xbc, 0x4d, + 0xee, 0xbb, 0xf9, 0xb8, 0xd6, 0x0a, 0x33, 0x5f, 0x04, 0x6c, 0xa3, 0xaa, + 0x94, 0x1e, 0x45, 0x86, 0x4c, 0x7c, 0xad, 0xef, 0x9c, 0xf7, 0x5b, 0x3d, + 0x8b, 0x01, 0x0e, 0x44, 0x3e, 0xf0 +}; + +static const unsigned char ecjpake_test_srv_one[] = { + 0x41, 0x04, 0x7e, 0xa6, 0xe3, 0xa4, 0x48, 0x70, 0x37, 0xa9, 0xe0, 0xdb, + 0xd7, 0x92, 0x62, 0xb2, 0xcc, 0x27, 0x3e, 0x77, 0x99, 0x30, 0xfc, 0x18, + 0x40, 0x9a, 0xc5, 0x36, 0x1c, 0x5f, 0xe6, 0x69, 0xd7, 0x02, 0xe1, 0x47, + 0x79, 0x0a, 0xeb, 0x4c, 0xe7, 0xfd, 0x65, 0x75, 0xab, 0x0f, 0x6c, 0x7f, + 0xd1, 0xc3, 0x35, 0x93, 0x9a, 0xa8, 0x63, 0xba, 0x37, 0xec, 0x91, 0xb7, + 0xe3, 0x2b, 0xb0, 0x13, 0xbb, 0x2b, 0x41, 0x04, 0x09, 0xf8, 0x5b, 0x3d, + 0x20, 0xeb, 0xd7, 0x88, 0x5c, 0xe4, 0x64, 0xc0, 0x8d, 0x05, 0x6d, 0x64, + 0x28, 0xfe, 0x4d, 0xd9, 0x28, 0x7a, 0xa3, 0x65, 0xf1, 0x31, 0xf4, 0x36, + 0x0f, 0xf3, 0x86, 0xd8, 0x46, 0x89, 0x8b, 0xc4, 0xb4, 0x15, 0x83, 0xc2, + 0xa5, 0x19, 0x7f, 0x65, 0xd7, 0x87, 0x42, 0x74, 0x6c, 0x12, 0xa5, 0xec, + 0x0a, 0x4f, 0xfe, 0x2f, 0x27, 0x0a, 0x75, 0x0a, 0x1d, 0x8f, 0xb5, 0x16, + 0x20, 0x93, 0x4d, 0x74, 0xeb, 0x43, 0xe5, 0x4d, 0xf4, 0x24, 0xfd, 0x96, + 0x30, 0x6c, 0x01, 0x17, 0xbf, 0x13, 0x1a, 0xfa, 0xbf, 0x90, 0xa9, 0xd3, + 0x3d, 0x11, 0x98, 0xd9, 0x05, 0x19, 0x37, 0x35, 0x14, 0x41, 0x04, 0x19, + 0x0a, 0x07, 0x70, 0x0f, 0xfa, 0x4b, 0xe6, 0xae, 0x1d, 0x79, 0xee, 0x0f, + 0x06, 0xae, 0xb5, 0x44, 0xcd, 0x5a, 0xdd, 0xaa, 0xbe, 0xdf, 0x70, 0xf8, + 0x62, 0x33, 0x21, 0x33, 0x2c, 0x54, 0xf3, 0x55, 0xf0, 0xfb, 0xfe, 0xc7, + 0x83, 0xed, 0x35, 0x9e, 0x5d, 0x0b, 0xf7, 0x37, 0x7a, 0x0f, 0xc4, 0xea, + 0x7a, 0xce, 0x47, 0x3c, 0x9c, 0x11, 0x2b, 0x41, 0xcc, 0xd4, 0x1a, 0xc5, + 0x6a, 0x56, 0x12, 0x41, 0x04, 0x36, 0x0a, 0x1c, 0xea, 0x33, 0xfc, 0xe6, + 0x41, 0x15, 0x64, 0x58, 0xe0, 0xa4, 0xea, 0xc2, 0x19, 0xe9, 0x68, 0x31, + 0xe6, 0xae, 0xbc, 0x88, 0xb3, 0xf3, 0x75, 0x2f, 0x93, 0xa0, 0x28, 0x1d, + 0x1b, 0xf1, 0xfb, 0x10, 0x60, 0x51, 0xdb, 0x96, 0x94, 0xa8, 0xd6, 0xe8, + 0x62, 0xa5, 0xef, 0x13, 0x24, 0xa3, 0xd9, 0xe2, 0x78, 0x94, 0xf1, 0xee, + 0x4f, 0x7c, 0x59, 0x19, 0x99, 0x65, 0xa8, 0xdd, 0x4a, 0x20, 0x91, 0x84, + 0x7d, 0x2d, 0x22, 0xdf, 0x3e, 0xe5, 0x5f, 0xaa, 0x2a, 0x3f, 0xb3, 0x3f, + 0xd2, 0xd1, 0xe0, 0x55, 0xa0, 0x7a, 0x7c, 0x61, 0xec, 0xfb, 0x8d, 0x80, + 0xec, 0x00, 0xc2, 0xc9, 0xeb, 0x12 +}; + +static const unsigned char ecjpake_test_srv_two[] = { + 0x03, 0x00, 0x17, 0x41, 0x04, 0x0f, 0xb2, 0x2b, 0x1d, 0x5d, 0x11, 0x23, + 0xe0, 0xef, 0x9f, 0xeb, 0x9d, 0x8a, 0x2e, 0x59, 0x0a, 0x1f, 0x4d, 0x7c, + 0xed, 0x2c, 0x2b, 0x06, 0x58, 0x6e, 0x8f, 0x2a, 0x16, 0xd4, 0xeb, 0x2f, + 0xda, 0x43, 0x28, 0xa2, 0x0b, 0x07, 0xd8, 0xfd, 0x66, 0x76, 0x54, 0xca, + 0x18, 0xc5, 0x4e, 0x32, 0xa3, 0x33, 0xa0, 0x84, 0x54, 0x51, 0xe9, 0x26, + 0xee, 0x88, 0x04, 0xfd, 0x7a, 0xf0, 0xaa, 0xa7, 0xa6, 0x41, 0x04, 0x55, + 0x16, 0xea, 0x3e, 0x54, 0xa0, 0xd5, 0xd8, 0xb2, 0xce, 0x78, 0x6b, 0x38, + 0xd3, 0x83, 0x37, 0x00, 0x29, 0xa5, 0xdb, 0xe4, 0x45, 0x9c, 0x9d, 0xd6, + 0x01, 0xb4, 0x08, 0xa2, 0x4a, 0xe6, 0x46, 0x5c, 0x8a, 0xc9, 0x05, 0xb9, + 0xeb, 0x03, 0xb5, 0xd3, 0x69, 0x1c, 0x13, 0x9e, 0xf8, 0x3f, 0x1c, 0xd4, + 0x20, 0x0f, 0x6c, 0x9c, 0xd4, 0xec, 0x39, 0x22, 0x18, 0xa5, 0x9e, 0xd2, + 0x43, 0xd3, 0xc8, 0x20, 0xff, 0x72, 0x4a, 0x9a, 0x70, 0xb8, 0x8c, 0xb8, + 0x6f, 0x20, 0xb4, 0x34, 0xc6, 0x86, 0x5a, 0xa1, 0xcd, 0x79, 0x06, 0xdd, + 0x7c, 0x9b, 0xce, 0x35, 0x25, 0xf5, 0x08, 0x27, 0x6f, 0x26, 0x83, 0x6c +}; + +static const unsigned char ecjpake_test_cli_two[] = { + 0x41, 0x04, 0x69, 0xd5, 0x4e, 0xe8, 0x5e, 0x90, 0xce, 0x3f, 0x12, 0x46, + 0x74, 0x2d, 0xe5, 0x07, 0xe9, 0x39, 0xe8, 0x1d, 0x1d, 0xc1, 0xc5, 0xcb, + 0x98, 0x8b, 0x58, 0xc3, 0x10, 0xc9, 0xfd, 0xd9, 0x52, 0x4d, 0x93, 0x72, + 0x0b, 0x45, 0x54, 0x1c, 0x83, 0xee, 0x88, 0x41, 0x19, 0x1d, 0xa7, 0xce, + 0xd8, 0x6e, 0x33, 0x12, 0xd4, 0x36, 0x23, 0xc1, 0xd6, 0x3e, 0x74, 0x98, + 0x9a, 0xba, 0x4a, 0xff, 0xd1, 0xee, 0x41, 0x04, 0x07, 0x7e, 0x8c, 0x31, + 0xe2, 0x0e, 0x6b, 0xed, 0xb7, 0x60, 0xc1, 0x35, 0x93, 0xe6, 0x9f, 0x15, + 0xbe, 0x85, 0xc2, 0x7d, 0x68, 0xcd, 0x09, 0xcc, 0xb8, 0xc4, 0x18, 0x36, + 0x08, 0x91, 0x7c, 0x5c, 0x3d, 0x40, 0x9f, 0xac, 0x39, 0xfe, 0xfe, 0xe8, + 0x2f, 0x72, 0x92, 0xd3, 0x6f, 0x0d, 0x23, 0xe0, 0x55, 0x91, 0x3f, 0x45, + 0xa5, 0x2b, 0x85, 0xdd, 0x8a, 0x20, 0x52, 0xe9, 0xe1, 0x29, 0xbb, 0x4d, + 0x20, 0x0f, 0x01, 0x1f, 0x19, 0x48, 0x35, 0x35, 0xa6, 0xe8, 0x9a, 0x58, + 0x0c, 0x9b, 0x00, 0x03, 0xba, 0xf2, 0x14, 0x62, 0xec, 0xe9, 0x1a, 0x82, + 0xcc, 0x38, 0xdb, 0xdc, 0xae, 0x60, 0xd9, 0xc5, 0x4c +}; + +static const unsigned char ecjpake_test_pms[] = { + 0xf3, 0xd4, 0x7f, 0x59, 0x98, 0x44, 0xdb, 0x92, 0xa5, 0x69, 0xbb, 0xe7, + 0x98, 0x1e, 0x39, 0xd9, 0x31, 0xfd, 0x74, 0x3b, 0xf2, 0x2e, 0x98, 0xf9, + 0xb4, 0x38, 0xf7, 0x19, 0xd3, 0xc4, 0xf3, 0x51 +}; + +/* Load my private keys and generate the corresponding public keys */ +static int ecjpake_test_load(mbedtls_ecjpake_context *ctx, + const unsigned char *xm1, size_t len1, + const unsigned char *xm2, size_t len2) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&ctx->xm1, xm1, len1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&ctx->xm2, xm2, len2)); + MBEDTLS_MPI_CHK(mbedtls_ecp_mul(&ctx->grp, &ctx->Xm1, &ctx->xm1, + &ctx->grp.G, NULL, NULL)); + MBEDTLS_MPI_CHK(mbedtls_ecp_mul(&ctx->grp, &ctx->Xm2, &ctx->xm2, + &ctx->grp.G, NULL, NULL)); + +cleanup: + return ret; +} + +#endif /* ! MBEDTLS_ECJPAKE_ALT */ + +/* For tests we don't need a secure RNG; + * use the LGC from Numerical Recipes for simplicity */ +static int ecjpake_lgc(void *p, unsigned char *out, size_t len) +{ + static uint32_t x = 42; + (void) p; + + while (len > 0) { + size_t use_len = len > 4 ? 4 : len; + x = 1664525 * x + 1013904223; + memcpy(out, &x, use_len); + out += use_len; + len -= use_len; + } + + return 0; +} + +#define TEST_ASSERT(x) \ + do { \ + if (x) \ + ret = 0; \ + else \ + { \ + ret = 1; \ + goto cleanup; \ + } \ + } while (0) + +/* + * Checkup routine + */ +int mbedtls_ecjpake_self_test(int verbose) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecjpake_context cli; + mbedtls_ecjpake_context srv; + unsigned char buf[512], pms[32]; + size_t len, pmslen; + + mbedtls_ecjpake_init(&cli); + mbedtls_ecjpake_init(&srv); + + if (verbose != 0) { + mbedtls_printf(" ECJPAKE test #0 (setup): "); + } + + TEST_ASSERT(mbedtls_ecjpake_setup(&cli, MBEDTLS_ECJPAKE_CLIENT, + MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1, + ecjpake_test_password, + sizeof(ecjpake_test_password)) == 0); + + TEST_ASSERT(mbedtls_ecjpake_setup(&srv, MBEDTLS_ECJPAKE_SERVER, + MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1, + ecjpake_test_password, + sizeof(ecjpake_test_password)) == 0); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + if (verbose != 0) { + mbedtls_printf(" ECJPAKE test #1 (random handshake): "); + } + + TEST_ASSERT(mbedtls_ecjpake_write_round_one(&cli, + buf, sizeof(buf), &len, ecjpake_lgc, NULL) == 0); + + TEST_ASSERT(mbedtls_ecjpake_read_round_one(&srv, buf, len) == 0); + + TEST_ASSERT(mbedtls_ecjpake_write_round_one(&srv, + buf, sizeof(buf), &len, ecjpake_lgc, NULL) == 0); + + TEST_ASSERT(mbedtls_ecjpake_read_round_one(&cli, buf, len) == 0); + + TEST_ASSERT(mbedtls_ecjpake_write_round_two(&srv, + buf, sizeof(buf), &len, ecjpake_lgc, NULL) == 0); + + TEST_ASSERT(mbedtls_ecjpake_read_round_two(&cli, buf, len) == 0); + + TEST_ASSERT(mbedtls_ecjpake_derive_secret(&cli, + pms, sizeof(pms), &pmslen, ecjpake_lgc, NULL) == 0); + + TEST_ASSERT(mbedtls_ecjpake_write_round_two(&cli, + buf, sizeof(buf), &len, ecjpake_lgc, NULL) == 0); + + TEST_ASSERT(mbedtls_ecjpake_read_round_two(&srv, buf, len) == 0); + + TEST_ASSERT(mbedtls_ecjpake_derive_secret(&srv, + buf, sizeof(buf), &len, ecjpake_lgc, NULL) == 0); + + TEST_ASSERT(len == pmslen); + TEST_ASSERT(memcmp(buf, pms, len) == 0); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + +#if !defined(MBEDTLS_ECJPAKE_ALT) + /* 'reference handshake' tests can only be run against implementations + * for which we have 100% control over how the random ephemeral keys + * are generated. This is only the case for the internal Mbed TLS + * implementation, so these tests are skipped in case the internal + * implementation is swapped out for an alternative one. */ + if (verbose != 0) { + mbedtls_printf(" ECJPAKE test #2 (reference handshake): "); + } + + /* Simulate generation of round one */ + MBEDTLS_MPI_CHK(ecjpake_test_load(&cli, + ecjpake_test_x1, sizeof(ecjpake_test_x1), + ecjpake_test_x2, sizeof(ecjpake_test_x2))); + + MBEDTLS_MPI_CHK(ecjpake_test_load(&srv, + ecjpake_test_x3, sizeof(ecjpake_test_x3), + ecjpake_test_x4, sizeof(ecjpake_test_x4))); + + /* Read round one */ + TEST_ASSERT(mbedtls_ecjpake_read_round_one(&srv, + ecjpake_test_cli_one, + sizeof(ecjpake_test_cli_one)) == 0); + + TEST_ASSERT(mbedtls_ecjpake_read_round_one(&cli, + ecjpake_test_srv_one, + sizeof(ecjpake_test_srv_one)) == 0); + + /* Skip generation of round two, read round two */ + TEST_ASSERT(mbedtls_ecjpake_read_round_two(&cli, + ecjpake_test_srv_two, + sizeof(ecjpake_test_srv_two)) == 0); + + TEST_ASSERT(mbedtls_ecjpake_read_round_two(&srv, + ecjpake_test_cli_two, + sizeof(ecjpake_test_cli_two)) == 0); + + /* Server derives PMS */ + TEST_ASSERT(mbedtls_ecjpake_derive_secret(&srv, + buf, sizeof(buf), &len, ecjpake_lgc, NULL) == 0); + + TEST_ASSERT(len == sizeof(ecjpake_test_pms)); + TEST_ASSERT(memcmp(buf, ecjpake_test_pms, len) == 0); + + memset(buf, 0, len); /* Avoid interferences with next step */ + + /* Client derives PMS */ + TEST_ASSERT(mbedtls_ecjpake_derive_secret(&cli, + buf, sizeof(buf), &len, ecjpake_lgc, NULL) == 0); + + TEST_ASSERT(len == sizeof(ecjpake_test_pms)); + TEST_ASSERT(memcmp(buf, ecjpake_test_pms, len) == 0); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } +#endif /* ! MBEDTLS_ECJPAKE_ALT */ + +cleanup: + mbedtls_ecjpake_free(&cli); + mbedtls_ecjpake_free(&srv); + + if (ret != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return ret; +} + +#undef TEST_ASSERT + +#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED && MBEDTLS_SHA256_C */ + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_ECJPAKE_C */ diff --git a/ext/opcua_client/mbedtls/library/ecp.c b/ext/opcua_client/mbedtls/library/ecp.c new file mode 100644 index 0000000..2ed735d --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ecp.c @@ -0,0 +1,3647 @@ +/* + * Elliptic curves over GF(p): generic functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * References: + * + * SEC1 https://www.secg.org/sec1-v2.pdf + * GECC = Guide to Elliptic Curve Cryptography - Hankerson, Menezes, Vanstone + * FIPS 186-3 http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf + * RFC 4492 for the related TLS structures and constants + * - https://www.rfc-editor.org/rfc/rfc4492 + * RFC 7748 for the Curve448 and Curve25519 curve definitions + * - https://www.rfc-editor.org/rfc/rfc7748 + * + * [Curve25519] https://cr.yp.to/ecdh/curve25519-20060209.pdf + * + * [2] CORON, Jean-S'ebastien. Resistance against differential power analysis + * for elliptic curve cryptosystems. In : Cryptographic Hardware and + * Embedded Systems. Springer Berlin Heidelberg, 1999. p. 292-302. + * + * + * [3] HEDABOU, Mustapha, PINEL, Pierre, et B'EN'ETEAU, Lucien. A comb method to + * render ECC resistant against Side Channel Attacks. IACR Cryptology + * ePrint Archive, 2004, vol. 2004, p. 342. + * + */ + +#include "common.h" + +/** + * \brief Function level alternative implementation. + * + * The MBEDTLS_ECP_INTERNAL_ALT macro enables alternative implementations to + * replace certain functions in this module. The alternative implementations are + * typically hardware accelerators and need to activate the hardware before the + * computation starts and deactivate it after it finishes. The + * mbedtls_internal_ecp_init() and mbedtls_internal_ecp_free() functions serve + * this purpose. + * + * To preserve the correct functionality the following conditions must hold: + * + * - The alternative implementation must be activated by + * mbedtls_internal_ecp_init() before any of the replaceable functions is + * called. + * - mbedtls_internal_ecp_free() must \b only be called when the alternative + * implementation is activated. + * - mbedtls_internal_ecp_init() must \b not be called when the alternative + * implementation is activated. + * - Public functions must not return while the alternative implementation is + * activated. + * - Replaceable functions are guarded by \c MBEDTLS_ECP_XXX_ALT macros and + * before calling them an \code if( mbedtls_internal_ecp_grp_capable( grp ) ) + * \endcode ensures that the alternative implementation supports the current + * group. + */ +#if defined(MBEDTLS_ECP_INTERNAL_ALT) +#endif + +#if defined(MBEDTLS_ECP_C) + +#include "mbedtls/ecp.h" +#include "mbedtls/threading.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" +#include "mbedtls/bn_mul.h" + +#include "ecp_invasive.h" + +#include + +#if !defined(MBEDTLS_ECP_ALT) + +/* Parameter validation macros based on platform_util.h */ +#define ECP_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA) +#define ECP_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +#include "mbedtls/platform.h" + +#include "mbedtls/ecp_internal.h" + +#if !defined(MBEDTLS_ECP_NO_INTERNAL_RNG) +#if defined(MBEDTLS_HMAC_DRBG_C) +#include "mbedtls/hmac_drbg.h" +#elif defined(MBEDTLS_CTR_DRBG_C) +#include "mbedtls/ctr_drbg.h" +#else +#error \ + "Invalid configuration detected. Include check_config.h to ensure that the configuration is valid." +#endif +#endif /* MBEDTLS_ECP_NO_INTERNAL_RNG */ + +#if defined(MBEDTLS_SELF_TEST) +/* + * Counts of point addition and doubling, and field multiplications. + * Used to test resistance of point multiplication to simple timing attacks. + */ +static unsigned long add_count, dbl_count, mul_count; +#endif + +#if !defined(MBEDTLS_ECP_NO_INTERNAL_RNG) +/* + * Currently ecp_mul() takes a RNG function as an argument, used for + * side-channel protection, but it can be NULL. The initial reasoning was + * that people will pass non-NULL RNG when they care about side-channels, but + * unfortunately we have some APIs that call ecp_mul() with a NULL RNG, with + * no opportunity for the user to do anything about it. + * + * The obvious strategies for addressing that include: + * - change those APIs so that they take RNG arguments; + * - require a global RNG to be available to all crypto modules. + * + * Unfortunately those would break compatibility. So what we do instead is + * have our own internal DRBG instance, seeded from the secret scalar. + * + * The following is a light-weight abstraction layer for doing that with + * HMAC_DRBG (first choice) or CTR_DRBG. + */ + +#if defined(MBEDTLS_HMAC_DRBG_C) + +/* DRBG context type */ +typedef mbedtls_hmac_drbg_context ecp_drbg_context; + +/* DRBG context init */ +static inline void ecp_drbg_init(ecp_drbg_context *ctx) +{ + mbedtls_hmac_drbg_init(ctx); +} + +/* DRBG context free */ +static inline void ecp_drbg_free(ecp_drbg_context *ctx) +{ + mbedtls_hmac_drbg_free(ctx); +} + +/* DRBG function */ +static inline int ecp_drbg_random(void *p_rng, + unsigned char *output, size_t output_len) +{ + return mbedtls_hmac_drbg_random(p_rng, output, output_len); +} + +/* DRBG context seeding */ +static int ecp_drbg_seed(ecp_drbg_context *ctx, + const mbedtls_mpi *secret, size_t secret_len) +{ + int ret; + unsigned char secret_bytes[MBEDTLS_ECP_MAX_BYTES]; + /* The list starts with strong hashes */ + const mbedtls_md_type_t md_type = + (mbedtls_md_type_t) (mbedtls_md_list()[0]); + const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type); + + if (secret_len > MBEDTLS_ECP_MAX_BYTES) { + ret = MBEDTLS_ERR_ECP_RANDOM_FAILED; + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(secret, + secret_bytes, secret_len)); + + ret = mbedtls_hmac_drbg_seed_buf(ctx, md_info, secret_bytes, secret_len); + +cleanup: + mbedtls_platform_zeroize(secret_bytes, secret_len); + + return ret; +} + +#elif defined(MBEDTLS_CTR_DRBG_C) + +/* DRBG context type */ +typedef mbedtls_ctr_drbg_context ecp_drbg_context; + +/* DRBG context init */ +static inline void ecp_drbg_init(ecp_drbg_context *ctx) +{ + mbedtls_ctr_drbg_init(ctx); +} + +/* DRBG context free */ +static inline void ecp_drbg_free(ecp_drbg_context *ctx) +{ + mbedtls_ctr_drbg_free(ctx); +} + +/* DRBG function */ +static inline int ecp_drbg_random(void *p_rng, + unsigned char *output, size_t output_len) +{ + return mbedtls_ctr_drbg_random(p_rng, output, output_len); +} + +/* + * Since CTR_DRBG doesn't have a seed_buf() function the way HMAC_DRBG does, + * we need to pass an entropy function when seeding. So we use a dummy + * function for that, and pass the actual entropy as customisation string. + * (During seeding of CTR_DRBG the entropy input and customisation string are + * concatenated before being used to update the secret state.) + */ +static int ecp_ctr_drbg_null_entropy(void *ctx, unsigned char *out, size_t len) +{ + (void) ctx; + memset(out, 0, len); + return 0; +} + +/* DRBG context seeding */ +static int ecp_drbg_seed(ecp_drbg_context *ctx, + const mbedtls_mpi *secret, size_t secret_len) +{ + int ret; + unsigned char secret_bytes[MBEDTLS_ECP_MAX_BYTES]; + + if (secret_len > MBEDTLS_ECP_MAX_BYTES) { + ret = MBEDTLS_ERR_ECP_RANDOM_FAILED; + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(secret, + secret_bytes, secret_len)); + + ret = mbedtls_ctr_drbg_seed(ctx, ecp_ctr_drbg_null_entropy, NULL, + secret_bytes, secret_len); + +cleanup: + mbedtls_platform_zeroize(secret_bytes, secret_len); + + return ret; +} + +#else +#error \ + "Invalid configuration detected. Include check_config.h to ensure that the configuration is valid." +#endif /* DRBG modules */ +#endif /* MBEDTLS_ECP_NO_INTERNAL_RNG */ + +#if defined(MBEDTLS_ECP_RESTARTABLE) +/* + * Maximum number of "basic operations" to be done in a row. + * + * Default value 0 means that ECC operations will not yield. + * Note that regardless of the value of ecp_max_ops, always at + * least one step is performed before yielding. + * + * Setting ecp_max_ops=1 can be suitable for testing purposes + * as it will interrupt computation at all possible points. + */ +static unsigned ecp_max_ops = 0; + +/* + * Set ecp_max_ops + */ +void mbedtls_ecp_set_max_ops(unsigned max_ops) +{ + ecp_max_ops = max_ops; +} + +/* + * Check if restart is enabled + */ +int mbedtls_ecp_restart_is_enabled(void) +{ + return ecp_max_ops != 0; +} + +/* + * Restart sub-context for ecp_mul_comb() + */ +struct mbedtls_ecp_restart_mul { + mbedtls_ecp_point R; /* current intermediate result */ + size_t i; /* current index in various loops, 0 outside */ + mbedtls_ecp_point *T; /* table for precomputed points */ + unsigned char T_size; /* number of points in table T */ + enum { /* what were we doing last time we returned? */ + ecp_rsm_init = 0, /* nothing so far, dummy initial state */ + ecp_rsm_pre_dbl, /* precompute 2^n multiples */ + ecp_rsm_pre_norm_dbl, /* normalize precomputed 2^n multiples */ + ecp_rsm_pre_add, /* precompute remaining points by adding */ + ecp_rsm_pre_norm_add, /* normalize all precomputed points */ + ecp_rsm_comb_core, /* ecp_mul_comb_core() */ + ecp_rsm_final_norm, /* do the final normalization */ + } state; +#if !defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + ecp_drbg_context drbg_ctx; + unsigned char drbg_seeded; +#endif +}; + +/* + * Init restart_mul sub-context + */ +static void ecp_restart_rsm_init(mbedtls_ecp_restart_mul_ctx *ctx) +{ + mbedtls_ecp_point_init(&ctx->R); + ctx->i = 0; + ctx->T = NULL; + ctx->T_size = 0; + ctx->state = ecp_rsm_init; +#if !defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + ecp_drbg_init(&ctx->drbg_ctx); + ctx->drbg_seeded = 0; +#endif +} + +/* + * Free the components of a restart_mul sub-context + */ +static void ecp_restart_rsm_free(mbedtls_ecp_restart_mul_ctx *ctx) +{ + unsigned char i; + + if (ctx == NULL) { + return; + } + + mbedtls_ecp_point_free(&ctx->R); + + if (ctx->T != NULL) { + for (i = 0; i < ctx->T_size; i++) { + mbedtls_ecp_point_free(ctx->T + i); + } + mbedtls_free(ctx->T); + } + +#if !defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + ecp_drbg_free(&ctx->drbg_ctx); +#endif + + ecp_restart_rsm_init(ctx); +} + +/* + * Restart context for ecp_muladd() + */ +struct mbedtls_ecp_restart_muladd { + mbedtls_ecp_point mP; /* mP value */ + mbedtls_ecp_point R; /* R intermediate result */ + enum { /* what should we do next? */ + ecp_rsma_mul1 = 0, /* first multiplication */ + ecp_rsma_mul2, /* second multiplication */ + ecp_rsma_add, /* addition */ + ecp_rsma_norm, /* normalization */ + } state; +}; + +/* + * Init restart_muladd sub-context + */ +static void ecp_restart_ma_init(mbedtls_ecp_restart_muladd_ctx *ctx) +{ + mbedtls_ecp_point_init(&ctx->mP); + mbedtls_ecp_point_init(&ctx->R); + ctx->state = ecp_rsma_mul1; +} + +/* + * Free the components of a restart_muladd sub-context + */ +static void ecp_restart_ma_free(mbedtls_ecp_restart_muladd_ctx *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_ecp_point_free(&ctx->mP); + mbedtls_ecp_point_free(&ctx->R); + + ecp_restart_ma_init(ctx); +} + +/* + * Initialize a restart context + */ +void mbedtls_ecp_restart_init(mbedtls_ecp_restart_ctx *ctx) +{ + ECP_VALIDATE(ctx != NULL); + ctx->ops_done = 0; + ctx->depth = 0; + ctx->rsm = NULL; + ctx->ma = NULL; +} + +/* + * Free the components of a restart context + */ +void mbedtls_ecp_restart_free(mbedtls_ecp_restart_ctx *ctx) +{ + if (ctx == NULL) { + return; + } + + ecp_restart_rsm_free(ctx->rsm); + mbedtls_free(ctx->rsm); + + ecp_restart_ma_free(ctx->ma); + mbedtls_free(ctx->ma); + + mbedtls_ecp_restart_init(ctx); +} + +/* + * Check if we can do the next step + */ +int mbedtls_ecp_check_budget(const mbedtls_ecp_group *grp, + mbedtls_ecp_restart_ctx *rs_ctx, + unsigned ops) +{ + ECP_VALIDATE_RET(grp != NULL); + + if (rs_ctx != NULL && ecp_max_ops != 0) { + /* scale depending on curve size: the chosen reference is 256-bit, + * and multiplication is quadratic. Round to the closest integer. */ + if (grp->pbits >= 512) { + ops *= 4; + } else if (grp->pbits >= 384) { + ops *= 2; + } + + /* Avoid infinite loops: always allow first step. + * Because of that, however, it's not generally true + * that ops_done <= ecp_max_ops, so the check + * ops_done > ecp_max_ops below is mandatory. */ + if ((rs_ctx->ops_done != 0) && + (rs_ctx->ops_done > ecp_max_ops || + ops > ecp_max_ops - rs_ctx->ops_done)) { + return MBEDTLS_ERR_ECP_IN_PROGRESS; + } + + /* update running count */ + rs_ctx->ops_done += ops; + } + + return 0; +} + +/* Call this when entering a function that needs its own sub-context */ +#define ECP_RS_ENTER(SUB) do { \ + /* reset ops count for this call if top-level */ \ + if (rs_ctx != NULL && rs_ctx->depth++ == 0) \ + rs_ctx->ops_done = 0; \ + \ + /* set up our own sub-context if needed */ \ + if (mbedtls_ecp_restart_is_enabled() && \ + rs_ctx != NULL && rs_ctx->SUB == NULL) \ + { \ + rs_ctx->SUB = mbedtls_calloc(1, sizeof(*rs_ctx->SUB)); \ + if (rs_ctx->SUB == NULL) \ + return MBEDTLS_ERR_ECP_ALLOC_FAILED; \ + \ + ecp_restart_## SUB ##_init(rs_ctx->SUB); \ + } \ +} while (0) + +/* Call this when leaving a function that needs its own sub-context */ +#define ECP_RS_LEAVE(SUB) do { \ + /* clear our sub-context when not in progress (done or error) */ \ + if (rs_ctx != NULL && rs_ctx->SUB != NULL && \ + ret != MBEDTLS_ERR_ECP_IN_PROGRESS) \ + { \ + ecp_restart_## SUB ##_free(rs_ctx->SUB); \ + mbedtls_free(rs_ctx->SUB); \ + rs_ctx->SUB = NULL; \ + } \ + \ + if (rs_ctx != NULL) \ + rs_ctx->depth--; \ +} while (0) + +#else /* MBEDTLS_ECP_RESTARTABLE */ + +#define ECP_RS_ENTER(sub) (void) rs_ctx; +#define ECP_RS_LEAVE(sub) (void) rs_ctx; + +#endif /* MBEDTLS_ECP_RESTARTABLE */ + +/* + * List of supported curves: + * - internal ID + * - TLS NamedCurve ID (RFC 4492 sec. 5.1.1, RFC 7071 sec. 2, RFC 8446 sec. 4.2.7) + * - size in bits + * - readable name + * + * Curves are listed in order: largest curves first, and for a given size, + * fastest curves first. This provides the default order for the SSL module. + * + * Reminder: update profiles in x509_crt.c when adding a new curves! + */ +static const mbedtls_ecp_curve_info ecp_supported_curves[] = +{ +#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) + { MBEDTLS_ECP_DP_SECP521R1, 25, 521, "secp521r1" }, +#endif +#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) + { MBEDTLS_ECP_DP_BP512R1, 28, 512, "brainpoolP512r1" }, +#endif +#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) + { MBEDTLS_ECP_DP_SECP384R1, 24, 384, "secp384r1" }, +#endif +#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) + { MBEDTLS_ECP_DP_BP384R1, 27, 384, "brainpoolP384r1" }, +#endif +#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) + { MBEDTLS_ECP_DP_SECP256R1, 23, 256, "secp256r1" }, +#endif +#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) + { MBEDTLS_ECP_DP_SECP256K1, 22, 256, "secp256k1" }, +#endif +#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) + { MBEDTLS_ECP_DP_BP256R1, 26, 256, "brainpoolP256r1" }, +#endif +#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) + { MBEDTLS_ECP_DP_SECP224R1, 21, 224, "secp224r1" }, +#endif +#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) + { MBEDTLS_ECP_DP_SECP224K1, 20, 224, "secp224k1" }, +#endif +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) + { MBEDTLS_ECP_DP_SECP192R1, 19, 192, "secp192r1" }, +#endif +#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) + { MBEDTLS_ECP_DP_SECP192K1, 18, 192, "secp192k1" }, +#endif +#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) + { MBEDTLS_ECP_DP_CURVE25519, 29, 256, "x25519" }, +#endif +#if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) + { MBEDTLS_ECP_DP_CURVE448, 30, 448, "x448" }, +#endif + { MBEDTLS_ECP_DP_NONE, 0, 0, NULL }, +}; + +#define ECP_NB_CURVES sizeof(ecp_supported_curves) / \ + sizeof(ecp_supported_curves[0]) + +static mbedtls_ecp_group_id ecp_supported_grp_id[ECP_NB_CURVES]; + +/* + * List of supported curves and associated info + */ +const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list(void) +{ + return ecp_supported_curves; +} + +/* + * List of supported curves, group ID only + */ +const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list(void) +{ + static int init_done = 0; + + if (!init_done) { + size_t i = 0; + const mbedtls_ecp_curve_info *curve_info; + + for (curve_info = mbedtls_ecp_curve_list(); + curve_info->grp_id != MBEDTLS_ECP_DP_NONE; + curve_info++) { + ecp_supported_grp_id[i++] = curve_info->grp_id; + } + ecp_supported_grp_id[i] = MBEDTLS_ECP_DP_NONE; + + init_done = 1; + } + + return ecp_supported_grp_id; +} + +/* + * Get the curve info for the internal identifier + */ +const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id(mbedtls_ecp_group_id grp_id) +{ + const mbedtls_ecp_curve_info *curve_info; + + for (curve_info = mbedtls_ecp_curve_list(); + curve_info->grp_id != MBEDTLS_ECP_DP_NONE; + curve_info++) { + if (curve_info->grp_id == grp_id) { + return curve_info; + } + } + + return NULL; +} + +/* + * Get the curve info from the TLS identifier + */ +const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id(uint16_t tls_id) +{ + const mbedtls_ecp_curve_info *curve_info; + + for (curve_info = mbedtls_ecp_curve_list(); + curve_info->grp_id != MBEDTLS_ECP_DP_NONE; + curve_info++) { + if (curve_info->tls_id == tls_id) { + return curve_info; + } + } + + return NULL; +} + +/* + * Get the curve info from the name + */ +const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name(const char *name) +{ + const mbedtls_ecp_curve_info *curve_info; + + if (name == NULL) { + return NULL; + } + + for (curve_info = mbedtls_ecp_curve_list(); + curve_info->grp_id != MBEDTLS_ECP_DP_NONE; + curve_info++) { + if (strcmp(curve_info->name, name) == 0) { + return curve_info; + } + } + + return NULL; +} + +/* + * Get the type of a curve + */ +mbedtls_ecp_curve_type mbedtls_ecp_get_type(const mbedtls_ecp_group *grp) +{ + if (grp->G.X.p == NULL) { + return MBEDTLS_ECP_TYPE_NONE; + } + + if (grp->G.Y.p == NULL) { + return MBEDTLS_ECP_TYPE_MONTGOMERY; + } else { + return MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS; + } +} + +/* + * Initialize (the components of) a point + */ +void mbedtls_ecp_point_init(mbedtls_ecp_point *pt) +{ + ECP_VALIDATE(pt != NULL); + + mbedtls_mpi_init(&pt->X); + mbedtls_mpi_init(&pt->Y); + mbedtls_mpi_init(&pt->Z); +} + +/* + * Initialize (the components of) a group + */ +void mbedtls_ecp_group_init(mbedtls_ecp_group *grp) +{ + ECP_VALIDATE(grp != NULL); + + grp->id = MBEDTLS_ECP_DP_NONE; + mbedtls_mpi_init(&grp->P); + mbedtls_mpi_init(&grp->A); + mbedtls_mpi_init(&grp->B); + mbedtls_ecp_point_init(&grp->G); + mbedtls_mpi_init(&grp->N); + grp->pbits = 0; + grp->nbits = 0; + grp->h = 0; + grp->modp = NULL; + grp->t_pre = NULL; + grp->t_post = NULL; + grp->t_data = NULL; + grp->T = NULL; + grp->T_size = 0; +} + +/* + * Initialize (the components of) a key pair + */ +void mbedtls_ecp_keypair_init(mbedtls_ecp_keypair *key) +{ + ECP_VALIDATE(key != NULL); + + mbedtls_ecp_group_init(&key->grp); + mbedtls_mpi_init(&key->d); + mbedtls_ecp_point_init(&key->Q); +} + +/* + * Unallocate (the components of) a point + */ +void mbedtls_ecp_point_free(mbedtls_ecp_point *pt) +{ + if (pt == NULL) { + return; + } + + mbedtls_mpi_free(&(pt->X)); + mbedtls_mpi_free(&(pt->Y)); + mbedtls_mpi_free(&(pt->Z)); +} + +/* + * Unallocate (the components of) a group + */ +void mbedtls_ecp_group_free(mbedtls_ecp_group *grp) +{ + size_t i; + + if (grp == NULL) { + return; + } + + if (grp->h != 1) { + mbedtls_mpi_free(&grp->P); + mbedtls_mpi_free(&grp->A); + mbedtls_mpi_free(&grp->B); + mbedtls_ecp_point_free(&grp->G); + mbedtls_mpi_free(&grp->N); + } + + if (grp->T != NULL) { + for (i = 0; i < grp->T_size; i++) { + mbedtls_ecp_point_free(&grp->T[i]); + } + mbedtls_free(grp->T); + } + + mbedtls_platform_zeroize(grp, sizeof(mbedtls_ecp_group)); +} + +/* + * Unallocate (the components of) a key pair + */ +void mbedtls_ecp_keypair_free(mbedtls_ecp_keypair *key) +{ + if (key == NULL) { + return; + } + + mbedtls_ecp_group_free(&key->grp); + mbedtls_mpi_free(&key->d); + mbedtls_ecp_point_free(&key->Q); +} + +/* + * Copy the contents of a point + */ +int mbedtls_ecp_copy(mbedtls_ecp_point *P, const mbedtls_ecp_point *Q) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + ECP_VALIDATE_RET(P != NULL); + ECP_VALIDATE_RET(Q != NULL); + + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&P->X, &Q->X)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&P->Y, &Q->Y)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&P->Z, &Q->Z)); + +cleanup: + return ret; +} + +/* + * Copy the contents of a group object + */ +int mbedtls_ecp_group_copy(mbedtls_ecp_group *dst, const mbedtls_ecp_group *src) +{ + ECP_VALIDATE_RET(dst != NULL); + ECP_VALIDATE_RET(src != NULL); + + return mbedtls_ecp_group_load(dst, src->id); +} + +/* + * Set point to zero + */ +int mbedtls_ecp_set_zero(mbedtls_ecp_point *pt) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + ECP_VALIDATE_RET(pt != NULL); + + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&pt->X, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&pt->Y, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&pt->Z, 0)); + +cleanup: + return ret; +} + +/* + * Tell if a point is zero + */ +int mbedtls_ecp_is_zero(mbedtls_ecp_point *pt) +{ + ECP_VALIDATE_RET(pt != NULL); + + return mbedtls_mpi_cmp_int(&pt->Z, 0) == 0; +} + +/* + * Compare two points lazily + */ +int mbedtls_ecp_point_cmp(const mbedtls_ecp_point *P, + const mbedtls_ecp_point *Q) +{ + ECP_VALIDATE_RET(P != NULL); + ECP_VALIDATE_RET(Q != NULL); + + if (mbedtls_mpi_cmp_mpi(&P->X, &Q->X) == 0 && + mbedtls_mpi_cmp_mpi(&P->Y, &Q->Y) == 0 && + mbedtls_mpi_cmp_mpi(&P->Z, &Q->Z) == 0) { + return 0; + } + + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; +} + +/* + * Import a non-zero point from ASCII strings + */ +int mbedtls_ecp_point_read_string(mbedtls_ecp_point *P, int radix, + const char *x, const char *y) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + ECP_VALIDATE_RET(P != NULL); + ECP_VALIDATE_RET(x != NULL); + ECP_VALIDATE_RET(y != NULL); + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&P->X, radix, x)); + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&P->Y, radix, y)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&P->Z, 1)); + +cleanup: + return ret; +} + +/* + * Export a point into unsigned binary data (SEC1 2.3.3 and RFC7748) + */ +int mbedtls_ecp_point_write_binary(const mbedtls_ecp_group *grp, + const mbedtls_ecp_point *P, + int format, size_t *olen, + unsigned char *buf, size_t buflen) +{ + int ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + size_t plen; + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(P != NULL); + ECP_VALIDATE_RET(olen != NULL); + ECP_VALIDATE_RET(buf != NULL); + ECP_VALIDATE_RET(format == MBEDTLS_ECP_PF_UNCOMPRESSED || + format == MBEDTLS_ECP_PF_COMPRESSED); + + plen = mbedtls_mpi_size(&grp->P); + +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) + (void) format; /* Montgomery curves always use the same point format */ + if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_MONTGOMERY) { + *olen = plen; + if (buflen < *olen) { + return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary_le(&P->X, buf, plen)); + } +#endif +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) + if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) { + /* + * Common case: P == 0 + */ + if (mbedtls_mpi_cmp_int(&P->Z, 0) == 0) { + if (buflen < 1) { + return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + } + + buf[0] = 0x00; + *olen = 1; + + return 0; + } + + if (format == MBEDTLS_ECP_PF_UNCOMPRESSED) { + *olen = 2 * plen + 1; + + if (buflen < *olen) { + return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + } + + buf[0] = 0x04; + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&P->X, buf + 1, plen)); + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&P->Y, buf + 1 + plen, plen)); + } else if (format == MBEDTLS_ECP_PF_COMPRESSED) { + *olen = plen + 1; + + if (buflen < *olen) { + return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + } + + buf[0] = 0x02 + mbedtls_mpi_get_bit(&P->Y, 0); + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&P->X, buf + 1, plen)); + } + } +#endif + +cleanup: + return ret; +} + +/* + * Import a point from unsigned binary data (SEC1 2.3.4 and RFC7748) + */ +int mbedtls_ecp_point_read_binary(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *pt, + const unsigned char *buf, size_t ilen) +{ + int ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + size_t plen; + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(pt != NULL); + ECP_VALIDATE_RET(ilen == 0 || buf != NULL); + + if (ilen < 1) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + plen = mbedtls_mpi_size(&grp->P); + +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) + if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_MONTGOMERY) { + if (plen != ilen) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary_le(&pt->X, buf, plen)); + mbedtls_mpi_free(&pt->Y); + + if (grp->id == MBEDTLS_ECP_DP_CURVE25519) { + /* Set most significant bit to 0 as prescribed in RFC7748 §5 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(&pt->X, plen * 8 - 1, 0)); + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&pt->Z, 1)); + } +#endif +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) + if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) { + if (buf[0] == 0x00) { + if (ilen == 1) { + return mbedtls_ecp_set_zero(pt); + } else { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + } + + if (buf[0] != 0x04) { + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + } + + if (ilen != 2 * plen + 1) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&pt->X, buf + 1, plen)); + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&pt->Y, + buf + 1 + plen, plen)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&pt->Z, 1)); + } +#endif + +cleanup: + return ret; +} + +/* + * Import a point from a TLS ECPoint record (RFC 4492) + * struct { + * opaque point <1..2^8-1>; + * } ECPoint; + */ +int mbedtls_ecp_tls_read_point(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *pt, + const unsigned char **buf, size_t buf_len) +{ + unsigned char data_len; + const unsigned char *buf_start; + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(pt != NULL); + ECP_VALIDATE_RET(buf != NULL); + ECP_VALIDATE_RET(buf_len == 0 || *buf != NULL); + + /* + * We must have at least two bytes (1 for length, at least one for data) + */ + if (buf_len < 2) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + data_len = *(*buf)++; + if (data_len < 1 || data_len > buf_len - 1) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + /* + * Save buffer start for read_binary and update buf + */ + buf_start = *buf; + *buf += data_len; + + return mbedtls_ecp_point_read_binary(grp, pt, buf_start, data_len); +} + +/* + * Export a point as a TLS ECPoint record (RFC 4492) + * struct { + * opaque point <1..2^8-1>; + * } ECPoint; + */ +int mbedtls_ecp_tls_write_point(const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt, + int format, size_t *olen, + unsigned char *buf, size_t blen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(pt != NULL); + ECP_VALIDATE_RET(olen != NULL); + ECP_VALIDATE_RET(buf != NULL); + ECP_VALIDATE_RET(format == MBEDTLS_ECP_PF_UNCOMPRESSED || + format == MBEDTLS_ECP_PF_COMPRESSED); + + /* + * buffer length must be at least one, for our length byte + */ + if (blen < 1) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + if ((ret = mbedtls_ecp_point_write_binary(grp, pt, format, + olen, buf + 1, blen - 1)) != 0) { + return ret; + } + + /* + * write length to the first byte and update total length + */ + buf[0] = (unsigned char) *olen; + ++*olen; + + return 0; +} + +/* + * Set a group from an ECParameters record (RFC 4492) + */ +int mbedtls_ecp_tls_read_group(mbedtls_ecp_group *grp, + const unsigned char **buf, size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_group_id grp_id; + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(buf != NULL); + ECP_VALIDATE_RET(len == 0 || *buf != NULL); + + if ((ret = mbedtls_ecp_tls_read_group_id(&grp_id, buf, len)) != 0) { + return ret; + } + + return mbedtls_ecp_group_load(grp, grp_id); +} + +/* + * Read a group id from an ECParameters record (RFC 4492) and convert it to + * mbedtls_ecp_group_id. + */ +int mbedtls_ecp_tls_read_group_id(mbedtls_ecp_group_id *grp, + const unsigned char **buf, size_t len) +{ + uint16_t tls_id; + const mbedtls_ecp_curve_info *curve_info; + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(buf != NULL); + ECP_VALIDATE_RET(len == 0 || *buf != NULL); + + /* + * We expect at least three bytes (see below) + */ + if (len < 3) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + /* + * First byte is curve_type; only named_curve is handled + */ + if (*(*buf)++ != MBEDTLS_ECP_TLS_NAMED_CURVE) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + /* + * Next two bytes are the namedcurve value + */ + tls_id = *(*buf)++; + tls_id <<= 8; + tls_id |= *(*buf)++; + + if ((curve_info = mbedtls_ecp_curve_info_from_tls_id(tls_id)) == NULL) { + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + } + + *grp = curve_info->grp_id; + + return 0; +} + +/* + * Write the ECParameters record corresponding to a group (RFC 4492) + */ +int mbedtls_ecp_tls_write_group(const mbedtls_ecp_group *grp, size_t *olen, + unsigned char *buf, size_t blen) +{ + const mbedtls_ecp_curve_info *curve_info; + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(buf != NULL); + ECP_VALIDATE_RET(olen != NULL); + + if ((curve_info = mbedtls_ecp_curve_info_from_grp_id(grp->id)) == NULL) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + /* + * We are going to write 3 bytes (see below) + */ + *olen = 3; + if (blen < *olen) { + return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + } + + /* + * First byte is curve_type, always named_curve + */ + *buf++ = MBEDTLS_ECP_TLS_NAMED_CURVE; + + /* + * Next two bytes are the namedcurve value + */ + MBEDTLS_PUT_UINT16_BE(curve_info->tls_id, buf, 0); + + return 0; +} + +/* + * Wrapper around fast quasi-modp functions, with fall-back to mbedtls_mpi_mod_mpi. + * See the documentation of struct mbedtls_ecp_group. + * + * This function is in the critial loop for mbedtls_ecp_mul, so pay attention to perf. + */ +static int ecp_modp(mbedtls_mpi *N, const mbedtls_ecp_group *grp) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (grp->modp == NULL) { + return mbedtls_mpi_mod_mpi(N, N, &grp->P); + } + + /* N->s < 0 is a much faster test, which fails only if N is 0 */ + if ((N->s < 0 && mbedtls_mpi_cmp_int(N, 0) != 0) || + mbedtls_mpi_bitlen(N) > 2 * grp->pbits) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + MBEDTLS_MPI_CHK(grp->modp(N)); + + /* N->s < 0 is a much faster test, which fails only if N is 0 */ + while (N->s < 0 && mbedtls_mpi_cmp_int(N, 0) != 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(N, N, &grp->P)); + } + + while (mbedtls_mpi_cmp_mpi(N, &grp->P) >= 0) { + /* we known P, N and the result are positive */ + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_abs(N, N, &grp->P)); + } + +cleanup: + return ret; +} + +/* + * Fast mod-p functions expect their argument to be in the 0..p^2 range. + * + * In order to guarantee that, we need to ensure that operands of + * mbedtls_mpi_mul_mpi are in the 0..p range. So, after each operation we will + * bring the result back to this range. + * + * The following macros are shortcuts for doing that. + */ + +/* + * Reduce a mbedtls_mpi mod p in-place, general case, to use after mbedtls_mpi_mul_mpi + */ +#if defined(MBEDTLS_SELF_TEST) +#define INC_MUL_COUNT mul_count++; +#else +#define INC_MUL_COUNT +#endif + +#define MOD_MUL(N) \ + do \ + { \ + MBEDTLS_MPI_CHK(ecp_modp(&(N), grp)); \ + INC_MUL_COUNT \ + } while (0) + +static inline int mbedtls_mpi_mul_mod(const mbedtls_ecp_group *grp, + mbedtls_mpi *X, + const mbedtls_mpi *A, + const mbedtls_mpi *B) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(X, A, B)); + MOD_MUL(*X); +cleanup: + return ret; +} + +/* + * Reduce a mbedtls_mpi mod p in-place, to use after mbedtls_mpi_sub_mpi + * N->s < 0 is a very fast test, which fails only if N is 0 + */ +#define MOD_SUB(N) \ + while ((N).s < 0 && mbedtls_mpi_cmp_int(&(N), 0) != 0) \ + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&(N), &(N), &grp->P)) + +#if (defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) && \ + !(defined(MBEDTLS_ECP_NO_FALLBACK) && \ + defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) && \ + defined(MBEDTLS_ECP_ADD_MIXED_ALT))) || \ + (defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) && \ + !(defined(MBEDTLS_ECP_NO_FALLBACK) && \ + defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT))) +static inline int mbedtls_mpi_sub_mod(const mbedtls_ecp_group *grp, + mbedtls_mpi *X, + const mbedtls_mpi *A, + const mbedtls_mpi *B) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(X, A, B)); + MOD_SUB(*X); +cleanup: + return ret; +} +#endif /* All functions referencing mbedtls_mpi_sub_mod() are alt-implemented without fallback */ + +/* + * Reduce a mbedtls_mpi mod p in-place, to use after mbedtls_mpi_add_mpi and mbedtls_mpi_mul_int. + * We known P, N and the result are positive, so sub_abs is correct, and + * a bit faster. + */ +#define MOD_ADD(N) \ + while (mbedtls_mpi_cmp_mpi(&(N), &grp->P) >= 0) \ + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_abs(&(N), &(N), &grp->P)) + +static inline int mbedtls_mpi_add_mod(const mbedtls_ecp_group *grp, + mbedtls_mpi *X, + const mbedtls_mpi *A, + const mbedtls_mpi *B) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(X, A, B)); + MOD_ADD(*X); +cleanup: + return ret; +} + +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) && \ + !(defined(MBEDTLS_ECP_NO_FALLBACK) && \ + defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) && \ + defined(MBEDTLS_ECP_ADD_MIXED_ALT)) +static inline int mbedtls_mpi_shift_l_mod(const mbedtls_ecp_group *grp, + mbedtls_mpi *X, + size_t count) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(X, count)); + MOD_ADD(*X); +cleanup: + return ret; +} +#endif \ + /* All functions referencing mbedtls_mpi_shift_l_mod() are alt-implemented without fallback */ + +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) +/* + * For curves in short Weierstrass form, we do all the internal operations in + * Jacobian coordinates. + * + * For multiplication, we'll use a comb method with countermeasures against + * SPA, hence timing attacks. + */ + +/* + * Normalize jacobian coordinates so that Z == 0 || Z == 1 (GECC 3.2.1) + * Cost: 1N := 1I + 3M + 1S + */ +static int ecp_normalize_jac(const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt) +{ + if (mbedtls_mpi_cmp_int(&pt->Z, 0) == 0) { + return 0; + } + +#if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) + if (mbedtls_internal_ecp_grp_capable(grp)) { + return mbedtls_internal_ecp_normalize_jac(grp, pt); + } +#endif /* MBEDTLS_ECP_NORMALIZE_JAC_ALT */ + +#if defined(MBEDTLS_ECP_NO_FALLBACK) && defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; +#else + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi Zi, ZZi; + mbedtls_mpi_init(&Zi); mbedtls_mpi_init(&ZZi); + + /* + * X = X / Z^2 mod p + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(&Zi, &pt->Z, &grp->P)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &ZZi, &Zi, &Zi)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &pt->X, &pt->X, &ZZi)); + + /* + * Y = Y / Z^3 mod p + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &pt->Y, &pt->Y, &ZZi)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &pt->Y, &pt->Y, &Zi)); + + /* + * Z = 1 + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&pt->Z, 1)); + +cleanup: + + mbedtls_mpi_free(&Zi); mbedtls_mpi_free(&ZZi); + + return ret; +#endif /* !defined(MBEDTLS_ECP_NO_FALLBACK) || !defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) */ +} + +/* + * Normalize jacobian coordinates of an array of (pointers to) points, + * using Montgomery's trick to perform only one inversion mod P. + * (See for example Cohen's "A Course in Computational Algebraic Number + * Theory", Algorithm 10.3.4.) + * + * Warning: fails (returning an error) if one of the points is zero! + * This should never happen, see choice of w in ecp_mul_comb(). + * + * Cost: 1N(t) := 1I + (6t - 3)M + 1S + */ +static int ecp_normalize_jac_many(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *T[], size_t T_size) +{ + if (T_size < 2) { + return ecp_normalize_jac(grp, *T); + } + +#if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) + if (mbedtls_internal_ecp_grp_capable(grp)) { + return mbedtls_internal_ecp_normalize_jac_many(grp, T, T_size); + } +#endif + +#if defined(MBEDTLS_ECP_NO_FALLBACK) && defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; +#else + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i; + mbedtls_mpi *c, u, Zi, ZZi; + + if ((c = mbedtls_calloc(T_size, sizeof(mbedtls_mpi))) == NULL) { + return MBEDTLS_ERR_ECP_ALLOC_FAILED; + } + + for (i = 0; i < T_size; i++) { + mbedtls_mpi_init(&c[i]); + } + + mbedtls_mpi_init(&u); mbedtls_mpi_init(&Zi); mbedtls_mpi_init(&ZZi); + + /* + * c[i] = Z_0 * ... * Z_i + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&c[0], &T[0]->Z)); + for (i = 1; i < T_size; i++) { + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &c[i], &c[i-1], &T[i]->Z)); + } + + /* + * u = 1 / (Z_0 * ... * Z_n) mod P + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(&u, &c[T_size-1], &grp->P)); + + for (i = T_size - 1;; i--) { + /* + * Zi = 1 / Z_i mod p + * u = 1 / (Z_0 * ... * Z_i) mod P + */ + if (i == 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&Zi, &u)); + } else { + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &Zi, &u, &c[i-1])); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &u, &u, &T[i]->Z)); + } + + /* + * proceed as in normalize() + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &ZZi, &Zi, &Zi)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T[i]->X, &T[i]->X, &ZZi)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T[i]->Y, &T[i]->Y, &ZZi)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T[i]->Y, &T[i]->Y, &Zi)); + + /* + * Post-precessing: reclaim some memory by shrinking coordinates + * - not storing Z (always 1) + * - shrinking other coordinates, but still keeping the same number of + * limbs as P, as otherwise it will too likely be regrown too fast. + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_shrink(&T[i]->X, grp->P.n)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shrink(&T[i]->Y, grp->P.n)); + mbedtls_mpi_free(&T[i]->Z); + + if (i == 0) { + break; + } + } + +cleanup: + + mbedtls_mpi_free(&u); mbedtls_mpi_free(&Zi); mbedtls_mpi_free(&ZZi); + for (i = 0; i < T_size; i++) { + mbedtls_mpi_free(&c[i]); + } + mbedtls_free(c); + + return ret; +#endif /* !defined(MBEDTLS_ECP_NO_FALLBACK) || !defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) */ +} + +/* + * Conditional point inversion: Q -> -Q = (Q.X, -Q.Y, Q.Z) without leak. + * "inv" must be 0 (don't invert) or 1 (invert) or the result will be invalid + */ +static int ecp_safe_invert_jac(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *Q, + unsigned char inv) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char nonzero; + mbedtls_mpi mQY; + + mbedtls_mpi_init(&mQY); + + /* Use the fact that -Q.Y mod P = P - Q.Y unless Q.Y == 0 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&mQY, &grp->P, &Q->Y)); + nonzero = mbedtls_mpi_cmp_int(&Q->Y, 0) != 0; + MBEDTLS_MPI_CHK(mbedtls_mpi_safe_cond_assign(&Q->Y, &mQY, inv & nonzero)); + +cleanup: + mbedtls_mpi_free(&mQY); + + return ret; +} + +/* + * Point doubling R = 2 P, Jacobian coordinates + * + * Based on http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#doubling-dbl-1998-cmo-2 . + * + * We follow the variable naming fairly closely. The formula variations that trade a MUL for a SQR + * (plus a few ADDs) aren't useful as our bignum implementation doesn't distinguish squaring. + * + * Standard optimizations are applied when curve parameter A is one of { 0, -3 }. + * + * Cost: 1D := 3M + 4S (A == 0) + * 4M + 4S (A == -3) + * 3M + 6S + 1a otherwise + */ +static int ecp_double_jac(const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_ecp_point *P) +{ +#if defined(MBEDTLS_SELF_TEST) + dbl_count++; +#endif + +#if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) + if (mbedtls_internal_ecp_grp_capable(grp)) { + return mbedtls_internal_ecp_double_jac(grp, R, P); + } +#endif /* MBEDTLS_ECP_DOUBLE_JAC_ALT */ + +#if defined(MBEDTLS_ECP_NO_FALLBACK) && defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; +#else + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi M, S, T, U; + + mbedtls_mpi_init(&M); mbedtls_mpi_init(&S); mbedtls_mpi_init(&T); mbedtls_mpi_init(&U); + + /* Special case for A = -3 */ + if (grp->A.p == NULL) { + /* M = 3(X + Z^2)(X - Z^2) */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &S, &P->Z, &P->Z)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mod(grp, &T, &P->X, &S)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &U, &P->X, &S)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &S, &T, &U)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_int(&M, &S, 3)); MOD_ADD(M); + } else { + /* M = 3.X^2 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &S, &P->X, &P->X)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_int(&M, &S, 3)); MOD_ADD(M); + + /* Optimize away for "koblitz" curves with A = 0 */ + if (mbedtls_mpi_cmp_int(&grp->A, 0) != 0) { + /* M += A.Z^4 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &S, &P->Z, &P->Z)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T, &S, &S)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &S, &T, &grp->A)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mod(grp, &M, &M, &S)); + } + } + + /* S = 4.X.Y^2 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T, &P->Y, &P->Y)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l_mod(grp, &T, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &S, &P->X, &T)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l_mod(grp, &S, 1)); + + /* U = 8.Y^4 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &U, &T, &T)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l_mod(grp, &U, 1)); + + /* T = M^2 - 2.S */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T, &M, &M)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &T, &T, &S)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &T, &T, &S)); + + /* S = M(S - T) - U */ + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &S, &S, &T)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &S, &S, &M)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &S, &S, &U)); + + /* U = 2.Y.Z */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &U, &P->Y, &P->Z)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l_mod(grp, &U, 1)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&R->X, &T)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&R->Y, &S)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&R->Z, &U)); + +cleanup: + mbedtls_mpi_free(&M); mbedtls_mpi_free(&S); mbedtls_mpi_free(&T); mbedtls_mpi_free(&U); + + return ret; +#endif /* !defined(MBEDTLS_ECP_NO_FALLBACK) || !defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) */ +} + +/* + * Addition: R = P + Q, mixed affine-Jacobian coordinates (GECC 3.22) + * + * The coordinates of Q must be normalized (= affine), + * but those of P don't need to. R is not normalized. + * + * Special cases: (1) P or Q is zero, (2) R is zero, (3) P == Q. + * None of these cases can happen as intermediate step in ecp_mul_comb(): + * - at each step, P, Q and R are multiples of the base point, the factor + * being less than its order, so none of them is zero; + * - Q is an odd multiple of the base point, P an even multiple, + * due to the choice of precomputed points in the modified comb method. + * So branches for these cases do not leak secret information. + * + * We accept Q->Z being unset (saving memory in tables) as meaning 1. + * + * Cost: 1A := 8M + 3S + */ +static int ecp_add_mixed(const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q) +{ +#if defined(MBEDTLS_SELF_TEST) + add_count++; +#endif + +#if defined(MBEDTLS_ECP_ADD_MIXED_ALT) + if (mbedtls_internal_ecp_grp_capable(grp)) { + return mbedtls_internal_ecp_add_mixed(grp, R, P, Q); + } +#endif /* MBEDTLS_ECP_ADD_MIXED_ALT */ + +#if defined(MBEDTLS_ECP_NO_FALLBACK) && defined(MBEDTLS_ECP_ADD_MIXED_ALT) + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; +#else + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi T1, T2, T3, T4, X, Y, Z; + + /* + * Trivial cases: P == 0 or Q == 0 (case 1) + */ + if (mbedtls_mpi_cmp_int(&P->Z, 0) == 0) { + return mbedtls_ecp_copy(R, Q); + } + + if (Q->Z.p != NULL && mbedtls_mpi_cmp_int(&Q->Z, 0) == 0) { + return mbedtls_ecp_copy(R, P); + } + + /* + * Make sure Q coordinates are normalized + */ + if (Q->Z.p != NULL && mbedtls_mpi_cmp_int(&Q->Z, 1) != 0) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + mbedtls_mpi_init(&T1); mbedtls_mpi_init(&T2); mbedtls_mpi_init(&T3); mbedtls_mpi_init(&T4); + mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&Z); + + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T1, &P->Z, &P->Z)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T2, &T1, &P->Z)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T1, &T1, &Q->X)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T2, &T2, &Q->Y)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &T1, &T1, &P->X)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &T2, &T2, &P->Y)); + + /* Special cases (2) and (3) */ + if (mbedtls_mpi_cmp_int(&T1, 0) == 0) { + if (mbedtls_mpi_cmp_int(&T2, 0) == 0) { + ret = ecp_double_jac(grp, R, P); + goto cleanup; + } else { + ret = mbedtls_ecp_set_zero(R); + goto cleanup; + } + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &Z, &P->Z, &T1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T3, &T1, &T1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T4, &T3, &T1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T3, &T3, &P->X)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&T1, &T3)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l_mod(grp, &T1, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &X, &T2, &T2)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &X, &X, &T1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &X, &X, &T4)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &T3, &T3, &X)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T3, &T3, &T2)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &T4, &T4, &P->Y)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &Y, &T3, &T4)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&R->X, &X)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&R->Y, &Y)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&R->Z, &Z)); + +cleanup: + + mbedtls_mpi_free(&T1); mbedtls_mpi_free(&T2); mbedtls_mpi_free(&T3); mbedtls_mpi_free(&T4); + mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&Z); + + return ret; +#endif /* !defined(MBEDTLS_ECP_NO_FALLBACK) || !defined(MBEDTLS_ECP_ADD_MIXED_ALT) */ +} + +/* + * Randomize jacobian coordinates: + * (X, Y, Z) -> (l^2 X, l^3 Y, l Z) for random l + * This is sort of the reverse operation of ecp_normalize_jac(). + * + * This countermeasure was first suggested in [2]. + */ +static int ecp_randomize_jac(const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ +#if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) + if (mbedtls_internal_ecp_grp_capable(grp)) { + return mbedtls_internal_ecp_randomize_jac(grp, pt, f_rng, p_rng); + } +#endif /* MBEDTLS_ECP_RANDOMIZE_JAC_ALT */ + +#if defined(MBEDTLS_ECP_NO_FALLBACK) && defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; +#else + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi l, ll; + + mbedtls_mpi_init(&l); mbedtls_mpi_init(&ll); + + /* Generate l such that 1 < l < p */ + MBEDTLS_MPI_CHK(mbedtls_mpi_random(&l, 2, &grp->P, f_rng, p_rng)); + + /* Z = l * Z */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &pt->Z, &pt->Z, &l)); + + /* X = l^2 * X */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &ll, &l, &l)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &pt->X, &pt->X, &ll)); + + /* Y = l^3 * Y */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &ll, &ll, &l)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &pt->Y, &pt->Y, &ll)); + +cleanup: + mbedtls_mpi_free(&l); mbedtls_mpi_free(&ll); + + if (ret == MBEDTLS_ERR_MPI_NOT_ACCEPTABLE) { + ret = MBEDTLS_ERR_ECP_RANDOM_FAILED; + } + return ret; +#endif /* !defined(MBEDTLS_ECP_NO_FALLBACK) || !defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) */ +} + +/* + * Check and define parameters used by the comb method (see below for details) + */ +#if MBEDTLS_ECP_WINDOW_SIZE < 2 || MBEDTLS_ECP_WINDOW_SIZE > 7 +#error "MBEDTLS_ECP_WINDOW_SIZE out of bounds" +#endif + +/* d = ceil( n / w ) */ +#define COMB_MAX_D (MBEDTLS_ECP_MAX_BITS + 1) / 2 + +/* number of precomputed points */ +#define COMB_MAX_PRE (1 << (MBEDTLS_ECP_WINDOW_SIZE - 1)) + +/* + * Compute the representation of m that will be used with our comb method. + * + * The basic comb method is described in GECC 3.44 for example. We use a + * modified version that provides resistance to SPA by avoiding zero + * digits in the representation as in [3]. We modify the method further by + * requiring that all K_i be odd, which has the small cost that our + * representation uses one more K_i, due to carries, but saves on the size of + * the precomputed table. + * + * Summary of the comb method and its modifications: + * + * - The goal is to compute m*P for some w*d-bit integer m. + * + * - The basic comb method splits m into the w-bit integers + * x[0] .. x[d-1] where x[i] consists of the bits in m whose + * index has residue i modulo d, and computes m * P as + * S[x[0]] + 2 * S[x[1]] + .. + 2^(d-1) S[x[d-1]], where + * S[i_{w-1} .. i_0] := i_{w-1} 2^{(w-1)d} P + ... + i_1 2^d P + i_0 P. + * + * - If it happens that, say, x[i+1]=0 (=> S[x[i+1]]=0), one can replace the sum by + * .. + 2^{i-1} S[x[i-1]] - 2^i S[x[i]] + 2^{i+1} S[x[i]] + 2^{i+2} S[x[i+2]] .., + * thereby successively converting it into a form where all summands + * are nonzero, at the cost of negative summands. This is the basic idea of [3]. + * + * - More generally, even if x[i+1] != 0, we can first transform the sum as + * .. - 2^i S[x[i]] + 2^{i+1} ( S[x[i]] + S[x[i+1]] ) + 2^{i+2} S[x[i+2]] .., + * and then replace S[x[i]] + S[x[i+1]] = S[x[i] ^ x[i+1]] + 2 S[x[i] & x[i+1]]. + * Performing and iterating this procedure for those x[i] that are even + * (keeping track of carry), we can transform the original sum into one of the form + * S[x'[0]] +- 2 S[x'[1]] +- .. +- 2^{d-1} S[x'[d-1]] + 2^d S[x'[d]] + * with all x'[i] odd. It is therefore only necessary to know S at odd indices, + * which is why we are only computing half of it in the first place in + * ecp_precompute_comb and accessing it with index abs(i) / 2 in ecp_select_comb. + * + * - For the sake of compactness, only the seven low-order bits of x[i] + * are used to represent its absolute value (K_i in the paper), and the msb + * of x[i] encodes the sign (s_i in the paper): it is set if and only if + * if s_i == -1; + * + * Calling conventions: + * - x is an array of size d + 1 + * - w is the size, ie number of teeth, of the comb, and must be between + * 2 and 7 (in practice, between 2 and MBEDTLS_ECP_WINDOW_SIZE) + * - m is the MPI, expected to be odd and such that bitlength(m) <= w * d + * (the result will be incorrect if these assumptions are not satisfied) + */ +static void ecp_comb_recode_core(unsigned char x[], size_t d, + unsigned char w, const mbedtls_mpi *m) +{ + size_t i, j; + unsigned char c, cc, adjust; + + memset(x, 0, d+1); + + /* First get the classical comb values (except for x_d = 0) */ + for (i = 0; i < d; i++) { + for (j = 0; j < w; j++) { + x[i] |= mbedtls_mpi_get_bit(m, i + d * j) << j; + } + } + + /* Now make sure x_1 .. x_d are odd */ + c = 0; + for (i = 1; i <= d; i++) { + /* Add carry and update it */ + cc = x[i] & c; + x[i] = x[i] ^ c; + c = cc; + + /* Adjust if needed, avoiding branches */ + adjust = 1 - (x[i] & 0x01); + c |= x[i] & (x[i-1] * adjust); + x[i] = x[i] ^ (x[i-1] * adjust); + x[i-1] |= adjust << 7; + } +} + +/* + * Precompute points for the adapted comb method + * + * Assumption: T must be able to hold 2^{w - 1} elements. + * + * Operation: If i = i_{w-1} ... i_1 is the binary representation of i, + * sets T[i] = i_{w-1} 2^{(w-1)d} P + ... + i_1 2^d P + P. + * + * Cost: d(w-1) D + (2^{w-1} - 1) A + 1 N(w-1) + 1 N(2^{w-1} - 1) + * + * Note: Even comb values (those where P would be omitted from the + * sum defining T[i] above) are not needed in our adaption + * the comb method. See ecp_comb_recode_core(). + * + * This function currently works in four steps: + * (1) [dbl] Computation of intermediate T[i] for 2-power values of i + * (2) [norm_dbl] Normalization of coordinates of these T[i] + * (3) [add] Computation of all T[i] + * (4) [norm_add] Normalization of all T[i] + * + * Step 1 can be interrupted but not the others; together with the final + * coordinate normalization they are the largest steps done at once, depending + * on the window size. Here are operation counts for P-256: + * + * step (2) (3) (4) + * w = 5 142 165 208 + * w = 4 136 77 160 + * w = 3 130 33 136 + * w = 2 124 11 124 + * + * So if ECC operations are blocking for too long even with a low max_ops + * value, it's useful to set MBEDTLS_ECP_WINDOW_SIZE to a lower value in order + * to minimize maximum blocking time. + */ +static int ecp_precompute_comb(const mbedtls_ecp_group *grp, + mbedtls_ecp_point T[], const mbedtls_ecp_point *P, + unsigned char w, size_t d, + mbedtls_ecp_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char i; + size_t j = 0; + const unsigned char T_size = 1U << (w - 1); + mbedtls_ecp_point *cur, *TT[COMB_MAX_PRE - 1]; + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL) { + if (rs_ctx->rsm->state == ecp_rsm_pre_dbl) { + goto dbl; + } + if (rs_ctx->rsm->state == ecp_rsm_pre_norm_dbl) { + goto norm_dbl; + } + if (rs_ctx->rsm->state == ecp_rsm_pre_add) { + goto add; + } + if (rs_ctx->rsm->state == ecp_rsm_pre_norm_add) { + goto norm_add; + } + } +#else + (void) rs_ctx; +#endif + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL) { + rs_ctx->rsm->state = ecp_rsm_pre_dbl; + + /* initial state for the loop */ + rs_ctx->rsm->i = 0; + } + +dbl: +#endif + /* + * Set T[0] = P and + * T[2^{l-1}] = 2^{dl} P for l = 1 .. w-1 (this is not the final value) + */ + MBEDTLS_MPI_CHK(mbedtls_ecp_copy(&T[0], P)); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL && rs_ctx->rsm->i != 0) { + j = rs_ctx->rsm->i; + } else +#endif + j = 0; + + for (; j < d * (w - 1); j++) { + MBEDTLS_ECP_BUDGET(MBEDTLS_ECP_OPS_DBL); + + i = 1U << (j / d); + cur = T + i; + + if (j % d == 0) { + MBEDTLS_MPI_CHK(mbedtls_ecp_copy(cur, T + (i >> 1))); + } + + MBEDTLS_MPI_CHK(ecp_double_jac(grp, cur, cur)); + } + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL) { + rs_ctx->rsm->state = ecp_rsm_pre_norm_dbl; + } + +norm_dbl: +#endif + /* + * Normalize current elements in T. As T has holes, + * use an auxiliary array of pointers to elements in T. + */ + j = 0; + for (i = 1; i < T_size; i <<= 1) { + TT[j++] = T + i; + } + + MBEDTLS_ECP_BUDGET(MBEDTLS_ECP_OPS_INV + 6 * j - 2); + + MBEDTLS_MPI_CHK(ecp_normalize_jac_many(grp, TT, j)); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL) { + rs_ctx->rsm->state = ecp_rsm_pre_add; + } + +add: +#endif + /* + * Compute the remaining ones using the minimal number of additions + * Be careful to update T[2^l] only after using it! + */ + MBEDTLS_ECP_BUDGET((T_size - 1) * MBEDTLS_ECP_OPS_ADD); + + for (i = 1; i < T_size; i <<= 1) { + j = i; + while (j--) { + MBEDTLS_MPI_CHK(ecp_add_mixed(grp, &T[i + j], &T[j], &T[i])); + } + } + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL) { + rs_ctx->rsm->state = ecp_rsm_pre_norm_add; + } + +norm_add: +#endif + /* + * Normalize final elements in T. Even though there are no holes now, we + * still need the auxiliary array for homogeneity with the previous + * call. Also, skip T[0] which is already normalised, being a copy of P. + */ + for (j = 0; j + 1 < T_size; j++) { + TT[j] = T + j + 1; + } + + MBEDTLS_ECP_BUDGET(MBEDTLS_ECP_OPS_INV + 6 * j - 2); + + MBEDTLS_MPI_CHK(ecp_normalize_jac_many(grp, TT, j)); + +cleanup: +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL && + ret == MBEDTLS_ERR_ECP_IN_PROGRESS) { + if (rs_ctx->rsm->state == ecp_rsm_pre_dbl) { + rs_ctx->rsm->i = j; + } + } +#endif + + return ret; +} + +/* + * Select precomputed point: R = sign(i) * T[ abs(i) / 2 ] + * + * See ecp_comb_recode_core() for background + */ +static int ecp_select_comb(const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_ecp_point T[], unsigned char T_size, + unsigned char i) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char ii, j; + + /* Ignore the "sign" bit and scale down */ + ii = (i & 0x7Fu) >> 1; + + /* Read the whole table to thwart cache-based timing attacks */ + for (j = 0; j < T_size; j++) { + MBEDTLS_MPI_CHK(mbedtls_mpi_safe_cond_assign(&R->X, &T[j].X, j == ii)); + MBEDTLS_MPI_CHK(mbedtls_mpi_safe_cond_assign(&R->Y, &T[j].Y, j == ii)); + } + + /* Safely invert result if i is "negative" */ + MBEDTLS_MPI_CHK(ecp_safe_invert_jac(grp, R, i >> 7)); + +cleanup: + return ret; +} + +/* + * Core multiplication algorithm for the (modified) comb method. + * This part is actually common with the basic comb method (GECC 3.44) + * + * Cost: d A + d D + 1 R + */ +static int ecp_mul_comb_core(const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_ecp_point T[], unsigned char T_size, + const unsigned char x[], size_t d, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + mbedtls_ecp_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_point Txi; + size_t i; + + mbedtls_ecp_point_init(&Txi); + +#if !defined(MBEDTLS_ECP_RESTARTABLE) + (void) rs_ctx; +#endif + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL && + rs_ctx->rsm->state != ecp_rsm_comb_core) { + rs_ctx->rsm->i = 0; + rs_ctx->rsm->state = ecp_rsm_comb_core; + } + + /* new 'if' instead of nested for the sake of the 'else' branch */ + if (rs_ctx != NULL && rs_ctx->rsm != NULL && rs_ctx->rsm->i != 0) { + /* restore current index (R already pointing to rs_ctx->rsm->R) */ + i = rs_ctx->rsm->i; + } else +#endif + { + int have_rng = 1; + + /* Start with a non-zero point and randomize its coordinates */ + i = d; + MBEDTLS_MPI_CHK(ecp_select_comb(grp, R, T, T_size, x[i])); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&R->Z, 1)); + +#if defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + if (f_rng == NULL) { + have_rng = 0; + } +#endif + if (have_rng) { + MBEDTLS_MPI_CHK(ecp_randomize_jac(grp, R, f_rng, p_rng)); + } + } + + while (i != 0) { + MBEDTLS_ECP_BUDGET(MBEDTLS_ECP_OPS_DBL + MBEDTLS_ECP_OPS_ADD); + --i; + + MBEDTLS_MPI_CHK(ecp_double_jac(grp, R, R)); + MBEDTLS_MPI_CHK(ecp_select_comb(grp, &Txi, T, T_size, x[i])); + MBEDTLS_MPI_CHK(ecp_add_mixed(grp, R, R, &Txi)); + } + +cleanup: + + mbedtls_ecp_point_free(&Txi); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL && + ret == MBEDTLS_ERR_ECP_IN_PROGRESS) { + rs_ctx->rsm->i = i; + /* no need to save R, already pointing to rs_ctx->rsm->R */ + } +#endif + + return ret; +} + +/* + * Recode the scalar to get constant-time comb multiplication + * + * As the actual scalar recoding needs an odd scalar as a starting point, + * this wrapper ensures that by replacing m by N - m if necessary, and + * informs the caller that the result of multiplication will be negated. + * + * This works because we only support large prime order for Short Weierstrass + * curves, so N is always odd hence either m or N - m is. + * + * See ecp_comb_recode_core() for background. + */ +static int ecp_comb_recode_scalar(const mbedtls_ecp_group *grp, + const mbedtls_mpi *m, + unsigned char k[COMB_MAX_D + 1], + size_t d, + unsigned char w, + unsigned char *parity_trick) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi M, mm; + + mbedtls_mpi_init(&M); + mbedtls_mpi_init(&mm); + + /* N is always odd (see above), just make extra sure */ + if (mbedtls_mpi_get_bit(&grp->N, 0) != 1) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + /* do we need the parity trick? */ + *parity_trick = (mbedtls_mpi_get_bit(m, 0) == 0); + + /* execute parity fix in constant time */ + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&M, m)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&mm, &grp->N, m)); + MBEDTLS_MPI_CHK(mbedtls_mpi_safe_cond_assign(&M, &mm, *parity_trick)); + + /* actual scalar recoding */ + ecp_comb_recode_core(k, d, w, &M); + +cleanup: + mbedtls_mpi_free(&mm); + mbedtls_mpi_free(&M); + + return ret; +} + +/* + * Perform comb multiplication (for short Weierstrass curves) + * once the auxiliary table has been pre-computed. + * + * Scalar recoding may use a parity trick that makes us compute -m * P, + * if that is the case we'll need to recover m * P at the end. + */ +static int ecp_mul_comb_after_precomp(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *R, + const mbedtls_mpi *m, + const mbedtls_ecp_point *T, + unsigned char T_size, + unsigned char w, + size_t d, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + mbedtls_ecp_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char parity_trick; + unsigned char k[COMB_MAX_D + 1]; + mbedtls_ecp_point *RR = R; + int have_rng = 1; + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL) { + RR = &rs_ctx->rsm->R; + + if (rs_ctx->rsm->state == ecp_rsm_final_norm) { + goto final_norm; + } + } +#endif + + MBEDTLS_MPI_CHK(ecp_comb_recode_scalar(grp, m, k, d, w, + &parity_trick)); + MBEDTLS_MPI_CHK(ecp_mul_comb_core(grp, RR, T, T_size, k, d, + f_rng, p_rng, rs_ctx)); + MBEDTLS_MPI_CHK(ecp_safe_invert_jac(grp, RR, parity_trick)); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL) { + rs_ctx->rsm->state = ecp_rsm_final_norm; + } + +final_norm: + MBEDTLS_ECP_BUDGET(MBEDTLS_ECP_OPS_INV); +#endif + /* + * Knowledge of the jacobian coordinates may leak the last few bits of the + * scalar [1], and since our MPI implementation isn't constant-flow, + * inversion (used for coordinate normalization) may leak the full value + * of its input via side-channels [2]. + * + * [1] https://eprint.iacr.org/2003/191 + * [2] https://eprint.iacr.org/2020/055 + * + * Avoid the leak by randomizing coordinates before we normalize them. + */ +#if defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + if (f_rng == NULL) { + have_rng = 0; + } +#endif + if (have_rng) { + MBEDTLS_MPI_CHK(ecp_randomize_jac(grp, RR, f_rng, p_rng)); + } + + MBEDTLS_MPI_CHK(ecp_normalize_jac(grp, RR)); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL) { + MBEDTLS_MPI_CHK(mbedtls_ecp_copy(R, RR)); + } +#endif + +cleanup: + return ret; +} + +/* + * Pick window size based on curve size and whether we optimize for base point + */ +static unsigned char ecp_pick_window_size(const mbedtls_ecp_group *grp, + unsigned char p_eq_g) +{ + unsigned char w; + + /* + * Minimize the number of multiplications, that is minimize + * 10 * d * w + 18 * 2^(w-1) + 11 * d + 7 * w, with d = ceil( nbits / w ) + * (see costs of the various parts, with 1S = 1M) + */ + w = grp->nbits >= 384 ? 5 : 4; + + /* + * If P == G, pre-compute a bit more, since this may be re-used later. + * Just adding one avoids upping the cost of the first mul too much, + * and the memory cost too. + */ + if (p_eq_g) { + w++; + } + + /* + * Make sure w is within bounds. + * (The last test is useful only for very small curves in the test suite.) + */ +#if (MBEDTLS_ECP_WINDOW_SIZE < 6) + if (w > MBEDTLS_ECP_WINDOW_SIZE) { + w = MBEDTLS_ECP_WINDOW_SIZE; + } +#endif + if (w >= grp->nbits) { + w = 2; + } + + return w; +} + +/* + * Multiplication using the comb method - for curves in short Weierstrass form + * + * This function is mainly responsible for administrative work: + * - managing the restart context if enabled + * - managing the table of precomputed points (passed between the below two + * functions): allocation, computation, ownership transfer, freeing. + * + * It delegates the actual arithmetic work to: + * ecp_precompute_comb() and ecp_mul_comb_with_precomp() + * + * See comments on ecp_comb_recode_core() regarding the computation strategy. + */ +static int ecp_mul_comb(mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_mpi *m, const mbedtls_ecp_point *P, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + mbedtls_ecp_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char w, p_eq_g, i; + size_t d; + unsigned char T_size = 0, T_ok = 0; + mbedtls_ecp_point *T = NULL; +#if !defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + ecp_drbg_context drbg_ctx; + + ecp_drbg_init(&drbg_ctx); +#endif + + ECP_RS_ENTER(rsm); + +#if !defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + if (f_rng == NULL) { + /* Adjust pointers */ + f_rng = &ecp_drbg_random; +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL) { + p_rng = &rs_ctx->rsm->drbg_ctx; + } else +#endif + p_rng = &drbg_ctx; + + /* Initialize internal DRBG if necessary */ +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx == NULL || rs_ctx->rsm == NULL || + rs_ctx->rsm->drbg_seeded == 0) +#endif + { + const size_t m_len = (grp->nbits + 7) / 8; + MBEDTLS_MPI_CHK(ecp_drbg_seed(p_rng, m, m_len)); + } +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL) { + rs_ctx->rsm->drbg_seeded = 1; + } +#endif + } +#endif /* !MBEDTLS_ECP_NO_INTERNAL_RNG */ + + /* Is P the base point ? */ +#if MBEDTLS_ECP_FIXED_POINT_OPTIM == 1 + p_eq_g = (mbedtls_mpi_cmp_mpi(&P->Y, &grp->G.Y) == 0 && + mbedtls_mpi_cmp_mpi(&P->X, &grp->G.X) == 0); +#else + p_eq_g = 0; +#endif + + /* Pick window size and deduce related sizes */ + w = ecp_pick_window_size(grp, p_eq_g); + T_size = 1U << (w - 1); + d = (grp->nbits + w - 1) / w; + + /* Pre-computed table: do we have it already for the base point? */ + if (p_eq_g && grp->T != NULL) { + /* second pointer to the same table, will be deleted on exit */ + T = grp->T; + T_ok = 1; + } else +#if defined(MBEDTLS_ECP_RESTARTABLE) + /* Pre-computed table: do we have one in progress? complete? */ + if (rs_ctx != NULL && rs_ctx->rsm != NULL && rs_ctx->rsm->T != NULL) { + /* transfer ownership of T from rsm to local function */ + T = rs_ctx->rsm->T; + rs_ctx->rsm->T = NULL; + rs_ctx->rsm->T_size = 0; + + /* This effectively jumps to the call to mul_comb_after_precomp() */ + T_ok = rs_ctx->rsm->state >= ecp_rsm_comb_core; + } else +#endif + /* Allocate table if we didn't have any */ + { + T = mbedtls_calloc(T_size, sizeof(mbedtls_ecp_point)); + if (T == NULL) { + ret = MBEDTLS_ERR_ECP_ALLOC_FAILED; + goto cleanup; + } + + for (i = 0; i < T_size; i++) { + mbedtls_ecp_point_init(&T[i]); + } + + T_ok = 0; + } + + /* Compute table (or finish computing it) if not done already */ + if (!T_ok) { + MBEDTLS_MPI_CHK(ecp_precompute_comb(grp, T, P, w, d, rs_ctx)); + + if (p_eq_g) { + /* almost transfer ownership of T to the group, but keep a copy of + * the pointer to use for calling the next function more easily */ + grp->T = T; + grp->T_size = T_size; + } + } + + /* Actual comb multiplication using precomputed points */ + MBEDTLS_MPI_CHK(ecp_mul_comb_after_precomp(grp, R, m, + T, T_size, w, d, + f_rng, p_rng, rs_ctx)); + +cleanup: + +#if !defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + ecp_drbg_free(&drbg_ctx); +#endif + + /* does T belong to the group? */ + if (T == grp->T) { + T = NULL; + } + + /* does T belong to the restart context? */ +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->rsm != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS && T != NULL) { + /* transfer ownership of T from local function to rsm */ + rs_ctx->rsm->T_size = T_size; + rs_ctx->rsm->T = T; + T = NULL; + } +#endif + + /* did T belong to us? then let's destroy it! */ + if (T != NULL) { + for (i = 0; i < T_size; i++) { + mbedtls_ecp_point_free(&T[i]); + } + mbedtls_free(T); + } + + /* prevent caller from using invalid value */ + int should_free_R = (ret != 0); +#if defined(MBEDTLS_ECP_RESTARTABLE) + /* don't free R while in progress in case R == P */ + if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS) { + should_free_R = 0; + } +#endif + if (should_free_R) { + mbedtls_ecp_point_free(R); + } + + ECP_RS_LEAVE(rsm); + + return ret; +} + +#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */ + +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) +/* + * For Montgomery curves, we do all the internal arithmetic in projective + * coordinates. Import/export of points uses only the x coordinates, which is + * internally represented as X / Z. + * + * For scalar multiplication, we'll use a Montgomery ladder. + */ + +/* + * Normalize Montgomery x/z coordinates: X = X/Z, Z = 1 + * Cost: 1M + 1I + */ +static int ecp_normalize_mxz(const mbedtls_ecp_group *grp, mbedtls_ecp_point *P) +{ +#if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) + if (mbedtls_internal_ecp_grp_capable(grp)) { + return mbedtls_internal_ecp_normalize_mxz(grp, P); + } +#endif /* MBEDTLS_ECP_NORMALIZE_MXZ_ALT */ + +#if defined(MBEDTLS_ECP_NO_FALLBACK) && defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; +#else + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(&P->Z, &P->Z, &grp->P)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &P->X, &P->X, &P->Z)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&P->Z, 1)); + +cleanup: + return ret; +#endif /* !defined(MBEDTLS_ECP_NO_FALLBACK) || !defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) */ +} + +/* + * Randomize projective x/z coordinates: + * (X, Z) -> (l X, l Z) for random l + * This is sort of the reverse operation of ecp_normalize_mxz(). + * + * This countermeasure was first suggested in [2]. + * Cost: 2M + */ +static int ecp_randomize_mxz(const mbedtls_ecp_group *grp, mbedtls_ecp_point *P, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ +#if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) + if (mbedtls_internal_ecp_grp_capable(grp)) { + return mbedtls_internal_ecp_randomize_mxz(grp, P, f_rng, p_rng); + } +#endif /* MBEDTLS_ECP_RANDOMIZE_MXZ_ALT */ + +#if defined(MBEDTLS_ECP_NO_FALLBACK) && defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; +#else + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi l; + mbedtls_mpi_init(&l); + + /* Generate l such that 1 < l < p */ + MBEDTLS_MPI_CHK(mbedtls_mpi_random(&l, 2, &grp->P, f_rng, p_rng)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &P->X, &P->X, &l)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &P->Z, &P->Z, &l)); + +cleanup: + mbedtls_mpi_free(&l); + + if (ret == MBEDTLS_ERR_MPI_NOT_ACCEPTABLE) { + ret = MBEDTLS_ERR_ECP_RANDOM_FAILED; + } + return ret; +#endif /* !defined(MBEDTLS_ECP_NO_FALLBACK) || !defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) */ +} + +/* + * Double-and-add: R = 2P, S = P + Q, with d = X(P - Q), + * for Montgomery curves in x/z coordinates. + * + * http://www.hyperelliptic.org/EFD/g1p/auto-code/montgom/xz/ladder/mladd-1987-m.op3 + * with + * d = X1 + * P = (X2, Z2) + * Q = (X3, Z3) + * R = (X4, Z4) + * S = (X5, Z5) + * and eliminating temporary variables tO, ..., t4. + * + * Cost: 5M + 4S + */ +static int ecp_double_add_mxz(const mbedtls_ecp_group *grp, + mbedtls_ecp_point *R, mbedtls_ecp_point *S, + const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q, + const mbedtls_mpi *d) +{ +#if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) + if (mbedtls_internal_ecp_grp_capable(grp)) { + return mbedtls_internal_ecp_double_add_mxz(grp, R, S, P, Q, d); + } +#endif /* MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT */ + +#if defined(MBEDTLS_ECP_NO_FALLBACK) && defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; +#else + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi A, AA, B, BB, E, C, D, DA, CB; + + mbedtls_mpi_init(&A); mbedtls_mpi_init(&AA); mbedtls_mpi_init(&B); + mbedtls_mpi_init(&BB); mbedtls_mpi_init(&E); mbedtls_mpi_init(&C); + mbedtls_mpi_init(&D); mbedtls_mpi_init(&DA); mbedtls_mpi_init(&CB); + + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mod(grp, &A, &P->X, &P->Z)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &AA, &A, &A)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &B, &P->X, &P->Z)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &BB, &B, &B)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &E, &AA, &BB)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mod(grp, &C, &Q->X, &Q->Z)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &D, &Q->X, &Q->Z)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &DA, &D, &A)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &CB, &C, &B)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mod(grp, &S->X, &DA, &CB)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &S->X, &S->X, &S->X)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mod(grp, &S->Z, &DA, &CB)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &S->Z, &S->Z, &S->Z)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &S->Z, d, &S->Z)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &R->X, &AA, &BB)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &R->Z, &grp->A, &E)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mod(grp, &R->Z, &BB, &R->Z)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &R->Z, &E, &R->Z)); + +cleanup: + mbedtls_mpi_free(&A); mbedtls_mpi_free(&AA); mbedtls_mpi_free(&B); + mbedtls_mpi_free(&BB); mbedtls_mpi_free(&E); mbedtls_mpi_free(&C); + mbedtls_mpi_free(&D); mbedtls_mpi_free(&DA); mbedtls_mpi_free(&CB); + + return ret; +#endif /* !defined(MBEDTLS_ECP_NO_FALLBACK) || !defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) */ +} + +/* + * Multiplication with Montgomery ladder in x/z coordinates, + * for curves in Montgomery form + */ +static int ecp_mul_mxz(mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_mpi *m, const mbedtls_ecp_point *P, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + int have_rng = 1; + size_t i; + unsigned char b; + mbedtls_ecp_point RP; + mbedtls_mpi PX; +#if !defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + ecp_drbg_context drbg_ctx; + + ecp_drbg_init(&drbg_ctx); +#endif + mbedtls_ecp_point_init(&RP); mbedtls_mpi_init(&PX); + +#if !defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + if (f_rng == NULL) { + const size_t m_len = (grp->nbits + 7) / 8; + MBEDTLS_MPI_CHK(ecp_drbg_seed(&drbg_ctx, m, m_len)); + f_rng = &ecp_drbg_random; + p_rng = &drbg_ctx; + } +#endif /* !MBEDTLS_ECP_NO_INTERNAL_RNG */ + + /* Save PX and read from P before writing to R, in case P == R */ + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&PX, &P->X)); + MBEDTLS_MPI_CHK(mbedtls_ecp_copy(&RP, P)); + + /* Set R to zero in modified x/z coordinates */ + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&R->X, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&R->Z, 0)); + mbedtls_mpi_free(&R->Y); + + /* RP.X might be slightly larger than P, so reduce it */ + MOD_ADD(RP.X); + + /* Randomize coordinates of the starting point */ +#if defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + if (f_rng == NULL) { + have_rng = 0; + } +#endif + if (have_rng) { + MBEDTLS_MPI_CHK(ecp_randomize_mxz(grp, &RP, f_rng, p_rng)); + } + + /* Loop invariant: R = result so far, RP = R + P */ + i = grp->nbits + 1; /* one past the (zero-based) required msb for private keys */ + while (i-- > 0) { + b = mbedtls_mpi_get_bit(m, i); + /* + * if (b) R = 2R + P else R = 2R, + * which is: + * if (b) double_add( RP, R, RP, R ) + * else double_add( R, RP, R, RP ) + * but using safe conditional swaps to avoid leaks + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_safe_cond_swap(&R->X, &RP.X, b)); + MBEDTLS_MPI_CHK(mbedtls_mpi_safe_cond_swap(&R->Z, &RP.Z, b)); + MBEDTLS_MPI_CHK(ecp_double_add_mxz(grp, R, &RP, R, &RP, &PX)); + MBEDTLS_MPI_CHK(mbedtls_mpi_safe_cond_swap(&R->X, &RP.X, b)); + MBEDTLS_MPI_CHK(mbedtls_mpi_safe_cond_swap(&R->Z, &RP.Z, b)); + } + + /* + * Knowledge of the projective coordinates may leak the last few bits of the + * scalar [1], and since our MPI implementation isn't constant-flow, + * inversion (used for coordinate normalization) may leak the full value + * of its input via side-channels [2]. + * + * [1] https://eprint.iacr.org/2003/191 + * [2] https://eprint.iacr.org/2020/055 + * + * Avoid the leak by randomizing coordinates before we normalize them. + */ + have_rng = 1; +#if defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + if (f_rng == NULL) { + have_rng = 0; + } +#endif + if (have_rng) { + MBEDTLS_MPI_CHK(ecp_randomize_mxz(grp, R, f_rng, p_rng)); + } + + MBEDTLS_MPI_CHK(ecp_normalize_mxz(grp, R)); + +cleanup: +#if !defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + ecp_drbg_free(&drbg_ctx); +#endif + + mbedtls_ecp_point_free(&RP); mbedtls_mpi_free(&PX); + + return ret; +} + +#endif /* MBEDTLS_ECP_MONTGOMERY_ENABLED */ + +/* + * Restartable multiplication R = m * P + */ +int mbedtls_ecp_mul_restartable(mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_mpi *m, const mbedtls_ecp_point *P, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + mbedtls_ecp_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; +#if defined(MBEDTLS_ECP_INTERNAL_ALT) + char is_grp_capable = 0; +#endif + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(R != NULL); + ECP_VALIDATE_RET(m != NULL); + ECP_VALIDATE_RET(P != NULL); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + /* reset ops count for this call if top-level */ + if (rs_ctx != NULL && rs_ctx->depth++ == 0) { + rs_ctx->ops_done = 0; + } +#else + (void) rs_ctx; +#endif + +#if defined(MBEDTLS_ECP_INTERNAL_ALT) + if ((is_grp_capable = mbedtls_internal_ecp_grp_capable(grp))) { + MBEDTLS_MPI_CHK(mbedtls_internal_ecp_init(grp)); + } +#endif /* MBEDTLS_ECP_INTERNAL_ALT */ + + int restarting = 0; +#if defined(MBEDTLS_ECP_RESTARTABLE) + restarting = (rs_ctx != NULL && rs_ctx->rsm != NULL); +#endif + /* skip argument check when restarting */ + if (!restarting) { + /* check_privkey is free */ + MBEDTLS_ECP_BUDGET(MBEDTLS_ECP_OPS_CHK); + + /* Common sanity checks */ + MBEDTLS_MPI_CHK(mbedtls_ecp_check_privkey(grp, m)); + MBEDTLS_MPI_CHK(mbedtls_ecp_check_pubkey(grp, P)); + } + + ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) + if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_MONTGOMERY) { + MBEDTLS_MPI_CHK(ecp_mul_mxz(grp, R, m, P, f_rng, p_rng)); + } +#endif +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) + if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) { + MBEDTLS_MPI_CHK(ecp_mul_comb(grp, R, m, P, f_rng, p_rng, rs_ctx)); + } +#endif + +cleanup: + +#if defined(MBEDTLS_ECP_INTERNAL_ALT) + if (is_grp_capable) { + mbedtls_internal_ecp_free(grp); + } +#endif /* MBEDTLS_ECP_INTERNAL_ALT */ + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL) { + rs_ctx->depth--; + } +#endif + + return ret; +} + +/* + * Multiplication R = m * P + */ +int mbedtls_ecp_mul(mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_mpi *m, const mbedtls_ecp_point *P, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(R != NULL); + ECP_VALIDATE_RET(m != NULL); + ECP_VALIDATE_RET(P != NULL); + return mbedtls_ecp_mul_restartable(grp, R, m, P, f_rng, p_rng, NULL); +} + +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) +/* + * Check that an affine point is valid as a public key, + * short weierstrass curves (SEC1 3.2.3.1) + */ +static int ecp_check_pubkey_sw(const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi YY, RHS; + + /* pt coordinates must be normalized for our checks */ + if (mbedtls_mpi_cmp_int(&pt->X, 0) < 0 || + mbedtls_mpi_cmp_int(&pt->Y, 0) < 0 || + mbedtls_mpi_cmp_mpi(&pt->X, &grp->P) >= 0 || + mbedtls_mpi_cmp_mpi(&pt->Y, &grp->P) >= 0) { + return MBEDTLS_ERR_ECP_INVALID_KEY; + } + + mbedtls_mpi_init(&YY); mbedtls_mpi_init(&RHS); + + /* + * YY = Y^2 + * RHS = X (X^2 + A) + B = X^3 + A X + B + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &YY, &pt->Y, &pt->Y)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &RHS, &pt->X, &pt->X)); + + /* Special case for A = -3 */ + if (grp->A.p == NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&RHS, &RHS, 3)); MOD_SUB(RHS); + } else { + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mod(grp, &RHS, &RHS, &grp->A)); + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mod(grp, &RHS, &RHS, &pt->X)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mod(grp, &RHS, &RHS, &grp->B)); + + if (mbedtls_mpi_cmp_mpi(&YY, &RHS) != 0) { + ret = MBEDTLS_ERR_ECP_INVALID_KEY; + } + +cleanup: + + mbedtls_mpi_free(&YY); mbedtls_mpi_free(&RHS); + + return ret; +} +#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */ + +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) +/* + * R = m * P with shortcuts for m == 0, m == 1 and m == -1 + * NOT constant-time - ONLY for short Weierstrass! + */ +static int mbedtls_ecp_mul_shortcuts(mbedtls_ecp_group *grp, + mbedtls_ecp_point *R, + const mbedtls_mpi *m, + const mbedtls_ecp_point *P, + mbedtls_ecp_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (mbedtls_mpi_cmp_int(m, 0) == 0) { + MBEDTLS_MPI_CHK(mbedtls_ecp_check_pubkey(grp, P)); + MBEDTLS_MPI_CHK(mbedtls_ecp_set_zero(R)); + } else if (mbedtls_mpi_cmp_int(m, 1) == 0) { + MBEDTLS_MPI_CHK(mbedtls_ecp_check_pubkey(grp, P)); + MBEDTLS_MPI_CHK(mbedtls_ecp_copy(R, P)); + } else if (mbedtls_mpi_cmp_int(m, -1) == 0) { + MBEDTLS_MPI_CHK(mbedtls_ecp_check_pubkey(grp, P)); + MBEDTLS_MPI_CHK(mbedtls_ecp_copy(R, P)); + if (mbedtls_mpi_cmp_int(&R->Y, 0) != 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&R->Y, &grp->P, &R->Y)); + } + } else { + MBEDTLS_MPI_CHK(mbedtls_ecp_mul_restartable(grp, R, m, P, + NULL, NULL, rs_ctx)); + } + +cleanup: + return ret; +} + +/* + * Restartable linear combination + * NOT constant-time + */ +int mbedtls_ecp_muladd_restartable( + mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_mpi *m, const mbedtls_ecp_point *P, + const mbedtls_mpi *n, const mbedtls_ecp_point *Q, + mbedtls_ecp_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_point mP; + mbedtls_ecp_point *pmP = &mP; + mbedtls_ecp_point *pR = R; +#if defined(MBEDTLS_ECP_INTERNAL_ALT) + char is_grp_capable = 0; +#endif + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(R != NULL); + ECP_VALIDATE_RET(m != NULL); + ECP_VALIDATE_RET(P != NULL); + ECP_VALIDATE_RET(n != NULL); + ECP_VALIDATE_RET(Q != NULL); + + if (mbedtls_ecp_get_type(grp) != MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) { + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + } + + mbedtls_ecp_point_init(&mP); + + ECP_RS_ENTER(ma); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->ma != NULL) { + /* redirect intermediate results to restart context */ + pmP = &rs_ctx->ma->mP; + pR = &rs_ctx->ma->R; + + /* jump to next operation */ + if (rs_ctx->ma->state == ecp_rsma_mul2) { + goto mul2; + } + if (rs_ctx->ma->state == ecp_rsma_add) { + goto add; + } + if (rs_ctx->ma->state == ecp_rsma_norm) { + goto norm; + } + } +#endif /* MBEDTLS_ECP_RESTARTABLE */ + + MBEDTLS_MPI_CHK(mbedtls_ecp_mul_shortcuts(grp, pmP, m, P, rs_ctx)); +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->ma != NULL) { + rs_ctx->ma->state = ecp_rsma_mul2; + } + +mul2: +#endif + MBEDTLS_MPI_CHK(mbedtls_ecp_mul_shortcuts(grp, pR, n, Q, rs_ctx)); + +#if defined(MBEDTLS_ECP_INTERNAL_ALT) + if ((is_grp_capable = mbedtls_internal_ecp_grp_capable(grp))) { + MBEDTLS_MPI_CHK(mbedtls_internal_ecp_init(grp)); + } +#endif /* MBEDTLS_ECP_INTERNAL_ALT */ + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->ma != NULL) { + rs_ctx->ma->state = ecp_rsma_add; + } + +add: +#endif + MBEDTLS_ECP_BUDGET(MBEDTLS_ECP_OPS_ADD); + MBEDTLS_MPI_CHK(ecp_add_mixed(grp, pR, pmP, pR)); +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->ma != NULL) { + rs_ctx->ma->state = ecp_rsma_norm; + } + +norm: +#endif + MBEDTLS_ECP_BUDGET(MBEDTLS_ECP_OPS_INV); + MBEDTLS_MPI_CHK(ecp_normalize_jac(grp, pR)); + +#if defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && rs_ctx->ma != NULL) { + MBEDTLS_MPI_CHK(mbedtls_ecp_copy(R, pR)); + } +#endif + +cleanup: +#if defined(MBEDTLS_ECP_INTERNAL_ALT) + if (is_grp_capable) { + mbedtls_internal_ecp_free(grp); + } +#endif /* MBEDTLS_ECP_INTERNAL_ALT */ + + mbedtls_ecp_point_free(&mP); + + ECP_RS_LEAVE(ma); + + return ret; +} + +/* + * Linear combination + * NOT constant-time + */ +int mbedtls_ecp_muladd(mbedtls_ecp_group *grp, mbedtls_ecp_point *R, + const mbedtls_mpi *m, const mbedtls_ecp_point *P, + const mbedtls_mpi *n, const mbedtls_ecp_point *Q) +{ + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(R != NULL); + ECP_VALIDATE_RET(m != NULL); + ECP_VALIDATE_RET(P != NULL); + ECP_VALIDATE_RET(n != NULL); + ECP_VALIDATE_RET(Q != NULL); + return mbedtls_ecp_muladd_restartable(grp, R, m, P, n, Q, NULL); +} +#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */ + +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) +#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) +#define ECP_MPI_INIT(s, n, p) { s, (n), (mbedtls_mpi_uint *) (p) } +#define ECP_MPI_INIT_ARRAY(x) \ + ECP_MPI_INIT(1, sizeof(x) / sizeof(mbedtls_mpi_uint), x) +/* + * Constants for the two points other than 0, 1, -1 (mod p) in + * https://cr.yp.to/ecdh.html#validate + * See ecp_check_pubkey_x25519(). + */ +static const mbedtls_mpi_uint x25519_bad_point_1[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae), + MBEDTLS_BYTES_TO_T_UINT_8(0x16, 0x56, 0xe3, 0xfa, 0xf1, 0x9f, 0xc4, 0x6a), + MBEDTLS_BYTES_TO_T_UINT_8(0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32, 0xb1, 0xfd), + MBEDTLS_BYTES_TO_T_UINT_8(0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8, 0x00), +}; +static const mbedtls_mpi_uint x25519_bad_point_2[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x5f, 0x9c, 0x95, 0xbc, 0xa3, 0x50, 0x8c, 0x24), + MBEDTLS_BYTES_TO_T_UINT_8(0xb1, 0xd0, 0xb1, 0x55, 0x9c, 0x83, 0xef, 0x5b), + MBEDTLS_BYTES_TO_T_UINT_8(0x04, 0x44, 0x5c, 0xc4, 0x58, 0x1c, 0x8e, 0x86), + MBEDTLS_BYTES_TO_T_UINT_8(0xd8, 0x22, 0x4e, 0xdd, 0xd0, 0x9f, 0x11, 0x57), +}; +static const mbedtls_mpi ecp_x25519_bad_point_1 = ECP_MPI_INIT_ARRAY( + x25519_bad_point_1); +static const mbedtls_mpi ecp_x25519_bad_point_2 = ECP_MPI_INIT_ARRAY( + x25519_bad_point_2); +#endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */ + +/* + * Check that the input point is not one of the low-order points. + * This is recommended by the "May the Fourth" paper: + * https://eprint.iacr.org/2017/806.pdf + * Those points are never sent by an honest peer. + */ +static int ecp_check_bad_points_mx(const mbedtls_mpi *X, const mbedtls_mpi *P, + const mbedtls_ecp_group_id grp_id) +{ + int ret; + mbedtls_mpi XmP; + + mbedtls_mpi_init(&XmP); + + /* Reduce X mod P so that we only need to check values less than P. + * We know X < 2^256 so we can proceed by subtraction. */ + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&XmP, X)); + while (mbedtls_mpi_cmp_mpi(&XmP, P) >= 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&XmP, &XmP, P)); + } + + /* Check against the known bad values that are less than P. For Curve448 + * these are 0, 1 and -1. For Curve25519 we check the values less than P + * from the following list: https://cr.yp.to/ecdh.html#validate */ + if (mbedtls_mpi_cmp_int(&XmP, 1) <= 0) { /* takes care of 0 and 1 */ + ret = MBEDTLS_ERR_ECP_INVALID_KEY; + goto cleanup; + } + +#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) + if (grp_id == MBEDTLS_ECP_DP_CURVE25519) { + if (mbedtls_mpi_cmp_mpi(&XmP, &ecp_x25519_bad_point_1) == 0) { + ret = MBEDTLS_ERR_ECP_INVALID_KEY; + goto cleanup; + } + + if (mbedtls_mpi_cmp_mpi(&XmP, &ecp_x25519_bad_point_2) == 0) { + ret = MBEDTLS_ERR_ECP_INVALID_KEY; + goto cleanup; + } + } +#else + (void) grp_id; +#endif + + /* Final check: check if XmP + 1 is P (final because it changes XmP!) */ + MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(&XmP, &XmP, 1)); + if (mbedtls_mpi_cmp_mpi(&XmP, P) == 0) { + ret = MBEDTLS_ERR_ECP_INVALID_KEY; + goto cleanup; + } + + ret = 0; + +cleanup: + mbedtls_mpi_free(&XmP); + + return ret; +} + +/* + * Check validity of a public key for Montgomery curves with x-only schemes + */ +static int ecp_check_pubkey_mx(const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt) +{ + /* [Curve25519 p. 5] Just check X is the correct number of bytes */ + /* Allow any public value, if it's too big then we'll just reduce it mod p + * (RFC 7748 sec. 5 para. 3). */ + if (mbedtls_mpi_size(&pt->X) > (grp->nbits + 7) / 8) { + return MBEDTLS_ERR_ECP_INVALID_KEY; + } + + /* Implicit in all standards (as they don't consider negative numbers): + * X must be non-negative. This is normally ensured by the way it's + * encoded for transmission, but let's be extra sure. */ + if (mbedtls_mpi_cmp_int(&pt->X, 0) < 0) { + return MBEDTLS_ERR_ECP_INVALID_KEY; + } + + return ecp_check_bad_points_mx(&pt->X, &grp->P, grp->id); +} +#endif /* MBEDTLS_ECP_MONTGOMERY_ENABLED */ + +/* + * Check that a point is valid as a public key + */ +int mbedtls_ecp_check_pubkey(const mbedtls_ecp_group *grp, + const mbedtls_ecp_point *pt) +{ + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(pt != NULL); + + /* Must use affine coordinates */ + if (mbedtls_mpi_cmp_int(&pt->Z, 1) != 0) { + return MBEDTLS_ERR_ECP_INVALID_KEY; + } + +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) + if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_MONTGOMERY) { + return ecp_check_pubkey_mx(grp, pt); + } +#endif +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) + if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) { + return ecp_check_pubkey_sw(grp, pt); + } +#endif + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; +} + +/* + * Check that an mbedtls_mpi is valid as a private key + */ +int mbedtls_ecp_check_privkey(const mbedtls_ecp_group *grp, + const mbedtls_mpi *d) +{ + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(d != NULL); + +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) + if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_MONTGOMERY) { + /* see RFC 7748 sec. 5 para. 5 */ + if (mbedtls_mpi_get_bit(d, 0) != 0 || + mbedtls_mpi_get_bit(d, 1) != 0 || + mbedtls_mpi_bitlen(d) != grp->nbits + 1) { /* mbedtls_mpi_bitlen is one-based! */ + return MBEDTLS_ERR_ECP_INVALID_KEY; + } + + /* see [Curve25519] page 5 */ + if (grp->nbits == 254 && mbedtls_mpi_get_bit(d, 2) != 0) { + return MBEDTLS_ERR_ECP_INVALID_KEY; + } + + return 0; + } +#endif /* MBEDTLS_ECP_MONTGOMERY_ENABLED */ +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) + if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) { + /* see SEC1 3.2 */ + if (mbedtls_mpi_cmp_int(d, 1) < 0 || + mbedtls_mpi_cmp_mpi(d, &grp->N) >= 0) { + return MBEDTLS_ERR_ECP_INVALID_KEY; + } else { + return 0; + } + } +#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */ + + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; +} + +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) +MBEDTLS_STATIC_TESTABLE +int mbedtls_ecp_gen_privkey_mx(size_t high_bit, + mbedtls_mpi *d, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + size_t n_random_bytes = high_bit / 8 + 1; + + /* [Curve25519] page 5 */ + /* Generate a (high_bit+1)-bit random number by generating just enough + * random bytes, then shifting out extra bits from the top (necessary + * when (high_bit+1) is not a multiple of 8). */ + MBEDTLS_MPI_CHK(mbedtls_mpi_fill_random(d, n_random_bytes, + f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(d, 8 * n_random_bytes - high_bit - 1)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(d, high_bit, 1)); + + /* Make sure the last two bits are unset for Curve448, three bits for + Curve25519 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(d, 0, 0)); + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(d, 1, 0)); + if (high_bit == 254) { + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(d, 2, 0)); + } + +cleanup: + return ret; +} +#endif /* MBEDTLS_ECP_MONTGOMERY_ENABLED */ + +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) +static int mbedtls_ecp_gen_privkey_sw( + const mbedtls_mpi *N, mbedtls_mpi *d, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + int ret = mbedtls_mpi_random(d, 1, N, f_rng, p_rng); + switch (ret) { + case MBEDTLS_ERR_MPI_NOT_ACCEPTABLE: + return MBEDTLS_ERR_ECP_RANDOM_FAILED; + default: + return ret; + } +} +#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */ + +/* + * Generate a private key + */ +int mbedtls_ecp_gen_privkey(const mbedtls_ecp_group *grp, + mbedtls_mpi *d, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(d != NULL); + ECP_VALIDATE_RET(f_rng != NULL); + +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) + if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_MONTGOMERY) { + return mbedtls_ecp_gen_privkey_mx(grp->nbits, d, f_rng, p_rng); + } +#endif /* MBEDTLS_ECP_MONTGOMERY_ENABLED */ + +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) + if (mbedtls_ecp_get_type(grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) { + return mbedtls_ecp_gen_privkey_sw(&grp->N, d, f_rng, p_rng); + } +#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */ + + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; +} + +/* + * Generate a keypair with configurable base point + */ +int mbedtls_ecp_gen_keypair_base(mbedtls_ecp_group *grp, + const mbedtls_ecp_point *G, + mbedtls_mpi *d, mbedtls_ecp_point *Q, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(d != NULL); + ECP_VALIDATE_RET(G != NULL); + ECP_VALIDATE_RET(Q != NULL); + ECP_VALIDATE_RET(f_rng != NULL); + + MBEDTLS_MPI_CHK(mbedtls_ecp_gen_privkey(grp, d, f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_ecp_mul(grp, Q, d, G, f_rng, p_rng)); + +cleanup: + return ret; +} + +/* + * Generate key pair, wrapper for conventional base point + */ +int mbedtls_ecp_gen_keypair(mbedtls_ecp_group *grp, + mbedtls_mpi *d, mbedtls_ecp_point *Q, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + ECP_VALIDATE_RET(grp != NULL); + ECP_VALIDATE_RET(d != NULL); + ECP_VALIDATE_RET(Q != NULL); + ECP_VALIDATE_RET(f_rng != NULL); + + return mbedtls_ecp_gen_keypair_base(grp, &grp->G, d, Q, f_rng, p_rng); +} + +/* + * Generate a keypair, prettier wrapper + */ +int mbedtls_ecp_gen_key(mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + ECP_VALIDATE_RET(key != NULL); + ECP_VALIDATE_RET(f_rng != NULL); + + if ((ret = mbedtls_ecp_group_load(&key->grp, grp_id)) != 0) { + return ret; + } + + return mbedtls_ecp_gen_keypair(&key->grp, &key->d, &key->Q, f_rng, p_rng); +} + +#define ECP_CURVE25519_KEY_SIZE 32 +/* + * Read a private key. + */ +int mbedtls_ecp_read_key(mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key, + const unsigned char *buf, size_t buflen) +{ + int ret = 0; + + ECP_VALIDATE_RET(key != NULL); + ECP_VALIDATE_RET(buf != NULL); + + if ((ret = mbedtls_ecp_group_load(&key->grp, grp_id)) != 0) { + return ret; + } + + ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) + if (mbedtls_ecp_get_type(&key->grp) == MBEDTLS_ECP_TYPE_MONTGOMERY) { + /* + * If it is Curve25519 curve then mask the key as mandated by RFC7748 + */ + if (grp_id == MBEDTLS_ECP_DP_CURVE25519) { + if (buflen != ECP_CURVE25519_KEY_SIZE) { + return MBEDTLS_ERR_ECP_INVALID_KEY; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary_le(&key->d, buf, buflen)); + + /* Set the three least significant bits to 0 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(&key->d, 0, 0)); + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(&key->d, 1, 0)); + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(&key->d, 2, 0)); + + /* Set the most significant bit to 0 */ + MBEDTLS_MPI_CHK( + mbedtls_mpi_set_bit(&key->d, + ECP_CURVE25519_KEY_SIZE * 8 - 1, 0) + ); + + /* Set the second most significant bit to 1 */ + MBEDTLS_MPI_CHK( + mbedtls_mpi_set_bit(&key->d, + ECP_CURVE25519_KEY_SIZE * 8 - 2, 1) + ); + } else { + ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + } + } + +#endif +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) + if (mbedtls_ecp_get_type(&key->grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) { + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&key->d, buf, buflen)); + + MBEDTLS_MPI_CHK(mbedtls_ecp_check_privkey(&key->grp, &key->d)); + } + +#endif +cleanup: + + if (ret != 0) { + mbedtls_mpi_free(&key->d); + } + + return ret; +} + +/* + * Write a private key. + */ +int mbedtls_ecp_write_key(mbedtls_ecp_keypair *key, + unsigned char *buf, size_t buflen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + ECP_VALIDATE_RET(key != NULL); + ECP_VALIDATE_RET(buflen == 0 || buf != NULL); + +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) + if (mbedtls_ecp_get_type(&key->grp) == MBEDTLS_ECP_TYPE_MONTGOMERY) { + if (key->grp.id == MBEDTLS_ECP_DP_CURVE25519) { + if (buflen < ECP_CURVE25519_KEY_SIZE) { + return MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary_le(&key->d, buf, buflen)); + } else { + ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + } + } + +#endif +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) + if (mbedtls_ecp_get_type(&key->grp) == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS) { + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&key->d, buf, buflen)); + } + +#endif +cleanup: + + return ret; +} + + +/* + * Check a public-private key pair + */ +int mbedtls_ecp_check_pub_priv(const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_point Q; + mbedtls_ecp_group grp; + ECP_VALIDATE_RET(pub != NULL); + ECP_VALIDATE_RET(prv != NULL); + + if (pub->grp.id == MBEDTLS_ECP_DP_NONE || + pub->grp.id != prv->grp.id || + mbedtls_mpi_cmp_mpi(&pub->Q.X, &prv->Q.X) || + mbedtls_mpi_cmp_mpi(&pub->Q.Y, &prv->Q.Y) || + mbedtls_mpi_cmp_mpi(&pub->Q.Z, &prv->Q.Z)) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + mbedtls_ecp_point_init(&Q); + mbedtls_ecp_group_init(&grp); + + /* mbedtls_ecp_mul() needs a non-const group... */ + mbedtls_ecp_group_copy(&grp, &prv->grp); + + /* Also checks d is valid */ + MBEDTLS_MPI_CHK(mbedtls_ecp_mul(&grp, &Q, &prv->d, &prv->grp.G, NULL, NULL)); + + if (mbedtls_mpi_cmp_mpi(&Q.X, &prv->Q.X) || + mbedtls_mpi_cmp_mpi(&Q.Y, &prv->Q.Y) || + mbedtls_mpi_cmp_mpi(&Q.Z, &prv->Q.Z)) { + ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + goto cleanup; + } + +cleanup: + mbedtls_ecp_point_free(&Q); + mbedtls_ecp_group_free(&grp); + + return ret; +} + +#if defined(MBEDTLS_SELF_TEST) + +/* Adjust the exponent to be a valid private point for the specified curve. + * This is sometimes necessary because we use a single set of exponents + * for all curves but the validity of values depends on the curve. */ +static int self_test_adjust_exponent(const mbedtls_ecp_group *grp, + mbedtls_mpi *m) +{ + int ret = 0; + switch (grp->id) { + /* If Curve25519 is available, then that's what we use for the + * Montgomery test, so we don't need the adjustment code. */ +#if !defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) +#if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) + case MBEDTLS_ECP_DP_CURVE448: + /* Move highest bit from 254 to N-1. Setting bit N-1 is + * necessary to enforce the highest-bit-set constraint. */ + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(m, 254, 0)); + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(m, grp->nbits, 1)); + /* Copy second-highest bit from 253 to N-2. This is not + * necessary but improves the test variety a bit. */ + MBEDTLS_MPI_CHK( + mbedtls_mpi_set_bit(m, grp->nbits - 1, + mbedtls_mpi_get_bit(m, 253))); + break; +#endif +#endif /* ! defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) */ + default: + /* Non-Montgomery curves and Curve25519 need no adjustment. */ + (void) grp; + (void) m; + goto cleanup; + } +cleanup: + return ret; +} + +/* Calculate R = m.P for each m in exponents. Check that the number of + * basic operations doesn't depend on the value of m. */ +static int self_test_point(int verbose, + mbedtls_ecp_group *grp, + mbedtls_ecp_point *R, + mbedtls_mpi *m, + const mbedtls_ecp_point *P, + const char *const *exponents, + size_t n_exponents) +{ + int ret = 0; + size_t i = 0; + unsigned long add_c_prev, dbl_c_prev, mul_c_prev; + add_count = 0; + dbl_count = 0; + mul_count = 0; + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(m, 16, exponents[0])); + MBEDTLS_MPI_CHK(self_test_adjust_exponent(grp, m)); + MBEDTLS_MPI_CHK(mbedtls_ecp_mul(grp, R, m, P, NULL, NULL)); + + for (i = 1; i < n_exponents; i++) { + add_c_prev = add_count; + dbl_c_prev = dbl_count; + mul_c_prev = mul_count; + add_count = 0; + dbl_count = 0; + mul_count = 0; + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(m, 16, exponents[i])); + MBEDTLS_MPI_CHK(self_test_adjust_exponent(grp, m)); + MBEDTLS_MPI_CHK(mbedtls_ecp_mul(grp, R, m, P, NULL, NULL)); + + if (add_count != add_c_prev || + dbl_count != dbl_c_prev || + mul_count != mul_c_prev) { + ret = 1; + break; + } + } + +cleanup: + if (verbose != 0) { + if (ret != 0) { + mbedtls_printf("failed (%u)\n", (unsigned int) i); + } else { + mbedtls_printf("passed\n"); + } + } + return ret; +} + +/* + * Checkup routine + */ +int mbedtls_ecp_self_test(int verbose) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_group grp; + mbedtls_ecp_point R, P; + mbedtls_mpi m; + +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) + /* Exponents especially adapted for secp192k1, which has the lowest + * order n of all supported curves (secp192r1 is in a slightly larger + * field but the order of its base point is slightly smaller). */ + const char *sw_exponents[] = + { + "000000000000000000000000000000000000000000000001", /* one */ + "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8C", /* n - 1 */ + "5EA6F389A38B8BC81E767753B15AA5569E1782E30ABE7D25", /* random */ + "400000000000000000000000000000000000000000000000", /* one and zeros */ + "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", /* all ones */ + "555555555555555555555555555555555555555555555555", /* 101010... */ + }; +#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */ +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) + const char *m_exponents[] = + { + /* Valid private values for Curve25519. In a build with Curve448 + * but not Curve25519, they will be adjusted in + * self_test_adjust_exponent(). */ + "4000000000000000000000000000000000000000000000000000000000000000", + "5C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C30", + "5715ECCE24583F7A7023C24164390586842E816D7280A49EF6DF4EAE6B280BF8", + "41A2B017516F6D254E1F002BCCBADD54BE30F8CEC737A0E912B4963B6BA74460", + "5555555555555555555555555555555555555555555555555555555555555550", + "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8", + }; +#endif /* MBEDTLS_ECP_MONTGOMERY_ENABLED */ + + mbedtls_ecp_group_init(&grp); + mbedtls_ecp_point_init(&R); + mbedtls_ecp_point_init(&P); + mbedtls_mpi_init(&m); + +#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED) + /* Use secp192r1 if available, or any available curve */ +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) + MBEDTLS_MPI_CHK(mbedtls_ecp_group_load(&grp, MBEDTLS_ECP_DP_SECP192R1)); +#else + MBEDTLS_MPI_CHK(mbedtls_ecp_group_load(&grp, mbedtls_ecp_curve_list()->grp_id)); +#endif + + if (verbose != 0) { + mbedtls_printf(" ECP SW test #1 (constant op_count, base point G): "); + } + /* Do a dummy multiplication first to trigger precomputation */ + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&m, 2)); + MBEDTLS_MPI_CHK(mbedtls_ecp_mul(&grp, &P, &m, &grp.G, NULL, NULL)); + ret = self_test_point(verbose, + &grp, &R, &m, &grp.G, + sw_exponents, + sizeof(sw_exponents) / sizeof(sw_exponents[0])); + if (ret != 0) { + goto cleanup; + } + + if (verbose != 0) { + mbedtls_printf(" ECP SW test #2 (constant op_count, other point): "); + } + /* We computed P = 2G last time, use it */ + ret = self_test_point(verbose, + &grp, &R, &m, &P, + sw_exponents, + sizeof(sw_exponents) / sizeof(sw_exponents[0])); + if (ret != 0) { + goto cleanup; + } + + mbedtls_ecp_group_free(&grp); + mbedtls_ecp_point_free(&R); +#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */ + +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) + if (verbose != 0) { + mbedtls_printf(" ECP Montgomery test (constant op_count): "); + } +#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) + MBEDTLS_MPI_CHK(mbedtls_ecp_group_load(&grp, MBEDTLS_ECP_DP_CURVE25519)); +#elif defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) + MBEDTLS_MPI_CHK(mbedtls_ecp_group_load(&grp, MBEDTLS_ECP_DP_CURVE448)); +#else +#error "MBEDTLS_ECP_MONTGOMERY_ENABLED is defined, but no curve is supported for self-test" +#endif + ret = self_test_point(verbose, + &grp, &R, &m, &grp.G, + m_exponents, + sizeof(m_exponents) / sizeof(m_exponents[0])); + if (ret != 0) { + goto cleanup; + } +#endif /* MBEDTLS_ECP_MONTGOMERY_ENABLED */ + +cleanup: + + if (ret < 0 && verbose != 0) { + mbedtls_printf("Unexpected error, return code = %08X\n", (unsigned int) ret); + } + + mbedtls_ecp_group_free(&grp); + mbedtls_ecp_point_free(&R); + mbedtls_ecp_point_free(&P); + mbedtls_mpi_free(&m); + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* !MBEDTLS_ECP_ALT */ + +#endif /* MBEDTLS_ECP_C */ diff --git a/ext/opcua_client/mbedtls/library/ecp_curves.c b/ext/opcua_client/mbedtls/library/ecp_curves.c new file mode 100644 index 0000000..61a1046 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ecp_curves.c @@ -0,0 +1,1486 @@ +/* + * Elliptic curves over GF(p): curve-specific data and functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_ECP_C) + +#include "mbedtls/ecp.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" +#include "mbedtls/bn_mul.h" + +#include "ecp_invasive.h" + +#include + +#if !defined(MBEDTLS_ECP_ALT) + +/* Parameter validation macros based on platform_util.h */ +#define ECP_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA) +#define ECP_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +#define ECP_MPI_INIT(s, n, p) { s, (n), (mbedtls_mpi_uint *) (p) } + +#define ECP_MPI_INIT_ARRAY(x) \ + ECP_MPI_INIT(1, sizeof(x) / sizeof(mbedtls_mpi_uint), x) + +/* + * Note: the constants are in little-endian order + * to be directly usable in MPIs + */ + +/* + * Domain parameters for secp192r1 + */ +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) +static const mbedtls_mpi_uint secp192r1_p[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), +}; +static const mbedtls_mpi_uint secp192r1_b[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xB1, 0xB9, 0x46, 0xC1, 0xEC, 0xDE, 0xB8, 0xFE), + MBEDTLS_BYTES_TO_T_UINT_8(0x49, 0x30, 0x24, 0x72, 0xAB, 0xE9, 0xA7, 0x0F), + MBEDTLS_BYTES_TO_T_UINT_8(0xE7, 0x80, 0x9C, 0xE5, 0x19, 0x05, 0x21, 0x64), +}; +static const mbedtls_mpi_uint secp192r1_gx[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x12, 0x10, 0xFF, 0x82, 0xFD, 0x0A, 0xFF, 0xF4), + MBEDTLS_BYTES_TO_T_UINT_8(0x00, 0x88, 0xA1, 0x43, 0xEB, 0x20, 0xBF, 0x7C), + MBEDTLS_BYTES_TO_T_UINT_8(0xF6, 0x90, 0x30, 0xB0, 0x0E, 0xA8, 0x8D, 0x18), +}; +static const mbedtls_mpi_uint secp192r1_gy[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x11, 0x48, 0x79, 0x1E, 0xA1, 0x77, 0xF9, 0x73), + MBEDTLS_BYTES_TO_T_UINT_8(0xD5, 0xCD, 0x24, 0x6B, 0xED, 0x11, 0x10, 0x63), + MBEDTLS_BYTES_TO_T_UINT_8(0x78, 0xDA, 0xC8, 0xFF, 0x95, 0x2B, 0x19, 0x07), +}; +static const mbedtls_mpi_uint secp192r1_n[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x31, 0x28, 0xD2, 0xB4, 0xB1, 0xC9, 0x6B, 0x14), + MBEDTLS_BYTES_TO_T_UINT_8(0x36, 0xF8, 0xDE, 0x99, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), +}; +#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ + +/* + * Domain parameters for secp224r1 + */ +#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) +static const mbedtls_mpi_uint secp224r1_p[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), + MBEDTLS_BYTES_TO_T_UINT_8(0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00), +}; +static const mbedtls_mpi_uint secp224r1_b[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xB4, 0xFF, 0x55, 0x23, 0x43, 0x39, 0x0B, 0x27), + MBEDTLS_BYTES_TO_T_UINT_8(0xBA, 0xD8, 0xBF, 0xD7, 0xB7, 0xB0, 0x44, 0x50), + MBEDTLS_BYTES_TO_T_UINT_8(0x56, 0x32, 0x41, 0xF5, 0xAB, 0xB3, 0x04, 0x0C), + MBEDTLS_BYTES_TO_T_UINT_4(0x85, 0x0A, 0x05, 0xB4), +}; +static const mbedtls_mpi_uint secp224r1_gx[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x21, 0x1D, 0x5C, 0x11, 0xD6, 0x80, 0x32, 0x34), + MBEDTLS_BYTES_TO_T_UINT_8(0x22, 0x11, 0xC2, 0x56, 0xD3, 0xC1, 0x03, 0x4A), + MBEDTLS_BYTES_TO_T_UINT_8(0xB9, 0x90, 0x13, 0x32, 0x7F, 0xBF, 0xB4, 0x6B), + MBEDTLS_BYTES_TO_T_UINT_4(0xBD, 0x0C, 0x0E, 0xB7), +}; +static const mbedtls_mpi_uint secp224r1_gy[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x34, 0x7E, 0x00, 0x85, 0x99, 0x81, 0xD5, 0x44), + MBEDTLS_BYTES_TO_T_UINT_8(0x64, 0x47, 0x07, 0x5A, 0xA0, 0x75, 0x43, 0xCD), + MBEDTLS_BYTES_TO_T_UINT_8(0xE6, 0xDF, 0x22, 0x4C, 0xFB, 0x23, 0xF7, 0xB5), + MBEDTLS_BYTES_TO_T_UINT_4(0x88, 0x63, 0x37, 0xBD), +}; +static const mbedtls_mpi_uint secp224r1_n[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x3D, 0x2A, 0x5C, 0x5C, 0x45, 0x29, 0xDD, 0x13), + MBEDTLS_BYTES_TO_T_UINT_8(0x3E, 0xF0, 0xB8, 0xE0, 0xA2, 0x16, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_4(0xFF, 0xFF, 0xFF, 0xFF), +}; +#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ + +/* + * Domain parameters for secp256r1 + */ +#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) +static const mbedtls_mpi_uint secp256r1_p[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00), + MBEDTLS_BYTES_TO_T_UINT_8(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), + MBEDTLS_BYTES_TO_T_UINT_8(0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF), +}; +static const mbedtls_mpi_uint secp256r1_b[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x4B, 0x60, 0xD2, 0x27, 0x3E, 0x3C, 0xCE, 0x3B), + MBEDTLS_BYTES_TO_T_UINT_8(0xF6, 0xB0, 0x53, 0xCC, 0xB0, 0x06, 0x1D, 0x65), + MBEDTLS_BYTES_TO_T_UINT_8(0xBC, 0x86, 0x98, 0x76, 0x55, 0xBD, 0xEB, 0xB3), + MBEDTLS_BYTES_TO_T_UINT_8(0xE7, 0x93, 0x3A, 0xAA, 0xD8, 0x35, 0xC6, 0x5A), +}; +static const mbedtls_mpi_uint secp256r1_gx[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x96, 0xC2, 0x98, 0xD8, 0x45, 0x39, 0xA1, 0xF4), + MBEDTLS_BYTES_TO_T_UINT_8(0xA0, 0x33, 0xEB, 0x2D, 0x81, 0x7D, 0x03, 0x77), + MBEDTLS_BYTES_TO_T_UINT_8(0xF2, 0x40, 0xA4, 0x63, 0xE5, 0xE6, 0xBC, 0xF8), + MBEDTLS_BYTES_TO_T_UINT_8(0x47, 0x42, 0x2C, 0xE1, 0xF2, 0xD1, 0x17, 0x6B), +}; +static const mbedtls_mpi_uint secp256r1_gy[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xF5, 0x51, 0xBF, 0x37, 0x68, 0x40, 0xB6, 0xCB), + MBEDTLS_BYTES_TO_T_UINT_8(0xCE, 0x5E, 0x31, 0x6B, 0x57, 0x33, 0xCE, 0x2B), + MBEDTLS_BYTES_TO_T_UINT_8(0x16, 0x9E, 0x0F, 0x7C, 0x4A, 0xEB, 0xE7, 0x8E), + MBEDTLS_BYTES_TO_T_UINT_8(0x9B, 0x7F, 0x1A, 0xFE, 0xE2, 0x42, 0xE3, 0x4F), +}; +static const mbedtls_mpi_uint secp256r1_n[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x51, 0x25, 0x63, 0xFC, 0xC2, 0xCA, 0xB9, 0xF3), + MBEDTLS_BYTES_TO_T_UINT_8(0x84, 0x9E, 0x17, 0xA7, 0xAD, 0xFA, 0xE6, 0xBC), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF), +}; +#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ + +/* + * Domain parameters for secp384r1 + */ +#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) +static const mbedtls_mpi_uint secp384r1_p[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00), + MBEDTLS_BYTES_TO_T_UINT_8(0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), +}; +static const mbedtls_mpi_uint secp384r1_b[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xEF, 0x2A, 0xEC, 0xD3, 0xED, 0xC8, 0x85, 0x2A), + MBEDTLS_BYTES_TO_T_UINT_8(0x9D, 0xD1, 0x2E, 0x8A, 0x8D, 0x39, 0x56, 0xC6), + MBEDTLS_BYTES_TO_T_UINT_8(0x5A, 0x87, 0x13, 0x50, 0x8F, 0x08, 0x14, 0x03), + MBEDTLS_BYTES_TO_T_UINT_8(0x12, 0x41, 0x81, 0xFE, 0x6E, 0x9C, 0x1D, 0x18), + MBEDTLS_BYTES_TO_T_UINT_8(0x19, 0x2D, 0xF8, 0xE3, 0x6B, 0x05, 0x8E, 0x98), + MBEDTLS_BYTES_TO_T_UINT_8(0xE4, 0xE7, 0x3E, 0xE2, 0xA7, 0x2F, 0x31, 0xB3), +}; +static const mbedtls_mpi_uint secp384r1_gx[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xB7, 0x0A, 0x76, 0x72, 0x38, 0x5E, 0x54, 0x3A), + MBEDTLS_BYTES_TO_T_UINT_8(0x6C, 0x29, 0x55, 0xBF, 0x5D, 0xF2, 0x02, 0x55), + MBEDTLS_BYTES_TO_T_UINT_8(0x38, 0x2A, 0x54, 0x82, 0xE0, 0x41, 0xF7, 0x59), + MBEDTLS_BYTES_TO_T_UINT_8(0x98, 0x9B, 0xA7, 0x8B, 0x62, 0x3B, 0x1D, 0x6E), + MBEDTLS_BYTES_TO_T_UINT_8(0x74, 0xAD, 0x20, 0xF3, 0x1E, 0xC7, 0xB1, 0x8E), + MBEDTLS_BYTES_TO_T_UINT_8(0x37, 0x05, 0x8B, 0xBE, 0x22, 0xCA, 0x87, 0xAA), +}; +static const mbedtls_mpi_uint secp384r1_gy[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x5F, 0x0E, 0xEA, 0x90, 0x7C, 0x1D, 0x43, 0x7A), + MBEDTLS_BYTES_TO_T_UINT_8(0x9D, 0x81, 0x7E, 0x1D, 0xCE, 0xB1, 0x60, 0x0A), + MBEDTLS_BYTES_TO_T_UINT_8(0xC0, 0xB8, 0xF0, 0xB5, 0x13, 0x31, 0xDA, 0xE9), + MBEDTLS_BYTES_TO_T_UINT_8(0x7C, 0x14, 0x9A, 0x28, 0xBD, 0x1D, 0xF4, 0xF8), + MBEDTLS_BYTES_TO_T_UINT_8(0x29, 0xDC, 0x92, 0x92, 0xBF, 0x98, 0x9E, 0x5D), + MBEDTLS_BYTES_TO_T_UINT_8(0x6F, 0x2C, 0x26, 0x96, 0x4A, 0xDE, 0x17, 0x36), +}; +static const mbedtls_mpi_uint secp384r1_n[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x73, 0x29, 0xC5, 0xCC, 0x6A, 0x19, 0xEC, 0xEC), + MBEDTLS_BYTES_TO_T_UINT_8(0x7A, 0xA7, 0xB0, 0x48, 0xB2, 0x0D, 0x1A, 0x58), + MBEDTLS_BYTES_TO_T_UINT_8(0xDF, 0x2D, 0x37, 0xF4, 0x81, 0x4D, 0x63, 0xC7), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), +}; +#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ + +/* + * Domain parameters for secp521r1 + */ +#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) +static const mbedtls_mpi_uint secp521r1_p[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_2(0xFF, 0x01), +}; +static const mbedtls_mpi_uint secp521r1_b[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x00, 0x3F, 0x50, 0x6B, 0xD4, 0x1F, 0x45, 0xEF), + MBEDTLS_BYTES_TO_T_UINT_8(0xF1, 0x34, 0x2C, 0x3D, 0x88, 0xDF, 0x73, 0x35), + MBEDTLS_BYTES_TO_T_UINT_8(0x07, 0xBF, 0xB1, 0x3B, 0xBD, 0xC0, 0x52, 0x16), + MBEDTLS_BYTES_TO_T_UINT_8(0x7B, 0x93, 0x7E, 0xEC, 0x51, 0x39, 0x19, 0x56), + MBEDTLS_BYTES_TO_T_UINT_8(0xE1, 0x09, 0xF1, 0x8E, 0x91, 0x89, 0xB4, 0xB8), + MBEDTLS_BYTES_TO_T_UINT_8(0xF3, 0x15, 0xB3, 0x99, 0x5B, 0x72, 0xDA, 0xA2), + MBEDTLS_BYTES_TO_T_UINT_8(0xEE, 0x40, 0x85, 0xB6, 0xA0, 0x21, 0x9A, 0x92), + MBEDTLS_BYTES_TO_T_UINT_8(0x1F, 0x9A, 0x1C, 0x8E, 0x61, 0xB9, 0x3E, 0x95), + MBEDTLS_BYTES_TO_T_UINT_2(0x51, 0x00), +}; +static const mbedtls_mpi_uint secp521r1_gx[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x66, 0xBD, 0xE5, 0xC2, 0x31, 0x7E, 0x7E, 0xF9), + MBEDTLS_BYTES_TO_T_UINT_8(0x9B, 0x42, 0x6A, 0x85, 0xC1, 0xB3, 0x48, 0x33), + MBEDTLS_BYTES_TO_T_UINT_8(0xDE, 0xA8, 0xFF, 0xA2, 0x27, 0xC1, 0x1D, 0xFE), + MBEDTLS_BYTES_TO_T_UINT_8(0x28, 0x59, 0xE7, 0xEF, 0x77, 0x5E, 0x4B, 0xA1), + MBEDTLS_BYTES_TO_T_UINT_8(0xBA, 0x3D, 0x4D, 0x6B, 0x60, 0xAF, 0x28, 0xF8), + MBEDTLS_BYTES_TO_T_UINT_8(0x21, 0xB5, 0x3F, 0x05, 0x39, 0x81, 0x64, 0x9C), + MBEDTLS_BYTES_TO_T_UINT_8(0x42, 0xB4, 0x95, 0x23, 0x66, 0xCB, 0x3E, 0x9E), + MBEDTLS_BYTES_TO_T_UINT_8(0xCD, 0xE9, 0x04, 0x04, 0xB7, 0x06, 0x8E, 0x85), + MBEDTLS_BYTES_TO_T_UINT_2(0xC6, 0x00), +}; +static const mbedtls_mpi_uint secp521r1_gy[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x50, 0x66, 0xD1, 0x9F, 0x76, 0x94, 0xBE, 0x88), + MBEDTLS_BYTES_TO_T_UINT_8(0x40, 0xC2, 0x72, 0xA2, 0x86, 0x70, 0x3C, 0x35), + MBEDTLS_BYTES_TO_T_UINT_8(0x61, 0x07, 0xAD, 0x3F, 0x01, 0xB9, 0x50, 0xC5), + MBEDTLS_BYTES_TO_T_UINT_8(0x40, 0x26, 0xF4, 0x5E, 0x99, 0x72, 0xEE, 0x97), + MBEDTLS_BYTES_TO_T_UINT_8(0x2C, 0x66, 0x3E, 0x27, 0x17, 0xBD, 0xAF, 0x17), + MBEDTLS_BYTES_TO_T_UINT_8(0x68, 0x44, 0x9B, 0x57, 0x49, 0x44, 0xF5, 0x98), + MBEDTLS_BYTES_TO_T_UINT_8(0xD9, 0x1B, 0x7D, 0x2C, 0xB4, 0x5F, 0x8A, 0x5C), + MBEDTLS_BYTES_TO_T_UINT_8(0x04, 0xC0, 0x3B, 0x9A, 0x78, 0x6A, 0x29, 0x39), + MBEDTLS_BYTES_TO_T_UINT_2(0x18, 0x01), +}; +static const mbedtls_mpi_uint secp521r1_n[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x09, 0x64, 0x38, 0x91, 0x1E, 0xB7, 0x6F, 0xBB), + MBEDTLS_BYTES_TO_T_UINT_8(0xAE, 0x47, 0x9C, 0x89, 0xB8, 0xC9, 0xB5, 0x3B), + MBEDTLS_BYTES_TO_T_UINT_8(0xD0, 0xA5, 0x09, 0xF7, 0x48, 0x01, 0xCC, 0x7F), + MBEDTLS_BYTES_TO_T_UINT_8(0x6B, 0x96, 0x2F, 0xBF, 0x83, 0x87, 0x86, 0x51), + MBEDTLS_BYTES_TO_T_UINT_8(0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_2(0xFF, 0x01), +}; +#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) +static const mbedtls_mpi_uint secp192k1_p[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x37, 0xEE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), +}; +static const mbedtls_mpi_uint secp192k1_a[] = { + MBEDTLS_BYTES_TO_T_UINT_2(0x00, 0x00), +}; +static const mbedtls_mpi_uint secp192k1_b[] = { + MBEDTLS_BYTES_TO_T_UINT_2(0x03, 0x00), +}; +static const mbedtls_mpi_uint secp192k1_gx[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x7D, 0x6C, 0xE0, 0xEA, 0xB1, 0xD1, 0xA5, 0x1D), + MBEDTLS_BYTES_TO_T_UINT_8(0x34, 0xF4, 0xB7, 0x80, 0x02, 0x7D, 0xB0, 0x26), + MBEDTLS_BYTES_TO_T_UINT_8(0xAE, 0xE9, 0x57, 0xC0, 0x0E, 0xF1, 0x4F, 0xDB), +}; +static const mbedtls_mpi_uint secp192k1_gy[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x9D, 0x2F, 0x5E, 0xD9, 0x88, 0xAA, 0x82, 0x40), + MBEDTLS_BYTES_TO_T_UINT_8(0x34, 0x86, 0xBE, 0x15, 0xD0, 0x63, 0x41, 0x84), + MBEDTLS_BYTES_TO_T_UINT_8(0xA7, 0x28, 0x56, 0x9C, 0x6D, 0x2F, 0x2F, 0x9B), +}; +static const mbedtls_mpi_uint secp192k1_n[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x8D, 0xFD, 0xDE, 0x74, 0x6A, 0x46, 0x69, 0x0F), + MBEDTLS_BYTES_TO_T_UINT_8(0x17, 0xFC, 0xF2, 0x26, 0xFE, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), +}; +#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) +static const mbedtls_mpi_uint secp224k1_p[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x6D, 0xE5, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_4(0xFF, 0xFF, 0xFF, 0xFF), +}; +static const mbedtls_mpi_uint secp224k1_a[] = { + MBEDTLS_BYTES_TO_T_UINT_2(0x00, 0x00), +}; +static const mbedtls_mpi_uint secp224k1_b[] = { + MBEDTLS_BYTES_TO_T_UINT_2(0x05, 0x00), +}; +static const mbedtls_mpi_uint secp224k1_gx[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x5C, 0xA4, 0xB7, 0xB6, 0x0E, 0x65, 0x7E, 0x0F), + MBEDTLS_BYTES_TO_T_UINT_8(0xA9, 0x75, 0x70, 0xE4, 0xE9, 0x67, 0xA4, 0x69), + MBEDTLS_BYTES_TO_T_UINT_8(0xA1, 0x28, 0xFC, 0x30, 0xDF, 0x99, 0xF0, 0x4D), + MBEDTLS_BYTES_TO_T_UINT_4(0x33, 0x5B, 0x45, 0xA1), +}; +static const mbedtls_mpi_uint secp224k1_gy[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xA5, 0x61, 0x6D, 0x55, 0xDB, 0x4B, 0xCA, 0xE2), + MBEDTLS_BYTES_TO_T_UINT_8(0x59, 0xBD, 0xB0, 0xC0, 0xF7, 0x19, 0xE3, 0xF7), + MBEDTLS_BYTES_TO_T_UINT_8(0xD6, 0xFB, 0xCA, 0x82, 0x42, 0x34, 0xBA, 0x7F), + MBEDTLS_BYTES_TO_T_UINT_4(0xED, 0x9F, 0x08, 0x7E), +}; +static const mbedtls_mpi_uint secp224k1_n[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xF7, 0xB1, 0x9F, 0x76, 0x71, 0xA9, 0xF0, 0xCA), + MBEDTLS_BYTES_TO_T_UINT_8(0x84, 0x61, 0xEC, 0xD2, 0xE8, 0xDC, 0x01, 0x00), + MBEDTLS_BYTES_TO_T_UINT_8(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), + MBEDTLS_BYTES_TO_T_UINT_8(0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00), +}; +#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) +static const mbedtls_mpi_uint secp256k1_p[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x2F, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), +}; +static const mbedtls_mpi_uint secp256k1_a[] = { + MBEDTLS_BYTES_TO_T_UINT_2(0x00, 0x00), +}; +static const mbedtls_mpi_uint secp256k1_b[] = { + MBEDTLS_BYTES_TO_T_UINT_2(0x07, 0x00), +}; +static const mbedtls_mpi_uint secp256k1_gx[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x98, 0x17, 0xF8, 0x16, 0x5B, 0x81, 0xF2, 0x59), + MBEDTLS_BYTES_TO_T_UINT_8(0xD9, 0x28, 0xCE, 0x2D, 0xDB, 0xFC, 0x9B, 0x02), + MBEDTLS_BYTES_TO_T_UINT_8(0x07, 0x0B, 0x87, 0xCE, 0x95, 0x62, 0xA0, 0x55), + MBEDTLS_BYTES_TO_T_UINT_8(0xAC, 0xBB, 0xDC, 0xF9, 0x7E, 0x66, 0xBE, 0x79), +}; +static const mbedtls_mpi_uint secp256k1_gy[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xB8, 0xD4, 0x10, 0xFB, 0x8F, 0xD0, 0x47, 0x9C), + MBEDTLS_BYTES_TO_T_UINT_8(0x19, 0x54, 0x85, 0xA6, 0x48, 0xB4, 0x17, 0xFD), + MBEDTLS_BYTES_TO_T_UINT_8(0xA8, 0x08, 0x11, 0x0E, 0xFC, 0xFB, 0xA4, 0x5D), + MBEDTLS_BYTES_TO_T_UINT_8(0x65, 0xC4, 0xA3, 0x26, 0x77, 0xDA, 0x3A, 0x48), +}; +static const mbedtls_mpi_uint secp256k1_n[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x41, 0x41, 0x36, 0xD0, 0x8C, 0x5E, 0xD2, 0xBF), + MBEDTLS_BYTES_TO_T_UINT_8(0x3B, 0xA0, 0x48, 0xAF, 0xE6, 0xDC, 0xAE, 0xBA), + MBEDTLS_BYTES_TO_T_UINT_8(0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), +}; +#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ + +/* + * Domain parameters for brainpoolP256r1 (RFC 5639 3.4) + */ +#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) +static const mbedtls_mpi_uint brainpoolP256r1_p[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x77, 0x53, 0x6E, 0x1F, 0x1D, 0x48, 0x13, 0x20), + MBEDTLS_BYTES_TO_T_UINT_8(0x28, 0x20, 0x26, 0xD5, 0x23, 0xF6, 0x3B, 0x6E), + MBEDTLS_BYTES_TO_T_UINT_8(0x72, 0x8D, 0x83, 0x9D, 0x90, 0x0A, 0x66, 0x3E), + MBEDTLS_BYTES_TO_T_UINT_8(0xBC, 0xA9, 0xEE, 0xA1, 0xDB, 0x57, 0xFB, 0xA9), +}; +static const mbedtls_mpi_uint brainpoolP256r1_a[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xD9, 0xB5, 0x30, 0xF3, 0x44, 0x4B, 0x4A, 0xE9), + MBEDTLS_BYTES_TO_T_UINT_8(0x6C, 0x5C, 0xDC, 0x26, 0xC1, 0x55, 0x80, 0xFB), + MBEDTLS_BYTES_TO_T_UINT_8(0xE7, 0xFF, 0x7A, 0x41, 0x30, 0x75, 0xF6, 0xEE), + MBEDTLS_BYTES_TO_T_UINT_8(0x57, 0x30, 0x2C, 0xFC, 0x75, 0x09, 0x5A, 0x7D), +}; +static const mbedtls_mpi_uint brainpoolP256r1_b[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xB6, 0x07, 0x8C, 0xFF, 0x18, 0xDC, 0xCC, 0x6B), + MBEDTLS_BYTES_TO_T_UINT_8(0xCE, 0xE1, 0xF7, 0x5C, 0x29, 0x16, 0x84, 0x95), + MBEDTLS_BYTES_TO_T_UINT_8(0xBF, 0x7C, 0xD7, 0xBB, 0xD9, 0xB5, 0x30, 0xF3), + MBEDTLS_BYTES_TO_T_UINT_8(0x44, 0x4B, 0x4A, 0xE9, 0x6C, 0x5C, 0xDC, 0x26), +}; +static const mbedtls_mpi_uint brainpoolP256r1_gx[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x62, 0x32, 0xCE, 0x9A, 0xBD, 0x53, 0x44, 0x3A), + MBEDTLS_BYTES_TO_T_UINT_8(0xC2, 0x23, 0xBD, 0xE3, 0xE1, 0x27, 0xDE, 0xB9), + MBEDTLS_BYTES_TO_T_UINT_8(0xAF, 0xB7, 0x81, 0xFC, 0x2F, 0x48, 0x4B, 0x2C), + MBEDTLS_BYTES_TO_T_UINT_8(0xCB, 0x57, 0x7E, 0xCB, 0xB9, 0xAE, 0xD2, 0x8B), +}; +static const mbedtls_mpi_uint brainpoolP256r1_gy[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x97, 0x69, 0x04, 0x2F, 0xC7, 0x54, 0x1D, 0x5C), + MBEDTLS_BYTES_TO_T_UINT_8(0x54, 0x8E, 0xED, 0x2D, 0x13, 0x45, 0x77, 0xC2), + MBEDTLS_BYTES_TO_T_UINT_8(0xC9, 0x1D, 0x61, 0x14, 0x1A, 0x46, 0xF8, 0x97), + MBEDTLS_BYTES_TO_T_UINT_8(0xFD, 0xC4, 0xDA, 0xC3, 0x35, 0xF8, 0x7E, 0x54), +}; +static const mbedtls_mpi_uint brainpoolP256r1_n[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xA7, 0x56, 0x48, 0x97, 0x82, 0x0E, 0x1E, 0x90), + MBEDTLS_BYTES_TO_T_UINT_8(0xF7, 0xA6, 0x61, 0xB5, 0xA3, 0x7A, 0x39, 0x8C), + MBEDTLS_BYTES_TO_T_UINT_8(0x71, 0x8D, 0x83, 0x9D, 0x90, 0x0A, 0x66, 0x3E), + MBEDTLS_BYTES_TO_T_UINT_8(0xBC, 0xA9, 0xEE, 0xA1, 0xDB, 0x57, 0xFB, 0xA9), +}; +#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ + +/* + * Domain parameters for brainpoolP384r1 (RFC 5639 3.6) + */ +#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) +static const mbedtls_mpi_uint brainpoolP384r1_p[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x53, 0xEC, 0x07, 0x31, 0x13, 0x00, 0x47, 0x87), + MBEDTLS_BYTES_TO_T_UINT_8(0x71, 0x1A, 0x1D, 0x90, 0x29, 0xA7, 0xD3, 0xAC), + MBEDTLS_BYTES_TO_T_UINT_8(0x23, 0x11, 0xB7, 0x7F, 0x19, 0xDA, 0xB1, 0x12), + MBEDTLS_BYTES_TO_T_UINT_8(0xB4, 0x56, 0x54, 0xED, 0x09, 0x71, 0x2F, 0x15), + MBEDTLS_BYTES_TO_T_UINT_8(0xDF, 0x41, 0xE6, 0x50, 0x7E, 0x6F, 0x5D, 0x0F), + MBEDTLS_BYTES_TO_T_UINT_8(0x28, 0x6D, 0x38, 0xA3, 0x82, 0x1E, 0xB9, 0x8C), +}; +static const mbedtls_mpi_uint brainpoolP384r1_a[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x26, 0x28, 0xCE, 0x22, 0xDD, 0xC7, 0xA8, 0x04), + MBEDTLS_BYTES_TO_T_UINT_8(0xEB, 0xD4, 0x3A, 0x50, 0x4A, 0x81, 0xA5, 0x8A), + MBEDTLS_BYTES_TO_T_UINT_8(0x0F, 0xF9, 0x91, 0xBA, 0xEF, 0x65, 0x91, 0x13), + MBEDTLS_BYTES_TO_T_UINT_8(0x87, 0x27, 0xB2, 0x4F, 0x8E, 0xA2, 0xBE, 0xC2), + MBEDTLS_BYTES_TO_T_UINT_8(0xA0, 0xAF, 0x05, 0xCE, 0x0A, 0x08, 0x72, 0x3C), + MBEDTLS_BYTES_TO_T_UINT_8(0x0C, 0x15, 0x8C, 0x3D, 0xC6, 0x82, 0xC3, 0x7B), +}; +static const mbedtls_mpi_uint brainpoolP384r1_b[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x11, 0x4C, 0x50, 0xFA, 0x96, 0x86, 0xB7, 0x3A), + MBEDTLS_BYTES_TO_T_UINT_8(0x94, 0xC9, 0xDB, 0x95, 0x02, 0x39, 0xB4, 0x7C), + MBEDTLS_BYTES_TO_T_UINT_8(0xD5, 0x62, 0xEB, 0x3E, 0xA5, 0x0E, 0x88, 0x2E), + MBEDTLS_BYTES_TO_T_UINT_8(0xA6, 0xD2, 0xDC, 0x07, 0xE1, 0x7D, 0xB7, 0x2F), + MBEDTLS_BYTES_TO_T_UINT_8(0x7C, 0x44, 0xF0, 0x16, 0x54, 0xB5, 0x39, 0x8B), + MBEDTLS_BYTES_TO_T_UINT_8(0x26, 0x28, 0xCE, 0x22, 0xDD, 0xC7, 0xA8, 0x04), +}; +static const mbedtls_mpi_uint brainpoolP384r1_gx[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x1E, 0xAF, 0xD4, 0x47, 0xE2, 0xB2, 0x87, 0xEF), + MBEDTLS_BYTES_TO_T_UINT_8(0xAA, 0x46, 0xD6, 0x36, 0x34, 0xE0, 0x26, 0xE8), + MBEDTLS_BYTES_TO_T_UINT_8(0xE8, 0x10, 0xBD, 0x0C, 0xFE, 0xCA, 0x7F, 0xDB), + MBEDTLS_BYTES_TO_T_UINT_8(0xE3, 0x4F, 0xF1, 0x7E, 0xE7, 0xA3, 0x47, 0x88), + MBEDTLS_BYTES_TO_T_UINT_8(0x6B, 0x3F, 0xC1, 0xB7, 0x81, 0x3A, 0xA6, 0xA2), + MBEDTLS_BYTES_TO_T_UINT_8(0xFF, 0x45, 0xCF, 0x68, 0xF0, 0x64, 0x1C, 0x1D), +}; +static const mbedtls_mpi_uint brainpoolP384r1_gy[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x15, 0x53, 0x3C, 0x26, 0x41, 0x03, 0x82, 0x42), + MBEDTLS_BYTES_TO_T_UINT_8(0x11, 0x81, 0x91, 0x77, 0x21, 0x46, 0x46, 0x0E), + MBEDTLS_BYTES_TO_T_UINT_8(0x28, 0x29, 0x91, 0xF9, 0x4F, 0x05, 0x9C, 0xE1), + MBEDTLS_BYTES_TO_T_UINT_8(0x64, 0x58, 0xEC, 0xFE, 0x29, 0x0B, 0xB7, 0x62), + MBEDTLS_BYTES_TO_T_UINT_8(0x52, 0xD5, 0xCF, 0x95, 0x8E, 0xEB, 0xB1, 0x5C), + MBEDTLS_BYTES_TO_T_UINT_8(0xA4, 0xC2, 0xF9, 0x20, 0x75, 0x1D, 0xBE, 0x8A), +}; +static const mbedtls_mpi_uint brainpoolP384r1_n[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x65, 0x65, 0x04, 0xE9, 0x02, 0x32, 0x88, 0x3B), + MBEDTLS_BYTES_TO_T_UINT_8(0x10, 0xC3, 0x7F, 0x6B, 0xAF, 0xB6, 0x3A, 0xCF), + MBEDTLS_BYTES_TO_T_UINT_8(0xA7, 0x25, 0x04, 0xAC, 0x6C, 0x6E, 0x16, 0x1F), + MBEDTLS_BYTES_TO_T_UINT_8(0xB3, 0x56, 0x54, 0xED, 0x09, 0x71, 0x2F, 0x15), + MBEDTLS_BYTES_TO_T_UINT_8(0xDF, 0x41, 0xE6, 0x50, 0x7E, 0x6F, 0x5D, 0x0F), + MBEDTLS_BYTES_TO_T_UINT_8(0x28, 0x6D, 0x38, 0xA3, 0x82, 0x1E, 0xB9, 0x8C), +}; +#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ + +/* + * Domain parameters for brainpoolP512r1 (RFC 5639 3.7) + */ +#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) +static const mbedtls_mpi_uint brainpoolP512r1_p[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xF3, 0x48, 0x3A, 0x58, 0x56, 0x60, 0xAA, 0x28), + MBEDTLS_BYTES_TO_T_UINT_8(0x85, 0xC6, 0x82, 0x2D, 0x2F, 0xFF, 0x81, 0x28), + MBEDTLS_BYTES_TO_T_UINT_8(0xE6, 0x80, 0xA3, 0xE6, 0x2A, 0xA1, 0xCD, 0xAE), + MBEDTLS_BYTES_TO_T_UINT_8(0x42, 0x68, 0xC6, 0x9B, 0x00, 0x9B, 0x4D, 0x7D), + MBEDTLS_BYTES_TO_T_UINT_8(0x71, 0x08, 0x33, 0x70, 0xCA, 0x9C, 0x63, 0xD6), + MBEDTLS_BYTES_TO_T_UINT_8(0x0E, 0xD2, 0xC9, 0xB3, 0xB3, 0x8D, 0x30, 0xCB), + MBEDTLS_BYTES_TO_T_UINT_8(0x07, 0xFC, 0xC9, 0x33, 0xAE, 0xE6, 0xD4, 0x3F), + MBEDTLS_BYTES_TO_T_UINT_8(0x8B, 0xC4, 0xE9, 0xDB, 0xB8, 0x9D, 0xDD, 0xAA), +}; +static const mbedtls_mpi_uint brainpoolP512r1_a[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xCA, 0x94, 0xFC, 0x77, 0x4D, 0xAC, 0xC1, 0xE7), + MBEDTLS_BYTES_TO_T_UINT_8(0xB9, 0xC7, 0xF2, 0x2B, 0xA7, 0x17, 0x11, 0x7F), + MBEDTLS_BYTES_TO_T_UINT_8(0xB5, 0xC8, 0x9A, 0x8B, 0xC9, 0xF1, 0x2E, 0x0A), + MBEDTLS_BYTES_TO_T_UINT_8(0xA1, 0x3A, 0x25, 0xA8, 0x5A, 0x5D, 0xED, 0x2D), + MBEDTLS_BYTES_TO_T_UINT_8(0xBC, 0x63, 0x98, 0xEA, 0xCA, 0x41, 0x34, 0xA8), + MBEDTLS_BYTES_TO_T_UINT_8(0x10, 0x16, 0xF9, 0x3D, 0x8D, 0xDD, 0xCB, 0x94), + MBEDTLS_BYTES_TO_T_UINT_8(0xC5, 0x4C, 0x23, 0xAC, 0x45, 0x71, 0x32, 0xE2), + MBEDTLS_BYTES_TO_T_UINT_8(0x89, 0x3B, 0x60, 0x8B, 0x31, 0xA3, 0x30, 0x78), +}; +static const mbedtls_mpi_uint brainpoolP512r1_b[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x23, 0xF7, 0x16, 0x80, 0x63, 0xBD, 0x09, 0x28), + MBEDTLS_BYTES_TO_T_UINT_8(0xDD, 0xE5, 0xBA, 0x5E, 0xB7, 0x50, 0x40, 0x98), + MBEDTLS_BYTES_TO_T_UINT_8(0x67, 0x3E, 0x08, 0xDC, 0xCA, 0x94, 0xFC, 0x77), + MBEDTLS_BYTES_TO_T_UINT_8(0x4D, 0xAC, 0xC1, 0xE7, 0xB9, 0xC7, 0xF2, 0x2B), + MBEDTLS_BYTES_TO_T_UINT_8(0xA7, 0x17, 0x11, 0x7F, 0xB5, 0xC8, 0x9A, 0x8B), + MBEDTLS_BYTES_TO_T_UINT_8(0xC9, 0xF1, 0x2E, 0x0A, 0xA1, 0x3A, 0x25, 0xA8), + MBEDTLS_BYTES_TO_T_UINT_8(0x5A, 0x5D, 0xED, 0x2D, 0xBC, 0x63, 0x98, 0xEA), + MBEDTLS_BYTES_TO_T_UINT_8(0xCA, 0x41, 0x34, 0xA8, 0x10, 0x16, 0xF9, 0x3D), +}; +static const mbedtls_mpi_uint brainpoolP512r1_gx[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x22, 0xF8, 0xB9, 0xBC, 0x09, 0x22, 0x35, 0x8B), + MBEDTLS_BYTES_TO_T_UINT_8(0x68, 0x5E, 0x6A, 0x40, 0x47, 0x50, 0x6D, 0x7C), + MBEDTLS_BYTES_TO_T_UINT_8(0x5F, 0x7D, 0xB9, 0x93, 0x7B, 0x68, 0xD1, 0x50), + MBEDTLS_BYTES_TO_T_UINT_8(0x8D, 0xD4, 0xD0, 0xE2, 0x78, 0x1F, 0x3B, 0xFF), + MBEDTLS_BYTES_TO_T_UINT_8(0x8E, 0x09, 0xD0, 0xF4, 0xEE, 0x62, 0x3B, 0xB4), + MBEDTLS_BYTES_TO_T_UINT_8(0xC1, 0x16, 0xD9, 0xB5, 0x70, 0x9F, 0xED, 0x85), + MBEDTLS_BYTES_TO_T_UINT_8(0x93, 0x6A, 0x4C, 0x9C, 0x2E, 0x32, 0x21, 0x5A), + MBEDTLS_BYTES_TO_T_UINT_8(0x64, 0xD9, 0x2E, 0xD8, 0xBD, 0xE4, 0xAE, 0x81), +}; +static const mbedtls_mpi_uint brainpoolP512r1_gy[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x92, 0x08, 0xD8, 0x3A, 0x0F, 0x1E, 0xCD, 0x78), + MBEDTLS_BYTES_TO_T_UINT_8(0x06, 0x54, 0xF0, 0xA8, 0x2F, 0x2B, 0xCA, 0xD1), + MBEDTLS_BYTES_TO_T_UINT_8(0xAE, 0x63, 0x27, 0x8A, 0xD8, 0x4B, 0xCA, 0x5B), + MBEDTLS_BYTES_TO_T_UINT_8(0x5E, 0x48, 0x5F, 0x4A, 0x49, 0xDE, 0xDC, 0xB2), + MBEDTLS_BYTES_TO_T_UINT_8(0x11, 0x81, 0x1F, 0x88, 0x5B, 0xC5, 0x00, 0xA0), + MBEDTLS_BYTES_TO_T_UINT_8(0x1A, 0x7B, 0xA5, 0x24, 0x00, 0xF7, 0x09, 0xF2), + MBEDTLS_BYTES_TO_T_UINT_8(0xFD, 0x22, 0x78, 0xCF, 0xA9, 0xBF, 0xEA, 0xC0), + MBEDTLS_BYTES_TO_T_UINT_8(0xEC, 0x32, 0x63, 0x56, 0x5D, 0x38, 0xDE, 0x7D), +}; +static const mbedtls_mpi_uint brainpoolP512r1_n[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x69, 0x00, 0xA9, 0x9C, 0x82, 0x96, 0x87, 0xB5), + MBEDTLS_BYTES_TO_T_UINT_8(0xDD, 0xDA, 0x5D, 0x08, 0x81, 0xD3, 0xB1, 0x1D), + MBEDTLS_BYTES_TO_T_UINT_8(0x47, 0x10, 0xAC, 0x7F, 0x19, 0x61, 0x86, 0x41), + MBEDTLS_BYTES_TO_T_UINT_8(0x19, 0x26, 0xA9, 0x4C, 0x41, 0x5C, 0x3E, 0x55), + MBEDTLS_BYTES_TO_T_UINT_8(0x70, 0x08, 0x33, 0x70, 0xCA, 0x9C, 0x63, 0xD6), + MBEDTLS_BYTES_TO_T_UINT_8(0x0E, 0xD2, 0xC9, 0xB3, 0xB3, 0x8D, 0x30, 0xCB), + MBEDTLS_BYTES_TO_T_UINT_8(0x07, 0xFC, 0xC9, 0x33, 0xAE, 0xE6, 0xD4, 0x3F), + MBEDTLS_BYTES_TO_T_UINT_8(0x8B, 0xC4, 0xE9, 0xDB, 0xB8, 0x9D, 0xDD, 0xAA), +}; +#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) +/* For these curves, we build the group parameters dynamically. */ +#define ECP_LOAD_GROUP +#endif + +#if defined(ECP_LOAD_GROUP) +/* + * Create an MPI from embedded constants + * (assumes len is an exact multiple of sizeof(mbedtls_mpi_uint)) + */ +static inline void ecp_mpi_load(mbedtls_mpi *X, const mbedtls_mpi_uint *p, size_t len) +{ + X->s = 1; + X->n = len / sizeof(mbedtls_mpi_uint); + X->p = (mbedtls_mpi_uint *) p; +} + +/* + * Set an MPI to static value 1 + */ +static inline void ecp_mpi_set1(mbedtls_mpi *X) +{ + static const mbedtls_mpi_uint one[] = { 1 }; + X->s = 1; + X->n = 1; + X->p = (mbedtls_mpi_uint *) one; /* X->p will not be modified so the cast is safe */ +} + +/* + * Make group available from embedded constants + */ +static int ecp_group_load(mbedtls_ecp_group *grp, + const mbedtls_mpi_uint *p, size_t plen, + const mbedtls_mpi_uint *a, size_t alen, + const mbedtls_mpi_uint *b, size_t blen, + const mbedtls_mpi_uint *gx, size_t gxlen, + const mbedtls_mpi_uint *gy, size_t gylen, + const mbedtls_mpi_uint *n, size_t nlen) +{ + ecp_mpi_load(&grp->P, p, plen); + if (a != NULL) { + ecp_mpi_load(&grp->A, a, alen); + } + ecp_mpi_load(&grp->B, b, blen); + ecp_mpi_load(&grp->N, n, nlen); + + ecp_mpi_load(&grp->G.X, gx, gxlen); + ecp_mpi_load(&grp->G.Y, gy, gylen); + ecp_mpi_set1(&grp->G.Z); + + grp->pbits = mbedtls_mpi_bitlen(&grp->P); + grp->nbits = mbedtls_mpi_bitlen(&grp->N); + + grp->h = 1; + + return 0; +} +#endif /* ECP_LOAD_GROUP */ + +#if defined(MBEDTLS_ECP_NIST_OPTIM) +/* Forward declarations */ +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) +static int ecp_mod_p192(mbedtls_mpi *); +#endif +#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) +static int ecp_mod_p224(mbedtls_mpi *); +#endif +#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) +static int ecp_mod_p256(mbedtls_mpi *); +#endif +#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) +static int ecp_mod_p384(mbedtls_mpi *); +#endif +#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) +static int ecp_mod_p521(mbedtls_mpi *); +#endif + +#define NIST_MODP(P) grp->modp = ecp_mod_ ## P; +#else +#define NIST_MODP(P) +#endif /* MBEDTLS_ECP_NIST_OPTIM */ + +/* Additional forward declarations */ +#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) +static int ecp_mod_p255(mbedtls_mpi *); +#endif +#if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) +static int ecp_mod_p448(mbedtls_mpi *); +#endif +#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) +static int ecp_mod_p192k1(mbedtls_mpi *); +#endif +#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) +static int ecp_mod_p224k1(mbedtls_mpi *); +#endif +#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) +static int ecp_mod_p256k1(mbedtls_mpi *); +#endif + +#if defined(ECP_LOAD_GROUP) +#define LOAD_GROUP_A(G) ecp_group_load(grp, \ + G ## _p, sizeof(G ## _p), \ + G ## _a, sizeof(G ## _a), \ + G ## _b, sizeof(G ## _b), \ + G ## _gx, sizeof(G ## _gx), \ + G ## _gy, sizeof(G ## _gy), \ + G ## _n, sizeof(G ## _n)) + +#define LOAD_GROUP(G) ecp_group_load(grp, \ + G ## _p, sizeof(G ## _p), \ + NULL, 0, \ + G ## _b, sizeof(G ## _b), \ + G ## _gx, sizeof(G ## _gx), \ + G ## _gy, sizeof(G ## _gy), \ + G ## _n, sizeof(G ## _n)) +#endif /* ECP_LOAD_GROUP */ + +#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) +/* Constants used by ecp_use_curve25519() */ +static const mbedtls_mpi_sint curve25519_a24 = 0x01DB42; +static const unsigned char curve25519_part_of_n[] = { + 0x14, 0xDE, 0xF9, 0xDE, 0xA2, 0xF7, 0x9C, 0xD6, + 0x58, 0x12, 0x63, 0x1A, 0x5C, 0xF5, 0xD3, 0xED, +}; + +/* + * Specialized function for creating the Curve25519 group + */ +static int ecp_use_curve25519(mbedtls_ecp_group *grp) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + /* Actually ( A + 2 ) / 4 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&grp->A, curve25519_a24)); + + /* P = 2^255 - 19 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&grp->P, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&grp->P, 255)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&grp->P, &grp->P, 19)); + grp->pbits = mbedtls_mpi_bitlen(&grp->P); + + /* N = 2^252 + 27742317777372353535851937790883648493 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&grp->N, + curve25519_part_of_n, sizeof(curve25519_part_of_n))); + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(&grp->N, 252, 1)); + + /* Y intentionally not set, since we use x/z coordinates. + * This is used as a marker to identify Montgomery curves! */ + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&grp->G.X, 9)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&grp->G.Z, 1)); + mbedtls_mpi_free(&grp->G.Y); + + /* Actually, the required msb for private keys */ + grp->nbits = 254; + +cleanup: + if (ret != 0) { + mbedtls_ecp_group_free(grp); + } + + return ret; +} +#endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) +/* Constants used by ecp_use_curve448() */ +static const mbedtls_mpi_sint curve448_a24 = 0x98AA; +static const unsigned char curve448_part_of_n[] = { + 0x83, 0x35, 0xDC, 0x16, 0x3B, 0xB1, 0x24, + 0xB6, 0x51, 0x29, 0xC9, 0x6F, 0xDE, 0x93, + 0x3D, 0x8D, 0x72, 0x3A, 0x70, 0xAA, 0xDC, + 0x87, 0x3D, 0x6D, 0x54, 0xA7, 0xBB, 0x0D, +}; + +/* + * Specialized function for creating the Curve448 group + */ +static int ecp_use_curve448(mbedtls_ecp_group *grp) +{ + mbedtls_mpi Ns; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + mbedtls_mpi_init(&Ns); + + /* Actually ( A + 2 ) / 4 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&grp->A, curve448_a24)); + + /* P = 2^448 - 2^224 - 1 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&grp->P, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&grp->P, 224)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&grp->P, &grp->P, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&grp->P, 224)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&grp->P, &grp->P, 1)); + grp->pbits = mbedtls_mpi_bitlen(&grp->P); + + /* Y intentionally not set, since we use x/z coordinates. + * This is used as a marker to identify Montgomery curves! */ + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&grp->G.X, 5)); + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&grp->G.Z, 1)); + mbedtls_mpi_free(&grp->G.Y); + + /* N = 2^446 - 13818066809895115352007386748515426880336692474882178609894547503885 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(&grp->N, 446, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&Ns, + curve448_part_of_n, sizeof(curve448_part_of_n))); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&grp->N, &grp->N, &Ns)); + + /* Actually, the required msb for private keys */ + grp->nbits = 447; + +cleanup: + mbedtls_mpi_free(&Ns); + if (ret != 0) { + mbedtls_ecp_group_free(grp); + } + + return ret; +} +#endif /* MBEDTLS_ECP_DP_CURVE448_ENABLED */ + +/* + * Set a group using well-known domain parameters + */ +int mbedtls_ecp_group_load(mbedtls_ecp_group *grp, mbedtls_ecp_group_id id) +{ + ECP_VALIDATE_RET(grp != NULL); + mbedtls_ecp_group_free(grp); + + mbedtls_ecp_group_init(grp); + + grp->id = id; + + switch (id) { +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) + case MBEDTLS_ECP_DP_SECP192R1: + NIST_MODP(p192); + return LOAD_GROUP(secp192r1); +#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) + case MBEDTLS_ECP_DP_SECP224R1: + NIST_MODP(p224); + return LOAD_GROUP(secp224r1); +#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) + case MBEDTLS_ECP_DP_SECP256R1: + NIST_MODP(p256); + return LOAD_GROUP(secp256r1); +#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) + case MBEDTLS_ECP_DP_SECP384R1: + NIST_MODP(p384); + return LOAD_GROUP(secp384r1); +#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) + case MBEDTLS_ECP_DP_SECP521R1: + NIST_MODP(p521); + return LOAD_GROUP(secp521r1); +#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) + case MBEDTLS_ECP_DP_SECP192K1: + grp->modp = ecp_mod_p192k1; + return LOAD_GROUP_A(secp192k1); +#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) + case MBEDTLS_ECP_DP_SECP224K1: + grp->modp = ecp_mod_p224k1; + return LOAD_GROUP_A(secp224k1); +#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) + case MBEDTLS_ECP_DP_SECP256K1: + grp->modp = ecp_mod_p256k1; + return LOAD_GROUP_A(secp256k1); +#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) + case MBEDTLS_ECP_DP_BP256R1: + return LOAD_GROUP_A(brainpoolP256r1); +#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) + case MBEDTLS_ECP_DP_BP384R1: + return LOAD_GROUP_A(brainpoolP384r1); +#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) + case MBEDTLS_ECP_DP_BP512R1: + return LOAD_GROUP_A(brainpoolP512r1); +#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) + case MBEDTLS_ECP_DP_CURVE25519: + grp->modp = ecp_mod_p255; + return ecp_use_curve25519(grp); +#endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) + case MBEDTLS_ECP_DP_CURVE448: + grp->modp = ecp_mod_p448; + return ecp_use_curve448(grp); +#endif /* MBEDTLS_ECP_DP_CURVE448_ENABLED */ + + default: + grp->id = MBEDTLS_ECP_DP_NONE; + return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + } +} + +#if defined(MBEDTLS_ECP_NIST_OPTIM) +/* + * Fast reduction modulo the primes used by the NIST curves. + * + * These functions are critical for speed, but not needed for correct + * operations. So, we make the choice to heavily rely on the internals of our + * bignum library, which creates a tight coupling between these functions and + * our MPI implementation. However, the coupling between the ECP module and + * MPI remains loose, since these functions can be deactivated at will. + */ + +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) +/* + * Compared to the way things are presented in FIPS 186-3 D.2, + * we proceed in columns, from right (least significant chunk) to left, + * adding chunks to N in place, and keeping a carry for the next chunk. + * This avoids moving things around in memory, and uselessly adding zeros, + * compared to the more straightforward, line-oriented approach. + * + * For this prime we need to handle data in chunks of 64 bits. + * Since this is always a multiple of our basic mbedtls_mpi_uint, we can + * use a mbedtls_mpi_uint * to designate such a chunk, and small loops to handle it. + */ + +/* Add 64-bit chunks (dst += src) and update carry */ +static inline void add64(mbedtls_mpi_uint *dst, mbedtls_mpi_uint *src, mbedtls_mpi_uint *carry) +{ + unsigned char i; + mbedtls_mpi_uint c = 0; + for (i = 0; i < 8 / sizeof(mbedtls_mpi_uint); i++, dst++, src++) { + *dst += c; c = (*dst < c); + *dst += *src; c += (*dst < *src); + } + *carry += c; +} + +/* Add carry to a 64-bit chunk and update carry */ +static inline void carry64(mbedtls_mpi_uint *dst, mbedtls_mpi_uint *carry) +{ + unsigned char i; + for (i = 0; i < 8 / sizeof(mbedtls_mpi_uint); i++, dst++) { + *dst += *carry; + *carry = (*dst < *carry); + } +} + +#define WIDTH 8 / sizeof(mbedtls_mpi_uint) +#define A(i) N->p + (i) * WIDTH +#define ADD(i) add64(p, A(i), &c) +#define NEXT p += WIDTH; carry64(p, &c) +#define LAST p += WIDTH; *p = c; while (++p < end) *p = 0 + +/* + * Fast quasi-reduction modulo p192 (FIPS 186-3 D.2.1) + */ +static int ecp_mod_p192(mbedtls_mpi *N) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi_uint c = 0; + mbedtls_mpi_uint *p, *end; + + /* Make sure we have enough blocks so that A(5) is legal */ + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(N, 6 * WIDTH)); + + p = N->p; + end = p + N->n; + + ADD(3); ADD(5); NEXT; // A0 += A3 + A5 + ADD(3); ADD(4); ADD(5); NEXT; // A1 += A3 + A4 + A5 + ADD(4); ADD(5); LAST; // A2 += A4 + A5 + +cleanup: + return ret; +} + +#undef WIDTH +#undef A +#undef ADD +#undef NEXT +#undef LAST +#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) +/* + * The reader is advised to first understand ecp_mod_p192() since the same + * general structure is used here, but with additional complications: + * (1) chunks of 32 bits, and (2) subtractions. + */ + +/* + * For these primes, we need to handle data in chunks of 32 bits. + * This makes it more complicated if we use 64 bits limbs in MPI, + * which prevents us from using a uniform access method as for p192. + * + * So, we define a mini abstraction layer to access 32 bit chunks, + * load them in 'cur' for work, and store them back from 'cur' when done. + * + * While at it, also define the size of N in terms of 32-bit chunks. + */ +#define LOAD32 cur = A(i); + +#if defined(MBEDTLS_HAVE_INT32) /* 32 bit */ + +#define MAX32 N->n +#define A(j) N->p[j] +#define STORE32 N->p[i] = cur; + +#else /* 64-bit */ + +#define MAX32 N->n * 2 +#define A(j) (j) % 2 ? (uint32_t) (N->p[(j)/2] >> 32) : \ + (uint32_t) (N->p[(j)/2]) +#define STORE32 \ + if (i % 2) { \ + N->p[i/2] &= 0x00000000FFFFFFFF; \ + N->p[i/2] |= ((mbedtls_mpi_uint) cur) << 32; \ + } else { \ + N->p[i/2] &= 0xFFFFFFFF00000000; \ + N->p[i/2] |= (mbedtls_mpi_uint) cur; \ + } + +#endif /* sizeof( mbedtls_mpi_uint ) */ + +/* + * Helpers for addition and subtraction of chunks, with signed carry. + */ +static inline void add32(uint32_t *dst, uint32_t src, signed char *carry) +{ + *dst += src; + *carry += (*dst < src); +} + +static inline void sub32(uint32_t *dst, uint32_t src, signed char *carry) +{ + *carry -= (*dst < src); + *dst -= src; +} + +#define ADD(j) add32(&cur, A(j), &c); +#define SUB(j) sub32(&cur, A(j), &c); + +#define ciL (sizeof(mbedtls_mpi_uint)) /* chars in limb */ +#define biL (ciL << 3) /* bits in limb */ + +/* + * Helpers for the main 'loop' + */ +#define INIT(b) \ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; \ + signed char c = 0, cc; \ + uint32_t cur; \ + size_t i = 0, bits = (b); \ + /* N is the size of the product of two b-bit numbers, plus one */ \ + /* limb for fix_negative */ \ + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(N, (b) * 2 / biL + 1)); \ + LOAD32; + +#define NEXT \ + STORE32; i++; LOAD32; \ + cc = c; c = 0; \ + if (cc < 0) \ + sub32(&cur, -cc, &c); \ + else \ + add32(&cur, cc, &c); \ + +#define LAST \ + STORE32; i++; \ + cur = c > 0 ? c : 0; STORE32; \ + cur = 0; while (++i < MAX32) { STORE32; } \ + if (c < 0) mbedtls_ecp_fix_negative(N, c, bits); + +/* + * If the result is negative, we get it in the form + * c * 2^bits + N, with c negative and N positive shorter than 'bits' + */ +MBEDTLS_STATIC_TESTABLE +void mbedtls_ecp_fix_negative(mbedtls_mpi *N, signed char c, size_t bits) +{ + size_t i; + + /* Set N := 2^bits - 1 - N. We know that 0 <= N < 2^bits, so + * set the absolute value to 0xfff...fff - N. There is no carry + * since we're subtracting from all-bits-one. */ + for (i = 0; i <= bits / 8 / sizeof(mbedtls_mpi_uint); i++) { + N->p[i] = ~(mbedtls_mpi_uint) 0 - N->p[i]; + } + /* Add 1, taking care of the carry. */ + i = 0; + do { + ++N->p[i]; + } while (N->p[i++] == 0 && i <= bits / 8 / sizeof(mbedtls_mpi_uint)); + /* Invert the sign. + * Now N = N0 - 2^bits where N0 is the initial value of N. */ + N->s = -1; + + /* Add |c| * 2^bits to the absolute value. Since c and N are + * negative, this adds c * 2^bits. */ + mbedtls_mpi_uint msw = (mbedtls_mpi_uint) -c; +#if defined(MBEDTLS_HAVE_INT64) + if (bits == 224) { + msw <<= 32; + } +#endif + N->p[bits / 8 / sizeof(mbedtls_mpi_uint)] += msw; +} + +#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) +/* + * Fast quasi-reduction modulo p224 (FIPS 186-3 D.2.2) + */ +static int ecp_mod_p224(mbedtls_mpi *N) +{ + INIT(224); + + SUB(7); SUB(11); NEXT; // A0 += -A7 - A11 + SUB(8); SUB(12); NEXT; // A1 += -A8 - A12 + SUB(9); SUB(13); NEXT; // A2 += -A9 - A13 + SUB(10); ADD(7); ADD(11); NEXT; // A3 += -A10 + A7 + A11 + SUB(11); ADD(8); ADD(12); NEXT; // A4 += -A11 + A8 + A12 + SUB(12); ADD(9); ADD(13); NEXT; // A5 += -A12 + A9 + A13 + SUB(13); ADD(10); LAST; // A6 += -A13 + A10 + +cleanup: + return ret; +} +#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) +/* + * Fast quasi-reduction modulo p256 (FIPS 186-3 D.2.3) + */ +static int ecp_mod_p256(mbedtls_mpi *N) +{ + INIT(256); + + ADD(8); ADD(9); + SUB(11); SUB(12); SUB(13); SUB(14); NEXT; // A0 + + ADD(9); ADD(10); + SUB(12); SUB(13); SUB(14); SUB(15); NEXT; // A1 + + ADD(10); ADD(11); + SUB(13); SUB(14); SUB(15); NEXT; // A2 + + ADD(11); ADD(11); ADD(12); ADD(12); ADD(13); + SUB(15); SUB(8); SUB(9); NEXT; // A3 + + ADD(12); ADD(12); ADD(13); ADD(13); ADD(14); + SUB(9); SUB(10); NEXT; // A4 + + ADD(13); ADD(13); ADD(14); ADD(14); ADD(15); + SUB(10); SUB(11); NEXT; // A5 + + ADD(14); ADD(14); ADD(15); ADD(15); ADD(14); ADD(13); + SUB(8); SUB(9); NEXT; // A6 + + ADD(15); ADD(15); ADD(15); ADD(8); + SUB(10); SUB(11); SUB(12); SUB(13); LAST; // A7 + +cleanup: + return ret; +} +#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) +/* + * Fast quasi-reduction modulo p384 (FIPS 186-3 D.2.4) + */ +static int ecp_mod_p384(mbedtls_mpi *N) +{ + INIT(384); + + ADD(12); ADD(21); ADD(20); + SUB(23); NEXT; // A0 + + ADD(13); ADD(22); ADD(23); + SUB(12); SUB(20); NEXT; // A2 + + ADD(14); ADD(23); + SUB(13); SUB(21); NEXT; // A2 + + ADD(15); ADD(12); ADD(20); ADD(21); + SUB(14); SUB(22); SUB(23); NEXT; // A3 + + ADD(21); ADD(21); ADD(16); ADD(13); ADD(12); ADD(20); ADD(22); + SUB(15); SUB(23); SUB(23); NEXT; // A4 + + ADD(22); ADD(22); ADD(17); ADD(14); ADD(13); ADD(21); ADD(23); + SUB(16); NEXT; // A5 + + ADD(23); ADD(23); ADD(18); ADD(15); ADD(14); ADD(22); + SUB(17); NEXT; // A6 + + ADD(19); ADD(16); ADD(15); ADD(23); + SUB(18); NEXT; // A7 + + ADD(20); ADD(17); ADD(16); + SUB(19); NEXT; // A8 + + ADD(21); ADD(18); ADD(17); + SUB(20); NEXT; // A9 + + ADD(22); ADD(19); ADD(18); + SUB(21); NEXT; // A10 + + ADD(23); ADD(20); ADD(19); + SUB(22); LAST; // A11 + +cleanup: + return ret; +} +#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ + +#undef A +#undef LOAD32 +#undef STORE32 +#undef MAX32 +#undef INIT +#undef NEXT +#undef LAST + +#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED || + MBEDTLS_ECP_DP_SECP256R1_ENABLED || + MBEDTLS_ECP_DP_SECP384R1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) +/* + * Here we have an actual Mersenne prime, so things are more straightforward. + * However, chunks are aligned on a 'weird' boundary (521 bits). + */ + +/* Size of p521 in terms of mbedtls_mpi_uint */ +#define P521_WIDTH (521 / 8 / sizeof(mbedtls_mpi_uint) + 1) + +/* Bits to keep in the most significant mbedtls_mpi_uint */ +#define P521_MASK 0x01FF + +/* + * Fast quasi-reduction modulo p521 (FIPS 186-3 D.2.5) + * Write N as A1 + 2^521 A0, return A0 + A1 + */ +static int ecp_mod_p521(mbedtls_mpi *N) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i; + mbedtls_mpi M; + mbedtls_mpi_uint Mp[P521_WIDTH + 1]; + /* Worst case for the size of M is when mbedtls_mpi_uint is 16 bits: + * we need to hold bits 513 to 1056, which is 34 limbs, that is + * P521_WIDTH + 1. Otherwise P521_WIDTH is enough. */ + + if (N->n < P521_WIDTH) { + return 0; + } + + /* M = A1 */ + M.s = 1; + M.n = N->n - (P521_WIDTH - 1); + if (M.n > P521_WIDTH + 1) { + M.n = P521_WIDTH + 1; + } + M.p = Mp; + memcpy(Mp, N->p + P521_WIDTH - 1, M.n * sizeof(mbedtls_mpi_uint)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&M, 521 % (8 * sizeof(mbedtls_mpi_uint)))); + + /* N = A0 */ + N->p[P521_WIDTH - 1] &= P521_MASK; + for (i = P521_WIDTH; i < N->n; i++) { + N->p[i] = 0; + } + + /* N = A0 + A1 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_add_abs(N, N, &M)); + +cleanup: + return ret; +} + +#undef P521_WIDTH +#undef P521_MASK +#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ + +#endif /* MBEDTLS_ECP_NIST_OPTIM */ + +#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) + +/* Size of p255 in terms of mbedtls_mpi_uint */ +#define P255_WIDTH (255 / 8 / sizeof(mbedtls_mpi_uint) + 1) + +/* + * Fast quasi-reduction modulo p255 = 2^255 - 19 + * Write N as A0 + 2^255 A1, return A0 + 19 * A1 + */ +static int ecp_mod_p255(mbedtls_mpi *N) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i; + mbedtls_mpi M; + mbedtls_mpi_uint Mp[P255_WIDTH + 2]; + + if (N->n < P255_WIDTH) { + return 0; + } + + /* M = A1 */ + M.s = 1; + M.n = N->n - (P255_WIDTH - 1); + if (M.n > P255_WIDTH + 1) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + M.p = Mp; + memset(Mp, 0, sizeof(Mp)); + memcpy(Mp, N->p + P255_WIDTH - 1, M.n * sizeof(mbedtls_mpi_uint)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&M, 255 % (8 * sizeof(mbedtls_mpi_uint)))); + M.n++; /* Make room for multiplication by 19 */ + + /* N = A0 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_set_bit(N, 255, 0)); + for (i = P255_WIDTH; i < N->n; i++) { + N->p[i] = 0; + } + + /* N = A0 + 19 * A1 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_int(&M, &M, 19)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_abs(N, N, &M)); + +cleanup: + return ret; +} +#endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) + +/* Size of p448 in terms of mbedtls_mpi_uint */ +#define P448_WIDTH (448 / 8 / sizeof(mbedtls_mpi_uint)) + +/* Number of limbs fully occupied by 2^224 (max), and limbs used by it (min) */ +#define DIV_ROUND_UP(X, Y) (((X) + (Y) -1) / (Y)) +#define P224_WIDTH_MIN (28 / sizeof(mbedtls_mpi_uint)) +#define P224_WIDTH_MAX DIV_ROUND_UP(28, sizeof(mbedtls_mpi_uint)) +#define P224_UNUSED_BITS ((P224_WIDTH_MAX * sizeof(mbedtls_mpi_uint) * 8) - 224) + +/* + * Fast quasi-reduction modulo p448 = 2^448 - 2^224 - 1 + * Write N as A0 + 2^448 A1 and A1 as B0 + 2^224 B1, and return + * A0 + A1 + B1 + (B0 + B1) * 2^224. This is different to the reference + * implementation of Curve448, which uses its own special 56-bit limbs rather + * than a generic bignum library. We could squeeze some extra speed out on + * 32-bit machines by splitting N up into 32-bit limbs and doing the + * arithmetic using the limbs directly as we do for the NIST primes above, + * but for 64-bit targets it should use half the number of operations if we do + * the reduction with 224-bit limbs, since mpi_add_mpi will then use 64-bit adds. + */ +static int ecp_mod_p448(mbedtls_mpi *N) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i; + mbedtls_mpi M, Q; + mbedtls_mpi_uint Mp[P448_WIDTH + 1], Qp[P448_WIDTH]; + + if (N->n <= P448_WIDTH) { + return 0; + } + + /* M = A1 */ + M.s = 1; + M.n = N->n - (P448_WIDTH); + if (M.n > P448_WIDTH) { + /* Shouldn't be called with N larger than 2^896! */ + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + M.p = Mp; + memset(Mp, 0, sizeof(Mp)); + memcpy(Mp, N->p + P448_WIDTH, M.n * sizeof(mbedtls_mpi_uint)); + + /* N = A0 */ + for (i = P448_WIDTH; i < N->n; i++) { + N->p[i] = 0; + } + + /* N += A1 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(N, N, &M)); + + /* Q = B1, N += B1 */ + Q = M; + Q.p = Qp; + memcpy(Qp, Mp, sizeof(Qp)); + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&Q, 224)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(N, N, &Q)); + + /* M = (B0 + B1) * 2^224, N += M */ + if (sizeof(mbedtls_mpi_uint) > 4) { + Mp[P224_WIDTH_MIN] &= ((mbedtls_mpi_uint)-1) >> (P224_UNUSED_BITS); + } + for (i = P224_WIDTH_MAX; i < M.n; ++i) { + Mp[i] = 0; + } + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&M, &M, &Q)); + M.n = P448_WIDTH + 1; /* Make room for shifted carry bit from the addition */ + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&M, 224)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(N, N, &M)); + +cleanup: + return ret; +} +#endif /* MBEDTLS_ECP_DP_CURVE448_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) +/* + * Fast quasi-reduction modulo P = 2^s - R, + * with R about 33 bits, used by the Koblitz curves. + * + * Write N as A0 + 2^224 A1, return A0 + R * A1. + * Actually do two passes, since R is big. + */ +#define P_KOBLITZ_MAX (256 / 8 / sizeof(mbedtls_mpi_uint)) // Max limbs in P +#define P_KOBLITZ_R (8 / sizeof(mbedtls_mpi_uint)) // Limbs in R +static inline int ecp_mod_koblitz(mbedtls_mpi *N, const mbedtls_mpi_uint *Rp, size_t p_limbs, + size_t adjust, size_t shift, mbedtls_mpi_uint mask) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i; + mbedtls_mpi M, R; + mbedtls_mpi_uint Mp[P_KOBLITZ_MAX + P_KOBLITZ_R + 1]; + + if (N->n < p_limbs) { + return 0; + } + + /* Init R */ + R.s = 1; + R.p = (mbedtls_mpi_uint *) Rp; /* R.p will not be modified so the cast is safe */ + R.n = P_KOBLITZ_R; + + /* Common setup for M */ + M.s = 1; + M.p = Mp; + + /* M = A1 */ + M.n = N->n - (p_limbs - adjust); + if (M.n > p_limbs + adjust) { + M.n = p_limbs + adjust; + } + memset(Mp, 0, sizeof(Mp)); + memcpy(Mp, N->p + p_limbs - adjust, M.n * sizeof(mbedtls_mpi_uint)); + if (shift != 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&M, shift)); + } + M.n += R.n; /* Make room for multiplication by R */ + + /* N = A0 */ + if (mask != 0) { + N->p[p_limbs - 1] &= mask; + } + for (i = p_limbs; i < N->n; i++) { + N->p[i] = 0; + } + + /* N = A0 + R * A1 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&M, &M, &R)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_abs(N, N, &M)); + + /* Second pass */ + + /* M = A1 */ + M.n = N->n - (p_limbs - adjust); + if (M.n > p_limbs + adjust) { + M.n = p_limbs + adjust; + } + memset(Mp, 0, sizeof(Mp)); + memcpy(Mp, N->p + p_limbs - adjust, M.n * sizeof(mbedtls_mpi_uint)); + if (shift != 0) { + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&M, shift)); + } + M.n += R.n; /* Make room for multiplication by R */ + + /* N = A0 */ + if (mask != 0) { + N->p[p_limbs - 1] &= mask; + } + for (i = p_limbs; i < N->n; i++) { + N->p[i] = 0; + } + + /* N = A0 + R * A1 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&M, &M, &R)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_abs(N, N, &M)); + +cleanup: + return ret; +} +#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED) || + MBEDTLS_ECP_DP_SECP224K1_ENABLED) || + MBEDTLS_ECP_DP_SECP256K1_ENABLED) */ + +#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) +/* + * Fast quasi-reduction modulo p192k1 = 2^192 - R, + * with R = 2^32 + 2^12 + 2^8 + 2^7 + 2^6 + 2^3 + 1 = 0x0100001119 + */ +static int ecp_mod_p192k1(mbedtls_mpi *N) +{ + static const mbedtls_mpi_uint Rp[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xC9, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00) + }; + + return ecp_mod_koblitz(N, Rp, 192 / 8 / sizeof(mbedtls_mpi_uint), 0, 0, + 0); +} +#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) +/* + * Fast quasi-reduction modulo p224k1 = 2^224 - R, + * with R = 2^32 + 2^12 + 2^11 + 2^9 + 2^7 + 2^4 + 2 + 1 = 0x0100001A93 + */ +static int ecp_mod_p224k1(mbedtls_mpi *N) +{ + static const mbedtls_mpi_uint Rp[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0x93, 0x1A, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00) + }; + +#if defined(MBEDTLS_HAVE_INT64) + return ecp_mod_koblitz(N, Rp, 4, 1, 32, 0xFFFFFFFF); +#else + return ecp_mod_koblitz(N, Rp, 224 / 8 / sizeof(mbedtls_mpi_uint), 0, 0, + 0); +#endif +} + +#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ + +#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) +/* + * Fast quasi-reduction modulo p256k1 = 2^256 - R, + * with R = 2^32 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1 = 0x01000003D1 + */ +static int ecp_mod_p256k1(mbedtls_mpi *N) +{ + static const mbedtls_mpi_uint Rp[] = { + MBEDTLS_BYTES_TO_T_UINT_8(0xD1, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00) + }; + return ecp_mod_koblitz(N, Rp, 256 / 8 / sizeof(mbedtls_mpi_uint), 0, 0, + 0); +} +#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ + +#endif /* !MBEDTLS_ECP_ALT */ + +#endif /* MBEDTLS_ECP_C */ diff --git a/ext/opcua_client/mbedtls/library/ecp_invasive.h b/ext/opcua_client/mbedtls/library/ecp_invasive.h new file mode 100644 index 0000000..b5a1f7c --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ecp_invasive.h @@ -0,0 +1,69 @@ +/** + * \file ecp_invasive.h + * + * \brief ECP module: interfaces for invasive testing only. + * + * The interfaces in this file are intended for testing purposes only. + * They SHOULD NOT be made available in library integrations except when + * building the library for testing. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_ECP_INVASIVE_H +#define MBEDTLS_ECP_INVASIVE_H + +#include "common.h" +#include "mbedtls/bignum.h" +#include "mbedtls/ecp.h" + +#if defined(MBEDTLS_TEST_HOOKS) && defined(MBEDTLS_ECP_C) + +#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \ + defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) +/* Preconditions: + * - bits is a multiple of 64 or is 224 + * - c is -1 or -2 + * - 0 <= N < 2^bits + * - N has room for bits plus one limb + * + * Behavior: + * Set N to c * 2^bits + old_value_of_N. + */ +void mbedtls_ecp_fix_negative(mbedtls_mpi *N, signed char c, size_t bits); +#endif + +#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED) +/** Generate a private key on a Montgomery curve (Curve25519 or Curve448). + * + * This function implements key generation for the set of secret keys + * specified in [Curve25519] p. 5 and in [Curve448]. The resulting value + * has the lower bits masked but is not necessarily canonical. + * + * \note - [Curve25519] http://cr.yp.to/ecdh/curve25519-20060209.pdf + * - [RFC7748] https://tools.ietf.org/html/rfc7748 + * + * \p high_bit The position of the high-order bit of the key to generate. + * This is the bit-size of the key minus 1: + * 254 for Curve25519 or 447 for Curve448. + * \param d The randomly generated key. This is a number of size + * exactly \p high_bit + 1 bits, with the least significant bits + * masked as specified in [Curve25519] and in [RFC7748] §5. + * \param f_rng The RNG function. + * \param p_rng The RNG context to be passed to \p f_rng. + * + * \return \c 0 on success. + * \return \c MBEDTLS_ERR_ECP_xxx or MBEDTLS_ERR_MPI_xxx on failure. + */ +int mbedtls_ecp_gen_privkey_mx(size_t high_bit, + mbedtls_mpi *d, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng); + +#endif /* MBEDTLS_ECP_MONTGOMERY_ENABLED */ + +#endif /* MBEDTLS_TEST_HOOKS && MBEDTLS_ECP_C */ + +#endif /* MBEDTLS_ECP_INVASIVE_H */ diff --git a/ext/opcua_client/mbedtls/library/entropy.c b/ext/opcua_client/mbedtls/library/entropy.c new file mode 100644 index 0000000..339dc0e --- /dev/null +++ b/ext/opcua_client/mbedtls/library/entropy.c @@ -0,0 +1,752 @@ +/* + * Entropy accumulator implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_ENTROPY_C) + +#if defined(MBEDTLS_TEST_NULL_ENTROPY) +#warning "**** WARNING! MBEDTLS_TEST_NULL_ENTROPY defined! " +#warning "**** THIS BUILD HAS NO DEFINED ENTROPY SOURCES " +#warning "**** THIS BUILD IS *NOT* SUITABLE FOR PRODUCTION USE " +#endif + +#include "mbedtls/entropy.h" +#include "mbedtls/entropy_poll.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" +#include "mbedtls/sha256.h" +#include "mbedtls/sha512.h" + +#include + +#if defined(MBEDTLS_FS_IO) +#include +#endif + +#include "mbedtls/platform.h" + +#include "mbedtls/platform.h" + +#if defined(MBEDTLS_HAVEGE_C) +#include "mbedtls/havege.h" +#endif + +#define ENTROPY_MAX_LOOP 256 /**< Maximum amount to loop before error */ + +void mbedtls_entropy_init(mbedtls_entropy_context *ctx) +{ + ctx->source_count = 0; + memset(ctx->source, 0, sizeof(ctx->source)); + +#if defined(MBEDTLS_THREADING_C) + mbedtls_mutex_init(&ctx->mutex); +#endif + + ctx->accumulator_started = 0; +#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) + mbedtls_sha512_init(&ctx->accumulator); +#else + mbedtls_sha256_init(&ctx->accumulator); +#endif +#if defined(MBEDTLS_HAVEGE_C) + mbedtls_havege_init(&ctx->havege_data); +#endif + + /* Reminder: Update ENTROPY_HAVE_STRONG in the test files + * when adding more strong entropy sources here. */ + +#if defined(MBEDTLS_TEST_NULL_ENTROPY) + mbedtls_entropy_add_source(ctx, mbedtls_null_entropy_poll, NULL, + 1, MBEDTLS_ENTROPY_SOURCE_STRONG); +#endif + +#if !defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) +#if !defined(MBEDTLS_NO_PLATFORM_ENTROPY) + mbedtls_entropy_add_source(ctx, mbedtls_platform_entropy_poll, NULL, + MBEDTLS_ENTROPY_MIN_PLATFORM, + MBEDTLS_ENTROPY_SOURCE_STRONG); +#endif +#if defined(MBEDTLS_TIMING_C) + mbedtls_entropy_add_source(ctx, mbedtls_hardclock_poll, NULL, + MBEDTLS_ENTROPY_MIN_HARDCLOCK, + MBEDTLS_ENTROPY_SOURCE_WEAK); +#endif +#if defined(MBEDTLS_HAVEGE_C) + mbedtls_entropy_add_source(ctx, mbedtls_havege_poll, &ctx->havege_data, + MBEDTLS_ENTROPY_MIN_HAVEGE, + MBEDTLS_ENTROPY_SOURCE_STRONG); +#endif +#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) + mbedtls_entropy_add_source(ctx, mbedtls_hardware_poll, NULL, + MBEDTLS_ENTROPY_MIN_HARDWARE, + MBEDTLS_ENTROPY_SOURCE_STRONG); +#endif +#if defined(MBEDTLS_ENTROPY_NV_SEED) + mbedtls_entropy_add_source(ctx, mbedtls_nv_seed_poll, NULL, + MBEDTLS_ENTROPY_BLOCK_SIZE, + MBEDTLS_ENTROPY_SOURCE_STRONG); + ctx->initial_entropy_run = 0; +#endif +#endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */ +} + +void mbedtls_entropy_free(mbedtls_entropy_context *ctx) +{ + /* If the context was already free, don't call free() again. + * This is important for mutexes which don't allow double-free. */ + if (ctx->accumulator_started == -1) { + return; + } + +#if defined(MBEDTLS_HAVEGE_C) + mbedtls_havege_free(&ctx->havege_data); +#endif +#if defined(MBEDTLS_THREADING_C) + mbedtls_mutex_free(&ctx->mutex); +#endif +#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) + mbedtls_sha512_free(&ctx->accumulator); +#else + mbedtls_sha256_free(&ctx->accumulator); +#endif +#if defined(MBEDTLS_ENTROPY_NV_SEED) + ctx->initial_entropy_run = 0; +#endif + ctx->source_count = 0; + mbedtls_platform_zeroize(ctx->source, sizeof(ctx->source)); + ctx->accumulator_started = -1; +} + +int mbedtls_entropy_add_source(mbedtls_entropy_context *ctx, + mbedtls_entropy_f_source_ptr f_source, void *p_source, + size_t threshold, int strong) +{ + int idx, ret = 0; + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&ctx->mutex)) != 0) { + return ret; + } +#endif + + idx = ctx->source_count; + if (idx >= MBEDTLS_ENTROPY_MAX_SOURCES) { + ret = MBEDTLS_ERR_ENTROPY_MAX_SOURCES; + goto exit; + } + + ctx->source[idx].f_source = f_source; + ctx->source[idx].p_source = p_source; + ctx->source[idx].threshold = threshold; + ctx->source[idx].strong = strong; + + ctx->source_count++; + +exit: +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&ctx->mutex) != 0) { + return MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } +#endif + + return ret; +} + +/* + * Entropy accumulator update + */ +static int entropy_update(mbedtls_entropy_context *ctx, unsigned char source_id, + const unsigned char *data, size_t len) +{ + unsigned char header[2]; + unsigned char tmp[MBEDTLS_ENTROPY_BLOCK_SIZE]; + size_t use_len = len; + const unsigned char *p = data; + int ret = 0; + + if (use_len > MBEDTLS_ENTROPY_BLOCK_SIZE) { +#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) + if ((ret = mbedtls_sha512_ret(data, len, tmp, 0)) != 0) { + goto cleanup; + } +#else + if ((ret = mbedtls_sha256_ret(data, len, tmp, 0)) != 0) { + goto cleanup; + } +#endif + p = tmp; + use_len = MBEDTLS_ENTROPY_BLOCK_SIZE; + } + + header[0] = source_id; + header[1] = use_len & 0xFF; + + /* + * Start the accumulator if this has not already happened. Note that + * it is sufficient to start the accumulator here only because all calls to + * gather entropy eventually execute this code. + */ +#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) + if (ctx->accumulator_started == 0 && + (ret = mbedtls_sha512_starts_ret(&ctx->accumulator, 0)) != 0) { + goto cleanup; + } else { + ctx->accumulator_started = 1; + } + if ((ret = mbedtls_sha512_update_ret(&ctx->accumulator, header, 2)) != 0) { + goto cleanup; + } + ret = mbedtls_sha512_update_ret(&ctx->accumulator, p, use_len); +#else + if (ctx->accumulator_started == 0 && + (ret = mbedtls_sha256_starts_ret(&ctx->accumulator, 0)) != 0) { + goto cleanup; + } else { + ctx->accumulator_started = 1; + } + if ((ret = mbedtls_sha256_update_ret(&ctx->accumulator, header, 2)) != 0) { + goto cleanup; + } + ret = mbedtls_sha256_update_ret(&ctx->accumulator, p, use_len); +#endif + +cleanup: + mbedtls_platform_zeroize(tmp, sizeof(tmp)); + + return ret; +} + +int mbedtls_entropy_update_manual(mbedtls_entropy_context *ctx, + const unsigned char *data, size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&ctx->mutex)) != 0) { + return ret; + } +#endif + + ret = entropy_update(ctx, MBEDTLS_ENTROPY_SOURCE_MANUAL, data, len); + +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&ctx->mutex) != 0) { + return MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } +#endif + + return ret; +} + +/* + * Run through the different sources to add entropy to our accumulator + */ +static int entropy_gather_internal(mbedtls_entropy_context *ctx) +{ + int ret = MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + int i; + int have_one_strong = 0; + unsigned char buf[MBEDTLS_ENTROPY_MAX_GATHER]; + size_t olen; + + if (ctx->source_count == 0) { + return MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED; + } + + /* + * Run through our entropy sources + */ + for (i = 0; i < ctx->source_count; i++) { + if (ctx->source[i].strong == MBEDTLS_ENTROPY_SOURCE_STRONG) { + have_one_strong = 1; + } + + olen = 0; + if ((ret = ctx->source[i].f_source(ctx->source[i].p_source, + buf, MBEDTLS_ENTROPY_MAX_GATHER, &olen)) != 0) { + goto cleanup; + } + + /* + * Add if we actually gathered something + */ + if (olen > 0) { + if ((ret = entropy_update(ctx, (unsigned char) i, + buf, olen)) != 0) { + return ret; + } + ctx->source[i].size += olen; + } + } + + if (have_one_strong == 0) { + ret = MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE; + } + +cleanup: + mbedtls_platform_zeroize(buf, sizeof(buf)); + + return ret; +} + +/* + * Thread-safe wrapper for entropy_gather_internal() + */ +int mbedtls_entropy_gather(mbedtls_entropy_context *ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&ctx->mutex)) != 0) { + return ret; + } +#endif + + ret = entropy_gather_internal(ctx); + +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&ctx->mutex) != 0) { + return MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } +#endif + + return ret; +} + +int mbedtls_entropy_func(void *data, unsigned char *output, size_t len) +{ + int ret, count = 0, i, thresholds_reached; + size_t strong_size; + mbedtls_entropy_context *ctx = (mbedtls_entropy_context *) data; + unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE]; + + if (len > MBEDTLS_ENTROPY_BLOCK_SIZE) { + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + } + +#if defined(MBEDTLS_ENTROPY_NV_SEED) + /* Update the NV entropy seed before generating any entropy for outside + * use. + */ + if (ctx->initial_entropy_run == 0) { + ctx->initial_entropy_run = 1; + if ((ret = mbedtls_entropy_update_nv_seed(ctx)) != 0) { + return ret; + } + } +#endif + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&ctx->mutex)) != 0) { + return ret; + } +#endif + + /* + * Always gather extra entropy before a call + */ + do { + if (count++ > ENTROPY_MAX_LOOP) { + ret = MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + goto exit; + } + + if ((ret = entropy_gather_internal(ctx)) != 0) { + goto exit; + } + + thresholds_reached = 1; + strong_size = 0; + for (i = 0; i < ctx->source_count; i++) { + if (ctx->source[i].size < ctx->source[i].threshold) { + thresholds_reached = 0; + } + if (ctx->source[i].strong == MBEDTLS_ENTROPY_SOURCE_STRONG) { + strong_size += ctx->source[i].size; + } + } + } while (!thresholds_reached || strong_size < MBEDTLS_ENTROPY_BLOCK_SIZE); + + memset(buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE); + +#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) + /* + * Note that at this stage it is assumed that the accumulator was started + * in a previous call to entropy_update(). If this is not guaranteed, the + * code below will fail. + */ + if ((ret = mbedtls_sha512_finish_ret(&ctx->accumulator, buf)) != 0) { + goto exit; + } + + /* + * Reset accumulator and counters and recycle existing entropy + */ + mbedtls_sha512_free(&ctx->accumulator); + mbedtls_sha512_init(&ctx->accumulator); + if ((ret = mbedtls_sha512_starts_ret(&ctx->accumulator, 0)) != 0) { + goto exit; + } + if ((ret = mbedtls_sha512_update_ret(&ctx->accumulator, buf, + MBEDTLS_ENTROPY_BLOCK_SIZE)) != 0) { + goto exit; + } + + /* + * Perform second SHA-512 on entropy + */ + if ((ret = mbedtls_sha512_ret(buf, MBEDTLS_ENTROPY_BLOCK_SIZE, + buf, 0)) != 0) { + goto exit; + } +#else /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */ + if ((ret = mbedtls_sha256_finish_ret(&ctx->accumulator, buf)) != 0) { + goto exit; + } + + /* + * Reset accumulator and counters and recycle existing entropy + */ + mbedtls_sha256_free(&ctx->accumulator); + mbedtls_sha256_init(&ctx->accumulator); + if ((ret = mbedtls_sha256_starts_ret(&ctx->accumulator, 0)) != 0) { + goto exit; + } + if ((ret = mbedtls_sha256_update_ret(&ctx->accumulator, buf, + MBEDTLS_ENTROPY_BLOCK_SIZE)) != 0) { + goto exit; + } + + /* + * Perform second SHA-256 on entropy + */ + if ((ret = mbedtls_sha256_ret(buf, MBEDTLS_ENTROPY_BLOCK_SIZE, + buf, 0)) != 0) { + goto exit; + } +#endif /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */ + + for (i = 0; i < ctx->source_count; i++) { + ctx->source[i].size = 0; + } + + memcpy(output, buf, len); + + ret = 0; + +exit: + mbedtls_platform_zeroize(buf, sizeof(buf)); + +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&ctx->mutex) != 0) { + return MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } +#endif + + return ret; +} + +#if defined(MBEDTLS_ENTROPY_NV_SEED) +int mbedtls_entropy_update_nv_seed(mbedtls_entropy_context *ctx) +{ + int ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; + unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE]; + + /* Read new seed and write it to NV */ + if ((ret = mbedtls_entropy_func(ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE)) != 0) { + return ret; + } + + if (mbedtls_nv_seed_write(buf, MBEDTLS_ENTROPY_BLOCK_SIZE) < 0) { + return MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; + } + + /* Manually update the remaining stream with a separator value to diverge */ + memset(buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE); + ret = mbedtls_entropy_update_manual(ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE); + + return ret; +} +#endif /* MBEDTLS_ENTROPY_NV_SEED */ + +#if defined(MBEDTLS_FS_IO) +int mbedtls_entropy_write_seed_file(mbedtls_entropy_context *ctx, const char *path) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + FILE *f = NULL; + unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE]; + + if ((ret = mbedtls_entropy_func(ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE)) != 0) { + ret = MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + goto exit; + } + + if ((f = fopen(path, "wb")) == NULL) { + ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; + goto exit; + } + + if (fwrite(buf, 1, MBEDTLS_ENTROPY_BLOCK_SIZE, f) != MBEDTLS_ENTROPY_BLOCK_SIZE) { + ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; + goto exit; + } + + ret = 0; + +exit: + mbedtls_platform_zeroize(buf, sizeof(buf)); + + if (f != NULL) { + fclose(f); + } + + return ret; +} + +int mbedtls_entropy_update_seed_file(mbedtls_entropy_context *ctx, const char *path) +{ + int ret = 0; + FILE *f; + size_t n; + unsigned char buf[MBEDTLS_ENTROPY_MAX_SEED_SIZE]; + + if ((f = fopen(path, "rb")) == NULL) { + return MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; + } + + fseek(f, 0, SEEK_END); + n = (size_t) ftell(f); + fseek(f, 0, SEEK_SET); + + if (n > MBEDTLS_ENTROPY_MAX_SEED_SIZE) { + n = MBEDTLS_ENTROPY_MAX_SEED_SIZE; + } + + if (fread(buf, 1, n, f) != n) { + ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; + } else { + ret = mbedtls_entropy_update_manual(ctx, buf, n); + } + + fclose(f); + + mbedtls_platform_zeroize(buf, sizeof(buf)); + + if (ret != 0) { + return ret; + } + + return mbedtls_entropy_write_seed_file(ctx, path); +} +#endif /* MBEDTLS_FS_IO */ + +#if defined(MBEDTLS_SELF_TEST) +#if !defined(MBEDTLS_TEST_NULL_ENTROPY) +/* + * Dummy source function + */ +static int entropy_dummy_source(void *data, unsigned char *output, + size_t len, size_t *olen) +{ + ((void) data); + + memset(output, 0x2a, len); + *olen = len; + + return 0; +} +#endif /* !MBEDTLS_TEST_NULL_ENTROPY */ + +#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) + +static int mbedtls_entropy_source_self_test_gather(unsigned char *buf, size_t buf_len) +{ + int ret = 0; + size_t entropy_len = 0; + size_t olen = 0; + size_t attempts = buf_len; + + while (attempts > 0 && entropy_len < buf_len) { + if ((ret = mbedtls_hardware_poll(NULL, buf + entropy_len, + buf_len - entropy_len, &olen)) != 0) { + return ret; + } + + entropy_len += olen; + attempts--; + } + + if (entropy_len < buf_len) { + ret = 1; + } + + return ret; +} + + +static int mbedtls_entropy_source_self_test_check_bits(const unsigned char *buf, + size_t buf_len) +{ + unsigned char set = 0xFF; + unsigned char unset = 0x00; + size_t i; + + for (i = 0; i < buf_len; i++) { + set &= buf[i]; + unset |= buf[i]; + } + + return set == 0xFF || unset == 0x00; +} + +/* + * A test to ensure that the entropy sources are functioning correctly + * and there is no obvious failure. The test performs the following checks: + * - The entropy source is not providing only 0s (all bits unset) or 1s (all + * bits set). + * - The entropy source is not providing values in a pattern. Because the + * hardware could be providing data in an arbitrary length, this check polls + * the hardware entropy source twice and compares the result to ensure they + * are not equal. + * - The error code returned by the entropy source is not an error. + */ +int mbedtls_entropy_source_self_test(int verbose) +{ + int ret = 0; + unsigned char buf0[2 * sizeof(unsigned long long int)]; + unsigned char buf1[2 * sizeof(unsigned long long int)]; + + if (verbose != 0) { + mbedtls_printf(" ENTROPY_BIAS test: "); + } + + memset(buf0, 0x00, sizeof(buf0)); + memset(buf1, 0x00, sizeof(buf1)); + + if ((ret = mbedtls_entropy_source_self_test_gather(buf0, sizeof(buf0))) != 0) { + goto cleanup; + } + if ((ret = mbedtls_entropy_source_self_test_gather(buf1, sizeof(buf1))) != 0) { + goto cleanup; + } + + /* Make sure that the returned values are not all 0 or 1 */ + if ((ret = mbedtls_entropy_source_self_test_check_bits(buf0, sizeof(buf0))) != 0) { + goto cleanup; + } + if ((ret = mbedtls_entropy_source_self_test_check_bits(buf1, sizeof(buf1))) != 0) { + goto cleanup; + } + + /* Make sure that the entropy source is not returning values in a + * pattern */ + ret = memcmp(buf0, buf1, sizeof(buf0)) == 0; + +cleanup: + if (verbose != 0) { + if (ret != 0) { + mbedtls_printf("failed\n"); + } else { + mbedtls_printf("passed\n"); + } + + mbedtls_printf("\n"); + } + + return ret != 0; +} + +#endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */ + +/* + * The actual entropy quality is hard to test, but we can at least + * test that the functions don't cause errors and write the correct + * amount of data to buffers. + */ +int mbedtls_entropy_self_test(int verbose) +{ + int ret = 1; +#if !defined(MBEDTLS_TEST_NULL_ENTROPY) + mbedtls_entropy_context ctx; + unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE] = { 0 }; + unsigned char acc[MBEDTLS_ENTROPY_BLOCK_SIZE] = { 0 }; + size_t i, j; +#endif /* !MBEDTLS_TEST_NULL_ENTROPY */ + + if (verbose != 0) { + mbedtls_printf(" ENTROPY test: "); + } + +#if !defined(MBEDTLS_TEST_NULL_ENTROPY) + mbedtls_entropy_init(&ctx); + + /* First do a gather to make sure we have default sources */ + if ((ret = mbedtls_entropy_gather(&ctx)) != 0) { + goto cleanup; + } + + ret = mbedtls_entropy_add_source(&ctx, entropy_dummy_source, NULL, 16, + MBEDTLS_ENTROPY_SOURCE_WEAK); + if (ret != 0) { + goto cleanup; + } + + if ((ret = mbedtls_entropy_update_manual(&ctx, buf, sizeof(buf))) != 0) { + goto cleanup; + } + + /* + * To test that mbedtls_entropy_func writes correct number of bytes: + * - use the whole buffer and rely on ASan to detect overruns + * - collect entropy 8 times and OR the result in an accumulator: + * any byte should then be 0 with probably 2^(-64), so requiring + * each of the 32 or 64 bytes to be non-zero has a false failure rate + * of at most 2^(-58) which is acceptable. + */ + for (i = 0; i < 8; i++) { + if ((ret = mbedtls_entropy_func(&ctx, buf, sizeof(buf))) != 0) { + goto cleanup; + } + + for (j = 0; j < sizeof(buf); j++) { + acc[j] |= buf[j]; + } + } + + for (j = 0; j < sizeof(buf); j++) { + if (acc[j] == 0) { + ret = 1; + goto cleanup; + } + } + +#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) + if ((ret = mbedtls_entropy_source_self_test(0)) != 0) { + goto cleanup; + } +#endif + +cleanup: + mbedtls_entropy_free(&ctx); +#endif /* !MBEDTLS_TEST_NULL_ENTROPY */ + + if (verbose != 0) { + if (ret != 0) { + mbedtls_printf("failed\n"); + } else { + mbedtls_printf("passed\n"); + } + + mbedtls_printf("\n"); + } + + return ret != 0; +} +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_ENTROPY_C */ diff --git a/ext/opcua_client/mbedtls/library/entropy_poll.c b/ext/opcua_client/mbedtls/library/entropy_poll.c new file mode 100644 index 0000000..095fa98 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/entropy_poll.c @@ -0,0 +1,283 @@ +/* + * Platform-specific and custom entropy polling functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#if defined(__linux__) || defined(__midipix__) +/* Ensure that syscall() is available even when compiling with -std=c99 */ +#if !defined(_GNU_SOURCE) +#define _GNU_SOURCE +#endif +#endif + +#include "common.h" + +#include + +#if defined(MBEDTLS_ENTROPY_C) + +#include "mbedtls/entropy.h" +#include "mbedtls/entropy_poll.h" +#include "mbedtls/error.h" + +#if defined(MBEDTLS_TIMING_C) +#include "mbedtls/timing.h" +#endif +#if defined(MBEDTLS_HAVEGE_C) +#include "mbedtls/havege.h" +#endif +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_NO_PLATFORM_ENTROPY) + +#if !defined(unix) && !defined(__unix__) && !defined(__unix) && \ + !defined(__APPLE__) && !defined(_WIN32) && !defined(__QNXNTO__) && \ + !defined(__HAIKU__) && !defined(__midipix__) +#error \ + "Platform entropy sources only work on Unix and Windows, see MBEDTLS_NO_PLATFORM_ENTROPY in config.h" +#endif + +#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) + +#if !defined(_WIN32_WINNT) +#define _WIN32_WINNT 0x0400 +#endif +#include +#include + +int mbedtls_platform_entropy_poll(void *data, unsigned char *output, size_t len, + size_t *olen) +{ + HCRYPTPROV provider; + ((void) data); + *olen = 0; + + if (CryptAcquireContext(&provider, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) == FALSE) { + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + } + + if (CryptGenRandom(provider, (DWORD) len, output) == FALSE) { + CryptReleaseContext(provider, 0); + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + } + + CryptReleaseContext(provider, 0); + *olen = len; + + return 0; +} +#else /* _WIN32 && !EFIX64 && !EFI32 */ + +/* + * Test for Linux getrandom() support. + * Since there is no wrapper in the libc yet, use the generic syscall wrapper + * available in GNU libc and compatible libc's (eg uClibc). + */ +#if ((defined(__linux__) && defined(__GLIBC__)) || defined(__midipix__)) +#include +#include +#if defined(SYS_getrandom) +#define HAVE_GETRANDOM +#include + +static int getrandom_wrapper(void *buf, size_t buflen, unsigned int flags) +{ + /* MemSan cannot understand that the syscall writes to the buffer */ +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) + memset(buf, 0, buflen); +#endif +#endif + return syscall(SYS_getrandom, buf, buflen, flags); +} +#endif /* SYS_getrandom */ +#endif /* __linux__ || __midipix__ */ + +#if defined(__FreeBSD__) || defined(__DragonFly__) +#include +#if (defined(__FreeBSD__) && __FreeBSD_version >= 1200000) || \ + (defined(__DragonFly__) && __DragonFly_version >= 500700) +#include +#include +#define HAVE_GETRANDOM +static int getrandom_wrapper(void *buf, size_t buflen, unsigned int flags) +{ + return getrandom(buf, buflen, flags); +} +#endif /* (__FreeBSD__ && __FreeBSD_version >= 1200000) || + (__DragonFly__ && __DragonFly_version >= 500700) */ +#endif /* __FreeBSD__ || __DragonFly__ */ + +/* + * Some BSD systems provide KERN_ARND. + * This is equivalent to reading from /dev/urandom, only it doesn't require an + * open file descriptor, and provides up to 256 bytes per call (basically the + * same as getentropy(), but with a longer history). + * + * Documentation: https://netbsd.gw.com/cgi-bin/man-cgi?sysctl+7 + */ +#if (defined(__FreeBSD__) || defined(__NetBSD__)) && !defined(HAVE_GETRANDOM) +#include +#include +#if defined(KERN_ARND) +#define HAVE_SYSCTL_ARND + +static int sysctl_arnd_wrapper(unsigned char *buf, size_t buflen) +{ + int name[2]; + size_t len; + + name[0] = CTL_KERN; + name[1] = KERN_ARND; + + while (buflen > 0) { + len = buflen > 256 ? 256 : buflen; + if (sysctl(name, 2, buf, &len, NULL, 0) == -1) { + return -1; + } + buflen -= len; + buf += len; + } + return 0; +} +#endif /* KERN_ARND */ +#endif /* __FreeBSD__ || __NetBSD__ */ + +#include + +int mbedtls_platform_entropy_poll(void *data, + unsigned char *output, size_t len, size_t *olen) +{ + FILE *file; + size_t read_len; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + ((void) data); + +#if defined(HAVE_GETRANDOM) + ret = getrandom_wrapper(output, len, 0); + if (ret >= 0) { + *olen = ret; + return 0; + } else if (errno != ENOSYS) { + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + } + /* Fall through if the system call isn't known. */ +#else + ((void) ret); +#endif /* HAVE_GETRANDOM */ + +#if defined(HAVE_SYSCTL_ARND) + ((void) file); + ((void) read_len); + if (sysctl_arnd_wrapper(output, len) == -1) { + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + } + *olen = len; + return 0; +#else + + *olen = 0; + + file = fopen("/dev/urandom", "rb"); + if (file == NULL) { + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + } + + read_len = fread(output, 1, len, file); + if (read_len != len) { + fclose(file); + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + } + + fclose(file); + *olen = len; + + return 0; +#endif /* HAVE_SYSCTL_ARND */ +} +#endif /* _WIN32 && !EFIX64 && !EFI32 */ +#endif /* !MBEDTLS_NO_PLATFORM_ENTROPY */ + +#if defined(MBEDTLS_TEST_NULL_ENTROPY) +int mbedtls_null_entropy_poll(void *data, + unsigned char *output, size_t len, size_t *olen) +{ + ((void) data); + ((void) output); + + *olen = 0; + if (len < sizeof(unsigned char)) { + return 0; + } + + output[0] = 0; + *olen = sizeof(unsigned char); + return 0; +} +#endif + +#if defined(MBEDTLS_TIMING_C) +int mbedtls_hardclock_poll(void *data, + unsigned char *output, size_t len, size_t *olen) +{ + unsigned long timer = mbedtls_timing_hardclock(); + ((void) data); + *olen = 0; + + if (len < sizeof(unsigned long)) { + return 0; + } + + memcpy(output, &timer, sizeof(unsigned long)); + *olen = sizeof(unsigned long); + + return 0; +} +#endif /* MBEDTLS_TIMING_C */ + +#if defined(MBEDTLS_HAVEGE_C) +int mbedtls_havege_poll(void *data, + unsigned char *output, size_t len, size_t *olen) +{ + mbedtls_havege_state *hs = (mbedtls_havege_state *) data; + *olen = 0; + + if (mbedtls_havege_random(hs, output, len) != 0) { + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + } + + *olen = len; + + return 0; +} +#endif /* MBEDTLS_HAVEGE_C */ + +#if defined(MBEDTLS_ENTROPY_NV_SEED) +int mbedtls_nv_seed_poll(void *data, + unsigned char *output, size_t len, size_t *olen) +{ + unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE]; + size_t use_len = MBEDTLS_ENTROPY_BLOCK_SIZE; + ((void) data); + + memset(buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE); + + if (mbedtls_nv_seed_read(buf, MBEDTLS_ENTROPY_BLOCK_SIZE) < 0) { + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + } + + if (len < use_len) { + use_len = len; + } + + memcpy(output, buf, use_len); + *olen = use_len; + + return 0; +} +#endif /* MBEDTLS_ENTROPY_NV_SEED */ + +#endif /* MBEDTLS_ENTROPY_C */ diff --git a/ext/opcua_client/mbedtls/library/error.c b/ext/opcua_client/mbedtls/library/error.c new file mode 100644 index 0000000..a0667e1 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/error.c @@ -0,0 +1,974 @@ +/* + * Error message information + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#include "mbedtls/error.h" + +#if defined(MBEDTLS_ERROR_C) || defined(MBEDTLS_ERROR_STRERROR_DUMMY) + +#if defined(MBEDTLS_ERROR_C) + +#include "mbedtls/platform.h" + +#include +#include + +#if defined(MBEDTLS_AES_C) +#include "mbedtls/aes.h" +#endif + +#if defined(MBEDTLS_ARC4_C) +#include "mbedtls/arc4.h" +#endif + +#if defined(MBEDTLS_ARIA_C) +#include "mbedtls/aria.h" +#endif + +#if defined(MBEDTLS_ASN1_PARSE_C) +#include "mbedtls/asn1.h" +#endif + +#if defined(MBEDTLS_BASE64_C) +#include "mbedtls/base64.h" +#endif + +#if defined(MBEDTLS_BIGNUM_C) +#include "mbedtls/bignum.h" +#endif + +#if defined(MBEDTLS_BLOWFISH_C) +#include "mbedtls/blowfish.h" +#endif + +#if defined(MBEDTLS_CAMELLIA_C) +#include "mbedtls/camellia.h" +#endif + +#if defined(MBEDTLS_CCM_C) +#include "mbedtls/ccm.h" +#endif + +#if defined(MBEDTLS_CHACHA20_C) +#include "mbedtls/chacha20.h" +#endif + +#if defined(MBEDTLS_CHACHAPOLY_C) +#include "mbedtls/chachapoly.h" +#endif + +#if defined(MBEDTLS_CIPHER_C) +#include "mbedtls/cipher.h" +#endif + +#if defined(MBEDTLS_CMAC_C) +#include "mbedtls/cmac.h" +#endif + +#if defined(MBEDTLS_CTR_DRBG_C) +#include "mbedtls/ctr_drbg.h" +#endif + +#if defined(MBEDTLS_DES_C) +#include "mbedtls/des.h" +#endif + +#if defined(MBEDTLS_DHM_C) +#include "mbedtls/dhm.h" +#endif + +#if defined(MBEDTLS_ECP_C) +#include "mbedtls/ecp.h" +#endif + +#if defined(MBEDTLS_ENTROPY_C) +#include "mbedtls/entropy.h" +#endif + +#if defined(MBEDTLS_ERROR_C) +#include "mbedtls/error.h" +#endif + +#if defined(MBEDTLS_GCM_C) +#include "mbedtls/gcm.h" +#endif + +#if defined(MBEDTLS_HKDF_C) +#include "mbedtls/hkdf.h" +#endif + +#if defined(MBEDTLS_HMAC_DRBG_C) +#include "mbedtls/hmac_drbg.h" +#endif + +#if defined(MBEDTLS_MD_C) +#include "mbedtls/md.h" +#endif + +#if defined(MBEDTLS_MD2_C) +#include "mbedtls/md2.h" +#endif + +#if defined(MBEDTLS_MD4_C) +#include "mbedtls/md4.h" +#endif + +#if defined(MBEDTLS_MD5_C) +#include "mbedtls/md5.h" +#endif + +#if defined(MBEDTLS_NET_C) +#include "mbedtls/net_sockets.h" +#endif + +#if defined(MBEDTLS_OID_C) +#include "mbedtls/oid.h" +#endif + +#if defined(MBEDTLS_PADLOCK_C) +#include "mbedtls/padlock.h" +#endif + +#if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C) +#include "mbedtls/pem.h" +#endif + +#if defined(MBEDTLS_PK_C) +#include "mbedtls/pk.h" +#endif + +#if defined(MBEDTLS_PKCS12_C) +#include "mbedtls/pkcs12.h" +#endif + +#if defined(MBEDTLS_PKCS5_C) +#include "mbedtls/pkcs5.h" +#endif + +#if defined(MBEDTLS_PLATFORM_C) +#include "mbedtls/platform.h" +#endif + +#if defined(MBEDTLS_POLY1305_C) +#include "mbedtls/poly1305.h" +#endif + +#if defined(MBEDTLS_RIPEMD160_C) +#include "mbedtls/ripemd160.h" +#endif + +#if defined(MBEDTLS_RSA_C) +#include "mbedtls/rsa.h" +#endif + +#if defined(MBEDTLS_SHA1_C) +#include "mbedtls/sha1.h" +#endif + +#if defined(MBEDTLS_SHA256_C) +#include "mbedtls/sha256.h" +#endif + +#if defined(MBEDTLS_SHA512_C) +#include "mbedtls/sha512.h" +#endif + +#if defined(MBEDTLS_SSL_TLS_C) +#include "mbedtls/ssl.h" +#endif + +#if defined(MBEDTLS_THREADING_C) +#include "mbedtls/threading.h" +#endif + +#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) +#include "mbedtls/x509.h" +#endif + +#if defined(MBEDTLS_XTEA_C) +#include "mbedtls/xtea.h" +#endif + + +const char *mbedtls_high_level_strerr(int error_code) +{ + int high_level_error_code; + + if (error_code < 0) { + error_code = -error_code; + } + + /* Extract the high-level part from the error code. */ + high_level_error_code = error_code & 0xFF80; + + switch (high_level_error_code) { + /* Begin Auto-Generated Code. */ + #if defined(MBEDTLS_CIPHER_C) + case -(MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE): + return( "CIPHER - The selected feature is not available" ); + case -(MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA): + return( "CIPHER - Bad input parameters" ); + case -(MBEDTLS_ERR_CIPHER_ALLOC_FAILED): + return( "CIPHER - Failed to allocate memory" ); + case -(MBEDTLS_ERR_CIPHER_INVALID_PADDING): + return( "CIPHER - Input data contains invalid padding and is rejected" ); + case -(MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED): + return( "CIPHER - Decryption of block requires a full block" ); + case -(MBEDTLS_ERR_CIPHER_AUTH_FAILED): + return( "CIPHER - Authentication failed (for AEAD modes)" ); + case -(MBEDTLS_ERR_CIPHER_INVALID_CONTEXT): + return( "CIPHER - The context is invalid. For example, because it was freed" ); + case -(MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED): + return( "CIPHER - Cipher hardware accelerator failed" ); +#endif /* MBEDTLS_CIPHER_C */ + +#if defined(MBEDTLS_DHM_C) + case -(MBEDTLS_ERR_DHM_BAD_INPUT_DATA): + return( "DHM - Bad input parameters" ); + case -(MBEDTLS_ERR_DHM_READ_PARAMS_FAILED): + return( "DHM - Reading of the DHM parameters failed" ); + case -(MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED): + return( "DHM - Making of the DHM parameters failed" ); + case -(MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED): + return( "DHM - Reading of the public values failed" ); + case -(MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED): + return( "DHM - Making of the public value failed" ); + case -(MBEDTLS_ERR_DHM_CALC_SECRET_FAILED): + return( "DHM - Calculation of the DHM secret failed" ); + case -(MBEDTLS_ERR_DHM_INVALID_FORMAT): + return( "DHM - The ASN.1 data is not formatted correctly" ); + case -(MBEDTLS_ERR_DHM_ALLOC_FAILED): + return( "DHM - Allocation of memory failed" ); + case -(MBEDTLS_ERR_DHM_FILE_IO_ERROR): + return( "DHM - Read or write of file failed" ); + case -(MBEDTLS_ERR_DHM_HW_ACCEL_FAILED): + return( "DHM - DHM hardware accelerator failed" ); + case -(MBEDTLS_ERR_DHM_SET_GROUP_FAILED): + return( "DHM - Setting the modulus and generator failed" ); +#endif /* MBEDTLS_DHM_C */ + +#if defined(MBEDTLS_ECP_C) + case -(MBEDTLS_ERR_ECP_BAD_INPUT_DATA): + return( "ECP - Bad input parameters to function" ); + case -(MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL): + return( "ECP - The buffer is too small to write to" ); + case -(MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE): + return( "ECP - The requested feature is not available, for example, the requested curve is not supported" ); + case -(MBEDTLS_ERR_ECP_VERIFY_FAILED): + return( "ECP - The signature is not valid" ); + case -(MBEDTLS_ERR_ECP_ALLOC_FAILED): + return( "ECP - Memory allocation failed" ); + case -(MBEDTLS_ERR_ECP_RANDOM_FAILED): + return( "ECP - Generation of random value, such as ephemeral key, failed" ); + case -(MBEDTLS_ERR_ECP_INVALID_KEY): + return( "ECP - Invalid private or public key" ); + case -(MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH): + return( "ECP - The buffer contains a valid signature followed by more data" ); + case -(MBEDTLS_ERR_ECP_HW_ACCEL_FAILED): + return( "ECP - The ECP hardware accelerator failed" ); + case -(MBEDTLS_ERR_ECP_IN_PROGRESS): + return( "ECP - Operation in progress, call again with the same parameters to continue" ); +#endif /* MBEDTLS_ECP_C */ + +#if defined(MBEDTLS_MD_C) + case -(MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE): + return( "MD - The selected feature is not available" ); + case -(MBEDTLS_ERR_MD_BAD_INPUT_DATA): + return( "MD - Bad input parameters to function" ); + case -(MBEDTLS_ERR_MD_ALLOC_FAILED): + return( "MD - Failed to allocate memory" ); + case -(MBEDTLS_ERR_MD_FILE_IO_ERROR): + return( "MD - Opening or reading of file failed" ); + case -(MBEDTLS_ERR_MD_HW_ACCEL_FAILED): + return( "MD - MD hardware accelerator failed" ); +#endif /* MBEDTLS_MD_C */ + +#if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C) + case -(MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT): + return( "PEM - No PEM header or footer found" ); + case -(MBEDTLS_ERR_PEM_INVALID_DATA): + return( "PEM - PEM string is not as expected" ); + case -(MBEDTLS_ERR_PEM_ALLOC_FAILED): + return( "PEM - Failed to allocate memory" ); + case -(MBEDTLS_ERR_PEM_INVALID_ENC_IV): + return( "PEM - RSA IV is not in hex-format" ); + case -(MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG): + return( "PEM - Unsupported key encryption algorithm" ); + case -(MBEDTLS_ERR_PEM_PASSWORD_REQUIRED): + return( "PEM - Private key password can't be empty" ); + case -(MBEDTLS_ERR_PEM_PASSWORD_MISMATCH): + return( "PEM - Given private key password does not allow for correct decryption" ); + case -(MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE): + return( "PEM - Unavailable feature, e.g. hashing/encryption combination" ); + case -(MBEDTLS_ERR_PEM_BAD_INPUT_DATA): + return( "PEM - Bad input parameters to function" ); +#endif /* MBEDTLS_PEM_PARSE_C || MBEDTLS_PEM_WRITE_C */ + +#if defined(MBEDTLS_PK_C) + case -(MBEDTLS_ERR_PK_ALLOC_FAILED): + return( "PK - Memory allocation failed" ); + case -(MBEDTLS_ERR_PK_TYPE_MISMATCH): + return( "PK - Type mismatch, eg attempt to encrypt with an ECDSA key" ); + case -(MBEDTLS_ERR_PK_BAD_INPUT_DATA): + return( "PK - Bad input parameters to function" ); + case -(MBEDTLS_ERR_PK_FILE_IO_ERROR): + return( "PK - Read/write of file failed" ); + case -(MBEDTLS_ERR_PK_KEY_INVALID_VERSION): + return( "PK - Unsupported key version" ); + case -(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT): + return( "PK - Invalid key tag or value" ); + case -(MBEDTLS_ERR_PK_UNKNOWN_PK_ALG): + return( "PK - Key algorithm is unsupported (only RSA and EC are supported)" ); + case -(MBEDTLS_ERR_PK_PASSWORD_REQUIRED): + return( "PK - Private key password can't be empty" ); + case -(MBEDTLS_ERR_PK_PASSWORD_MISMATCH): + return( "PK - Given private key password does not allow for correct decryption" ); + case -(MBEDTLS_ERR_PK_INVALID_PUBKEY): + return( "PK - The pubkey tag or value is invalid (only RSA and EC are supported)" ); + case -(MBEDTLS_ERR_PK_INVALID_ALG): + return( "PK - The algorithm tag or value is invalid" ); + case -(MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE): + return( "PK - Elliptic curve is unsupported (only NIST curves are supported)" ); + case -(MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE): + return( "PK - Unavailable feature, e.g. RSA disabled for RSA key" ); + case -(MBEDTLS_ERR_PK_SIG_LEN_MISMATCH): + return( "PK - The buffer contains a valid signature followed by more data" ); + case -(MBEDTLS_ERR_PK_HW_ACCEL_FAILED): + return( "PK - PK hardware accelerator failed" ); +#endif /* MBEDTLS_PK_C */ + +#if defined(MBEDTLS_PKCS12_C) + case -(MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA): + return( "PKCS12 - Bad input parameters to function" ); + case -(MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE): + return( "PKCS12 - Feature not available, e.g. unsupported encryption scheme" ); + case -(MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT): + return( "PKCS12 - PBE ASN.1 data not as expected" ); + case -(MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH): + return( "PKCS12 - Given private key password does not allow for correct decryption" ); +#endif /* MBEDTLS_PKCS12_C */ + +#if defined(MBEDTLS_PKCS5_C) + case -(MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA): + return( "PKCS5 - Bad input parameters to function" ); + case -(MBEDTLS_ERR_PKCS5_INVALID_FORMAT): + return( "PKCS5 - Unexpected ASN.1 data" ); + case -(MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE): + return( "PKCS5 - Requested encryption or digest alg not available" ); + case -(MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH): + return( "PKCS5 - Given private key password does not allow for correct decryption" ); +#endif /* MBEDTLS_PKCS5_C */ + +#if defined(MBEDTLS_RSA_C) + case -(MBEDTLS_ERR_RSA_BAD_INPUT_DATA): + return( "RSA - Bad input parameters to function" ); + case -(MBEDTLS_ERR_RSA_INVALID_PADDING): + return( "RSA - Input data contains invalid padding and is rejected" ); + case -(MBEDTLS_ERR_RSA_KEY_GEN_FAILED): + return( "RSA - Something failed during generation of a key" ); + case -(MBEDTLS_ERR_RSA_KEY_CHECK_FAILED): + return( "RSA - Key failed to pass the validity check of the library" ); + case -(MBEDTLS_ERR_RSA_PUBLIC_FAILED): + return( "RSA - The public key operation failed" ); + case -(MBEDTLS_ERR_RSA_PRIVATE_FAILED): + return( "RSA - The private key operation failed" ); + case -(MBEDTLS_ERR_RSA_VERIFY_FAILED): + return( "RSA - The PKCS#1 verification failed" ); + case -(MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE): + return( "RSA - The output buffer for decryption is not large enough" ); + case -(MBEDTLS_ERR_RSA_RNG_FAILED): + return( "RSA - The random generator failed to generate non-zeros" ); + case -(MBEDTLS_ERR_RSA_UNSUPPORTED_OPERATION): + return( "RSA - The implementation does not offer the requested operation, for example, because of security violations or lack of functionality" ); + case -(MBEDTLS_ERR_RSA_HW_ACCEL_FAILED): + return( "RSA - RSA hardware accelerator failed" ); +#endif /* MBEDTLS_RSA_C */ + +#if defined(MBEDTLS_SSL_TLS_C) + case -(MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE): + return( "SSL - The requested feature is not available" ); + case -(MBEDTLS_ERR_SSL_BAD_INPUT_DATA): + return( "SSL - Bad input parameters to function" ); + case -(MBEDTLS_ERR_SSL_INVALID_MAC): + return( "SSL - Verification of the message MAC failed" ); + case -(MBEDTLS_ERR_SSL_INVALID_RECORD): + return( "SSL - An invalid SSL record was received" ); + case -(MBEDTLS_ERR_SSL_CONN_EOF): + return( "SSL - The connection indicated an EOF" ); + case -(MBEDTLS_ERR_SSL_UNKNOWN_CIPHER): + return( "SSL - An unknown cipher was received" ); + case -(MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN): + return( "SSL - The server has no ciphersuites in common with the client" ); + case -(MBEDTLS_ERR_SSL_NO_RNG): + return( "SSL - No RNG was provided to the SSL module" ); + case -(MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE): + return( "SSL - No client certification received from the client, but required by the authentication mode" ); + case -(MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE): + return( "SSL - Our own certificate(s) is/are too large to send in an SSL message" ); + case -(MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED): + return( "SSL - The own certificate is not set, but needed by the server" ); + case -(MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED): + return( "SSL - The own private key or pre-shared key is not set, but needed" ); + case -(MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED): + return( "SSL - No CA Chain is set, but required to operate" ); + case -(MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE): + return( "SSL - An unexpected message was received from our peer" ); + case -(MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE): + return( "SSL - A fatal alert message was received from our peer" ); + case -(MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED): + return( "SSL - Verification of our peer failed" ); + case -(MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY): + return( "SSL - The peer notified us that the connection is going to be closed" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO): + return( "SSL - Processing of the ClientHello handshake message failed" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO): + return( "SSL - Processing of the ServerHello handshake message failed" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE): + return( "SSL - Processing of the Certificate handshake message failed" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST): + return( "SSL - Processing of the CertificateRequest handshake message failed" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE): + return( "SSL - Processing of the ServerKeyExchange handshake message failed" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE): + return( "SSL - Processing of the ServerHelloDone handshake message failed" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE): + return( "SSL - Processing of the ClientKeyExchange handshake message failed" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP): + return( "SSL - Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Read Public" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS): + return( "SSL - Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Calculate Secret" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY): + return( "SSL - Processing of the CertificateVerify handshake message failed" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC): + return( "SSL - Processing of the ChangeCipherSpec handshake message failed" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_FINISHED): + return( "SSL - Processing of the Finished handshake message failed" ); + case -(MBEDTLS_ERR_SSL_ALLOC_FAILED): + return( "SSL - Memory allocation failed" ); + case -(MBEDTLS_ERR_SSL_HW_ACCEL_FAILED): + return( "SSL - Hardware acceleration function returned with error" ); + case -(MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH): + return( "SSL - Hardware acceleration function skipped / left alone data" ); + case -(MBEDTLS_ERR_SSL_COMPRESSION_FAILED): + return( "SSL - Processing of the compression / decompression failed" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION): + return( "SSL - Handshake protocol not within min/max boundaries" ); + case -(MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET): + return( "SSL - Processing of the NewSessionTicket handshake message failed" ); + case -(MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED): + return( "SSL - Session ticket has expired" ); + case -(MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH): + return( "SSL - Public key type mismatch (eg, asked for RSA key exchange and presented EC key)" ); + case -(MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY): + return( "SSL - Unknown identity received (eg, PSK identity)" ); + case -(MBEDTLS_ERR_SSL_INTERNAL_ERROR): + return( "SSL - Internal error (eg, unexpected failure in lower-level module)" ); + case -(MBEDTLS_ERR_SSL_COUNTER_WRAPPING): + return( "SSL - A counter would wrap (eg, too many messages exchanged)" ); + case -(MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO): + return( "SSL - Unexpected message at ServerHello in renegotiation" ); + case -(MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED): + return( "SSL - DTLS client must retry for hello verification" ); + case -(MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL): + return( "SSL - A buffer is too small to receive or write a message" ); + case -(MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE): + return( "SSL - None of the common ciphersuites is usable (eg, no suitable certificate, see debug messages)" ); + case -(MBEDTLS_ERR_SSL_WANT_READ): + return( "SSL - No data of requested type currently available on underlying transport" ); + case -(MBEDTLS_ERR_SSL_WANT_WRITE): + return( "SSL - Connection requires a write call" ); + case -(MBEDTLS_ERR_SSL_TIMEOUT): + return( "SSL - The operation timed out" ); + case -(MBEDTLS_ERR_SSL_CLIENT_RECONNECT): + return( "SSL - The client initiated a reconnect from the same port" ); + case -(MBEDTLS_ERR_SSL_UNEXPECTED_RECORD): + return( "SSL - Record header looks valid but is not expected" ); + case -(MBEDTLS_ERR_SSL_NON_FATAL): + return( "SSL - The alert message received indicates a non-fatal error" ); + case -(MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH): + return( "SSL - Couldn't set the hash for verifying CertificateVerify" ); + case -(MBEDTLS_ERR_SSL_CONTINUE_PROCESSING): + return( "SSL - Internal-only message signaling that further message-processing should be done" ); + case -(MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS): + return( "SSL - The asynchronous operation is not completed yet" ); + case -(MBEDTLS_ERR_SSL_EARLY_MESSAGE): + return( "SSL - Internal-only message signaling that a message arrived early" ); + case -(MBEDTLS_ERR_SSL_UNEXPECTED_CID): + return( "SSL - An encrypted DTLS-frame with an unexpected CID was received" ); + case -(MBEDTLS_ERR_SSL_VERSION_MISMATCH): + return( "SSL - An operation failed due to an unexpected version or configuration" ); + case -(MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS): + return( "SSL - A cryptographic operation is in progress. Try again later" ); + case -(MBEDTLS_ERR_SSL_BAD_CONFIG): + return( "SSL - Invalid value in SSL config" ); + case -(MBEDTLS_ERR_SSL_CACHE_ENTRY_NOT_FOUND): + return( "SSL - Cache entry not found" ); + case -(MBEDTLS_ERR_SSL_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME): + return( "SSL - Attempt to verify a certificate without an expected hostname. This is usually insecure. In TLS clients, when a client authenticates a server through its certificate, the client normally checks three things: - the certificate chain must be valid; - the chain must start from a trusted CA; - the certificate must cover the server name that is expected by the client. Omitting any of these checks is generally insecure, and can allow a malicious server to impersonate a legitimate server. The third check may be safely skipped in some unusual scenarios, such as networks where eavesdropping is a risk but not active attacks, or a private PKI where the client equally trusts all servers that are accredited by the root CA. You should call mbedtls_ssl_set_hostname() with the expected server name before starting a TLS handshake on a client (unless the client is set up to only use PSK-based authentication, which does not rely on the host name). If you have determined that server name verification is not required for security in your scenario, call mbedtls_ssl_set_hostname() with \\p NULL as the server name. This error is raised if all of the following conditions are met: - A TLS client is configured with the authentication mode #MBEDTLS_SSL_VERIFY_REQUIRED (default). - Certificate authentication is enabled. - The client does not call mbedtls_ssl_set_hostname(). - The configuration option #MBEDTLS_SSL_CLI_ALLOW_WEAK_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME is not enabled" ); +#endif /* MBEDTLS_SSL_TLS_C */ + +#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) + case -(MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE): + return( "X509 - Unavailable feature, e.g. RSA hashing/encryption combination" ); + case -(MBEDTLS_ERR_X509_UNKNOWN_OID): + return( "X509 - Requested OID is unknown" ); + case -(MBEDTLS_ERR_X509_INVALID_FORMAT): + return( "X509 - The CRT/CRL/CSR format is invalid, e.g. different type expected" ); + case -(MBEDTLS_ERR_X509_INVALID_VERSION): + return( "X509 - The CRT/CRL/CSR version element is invalid" ); + case -(MBEDTLS_ERR_X509_INVALID_SERIAL): + return( "X509 - The serial tag or value is invalid" ); + case -(MBEDTLS_ERR_X509_INVALID_ALG): + return( "X509 - The algorithm tag or value is invalid" ); + case -(MBEDTLS_ERR_X509_INVALID_NAME): + return( "X509 - The name tag or value is invalid" ); + case -(MBEDTLS_ERR_X509_INVALID_DATE): + return( "X509 - The date tag or value is invalid" ); + case -(MBEDTLS_ERR_X509_INVALID_SIGNATURE): + return( "X509 - The signature tag or value invalid" ); + case -(MBEDTLS_ERR_X509_INVALID_EXTENSIONS): + return( "X509 - The extension tag or value is invalid" ); + case -(MBEDTLS_ERR_X509_UNKNOWN_VERSION): + return( "X509 - CRT/CRL/CSR has an unsupported version number" ); + case -(MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG): + return( "X509 - Signature algorithm (oid) is unsupported" ); + case -(MBEDTLS_ERR_X509_SIG_MISMATCH): + return( "X509 - Signature algorithms do not match. (see \\c ::mbedtls_x509_crt sig_oid)" ); + case -(MBEDTLS_ERR_X509_CERT_VERIFY_FAILED): + return( "X509 - Certificate verification failed, e.g. CRL, CA or signature check failed" ); + case -(MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT): + return( "X509 - Format not recognized as DER or PEM" ); + case -(MBEDTLS_ERR_X509_BAD_INPUT_DATA): + return( "X509 - Input invalid" ); + case -(MBEDTLS_ERR_X509_ALLOC_FAILED): + return( "X509 - Allocation of memory failed" ); + case -(MBEDTLS_ERR_X509_FILE_IO_ERROR): + return( "X509 - Read/write of file failed" ); + case -(MBEDTLS_ERR_X509_BUFFER_TOO_SMALL): + return( "X509 - Destination buffer is too small" ); + case -(MBEDTLS_ERR_X509_FATAL_ERROR): + return( "X509 - A fatal error occurred, eg the chain is too long or the vrfy callback failed" ); +#endif /* MBEDTLS_X509_USE_C || MBEDTLS_X509_CREATE_C */ + /* End Auto-Generated Code. */ + + default: + break; + } + + return NULL; +} + +const char *mbedtls_low_level_strerr(int error_code) +{ + int low_level_error_code; + + if (error_code < 0) { + error_code = -error_code; + } + + /* Extract the low-level part from the error code. */ + low_level_error_code = error_code & ~0xFF80; + + switch (low_level_error_code) { + /* Begin Auto-Generated Code. */ + #if defined(MBEDTLS_AES_C) + case -(MBEDTLS_ERR_AES_INVALID_KEY_LENGTH): + return( "AES - Invalid key length" ); + case -(MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH): + return( "AES - Invalid data input length" ); + case -(MBEDTLS_ERR_AES_BAD_INPUT_DATA): + return( "AES - Invalid input data" ); + case -(MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE): + return( "AES - Feature not available. For example, an unsupported AES key size" ); + case -(MBEDTLS_ERR_AES_HW_ACCEL_FAILED): + return( "AES - AES hardware accelerator failed" ); +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_ARC4_C) + case -(MBEDTLS_ERR_ARC4_HW_ACCEL_FAILED): + return( "ARC4 - ARC4 hardware accelerator failed" ); +#endif /* MBEDTLS_ARC4_C */ + +#if defined(MBEDTLS_ARIA_C) + case -(MBEDTLS_ERR_ARIA_BAD_INPUT_DATA): + return( "ARIA - Bad input data" ); + case -(MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH): + return( "ARIA - Invalid data input length" ); + case -(MBEDTLS_ERR_ARIA_FEATURE_UNAVAILABLE): + return( "ARIA - Feature not available. For example, an unsupported ARIA key size" ); + case -(MBEDTLS_ERR_ARIA_HW_ACCEL_FAILED): + return( "ARIA - ARIA hardware accelerator failed" ); +#endif /* MBEDTLS_ARIA_C */ + +#if defined(MBEDTLS_ASN1_PARSE_C) + case -(MBEDTLS_ERR_ASN1_OUT_OF_DATA): + return( "ASN1 - Out of data when parsing an ASN1 data structure" ); + case -(MBEDTLS_ERR_ASN1_UNEXPECTED_TAG): + return( "ASN1 - ASN1 tag was of an unexpected value" ); + case -(MBEDTLS_ERR_ASN1_INVALID_LENGTH): + return( "ASN1 - Error when trying to determine the length or invalid length" ); + case -(MBEDTLS_ERR_ASN1_LENGTH_MISMATCH): + return( "ASN1 - Actual length differs from expected length" ); + case -(MBEDTLS_ERR_ASN1_INVALID_DATA): + return( "ASN1 - Data is invalid" ); + case -(MBEDTLS_ERR_ASN1_ALLOC_FAILED): + return( "ASN1 - Memory allocation failed" ); + case -(MBEDTLS_ERR_ASN1_BUF_TOO_SMALL): + return( "ASN1 - Buffer too small when writing ASN.1 data structure" ); +#endif /* MBEDTLS_ASN1_PARSE_C */ + +#if defined(MBEDTLS_BASE64_C) + case -(MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL): + return( "BASE64 - Output buffer too small" ); + case -(MBEDTLS_ERR_BASE64_INVALID_CHARACTER): + return( "BASE64 - Invalid character in input" ); +#endif /* MBEDTLS_BASE64_C */ + +#if defined(MBEDTLS_BIGNUM_C) + case -(MBEDTLS_ERR_MPI_FILE_IO_ERROR): + return( "BIGNUM - An error occurred while reading from or writing to a file" ); + case -(MBEDTLS_ERR_MPI_BAD_INPUT_DATA): + return( "BIGNUM - Bad input parameters to function" ); + case -(MBEDTLS_ERR_MPI_INVALID_CHARACTER): + return( "BIGNUM - There is an invalid character in the digit string" ); + case -(MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL): + return( "BIGNUM - The buffer is too small to write to" ); + case -(MBEDTLS_ERR_MPI_NEGATIVE_VALUE): + return( "BIGNUM - The input arguments are negative or result in illegal output" ); + case -(MBEDTLS_ERR_MPI_DIVISION_BY_ZERO): + return( "BIGNUM - The input argument for division is zero, which is not allowed" ); + case -(MBEDTLS_ERR_MPI_NOT_ACCEPTABLE): + return( "BIGNUM - The input arguments are not acceptable" ); + case -(MBEDTLS_ERR_MPI_ALLOC_FAILED): + return( "BIGNUM - Memory allocation failed" ); +#endif /* MBEDTLS_BIGNUM_C */ + +#if defined(MBEDTLS_BLOWFISH_C) + case -(MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA): + return( "BLOWFISH - Bad input data" ); + case -(MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH): + return( "BLOWFISH - Invalid data input length" ); + case -(MBEDTLS_ERR_BLOWFISH_HW_ACCEL_FAILED): + return( "BLOWFISH - Blowfish hardware accelerator failed" ); +#endif /* MBEDTLS_BLOWFISH_C */ + +#if defined(MBEDTLS_CAMELLIA_C) + case -(MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA): + return( "CAMELLIA - Bad input data" ); + case -(MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH): + return( "CAMELLIA - Invalid data input length" ); + case -(MBEDTLS_ERR_CAMELLIA_HW_ACCEL_FAILED): + return( "CAMELLIA - Camellia hardware accelerator failed" ); +#endif /* MBEDTLS_CAMELLIA_C */ + +#if defined(MBEDTLS_CCM_C) + case -(MBEDTLS_ERR_CCM_BAD_INPUT): + return( "CCM - Bad input parameters to the function" ); + case -(MBEDTLS_ERR_CCM_AUTH_FAILED): + return( "CCM - Authenticated decryption failed" ); + case -(MBEDTLS_ERR_CCM_HW_ACCEL_FAILED): + return( "CCM - CCM hardware accelerator failed" ); +#endif /* MBEDTLS_CCM_C */ + +#if defined(MBEDTLS_CHACHA20_C) + case -(MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA): + return( "CHACHA20 - Invalid input parameter(s)" ); + case -(MBEDTLS_ERR_CHACHA20_FEATURE_UNAVAILABLE): + return( "CHACHA20 - Feature not available. For example, s part of the API is not implemented" ); + case -(MBEDTLS_ERR_CHACHA20_HW_ACCEL_FAILED): + return( "CHACHA20 - Chacha20 hardware accelerator failed" ); +#endif /* MBEDTLS_CHACHA20_C */ + +#if defined(MBEDTLS_CHACHAPOLY_C) + case -(MBEDTLS_ERR_CHACHAPOLY_BAD_STATE): + return( "CHACHAPOLY - The requested operation is not permitted in the current state" ); + case -(MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED): + return( "CHACHAPOLY - Authenticated decryption failed: data was not authentic" ); +#endif /* MBEDTLS_CHACHAPOLY_C */ + +#if defined(MBEDTLS_CMAC_C) + case -(MBEDTLS_ERR_CMAC_HW_ACCEL_FAILED): + return( "CMAC - CMAC hardware accelerator failed" ); +#endif /* MBEDTLS_CMAC_C */ + +#if defined(MBEDTLS_CTR_DRBG_C) + case -(MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED): + return( "CTR_DRBG - The entropy source failed" ); + case -(MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG): + return( "CTR_DRBG - The requested random buffer length is too big" ); + case -(MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG): + return( "CTR_DRBG - The input (entropy + additional data) is too large" ); + case -(MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR): + return( "CTR_DRBG - Read or write error in file" ); +#endif /* MBEDTLS_CTR_DRBG_C */ + +#if defined(MBEDTLS_DES_C) + case -(MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH): + return( "DES - The data input has an invalid length" ); + case -(MBEDTLS_ERR_DES_HW_ACCEL_FAILED): + return( "DES - DES hardware accelerator failed" ); +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_ENTROPY_C) + case -(MBEDTLS_ERR_ENTROPY_SOURCE_FAILED): + return( "ENTROPY - Critical entropy source failure" ); + case -(MBEDTLS_ERR_ENTROPY_MAX_SOURCES): + return( "ENTROPY - No more sources can be added" ); + case -(MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED): + return( "ENTROPY - No sources have been added to poll" ); + case -(MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE): + return( "ENTROPY - No strong sources have been added to poll" ); + case -(MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR): + return( "ENTROPY - Read/write error in file" ); +#endif /* MBEDTLS_ENTROPY_C */ + +#if defined(MBEDTLS_ERROR_C) + case -(MBEDTLS_ERR_ERROR_GENERIC_ERROR): + return( "ERROR - Generic error" ); + case -(MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED): + return( "ERROR - This is a bug in the library" ); +#endif /* MBEDTLS_ERROR_C */ + +#if defined(MBEDTLS_GCM_C) + case -(MBEDTLS_ERR_GCM_AUTH_FAILED): + return( "GCM - Authenticated decryption failed" ); + case -(MBEDTLS_ERR_GCM_HW_ACCEL_FAILED): + return( "GCM - GCM hardware accelerator failed" ); + case -(MBEDTLS_ERR_GCM_BAD_INPUT): + return( "GCM - Bad input parameters to function" ); +#endif /* MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_HKDF_C) + case -(MBEDTLS_ERR_HKDF_BAD_INPUT_DATA): + return( "HKDF - Bad input parameters to function" ); +#endif /* MBEDTLS_HKDF_C */ + +#if defined(MBEDTLS_HMAC_DRBG_C) + case -(MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG): + return( "HMAC_DRBG - Too many random requested in single call" ); + case -(MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG): + return( "HMAC_DRBG - Input too large (Entropy + additional)" ); + case -(MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR): + return( "HMAC_DRBG - Read/write error in file" ); + case -(MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED): + return( "HMAC_DRBG - The entropy source failed" ); +#endif /* MBEDTLS_HMAC_DRBG_C */ + +#if defined(MBEDTLS_MD2_C) + case -(MBEDTLS_ERR_MD2_HW_ACCEL_FAILED): + return( "MD2 - MD2 hardware accelerator failed" ); +#endif /* MBEDTLS_MD2_C */ + +#if defined(MBEDTLS_MD4_C) + case -(MBEDTLS_ERR_MD4_HW_ACCEL_FAILED): + return( "MD4 - MD4 hardware accelerator failed" ); +#endif /* MBEDTLS_MD4_C */ + +#if defined(MBEDTLS_MD5_C) + case -(MBEDTLS_ERR_MD5_HW_ACCEL_FAILED): + return( "MD5 - MD5 hardware accelerator failed" ); +#endif /* MBEDTLS_MD5_C */ + +#if defined(MBEDTLS_NET_C) + case -(MBEDTLS_ERR_NET_SOCKET_FAILED): + return( "NET - Failed to open a socket" ); + case -(MBEDTLS_ERR_NET_CONNECT_FAILED): + return( "NET - The connection to the given server / port failed" ); + case -(MBEDTLS_ERR_NET_BIND_FAILED): + return( "NET - Binding of the socket failed" ); + case -(MBEDTLS_ERR_NET_LISTEN_FAILED): + return( "NET - Could not listen on the socket" ); + case -(MBEDTLS_ERR_NET_ACCEPT_FAILED): + return( "NET - Could not accept the incoming connection" ); + case -(MBEDTLS_ERR_NET_RECV_FAILED): + return( "NET - Reading information from the socket failed" ); + case -(MBEDTLS_ERR_NET_SEND_FAILED): + return( "NET - Sending information through the socket failed" ); + case -(MBEDTLS_ERR_NET_CONN_RESET): + return( "NET - Connection was reset by peer" ); + case -(MBEDTLS_ERR_NET_UNKNOWN_HOST): + return( "NET - Failed to get an IP address for the given hostname" ); + case -(MBEDTLS_ERR_NET_BUFFER_TOO_SMALL): + return( "NET - Buffer is too small to hold the data" ); + case -(MBEDTLS_ERR_NET_INVALID_CONTEXT): + return( "NET - The context is invalid, eg because it was free()ed" ); + case -(MBEDTLS_ERR_NET_POLL_FAILED): + return( "NET - Polling the net context failed" ); + case -(MBEDTLS_ERR_NET_BAD_INPUT_DATA): + return( "NET - Input invalid" ); +#endif /* MBEDTLS_NET_C */ + +#if defined(MBEDTLS_OID_C) + case -(MBEDTLS_ERR_OID_NOT_FOUND): + return( "OID - OID is not found" ); + case -(MBEDTLS_ERR_OID_BUF_TOO_SMALL): + return( "OID - output buffer is too small" ); +#endif /* MBEDTLS_OID_C */ + +#if defined(MBEDTLS_PADLOCK_C) + case -(MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED): + return( "PADLOCK - Input data should be aligned" ); +#endif /* MBEDTLS_PADLOCK_C */ + +#if defined(MBEDTLS_PLATFORM_C) + case -(MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED): + return( "PLATFORM - Hardware accelerator failed" ); + case -(MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED): + return( "PLATFORM - The requested feature is not supported by the platform" ); +#endif /* MBEDTLS_PLATFORM_C */ + +#if defined(MBEDTLS_POLY1305_C) + case -(MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA): + return( "POLY1305 - Invalid input parameter(s)" ); + case -(MBEDTLS_ERR_POLY1305_FEATURE_UNAVAILABLE): + return( "POLY1305 - Feature not available. For example, s part of the API is not implemented" ); + case -(MBEDTLS_ERR_POLY1305_HW_ACCEL_FAILED): + return( "POLY1305 - Poly1305 hardware accelerator failed" ); +#endif /* MBEDTLS_POLY1305_C */ + +#if defined(MBEDTLS_RIPEMD160_C) + case -(MBEDTLS_ERR_RIPEMD160_HW_ACCEL_FAILED): + return( "RIPEMD160 - RIPEMD160 hardware accelerator failed" ); +#endif /* MBEDTLS_RIPEMD160_C */ + +#if defined(MBEDTLS_SHA1_C) + case -(MBEDTLS_ERR_SHA1_HW_ACCEL_FAILED): + return( "SHA1 - SHA-1 hardware accelerator failed" ); + case -(MBEDTLS_ERR_SHA1_BAD_INPUT_DATA): + return( "SHA1 - SHA-1 input data was malformed" ); +#endif /* MBEDTLS_SHA1_C */ + +#if defined(MBEDTLS_SHA256_C) + case -(MBEDTLS_ERR_SHA256_HW_ACCEL_FAILED): + return( "SHA256 - SHA-256 hardware accelerator failed" ); + case -(MBEDTLS_ERR_SHA256_BAD_INPUT_DATA): + return( "SHA256 - SHA-256 input data was malformed" ); +#endif /* MBEDTLS_SHA256_C */ + +#if defined(MBEDTLS_SHA512_C) + case -(MBEDTLS_ERR_SHA512_HW_ACCEL_FAILED): + return( "SHA512 - SHA-512 hardware accelerator failed" ); + case -(MBEDTLS_ERR_SHA512_BAD_INPUT_DATA): + return( "SHA512 - SHA-512 input data was malformed" ); +#endif /* MBEDTLS_SHA512_C */ + +#if defined(MBEDTLS_THREADING_C) + case -(MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE): + return( "THREADING - The selected feature is not available" ); + case -(MBEDTLS_ERR_THREADING_BAD_INPUT_DATA): + return( "THREADING - Bad input parameters to function" ); + case -(MBEDTLS_ERR_THREADING_MUTEX_ERROR): + return( "THREADING - Locking / unlocking / free failed with error code" ); +#endif /* MBEDTLS_THREADING_C */ + +#if defined(MBEDTLS_XTEA_C) + case -(MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH): + return( "XTEA - The data input has an invalid length" ); + case -(MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED): + return( "XTEA - XTEA hardware accelerator failed" ); +#endif /* MBEDTLS_XTEA_C */ + /* End Auto-Generated Code. */ + + default: + break; + } + + return NULL; +} + +void mbedtls_strerror(int ret, char *buf, size_t buflen) +{ + size_t len; + int use_ret; + const char *high_level_error_description = NULL; + const char *low_level_error_description = NULL; + + if (buflen == 0) { + return; + } + + memset(buf, 0x00, buflen); + + if (ret < 0) { + ret = -ret; + } + + if (ret & 0xFF80) { + use_ret = ret & 0xFF80; + + // Translate high level error code. + high_level_error_description = mbedtls_high_level_strerr(ret); + + if (high_level_error_description == NULL) { + mbedtls_snprintf(buf, buflen, "UNKNOWN ERROR CODE (%04X)", (unsigned int) use_ret); + } else { + mbedtls_snprintf(buf, buflen, "%s", high_level_error_description); + } + +#if defined(MBEDTLS_SSL_TLS_C) + // Early return in case of a fatal error - do not try to translate low + // level code. + if (use_ret == -(MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE)) { + return; + } +#endif /* MBEDTLS_SSL_TLS_C */ + } + + use_ret = ret & ~0xFF80; + + if (use_ret == 0) { + return; + } + + // If high level code is present, make a concatenation between both + // error strings. + // + len = strlen(buf); + + if (len > 0) { + if (buflen - len < 5) { + return; + } + + mbedtls_snprintf(buf + len, buflen - len, " : "); + + buf += len + 3; + buflen -= len + 3; + } + + // Translate low level error code. + low_level_error_description = mbedtls_low_level_strerr(ret); + + if (low_level_error_description == NULL) { + mbedtls_snprintf(buf, buflen, "UNKNOWN ERROR CODE (%04X)", (unsigned int) use_ret); + } else { + mbedtls_snprintf(buf, buflen, "%s", low_level_error_description); + } +} + +#else /* MBEDTLS_ERROR_C */ + +/* + * Provide a dummy implementation when MBEDTLS_ERROR_C is not defined + */ +void mbedtls_strerror(int ret, char *buf, size_t buflen) +{ + ((void) ret); + + if (buflen > 0) { + buf[0] = '\0'; + } +} + +#endif /* MBEDTLS_ERROR_C */ + +#if defined(MBEDTLS_TEST_HOOKS) +void (*mbedtls_test_hook_error_add)(int, int, const char *, int); +#endif + +#endif /* MBEDTLS_ERROR_C || MBEDTLS_ERROR_STRERROR_DUMMY */ diff --git a/ext/opcua_client/mbedtls/library/gcm.c b/ext/opcua_client/mbedtls/library/gcm.c new file mode 100644 index 0000000..d3e7732 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/gcm.c @@ -0,0 +1,1012 @@ +/* + * NIST SP800-38D compliant GCM implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf + * + * See also: + * [MGV] http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf + * + * We use the algorithm described as Shoup's method with 4-bit tables in + * [MGV] 4.1, pp. 12-13, to enhance speed without using too much memory. + */ + +#include "common.h" + +#if defined(MBEDTLS_GCM_C) + +#include "mbedtls/gcm.h" +#include "mbedtls/platform.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" +#include "mbedtls/constant_time.h" + +#include + +#if defined(MBEDTLS_AESNI_C) +#include "mbedtls/aesni.h" +#endif + +#if !defined(MBEDTLS_GCM_ALT) + +/* Parameter validation macros */ +#define GCM_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_GCM_BAD_INPUT) +#define GCM_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +/* + * Initialize a context + */ +void mbedtls_gcm_init(mbedtls_gcm_context *ctx) +{ + GCM_VALIDATE(ctx != NULL); + memset(ctx, 0, sizeof(mbedtls_gcm_context)); +} + +/* + * Precompute small multiples of H, that is set + * HH[i] || HL[i] = H times i, + * where i is seen as a field element as in [MGV], ie high-order bits + * correspond to low powers of P. The result is stored in the same way, that + * is the high-order bit of HH corresponds to P^0 and the low-order bit of HL + * corresponds to P^127. + */ +static int gcm_gen_table(mbedtls_gcm_context *ctx) +{ + int ret, i, j; + uint64_t hi, lo; + uint64_t vl, vh; + unsigned char h[16]; + size_t olen = 0; + + memset(h, 0, 16); + if ((ret = mbedtls_cipher_update(&ctx->cipher_ctx, h, 16, h, &olen)) != 0) { + return ret; + } + + /* pack h as two 64-bits ints, big-endian */ + hi = MBEDTLS_GET_UINT32_BE(h, 0); + lo = MBEDTLS_GET_UINT32_BE(h, 4); + vh = (uint64_t) hi << 32 | lo; + + hi = MBEDTLS_GET_UINT32_BE(h, 8); + lo = MBEDTLS_GET_UINT32_BE(h, 12); + vl = (uint64_t) hi << 32 | lo; + + /* 8 = 1000 corresponds to 1 in GF(2^128) */ + ctx->HL[8] = vl; + ctx->HH[8] = vh; + +#if defined(MBEDTLS_AESNI_HAVE_CODE) + /* With CLMUL support, we need only h, not the rest of the table */ + if (mbedtls_aesni_has_support(MBEDTLS_AESNI_CLMUL)) { + return 0; + } +#endif + + /* 0 corresponds to 0 in GF(2^128) */ + ctx->HH[0] = 0; + ctx->HL[0] = 0; + + for (i = 4; i > 0; i >>= 1) { + uint32_t T = (vl & 1) * 0xe1000000U; + vl = (vh << 63) | (vl >> 1); + vh = (vh >> 1) ^ ((uint64_t) T << 32); + + ctx->HL[i] = vl; + ctx->HH[i] = vh; + } + + for (i = 2; i <= 8; i *= 2) { + uint64_t *HiL = ctx->HL + i, *HiH = ctx->HH + i; + vh = *HiH; + vl = *HiL; + for (j = 1; j < i; j++) { + HiH[j] = vh ^ ctx->HH[j]; + HiL[j] = vl ^ ctx->HL[j]; + } + } + + return 0; +} + +int mbedtls_gcm_setkey(mbedtls_gcm_context *ctx, + mbedtls_cipher_id_t cipher, + const unsigned char *key, + unsigned int keybits) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const mbedtls_cipher_info_t *cipher_info; + + GCM_VALIDATE_RET(ctx != NULL); + GCM_VALIDATE_RET(key != NULL); + GCM_VALIDATE_RET(keybits == 128 || keybits == 192 || keybits == 256); + + cipher_info = mbedtls_cipher_info_from_values(cipher, keybits, + MBEDTLS_MODE_ECB); + if (cipher_info == NULL) { + return MBEDTLS_ERR_GCM_BAD_INPUT; + } + + if (cipher_info->block_size != 16) { + return MBEDTLS_ERR_GCM_BAD_INPUT; + } + + mbedtls_cipher_free(&ctx->cipher_ctx); + + if ((ret = mbedtls_cipher_setup(&ctx->cipher_ctx, cipher_info)) != 0) { + return ret; + } + + if ((ret = mbedtls_cipher_setkey(&ctx->cipher_ctx, key, keybits, + MBEDTLS_ENCRYPT)) != 0) { + return ret; + } + + if ((ret = gcm_gen_table(ctx)) != 0) { + return ret; + } + + return 0; +} + +/* + * Shoup's method for multiplication use this table with + * last4[x] = x times P^128 + * where x and last4[x] are seen as elements of GF(2^128) as in [MGV] + */ +static const uint64_t last4[16] = +{ + 0x0000, 0x1c20, 0x3840, 0x2460, + 0x7080, 0x6ca0, 0x48c0, 0x54e0, + 0xe100, 0xfd20, 0xd940, 0xc560, + 0x9180, 0x8da0, 0xa9c0, 0xb5e0 +}; + +/* + * Sets output to x times H using the precomputed tables. + * x and output are seen as elements of GF(2^128) as in [MGV]. + */ +static void gcm_mult(mbedtls_gcm_context *ctx, const unsigned char x[16], + unsigned char output[16]) +{ + int i = 0; + unsigned char lo, hi, rem; + uint64_t zh, zl; + +#if defined(MBEDTLS_AESNI_HAVE_CODE) + if (mbedtls_aesni_has_support(MBEDTLS_AESNI_CLMUL)) { + unsigned char h[16]; + + MBEDTLS_PUT_UINT32_BE(ctx->HH[8] >> 32, h, 0); + MBEDTLS_PUT_UINT32_BE(ctx->HH[8], h, 4); + MBEDTLS_PUT_UINT32_BE(ctx->HL[8] >> 32, h, 8); + MBEDTLS_PUT_UINT32_BE(ctx->HL[8], h, 12); + + mbedtls_aesni_gcm_mult(output, x, h); + return; + } +#endif /* MBEDTLS_AESNI_HAVE_CODE */ + + lo = x[15] & 0xf; + + zh = ctx->HH[lo]; + zl = ctx->HL[lo]; + + for (i = 15; i >= 0; i--) { + lo = x[i] & 0xf; + hi = (x[i] >> 4) & 0xf; + + if (i != 15) { + rem = (unsigned char) zl & 0xf; + zl = (zh << 60) | (zl >> 4); + zh = (zh >> 4); + zh ^= (uint64_t) last4[rem] << 48; + zh ^= ctx->HH[lo]; + zl ^= ctx->HL[lo]; + + } + + rem = (unsigned char) zl & 0xf; + zl = (zh << 60) | (zl >> 4); + zh = (zh >> 4); + zh ^= (uint64_t) last4[rem] << 48; + zh ^= ctx->HH[hi]; + zl ^= ctx->HL[hi]; + } + + MBEDTLS_PUT_UINT32_BE(zh >> 32, output, 0); + MBEDTLS_PUT_UINT32_BE(zh, output, 4); + MBEDTLS_PUT_UINT32_BE(zl >> 32, output, 8); + MBEDTLS_PUT_UINT32_BE(zl, output, 12); +} + +int mbedtls_gcm_starts(mbedtls_gcm_context *ctx, + int mode, + const unsigned char *iv, + size_t iv_len, + const unsigned char *add, + size_t add_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char work_buf[16]; + size_t i; + const unsigned char *p; + size_t use_len, olen = 0; + uint64_t iv_bits; + + GCM_VALIDATE_RET(ctx != NULL); + GCM_VALIDATE_RET(iv_len == 0 || iv != NULL); + GCM_VALIDATE_RET(add_len == 0 || add != NULL); + + /* IV and AD are limited to 2^64 bits, so 2^61 bytes */ + /* IV is not allowed to be zero length */ + if (iv_len == 0 || + ((uint64_t) iv_len) >> 61 != 0 || + ((uint64_t) add_len) >> 61 != 0) { + return MBEDTLS_ERR_GCM_BAD_INPUT; + } + + memset(ctx->y, 0x00, sizeof(ctx->y)); + memset(ctx->buf, 0x00, sizeof(ctx->buf)); + + ctx->mode = mode; + ctx->len = 0; + ctx->add_len = 0; + + if (iv_len == 12) { + memcpy(ctx->y, iv, iv_len); + ctx->y[15] = 1; + } else { + memset(work_buf, 0x00, 16); + iv_bits = (uint64_t) iv_len * 8; + MBEDTLS_PUT_UINT64_BE(iv_bits, work_buf, 8); + + p = iv; + while (iv_len > 0) { + use_len = (iv_len < 16) ? iv_len : 16; + + for (i = 0; i < use_len; i++) { + ctx->y[i] ^= p[i]; + } + + gcm_mult(ctx, ctx->y, ctx->y); + + iv_len -= use_len; + p += use_len; + } + + for (i = 0; i < 16; i++) { + ctx->y[i] ^= work_buf[i]; + } + + gcm_mult(ctx, ctx->y, ctx->y); + } + + if ((ret = mbedtls_cipher_update(&ctx->cipher_ctx, ctx->y, 16, + ctx->base_ectr, &olen)) != 0) { + return ret; + } + + ctx->add_len = add_len; + p = add; + while (add_len > 0) { + use_len = (add_len < 16) ? add_len : 16; + + for (i = 0; i < use_len; i++) { + ctx->buf[i] ^= p[i]; + } + + gcm_mult(ctx, ctx->buf, ctx->buf); + + add_len -= use_len; + p += use_len; + } + + return 0; +} + +int mbedtls_gcm_update(mbedtls_gcm_context *ctx, + size_t length, + const unsigned char *input, + unsigned char *output) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char ectr[16]; + size_t i; + const unsigned char *p; + unsigned char *out_p = output; + size_t use_len, olen = 0; + + GCM_VALIDATE_RET(ctx != NULL); + GCM_VALIDATE_RET(length == 0 || input != NULL); + GCM_VALIDATE_RET(length == 0 || output != NULL); + + if (output > input && (size_t) (output - input) < length) { + return MBEDTLS_ERR_GCM_BAD_INPUT; + } + + /* Total length is restricted to 2^39 - 256 bits, ie 2^36 - 2^5 bytes + * Also check for possible overflow */ + if (ctx->len + length < ctx->len || + (uint64_t) ctx->len + length > 0xFFFFFFFE0ull) { + return MBEDTLS_ERR_GCM_BAD_INPUT; + } + + ctx->len += length; + + p = input; + while (length > 0) { + use_len = (length < 16) ? length : 16; + + for (i = 16; i > 12; i--) { + if (++ctx->y[i - 1] != 0) { + break; + } + } + + if ((ret = mbedtls_cipher_update(&ctx->cipher_ctx, ctx->y, 16, ectr, + &olen)) != 0) { + return ret; + } + + for (i = 0; i < use_len; i++) { + if (ctx->mode == MBEDTLS_GCM_DECRYPT) { + ctx->buf[i] ^= p[i]; + } + out_p[i] = ectr[i] ^ p[i]; + if (ctx->mode == MBEDTLS_GCM_ENCRYPT) { + ctx->buf[i] ^= out_p[i]; + } + } + + gcm_mult(ctx, ctx->buf, ctx->buf); + + length -= use_len; + p += use_len; + out_p += use_len; + } + + return 0; +} + +int mbedtls_gcm_finish(mbedtls_gcm_context *ctx, + unsigned char *tag, + size_t tag_len) +{ + unsigned char work_buf[16]; + size_t i; + uint64_t orig_len; + uint64_t orig_add_len; + + GCM_VALIDATE_RET(ctx != NULL); + GCM_VALIDATE_RET(tag != NULL); + + orig_len = ctx->len * 8; + orig_add_len = ctx->add_len * 8; + + if (tag_len > 16 || tag_len < 4) { + return MBEDTLS_ERR_GCM_BAD_INPUT; + } + + memcpy(tag, ctx->base_ectr, tag_len); + + if (orig_len || orig_add_len) { + memset(work_buf, 0x00, 16); + + MBEDTLS_PUT_UINT32_BE((orig_add_len >> 32), work_buf, 0); + MBEDTLS_PUT_UINT32_BE((orig_add_len), work_buf, 4); + MBEDTLS_PUT_UINT32_BE((orig_len >> 32), work_buf, 8); + MBEDTLS_PUT_UINT32_BE((orig_len), work_buf, 12); + + for (i = 0; i < 16; i++) { + ctx->buf[i] ^= work_buf[i]; + } + + gcm_mult(ctx, ctx->buf, ctx->buf); + + for (i = 0; i < tag_len; i++) { + tag[i] ^= ctx->buf[i]; + } + } + + return 0; +} + +int mbedtls_gcm_crypt_and_tag(mbedtls_gcm_context *ctx, + int mode, + size_t length, + const unsigned char *iv, + size_t iv_len, + const unsigned char *add, + size_t add_len, + const unsigned char *input, + unsigned char *output, + size_t tag_len, + unsigned char *tag) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + GCM_VALIDATE_RET(ctx != NULL); + GCM_VALIDATE_RET(iv_len == 0 || iv != NULL); + GCM_VALIDATE_RET(add_len == 0 || add != NULL); + GCM_VALIDATE_RET(length == 0 || input != NULL); + GCM_VALIDATE_RET(length == 0 || output != NULL); + GCM_VALIDATE_RET(tag != NULL); + + if ((ret = mbedtls_gcm_starts(ctx, mode, iv, iv_len, add, add_len)) != 0) { + return ret; + } + + if ((ret = mbedtls_gcm_update(ctx, length, input, output)) != 0) { + return ret; + } + + if ((ret = mbedtls_gcm_finish(ctx, tag, tag_len)) != 0) { + return ret; + } + + return 0; +} + +int mbedtls_gcm_auth_decrypt(mbedtls_gcm_context *ctx, + size_t length, + const unsigned char *iv, + size_t iv_len, + const unsigned char *add, + size_t add_len, + const unsigned char *tag, + size_t tag_len, + const unsigned char *input, + unsigned char *output) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char check_tag[16]; + int diff; + + GCM_VALIDATE_RET(ctx != NULL); + GCM_VALIDATE_RET(iv_len == 0 || iv != NULL); + GCM_VALIDATE_RET(add_len == 0 || add != NULL); + GCM_VALIDATE_RET(tag != NULL); + GCM_VALIDATE_RET(length == 0 || input != NULL); + GCM_VALIDATE_RET(length == 0 || output != NULL); + + if ((ret = mbedtls_gcm_crypt_and_tag(ctx, MBEDTLS_GCM_DECRYPT, length, + iv, iv_len, add, add_len, + input, output, tag_len, check_tag)) != 0) { + return ret; + } + + /* Check tag in "constant-time" */ + diff = mbedtls_ct_memcmp(tag, check_tag, tag_len); + + if (diff != 0) { + mbedtls_platform_zeroize(output, length); + return MBEDTLS_ERR_GCM_AUTH_FAILED; + } + + return 0; +} + +void mbedtls_gcm_free(mbedtls_gcm_context *ctx) +{ + if (ctx == NULL) { + return; + } + mbedtls_cipher_free(&ctx->cipher_ctx); + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_gcm_context)); +} + +#endif /* !MBEDTLS_GCM_ALT */ + +#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) +/* + * AES-GCM test vectors from: + * + * http://csrc.nist.gov/groups/STM/cavp/documents/mac/gcmtestvectors.zip + */ +#define MAX_TESTS 6 + +static const int key_index_test_data[MAX_TESTS] = +{ 0, 0, 1, 1, 1, 1 }; + +static const unsigned char key_test_data[MAX_TESTS][32] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, + 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, + 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, + 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 }, +}; + +static const size_t iv_len_test_data[MAX_TESTS] = +{ 12, 12, 12, 12, 8, 60 }; + +static const int iv_index_test_data[MAX_TESTS] = +{ 0, 0, 1, 1, 1, 2 }; + +static const unsigned char iv_test_data[MAX_TESTS][64] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }, + { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, + 0xde, 0xca, 0xf8, 0x88 }, + { 0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5, + 0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa, + 0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1, + 0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28, + 0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39, + 0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54, + 0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57, + 0xa6, 0x37, 0xb3, 0x9b }, +}; + +static const size_t add_len_test_data[MAX_TESTS] = +{ 0, 0, 0, 20, 20, 20 }; + +static const int add_index_test_data[MAX_TESTS] = +{ 0, 0, 0, 1, 1, 1 }; + +static const unsigned char additional_test_data[MAX_TESTS][64] = +{ + { 0x00 }, + { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, + 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, + 0xab, 0xad, 0xda, 0xd2 }, +}; + +static const size_t pt_len_test_data[MAX_TESTS] = +{ 0, 16, 64, 60, 60, 60 }; + +static const int pt_index_test_data[MAX_TESTS] = +{ 0, 0, 1, 1, 1, 1 }; + +static const unsigned char pt_test_data[MAX_TESTS][64] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, + 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, + 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, + 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, + 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, + 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, + 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, + 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55 }, +}; + +static const unsigned char ct_test_data[MAX_TESTS * 3][64] = +{ + { 0x00 }, + { 0x03, 0x88, 0xda, 0xce, 0x60, 0xb6, 0xa3, 0x92, + 0xf3, 0x28, 0xc2, 0xb9, 0x71, 0xb2, 0xfe, 0x78 }, + { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, + 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, + 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, + 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, + 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, + 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, + 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, + 0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85 }, + { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, + 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, + 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, + 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, + 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, + 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, + 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, + 0x3d, 0x58, 0xe0, 0x91 }, + { 0x61, 0x35, 0x3b, 0x4c, 0x28, 0x06, 0x93, 0x4a, + 0x77, 0x7f, 0xf5, 0x1f, 0xa2, 0x2a, 0x47, 0x55, + 0x69, 0x9b, 0x2a, 0x71, 0x4f, 0xcd, 0xc6, 0xf8, + 0x37, 0x66, 0xe5, 0xf9, 0x7b, 0x6c, 0x74, 0x23, + 0x73, 0x80, 0x69, 0x00, 0xe4, 0x9f, 0x24, 0xb2, + 0x2b, 0x09, 0x75, 0x44, 0xd4, 0x89, 0x6b, 0x42, + 0x49, 0x89, 0xb5, 0xe1, 0xeb, 0xac, 0x0f, 0x07, + 0xc2, 0x3f, 0x45, 0x98 }, + { 0x8c, 0xe2, 0x49, 0x98, 0x62, 0x56, 0x15, 0xb6, + 0x03, 0xa0, 0x33, 0xac, 0xa1, 0x3f, 0xb8, 0x94, + 0xbe, 0x91, 0x12, 0xa5, 0xc3, 0xa2, 0x11, 0xa8, + 0xba, 0x26, 0x2a, 0x3c, 0xca, 0x7e, 0x2c, 0xa7, + 0x01, 0xe4, 0xa9, 0xa4, 0xfb, 0xa4, 0x3c, 0x90, + 0xcc, 0xdc, 0xb2, 0x81, 0xd4, 0x8c, 0x7c, 0x6f, + 0xd6, 0x28, 0x75, 0xd2, 0xac, 0xa4, 0x17, 0x03, + 0x4c, 0x34, 0xae, 0xe5 }, + { 0x00 }, + { 0x98, 0xe7, 0x24, 0x7c, 0x07, 0xf0, 0xfe, 0x41, + 0x1c, 0x26, 0x7e, 0x43, 0x84, 0xb0, 0xf6, 0x00 }, + { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41, + 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57, + 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84, + 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c, + 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25, + 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47, + 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9, + 0xcc, 0xda, 0x27, 0x10, 0xac, 0xad, 0xe2, 0x56 }, + { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41, + 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57, + 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84, + 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c, + 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25, + 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47, + 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9, + 0xcc, 0xda, 0x27, 0x10 }, + { 0x0f, 0x10, 0xf5, 0x99, 0xae, 0x14, 0xa1, 0x54, + 0xed, 0x24, 0xb3, 0x6e, 0x25, 0x32, 0x4d, 0xb8, + 0xc5, 0x66, 0x63, 0x2e, 0xf2, 0xbb, 0xb3, 0x4f, + 0x83, 0x47, 0x28, 0x0f, 0xc4, 0x50, 0x70, 0x57, + 0xfd, 0xdc, 0x29, 0xdf, 0x9a, 0x47, 0x1f, 0x75, + 0xc6, 0x65, 0x41, 0xd4, 0xd4, 0xda, 0xd1, 0xc9, + 0xe9, 0x3a, 0x19, 0xa5, 0x8e, 0x8b, 0x47, 0x3f, + 0xa0, 0xf0, 0x62, 0xf7 }, + { 0xd2, 0x7e, 0x88, 0x68, 0x1c, 0xe3, 0x24, 0x3c, + 0x48, 0x30, 0x16, 0x5a, 0x8f, 0xdc, 0xf9, 0xff, + 0x1d, 0xe9, 0xa1, 0xd8, 0xe6, 0xb4, 0x47, 0xef, + 0x6e, 0xf7, 0xb7, 0x98, 0x28, 0x66, 0x6e, 0x45, + 0x81, 0xe7, 0x90, 0x12, 0xaf, 0x34, 0xdd, 0xd9, + 0xe2, 0xf0, 0x37, 0x58, 0x9b, 0x29, 0x2d, 0xb3, + 0xe6, 0x7c, 0x03, 0x67, 0x45, 0xfa, 0x22, 0xe7, + 0xe9, 0xb7, 0x37, 0x3b }, + { 0x00 }, + { 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e, + 0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18 }, + { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, + 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d, + 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, + 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, + 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, + 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38, + 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, + 0xbc, 0xc9, 0xf6, 0x62, 0x89, 0x80, 0x15, 0xad }, + { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, + 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d, + 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, + 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, + 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, + 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38, + 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, + 0xbc, 0xc9, 0xf6, 0x62 }, + { 0xc3, 0x76, 0x2d, 0xf1, 0xca, 0x78, 0x7d, 0x32, + 0xae, 0x47, 0xc1, 0x3b, 0xf1, 0x98, 0x44, 0xcb, + 0xaf, 0x1a, 0xe1, 0x4d, 0x0b, 0x97, 0x6a, 0xfa, + 0xc5, 0x2f, 0xf7, 0xd7, 0x9b, 0xba, 0x9d, 0xe0, + 0xfe, 0xb5, 0x82, 0xd3, 0x39, 0x34, 0xa4, 0xf0, + 0x95, 0x4c, 0xc2, 0x36, 0x3b, 0xc7, 0x3f, 0x78, + 0x62, 0xac, 0x43, 0x0e, 0x64, 0xab, 0xe4, 0x99, + 0xf4, 0x7c, 0x9b, 0x1f }, + { 0x5a, 0x8d, 0xef, 0x2f, 0x0c, 0x9e, 0x53, 0xf1, + 0xf7, 0x5d, 0x78, 0x53, 0x65, 0x9e, 0x2a, 0x20, + 0xee, 0xb2, 0xb2, 0x2a, 0xaf, 0xde, 0x64, 0x19, + 0xa0, 0x58, 0xab, 0x4f, 0x6f, 0x74, 0x6b, 0xf4, + 0x0f, 0xc0, 0xc3, 0xb7, 0x80, 0xf2, 0x44, 0x45, + 0x2d, 0xa3, 0xeb, 0xf1, 0xc5, 0xd8, 0x2c, 0xde, + 0xa2, 0x41, 0x89, 0x97, 0x20, 0x0e, 0xf8, 0x2e, + 0x44, 0xae, 0x7e, 0x3f }, +}; + +static const unsigned char tag_test_data[MAX_TESTS * 3][16] = +{ + { 0x58, 0xe2, 0xfc, 0xce, 0xfa, 0x7e, 0x30, 0x61, + 0x36, 0x7f, 0x1d, 0x57, 0xa4, 0xe7, 0x45, 0x5a }, + { 0xab, 0x6e, 0x47, 0xd4, 0x2c, 0xec, 0x13, 0xbd, + 0xf5, 0x3a, 0x67, 0xb2, 0x12, 0x57, 0xbd, 0xdf }, + { 0x4d, 0x5c, 0x2a, 0xf3, 0x27, 0xcd, 0x64, 0xa6, + 0x2c, 0xf3, 0x5a, 0xbd, 0x2b, 0xa6, 0xfa, 0xb4 }, + { 0x5b, 0xc9, 0x4f, 0xbc, 0x32, 0x21, 0xa5, 0xdb, + 0x94, 0xfa, 0xe9, 0x5a, 0xe7, 0x12, 0x1a, 0x47 }, + { 0x36, 0x12, 0xd2, 0xe7, 0x9e, 0x3b, 0x07, 0x85, + 0x56, 0x1b, 0xe1, 0x4a, 0xac, 0xa2, 0xfc, 0xcb }, + { 0x61, 0x9c, 0xc5, 0xae, 0xff, 0xfe, 0x0b, 0xfa, + 0x46, 0x2a, 0xf4, 0x3c, 0x16, 0x99, 0xd0, 0x50 }, + { 0xcd, 0x33, 0xb2, 0x8a, 0xc7, 0x73, 0xf7, 0x4b, + 0xa0, 0x0e, 0xd1, 0xf3, 0x12, 0x57, 0x24, 0x35 }, + { 0x2f, 0xf5, 0x8d, 0x80, 0x03, 0x39, 0x27, 0xab, + 0x8e, 0xf4, 0xd4, 0x58, 0x75, 0x14, 0xf0, 0xfb }, + { 0x99, 0x24, 0xa7, 0xc8, 0x58, 0x73, 0x36, 0xbf, + 0xb1, 0x18, 0x02, 0x4d, 0xb8, 0x67, 0x4a, 0x14 }, + { 0x25, 0x19, 0x49, 0x8e, 0x80, 0xf1, 0x47, 0x8f, + 0x37, 0xba, 0x55, 0xbd, 0x6d, 0x27, 0x61, 0x8c }, + { 0x65, 0xdc, 0xc5, 0x7f, 0xcf, 0x62, 0x3a, 0x24, + 0x09, 0x4f, 0xcc, 0xa4, 0x0d, 0x35, 0x33, 0xf8 }, + { 0xdc, 0xf5, 0x66, 0xff, 0x29, 0x1c, 0x25, 0xbb, + 0xb8, 0x56, 0x8f, 0xc3, 0xd3, 0x76, 0xa6, 0xd9 }, + { 0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9, + 0xa9, 0x63, 0xb4, 0xf1, 0xc4, 0xcb, 0x73, 0x8b }, + { 0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0, + 0x26, 0x5b, 0x98, 0xb5, 0xd4, 0x8a, 0xb9, 0x19 }, + { 0xb0, 0x94, 0xda, 0xc5, 0xd9, 0x34, 0x71, 0xbd, + 0xec, 0x1a, 0x50, 0x22, 0x70, 0xe3, 0xcc, 0x6c }, + { 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68, + 0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b }, + { 0x3a, 0x33, 0x7d, 0xbf, 0x46, 0xa7, 0x92, 0xc4, + 0x5e, 0x45, 0x49, 0x13, 0xfe, 0x2e, 0xa8, 0xf2 }, + { 0xa4, 0x4a, 0x82, 0x66, 0xee, 0x1c, 0x8e, 0xb0, + 0xc8, 0xb5, 0xd4, 0xcf, 0x5a, 0xe9, 0xf1, 0x9a }, +}; + +int mbedtls_gcm_self_test(int verbose) +{ + mbedtls_gcm_context ctx; + unsigned char buf[64]; + unsigned char tag_buf[16]; + int i, j, ret; + mbedtls_cipher_id_t cipher = MBEDTLS_CIPHER_ID_AES; + + if (verbose != 0) { +#if defined(MBEDTLS_GCM_ALT) + mbedtls_printf(" GCM note: alternative implementation.\n"); +#else /* MBEDTLS_GCM_ALT */ +#if defined(MBEDTLS_AESNI_HAVE_CODE) + if (mbedtls_aesni_has_support(MBEDTLS_AESNI_CLMUL)) { + mbedtls_printf(" GCM note: using AESNI via "); +#if MBEDTLS_AESNI_HAVE_CODE == 1 + mbedtls_printf("assembly"); +#elif MBEDTLS_AESNI_HAVE_CODE == 2 + mbedtls_printf("intrinsics"); +#else + mbedtls_printf("(unknown)"); +#endif + mbedtls_printf(".\n"); + } else +#endif + mbedtls_printf(" GCM note: built-in implementation.\n"); +#endif /* MBEDTLS_GCM_ALT */ + } + + for (j = 0; j < 3; j++) { + int key_len = 128 + 64 * j; + + for (i = 0; i < MAX_TESTS; i++) { + mbedtls_gcm_init(&ctx); + + if (verbose != 0) { + mbedtls_printf(" AES-GCM-%3d #%d (%s): ", + key_len, i, "enc"); + } + + ret = mbedtls_gcm_setkey(&ctx, cipher, + key_test_data[key_index_test_data[i]], + key_len); + /* + * AES-192 is an optional feature that may be unavailable when + * there is an alternative underlying implementation i.e. when + * MBEDTLS_AES_ALT is defined. + */ + if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && key_len == 192) { + mbedtls_printf("skipped\n"); + break; + } else if (ret != 0) { + goto exit; + } + + ret = mbedtls_gcm_crypt_and_tag(&ctx, MBEDTLS_GCM_ENCRYPT, + pt_len_test_data[i], + iv_test_data[iv_index_test_data[i]], + iv_len_test_data[i], + additional_test_data[add_index_test_data[i]], + add_len_test_data[i], + pt_test_data[pt_index_test_data[i]], + buf, 16, tag_buf); +#if defined(MBEDTLS_GCM_ALT) + /* Allow alternative implementations to only support 12-byte nonces. */ + if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && + iv_len_test_data[i] != 12) { + mbedtls_printf("skipped\n"); + break; + } +#endif /* defined(MBEDTLS_GCM_ALT) */ + if (ret != 0) { + goto exit; + } + + if (memcmp(buf, ct_test_data[j * 6 + i], + pt_len_test_data[i]) != 0 || + memcmp(tag_buf, tag_test_data[j * 6 + i], 16) != 0) { + ret = 1; + goto exit; + } + + mbedtls_gcm_free(&ctx); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + mbedtls_gcm_init(&ctx); + + if (verbose != 0) { + mbedtls_printf(" AES-GCM-%3d #%d (%s): ", + key_len, i, "dec"); + } + + ret = mbedtls_gcm_setkey(&ctx, cipher, + key_test_data[key_index_test_data[i]], + key_len); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_gcm_crypt_and_tag(&ctx, MBEDTLS_GCM_DECRYPT, + pt_len_test_data[i], + iv_test_data[iv_index_test_data[i]], + iv_len_test_data[i], + additional_test_data[add_index_test_data[i]], + add_len_test_data[i], + ct_test_data[j * 6 + i], buf, 16, tag_buf); + + if (ret != 0) { + goto exit; + } + + if (memcmp(buf, pt_test_data[pt_index_test_data[i]], + pt_len_test_data[i]) != 0 || + memcmp(tag_buf, tag_test_data[j * 6 + i], 16) != 0) { + ret = 1; + goto exit; + } + + mbedtls_gcm_free(&ctx); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + mbedtls_gcm_init(&ctx); + + if (verbose != 0) { + mbedtls_printf(" AES-GCM-%3d #%d split (%s): ", + key_len, i, "enc"); + } + + ret = mbedtls_gcm_setkey(&ctx, cipher, + key_test_data[key_index_test_data[i]], + key_len); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_gcm_starts(&ctx, MBEDTLS_GCM_ENCRYPT, + iv_test_data[iv_index_test_data[i]], + iv_len_test_data[i], + additional_test_data[add_index_test_data[i]], + add_len_test_data[i]); + if (ret != 0) { + goto exit; + } + + if (pt_len_test_data[i] > 32) { + size_t rest_len = pt_len_test_data[i] - 32; + ret = mbedtls_gcm_update(&ctx, 32, + pt_test_data[pt_index_test_data[i]], + buf); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_gcm_update(&ctx, rest_len, + pt_test_data[pt_index_test_data[i]] + 32, + buf + 32); + if (ret != 0) { + goto exit; + } + } else { + ret = mbedtls_gcm_update(&ctx, pt_len_test_data[i], + pt_test_data[pt_index_test_data[i]], + buf); + if (ret != 0) { + goto exit; + } + } + + ret = mbedtls_gcm_finish(&ctx, tag_buf, 16); + if (ret != 0) { + goto exit; + } + + if (memcmp(buf, ct_test_data[j * 6 + i], + pt_len_test_data[i]) != 0 || + memcmp(tag_buf, tag_test_data[j * 6 + i], 16) != 0) { + ret = 1; + goto exit; + } + + mbedtls_gcm_free(&ctx); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + mbedtls_gcm_init(&ctx); + + if (verbose != 0) { + mbedtls_printf(" AES-GCM-%3d #%d split (%s): ", + key_len, i, "dec"); + } + + ret = mbedtls_gcm_setkey(&ctx, cipher, + key_test_data[key_index_test_data[i]], + key_len); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_gcm_starts(&ctx, MBEDTLS_GCM_DECRYPT, + iv_test_data[iv_index_test_data[i]], + iv_len_test_data[i], + additional_test_data[add_index_test_data[i]], + add_len_test_data[i]); + if (ret != 0) { + goto exit; + } + + if (pt_len_test_data[i] > 32) { + size_t rest_len = pt_len_test_data[i] - 32; + ret = mbedtls_gcm_update(&ctx, 32, ct_test_data[j * 6 + i], + buf); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_gcm_update(&ctx, rest_len, + ct_test_data[j * 6 + i] + 32, + buf + 32); + if (ret != 0) { + goto exit; + } + } else { + ret = mbedtls_gcm_update(&ctx, pt_len_test_data[i], + ct_test_data[j * 6 + i], + buf); + if (ret != 0) { + goto exit; + } + } + + ret = mbedtls_gcm_finish(&ctx, tag_buf, 16); + if (ret != 0) { + goto exit; + } + + if (memcmp(buf, pt_test_data[pt_index_test_data[i]], + pt_len_test_data[i]) != 0 || + memcmp(tag_buf, tag_test_data[j * 6 + i], 16) != 0) { + ret = 1; + goto exit; + } + + mbedtls_gcm_free(&ctx); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + ret = 0; + +exit: + if (ret != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + mbedtls_gcm_free(&ctx); + } + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ + +#endif /* MBEDTLS_GCM_C */ diff --git a/ext/opcua_client/mbedtls/library/havege.c b/ext/opcua_client/mbedtls/library/havege.c new file mode 100644 index 0000000..3d1f6f4 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/havege.c @@ -0,0 +1,226 @@ +/** + * \brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The HAVEGE RNG was designed by Andre Seznec in 2002. + * + * http://www.irisa.fr/caps/projects/hipsor/publi.php + * + * Contact: seznec(at)irisa_dot_fr - orocheco(at)irisa_dot_fr + */ + +#include "common.h" + +#if defined(MBEDTLS_HAVEGE_C) + +#include "mbedtls/havege.h" +#include "mbedtls/timing.h" +#include "mbedtls/platform_util.h" + +#include +#include + +/* ------------------------------------------------------------------------ + * On average, one iteration accesses two 8-word blocks in the havege WALK + * table, and generates 16 words in the RES array. + * + * The data read in the WALK table is updated and permuted after each use. + * The result of the hardware clock counter read is used for this update. + * + * 25 conditional tests are present. The conditional tests are grouped in + * two nested groups of 12 conditional tests and 1 test that controls the + * permutation; on average, there should be 6 tests executed and 3 of them + * should be mispredicted. + * ------------------------------------------------------------------------ + */ + +#define SWAP(X, Y) { uint32_t *T = (X); (X) = (Y); (Y) = T; } + +#define TST1_ENTER if (PTEST & 1) { PTEST ^= 3; PTEST >>= 1; +#define TST2_ENTER if (PTEST & 1) { PTEST ^= 3; PTEST >>= 1; + +#define TST1_LEAVE U1++; } +#define TST2_LEAVE U2++; } + +#define ONE_ITERATION \ + \ + PTEST = PT1 >> 20; \ + \ + TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ + TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ + TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ + \ + TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ + TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ + TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ + \ + PTX = (PT1 >> 18) & 7; \ + PT1 &= 0x1FFF; \ + PT2 &= 0x1FFF; \ + CLK = (uint32_t) mbedtls_timing_hardclock(); \ + \ + i = 0; \ + A = &WALK[PT1]; RES[i++] ^= *A; \ + B = &WALK[PT2]; RES[i++] ^= *B; \ + C = &WALK[PT1 ^ 1]; RES[i++] ^= *C; \ + D = &WALK[PT2 ^ 4]; RES[i++] ^= *D; \ + \ + IN = (*A >> (1)) ^ (*A << (31)) ^ CLK; \ + *A = (*B >> (2)) ^ (*B << (30)) ^ CLK; \ + *B = IN ^ U1; \ + *C = (*C >> (3)) ^ (*C << (29)) ^ CLK; \ + *D = (*D >> (4)) ^ (*D << (28)) ^ CLK; \ + \ + A = &WALK[PT1 ^ 2]; RES[i++] ^= *A; \ + B = &WALK[PT2 ^ 2]; RES[i++] ^= *B; \ + C = &WALK[PT1 ^ 3]; RES[i++] ^= *C; \ + D = &WALK[PT2 ^ 6]; RES[i++] ^= *D; \ + \ + if (PTEST & 1) SWAP(A, C); \ + \ + IN = (*A >> (5)) ^ (*A << (27)) ^ CLK; \ + *A = (*B >> (6)) ^ (*B << (26)) ^ CLK; \ + *B = IN; CLK = (uint32_t) mbedtls_timing_hardclock(); \ + *C = (*C >> (7)) ^ (*C << (25)) ^ CLK; \ + *D = (*D >> (8)) ^ (*D << (24)) ^ CLK; \ + \ + A = &WALK[PT1 ^ 4]; \ + B = &WALK[PT2 ^ 1]; \ + \ + PTEST = PT2 >> 1; \ + \ + PT2 = (RES[(i - 8) ^ PTY] ^ WALK[PT2 ^ PTY ^ 7]); \ + PT2 = ((PT2 & 0x1FFF) & (~8)) ^ ((PT1 ^ 8) & 0x8); \ + PTY = (PT2 >> 10) & 7; \ + \ + TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ + TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ + TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ + \ + TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ + TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ + TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ + \ + C = &WALK[PT1 ^ 5]; \ + D = &WALK[PT2 ^ 5]; \ + \ + RES[i++] ^= *A; \ + RES[i++] ^= *B; \ + RES[i++] ^= *C; \ + RES[i++] ^= *D; \ + \ + IN = (*A >> (9)) ^ (*A << (23)) ^ CLK; \ + *A = (*B >> (10)) ^ (*B << (22)) ^ CLK; \ + *B = IN ^ U2; \ + *C = (*C >> (11)) ^ (*C << (21)) ^ CLK; \ + *D = (*D >> (12)) ^ (*D << (20)) ^ CLK; \ + \ + A = &WALK[PT1 ^ 6]; RES[i++] ^= *A; \ + B = &WALK[PT2 ^ 3]; RES[i++] ^= *B; \ + C = &WALK[PT1 ^ 7]; RES[i++] ^= *C; \ + D = &WALK[PT2 ^ 7]; RES[i++] ^= *D; \ + \ + IN = (*A >> (13)) ^ (*A << (19)) ^ CLK; \ + *A = (*B >> (14)) ^ (*B << (18)) ^ CLK; \ + *B = IN; \ + *C = (*C >> (15)) ^ (*C << (17)) ^ CLK; \ + *D = (*D >> (16)) ^ (*D << (16)) ^ CLK; \ + \ + PT1 = (RES[(i - 8) ^ PTX] ^ \ + WALK[PT1 ^ PTX ^ 7]) & (~1); \ + PT1 ^= (PT2 ^ 0x10) & 0x10; \ + \ + for (n++, i = 0; i < 16; i++) \ + hs->pool[n % MBEDTLS_HAVEGE_COLLECT_SIZE] ^= RES[i]; + +/* + * Entropy gathering function + */ +static void havege_fill(mbedtls_havege_state *hs) +{ + size_t n = 0; + size_t i; + uint32_t U1, U2, *A, *B, *C, *D; + uint32_t PT1, PT2, *WALK, RES[16]; + uint32_t PTX, PTY, CLK, PTEST, IN; + + WALK = hs->WALK; + PT1 = hs->PT1; + PT2 = hs->PT2; + + PTX = U1 = 0; + PTY = U2 = 0; + + (void) PTX; + + memset(RES, 0, sizeof(RES)); + + while (n < MBEDTLS_HAVEGE_COLLECT_SIZE * 4) { + ONE_ITERATION + ONE_ITERATION + ONE_ITERATION + ONE_ITERATION + } + + hs->PT1 = PT1; + hs->PT2 = PT2; + + hs->offset[0] = 0; + hs->offset[1] = MBEDTLS_HAVEGE_COLLECT_SIZE / 2; +} + +/* + * HAVEGE initialization + */ +void mbedtls_havege_init(mbedtls_havege_state *hs) +{ + memset(hs, 0, sizeof(mbedtls_havege_state)); + + havege_fill(hs); +} + +void mbedtls_havege_free(mbedtls_havege_state *hs) +{ + if (hs == NULL) { + return; + } + + mbedtls_platform_zeroize(hs, sizeof(mbedtls_havege_state)); +} + +/* + * HAVEGE rand function + */ +int mbedtls_havege_random(void *p_rng, unsigned char *buf, size_t len) +{ + uint32_t val; + size_t use_len; + mbedtls_havege_state *hs = (mbedtls_havege_state *) p_rng; + unsigned char *p = buf; + + while (len > 0) { + use_len = len; + if (use_len > sizeof(val)) { + use_len = sizeof(val); + } + + if (hs->offset[1] >= MBEDTLS_HAVEGE_COLLECT_SIZE) { + havege_fill(hs); + } + + val = hs->pool[hs->offset[0]++]; + val ^= hs->pool[hs->offset[1]++]; + + memcpy(p, &val, use_len); + + len -= use_len; + p += use_len; + } + + return 0; +} + +#endif /* MBEDTLS_HAVEGE_C */ diff --git a/ext/opcua_client/mbedtls/library/hkdf.c b/ext/opcua_client/mbedtls/library/hkdf.c new file mode 100644 index 0000000..631ac24 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/hkdf.c @@ -0,0 +1,161 @@ +/* + * HKDF implementation -- RFC 5869 + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#include "common.h" + +#if defined(MBEDTLS_HKDF_C) + +#include +#include "mbedtls/hkdf.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +int mbedtls_hkdf(const mbedtls_md_info_t *md, const unsigned char *salt, + size_t salt_len, const unsigned char *ikm, size_t ikm_len, + const unsigned char *info, size_t info_len, + unsigned char *okm, size_t okm_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char prk[MBEDTLS_MD_MAX_SIZE]; + + ret = mbedtls_hkdf_extract(md, salt, salt_len, ikm, ikm_len, prk); + + if (ret == 0) { + ret = mbedtls_hkdf_expand(md, prk, mbedtls_md_get_size(md), + info, info_len, okm, okm_len); + } + + mbedtls_platform_zeroize(prk, sizeof(prk)); + + return ret; +} + +int mbedtls_hkdf_extract(const mbedtls_md_info_t *md, + const unsigned char *salt, size_t salt_len, + const unsigned char *ikm, size_t ikm_len, + unsigned char *prk) +{ + unsigned char null_salt[MBEDTLS_MD_MAX_SIZE] = { '\0' }; + + if (salt == NULL) { + size_t hash_len; + + if (salt_len != 0) { + return MBEDTLS_ERR_HKDF_BAD_INPUT_DATA; + } + + hash_len = mbedtls_md_get_size(md); + + if (hash_len == 0) { + return MBEDTLS_ERR_HKDF_BAD_INPUT_DATA; + } + + salt = null_salt; + salt_len = hash_len; + } + + return mbedtls_md_hmac(md, salt, salt_len, ikm, ikm_len, prk); +} + +int mbedtls_hkdf_expand(const mbedtls_md_info_t *md, const unsigned char *prk, + size_t prk_len, const unsigned char *info, + size_t info_len, unsigned char *okm, size_t okm_len) +{ + size_t hash_len; + size_t where = 0; + size_t n; + size_t t_len = 0; + size_t i; + int ret = 0; + mbedtls_md_context_t ctx; + unsigned char t[MBEDTLS_MD_MAX_SIZE]; + + if (okm == NULL) { + return MBEDTLS_ERR_HKDF_BAD_INPUT_DATA; + } + + hash_len = mbedtls_md_get_size(md); + + if (prk_len < hash_len || hash_len == 0) { + return MBEDTLS_ERR_HKDF_BAD_INPUT_DATA; + } + + if (info == NULL) { + info = (const unsigned char *) ""; + info_len = 0; + } + + n = okm_len / hash_len; + + if (okm_len % hash_len != 0) { + n++; + } + + /* + * Per RFC 5869 Section 2.3, okm_len must not exceed + * 255 times the hash length + */ + if (n > 255) { + return MBEDTLS_ERR_HKDF_BAD_INPUT_DATA; + } + + mbedtls_md_init(&ctx); + + if ((ret = mbedtls_md_setup(&ctx, md, 1)) != 0) { + goto exit; + } + + memset(t, 0, hash_len); + + /* + * Compute T = T(1) | T(2) | T(3) | ... | T(N) + * Where T(N) is defined in RFC 5869 Section 2.3 + */ + for (i = 1; i <= n; i++) { + size_t num_to_copy; + unsigned char c = i & 0xff; + + ret = mbedtls_md_hmac_starts(&ctx, prk, prk_len); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_md_hmac_update(&ctx, t, t_len); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_md_hmac_update(&ctx, info, info_len); + if (ret != 0) { + goto exit; + } + + /* The constant concatenated to the end of each T(n) is a single octet. + * */ + ret = mbedtls_md_hmac_update(&ctx, &c, 1); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_md_hmac_finish(&ctx, t); + if (ret != 0) { + goto exit; + } + + num_to_copy = i != n ? hash_len : okm_len - where; + memcpy(okm + where, t, num_to_copy); + where += hash_len; + t_len = hash_len; + } + +exit: + mbedtls_md_free(&ctx); + mbedtls_platform_zeroize(t, sizeof(t)); + + return ret; +} + +#endif /* MBEDTLS_HKDF_C */ diff --git a/ext/opcua_client/mbedtls/library/hmac_drbg.c b/ext/opcua_client/mbedtls/library/hmac_drbg.c new file mode 100644 index 0000000..ee8f8e3 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/hmac_drbg.c @@ -0,0 +1,636 @@ +/* + * HMAC_DRBG implementation (NIST SP 800-90) + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * The NIST SP 800-90A DRBGs are described in the following publication. + * http://csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf + * References below are based on rev. 1 (January 2012). + */ + +#include "common.h" + +#if defined(MBEDTLS_HMAC_DRBG_C) + +#include "mbedtls/hmac_drbg.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#if defined(MBEDTLS_FS_IO) +#include +#endif + +#include "mbedtls/platform.h" + +/* + * HMAC_DRBG context initialization + */ +void mbedtls_hmac_drbg_init(mbedtls_hmac_drbg_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_hmac_drbg_context)); + + ctx->reseed_interval = MBEDTLS_HMAC_DRBG_RESEED_INTERVAL; +} + +/* + * HMAC_DRBG update, using optional additional data (10.1.2.2) + */ +int mbedtls_hmac_drbg_update_ret(mbedtls_hmac_drbg_context *ctx, + const unsigned char *additional, + size_t add_len) +{ + size_t md_len = mbedtls_md_get_size(ctx->md_ctx.md_info); + unsigned char rounds = (additional != NULL && add_len != 0) ? 2 : 1; + unsigned char sep[1]; + unsigned char K[MBEDTLS_MD_MAX_SIZE]; + int ret = MBEDTLS_ERR_MD_BAD_INPUT_DATA; + + for (sep[0] = 0; sep[0] < rounds; sep[0]++) { + /* Step 1 or 4 */ + if ((ret = mbedtls_md_hmac_reset(&ctx->md_ctx)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_hmac_update(&ctx->md_ctx, + ctx->V, md_len)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_hmac_update(&ctx->md_ctx, + sep, 1)) != 0) { + goto exit; + } + if (rounds == 2) { + if ((ret = mbedtls_md_hmac_update(&ctx->md_ctx, + additional, add_len)) != 0) { + goto exit; + } + } + if ((ret = mbedtls_md_hmac_finish(&ctx->md_ctx, K)) != 0) { + goto exit; + } + + /* Step 2 or 5 */ + if ((ret = mbedtls_md_hmac_starts(&ctx->md_ctx, K, md_len)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_hmac_update(&ctx->md_ctx, + ctx->V, md_len)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_hmac_finish(&ctx->md_ctx, ctx->V)) != 0) { + goto exit; + } + } + +exit: + mbedtls_platform_zeroize(K, sizeof(K)); + return ret; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_hmac_drbg_update(mbedtls_hmac_drbg_context *ctx, + const unsigned char *additional, + size_t add_len) +{ + (void) mbedtls_hmac_drbg_update_ret(ctx, additional, add_len); +} +#endif /* MBEDTLS_DEPRECATED_REMOVED */ + +/* + * Simplified HMAC_DRBG initialisation (for use with deterministic ECDSA) + */ +int mbedtls_hmac_drbg_seed_buf(mbedtls_hmac_drbg_context *ctx, + const mbedtls_md_info_t *md_info, + const unsigned char *data, size_t data_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if ((ret = mbedtls_md_setup(&ctx->md_ctx, md_info, 1)) != 0) { + return ret; + } + +#if defined(MBEDTLS_THREADING_C) + mbedtls_mutex_init(&ctx->mutex); +#endif + + /* + * Set initial working state. + * Use the V memory location, which is currently all 0, to initialize the + * MD context with an all-zero key. Then set V to its initial value. + */ + if ((ret = mbedtls_md_hmac_starts(&ctx->md_ctx, ctx->V, + mbedtls_md_get_size(md_info))) != 0) { + return ret; + } + memset(ctx->V, 0x01, mbedtls_md_get_size(md_info)); + + if ((ret = mbedtls_hmac_drbg_update_ret(ctx, data, data_len)) != 0) { + return ret; + } + + return 0; +} + +/* + * Internal function used both for seeding and reseeding the DRBG. + * Comments starting with arabic numbers refer to section 10.1.2.4 + * of SP800-90A, while roman numbers refer to section 9.2. + */ +static int hmac_drbg_reseed_core(mbedtls_hmac_drbg_context *ctx, + const unsigned char *additional, size_t len, + int use_nonce) +{ + unsigned char seed[MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT]; + size_t seedlen = 0; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + { + size_t total_entropy_len; + + if (use_nonce == 0) { + total_entropy_len = ctx->entropy_len; + } else { + total_entropy_len = ctx->entropy_len * 3 / 2; + } + + /* III. Check input length */ + if (len > MBEDTLS_HMAC_DRBG_MAX_INPUT || + total_entropy_len + len > MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT) { + return MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG; + } + } + + memset(seed, 0, MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT); + + /* IV. Gather entropy_len bytes of entropy for the seed */ + if ((ret = ctx->f_entropy(ctx->p_entropy, + seed, ctx->entropy_len)) != 0) { + return MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED; + } + seedlen += ctx->entropy_len; + + /* For initial seeding, allow adding of nonce generated + * from the entropy source. See Sect 8.6.7 in SP800-90A. */ + if (use_nonce) { + /* Note: We don't merge the two calls to f_entropy() in order + * to avoid requesting too much entropy from f_entropy() + * at once. Specifically, if the underlying digest is not + * SHA-1, 3 / 2 * entropy_len is at least 36 Bytes, which + * is larger than the maximum of 32 Bytes that our own + * entropy source implementation can emit in a single + * call in configurations disabling SHA-512. */ + if ((ret = ctx->f_entropy(ctx->p_entropy, + seed + seedlen, + ctx->entropy_len / 2)) != 0) { + return MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED; + } + + seedlen += ctx->entropy_len / 2; + } + + + /* 1. Concatenate entropy and additional data if any */ + if (additional != NULL && len != 0) { + memcpy(seed + seedlen, additional, len); + seedlen += len; + } + + /* 2. Update state */ + if ((ret = mbedtls_hmac_drbg_update_ret(ctx, seed, seedlen)) != 0) { + goto exit; + } + + /* 3. Reset reseed_counter */ + ctx->reseed_counter = 1; + +exit: + /* 4. Done */ + mbedtls_platform_zeroize(seed, seedlen); + return ret; +} + +/* + * HMAC_DRBG reseeding: 10.1.2.4 + 9.2 + */ +int mbedtls_hmac_drbg_reseed(mbedtls_hmac_drbg_context *ctx, + const unsigned char *additional, size_t len) +{ + return hmac_drbg_reseed_core(ctx, additional, len, 0); +} + +/* + * HMAC_DRBG initialisation (10.1.2.3 + 9.1) + * + * The nonce is not passed as a separate parameter but extracted + * from the entropy source as suggested in 8.6.7. + */ +int mbedtls_hmac_drbg_seed(mbedtls_hmac_drbg_context *ctx, + const mbedtls_md_info_t *md_info, + int (*f_entropy)(void *, unsigned char *, size_t), + void *p_entropy, + const unsigned char *custom, + size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t md_size; + + if ((ret = mbedtls_md_setup(&ctx->md_ctx, md_info, 1)) != 0) { + return ret; + } + + /* The mutex is initialized iff the md context is set up. */ +#if defined(MBEDTLS_THREADING_C) + mbedtls_mutex_init(&ctx->mutex); +#endif + + md_size = mbedtls_md_get_size(md_info); + + /* + * Set initial working state. + * Use the V memory location, which is currently all 0, to initialize the + * MD context with an all-zero key. Then set V to its initial value. + */ + if ((ret = mbedtls_md_hmac_starts(&ctx->md_ctx, ctx->V, md_size)) != 0) { + return ret; + } + memset(ctx->V, 0x01, md_size); + + ctx->f_entropy = f_entropy; + ctx->p_entropy = p_entropy; + + if (ctx->entropy_len == 0) { + /* + * See SP800-57 5.6.1 (p. 65-66) for the security strength provided by + * each hash function, then according to SP800-90A rev1 10.1 table 2, + * min_entropy_len (in bits) is security_strength. + * + * (This also matches the sizes used in the NIST test vectors.) + */ + ctx->entropy_len = md_size <= 20 ? 16 : /* 160-bits hash -> 128 bits */ + md_size <= 28 ? 24 : /* 224-bits hash -> 192 bits */ + 32; /* better (256+) -> 256 bits */ + } + + if ((ret = hmac_drbg_reseed_core(ctx, custom, len, + 1 /* add nonce */)) != 0) { + return ret; + } + + return 0; +} + +/* + * Set prediction resistance + */ +void mbedtls_hmac_drbg_set_prediction_resistance(mbedtls_hmac_drbg_context *ctx, + int resistance) +{ + ctx->prediction_resistance = resistance; +} + +/* + * Set entropy length grabbed for seeding + */ +void mbedtls_hmac_drbg_set_entropy_len(mbedtls_hmac_drbg_context *ctx, size_t len) +{ + ctx->entropy_len = len; +} + +/* + * Set reseed interval + */ +void mbedtls_hmac_drbg_set_reseed_interval(mbedtls_hmac_drbg_context *ctx, int interval) +{ + ctx->reseed_interval = interval; +} + +/* + * HMAC_DRBG random function with optional additional data: + * 10.1.2.5 (arabic) + 9.3 (Roman) + */ +int mbedtls_hmac_drbg_random_with_add(void *p_rng, + unsigned char *output, size_t out_len, + const unsigned char *additional, size_t add_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_hmac_drbg_context *ctx = (mbedtls_hmac_drbg_context *) p_rng; + size_t md_len = mbedtls_md_get_size(ctx->md_ctx.md_info); + size_t left = out_len; + unsigned char *out = output; + + /* II. Check request length */ + if (out_len > MBEDTLS_HMAC_DRBG_MAX_REQUEST) { + return MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG; + } + + /* III. Check input length */ + if (add_len > MBEDTLS_HMAC_DRBG_MAX_INPUT) { + return MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG; + } + + /* 1. (aka VII and IX) Check reseed counter and PR */ + if (ctx->f_entropy != NULL && /* For no-reseeding instances */ + (ctx->prediction_resistance == MBEDTLS_HMAC_DRBG_PR_ON || + ctx->reseed_counter > ctx->reseed_interval)) { + if ((ret = mbedtls_hmac_drbg_reseed(ctx, additional, add_len)) != 0) { + return ret; + } + + add_len = 0; /* VII.4 */ + } + + /* 2. Use additional data if any */ + if (additional != NULL && add_len != 0) { + if ((ret = mbedtls_hmac_drbg_update_ret(ctx, + additional, add_len)) != 0) { + goto exit; + } + } + + /* 3, 4, 5. Generate bytes */ + while (left != 0) { + size_t use_len = left > md_len ? md_len : left; + + if ((ret = mbedtls_md_hmac_reset(&ctx->md_ctx)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_hmac_update(&ctx->md_ctx, + ctx->V, md_len)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_hmac_finish(&ctx->md_ctx, ctx->V)) != 0) { + goto exit; + } + + memcpy(out, ctx->V, use_len); + out += use_len; + left -= use_len; + } + + /* 6. Update */ + if ((ret = mbedtls_hmac_drbg_update_ret(ctx, + additional, add_len)) != 0) { + goto exit; + } + + /* 7. Update reseed counter */ + ctx->reseed_counter++; + +exit: + /* 8. Done */ + return ret; +} + +/* + * HMAC_DRBG random function + */ +int mbedtls_hmac_drbg_random(void *p_rng, unsigned char *output, size_t out_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_hmac_drbg_context *ctx = (mbedtls_hmac_drbg_context *) p_rng; + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&ctx->mutex)) != 0) { + return ret; + } +#endif + + ret = mbedtls_hmac_drbg_random_with_add(ctx, output, out_len, NULL, 0); + +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&ctx->mutex) != 0) { + return MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } +#endif + + return ret; +} + +/* + * This function resets HMAC_DRBG context to the state immediately + * after initial call of mbedtls_hmac_drbg_init(). + */ +void mbedtls_hmac_drbg_free(mbedtls_hmac_drbg_context *ctx) +{ + if (ctx == NULL) { + return; + } + +#if defined(MBEDTLS_THREADING_C) + /* The mutex is initialized iff the md context is set up. */ + if (ctx->md_ctx.md_info != NULL) { + mbedtls_mutex_free(&ctx->mutex); + } +#endif + mbedtls_md_free(&ctx->md_ctx); + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_hmac_drbg_context)); + ctx->reseed_interval = MBEDTLS_HMAC_DRBG_RESEED_INTERVAL; +} + +#if defined(MBEDTLS_FS_IO) +int mbedtls_hmac_drbg_write_seed_file(mbedtls_hmac_drbg_context *ctx, const char *path) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + FILE *f; + unsigned char buf[MBEDTLS_HMAC_DRBG_MAX_INPUT]; + + if ((f = fopen(path, "wb")) == NULL) { + return MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR; + } + + if ((ret = mbedtls_hmac_drbg_random(ctx, buf, sizeof(buf))) != 0) { + goto exit; + } + + if (fwrite(buf, 1, sizeof(buf), f) != sizeof(buf)) { + ret = MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR; + goto exit; + } + + ret = 0; + +exit: + fclose(f); + mbedtls_platform_zeroize(buf, sizeof(buf)); + + return ret; +} + +int mbedtls_hmac_drbg_update_seed_file(mbedtls_hmac_drbg_context *ctx, const char *path) +{ + int ret = 0; + FILE *f = NULL; + size_t n; + unsigned char buf[MBEDTLS_HMAC_DRBG_MAX_INPUT]; + unsigned char c; + + if ((f = fopen(path, "rb")) == NULL) { + return MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR; + } + + n = fread(buf, 1, sizeof(buf), f); + if (fread(&c, 1, 1, f) != 0) { + ret = MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG; + goto exit; + } + if (n == 0 || ferror(f)) { + ret = MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR; + goto exit; + } + fclose(f); + f = NULL; + + ret = mbedtls_hmac_drbg_update_ret(ctx, buf, n); + +exit: + mbedtls_platform_zeroize(buf, sizeof(buf)); + if (f != NULL) { + fclose(f); + } + if (ret != 0) { + return ret; + } + return mbedtls_hmac_drbg_write_seed_file(ctx, path); +} +#endif /* MBEDTLS_FS_IO */ + + +#if defined(MBEDTLS_SELF_TEST) + +#if !defined(MBEDTLS_SHA1_C) +/* Dummy checkup routine */ +int mbedtls_hmac_drbg_self_test(int verbose) +{ + (void) verbose; + return 0; +} +#else + +#define OUTPUT_LEN 80 + +/* From a NIST PR=true test vector */ +static const unsigned char entropy_pr[] = { + 0xa0, 0xc9, 0xab, 0x58, 0xf1, 0xe2, 0xe5, 0xa4, 0xde, 0x3e, 0xbd, 0x4f, + 0xf7, 0x3e, 0x9c, 0x5b, 0x64, 0xef, 0xd8, 0xca, 0x02, 0x8c, 0xf8, 0x11, + 0x48, 0xa5, 0x84, 0xfe, 0x69, 0xab, 0x5a, 0xee, 0x42, 0xaa, 0x4d, 0x42, + 0x17, 0x60, 0x99, 0xd4, 0x5e, 0x13, 0x97, 0xdc, 0x40, 0x4d, 0x86, 0xa3, + 0x7b, 0xf5, 0x59, 0x54, 0x75, 0x69, 0x51, 0xe4 +}; +static const unsigned char result_pr[OUTPUT_LEN] = { + 0x9a, 0x00, 0xa2, 0xd0, 0x0e, 0xd5, 0x9b, 0xfe, 0x31, 0xec, 0xb1, 0x39, + 0x9b, 0x60, 0x81, 0x48, 0xd1, 0x96, 0x9d, 0x25, 0x0d, 0x3c, 0x1e, 0x94, + 0x10, 0x10, 0x98, 0x12, 0x93, 0x25, 0xca, 0xb8, 0xfc, 0xcc, 0x2d, 0x54, + 0x73, 0x19, 0x70, 0xc0, 0x10, 0x7a, 0xa4, 0x89, 0x25, 0x19, 0x95, 0x5e, + 0x4b, 0xc6, 0x00, 0x1d, 0x7f, 0x4e, 0x6a, 0x2b, 0xf8, 0xa3, 0x01, 0xab, + 0x46, 0x05, 0x5c, 0x09, 0xa6, 0x71, 0x88, 0xf1, 0xa7, 0x40, 0xee, 0xf3, + 0xe1, 0x5c, 0x02, 0x9b, 0x44, 0xaf, 0x03, 0x44 +}; + +/* From a NIST PR=false test vector */ +static const unsigned char entropy_nopr[] = { + 0x79, 0x34, 0x9b, 0xbf, 0x7c, 0xdd, 0xa5, 0x79, 0x95, 0x57, 0x86, 0x66, + 0x21, 0xc9, 0x13, 0x83, 0x11, 0x46, 0x73, 0x3a, 0xbf, 0x8c, 0x35, 0xc8, + 0xc7, 0x21, 0x5b, 0x5b, 0x96, 0xc4, 0x8e, 0x9b, 0x33, 0x8c, 0x74, 0xe3, + 0xe9, 0x9d, 0xfe, 0xdf +}; +static const unsigned char result_nopr[OUTPUT_LEN] = { + 0xc6, 0xa1, 0x6a, 0xb8, 0xd4, 0x20, 0x70, 0x6f, 0x0f, 0x34, 0xab, 0x7f, + 0xec, 0x5a, 0xdc, 0xa9, 0xd8, 0xca, 0x3a, 0x13, 0x3e, 0x15, 0x9c, 0xa6, + 0xac, 0x43, 0xc6, 0xf8, 0xa2, 0xbe, 0x22, 0x83, 0x4a, 0x4c, 0x0a, 0x0a, + 0xff, 0xb1, 0x0d, 0x71, 0x94, 0xf1, 0xc1, 0xa5, 0xcf, 0x73, 0x22, 0xec, + 0x1a, 0xe0, 0x96, 0x4e, 0xd4, 0xbf, 0x12, 0x27, 0x46, 0xe0, 0x87, 0xfd, + 0xb5, 0xb3, 0xe9, 0x1b, 0x34, 0x93, 0xd5, 0xbb, 0x98, 0xfa, 0xed, 0x49, + 0xe8, 0x5f, 0x13, 0x0f, 0xc8, 0xa4, 0x59, 0xb7 +}; + +/* "Entropy" from buffer */ +static size_t test_offset; +static int hmac_drbg_self_test_entropy(void *data, + unsigned char *buf, size_t len) +{ + const unsigned char *p = data; + memcpy(buf, p + test_offset, len); + test_offset += len; + return 0; +} + +#define CHK(c) if ((c) != 0) \ + { \ + if (verbose != 0) \ + mbedtls_printf("failed\n"); \ + return 1; \ + } + +/* + * Checkup routine for HMAC_DRBG with SHA-1 + */ +int mbedtls_hmac_drbg_self_test(int verbose) +{ + mbedtls_hmac_drbg_context ctx; + unsigned char buf[OUTPUT_LEN]; + const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1); + + mbedtls_hmac_drbg_init(&ctx); + + /* + * PR = True + */ + if (verbose != 0) { + mbedtls_printf(" HMAC_DRBG (PR = True) : "); + } + + test_offset = 0; + CHK(mbedtls_hmac_drbg_seed(&ctx, md_info, + hmac_drbg_self_test_entropy, (void *) entropy_pr, + NULL, 0)); + mbedtls_hmac_drbg_set_prediction_resistance(&ctx, MBEDTLS_HMAC_DRBG_PR_ON); + CHK(mbedtls_hmac_drbg_random(&ctx, buf, OUTPUT_LEN)); + CHK(mbedtls_hmac_drbg_random(&ctx, buf, OUTPUT_LEN)); + CHK(memcmp(buf, result_pr, OUTPUT_LEN)); + mbedtls_hmac_drbg_free(&ctx); + + mbedtls_hmac_drbg_free(&ctx); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + /* + * PR = False + */ + if (verbose != 0) { + mbedtls_printf(" HMAC_DRBG (PR = False) : "); + } + + mbedtls_hmac_drbg_init(&ctx); + + test_offset = 0; + CHK(mbedtls_hmac_drbg_seed(&ctx, md_info, + hmac_drbg_self_test_entropy, (void *) entropy_nopr, + NULL, 0)); + CHK(mbedtls_hmac_drbg_reseed(&ctx, NULL, 0)); + CHK(mbedtls_hmac_drbg_random(&ctx, buf, OUTPUT_LEN)); + CHK(mbedtls_hmac_drbg_random(&ctx, buf, OUTPUT_LEN)); + CHK(memcmp(buf, result_nopr, OUTPUT_LEN)); + mbedtls_hmac_drbg_free(&ctx); + + mbedtls_hmac_drbg_free(&ctx); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return 0; +} +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_HMAC_DRBG_C */ diff --git a/ext/opcua_client/mbedtls/library/md.c b/ext/opcua_client/mbedtls/library/md.c new file mode 100644 index 0000000..3e4a1c1 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/md.c @@ -0,0 +1,902 @@ +/** + * \file md.c + * + * \brief Generic message digest wrapper for Mbed TLS + * + * \author Adriaan de Jong + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_MD_C) + +#include "mbedtls/md.h" +#include "mbedtls/md_internal.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include "mbedtls/md2.h" +#include "mbedtls/md4.h" +#include "mbedtls/md5.h" +#include "mbedtls/ripemd160.h" +#include "mbedtls/sha1.h" +#include "mbedtls/sha256.h" +#include "mbedtls/sha512.h" + +#include "mbedtls/platform.h" + +#include + +#if defined(MBEDTLS_FS_IO) +#include +#endif + +#if defined(MBEDTLS_MD2_C) +const mbedtls_md_info_t mbedtls_md2_info = { + "MD2", + MBEDTLS_MD_MD2, + 16, + 16, +}; +#endif + +#if defined(MBEDTLS_MD4_C) +const mbedtls_md_info_t mbedtls_md4_info = { + "MD4", + MBEDTLS_MD_MD4, + 16, + 64, +}; +#endif + +#if defined(MBEDTLS_MD5_C) +const mbedtls_md_info_t mbedtls_md5_info = { + "MD5", + MBEDTLS_MD_MD5, + 16, + 64, +}; +#endif + +#if defined(MBEDTLS_RIPEMD160_C) +const mbedtls_md_info_t mbedtls_ripemd160_info = { + "RIPEMD160", + MBEDTLS_MD_RIPEMD160, + 20, + 64, +}; +#endif + +#if defined(MBEDTLS_SHA1_C) +const mbedtls_md_info_t mbedtls_sha1_info = { + "SHA1", + MBEDTLS_MD_SHA1, + 20, + 64, +}; +#endif + +#if defined(MBEDTLS_SHA256_C) +const mbedtls_md_info_t mbedtls_sha224_info = { + "SHA224", + MBEDTLS_MD_SHA224, + 28, + 64, +}; + +const mbedtls_md_info_t mbedtls_sha256_info = { + "SHA256", + MBEDTLS_MD_SHA256, + 32, + 64, +}; +#endif + +#if defined(MBEDTLS_SHA512_C) +#if !defined(MBEDTLS_SHA512_NO_SHA384) +const mbedtls_md_info_t mbedtls_sha384_info = { + "SHA384", + MBEDTLS_MD_SHA384, + 48, + 128, +}; +#endif + +const mbedtls_md_info_t mbedtls_sha512_info = { + "SHA512", + MBEDTLS_MD_SHA512, + 64, + 128, +}; +#endif + +/* + * Reminder: update profiles in x509_crt.c when adding a new hash! + */ +static const int supported_digests[] = { + +#if defined(MBEDTLS_SHA512_C) + MBEDTLS_MD_SHA512, +#if !defined(MBEDTLS_SHA512_NO_SHA384) + MBEDTLS_MD_SHA384, +#endif +#endif + +#if defined(MBEDTLS_SHA256_C) + MBEDTLS_MD_SHA256, + MBEDTLS_MD_SHA224, +#endif + +#if defined(MBEDTLS_SHA1_C) + MBEDTLS_MD_SHA1, +#endif + +#if defined(MBEDTLS_RIPEMD160_C) + MBEDTLS_MD_RIPEMD160, +#endif + +#if defined(MBEDTLS_MD5_C) + MBEDTLS_MD_MD5, +#endif + +#if defined(MBEDTLS_MD4_C) + MBEDTLS_MD_MD4, +#endif + +#if defined(MBEDTLS_MD2_C) + MBEDTLS_MD_MD2, +#endif + + MBEDTLS_MD_NONE +}; + +const int *mbedtls_md_list(void) +{ + return supported_digests; +} + +const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name) +{ + if (NULL == md_name) { + return NULL; + } + + /* Get the appropriate digest information */ +#if defined(MBEDTLS_MD2_C) + if (!strcmp("MD2", md_name)) { + return mbedtls_md_info_from_type(MBEDTLS_MD_MD2); + } +#endif +#if defined(MBEDTLS_MD4_C) + if (!strcmp("MD4", md_name)) { + return mbedtls_md_info_from_type(MBEDTLS_MD_MD4); + } +#endif +#if defined(MBEDTLS_MD5_C) + if (!strcmp("MD5", md_name)) { + return mbedtls_md_info_from_type(MBEDTLS_MD_MD5); + } +#endif +#if defined(MBEDTLS_RIPEMD160_C) + if (!strcmp("RIPEMD160", md_name)) { + return mbedtls_md_info_from_type(MBEDTLS_MD_RIPEMD160); + } +#endif +#if defined(MBEDTLS_SHA1_C) + if (!strcmp("SHA1", md_name) || !strcmp("SHA", md_name)) { + return mbedtls_md_info_from_type(MBEDTLS_MD_SHA1); + } +#endif +#if defined(MBEDTLS_SHA256_C) + if (!strcmp("SHA224", md_name)) { + return mbedtls_md_info_from_type(MBEDTLS_MD_SHA224); + } + if (!strcmp("SHA256", md_name)) { + return mbedtls_md_info_from_type(MBEDTLS_MD_SHA256); + } +#endif +#if defined(MBEDTLS_SHA512_C) +#if !defined(MBEDTLS_SHA512_NO_SHA384) + if (!strcmp("SHA384", md_name)) { + return mbedtls_md_info_from_type(MBEDTLS_MD_SHA384); + } +#endif + if (!strcmp("SHA512", md_name)) { + return mbedtls_md_info_from_type(MBEDTLS_MD_SHA512); + } +#endif + return NULL; +} + +const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type) +{ + switch (md_type) { +#if defined(MBEDTLS_MD2_C) + case MBEDTLS_MD_MD2: + return &mbedtls_md2_info; +#endif +#if defined(MBEDTLS_MD4_C) + case MBEDTLS_MD_MD4: + return &mbedtls_md4_info; +#endif +#if defined(MBEDTLS_MD5_C) + case MBEDTLS_MD_MD5: + return &mbedtls_md5_info; +#endif +#if defined(MBEDTLS_RIPEMD160_C) + case MBEDTLS_MD_RIPEMD160: + return &mbedtls_ripemd160_info; +#endif +#if defined(MBEDTLS_SHA1_C) + case MBEDTLS_MD_SHA1: + return &mbedtls_sha1_info; +#endif +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_MD_SHA224: + return &mbedtls_sha224_info; + case MBEDTLS_MD_SHA256: + return &mbedtls_sha256_info; +#endif +#if defined(MBEDTLS_SHA512_C) +#if !defined(MBEDTLS_SHA512_NO_SHA384) + case MBEDTLS_MD_SHA384: + return &mbedtls_sha384_info; +#endif + case MBEDTLS_MD_SHA512: + return &mbedtls_sha512_info; +#endif + default: + return NULL; + } +} + +void mbedtls_md_init(mbedtls_md_context_t *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_md_context_t)); +} + +void mbedtls_md_free(mbedtls_md_context_t *ctx) +{ + if (ctx == NULL || ctx->md_info == NULL) { + return; + } + + if (ctx->md_ctx != NULL) { + switch (ctx->md_info->type) { +#if defined(MBEDTLS_MD2_C) + case MBEDTLS_MD_MD2: + mbedtls_md2_free(ctx->md_ctx); + break; +#endif +#if defined(MBEDTLS_MD4_C) + case MBEDTLS_MD_MD4: + mbedtls_md4_free(ctx->md_ctx); + break; +#endif +#if defined(MBEDTLS_MD5_C) + case MBEDTLS_MD_MD5: + mbedtls_md5_free(ctx->md_ctx); + break; +#endif +#if defined(MBEDTLS_RIPEMD160_C) + case MBEDTLS_MD_RIPEMD160: + mbedtls_ripemd160_free(ctx->md_ctx); + break; +#endif +#if defined(MBEDTLS_SHA1_C) + case MBEDTLS_MD_SHA1: + mbedtls_sha1_free(ctx->md_ctx); + break; +#endif +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_MD_SHA224: + case MBEDTLS_MD_SHA256: + mbedtls_sha256_free(ctx->md_ctx); + break; +#endif +#if defined(MBEDTLS_SHA512_C) +#if !defined(MBEDTLS_SHA512_NO_SHA384) + case MBEDTLS_MD_SHA384: +#endif + case MBEDTLS_MD_SHA512: + mbedtls_sha512_free(ctx->md_ctx); + break; +#endif + default: + /* Shouldn't happen */ + break; + } + mbedtls_free(ctx->md_ctx); + } + + if (ctx->hmac_ctx != NULL) { + mbedtls_platform_zeroize(ctx->hmac_ctx, + 2 * ctx->md_info->block_size); + mbedtls_free(ctx->hmac_ctx); + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md_context_t)); +} + +int mbedtls_md_clone(mbedtls_md_context_t *dst, + const mbedtls_md_context_t *src) +{ + if (dst == NULL || dst->md_info == NULL || + src == NULL || src->md_info == NULL || + dst->md_info != src->md_info) { + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + switch (src->md_info->type) { +#if defined(MBEDTLS_MD2_C) + case MBEDTLS_MD_MD2: + mbedtls_md2_clone(dst->md_ctx, src->md_ctx); + break; +#endif +#if defined(MBEDTLS_MD4_C) + case MBEDTLS_MD_MD4: + mbedtls_md4_clone(dst->md_ctx, src->md_ctx); + break; +#endif +#if defined(MBEDTLS_MD5_C) + case MBEDTLS_MD_MD5: + mbedtls_md5_clone(dst->md_ctx, src->md_ctx); + break; +#endif +#if defined(MBEDTLS_RIPEMD160_C) + case MBEDTLS_MD_RIPEMD160: + mbedtls_ripemd160_clone(dst->md_ctx, src->md_ctx); + break; +#endif +#if defined(MBEDTLS_SHA1_C) + case MBEDTLS_MD_SHA1: + mbedtls_sha1_clone(dst->md_ctx, src->md_ctx); + break; +#endif +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_MD_SHA224: + case MBEDTLS_MD_SHA256: + mbedtls_sha256_clone(dst->md_ctx, src->md_ctx); + break; +#endif +#if defined(MBEDTLS_SHA512_C) +#if !defined(MBEDTLS_SHA512_NO_SHA384) + case MBEDTLS_MD_SHA384: +#endif + case MBEDTLS_MD_SHA512: + mbedtls_sha512_clone(dst->md_ctx, src->md_ctx); + break; +#endif + default: + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +int mbedtls_md_init_ctx(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info) +{ + return mbedtls_md_setup(ctx, md_info, 1); +} +#endif + +#define ALLOC(type) \ + do { \ + ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \ + if (ctx->md_ctx == NULL) \ + return MBEDTLS_ERR_MD_ALLOC_FAILED; \ + mbedtls_##type##_init(ctx->md_ctx); \ + } \ + while (0) + +int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac) +{ + if (md_info == NULL || ctx == NULL) { + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + ctx->md_info = md_info; + ctx->md_ctx = NULL; + ctx->hmac_ctx = NULL; + + switch (md_info->type) { +#if defined(MBEDTLS_MD2_C) + case MBEDTLS_MD_MD2: + ALLOC(md2); + break; +#endif +#if defined(MBEDTLS_MD4_C) + case MBEDTLS_MD_MD4: + ALLOC(md4); + break; +#endif +#if defined(MBEDTLS_MD5_C) + case MBEDTLS_MD_MD5: + ALLOC(md5); + break; +#endif +#if defined(MBEDTLS_RIPEMD160_C) + case MBEDTLS_MD_RIPEMD160: + ALLOC(ripemd160); + break; +#endif +#if defined(MBEDTLS_SHA1_C) + case MBEDTLS_MD_SHA1: + ALLOC(sha1); + break; +#endif +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_MD_SHA224: + case MBEDTLS_MD_SHA256: + ALLOC(sha256); + break; +#endif +#if defined(MBEDTLS_SHA512_C) +#if !defined(MBEDTLS_SHA512_NO_SHA384) + case MBEDTLS_MD_SHA384: +#endif + case MBEDTLS_MD_SHA512: + ALLOC(sha512); + break; +#endif + default: + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + if (hmac != 0) { + ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size); + if (ctx->hmac_ctx == NULL) { + mbedtls_md_free(ctx); + return MBEDTLS_ERR_MD_ALLOC_FAILED; + } + } + + return 0; +} +#undef ALLOC + +int mbedtls_md_starts(mbedtls_md_context_t *ctx) +{ + if (ctx == NULL || ctx->md_info == NULL) { + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + switch (ctx->md_info->type) { +#if defined(MBEDTLS_MD2_C) + case MBEDTLS_MD_MD2: + return mbedtls_md2_starts_ret(ctx->md_ctx); +#endif +#if defined(MBEDTLS_MD4_C) + case MBEDTLS_MD_MD4: + return mbedtls_md4_starts_ret(ctx->md_ctx); +#endif +#if defined(MBEDTLS_MD5_C) + case MBEDTLS_MD_MD5: + return mbedtls_md5_starts_ret(ctx->md_ctx); +#endif +#if defined(MBEDTLS_RIPEMD160_C) + case MBEDTLS_MD_RIPEMD160: + return mbedtls_ripemd160_starts_ret(ctx->md_ctx); +#endif +#if defined(MBEDTLS_SHA1_C) + case MBEDTLS_MD_SHA1: + return mbedtls_sha1_starts_ret(ctx->md_ctx); +#endif +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_MD_SHA224: + return mbedtls_sha256_starts_ret(ctx->md_ctx, 1); + case MBEDTLS_MD_SHA256: + return mbedtls_sha256_starts_ret(ctx->md_ctx, 0); +#endif +#if defined(MBEDTLS_SHA512_C) +#if !defined(MBEDTLS_SHA512_NO_SHA384) + case MBEDTLS_MD_SHA384: + return mbedtls_sha512_starts_ret(ctx->md_ctx, 1); +#endif + case MBEDTLS_MD_SHA512: + return mbedtls_sha512_starts_ret(ctx->md_ctx, 0); +#endif + default: + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } +} + +int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen) +{ + if (ctx == NULL || ctx->md_info == NULL) { + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + switch (ctx->md_info->type) { +#if defined(MBEDTLS_MD2_C) + case MBEDTLS_MD_MD2: + return mbedtls_md2_update_ret(ctx->md_ctx, input, ilen); +#endif +#if defined(MBEDTLS_MD4_C) + case MBEDTLS_MD_MD4: + return mbedtls_md4_update_ret(ctx->md_ctx, input, ilen); +#endif +#if defined(MBEDTLS_MD5_C) + case MBEDTLS_MD_MD5: + return mbedtls_md5_update_ret(ctx->md_ctx, input, ilen); +#endif +#if defined(MBEDTLS_RIPEMD160_C) + case MBEDTLS_MD_RIPEMD160: + return mbedtls_ripemd160_update_ret(ctx->md_ctx, input, ilen); +#endif +#if defined(MBEDTLS_SHA1_C) + case MBEDTLS_MD_SHA1: + return mbedtls_sha1_update_ret(ctx->md_ctx, input, ilen); +#endif +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_MD_SHA224: + case MBEDTLS_MD_SHA256: + return mbedtls_sha256_update_ret(ctx->md_ctx, input, ilen); +#endif +#if defined(MBEDTLS_SHA512_C) +#if !defined(MBEDTLS_SHA512_NO_SHA384) + case MBEDTLS_MD_SHA384: +#endif + case MBEDTLS_MD_SHA512: + return mbedtls_sha512_update_ret(ctx->md_ctx, input, ilen); +#endif + default: + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } +} + +int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output) +{ + if (ctx == NULL || ctx->md_info == NULL) { + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + switch (ctx->md_info->type) { +#if defined(MBEDTLS_MD2_C) + case MBEDTLS_MD_MD2: + return mbedtls_md2_finish_ret(ctx->md_ctx, output); +#endif +#if defined(MBEDTLS_MD4_C) + case MBEDTLS_MD_MD4: + return mbedtls_md4_finish_ret(ctx->md_ctx, output); +#endif +#if defined(MBEDTLS_MD5_C) + case MBEDTLS_MD_MD5: + return mbedtls_md5_finish_ret(ctx->md_ctx, output); +#endif +#if defined(MBEDTLS_RIPEMD160_C) + case MBEDTLS_MD_RIPEMD160: + return mbedtls_ripemd160_finish_ret(ctx->md_ctx, output); +#endif +#if defined(MBEDTLS_SHA1_C) + case MBEDTLS_MD_SHA1: + return mbedtls_sha1_finish_ret(ctx->md_ctx, output); +#endif +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_MD_SHA224: + case MBEDTLS_MD_SHA256: + return mbedtls_sha256_finish_ret(ctx->md_ctx, output); +#endif +#if defined(MBEDTLS_SHA512_C) +#if !defined(MBEDTLS_SHA512_NO_SHA384) + case MBEDTLS_MD_SHA384: +#endif + case MBEDTLS_MD_SHA512: + return mbedtls_sha512_finish_ret(ctx->md_ctx, output); +#endif + default: + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } +} + +int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, + unsigned char *output) +{ + if (md_info == NULL) { + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + switch (md_info->type) { +#if defined(MBEDTLS_MD2_C) + case MBEDTLS_MD_MD2: + return mbedtls_md2_ret(input, ilen, output); +#endif +#if defined(MBEDTLS_MD4_C) + case MBEDTLS_MD_MD4: + return mbedtls_md4_ret(input, ilen, output); +#endif +#if defined(MBEDTLS_MD5_C) + case MBEDTLS_MD_MD5: + return mbedtls_md5_ret(input, ilen, output); +#endif +#if defined(MBEDTLS_RIPEMD160_C) + case MBEDTLS_MD_RIPEMD160: + return mbedtls_ripemd160_ret(input, ilen, output); +#endif +#if defined(MBEDTLS_SHA1_C) + case MBEDTLS_MD_SHA1: + return mbedtls_sha1_ret(input, ilen, output); +#endif +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_MD_SHA224: + return mbedtls_sha256_ret(input, ilen, output, 1); + case MBEDTLS_MD_SHA256: + return mbedtls_sha256_ret(input, ilen, output, 0); +#endif +#if defined(MBEDTLS_SHA512_C) +#if !defined(MBEDTLS_SHA512_NO_SHA384) + case MBEDTLS_MD_SHA384: + return mbedtls_sha512_ret(input, ilen, output, 1); +#endif + case MBEDTLS_MD_SHA512: + return mbedtls_sha512_ret(input, ilen, output, 0); +#endif + default: + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } +} + +#if defined(MBEDTLS_FS_IO) +int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + FILE *f; + size_t n; + mbedtls_md_context_t ctx; + unsigned char buf[1024]; + + if (md_info == NULL) { + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + if ((f = fopen(path, "rb")) == NULL) { + return MBEDTLS_ERR_MD_FILE_IO_ERROR; + } + + mbedtls_md_init(&ctx); + + if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) { + goto cleanup; + } + + if ((ret = mbedtls_md_starts(&ctx)) != 0) { + goto cleanup; + } + + while ((n = fread(buf, 1, sizeof(buf), f)) > 0) { + if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) { + goto cleanup; + } + } + + if (ferror(f) != 0) { + ret = MBEDTLS_ERR_MD_FILE_IO_ERROR; + } else { + ret = mbedtls_md_finish(&ctx, output); + } + +cleanup: + mbedtls_platform_zeroize(buf, sizeof(buf)); + fclose(f); + mbedtls_md_free(&ctx); + + return ret; +} +#endif /* MBEDTLS_FS_IO */ + +int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char sum[MBEDTLS_MD_MAX_SIZE]; + unsigned char *ipad, *opad; + size_t i; + + if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) { + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + if (keylen > (size_t) ctx->md_info->block_size) { + if ((ret = mbedtls_md_starts(ctx)) != 0) { + goto cleanup; + } + if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) { + goto cleanup; + } + if ((ret = mbedtls_md_finish(ctx, sum)) != 0) { + goto cleanup; + } + + keylen = ctx->md_info->size; + key = sum; + } + + ipad = (unsigned char *) ctx->hmac_ctx; + opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size; + + memset(ipad, 0x36, ctx->md_info->block_size); + memset(opad, 0x5C, ctx->md_info->block_size); + + for (i = 0; i < keylen; i++) { + ipad[i] = (unsigned char) (ipad[i] ^ key[i]); + opad[i] = (unsigned char) (opad[i] ^ key[i]); + } + + if ((ret = mbedtls_md_starts(ctx)) != 0) { + goto cleanup; + } + if ((ret = mbedtls_md_update(ctx, ipad, + ctx->md_info->block_size)) != 0) { + goto cleanup; + } + +cleanup: + mbedtls_platform_zeroize(sum, sizeof(sum)); + + return ret; +} + +int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen) +{ + if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) { + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + return mbedtls_md_update(ctx, input, ilen); +} + +int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char tmp[MBEDTLS_MD_MAX_SIZE]; + unsigned char *opad; + + if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) { + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size; + + if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) { + return ret; + } + if ((ret = mbedtls_md_starts(ctx)) != 0) { + return ret; + } + if ((ret = mbedtls_md_update(ctx, opad, + ctx->md_info->block_size)) != 0) { + return ret; + } + if ((ret = mbedtls_md_update(ctx, tmp, + ctx->md_info->size)) != 0) { + return ret; + } + return mbedtls_md_finish(ctx, output); +} + +int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *ipad; + + if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) { + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + ipad = (unsigned char *) ctx->hmac_ctx; + + if ((ret = mbedtls_md_starts(ctx)) != 0) { + return ret; + } + return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size); +} + +int mbedtls_md_hmac(const mbedtls_md_info_t *md_info, + const unsigned char *key, size_t keylen, + const unsigned char *input, size_t ilen, + unsigned char *output) +{ + mbedtls_md_context_t ctx; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (md_info == NULL) { + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + mbedtls_md_init(&ctx); + + if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) { + goto cleanup; + } + + if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) { + goto cleanup; + } + if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) { + goto cleanup; + } + if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) { + goto cleanup; + } + +cleanup: + mbedtls_md_free(&ctx); + + return ret; +} + +int mbedtls_md_process(mbedtls_md_context_t *ctx, const unsigned char *data) +{ + if (ctx == NULL || ctx->md_info == NULL) { + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } + + switch (ctx->md_info->type) { +#if defined(MBEDTLS_MD2_C) + case MBEDTLS_MD_MD2: + return mbedtls_internal_md2_process(ctx->md_ctx); +#endif +#if defined(MBEDTLS_MD4_C) + case MBEDTLS_MD_MD4: + return mbedtls_internal_md4_process(ctx->md_ctx, data); +#endif +#if defined(MBEDTLS_MD5_C) + case MBEDTLS_MD_MD5: + return mbedtls_internal_md5_process(ctx->md_ctx, data); +#endif +#if defined(MBEDTLS_RIPEMD160_C) + case MBEDTLS_MD_RIPEMD160: + return mbedtls_internal_ripemd160_process(ctx->md_ctx, data); +#endif +#if defined(MBEDTLS_SHA1_C) + case MBEDTLS_MD_SHA1: + return mbedtls_internal_sha1_process(ctx->md_ctx, data); +#endif +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_MD_SHA224: + case MBEDTLS_MD_SHA256: + return mbedtls_internal_sha256_process(ctx->md_ctx, data); +#endif +#if defined(MBEDTLS_SHA512_C) +#if !defined(MBEDTLS_SHA512_NO_SHA384) + case MBEDTLS_MD_SHA384: +#endif + case MBEDTLS_MD_SHA512: + return mbedtls_internal_sha512_process(ctx->md_ctx, data); +#endif + default: + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + } +} + +unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info) +{ + if (md_info == NULL) { + return 0; + } + + return md_info->size; +} + +mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info) +{ + if (md_info == NULL) { + return MBEDTLS_MD_NONE; + } + + return md_info->type; +} + +const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info) +{ + if (md_info == NULL) { + return NULL; + } + + return md_info->name; +} + +#endif /* MBEDTLS_MD_C */ diff --git a/ext/opcua_client/mbedtls/library/md2.c b/ext/opcua_client/mbedtls/library/md2.c new file mode 100644 index 0000000..b552d5f --- /dev/null +++ b/ext/opcua_client/mbedtls/library/md2.c @@ -0,0 +1,347 @@ +/* + * RFC 1115/1319 compliant MD2 implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The MD2 algorithm was designed by Ron Rivest in 1989. + * + * http://www.ietf.org/rfc/rfc1115.txt + * http://www.ietf.org/rfc/rfc1319.txt + */ + +#include "common.h" + +#if defined(MBEDTLS_MD2_C) + +#include "mbedtls/md2.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_MD2_ALT) + +static const unsigned char PI_SUBST[256] = +{ + 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36, + 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3, + 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, + 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16, + 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E, + 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E, + 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, + 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21, + 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E, + 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3, + 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, + 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6, + 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D, + 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65, + 0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, + 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F, + 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C, + 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E, + 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, + 0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA, + 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88, + 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE, + 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, + 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A, + 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99, + 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14 +}; + +void mbedtls_md2_init(mbedtls_md2_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_md2_context)); +} + +void mbedtls_md2_free(mbedtls_md2_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md2_context)); +} + +void mbedtls_md2_clone(mbedtls_md2_context *dst, + const mbedtls_md2_context *src) +{ + *dst = *src; +} + +/* + * MD2 context setup + */ +int mbedtls_md2_starts_ret(mbedtls_md2_context *ctx) +{ + memset(ctx->cksum, 0, 16); + memset(ctx->state, 0, 46); + memset(ctx->buffer, 0, 16); + ctx->left = 0; + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md2_starts(mbedtls_md2_context *ctx) +{ + mbedtls_md2_starts_ret(ctx); +} +#endif + +#if !defined(MBEDTLS_MD2_PROCESS_ALT) +int mbedtls_internal_md2_process(mbedtls_md2_context *ctx) +{ + int i, j; + unsigned char t = 0; + + for (i = 0; i < 16; i++) { + ctx->state[i + 16] = ctx->buffer[i]; + ctx->state[i + 32] = + (unsigned char) (ctx->buffer[i] ^ ctx->state[i]); + } + + for (i = 0; i < 18; i++) { + for (j = 0; j < 48; j++) { + ctx->state[j] = (unsigned char) + (ctx->state[j] ^ PI_SUBST[t]); + t = ctx->state[j]; + } + + t = (unsigned char) (t + i); + } + + t = ctx->cksum[15]; + + for (i = 0; i < 16; i++) { + ctx->cksum[i] = (unsigned char) + (ctx->cksum[i] ^ PI_SUBST[ctx->buffer[i] ^ t]); + t = ctx->cksum[i]; + } + + /* Zeroise variables to clear sensitive data from memory. */ + mbedtls_platform_zeroize(&t, sizeof(t)); + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md2_process(mbedtls_md2_context *ctx) +{ + mbedtls_internal_md2_process(ctx); +} +#endif +#endif /* !MBEDTLS_MD2_PROCESS_ALT */ + +/* + * MD2 process buffer + */ +int mbedtls_md2_update_ret(mbedtls_md2_context *ctx, + const unsigned char *input, + size_t ilen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t fill; + + while (ilen > 0) { + if (ilen > 16 - ctx->left) { + fill = 16 - ctx->left; + } else { + fill = ilen; + } + + memcpy(ctx->buffer + ctx->left, input, fill); + + ctx->left += fill; + input += fill; + ilen -= fill; + + if (ctx->left == 16) { + ctx->left = 0; + if ((ret = mbedtls_internal_md2_process(ctx)) != 0) { + return ret; + } + } + } + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md2_update(mbedtls_md2_context *ctx, + const unsigned char *input, + size_t ilen) +{ + mbedtls_md2_update_ret(ctx, input, ilen); +} +#endif + +/* + * MD2 final digest + */ +int mbedtls_md2_finish_ret(mbedtls_md2_context *ctx, + unsigned char output[16]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i; + unsigned char x; + + x = (unsigned char) (16 - ctx->left); + + for (i = ctx->left; i < 16; i++) { + ctx->buffer[i] = x; + } + + if ((ret = mbedtls_internal_md2_process(ctx)) != 0) { + return ret; + } + + memcpy(ctx->buffer, ctx->cksum, 16); + if ((ret = mbedtls_internal_md2_process(ctx)) != 0) { + return ret; + } + + memcpy(output, ctx->state, 16); + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md2_finish(mbedtls_md2_context *ctx, + unsigned char output[16]) +{ + mbedtls_md2_finish_ret(ctx, output); +} +#endif + +#endif /* !MBEDTLS_MD2_ALT */ + +/* + * output = MD2( input buffer ) + */ +int mbedtls_md2_ret(const unsigned char *input, + size_t ilen, + unsigned char output[16]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_md2_context ctx; + + mbedtls_md2_init(&ctx); + + if ((ret = mbedtls_md2_starts_ret(&ctx)) != 0) { + goto exit; + } + + if ((ret = mbedtls_md2_update_ret(&ctx, input, ilen)) != 0) { + goto exit; + } + + if ((ret = mbedtls_md2_finish_ret(&ctx, output)) != 0) { + goto exit; + } + +exit: + mbedtls_md2_free(&ctx); + + return ret; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md2(const unsigned char *input, + size_t ilen, + unsigned char output[16]) +{ + mbedtls_md2_ret(input, ilen, output); +} +#endif + +#if defined(MBEDTLS_SELF_TEST) + +/* + * RFC 1319 test vectors + */ +static const unsigned char md2_test_str[7][81] = +{ + { "" }, + { "a" }, + { "abc" }, + { "message digest" }, + { "abcdefghijklmnopqrstuvwxyz" }, + { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, + { "12345678901234567890123456789012345678901234567890123456789012345678901234567890" } +}; + +static const size_t md2_test_strlen[7] = +{ + 0, 1, 3, 14, 26, 62, 80 +}; + +static const unsigned char md2_test_sum[7][16] = +{ + { 0x83, 0x50, 0xE5, 0xA3, 0xE2, 0x4C, 0x15, 0x3D, + 0xF2, 0x27, 0x5C, 0x9F, 0x80, 0x69, 0x27, 0x73 }, + { 0x32, 0xEC, 0x01, 0xEC, 0x4A, 0x6D, 0xAC, 0x72, + 0xC0, 0xAB, 0x96, 0xFB, 0x34, 0xC0, 0xB5, 0xD1 }, + { 0xDA, 0x85, 0x3B, 0x0D, 0x3F, 0x88, 0xD9, 0x9B, + 0x30, 0x28, 0x3A, 0x69, 0xE6, 0xDE, 0xD6, 0xBB }, + { 0xAB, 0x4F, 0x49, 0x6B, 0xFB, 0x2A, 0x53, 0x0B, + 0x21, 0x9F, 0xF3, 0x30, 0x31, 0xFE, 0x06, 0xB0 }, + { 0x4E, 0x8D, 0xDF, 0xF3, 0x65, 0x02, 0x92, 0xAB, + 0x5A, 0x41, 0x08, 0xC3, 0xAA, 0x47, 0x94, 0x0B }, + { 0xDA, 0x33, 0xDE, 0xF2, 0xA4, 0x2D, 0xF1, 0x39, + 0x75, 0x35, 0x28, 0x46, 0xC3, 0x03, 0x38, 0xCD }, + { 0xD5, 0x97, 0x6F, 0x79, 0xD8, 0x3D, 0x3A, 0x0D, + 0xC9, 0x80, 0x6C, 0x3C, 0x66, 0xF3, 0xEF, 0xD8 } +}; + +/* + * Checkup routine + */ +int mbedtls_md2_self_test(int verbose) +{ + int i, ret = 0; + unsigned char md2sum[16]; + + for (i = 0; i < 7; i++) { + if (verbose != 0) { + mbedtls_printf(" MD2 test #%d: ", i + 1); + } + + ret = mbedtls_md2_ret(md2_test_str[i], md2_test_strlen[i], md2sum); + if (ret != 0) { + goto fail; + } + + if (memcmp(md2sum, md2_test_sum[i], 16) != 0) { + ret = 1; + goto fail; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return 0; + +fail: + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_MD2_C */ diff --git a/ext/opcua_client/mbedtls/library/md4.c b/ext/opcua_client/mbedtls/library/md4.c new file mode 100644 index 0000000..8de85fb --- /dev/null +++ b/ext/opcua_client/mbedtls/library/md4.c @@ -0,0 +1,451 @@ +/* + * RFC 1186/1320 compliant MD4 implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The MD4 algorithm was designed by Ron Rivest in 1990. + * + * http://www.ietf.org/rfc/rfc1186.txt + * http://www.ietf.org/rfc/rfc1320.txt + */ + +#include "common.h" + +#if defined(MBEDTLS_MD4_C) + +#include "mbedtls/md4.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_MD4_ALT) + +void mbedtls_md4_init(mbedtls_md4_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_md4_context)); +} + +void mbedtls_md4_free(mbedtls_md4_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md4_context)); +} + +void mbedtls_md4_clone(mbedtls_md4_context *dst, + const mbedtls_md4_context *src) +{ + *dst = *src; +} + +/* + * MD4 context setup + */ +int mbedtls_md4_starts_ret(mbedtls_md4_context *ctx) +{ + ctx->total[0] = 0; + ctx->total[1] = 0; + + ctx->state[0] = 0x67452301; + ctx->state[1] = 0xEFCDAB89; + ctx->state[2] = 0x98BADCFE; + ctx->state[3] = 0x10325476; + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md4_starts(mbedtls_md4_context *ctx) +{ + mbedtls_md4_starts_ret(ctx); +} +#endif + +#if !defined(MBEDTLS_MD4_PROCESS_ALT) +int mbedtls_internal_md4_process(mbedtls_md4_context *ctx, + const unsigned char data[64]) +{ + struct { + uint32_t X[16], A, B, C, D; + } local; + + local.X[0] = MBEDTLS_GET_UINT32_LE(data, 0); + local.X[1] = MBEDTLS_GET_UINT32_LE(data, 4); + local.X[2] = MBEDTLS_GET_UINT32_LE(data, 8); + local.X[3] = MBEDTLS_GET_UINT32_LE(data, 12); + local.X[4] = MBEDTLS_GET_UINT32_LE(data, 16); + local.X[5] = MBEDTLS_GET_UINT32_LE(data, 20); + local.X[6] = MBEDTLS_GET_UINT32_LE(data, 24); + local.X[7] = MBEDTLS_GET_UINT32_LE(data, 28); + local.X[8] = MBEDTLS_GET_UINT32_LE(data, 32); + local.X[9] = MBEDTLS_GET_UINT32_LE(data, 36); + local.X[10] = MBEDTLS_GET_UINT32_LE(data, 40); + local.X[11] = MBEDTLS_GET_UINT32_LE(data, 44); + local.X[12] = MBEDTLS_GET_UINT32_LE(data, 48); + local.X[13] = MBEDTLS_GET_UINT32_LE(data, 52); + local.X[14] = MBEDTLS_GET_UINT32_LE(data, 56); + local.X[15] = MBEDTLS_GET_UINT32_LE(data, 60); + +#define S(x, n) (((x) << (n)) | (((x) & 0xFFFFFFFF) >> (32 - (n)))) + + local.A = ctx->state[0]; + local.B = ctx->state[1]; + local.C = ctx->state[2]; + local.D = ctx->state[3]; + +#define F(x, y, z) (((x) & (y)) | ((~(x)) & (z))) +#define P(a, b, c, d, x, s) \ + do \ + { \ + (a) += F((b), (c), (d)) + (x); \ + (a) = S((a), (s)); \ + } while (0) + + + P(local.A, local.B, local.C, local.D, local.X[0], 3); + P(local.D, local.A, local.B, local.C, local.X[1], 7); + P(local.C, local.D, local.A, local.B, local.X[2], 11); + P(local.B, local.C, local.D, local.A, local.X[3], 19); + P(local.A, local.B, local.C, local.D, local.X[4], 3); + P(local.D, local.A, local.B, local.C, local.X[5], 7); + P(local.C, local.D, local.A, local.B, local.X[6], 11); + P(local.B, local.C, local.D, local.A, local.X[7], 19); + P(local.A, local.B, local.C, local.D, local.X[8], 3); + P(local.D, local.A, local.B, local.C, local.X[9], 7); + P(local.C, local.D, local.A, local.B, local.X[10], 11); + P(local.B, local.C, local.D, local.A, local.X[11], 19); + P(local.A, local.B, local.C, local.D, local.X[12], 3); + P(local.D, local.A, local.B, local.C, local.X[13], 7); + P(local.C, local.D, local.A, local.B, local.X[14], 11); + P(local.B, local.C, local.D, local.A, local.X[15], 19); + +#undef P +#undef F + +#define F(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) +#define P(a, b, c, d, x, s) \ + do \ + { \ + (a) += F((b), (c), (d)) + (x) + 0x5A827999; \ + (a) = S((a), (s)); \ + } while (0) + + P(local.A, local.B, local.C, local.D, local.X[0], 3); + P(local.D, local.A, local.B, local.C, local.X[4], 5); + P(local.C, local.D, local.A, local.B, local.X[8], 9); + P(local.B, local.C, local.D, local.A, local.X[12], 13); + P(local.A, local.B, local.C, local.D, local.X[1], 3); + P(local.D, local.A, local.B, local.C, local.X[5], 5); + P(local.C, local.D, local.A, local.B, local.X[9], 9); + P(local.B, local.C, local.D, local.A, local.X[13], 13); + P(local.A, local.B, local.C, local.D, local.X[2], 3); + P(local.D, local.A, local.B, local.C, local.X[6], 5); + P(local.C, local.D, local.A, local.B, local.X[10], 9); + P(local.B, local.C, local.D, local.A, local.X[14], 13); + P(local.A, local.B, local.C, local.D, local.X[3], 3); + P(local.D, local.A, local.B, local.C, local.X[7], 5); + P(local.C, local.D, local.A, local.B, local.X[11], 9); + P(local.B, local.C, local.D, local.A, local.X[15], 13); + +#undef P +#undef F + +#define F(x, y, z) ((x) ^ (y) ^ (z)) +#define P(a, b, c, d, x, s) \ + do \ + { \ + (a) += F((b), (c), (d)) + (x) + 0x6ED9EBA1; \ + (a) = S((a), (s)); \ + } while (0) + + P(local.A, local.B, local.C, local.D, local.X[0], 3); + P(local.D, local.A, local.B, local.C, local.X[8], 9); + P(local.C, local.D, local.A, local.B, local.X[4], 11); + P(local.B, local.C, local.D, local.A, local.X[12], 15); + P(local.A, local.B, local.C, local.D, local.X[2], 3); + P(local.D, local.A, local.B, local.C, local.X[10], 9); + P(local.C, local.D, local.A, local.B, local.X[6], 11); + P(local.B, local.C, local.D, local.A, local.X[14], 15); + P(local.A, local.B, local.C, local.D, local.X[1], 3); + P(local.D, local.A, local.B, local.C, local.X[9], 9); + P(local.C, local.D, local.A, local.B, local.X[5], 11); + P(local.B, local.C, local.D, local.A, local.X[13], 15); + P(local.A, local.B, local.C, local.D, local.X[3], 3); + P(local.D, local.A, local.B, local.C, local.X[11], 9); + P(local.C, local.D, local.A, local.B, local.X[7], 11); + P(local.B, local.C, local.D, local.A, local.X[15], 15); + +#undef F +#undef P + + ctx->state[0] += local.A; + ctx->state[1] += local.B; + ctx->state[2] += local.C; + ctx->state[3] += local.D; + + /* Zeroise variables to clear sensitive data from memory. */ + mbedtls_platform_zeroize(&local, sizeof(local)); + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md4_process(mbedtls_md4_context *ctx, + const unsigned char data[64]) +{ + mbedtls_internal_md4_process(ctx, data); +} +#endif +#endif /* !MBEDTLS_MD4_PROCESS_ALT */ + +/* + * MD4 process buffer + */ +int mbedtls_md4_update_ret(mbedtls_md4_context *ctx, + const unsigned char *input, + size_t ilen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t fill; + uint32_t left; + + if (ilen == 0) { + return 0; + } + + left = ctx->total[0] & 0x3F; + fill = 64 - left; + + ctx->total[0] += (uint32_t) ilen; + ctx->total[0] &= 0xFFFFFFFF; + + if (ctx->total[0] < (uint32_t) ilen) { + ctx->total[1]++; + } + + if (left && ilen >= fill) { + memcpy((void *) (ctx->buffer + left), + (void *) input, fill); + + if ((ret = mbedtls_internal_md4_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + input += fill; + ilen -= fill; + left = 0; + } + + while (ilen >= 64) { + if ((ret = mbedtls_internal_md4_process(ctx, input)) != 0) { + return ret; + } + + input += 64; + ilen -= 64; + } + + if (ilen > 0) { + memcpy((void *) (ctx->buffer + left), + (void *) input, ilen); + } + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md4_update(mbedtls_md4_context *ctx, + const unsigned char *input, + size_t ilen) +{ + mbedtls_md4_update_ret(ctx, input, ilen); +} +#endif + +static const unsigned char md4_padding[64] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* + * MD4 final digest + */ +int mbedtls_md4_finish_ret(mbedtls_md4_context *ctx, + unsigned char output[16]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + uint32_t last, padn; + uint32_t high, low; + unsigned char msglen[8]; + + high = (ctx->total[0] >> 29) + | (ctx->total[1] << 3); + low = (ctx->total[0] << 3); + + MBEDTLS_PUT_UINT32_LE(low, msglen, 0); + MBEDTLS_PUT_UINT32_LE(high, msglen, 4); + + last = ctx->total[0] & 0x3F; + padn = (last < 56) ? (56 - last) : (120 - last); + + ret = mbedtls_md4_update_ret(ctx, (unsigned char *) md4_padding, padn); + if (ret != 0) { + return ret; + } + + if ((ret = mbedtls_md4_update_ret(ctx, msglen, 8)) != 0) { + return ret; + } + + + MBEDTLS_PUT_UINT32_LE(ctx->state[0], output, 0); + MBEDTLS_PUT_UINT32_LE(ctx->state[1], output, 4); + MBEDTLS_PUT_UINT32_LE(ctx->state[2], output, 8); + MBEDTLS_PUT_UINT32_LE(ctx->state[3], output, 12); + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md4_finish(mbedtls_md4_context *ctx, + unsigned char output[16]) +{ + mbedtls_md4_finish_ret(ctx, output); +} +#endif + +#endif /* !MBEDTLS_MD4_ALT */ + +/* + * output = MD4( input buffer ) + */ +int mbedtls_md4_ret(const unsigned char *input, + size_t ilen, + unsigned char output[16]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_md4_context ctx; + + mbedtls_md4_init(&ctx); + + if ((ret = mbedtls_md4_starts_ret(&ctx)) != 0) { + goto exit; + } + + if ((ret = mbedtls_md4_update_ret(&ctx, input, ilen)) != 0) { + goto exit; + } + + if ((ret = mbedtls_md4_finish_ret(&ctx, output)) != 0) { + goto exit; + } + +exit: + mbedtls_md4_free(&ctx); + + return ret; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md4(const unsigned char *input, + size_t ilen, + unsigned char output[16]) +{ + mbedtls_md4_ret(input, ilen, output); +} +#endif + +#if defined(MBEDTLS_SELF_TEST) + +/* + * RFC 1320 test vectors + */ +static const unsigned char md4_test_str[7][81] = +{ + { "" }, + { "a" }, + { "abc" }, + { "message digest" }, + { "abcdefghijklmnopqrstuvwxyz" }, + { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, + { "12345678901234567890123456789012345678901234567890123456789012345678901234567890" } +}; + +static const size_t md4_test_strlen[7] = +{ + 0, 1, 3, 14, 26, 62, 80 +}; + +static const unsigned char md4_test_sum[7][16] = +{ + { 0x31, 0xD6, 0xCF, 0xE0, 0xD1, 0x6A, 0xE9, 0x31, + 0xB7, 0x3C, 0x59, 0xD7, 0xE0, 0xC0, 0x89, 0xC0 }, + { 0xBD, 0xE5, 0x2C, 0xB3, 0x1D, 0xE3, 0x3E, 0x46, + 0x24, 0x5E, 0x05, 0xFB, 0xDB, 0xD6, 0xFB, 0x24 }, + { 0xA4, 0x48, 0x01, 0x7A, 0xAF, 0x21, 0xD8, 0x52, + 0x5F, 0xC1, 0x0A, 0xE8, 0x7A, 0xA6, 0x72, 0x9D }, + { 0xD9, 0x13, 0x0A, 0x81, 0x64, 0x54, 0x9F, 0xE8, + 0x18, 0x87, 0x48, 0x06, 0xE1, 0xC7, 0x01, 0x4B }, + { 0xD7, 0x9E, 0x1C, 0x30, 0x8A, 0xA5, 0xBB, 0xCD, + 0xEE, 0xA8, 0xED, 0x63, 0xDF, 0x41, 0x2D, 0xA9 }, + { 0x04, 0x3F, 0x85, 0x82, 0xF2, 0x41, 0xDB, 0x35, + 0x1C, 0xE6, 0x27, 0xE1, 0x53, 0xE7, 0xF0, 0xE4 }, + { 0xE3, 0x3B, 0x4D, 0xDC, 0x9C, 0x38, 0xF2, 0x19, + 0x9C, 0x3E, 0x7B, 0x16, 0x4F, 0xCC, 0x05, 0x36 } +}; + +/* + * Checkup routine + */ +int mbedtls_md4_self_test(int verbose) +{ + int i, ret = 0; + unsigned char md4sum[16]; + + for (i = 0; i < 7; i++) { + if (verbose != 0) { + mbedtls_printf(" MD4 test #%d: ", i + 1); + } + + ret = mbedtls_md4_ret(md4_test_str[i], md4_test_strlen[i], md4sum); + if (ret != 0) { + goto fail; + } + + if (memcmp(md4sum, md4_test_sum[i], 16) != 0) { + ret = 1; + goto fail; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return 0; + +fail: + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_MD4_C */ diff --git a/ext/opcua_client/mbedtls/library/md5.c b/ext/opcua_client/mbedtls/library/md5.c new file mode 100644 index 0000000..4ad24fc --- /dev/null +++ b/ext/opcua_client/mbedtls/library/md5.c @@ -0,0 +1,462 @@ +/* + * RFC 1321 compliant MD5 implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The MD5 algorithm was designed by Ron Rivest in 1991. + * + * http://www.ietf.org/rfc/rfc1321.txt + */ + +#include "common.h" + +#if defined(MBEDTLS_MD5_C) + +#include "mbedtls/md5.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_MD5_ALT) + +void mbedtls_md5_init(mbedtls_md5_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_md5_context)); +} + +void mbedtls_md5_free(mbedtls_md5_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md5_context)); +} + +void mbedtls_md5_clone(mbedtls_md5_context *dst, + const mbedtls_md5_context *src) +{ + *dst = *src; +} + +/* + * MD5 context setup + */ +int mbedtls_md5_starts_ret(mbedtls_md5_context *ctx) +{ + ctx->total[0] = 0; + ctx->total[1] = 0; + + ctx->state[0] = 0x67452301; + ctx->state[1] = 0xEFCDAB89; + ctx->state[2] = 0x98BADCFE; + ctx->state[3] = 0x10325476; + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md5_starts(mbedtls_md5_context *ctx) +{ + mbedtls_md5_starts_ret(ctx); +} +#endif + +#if !defined(MBEDTLS_MD5_PROCESS_ALT) +int mbedtls_internal_md5_process(mbedtls_md5_context *ctx, + const unsigned char data[64]) +{ + struct { + uint32_t X[16], A, B, C, D; + } local; + + local.X[0] = MBEDTLS_GET_UINT32_LE(data, 0); + local.X[1] = MBEDTLS_GET_UINT32_LE(data, 4); + local.X[2] = MBEDTLS_GET_UINT32_LE(data, 8); + local.X[3] = MBEDTLS_GET_UINT32_LE(data, 12); + local.X[4] = MBEDTLS_GET_UINT32_LE(data, 16); + local.X[5] = MBEDTLS_GET_UINT32_LE(data, 20); + local.X[6] = MBEDTLS_GET_UINT32_LE(data, 24); + local.X[7] = MBEDTLS_GET_UINT32_LE(data, 28); + local.X[8] = MBEDTLS_GET_UINT32_LE(data, 32); + local.X[9] = MBEDTLS_GET_UINT32_LE(data, 36); + local.X[10] = MBEDTLS_GET_UINT32_LE(data, 40); + local.X[11] = MBEDTLS_GET_UINT32_LE(data, 44); + local.X[12] = MBEDTLS_GET_UINT32_LE(data, 48); + local.X[13] = MBEDTLS_GET_UINT32_LE(data, 52); + local.X[14] = MBEDTLS_GET_UINT32_LE(data, 56); + local.X[15] = MBEDTLS_GET_UINT32_LE(data, 60); + +#define S(x, n) \ + (((x) << (n)) | (((x) & 0xFFFFFFFF) >> (32 - (n)))) + +#define P(a, b, c, d, k, s, t) \ + do \ + { \ + (a) += F((b), (c), (d)) + local.X[(k)] + (t); \ + (a) = S((a), (s)) + (b); \ + } while (0) + + local.A = ctx->state[0]; + local.B = ctx->state[1]; + local.C = ctx->state[2]; + local.D = ctx->state[3]; + +#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) + + P(local.A, local.B, local.C, local.D, 0, 7, 0xD76AA478); + P(local.D, local.A, local.B, local.C, 1, 12, 0xE8C7B756); + P(local.C, local.D, local.A, local.B, 2, 17, 0x242070DB); + P(local.B, local.C, local.D, local.A, 3, 22, 0xC1BDCEEE); + P(local.A, local.B, local.C, local.D, 4, 7, 0xF57C0FAF); + P(local.D, local.A, local.B, local.C, 5, 12, 0x4787C62A); + P(local.C, local.D, local.A, local.B, 6, 17, 0xA8304613); + P(local.B, local.C, local.D, local.A, 7, 22, 0xFD469501); + P(local.A, local.B, local.C, local.D, 8, 7, 0x698098D8); + P(local.D, local.A, local.B, local.C, 9, 12, 0x8B44F7AF); + P(local.C, local.D, local.A, local.B, 10, 17, 0xFFFF5BB1); + P(local.B, local.C, local.D, local.A, 11, 22, 0x895CD7BE); + P(local.A, local.B, local.C, local.D, 12, 7, 0x6B901122); + P(local.D, local.A, local.B, local.C, 13, 12, 0xFD987193); + P(local.C, local.D, local.A, local.B, 14, 17, 0xA679438E); + P(local.B, local.C, local.D, local.A, 15, 22, 0x49B40821); + +#undef F + +#define F(x, y, z) ((y) ^ ((z) & ((x) ^ (y)))) + + P(local.A, local.B, local.C, local.D, 1, 5, 0xF61E2562); + P(local.D, local.A, local.B, local.C, 6, 9, 0xC040B340); + P(local.C, local.D, local.A, local.B, 11, 14, 0x265E5A51); + P(local.B, local.C, local.D, local.A, 0, 20, 0xE9B6C7AA); + P(local.A, local.B, local.C, local.D, 5, 5, 0xD62F105D); + P(local.D, local.A, local.B, local.C, 10, 9, 0x02441453); + P(local.C, local.D, local.A, local.B, 15, 14, 0xD8A1E681); + P(local.B, local.C, local.D, local.A, 4, 20, 0xE7D3FBC8); + P(local.A, local.B, local.C, local.D, 9, 5, 0x21E1CDE6); + P(local.D, local.A, local.B, local.C, 14, 9, 0xC33707D6); + P(local.C, local.D, local.A, local.B, 3, 14, 0xF4D50D87); + P(local.B, local.C, local.D, local.A, 8, 20, 0x455A14ED); + P(local.A, local.B, local.C, local.D, 13, 5, 0xA9E3E905); + P(local.D, local.A, local.B, local.C, 2, 9, 0xFCEFA3F8); + P(local.C, local.D, local.A, local.B, 7, 14, 0x676F02D9); + P(local.B, local.C, local.D, local.A, 12, 20, 0x8D2A4C8A); + +#undef F + +#define F(x, y, z) ((x) ^ (y) ^ (z)) + + P(local.A, local.B, local.C, local.D, 5, 4, 0xFFFA3942); + P(local.D, local.A, local.B, local.C, 8, 11, 0x8771F681); + P(local.C, local.D, local.A, local.B, 11, 16, 0x6D9D6122); + P(local.B, local.C, local.D, local.A, 14, 23, 0xFDE5380C); + P(local.A, local.B, local.C, local.D, 1, 4, 0xA4BEEA44); + P(local.D, local.A, local.B, local.C, 4, 11, 0x4BDECFA9); + P(local.C, local.D, local.A, local.B, 7, 16, 0xF6BB4B60); + P(local.B, local.C, local.D, local.A, 10, 23, 0xBEBFBC70); + P(local.A, local.B, local.C, local.D, 13, 4, 0x289B7EC6); + P(local.D, local.A, local.B, local.C, 0, 11, 0xEAA127FA); + P(local.C, local.D, local.A, local.B, 3, 16, 0xD4EF3085); + P(local.B, local.C, local.D, local.A, 6, 23, 0x04881D05); + P(local.A, local.B, local.C, local.D, 9, 4, 0xD9D4D039); + P(local.D, local.A, local.B, local.C, 12, 11, 0xE6DB99E5); + P(local.C, local.D, local.A, local.B, 15, 16, 0x1FA27CF8); + P(local.B, local.C, local.D, local.A, 2, 23, 0xC4AC5665); + +#undef F + +#define F(x, y, z) ((y) ^ ((x) | ~(z))) + + P(local.A, local.B, local.C, local.D, 0, 6, 0xF4292244); + P(local.D, local.A, local.B, local.C, 7, 10, 0x432AFF97); + P(local.C, local.D, local.A, local.B, 14, 15, 0xAB9423A7); + P(local.B, local.C, local.D, local.A, 5, 21, 0xFC93A039); + P(local.A, local.B, local.C, local.D, 12, 6, 0x655B59C3); + P(local.D, local.A, local.B, local.C, 3, 10, 0x8F0CCC92); + P(local.C, local.D, local.A, local.B, 10, 15, 0xFFEFF47D); + P(local.B, local.C, local.D, local.A, 1, 21, 0x85845DD1); + P(local.A, local.B, local.C, local.D, 8, 6, 0x6FA87E4F); + P(local.D, local.A, local.B, local.C, 15, 10, 0xFE2CE6E0); + P(local.C, local.D, local.A, local.B, 6, 15, 0xA3014314); + P(local.B, local.C, local.D, local.A, 13, 21, 0x4E0811A1); + P(local.A, local.B, local.C, local.D, 4, 6, 0xF7537E82); + P(local.D, local.A, local.B, local.C, 11, 10, 0xBD3AF235); + P(local.C, local.D, local.A, local.B, 2, 15, 0x2AD7D2BB); + P(local.B, local.C, local.D, local.A, 9, 21, 0xEB86D391); + +#undef F + + ctx->state[0] += local.A; + ctx->state[1] += local.B; + ctx->state[2] += local.C; + ctx->state[3] += local.D; + + /* Zeroise variables to clear sensitive data from memory. */ + mbedtls_platform_zeroize(&local, sizeof(local)); + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md5_process(mbedtls_md5_context *ctx, + const unsigned char data[64]) +{ + mbedtls_internal_md5_process(ctx, data); +} +#endif +#endif /* !MBEDTLS_MD5_PROCESS_ALT */ + +/* + * MD5 process buffer + */ +int mbedtls_md5_update_ret(mbedtls_md5_context *ctx, + const unsigned char *input, + size_t ilen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t fill; + uint32_t left; + + if (ilen == 0) { + return 0; + } + + left = ctx->total[0] & 0x3F; + fill = 64 - left; + + ctx->total[0] += (uint32_t) ilen; + ctx->total[0] &= 0xFFFFFFFF; + + if (ctx->total[0] < (uint32_t) ilen) { + ctx->total[1]++; + } + + if (left && ilen >= fill) { + memcpy((void *) (ctx->buffer + left), input, fill); + if ((ret = mbedtls_internal_md5_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + input += fill; + ilen -= fill; + left = 0; + } + + while (ilen >= 64) { + if ((ret = mbedtls_internal_md5_process(ctx, input)) != 0) { + return ret; + } + + input += 64; + ilen -= 64; + } + + if (ilen > 0) { + memcpy((void *) (ctx->buffer + left), input, ilen); + } + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md5_update(mbedtls_md5_context *ctx, + const unsigned char *input, + size_t ilen) +{ + mbedtls_md5_update_ret(ctx, input, ilen); +} +#endif + +/* + * MD5 final digest + */ +int mbedtls_md5_finish_ret(mbedtls_md5_context *ctx, + unsigned char output[16]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + uint32_t used; + uint32_t high, low; + + /* + * Add padding: 0x80 then 0x00 until 8 bytes remain for the length + */ + used = ctx->total[0] & 0x3F; + + ctx->buffer[used++] = 0x80; + + if (used <= 56) { + /* Enough room for padding + length in current block */ + memset(ctx->buffer + used, 0, 56 - used); + } else { + /* We'll need an extra block */ + memset(ctx->buffer + used, 0, 64 - used); + + if ((ret = mbedtls_internal_md5_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + memset(ctx->buffer, 0, 56); + } + + /* + * Add message length + */ + high = (ctx->total[0] >> 29) + | (ctx->total[1] << 3); + low = (ctx->total[0] << 3); + + MBEDTLS_PUT_UINT32_LE(low, ctx->buffer, 56); + MBEDTLS_PUT_UINT32_LE(high, ctx->buffer, 60); + + if ((ret = mbedtls_internal_md5_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + /* + * Output final state + */ + MBEDTLS_PUT_UINT32_LE(ctx->state[0], output, 0); + MBEDTLS_PUT_UINT32_LE(ctx->state[1], output, 4); + MBEDTLS_PUT_UINT32_LE(ctx->state[2], output, 8); + MBEDTLS_PUT_UINT32_LE(ctx->state[3], output, 12); + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md5_finish(mbedtls_md5_context *ctx, + unsigned char output[16]) +{ + mbedtls_md5_finish_ret(ctx, output); +} +#endif + +#endif /* !MBEDTLS_MD5_ALT */ + +/* + * output = MD5( input buffer ) + */ +int mbedtls_md5_ret(const unsigned char *input, + size_t ilen, + unsigned char output[16]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_md5_context ctx; + + mbedtls_md5_init(&ctx); + + if ((ret = mbedtls_md5_starts_ret(&ctx)) != 0) { + goto exit; + } + + if ((ret = mbedtls_md5_update_ret(&ctx, input, ilen)) != 0) { + goto exit; + } + + if ((ret = mbedtls_md5_finish_ret(&ctx, output)) != 0) { + goto exit; + } + +exit: + mbedtls_md5_free(&ctx); + + return ret; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_md5(const unsigned char *input, + size_t ilen, + unsigned char output[16]) +{ + mbedtls_md5_ret(input, ilen, output); +} +#endif + +#if defined(MBEDTLS_SELF_TEST) +/* + * RFC 1321 test vectors + */ +static const unsigned char md5_test_buf[7][81] = +{ + { "" }, + { "a" }, + { "abc" }, + { "message digest" }, + { "abcdefghijklmnopqrstuvwxyz" }, + { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, + { "12345678901234567890123456789012345678901234567890123456789012345678901234567890" } +}; + +static const size_t md5_test_buflen[7] = +{ + 0, 1, 3, 14, 26, 62, 80 +}; + +static const unsigned char md5_test_sum[7][16] = +{ + { 0xD4, 0x1D, 0x8C, 0xD9, 0x8F, 0x00, 0xB2, 0x04, + 0xE9, 0x80, 0x09, 0x98, 0xEC, 0xF8, 0x42, 0x7E }, + { 0x0C, 0xC1, 0x75, 0xB9, 0xC0, 0xF1, 0xB6, 0xA8, + 0x31, 0xC3, 0x99, 0xE2, 0x69, 0x77, 0x26, 0x61 }, + { 0x90, 0x01, 0x50, 0x98, 0x3C, 0xD2, 0x4F, 0xB0, + 0xD6, 0x96, 0x3F, 0x7D, 0x28, 0xE1, 0x7F, 0x72 }, + { 0xF9, 0x6B, 0x69, 0x7D, 0x7C, 0xB7, 0x93, 0x8D, + 0x52, 0x5A, 0x2F, 0x31, 0xAA, 0xF1, 0x61, 0xD0 }, + { 0xC3, 0xFC, 0xD3, 0xD7, 0x61, 0x92, 0xE4, 0x00, + 0x7D, 0xFB, 0x49, 0x6C, 0xCA, 0x67, 0xE1, 0x3B }, + { 0xD1, 0x74, 0xAB, 0x98, 0xD2, 0x77, 0xD9, 0xF5, + 0xA5, 0x61, 0x1C, 0x2C, 0x9F, 0x41, 0x9D, 0x9F }, + { 0x57, 0xED, 0xF4, 0xA2, 0x2B, 0xE3, 0xC9, 0x55, + 0xAC, 0x49, 0xDA, 0x2E, 0x21, 0x07, 0xB6, 0x7A } +}; + +/* + * Checkup routine + */ +int mbedtls_md5_self_test(int verbose) +{ + int i, ret = 0; + unsigned char md5sum[16]; + + for (i = 0; i < 7; i++) { + if (verbose != 0) { + mbedtls_printf(" MD5 test #%d: ", i + 1); + } + + ret = mbedtls_md5_ret(md5_test_buf[i], md5_test_buflen[i], md5sum); + if (ret != 0) { + goto fail; + } + + if (memcmp(md5sum, md5_test_sum[i], 16) != 0) { + ret = 1; + goto fail; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return 0; + +fail: + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_MD5_C */ diff --git a/ext/opcua_client/mbedtls/library/memory_buffer_alloc.c b/ext/opcua_client/mbedtls/library/memory_buffer_alloc.c new file mode 100644 index 0000000..d6a47ba --- /dev/null +++ b/ext/opcua_client/mbedtls/library/memory_buffer_alloc.c @@ -0,0 +1,739 @@ +/* + * Buffer-based memory allocator + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) +#include "mbedtls/memory_buffer_alloc.h" + +/* No need for the header guard as MBEDTLS_MEMORY_BUFFER_ALLOC_C + is dependent upon MBEDTLS_PLATFORM_C */ +#include "mbedtls/platform.h" +#include "mbedtls/platform_util.h" + +#include + +#if defined(MBEDTLS_MEMORY_BACKTRACE) +#include +#endif + +#if defined(MBEDTLS_THREADING_C) +#include "mbedtls/threading.h" +#endif + +#define MAGIC1 0xFF00AA55 +#define MAGIC2 0xEE119966 +#define MAX_BT 20 + +typedef struct _memory_header memory_header; +struct _memory_header { + size_t magic1; + size_t size; + size_t alloc; + memory_header *prev; + memory_header *next; + memory_header *prev_free; + memory_header *next_free; +#if defined(MBEDTLS_MEMORY_BACKTRACE) + char **trace; + size_t trace_count; +#endif + size_t magic2; +}; + +typedef struct { + unsigned char *buf; + size_t len; + memory_header *first; + memory_header *first_free; + int verify; +#if defined(MBEDTLS_MEMORY_DEBUG) + size_t alloc_count; + size_t free_count; + size_t total_used; + size_t maximum_used; + size_t header_count; + size_t maximum_header_count; +#endif +#if defined(MBEDTLS_THREADING_C) + mbedtls_threading_mutex_t mutex; +#endif +} +buffer_alloc_ctx; + +static buffer_alloc_ctx heap; + +#if defined(MBEDTLS_MEMORY_DEBUG) +static void debug_header(memory_header *hdr) +{ +#if defined(MBEDTLS_MEMORY_BACKTRACE) + size_t i; +#endif + + mbedtls_fprintf(stderr, "HDR: PTR(%10zu), PREV(%10zu), NEXT(%10zu), " + "ALLOC(%zu), SIZE(%10zu)\n", + (size_t) hdr, (size_t) hdr->prev, (size_t) hdr->next, + hdr->alloc, hdr->size); + mbedtls_fprintf(stderr, " FPREV(%10zu), FNEXT(%10zu)\n", + (size_t) hdr->prev_free, (size_t) hdr->next_free); + +#if defined(MBEDTLS_MEMORY_BACKTRACE) + mbedtls_fprintf(stderr, "TRACE: \n"); + for (i = 0; i < hdr->trace_count; i++) { + mbedtls_fprintf(stderr, "%s\n", hdr->trace[i]); + } + mbedtls_fprintf(stderr, "\n"); +#endif +} + +static void debug_chain(void) +{ + memory_header *cur = heap.first; + + mbedtls_fprintf(stderr, "\nBlock list\n"); + while (cur != NULL) { + debug_header(cur); + cur = cur->next; + } + + mbedtls_fprintf(stderr, "Free list\n"); + cur = heap.first_free; + + while (cur != NULL) { + debug_header(cur); + cur = cur->next_free; + } +} +#endif /* MBEDTLS_MEMORY_DEBUG */ + +static int verify_header(memory_header *hdr) +{ + if (hdr->magic1 != MAGIC1) { +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_fprintf(stderr, "FATAL: MAGIC1 mismatch\n"); +#endif + return 1; + } + + if (hdr->magic2 != MAGIC2) { +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_fprintf(stderr, "FATAL: MAGIC2 mismatch\n"); +#endif + return 1; + } + + if (hdr->alloc > 1) { +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_fprintf(stderr, "FATAL: alloc has illegal value\n"); +#endif + return 1; + } + + if (hdr->prev != NULL && hdr->prev == hdr->next) { +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_fprintf(stderr, "FATAL: prev == next\n"); +#endif + return 1; + } + + if (hdr->prev_free != NULL && hdr->prev_free == hdr->next_free) { +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_fprintf(stderr, "FATAL: prev_free == next_free\n"); +#endif + return 1; + } + + return 0; +} + +static int verify_chain(void) +{ + memory_header *prv = heap.first, *cur; + + if (prv == NULL || verify_header(prv) != 0) { +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_fprintf(stderr, "FATAL: verification of first header " + "failed\n"); +#endif + return 1; + } + + if (heap.first->prev != NULL) { +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_fprintf(stderr, "FATAL: verification failed: " + "first->prev != NULL\n"); +#endif + return 1; + } + + cur = heap.first->next; + + while (cur != NULL) { + if (verify_header(cur) != 0) { +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_fprintf(stderr, "FATAL: verification of header " + "failed\n"); +#endif + return 1; + } + + if (cur->prev != prv) { +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_fprintf(stderr, "FATAL: verification failed: " + "cur->prev != prv\n"); +#endif + return 1; + } + + prv = cur; + cur = cur->next; + } + + return 0; +} + +static void *buffer_alloc_calloc(size_t n, size_t size) +{ + memory_header *new, *cur = heap.first_free; + unsigned char *p; + void *ret; + size_t original_len, len; +#if defined(MBEDTLS_MEMORY_BACKTRACE) + void *trace_buffer[MAX_BT]; + size_t trace_cnt; +#endif + + if (heap.buf == NULL || heap.first == NULL) { + return NULL; + } + + original_len = len = n * size; + + if (n == 0 || size == 0 || len / n != size) { + return NULL; + } else if (len > (size_t) -MBEDTLS_MEMORY_ALIGN_MULTIPLE) { + return NULL; + } + + if (len % MBEDTLS_MEMORY_ALIGN_MULTIPLE) { + len -= len % MBEDTLS_MEMORY_ALIGN_MULTIPLE; + len += MBEDTLS_MEMORY_ALIGN_MULTIPLE; + } + + // Find block that fits + // + while (cur != NULL) { + if (cur->size >= len) { + break; + } + + cur = cur->next_free; + } + + if (cur == NULL) { + return NULL; + } + + if (cur->alloc != 0) { +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_fprintf(stderr, "FATAL: block in free_list but allocated " + "data\n"); +#endif + mbedtls_exit(1); + } + +#if defined(MBEDTLS_MEMORY_DEBUG) + heap.alloc_count++; +#endif + + // Found location, split block if > memory_header + 4 room left + // + if (cur->size - len < sizeof(memory_header) + + MBEDTLS_MEMORY_ALIGN_MULTIPLE) { + cur->alloc = 1; + + // Remove from free_list + // + if (cur->prev_free != NULL) { + cur->prev_free->next_free = cur->next_free; + } else { + heap.first_free = cur->next_free; + } + + if (cur->next_free != NULL) { + cur->next_free->prev_free = cur->prev_free; + } + + cur->prev_free = NULL; + cur->next_free = NULL; + +#if defined(MBEDTLS_MEMORY_DEBUG) + heap.total_used += cur->size; + if (heap.total_used > heap.maximum_used) { + heap.maximum_used = heap.total_used; + } +#endif +#if defined(MBEDTLS_MEMORY_BACKTRACE) + trace_cnt = backtrace(trace_buffer, MAX_BT); + cur->trace = backtrace_symbols(trace_buffer, trace_cnt); + cur->trace_count = trace_cnt; +#endif + + if ((heap.verify & MBEDTLS_MEMORY_VERIFY_ALLOC) && verify_chain() != 0) { + mbedtls_exit(1); + } + + ret = (unsigned char *) cur + sizeof(memory_header); + memset(ret, 0, original_len); + + return ret; + } + + p = ((unsigned char *) cur) + sizeof(memory_header) + len; + new = (memory_header *) p; + + new->size = cur->size - len - sizeof(memory_header); + new->alloc = 0; + new->prev = cur; + new->next = cur->next; +#if defined(MBEDTLS_MEMORY_BACKTRACE) + new->trace = NULL; + new->trace_count = 0; +#endif + new->magic1 = MAGIC1; + new->magic2 = MAGIC2; + + if (new->next != NULL) { + new->next->prev = new; + } + + // Replace cur with new in free_list + // + new->prev_free = cur->prev_free; + new->next_free = cur->next_free; + if (new->prev_free != NULL) { + new->prev_free->next_free = new; + } else { + heap.first_free = new; + } + + if (new->next_free != NULL) { + new->next_free->prev_free = new; + } + + cur->alloc = 1; + cur->size = len; + cur->next = new; + cur->prev_free = NULL; + cur->next_free = NULL; + +#if defined(MBEDTLS_MEMORY_DEBUG) + heap.header_count++; + if (heap.header_count > heap.maximum_header_count) { + heap.maximum_header_count = heap.header_count; + } + heap.total_used += cur->size; + if (heap.total_used > heap.maximum_used) { + heap.maximum_used = heap.total_used; + } +#endif +#if defined(MBEDTLS_MEMORY_BACKTRACE) + trace_cnt = backtrace(trace_buffer, MAX_BT); + cur->trace = backtrace_symbols(trace_buffer, trace_cnt); + cur->trace_count = trace_cnt; +#endif + + if ((heap.verify & MBEDTLS_MEMORY_VERIFY_ALLOC) && verify_chain() != 0) { + mbedtls_exit(1); + } + + ret = (unsigned char *) cur + sizeof(memory_header); + memset(ret, 0, original_len); + + return ret; +} + +static void buffer_alloc_free(void *ptr) +{ + memory_header *hdr, *old = NULL; + unsigned char *p = (unsigned char *) ptr; + + if (ptr == NULL || heap.buf == NULL || heap.first == NULL) { + return; + } + + if (p < heap.buf || p >= heap.buf + heap.len) { +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_fprintf(stderr, "FATAL: mbedtls_free() outside of managed " + "space\n"); +#endif + mbedtls_exit(1); + } + + p -= sizeof(memory_header); + hdr = (memory_header *) p; + + if (verify_header(hdr) != 0) { + mbedtls_exit(1); + } + + if (hdr->alloc != 1) { +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_fprintf(stderr, "FATAL: mbedtls_free() on unallocated " + "data\n"); +#endif + mbedtls_exit(1); + } + + hdr->alloc = 0; + +#if defined(MBEDTLS_MEMORY_DEBUG) + heap.free_count++; + heap.total_used -= hdr->size; +#endif + +#if defined(MBEDTLS_MEMORY_BACKTRACE) + free(hdr->trace); + hdr->trace = NULL; + hdr->trace_count = 0; +#endif + + // Regroup with block before + // + if (hdr->prev != NULL && hdr->prev->alloc == 0) { +#if defined(MBEDTLS_MEMORY_DEBUG) + heap.header_count--; +#endif + hdr->prev->size += sizeof(memory_header) + hdr->size; + hdr->prev->next = hdr->next; + old = hdr; + hdr = hdr->prev; + + if (hdr->next != NULL) { + hdr->next->prev = hdr; + } + + memset(old, 0, sizeof(memory_header)); + } + + // Regroup with block after + // + if (hdr->next != NULL && hdr->next->alloc == 0) { +#if defined(MBEDTLS_MEMORY_DEBUG) + heap.header_count--; +#endif + hdr->size += sizeof(memory_header) + hdr->next->size; + old = hdr->next; + hdr->next = hdr->next->next; + + if (hdr->prev_free != NULL || hdr->next_free != NULL) { + if (hdr->prev_free != NULL) { + hdr->prev_free->next_free = hdr->next_free; + } else { + heap.first_free = hdr->next_free; + } + + if (hdr->next_free != NULL) { + hdr->next_free->prev_free = hdr->prev_free; + } + } + + hdr->prev_free = old->prev_free; + hdr->next_free = old->next_free; + + if (hdr->prev_free != NULL) { + hdr->prev_free->next_free = hdr; + } else { + heap.first_free = hdr; + } + + if (hdr->next_free != NULL) { + hdr->next_free->prev_free = hdr; + } + + if (hdr->next != NULL) { + hdr->next->prev = hdr; + } + + memset(old, 0, sizeof(memory_header)); + } + + // Prepend to free_list if we have not merged + // (Does not have to stay in same order as prev / next list) + // + if (old == NULL) { + hdr->next_free = heap.first_free; + if (heap.first_free != NULL) { + heap.first_free->prev_free = hdr; + } + heap.first_free = hdr; + } + + if ((heap.verify & MBEDTLS_MEMORY_VERIFY_FREE) && verify_chain() != 0) { + mbedtls_exit(1); + } +} + +void mbedtls_memory_buffer_set_verify(int verify) +{ + heap.verify = verify; +} + +int mbedtls_memory_buffer_alloc_verify(void) +{ + return verify_chain(); +} + +#if defined(MBEDTLS_MEMORY_DEBUG) +void mbedtls_memory_buffer_alloc_status(void) +{ + mbedtls_fprintf(stderr, + "Current use: %zu blocks / %zu bytes, max: %zu blocks / " + "%zu bytes (total %zu bytes), alloc / free: %zu / %zu\n", + heap.header_count, heap.total_used, + heap.maximum_header_count, heap.maximum_used, + heap.maximum_header_count * sizeof(memory_header) + + heap.maximum_used, + heap.alloc_count, heap.free_count); + + if (heap.first->next == NULL) { + mbedtls_fprintf(stderr, "All memory de-allocated in stack buffer\n"); + } else { + mbedtls_fprintf(stderr, "Memory currently allocated:\n"); + debug_chain(); + } +} + +void mbedtls_memory_buffer_alloc_max_get(size_t *max_used, size_t *max_blocks) +{ + *max_used = heap.maximum_used; + *max_blocks = heap.maximum_header_count; +} + +void mbedtls_memory_buffer_alloc_max_reset(void) +{ + heap.maximum_used = 0; + heap.maximum_header_count = 0; +} + +void mbedtls_memory_buffer_alloc_cur_get(size_t *cur_used, size_t *cur_blocks) +{ + *cur_used = heap.total_used; + *cur_blocks = heap.header_count; +} +#endif /* MBEDTLS_MEMORY_DEBUG */ + +#if defined(MBEDTLS_THREADING_C) +static void *buffer_alloc_calloc_mutexed(size_t n, size_t size) +{ + void *buf; + if (mbedtls_mutex_lock(&heap.mutex) != 0) { + return NULL; + } + buf = buffer_alloc_calloc(n, size); + if (mbedtls_mutex_unlock(&heap.mutex)) { + return NULL; + } + return buf; +} + +static void buffer_alloc_free_mutexed(void *ptr) +{ + /* We have no good option here, but corrupting the heap seems + * worse than losing memory. */ + if (mbedtls_mutex_lock(&heap.mutex)) { + return; + } + buffer_alloc_free(ptr); + (void) mbedtls_mutex_unlock(&heap.mutex); +} +#endif /* MBEDTLS_THREADING_C */ + +void mbedtls_memory_buffer_alloc_init(unsigned char *buf, size_t len) +{ + memset(&heap, 0, sizeof(buffer_alloc_ctx)); + +#if defined(MBEDTLS_THREADING_C) + mbedtls_mutex_init(&heap.mutex); + mbedtls_platform_set_calloc_free(buffer_alloc_calloc_mutexed, + buffer_alloc_free_mutexed); +#else + mbedtls_platform_set_calloc_free(buffer_alloc_calloc, buffer_alloc_free); +#endif + + if (len < sizeof(memory_header) + MBEDTLS_MEMORY_ALIGN_MULTIPLE) { + return; + } else if ((size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE) { + /* Adjust len first since buf is used in the computation */ + len -= MBEDTLS_MEMORY_ALIGN_MULTIPLE + - (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE; + buf += MBEDTLS_MEMORY_ALIGN_MULTIPLE + - (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE; + } + + memset(buf, 0, len); + + heap.buf = buf; + heap.len = len; + + heap.first = (memory_header *) buf; + heap.first->size = len - sizeof(memory_header); + heap.first->magic1 = MAGIC1; + heap.first->magic2 = MAGIC2; + heap.first_free = heap.first; +} + +void mbedtls_memory_buffer_alloc_free(void) +{ +#if defined(MBEDTLS_THREADING_C) + mbedtls_mutex_free(&heap.mutex); +#endif + mbedtls_platform_zeroize(&heap, sizeof(buffer_alloc_ctx)); +} + +#if defined(MBEDTLS_SELF_TEST) +static int check_pointer(void *p) +{ + if (p == NULL) { + return -1; + } + + if ((size_t) p % MBEDTLS_MEMORY_ALIGN_MULTIPLE != 0) { + return -1; + } + + return 0; +} + +static int check_all_free(void) +{ + if ( +#if defined(MBEDTLS_MEMORY_DEBUG) + heap.total_used != 0 || +#endif + heap.first != heap.first_free || + (void *) heap.first != (void *) heap.buf) { + return -1; + } + + return 0; +} + +#define TEST_ASSERT(condition) \ + if (!(condition)) \ + { \ + if (verbose != 0) \ + mbedtls_printf("failed\n"); \ + \ + ret = 1; \ + goto cleanup; \ + } + +int mbedtls_memory_buffer_alloc_self_test(int verbose) +{ + unsigned char buf[1024]; + unsigned char *p, *q, *r, *end; + int ret = 0; + + if (verbose != 0) { + mbedtls_printf(" MBA test #1 (basic alloc-free cycle): "); + } + + mbedtls_memory_buffer_alloc_init(buf, sizeof(buf)); + + p = mbedtls_calloc(1, 1); + q = mbedtls_calloc(1, 128); + r = mbedtls_calloc(1, 16); + + TEST_ASSERT(check_pointer(p) == 0 && + check_pointer(q) == 0 && + check_pointer(r) == 0); + + mbedtls_free(r); + mbedtls_free(q); + mbedtls_free(p); + + TEST_ASSERT(check_all_free() == 0); + + /* Memorize end to compare with the next test */ + end = heap.buf + heap.len; + + mbedtls_memory_buffer_alloc_free(); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + if (verbose != 0) { + mbedtls_printf(" MBA test #2 (buf not aligned): "); + } + + mbedtls_memory_buffer_alloc_init(buf + 1, sizeof(buf) - 1); + + TEST_ASSERT(heap.buf + heap.len == end); + + p = mbedtls_calloc(1, 1); + q = mbedtls_calloc(1, 128); + r = mbedtls_calloc(1, 16); + + TEST_ASSERT(check_pointer(p) == 0 && + check_pointer(q) == 0 && + check_pointer(r) == 0); + + mbedtls_free(r); + mbedtls_free(q); + mbedtls_free(p); + + TEST_ASSERT(check_all_free() == 0); + + mbedtls_memory_buffer_alloc_free(); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + if (verbose != 0) { + mbedtls_printf(" MBA test #3 (full): "); + } + + mbedtls_memory_buffer_alloc_init(buf, sizeof(buf)); + + p = mbedtls_calloc(1, sizeof(buf) - sizeof(memory_header)); + + TEST_ASSERT(check_pointer(p) == 0); + TEST_ASSERT(mbedtls_calloc(1, 1) == NULL); + + mbedtls_free(p); + + p = mbedtls_calloc(1, sizeof(buf) - 2 * sizeof(memory_header) - 16); + q = mbedtls_calloc(1, 16); + + TEST_ASSERT(check_pointer(p) == 0 && check_pointer(q) == 0); + TEST_ASSERT(mbedtls_calloc(1, 1) == NULL); + + mbedtls_free(q); + + TEST_ASSERT(mbedtls_calloc(1, 17) == NULL); + + mbedtls_free(p); + + TEST_ASSERT(check_all_free() == 0); + + mbedtls_memory_buffer_alloc_free(); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + +cleanup: + mbedtls_memory_buffer_alloc_free(); + + return ret; +} +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */ diff --git a/ext/opcua_client/mbedtls/library/mps_common.h b/ext/opcua_client/mbedtls/library/mps_common.h new file mode 100644 index 0000000..a41eb9a --- /dev/null +++ b/ext/opcua_client/mbedtls/library/mps_common.h @@ -0,0 +1,181 @@ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/** + * \file mps_common.h + * + * \brief Common functions and macros used by MPS + */ + +#ifndef MBEDTLS_MPS_COMMON_H +#define MBEDTLS_MPS_COMMON_H + +#include "mps_error.h" + +#include + +/** + * \name SECTION: MPS Configuration + * + * \{ + */ + +/*! This flag controls whether the MPS-internal components + * (reader, writer, Layer 1-3) perform validation of the + * expected abstract state at the entry of API calls. + * + * Context: All MPS API functions impose assumptions/preconditions on the + * context on which they operate. For example, every structure has a notion of + * state integrity which is established by `xxx_init()` and preserved by any + * calls to the MPS API which satisfy their preconditions and either succeed, + * or fail with an error code which is explicitly documented to not corrupt + * structure integrity (such as WANT_READ and WANT_WRITE); + * apart from `xxx_init()` any function assumes state integrity as a + * precondition (but usually more). If any of the preconditions is violated, + * the function's behavior is entirely undefined. + * In addition to state integrity, all MPS structures have a more refined + * notion of abstract state that the API operates on. For example, all layers + * have a notion of 'abstract read state' which indicates if incoming data has + * been passed to the user, e.g. through mps_l2_read_start() for Layer 2 + * or mps_l3_read() in Layer 3. After such a call, it doesn't make sense to + * call these reading functions again until the incoming data has been + * explicitly 'consumed', e.g. through mps_l2_read_consume() for Layer 2 or + * mps_l3_read_consume() on Layer 3. However, even if it doesn't make sense, + * it's a design choice whether the API should fail gracefully on such + * non-sensical calls or not, and that's what this option is about: + * + * This option determines whether the expected abstract state + * is part of the API preconditions or not: If the option is set, + * then the abstract state is not part of the precondition and is + * thus required to be validated by the implementation. If an unexpected + * abstract state is encountered, the implementation must fail gracefully + * with error #MBEDTLS_ERR_MPS_OPERATION_UNEXPECTED. + * Conversely, if this option is not set, then the expected abstract state + * is included in the preconditions of the respective API calls, and + * an implementation's behaviour is undefined if the abstract state is + * not as expected. + * + * For example: Enabling this makes mps_l2_read_done() fail if + * no incoming record is currently open; disabling this would + * lead to undefined behavior in this case. + * + * Comment this to remove state validation. + */ +#define MBEDTLS_MPS_STATE_VALIDATION + +/*! This flag enables/disables assertions on the internal state of MPS. + * + * Assertions are sanity checks that should never trigger when MPS + * is used within the bounds of its API and preconditions. + * + * Enabling this increases security by limiting the scope of + * potential bugs, but comes at the cost of increased code size. + * + * Note: So far, there is no guiding principle as to what + * expected conditions merit an assertion, and which don't. + * + * Comment this to disable assertions. + */ +#define MBEDTLS_MPS_ENABLE_ASSERTIONS + +/*! This flag controls whether tracing for MPS should be enabled. */ +//#define MBEDTLS_MPS_ENABLE_TRACE + +#if defined(MBEDTLS_MPS_STATE_VALIDATION) + +#define MBEDTLS_MPS_STATE_VALIDATE_RAW(cond, string) \ + do \ + { \ + if (!(cond)) \ + { \ + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_ERROR, string); \ + MBEDTLS_MPS_TRACE_RETURN(MBEDTLS_ERR_MPS_OPERATION_UNEXPECTED); \ + } \ + } while (0) + +#else /* MBEDTLS_MPS_STATE_VALIDATION */ + +#define MBEDTLS_MPS_STATE_VALIDATE_RAW(cond, string) \ + do \ + { \ + (cond); \ + } while (0) + +#endif /* MBEDTLS_MPS_STATE_VALIDATION */ + +#if defined(MBEDTLS_MPS_ENABLE_ASSERTIONS) + +#define MBEDTLS_MPS_ASSERT_RAW(cond, string) \ + do \ + { \ + if (!(cond)) \ + { \ + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_ERROR, string); \ + MBEDTLS_MPS_TRACE_RETURN(MBEDTLS_ERR_MPS_INTERNAL_ERROR); \ + } \ + } while (0) + +#else /* MBEDTLS_MPS_ENABLE_ASSERTIONS */ + +#define MBEDTLS_MPS_ASSERT_RAW(cond, string) do {} while (0) + +#endif /* MBEDTLS_MPS_ENABLE_ASSERTIONS */ + + +/* \} name SECTION: MPS Configuration */ + +/** + * \name SECTION: Common types + * + * Various common types used throughout MPS. + * \{ + */ + +/** \brief The type of buffer sizes and offsets used in MPS structures. + * + * This is an unsigned integer type that should be large enough to + * hold the length of any buffer or message processed by MPS. + * + * The reason to pick a value as small as possible here is + * to reduce the size of MPS structures. + * + * \warning Care has to be taken when using a narrower type + * than ::mbedtls_mps_size_t here because of + * potential truncation during conversion. + * + * \warning Handshake messages in TLS may be up to 2^24 ~ 16Mb in size. + * If mbedtls_mps_[opt_]stored_size_t is smaller than that, the + * maximum handshake message is restricted accordingly. + * + * For now, we use the default type of size_t throughout, and the use of + * smaller types or different types for ::mbedtls_mps_size_t and + * ::mbedtls_mps_stored_size_t is not yet supported. + * + */ +typedef size_t mbedtls_mps_stored_size_t; +#define MBEDTLS_MPS_STORED_SIZE_MAX ((mbedtls_mps_stored_size_t) -1) + +/** \brief The type of buffer sizes and offsets used in the MPS API + * and implementation. + * + * This must be at least as wide as ::mbedtls_stored_size_t but + * may be chosen to be strictly larger if more suitable for the + * target architecture. + * + * For example, in a test build for ARM Thumb, using uint_fast16_t + * instead of uint16_t reduced the code size from 1060 Byte to 962 Byte, + * so almost 10%. + */ +typedef size_t mbedtls_mps_size_t; +#define MBEDTLS_MPS_SIZE_MAX ((mbedtls_mps_size_t) -1) + +#if MBEDTLS_MPS_STORED_SIZE_MAX > MBEDTLS_MPS_SIZE_MAX +#error "Misconfiguration of mbedtls_mps_size_t and mbedtls_mps_stored_size_t." +#endif + +/* \} SECTION: Common types */ + + +#endif /* MBEDTLS_MPS_COMMON_H */ diff --git a/ext/opcua_client/mbedtls/library/mps_error.h b/ext/opcua_client/mbedtls/library/mps_error.h new file mode 100644 index 0000000..016a84c --- /dev/null +++ b/ext/opcua_client/mbedtls/library/mps_error.h @@ -0,0 +1,89 @@ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/** + * \file mps_error.h + * + * \brief Error codes used by MPS + */ + +#ifndef MBEDTLS_MPS_ERROR_H +#define MBEDTLS_MPS_ERROR_H + + +/* TODO: The error code allocation needs to be revisited: + * + * - Should we make (some of) the MPS Reader error codes public? + * If so, we need to adjust MBEDTLS_MPS_READER_MAKE_ERROR() to hit + * a gap in the Mbed TLS public error space. + * If not, we have to make sure we don't forward those errors + * at the level of the public API -- no risk at the moment as + * long as MPS is an experimental component not accessible from + * public API. + */ + +/** + * \name SECTION: MPS general error codes + * + * \{ + */ + +#ifndef MBEDTLS_MPS_ERR_BASE +#define MBEDTLS_MPS_ERR_BASE (0) +#endif + +#define MBEDTLS_MPS_MAKE_ERROR(code) \ + (-(MBEDTLS_MPS_ERR_BASE | (code))) + +#define MBEDTLS_ERR_MPS_OPERATION_UNEXPECTED MBEDTLS_MPS_MAKE_ERROR(0x1) +#define MBEDTLS_ERR_MPS_INTERNAL_ERROR MBEDTLS_MPS_MAKE_ERROR(0x2) + +/* \} name SECTION: MPS general error codes */ + +/** + * \name SECTION: MPS Reader error codes + * + * \{ + */ + +#ifndef MBEDTLS_MPS_READER_ERR_BASE +#define MBEDTLS_MPS_READER_ERR_BASE (1 << 8) +#endif + +#define MBEDTLS_MPS_READER_MAKE_ERROR(code) \ + (-(MBEDTLS_MPS_READER_ERR_BASE | (code))) + +/*! An attempt to reclaim the data buffer from a reader failed because + * the user hasn't yet read and committed all of it. */ +#define MBEDTLS_ERR_MPS_READER_DATA_LEFT MBEDTLS_MPS_READER_MAKE_ERROR(0x1) + +/*! An invalid argument was passed to the reader. */ +#define MBEDTLS_ERR_MPS_READER_INVALID_ARG MBEDTLS_MPS_READER_MAKE_ERROR(0x2) + +/*! An attempt to move a reader to consuming mode through mbedtls_mps_reader_feed() + * after pausing failed because the provided data is not sufficient to serve the + * read requests that led to the pausing. */ +#define MBEDTLS_ERR_MPS_READER_NEED_MORE MBEDTLS_MPS_READER_MAKE_ERROR(0x3) + +/*! A get request failed because not enough data is available in the reader. */ +#define MBEDTLS_ERR_MPS_READER_OUT_OF_DATA MBEDTLS_MPS_READER_MAKE_ERROR(0x4) + +/*!< A get request after pausing and reactivating the reader failed because + * the request is not in line with the request made prior to pausing. The user + * must not change it's 'strategy' after pausing and reactivating a reader. */ +#define MBEDTLS_ERR_MPS_READER_INCONSISTENT_REQUESTS MBEDTLS_MPS_READER_MAKE_ERROR(0x5) + +/*! An attempt to reclaim the data buffer from a reader failed because the reader + * has no accumulator it can use to backup the data that hasn't been processed. */ +#define MBEDTLS_ERR_MPS_READER_NEED_ACCUMULATOR MBEDTLS_MPS_READER_MAKE_ERROR(0x6) + +/*! An attempt to reclaim the data buffer from a reader failed because the + * accumulator passed to the reader is not large enough to hold both the + * data that hasn't been processed and the excess of the last read-request. */ +#define MBEDTLS_ERR_MPS_READER_ACCUMULATOR_TOO_SMALL MBEDTLS_MPS_READER_MAKE_ERROR(0x7) + +/* \} name SECTION: MPS Reader error codes */ + +#endif /* MBEDTLS_MPS_ERROR_H */ diff --git a/ext/opcua_client/mbedtls/library/mps_reader.c b/ext/opcua_client/mbedtls/library/mps_reader.c new file mode 100644 index 0000000..36ca070 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/mps_reader.c @@ -0,0 +1,538 @@ +/* + * Message Processing Stack, Reader implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) + +#include "mps_reader.h" +#include "mps_common.h" +#include "mps_trace.h" + +#include + +#if defined(MBEDTLS_MPS_ENABLE_TRACE) +static int mbedtls_mps_trace_id = MBEDTLS_MPS_TRACE_BIT_READER; +#endif /* MBEDTLS_MPS_ENABLE_TRACE */ + +/* + * GENERAL NOTE ON CODING STYLE + * + * The following code intentionally separates memory loads + * and stores from other operations (arithmetic or branches). + * This leads to the introduction of many local variables + * and significantly increases the C-code line count, but + * should not increase the size of generated assembly. + * + * The reason for this is twofold: + * (1) It will ease verification efforts using the VST + * (Verified Software Toolchain) + * whose program logic cannot directly reason + * about instructions containing a load or store in + * addition to other operations (e.g. *p = *q or + * tmp = *p + 42). + * (2) Operating on local variables and writing the results + * back to the target contexts on success only + * allows to maintain structure invariants even + * on failure - this in turn has two benefits: + * (2.a) If for some reason an error code is not caught + * and operation continues, functions are nonetheless + * called with sane contexts, reducing the risk + * of dangerous behavior. + * (2.b) Randomized testing is easier if structures + * remain intact even in the face of failing + * and/or non-sensical calls. + * Moreover, it might even reduce code-size because + * the compiler need not write back temporary results + * to memory in case of failure. + * + */ + +static inline int mps_reader_is_accumulating( + mbedtls_mps_reader const *rd) +{ + mbedtls_mps_size_t acc_remaining; + if (rd->acc == NULL) { + return 0; + } + + acc_remaining = rd->acc_share.acc_remaining; + return acc_remaining > 0; +} + +static inline int mps_reader_is_producing( + mbedtls_mps_reader const *rd) +{ + unsigned char *frag = rd->frag; + return frag == NULL; +} + +static inline int mps_reader_is_consuming( + mbedtls_mps_reader const *rd) +{ + return !mps_reader_is_producing(rd); +} + +static inline mbedtls_mps_size_t mps_reader_get_fragment_offset( + mbedtls_mps_reader const *rd) +{ + unsigned char *acc = rd->acc; + mbedtls_mps_size_t frag_offset; + + if (acc == NULL) { + return 0; + } + + frag_offset = rd->acc_share.frag_offset; + return frag_offset; +} + +static inline mbedtls_mps_size_t mps_reader_serving_from_accumulator( + mbedtls_mps_reader const *rd) +{ + mbedtls_mps_size_t frag_offset, end; + + frag_offset = mps_reader_get_fragment_offset(rd); + end = rd->end; + + return end < frag_offset; +} + +static inline void mps_reader_zero(mbedtls_mps_reader *rd) +{ + /* A plain memset() would likely be more efficient, + * but the current way of zeroing makes it harder + * to overlook fields which should not be zero-initialized. + * It's also more suitable for FV efforts since it + * doesn't require reasoning about structs being + * interpreted as unstructured binary blobs. */ + static mbedtls_mps_reader const zero = + { .frag = NULL, + .frag_len = 0, + .commit = 0, + .end = 0, + .pending = 0, + .acc = NULL, + .acc_len = 0, + .acc_available = 0, + .acc_share = { .acc_remaining = 0 } }; + *rd = zero; +} + +int mbedtls_mps_reader_init(mbedtls_mps_reader *rd, + unsigned char *acc, + mbedtls_mps_size_t acc_len) +{ + MBEDTLS_MPS_TRACE_INIT("mbedtls_mps_reader_init"); + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "* Accumulator size: %u bytes", (unsigned) acc_len); + mps_reader_zero(rd); + rd->acc = acc; + rd->acc_len = acc_len; + MBEDTLS_MPS_TRACE_RETURN(0); +} + +int mbedtls_mps_reader_free(mbedtls_mps_reader *rd) +{ + MBEDTLS_MPS_TRACE_INIT("mbedtls_mps_reader_free"); + mps_reader_zero(rd); + MBEDTLS_MPS_TRACE_RETURN(0); +} + +int mbedtls_mps_reader_feed(mbedtls_mps_reader *rd, + unsigned char *new_frag, + mbedtls_mps_size_t new_frag_len) +{ + mbedtls_mps_size_t copy_to_acc; + MBEDTLS_MPS_TRACE_INIT("mbedtls_mps_reader_feed"); + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "* Fragment length: %u bytes", (unsigned) new_frag_len); + + if (new_frag == NULL) { + MBEDTLS_MPS_TRACE_RETURN(MBEDTLS_ERR_MPS_READER_INVALID_ARG); + } + + MBEDTLS_MPS_STATE_VALIDATE_RAW(mps_reader_is_producing( + rd), + "mbedtls_mps_reader_feed() requires reader to be in producing mode"); + + if (mps_reader_is_accumulating(rd)) { + unsigned char *acc = rd->acc; + mbedtls_mps_size_t acc_remaining = rd->acc_share.acc_remaining; + mbedtls_mps_size_t acc_available = rd->acc_available; + + /* Skip over parts of the accumulator that have already been filled. */ + acc += acc_available; + + copy_to_acc = acc_remaining; + if (copy_to_acc > new_frag_len) { + copy_to_acc = new_frag_len; + } + + /* Copy new contents to accumulator. */ + memcpy(acc, new_frag, copy_to_acc); + + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "Copy new data of size %u of %u into accumulator at offset %u", + (unsigned) copy_to_acc, (unsigned) new_frag_len, + (unsigned) acc_available); + + /* Check if, with the new fragment, we have enough data. */ + acc_remaining -= copy_to_acc; + if (acc_remaining > 0) { + /* We need to accumulate more data. Stay in producing mode. */ + acc_available += copy_to_acc; + rd->acc_share.acc_remaining = acc_remaining; + rd->acc_available = acc_available; + MBEDTLS_MPS_TRACE_RETURN(MBEDTLS_ERR_MPS_READER_NEED_MORE); + } + + /* We have filled the accumulator: Move to consuming mode. */ + + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "Enough data available to serve user request"); + + /* Remember overlap of accumulator and fragment. */ + rd->acc_share.frag_offset = acc_available; + acc_available += copy_to_acc; + rd->acc_available = acc_available; + } else { /* Not accumulating */ + rd->acc_share.frag_offset = 0; + } + + rd->frag = new_frag; + rd->frag_len = new_frag_len; + rd->commit = 0; + rd->end = 0; + MBEDTLS_MPS_TRACE_RETURN(0); +} + + +int mbedtls_mps_reader_get(mbedtls_mps_reader *rd, + mbedtls_mps_size_t desired, + unsigned char **buffer, + mbedtls_mps_size_t *buflen) +{ + unsigned char *frag; + mbedtls_mps_size_t frag_len, frag_offset, end, frag_fetched, frag_remaining; + MBEDTLS_MPS_TRACE_INIT("mbedtls_mps_reader_get"); + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "* Bytes requested: %u", (unsigned) desired); + + MBEDTLS_MPS_STATE_VALIDATE_RAW(mps_reader_is_consuming( + rd), + "mbedtls_mps_reader_get() requires reader to be in consuming mode"); + + end = rd->end; + frag_offset = mps_reader_get_fragment_offset(rd); + + /* Check if we're still serving from the accumulator. */ + if (mps_reader_serving_from_accumulator(rd)) { + /* Illustration of supported and unsupported cases: + * + * - Allowed #1 + * + * +-----------------------------------+ + * | frag | + * +-----------------------------------+ + * + * end end+desired + * | | + * +-----v-------v-------------+ + * | acc | + * +---------------------------+ + * | | + * frag_offset acc_available + * + * - Allowed #2 + * + * +-----------------------------------+ + * | frag | + * +-----------------------------------+ + * + * end end+desired + * | | + * +----------v----------------v + * | acc | + * +---------------------------+ + * | | + * frag_offset acc_available + * + * - Not allowed #1 (could be served, but we don't actually use it): + * + * +-----------------------------------+ + * | frag | + * +-----------------------------------+ + * + * end end+desired + * | | + * +------v-------------v------+ + * | acc | + * +---------------------------+ + * | | + * frag_offset acc_available + * + * + * - Not allowed #2 (can't be served with a contiguous buffer): + * + * +-----------------------------------+ + * | frag | + * +-----------------------------------+ + * + * end end + desired + * | | + * +------v--------------------+ v + * | acc | + * +---------------------------+ + * | | + * frag_offset acc_available + * + * In case of Allowed #2 we're switching to serve from + * `frag` starting from the next call to mbedtls_mps_reader_get(). + */ + + unsigned char *acc; + + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "Serve the request from the accumulator"); + if (frag_offset - end < desired) { + mbedtls_mps_size_t acc_available; + acc_available = rd->acc_available; + if (acc_available - end != desired) { + /* It might be possible to serve some of these situations by + * making additional space in the accumulator, removing those + * parts that have already been committed. + * On the other hand, this brings additional complexity and + * enlarges the code size, while there doesn't seem to be a use + * case where we don't attempt exactly the same `get` calls when + * resuming on a reader than what we tried before pausing it. + * If we believe we adhere to this restricted usage throughout + * the library, this check is a good opportunity to + * validate this. */ + MBEDTLS_MPS_TRACE_RETURN( + MBEDTLS_ERR_MPS_READER_INCONSISTENT_REQUESTS); + } + } + + acc = rd->acc; + acc += end; + + *buffer = acc; + if (buflen != NULL) { + *buflen = desired; + } + + end += desired; + rd->end = end; + rd->pending = 0; + + MBEDTLS_MPS_TRACE_RETURN(0); + } + + /* Attempt to serve the request from the current fragment */ + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "Serve the request from the current fragment."); + + frag_len = rd->frag_len; + frag_fetched = end - frag_offset; /* The amount of data from the current + * fragment that has already been passed + * to the user. */ + frag_remaining = frag_len - frag_fetched; /* Remaining data in fragment */ + + /* Check if we can serve the read request from the fragment. */ + if (frag_remaining < desired) { + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "There's not enough data in the current fragment " + "to serve the request."); + /* There's not enough data in the current fragment, + * so either just RETURN what we have or fail. */ + if (buflen == NULL) { + if (frag_remaining > 0) { + rd->pending = desired - frag_remaining; + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "Remember to collect %u bytes before re-opening", + (unsigned) rd->pending); + } + MBEDTLS_MPS_TRACE_RETURN(MBEDTLS_ERR_MPS_READER_OUT_OF_DATA); + } + + desired = frag_remaining; + } + + /* There's enough data in the current fragment to serve the + * (potentially modified) read request. */ + + frag = rd->frag; + frag += frag_fetched; + + *buffer = frag; + if (buflen != NULL) { + *buflen = desired; + } + + end += desired; + rd->end = end; + rd->pending = 0; + MBEDTLS_MPS_TRACE_RETURN(0); +} + +int mbedtls_mps_reader_commit(mbedtls_mps_reader *rd) +{ + mbedtls_mps_size_t end; + MBEDTLS_MPS_TRACE_INIT("mbedtls_mps_reader_commit"); + MBEDTLS_MPS_STATE_VALIDATE_RAW(mps_reader_is_consuming( + rd), + "mbedtls_mps_reader_commit() requires reader to be in consuming mode"); + + end = rd->end; + rd->commit = end; + + MBEDTLS_MPS_TRACE_RETURN(0); +} + +int mbedtls_mps_reader_reclaim(mbedtls_mps_reader *rd, + int *paused) +{ + unsigned char *frag, *acc; + mbedtls_mps_size_t pending, commit; + mbedtls_mps_size_t acc_len, frag_offset, frag_len; + MBEDTLS_MPS_TRACE_INIT("mbedtls_mps_reader_reclaim"); + + if (paused != NULL) { + *paused = 0; + } + + MBEDTLS_MPS_STATE_VALIDATE_RAW(mps_reader_is_consuming( + rd), + "mbedtls_mps_reader_reclaim() requires reader to be in consuming mode"); + + frag = rd->frag; + acc = rd->acc; + pending = rd->pending; + commit = rd->commit; + frag_len = rd->frag_len; + + frag_offset = mps_reader_get_fragment_offset(rd); + + if (pending == 0) { + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "No unsatisfied read-request has been logged."); + + /* Check if there's data left to be consumed. */ + if (commit < frag_offset || commit - frag_offset < frag_len) { + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "There is data left to be consumed."); + rd->end = commit; + MBEDTLS_MPS_TRACE_RETURN(MBEDTLS_ERR_MPS_READER_DATA_LEFT); + } + + rd->acc_available = 0; + rd->acc_share.acc_remaining = 0; + + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "Fragment has been fully processed and committed."); + } else { + int overflow; + + mbedtls_mps_size_t acc_backup_offset; + mbedtls_mps_size_t acc_backup_len; + mbedtls_mps_size_t frag_backup_offset; + mbedtls_mps_size_t frag_backup_len; + + mbedtls_mps_size_t backup_len; + mbedtls_mps_size_t acc_len_needed; + + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "There has been an unsatisfied read with %u bytes overhead.", + (unsigned) pending); + + if (acc == NULL) { + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "No accumulator present"); + MBEDTLS_MPS_TRACE_RETURN( + MBEDTLS_ERR_MPS_READER_NEED_ACCUMULATOR); + } + acc_len = rd->acc_len; + + /* Check if the upper layer has already fetched + * and committed the contents of the accumulator. */ + if (commit < frag_offset) { + /* No, accumulator is still being processed. */ + frag_backup_offset = 0; + frag_backup_len = frag_len; + acc_backup_offset = commit; + acc_backup_len = frag_offset - commit; + } else { + /* Yes, the accumulator is already processed. */ + frag_backup_offset = commit - frag_offset; + frag_backup_len = frag_len - frag_backup_offset; + acc_backup_offset = 0; + acc_backup_len = 0; + } + + backup_len = acc_backup_len + frag_backup_len; + acc_len_needed = backup_len + pending; + + overflow = 0; + overflow |= (backup_len < acc_backup_len); + overflow |= (acc_len_needed < backup_len); + + if (overflow || acc_len < acc_len_needed) { + /* Except for the different return code, we behave as if + * there hadn't been a call to mbedtls_mps_reader_get() + * since the last commit. */ + rd->end = commit; + rd->pending = 0; + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_ERROR, + "The accumulator is too small to handle the backup."); + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_ERROR, + "* Size: %u", (unsigned) acc_len); + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_ERROR, + "* Needed: %u (%u + %u)", + (unsigned) acc_len_needed, + (unsigned) backup_len, (unsigned) pending); + MBEDTLS_MPS_TRACE_RETURN( + MBEDTLS_ERR_MPS_READER_ACCUMULATOR_TOO_SMALL); + } + + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "Fragment backup: %u", (unsigned) frag_backup_len); + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "Accumulator backup: %u", (unsigned) acc_backup_len); + + /* Move uncommitted parts from the accumulator to the front + * of the accumulator. */ + memmove(acc, acc + acc_backup_offset, acc_backup_len); + + /* Copy uncommitted parts of the current fragment to the + * accumulator. */ + memcpy(acc + acc_backup_len, + frag + frag_backup_offset, frag_backup_len); + + rd->acc_available = backup_len; + rd->acc_share.acc_remaining = pending; + + if (paused != NULL) { + *paused = 1; + } + } + + rd->frag = NULL; + rd->frag_len = 0; + + rd->commit = 0; + rd->end = 0; + rd->pending = 0; + + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_COMMENT, + "Final state: aa %u, al %u, ar %u", + (unsigned) rd->acc_available, (unsigned) rd->acc_len, + (unsigned) rd->acc_share.acc_remaining); + MBEDTLS_MPS_TRACE_RETURN(0); +} + +#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ diff --git a/ext/opcua_client/mbedtls/library/mps_reader.h b/ext/opcua_client/mbedtls/library/mps_reader.h new file mode 100644 index 0000000..3193a5e --- /dev/null +++ b/ext/opcua_client/mbedtls/library/mps_reader.h @@ -0,0 +1,366 @@ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/** + * \file mps_reader.h + * + * \brief This file defines reader objects, which together with their + * sibling writer objects form the basis for the communication + * between the various layers of the Mbed TLS messaging stack, + * as well as the communication between the messaging stack and + * the (D)TLS handshake protocol implementation. + * + * Readers provide a means of transferring incoming data from + * a 'producer' providing it in chunks of arbitrary size, to + * a 'consumer' which fetches and processes it in chunks of + * again arbitrary, and potentially different, size. + * + * Readers can thus be seen as datagram-to-stream converters, + * and they abstract away the following two tasks from the user: + * 1. The pointer arithmetic of stepping through a producer- + * provided chunk in smaller chunks. + * 2. The merging of incoming data chunks in case the + * consumer requests data in larger chunks than what the + * producer provides. + * + * The basic abstract flow of operation is the following: + * - Initially, the reader is in 'producing mode'. + * - The producer hands an incoming data buffer to the reader, + * moving it from 'producing' to 'consuming' mode. + * - The consumer subsequently fetches and processes the buffer + * content. Once that's done -- or partially done and a consumer's + * request can't be fulfilled -- the producer revokes the reader's + * access to the incoming data buffer, putting the reader back to + * producing mode. + * - The producer subsequently gathers more incoming data and hands + * it to the reader until it switches back to consuming mode + * if enough data is available for the last consumer request to + * be satisfiable. + * - Repeat the above. + * + * The abstract states of the reader from the producer's and + * consumer's perspective are as follows: + * + * - From the perspective of the consumer, the state of the + * reader consists of the following: + * - A byte stream representing (concatenation of) the data + * received through calls to mbedtls_mps_reader_get(), + * - A marker within that byte stream indicating which data + * can be considered processed, and hence need not be retained, + * when the reader is passed back to the producer via + * mbedtls_mps_reader_reclaim(). + * The marker is set via mbedtls_mps_reader_commit() + * which places it at the end of the current byte stream. + * The consumer need not be aware of the distinction between consumer + * and producer mode, because it only interfaces with the reader + * when the latter is in consuming mode. + * + * - From the perspective of the producer, the reader's state is one of: + * - Attached: The reader is in consuming mode. + * - Unset: No incoming data buffer is currently managed by the reader, + * and all previously handed incoming data buffers have been + * fully processed. More data needs to be fed into the reader + * via mbedtls_mps_reader_feed(). + * + * - Accumulating: No incoming data buffer is currently managed by the + * reader, but some data from the previous incoming data + * buffer hasn't been processed yet and is internally + * held back. + * The Attached state belongs to consuming mode, while the Unset and + * Accumulating states belong to producing mode. + * + * Transitioning from the Unset or Accumulating state to Attached is + * done via successful calls to mbedtls_mps_reader_feed(), while + * transitioning from Attached to either Unset or Accumulating (depending + * on what has been processed) is done via mbedtls_mps_reader_reclaim(). + * + * The following diagram depicts the producer-state progression: + * + * +------------------+ reclaim + * | Unset +<-------------------------------------+ get + * +--------|---------+ | +------+ + * | | | | + * | | | | + * | feed +---------+---+--+ | + * +--------------------------------------> <---+ + * | Attached | + * +--------------------------------------> <---+ + * | feed, enough data available +---------+---+--+ | + * | to serve previous consumer request | | | + * | | | | + * +--------+---------+ | +------+ + * +----> Accumulating |<-------------------------------------+ commit + * | +---+--------------+ reclaim, previous read request + * | | couldn't be fulfilled + * | | + * +--------+ + * feed, need more data to serve + * previous consumer request + * | + * | + * producing mode | consuming mode + * | + * + */ + +#ifndef MBEDTLS_READER_H +#define MBEDTLS_READER_H + +#include + +#include "mps_common.h" +#include "mps_error.h" + +struct mbedtls_mps_reader; +typedef struct mbedtls_mps_reader mbedtls_mps_reader; + +/* + * Structure definitions + */ + +struct mbedtls_mps_reader { + unsigned char *frag; /*!< The fragment of incoming data managed by + * the reader; it is provided to the reader + * through mbedtls_mps_reader_feed(). The reader + * does not own the fragment and does not + * perform any allocation operations on it, + * but does have read and write access to it. + * + * The reader is in consuming mode if + * and only if \c frag is not \c NULL. */ + mbedtls_mps_stored_size_t frag_len; + /*!< The length of the current fragment. + * Must be 0 if \c frag == \c NULL. */ + mbedtls_mps_stored_size_t commit; + /*!< The offset of the last commit, relative + * to the first byte in the fragment, if + * no accumulator is present. If an accumulator + * is present, it is viewed as a prefix to the + * current fragment, and this variable contains + * an offset from the beginning of the accumulator. + * + * This is only used when the reader is in + * consuming mode, i.e. \c frag != \c NULL; + * otherwise, its value is \c 0. */ + mbedtls_mps_stored_size_t end; + /*!< The offset of the end of the last chunk + * passed to the user through a call to + * mbedtls_mps_reader_get(), relative to the first + * byte in the fragment, if no accumulator is + * present. If an accumulator is present, it is + * viewed as a prefix to the current fragment, and + * this variable contains an offset from the + * beginning of the accumulator. + * + * This is only used when the reader is in + * consuming mode, i.e. \c frag != \c NULL; + * otherwise, its value is \c 0. */ + mbedtls_mps_stored_size_t pending; + /*!< The amount of incoming data missing on the + * last call to mbedtls_mps_reader_get(). + * In particular, it is \c 0 if the last call + * was successful. + * If a reader is reclaimed after an + * unsuccessful call to mbedtls_mps_reader_get(), + * this variable is used to have the reader + * remember how much data should be accumulated + * so that the call to mbedtls_mps_reader_get() + * succeeds next time. + * This is only used when the reader is in + * consuming mode, i.e. \c frag != \c NULL; + * otherwise, its value is \c 0. */ + + /* The accumulator is only needed if we need to be able to pause + * the reader. A few bytes could be saved by moving this to a + * separate struct and using a pointer here. */ + + unsigned char *acc; /*!< The accumulator is used to gather incoming + * data if a read-request via mbedtls_mps_reader_get() + * cannot be served from the current fragment. */ + mbedtls_mps_stored_size_t acc_len; + /*!< The total size of the accumulator. */ + mbedtls_mps_stored_size_t acc_available; + /*!< The number of bytes currently gathered in + * the accumulator. This is both used in + * producing and in consuming mode: + * While producing, it is increased until + * it reaches the value of \c acc_remaining below. + * While consuming, it is used to judge if a + * get request can be served from the + * accumulator or not. + * Must not be larger than \c acc_len. */ + union { + mbedtls_mps_stored_size_t acc_remaining; + /*!< This indicates the amount of data still + * to be gathered in the accumulator. It is + * only used in producing mode. + * Must be at most acc_len - acc_available. */ + mbedtls_mps_stored_size_t frag_offset; + /*!< If an accumulator is present and in use, this + * field indicates the offset of the current + * fragment from the beginning of the + * accumulator. If no accumulator is present + * or the accumulator is not in use, this is \c 0. + * It is only used in consuming mode. + * Must not be larger than \c acc_available. */ + } acc_share; +}; + +/* + * API organization: + * A reader object is usually prepared and maintained + * by some lower layer and passed for usage to an upper + * layer, and the API naturally splits according to which + * layer is supposed to use the respective functions. + */ + +/* + * Maintenance API (Lower layer) + */ + +/** + * \brief Initialize a reader object + * + * \param reader The reader to be initialized. + * \param acc The buffer to be used as a temporary accumulator + * in case get requests through mbedtls_mps_reader_get() + * exceed the buffer provided by mbedtls_mps_reader_feed(). + * This buffer is owned by the caller and exclusive use + * for reading and writing is given to the reader for the + * duration of the reader's lifetime. It is thus the caller's + * responsibility to maintain (and not touch) the buffer for + * the lifetime of the reader, and to properly zeroize and + * free the memory after the reader has been destroyed. + * \param acc_len The size in Bytes of \p acc. + * + * \return \c 0 on success. + * \return A negative \c MBEDTLS_ERR_READER_XXX error code on failure. + */ +int mbedtls_mps_reader_init(mbedtls_mps_reader *reader, + unsigned char *acc, + mbedtls_mps_size_t acc_len); + +/** + * \brief Free a reader object + * + * \param reader The reader to be freed. + * + * \return \c 0 on success. + * \return A negative \c MBEDTLS_ERR_READER_XXX error code on failure. + */ +int mbedtls_mps_reader_free(mbedtls_mps_reader *reader); + +/** + * \brief Pass chunk of data for the reader to manage. + * + * \param reader The reader context to use. The reader must be + * in producing mode. + * \param buf The buffer to be managed by the reader. + * \param buflen The size in Bytes of \p buffer. + * + * \return \c 0 on success. In this case, the reader will be + * moved to consuming mode and obtains read access + * of \p buf until mbedtls_mps_reader_reclaim() + * is called. It is the responsibility of the caller + * to ensure that the \p buf persists and is not changed + * between successful calls to mbedtls_mps_reader_feed() + * and mbedtls_mps_reader_reclaim(). + * \return \c MBEDTLS_ERR_MPS_READER_NEED_MORE if more input data is + * required to fulfill a previous request to mbedtls_mps_reader_get(). + * In this case, the reader remains in producing mode and + * takes no ownership of the provided buffer (an internal copy + * is made instead). + * \return Another negative \c MBEDTLS_ERR_READER_XXX error code on + * different kinds of failures. + */ +int mbedtls_mps_reader_feed(mbedtls_mps_reader *reader, + unsigned char *buf, + mbedtls_mps_size_t buflen); + +/** + * \brief Reclaim reader's access to the current input buffer. + * + * \param reader The reader context to use. The reader must be + * in consuming mode. + * \param paused If not \c NULL, the integer at address \p paused will be + * modified to indicate whether the reader has been paused + * (value \c 1) or not (value \c 0). Pausing happens if there + * is uncommitted data and a previous request to + * mbedtls_mps_reader_get() has exceeded the bounds of the + * input buffer. + * + * \return \c 0 on success. + * \return A negative \c MBEDTLS_ERR_READER_XXX error code on failure. + */ +int mbedtls_mps_reader_reclaim(mbedtls_mps_reader *reader, + int *paused); + +/* + * Usage API (Upper layer) + */ + +/** + * \brief Request data from the reader. + * + * \param reader The reader context to use. The reader must + * be in consuming mode. + * \param desired The desired amount of data to be read, in Bytes. + * \param buffer The address to store the buffer pointer in. + * This must not be \c NULL. + * \param buflen The address to store the actual buffer + * length in, or \c NULL. + * + * \return \c 0 on success. In this case, \c *buf holds the + * address of a buffer of size \c *buflen + * (if \c buflen != \c NULL) or \c desired + * (if \c buflen == \c NULL). The user has read access + * to the buffer and guarantee of stability of the data + * until the next call to mbedtls_mps_reader_reclaim(). + * \return #MBEDTLS_ERR_MPS_READER_OUT_OF_DATA if there is not enough + * data available to serve the get request. In this case, the + * reader remains intact and in consuming mode, and the consumer + * should retry the call after a successful cycle of + * mbedtls_mps_reader_reclaim() and mbedtls_mps_reader_feed(). + * If, after such a cycle, the consumer requests a different + * amount of data, the result is implementation-defined; + * progress is guaranteed only if the same amount of data + * is requested after a mbedtls_mps_reader_reclaim() and + * mbedtls_mps_reader_feed() cycle. + * \return Another negative \c MBEDTLS_ERR_READER_XXX error + * code for different kinds of failure. + * + * \note Passing \c NULL as \p buflen is a convenient way to + * indicate that fragmentation is not tolerated. + * It's functionally equivalent to passing a valid + * address as buflen and checking \c *buflen == \c desired + * afterwards. + */ +int mbedtls_mps_reader_get(mbedtls_mps_reader *reader, + mbedtls_mps_size_t desired, + unsigned char **buffer, + mbedtls_mps_size_t *buflen); + +/** + * \brief Mark data obtained from mbedtls_mps_reader_get() as processed. + * + * This call indicates that all data received from prior calls to + * mbedtls_mps_reader_get() has been or will have been + * processed when mbedtls_mps_reader_reclaim() is called, + * and thus need not be backed up. + * + * This function has no user observable effect until + * mbedtls_mps_reader_reclaim() is called. In particular, + * buffers received from mbedtls_mps_reader_get() remain + * valid until mbedtls_mps_reader_reclaim() is called. + * + * \param reader The reader context to use. + * + * \return \c 0 on success. + * \return A negative \c MBEDTLS_ERR_READER_XXX error code on failure. + * + */ +int mbedtls_mps_reader_commit(mbedtls_mps_reader *reader); + +#endif /* MBEDTLS_READER_H */ diff --git a/ext/opcua_client/mbedtls/library/mps_trace.c b/ext/opcua_client/mbedtls/library/mps_trace.c new file mode 100644 index 0000000..4f580d7 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/mps_trace.c @@ -0,0 +1,112 @@ +/* + * Message Processing Stack, Trace module + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) + +#include "mps_common.h" + +#if defined(MBEDTLS_MPS_ENABLE_TRACE) + +#include "mps_trace.h" +#include + +static int trace_depth = 0; + +#define color_default "\x1B[0m" +#define color_red "\x1B[1;31m" +#define color_green "\x1B[1;32m" +#define color_yellow "\x1B[1;33m" +#define color_blue "\x1B[1;34m" +#define color_magenta "\x1B[1;35m" +#define color_cyan "\x1B[1;36m" +#define color_white "\x1B[1;37m" + +static char const *colors[] = +{ + color_default, + color_green, + color_yellow, + color_magenta, + color_cyan, + color_blue, + color_white +}; + +#define MPS_TRACE_BUF_SIZE 100 + +void mbedtls_mps_trace_print_msg(int id, int line, const char *format, ...) +{ + int ret; + char str[MPS_TRACE_BUF_SIZE]; + va_list argp; + va_start(argp, format); + ret = mbedtls_vsnprintf(str, MPS_TRACE_BUF_SIZE, format, argp); + va_end(argp); + + if (ret >= 0 && ret < MPS_TRACE_BUF_SIZE) { + str[ret] = '\0'; + mbedtls_printf("[%d|L%d]: %s\n", id, line, str); + } +} + +int mbedtls_mps_trace_get_depth() +{ + return trace_depth; +} +void mbedtls_mps_trace_dec_depth() +{ + trace_depth--; +} +void mbedtls_mps_trace_inc_depth() +{ + trace_depth++; +} + +void mbedtls_mps_trace_color(int id) +{ + if (id > (int) (sizeof(colors) / sizeof(*colors))) { + return; + } + printf("%s", colors[id]); +} + +void mbedtls_mps_trace_indent(int level, mbedtls_mps_trace_type ty) +{ + if (level > 0) { + while (--level) { + printf("| "); + } + + printf("| "); + } + + switch (ty) { + case MBEDTLS_MPS_TRACE_TYPE_COMMENT: + mbedtls_printf("@ "); + break; + + case MBEDTLS_MPS_TRACE_TYPE_CALL: + mbedtls_printf("+--> "); + break; + + case MBEDTLS_MPS_TRACE_TYPE_ERROR: + mbedtls_printf("E "); + break; + + case MBEDTLS_MPS_TRACE_TYPE_RETURN: + mbedtls_printf("< "); + break; + + default: + break; + } +} + +#endif /* MBEDTLS_MPS_ENABLE_TRACE */ +#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ diff --git a/ext/opcua_client/mbedtls/library/mps_trace.h b/ext/opcua_client/mbedtls/library/mps_trace.h new file mode 100644 index 0000000..b456b2f --- /dev/null +++ b/ext/opcua_client/mbedtls/library/mps_trace.h @@ -0,0 +1,154 @@ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/** + * \file mps_trace.h + * + * \brief Tracing module for MPS + */ + +#ifndef MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H +#define MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H + +#include "common.h" +#include "mps_common.h" +#include "mps_trace.h" + +#include "mbedtls/platform.h" + +#if defined(MBEDTLS_MPS_ENABLE_TRACE) + +/* + * Adapt this to enable/disable tracing output + * from the various layers of the MPS. + */ + +#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_1 +#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_2 +#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_3 +#define MBEDTLS_MPS_TRACE_ENABLE_LAYER_4 +#define MBEDTLS_MPS_TRACE_ENABLE_READER +#define MBEDTLS_MPS_TRACE_ENABLE_WRITER + +/* + * To use the existing trace module, only change + * MBEDTLS_MPS_TRACE_ENABLE_XXX above, but don't modify the + * rest of this file. + */ + +typedef enum { + MBEDTLS_MPS_TRACE_TYPE_COMMENT, + MBEDTLS_MPS_TRACE_TYPE_CALL, + MBEDTLS_MPS_TRACE_TYPE_ERROR, + MBEDTLS_MPS_TRACE_TYPE_RETURN +} mbedtls_mps_trace_type; + +#define MBEDTLS_MPS_TRACE_BIT_LAYER_1 1 +#define MBEDTLS_MPS_TRACE_BIT_LAYER_2 2 +#define MBEDTLS_MPS_TRACE_BIT_LAYER_3 3 +#define MBEDTLS_MPS_TRACE_BIT_LAYER_4 4 +#define MBEDTLS_MPS_TRACE_BIT_WRITER 5 +#define MBEDTLS_MPS_TRACE_BIT_READER 6 + +#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_1) +#define MBEDTLS_MPS_TRACE_MASK_LAYER_1 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_1) +#else +#define MBEDTLS_MPS_TRACE_MASK_LAYER_1 0 +#endif + +#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_2) +#define MBEDTLS_MPS_TRACE_MASK_LAYER_2 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_2) +#else +#define MBEDTLS_MPS_TRACE_MASK_LAYER_2 0 +#endif + +#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_3) +#define MBEDTLS_MPS_TRACE_MASK_LAYER_3 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_3) +#else +#define MBEDTLS_MPS_TRACE_MASK_LAYER_3 0 +#endif + +#if defined(MBEDTLS_MPS_TRACE_ENABLE_LAYER_4) +#define MBEDTLS_MPS_TRACE_MASK_LAYER_4 (1u << MBEDTLS_MPS_TRACE_BIT_LAYER_4) +#else +#define MBEDTLS_MPS_TRACE_MASK_LAYER_4 0 +#endif + +#if defined(MBEDTLS_MPS_TRACE_ENABLE_READER) +#define MBEDTLS_MPS_TRACE_MASK_READER (1u << MBEDTLS_MPS_TRACE_BIT_READER) +#else +#define MBEDTLS_MPS_TRACE_MASK_READER 0 +#endif + +#if defined(MBEDTLS_MPS_TRACE_ENABLE_WRITER) +#define MBEDTLS_MPS_TRACE_MASK_WRITER (1u << MBEDTLS_MPS_TRACE_BIT_WRITER) +#else +#define MBEDTLS_MPS_TRACE_MASK_WRITER 0 +#endif + +#define MBEDTLS_MPS_TRACE_MASK (MBEDTLS_MPS_TRACE_MASK_LAYER_1 | \ + MBEDTLS_MPS_TRACE_MASK_LAYER_2 | \ + MBEDTLS_MPS_TRACE_MASK_LAYER_3 | \ + MBEDTLS_MPS_TRACE_MASK_LAYER_4 | \ + MBEDTLS_MPS_TRACE_MASK_READER | \ + MBEDTLS_MPS_TRACE_MASK_WRITER) + +/* We have to avoid globals because E-ACSL chokes on them... + * Wrap everything in stub functions. */ +int mbedtls_mps_trace_get_depth(void); +void mbedtls_mps_trace_inc_depth(void); +void mbedtls_mps_trace_dec_depth(void); + +void mbedtls_mps_trace_color(int id); +void mbedtls_mps_trace_indent(int level, mbedtls_mps_trace_type ty); + +void mbedtls_mps_trace_print_msg(int id, int line, const char *format, ...); + +#define MBEDTLS_MPS_TRACE(type, ...) \ + do { \ + if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \ + break; \ + mbedtls_mps_trace_indent(mbedtls_mps_trace_get_depth(), type); \ + mbedtls_mps_trace_color(mbedtls_mps_trace_id); \ + mbedtls_mps_trace_print_msg(mbedtls_mps_trace_id, __LINE__, __VA_ARGS__); \ + mbedtls_mps_trace_color(0); \ + } while (0) + +#define MBEDTLS_MPS_TRACE_INIT(...) \ + do { \ + if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \ + break; \ + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_CALL, __VA_ARGS__); \ + mbedtls_mps_trace_inc_depth(); \ + } while (0) + +#define MBEDTLS_MPS_TRACE_END(val) \ + do { \ + if (!(MBEDTLS_MPS_TRACE_MASK & (1u << mbedtls_mps_trace_id))) \ + break; \ + MBEDTLS_MPS_TRACE(MBEDTLS_MPS_TRACE_TYPE_RETURN, "%d (-%#04x)", \ + (int) (val), -((unsigned) (val))); \ + mbedtls_mps_trace_dec_depth(); \ + } while (0) + +#define MBEDTLS_MPS_TRACE_RETURN(val) \ + do { \ + /* Breaks tail recursion. */ \ + int ret__ = val; \ + MBEDTLS_MPS_TRACE_END(ret__); \ + return ret__; \ + } while (0) + +#else /* MBEDTLS_MPS_TRACE */ + +#define MBEDTLS_MPS_TRACE(type, ...) do { } while (0) +#define MBEDTLS_MPS_TRACE_INIT(...) do { } while (0) +#define MBEDTLS_MPS_TRACE_END do { } while (0) + +#define MBEDTLS_MPS_TRACE_RETURN(val) return val; + +#endif /* MBEDTLS_MPS_TRACE */ + +#endif /* MBEDTLS_MPS_MBEDTLS_MPS_TRACE_H */ diff --git a/ext/opcua_client/mbedtls/library/net_sockets.c b/ext/opcua_client/mbedtls/library/net_sockets.c new file mode 100644 index 0000000..730d13b --- /dev/null +++ b/ext/opcua_client/mbedtls/library/net_sockets.c @@ -0,0 +1,701 @@ +/* + * TCP/IP or UDP/IP networking functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* Enable definition of getaddrinfo() even when compiling with -std=c99. Must + * be set before config.h, which pulls in glibc's features.h indirectly. + * Harmless on other platforms. */ +#ifndef _POSIX_C_SOURCE +#define _POSIX_C_SOURCE 200112L +#endif +#ifndef _XOPEN_SOURCE +#define _XOPEN_SOURCE 600 /* sockaddr_storage */ +#endif + +#include "common.h" + +#if defined(MBEDTLS_NET_C) + +#if !defined(unix) && !defined(__unix__) && !defined(__unix) && \ + !defined(__APPLE__) && !defined(_WIN32) && !defined(__QNXNTO__) && \ + !defined(__HAIKU__) && !defined(__midipix__) +#error "This module only works on Unix and Windows, see MBEDTLS_NET_C in config.h" +#endif + +#include "mbedtls/platform.h" + +#include "mbedtls/net_sockets.h" +#include "mbedtls/error.h" + +#include + +#if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \ + !defined(EFI32) + +#define IS_EINTR(ret) ((ret) == WSAEINTR) + +#if !defined(_WIN32_WINNT) +/* Enables getaddrinfo() & Co */ +#define _WIN32_WINNT 0x0501 +#endif + +#include + +#include +#include +#if (_WIN32_WINNT < 0x0501) +#include +#endif + +#if defined(_MSC_VER) +#if defined(_WIN32_WCE) +#pragma comment( lib, "ws2.lib" ) +#else +#pragma comment( lib, "ws2_32.lib" ) +#endif +#endif /* _MSC_VER */ + +#define read(fd, buf, len) recv(fd, (char *) (buf), (int) (len), 0) +#define write(fd, buf, len) send(fd, (char *) (buf), (int) (len), 0) +#define close(fd) closesocket(fd) + +static int wsa_init_done = 0; + +#else /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define IS_EINTR(ret) ((ret) == EINTR) +#define SOCKET int + +#endif /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */ + +/* Some MS functions want int and MSVC warns if we pass size_t, + * but the standard functions use socklen_t, so cast only for MSVC */ +#if defined(_MSC_VER) +#define MSVC_INT_CAST (int) +#else +#define MSVC_INT_CAST +#endif + +#include + +#if defined(MBEDTLS_HAVE_TIME) +#include +#endif + +#include + +/* + * Prepare for using the sockets interface + */ +static int net_prepare(void) +{ +#if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \ + !defined(EFI32) + WSADATA wsaData; + + if (wsa_init_done == 0) { + if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) { + return MBEDTLS_ERR_NET_SOCKET_FAILED; + } + + wsa_init_done = 1; + } +#else +#if !defined(EFIX64) && !defined(EFI32) + signal(SIGPIPE, SIG_IGN); +#endif +#endif + return 0; +} + +/* + * Return 0 if the file descriptor is valid, an error otherwise. + * If for_select != 0, check whether the file descriptor is within the range + * allowed for fd_set used for the FD_xxx macros and the select() function. + */ +static int check_fd(int fd, int for_select) +{ + if (fd < 0) { + return MBEDTLS_ERR_NET_INVALID_CONTEXT; + } + +#if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \ + !defined(EFI32) + (void) for_select; +#else + /* A limitation of select() is that it only works with file descriptors + * that are strictly less than FD_SETSIZE. This is a limitation of the + * fd_set type. Error out early, because attempting to call FD_SET on a + * large file descriptor is a buffer overflow on typical platforms. */ + if (for_select && fd >= FD_SETSIZE) { + return MBEDTLS_ERR_NET_POLL_FAILED; + } +#endif + + return 0; +} + +/* + * Initialize a context + */ +void mbedtls_net_init(mbedtls_net_context *ctx) +{ + ctx->fd = -1; +} + +/* + * Initiate a TCP connection with host:port and the given protocol + */ +int mbedtls_net_connect(mbedtls_net_context *ctx, const char *host, + const char *port, int proto) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + struct addrinfo hints, *addr_list, *cur; + + if ((ret = net_prepare()) != 0) { + return ret; + } + + /* Do name resolution with both IPv6 and IPv4 */ + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM; + hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP; + + if (getaddrinfo(host, port, &hints, &addr_list) != 0) { + return MBEDTLS_ERR_NET_UNKNOWN_HOST; + } + + /* Try the sockaddrs until a connection succeeds */ + ret = MBEDTLS_ERR_NET_UNKNOWN_HOST; + for (cur = addr_list; cur != NULL; cur = cur->ai_next) { + ctx->fd = (int) socket(cur->ai_family, cur->ai_socktype, + cur->ai_protocol); + if (ctx->fd < 0) { + ret = MBEDTLS_ERR_NET_SOCKET_FAILED; + continue; + } + + if (connect(ctx->fd, cur->ai_addr, MSVC_INT_CAST cur->ai_addrlen) == 0) { + ret = 0; + break; + } + + mbedtls_net_close(ctx); + ret = MBEDTLS_ERR_NET_CONNECT_FAILED; + } + + freeaddrinfo(addr_list); + + return ret; +} + +/* + * Create a listening socket on bind_ip:port + */ +int mbedtls_net_bind(mbedtls_net_context *ctx, const char *bind_ip, const char *port, int proto) +{ + int n, ret; + struct addrinfo hints, *addr_list, *cur; + + if ((ret = net_prepare()) != 0) { + return ret; + } + + /* Bind to IPv6 and/or IPv4, but only in the desired protocol */ + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM; + hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP; + if (bind_ip == NULL) { + hints.ai_flags = AI_PASSIVE; + } + + if (getaddrinfo(bind_ip, port, &hints, &addr_list) != 0) { + return MBEDTLS_ERR_NET_UNKNOWN_HOST; + } + + /* Try the sockaddrs until a binding succeeds */ + ret = MBEDTLS_ERR_NET_UNKNOWN_HOST; + for (cur = addr_list; cur != NULL; cur = cur->ai_next) { + ctx->fd = (int) socket(cur->ai_family, cur->ai_socktype, + cur->ai_protocol); + if (ctx->fd < 0) { + ret = MBEDTLS_ERR_NET_SOCKET_FAILED; + continue; + } + + n = 1; + if (setsockopt(ctx->fd, SOL_SOCKET, SO_REUSEADDR, + (const char *) &n, sizeof(n)) != 0) { + mbedtls_net_close(ctx); + ret = MBEDTLS_ERR_NET_SOCKET_FAILED; + continue; + } + + if (bind(ctx->fd, cur->ai_addr, MSVC_INT_CAST cur->ai_addrlen) != 0) { + mbedtls_net_close(ctx); + ret = MBEDTLS_ERR_NET_BIND_FAILED; + continue; + } + + /* Listen only makes sense for TCP */ + if (proto == MBEDTLS_NET_PROTO_TCP) { + if (listen(ctx->fd, MBEDTLS_NET_LISTEN_BACKLOG) != 0) { + mbedtls_net_close(ctx); + ret = MBEDTLS_ERR_NET_LISTEN_FAILED; + continue; + } + } + + /* Bind was successful */ + ret = 0; + break; + } + + freeaddrinfo(addr_list); + + return ret; + +} + +#if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \ + !defined(EFI32) +/* + * Check if the requested operation would be blocking on a non-blocking socket + * and thus 'failed' with a negative return value. + */ +static int net_would_block(const mbedtls_net_context *ctx) +{ + ((void) ctx); + return WSAGetLastError() == WSAEWOULDBLOCK; +} +#else +/* + * Check if the requested operation would be blocking on a non-blocking socket + * and thus 'failed' with a negative return value. + * + * Note: on a blocking socket this function always returns 0! + */ +static int net_would_block(const mbedtls_net_context *ctx) +{ + int err = errno; + + /* + * Never return 'WOULD BLOCK' on a blocking socket + */ + if ((fcntl(ctx->fd, F_GETFL) & O_NONBLOCK) != O_NONBLOCK) { + errno = err; + return 0; + } + + switch (errno = err) { +#if defined EAGAIN + case EAGAIN: +#endif +#if defined EWOULDBLOCK && EWOULDBLOCK != EAGAIN + case EWOULDBLOCK: +#endif + return 1; + } + return 0; +} +#endif /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */ + +/* + * Accept a connection from a remote client + */ +int mbedtls_net_accept(mbedtls_net_context *bind_ctx, + mbedtls_net_context *client_ctx, + void *client_ip, size_t buf_size, size_t *cip_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + int type; + + struct sockaddr_storage client_addr; + +#if defined(__socklen_t_defined) || defined(_SOCKLEN_T) || \ + defined(_SOCKLEN_T_DECLARED) || defined(__DEFINED_socklen_t) || \ + defined(socklen_t) || (defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L) + socklen_t n = (socklen_t) sizeof(client_addr); + socklen_t type_len = (socklen_t) sizeof(type); +#else + int n = (int) sizeof(client_addr); + int type_len = (int) sizeof(type); +#endif + + /* Is this a TCP or UDP socket? */ + if (getsockopt(bind_ctx->fd, SOL_SOCKET, SO_TYPE, + (void *) &type, &type_len) != 0 || + (type != SOCK_STREAM && type != SOCK_DGRAM)) { + return MBEDTLS_ERR_NET_ACCEPT_FAILED; + } + + if (type == SOCK_STREAM) { + /* TCP: actual accept() */ + ret = client_ctx->fd = (int) accept(bind_ctx->fd, + (struct sockaddr *) &client_addr, &n); + } else { + /* UDP: wait for a message, but keep it in the queue */ + char buf[1] = { 0 }; + + ret = (int) recvfrom(bind_ctx->fd, buf, sizeof(buf), MSG_PEEK, + (struct sockaddr *) &client_addr, &n); + +#if defined(_WIN32) + if (ret == SOCKET_ERROR && + WSAGetLastError() == WSAEMSGSIZE) { + /* We know buf is too small, thanks, just peeking here */ + ret = 0; + } +#endif + } + + if (ret < 0) { + if (net_would_block(bind_ctx) != 0) { + return MBEDTLS_ERR_SSL_WANT_READ; + } + + return MBEDTLS_ERR_NET_ACCEPT_FAILED; + } + + /* UDP: hijack the listening socket to communicate with the client, + * then bind a new socket to accept new connections */ + if (type != SOCK_STREAM) { + struct sockaddr_storage local_addr; + int one = 1; + + if (connect(bind_ctx->fd, (struct sockaddr *) &client_addr, n) != 0) { + return MBEDTLS_ERR_NET_ACCEPT_FAILED; + } + + client_ctx->fd = bind_ctx->fd; + bind_ctx->fd = -1; /* In case we exit early */ + + n = sizeof(struct sockaddr_storage); + if (getsockname(client_ctx->fd, + (struct sockaddr *) &local_addr, &n) != 0 || + (bind_ctx->fd = (int) socket(local_addr.ss_family, + SOCK_DGRAM, IPPROTO_UDP)) < 0 || + setsockopt(bind_ctx->fd, SOL_SOCKET, SO_REUSEADDR, + (const char *) &one, sizeof(one)) != 0) { + return MBEDTLS_ERR_NET_SOCKET_FAILED; + } + + if (bind(bind_ctx->fd, (struct sockaddr *) &local_addr, n) != 0) { + return MBEDTLS_ERR_NET_BIND_FAILED; + } + } + + if (client_ip != NULL) { + if (client_addr.ss_family == AF_INET) { + struct sockaddr_in *addr4 = (struct sockaddr_in *) &client_addr; + *cip_len = sizeof(addr4->sin_addr.s_addr); + + if (buf_size < *cip_len) { + return MBEDTLS_ERR_NET_BUFFER_TOO_SMALL; + } + + memcpy(client_ip, &addr4->sin_addr.s_addr, *cip_len); + } else { + struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) &client_addr; + *cip_len = sizeof(addr6->sin6_addr.s6_addr); + + if (buf_size < *cip_len) { + return MBEDTLS_ERR_NET_BUFFER_TOO_SMALL; + } + + memcpy(client_ip, &addr6->sin6_addr.s6_addr, *cip_len); + } + } + + return 0; +} + +/* + * Set the socket blocking or non-blocking + */ +int mbedtls_net_set_block(mbedtls_net_context *ctx) +{ +#if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \ + !defined(EFI32) + u_long n = 0; + return ioctlsocket(ctx->fd, FIONBIO, &n); +#else + return fcntl(ctx->fd, F_SETFL, fcntl(ctx->fd, F_GETFL) & ~O_NONBLOCK); +#endif +} + +int mbedtls_net_set_nonblock(mbedtls_net_context *ctx) +{ +#if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \ + !defined(EFI32) + u_long n = 1; + return ioctlsocket(ctx->fd, FIONBIO, &n); +#else + return fcntl(ctx->fd, F_SETFL, fcntl(ctx->fd, F_GETFL) | O_NONBLOCK); +#endif +} + +/* + * Check if data is available on the socket + */ + +int mbedtls_net_poll(mbedtls_net_context *ctx, uint32_t rw, uint32_t timeout) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + struct timeval tv; + + fd_set read_fds; + fd_set write_fds; + + int fd = ctx->fd; + + ret = check_fd(fd, 1); + if (ret != 0) { + return ret; + } + +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) + /* Ensure that memory sanitizers consider read_fds and write_fds as + * initialized even on platforms such as Glibc/x86_64 where FD_ZERO + * is implemented in assembly. */ + memset(&read_fds, 0, sizeof(read_fds)); + memset(&write_fds, 0, sizeof(write_fds)); +#endif +#endif + + FD_ZERO(&read_fds); + if (rw & MBEDTLS_NET_POLL_READ) { + rw &= ~MBEDTLS_NET_POLL_READ; + FD_SET((SOCKET) fd, &read_fds); + } + + FD_ZERO(&write_fds); + if (rw & MBEDTLS_NET_POLL_WRITE) { + rw &= ~MBEDTLS_NET_POLL_WRITE; + FD_SET((SOCKET) fd, &write_fds); + } + + if (rw != 0) { + return MBEDTLS_ERR_NET_BAD_INPUT_DATA; + } + + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; + + do { + ret = select(fd + 1, &read_fds, &write_fds, NULL, + timeout == (uint32_t) -1 ? NULL : &tv); + } while (IS_EINTR(ret)); + + if (ret < 0) { + return MBEDTLS_ERR_NET_POLL_FAILED; + } + + ret = 0; + if (FD_ISSET(fd, &read_fds)) { + ret |= MBEDTLS_NET_POLL_READ; + } + if (FD_ISSET(fd, &write_fds)) { + ret |= MBEDTLS_NET_POLL_WRITE; + } + + return ret; +} + +/* + * Portable usleep helper + */ +void mbedtls_net_usleep(unsigned long usec) +{ +#if defined(_WIN32) + Sleep((usec + 999) / 1000); +#else + struct timeval tv; + tv.tv_sec = usec / 1000000; +#if (defined(__unix__) || defined(__unix) || \ + (defined(__APPLE__) && defined(__MACH__))) && !defined(__DJGPP__) + tv.tv_usec = (suseconds_t) usec % 1000000; +#else + tv.tv_usec = usec % 1000000; +#endif + select(0, NULL, NULL, NULL, &tv); +#endif +} + +/* + * Read at most 'len' characters + */ +int mbedtls_net_recv(void *ctx, unsigned char *buf, size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + int fd = ((mbedtls_net_context *) ctx)->fd; + + ret = check_fd(fd, 0); + if (ret != 0) { + return ret; + } + + ret = (int) read(fd, buf, len); + + if (ret < 0) { + if (net_would_block(ctx) != 0) { + return MBEDTLS_ERR_SSL_WANT_READ; + } + +#if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \ + !defined(EFI32) + if (WSAGetLastError() == WSAECONNRESET) { + return MBEDTLS_ERR_NET_CONN_RESET; + } +#else + if (errno == EPIPE || errno == ECONNRESET) { + return MBEDTLS_ERR_NET_CONN_RESET; + } + + if (errno == EINTR) { + return MBEDTLS_ERR_SSL_WANT_READ; + } +#endif + + return MBEDTLS_ERR_NET_RECV_FAILED; + } + + return ret; +} + +/* + * Read at most 'len' characters, blocking for at most 'timeout' ms + */ +int mbedtls_net_recv_timeout(void *ctx, unsigned char *buf, + size_t len, uint32_t timeout) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + struct timeval tv; + fd_set read_fds; + int fd = ((mbedtls_net_context *) ctx)->fd; + + ret = check_fd(fd, 1); + if (ret != 0) { + return ret; + } + + FD_ZERO(&read_fds); + FD_SET((SOCKET) fd, &read_fds); + + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; + + ret = select(fd + 1, &read_fds, NULL, NULL, timeout == 0 ? NULL : &tv); + + /* Zero fds ready means we timed out */ + if (ret == 0) { + return MBEDTLS_ERR_SSL_TIMEOUT; + } + + if (ret < 0) { +#if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \ + !defined(EFI32) + if (WSAGetLastError() == WSAEINTR) { + return MBEDTLS_ERR_SSL_WANT_READ; + } +#else + if (errno == EINTR) { + return MBEDTLS_ERR_SSL_WANT_READ; + } +#endif + + return MBEDTLS_ERR_NET_RECV_FAILED; + } + + /* This call will not block */ + return mbedtls_net_recv(ctx, buf, len); +} + +/* + * Write at most 'len' characters + */ +int mbedtls_net_send(void *ctx, const unsigned char *buf, size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + int fd = ((mbedtls_net_context *) ctx)->fd; + + ret = check_fd(fd, 0); + if (ret != 0) { + return ret; + } + + ret = (int) write(fd, buf, len); + + if (ret < 0) { + if (net_would_block(ctx) != 0) { + return MBEDTLS_ERR_SSL_WANT_WRITE; + } + +#if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \ + !defined(EFI32) + if (WSAGetLastError() == WSAECONNRESET) { + return MBEDTLS_ERR_NET_CONN_RESET; + } +#else + if (errno == EPIPE || errno == ECONNRESET) { + return MBEDTLS_ERR_NET_CONN_RESET; + } + + if (errno == EINTR) { + return MBEDTLS_ERR_SSL_WANT_WRITE; + } +#endif + + return MBEDTLS_ERR_NET_SEND_FAILED; + } + + return ret; +} + +/* + * Close the connection + */ +void mbedtls_net_close(mbedtls_net_context *ctx) +{ + if (ctx->fd == -1) { + return; + } + + close(ctx->fd); + + ctx->fd = -1; +} + +/* + * Gracefully close the connection + */ +void mbedtls_net_free(mbedtls_net_context *ctx) +{ + if (ctx->fd == -1) { + return; + } + + shutdown(ctx->fd, 2); + close(ctx->fd); + + ctx->fd = -1; +} + +#endif /* MBEDTLS_NET_C */ diff --git a/ext/opcua_client/mbedtls/library/nist_kw.c b/ext/opcua_client/mbedtls/library/nist_kw.c new file mode 100644 index 0000000..5a5b995 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/nist_kw.c @@ -0,0 +1,670 @@ +/* + * Implementation of NIST SP 800-38F key wrapping, supporting KW and KWP modes + * only + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * Definition of Key Wrapping: + * https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38F.pdf + * RFC 3394 "Advanced Encryption Standard (AES) Key Wrap Algorithm" + * RFC 5649 "Advanced Encryption Standard (AES) Key Wrap with Padding Algorithm" + * + * Note: RFC 3394 defines different methodology for intermediate operations for + * the wrapping and unwrapping operation than the definition in NIST SP 800-38F. + */ + +#include "common.h" + +#if defined(MBEDTLS_NIST_KW_C) + +#include "mbedtls/nist_kw.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" +#include "mbedtls/constant_time.h" +#include "constant_time_internal.h" + +#include +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_NIST_KW_ALT) + +#define KW_SEMIBLOCK_LENGTH 8 +#define MIN_SEMIBLOCKS_COUNT 3 + +/*! The 64-bit default integrity check value (ICV) for KW mode. */ +static const unsigned char NIST_KW_ICV1[] = { 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6 }; +/*! The 32-bit default integrity check value (ICV) for KWP mode. */ +static const unsigned char NIST_KW_ICV2[] = { 0xA6, 0x59, 0x59, 0xA6 }; + +/* + * Initialize context + */ +void mbedtls_nist_kw_init(mbedtls_nist_kw_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_nist_kw_context)); +} + +int mbedtls_nist_kw_setkey(mbedtls_nist_kw_context *ctx, + mbedtls_cipher_id_t cipher, + const unsigned char *key, + unsigned int keybits, + const int is_wrap) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const mbedtls_cipher_info_t *cipher_info; + + cipher_info = mbedtls_cipher_info_from_values(cipher, + keybits, + MBEDTLS_MODE_ECB); + if (cipher_info == NULL) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + if (cipher_info->block_size != 16) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + /* + * SP 800-38F currently defines AES cipher as the only block cipher allowed: + * "For KW and KWP, the underlying block cipher shall be approved, and the + * block size shall be 128 bits. Currently, the AES block cipher, with key + * lengths of 128, 192, or 256 bits, is the only block cipher that fits + * this profile." + * Currently we don't support other 128 bit block ciphers for key wrapping, + * such as Camellia and Aria. + */ + if (cipher != MBEDTLS_CIPHER_ID_AES) { + return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + } + + mbedtls_cipher_free(&ctx->cipher_ctx); + + if ((ret = mbedtls_cipher_setup(&ctx->cipher_ctx, cipher_info)) != 0) { + return ret; + } + + if ((ret = mbedtls_cipher_setkey(&ctx->cipher_ctx, key, keybits, + is_wrap ? MBEDTLS_ENCRYPT : + MBEDTLS_DECRYPT) + ) != 0) { + return ret; + } + + return 0; +} + +/* + * Free context + */ +void mbedtls_nist_kw_free(mbedtls_nist_kw_context *ctx) +{ + mbedtls_cipher_free(&ctx->cipher_ctx); + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_nist_kw_context)); +} + +/* + * Helper function for Xoring the uint64_t "t" with the encrypted A. + * Defined in NIST SP 800-38F section 6.1 + */ +static void calc_a_xor_t(unsigned char A[KW_SEMIBLOCK_LENGTH], uint64_t t) +{ + size_t i = 0; + for (i = 0; i < sizeof(t); i++) { + A[i] ^= (t >> ((sizeof(t) - 1 - i) * 8)) & 0xff; + } +} + +/* + * KW-AE as defined in SP 800-38F section 6.2 + * KWP-AE as defined in SP 800-38F section 6.3 + */ +int mbedtls_nist_kw_wrap(mbedtls_nist_kw_context *ctx, + mbedtls_nist_kw_mode_t mode, + const unsigned char *input, size_t in_len, + unsigned char *output, size_t *out_len, size_t out_size) +{ + int ret = 0; + size_t semiblocks = 0; + size_t s; + size_t olen, padlen = 0; + uint64_t t = 0; + unsigned char outbuff[KW_SEMIBLOCK_LENGTH * 2]; + unsigned char inbuff[KW_SEMIBLOCK_LENGTH * 2]; + + *out_len = 0; + /* + * Generate the String to work on + */ + if (mode == MBEDTLS_KW_MODE_KW) { + if (out_size < in_len + KW_SEMIBLOCK_LENGTH) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + /* + * According to SP 800-38F Table 1, the plaintext length for KW + * must be between 2 to 2^54-1 semiblocks inclusive. + */ + if (in_len < 16 || +#if SIZE_MAX > 0x1FFFFFFFFFFFFF8 + in_len > 0x1FFFFFFFFFFFFF8 || +#endif + in_len % KW_SEMIBLOCK_LENGTH != 0) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + memcpy(output, NIST_KW_ICV1, KW_SEMIBLOCK_LENGTH); + memmove(output + KW_SEMIBLOCK_LENGTH, input, in_len); + } else { + if (in_len % 8 != 0) { + padlen = (8 - (in_len % 8)); + } + + if (out_size < in_len + KW_SEMIBLOCK_LENGTH + padlen) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + /* + * According to SP 800-38F Table 1, the plaintext length for KWP + * must be between 1 and 2^32-1 octets inclusive. + */ + if (in_len < 1 +#if SIZE_MAX > 0xFFFFFFFF + || in_len > 0xFFFFFFFF +#endif + ) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + memcpy(output, NIST_KW_ICV2, KW_SEMIBLOCK_LENGTH / 2); + MBEDTLS_PUT_UINT32_BE((in_len & 0xffffffff), output, + KW_SEMIBLOCK_LENGTH / 2); + + memcpy(output + KW_SEMIBLOCK_LENGTH, input, in_len); + memset(output + KW_SEMIBLOCK_LENGTH + in_len, 0, padlen); + } + semiblocks = ((in_len + padlen) / KW_SEMIBLOCK_LENGTH) + 1; + + s = 6 * (semiblocks - 1); + + if (mode == MBEDTLS_KW_MODE_KWP + && in_len <= KW_SEMIBLOCK_LENGTH) { + memcpy(inbuff, output, 16); + ret = mbedtls_cipher_update(&ctx->cipher_ctx, + inbuff, 16, output, &olen); + if (ret != 0) { + goto cleanup; + } + } else { + unsigned char *R2 = output + KW_SEMIBLOCK_LENGTH; + unsigned char *A = output; + + /* + * Do the wrapping function W, as defined in RFC 3394 section 2.2.1 + */ + if (semiblocks < MIN_SEMIBLOCKS_COUNT) { + ret = MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + goto cleanup; + } + + /* Calculate intermediate values */ + for (t = 1; t <= s; t++) { + memcpy(inbuff, A, KW_SEMIBLOCK_LENGTH); + memcpy(inbuff + KW_SEMIBLOCK_LENGTH, R2, KW_SEMIBLOCK_LENGTH); + + ret = mbedtls_cipher_update(&ctx->cipher_ctx, + inbuff, 16, outbuff, &olen); + if (ret != 0) { + goto cleanup; + } + + memcpy(A, outbuff, KW_SEMIBLOCK_LENGTH); + calc_a_xor_t(A, t); + + memcpy(R2, outbuff + KW_SEMIBLOCK_LENGTH, KW_SEMIBLOCK_LENGTH); + R2 += KW_SEMIBLOCK_LENGTH; + if (R2 >= output + (semiblocks * KW_SEMIBLOCK_LENGTH)) { + R2 = output + KW_SEMIBLOCK_LENGTH; + } + } + } + + *out_len = semiblocks * KW_SEMIBLOCK_LENGTH; + +cleanup: + + if (ret != 0) { + memset(output, 0, semiblocks * KW_SEMIBLOCK_LENGTH); + } + mbedtls_platform_zeroize(inbuff, KW_SEMIBLOCK_LENGTH * 2); + mbedtls_platform_zeroize(outbuff, KW_SEMIBLOCK_LENGTH * 2); + + return ret; +} + +/* + * W-1 function as defined in RFC 3394 section 2.2.2 + * This function assumes the following: + * 1. Output buffer is at least of size ( semiblocks - 1 ) * KW_SEMIBLOCK_LENGTH. + * 2. The input buffer is of size semiblocks * KW_SEMIBLOCK_LENGTH. + * 3. Minimal number of semiblocks is 3. + * 4. A is a buffer to hold the first semiblock of the input buffer. + */ +static int unwrap(mbedtls_nist_kw_context *ctx, + const unsigned char *input, size_t semiblocks, + unsigned char A[KW_SEMIBLOCK_LENGTH], + unsigned char *output, size_t *out_len) +{ + int ret = 0; + const size_t s = 6 * (semiblocks - 1); + size_t olen; + uint64_t t = 0; + unsigned char outbuff[KW_SEMIBLOCK_LENGTH * 2]; + unsigned char inbuff[KW_SEMIBLOCK_LENGTH * 2]; + unsigned char *R = NULL; + *out_len = 0; + + if (semiblocks < MIN_SEMIBLOCKS_COUNT) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + memcpy(A, input, KW_SEMIBLOCK_LENGTH); + memmove(output, input + KW_SEMIBLOCK_LENGTH, (semiblocks - 1) * KW_SEMIBLOCK_LENGTH); + R = output + (semiblocks - 2) * KW_SEMIBLOCK_LENGTH; + + /* Calculate intermediate values */ + for (t = s; t >= 1; t--) { + calc_a_xor_t(A, t); + + memcpy(inbuff, A, KW_SEMIBLOCK_LENGTH); + memcpy(inbuff + KW_SEMIBLOCK_LENGTH, R, KW_SEMIBLOCK_LENGTH); + + ret = mbedtls_cipher_update(&ctx->cipher_ctx, + inbuff, 16, outbuff, &olen); + if (ret != 0) { + goto cleanup; + } + + memcpy(A, outbuff, KW_SEMIBLOCK_LENGTH); + + /* Set R as LSB64 of outbuff */ + memcpy(R, outbuff + KW_SEMIBLOCK_LENGTH, KW_SEMIBLOCK_LENGTH); + + if (R == output) { + R = output + (semiblocks - 2) * KW_SEMIBLOCK_LENGTH; + } else { + R -= KW_SEMIBLOCK_LENGTH; + } + } + + *out_len = (semiblocks - 1) * KW_SEMIBLOCK_LENGTH; + +cleanup: + if (ret != 0) { + memset(output, 0, (semiblocks - 1) * KW_SEMIBLOCK_LENGTH); + } + mbedtls_platform_zeroize(inbuff, sizeof(inbuff)); + mbedtls_platform_zeroize(outbuff, sizeof(outbuff)); + + return ret; +} + +/* + * KW-AD as defined in SP 800-38F section 6.2 + * KWP-AD as defined in SP 800-38F section 6.3 + */ +int mbedtls_nist_kw_unwrap(mbedtls_nist_kw_context *ctx, + mbedtls_nist_kw_mode_t mode, + const unsigned char *input, size_t in_len, + unsigned char *output, size_t *out_len, size_t out_size) +{ + int ret = 0; + size_t i, olen; + unsigned char A[KW_SEMIBLOCK_LENGTH]; + unsigned char diff; + + *out_len = 0; + if (out_size < in_len - KW_SEMIBLOCK_LENGTH) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + if (mode == MBEDTLS_KW_MODE_KW) { + /* + * According to SP 800-38F Table 1, the ciphertext length for KW + * must be between 3 to 2^54 semiblocks inclusive. + */ + if (in_len < 24 || +#if SIZE_MAX > 0x200000000000000 + in_len > 0x200000000000000 || +#endif + in_len % KW_SEMIBLOCK_LENGTH != 0) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + ret = unwrap(ctx, input, in_len / KW_SEMIBLOCK_LENGTH, + A, output, out_len); + if (ret != 0) { + goto cleanup; + } + + /* Check ICV in "constant-time" */ + diff = mbedtls_ct_memcmp(NIST_KW_ICV1, A, KW_SEMIBLOCK_LENGTH); + + if (diff != 0) { + ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; + goto cleanup; + } + + } else if (mode == MBEDTLS_KW_MODE_KWP) { + size_t padlen = 0; + uint32_t Plen; + /* + * According to SP 800-38F Table 1, the ciphertext length for KWP + * must be between 2 to 2^29 semiblocks inclusive. + */ + if (in_len < KW_SEMIBLOCK_LENGTH * 2 || +#if SIZE_MAX > 0x100000000 + in_len > 0x100000000 || +#endif + in_len % KW_SEMIBLOCK_LENGTH != 0) { + return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; + } + + if (in_len == KW_SEMIBLOCK_LENGTH * 2) { + unsigned char outbuff[KW_SEMIBLOCK_LENGTH * 2]; + ret = mbedtls_cipher_update(&ctx->cipher_ctx, + input, 16, outbuff, &olen); + if (ret != 0) { + goto cleanup; + } + + memcpy(A, outbuff, KW_SEMIBLOCK_LENGTH); + memcpy(output, outbuff + KW_SEMIBLOCK_LENGTH, KW_SEMIBLOCK_LENGTH); + mbedtls_platform_zeroize(outbuff, sizeof(outbuff)); + *out_len = KW_SEMIBLOCK_LENGTH; + } else { + /* in_len >= KW_SEMIBLOCK_LENGTH * 3 */ + ret = unwrap(ctx, input, in_len / KW_SEMIBLOCK_LENGTH, + A, output, out_len); + if (ret != 0) { + goto cleanup; + } + } + + /* Check ICV in "constant-time" */ + diff = mbedtls_ct_memcmp(NIST_KW_ICV2, A, KW_SEMIBLOCK_LENGTH / 2); + + if (diff != 0) { + ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; + } + + Plen = MBEDTLS_GET_UINT32_BE(A, KW_SEMIBLOCK_LENGTH / 2); + + /* + * Plen is the length of the plaintext, when the input is valid. + * If Plen is larger than the plaintext and padding, padlen will be + * larger than 8, because of the type wrap around. + */ + padlen = in_len - KW_SEMIBLOCK_LENGTH - Plen; + ret = -(int) mbedtls_ct_uint_if(padlen & ~7, -MBEDTLS_ERR_CIPHER_AUTH_FAILED, -ret); + padlen &= 7; + + /* Check padding in "constant-time" */ + for (diff = 0, i = 0; i < KW_SEMIBLOCK_LENGTH; i++) { + size_t mask = mbedtls_ct_size_mask_ge(i, KW_SEMIBLOCK_LENGTH - padlen); + diff |= (unsigned char) (mask & output[*out_len - KW_SEMIBLOCK_LENGTH + i]); + } + + if (diff != 0) { + ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; + } + + if (ret != 0) { + goto cleanup; + } + memset(output + Plen, 0, padlen); + *out_len = Plen; + } else { + ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; + goto cleanup; + } + +cleanup: + if (ret != 0) { + memset(output, 0, *out_len); + *out_len = 0; + } + + mbedtls_platform_zeroize(&diff, sizeof(diff)); + mbedtls_platform_zeroize(A, sizeof(A)); + + return ret; +} + +#endif /* !MBEDTLS_NIST_KW_ALT */ + +#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) + +#define KW_TESTS 3 + +/* + * Test vectors taken from NIST + * https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program/CAVP-TESTING-BLOCK-CIPHER-MODES#KW + */ +static const unsigned int key_len[KW_TESTS] = { 16, 24, 32 }; + +static const unsigned char kw_key[KW_TESTS][32] = { + { 0x75, 0x75, 0xda, 0x3a, 0x93, 0x60, 0x7c, 0xc2, + 0xbf, 0xd8, 0xce, 0xc7, 0xaa, 0xdf, 0xd9, 0xa6 }, + { 0x2d, 0x85, 0x26, 0x08, 0x1d, 0x02, 0xfb, 0x5b, + 0x85, 0xf6, 0x9a, 0xc2, 0x86, 0xec, 0xd5, 0x7d, + 0x40, 0xdf, 0x5d, 0xf3, 0x49, 0x47, 0x44, 0xd3 }, + { 0x11, 0x2a, 0xd4, 0x1b, 0x48, 0x56, 0xc7, 0x25, + 0x4a, 0x98, 0x48, 0xd3, 0x0f, 0xdd, 0x78, 0x33, + 0x5b, 0x03, 0x9a, 0x48, 0xa8, 0x96, 0x2c, 0x4d, + 0x1c, 0xb7, 0x8e, 0xab, 0xd5, 0xda, 0xd7, 0x88 } +}; + +static const unsigned char kw_msg[KW_TESTS][40] = { + { 0x42, 0x13, 0x6d, 0x3c, 0x38, 0x4a, 0x3e, 0xea, + 0xc9, 0x5a, 0x06, 0x6f, 0xd2, 0x8f, 0xed, 0x3f }, + { 0x95, 0xc1, 0x1b, 0xf5, 0x35, 0x3a, 0xfe, 0xdb, + 0x98, 0xfd, 0xd6, 0xc8, 0xca, 0x6f, 0xdb, 0x6d, + 0xa5, 0x4b, 0x74, 0xb4, 0x99, 0x0f, 0xdc, 0x45, + 0xc0, 0x9d, 0x15, 0x8f, 0x51, 0xce, 0x62, 0x9d, + 0xe2, 0xaf, 0x26, 0xe3, 0x25, 0x0e, 0x6b, 0x4c }, + { 0x1b, 0x20, 0xbf, 0x19, 0x90, 0xb0, 0x65, 0xd7, + 0x98, 0xe1, 0xb3, 0x22, 0x64, 0xad, 0x50, 0xa8, + 0x74, 0x74, 0x92, 0xba, 0x09, 0xa0, 0x4d, 0xd1 } +}; + +static const size_t kw_msg_len[KW_TESTS] = { 16, 40, 24 }; +static const size_t kw_out_len[KW_TESTS] = { 24, 48, 32 }; +static const unsigned char kw_res[KW_TESTS][48] = { + { 0x03, 0x1f, 0x6b, 0xd7, 0xe6, 0x1e, 0x64, 0x3d, + 0xf6, 0x85, 0x94, 0x81, 0x6f, 0x64, 0xca, 0xa3, + 0xf5, 0x6f, 0xab, 0xea, 0x25, 0x48, 0xf5, 0xfb }, + { 0x44, 0x3c, 0x6f, 0x15, 0x09, 0x83, 0x71, 0x91, + 0x3e, 0x5c, 0x81, 0x4c, 0xa1, 0xa0, 0x42, 0xec, + 0x68, 0x2f, 0x7b, 0x13, 0x6d, 0x24, 0x3a, 0x4d, + 0x6c, 0x42, 0x6f, 0xc6, 0x97, 0x15, 0x63, 0xe8, + 0xa1, 0x4a, 0x55, 0x8e, 0x09, 0x64, 0x16, 0x19, + 0xbf, 0x03, 0xfc, 0xaf, 0x90, 0xb1, 0xfc, 0x2d }, + { 0xba, 0x8a, 0x25, 0x9a, 0x47, 0x1b, 0x78, 0x7d, + 0xd5, 0xd5, 0x40, 0xec, 0x25, 0xd4, 0x3d, 0x87, + 0x20, 0x0f, 0xda, 0xdc, 0x6d, 0x1f, 0x05, 0xd9, + 0x16, 0x58, 0x4f, 0xa9, 0xf6, 0xcb, 0xf5, 0x12 } +}; + +static const unsigned char kwp_key[KW_TESTS][32] = { + { 0x78, 0x65, 0xe2, 0x0f, 0x3c, 0x21, 0x65, 0x9a, + 0xb4, 0x69, 0x0b, 0x62, 0x9c, 0xdf, 0x3c, 0xc4 }, + { 0xf5, 0xf8, 0x96, 0xa3, 0xbd, 0x2f, 0x4a, 0x98, + 0x23, 0xef, 0x16, 0x2b, 0x00, 0xb8, 0x05, 0xd7, + 0xde, 0x1e, 0xa4, 0x66, 0x26, 0x96, 0xa2, 0x58 }, + { 0x95, 0xda, 0x27, 0x00, 0xca, 0x6f, 0xd9, 0xa5, + 0x25, 0x54, 0xee, 0x2a, 0x8d, 0xf1, 0x38, 0x6f, + 0x5b, 0x94, 0xa1, 0xa6, 0x0e, 0xd8, 0xa4, 0xae, + 0xf6, 0x0a, 0x8d, 0x61, 0xab, 0x5f, 0x22, 0x5a } +}; + +static const unsigned char kwp_msg[KW_TESTS][31] = { + { 0xbd, 0x68, 0x43, 0xd4, 0x20, 0x37, 0x8d, 0xc8, + 0x96 }, + { 0x6c, 0xcd, 0xd5, 0x85, 0x18, 0x40, 0x97, 0xeb, + 0xd5, 0xc3, 0xaf, 0x3e, 0x47, 0xd0, 0x2c, 0x19, + 0x14, 0x7b, 0x4d, 0x99, 0x5f, 0x96, 0x43, 0x66, + 0x91, 0x56, 0x75, 0x8c, 0x13, 0x16, 0x8f }, + { 0xd1 } +}; +static const size_t kwp_msg_len[KW_TESTS] = { 9, 31, 1 }; + +static const unsigned char kwp_res[KW_TESTS][48] = { + { 0x41, 0xec, 0xa9, 0x56, 0xd4, 0xaa, 0x04, 0x7e, + 0xb5, 0xcf, 0x4e, 0xfe, 0x65, 0x96, 0x61, 0xe7, + 0x4d, 0xb6, 0xf8, 0xc5, 0x64, 0xe2, 0x35, 0x00 }, + { 0x4e, 0x9b, 0xc2, 0xbc, 0xbc, 0x6c, 0x1e, 0x13, + 0xd3, 0x35, 0xbc, 0xc0, 0xf7, 0x73, 0x6a, 0x88, + 0xfa, 0x87, 0x53, 0x66, 0x15, 0xbb, 0x8e, 0x63, + 0x8b, 0xcc, 0x81, 0x66, 0x84, 0x68, 0x17, 0x90, + 0x67, 0xcf, 0xa9, 0x8a, 0x9d, 0x0e, 0x33, 0x26 }, + { 0x06, 0xba, 0x7a, 0xe6, 0xf3, 0x24, 0x8c, 0xfd, + 0xcf, 0x26, 0x75, 0x07, 0xfa, 0x00, 0x1b, 0xc4 } +}; +static const size_t kwp_out_len[KW_TESTS] = { 24, 40, 16 }; + +int mbedtls_nist_kw_self_test(int verbose) +{ + mbedtls_nist_kw_context ctx; + unsigned char out[48]; + size_t olen; + int i; + int ret = 0; + mbedtls_nist_kw_init(&ctx); + + for (i = 0; i < KW_TESTS; i++) { + if (verbose != 0) { + mbedtls_printf(" KW-AES-%u ", (unsigned int) key_len[i] * 8); + } + + ret = mbedtls_nist_kw_setkey(&ctx, MBEDTLS_CIPHER_ID_AES, + kw_key[i], key_len[i] * 8, 1); + if (ret != 0) { + if (verbose != 0) { + mbedtls_printf(" KW: setup failed "); + } + + goto end; + } + + ret = mbedtls_nist_kw_wrap(&ctx, MBEDTLS_KW_MODE_KW, kw_msg[i], + kw_msg_len[i], out, &olen, sizeof(out)); + if (ret != 0 || kw_out_len[i] != olen || + memcmp(out, kw_res[i], kw_out_len[i]) != 0) { + if (verbose != 0) { + mbedtls_printf("failed. "); + } + + ret = 1; + goto end; + } + + if ((ret = mbedtls_nist_kw_setkey(&ctx, MBEDTLS_CIPHER_ID_AES, + kw_key[i], key_len[i] * 8, 0)) + != 0) { + if (verbose != 0) { + mbedtls_printf(" KW: setup failed "); + } + + goto end; + } + + ret = mbedtls_nist_kw_unwrap(&ctx, MBEDTLS_KW_MODE_KW, + out, olen, out, &olen, sizeof(out)); + + if (ret != 0 || olen != kw_msg_len[i] || + memcmp(out, kw_msg[i], kw_msg_len[i]) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto end; + } + + if (verbose != 0) { + mbedtls_printf(" passed\n"); + } + } + + for (i = 0; i < KW_TESTS; i++) { + olen = sizeof(out); + if (verbose != 0) { + mbedtls_printf(" KWP-AES-%u ", (unsigned int) key_len[i] * 8); + } + + ret = mbedtls_nist_kw_setkey(&ctx, MBEDTLS_CIPHER_ID_AES, kwp_key[i], + key_len[i] * 8, 1); + if (ret != 0) { + if (verbose != 0) { + mbedtls_printf(" KWP: setup failed "); + } + + goto end; + } + ret = mbedtls_nist_kw_wrap(&ctx, MBEDTLS_KW_MODE_KWP, kwp_msg[i], + kwp_msg_len[i], out, &olen, sizeof(out)); + + if (ret != 0 || kwp_out_len[i] != olen || + memcmp(out, kwp_res[i], kwp_out_len[i]) != 0) { + if (verbose != 0) { + mbedtls_printf("failed. "); + } + + ret = 1; + goto end; + } + + if ((ret = mbedtls_nist_kw_setkey(&ctx, MBEDTLS_CIPHER_ID_AES, + kwp_key[i], key_len[i] * 8, 0)) + != 0) { + if (verbose != 0) { + mbedtls_printf(" KWP: setup failed "); + } + + goto end; + } + + ret = mbedtls_nist_kw_unwrap(&ctx, MBEDTLS_KW_MODE_KWP, out, + olen, out, &olen, sizeof(out)); + + if (ret != 0 || olen != kwp_msg_len[i] || + memcmp(out, kwp_msg[i], kwp_msg_len[i]) != 0) { + if (verbose != 0) { + mbedtls_printf("failed. "); + } + + ret = 1; + goto end; + } + + if (verbose != 0) { + mbedtls_printf(" passed\n"); + } + } +end: + mbedtls_nist_kw_free(&ctx); + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ + +#endif /* MBEDTLS_NIST_KW_C */ diff --git a/ext/opcua_client/mbedtls/library/oid.c b/ext/opcua_client/mbedtls/library/oid.c new file mode 100644 index 0000000..2868ef9 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/oid.c @@ -0,0 +1,836 @@ +/** + * \file oid.c + * + * \brief Object Identifier (OID) database + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_OID_C) + +#include "mbedtls/oid.h" +#include "mbedtls/rsa.h" +#include "mbedtls/error.h" + +#include +#include +#include + +#include "mbedtls/platform.h" + +/* + * Macro to automatically add the size of #define'd OIDs + */ +#define ADD_LEN(s) s, MBEDTLS_OID_SIZE(s) + +/* + * Macro to generate an internal function for oid_XXX_from_asn1() (used by + * the other functions) + */ +#define FN_OID_TYPED_FROM_ASN1(TYPE_T, NAME, LIST) \ + static const TYPE_T *oid_ ## NAME ## _from_asn1( \ + const mbedtls_asn1_buf *oid) \ + { \ + const TYPE_T *p = (LIST); \ + const mbedtls_oid_descriptor_t *cur = \ + (const mbedtls_oid_descriptor_t *) p; \ + if (p == NULL || oid == NULL) return NULL; \ + while (cur->asn1 != NULL) { \ + if (cur->asn1_len == oid->len && \ + memcmp(cur->asn1, oid->p, oid->len) == 0) { \ + return p; \ + } \ + p++; \ + cur = (const mbedtls_oid_descriptor_t *) p; \ + } \ + return NULL; \ + } + +/* + * Macro to generate a function for retrieving a single attribute from the + * descriptor of an mbedtls_oid_descriptor_t wrapper. + */ +#define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \ + int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1) \ + { \ + const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid); \ + if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND; \ + *ATTR1 = data->descriptor.ATTR1; \ + return 0; \ + } + +/* + * Macro to generate a function for retrieving a single attribute from an + * mbedtls_oid_descriptor_t wrapper. + */ +#define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \ + int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1) \ + { \ + const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid); \ + if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND; \ + *ATTR1 = data->ATTR1; \ + return 0; \ + } + +/* + * Macro to generate a function for retrieving two attributes from an + * mbedtls_oid_descriptor_t wrapper. + */ +#define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1, \ + ATTR2_TYPE, ATTR2) \ + int FN_NAME(const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1, \ + ATTR2_TYPE * ATTR2) \ + { \ + const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1(oid); \ + if (data == NULL) return MBEDTLS_ERR_OID_NOT_FOUND; \ + *(ATTR1) = data->ATTR1; \ + *(ATTR2) = data->ATTR2; \ + return 0; \ + } + +/* + * Macro to generate a function for retrieving the OID based on a single + * attribute from a mbedtls_oid_descriptor_t wrapper. + */ +#define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1) \ + int FN_NAME(ATTR1_TYPE ATTR1, const char **oid, size_t *olen) \ + { \ + const TYPE_T *cur = (LIST); \ + while (cur->descriptor.asn1 != NULL) { \ + if (cur->ATTR1 == (ATTR1)) { \ + *oid = cur->descriptor.asn1; \ + *olen = cur->descriptor.asn1_len; \ + return 0; \ + } \ + cur++; \ + } \ + return MBEDTLS_ERR_OID_NOT_FOUND; \ + } + +/* + * Macro to generate a function for retrieving the OID based on two + * attributes from a mbedtls_oid_descriptor_t wrapper. + */ +#define FN_OID_GET_OID_BY_ATTR2(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1, \ + ATTR2_TYPE, ATTR2) \ + int FN_NAME(ATTR1_TYPE ATTR1, ATTR2_TYPE ATTR2, const char **oid, \ + size_t *olen) \ + { \ + const TYPE_T *cur = (LIST); \ + while (cur->descriptor.asn1 != NULL) { \ + if (cur->ATTR1 == (ATTR1) && cur->ATTR2 == (ATTR2)) { \ + *oid = cur->descriptor.asn1; \ + *olen = cur->descriptor.asn1_len; \ + return 0; \ + } \ + cur++; \ + } \ + return MBEDTLS_ERR_OID_NOT_FOUND; \ + } + +/* + * For X520 attribute types + */ +typedef struct { + mbedtls_oid_descriptor_t descriptor; + const char *short_name; +} oid_x520_attr_t; + +static const oid_x520_attr_t oid_x520_attr_type[] = +{ + { + { ADD_LEN(MBEDTLS_OID_AT_CN), "id-at-commonName", "Common Name" }, + "CN", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_COUNTRY), "id-at-countryName", "Country" }, + "C", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_LOCALITY), "id-at-locality", "Locality" }, + "L", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_STATE), "id-at-state", "State" }, + "ST", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_ORGANIZATION), "id-at-organizationName", "Organization" }, + "O", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_ORG_UNIT), "id-at-organizationalUnitName", "Org Unit" }, + "OU", + }, + { + { ADD_LEN(MBEDTLS_OID_PKCS9_EMAIL), "emailAddress", "E-mail address" }, + "emailAddress", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_SERIAL_NUMBER), "id-at-serialNumber", "Serial number" }, + "serialNumber", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_POSTAL_ADDRESS), "id-at-postalAddress", + "Postal address" }, + "postalAddress", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_POSTAL_CODE), "id-at-postalCode", "Postal code" }, + "postalCode", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_SUR_NAME), "id-at-surName", "Surname" }, + "SN", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_GIVEN_NAME), "id-at-givenName", "Given name" }, + "GN", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_INITIALS), "id-at-initials", "Initials" }, + "initials", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_GENERATION_QUALIFIER), "id-at-generationQualifier", + "Generation qualifier" }, + "generationQualifier", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_TITLE), "id-at-title", "Title" }, + "title", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_DN_QUALIFIER), "id-at-dnQualifier", + "Distinguished Name qualifier" }, + "dnQualifier", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_PSEUDONYM), "id-at-pseudonym", "Pseudonym" }, + "pseudonym", + }, + { + { ADD_LEN(MBEDTLS_OID_DOMAIN_COMPONENT), "id-domainComponent", + "Domain component" }, + "DC", + }, + { + { ADD_LEN(MBEDTLS_OID_AT_UNIQUE_IDENTIFIER), "id-at-uniqueIdentifier", + "Unique Identifier" }, + "uniqueIdentifier", + }, + { + { NULL, 0, NULL, NULL }, + NULL, + } +}; + +FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type) +FN_OID_GET_ATTR1(mbedtls_oid_get_attr_short_name, + oid_x520_attr_t, + x520_attr, + const char *, + short_name) + +/* + * For X509 extensions + */ +typedef struct { + mbedtls_oid_descriptor_t descriptor; + int ext_type; +} oid_x509_ext_t; + +static const oid_x509_ext_t oid_x509_ext[] = +{ + { + { ADD_LEN(MBEDTLS_OID_BASIC_CONSTRAINTS), "id-ce-basicConstraints", + "Basic Constraints" }, + MBEDTLS_OID_X509_EXT_BASIC_CONSTRAINTS, + }, + { + { ADD_LEN(MBEDTLS_OID_KEY_USAGE), "id-ce-keyUsage", "Key Usage" }, + MBEDTLS_OID_X509_EXT_KEY_USAGE, + }, + { + { ADD_LEN(MBEDTLS_OID_EXTENDED_KEY_USAGE), "id-ce-extKeyUsage", + "Extended Key Usage" }, + MBEDTLS_OID_X509_EXT_EXTENDED_KEY_USAGE, + }, + { + { ADD_LEN(MBEDTLS_OID_SUBJECT_ALT_NAME), "id-ce-subjectAltName", + "Subject Alt Name" }, + MBEDTLS_OID_X509_EXT_SUBJECT_ALT_NAME, + }, + { + { ADD_LEN(MBEDTLS_OID_NS_CERT_TYPE), "id-netscape-certtype", + "Netscape Certificate Type" }, + MBEDTLS_OID_X509_EXT_NS_CERT_TYPE, + }, + { + { ADD_LEN(MBEDTLS_OID_CERTIFICATE_POLICIES), "id-ce-certificatePolicies", + "Certificate Policies" }, + MBEDTLS_OID_X509_EXT_CERTIFICATE_POLICIES, + }, + { + { NULL, 0, NULL, NULL }, + 0, + }, +}; + +FN_OID_TYPED_FROM_ASN1(oid_x509_ext_t, x509_ext, oid_x509_ext) +FN_OID_GET_ATTR1(mbedtls_oid_get_x509_ext_type, oid_x509_ext_t, x509_ext, int, ext_type) + +static const mbedtls_oid_descriptor_t oid_ext_key_usage[] = +{ + { ADD_LEN(MBEDTLS_OID_SERVER_AUTH), "id-kp-serverAuth", + "TLS Web Server Authentication" }, + { ADD_LEN(MBEDTLS_OID_CLIENT_AUTH), "id-kp-clientAuth", + "TLS Web Client Authentication" }, + { ADD_LEN(MBEDTLS_OID_CODE_SIGNING), "id-kp-codeSigning", "Code Signing" }, + { ADD_LEN(MBEDTLS_OID_EMAIL_PROTECTION), "id-kp-emailProtection", "E-mail Protection" }, + { ADD_LEN(MBEDTLS_OID_TIME_STAMPING), "id-kp-timeStamping", "Time Stamping" }, + { ADD_LEN(MBEDTLS_OID_OCSP_SIGNING), "id-kp-OCSPSigning", "OCSP Signing" }, + { ADD_LEN(MBEDTLS_OID_WISUN_FAN), "id-kp-wisun-fan-device", + "Wi-SUN Alliance Field Area Network (FAN)" }, + { NULL, 0, NULL, NULL }, +}; + +FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, ext_key_usage, oid_ext_key_usage) +FN_OID_GET_ATTR1(mbedtls_oid_get_extended_key_usage, + mbedtls_oid_descriptor_t, + ext_key_usage, + const char *, + description) + +static const mbedtls_oid_descriptor_t oid_certificate_policies[] = +{ + { ADD_LEN(MBEDTLS_OID_ANY_POLICY), "anyPolicy", "Any Policy" }, + { NULL, 0, NULL, NULL }, +}; + +FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, certificate_policies, oid_certificate_policies) +FN_OID_GET_ATTR1(mbedtls_oid_get_certificate_policies, + mbedtls_oid_descriptor_t, + certificate_policies, + const char *, + description) + +#if defined(MBEDTLS_MD_C) +/* + * For SignatureAlgorithmIdentifier + */ +typedef struct { + mbedtls_oid_descriptor_t descriptor; + mbedtls_md_type_t md_alg; + mbedtls_pk_type_t pk_alg; +} oid_sig_alg_t; + +static const oid_sig_alg_t oid_sig_alg[] = +{ +#if defined(MBEDTLS_RSA_C) +#if defined(MBEDTLS_MD2_C) + { + { ADD_LEN(MBEDTLS_OID_PKCS1_MD2), "md2WithRSAEncryption", "RSA with MD2" }, + MBEDTLS_MD_MD2, MBEDTLS_PK_RSA, + }, +#endif /* MBEDTLS_MD2_C */ +#if defined(MBEDTLS_MD4_C) + { + { ADD_LEN(MBEDTLS_OID_PKCS1_MD4), "md4WithRSAEncryption", "RSA with MD4" }, + MBEDTLS_MD_MD4, MBEDTLS_PK_RSA, + }, +#endif /* MBEDTLS_MD4_C */ +#if defined(MBEDTLS_MD5_C) + { + { ADD_LEN(MBEDTLS_OID_PKCS1_MD5), "md5WithRSAEncryption", "RSA with MD5" }, + MBEDTLS_MD_MD5, MBEDTLS_PK_RSA, + }, +#endif /* MBEDTLS_MD5_C */ +#if defined(MBEDTLS_SHA1_C) + { + { ADD_LEN(MBEDTLS_OID_PKCS1_SHA1), "sha-1WithRSAEncryption", "RSA with SHA1" }, + MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA, + }, +#endif /* MBEDTLS_SHA1_C */ +#if defined(MBEDTLS_SHA256_C) + { + { ADD_LEN(MBEDTLS_OID_PKCS1_SHA224), "sha224WithRSAEncryption", "RSA with SHA-224" }, + MBEDTLS_MD_SHA224, MBEDTLS_PK_RSA, + }, + { + { ADD_LEN(MBEDTLS_OID_PKCS1_SHA256), "sha256WithRSAEncryption", "RSA with SHA-256" }, + MBEDTLS_MD_SHA256, MBEDTLS_PK_RSA, + }, +#endif /* MBEDTLS_SHA256_C */ +#if defined(MBEDTLS_SHA512_C) + { + { ADD_LEN(MBEDTLS_OID_PKCS1_SHA384), "sha384WithRSAEncryption", "RSA with SHA-384" }, + MBEDTLS_MD_SHA384, MBEDTLS_PK_RSA, + }, + { + { ADD_LEN(MBEDTLS_OID_PKCS1_SHA512), "sha512WithRSAEncryption", "RSA with SHA-512" }, + MBEDTLS_MD_SHA512, MBEDTLS_PK_RSA, + }, +#endif /* MBEDTLS_SHA512_C */ +#if defined(MBEDTLS_SHA1_C) + { + { ADD_LEN(MBEDTLS_OID_RSA_SHA_OBS), "sha-1WithRSAEncryption", "RSA with SHA1" }, + MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA, + }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_RSA_C */ +#if defined(MBEDTLS_ECDSA_C) +#if defined(MBEDTLS_SHA1_C) + { + { ADD_LEN(MBEDTLS_OID_ECDSA_SHA1), "ecdsa-with-SHA1", "ECDSA with SHA1" }, + MBEDTLS_MD_SHA1, MBEDTLS_PK_ECDSA, + }, +#endif /* MBEDTLS_SHA1_C */ +#if defined(MBEDTLS_SHA256_C) + { + { ADD_LEN(MBEDTLS_OID_ECDSA_SHA224), "ecdsa-with-SHA224", "ECDSA with SHA224" }, + MBEDTLS_MD_SHA224, MBEDTLS_PK_ECDSA, + }, + { + { ADD_LEN(MBEDTLS_OID_ECDSA_SHA256), "ecdsa-with-SHA256", "ECDSA with SHA256" }, + MBEDTLS_MD_SHA256, MBEDTLS_PK_ECDSA, + }, +#endif /* MBEDTLS_SHA256_C */ +#if defined(MBEDTLS_SHA512_C) + { + { ADD_LEN(MBEDTLS_OID_ECDSA_SHA384), "ecdsa-with-SHA384", "ECDSA with SHA384" }, + MBEDTLS_MD_SHA384, MBEDTLS_PK_ECDSA, + }, + { + { ADD_LEN(MBEDTLS_OID_ECDSA_SHA512), "ecdsa-with-SHA512", "ECDSA with SHA512" }, + MBEDTLS_MD_SHA512, MBEDTLS_PK_ECDSA, + }, +#endif /* MBEDTLS_SHA512_C */ +#endif /* MBEDTLS_ECDSA_C */ +#if defined(MBEDTLS_RSA_C) + { + { ADD_LEN(MBEDTLS_OID_RSASSA_PSS), "RSASSA-PSS", "RSASSA-PSS" }, + MBEDTLS_MD_NONE, MBEDTLS_PK_RSASSA_PSS, + }, +#endif /* MBEDTLS_RSA_C */ + { + { NULL, 0, NULL, NULL }, + MBEDTLS_MD_NONE, MBEDTLS_PK_NONE, + }, +}; + +FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg) +FN_OID_GET_DESCRIPTOR_ATTR1(mbedtls_oid_get_sig_alg_desc, + oid_sig_alg_t, + sig_alg, + const char *, + description) +FN_OID_GET_ATTR2(mbedtls_oid_get_sig_alg, + oid_sig_alg_t, + sig_alg, + mbedtls_md_type_t, + md_alg, + mbedtls_pk_type_t, + pk_alg) +FN_OID_GET_OID_BY_ATTR2(mbedtls_oid_get_oid_by_sig_alg, + oid_sig_alg_t, + oid_sig_alg, + mbedtls_pk_type_t, + pk_alg, + mbedtls_md_type_t, + md_alg) +#endif /* MBEDTLS_MD_C */ + +/* + * For PublicKeyInfo (PKCS1, RFC 5480) + */ +typedef struct { + mbedtls_oid_descriptor_t descriptor; + mbedtls_pk_type_t pk_alg; +} oid_pk_alg_t; + +static const oid_pk_alg_t oid_pk_alg[] = +{ + { + { ADD_LEN(MBEDTLS_OID_PKCS1_RSA), "rsaEncryption", "RSA" }, + MBEDTLS_PK_RSA, + }, + { + { ADD_LEN(MBEDTLS_OID_EC_ALG_UNRESTRICTED), "id-ecPublicKey", "Generic EC key" }, + MBEDTLS_PK_ECKEY, + }, + { + { ADD_LEN(MBEDTLS_OID_EC_ALG_ECDH), "id-ecDH", "EC key for ECDH" }, + MBEDTLS_PK_ECKEY_DH, + }, + { + { NULL, 0, NULL, NULL }, + MBEDTLS_PK_NONE, + }, +}; + +FN_OID_TYPED_FROM_ASN1(oid_pk_alg_t, pk_alg, oid_pk_alg) +FN_OID_GET_ATTR1(mbedtls_oid_get_pk_alg, oid_pk_alg_t, pk_alg, mbedtls_pk_type_t, pk_alg) +FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_pk_alg, + oid_pk_alg_t, + oid_pk_alg, + mbedtls_pk_type_t, + pk_alg) + +#if defined(MBEDTLS_ECP_C) +/* + * For namedCurve (RFC 5480) + */ +typedef struct { + mbedtls_oid_descriptor_t descriptor; + mbedtls_ecp_group_id grp_id; +} oid_ecp_grp_t; + +static const oid_ecp_grp_t oid_ecp_grp[] = +{ +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) + { + { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP192R1), "secp192r1", "secp192r1" }, + MBEDTLS_ECP_DP_SECP192R1, + }, +#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) + { + { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP224R1), "secp224r1", "secp224r1" }, + MBEDTLS_ECP_DP_SECP224R1, + }, +#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) + { + { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP256R1), "secp256r1", "secp256r1" }, + MBEDTLS_ECP_DP_SECP256R1, + }, +#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) + { + { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP384R1), "secp384r1", "secp384r1" }, + MBEDTLS_ECP_DP_SECP384R1, + }, +#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) + { + { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP521R1), "secp521r1", "secp521r1" }, + MBEDTLS_ECP_DP_SECP521R1, + }, +#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) + { + { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP192K1), "secp192k1", "secp192k1" }, + MBEDTLS_ECP_DP_SECP192K1, + }, +#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) + { + { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP224K1), "secp224k1", "secp224k1" }, + MBEDTLS_ECP_DP_SECP224K1, + }, +#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) + { + { ADD_LEN(MBEDTLS_OID_EC_GRP_SECP256K1), "secp256k1", "secp256k1" }, + MBEDTLS_ECP_DP_SECP256K1, + }, +#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) + { + { ADD_LEN(MBEDTLS_OID_EC_GRP_BP256R1), "brainpoolP256r1", "brainpool256r1" }, + MBEDTLS_ECP_DP_BP256R1, + }, +#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) + { + { ADD_LEN(MBEDTLS_OID_EC_GRP_BP384R1), "brainpoolP384r1", "brainpool384r1" }, + MBEDTLS_ECP_DP_BP384R1, + }, +#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) + { + { ADD_LEN(MBEDTLS_OID_EC_GRP_BP512R1), "brainpoolP512r1", "brainpool512r1" }, + MBEDTLS_ECP_DP_BP512R1, + }, +#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ + { + { NULL, 0, NULL, NULL }, + MBEDTLS_ECP_DP_NONE, + }, +}; + +FN_OID_TYPED_FROM_ASN1(oid_ecp_grp_t, grp_id, oid_ecp_grp) +FN_OID_GET_ATTR1(mbedtls_oid_get_ec_grp, oid_ecp_grp_t, grp_id, mbedtls_ecp_group_id, grp_id) +FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_ec_grp, + oid_ecp_grp_t, + oid_ecp_grp, + mbedtls_ecp_group_id, + grp_id) +#endif /* MBEDTLS_ECP_C */ + +#if defined(MBEDTLS_CIPHER_C) +/* + * For PKCS#5 PBES2 encryption algorithm + */ +typedef struct { + mbedtls_oid_descriptor_t descriptor; + mbedtls_cipher_type_t cipher_alg; +} oid_cipher_alg_t; + +static const oid_cipher_alg_t oid_cipher_alg[] = +{ + { + { ADD_LEN(MBEDTLS_OID_DES_CBC), "desCBC", "DES-CBC" }, + MBEDTLS_CIPHER_DES_CBC, + }, + { + { ADD_LEN(MBEDTLS_OID_DES_EDE3_CBC), "des-ede3-cbc", "DES-EDE3-CBC" }, + MBEDTLS_CIPHER_DES_EDE3_CBC, + }, + { + { NULL, 0, NULL, NULL }, + MBEDTLS_CIPHER_NONE, + }, +}; + +FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg) +FN_OID_GET_ATTR1(mbedtls_oid_get_cipher_alg, + oid_cipher_alg_t, + cipher_alg, + mbedtls_cipher_type_t, + cipher_alg) +#endif /* MBEDTLS_CIPHER_C */ + +#if defined(MBEDTLS_MD_C) +/* + * For digestAlgorithm + */ +typedef struct { + mbedtls_oid_descriptor_t descriptor; + mbedtls_md_type_t md_alg; +} oid_md_alg_t; + +static const oid_md_alg_t oid_md_alg[] = +{ +#if defined(MBEDTLS_MD2_C) + { + { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_MD2), "id-md2", "MD2" }, + MBEDTLS_MD_MD2, + }, +#endif /* MBEDTLS_MD2_C */ +#if defined(MBEDTLS_MD4_C) + { + { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_MD4), "id-md4", "MD4" }, + MBEDTLS_MD_MD4, + }, +#endif /* MBEDTLS_MD4_C */ +#if defined(MBEDTLS_MD5_C) + { + { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_MD5), "id-md5", "MD5" }, + MBEDTLS_MD_MD5, + }, +#endif /* MBEDTLS_MD5_C */ +#if defined(MBEDTLS_SHA1_C) + { + { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_SHA1), "id-sha1", "SHA-1" }, + MBEDTLS_MD_SHA1, + }, +#endif /* MBEDTLS_SHA1_C */ +#if defined(MBEDTLS_SHA256_C) + { + { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_SHA224), "id-sha224", "SHA-224" }, + MBEDTLS_MD_SHA224, + }, + { + { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_SHA256), "id-sha256", "SHA-256" }, + MBEDTLS_MD_SHA256, + }, +#endif /* MBEDTLS_SHA256_C */ +#if defined(MBEDTLS_SHA512_C) + { + { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_SHA384), "id-sha384", "SHA-384" }, + MBEDTLS_MD_SHA384, + }, + { + { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_SHA512), "id-sha512", "SHA-512" }, + MBEDTLS_MD_SHA512, + }, +#endif /* MBEDTLS_SHA512_C */ +#if defined(MBEDTLS_RIPEMD160_C) + { + { ADD_LEN(MBEDTLS_OID_DIGEST_ALG_RIPEMD160), "id-ripemd160", "RIPEMD-160" }, + MBEDTLS_MD_RIPEMD160, + }, +#endif /* MBEDTLS_RIPEMD160_C */ + { + { NULL, 0, NULL, NULL }, + MBEDTLS_MD_NONE, + }, +}; + +FN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg) +FN_OID_GET_ATTR1(mbedtls_oid_get_md_alg, oid_md_alg_t, md_alg, mbedtls_md_type_t, md_alg) +FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_md, + oid_md_alg_t, + oid_md_alg, + mbedtls_md_type_t, + md_alg) + +/* + * For HMAC digestAlgorithm + */ +typedef struct { + mbedtls_oid_descriptor_t descriptor; + mbedtls_md_type_t md_hmac; +} oid_md_hmac_t; + +static const oid_md_hmac_t oid_md_hmac[] = +{ +#if defined(MBEDTLS_SHA1_C) + { + { ADD_LEN(MBEDTLS_OID_HMAC_SHA1), "hmacSHA1", "HMAC-SHA-1" }, + MBEDTLS_MD_SHA1, + }, +#endif /* MBEDTLS_SHA1_C */ +#if defined(MBEDTLS_SHA256_C) + { + { ADD_LEN(MBEDTLS_OID_HMAC_SHA224), "hmacSHA224", "HMAC-SHA-224" }, + MBEDTLS_MD_SHA224, + }, + { + { ADD_LEN(MBEDTLS_OID_HMAC_SHA256), "hmacSHA256", "HMAC-SHA-256" }, + MBEDTLS_MD_SHA256, + }, +#endif /* MBEDTLS_SHA256_C */ +#if defined(MBEDTLS_SHA512_C) + { + { ADD_LEN(MBEDTLS_OID_HMAC_SHA384), "hmacSHA384", "HMAC-SHA-384" }, + MBEDTLS_MD_SHA384, + }, + { + { ADD_LEN(MBEDTLS_OID_HMAC_SHA512), "hmacSHA512", "HMAC-SHA-512" }, + MBEDTLS_MD_SHA512, + }, +#endif /* MBEDTLS_SHA512_C */ + { + { NULL, 0, NULL, NULL }, + MBEDTLS_MD_NONE, + }, +}; + +FN_OID_TYPED_FROM_ASN1(oid_md_hmac_t, md_hmac, oid_md_hmac) +FN_OID_GET_ATTR1(mbedtls_oid_get_md_hmac, oid_md_hmac_t, md_hmac, mbedtls_md_type_t, md_hmac) +#endif /* MBEDTLS_MD_C */ + +#if defined(MBEDTLS_PKCS12_C) +/* + * For PKCS#12 PBEs + */ +typedef struct { + mbedtls_oid_descriptor_t descriptor; + mbedtls_md_type_t md_alg; + mbedtls_cipher_type_t cipher_alg; +} oid_pkcs12_pbe_alg_t; + +static const oid_pkcs12_pbe_alg_t oid_pkcs12_pbe_alg[] = +{ + { + { ADD_LEN(MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC), "pbeWithSHAAnd3-KeyTripleDES-CBC", + "PBE with SHA1 and 3-Key 3DES" }, + MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE3_CBC, + }, + { + { ADD_LEN(MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC), "pbeWithSHAAnd2-KeyTripleDES-CBC", + "PBE with SHA1 and 2-Key 3DES" }, + MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE_CBC, + }, + { + { NULL, 0, NULL, NULL }, + MBEDTLS_MD_NONE, MBEDTLS_CIPHER_NONE, + }, +}; + +FN_OID_TYPED_FROM_ASN1(oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, oid_pkcs12_pbe_alg) +FN_OID_GET_ATTR2(mbedtls_oid_get_pkcs12_pbe_alg, + oid_pkcs12_pbe_alg_t, + pkcs12_pbe_alg, + mbedtls_md_type_t, + md_alg, + mbedtls_cipher_type_t, + cipher_alg) +#endif /* MBEDTLS_PKCS12_C */ + +/* Return the x.y.z.... style numeric string for the given OID */ +int mbedtls_oid_get_numeric_string(char *buf, size_t size, + const mbedtls_asn1_buf *oid) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + char *p = buf; + size_t n = size; + unsigned int value = 0; + + if (size > INT_MAX) { + /* Avoid overflow computing return value */ + return MBEDTLS_ERR_ASN1_INVALID_LENGTH; + } + + if (oid->len <= 0) { + /* OID must not be empty */ + return MBEDTLS_ERR_ASN1_OUT_OF_DATA; + } + + for (size_t i = 0; i < oid->len; i++) { + /* Prevent overflow in value. */ + if (value > (UINT_MAX >> 7)) { + return MBEDTLS_ERR_ASN1_INVALID_DATA; + } + if ((value == 0) && ((oid->p[i]) == 0x80)) { + /* Overlong encoding is not allowed */ + return MBEDTLS_ERR_ASN1_INVALID_DATA; + } + + value <<= 7; + value |= oid->p[i] & 0x7F; + + if (!(oid->p[i] & 0x80)) { + /* Last byte */ + if (n == size) { + int component1; + unsigned int component2; + /* First subidentifier contains first two OID components */ + if (value >= 80) { + component1 = '2'; + component2 = value - 80; + } else if (value >= 40) { + component1 = '1'; + component2 = value - 40; + } else { + component1 = '0'; + component2 = value; + } + ret = mbedtls_snprintf(p, n, "%c.%u", component1, component2); + } else { + ret = mbedtls_snprintf(p, n, ".%u", value); + } + if (ret < 2 || (size_t) ret >= n) { + return MBEDTLS_ERR_OID_BUF_TOO_SMALL; + } + n -= (size_t) ret; + p += ret; + value = 0; + } + } + + if (value != 0) { + /* Unterminated subidentifier */ + return MBEDTLS_ERR_ASN1_OUT_OF_DATA; + } + + return (int) (size - n); +} + +#endif /* MBEDTLS_OID_C */ diff --git a/ext/opcua_client/mbedtls/library/padlock.c b/ext/opcua_client/mbedtls/library/padlock.c new file mode 100644 index 0000000..0b4b610 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/padlock.c @@ -0,0 +1,154 @@ +/* + * VIA PadLock support functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * This implementation is based on the VIA PadLock Programming Guide: + * + * http://www.via.com.tw/en/downloads/whitepapers/initiatives/padlock/ + * programming_guide.pdf + */ + +#include "common.h" + +#if defined(MBEDTLS_PADLOCK_C) + +#include "mbedtls/padlock.h" + +#include + +/* *INDENT-OFF* */ +#ifndef asm +#define asm __asm +#endif +/* *INDENT-ON* */ + +#if defined(MBEDTLS_VIA_PADLOCK_HAVE_CODE) + +/* + * PadLock detection routine + */ +int mbedtls_padlock_has_support(int feature) +{ + static int flags = -1; + int ebx = 0, edx = 0; + + if (flags == -1) { + asm ("movl %%ebx, %0 \n\t" + "movl $0xC0000000, %%eax \n\t" + "cpuid \n\t" + "cmpl $0xC0000001, %%eax \n\t" + "movl $0, %%edx \n\t" + "jb 1f \n\t" + "movl $0xC0000001, %%eax \n\t" + "cpuid \n\t" + "1: \n\t" + "movl %%edx, %1 \n\t" + "movl %2, %%ebx \n\t" + : "=m" (ebx), "=m" (edx) + : "m" (ebx) + : "eax", "ecx", "edx"); + + flags = edx; + } + + return flags & feature; +} + +/* + * PadLock AES-ECB block en(de)cryption + */ +int mbedtls_padlock_xcryptecb(mbedtls_aes_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16]) +{ + int ebx = 0; + uint32_t *rk; + uint32_t *blk; + uint32_t *ctrl; + unsigned char buf[256]; + + rk = ctx->rk; + blk = MBEDTLS_PADLOCK_ALIGN16(buf); + memcpy(blk, input, 16); + + ctrl = blk + 4; + *ctrl = 0x80 | ctx->nr | ((ctx->nr + (mode^1) - 10) << 9); + + asm ("pushfl \n\t" + "popfl \n\t" + "movl %%ebx, %0 \n\t" + "movl $1, %%ecx \n\t" + "movl %2, %%edx \n\t" + "movl %3, %%ebx \n\t" + "movl %4, %%esi \n\t" + "movl %4, %%edi \n\t" + ".byte 0xf3,0x0f,0xa7,0xc8 \n\t" + "movl %1, %%ebx \n\t" + : "=m" (ebx) + : "m" (ebx), "m" (ctrl), "m" (rk), "m" (blk) + : "memory", "ecx", "edx", "esi", "edi"); + + memcpy(output, blk, 16); + + return 0; +} + +/* + * PadLock AES-CBC buffer en(de)cryption + */ +int mbedtls_padlock_xcryptcbc(mbedtls_aes_context *ctx, + int mode, + size_t length, + unsigned char iv[16], + const unsigned char *input, + unsigned char *output) +{ + int ebx = 0; + size_t count; + uint32_t *rk; + uint32_t *iw; + uint32_t *ctrl; + unsigned char buf[256]; + + if (((long) input & 15) != 0 || + ((long) output & 15) != 0) { + return MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED; + } + + rk = ctx->rk; + iw = MBEDTLS_PADLOCK_ALIGN16(buf); + memcpy(iw, iv, 16); + + ctrl = iw + 4; + *ctrl = 0x80 | ctx->nr | ((ctx->nr + (mode ^ 1) - 10) << 9); + + count = (length + 15) >> 4; + + asm ("pushfl \n\t" + "popfl \n\t" + "movl %%ebx, %0 \n\t" + "movl %2, %%ecx \n\t" + "movl %3, %%edx \n\t" + "movl %4, %%ebx \n\t" + "movl %5, %%esi \n\t" + "movl %6, %%edi \n\t" + "movl %7, %%eax \n\t" + ".byte 0xf3,0x0f,0xa7,0xd0 \n\t" + "movl %1, %%ebx \n\t" + : "=m" (ebx) + : "m" (ebx), "m" (count), "m" (ctrl), + "m" (rk), "m" (input), "m" (output), "m" (iw) + : "memory", "eax", "ecx", "edx", "esi", "edi"); + + memcpy(iv, iw, 16); + + return 0; +} + +#endif /* MBEDTLS_VIA_PADLOCK_HAVE_CODE */ + +#endif /* MBEDTLS_PADLOCK_C */ diff --git a/ext/opcua_client/mbedtls/library/pem.c b/ext/opcua_client/mbedtls/library/pem.c new file mode 100644 index 0000000..c1a47b0 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/pem.c @@ -0,0 +1,514 @@ +/* + * Privacy Enhanced Mail (PEM) decoding + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C) + +#include "mbedtls/pem.h" +#include "mbedtls/base64.h" +#include "mbedtls/des.h" +#include "mbedtls/aes.h" +#include "mbedtls/md5.h" +#include "mbedtls/cipher.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#include "mbedtls/platform.h" + +#if defined(MBEDTLS_PEM_PARSE_C) +void mbedtls_pem_init(mbedtls_pem_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_pem_context)); +} + +#if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \ + (defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C)) +/* + * Read a 16-byte hex string and convert it to binary + */ +static int pem_get_iv(const unsigned char *s, unsigned char *iv, + size_t iv_len) +{ + size_t i, j, k; + + memset(iv, 0, iv_len); + + for (i = 0; i < iv_len * 2; i++, s++) { + if (*s >= '0' && *s <= '9') { + j = *s - '0'; + } else + if (*s >= 'A' && *s <= 'F') { + j = *s - '7'; + } else + if (*s >= 'a' && *s <= 'f') { + j = *s - 'W'; + } else { + return MBEDTLS_ERR_PEM_INVALID_ENC_IV; + } + + k = ((i & 1) != 0) ? j : j << 4; + + iv[i >> 1] = (unsigned char) (iv[i >> 1] | k); + } + + return 0; +} + +static int pem_pbkdf1(unsigned char *key, size_t keylen, + unsigned char *iv, + const unsigned char *pwd, size_t pwdlen) +{ + mbedtls_md5_context md5_ctx; + unsigned char md5sum[16]; + size_t use_len; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + mbedtls_md5_init(&md5_ctx); + + /* + * key[ 0..15] = MD5(pwd || IV) + */ + if ((ret = mbedtls_md5_starts_ret(&md5_ctx)) != 0) { + goto exit; + } + if ((ret = mbedtls_md5_update_ret(&md5_ctx, pwd, pwdlen)) != 0) { + goto exit; + } + if ((ret = mbedtls_md5_update_ret(&md5_ctx, iv, 8)) != 0) { + goto exit; + } + if ((ret = mbedtls_md5_finish_ret(&md5_ctx, md5sum)) != 0) { + goto exit; + } + + if (keylen <= 16) { + memcpy(key, md5sum, keylen); + goto exit; + } + + memcpy(key, md5sum, 16); + + /* + * key[16..23] = MD5(key[ 0..15] || pwd || IV]) + */ + if ((ret = mbedtls_md5_starts_ret(&md5_ctx)) != 0) { + goto exit; + } + if ((ret = mbedtls_md5_update_ret(&md5_ctx, md5sum, 16)) != 0) { + goto exit; + } + if ((ret = mbedtls_md5_update_ret(&md5_ctx, pwd, pwdlen)) != 0) { + goto exit; + } + if ((ret = mbedtls_md5_update_ret(&md5_ctx, iv, 8)) != 0) { + goto exit; + } + if ((ret = mbedtls_md5_finish_ret(&md5_ctx, md5sum)) != 0) { + goto exit; + } + + use_len = 16; + if (keylen < 32) { + use_len = keylen - 16; + } + + memcpy(key + 16, md5sum, use_len); + +exit: + mbedtls_md5_free(&md5_ctx); + mbedtls_platform_zeroize(md5sum, 16); + + return ret; +} + +#if defined(MBEDTLS_DES_C) +/* + * Decrypt with DES-CBC, using PBKDF1 for key derivation + */ +static int pem_des_decrypt(unsigned char des_iv[8], + unsigned char *buf, size_t buflen, + const unsigned char *pwd, size_t pwdlen) +{ + mbedtls_des_context des_ctx; + unsigned char des_key[8]; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + mbedtls_des_init(&des_ctx); + + if ((ret = pem_pbkdf1(des_key, 8, des_iv, pwd, pwdlen)) != 0) { + goto exit; + } + + if ((ret = mbedtls_des_setkey_dec(&des_ctx, des_key)) != 0) { + goto exit; + } + ret = mbedtls_des_crypt_cbc(&des_ctx, MBEDTLS_DES_DECRYPT, buflen, + des_iv, buf, buf); + +exit: + mbedtls_des_free(&des_ctx); + mbedtls_platform_zeroize(des_key, 8); + + return ret; +} + +/* + * Decrypt with 3DES-CBC, using PBKDF1 for key derivation + */ +static int pem_des3_decrypt(unsigned char des3_iv[8], + unsigned char *buf, size_t buflen, + const unsigned char *pwd, size_t pwdlen) +{ + mbedtls_des3_context des3_ctx; + unsigned char des3_key[24]; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + mbedtls_des3_init(&des3_ctx); + + if ((ret = pem_pbkdf1(des3_key, 24, des3_iv, pwd, pwdlen)) != 0) { + goto exit; + } + + if ((ret = mbedtls_des3_set3key_dec(&des3_ctx, des3_key)) != 0) { + goto exit; + } + ret = mbedtls_des3_crypt_cbc(&des3_ctx, MBEDTLS_DES_DECRYPT, buflen, + des3_iv, buf, buf); + +exit: + mbedtls_des3_free(&des3_ctx); + mbedtls_platform_zeroize(des3_key, 24); + + return ret; +} +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_AES_C) +/* + * Decrypt with AES-XXX-CBC, using PBKDF1 for key derivation + */ +static int pem_aes_decrypt(unsigned char aes_iv[16], unsigned int keylen, + unsigned char *buf, size_t buflen, + const unsigned char *pwd, size_t pwdlen) +{ + mbedtls_aes_context aes_ctx; + unsigned char aes_key[32]; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + mbedtls_aes_init(&aes_ctx); + + if ((ret = pem_pbkdf1(aes_key, keylen, aes_iv, pwd, pwdlen)) != 0) { + goto exit; + } + + if ((ret = mbedtls_aes_setkey_dec(&aes_ctx, aes_key, keylen * 8)) != 0) { + goto exit; + } + ret = mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_DECRYPT, buflen, + aes_iv, buf, buf); + +exit: + mbedtls_aes_free(&aes_ctx); + mbedtls_platform_zeroize(aes_key, keylen); + + return ret; +} +#endif /* MBEDTLS_AES_C */ + +#endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC && + ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ + +int mbedtls_pem_read_buffer(mbedtls_pem_context *ctx, const char *header, const char *footer, + const unsigned char *data, const unsigned char *pwd, + size_t pwdlen, size_t *use_len) +{ + int ret, enc; + size_t len; + unsigned char *buf; + const unsigned char *s1, *s2, *end; +#if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \ + (defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C)) + unsigned char pem_iv[16]; + mbedtls_cipher_type_t enc_alg = MBEDTLS_CIPHER_NONE; +#else + ((void) pwd); + ((void) pwdlen); +#endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC && + ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ + + if (ctx == NULL) { + return MBEDTLS_ERR_PEM_BAD_INPUT_DATA; + } + + s1 = (unsigned char *) strstr((const char *) data, header); + + if (s1 == NULL) { + return MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; + } + + s2 = (unsigned char *) strstr((const char *) data, footer); + + if (s2 == NULL || s2 <= s1) { + return MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; + } + + s1 += strlen(header); + if (*s1 == ' ') { + s1++; + } + if (*s1 == '\r') { + s1++; + } + if (*s1 == '\n') { + s1++; + } else { + return MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; + } + + end = s2; + end += strlen(footer); + if (*end == ' ') { + end++; + } + if (*end == '\r') { + end++; + } + if (*end == '\n') { + end++; + } + *use_len = end - data; + + enc = 0; + + if (s2 - s1 >= 22 && memcmp(s1, "Proc-Type: 4,ENCRYPTED", 22) == 0) { +#if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \ + (defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C)) + enc++; + + s1 += 22; + if (*s1 == '\r') { + s1++; + } + if (*s1 == '\n') { + s1++; + } else { + return MBEDTLS_ERR_PEM_INVALID_DATA; + } + + +#if defined(MBEDTLS_DES_C) + if (s2 - s1 >= 23 && memcmp(s1, "DEK-Info: DES-EDE3-CBC,", 23) == 0) { + enc_alg = MBEDTLS_CIPHER_DES_EDE3_CBC; + + s1 += 23; + if (s2 - s1 < 16 || pem_get_iv(s1, pem_iv, 8) != 0) { + return MBEDTLS_ERR_PEM_INVALID_ENC_IV; + } + + s1 += 16; + } else if (s2 - s1 >= 18 && memcmp(s1, "DEK-Info: DES-CBC,", 18) == 0) { + enc_alg = MBEDTLS_CIPHER_DES_CBC; + + s1 += 18; + if (s2 - s1 < 16 || pem_get_iv(s1, pem_iv, 8) != 0) { + return MBEDTLS_ERR_PEM_INVALID_ENC_IV; + } + + s1 += 16; + } +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_AES_C) + if (s2 - s1 >= 14 && memcmp(s1, "DEK-Info: AES-", 14) == 0) { + if (s2 - s1 < 22) { + return MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG; + } else if (memcmp(s1, "DEK-Info: AES-128-CBC,", 22) == 0) { + enc_alg = MBEDTLS_CIPHER_AES_128_CBC; + } else if (memcmp(s1, "DEK-Info: AES-192-CBC,", 22) == 0) { + enc_alg = MBEDTLS_CIPHER_AES_192_CBC; + } else if (memcmp(s1, "DEK-Info: AES-256-CBC,", 22) == 0) { + enc_alg = MBEDTLS_CIPHER_AES_256_CBC; + } else { + return MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG; + } + + s1 += 22; + if (s2 - s1 < 32 || pem_get_iv(s1, pem_iv, 16) != 0) { + return MBEDTLS_ERR_PEM_INVALID_ENC_IV; + } + + s1 += 32; + } +#endif /* MBEDTLS_AES_C */ + + if (enc_alg == MBEDTLS_CIPHER_NONE) { + return MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG; + } + + if (*s1 == '\r') { + s1++; + } + if (*s1 == '\n') { + s1++; + } else { + return MBEDTLS_ERR_PEM_INVALID_DATA; + } +#else + return MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE; +#endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC && + ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ + } + + if (s1 >= s2) { + return MBEDTLS_ERR_PEM_INVALID_DATA; + } + + ret = mbedtls_base64_decode(NULL, 0, &len, s1, s2 - s1); + + if (ret == MBEDTLS_ERR_BASE64_INVALID_CHARACTER) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PEM_INVALID_DATA, ret); + } + + if ((buf = mbedtls_calloc(1, len)) == NULL) { + return MBEDTLS_ERR_PEM_ALLOC_FAILED; + } + + if ((ret = mbedtls_base64_decode(buf, len, &len, s1, s2 - s1)) != 0) { + mbedtls_platform_zeroize(buf, len); + mbedtls_free(buf); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PEM_INVALID_DATA, ret); + } + + if (enc != 0) { +#if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \ + (defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C)) + if (pwd == NULL) { + mbedtls_platform_zeroize(buf, len); + mbedtls_free(buf); + return MBEDTLS_ERR_PEM_PASSWORD_REQUIRED; + } + + ret = 0; + +#if defined(MBEDTLS_DES_C) + if (enc_alg == MBEDTLS_CIPHER_DES_EDE3_CBC) { + ret = pem_des3_decrypt(pem_iv, buf, len, pwd, pwdlen); + } else if (enc_alg == MBEDTLS_CIPHER_DES_CBC) { + ret = pem_des_decrypt(pem_iv, buf, len, pwd, pwdlen); + } +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_AES_C) + if (enc_alg == MBEDTLS_CIPHER_AES_128_CBC) { + ret = pem_aes_decrypt(pem_iv, 16, buf, len, pwd, pwdlen); + } else if (enc_alg == MBEDTLS_CIPHER_AES_192_CBC) { + ret = pem_aes_decrypt(pem_iv, 24, buf, len, pwd, pwdlen); + } else if (enc_alg == MBEDTLS_CIPHER_AES_256_CBC) { + ret = pem_aes_decrypt(pem_iv, 32, buf, len, pwd, pwdlen); + } +#endif /* MBEDTLS_AES_C */ + + if (ret != 0) { + mbedtls_free(buf); + return ret; + } + + /* + * The result will be ASN.1 starting with a SEQUENCE tag, with 1 to 3 + * length bytes (allow 4 to be sure) in all known use cases. + * + * Use that as a heuristic to try to detect password mismatches. + */ + if (len <= 2 || buf[0] != 0x30 || buf[1] > 0x83) { + mbedtls_platform_zeroize(buf, len); + mbedtls_free(buf); + return MBEDTLS_ERR_PEM_PASSWORD_MISMATCH; + } +#else + mbedtls_platform_zeroize(buf, len); + mbedtls_free(buf); + return MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE; +#endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC && + ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ + } + + ctx->buf = buf; + ctx->buflen = len; + + return 0; +} + +void mbedtls_pem_free(mbedtls_pem_context *ctx) +{ + if (ctx->buf != NULL) { + mbedtls_platform_zeroize(ctx->buf, ctx->buflen); + mbedtls_free(ctx->buf); + } + mbedtls_free(ctx->info); + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_pem_context)); +} +#endif /* MBEDTLS_PEM_PARSE_C */ + +#if defined(MBEDTLS_PEM_WRITE_C) +int mbedtls_pem_write_buffer(const char *header, const char *footer, + const unsigned char *der_data, size_t der_len, + unsigned char *buf, size_t buf_len, size_t *olen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *encode_buf = NULL, *c, *p = buf; + size_t len = 0, use_len, add_len = 0; + + mbedtls_base64_encode(NULL, 0, &use_len, der_data, der_len); + add_len = strlen(header) + strlen(footer) + (use_len / 64) + 1; + + if (use_len + add_len > buf_len) { + *olen = use_len + add_len; + return MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL; + } + + if (use_len != 0 && + ((encode_buf = mbedtls_calloc(1, use_len)) == NULL)) { + return MBEDTLS_ERR_PEM_ALLOC_FAILED; + } + + if ((ret = mbedtls_base64_encode(encode_buf, use_len, &use_len, der_data, + der_len)) != 0) { + mbedtls_free(encode_buf); + return ret; + } + + memcpy(p, header, strlen(header)); + p += strlen(header); + c = encode_buf; + + while (use_len) { + len = (use_len > 64) ? 64 : use_len; + memcpy(p, c, len); + use_len -= len; + p += len; + c += len; + *p++ = '\n'; + } + + memcpy(p, footer, strlen(footer)); + p += strlen(footer); + + *p++ = '\0'; + *olen = p - buf; + + /* Clean any remaining data previously written to the buffer */ + memset(buf + *olen, 0, buf_len - *olen); + + mbedtls_free(encode_buf); + return 0; +} +#endif /* MBEDTLS_PEM_WRITE_C */ +#endif /* MBEDTLS_PEM_PARSE_C || MBEDTLS_PEM_WRITE_C */ diff --git a/ext/opcua_client/mbedtls/library/pk.c b/ext/opcua_client/mbedtls/library/pk.c new file mode 100644 index 0000000..6b5008d --- /dev/null +++ b/ext/opcua_client/mbedtls/library/pk.c @@ -0,0 +1,674 @@ +/* + * Public Key abstraction layer + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PK_C) +#include "mbedtls/pk.h" +#include "mbedtls/pk_internal.h" + +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#if defined(MBEDTLS_RSA_C) +#include "mbedtls/rsa.h" +#endif +#if defined(MBEDTLS_ECP_C) +#include "mbedtls/ecp.h" +#endif +#if defined(MBEDTLS_ECDSA_C) +#include "mbedtls/ecdsa.h" +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "mbedtls/psa_util.h" +#endif + +#include +#include + +/* Parameter validation macros based on platform_util.h */ +#define PK_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_PK_BAD_INPUT_DATA) +#define PK_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +/* + * Initialise a mbedtls_pk_context + */ +void mbedtls_pk_init(mbedtls_pk_context *ctx) +{ + PK_VALIDATE(ctx != NULL); + + ctx->pk_info = NULL; + ctx->pk_ctx = NULL; +} + +/* + * Free (the components of) a mbedtls_pk_context + */ +void mbedtls_pk_free(mbedtls_pk_context *ctx) +{ + if (ctx == NULL) { + return; + } + + if (ctx->pk_info != NULL) { + ctx->pk_info->ctx_free_func(ctx->pk_ctx); + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_pk_context)); +} + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) +/* + * Initialize a restart context + */ +void mbedtls_pk_restart_init(mbedtls_pk_restart_ctx *ctx) +{ + PK_VALIDATE(ctx != NULL); + ctx->pk_info = NULL; + ctx->rs_ctx = NULL; +} + +/* + * Free the components of a restart context + */ +void mbedtls_pk_restart_free(mbedtls_pk_restart_ctx *ctx) +{ + if (ctx == NULL || ctx->pk_info == NULL || + ctx->pk_info->rs_free_func == NULL) { + return; + } + + ctx->pk_info->rs_free_func(ctx->rs_ctx); + + ctx->pk_info = NULL; + ctx->rs_ctx = NULL; +} +#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + +/* + * Get pk_info structure from type + */ +const mbedtls_pk_info_t *mbedtls_pk_info_from_type(mbedtls_pk_type_t pk_type) +{ + switch (pk_type) { +#if defined(MBEDTLS_RSA_C) + case MBEDTLS_PK_RSA: + return &mbedtls_rsa_info; +#endif +#if defined(MBEDTLS_ECP_C) + case MBEDTLS_PK_ECKEY: + return &mbedtls_eckey_info; + case MBEDTLS_PK_ECKEY_DH: + return &mbedtls_eckeydh_info; +#endif +#if defined(MBEDTLS_ECDSA_C) + case MBEDTLS_PK_ECDSA: + return &mbedtls_ecdsa_info; +#endif + /* MBEDTLS_PK_RSA_ALT omitted on purpose */ + default: + return NULL; + } +} + +/* + * Initialise context + */ +int mbedtls_pk_setup(mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info) +{ + PK_VALIDATE_RET(ctx != NULL); + if (info == NULL || ctx->pk_info != NULL) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + if ((ctx->pk_ctx = info->ctx_alloc_func()) == NULL) { + return MBEDTLS_ERR_PK_ALLOC_FAILED; + } + + ctx->pk_info = info; + + return 0; +} + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +/* + * Initialise a PSA-wrapping context + */ +int mbedtls_pk_setup_opaque(mbedtls_pk_context *ctx, + const psa_key_id_t key) +{ + const mbedtls_pk_info_t * const info = &mbedtls_pk_opaque_info; + psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + psa_key_id_t *pk_ctx; + psa_key_type_t type; + + if (ctx == NULL || ctx->pk_info != NULL) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + if (PSA_SUCCESS != psa_get_key_attributes(key, &attributes)) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + type = psa_get_key_type(&attributes); + psa_reset_key_attributes(&attributes); + + /* Current implementation of can_do() relies on this. */ + if (!PSA_KEY_TYPE_IS_ECC_KEY_PAIR(type)) { + return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE; + } + + if ((ctx->pk_ctx = info->ctx_alloc_func()) == NULL) { + return MBEDTLS_ERR_PK_ALLOC_FAILED; + } + + ctx->pk_info = info; + + pk_ctx = (psa_key_id_t *) ctx->pk_ctx; + *pk_ctx = key; + + return 0; +} +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) +/* + * Initialize an RSA-alt context + */ +int mbedtls_pk_setup_rsa_alt(mbedtls_pk_context *ctx, void *key, + mbedtls_pk_rsa_alt_decrypt_func decrypt_func, + mbedtls_pk_rsa_alt_sign_func sign_func, + mbedtls_pk_rsa_alt_key_len_func key_len_func) +{ + mbedtls_rsa_alt_context *rsa_alt; + const mbedtls_pk_info_t *info = &mbedtls_rsa_alt_info; + + PK_VALIDATE_RET(ctx != NULL); + if (ctx->pk_info != NULL) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + if ((ctx->pk_ctx = info->ctx_alloc_func()) == NULL) { + return MBEDTLS_ERR_PK_ALLOC_FAILED; + } + + ctx->pk_info = info; + + rsa_alt = (mbedtls_rsa_alt_context *) ctx->pk_ctx; + + rsa_alt->key = key; + rsa_alt->decrypt_func = decrypt_func; + rsa_alt->sign_func = sign_func; + rsa_alt->key_len_func = key_len_func; + + return 0; +} +#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ + +/* + * Tell if a PK can do the operations of the given type + */ +int mbedtls_pk_can_do(const mbedtls_pk_context *ctx, mbedtls_pk_type_t type) +{ + /* A context with null pk_info is not set up yet and can't do anything. + * For backward compatibility, also accept NULL instead of a context + * pointer. */ + if (ctx == NULL || ctx->pk_info == NULL) { + return 0; + } + + return ctx->pk_info->can_do(type); +} + +/* + * Helper for mbedtls_pk_sign and mbedtls_pk_verify + */ +static inline int pk_hashlen_helper(mbedtls_md_type_t md_alg, size_t *hash_len) +{ + const mbedtls_md_info_t *md_info; + + if (*hash_len != 0 && md_alg == MBEDTLS_MD_NONE) { + return 0; + } + + if ((md_info = mbedtls_md_info_from_type(md_alg)) == NULL) { + return -1; + } + + if (*hash_len != 0 && *hash_len != mbedtls_md_get_size(md_info)) { + return -1; + } + + *hash_len = mbedtls_md_get_size(md_info); + return 0; +} + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) +/* + * Helper to set up a restart context if needed + */ +static int pk_restart_setup(mbedtls_pk_restart_ctx *ctx, + const mbedtls_pk_info_t *info) +{ + /* Don't do anything if already set up or invalid */ + if (ctx == NULL || ctx->pk_info != NULL) { + return 0; + } + + /* Should never happen when we're called */ + if (info->rs_alloc_func == NULL || info->rs_free_func == NULL) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + if ((ctx->rs_ctx = info->rs_alloc_func()) == NULL) { + return MBEDTLS_ERR_PK_ALLOC_FAILED; + } + + ctx->pk_info = info; + + return 0; +} +#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + +/* + * Verify a signature (restartable) + */ +int mbedtls_pk_verify_restartable(mbedtls_pk_context *ctx, + mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len, + mbedtls_pk_restart_ctx *rs_ctx) +{ + PK_VALIDATE_RET(ctx != NULL); + PK_VALIDATE_RET((md_alg == MBEDTLS_MD_NONE && hash_len == 0) || + hash != NULL); + PK_VALIDATE_RET(sig != NULL); + + if (ctx->pk_info == NULL || + pk_hashlen_helper(md_alg, &hash_len) != 0) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + /* optimization: use non-restartable version if restart disabled */ + if (rs_ctx != NULL && + mbedtls_ecp_restart_is_enabled() && + ctx->pk_info->verify_rs_func != NULL) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if ((ret = pk_restart_setup(rs_ctx, ctx->pk_info)) != 0) { + return ret; + } + + ret = ctx->pk_info->verify_rs_func(ctx->pk_ctx, + md_alg, hash, hash_len, sig, sig_len, rs_ctx->rs_ctx); + + if (ret != MBEDTLS_ERR_ECP_IN_PROGRESS) { + mbedtls_pk_restart_free(rs_ctx); + } + + return ret; + } +#else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + (void) rs_ctx; +#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + + if (ctx->pk_info->verify_func == NULL) { + return MBEDTLS_ERR_PK_TYPE_MISMATCH; + } + + return ctx->pk_info->verify_func(ctx->pk_ctx, md_alg, hash, hash_len, + sig, sig_len); +} + +/* + * Verify a signature + */ +int mbedtls_pk_verify(mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len) +{ + return mbedtls_pk_verify_restartable(ctx, md_alg, hash, hash_len, + sig, sig_len, NULL); +} + +/* + * Verify a signature with options + */ +int mbedtls_pk_verify_ext(mbedtls_pk_type_t type, const void *options, + mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len) +{ + PK_VALIDATE_RET(ctx != NULL); + PK_VALIDATE_RET((md_alg == MBEDTLS_MD_NONE && hash_len == 0) || + hash != NULL); + PK_VALIDATE_RET(sig != NULL); + + if (ctx->pk_info == NULL) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + if (!mbedtls_pk_can_do(ctx, type)) { + return MBEDTLS_ERR_PK_TYPE_MISMATCH; + } + + if (type == MBEDTLS_PK_RSASSA_PSS) { +#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PKCS1_V21) + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const mbedtls_pk_rsassa_pss_options *pss_opts; + +#if SIZE_MAX > UINT_MAX + if (md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } +#endif /* SIZE_MAX > UINT_MAX */ + + if (options == NULL) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + pss_opts = (const mbedtls_pk_rsassa_pss_options *) options; + + if (sig_len < mbedtls_pk_get_len(ctx)) { + return MBEDTLS_ERR_RSA_VERIFY_FAILED; + } + + ret = mbedtls_rsa_rsassa_pss_verify_ext(mbedtls_pk_rsa(*ctx), + NULL, NULL, MBEDTLS_RSA_PUBLIC, + md_alg, (unsigned int) hash_len, hash, + pss_opts->mgf1_hash_id, + pss_opts->expected_salt_len, + sig); + if (ret != 0) { + return ret; + } + + if (sig_len > mbedtls_pk_get_len(ctx)) { + return MBEDTLS_ERR_PK_SIG_LEN_MISMATCH; + } + + return 0; +#else + return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE; +#endif /* MBEDTLS_RSA_C && MBEDTLS_PKCS1_V21 */ + } + + /* General case: no options */ + if (options != NULL) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + return mbedtls_pk_verify(ctx, md_alg, hash, hash_len, sig, sig_len); +} + +/* + * Make a signature (restartable) + */ +int mbedtls_pk_sign_restartable(mbedtls_pk_context *ctx, + mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + mbedtls_pk_restart_ctx *rs_ctx) +{ + PK_VALIDATE_RET(ctx != NULL); + PK_VALIDATE_RET((md_alg == MBEDTLS_MD_NONE && hash_len == 0) || + hash != NULL); + PK_VALIDATE_RET(sig != NULL); + + if (ctx->pk_info == NULL || + pk_hashlen_helper(md_alg, &hash_len) != 0) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + /* optimization: use non-restartable version if restart disabled */ + if (rs_ctx != NULL && + mbedtls_ecp_restart_is_enabled() && + ctx->pk_info->sign_rs_func != NULL) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if ((ret = pk_restart_setup(rs_ctx, ctx->pk_info)) != 0) { + return ret; + } + + ret = ctx->pk_info->sign_rs_func(ctx->pk_ctx, md_alg, + hash, hash_len, sig, sig_len, f_rng, p_rng, + rs_ctx->rs_ctx); + + if (ret != MBEDTLS_ERR_ECP_IN_PROGRESS) { + mbedtls_pk_restart_free(rs_ctx); + } + + return ret; + } +#else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + (void) rs_ctx; +#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + + if (ctx->pk_info->sign_func == NULL) { + return MBEDTLS_ERR_PK_TYPE_MISMATCH; + } + + return ctx->pk_info->sign_func(ctx->pk_ctx, md_alg, hash, hash_len, + sig, sig_len, f_rng, p_rng); +} + +/* + * Make a signature + */ +int mbedtls_pk_sign(mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + return mbedtls_pk_sign_restartable(ctx, md_alg, hash, hash_len, + sig, sig_len, f_rng, p_rng, NULL); +} + +/* + * Decrypt message + */ +int mbedtls_pk_decrypt(mbedtls_pk_context *ctx, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, size_t osize, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + PK_VALIDATE_RET(ctx != NULL); + PK_VALIDATE_RET(input != NULL || ilen == 0); + PK_VALIDATE_RET(output != NULL || osize == 0); + PK_VALIDATE_RET(olen != NULL); + + if (ctx->pk_info == NULL) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + if (ctx->pk_info->decrypt_func == NULL) { + return MBEDTLS_ERR_PK_TYPE_MISMATCH; + } + + return ctx->pk_info->decrypt_func(ctx->pk_ctx, input, ilen, + output, olen, osize, f_rng, p_rng); +} + +/* + * Encrypt message + */ +int mbedtls_pk_encrypt(mbedtls_pk_context *ctx, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, size_t osize, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + PK_VALIDATE_RET(ctx != NULL); + PK_VALIDATE_RET(input != NULL || ilen == 0); + PK_VALIDATE_RET(output != NULL || osize == 0); + PK_VALIDATE_RET(olen != NULL); + + if (ctx->pk_info == NULL) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + if (ctx->pk_info->encrypt_func == NULL) { + return MBEDTLS_ERR_PK_TYPE_MISMATCH; + } + + return ctx->pk_info->encrypt_func(ctx->pk_ctx, input, ilen, + output, olen, osize, f_rng, p_rng); +} + +/* + * Check public-private key pair + */ +int mbedtls_pk_check_pair(const mbedtls_pk_context *pub, const mbedtls_pk_context *prv) +{ + PK_VALIDATE_RET(pub != NULL); + PK_VALIDATE_RET(prv != NULL); + + if (pub->pk_info == NULL || + prv->pk_info == NULL) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + if (prv->pk_info->check_pair_func == NULL) { + return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE; + } + + if (prv->pk_info->type == MBEDTLS_PK_RSA_ALT) { + if (pub->pk_info->type != MBEDTLS_PK_RSA) { + return MBEDTLS_ERR_PK_TYPE_MISMATCH; + } + } else { + if (pub->pk_info != prv->pk_info) { + return MBEDTLS_ERR_PK_TYPE_MISMATCH; + } + } + + return prv->pk_info->check_pair_func(pub->pk_ctx, prv->pk_ctx); +} + +/* + * Get key size in bits + */ +size_t mbedtls_pk_get_bitlen(const mbedtls_pk_context *ctx) +{ + /* For backward compatibility, accept NULL or a context that + * isn't set up yet, and return a fake value that should be safe. */ + if (ctx == NULL || ctx->pk_info == NULL) { + return 0; + } + + return ctx->pk_info->get_bitlen(ctx->pk_ctx); +} + +/* + * Export debug information + */ +int mbedtls_pk_debug(const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items) +{ + PK_VALIDATE_RET(ctx != NULL); + if (ctx->pk_info == NULL) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + if (ctx->pk_info->debug_func == NULL) { + return MBEDTLS_ERR_PK_TYPE_MISMATCH; + } + + ctx->pk_info->debug_func(ctx->pk_ctx, items); + return 0; +} + +/* + * Access the PK type name + */ +const char *mbedtls_pk_get_name(const mbedtls_pk_context *ctx) +{ + if (ctx == NULL || ctx->pk_info == NULL) { + return "invalid PK"; + } + + return ctx->pk_info->name; +} + +/* + * Access the PK type + */ +mbedtls_pk_type_t mbedtls_pk_get_type(const mbedtls_pk_context *ctx) +{ + if (ctx == NULL || ctx->pk_info == NULL) { + return MBEDTLS_PK_NONE; + } + + return ctx->pk_info->type; +} + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +/* + * Load the key to a PSA key slot, + * then turn the PK context into a wrapper for that key slot. + * + * Currently only works for EC private keys. + */ +int mbedtls_pk_wrap_as_opaque(mbedtls_pk_context *pk, + psa_key_id_t *key, + psa_algorithm_t hash_alg) +{ +#if !defined(MBEDTLS_ECP_C) + ((void) pk); + ((void) key); + ((void) hash_alg); + return MBEDTLS_ERR_PK_TYPE_MISMATCH; +#else + const mbedtls_ecp_keypair *ec; + unsigned char d[MBEDTLS_ECP_MAX_BYTES]; + size_t d_len; + psa_ecc_family_t curve_id; + psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + psa_key_type_t key_type; + size_t bits; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + psa_status_t status; + + /* export the private key material in the format PSA wants */ + if (mbedtls_pk_get_type(pk) != MBEDTLS_PK_ECKEY) { + return MBEDTLS_ERR_PK_TYPE_MISMATCH; + } + + ec = mbedtls_pk_ec(*pk); + d_len = (ec->grp.nbits + 7) / 8; + if ((ret = mbedtls_mpi_write_binary(&ec->d, d, d_len)) != 0) { + return ret; + } + + curve_id = mbedtls_ecc_group_to_psa(ec->grp.id, &bits); + key_type = PSA_KEY_TYPE_ECC_KEY_PAIR(curve_id); + + /* prepare the key attributes */ + psa_set_key_type(&attributes, key_type); + psa_set_key_bits(&attributes, bits); + psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH); + psa_set_key_algorithm(&attributes, PSA_ALG_ECDSA(hash_alg)); + + /* import private key into PSA */ + status = psa_import_key(&attributes, d, d_len, key); + mbedtls_platform_zeroize(d, sizeof(d)); + if (status != PSA_SUCCESS) { + return MBEDTLS_ERR_PK_HW_ACCEL_FAILED; + } + + /* make PK context wrap the key slot */ + mbedtls_pk_free(pk); + mbedtls_pk_init(pk); + + return mbedtls_pk_setup_opaque(pk, *key); +#endif /* MBEDTLS_ECP_C */ +} +#endif /* MBEDTLS_USE_PSA_CRYPTO */ +#endif /* MBEDTLS_PK_C */ diff --git a/ext/opcua_client/mbedtls/library/pk_wrap.c b/ext/opcua_client/mbedtls/library/pk_wrap.c new file mode 100644 index 0000000..dd460a6 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/pk_wrap.c @@ -0,0 +1,1093 @@ +/* + * Public Key abstraction layer: wrapper functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PK_C) +#include "mbedtls/pk_internal.h" +#include "mbedtls/error.h" + +/* Even if RSA not activated, for the sake of RSA-alt */ +#include "mbedtls/rsa.h" + +#include + +#if defined(MBEDTLS_ECP_C) +#include "mbedtls/ecp.h" +#endif + +#if defined(MBEDTLS_ECDSA_C) +#include "mbedtls/ecdsa.h" +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "mbedtls/asn1write.h" +#endif + +#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) +#include "mbedtls/platform_util.h" +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "psa/crypto.h" +#include "mbedtls/psa_util.h" +#include "mbedtls/asn1.h" +#endif + +#include "mbedtls/platform.h" + +#include +#include + +#if defined(MBEDTLS_RSA_C) +static int rsa_can_do(mbedtls_pk_type_t type) +{ + return type == MBEDTLS_PK_RSA || + type == MBEDTLS_PK_RSASSA_PSS; +} + +static size_t rsa_get_bitlen(const void *ctx) +{ + const mbedtls_rsa_context *rsa = (const mbedtls_rsa_context *) ctx; + /* Unfortunately, the rsa.h interface does not have a direct way + * to access the bit-length that works with MBEDTLS_RSA_ALT. + * So we have to do a little work here. + */ + mbedtls_mpi N; + mbedtls_mpi_init(&N); + int ret = mbedtls_rsa_export(rsa, &N, NULL, NULL, NULL, NULL); + /* If the export fails for some reason (e.g. the RSA_ALT implementation + * does not support export, or there is not enough memory), + * we have no way of returning an error from this function. + * As a fallback, return the byte-length converted in bits, which is + * the correct value if the modulus size is a multiple of 8 bits, which + * is very often the case in practice. */ + size_t bitlen = (ret == 0 ? mbedtls_mpi_bitlen(&N) : + 8 * mbedtls_rsa_get_len(rsa)); + mbedtls_mpi_free(&N); + return bitlen; +} + +static int rsa_verify_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) ctx; + size_t rsa_len = mbedtls_rsa_get_len(rsa); + +#if SIZE_MAX > UINT_MAX + if (md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } +#endif /* SIZE_MAX > UINT_MAX */ + + if (sig_len < rsa_len) { + return MBEDTLS_ERR_RSA_VERIFY_FAILED; + } + + if ((ret = mbedtls_rsa_pkcs1_verify(rsa, NULL, NULL, + MBEDTLS_RSA_PUBLIC, md_alg, + (unsigned int) hash_len, hash, sig)) != 0) { + return ret; + } + + /* The buffer contains a valid signature followed by extra data. + * We have a special error code for that so that so that callers can + * use mbedtls_pk_verify() to check "Does the buffer start with a + * valid signature?" and not just "Does the buffer contain a valid + * signature?". */ + if (sig_len > rsa_len) { + return MBEDTLS_ERR_PK_SIG_LEN_MISMATCH; + } + + return 0; +} + +static int rsa_sign_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) ctx; + +#if SIZE_MAX > UINT_MAX + if (md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } +#endif /* SIZE_MAX > UINT_MAX */ + + *sig_len = mbedtls_rsa_get_len(rsa); + + return mbedtls_rsa_pkcs1_sign(rsa, f_rng, p_rng, MBEDTLS_RSA_PRIVATE, + md_alg, (unsigned int) hash_len, hash, sig); +} + +static int rsa_decrypt_wrap(void *ctx, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, size_t osize, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) ctx; + + if (ilen != mbedtls_rsa_get_len(rsa)) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + return mbedtls_rsa_pkcs1_decrypt(rsa, f_rng, p_rng, + MBEDTLS_RSA_PRIVATE, olen, input, output, osize); +} + +static int rsa_encrypt_wrap(void *ctx, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, size_t osize, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) ctx; + *olen = mbedtls_rsa_get_len(rsa); + + if (*olen > osize) { + return MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE; + } + + return mbedtls_rsa_pkcs1_encrypt(rsa, f_rng, p_rng, MBEDTLS_RSA_PUBLIC, + ilen, input, output); +} + +static int rsa_check_pair_wrap(const void *pub, const void *prv) +{ + return mbedtls_rsa_check_pub_priv((const mbedtls_rsa_context *) pub, + (const mbedtls_rsa_context *) prv); +} + +static void *rsa_alloc_wrap(void) +{ + void *ctx = mbedtls_calloc(1, sizeof(mbedtls_rsa_context)); + + if (ctx != NULL) { + mbedtls_rsa_init((mbedtls_rsa_context *) ctx, 0, 0); + } + + return ctx; +} + +static void rsa_free_wrap(void *ctx) +{ + mbedtls_rsa_free((mbedtls_rsa_context *) ctx); + mbedtls_free(ctx); +} + +static void rsa_debug(const void *ctx, mbedtls_pk_debug_item *items) +{ + items->type = MBEDTLS_PK_DEBUG_MPI; + items->name = "rsa.N"; + items->value = &(((mbedtls_rsa_context *) ctx)->N); + + items++; + + items->type = MBEDTLS_PK_DEBUG_MPI; + items->name = "rsa.E"; + items->value = &(((mbedtls_rsa_context *) ctx)->E); +} + +const mbedtls_pk_info_t mbedtls_rsa_info = { + MBEDTLS_PK_RSA, + "RSA", + rsa_get_bitlen, + rsa_can_do, + rsa_verify_wrap, + rsa_sign_wrap, +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + NULL, + NULL, +#endif + rsa_decrypt_wrap, + rsa_encrypt_wrap, + rsa_check_pair_wrap, + rsa_alloc_wrap, + rsa_free_wrap, +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + NULL, + NULL, +#endif + rsa_debug, +}; +#endif /* MBEDTLS_RSA_C */ + +#if defined(MBEDTLS_ECP_C) +/* + * Generic EC key + */ +static int eckey_can_do(mbedtls_pk_type_t type) +{ + return type == MBEDTLS_PK_ECKEY || + type == MBEDTLS_PK_ECKEY_DH || + type == MBEDTLS_PK_ECDSA; +} + +static size_t eckey_get_bitlen(const void *ctx) +{ + return ((mbedtls_ecp_keypair *) ctx)->grp.pbits; +} + +#if defined(MBEDTLS_ECDSA_C) +/* Forward declarations */ +static int ecdsa_verify_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len); + +static int ecdsa_sign_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng); + +static int eckey_verify_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecdsa_context ecdsa; + + mbedtls_ecdsa_init(&ecdsa); + + if ((ret = mbedtls_ecdsa_from_keypair(&ecdsa, ctx)) == 0) { + ret = ecdsa_verify_wrap(&ecdsa, md_alg, hash, hash_len, sig, sig_len); + } + + mbedtls_ecdsa_free(&ecdsa); + + return ret; +} + +static int eckey_sign_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecdsa_context ecdsa; + + mbedtls_ecdsa_init(&ecdsa); + + if ((ret = mbedtls_ecdsa_from_keypair(&ecdsa, ctx)) == 0) { + ret = ecdsa_sign_wrap(&ecdsa, md_alg, hash, hash_len, sig, sig_len, + f_rng, p_rng); + } + + mbedtls_ecdsa_free(&ecdsa); + + return ret; +} + +#if defined(MBEDTLS_ECP_RESTARTABLE) +/* Forward declarations */ +static int ecdsa_verify_rs_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len, + void *rs_ctx); + +static int ecdsa_sign_rs_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + void *rs_ctx); + +/* + * Restart context for ECDSA operations with ECKEY context + * + * We need to store an actual ECDSA context, as we need to pass the same to + * the underlying ecdsa function, so we can't create it on the fly every time. + */ +typedef struct { + mbedtls_ecdsa_restart_ctx ecdsa_rs; + mbedtls_ecdsa_context ecdsa_ctx; +} eckey_restart_ctx; + +static void *eckey_rs_alloc(void) +{ + eckey_restart_ctx *rs_ctx; + + void *ctx = mbedtls_calloc(1, sizeof(eckey_restart_ctx)); + + if (ctx != NULL) { + rs_ctx = ctx; + mbedtls_ecdsa_restart_init(&rs_ctx->ecdsa_rs); + mbedtls_ecdsa_init(&rs_ctx->ecdsa_ctx); + } + + return ctx; +} + +static void eckey_rs_free(void *ctx) +{ + eckey_restart_ctx *rs_ctx; + + if (ctx == NULL) { + return; + } + + rs_ctx = ctx; + mbedtls_ecdsa_restart_free(&rs_ctx->ecdsa_rs); + mbedtls_ecdsa_free(&rs_ctx->ecdsa_ctx); + + mbedtls_free(ctx); +} + +static int eckey_verify_rs_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len, + void *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + eckey_restart_ctx *rs = rs_ctx; + + /* Should never happen */ + if (rs == NULL) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + /* set up our own sub-context if needed (that is, on first run) */ + if (rs->ecdsa_ctx.grp.pbits == 0) { + MBEDTLS_MPI_CHK(mbedtls_ecdsa_from_keypair(&rs->ecdsa_ctx, ctx)); + } + + MBEDTLS_MPI_CHK(ecdsa_verify_rs_wrap(&rs->ecdsa_ctx, + md_alg, hash, hash_len, + sig, sig_len, &rs->ecdsa_rs)); + +cleanup: + return ret; +} + +static int eckey_sign_rs_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + void *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + eckey_restart_ctx *rs = rs_ctx; + + /* Should never happen */ + if (rs == NULL) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + /* set up our own sub-context if needed (that is, on first run) */ + if (rs->ecdsa_ctx.grp.pbits == 0) { + MBEDTLS_MPI_CHK(mbedtls_ecdsa_from_keypair(&rs->ecdsa_ctx, ctx)); + } + + MBEDTLS_MPI_CHK(ecdsa_sign_rs_wrap(&rs->ecdsa_ctx, md_alg, + hash, hash_len, sig, sig_len, + f_rng, p_rng, &rs->ecdsa_rs)); + +cleanup: + return ret; +} +#endif /* MBEDTLS_ECP_RESTARTABLE */ +#endif /* MBEDTLS_ECDSA_C */ + +static int eckey_check_pair(const void *pub, const void *prv) +{ + return mbedtls_ecp_check_pub_priv((const mbedtls_ecp_keypair *) pub, + (const mbedtls_ecp_keypair *) prv); +} + +static void *eckey_alloc_wrap(void) +{ + void *ctx = mbedtls_calloc(1, sizeof(mbedtls_ecp_keypair)); + + if (ctx != NULL) { + mbedtls_ecp_keypair_init(ctx); + } + + return ctx; +} + +static void eckey_free_wrap(void *ctx) +{ + mbedtls_ecp_keypair_free((mbedtls_ecp_keypair *) ctx); + mbedtls_free(ctx); +} + +static void eckey_debug(const void *ctx, mbedtls_pk_debug_item *items) +{ + items->type = MBEDTLS_PK_DEBUG_ECP; + items->name = "eckey.Q"; + items->value = &(((mbedtls_ecp_keypair *) ctx)->Q); +} + +const mbedtls_pk_info_t mbedtls_eckey_info = { + MBEDTLS_PK_ECKEY, + "EC", + eckey_get_bitlen, + eckey_can_do, +#if defined(MBEDTLS_ECDSA_C) + eckey_verify_wrap, + eckey_sign_wrap, +#if defined(MBEDTLS_ECP_RESTARTABLE) + eckey_verify_rs_wrap, + eckey_sign_rs_wrap, +#endif +#else /* MBEDTLS_ECDSA_C */ + NULL, + NULL, +#endif /* MBEDTLS_ECDSA_C */ + NULL, + NULL, + eckey_check_pair, + eckey_alloc_wrap, + eckey_free_wrap, +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + eckey_rs_alloc, + eckey_rs_free, +#endif + eckey_debug, +}; + +/* + * EC key restricted to ECDH + */ +static int eckeydh_can_do(mbedtls_pk_type_t type) +{ + return type == MBEDTLS_PK_ECKEY || + type == MBEDTLS_PK_ECKEY_DH; +} + +const mbedtls_pk_info_t mbedtls_eckeydh_info = { + MBEDTLS_PK_ECKEY_DH, + "EC_DH", + eckey_get_bitlen, /* Same underlying key structure */ + eckeydh_can_do, + NULL, + NULL, +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + NULL, + NULL, +#endif + NULL, + NULL, + eckey_check_pair, + eckey_alloc_wrap, /* Same underlying key structure */ + eckey_free_wrap, /* Same underlying key structure */ +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + NULL, + NULL, +#endif + eckey_debug, /* Same underlying key structure */ +}; +#endif /* MBEDTLS_ECP_C */ + +#if defined(MBEDTLS_ECDSA_C) +static int ecdsa_can_do(mbedtls_pk_type_t type) +{ + return type == MBEDTLS_PK_ECDSA; +} + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +/* + * An ASN.1 encoded signature is a sequence of two ASN.1 integers. Parse one of + * those integers and convert it to the fixed-length encoding expected by PSA. + */ +static int extract_ecdsa_sig_int(unsigned char **from, const unsigned char *end, + unsigned char *to, size_t to_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t unpadded_len, padding_len; + + if ((ret = mbedtls_asn1_get_tag(from, end, &unpadded_len, + MBEDTLS_ASN1_INTEGER)) != 0) { + return ret; + } + + while (unpadded_len > 0 && **from == 0x00) { + (*from)++; + unpadded_len--; + } + + if (unpadded_len > to_len || unpadded_len == 0) { + return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH; + } + + padding_len = to_len - unpadded_len; + memset(to, 0x00, padding_len); + memcpy(to + padding_len, *from, unpadded_len); + (*from) += unpadded_len; + + return 0; +} + +/* + * Convert a signature from an ASN.1 sequence of two integers + * to a raw {r,s} buffer. Note: the provided sig buffer must be at least + * twice as big as int_size. + */ +static int extract_ecdsa_sig(unsigned char **p, const unsigned char *end, + unsigned char *sig, size_t int_size) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t tmp_size; + + if ((ret = mbedtls_asn1_get_tag(p, end, &tmp_size, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return ret; + } + + /* Extract r */ + if ((ret = extract_ecdsa_sig_int(p, end, sig, int_size)) != 0) { + return ret; + } + /* Extract s */ + if ((ret = extract_ecdsa_sig_int(p, end, sig + int_size, int_size)) != 0) { + return ret; + } + + return 0; +} + +static int ecdsa_verify_wrap(void *ctx_arg, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len) +{ + mbedtls_ecdsa_context *ctx = ctx_arg; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + psa_key_id_t key_id = 0; + psa_status_t status; + mbedtls_pk_context key; + int key_len; + /* see ECP_PUB_DER_MAX_BYTES in pkwrite.c */ + unsigned char buf[30 + 2 * MBEDTLS_ECP_MAX_BYTES]; + unsigned char *p; + mbedtls_pk_info_t pk_info = mbedtls_eckey_info; + psa_algorithm_t psa_sig_md = PSA_ALG_ECDSA_ANY; + size_t curve_bits; + psa_ecc_family_t curve = + mbedtls_ecc_group_to_psa(ctx->grp.id, &curve_bits); + const size_t signature_part_size = (ctx->grp.nbits + 7) / 8; + ((void) md_alg); + + if (curve == 0) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + /* mbedtls_pk_write_pubkey() expects a full PK context; + * re-construct one to make it happy */ + key.pk_info = &pk_info; + key.pk_ctx = ctx; + p = buf + sizeof(buf); + key_len = mbedtls_pk_write_pubkey(&p, buf, &key); + if (key_len <= 0) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + psa_set_key_type(&attributes, PSA_KEY_TYPE_ECC_PUBLIC_KEY(curve)); + psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_VERIFY_HASH); + psa_set_key_algorithm(&attributes, psa_sig_md); + + status = psa_import_key(&attributes, + buf + sizeof(buf) - key_len, key_len, + &key_id); + if (status != PSA_SUCCESS) { + ret = mbedtls_psa_err_translate_pk(status); + goto cleanup; + } + + /* We don't need the exported key anymore and can + * reuse its buffer for signature extraction. */ + if (2 * signature_part_size > sizeof(buf)) { + ret = MBEDTLS_ERR_PK_BAD_INPUT_DATA; + goto cleanup; + } + + p = (unsigned char *) sig; + if ((ret = extract_ecdsa_sig(&p, sig + sig_len, buf, + signature_part_size)) != 0) { + goto cleanup; + } + + if (psa_verify_hash(key_id, psa_sig_md, + hash, hash_len, + buf, 2 * signature_part_size) + != PSA_SUCCESS) { + ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; + goto cleanup; + } + + if (p != sig + sig_len) { + ret = MBEDTLS_ERR_PK_SIG_LEN_MISMATCH; + goto cleanup; + } + ret = 0; + +cleanup: + psa_destroy_key(key_id); + return ret; +} +#else /* MBEDTLS_USE_PSA_CRYPTO */ +static int ecdsa_verify_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + ((void) md_alg); + + ret = mbedtls_ecdsa_read_signature((mbedtls_ecdsa_context *) ctx, + hash, hash_len, sig, sig_len); + + if (ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH) { + return MBEDTLS_ERR_PK_SIG_LEN_MISMATCH; + } + + return ret; +} +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +static int ecdsa_sign_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + return mbedtls_ecdsa_write_signature((mbedtls_ecdsa_context *) ctx, + md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng); +} + +#if defined(MBEDTLS_ECP_RESTARTABLE) +static int ecdsa_verify_rs_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + const unsigned char *sig, size_t sig_len, + void *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + ((void) md_alg); + + ret = mbedtls_ecdsa_read_signature_restartable( + (mbedtls_ecdsa_context *) ctx, + hash, hash_len, sig, sig_len, + (mbedtls_ecdsa_restart_ctx *) rs_ctx); + + if (ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH) { + return MBEDTLS_ERR_PK_SIG_LEN_MISMATCH; + } + + return ret; +} + +static int ecdsa_sign_rs_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + void *rs_ctx) +{ + return mbedtls_ecdsa_write_signature_restartable( + (mbedtls_ecdsa_context *) ctx, + md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng, + (mbedtls_ecdsa_restart_ctx *) rs_ctx); + +} +#endif /* MBEDTLS_ECP_RESTARTABLE */ + +static void *ecdsa_alloc_wrap(void) +{ + void *ctx = mbedtls_calloc(1, sizeof(mbedtls_ecdsa_context)); + + if (ctx != NULL) { + mbedtls_ecdsa_init((mbedtls_ecdsa_context *) ctx); + } + + return ctx; +} + +static void ecdsa_free_wrap(void *ctx) +{ + mbedtls_ecdsa_free((mbedtls_ecdsa_context *) ctx); + mbedtls_free(ctx); +} + +#if defined(MBEDTLS_ECP_RESTARTABLE) +static void *ecdsa_rs_alloc(void) +{ + void *ctx = mbedtls_calloc(1, sizeof(mbedtls_ecdsa_restart_ctx)); + + if (ctx != NULL) { + mbedtls_ecdsa_restart_init(ctx); + } + + return ctx; +} + +static void ecdsa_rs_free(void *ctx) +{ + mbedtls_ecdsa_restart_free(ctx); + mbedtls_free(ctx); +} +#endif /* MBEDTLS_ECP_RESTARTABLE */ + +const mbedtls_pk_info_t mbedtls_ecdsa_info = { + MBEDTLS_PK_ECDSA, + "ECDSA", + eckey_get_bitlen, /* Compatible key structures */ + ecdsa_can_do, + ecdsa_verify_wrap, + ecdsa_sign_wrap, +#if defined(MBEDTLS_ECP_RESTARTABLE) + ecdsa_verify_rs_wrap, + ecdsa_sign_rs_wrap, +#endif + NULL, + NULL, + eckey_check_pair, /* Compatible key structures */ + ecdsa_alloc_wrap, + ecdsa_free_wrap, +#if defined(MBEDTLS_ECP_RESTARTABLE) + ecdsa_rs_alloc, + ecdsa_rs_free, +#endif + eckey_debug, /* Compatible key structures */ +}; +#endif /* MBEDTLS_ECDSA_C */ + +#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) +/* + * Support for alternative RSA-private implementations + */ + +static int rsa_alt_can_do(mbedtls_pk_type_t type) +{ + return type == MBEDTLS_PK_RSA; +} + +static size_t rsa_alt_get_bitlen(const void *ctx) +{ + const mbedtls_rsa_alt_context *rsa_alt = (const mbedtls_rsa_alt_context *) ctx; + + return 8 * rsa_alt->key_len_func(rsa_alt->key); +} + +static int rsa_alt_sign_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx; + +#if SIZE_MAX > UINT_MAX + if (UINT_MAX < hash_len) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } +#endif /* SIZE_MAX > UINT_MAX */ + + *sig_len = rsa_alt->key_len_func(rsa_alt->key); + if (*sig_len > MBEDTLS_PK_SIGNATURE_MAX_SIZE) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + return rsa_alt->sign_func(rsa_alt->key, f_rng, p_rng, MBEDTLS_RSA_PRIVATE, + md_alg, (unsigned int) hash_len, hash, sig); +} + +static int rsa_alt_decrypt_wrap(void *ctx, + const unsigned char *input, size_t ilen, + unsigned char *output, size_t *olen, size_t osize, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx; + + ((void) f_rng); + ((void) p_rng); + + if (ilen != rsa_alt->key_len_func(rsa_alt->key)) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + return rsa_alt->decrypt_func(rsa_alt->key, + MBEDTLS_RSA_PRIVATE, olen, input, output, osize); +} + +#if defined(MBEDTLS_RSA_C) +static int rsa_alt_check_pair(const void *pub, const void *prv) +{ + unsigned char sig[MBEDTLS_MPI_MAX_SIZE]; + unsigned char hash[32]; + size_t sig_len = 0; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (rsa_alt_get_bitlen(prv) != rsa_get_bitlen(pub)) { + return MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + } + + memset(hash, 0x2a, sizeof(hash)); + + if ((ret = rsa_alt_sign_wrap((void *) prv, MBEDTLS_MD_NONE, + hash, sizeof(hash), + sig, &sig_len, NULL, NULL)) != 0) { + return ret; + } + + if (rsa_verify_wrap((void *) pub, MBEDTLS_MD_NONE, + hash, sizeof(hash), sig, sig_len) != 0) { + return MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + } + + return 0; +} +#endif /* MBEDTLS_RSA_C */ + +static void *rsa_alt_alloc_wrap(void) +{ + void *ctx = mbedtls_calloc(1, sizeof(mbedtls_rsa_alt_context)); + + if (ctx != NULL) { + memset(ctx, 0, sizeof(mbedtls_rsa_alt_context)); + } + + return ctx; +} + +static void rsa_alt_free_wrap(void *ctx) +{ + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_rsa_alt_context)); + mbedtls_free(ctx); +} + +const mbedtls_pk_info_t mbedtls_rsa_alt_info = { + MBEDTLS_PK_RSA_ALT, + "RSA-alt", + rsa_alt_get_bitlen, + rsa_alt_can_do, + NULL, + rsa_alt_sign_wrap, +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + NULL, + NULL, +#endif + rsa_alt_decrypt_wrap, + NULL, +#if defined(MBEDTLS_RSA_C) + rsa_alt_check_pair, +#else + NULL, +#endif + rsa_alt_alloc_wrap, + rsa_alt_free_wrap, +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + NULL, + NULL, +#endif + NULL, +}; + +#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + +static void *pk_opaque_alloc_wrap(void) +{ + void *ctx = mbedtls_calloc(1, sizeof(psa_key_id_t)); + + /* no _init() function to call, as calloc() already zeroized */ + + return ctx; +} + +static void pk_opaque_free_wrap(void *ctx) +{ + mbedtls_platform_zeroize(ctx, sizeof(psa_key_id_t)); + mbedtls_free(ctx); +} + +static size_t pk_opaque_get_bitlen(const void *ctx) +{ + const psa_key_id_t *key = (const psa_key_id_t *) ctx; + size_t bits; + psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + + if (PSA_SUCCESS != psa_get_key_attributes(*key, &attributes)) { + return 0; + } + + bits = psa_get_key_bits(&attributes); + psa_reset_key_attributes(&attributes); + return bits; +} + +static int pk_opaque_can_do(mbedtls_pk_type_t type) +{ + /* For now opaque PSA keys can only wrap ECC keypairs, + * as checked by setup_psa(). + * Also, ECKEY_DH does not really make sense with the current API. */ + return type == MBEDTLS_PK_ECKEY || + type == MBEDTLS_PK_ECDSA; +} + +#if defined(MBEDTLS_ECDSA_C) + +/* + * Simultaneously convert and move raw MPI from the beginning of a buffer + * to an ASN.1 MPI at the end of the buffer. + * See also mbedtls_asn1_write_mpi(). + * + * p: pointer to the end of the output buffer + * start: start of the output buffer, and also of the mpi to write at the end + * n_len: length of the mpi to read from start + */ +static int asn1_write_mpibuf(unsigned char **p, unsigned char *start, + size_t n_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + if ((size_t) (*p - start) < n_len) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + len = n_len; + *p -= len; + memmove(*p, start, len); + + /* ASN.1 DER encoding requires minimal length, so skip leading 0s. + * Neither r nor s should be 0, but as a failsafe measure, still detect + * that rather than overflowing the buffer in case of a PSA error. */ + while (len > 0 && **p == 0x00) { + ++(*p); + --len; + } + + /* this is only reached if the signature was invalid */ + if (len == 0) { + return MBEDTLS_ERR_PK_HW_ACCEL_FAILED; + } + + /* if the msb is 1, ASN.1 requires that we prepend a 0. + * Neither r nor s can be 0, so we can assume len > 0 at all times. */ + if (**p & 0x80) { + if (*p - start < 1) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + *--(*p) = 0x00; + len += 1; + } + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, + MBEDTLS_ASN1_INTEGER)); + + return (int) len; +} + +/* Transcode signature from PSA format to ASN.1 sequence. + * See ecdsa_signature_to_asn1 in ecdsa.c, but with byte buffers instead of + * MPIs, and in-place. + * + * [in/out] sig: the signature pre- and post-transcoding + * [in/out] sig_len: signature length pre- and post-transcoding + * [int] buf_len: the available size the in/out buffer + */ +static int pk_ecdsa_sig_asn1_from_psa(unsigned char *sig, size_t *sig_len, + size_t buf_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + const size_t rs_len = *sig_len / 2; + unsigned char *p = sig + buf_len; + + MBEDTLS_ASN1_CHK_ADD(len, asn1_write_mpibuf(&p, sig + rs_len, rs_len)); + MBEDTLS_ASN1_CHK_ADD(len, asn1_write_mpibuf(&p, sig, rs_len)); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&p, sig, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(&p, sig, + MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + + memmove(sig, p, len); + *sig_len = len; + + return 0; +} + +#endif /* MBEDTLS_ECDSA_C */ + +static int pk_opaque_sign_wrap(void *ctx, mbedtls_md_type_t md_alg, + const unsigned char *hash, size_t hash_len, + unsigned char *sig, size_t *sig_len, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ +#if !defined(MBEDTLS_ECDSA_C) + ((void) ctx); + ((void) md_alg); + ((void) hash); + ((void) hash_len); + ((void) sig); + ((void) sig_len); + ((void) f_rng); + ((void) p_rng); + return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE; +#else /* !MBEDTLS_ECDSA_C */ + const psa_key_id_t *key = (const psa_key_id_t *) ctx; + psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + psa_algorithm_t alg = PSA_ALG_ECDSA(mbedtls_psa_translate_md(md_alg)); + size_t buf_len; + psa_status_t status; + + /* PSA has its own RNG */ + (void) f_rng; + (void) p_rng; + + /* PSA needs an output buffer of known size, but our API doesn't provide + * that information. Assume that the buffer is large enough for a + * maximal-length signature with that key (otherwise the application is + * buggy anyway). */ + status = psa_get_key_attributes(*key, &attributes); + if (status != PSA_SUCCESS) { + return mbedtls_psa_err_translate_pk(status); + } + buf_len = MBEDTLS_ECDSA_MAX_SIG_LEN(psa_get_key_bits(&attributes)); + psa_reset_key_attributes(&attributes); + if (buf_len > MBEDTLS_PK_SIGNATURE_MAX_SIZE) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + /* make the signature */ + status = psa_sign_hash(*key, alg, hash, hash_len, + sig, buf_len, sig_len); + if (status != PSA_SUCCESS) { + return mbedtls_psa_err_translate_pk(status); + } + + /* transcode it to ASN.1 sequence */ + return pk_ecdsa_sig_asn1_from_psa(sig, sig_len, buf_len); +#endif /* !MBEDTLS_ECDSA_C */ +} + +const mbedtls_pk_info_t mbedtls_pk_opaque_info = { + MBEDTLS_PK_OPAQUE, + "Opaque", + pk_opaque_get_bitlen, + pk_opaque_can_do, + NULL, /* verify - will be done later */ + pk_opaque_sign_wrap, +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + NULL, /* restartable verify - not relevant */ + NULL, /* restartable sign - not relevant */ +#endif + NULL, /* decrypt - will be done later */ + NULL, /* encrypt - will be done later */ + NULL, /* check_pair - could be done later or left NULL */ + pk_opaque_alloc_wrap, + pk_opaque_free_wrap, +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + NULL, /* restart alloc - not relevant */ + NULL, /* restart free - not relevant */ +#endif + NULL, /* debug - could be done later, or even left NULL */ +}; + +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#endif /* MBEDTLS_PK_C */ diff --git a/ext/opcua_client/mbedtls/library/pkcs11.c b/ext/opcua_client/mbedtls/library/pkcs11.c new file mode 100644 index 0000000..45ea4af --- /dev/null +++ b/ext/opcua_client/mbedtls/library/pkcs11.c @@ -0,0 +1,221 @@ +/** + * \file pkcs11.c + * + * \brief Wrapper for PKCS#11 library libpkcs11-helper + * + * \author Adriaan de Jong + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "mbedtls/pkcs11.h" + +#if defined(MBEDTLS_PKCS11_C) + +#include "mbedtls/md.h" +#include "mbedtls/oid.h" +#include "mbedtls/x509_crt.h" + +#include "mbedtls/platform.h" + +#include + +void mbedtls_pkcs11_init(mbedtls_pkcs11_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_pkcs11_context)); +} + +int mbedtls_pkcs11_x509_cert_bind(mbedtls_x509_crt *cert, pkcs11h_certificate_t pkcs11_cert) +{ + int ret = 1; + unsigned char *cert_blob = NULL; + size_t cert_blob_size = 0; + + if (cert == NULL) { + ret = 2; + goto cleanup; + } + + if (pkcs11h_certificate_getCertificateBlob(pkcs11_cert, NULL, + &cert_blob_size) != CKR_OK) { + ret = 3; + goto cleanup; + } + + cert_blob = mbedtls_calloc(1, cert_blob_size); + if (NULL == cert_blob) { + ret = 4; + goto cleanup; + } + + if (pkcs11h_certificate_getCertificateBlob(pkcs11_cert, cert_blob, + &cert_blob_size) != CKR_OK) { + ret = 5; + goto cleanup; + } + + if (0 != mbedtls_x509_crt_parse(cert, cert_blob, cert_blob_size)) { + ret = 6; + goto cleanup; + } + + ret = 0; + +cleanup: + if (NULL != cert_blob) { + mbedtls_free(cert_blob); + } + + return ret; +} + + +int mbedtls_pkcs11_priv_key_bind(mbedtls_pkcs11_context *priv_key, + pkcs11h_certificate_t pkcs11_cert) +{ + int ret = 1; + mbedtls_x509_crt cert; + + mbedtls_x509_crt_init(&cert); + + if (priv_key == NULL) { + goto cleanup; + } + + if (0 != mbedtls_pkcs11_x509_cert_bind(&cert, pkcs11_cert)) { + goto cleanup; + } + + priv_key->len = mbedtls_pk_get_len(&cert.pk); + priv_key->pkcs11h_cert = pkcs11_cert; + + ret = 0; + +cleanup: + mbedtls_x509_crt_free(&cert); + + return ret; +} + +void mbedtls_pkcs11_priv_key_free(mbedtls_pkcs11_context *priv_key) +{ + if (NULL != priv_key) { + pkcs11h_certificate_freeCertificate(priv_key->pkcs11h_cert); + } +} + +int mbedtls_pkcs11_decrypt(mbedtls_pkcs11_context *ctx, + int mode, size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len) +{ + size_t input_len, output_len; + + if (NULL == ctx) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if (MBEDTLS_RSA_PRIVATE != mode) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + output_len = input_len = ctx->len; + + if (input_len < 16 || input_len > output_max_len) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + /* Determine size of output buffer */ + if (pkcs11h_certificate_decryptAny(ctx->pkcs11h_cert, CKM_RSA_PKCS, input, + input_len, NULL, &output_len) != CKR_OK) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if (output_len > output_max_len) { + return MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE; + } + + if (pkcs11h_certificate_decryptAny(ctx->pkcs11h_cert, CKM_RSA_PKCS, input, + input_len, output, &output_len) != CKR_OK) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + *olen = output_len; + return 0; +} + +int mbedtls_pkcs11_sign(mbedtls_pkcs11_context *ctx, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig) +{ + size_t sig_len = 0, asn_len = 0, oid_size = 0; + unsigned char *p = sig; + const char *oid; + + if (NULL == ctx) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if (MBEDTLS_RSA_PRIVATE != mode) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if (md_alg != MBEDTLS_MD_NONE) { + const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_alg); + if (md_info == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if (mbedtls_oid_get_oid_by_md(md_alg, &oid, &oid_size) != 0) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + hashlen = mbedtls_md_get_size(md_info); + asn_len = 10 + oid_size; + } + + sig_len = ctx->len; + if (hashlen > sig_len || asn_len > sig_len || + hashlen + asn_len > sig_len) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if (md_alg != MBEDTLS_MD_NONE) { + /* + * DigestInfo ::= SEQUENCE { + * digestAlgorithm DigestAlgorithmIdentifier, + * digest Digest } + * + * DigestAlgorithmIdentifier ::= AlgorithmIdentifier + * + * Digest ::= OCTET STRING + */ + *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; + *p++ = (unsigned char) (0x08 + oid_size + hashlen); + *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; + *p++ = (unsigned char) (0x04 + oid_size); + *p++ = MBEDTLS_ASN1_OID; + *p++ = oid_size & 0xFF; + memcpy(p, oid, oid_size); + p += oid_size; + *p++ = MBEDTLS_ASN1_NULL; + *p++ = 0x00; + *p++ = MBEDTLS_ASN1_OCTET_STRING; + *p++ = hashlen; + } + + memcpy(p, hash, hashlen); + + if (pkcs11h_certificate_signAny(ctx->pkcs11h_cert, CKM_RSA_PKCS, sig, + asn_len + hashlen, sig, &sig_len) != CKR_OK) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + return 0; +} + +#endif /* defined(MBEDTLS_PKCS11_C) */ diff --git a/ext/opcua_client/mbedtls/library/pkcs12.c b/ext/opcua_client/mbedtls/library/pkcs12.c new file mode 100644 index 0000000..55de216 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/pkcs12.c @@ -0,0 +1,469 @@ +/* + * PKCS#12 Personal Information Exchange Syntax + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The PKCS #12 Personal Information Exchange Syntax Standard v1.1 + * + * http://www.rsa.com/rsalabs/pkcs/files/h11301-wp-pkcs-12v1-1-personal-information-exchange-syntax.pdf + * ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-12/pkcs-12v1-1.asn + */ + +#include "common.h" + +#if defined(MBEDTLS_PKCS12_C) + +#include "mbedtls/pkcs12.h" +#include "mbedtls/asn1.h" +#include "mbedtls/cipher.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#if defined(MBEDTLS_ARC4_C) +#include "mbedtls/arc4.h" +#endif + +#if defined(MBEDTLS_DES_C) +#include "mbedtls/des.h" +#endif + +#if defined(MBEDTLS_ASN1_PARSE_C) + +static int pkcs12_parse_pbe_params(mbedtls_asn1_buf *params, + mbedtls_asn1_buf *salt, int *iterations) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char **p = ¶ms->p; + const unsigned char *end = params->p + params->len; + + /* + * pkcs-12PbeParams ::= SEQUENCE { + * salt OCTET STRING, + * iterations INTEGER + * } + * + */ + if (params->tag != (MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG); + } + + if ((ret = mbedtls_asn1_get_tag(p, end, &salt->len, MBEDTLS_ASN1_OCTET_STRING)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT, ret); + } + + salt->p = *p; + *p += salt->len; + + if ((ret = mbedtls_asn1_get_int(p, end, iterations)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT, ret); + } + + if (*p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +#define PKCS12_MAX_PWDLEN 128 + +static int pkcs12_pbe_derive_key_iv(mbedtls_asn1_buf *pbe_params, mbedtls_md_type_t md_type, + const unsigned char *pwd, size_t pwdlen, + unsigned char *key, size_t keylen, + unsigned char *iv, size_t ivlen) +{ + int ret, iterations = 0; + mbedtls_asn1_buf salt; + size_t i; + unsigned char unipwd[PKCS12_MAX_PWDLEN * 2 + 2]; + + if (pwdlen > PKCS12_MAX_PWDLEN) { + return MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA; + } + + memset(&salt, 0, sizeof(mbedtls_asn1_buf)); + memset(&unipwd, 0, sizeof(unipwd)); + + if ((ret = pkcs12_parse_pbe_params(pbe_params, &salt, + &iterations)) != 0) { + return ret; + } + + for (i = 0; i < pwdlen; i++) { + unipwd[i * 2 + 1] = pwd[i]; + } + + if ((ret = mbedtls_pkcs12_derivation(key, keylen, unipwd, pwdlen * 2 + 2, + salt.p, salt.len, md_type, + MBEDTLS_PKCS12_DERIVE_KEY, iterations)) != 0) { + return ret; + } + + if (iv == NULL || ivlen == 0) { + return 0; + } + + if ((ret = mbedtls_pkcs12_derivation(iv, ivlen, unipwd, pwdlen * 2 + 2, + salt.p, salt.len, md_type, + MBEDTLS_PKCS12_DERIVE_IV, iterations)) != 0) { + return ret; + } + return 0; +} + +#undef PKCS12_MAX_PWDLEN + +int mbedtls_pkcs12_pbe_sha1_rc4_128(mbedtls_asn1_buf *pbe_params, int mode, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t len, + unsigned char *output) +{ +#if !defined(MBEDTLS_ARC4_C) + ((void) pbe_params); + ((void) mode); + ((void) pwd); + ((void) pwdlen); + ((void) data); + ((void) len); + ((void) output); + return MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE; +#else + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char key[16]; + mbedtls_arc4_context ctx; + ((void) mode); + + mbedtls_arc4_init(&ctx); + + if ((ret = pkcs12_pbe_derive_key_iv(pbe_params, MBEDTLS_MD_SHA1, + pwd, pwdlen, + key, 16, NULL, 0)) != 0) { + return ret; + } + + mbedtls_arc4_setup(&ctx, key, 16); + if ((ret = mbedtls_arc4_crypt(&ctx, len, data, output)) != 0) { + goto exit; + } + +exit: + mbedtls_platform_zeroize(key, sizeof(key)); + mbedtls_arc4_free(&ctx); + + return ret; +#endif /* MBEDTLS_ARC4_C */ +} + +#if !defined(MBEDTLS_CIPHER_PADDING_PKCS7) +int mbedtls_pkcs12_pbe_ext(mbedtls_asn1_buf *pbe_params, int mode, + mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t len, + unsigned char *output, size_t output_size, + size_t *output_len); +#endif + +int mbedtls_pkcs12_pbe(mbedtls_asn1_buf *pbe_params, int mode, + mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t len, + unsigned char *output) +{ + size_t output_len = 0; + + /* We assume caller of the function is providing a big enough output buffer + * so we pass output_size as SIZE_MAX to pass checks, However, no guarantees + * for the output size actually being correct. + */ + return mbedtls_pkcs12_pbe_ext(pbe_params, mode, cipher_type, md_type, + pwd, pwdlen, data, len, output, SIZE_MAX, + &output_len); +} + +int mbedtls_pkcs12_pbe_ext(mbedtls_asn1_buf *pbe_params, int mode, + mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t len, + unsigned char *output, size_t output_size, + size_t *output_len) +{ + int ret, keylen = 0; + unsigned char key[32]; + unsigned char iv[16]; + const mbedtls_cipher_info_t *cipher_info; + mbedtls_cipher_context_t cipher_ctx; + size_t finish_olen = 0; + unsigned int padlen = 0; + + if (pwd == NULL && pwdlen != 0) { + return MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA; + } + + cipher_info = mbedtls_cipher_info_from_type(cipher_type); + if (cipher_info == NULL) { + return MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE; + } + + keylen = cipher_info->key_bitlen / 8; + + if (mode == MBEDTLS_PKCS12_PBE_DECRYPT) { + if (output_size < len) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + } + + if (mode == MBEDTLS_PKCS12_PBE_ENCRYPT) { + padlen = cipher_info->block_size - (len % cipher_info->block_size); + if (output_size < (len + padlen)) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + } + + if ((ret = pkcs12_pbe_derive_key_iv(pbe_params, md_type, pwd, pwdlen, + key, keylen, + iv, cipher_info->iv_size)) != 0) { + return ret; + } + + mbedtls_cipher_init(&cipher_ctx); + + if ((ret = mbedtls_cipher_setup(&cipher_ctx, cipher_info)) != 0) { + goto exit; + } + + if ((ret = + mbedtls_cipher_setkey(&cipher_ctx, key, 8 * keylen, + (mbedtls_operation_t) mode)) != 0) { + goto exit; + } + +#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) + { + /* PKCS12 uses CBC with PKCS7 padding */ + mbedtls_cipher_padding_t padding = MBEDTLS_PADDING_PKCS7; +#if !defined(MBEDTLS_CIPHER_PADDING_PKCS7) + /* For historical reasons, when decrypting, this function works when + * decrypting even when support for PKCS7 padding is disabled. In this + * case, it ignores the padding, and so will never report a + * password mismatch. + */ + if (mode == MBEDTLS_PKCS12_PBE_DECRYPT) { + padding = MBEDTLS_PADDING_NONE; + } +#endif + if ((ret = mbedtls_cipher_set_padding_mode(&cipher_ctx, padding)) != 0) { + goto exit; + } + } +#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ + + if ((ret = mbedtls_cipher_set_iv(&cipher_ctx, iv, cipher_info->iv_size)) != 0) { + goto exit; + } + + if ((ret = mbedtls_cipher_reset(&cipher_ctx)) != 0) { + goto exit; + } + + if ((ret = mbedtls_cipher_update(&cipher_ctx, data, len, + output, output_len)) != 0) { + goto exit; + } + + if ((ret = mbedtls_cipher_finish(&cipher_ctx, output + (*output_len), &finish_olen)) != 0) { + ret = MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH; + } + + *output_len += finish_olen; + +exit: + mbedtls_platform_zeroize(key, sizeof(key)); + mbedtls_platform_zeroize(iv, sizeof(iv)); + mbedtls_cipher_free(&cipher_ctx); + + return ret; +} + +#endif /* MBEDTLS_ASN1_PARSE_C */ + +static void pkcs12_fill_buffer(unsigned char *data, size_t data_len, + const unsigned char *filler, size_t fill_len) +{ + unsigned char *p = data; + size_t use_len; + + if (filler != NULL && fill_len != 0) { + while (data_len > 0) { + use_len = (data_len > fill_len) ? fill_len : data_len; + memcpy(p, filler, use_len); + p += use_len; + data_len -= use_len; + } + } else { + /* If either of the above are not true then clearly there is nothing + * that this function can do. The function should *not* be called + * under either of those circumstances, as you could end up with an + * incorrect output but for safety's sake, leaving the check in as + * otherwise we could end up with memory corruption.*/ + } +} + +int mbedtls_pkcs12_derivation(unsigned char *data, size_t datalen, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *salt, size_t saltlen, + mbedtls_md_type_t md_type, int id, int iterations) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned int j; + + unsigned char diversifier[128]; + unsigned char salt_block[128], pwd_block[128], hash_block[128]; + unsigned char hash_output[MBEDTLS_MD_MAX_SIZE]; + unsigned char *p; + unsigned char c; + int use_password = 0; + int use_salt = 0; + + size_t hlen, use_len, v, i; + + const mbedtls_md_info_t *md_info; + mbedtls_md_context_t md_ctx; + + // This version only allows max of 64 bytes of password or salt + if (datalen > 128 || pwdlen > 64 || saltlen > 64) { + return MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA; + } + + if (pwd == NULL && pwdlen != 0) { + return MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA; + } + + if (salt == NULL && saltlen != 0) { + return MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA; + } + + use_password = (pwd && pwdlen != 0); + use_salt = (salt && saltlen != 0); + + md_info = mbedtls_md_info_from_type(md_type); + if (md_info == NULL) { + return MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE; + } + + mbedtls_md_init(&md_ctx); + + if ((ret = mbedtls_md_setup(&md_ctx, md_info, 0)) != 0) { + return ret; + } + hlen = mbedtls_md_get_size(md_info); + + if (hlen <= 32) { + v = 64; + } else { + v = 128; + } + + memset(diversifier, (unsigned char) id, v); + + if (use_salt != 0) { + pkcs12_fill_buffer(salt_block, v, salt, saltlen); + } + + if (use_password != 0) { + pkcs12_fill_buffer(pwd_block, v, pwd, pwdlen); + } + + p = data; + while (datalen > 0) { + // Calculate hash( diversifier || salt_block || pwd_block ) + if ((ret = mbedtls_md_starts(&md_ctx)) != 0) { + goto exit; + } + + if ((ret = mbedtls_md_update(&md_ctx, diversifier, v)) != 0) { + goto exit; + } + + if (use_salt != 0) { + if ((ret = mbedtls_md_update(&md_ctx, salt_block, v)) != 0) { + goto exit; + } + } + + if (use_password != 0) { + if ((ret = mbedtls_md_update(&md_ctx, pwd_block, v)) != 0) { + goto exit; + } + } + + if ((ret = mbedtls_md_finish(&md_ctx, hash_output)) != 0) { + goto exit; + } + + // Perform remaining ( iterations - 1 ) recursive hash calculations + for (i = 1; i < (size_t) iterations; i++) { + if ((ret = mbedtls_md(md_info, hash_output, hlen, hash_output)) != 0) { + goto exit; + } + } + + use_len = (datalen > hlen) ? hlen : datalen; + memcpy(p, hash_output, use_len); + datalen -= use_len; + p += use_len; + + if (datalen == 0) { + break; + } + + // Concatenating copies of hash_output into hash_block (B) + pkcs12_fill_buffer(hash_block, v, hash_output, hlen); + + // B += 1 + for (i = v; i > 0; i--) { + if (++hash_block[i - 1] != 0) { + break; + } + } + + if (use_salt != 0) { + // salt_block += B + c = 0; + for (i = v; i > 0; i--) { + j = salt_block[i - 1] + hash_block[i - 1] + c; + c = MBEDTLS_BYTE_1(j); + salt_block[i - 1] = MBEDTLS_BYTE_0(j); + } + } + + if (use_password != 0) { + // pwd_block += B + c = 0; + for (i = v; i > 0; i--) { + j = pwd_block[i - 1] + hash_block[i - 1] + c; + c = MBEDTLS_BYTE_1(j); + pwd_block[i - 1] = MBEDTLS_BYTE_0(j); + } + } + } + + ret = 0; + +exit: + mbedtls_platform_zeroize(salt_block, sizeof(salt_block)); + mbedtls_platform_zeroize(pwd_block, sizeof(pwd_block)); + mbedtls_platform_zeroize(hash_block, sizeof(hash_block)); + mbedtls_platform_zeroize(hash_output, sizeof(hash_output)); + + mbedtls_md_free(&md_ctx); + + return ret; +} + +#endif /* MBEDTLS_PKCS12_C */ diff --git a/ext/opcua_client/mbedtls/library/pkcs5.c b/ext/opcua_client/mbedtls/library/pkcs5.c new file mode 100644 index 0000000..90703c4 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/pkcs5.c @@ -0,0 +1,489 @@ +/** + * \file pkcs5.c + * + * \brief PKCS#5 functions + * + * \author Mathias Olsson + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * PKCS#5 includes PBKDF2 and more + * + * http://tools.ietf.org/html/rfc2898 (Specification) + * http://tools.ietf.org/html/rfc6070 (Test vectors) + */ + +#include "common.h" + +#if defined(MBEDTLS_PKCS5_C) + +#include "mbedtls/pkcs5.h" +#include "mbedtls/error.h" + +#if defined(MBEDTLS_ASN1_PARSE_C) +#include "mbedtls/asn1.h" +#include "mbedtls/cipher.h" +#include "mbedtls/oid.h" +#endif /* MBEDTLS_ASN1_PARSE_C */ + +#include + +#include "mbedtls/platform.h" + + +#if defined(MBEDTLS_ASN1_PARSE_C) +static int pkcs5_parse_pbkdf2_params(const mbedtls_asn1_buf *params, + mbedtls_asn1_buf *salt, int *iterations, + int *keylen, mbedtls_md_type_t *md_type) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_asn1_buf prf_alg_oid; + unsigned char *p = params->p; + const unsigned char *end = params->p + params->len; + + if (params->tag != (MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS5_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG); + } + /* + * PBKDF2-params ::= SEQUENCE { + * salt OCTET STRING, + * iterationCount INTEGER, + * keyLength INTEGER OPTIONAL + * prf AlgorithmIdentifier DEFAULT algid-hmacWithSHA1 + * } + * + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &salt->len, + MBEDTLS_ASN1_OCTET_STRING)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS5_INVALID_FORMAT, ret); + } + + salt->p = p; + p += salt->len; + + if ((ret = mbedtls_asn1_get_int(&p, end, iterations)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS5_INVALID_FORMAT, ret); + } + + if (p == end) { + return 0; + } + + if ((ret = mbedtls_asn1_get_int(&p, end, keylen)) != 0) { + if (ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS5_INVALID_FORMAT, ret); + } + } + + if (p == end) { + return 0; + } + + if ((ret = mbedtls_asn1_get_alg_null(&p, end, &prf_alg_oid)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS5_INVALID_FORMAT, ret); + } + + if (mbedtls_oid_get_md_hmac(&prf_alg_oid, md_type) != 0) { + return MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE; + } + + if (p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS5_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +#if !defined(MBEDTLS_CIPHER_PADDING_PKCS7) +int mbedtls_pkcs5_pbes2_ext(const mbedtls_asn1_buf *pbe_params, int mode, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t datalen, + unsigned char *output, size_t output_size, + size_t *output_len); +#endif + +int mbedtls_pkcs5_pbes2(const mbedtls_asn1_buf *pbe_params, int mode, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t datalen, + unsigned char *output) +{ + size_t output_len = 0; + + /* We assume caller of the function is providing a big enough output buffer + * so we pass output_size as SIZE_MAX to pass checks, However, no guarantees + * for the output size actually being correct. + */ + return mbedtls_pkcs5_pbes2_ext(pbe_params, mode, pwd, pwdlen, data, + datalen, output, SIZE_MAX, &output_len); +} + +int mbedtls_pkcs5_pbes2_ext(const mbedtls_asn1_buf *pbe_params, int mode, + const unsigned char *pwd, size_t pwdlen, + const unsigned char *data, size_t datalen, + unsigned char *output, size_t output_size, + size_t *output_len) +{ + int ret, iterations = 0, keylen = 0; + unsigned char *p, *end; + mbedtls_asn1_buf kdf_alg_oid, enc_scheme_oid, kdf_alg_params, enc_scheme_params; + mbedtls_asn1_buf salt; + mbedtls_md_type_t md_type = MBEDTLS_MD_SHA1; + unsigned char key[32], iv[32]; + const mbedtls_md_info_t *md_info; + const mbedtls_cipher_info_t *cipher_info; + mbedtls_md_context_t md_ctx; + mbedtls_cipher_type_t cipher_alg; + mbedtls_cipher_context_t cipher_ctx; + unsigned int padlen = 0; + + p = pbe_params->p; + end = p + pbe_params->len; + + /* + * PBES2-params ::= SEQUENCE { + * keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}}, + * encryptionScheme AlgorithmIdentifier {{PBES2-Encs}} + * } + */ + if (pbe_params->tag != (MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS5_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG); + } + + if ((ret = mbedtls_asn1_get_alg(&p, end, &kdf_alg_oid, + &kdf_alg_params)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS5_INVALID_FORMAT, ret); + } + + // Only PBKDF2 supported at the moment + // + if (MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS5_PBKDF2, &kdf_alg_oid) != 0) { + return MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE; + } + + if ((ret = pkcs5_parse_pbkdf2_params(&kdf_alg_params, + &salt, &iterations, &keylen, + &md_type)) != 0) { + return ret; + } + + md_info = mbedtls_md_info_from_type(md_type); + if (md_info == NULL) { + return MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE; + } + + if ((ret = mbedtls_asn1_get_alg(&p, end, &enc_scheme_oid, + &enc_scheme_params)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PKCS5_INVALID_FORMAT, ret); + } + + if (mbedtls_oid_get_cipher_alg(&enc_scheme_oid, &cipher_alg) != 0) { + return MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE; + } + + cipher_info = mbedtls_cipher_info_from_type(cipher_alg); + if (cipher_info == NULL) { + return MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE; + } + + /* + * The value of keylen from pkcs5_parse_pbkdf2_params() is ignored + * since it is optional and we don't know if it was set or not + */ + keylen = cipher_info->key_bitlen / 8; + + if (enc_scheme_params.tag != MBEDTLS_ASN1_OCTET_STRING || + enc_scheme_params.len != cipher_info->iv_size) { + return MBEDTLS_ERR_PKCS5_INVALID_FORMAT; + } + + if (mode == MBEDTLS_PKCS5_DECRYPT) { + if (output_size < datalen) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + } + + if (mode == MBEDTLS_PKCS5_ENCRYPT) { + padlen = cipher_info->block_size - (datalen % cipher_info->block_size); + if (output_size < (datalen + padlen)) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + } + + mbedtls_md_init(&md_ctx); + + mbedtls_cipher_init(&cipher_ctx); + + memcpy(iv, enc_scheme_params.p, enc_scheme_params.len); + + if ((ret = mbedtls_md_setup(&md_ctx, md_info, 1)) != 0) { + goto exit; + } + + if ((ret = mbedtls_pkcs5_pbkdf2_hmac(&md_ctx, pwd, pwdlen, salt.p, salt.len, + iterations, keylen, key)) != 0) { + goto exit; + } + + if ((ret = mbedtls_cipher_setup(&cipher_ctx, cipher_info)) != 0) { + goto exit; + } + + if ((ret = mbedtls_cipher_setkey(&cipher_ctx, key, 8 * keylen, + (mbedtls_operation_t) mode)) != 0) { + goto exit; + } + +#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) + { + /* PKCS5 uses CBC with PKCS7 padding (which is the same as + * "PKCS5 padding" except that it's typically only called PKCS5 + * with 64-bit-block ciphers). + */ + mbedtls_cipher_padding_t padding = MBEDTLS_PADDING_PKCS7; +#if !defined(MBEDTLS_CIPHER_PADDING_PKCS7) + /* For historical reasons, when decrypting, this function works when + * decrypting even when support for PKCS7 padding is disabled. In this + * case, it ignores the padding, and so will never report a + * password mismatch. + */ + if (mode == MBEDTLS_DECRYPT) { + padding = MBEDTLS_PADDING_NONE; + } +#endif + if ((ret = mbedtls_cipher_set_padding_mode(&cipher_ctx, padding)) != 0) { + goto exit; + } + } +#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ + if ((ret = mbedtls_cipher_crypt(&cipher_ctx, iv, enc_scheme_params.len, + data, datalen, output, output_len)) != 0) { + ret = MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH; + } + +exit: + mbedtls_md_free(&md_ctx); + mbedtls_cipher_free(&cipher_ctx); + + return ret; +} +#endif /* MBEDTLS_ASN1_PARSE_C */ + +int mbedtls_pkcs5_pbkdf2_hmac(mbedtls_md_context_t *ctx, + const unsigned char *password, + size_t plen, const unsigned char *salt, size_t slen, + unsigned int iteration_count, + uint32_t key_length, unsigned char *output) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + int j; + unsigned int i; + unsigned char md1[MBEDTLS_MD_MAX_SIZE]; + unsigned char work[MBEDTLS_MD_MAX_SIZE]; + unsigned char md_size = mbedtls_md_get_size(ctx->md_info); + size_t use_len; + unsigned char *out_p = output; + unsigned char counter[4]; + + memset(counter, 0, 4); + counter[3] = 1; + +#if UINT_MAX > 0xFFFFFFFF + if (iteration_count > 0xFFFFFFFF) { + return MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA; + } +#endif + + if ((ret = mbedtls_md_hmac_starts(ctx, password, plen)) != 0) { + return ret; + } + while (key_length) { + // U1 ends up in work + // + if ((ret = mbedtls_md_hmac_update(ctx, salt, slen)) != 0) { + goto cleanup; + } + + if ((ret = mbedtls_md_hmac_update(ctx, counter, 4)) != 0) { + goto cleanup; + } + + if ((ret = mbedtls_md_hmac_finish(ctx, work)) != 0) { + goto cleanup; + } + + if ((ret = mbedtls_md_hmac_reset(ctx)) != 0) { + goto cleanup; + } + + memcpy(md1, work, md_size); + + for (i = 1; i < iteration_count; i++) { + // U2 ends up in md1 + // + if ((ret = mbedtls_md_hmac_update(ctx, md1, md_size)) != 0) { + goto cleanup; + } + + if ((ret = mbedtls_md_hmac_finish(ctx, md1)) != 0) { + goto cleanup; + } + + if ((ret = mbedtls_md_hmac_reset(ctx)) != 0) { + goto cleanup; + } + + // U1 xor U2 + // + for (j = 0; j < md_size; j++) { + work[j] ^= md1[j]; + } + } + + use_len = (key_length < md_size) ? key_length : md_size; + memcpy(out_p, work, use_len); + + key_length -= (uint32_t) use_len; + out_p += use_len; + + for (i = 4; i > 0; i--) { + if (++counter[i - 1] != 0) { + break; + } + } + } + +cleanup: + /* Zeroise buffers to clear sensitive data from memory. */ + mbedtls_platform_zeroize(work, MBEDTLS_MD_MAX_SIZE); + mbedtls_platform_zeroize(md1, MBEDTLS_MD_MAX_SIZE); + + return ret; +} + +#if defined(MBEDTLS_SELF_TEST) + +#if !defined(MBEDTLS_SHA1_C) +int mbedtls_pkcs5_self_test(int verbose) +{ + if (verbose != 0) { + mbedtls_printf(" PBKDF2 (SHA1): skipped\n\n"); + } + + return 0; +} +#else + +#define MAX_TESTS 6 + +static const size_t plen_test_data[MAX_TESTS] = +{ 8, 8, 8, 24, 9 }; + +static const unsigned char password_test_data[MAX_TESTS][32] = +{ + "password", + "password", + "password", + "passwordPASSWORDpassword", + "pass\0word", +}; + +static const size_t slen_test_data[MAX_TESTS] = +{ 4, 4, 4, 36, 5 }; + +static const unsigned char salt_test_data[MAX_TESTS][40] = +{ + "salt", + "salt", + "salt", + "saltSALTsaltSALTsaltSALTsaltSALTsalt", + "sa\0lt", +}; + +static const uint32_t it_cnt_test_data[MAX_TESTS] = +{ 1, 2, 4096, 4096, 4096 }; + +static const uint32_t key_len_test_data[MAX_TESTS] = +{ 20, 20, 20, 25, 16 }; + +static const unsigned char result_key_test_data[MAX_TESTS][32] = +{ + { 0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71, + 0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06, + 0x2f, 0xe0, 0x37, 0xa6 }, + { 0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c, + 0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0, + 0xd8, 0xde, 0x89, 0x57 }, + { 0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a, + 0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0, + 0x65, 0xa4, 0x29, 0xc1 }, + { 0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b, + 0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a, + 0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70, + 0x38 }, + { 0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d, + 0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3 }, +}; + +int mbedtls_pkcs5_self_test(int verbose) +{ + mbedtls_md_context_t sha1_ctx; + const mbedtls_md_info_t *info_sha1; + int ret, i; + unsigned char key[64]; + + mbedtls_md_init(&sha1_ctx); + + info_sha1 = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1); + if (info_sha1 == NULL) { + ret = 1; + goto exit; + } + + if ((ret = mbedtls_md_setup(&sha1_ctx, info_sha1, 1)) != 0) { + ret = 1; + goto exit; + } + + for (i = 0; i < MAX_TESTS; i++) { + if (verbose != 0) { + mbedtls_printf(" PBKDF2 (SHA1) #%d: ", i); + } + + ret = mbedtls_pkcs5_pbkdf2_hmac(&sha1_ctx, password_test_data[i], + plen_test_data[i], salt_test_data[i], + slen_test_data[i], it_cnt_test_data[i], + key_len_test_data[i], key); + if (ret != 0 || + memcmp(result_key_test_data[i], key, key_len_test_data[i]) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto exit; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + +exit: + mbedtls_md_free(&sha1_ctx); + + return ret; +} +#endif /* MBEDTLS_SHA1_C */ + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_PKCS5_C */ diff --git a/ext/opcua_client/mbedtls/library/pkparse.c b/ext/opcua_client/mbedtls/library/pkparse.c new file mode 100644 index 0000000..37d5016 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/pkparse.c @@ -0,0 +1,1537 @@ +/* + * Public Key layer for parsing key files and structures + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PK_PARSE_C) + +#include "mbedtls/pk.h" +#include "mbedtls/asn1.h" +#include "mbedtls/oid.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#if defined(MBEDTLS_RSA_C) +#include "mbedtls/rsa.h" +#endif +#if defined(MBEDTLS_ECP_C) +#include "mbedtls/ecp.h" +#endif +#if defined(MBEDTLS_ECDSA_C) +#include "mbedtls/ecdsa.h" +#endif +#if defined(MBEDTLS_PEM_PARSE_C) +#include "mbedtls/pem.h" +#endif +#if defined(MBEDTLS_PKCS5_C) +#include "mbedtls/pkcs5.h" +#endif +#if defined(MBEDTLS_PKCS12_C) +#include "mbedtls/pkcs12.h" +#endif + +#include "mbedtls/platform.h" + +/* Parameter validation macros based on platform_util.h */ +#define PK_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_PK_BAD_INPUT_DATA) +#define PK_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +#if defined(MBEDTLS_FS_IO) +/* + * Load all data from a file into a given buffer. + * + * The file is expected to contain either PEM or DER encoded data. + * A terminating null byte is always appended. It is included in the announced + * length only if the data looks like it is PEM encoded. + */ +int mbedtls_pk_load_file(const char *path, unsigned char **buf, size_t *n) +{ + FILE *f; + long size; + + PK_VALIDATE_RET(path != NULL); + PK_VALIDATE_RET(buf != NULL); + PK_VALIDATE_RET(n != NULL); + + if ((f = fopen(path, "rb")) == NULL) { + return MBEDTLS_ERR_PK_FILE_IO_ERROR; + } + + fseek(f, 0, SEEK_END); + if ((size = ftell(f)) == -1) { + fclose(f); + return MBEDTLS_ERR_PK_FILE_IO_ERROR; + } + fseek(f, 0, SEEK_SET); + + *n = (size_t) size; + + if (*n + 1 == 0 || + (*buf = mbedtls_calloc(1, *n + 1)) == NULL) { + fclose(f); + return MBEDTLS_ERR_PK_ALLOC_FAILED; + } + + if (fread(*buf, 1, *n, f) != *n) { + fclose(f); + + mbedtls_platform_zeroize(*buf, *n); + mbedtls_free(*buf); + + return MBEDTLS_ERR_PK_FILE_IO_ERROR; + } + + fclose(f); + + (*buf)[*n] = '\0'; + + if (strstr((const char *) *buf, "-----BEGIN ") != NULL) { + ++*n; + } + + return 0; +} + +/* + * Load and parse a private key + */ +int mbedtls_pk_parse_keyfile(mbedtls_pk_context *ctx, + const char *path, const char *pwd) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n; + unsigned char *buf; + + PK_VALIDATE_RET(ctx != NULL); + PK_VALIDATE_RET(path != NULL); + + if ((ret = mbedtls_pk_load_file(path, &buf, &n)) != 0) { + return ret; + } + + if (pwd == NULL) { + ret = mbedtls_pk_parse_key(ctx, buf, n, NULL, 0); + } else { + ret = mbedtls_pk_parse_key(ctx, buf, n, + (const unsigned char *) pwd, strlen(pwd)); + } + + mbedtls_platform_zeroize(buf, n); + mbedtls_free(buf); + + return ret; +} + +/* + * Load and parse a public key + */ +int mbedtls_pk_parse_public_keyfile(mbedtls_pk_context *ctx, const char *path) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n; + unsigned char *buf; + + PK_VALIDATE_RET(ctx != NULL); + PK_VALIDATE_RET(path != NULL); + + if ((ret = mbedtls_pk_load_file(path, &buf, &n)) != 0) { + return ret; + } + + ret = mbedtls_pk_parse_public_key(ctx, buf, n); + + mbedtls_platform_zeroize(buf, n); + mbedtls_free(buf); + + return ret; +} +#endif /* MBEDTLS_FS_IO */ + +#if defined(MBEDTLS_ECP_C) +/* Minimally parse an ECParameters buffer to and mbedtls_asn1_buf + * + * ECParameters ::= CHOICE { + * namedCurve OBJECT IDENTIFIER + * specifiedCurve SpecifiedECDomain -- = SEQUENCE { ... } + * -- implicitCurve NULL + * } + */ +static int pk_get_ecparams(unsigned char **p, const unsigned char *end, + mbedtls_asn1_buf *params) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (end - *p < 1) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_OUT_OF_DATA); + } + + /* Tag may be either OID or SEQUENCE */ + params->tag = **p; + if (params->tag != MBEDTLS_ASN1_OID +#if defined(MBEDTLS_PK_PARSE_EC_EXTENDED) + && params->tag != (MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE) +#endif + ) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG); + } + + if ((ret = mbedtls_asn1_get_tag(p, end, ¶ms->len, params->tag)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + params->p = *p; + *p += params->len; + + if (*p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +#if defined(MBEDTLS_PK_PARSE_EC_EXTENDED) +/* + * Parse a SpecifiedECDomain (SEC 1 C.2) and (mostly) fill the group with it. + * WARNING: the resulting group should only be used with + * pk_group_id_from_specified(), since its base point may not be set correctly + * if it was encoded compressed. + * + * SpecifiedECDomain ::= SEQUENCE { + * version SpecifiedECDomainVersion(ecdpVer1 | ecdpVer2 | ecdpVer3, ...), + * fieldID FieldID {{FieldTypes}}, + * curve Curve, + * base ECPoint, + * order INTEGER, + * cofactor INTEGER OPTIONAL, + * hash HashAlgorithm OPTIONAL, + * ... + * } + * + * We only support prime-field as field type, and ignore hash and cofactor. + */ +static int pk_group_from_specified(const mbedtls_asn1_buf *params, mbedtls_ecp_group *grp) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *p = params->p; + const unsigned char * const end = params->p + params->len; + const unsigned char *end_field, *end_curve; + size_t len; + int ver; + + /* SpecifiedECDomainVersion ::= INTEGER { 1, 2, 3 } */ + if ((ret = mbedtls_asn1_get_int(&p, end, &ver)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + if (ver < 1 || ver > 3) { + return MBEDTLS_ERR_PK_KEY_INVALID_FORMAT; + } + + /* + * FieldID { FIELD-ID:IOSet } ::= SEQUENCE { -- Finite field + * fieldType FIELD-ID.&id({IOSet}), + * parameters FIELD-ID.&Type({IOSet}{@fieldType}) + * } + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return ret; + } + + end_field = p + len; + + /* + * FIELD-ID ::= TYPE-IDENTIFIER + * FieldTypes FIELD-ID ::= { + * { Prime-p IDENTIFIED BY prime-field } | + * { Characteristic-two IDENTIFIED BY characteristic-two-field } + * } + * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 } + */ + if ((ret = mbedtls_asn1_get_tag(&p, end_field, &len, MBEDTLS_ASN1_OID)) != 0) { + return ret; + } + + if (len != MBEDTLS_OID_SIZE(MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD) || + memcmp(p, MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD, len) != 0) { + return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE; + } + + p += len; + + /* Prime-p ::= INTEGER -- Field of size p. */ + if ((ret = mbedtls_asn1_get_mpi(&p, end_field, &grp->P)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + grp->pbits = mbedtls_mpi_bitlen(&grp->P); + + if (p != end_field) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + /* + * Curve ::= SEQUENCE { + * a FieldElement, + * b FieldElement, + * seed BIT STRING OPTIONAL + * -- Shall be present if used in SpecifiedECDomain + * -- with version equal to ecdpVer2 or ecdpVer3 + * } + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return ret; + } + + end_curve = p + len; + + /* + * FieldElement ::= OCTET STRING + * containing an integer in the case of a prime field + */ + if ((ret = mbedtls_asn1_get_tag(&p, end_curve, &len, MBEDTLS_ASN1_OCTET_STRING)) != 0 || + (ret = mbedtls_mpi_read_binary(&grp->A, p, len)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + p += len; + + if ((ret = mbedtls_asn1_get_tag(&p, end_curve, &len, MBEDTLS_ASN1_OCTET_STRING)) != 0 || + (ret = mbedtls_mpi_read_binary(&grp->B, p, len)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + p += len; + + /* Ignore seed BIT STRING OPTIONAL */ + if ((ret = mbedtls_asn1_get_tag(&p, end_curve, &len, MBEDTLS_ASN1_BIT_STRING)) == 0) { + p += len; + } + + if (p != end_curve) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + /* + * ECPoint ::= OCTET STRING + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OCTET_STRING)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + if ((ret = mbedtls_ecp_point_read_binary(grp, &grp->G, + (const unsigned char *) p, len)) != 0) { + /* + * If we can't read the point because it's compressed, cheat by + * reading only the X coordinate and the parity bit of Y. + */ + if (ret != MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE || + (p[0] != 0x02 && p[0] != 0x03) || + len != mbedtls_mpi_size(&grp->P) + 1 || + mbedtls_mpi_read_binary(&grp->G.X, p + 1, len - 1) != 0 || + mbedtls_mpi_lset(&grp->G.Y, p[0] - 2) != 0 || + mbedtls_mpi_lset(&grp->G.Z, 1) != 0) { + return MBEDTLS_ERR_PK_KEY_INVALID_FORMAT; + } + } + + p += len; + + /* + * order INTEGER + */ + if ((ret = mbedtls_asn1_get_mpi(&p, end, &grp->N)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + grp->nbits = mbedtls_mpi_bitlen(&grp->N); + + /* + * Allow optional elements by purposefully not enforcing p == end here. + */ + + return 0; +} + +/* + * Find the group id associated with an (almost filled) group as generated by + * pk_group_from_specified(), or return an error if unknown. + */ +static int pk_group_id_from_group(const mbedtls_ecp_group *grp, mbedtls_ecp_group_id *grp_id) +{ + int ret = 0; + mbedtls_ecp_group ref; + const mbedtls_ecp_group_id *id; + + mbedtls_ecp_group_init(&ref); + + for (id = mbedtls_ecp_grp_id_list(); *id != MBEDTLS_ECP_DP_NONE; id++) { + /* Load the group associated to that id */ + mbedtls_ecp_group_free(&ref); + MBEDTLS_MPI_CHK(mbedtls_ecp_group_load(&ref, *id)); + + /* Compare to the group we were given, starting with easy tests */ + if (grp->pbits == ref.pbits && grp->nbits == ref.nbits && + mbedtls_mpi_cmp_mpi(&grp->P, &ref.P) == 0 && + mbedtls_mpi_cmp_mpi(&grp->A, &ref.A) == 0 && + mbedtls_mpi_cmp_mpi(&grp->B, &ref.B) == 0 && + mbedtls_mpi_cmp_mpi(&grp->N, &ref.N) == 0 && + mbedtls_mpi_cmp_mpi(&grp->G.X, &ref.G.X) == 0 && + mbedtls_mpi_cmp_mpi(&grp->G.Z, &ref.G.Z) == 0 && + /* For Y we may only know the parity bit, so compare only that */ + mbedtls_mpi_get_bit(&grp->G.Y, 0) == mbedtls_mpi_get_bit(&ref.G.Y, 0)) { + break; + } + + } + +cleanup: + mbedtls_ecp_group_free(&ref); + + *grp_id = *id; + + if (ret == 0 && *id == MBEDTLS_ECP_DP_NONE) { + ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + } + + return ret; +} + +/* + * Parse a SpecifiedECDomain (SEC 1 C.2) and find the associated group ID + */ +static int pk_group_id_from_specified(const mbedtls_asn1_buf *params, + mbedtls_ecp_group_id *grp_id) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_group grp; + + mbedtls_ecp_group_init(&grp); + + if ((ret = pk_group_from_specified(params, &grp)) != 0) { + goto cleanup; + } + + ret = pk_group_id_from_group(&grp, grp_id); + +cleanup: + mbedtls_ecp_group_free(&grp); + + return ret; +} +#endif /* MBEDTLS_PK_PARSE_EC_EXTENDED */ + +/* + * Use EC parameters to initialise an EC group + * + * ECParameters ::= CHOICE { + * namedCurve OBJECT IDENTIFIER + * specifiedCurve SpecifiedECDomain -- = SEQUENCE { ... } + * -- implicitCurve NULL + */ +static int pk_use_ecparams(const mbedtls_asn1_buf *params, mbedtls_ecp_group *grp) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_group_id grp_id; + + if (params->tag == MBEDTLS_ASN1_OID) { + if (mbedtls_oid_get_ec_grp(params, &grp_id) != 0) { + return MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE; + } + } else { +#if defined(MBEDTLS_PK_PARSE_EC_EXTENDED) + if ((ret = pk_group_id_from_specified(params, &grp_id)) != 0) { + return ret; + } +#else + return MBEDTLS_ERR_PK_KEY_INVALID_FORMAT; +#endif + } + + /* + * grp may already be initialized; if so, make sure IDs match + */ + if (grp->id != MBEDTLS_ECP_DP_NONE && grp->id != grp_id) { + return MBEDTLS_ERR_PK_KEY_INVALID_FORMAT; + } + + if ((ret = mbedtls_ecp_group_load(grp, grp_id)) != 0) { + return ret; + } + + return 0; +} + +/* + * EC public key is an EC point + * + * The caller is responsible for clearing the structure upon failure if + * desired. Take care to pass along the possible ECP_FEATURE_UNAVAILABLE + * return code of mbedtls_ecp_point_read_binary() and leave p in a usable state. + */ +static int pk_get_ecpubkey(unsigned char **p, const unsigned char *end, + mbedtls_ecp_keypair *key) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if ((ret = mbedtls_ecp_point_read_binary(&key->grp, &key->Q, + (const unsigned char *) *p, end - *p)) == 0) { + ret = mbedtls_ecp_check_pubkey(&key->grp, &key->Q); + } + + /* + * We know mbedtls_ecp_point_read_binary consumed all bytes or failed + */ + *p = (unsigned char *) end; + + return ret; +} +#endif /* MBEDTLS_ECP_C */ + +#if defined(MBEDTLS_RSA_C) +/* + * RSAPublicKey ::= SEQUENCE { + * modulus INTEGER, -- n + * publicExponent INTEGER -- e + * } + */ +static int pk_get_rsapubkey(unsigned char **p, + const unsigned char *end, + mbedtls_rsa_context *rsa) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_INVALID_PUBKEY, ret); + } + + if (*p + len != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_INVALID_PUBKEY, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + /* Import N */ + if ((ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_INTEGER)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_INVALID_PUBKEY, ret); + } + + if ((ret = mbedtls_rsa_import_raw(rsa, *p, len, NULL, 0, NULL, 0, + NULL, 0, NULL, 0)) != 0) { + return MBEDTLS_ERR_PK_INVALID_PUBKEY; + } + + *p += len; + + /* Import E */ + if ((ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_INTEGER)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_INVALID_PUBKEY, ret); + } + + if ((ret = mbedtls_rsa_import_raw(rsa, NULL, 0, NULL, 0, NULL, 0, + NULL, 0, *p, len)) != 0) { + return MBEDTLS_ERR_PK_INVALID_PUBKEY; + } + + *p += len; + + if (mbedtls_rsa_complete(rsa) != 0 || + mbedtls_rsa_check_pubkey(rsa) != 0) { + return MBEDTLS_ERR_PK_INVALID_PUBKEY; + } + + if (*p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_INVALID_PUBKEY, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} +#endif /* MBEDTLS_RSA_C */ + +/* Get a PK algorithm identifier + * + * AlgorithmIdentifier ::= SEQUENCE { + * algorithm OBJECT IDENTIFIER, + * parameters ANY DEFINED BY algorithm OPTIONAL } + */ +static int pk_get_pk_alg(unsigned char **p, + const unsigned char *end, + mbedtls_pk_type_t *pk_alg, mbedtls_asn1_buf *params) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_asn1_buf alg_oid; + + memset(params, 0, sizeof(mbedtls_asn1_buf)); + + if ((ret = mbedtls_asn1_get_alg(p, end, &alg_oid, params)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_INVALID_ALG, ret); + } + + if (mbedtls_oid_get_pk_alg(&alg_oid, pk_alg) != 0) { + return MBEDTLS_ERR_PK_UNKNOWN_PK_ALG; + } + + /* + * No parameters with RSA (only for EC) + */ + if (*pk_alg == MBEDTLS_PK_RSA && + ((params->tag != MBEDTLS_ASN1_NULL && params->tag != 0) || + params->len != 0)) { + return MBEDTLS_ERR_PK_INVALID_ALG; + } + + return 0; +} + +/* + * SubjectPublicKeyInfo ::= SEQUENCE { + * algorithm AlgorithmIdentifier, + * subjectPublicKey BIT STRING } + */ +int mbedtls_pk_parse_subpubkey(unsigned char **p, const unsigned char *end, + mbedtls_pk_context *pk) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + mbedtls_asn1_buf alg_params; + mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE; + const mbedtls_pk_info_t *pk_info; + + PK_VALIDATE_RET(p != NULL); + PK_VALIDATE_RET(*p != NULL); + PK_VALIDATE_RET(end != NULL); + PK_VALIDATE_RET(pk != NULL); + + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + end = *p + len; + + if ((ret = pk_get_pk_alg(p, end, &pk_alg, &alg_params)) != 0) { + return ret; + } + + if ((ret = mbedtls_asn1_get_bitstring_null(p, end, &len)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_INVALID_PUBKEY, ret); + } + + if (*p + len != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_INVALID_PUBKEY, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + if ((pk_info = mbedtls_pk_info_from_type(pk_alg)) == NULL) { + return MBEDTLS_ERR_PK_UNKNOWN_PK_ALG; + } + + if ((ret = mbedtls_pk_setup(pk, pk_info)) != 0) { + return ret; + } + +#if defined(MBEDTLS_RSA_C) + if (pk_alg == MBEDTLS_PK_RSA) { + ret = pk_get_rsapubkey(p, end, mbedtls_pk_rsa(*pk)); + } else +#endif /* MBEDTLS_RSA_C */ +#if defined(MBEDTLS_ECP_C) + if (pk_alg == MBEDTLS_PK_ECKEY_DH || pk_alg == MBEDTLS_PK_ECKEY) { + ret = pk_use_ecparams(&alg_params, &mbedtls_pk_ec(*pk)->grp); + if (ret == 0) { + ret = pk_get_ecpubkey(p, end, mbedtls_pk_ec(*pk)); + } + } else +#endif /* MBEDTLS_ECP_C */ + ret = MBEDTLS_ERR_PK_UNKNOWN_PK_ALG; + + if (ret == 0 && *p != end) { + ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_INVALID_PUBKEY, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + if (ret != 0) { + mbedtls_pk_free(pk); + } + + return ret; +} + +#if defined(MBEDTLS_RSA_C) +/* + * Wrapper around mbedtls_asn1_get_mpi() that rejects zero. + * + * The value zero is: + * - never a valid value for an RSA parameter + * - interpreted as "omitted, please reconstruct" by mbedtls_rsa_complete(). + * + * Since values can't be omitted in PKCS#1, passing a zero value to + * rsa_complete() would be incorrect, so reject zero values early. + */ +static int asn1_get_nonzero_mpi(unsigned char **p, + const unsigned char *end, + mbedtls_mpi *X) +{ + int ret; + + ret = mbedtls_asn1_get_mpi(p, end, X); + if (ret != 0) { + return ret; + } + + if (mbedtls_mpi_cmp_int(X, 0) == 0) { + return MBEDTLS_ERR_PK_KEY_INVALID_FORMAT; + } + + return 0; +} + +/* + * Parse a PKCS#1 encoded private RSA key + */ +static int pk_parse_key_pkcs1_der(mbedtls_rsa_context *rsa, + const unsigned char *key, + size_t keylen) +{ + int ret, version; + size_t len; + unsigned char *p, *end; + + mbedtls_mpi T; + mbedtls_mpi_init(&T); + + p = (unsigned char *) key; + end = p + keylen; + + /* + * This function parses the RSAPrivateKey (PKCS#1) + * + * RSAPrivateKey ::= SEQUENCE { + * version Version, + * modulus INTEGER, -- n + * publicExponent INTEGER, -- e + * privateExponent INTEGER, -- d + * prime1 INTEGER, -- p + * prime2 INTEGER, -- q + * exponent1 INTEGER, -- d mod (p-1) + * exponent2 INTEGER, -- d mod (q-1) + * coefficient INTEGER, -- (inverse of q) mod p + * otherPrimeInfos OtherPrimeInfos OPTIONAL + * } + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + end = p + len; + + if ((ret = mbedtls_asn1_get_int(&p, end, &version)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + if (version != 0) { + return MBEDTLS_ERR_PK_KEY_INVALID_VERSION; + } + + /* Import N */ + if ((ret = asn1_get_nonzero_mpi(&p, end, &T)) != 0 || + (ret = mbedtls_rsa_import(rsa, &T, NULL, NULL, + NULL, NULL)) != 0) { + goto cleanup; + } + + /* Import E */ + if ((ret = asn1_get_nonzero_mpi(&p, end, &T)) != 0 || + (ret = mbedtls_rsa_import(rsa, NULL, NULL, NULL, + NULL, &T)) != 0) { + goto cleanup; + } + + /* Import D */ + if ((ret = asn1_get_nonzero_mpi(&p, end, &T)) != 0 || + (ret = mbedtls_rsa_import(rsa, NULL, NULL, NULL, + &T, NULL)) != 0) { + goto cleanup; + } + + /* Import P */ + if ((ret = asn1_get_nonzero_mpi(&p, end, &T)) != 0 || + (ret = mbedtls_rsa_import(rsa, NULL, &T, NULL, + NULL, NULL)) != 0) { + goto cleanup; + } + + /* Import Q */ + if ((ret = asn1_get_nonzero_mpi(&p, end, &T)) != 0 || + (ret = mbedtls_rsa_import(rsa, NULL, NULL, &T, + NULL, NULL)) != 0) { + goto cleanup; + } + +#if !defined(MBEDTLS_RSA_NO_CRT) && !defined(MBEDTLS_RSA_ALT) + /* + * The RSA CRT parameters DP, DQ and QP are nominally redundant, in + * that they can be easily recomputed from D, P and Q. However by + * parsing them from the PKCS1 structure it is possible to avoid + * recalculating them which both reduces the overhead of loading + * RSA private keys into memory and also avoids side channels which + * can arise when computing those values, since all of D, P, and Q + * are secret. See https://eprint.iacr.org/2020/055 for a + * description of one such attack. + */ + + /* Import DP */ + if ((ret = asn1_get_nonzero_mpi(&p, end, &T)) != 0 || + (ret = mbedtls_mpi_copy(&rsa->DP, &T)) != 0) { + goto cleanup; + } + + /* Import DQ */ + if ((ret = asn1_get_nonzero_mpi(&p, end, &T)) != 0 || + (ret = mbedtls_mpi_copy(&rsa->DQ, &T)) != 0) { + goto cleanup; + } + + /* Import QP */ + if ((ret = asn1_get_nonzero_mpi(&p, end, &T)) != 0 || + (ret = mbedtls_mpi_copy(&rsa->QP, &T)) != 0) { + goto cleanup; + } + +#else + /* Verify existence of the CRT params */ + if ((ret = asn1_get_nonzero_mpi(&p, end, &T)) != 0 || + (ret = asn1_get_nonzero_mpi(&p, end, &T)) != 0 || + (ret = asn1_get_nonzero_mpi(&p, end, &T)) != 0) { + goto cleanup; + } +#endif + + /* rsa_complete() doesn't complete anything with the default + * implementation but is still called: + * - for the benefit of alternative implementation that may want to + * pre-compute stuff beyond what's provided (eg Montgomery factors) + * - as is also sanity-checks the key + * + * Furthermore, we also check the public part for consistency with + * mbedtls_pk_parse_pubkey(), as it includes size minima for example. + */ + if ((ret = mbedtls_rsa_complete(rsa)) != 0 || + (ret = mbedtls_rsa_check_pubkey(rsa)) != 0) { + goto cleanup; + } + + if (p != end) { + ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + +cleanup: + + mbedtls_mpi_free(&T); + + if (ret != 0) { + /* Wrap error code if it's coming from a lower level */ + if ((ret & 0xff80) == 0) { + ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } else { + ret = MBEDTLS_ERR_PK_KEY_INVALID_FORMAT; + } + + mbedtls_rsa_free(rsa); + } + + return ret; +} +#endif /* MBEDTLS_RSA_C */ + +#if defined(MBEDTLS_ECP_C) +/* + * Parse a SEC1 encoded private EC key + */ +static int pk_parse_key_sec1_der(mbedtls_ecp_keypair *eck, + const unsigned char *key, + size_t keylen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + int version, pubkey_done; + size_t len; + mbedtls_asn1_buf params; + unsigned char *p = (unsigned char *) key; + unsigned char *end = p + keylen; + unsigned char *end2; + + /* + * RFC 5915, or SEC1 Appendix C.4 + * + * ECPrivateKey ::= SEQUENCE { + * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), + * privateKey OCTET STRING, + * parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, + * publicKey [1] BIT STRING OPTIONAL + * } + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + end = p + len; + + if ((ret = mbedtls_asn1_get_int(&p, end, &version)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + if (version != 1) { + return MBEDTLS_ERR_PK_KEY_INVALID_VERSION; + } + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OCTET_STRING)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + if ((ret = mbedtls_mpi_read_binary(&eck->d, p, len)) != 0) { + mbedtls_ecp_keypair_free(eck); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + p += len; + + pubkey_done = 0; + if (p != end) { + /* + * Is 'parameters' present? + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | + 0)) == 0) { + if ((ret = pk_get_ecparams(&p, p + len, ¶ms)) != 0 || + (ret = pk_use_ecparams(¶ms, &eck->grp)) != 0) { + mbedtls_ecp_keypair_free(eck); + return ret; + } + } else if (ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + mbedtls_ecp_keypair_free(eck); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + } + + if (p != end) { + /* + * Is 'publickey' present? If not, or if we can't read it (eg because it + * is compressed), create it from the private key. + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | + 1)) == 0) { + end2 = p + len; + + if ((ret = mbedtls_asn1_get_bitstring_null(&p, end2, &len)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + if (p + len != end2) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + if ((ret = pk_get_ecpubkey(&p, end2, eck)) == 0) { + pubkey_done = 1; + } else { + /* + * The only acceptable failure mode of pk_get_ecpubkey() above + * is if the point format is not recognized. + */ + if (ret != MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE) { + return MBEDTLS_ERR_PK_KEY_INVALID_FORMAT; + } + } + } else if (ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + mbedtls_ecp_keypair_free(eck); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + } + + if (!pubkey_done && + (ret = mbedtls_ecp_mul(&eck->grp, &eck->Q, &eck->d, &eck->grp.G, + NULL, NULL)) != 0) { + mbedtls_ecp_keypair_free(eck); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + if ((ret = mbedtls_ecp_check_privkey(&eck->grp, &eck->d)) != 0) { + mbedtls_ecp_keypair_free(eck); + return ret; + } + + return 0; +} +#endif /* MBEDTLS_ECP_C */ + +/* + * Parse an unencrypted PKCS#8 encoded private key + * + * Notes: + * + * - This function does not own the key buffer. It is the + * responsibility of the caller to take care of zeroizing + * and freeing it after use. + * + * - The function is responsible for freeing the provided + * PK context on failure. + * + */ +static int pk_parse_key_pkcs8_unencrypted_der( + mbedtls_pk_context *pk, + const unsigned char *key, + size_t keylen) +{ + int ret, version; + size_t len; + mbedtls_asn1_buf params; + unsigned char *p = (unsigned char *) key; + unsigned char *end = p + keylen; + mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE; + const mbedtls_pk_info_t *pk_info; + + /* + * This function parses the PrivateKeyInfo object (PKCS#8 v1.2 = RFC 5208) + * + * PrivateKeyInfo ::= SEQUENCE { + * version Version, + * privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, + * privateKey PrivateKey, + * attributes [0] IMPLICIT Attributes OPTIONAL } + * + * Version ::= INTEGER + * PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier + * PrivateKey ::= OCTET STRING + * + * The PrivateKey OCTET STRING is a SEC1 ECPrivateKey + */ + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + end = p + len; + + if ((ret = mbedtls_asn1_get_int(&p, end, &version)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + if (version != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_VERSION, ret); + } + + if ((ret = pk_get_pk_alg(&p, end, &pk_alg, ¶ms)) != 0) { + return ret; + } + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OCTET_STRING)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + if (len < 1) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_OUT_OF_DATA); + } + + if ((pk_info = mbedtls_pk_info_from_type(pk_alg)) == NULL) { + return MBEDTLS_ERR_PK_UNKNOWN_PK_ALG; + } + + if ((ret = mbedtls_pk_setup(pk, pk_info)) != 0) { + return ret; + } + +#if defined(MBEDTLS_RSA_C) + if (pk_alg == MBEDTLS_PK_RSA) { + if ((ret = pk_parse_key_pkcs1_der(mbedtls_pk_rsa(*pk), p, len)) != 0) { + mbedtls_pk_free(pk); + return ret; + } + } else +#endif /* MBEDTLS_RSA_C */ +#if defined(MBEDTLS_ECP_C) + if (pk_alg == MBEDTLS_PK_ECKEY || pk_alg == MBEDTLS_PK_ECKEY_DH) { + if ((ret = pk_use_ecparams(¶ms, &mbedtls_pk_ec(*pk)->grp)) != 0 || + (ret = pk_parse_key_sec1_der(mbedtls_pk_ec(*pk), p, len)) != 0) { + mbedtls_pk_free(pk); + return ret; + } + } else +#endif /* MBEDTLS_ECP_C */ + return MBEDTLS_ERR_PK_UNKNOWN_PK_ALG; + + return 0; +} + +/* + * Parse an encrypted PKCS#8 encoded private key + * + * To save space, the decryption happens in-place on the given key buffer. + * Also, while this function may modify the keybuffer, it doesn't own it, + * and instead it is the responsibility of the caller to zeroize and properly + * free it after use. + * + */ +#if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C) +static int pk_parse_key_pkcs8_encrypted_der( + mbedtls_pk_context *pk, + unsigned char *key, size_t keylen, + const unsigned char *pwd, size_t pwdlen) +{ + int ret, decrypted = 0; + size_t len; + unsigned char *buf; + unsigned char *p, *end; + mbedtls_asn1_buf pbe_alg_oid, pbe_params; +#if defined(MBEDTLS_PKCS12_C) + mbedtls_cipher_type_t cipher_alg; + mbedtls_md_type_t md_alg; +#endif + + p = key; + end = p + keylen; + + if (pwdlen == 0) { + return MBEDTLS_ERR_PK_PASSWORD_REQUIRED; + } + + /* + * This function parses the EncryptedPrivateKeyInfo object (PKCS#8) + * + * EncryptedPrivateKeyInfo ::= SEQUENCE { + * encryptionAlgorithm EncryptionAlgorithmIdentifier, + * encryptedData EncryptedData + * } + * + * EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier + * + * EncryptedData ::= OCTET STRING + * + * The EncryptedData OCTET STRING is a PKCS#8 PrivateKeyInfo + * + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + end = p + len; + + if ((ret = mbedtls_asn1_get_alg(&p, end, &pbe_alg_oid, &pbe_params)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OCTET_STRING)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret); + } + + buf = p; + + /* + * Decrypt EncryptedData with appropriate PBE + */ +#if defined(MBEDTLS_PKCS12_C) + if (mbedtls_oid_get_pkcs12_pbe_alg(&pbe_alg_oid, &md_alg, &cipher_alg) == 0) { + if ((ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, + cipher_alg, md_alg, + pwd, pwdlen, p, len, buf)) != 0) { + if (ret == MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH) { + return MBEDTLS_ERR_PK_PASSWORD_MISMATCH; + } + + return ret; + } + + decrypted = 1; + } else if (MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128, &pbe_alg_oid) == 0) { + if ((ret = mbedtls_pkcs12_pbe_sha1_rc4_128(&pbe_params, + MBEDTLS_PKCS12_PBE_DECRYPT, + pwd, pwdlen, + p, len, buf)) != 0) { + return ret; + } + + // Best guess for password mismatch when using RC4. If first tag is + // not MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE + // + if (*buf != (MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) { + return MBEDTLS_ERR_PK_PASSWORD_MISMATCH; + } + + decrypted = 1; + } else +#endif /* MBEDTLS_PKCS12_C */ +#if defined(MBEDTLS_PKCS5_C) + if (MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS5_PBES2, &pbe_alg_oid) == 0) { + if ((ret = mbedtls_pkcs5_pbes2(&pbe_params, MBEDTLS_PKCS5_DECRYPT, pwd, pwdlen, + p, len, buf)) != 0) { + if (ret == MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH) { + return MBEDTLS_ERR_PK_PASSWORD_MISMATCH; + } + + return ret; + } + + decrypted = 1; + } else +#endif /* MBEDTLS_PKCS5_C */ + { + ((void) pwd); + } + + if (decrypted == 0) { + return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE; + } + + return pk_parse_key_pkcs8_unencrypted_der(pk, buf, len); +} +#endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */ + +/* + * Parse a private key + */ +int mbedtls_pk_parse_key(mbedtls_pk_context *pk, + const unsigned char *key, size_t keylen, + const unsigned char *pwd, size_t pwdlen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const mbedtls_pk_info_t *pk_info; +#if defined(MBEDTLS_PEM_PARSE_C) + size_t len; + mbedtls_pem_context pem; +#endif + + (void) pk_info; + + PK_VALIDATE_RET(pk != NULL); + if (keylen == 0) { + return MBEDTLS_ERR_PK_KEY_INVALID_FORMAT; + } + PK_VALIDATE_RET(key != NULL); + +#if defined(MBEDTLS_PEM_PARSE_C) + mbedtls_pem_init(&pem); + +#if defined(MBEDTLS_RSA_C) + /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ + if (key[keylen - 1] != '\0') { + ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; + } else { + ret = mbedtls_pem_read_buffer(&pem, + "-----BEGIN RSA PRIVATE KEY-----", + "-----END RSA PRIVATE KEY-----", + key, pwd, pwdlen, &len); + } + + if (ret == 0) { + pk_info = mbedtls_pk_info_from_type(MBEDTLS_PK_RSA); + if ((ret = mbedtls_pk_setup(pk, pk_info)) != 0 || + (ret = pk_parse_key_pkcs1_der(mbedtls_pk_rsa(*pk), + pem.buf, pem.buflen)) != 0) { + mbedtls_pk_free(pk); + } + + mbedtls_pem_free(&pem); + return ret; + } else if (ret == MBEDTLS_ERR_PEM_PASSWORD_MISMATCH) { + return MBEDTLS_ERR_PK_PASSWORD_MISMATCH; + } else if (ret == MBEDTLS_ERR_PEM_PASSWORD_REQUIRED) { + return MBEDTLS_ERR_PK_PASSWORD_REQUIRED; + } else if (ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) { + return ret; + } +#endif /* MBEDTLS_RSA_C */ + +#if defined(MBEDTLS_ECP_C) + /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ + if (key[keylen - 1] != '\0') { + ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; + } else { + ret = mbedtls_pem_read_buffer(&pem, + "-----BEGIN EC PRIVATE KEY-----", + "-----END EC PRIVATE KEY-----", + key, pwd, pwdlen, &len); + } + if (ret == 0) { + pk_info = mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY); + + if ((ret = mbedtls_pk_setup(pk, pk_info)) != 0 || + (ret = pk_parse_key_sec1_der(mbedtls_pk_ec(*pk), + pem.buf, pem.buflen)) != 0) { + mbedtls_pk_free(pk); + } + + mbedtls_pem_free(&pem); + return ret; + } else if (ret == MBEDTLS_ERR_PEM_PASSWORD_MISMATCH) { + return MBEDTLS_ERR_PK_PASSWORD_MISMATCH; + } else if (ret == MBEDTLS_ERR_PEM_PASSWORD_REQUIRED) { + return MBEDTLS_ERR_PK_PASSWORD_REQUIRED; + } else if (ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) { + return ret; + } +#endif /* MBEDTLS_ECP_C */ + + /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ + if (key[keylen - 1] != '\0') { + ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; + } else { + ret = mbedtls_pem_read_buffer(&pem, + "-----BEGIN PRIVATE KEY-----", + "-----END PRIVATE KEY-----", + key, NULL, 0, &len); + } + if (ret == 0) { + if ((ret = pk_parse_key_pkcs8_unencrypted_der(pk, + pem.buf, pem.buflen)) != 0) { + mbedtls_pk_free(pk); + } + + mbedtls_pem_free(&pem); + return ret; + } else if (ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) { + return ret; + } + +#if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C) + /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ + if (key[keylen - 1] != '\0') { + ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; + } else { + ret = mbedtls_pem_read_buffer(&pem, + "-----BEGIN ENCRYPTED PRIVATE KEY-----", + "-----END ENCRYPTED PRIVATE KEY-----", + key, NULL, 0, &len); + } + if (ret == 0) { + if ((ret = pk_parse_key_pkcs8_encrypted_der(pk, + pem.buf, pem.buflen, + pwd, pwdlen)) != 0) { + mbedtls_pk_free(pk); + } + + mbedtls_pem_free(&pem); + return ret; + } else if (ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) { + return ret; + } +#endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */ +#else + ((void) pwd); + ((void) pwdlen); +#endif /* MBEDTLS_PEM_PARSE_C */ + + /* + * At this point we only know it's not a PEM formatted key. Could be any + * of the known DER encoded private key formats + * + * We try the different DER format parsers to see if one passes without + * error + */ +#if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C) + { + unsigned char *key_copy; + + if ((key_copy = mbedtls_calloc(1, keylen)) == NULL) { + return MBEDTLS_ERR_PK_ALLOC_FAILED; + } + + memcpy(key_copy, key, keylen); + + ret = pk_parse_key_pkcs8_encrypted_der(pk, key_copy, keylen, + pwd, pwdlen); + + mbedtls_platform_zeroize(key_copy, keylen); + mbedtls_free(key_copy); + } + + if (ret == 0) { + return 0; + } + + mbedtls_pk_free(pk); + mbedtls_pk_init(pk); + + if (ret == MBEDTLS_ERR_PK_PASSWORD_MISMATCH) { + return ret; + } +#endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */ + + ret = pk_parse_key_pkcs8_unencrypted_der(pk, key, keylen); + if (ret == 0) { + return 0; + } + + mbedtls_pk_free(pk); + mbedtls_pk_init(pk); + +#if defined(MBEDTLS_RSA_C) + + pk_info = mbedtls_pk_info_from_type(MBEDTLS_PK_RSA); + if (mbedtls_pk_setup(pk, pk_info) == 0 && + pk_parse_key_pkcs1_der(mbedtls_pk_rsa(*pk), key, keylen) == 0) { + return 0; + } + + mbedtls_pk_free(pk); + mbedtls_pk_init(pk); +#endif /* MBEDTLS_RSA_C */ + +#if defined(MBEDTLS_ECP_C) + pk_info = mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY); + if (mbedtls_pk_setup(pk, pk_info) == 0 && + pk_parse_key_sec1_der(mbedtls_pk_ec(*pk), + key, keylen) == 0) { + return 0; + } + mbedtls_pk_free(pk); +#endif /* MBEDTLS_ECP_C */ + + /* If MBEDTLS_RSA_C is defined but MBEDTLS_ECP_C isn't, + * it is ok to leave the PK context initialized but not + * freed: It is the caller's responsibility to call pk_init() + * before calling this function, and to call pk_free() + * when it fails. If MBEDTLS_ECP_C is defined but MBEDTLS_RSA_C + * isn't, this leads to mbedtls_pk_free() being called + * twice, once here and once by the caller, but this is + * also ok and in line with the mbedtls_pk_free() calls + * on failed PEM parsing attempts. */ + + return MBEDTLS_ERR_PK_KEY_INVALID_FORMAT; +} + +/* + * Parse a public key + */ +int mbedtls_pk_parse_public_key(mbedtls_pk_context *ctx, + const unsigned char *key, size_t keylen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *p; +#if defined(MBEDTLS_RSA_C) + const mbedtls_pk_info_t *pk_info; +#endif +#if defined(MBEDTLS_PEM_PARSE_C) + size_t len; + mbedtls_pem_context pem; +#endif + + PK_VALIDATE_RET(ctx != NULL); + if (keylen == 0) { + return MBEDTLS_ERR_PK_KEY_INVALID_FORMAT; + } + PK_VALIDATE_RET(key != NULL || keylen == 0); + +#if defined(MBEDTLS_PEM_PARSE_C) + mbedtls_pem_init(&pem); +#if defined(MBEDTLS_RSA_C) + /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ + if (key[keylen - 1] != '\0') { + ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; + } else { + ret = mbedtls_pem_read_buffer(&pem, + "-----BEGIN RSA PUBLIC KEY-----", + "-----END RSA PUBLIC KEY-----", + key, NULL, 0, &len); + } + + if (ret == 0) { + p = pem.buf; + if ((pk_info = mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == NULL) { + mbedtls_pem_free(&pem); + return MBEDTLS_ERR_PK_UNKNOWN_PK_ALG; + } + + if ((ret = mbedtls_pk_setup(ctx, pk_info)) != 0) { + mbedtls_pem_free(&pem); + return ret; + } + + if ((ret = pk_get_rsapubkey(&p, p + pem.buflen, mbedtls_pk_rsa(*ctx))) != 0) { + mbedtls_pk_free(ctx); + } + + mbedtls_pem_free(&pem); + return ret; + } else if (ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) { + mbedtls_pem_free(&pem); + return ret; + } +#endif /* MBEDTLS_RSA_C */ + + /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ + if (key[keylen - 1] != '\0') { + ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; + } else { + ret = mbedtls_pem_read_buffer(&pem, + "-----BEGIN PUBLIC KEY-----", + "-----END PUBLIC KEY-----", + key, NULL, 0, &len); + } + + if (ret == 0) { + /* + * Was PEM encoded + */ + p = pem.buf; + + ret = mbedtls_pk_parse_subpubkey(&p, p + pem.buflen, ctx); + mbedtls_pem_free(&pem); + return ret; + } else if (ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) { + mbedtls_pem_free(&pem); + return ret; + } + mbedtls_pem_free(&pem); +#endif /* MBEDTLS_PEM_PARSE_C */ + +#if defined(MBEDTLS_RSA_C) + if ((pk_info = mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == NULL) { + return MBEDTLS_ERR_PK_UNKNOWN_PK_ALG; + } + + if ((ret = mbedtls_pk_setup(ctx, pk_info)) != 0) { + return ret; + } + + p = (unsigned char *) key; + ret = pk_get_rsapubkey(&p, p + keylen, mbedtls_pk_rsa(*ctx)); + if (ret == 0) { + return ret; + } + mbedtls_pk_free(ctx); + if (ret != (MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_INVALID_PUBKEY, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG))) { + return ret; + } +#endif /* MBEDTLS_RSA_C */ + p = (unsigned char *) key; + + ret = mbedtls_pk_parse_subpubkey(&p, p + keylen, ctx); + + return ret; +} + +#endif /* MBEDTLS_PK_PARSE_C */ diff --git a/ext/opcua_client/mbedtls/library/pkwrite.c b/ext/opcua_client/mbedtls/library/pkwrite.c new file mode 100644 index 0000000..534290d --- /dev/null +++ b/ext/opcua_client/mbedtls/library/pkwrite.c @@ -0,0 +1,638 @@ +/* + * Public Key layer for writing key files and structures + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PK_WRITE_C) + +#include "mbedtls/pk.h" +#include "mbedtls/asn1write.h" +#include "mbedtls/oid.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#if defined(MBEDTLS_RSA_C) +#include "mbedtls/rsa.h" +#endif +#if defined(MBEDTLS_ECP_C) +#include "mbedtls/bignum.h" +#include "mbedtls/ecp.h" +#include "mbedtls/platform_util.h" +#endif +#if defined(MBEDTLS_ECDSA_C) +#include "mbedtls/ecdsa.h" +#endif +#if defined(MBEDTLS_PEM_WRITE_C) +#include "mbedtls/pem.h" +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "psa/crypto.h" +#include "mbedtls/psa_util.h" +#endif +#include "mbedtls/platform.h" + +/* Parameter validation macros based on platform_util.h */ +#define PK_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_PK_BAD_INPUT_DATA) +#define PK_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +#if defined(MBEDTLS_RSA_C) +/* + * RSAPublicKey ::= SEQUENCE { + * modulus INTEGER, -- n + * publicExponent INTEGER -- e + * } + */ +static int pk_write_rsa_pubkey(unsigned char **p, unsigned char *start, + mbedtls_rsa_context *rsa) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + mbedtls_mpi T; + + mbedtls_mpi_init(&T); + + /* Export E */ + if ((ret = mbedtls_rsa_export(rsa, NULL, NULL, NULL, NULL, &T)) != 0 || + (ret = mbedtls_asn1_write_mpi(p, start, &T)) < 0) { + goto end_of_export; + } + len += ret; + + /* Export N */ + if ((ret = mbedtls_rsa_export(rsa, &T, NULL, NULL, NULL, NULL)) != 0 || + (ret = mbedtls_asn1_write_mpi(p, start, &T)) < 0) { + goto end_of_export; + } + len += ret; + +end_of_export: + + mbedtls_mpi_free(&T); + if (ret < 0) { + return ret; + } + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + + return (int) len; +} +#endif /* MBEDTLS_RSA_C */ + +#if defined(MBEDTLS_ECP_C) +/* + * EC public key is an EC point + */ +static int pk_write_ec_pubkey(unsigned char **p, unsigned char *start, + mbedtls_ecp_keypair *ec) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + unsigned char buf[MBEDTLS_ECP_MAX_PT_LEN]; + + if ((ret = mbedtls_ecp_point_write_binary(&ec->grp, &ec->Q, + MBEDTLS_ECP_PF_UNCOMPRESSED, + &len, buf, sizeof(buf))) != 0) { + return ret; + } + + if (*p < start || (size_t) (*p - start) < len) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + *p -= len; + memcpy(*p, buf, len); + + return (int) len; +} + +/* + * ECParameters ::= CHOICE { + * namedCurve OBJECT IDENTIFIER + * } + */ +static int pk_write_ec_param(unsigned char **p, unsigned char *start, + mbedtls_ecp_keypair *ec) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + const char *oid; + size_t oid_len; + + if ((ret = mbedtls_oid_get_oid_by_ec_grp(ec->grp.id, &oid, &oid_len)) != 0) { + return ret; + } + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_oid(p, start, oid, oid_len)); + + return (int) len; +} + +/* + * privateKey OCTET STRING -- always of length ceil(log2(n)/8) + */ +static int pk_write_ec_private(unsigned char **p, unsigned char *start, + mbedtls_ecp_keypair *ec) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t byte_length = (ec->grp.pbits + 7) / 8; + unsigned char tmp[MBEDTLS_ECP_MAX_BYTES]; + + ret = mbedtls_ecp_write_key(ec, tmp, byte_length); + if (ret != 0) { + goto exit; + } + ret = mbedtls_asn1_write_octet_string(p, start, tmp, byte_length); + +exit: + mbedtls_platform_zeroize(tmp, byte_length); + return ret; +} +#endif /* MBEDTLS_ECP_C */ + +int mbedtls_pk_write_pubkey(unsigned char **p, unsigned char *start, + const mbedtls_pk_context *key) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + (void) p; + (void) start; + (void) key; + (void) ret; + + PK_VALIDATE_RET(p != NULL); + PK_VALIDATE_RET(*p != NULL); + PK_VALIDATE_RET(start != NULL); + PK_VALIDATE_RET(key != NULL); + +#if defined(MBEDTLS_RSA_C) + if (mbedtls_pk_get_type(key) == MBEDTLS_PK_RSA) { + MBEDTLS_ASN1_CHK_ADD(len, pk_write_rsa_pubkey(p, start, mbedtls_pk_rsa(*key))); + } else +#endif +#if defined(MBEDTLS_ECP_C) + if (mbedtls_pk_get_type(key) == MBEDTLS_PK_ECKEY) { + MBEDTLS_ASN1_CHK_ADD(len, pk_write_ec_pubkey(p, start, mbedtls_pk_ec(*key))); + } else +#endif +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (mbedtls_pk_get_type(key) == MBEDTLS_PK_OPAQUE) { + size_t buffer_size; + psa_key_id_t *key_id = (psa_key_id_t *) key->pk_ctx; + + if (*p < start) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } + + buffer_size = (size_t) (*p - start); + if (psa_export_public_key(*key_id, start, buffer_size, &len) + != PSA_SUCCESS) { + return MBEDTLS_ERR_PK_BAD_INPUT_DATA; + } else { + *p -= len; + memmove(*p, start, len); + } + } else +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE; + + return (int) len; +} + +int mbedtls_pk_write_pubkey_der(mbedtls_pk_context *key, unsigned char *buf, size_t size) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *c; + size_t len = 0, par_len = 0, oid_len; + mbedtls_pk_type_t pk_type; + const char *oid; + + PK_VALIDATE_RET(key != NULL); + if (size == 0) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + PK_VALIDATE_RET(buf != NULL); + + c = buf + size; + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_pk_write_pubkey(&c, buf, key)); + + if (c - buf < 1) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + /* + * SubjectPublicKeyInfo ::= SEQUENCE { + * algorithm AlgorithmIdentifier, + * subjectPublicKey BIT STRING } + */ + *--c = 0; + len += 1; + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(&c, buf, MBEDTLS_ASN1_BIT_STRING)); + + pk_type = mbedtls_pk_get_type(key); +#if defined(MBEDTLS_ECP_C) + if (pk_type == MBEDTLS_PK_ECKEY) { + MBEDTLS_ASN1_CHK_ADD(par_len, pk_write_ec_param(&c, buf, mbedtls_pk_ec(*key))); + } +#endif +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (pk_type == MBEDTLS_PK_OPAQUE) { + psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + psa_key_type_t key_type; + psa_key_id_t key_id; + psa_ecc_family_t curve; + size_t bits; + + key_id = *((psa_key_id_t *) key->pk_ctx); + if (PSA_SUCCESS != psa_get_key_attributes(key_id, &attributes)) { + return MBEDTLS_ERR_PK_HW_ACCEL_FAILED; + } + key_type = psa_get_key_type(&attributes); + bits = psa_get_key_bits(&attributes); + psa_reset_key_attributes(&attributes); + + curve = PSA_KEY_TYPE_ECC_GET_FAMILY(key_type); + if (curve == 0) { + return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE; + } + + ret = mbedtls_psa_get_ecc_oid_from_id(curve, bits, &oid, &oid_len); + if (ret != 0) { + return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE; + } + + /* Write EC algorithm parameters; that's akin + * to pk_write_ec_param() above. */ + MBEDTLS_ASN1_CHK_ADD(par_len, mbedtls_asn1_write_oid(&c, buf, + oid, oid_len)); + + /* The rest of the function works as for legacy EC contexts. */ + pk_type = MBEDTLS_PK_ECKEY; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + if ((ret = mbedtls_oid_get_oid_by_pk_alg(pk_type, &oid, + &oid_len)) != 0) { + return ret; + } + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_algorithm_identifier(&c, buf, oid, oid_len, + par_len)); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(&c, buf, MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + + return (int) len; +} + +int mbedtls_pk_write_key_der(mbedtls_pk_context *key, unsigned char *buf, size_t size) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *c; + size_t len = 0; + + (void) ret; + (void) c; + (void) key; + + PK_VALIDATE_RET(key != NULL); + if (size == 0) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + PK_VALIDATE_RET(buf != NULL); + + c = buf + size; + +#if defined(MBEDTLS_RSA_C) + if (mbedtls_pk_get_type(key) == MBEDTLS_PK_RSA) { + mbedtls_mpi T; /* Temporary holding the exported parameters */ + mbedtls_rsa_context *rsa = mbedtls_pk_rsa(*key); + + /* + * Export the parameters one after another to avoid simultaneous copies. + */ + + mbedtls_mpi_init(&T); + + /* Export QP */ + if ((ret = mbedtls_rsa_export_crt(rsa, NULL, NULL, &T)) != 0 || + (ret = mbedtls_asn1_write_mpi(&c, buf, &T)) < 0) { + goto end_of_export; + } + len += ret; + + /* Export DQ */ + if ((ret = mbedtls_rsa_export_crt(rsa, NULL, &T, NULL)) != 0 || + (ret = mbedtls_asn1_write_mpi(&c, buf, &T)) < 0) { + goto end_of_export; + } + len += ret; + + /* Export DP */ + if ((ret = mbedtls_rsa_export_crt(rsa, &T, NULL, NULL)) != 0 || + (ret = mbedtls_asn1_write_mpi(&c, buf, &T)) < 0) { + goto end_of_export; + } + len += ret; + + /* Export Q */ + if ((ret = mbedtls_rsa_export(rsa, NULL, NULL, + &T, NULL, NULL)) != 0 || + (ret = mbedtls_asn1_write_mpi(&c, buf, &T)) < 0) { + goto end_of_export; + } + len += ret; + + /* Export P */ + if ((ret = mbedtls_rsa_export(rsa, NULL, &T, + NULL, NULL, NULL)) != 0 || + (ret = mbedtls_asn1_write_mpi(&c, buf, &T)) < 0) { + goto end_of_export; + } + len += ret; + + /* Export D */ + if ((ret = mbedtls_rsa_export(rsa, NULL, NULL, + NULL, &T, NULL)) != 0 || + (ret = mbedtls_asn1_write_mpi(&c, buf, &T)) < 0) { + goto end_of_export; + } + len += ret; + + /* Export E */ + if ((ret = mbedtls_rsa_export(rsa, NULL, NULL, + NULL, NULL, &T)) != 0 || + (ret = mbedtls_asn1_write_mpi(&c, buf, &T)) < 0) { + goto end_of_export; + } + len += ret; + + /* Export N */ + if ((ret = mbedtls_rsa_export(rsa, &T, NULL, + NULL, NULL, NULL)) != 0 || + (ret = mbedtls_asn1_write_mpi(&c, buf, &T)) < 0) { + goto end_of_export; + } + len += ret; + +end_of_export: + + mbedtls_mpi_free(&T); + if (ret < 0) { + return ret; + } + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_int(&c, buf, 0)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(&c, + buf, MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + } else +#endif /* MBEDTLS_RSA_C */ +#if defined(MBEDTLS_ECP_C) + if (mbedtls_pk_get_type(key) == MBEDTLS_PK_ECKEY) { + mbedtls_ecp_keypair *ec = mbedtls_pk_ec(*key); + size_t pub_len = 0, par_len = 0; + + /* + * RFC 5915, or SEC1 Appendix C.4 + * + * ECPrivateKey ::= SEQUENCE { + * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), + * privateKey OCTET STRING, + * parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, + * publicKey [1] BIT STRING OPTIONAL + * } + */ + + /* publicKey */ + MBEDTLS_ASN1_CHK_ADD(pub_len, pk_write_ec_pubkey(&c, buf, ec)); + + if (c - buf < 1) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + *--c = 0; + pub_len += 1; + + MBEDTLS_ASN1_CHK_ADD(pub_len, mbedtls_asn1_write_len(&c, buf, pub_len)); + MBEDTLS_ASN1_CHK_ADD(pub_len, mbedtls_asn1_write_tag(&c, buf, MBEDTLS_ASN1_BIT_STRING)); + + MBEDTLS_ASN1_CHK_ADD(pub_len, mbedtls_asn1_write_len(&c, buf, pub_len)); + MBEDTLS_ASN1_CHK_ADD(pub_len, mbedtls_asn1_write_tag(&c, buf, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | + MBEDTLS_ASN1_CONSTRUCTED | 1)); + len += pub_len; + + /* parameters */ + MBEDTLS_ASN1_CHK_ADD(par_len, pk_write_ec_param(&c, buf, ec)); + + MBEDTLS_ASN1_CHK_ADD(par_len, mbedtls_asn1_write_len(&c, buf, par_len)); + MBEDTLS_ASN1_CHK_ADD(par_len, mbedtls_asn1_write_tag(&c, buf, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | + MBEDTLS_ASN1_CONSTRUCTED | 0)); + len += par_len; + + /* privateKey */ + MBEDTLS_ASN1_CHK_ADD(len, pk_write_ec_private(&c, buf, ec)); + + /* version */ + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_int(&c, buf, 1)); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(&c, buf, MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + } else +#endif /* MBEDTLS_ECP_C */ + return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE; + + return (int) len; +} + +#if defined(MBEDTLS_PEM_WRITE_C) + +#define PEM_BEGIN_PUBLIC_KEY "-----BEGIN PUBLIC KEY-----\n" +#define PEM_END_PUBLIC_KEY "-----END PUBLIC KEY-----\n" + +#define PEM_BEGIN_PRIVATE_KEY_RSA "-----BEGIN RSA PRIVATE KEY-----\n" +#define PEM_END_PRIVATE_KEY_RSA "-----END RSA PRIVATE KEY-----\n" +#define PEM_BEGIN_PRIVATE_KEY_EC "-----BEGIN EC PRIVATE KEY-----\n" +#define PEM_END_PRIVATE_KEY_EC "-----END EC PRIVATE KEY-----\n" + +/* + * Max sizes of key per types. Shown as tag + len (+ content). + */ + +#if defined(MBEDTLS_RSA_C) +/* + * RSA public keys: + * SubjectPublicKeyInfo ::= SEQUENCE { 1 + 3 + * algorithm AlgorithmIdentifier, 1 + 1 (sequence) + * + 1 + 1 + 9 (rsa oid) + * + 1 + 1 (params null) + * subjectPublicKey BIT STRING } 1 + 3 + (1 + below) + * RSAPublicKey ::= SEQUENCE { 1 + 3 + * modulus INTEGER, -- n 1 + 3 + MPI_MAX + 1 + * publicExponent INTEGER -- e 1 + 3 + MPI_MAX + 1 + * } + */ +#define RSA_PUB_DER_MAX_BYTES (38 + 2 * MBEDTLS_MPI_MAX_SIZE) + +/* + * RSA private keys: + * RSAPrivateKey ::= SEQUENCE { 1 + 3 + * version Version, 1 + 1 + 1 + * modulus INTEGER, 1 + 3 + MPI_MAX + 1 + * publicExponent INTEGER, 1 + 3 + MPI_MAX + 1 + * privateExponent INTEGER, 1 + 3 + MPI_MAX + 1 + * prime1 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 + * prime2 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 + * exponent1 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 + * exponent2 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 + * coefficient INTEGER, 1 + 3 + MPI_MAX / 2 + 1 + * otherPrimeInfos OtherPrimeInfos OPTIONAL 0 (not supported) + * } + */ +#define MPI_MAX_SIZE_2 (MBEDTLS_MPI_MAX_SIZE / 2 + \ + MBEDTLS_MPI_MAX_SIZE % 2) +#define RSA_PRV_DER_MAX_BYTES (47 + 3 * MBEDTLS_MPI_MAX_SIZE \ + + 5 * MPI_MAX_SIZE_2) + +#else /* MBEDTLS_RSA_C */ + +#define RSA_PUB_DER_MAX_BYTES 0 +#define RSA_PRV_DER_MAX_BYTES 0 + +#endif /* MBEDTLS_RSA_C */ + +#if defined(MBEDTLS_ECP_C) +/* + * EC public keys: + * SubjectPublicKeyInfo ::= SEQUENCE { 1 + 2 + * algorithm AlgorithmIdentifier, 1 + 1 (sequence) + * + 1 + 1 + 7 (ec oid) + * + 1 + 1 + 9 (namedCurve oid) + * subjectPublicKey BIT STRING 1 + 2 + 1 [1] + * + 1 (point format) [1] + * + 2 * ECP_MAX (coords) [1] + * } + */ +#define ECP_PUB_DER_MAX_BYTES (30 + 2 * MBEDTLS_ECP_MAX_BYTES) + +/* + * EC private keys: + * ECPrivateKey ::= SEQUENCE { 1 + 2 + * version INTEGER , 1 + 1 + 1 + * privateKey OCTET STRING, 1 + 1 + ECP_MAX + * parameters [0] ECParameters OPTIONAL, 1 + 1 + (1 + 1 + 9) + * publicKey [1] BIT STRING OPTIONAL 1 + 2 + [1] above + * } + */ +#define ECP_PRV_DER_MAX_BYTES (29 + 3 * MBEDTLS_ECP_MAX_BYTES) + +#else /* MBEDTLS_ECP_C */ + +#define ECP_PUB_DER_MAX_BYTES 0 +#define ECP_PRV_DER_MAX_BYTES 0 + +#endif /* MBEDTLS_ECP_C */ + +#define PUB_DER_MAX_BYTES (RSA_PUB_DER_MAX_BYTES > ECP_PUB_DER_MAX_BYTES ? \ + RSA_PUB_DER_MAX_BYTES : ECP_PUB_DER_MAX_BYTES) +#define PRV_DER_MAX_BYTES (RSA_PRV_DER_MAX_BYTES > ECP_PRV_DER_MAX_BYTES ? \ + RSA_PRV_DER_MAX_BYTES : ECP_PRV_DER_MAX_BYTES) + +int mbedtls_pk_write_pubkey_pem(mbedtls_pk_context *key, unsigned char *buf, size_t size) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *output_buf = NULL; + output_buf = mbedtls_calloc(1, PUB_DER_MAX_BYTES); + if (output_buf == NULL) { + return MBEDTLS_ERR_PK_ALLOC_FAILED; + } + size_t olen = 0; + + PK_VALIDATE_RET(key != NULL); + PK_VALIDATE_RET(buf != NULL || size == 0); + + if ((ret = mbedtls_pk_write_pubkey_der(key, output_buf, + PUB_DER_MAX_BYTES)) < 0) { + goto cleanup; + } + + if ((ret = mbedtls_pem_write_buffer(PEM_BEGIN_PUBLIC_KEY, PEM_END_PUBLIC_KEY, + output_buf + PUB_DER_MAX_BYTES - ret, + ret, buf, size, &olen)) != 0) { + goto cleanup; + } + + ret = 0; +cleanup: + mbedtls_free(output_buf); + return ret; +} + +int mbedtls_pk_write_key_pem(mbedtls_pk_context *key, unsigned char *buf, size_t size) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *output_buf = NULL; + output_buf = mbedtls_calloc(1, PRV_DER_MAX_BYTES); + if (output_buf == NULL) { + return MBEDTLS_ERR_PK_ALLOC_FAILED; + } + const char *begin, *end; + size_t olen = 0; + + PK_VALIDATE_RET(key != NULL); + PK_VALIDATE_RET(buf != NULL || size == 0); + + if ((ret = mbedtls_pk_write_key_der(key, output_buf, PRV_DER_MAX_BYTES)) < 0) { + goto cleanup; + } + +#if defined(MBEDTLS_RSA_C) + if (mbedtls_pk_get_type(key) == MBEDTLS_PK_RSA) { + begin = PEM_BEGIN_PRIVATE_KEY_RSA; + end = PEM_END_PRIVATE_KEY_RSA; + } else +#endif +#if defined(MBEDTLS_ECP_C) + if (mbedtls_pk_get_type(key) == MBEDTLS_PK_ECKEY) { + begin = PEM_BEGIN_PRIVATE_KEY_EC; + end = PEM_END_PRIVATE_KEY_EC; + } else +#endif + { + ret = MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE; + goto cleanup; + } + + if ((ret = mbedtls_pem_write_buffer(begin, end, + output_buf + PRV_DER_MAX_BYTES - ret, + ret, buf, size, &olen)) != 0) { + goto cleanup; + } + + ret = 0; +cleanup: + mbedtls_platform_zeroize(output_buf, PRV_DER_MAX_BYTES); + mbedtls_free(output_buf); + return ret; +} +#endif /* MBEDTLS_PEM_WRITE_C */ + +#endif /* MBEDTLS_PK_WRITE_C */ diff --git a/ext/opcua_client/mbedtls/library/platform.c b/ext/opcua_client/mbedtls/library/platform.c new file mode 100644 index 0000000..e82cbeb --- /dev/null +++ b/ext/opcua_client/mbedtls/library/platform.c @@ -0,0 +1,374 @@ +/* + * Platform abstraction layer + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PLATFORM_C) + +#include "mbedtls/platform.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +/* The compile time configuration of memory allocation via the macros + * MBEDTLS_PLATFORM_{FREE/CALLOC}_MACRO takes precedence over the runtime + * configuration via mbedtls_platform_set_calloc_free(). So, omit everything + * related to the latter if MBEDTLS_PLATFORM_{FREE/CALLOC}_MACRO are defined. */ +#if defined(MBEDTLS_PLATFORM_MEMORY) && \ + !(defined(MBEDTLS_PLATFORM_CALLOC_MACRO) && \ + defined(MBEDTLS_PLATFORM_FREE_MACRO)) + +#if !defined(MBEDTLS_PLATFORM_STD_CALLOC) +static void *platform_calloc_uninit(size_t n, size_t size) +{ + ((void) n); + ((void) size); + return NULL; +} + +#define MBEDTLS_PLATFORM_STD_CALLOC platform_calloc_uninit +#endif /* !MBEDTLS_PLATFORM_STD_CALLOC */ + +#if !defined(MBEDTLS_PLATFORM_STD_FREE) +static void platform_free_uninit(void *ptr) +{ + ((void) ptr); +} + +#define MBEDTLS_PLATFORM_STD_FREE platform_free_uninit +#endif /* !MBEDTLS_PLATFORM_STD_FREE */ + +static void * (*mbedtls_calloc_func)(size_t, size_t) = MBEDTLS_PLATFORM_STD_CALLOC; +static void (*mbedtls_free_func)(void *) = MBEDTLS_PLATFORM_STD_FREE; + +void *mbedtls_calloc(size_t nmemb, size_t size) +{ + return (*mbedtls_calloc_func)(nmemb, size); +} + +void mbedtls_free(void *ptr) +{ + (*mbedtls_free_func)(ptr); +} + +int mbedtls_platform_set_calloc_free(void *(*calloc_func)(size_t, size_t), + void (*free_func)(void *)) +{ + mbedtls_calloc_func = calloc_func; + mbedtls_free_func = free_func; + return 0; +} +#endif /* MBEDTLS_PLATFORM_MEMORY && + !( defined(MBEDTLS_PLATFORM_CALLOC_MACRO) && + defined(MBEDTLS_PLATFORM_FREE_MACRO) ) */ + +#if defined(MBEDTLS_PLATFORM_HAS_NON_CONFORMING_SNPRINTF) +#include +int mbedtls_platform_win32_snprintf(char *s, size_t n, const char *fmt, ...) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + va_list argp; + + va_start(argp, fmt); + ret = mbedtls_vsnprintf(s, n, fmt, argp); + va_end(argp); + + return ret; +} +#endif + +#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) +#if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF) +/* + * Make dummy function to prevent NULL pointer dereferences + */ +static int platform_snprintf_uninit(char *s, size_t n, + const char *format, ...) +{ + ((void) s); + ((void) n); + ((void) format); + return 0; +} + +#define MBEDTLS_PLATFORM_STD_SNPRINTF platform_snprintf_uninit +#endif /* !MBEDTLS_PLATFORM_STD_SNPRINTF */ + +int (*mbedtls_snprintf)(char *s, size_t n, + const char *format, + ...) = MBEDTLS_PLATFORM_STD_SNPRINTF; + +int mbedtls_platform_set_snprintf(int (*snprintf_func)(char *s, size_t n, + const char *format, + ...)) +{ + mbedtls_snprintf = snprintf_func; + return 0; +} +#endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ + +#if defined(MBEDTLS_PLATFORM_HAS_NON_CONFORMING_VSNPRINTF) +#include +int mbedtls_platform_win32_vsnprintf(char *s, size_t n, const char *fmt, va_list arg) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + /* Avoid calling the invalid parameter handler by checking ourselves */ + if (s == NULL || n == 0 || fmt == NULL) { + return -1; + } + +#if defined(_TRUNCATE) + ret = vsnprintf_s(s, n, _TRUNCATE, fmt, arg); +#else + ret = vsnprintf(s, n, fmt, arg); + if (ret < 0 || (size_t) ret == n) { + s[n-1] = '\0'; + ret = -1; + } +#endif + + return ret; +} +#endif + +#if defined(MBEDTLS_PLATFORM_VSNPRINTF_ALT) +#if !defined(MBEDTLS_PLATFORM_STD_VSNPRINTF) +/* + * Make dummy function to prevent NULL pointer dereferences + */ +static int platform_vsnprintf_uninit(char *s, size_t n, + const char *format, va_list arg) +{ + ((void) s); + ((void) n); + ((void) format); + ((void) arg); + return -1; +} + +#define MBEDTLS_PLATFORM_STD_VSNPRINTF platform_vsnprintf_uninit +#endif /* !MBEDTLS_PLATFORM_STD_VSNPRINTF */ + +int (*mbedtls_vsnprintf)(char *s, size_t n, + const char *format, + va_list arg) = MBEDTLS_PLATFORM_STD_VSNPRINTF; + +int mbedtls_platform_set_vsnprintf(int (*vsnprintf_func)(char *s, size_t n, + const char *format, + va_list arg)) +{ + mbedtls_vsnprintf = vsnprintf_func; + return 0; +} +#endif /* MBEDTLS_PLATFORM_VSNPRINTF_ALT */ + +#if defined(MBEDTLS_PLATFORM_PRINTF_ALT) +#if !defined(MBEDTLS_PLATFORM_STD_PRINTF) +/* + * Make dummy function to prevent NULL pointer dereferences + */ +static int platform_printf_uninit(const char *format, ...) +{ + ((void) format); + return 0; +} + +#define MBEDTLS_PLATFORM_STD_PRINTF platform_printf_uninit +#endif /* !MBEDTLS_PLATFORM_STD_PRINTF */ + +int (*mbedtls_printf)(const char *, ...) = MBEDTLS_PLATFORM_STD_PRINTF; + +int mbedtls_platform_set_printf(int (*printf_func)(const char *, ...)) +{ + mbedtls_printf = printf_func; + return 0; +} +#endif /* MBEDTLS_PLATFORM_PRINTF_ALT */ + +#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) +#if !defined(MBEDTLS_PLATFORM_STD_FPRINTF) +/* + * Make dummy function to prevent NULL pointer dereferences + */ +static int platform_fprintf_uninit(FILE *stream, const char *format, ...) +{ + ((void) stream); + ((void) format); + return 0; +} + +#define MBEDTLS_PLATFORM_STD_FPRINTF platform_fprintf_uninit +#endif /* !MBEDTLS_PLATFORM_STD_FPRINTF */ + +int (*mbedtls_fprintf)(FILE *, const char *, ...) = + MBEDTLS_PLATFORM_STD_FPRINTF; + +int mbedtls_platform_set_fprintf(int (*fprintf_func)(FILE *, const char *, ...)) +{ + mbedtls_fprintf = fprintf_func; + return 0; +} +#endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */ + +#if defined(MBEDTLS_PLATFORM_EXIT_ALT) +#if !defined(MBEDTLS_PLATFORM_STD_EXIT) +/* + * Make dummy function to prevent NULL pointer dereferences + */ +static void platform_exit_uninit(int status) +{ + ((void) status); +} + +#define MBEDTLS_PLATFORM_STD_EXIT platform_exit_uninit +#endif /* !MBEDTLS_PLATFORM_STD_EXIT */ + +void (*mbedtls_exit)(int status) = MBEDTLS_PLATFORM_STD_EXIT; + +int mbedtls_platform_set_exit(void (*exit_func)(int status)) +{ + mbedtls_exit = exit_func; + return 0; +} +#endif /* MBEDTLS_PLATFORM_EXIT_ALT */ + +#if defined(MBEDTLS_HAVE_TIME) + +#if defined(MBEDTLS_PLATFORM_TIME_ALT) +#if !defined(MBEDTLS_PLATFORM_STD_TIME) +/* + * Make dummy function to prevent NULL pointer dereferences + */ +static mbedtls_time_t platform_time_uninit(mbedtls_time_t *timer) +{ + ((void) timer); + return 0; +} + +#define MBEDTLS_PLATFORM_STD_TIME platform_time_uninit +#endif /* !MBEDTLS_PLATFORM_STD_TIME */ + +mbedtls_time_t (*mbedtls_time)(mbedtls_time_t *timer) = MBEDTLS_PLATFORM_STD_TIME; + +int mbedtls_platform_set_time(mbedtls_time_t (*time_func)(mbedtls_time_t *timer)) +{ + mbedtls_time = time_func; + return 0; +} +#endif /* MBEDTLS_PLATFORM_TIME_ALT */ + +#endif /* MBEDTLS_HAVE_TIME */ + +#if defined(MBEDTLS_ENTROPY_NV_SEED) +#if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) && defined(MBEDTLS_FS_IO) +/* Default implementations for the platform independent seed functions use + * standard libc file functions to read from and write to a pre-defined filename + */ +int mbedtls_platform_std_nv_seed_read(unsigned char *buf, size_t buf_len) +{ + FILE *file; + size_t n; + + if ((file = fopen(MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "rb")) == NULL) { + return -1; + } + + if ((n = fread(buf, 1, buf_len, file)) != buf_len) { + fclose(file); + mbedtls_platform_zeroize(buf, buf_len); + return -1; + } + + fclose(file); + return (int) n; +} + +int mbedtls_platform_std_nv_seed_write(unsigned char *buf, size_t buf_len) +{ + FILE *file; + size_t n; + + if ((file = fopen(MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "w")) == NULL) { + return -1; + } + + if ((n = fwrite(buf, 1, buf_len, file)) != buf_len) { + fclose(file); + return -1; + } + + fclose(file); + return (int) n; +} +#endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ + +#if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) +#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) +/* + * Make dummy function to prevent NULL pointer dereferences + */ +static int platform_nv_seed_read_uninit(unsigned char *buf, size_t buf_len) +{ + ((void) buf); + ((void) buf_len); + return -1; +} + +#define MBEDTLS_PLATFORM_STD_NV_SEED_READ platform_nv_seed_read_uninit +#endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_READ */ + +#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) +/* + * Make dummy function to prevent NULL pointer dereferences + */ +static int platform_nv_seed_write_uninit(unsigned char *buf, size_t buf_len) +{ + ((void) buf); + ((void) buf_len); + return -1; +} + +#define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE platform_nv_seed_write_uninit +#endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_WRITE */ + +int (*mbedtls_nv_seed_read)(unsigned char *buf, size_t buf_len) = + MBEDTLS_PLATFORM_STD_NV_SEED_READ; +int (*mbedtls_nv_seed_write)(unsigned char *buf, size_t buf_len) = + MBEDTLS_PLATFORM_STD_NV_SEED_WRITE; + +int mbedtls_platform_set_nv_seed( + int (*nv_seed_read_func)(unsigned char *buf, size_t buf_len), + int (*nv_seed_write_func)(unsigned char *buf, size_t buf_len)) +{ + mbedtls_nv_seed_read = nv_seed_read_func; + mbedtls_nv_seed_write = nv_seed_write_func; + return 0; +} +#endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */ +#endif /* MBEDTLS_ENTROPY_NV_SEED */ + +#if !defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT) +/* + * Placeholder platform setup that does nothing by default + */ +int mbedtls_platform_setup(mbedtls_platform_context *ctx) +{ + (void) ctx; + + return 0; +} + +/* + * Placeholder platform teardown that does nothing by default + */ +void mbedtls_platform_teardown(mbedtls_platform_context *ctx) +{ + (void) ctx; +} +#endif /* MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */ + +#endif /* MBEDTLS_PLATFORM_C */ diff --git a/ext/opcua_client/mbedtls/library/platform_util.c b/ext/opcua_client/mbedtls/library/platform_util.c new file mode 100644 index 0000000..df34167 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/platform_util.c @@ -0,0 +1,123 @@ +/* + * Common and shared functions used by multiple modules in the Mbed TLS + * library. + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * Ensure gmtime_r is available even with -std=c99; must be defined before + * config.h, which pulls in glibc's features.h. Harmless on other platforms. + */ +#if !defined(_POSIX_C_SOURCE) +#define _POSIX_C_SOURCE 200112L +#endif + +#include "common.h" + +#include "mbedtls/platform_util.h" +#include "mbedtls/platform.h" +#include "mbedtls/threading.h" + +#include +#include + +#if !defined(MBEDTLS_PLATFORM_ZEROIZE_ALT) +/* + * This implementation should never be optimized out by the compiler + * + * This implementation for mbedtls_platform_zeroize() was inspired from Colin + * Percival's blog article at: + * + * http://www.daemonology.net/blog/2014-09-04-how-to-zero-a-buffer.html + * + * It uses a volatile function pointer to the standard memset(). Because the + * pointer is volatile the compiler expects it to change at + * any time and will not optimize out the call that could potentially perform + * other operations on the input buffer instead of just setting it to 0. + * Nevertheless, as pointed out by davidtgoldblatt on Hacker News + * (refer to http://www.daemonology.net/blog/2014-09-05-erratum.html for + * details), optimizations of the following form are still possible: + * + * if( memset_func != memset ) + * memset_func( buf, 0, len ); + * + * Note that it is extremely difficult to guarantee that + * mbedtls_platform_zeroize() will not be optimized out by aggressive compilers + * in a portable way. For this reason, Mbed TLS also provides the configuration + * option MBEDTLS_PLATFORM_ZEROIZE_ALT, which allows users to configure + * mbedtls_platform_zeroize() to use a suitable implementation for their + * platform and needs. + */ +static void *(*const volatile memset_func)(void *, int, size_t) = memset; + +void mbedtls_platform_zeroize(void *buf, size_t len) +{ + MBEDTLS_INTERNAL_VALIDATE(len == 0 || buf != NULL); + + if (len > 0) { + memset_func(buf, 0, len); + } +} +#endif /* MBEDTLS_PLATFORM_ZEROIZE_ALT */ + +#if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) +#include +#if !defined(_WIN32) && (defined(unix) || \ + defined(__unix) || defined(__unix__) || (defined(__APPLE__) && \ + defined(__MACH__)) || defined(__midipix__)) +#include +#endif /* !_WIN32 && (unix || __unix || __unix__ || + * (__APPLE__ && __MACH__)) || __midipix__ */ + +#if !((defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L) || \ + (defined(_POSIX_THREAD_SAFE_FUNCTIONS) && \ + _POSIX_THREAD_SAFE_FUNCTIONS >= 200112L)) +/* + * This is a convenience shorthand macro to avoid checking the long + * preprocessor conditions above. Ideally, we could expose this macro in + * platform_util.h and simply use it in platform_util.c, threading.c and + * threading.h. However, this macro is not part of the Mbed TLS public API, so + * we keep it private by only defining it in this file + */ +#if !(defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)) +#define PLATFORM_UTIL_USE_GMTIME +#endif /* ! ( defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) ) */ + +#endif /* !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ + ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ + _POSIX_THREAD_SAFE_FUNCTIONS >= 200112L ) ) */ + +struct tm *mbedtls_platform_gmtime_r(const mbedtls_time_t *tt, + struct tm *tm_buf) +{ +#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) + return (gmtime_s(tm_buf, tt) == 0) ? tm_buf : NULL; +#elif !defined(PLATFORM_UTIL_USE_GMTIME) + return gmtime_r(tt, tm_buf); +#else + struct tm *lt; + +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_lock(&mbedtls_threading_gmtime_mutex) != 0) { + return NULL; + } +#endif /* MBEDTLS_THREADING_C */ + + lt = gmtime(tt); + + if (lt != NULL) { + memcpy(tm_buf, lt, sizeof(struct tm)); + } + +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&mbedtls_threading_gmtime_mutex) != 0) { + return NULL; + } +#endif /* MBEDTLS_THREADING_C */ + + return (lt == NULL) ? NULL : tm_buf; +#endif /* _WIN32 && !EFIX64 && !EFI32 */ +} +#endif /* MBEDTLS_HAVE_TIME_DATE && MBEDTLS_PLATFORM_GMTIME_R_ALT */ diff --git a/ext/opcua_client/mbedtls/library/poly1305.c b/ext/opcua_client/mbedtls/library/poly1305.c new file mode 100644 index 0000000..c781107 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/poly1305.c @@ -0,0 +1,511 @@ +/** + * \file poly1305.c + * + * \brief Poly1305 authentication algorithm. + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#include "common.h" + +#if defined(MBEDTLS_POLY1305_C) + +#include "mbedtls/poly1305.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_POLY1305_ALT) + +/* Parameter validation macros */ +#define POLY1305_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA) +#define POLY1305_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +#define POLY1305_BLOCK_SIZE_BYTES (16U) + +/* + * Our implementation is tuned for 32-bit platforms with a 64-bit multiplier. + * However we provided an alternative for platforms without such a multiplier. + */ +#if defined(MBEDTLS_NO_64BIT_MULTIPLICATION) +static uint64_t mul64(uint32_t a, uint32_t b) +{ + /* a = al + 2**16 ah, b = bl + 2**16 bh */ + const uint16_t al = (uint16_t) a; + const uint16_t bl = (uint16_t) b; + const uint16_t ah = a >> 16; + const uint16_t bh = b >> 16; + + /* ab = al*bl + 2**16 (ah*bl + bl*bh) + 2**32 ah*bh */ + const uint32_t lo = (uint32_t) al * bl; + const uint64_t me = (uint64_t) ((uint32_t) ah * bl) + (uint32_t) al * bh; + const uint32_t hi = (uint32_t) ah * bh; + + return lo + (me << 16) + ((uint64_t) hi << 32); +} +#else +static inline uint64_t mul64(uint32_t a, uint32_t b) +{ + return (uint64_t) a * b; +} +#endif + + +/** + * \brief Process blocks with Poly1305. + * + * \param ctx The Poly1305 context. + * \param nblocks Number of blocks to process. Note that this + * function only processes full blocks. + * \param input Buffer containing the input block(s). + * \param needs_padding Set to 0 if the padding bit has already been + * applied to the input data before calling this + * function. Otherwise, set this parameter to 1. + */ +static void poly1305_process(mbedtls_poly1305_context *ctx, + size_t nblocks, + const unsigned char *input, + uint32_t needs_padding) +{ + uint64_t d0, d1, d2, d3; + uint32_t acc0, acc1, acc2, acc3, acc4; + uint32_t r0, r1, r2, r3; + uint32_t rs1, rs2, rs3; + size_t offset = 0U; + size_t i; + + r0 = ctx->r[0]; + r1 = ctx->r[1]; + r2 = ctx->r[2]; + r3 = ctx->r[3]; + + rs1 = r1 + (r1 >> 2U); + rs2 = r2 + (r2 >> 2U); + rs3 = r3 + (r3 >> 2U); + + acc0 = ctx->acc[0]; + acc1 = ctx->acc[1]; + acc2 = ctx->acc[2]; + acc3 = ctx->acc[3]; + acc4 = ctx->acc[4]; + + /* Process full blocks */ + for (i = 0U; i < nblocks; i++) { + /* The input block is treated as a 128-bit little-endian integer */ + d0 = MBEDTLS_GET_UINT32_LE(input, offset + 0); + d1 = MBEDTLS_GET_UINT32_LE(input, offset + 4); + d2 = MBEDTLS_GET_UINT32_LE(input, offset + 8); + d3 = MBEDTLS_GET_UINT32_LE(input, offset + 12); + + /* Compute: acc += (padded) block as a 130-bit integer */ + d0 += (uint64_t) acc0; + d1 += (uint64_t) acc1 + (d0 >> 32U); + d2 += (uint64_t) acc2 + (d1 >> 32U); + d3 += (uint64_t) acc3 + (d2 >> 32U); + acc0 = (uint32_t) d0; + acc1 = (uint32_t) d1; + acc2 = (uint32_t) d2; + acc3 = (uint32_t) d3; + acc4 += (uint32_t) (d3 >> 32U) + needs_padding; + + /* Compute: acc *= r */ + d0 = mul64(acc0, r0) + + mul64(acc1, rs3) + + mul64(acc2, rs2) + + mul64(acc3, rs1); + d1 = mul64(acc0, r1) + + mul64(acc1, r0) + + mul64(acc2, rs3) + + mul64(acc3, rs2) + + mul64(acc4, rs1); + d2 = mul64(acc0, r2) + + mul64(acc1, r1) + + mul64(acc2, r0) + + mul64(acc3, rs3) + + mul64(acc4, rs2); + d3 = mul64(acc0, r3) + + mul64(acc1, r2) + + mul64(acc2, r1) + + mul64(acc3, r0) + + mul64(acc4, rs3); + acc4 *= r0; + + /* Compute: acc %= (2^130 - 5) (partial remainder) */ + d1 += (d0 >> 32); + d2 += (d1 >> 32); + d3 += (d2 >> 32); + acc0 = (uint32_t) d0; + acc1 = (uint32_t) d1; + acc2 = (uint32_t) d2; + acc3 = (uint32_t) d3; + acc4 = (uint32_t) (d3 >> 32) + acc4; + + d0 = (uint64_t) acc0 + (acc4 >> 2) + (acc4 & 0xFFFFFFFCU); + acc4 &= 3U; + acc0 = (uint32_t) d0; + d0 = (uint64_t) acc1 + (d0 >> 32U); + acc1 = (uint32_t) d0; + d0 = (uint64_t) acc2 + (d0 >> 32U); + acc2 = (uint32_t) d0; + d0 = (uint64_t) acc3 + (d0 >> 32U); + acc3 = (uint32_t) d0; + d0 = (uint64_t) acc4 + (d0 >> 32U); + acc4 = (uint32_t) d0; + + offset += POLY1305_BLOCK_SIZE_BYTES; + } + + ctx->acc[0] = acc0; + ctx->acc[1] = acc1; + ctx->acc[2] = acc2; + ctx->acc[3] = acc3; + ctx->acc[4] = acc4; +} + +/** + * \brief Compute the Poly1305 MAC + * + * \param ctx The Poly1305 context. + * \param mac The buffer to where the MAC is written. Must be + * big enough to contain the 16-byte MAC. + */ +static void poly1305_compute_mac(const mbedtls_poly1305_context *ctx, + unsigned char mac[16]) +{ + uint64_t d; + uint32_t g0, g1, g2, g3, g4; + uint32_t acc0, acc1, acc2, acc3, acc4; + uint32_t mask; + uint32_t mask_inv; + + acc0 = ctx->acc[0]; + acc1 = ctx->acc[1]; + acc2 = ctx->acc[2]; + acc3 = ctx->acc[3]; + acc4 = ctx->acc[4]; + + /* Before adding 's' we ensure that the accumulator is mod 2^130 - 5. + * We do this by calculating acc - (2^130 - 5), then checking if + * the 131st bit is set. If it is, then reduce: acc -= (2^130 - 5) + */ + + /* Calculate acc + -(2^130 - 5) */ + d = ((uint64_t) acc0 + 5U); + g0 = (uint32_t) d; + d = ((uint64_t) acc1 + (d >> 32)); + g1 = (uint32_t) d; + d = ((uint64_t) acc2 + (d >> 32)); + g2 = (uint32_t) d; + d = ((uint64_t) acc3 + (d >> 32)); + g3 = (uint32_t) d; + g4 = acc4 + (uint32_t) (d >> 32U); + + /* mask == 0xFFFFFFFF if 131st bit is set, otherwise mask == 0 */ + mask = (uint32_t) 0U - (g4 >> 2U); + mask_inv = ~mask; + + /* If 131st bit is set then acc=g, otherwise, acc is unmodified */ + acc0 = (acc0 & mask_inv) | (g0 & mask); + acc1 = (acc1 & mask_inv) | (g1 & mask); + acc2 = (acc2 & mask_inv) | (g2 & mask); + acc3 = (acc3 & mask_inv) | (g3 & mask); + + /* Add 's' */ + d = (uint64_t) acc0 + ctx->s[0]; + acc0 = (uint32_t) d; + d = (uint64_t) acc1 + ctx->s[1] + (d >> 32U); + acc1 = (uint32_t) d; + d = (uint64_t) acc2 + ctx->s[2] + (d >> 32U); + acc2 = (uint32_t) d; + acc3 += ctx->s[3] + (uint32_t) (d >> 32U); + + /* Compute MAC (128 least significant bits of the accumulator) */ + MBEDTLS_PUT_UINT32_LE(acc0, mac, 0); + MBEDTLS_PUT_UINT32_LE(acc1, mac, 4); + MBEDTLS_PUT_UINT32_LE(acc2, mac, 8); + MBEDTLS_PUT_UINT32_LE(acc3, mac, 12); +} + +void mbedtls_poly1305_init(mbedtls_poly1305_context *ctx) +{ + POLY1305_VALIDATE(ctx != NULL); + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_poly1305_context)); +} + +void mbedtls_poly1305_free(mbedtls_poly1305_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_poly1305_context)); +} + +int mbedtls_poly1305_starts(mbedtls_poly1305_context *ctx, + const unsigned char key[32]) +{ + POLY1305_VALIDATE_RET(ctx != NULL); + POLY1305_VALIDATE_RET(key != NULL); + + /* r &= 0x0ffffffc0ffffffc0ffffffc0fffffff */ + ctx->r[0] = MBEDTLS_GET_UINT32_LE(key, 0) & 0x0FFFFFFFU; + ctx->r[1] = MBEDTLS_GET_UINT32_LE(key, 4) & 0x0FFFFFFCU; + ctx->r[2] = MBEDTLS_GET_UINT32_LE(key, 8) & 0x0FFFFFFCU; + ctx->r[3] = MBEDTLS_GET_UINT32_LE(key, 12) & 0x0FFFFFFCU; + + ctx->s[0] = MBEDTLS_GET_UINT32_LE(key, 16); + ctx->s[1] = MBEDTLS_GET_UINT32_LE(key, 20); + ctx->s[2] = MBEDTLS_GET_UINT32_LE(key, 24); + ctx->s[3] = MBEDTLS_GET_UINT32_LE(key, 28); + + /* Initial accumulator state */ + ctx->acc[0] = 0U; + ctx->acc[1] = 0U; + ctx->acc[2] = 0U; + ctx->acc[3] = 0U; + ctx->acc[4] = 0U; + + /* Queue initially empty */ + mbedtls_platform_zeroize(ctx->queue, sizeof(ctx->queue)); + ctx->queue_len = 0U; + + return 0; +} + +int mbedtls_poly1305_update(mbedtls_poly1305_context *ctx, + const unsigned char *input, + size_t ilen) +{ + size_t offset = 0U; + size_t remaining = ilen; + size_t queue_free_len; + size_t nblocks; + POLY1305_VALIDATE_RET(ctx != NULL); + POLY1305_VALIDATE_RET(ilen == 0 || input != NULL); + + if ((remaining > 0U) && (ctx->queue_len > 0U)) { + queue_free_len = (POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len); + + if (ilen < queue_free_len) { + /* Not enough data to complete the block. + * Store this data with the other leftovers. + */ + memcpy(&ctx->queue[ctx->queue_len], + input, + ilen); + + ctx->queue_len += ilen; + + remaining = 0U; + } else { + /* Enough data to produce a complete block */ + memcpy(&ctx->queue[ctx->queue_len], + input, + queue_free_len); + + ctx->queue_len = 0U; + + poly1305_process(ctx, 1U, ctx->queue, 1U); /* add padding bit */ + + offset += queue_free_len; + remaining -= queue_free_len; + } + } + + if (remaining >= POLY1305_BLOCK_SIZE_BYTES) { + nblocks = remaining / POLY1305_BLOCK_SIZE_BYTES; + + poly1305_process(ctx, nblocks, &input[offset], 1U); + + offset += nblocks * POLY1305_BLOCK_SIZE_BYTES; + remaining %= POLY1305_BLOCK_SIZE_BYTES; + } + + if (remaining > 0U) { + /* Store partial block */ + ctx->queue_len = remaining; + memcpy(ctx->queue, &input[offset], remaining); + } + + return 0; +} + +int mbedtls_poly1305_finish(mbedtls_poly1305_context *ctx, + unsigned char mac[16]) +{ + POLY1305_VALIDATE_RET(ctx != NULL); + POLY1305_VALIDATE_RET(mac != NULL); + + /* Process any leftover data */ + if (ctx->queue_len > 0U) { + /* Add padding bit */ + ctx->queue[ctx->queue_len] = 1U; + ctx->queue_len++; + + /* Pad with zeroes */ + memset(&ctx->queue[ctx->queue_len], + 0, + POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len); + + poly1305_process(ctx, 1U, /* Process 1 block */ + ctx->queue, 0U); /* Already padded above */ + } + + poly1305_compute_mac(ctx, mac); + + return 0; +} + +int mbedtls_poly1305_mac(const unsigned char key[32], + const unsigned char *input, + size_t ilen, + unsigned char mac[16]) +{ + mbedtls_poly1305_context ctx; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + POLY1305_VALIDATE_RET(key != NULL); + POLY1305_VALIDATE_RET(mac != NULL); + POLY1305_VALIDATE_RET(ilen == 0 || input != NULL); + + mbedtls_poly1305_init(&ctx); + + ret = mbedtls_poly1305_starts(&ctx, key); + if (ret != 0) { + goto cleanup; + } + + ret = mbedtls_poly1305_update(&ctx, input, ilen); + if (ret != 0) { + goto cleanup; + } + + ret = mbedtls_poly1305_finish(&ctx, mac); + +cleanup: + mbedtls_poly1305_free(&ctx); + return ret; +} + +#endif /* MBEDTLS_POLY1305_ALT */ + +#if defined(MBEDTLS_SELF_TEST) + +static const unsigned char test_keys[2][32] = +{ + { + 0x85, 0xd6, 0xbe, 0x78, 0x57, 0x55, 0x6d, 0x33, + 0x7f, 0x44, 0x52, 0xfe, 0x42, 0xd5, 0x06, 0xa8, + 0x01, 0x03, 0x80, 0x8a, 0xfb, 0x0d, 0xb2, 0xfd, + 0x4a, 0xbf, 0xf6, 0xaf, 0x41, 0x49, 0xf5, 0x1b + }, + { + 0x1c, 0x92, 0x40, 0xa5, 0xeb, 0x55, 0xd3, 0x8a, + 0xf3, 0x33, 0x88, 0x86, 0x04, 0xf6, 0xb5, 0xf0, + 0x47, 0x39, 0x17, 0xc1, 0x40, 0x2b, 0x80, 0x09, + 0x9d, 0xca, 0x5c, 0xbc, 0x20, 0x70, 0x75, 0xc0 + } +}; + +static const unsigned char test_data[2][127] = +{ + { + 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x46, 0x6f, + 0x72, 0x75, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6f, + 0x75, 0x70 + }, + { + 0x27, 0x54, 0x77, 0x61, 0x73, 0x20, 0x62, 0x72, + 0x69, 0x6c, 0x6c, 0x69, 0x67, 0x2c, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x6c, 0x69, 0x74, 0x68, 0x79, 0x20, 0x74, 0x6f, + 0x76, 0x65, 0x73, 0x0a, 0x44, 0x69, 0x64, 0x20, + 0x67, 0x79, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x67, 0x69, 0x6d, 0x62, 0x6c, 0x65, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, + 0x61, 0x62, 0x65, 0x3a, 0x0a, 0x41, 0x6c, 0x6c, + 0x20, 0x6d, 0x69, 0x6d, 0x73, 0x79, 0x20, 0x77, + 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x6f, 0x72, 0x6f, 0x67, 0x6f, 0x76, 0x65, + 0x73, 0x2c, 0x0a, 0x41, 0x6e, 0x64, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x6d, 0x65, 0x20, + 0x72, 0x61, 0x74, 0x68, 0x73, 0x20, 0x6f, 0x75, + 0x74, 0x67, 0x72, 0x61, 0x62, 0x65, 0x2e + } +}; + +static const size_t test_data_len[2] = +{ + 34U, + 127U +}; + +static const unsigned char test_mac[2][16] = +{ + { + 0xa8, 0x06, 0x1d, 0xc1, 0x30, 0x51, 0x36, 0xc6, + 0xc2, 0x2b, 0x8b, 0xaf, 0x0c, 0x01, 0x27, 0xa9 + }, + { + 0x45, 0x41, 0x66, 0x9a, 0x7e, 0xaa, 0xee, 0x61, + 0xe7, 0x08, 0xdc, 0x7c, 0xbc, 0xc5, 0xeb, 0x62 + } +}; + +/* Make sure no other definition is already present. */ +#undef ASSERT + +#define ASSERT(cond, args) \ + do \ + { \ + if (!(cond)) \ + { \ + if (verbose != 0) \ + mbedtls_printf args; \ + \ + return -1; \ + } \ + } \ + while (0) + +int mbedtls_poly1305_self_test(int verbose) +{ + unsigned char mac[16]; + unsigned i; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + for (i = 0U; i < 2U; i++) { + if (verbose != 0) { + mbedtls_printf(" Poly1305 test %u ", i); + } + + ret = mbedtls_poly1305_mac(test_keys[i], + test_data[i], + test_data_len[i], + mac); + ASSERT(0 == ret, ("error code: %i\n", ret)); + + ASSERT(0 == memcmp(mac, test_mac[i], 16U), ("failed (mac)\n")); + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return 0; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_POLY1305_C */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto.c b/ext/opcua_client/mbedtls/library/psa_crypto.c new file mode 100644 index 0000000..8b14611 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto.c @@ -0,0 +1,6248 @@ +/* + * PSA crypto layer on top of Mbed TLS crypto + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PSA_CRYPTO_C) + +#if defined(MBEDTLS_PSA_CRYPTO_CONFIG) +#include "check_crypto_config.h" +#endif + +#include "psa/crypto.h" + +#include "psa_crypto_cipher.h" +#include "psa_crypto_core.h" +#include "psa_crypto_invasive.h" +#include "psa_crypto_driver_wrappers.h" +#include "psa_crypto_ecp.h" +#include "psa_crypto_hash.h" +#include "psa_crypto_mac.h" +#include "psa_crypto_rsa.h" +#include "psa_crypto_ecp.h" +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) +#include "psa_crypto_se.h" +#endif +#include "psa_crypto_slot_management.h" +/* Include internal declarations that are useful for implementing persistently + * stored keys. */ +#include "psa_crypto_storage.h" + +#include "psa_crypto_random_impl.h" + +#include +#include +#include "mbedtls/platform.h" + +#include "mbedtls/aes.h" +#include "mbedtls/arc4.h" +#include "mbedtls/asn1.h" +#include "mbedtls/asn1write.h" +#include "mbedtls/bignum.h" +#include "mbedtls/blowfish.h" +#include "mbedtls/camellia.h" +#include "mbedtls/chacha20.h" +#include "mbedtls/chachapoly.h" +#include "mbedtls/cipher.h" +#include "mbedtls/ccm.h" +#include "mbedtls/cmac.h" +#include "mbedtls/des.h" +#include "mbedtls/ecdh.h" +#include "mbedtls/ecp.h" +#include "mbedtls/entropy.h" +#include "mbedtls/error.h" +#include "mbedtls/gcm.h" +#include "mbedtls/md2.h" +#include "mbedtls/md4.h" +#include "mbedtls/md5.h" +#include "mbedtls/md.h" +#include "mbedtls/md_internal.h" +#include "mbedtls/pk.h" +#include "mbedtls/pk_internal.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" +#include "mbedtls/ripemd160.h" +#include "mbedtls/rsa.h" +#include "mbedtls/sha1.h" +#include "mbedtls/sha256.h" +#include "mbedtls/sha512.h" +#include "mbedtls/xtea.h" + +#define ARRAY_LENGTH(array) (sizeof(array) / sizeof(*(array))) + +/****************************************************************/ +/* Global data, support functions and library management */ +/****************************************************************/ + +static int key_type_is_raw_bytes(psa_key_type_t type) +{ + return PSA_KEY_TYPE_IS_UNSTRUCTURED(type); +} + +/* Values for psa_global_data_t::rng_state */ +#define RNG_NOT_INITIALIZED 0 +#define RNG_INITIALIZED 1 +#define RNG_SEEDED 2 + +typedef struct { + unsigned initialized : 1; + unsigned rng_state : 2; + mbedtls_psa_random_context_t rng; +} psa_global_data_t; + +static psa_global_data_t global_data; + +#if !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) +mbedtls_psa_drbg_context_t *const mbedtls_psa_random_state = + &global_data.rng.drbg; +#endif + +#define GUARD_MODULE_INITIALIZED \ + if (global_data.initialized == 0) \ + return PSA_ERROR_BAD_STATE; + +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) + +/* Declare a local copy of an input buffer and a variable that will be used + * to store a pointer to the start of the buffer. + * + * Note: This macro must be called before any operations which may jump to + * the exit label, so that the local input copy object is safe to be freed. + * + * Assumptions: + * - input is the name of a pointer to the buffer to be copied + * - The name LOCAL_INPUT_COPY_OF_input is unused in the current scope + * - input_copy_name is a name that is unused in the current scope + */ +#define LOCAL_INPUT_DECLARE(input, input_copy_name) \ + psa_crypto_local_input_t LOCAL_INPUT_COPY_OF_##input = PSA_CRYPTO_LOCAL_INPUT_INIT; \ + const uint8_t *input_copy_name = NULL; + +/* Allocate a copy of the buffer input and set the pointer input_copy to + * point to the start of the copy. + * + * Assumptions: + * - psa_status_t status exists + * - An exit label is declared + * - input is the name of a pointer to the buffer to be copied + * - LOCAL_INPUT_DECLARE(input, input_copy) has previously been called + */ +#define LOCAL_INPUT_ALLOC(input, length, input_copy) \ + status = psa_crypto_local_input_alloc(input, length, \ + &LOCAL_INPUT_COPY_OF_##input); \ + if (status != PSA_SUCCESS) { \ + goto exit; \ + } \ + input_copy = LOCAL_INPUT_COPY_OF_##input.buffer; + +/* Free the local input copy allocated previously by LOCAL_INPUT_ALLOC() + * + * Assumptions: + * - input_copy is the name of the input copy pointer set by LOCAL_INPUT_ALLOC() + * - input is the name of the original buffer that was copied + */ +#define LOCAL_INPUT_FREE(input, input_copy) \ + input_copy = NULL; \ + psa_crypto_local_input_free(&LOCAL_INPUT_COPY_OF_##input); + +/* Declare a local copy of an output buffer and a variable that will be used + * to store a pointer to the start of the buffer. + * + * Note: This macro must be called before any operations which may jump to + * the exit label, so that the local output copy object is safe to be freed. + * + * Assumptions: + * - output is the name of a pointer to the buffer to be copied + * - The name LOCAL_OUTPUT_COPY_OF_output is unused in the current scope + * - output_copy_name is a name that is unused in the current scope + */ +#define LOCAL_OUTPUT_DECLARE(output, output_copy_name) \ + psa_crypto_local_output_t LOCAL_OUTPUT_COPY_OF_##output = PSA_CRYPTO_LOCAL_OUTPUT_INIT; \ + uint8_t *output_copy_name = NULL; + +/* Allocate a copy of the buffer output and set the pointer output_copy to + * point to the start of the copy. + * + * Assumptions: + * - psa_status_t status exists + * - An exit label is declared + * - output is the name of a pointer to the buffer to be copied + * - LOCAL_OUTPUT_DECLARE(output, output_copy) has previously been called + */ +#define LOCAL_OUTPUT_ALLOC(output, length, output_copy) \ + status = psa_crypto_local_output_alloc(output, length, \ + &LOCAL_OUTPUT_COPY_OF_##output); \ + if (status != PSA_SUCCESS) { \ + goto exit; \ + } \ + output_copy = LOCAL_OUTPUT_COPY_OF_##output.buffer; + +/* Free the local output copy allocated previously by LOCAL_OUTPUT_ALLOC() + * after first copying back its contents to the original buffer. + * + * Assumptions: + * - psa_status_t status exists + * - output_copy is the name of the output copy pointer set by LOCAL_OUTPUT_ALLOC() + * - output is the name of the original buffer that was copied + */ +#define LOCAL_OUTPUT_FREE(output, output_copy) \ + output_copy = NULL; \ + do { \ + psa_status_t local_output_status; \ + local_output_status = psa_crypto_local_output_free(&LOCAL_OUTPUT_COPY_OF_##output); \ + if (local_output_status != PSA_SUCCESS) { \ + /* Since this error case is an internal error, it's more serious than \ + * any existing error code and so it's fine to overwrite the existing \ + * status. */ \ + status = local_output_status; \ + } \ + } while (0) +#else /* !MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS */ +#define LOCAL_INPUT_DECLARE(input, input_copy_name) \ + const uint8_t *input_copy_name = NULL; +#define LOCAL_INPUT_ALLOC(input, length, input_copy) \ + input_copy = input; +#define LOCAL_INPUT_FREE(input, input_copy) \ + input_copy = NULL; +#define LOCAL_OUTPUT_DECLARE(output, output_copy_name) \ + uint8_t *output_copy_name = NULL; +#define LOCAL_OUTPUT_ALLOC(output, length, output_copy) \ + output_copy = output; +#define LOCAL_OUTPUT_FREE(output, output_copy) \ + output_copy = NULL; +#endif /* !MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS */ + +psa_status_t mbedtls_to_psa_error(int ret) +{ + /* Mbed TLS error codes can combine a high-level error code and a + * low-level error code. The low-level error usually reflects the + * root cause better, so dispatch on that preferably. */ + int low_level_ret = -(-ret & 0x007f); + switch (low_level_ret != 0 ? low_level_ret : ret) { + case 0: + return PSA_SUCCESS; + + case MBEDTLS_ERR_AES_INVALID_KEY_LENGTH: + case MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH: + case MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE: + return PSA_ERROR_NOT_SUPPORTED; + case MBEDTLS_ERR_AES_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_ARC4_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_ASN1_OUT_OF_DATA: + case MBEDTLS_ERR_ASN1_UNEXPECTED_TAG: + case MBEDTLS_ERR_ASN1_INVALID_LENGTH: + case MBEDTLS_ERR_ASN1_LENGTH_MISMATCH: + case MBEDTLS_ERR_ASN1_INVALID_DATA: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_ASN1_ALLOC_FAILED: + return PSA_ERROR_INSUFFICIENT_MEMORY; + case MBEDTLS_ERR_ASN1_BUF_TOO_SMALL: + return PSA_ERROR_BUFFER_TOO_SMALL; + +#if defined(MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA) + case MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA: +#elif defined(MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH) + case MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH: +#endif + case MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH: + return PSA_ERROR_NOT_SUPPORTED; + case MBEDTLS_ERR_BLOWFISH_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + +#if defined(MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA) + case MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA: +#elif defined(MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH) + case MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH: +#endif + case MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH: + return PSA_ERROR_NOT_SUPPORTED; + case MBEDTLS_ERR_CAMELLIA_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_CCM_BAD_INPUT: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_CCM_AUTH_FAILED: + return PSA_ERROR_INVALID_SIGNATURE; + case MBEDTLS_ERR_CCM_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA: + return PSA_ERROR_INVALID_ARGUMENT; + + case MBEDTLS_ERR_CHACHAPOLY_BAD_STATE: + return PSA_ERROR_BAD_STATE; + case MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED: + return PSA_ERROR_INVALID_SIGNATURE; + + case MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE: + return PSA_ERROR_NOT_SUPPORTED; + case MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_CIPHER_ALLOC_FAILED: + return PSA_ERROR_INSUFFICIENT_MEMORY; + case MBEDTLS_ERR_CIPHER_INVALID_PADDING: + return PSA_ERROR_INVALID_PADDING; + case MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_CIPHER_AUTH_FAILED: + return PSA_ERROR_INVALID_SIGNATURE; + case MBEDTLS_ERR_CIPHER_INVALID_CONTEXT: + return PSA_ERROR_CORRUPTION_DETECTED; + case MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_CMAC_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + +#if !(defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) || \ + defined(MBEDTLS_PSA_HMAC_DRBG_MD_TYPE)) + /* Only check CTR_DRBG error codes if underlying mbedtls_xxx + * functions are passed a CTR_DRBG instance. */ + case MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED: + return PSA_ERROR_INSUFFICIENT_ENTROPY; + case MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG: + case MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG: + return PSA_ERROR_NOT_SUPPORTED; + case MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR: + return PSA_ERROR_INSUFFICIENT_ENTROPY; +#endif + + case MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH: + return PSA_ERROR_NOT_SUPPORTED; + case MBEDTLS_ERR_DES_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED: + case MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE: + case MBEDTLS_ERR_ENTROPY_SOURCE_FAILED: + return PSA_ERROR_INSUFFICIENT_ENTROPY; + + case MBEDTLS_ERR_GCM_AUTH_FAILED: + return PSA_ERROR_INVALID_SIGNATURE; + case MBEDTLS_ERR_GCM_BAD_INPUT: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_GCM_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + +#if !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) && \ + defined(MBEDTLS_PSA_HMAC_DRBG_MD_TYPE) + /* Only check HMAC_DRBG error codes if underlying mbedtls_xxx + * functions are passed a HMAC_DRBG instance. */ + case MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED: + return PSA_ERROR_INSUFFICIENT_ENTROPY; + case MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG: + case MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG: + return PSA_ERROR_NOT_SUPPORTED; + case MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR: + return PSA_ERROR_INSUFFICIENT_ENTROPY; +#endif + + case MBEDTLS_ERR_MD2_HW_ACCEL_FAILED: + case MBEDTLS_ERR_MD4_HW_ACCEL_FAILED: + case MBEDTLS_ERR_MD5_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE: + return PSA_ERROR_NOT_SUPPORTED; + case MBEDTLS_ERR_MD_BAD_INPUT_DATA: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_MD_ALLOC_FAILED: + return PSA_ERROR_INSUFFICIENT_MEMORY; + case MBEDTLS_ERR_MD_FILE_IO_ERROR: + return PSA_ERROR_STORAGE_FAILURE; + case MBEDTLS_ERR_MD_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_MPI_FILE_IO_ERROR: + return PSA_ERROR_STORAGE_FAILURE; + case MBEDTLS_ERR_MPI_BAD_INPUT_DATA: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_MPI_INVALID_CHARACTER: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL: + return PSA_ERROR_BUFFER_TOO_SMALL; + case MBEDTLS_ERR_MPI_NEGATIVE_VALUE: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_MPI_DIVISION_BY_ZERO: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_MPI_NOT_ACCEPTABLE: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_MPI_ALLOC_FAILED: + return PSA_ERROR_INSUFFICIENT_MEMORY; + + case MBEDTLS_ERR_PK_ALLOC_FAILED: + return PSA_ERROR_INSUFFICIENT_MEMORY; + case MBEDTLS_ERR_PK_TYPE_MISMATCH: + case MBEDTLS_ERR_PK_BAD_INPUT_DATA: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_PK_FILE_IO_ERROR: + return PSA_ERROR_STORAGE_FAILURE; + case MBEDTLS_ERR_PK_KEY_INVALID_VERSION: + case MBEDTLS_ERR_PK_KEY_INVALID_FORMAT: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_PK_UNKNOWN_PK_ALG: + return PSA_ERROR_NOT_SUPPORTED; + case MBEDTLS_ERR_PK_PASSWORD_REQUIRED: + case MBEDTLS_ERR_PK_PASSWORD_MISMATCH: + return PSA_ERROR_NOT_PERMITTED; + case MBEDTLS_ERR_PK_INVALID_PUBKEY: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_PK_INVALID_ALG: + case MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE: + case MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE: + return PSA_ERROR_NOT_SUPPORTED; + case MBEDTLS_ERR_PK_SIG_LEN_MISMATCH: + return PSA_ERROR_INVALID_SIGNATURE; + case MBEDTLS_ERR_PK_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + case MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED: + return PSA_ERROR_NOT_SUPPORTED; + + case MBEDTLS_ERR_RIPEMD160_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_RSA_BAD_INPUT_DATA: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_RSA_INVALID_PADDING: + return PSA_ERROR_INVALID_PADDING; + case MBEDTLS_ERR_RSA_KEY_GEN_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + case MBEDTLS_ERR_RSA_KEY_CHECK_FAILED: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_RSA_PUBLIC_FAILED: + case MBEDTLS_ERR_RSA_PRIVATE_FAILED: + return PSA_ERROR_CORRUPTION_DETECTED; + case MBEDTLS_ERR_RSA_VERIFY_FAILED: + return PSA_ERROR_INVALID_SIGNATURE; + case MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE: + return PSA_ERROR_BUFFER_TOO_SMALL; + case MBEDTLS_ERR_RSA_RNG_FAILED: + return PSA_ERROR_INSUFFICIENT_ENTROPY; + case MBEDTLS_ERR_RSA_UNSUPPORTED_OPERATION: + return PSA_ERROR_NOT_SUPPORTED; + case MBEDTLS_ERR_RSA_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_SHA1_HW_ACCEL_FAILED: + case MBEDTLS_ERR_SHA256_HW_ACCEL_FAILED: + case MBEDTLS_ERR_SHA512_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_ECP_BAD_INPUT_DATA: + case MBEDTLS_ERR_ECP_INVALID_KEY: + return PSA_ERROR_INVALID_ARGUMENT; + case MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL: + return PSA_ERROR_BUFFER_TOO_SMALL; + case MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE: + return PSA_ERROR_NOT_SUPPORTED; + case MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH: + case MBEDTLS_ERR_ECP_VERIFY_FAILED: + return PSA_ERROR_INVALID_SIGNATURE; + case MBEDTLS_ERR_ECP_ALLOC_FAILED: + return PSA_ERROR_INSUFFICIENT_MEMORY; + case MBEDTLS_ERR_ECP_RANDOM_FAILED: + return PSA_ERROR_INSUFFICIENT_ENTROPY; + case MBEDTLS_ERR_ECP_HW_ACCEL_FAILED: + return PSA_ERROR_HARDWARE_FAILURE; + + case MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED: + return PSA_ERROR_CORRUPTION_DETECTED; + + default: + return PSA_ERROR_GENERIC_ERROR; + } +} + + + + +/****************************************************************/ +/* Key management */ +/****************************************************************/ + +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || \ + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_ECDH) +mbedtls_ecp_group_id mbedtls_ecc_group_of_psa(psa_ecc_family_t curve, + size_t bits, + int bits_is_sloppy) +{ + switch (curve) { + case PSA_ECC_FAMILY_SECP_R1: + switch (bits) { +#if defined(PSA_WANT_ECC_SECP_R1_192) + case 192: + return MBEDTLS_ECP_DP_SECP192R1; +#endif +#if defined(PSA_WANT_ECC_SECP_R1_224) + case 224: + return MBEDTLS_ECP_DP_SECP224R1; +#endif +#if defined(PSA_WANT_ECC_SECP_R1_256) + case 256: + return MBEDTLS_ECP_DP_SECP256R1; +#endif +#if defined(PSA_WANT_ECC_SECP_R1_384) + case 384: + return MBEDTLS_ECP_DP_SECP384R1; +#endif +#if defined(PSA_WANT_ECC_SECP_R1_521) + case 521: + return MBEDTLS_ECP_DP_SECP521R1; + case 528: + if (bits_is_sloppy) { + return MBEDTLS_ECP_DP_SECP521R1; + } + break; +#endif + } + break; + + case PSA_ECC_FAMILY_BRAINPOOL_P_R1: + switch (bits) { +#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256) + case 256: + return MBEDTLS_ECP_DP_BP256R1; +#endif +#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384) + case 384: + return MBEDTLS_ECP_DP_BP384R1; +#endif +#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512) + case 512: + return MBEDTLS_ECP_DP_BP512R1; +#endif + } + break; + + case PSA_ECC_FAMILY_MONTGOMERY: + switch (bits) { +#if defined(PSA_WANT_ECC_MONTGOMERY_255) + case 255: + return MBEDTLS_ECP_DP_CURVE25519; + case 256: + if (bits_is_sloppy) { + return MBEDTLS_ECP_DP_CURVE25519; + } + break; +#endif +#if defined(PSA_WANT_ECC_MONTGOMERY_448) + case 448: + return MBEDTLS_ECP_DP_CURVE448; +#endif + } + break; + + case PSA_ECC_FAMILY_SECP_K1: + switch (bits) { +#if defined(PSA_WANT_ECC_SECP_K1_192) + case 192: + return MBEDTLS_ECP_DP_SECP192K1; +#endif +#if defined(PSA_WANT_ECC_SECP_K1_224) + case 224: + return MBEDTLS_ECP_DP_SECP224K1; +#endif +#if defined(PSA_WANT_ECC_SECP_K1_256) + case 256: + return MBEDTLS_ECP_DP_SECP256K1; +#endif + } + break; + } + + (void) bits_is_sloppy; + return MBEDTLS_ECP_DP_NONE; +} +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) || + defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || + defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) || + defined(MBEDTLS_PSA_BUILTIN_ALG_ECDH) */ + +static psa_status_t validate_unstructured_key_bit_size(psa_key_type_t type, + size_t bits) +{ + /* Check that the bit size is acceptable for the key type */ + switch (type) { + case PSA_KEY_TYPE_RAW_DATA: + case PSA_KEY_TYPE_HMAC: + case PSA_KEY_TYPE_DERIVE: + break; +#if defined(PSA_WANT_KEY_TYPE_AES) + case PSA_KEY_TYPE_AES: + if (bits != 128 && bits != 192 && bits != 256) { + return PSA_ERROR_INVALID_ARGUMENT; + } + break; +#endif +#if defined(PSA_WANT_KEY_TYPE_ARIA) + case PSA_KEY_TYPE_ARIA: + if (bits != 128 && bits != 192 && bits != 256) { + return PSA_ERROR_INVALID_ARGUMENT; + } + break; +#endif +#if defined(PSA_WANT_KEY_TYPE_CAMELLIA) + case PSA_KEY_TYPE_CAMELLIA: + if (bits != 128 && bits != 192 && bits != 256) { + return PSA_ERROR_INVALID_ARGUMENT; + } + break; +#endif +#if defined(PSA_WANT_KEY_TYPE_DES) + case PSA_KEY_TYPE_DES: + if (bits != 64 && bits != 128 && bits != 192) { + return PSA_ERROR_INVALID_ARGUMENT; + } + break; +#endif +#if defined(PSA_WANT_KEY_TYPE_ARC4) + case PSA_KEY_TYPE_ARC4: + if (bits < 8 || bits > 2048) { + return PSA_ERROR_INVALID_ARGUMENT; + } + break; +#endif +#if defined(PSA_WANT_KEY_TYPE_CHACHA20) + case PSA_KEY_TYPE_CHACHA20: + if (bits != 256) { + return PSA_ERROR_INVALID_ARGUMENT; + } + break; +#endif + default: + return PSA_ERROR_NOT_SUPPORTED; + } + if (bits % 8 != 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + return PSA_SUCCESS; +} + +/** Check whether a given key type is valid for use with a given MAC algorithm + * + * Upon successful return of this function, the behavior of #PSA_MAC_LENGTH + * when called with the validated \p algorithm and \p key_type is well-defined. + * + * \param[in] algorithm The specific MAC algorithm (can be wildcard). + * \param[in] key_type The key type of the key to be used with the + * \p algorithm. + * + * \retval #PSA_SUCCESS + * The \p key_type is valid for use with the \p algorithm + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The \p key_type is not valid for use with the \p algorithm + */ +MBEDTLS_STATIC_TESTABLE psa_status_t psa_mac_key_can_do( + psa_algorithm_t algorithm, + psa_key_type_t key_type) +{ + if (PSA_ALG_IS_HMAC(algorithm)) { + if (key_type == PSA_KEY_TYPE_HMAC) { + return PSA_SUCCESS; + } + } + + if (PSA_ALG_IS_BLOCK_CIPHER_MAC(algorithm)) { + /* Check that we're calling PSA_BLOCK_CIPHER_BLOCK_LENGTH with a cipher + * key. */ + if ((key_type & PSA_KEY_TYPE_CATEGORY_MASK) == + PSA_KEY_TYPE_CATEGORY_SYMMETRIC) { + /* PSA_BLOCK_CIPHER_BLOCK_LENGTH returns 1 for stream ciphers and + * the block length (larger than 1) for block ciphers. */ + if (PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type) > 1) { + return PSA_SUCCESS; + } + } + } + + return PSA_ERROR_INVALID_ARGUMENT; +} + +psa_status_t psa_allocate_buffer_to_slot(psa_key_slot_t *slot, + size_t buffer_length) +{ + if (slot->key.data != NULL) { + return PSA_ERROR_ALREADY_EXISTS; + } + + slot->key.data = mbedtls_calloc(1, buffer_length); + if (slot->key.data == NULL) { + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + + slot->key.bytes = buffer_length; + return PSA_SUCCESS; +} + +psa_status_t psa_copy_key_material_into_slot(psa_key_slot_t *slot, + const uint8_t *data, + size_t data_length) +{ + psa_status_t status = psa_allocate_buffer_to_slot(slot, + data_length); + if (status != PSA_SUCCESS) { + return status; + } + + memcpy(slot->key.data, data, data_length); + return PSA_SUCCESS; +} + +psa_status_t psa_import_key_into_slot( + const psa_key_attributes_t *attributes, + const uint8_t *data, size_t data_length, + uint8_t *key_buffer, size_t key_buffer_size, + size_t *key_buffer_length, size_t *bits) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_type_t type = attributes->core.type; + + /* zero-length keys are never supported. */ + if (data_length == 0) { + return PSA_ERROR_NOT_SUPPORTED; + } + + if (key_type_is_raw_bytes(type)) { + *bits = PSA_BYTES_TO_BITS(data_length); + + /* Ensure that the bytes-to-bits conversion hasn't overflown. */ + if (data_length > SIZE_MAX / 8) { + return PSA_ERROR_NOT_SUPPORTED; + } + + /* Enforce a size limit, and in particular ensure that the bit + * size fits in its representation type. */ + if ((*bits) > PSA_MAX_KEY_BITS) { + return PSA_ERROR_NOT_SUPPORTED; + } + + status = validate_unstructured_key_bit_size(type, *bits); + if (status != PSA_SUCCESS) { + return status; + } + + /* Copy the key material. */ + memcpy(key_buffer, data, data_length); + *key_buffer_length = data_length; + (void) key_buffer_size; + + return PSA_SUCCESS; + } else if (PSA_KEY_TYPE_IS_ASYMMETRIC(type)) { +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || \ + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) + if (PSA_KEY_TYPE_IS_ECC(type)) { + return mbedtls_psa_ecp_import_key(attributes, + data, data_length, + key_buffer, key_buffer_size, + key_buffer_length, + bits); + } +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || + * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) */ +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || \ + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) + if (PSA_KEY_TYPE_IS_RSA(type)) { + return mbedtls_psa_rsa_import_key(attributes, + data, data_length, + key_buffer, key_buffer_size, + key_buffer_length, + bits); + } +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || + * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) */ + } + + return PSA_ERROR_NOT_SUPPORTED; +} + +/** Calculate the intersection of two algorithm usage policies. + * + * Return 0 (which allows no operation) on incompatibility. + */ +static psa_algorithm_t psa_key_policy_algorithm_intersection( + psa_key_type_t key_type, + psa_algorithm_t alg1, + psa_algorithm_t alg2) +{ + /* Common case: both sides actually specify the same policy. */ + if (alg1 == alg2) { + return alg1; + } + /* If the policies are from the same hash-and-sign family, check + * if one is a wildcard. If so the other has the specific algorithm. */ + if (PSA_ALG_IS_SIGN_HASH(alg1) && + PSA_ALG_IS_SIGN_HASH(alg2) && + (alg1 & ~PSA_ALG_HASH_MASK) == (alg2 & ~PSA_ALG_HASH_MASK)) { + if (PSA_ALG_SIGN_GET_HASH(alg1) == PSA_ALG_ANY_HASH) { + return alg2; + } + if (PSA_ALG_SIGN_GET_HASH(alg2) == PSA_ALG_ANY_HASH) { + return alg1; + } + } + /* If the policies are from the same AEAD family, check whether + * one of them is a minimum-tag-length wildcard. Calculate the most + * restrictive tag length. */ + if (PSA_ALG_IS_AEAD(alg1) && PSA_ALG_IS_AEAD(alg2) && + (PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg1, 0) == + PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg2, 0))) { + size_t alg1_len = PSA_ALG_AEAD_GET_TAG_LENGTH(alg1); + size_t alg2_len = PSA_ALG_AEAD_GET_TAG_LENGTH(alg2); + size_t restricted_len = alg1_len > alg2_len ? alg1_len : alg2_len; + + /* If both are wildcards, return most restrictive wildcard */ + if (((alg1 & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) != 0) && + ((alg2 & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) != 0)) { + return PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG( + alg1, restricted_len); + } + /* If only one is a wildcard, return specific algorithm if compatible. */ + if (((alg1 & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) != 0) && + (alg1_len <= alg2_len)) { + return alg2; + } + if (((alg2 & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) != 0) && + (alg2_len <= alg1_len)) { + return alg1; + } + } + /* If the policies are from the same MAC family, check whether one + * of them is a minimum-MAC-length policy. Calculate the most + * restrictive tag length. */ + if (PSA_ALG_IS_MAC(alg1) && PSA_ALG_IS_MAC(alg2) && + (PSA_ALG_FULL_LENGTH_MAC(alg1) == + PSA_ALG_FULL_LENGTH_MAC(alg2))) { + /* Validate the combination of key type and algorithm. Since the base + * algorithm of alg1 and alg2 are the same, we only need this once. */ + if (PSA_SUCCESS != psa_mac_key_can_do(alg1, key_type)) { + return 0; + } + + /* Get the (exact or at-least) output lengths for both sides of the + * requested intersection. None of the currently supported algorithms + * have an output length dependent on the actual key size, so setting it + * to a bogus value of 0 is currently OK. + * + * Note that for at-least-this-length wildcard algorithms, the output + * length is set to the shortest allowed length, which allows us to + * calculate the most restrictive tag length for the intersection. */ + size_t alg1_len = PSA_MAC_LENGTH(key_type, 0, alg1); + size_t alg2_len = PSA_MAC_LENGTH(key_type, 0, alg2); + size_t restricted_len = alg1_len > alg2_len ? alg1_len : alg2_len; + + /* If both are wildcards, return most restrictive wildcard */ + if (((alg1 & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) != 0) && + ((alg2 & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) != 0)) { + return PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(alg1, restricted_len); + } + + /* If only one is an at-least-this-length policy, the intersection would + * be the other (fixed-length) policy as long as said fixed length is + * equal to or larger than the shortest allowed length. */ + if ((alg1 & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) != 0) { + return (alg1_len <= alg2_len) ? alg2 : 0; + } + if ((alg2 & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) != 0) { + return (alg2_len <= alg1_len) ? alg1 : 0; + } + + /* If none of them are wildcards, check whether they define the same tag + * length. This is still possible here when one is default-length and + * the other specific-length. Ensure to always return the + * specific-length version for the intersection. */ + if (alg1_len == alg2_len) { + return PSA_ALG_TRUNCATED_MAC(alg1, alg1_len); + } + } + /* If the policies are incompatible, allow nothing. */ + return 0; +} + +static int psa_key_algorithm_permits(psa_key_type_t key_type, + psa_algorithm_t policy_alg, + psa_algorithm_t requested_alg) +{ + /* Common case: the policy only allows requested_alg. */ + if (requested_alg == policy_alg) { + return 1; + } + /* If policy_alg is a hash-and-sign with a wildcard for the hash, + * and requested_alg is the same hash-and-sign family with any hash, + * then requested_alg is compliant with policy_alg. */ + if (PSA_ALG_IS_SIGN_HASH(requested_alg) && + PSA_ALG_SIGN_GET_HASH(policy_alg) == PSA_ALG_ANY_HASH) { + return (policy_alg & ~PSA_ALG_HASH_MASK) == + (requested_alg & ~PSA_ALG_HASH_MASK); + } + /* If policy_alg is a wildcard AEAD algorithm of the same base as + * the requested algorithm, check the requested tag length to be + * equal-length or longer than the wildcard-specified length. */ + if (PSA_ALG_IS_AEAD(policy_alg) && + PSA_ALG_IS_AEAD(requested_alg) && + (PSA_ALG_AEAD_WITH_SHORTENED_TAG(policy_alg, 0) == + PSA_ALG_AEAD_WITH_SHORTENED_TAG(requested_alg, 0)) && + ((policy_alg & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) != 0)) { + return PSA_ALG_AEAD_GET_TAG_LENGTH(policy_alg) <= + PSA_ALG_AEAD_GET_TAG_LENGTH(requested_alg); + } + /* If policy_alg is a MAC algorithm of the same base as the requested + * algorithm, check whether their MAC lengths are compatible. */ + if (PSA_ALG_IS_MAC(policy_alg) && + PSA_ALG_IS_MAC(requested_alg) && + (PSA_ALG_FULL_LENGTH_MAC(policy_alg) == + PSA_ALG_FULL_LENGTH_MAC(requested_alg))) { + /* Validate the combination of key type and algorithm. Since the policy + * and requested algorithms are the same, we only need this once. */ + if (PSA_SUCCESS != psa_mac_key_can_do(policy_alg, key_type)) { + return 0; + } + + /* Get both the requested output length for the algorithm which is to be + * verified, and the default output length for the base algorithm. + * Note that none of the currently supported algorithms have an output + * length dependent on actual key size, so setting it to a bogus value + * of 0 is currently OK. */ + size_t requested_output_length = PSA_MAC_LENGTH( + key_type, 0, requested_alg); + size_t default_output_length = PSA_MAC_LENGTH( + key_type, 0, + PSA_ALG_FULL_LENGTH_MAC(requested_alg)); + + /* If the policy is default-length, only allow an algorithm with + * a declared exact-length matching the default. */ + if (PSA_MAC_TRUNCATED_LENGTH(policy_alg) == 0) { + return requested_output_length == default_output_length; + } + + /* If the requested algorithm is default-length, allow it if the policy + * length exactly matches the default length. */ + if (PSA_MAC_TRUNCATED_LENGTH(requested_alg) == 0 && + PSA_MAC_TRUNCATED_LENGTH(policy_alg) == default_output_length) { + return 1; + } + + /* If policy_alg is an at-least-this-length wildcard MAC algorithm, + * check for the requested MAC length to be equal to or longer than the + * minimum allowed length. */ + if ((policy_alg & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) != 0) { + return PSA_MAC_TRUNCATED_LENGTH(policy_alg) <= + requested_output_length; + } + } + /* If policy_alg is a generic key agreement operation, then using it for + * a key derivation with that key agreement should also be allowed. This + * behaviour is expected to be defined in a future specification version. */ + if (PSA_ALG_IS_RAW_KEY_AGREEMENT(policy_alg) && + PSA_ALG_IS_KEY_AGREEMENT(requested_alg)) { + return PSA_ALG_KEY_AGREEMENT_GET_BASE(requested_alg) == + policy_alg; + } + /* If it isn't explicitly permitted, it's forbidden. */ + return 0; +} + +/** Test whether a policy permits an algorithm. + * + * The caller must test usage flags separately. + * + * \note This function requires providing the key type for which the policy is + * being validated, since some algorithm policy definitions (e.g. MAC) + * have different properties depending on what kind of cipher it is + * combined with. + * + * \retval PSA_SUCCESS When \p alg is a specific algorithm + * allowed by the \p policy. + * \retval PSA_ERROR_INVALID_ARGUMENT When \p alg is not a specific algorithm + * \retval PSA_ERROR_NOT_PERMITTED When \p alg is a specific algorithm, but + * the \p policy does not allow it. + */ +static psa_status_t psa_key_policy_permits(const psa_key_policy_t *policy, + psa_key_type_t key_type, + psa_algorithm_t alg) +{ + /* '0' is not a valid algorithm */ + if (alg == 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + /* A requested algorithm cannot be a wildcard. */ + if (PSA_ALG_IS_WILDCARD(alg)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + if (psa_key_algorithm_permits(key_type, policy->alg, alg) || + psa_key_algorithm_permits(key_type, policy->alg2, alg)) { + return PSA_SUCCESS; + } else { + return PSA_ERROR_NOT_PERMITTED; + } +} + +/** Restrict a key policy based on a constraint. + * + * \note This function requires providing the key type for which the policy is + * being restricted, since some algorithm policy definitions (e.g. MAC) + * have different properties depending on what kind of cipher it is + * combined with. + * + * \param[in] key_type The key type for which to restrict the policy + * \param[in,out] policy The policy to restrict. + * \param[in] constraint The policy constraint to apply. + * + * \retval #PSA_SUCCESS + * \c *policy contains the intersection of the original value of + * \c *policy and \c *constraint. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c key_type, \c *policy and \c *constraint are incompatible. + * \c *policy is unchanged. + */ +static psa_status_t psa_restrict_key_policy( + psa_key_type_t key_type, + psa_key_policy_t *policy, + const psa_key_policy_t *constraint) +{ + psa_algorithm_t intersection_alg = + psa_key_policy_algorithm_intersection(key_type, policy->alg, + constraint->alg); + psa_algorithm_t intersection_alg2 = + psa_key_policy_algorithm_intersection(key_type, policy->alg2, + constraint->alg2); + if (intersection_alg == 0 && policy->alg != 0 && constraint->alg != 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + if (intersection_alg2 == 0 && policy->alg2 != 0 && constraint->alg2 != 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + policy->usage &= constraint->usage; + policy->alg = intersection_alg; + policy->alg2 = intersection_alg2; + return PSA_SUCCESS; +} + +/** Get the description of a key given its identifier and policy constraints + * and lock it. + * + * The key must have allow all the usage flags set in \p usage. If \p alg is + * nonzero, the key must allow operations with this algorithm. If \p alg is + * zero, the algorithm is not checked. + * + * In case of a persistent key, the function loads the description of the key + * into a key slot if not already done. + * + * On success, the returned key slot is locked. It is the responsibility of + * the caller to unlock the key slot when it does not access it anymore. + */ +static psa_status_t psa_get_and_lock_key_slot_with_policy( + mbedtls_svc_key_id_t key, + psa_key_slot_t **p_slot, + psa_key_usage_t usage, + psa_algorithm_t alg) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_slot_t *slot; + + status = psa_get_and_lock_key_slot(key, p_slot); + if (status != PSA_SUCCESS) { + return status; + } + slot = *p_slot; + + /* Enforce that usage policy for the key slot contains all the flags + * required by the usage parameter. There is one exception: public + * keys can always be exported, so we treat public key objects as + * if they had the export flag. */ + if (PSA_KEY_TYPE_IS_PUBLIC_KEY(slot->attr.type)) { + usage &= ~PSA_KEY_USAGE_EXPORT; + } + + if ((slot->attr.policy.usage & usage) != usage) { + status = PSA_ERROR_NOT_PERMITTED; + goto error; + } + + /* Enforce that the usage policy permits the requested algorithm. */ + if (alg != 0) { + status = psa_key_policy_permits(&slot->attr.policy, + slot->attr.type, + alg); + if (status != PSA_SUCCESS) { + goto error; + } + } + + return PSA_SUCCESS; + +error: + *p_slot = NULL; + psa_unlock_key_slot(slot); + + return status; +} + +/** Get a key slot containing a transparent key and lock it. + * + * A transparent key is a key for which the key material is directly + * available, as opposed to a key in a secure element and/or to be used + * by a secure element. + * + * This is a temporary function that may be used instead of + * psa_get_and_lock_key_slot_with_policy() when there is no opaque key support + * for a cryptographic operation. + * + * On success, the returned key slot is locked. It is the responsibility of the + * caller to unlock the key slot when it does not access it anymore. + */ +static psa_status_t psa_get_and_lock_transparent_key_slot_with_policy( + mbedtls_svc_key_id_t key, + psa_key_slot_t **p_slot, + psa_key_usage_t usage, + psa_algorithm_t alg) +{ + psa_status_t status = psa_get_and_lock_key_slot_with_policy(key, p_slot, + usage, alg); + if (status != PSA_SUCCESS) { + return status; + } + + if (psa_key_lifetime_is_external((*p_slot)->attr.lifetime)) { + psa_unlock_key_slot(*p_slot); + *p_slot = NULL; + return PSA_ERROR_NOT_SUPPORTED; + } + + return PSA_SUCCESS; +} + +psa_status_t psa_remove_key_data_from_memory(psa_key_slot_t *slot) +{ + /* Data pointer will always be either a valid pointer or NULL in an + * initialized slot, so we can just free it. */ + if (slot->key.data != NULL) { + mbedtls_platform_zeroize(slot->key.data, slot->key.bytes); + } + + mbedtls_free(slot->key.data); + slot->key.data = NULL; + slot->key.bytes = 0; + + return PSA_SUCCESS; +} + +/** Completely wipe a slot in memory, including its policy. + * Persistent storage is not affected. */ +psa_status_t psa_wipe_key_slot(psa_key_slot_t *slot) +{ + psa_status_t status = psa_remove_key_data_from_memory(slot); + + /* + * As the return error code may not be handled in case of multiple errors, + * do our best to report an unexpected lock counter: if available + * call MBEDTLS_PARAM_FAILED that may terminate execution (if called as + * part of the execution of a test suite this will stop the test suite + * execution). + */ + if (slot->lock_count != 1) { +#ifdef MBEDTLS_CHECK_PARAMS + MBEDTLS_PARAM_FAILED(slot->lock_count == 1); +#endif + status = PSA_ERROR_CORRUPTION_DETECTED; + } + + /* Multipart operations may still be using the key. This is safe + * because all multipart operation objects are independent from + * the key slot: if they need to access the key after the setup + * phase, they have a copy of the key. Note that this means that + * key material can linger until all operations are completed. */ + /* At this point, key material and other type-specific content has + * been wiped. Clear remaining metadata. We can call memset and not + * zeroize because the metadata is not particularly sensitive. */ + memset(slot, 0, sizeof(*slot)); + return status; +} + +psa_status_t psa_destroy_key(mbedtls_svc_key_id_t key) +{ + psa_key_slot_t *slot; + psa_status_t status; /* status of the last operation */ + psa_status_t overall_status = PSA_SUCCESS; +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + psa_se_drv_table_entry_t *driver; +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + + if (mbedtls_svc_key_id_is_null(key)) { + return PSA_SUCCESS; + } + + /* + * Get the description of the key in a key slot. In case of a persistent + * key, this will load the key description from persistent memory if not + * done yet. We cannot avoid this loading as without it we don't know if + * the key is operated by an SE or not and this information is needed by + * the current implementation. + */ + status = psa_get_and_lock_key_slot(key, &slot); + if (status != PSA_SUCCESS) { + return status; + } + + /* + * If the key slot containing the key description is under access by the + * library (apart from the present access), the key cannot be destroyed + * yet. For the time being, just return in error. Eventually (to be + * implemented), the key should be destroyed when all accesses have + * stopped. + */ + if (slot->lock_count > 1) { + psa_unlock_key_slot(slot); + return PSA_ERROR_GENERIC_ERROR; + } + + if (PSA_KEY_LIFETIME_IS_READ_ONLY(slot->attr.lifetime)) { + /* Refuse the destruction of a read-only key (which may or may not work + * if we attempt it, depending on whether the key is merely read-only + * by policy or actually physically read-only). + * Just do the best we can, which is to wipe the copy in memory + * (done in this function's cleanup code). */ + overall_status = PSA_ERROR_NOT_PERMITTED; + goto exit; + } + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + driver = psa_get_se_driver_entry(slot->attr.lifetime); + if (driver != NULL) { + /* For a key in a secure element, we need to do three things: + * remove the key file in internal storage, destroy the + * key inside the secure element, and update the driver's + * persistent data. Start a transaction that will encompass these + * three actions. */ + psa_crypto_prepare_transaction(PSA_CRYPTO_TRANSACTION_DESTROY_KEY); + psa_crypto_transaction.key.lifetime = slot->attr.lifetime; + psa_crypto_transaction.key.slot = psa_key_slot_get_slot_number(slot); + psa_crypto_transaction.key.id = slot->attr.id; + status = psa_crypto_save_transaction(); + if (status != PSA_SUCCESS) { + (void) psa_crypto_stop_transaction(); + /* We should still try to destroy the key in the secure + * element and the key metadata in storage. This is especially + * important if the error is that the storage is full. + * But how to do it exactly without risking an inconsistent + * state after a reset? + * https://github.com/ARMmbed/mbed-crypto/issues/215 + */ + overall_status = status; + goto exit; + } + + status = psa_destroy_se_key(driver, + psa_key_slot_get_slot_number(slot)); + if (overall_status == PSA_SUCCESS) { + overall_status = status; + } + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + +#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) + if (!PSA_KEY_LIFETIME_IS_VOLATILE(slot->attr.lifetime)) { + status = psa_destroy_persistent_key(slot->attr.id); + if (overall_status == PSA_SUCCESS) { + overall_status = status; + } + + /* TODO: other slots may have a copy of the same key. We should + * invalidate them. + * https://github.com/ARMmbed/mbed-crypto/issues/214 + */ + } +#endif /* defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) */ + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + if (driver != NULL) { + status = psa_save_se_persistent_data(driver); + if (overall_status == PSA_SUCCESS) { + overall_status = status; + } + status = psa_crypto_stop_transaction(); + if (overall_status == PSA_SUCCESS) { + overall_status = status; + } + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + +exit: + status = psa_wipe_key_slot(slot); + /* Prioritize CORRUPTION_DETECTED from wiping over a storage error */ + if (status != PSA_SUCCESS) { + overall_status = status; + } + return overall_status; +} + +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || \ + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) +static psa_status_t psa_get_rsa_public_exponent( + const mbedtls_rsa_context *rsa, + psa_key_attributes_t *attributes) +{ + mbedtls_mpi mpi; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + uint8_t *buffer = NULL; + size_t buflen; + mbedtls_mpi_init(&mpi); + + ret = mbedtls_rsa_export(rsa, NULL, NULL, NULL, NULL, &mpi); + if (ret != 0) { + goto exit; + } + if (mbedtls_mpi_cmp_int(&mpi, 65537) == 0) { + /* It's the default value, which is reported as an empty string, + * so there's nothing to do. */ + goto exit; + } + + buflen = mbedtls_mpi_size(&mpi); + buffer = mbedtls_calloc(1, buflen); + if (buffer == NULL) { + ret = MBEDTLS_ERR_MPI_ALLOC_FAILED; + goto exit; + } + ret = mbedtls_mpi_write_binary(&mpi, buffer, buflen); + if (ret != 0) { + goto exit; + } + attributes->domain_parameters = buffer; + attributes->domain_parameters_size = buflen; + +exit: + mbedtls_mpi_free(&mpi); + if (ret != 0) { + mbedtls_free(buffer); + } + return mbedtls_to_psa_error(ret); +} +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || + * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) */ + +/** Retrieve all the publicly-accessible attributes of a key. + */ +psa_status_t psa_get_key_attributes(mbedtls_svc_key_id_t key, + psa_key_attributes_t *attributes) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_slot_t *slot; + + psa_reset_key_attributes(attributes); + + status = psa_get_and_lock_key_slot_with_policy(key, &slot, 0, 0); + if (status != PSA_SUCCESS) { + return status; + } + + attributes->core = slot->attr; + attributes->core.flags &= (MBEDTLS_PSA_KA_MASK_EXTERNAL_ONLY | + MBEDTLS_PSA_KA_MASK_DUAL_USE); + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + if (psa_get_se_driver_entry(slot->attr.lifetime) != NULL) { + psa_set_key_slot_number(attributes, + psa_key_slot_get_slot_number(slot)); + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + + switch (slot->attr.type) { +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || \ + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) + case PSA_KEY_TYPE_RSA_KEY_PAIR: + case PSA_KEY_TYPE_RSA_PUBLIC_KEY: + /* TODO: reporting the public exponent for opaque keys + * is not yet implemented. + * https://github.com/ARMmbed/mbed-crypto/issues/216 + */ + if (!psa_key_lifetime_is_external(slot->attr.lifetime)) { + mbedtls_rsa_context *rsa = NULL; + + status = mbedtls_psa_rsa_load_representation( + slot->attr.type, + slot->key.data, + slot->key.bytes, + &rsa); + if (status != PSA_SUCCESS) { + break; + } + + status = psa_get_rsa_public_exponent(rsa, + attributes); + mbedtls_rsa_free(rsa); + mbedtls_free(rsa); + } + break; +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || + * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) */ + default: + /* Nothing else to do. */ + break; + } + + if (status != PSA_SUCCESS) { + psa_reset_key_attributes(attributes); + } + + unlock_status = psa_unlock_key_slot(slot); + + return (status == PSA_SUCCESS) ? unlock_status : status; +} + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) +psa_status_t psa_get_key_slot_number( + const psa_key_attributes_t *attributes, + psa_key_slot_number_t *slot_number) +{ + if (attributes->core.flags & MBEDTLS_PSA_KA_FLAG_HAS_SLOT_NUMBER) { + *slot_number = attributes->slot_number; + return PSA_SUCCESS; + } else { + return PSA_ERROR_INVALID_ARGUMENT; + } +} +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + +static psa_status_t psa_export_key_buffer_internal(const uint8_t *key_buffer, + size_t key_buffer_size, + uint8_t *data, + size_t data_size, + size_t *data_length) +{ + if (key_buffer_size > data_size) { + return PSA_ERROR_BUFFER_TOO_SMALL; + } + memcpy(data, key_buffer, key_buffer_size); + memset(data + key_buffer_size, 0, + data_size - key_buffer_size); + *data_length = key_buffer_size; + return PSA_SUCCESS; +} + +psa_status_t psa_export_key_internal( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + uint8_t *data, size_t data_size, size_t *data_length) +{ + psa_key_type_t type = attributes->core.type; + + if (key_type_is_raw_bytes(type) || + PSA_KEY_TYPE_IS_RSA(type) || + PSA_KEY_TYPE_IS_ECC(type)) { + return psa_export_key_buffer_internal( + key_buffer, key_buffer_size, + data, data_size, data_length); + } else { + /* This shouldn't happen in the reference implementation, but + it is valid for a special-purpose implementation to omit + support for exporting certain key types. */ + return PSA_ERROR_NOT_SUPPORTED; + } +} + +psa_status_t psa_export_key(mbedtls_svc_key_id_t key, + uint8_t *data_external, + size_t data_size, + size_t *data_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_slot_t *slot; + LOCAL_OUTPUT_DECLARE(data_external, data); + /* Reject a zero-length output buffer now, since this can never be a + * valid key representation. This way we know that data must be a valid + * pointer and we can do things like memset(data, ..., data_size). */ + if (data_size == 0) { + return PSA_ERROR_BUFFER_TOO_SMALL; + } + + /* Set the key to empty now, so that even when there are errors, we always + * set data_length to a value between 0 and data_size. On error, setting + * the key to empty is a good choice because an empty key representation is + * unlikely to be accepted anywhere. */ + *data_length = 0; + + /* Export requires the EXPORT flag. There is an exception for public keys, + * which don't require any flag, but + * psa_get_and_lock_key_slot_with_policy() takes care of this. + */ + status = psa_get_and_lock_key_slot_with_policy(key, &slot, + PSA_KEY_USAGE_EXPORT, 0); + if (status != PSA_SUCCESS) { + return status; + } + + LOCAL_OUTPUT_ALLOC(data_external, data_size, data); + + psa_key_attributes_t attributes = { + .core = slot->attr + }; + status = psa_driver_wrapper_export_key(&attributes, + slot->key.data, slot->key.bytes, + data, data_size, data_length); + +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + unlock_status = psa_unlock_key_slot(slot); + + LOCAL_OUTPUT_FREE(data_external, data); + return (status == PSA_SUCCESS) ? unlock_status : status; +} + +psa_status_t psa_export_public_key_internal( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + uint8_t *data, + size_t data_size, + size_t *data_length) +{ + psa_key_type_t type = attributes->core.type; + + if (PSA_KEY_TYPE_IS_RSA(type) || PSA_KEY_TYPE_IS_ECC(type)) { + if (PSA_KEY_TYPE_IS_PUBLIC_KEY(type)) { + /* Exporting public -> public */ + return psa_export_key_buffer_internal( + key_buffer, key_buffer_size, + data, data_size, data_length); + } + + if (PSA_KEY_TYPE_IS_RSA(type)) { +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || \ + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) + return mbedtls_psa_rsa_export_public_key(attributes, + key_buffer, + key_buffer_size, + data, + data_size, + data_length); +#else + /* We don't know how to convert a private RSA key to public. */ + return PSA_ERROR_NOT_SUPPORTED; +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || + * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) */ + } else { +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || \ + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) + return mbedtls_psa_ecp_export_public_key(attributes, + key_buffer, + key_buffer_size, + data, + data_size, + data_length); +#else + /* We don't know how to convert a private ECC key to public */ + return PSA_ERROR_NOT_SUPPORTED; +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || + * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) */ + } + } else { + /* This shouldn't happen in the reference implementation, but + it is valid for a special-purpose implementation to omit + support for exporting certain key types. */ + return PSA_ERROR_NOT_SUPPORTED; + } +} + +psa_status_t psa_export_public_key(mbedtls_svc_key_id_t key, + uint8_t *data_external, + size_t data_size, + size_t *data_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_attributes_t attributes; + psa_key_slot_t *slot; + LOCAL_OUTPUT_DECLARE(data_external, data); + + /* Reject a zero-length output buffer now, since this can never be a + * valid key representation. This way we know that data must be a valid + * pointer and we can do things like memset(data, ..., data_size). */ + if (data_size == 0) { + return PSA_ERROR_BUFFER_TOO_SMALL; + } + + /* Set the key to empty now, so that even when there are errors, we always + * set data_length to a value between 0 and data_size. On error, setting + * the key to empty is a good choice because an empty key representation is + * unlikely to be accepted anywhere. */ + *data_length = 0; + + /* Exporting a public key doesn't require a usage flag. */ + status = psa_get_and_lock_key_slot_with_policy(key, &slot, 0, 0); + if (status != PSA_SUCCESS) { + return status; + } + + LOCAL_OUTPUT_ALLOC(data_external, data_size, data); + + if (!PSA_KEY_TYPE_IS_ASYMMETRIC(slot->attr.type)) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + attributes = (psa_key_attributes_t) { + .core = slot->attr + }; + status = psa_driver_wrapper_export_public_key( + &attributes, slot->key.data, slot->key.bytes, + data, data_size, data_length); + +exit: + unlock_status = psa_unlock_key_slot(slot); + + LOCAL_OUTPUT_FREE(data_external, data); + return (status == PSA_SUCCESS) ? unlock_status : status; +} + +MBEDTLS_STATIC_ASSERT((MBEDTLS_PSA_KA_MASK_EXTERNAL_ONLY & MBEDTLS_PSA_KA_MASK_DUAL_USE) == 0, + "One or more key attribute flag is listed as both external-only and dual-use"); +MBEDTLS_STATIC_ASSERT((PSA_KA_MASK_INTERNAL_ONLY & MBEDTLS_PSA_KA_MASK_DUAL_USE) == 0, + "One or more key attribute flag is listed as both internal-only and dual-use"); +MBEDTLS_STATIC_ASSERT((PSA_KA_MASK_INTERNAL_ONLY & MBEDTLS_PSA_KA_MASK_EXTERNAL_ONLY) == 0, + "One or more key attribute flag is listed as both internal-only and external-only"); + +/** Validate that a key policy is internally well-formed. + * + * This function only rejects invalid policies. It does not validate the + * consistency of the policy with respect to other attributes of the key + * such as the key type. + */ +static psa_status_t psa_validate_key_policy(const psa_key_policy_t *policy) +{ + if ((policy->usage & ~(PSA_KEY_USAGE_EXPORT | + PSA_KEY_USAGE_COPY | + PSA_KEY_USAGE_ENCRYPT | + PSA_KEY_USAGE_DECRYPT | + PSA_KEY_USAGE_SIGN_MESSAGE | + PSA_KEY_USAGE_VERIFY_MESSAGE | + PSA_KEY_USAGE_SIGN_HASH | + PSA_KEY_USAGE_VERIFY_HASH | + PSA_KEY_USAGE_DERIVE)) != 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + return PSA_SUCCESS; +} + +/** Validate the internal consistency of key attributes. + * + * This function only rejects invalid attribute values. If does not + * validate the consistency of the attributes with any key data that may + * be involved in the creation of the key. + * + * Call this function early in the key creation process. + * + * \param[in] attributes Key attributes for the new key. + * \param[out] p_drv On any return, the driver for the key, if any. + * NULL for a transparent key. + * + */ +static psa_status_t psa_validate_key_attributes( + const psa_key_attributes_t *attributes, + psa_se_drv_table_entry_t **p_drv) +{ + psa_status_t status = PSA_ERROR_INVALID_ARGUMENT; + psa_key_lifetime_t lifetime = psa_get_key_lifetime(attributes); + mbedtls_svc_key_id_t key = psa_get_key_id(attributes); + + status = psa_validate_key_location(lifetime, p_drv); + if (status != PSA_SUCCESS) { + return status; + } + + status = psa_validate_key_persistence(lifetime); + if (status != PSA_SUCCESS) { + return status; + } + + if (PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)) { + if (MBEDTLS_SVC_KEY_ID_GET_KEY_ID(key) != 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + } else { + if (!psa_is_valid_key_id(psa_get_key_id(attributes), 0)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + } + + status = psa_validate_key_policy(&attributes->core.policy); + if (status != PSA_SUCCESS) { + return status; + } + + /* Refuse to create overly large keys. + * Note that this doesn't trigger on import if the attributes don't + * explicitly specify a size (so psa_get_key_bits returns 0), so + * psa_import_key() needs its own checks. */ + if (psa_get_key_bits(attributes) > PSA_MAX_KEY_BITS) { + return PSA_ERROR_NOT_SUPPORTED; + } + + /* Reject invalid flags. These should not be reachable through the API. */ + if (attributes->core.flags & ~(MBEDTLS_PSA_KA_MASK_EXTERNAL_ONLY | + MBEDTLS_PSA_KA_MASK_DUAL_USE)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + return PSA_SUCCESS; +} + +/** Prepare a key slot to receive key material. + * + * This function allocates a key slot and sets its metadata. + * + * If this function fails, call psa_fail_key_creation(). + * + * This function is intended to be used as follows: + * -# Call psa_start_key_creation() to allocate a key slot, prepare + * it with the specified attributes, and in case of a volatile key assign it + * a volatile key identifier. + * -# Populate the slot with the key material. + * -# Call psa_finish_key_creation() to finalize the creation of the slot. + * In case of failure at any step, stop the sequence and call + * psa_fail_key_creation(). + * + * On success, the key slot is locked. It is the responsibility of the caller + * to unlock the key slot when it does not access it anymore. + * + * \param method An identification of the calling function. + * \param[in] attributes Key attributes for the new key. + * \param[out] p_slot On success, a pointer to the prepared slot. + * \param[out] p_drv On any return, the driver for the key, if any. + * NULL for a transparent key. + * + * \retval #PSA_SUCCESS + * The key slot is ready to receive key material. + * \return If this function fails, the key slot is an invalid state. + * You must call psa_fail_key_creation() to wipe and free the slot. + */ +static psa_status_t psa_start_key_creation( + psa_key_creation_method_t method, + const psa_key_attributes_t *attributes, + psa_key_slot_t **p_slot, + psa_se_drv_table_entry_t **p_drv) +{ + psa_status_t status; + psa_key_id_t volatile_key_id; + psa_key_slot_t *slot; + + (void) method; + *p_drv = NULL; + + status = psa_validate_key_attributes(attributes, p_drv); + if (status != PSA_SUCCESS) { + return status; + } + + status = psa_get_empty_key_slot(&volatile_key_id, p_slot); + if (status != PSA_SUCCESS) { + return status; + } + slot = *p_slot; + + /* We're storing the declared bit-size of the key. It's up to each + * creation mechanism to verify that this information is correct. + * It's automatically correct for mechanisms that use the bit-size as + * an input (generate, device) but not for those where the bit-size + * is optional (import, copy). In case of a volatile key, assign it the + * volatile key identifier associated to the slot returned to contain its + * definition. */ + + slot->attr = attributes->core; + if (PSA_KEY_LIFETIME_IS_VOLATILE(slot->attr.lifetime)) { +#if !defined(MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER) + slot->attr.id = volatile_key_id; +#else + slot->attr.id.key_id = volatile_key_id; +#endif + } + + /* Erase external-only flags from the internal copy. To access + * external-only flags, query `attributes`. Thanks to the check + * in psa_validate_key_attributes(), this leaves the dual-use + * flags and any internal flag that psa_get_empty_key_slot() + * may have set. */ + slot->attr.flags &= ~MBEDTLS_PSA_KA_MASK_EXTERNAL_ONLY; + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + /* For a key in a secure element, we need to do three things + * when creating or registering a persistent key: + * create the key file in internal storage, create the + * key inside the secure element, and update the driver's + * persistent data. This is done by starting a transaction that will + * encompass these three actions. + * For registering a volatile key, we just need to find an appropriate + * slot number inside the SE. Since the key is designated volatile, creating + * a transaction is not required. */ + /* The first thing to do is to find a slot number for the new key. + * We save the slot number in persistent storage as part of the + * transaction data. It will be needed to recover if the power + * fails during the key creation process, to clean up on the secure + * element side after restarting. Obtaining a slot number from the + * secure element driver updates its persistent state, but we do not yet + * save the driver's persistent state, so that if the power fails, + * we can roll back to a state where the key doesn't exist. */ + if (*p_drv != NULL) { + psa_key_slot_number_t slot_number; + status = psa_find_se_slot_for_key(attributes, method, *p_drv, + &slot_number); + if (status != PSA_SUCCESS) { + return status; + } + + if (!PSA_KEY_LIFETIME_IS_VOLATILE(attributes->core.lifetime)) { + psa_crypto_prepare_transaction(PSA_CRYPTO_TRANSACTION_CREATE_KEY); + psa_crypto_transaction.key.lifetime = slot->attr.lifetime; + psa_crypto_transaction.key.slot = slot_number; + psa_crypto_transaction.key.id = slot->attr.id; + status = psa_crypto_save_transaction(); + if (status != PSA_SUCCESS) { + (void) psa_crypto_stop_transaction(); + return status; + } + } + + status = psa_copy_key_material_into_slot( + slot, (uint8_t *) (&slot_number), sizeof(slot_number)); + if (status != PSA_SUCCESS) { + return status; + } + } + + if (*p_drv == NULL && method == PSA_KEY_CREATION_REGISTER) { + /* Key registration only makes sense with a secure element. */ + return PSA_ERROR_INVALID_ARGUMENT; + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + + return PSA_SUCCESS; +} + +/** Finalize the creation of a key once its key material has been set. + * + * This entails writing the key to persistent storage. + * + * If this function fails, call psa_fail_key_creation(). + * See the documentation of psa_start_key_creation() for the intended use + * of this function. + * + * If the finalization succeeds, the function unlocks the key slot (it was + * locked by psa_start_key_creation()) and the key slot cannot be accessed + * anymore as part of the key creation process. + * + * \param[in,out] slot Pointer to the slot with key material. + * \param[in] driver The secure element driver for the key, + * or NULL for a transparent key. + * \param[out] key On success, identifier of the key. Note that the + * key identifier is also stored in the key slot. + * + * \retval #PSA_SUCCESS + * The key was successfully created. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription + * \retval #PSA_ERROR_ALREADY_EXISTS \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * + * \return If this function fails, the key slot is an invalid state. + * You must call psa_fail_key_creation() to wipe and free the slot. + */ +static psa_status_t psa_finish_key_creation( + psa_key_slot_t *slot, + psa_se_drv_table_entry_t *driver, + mbedtls_svc_key_id_t *key) +{ + psa_status_t status = PSA_SUCCESS; + (void) slot; + (void) driver; + +#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) + if (!PSA_KEY_LIFETIME_IS_VOLATILE(slot->attr.lifetime)) { +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + if (driver != NULL) { + psa_se_key_data_storage_t data; + psa_key_slot_number_t slot_number = + psa_key_slot_get_slot_number(slot); + + MBEDTLS_STATIC_ASSERT(sizeof(slot_number) == + sizeof(data.slot_number), + "Slot number size does not match psa_se_key_data_storage_t"); + + memcpy(&data.slot_number, &slot_number, sizeof(slot_number)); + status = psa_save_persistent_key(&slot->attr, + (uint8_t *) &data, + sizeof(data)); + } else +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + { + /* Key material is saved in export representation in the slot, so + * just pass the slot buffer for storage. */ + status = psa_save_persistent_key(&slot->attr, + slot->key.data, + slot->key.bytes); + } + } +#endif /* defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) */ + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + /* Finish the transaction for a key creation. This does not + * happen when registering an existing key. Detect this case + * by checking whether a transaction is in progress (actual + * creation of a persistent key in a secure element requires a transaction, + * but registration or volatile key creation doesn't use one). */ + if (driver != NULL && + psa_crypto_transaction.unknown.type == PSA_CRYPTO_TRANSACTION_CREATE_KEY) { + status = psa_save_se_persistent_data(driver); + if (status != PSA_SUCCESS) { + psa_destroy_persistent_key(slot->attr.id); + return status; + } + status = psa_crypto_stop_transaction(); + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + + if (status == PSA_SUCCESS) { + *key = slot->attr.id; + status = psa_unlock_key_slot(slot); + if (status != PSA_SUCCESS) { + *key = MBEDTLS_SVC_KEY_ID_INIT; + } + } + + return status; +} + +/** Abort the creation of a key. + * + * You may call this function after calling psa_start_key_creation(), + * or after psa_finish_key_creation() fails. In other circumstances, this + * function may not clean up persistent storage. + * See the documentation of psa_start_key_creation() for the intended use + * of this function. + * + * \param[in,out] slot Pointer to the slot with key material. + * \param[in] driver The secure element driver for the key, + * or NULL for a transparent key. + */ +static void psa_fail_key_creation(psa_key_slot_t *slot, + psa_se_drv_table_entry_t *driver) +{ + (void) driver; + + if (slot == NULL) { + return; + } + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + /* TODO: If the key has already been created in the secure + * element, and the failure happened later (when saving metadata + * to internal storage), we need to destroy the key in the secure + * element. + * https://github.com/ARMmbed/mbed-crypto/issues/217 + */ + + /* Abort the ongoing transaction if any (there may not be one if + * the creation process failed before starting one, or if the + * key creation is a registration of a key in a secure element). + * Earlier functions must already have done what it takes to undo any + * partial creation. All that's left is to update the transaction data + * itself. */ + (void) psa_crypto_stop_transaction(); +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + + psa_wipe_key_slot(slot); +} + +/** Validate optional attributes during key creation. + * + * Some key attributes are optional during key creation. If they are + * specified in the attributes structure, check that they are consistent + * with the data in the slot. + * + * This function should be called near the end of key creation, after + * the slot in memory is fully populated but before saving persistent data. + */ +static psa_status_t psa_validate_optional_attributes( + const psa_key_slot_t *slot, + const psa_key_attributes_t *attributes) +{ + if (attributes->core.type != 0) { + if (attributes->core.type != slot->attr.type) { + return PSA_ERROR_INVALID_ARGUMENT; + } + } + + if (attributes->domain_parameters_size != 0) { +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || \ + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) + if (PSA_KEY_TYPE_IS_RSA(slot->attr.type)) { + mbedtls_rsa_context *rsa = NULL; + mbedtls_mpi actual, required; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + psa_status_t status = mbedtls_psa_rsa_load_representation( + slot->attr.type, + slot->key.data, + slot->key.bytes, + &rsa); + if (status != PSA_SUCCESS) { + return status; + } + + mbedtls_mpi_init(&actual); + mbedtls_mpi_init(&required); + ret = mbedtls_rsa_export(rsa, + NULL, NULL, NULL, NULL, &actual); + mbedtls_rsa_free(rsa); + mbedtls_free(rsa); + if (ret != 0) { + goto rsa_exit; + } + ret = mbedtls_mpi_read_binary(&required, + attributes->domain_parameters, + attributes->domain_parameters_size); + if (ret != 0) { + goto rsa_exit; + } + if (mbedtls_mpi_cmp_mpi(&actual, &required) != 0) { + ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } +rsa_exit: + mbedtls_mpi_free(&actual); + mbedtls_mpi_free(&required); + if (ret != 0) { + return mbedtls_to_psa_error(ret); + } + } else +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || + * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) */ + { + return PSA_ERROR_INVALID_ARGUMENT; + } + } + + if (attributes->core.bits != 0) { + if (attributes->core.bits != slot->attr.bits) { + return PSA_ERROR_INVALID_ARGUMENT; + } + } + + return PSA_SUCCESS; +} + +psa_status_t psa_import_key(const psa_key_attributes_t *attributes, + const uint8_t *data_external, + size_t data_length, + mbedtls_svc_key_id_t *key) +{ + psa_status_t status; + LOCAL_INPUT_DECLARE(data_external, data); + psa_key_slot_t *slot = NULL; + psa_se_drv_table_entry_t *driver = NULL; + size_t bits; + + *key = MBEDTLS_SVC_KEY_ID_INIT; + + /* Reject zero-length symmetric keys (including raw data key objects). + * This also rejects any key which might be encoded as an empty string, + * which is never valid. */ + if (data_length == 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + LOCAL_INPUT_ALLOC(data_external, data_length, data); + + status = psa_start_key_creation(PSA_KEY_CREATION_IMPORT, attributes, + &slot, &driver); + if (status != PSA_SUCCESS) { + goto exit; + } + + /* In the case of a transparent key or an opaque key stored in local + * storage (thus not in the case of generating a key in a secure element + * or cryptoprocessor with storage), we have to allocate a buffer to + * hold the generated key material. */ + if (slot->key.data == NULL) { + status = psa_allocate_buffer_to_slot(slot, data_length); + if (status != PSA_SUCCESS) { + goto exit; + } + } + + bits = slot->attr.bits; + status = psa_driver_wrapper_import_key(attributes, + data, data_length, + slot->key.data, + slot->key.bytes, + &slot->key.bytes, &bits); + if (status != PSA_SUCCESS) { + goto exit; + } + + if (slot->attr.bits == 0) { + slot->attr.bits = (psa_key_bits_t) bits; + } else if (bits != slot->attr.bits) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + status = psa_validate_optional_attributes(slot, attributes); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_finish_key_creation(slot, driver, key); +exit: + LOCAL_INPUT_FREE(data_external, data); + if (status != PSA_SUCCESS) { + psa_fail_key_creation(slot, driver); + } + + return status; +} + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) +psa_status_t mbedtls_psa_register_se_key( + const psa_key_attributes_t *attributes) +{ + psa_status_t status; + psa_key_slot_t *slot = NULL; + psa_se_drv_table_entry_t *driver = NULL; + mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT; + + /* Leaving attributes unspecified is not currently supported. + * It could make sense to query the key type and size from the + * secure element, but not all secure elements support this + * and the driver HAL doesn't currently support it. */ + if (psa_get_key_type(attributes) == PSA_KEY_TYPE_NONE) { + return PSA_ERROR_NOT_SUPPORTED; + } + if (psa_get_key_bits(attributes) == 0) { + return PSA_ERROR_NOT_SUPPORTED; + } + + /* Not usable with volatile keys, even with an appropriate location, + * due to the API design. + * https://github.com/Mbed-TLS/mbedtls/issues/9253 + */ + if (PSA_KEY_LIFETIME_IS_VOLATILE(psa_get_key_lifetime(attributes))) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + status = psa_start_key_creation(PSA_KEY_CREATION_REGISTER, attributes, + &slot, &driver); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_finish_key_creation(slot, driver, &key); + +exit: + if (status != PSA_SUCCESS) { + psa_fail_key_creation(slot, driver); + } + + /* Registration doesn't keep the key in RAM. */ + psa_close_key(key); + return status; +} +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + +static psa_status_t psa_copy_key_material(const psa_key_slot_t *source, + psa_key_slot_t *target) +{ + psa_status_t status = psa_copy_key_material_into_slot(target, + source->key.data, + source->key.bytes); + if (status != PSA_SUCCESS) { + return status; + } + + target->attr.type = source->attr.type; + target->attr.bits = source->attr.bits; + + return PSA_SUCCESS; +} + +psa_status_t psa_copy_key(mbedtls_svc_key_id_t source_key, + const psa_key_attributes_t *specified_attributes, + mbedtls_svc_key_id_t *target_key) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_slot_t *source_slot = NULL; + psa_key_slot_t *target_slot = NULL; + psa_key_attributes_t actual_attributes = *specified_attributes; + psa_se_drv_table_entry_t *driver = NULL; + + *target_key = MBEDTLS_SVC_KEY_ID_INIT; + + status = psa_get_and_lock_transparent_key_slot_with_policy( + source_key, &source_slot, PSA_KEY_USAGE_COPY, 0); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_validate_optional_attributes(source_slot, + specified_attributes); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_restrict_key_policy(source_slot->attr.type, + &actual_attributes.core.policy, + &source_slot->attr.policy); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_start_key_creation(PSA_KEY_CREATION_COPY, &actual_attributes, + &target_slot, &driver); + if (status != PSA_SUCCESS) { + goto exit; + } + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + if (driver != NULL) { + /* Copying to a secure element is not implemented yet. */ + status = PSA_ERROR_NOT_SUPPORTED; + goto exit; + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + + if (psa_key_lifetime_is_external(actual_attributes.core.lifetime)) { + /* + * Copying through an opaque driver is not implemented yet, consider + * a lifetime with an external location as an invalid parameter for + * now. + */ + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + status = psa_copy_key_material(source_slot, target_slot); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_finish_key_creation(target_slot, driver, target_key); +exit: + if (status != PSA_SUCCESS) { + psa_fail_key_creation(target_slot, driver); + } + + unlock_status = psa_unlock_key_slot(source_slot); + + return (status == PSA_SUCCESS) ? unlock_status : status; +} + + + +/****************************************************************/ +/* Message digests */ +/****************************************************************/ + +static int is_hash_supported(psa_algorithm_t alg) +{ + switch (alg) { +#if defined(PSA_WANT_ALG_MD2) + case PSA_ALG_MD2: + return 1; +#endif +#if defined(PSA_WANT_ALG_MD4) + case PSA_ALG_MD4: + return 1; +#endif +#if defined(PSA_WANT_ALG_MD5) + case PSA_ALG_MD5: + return 1; +#endif +#if defined(PSA_WANT_ALG_RIPEMD160) + case PSA_ALG_RIPEMD160: + return 1; +#endif +#if defined(PSA_WANT_ALG_SHA_1) + case PSA_ALG_SHA_1: + return 1; +#endif +#if defined(PSA_WANT_ALG_SHA_224) + case PSA_ALG_SHA_224: + return 1; +#endif +#if defined(PSA_WANT_ALG_SHA_256) + case PSA_ALG_SHA_256: + return 1; +#endif +#if defined(PSA_WANT_ALG_SHA_384) + case PSA_ALG_SHA_384: + return 1; +#endif +#if defined(PSA_WANT_ALG_SHA_512) + case PSA_ALG_SHA_512: + return 1; +#endif + default: + return 0; + } +} + +psa_status_t psa_hash_abort(psa_hash_operation_t *operation) +{ + /* Aborting a non-active operation is allowed */ + if (operation->id == 0) { + return PSA_SUCCESS; + } + + psa_status_t status = psa_driver_wrapper_hash_abort(operation); + operation->id = 0; + + return status; +} + +psa_status_t psa_hash_setup(psa_hash_operation_t *operation, + psa_algorithm_t alg) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + /* A context must be freshly initialized before it can be set up. */ + if (operation->id != 0) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + if (!PSA_ALG_IS_HASH(alg)) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + /* Ensure all of the context is zeroized, since PSA_HASH_OPERATION_INIT only + * directly zeroes the int-sized dummy member of the context union. */ + memset(&operation->ctx, 0, sizeof(operation->ctx)); + + status = psa_driver_wrapper_hash_setup(operation, alg); + +exit: + if (status != PSA_SUCCESS) { + psa_hash_abort(operation); + } + + return status; +} + +psa_status_t psa_hash_update(psa_hash_operation_t *operation, + const uint8_t *input_external, + size_t input_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + LOCAL_INPUT_DECLARE(input_external, input); + + if (operation->id == 0) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + /* Don't require hash implementations to behave correctly on a + * zero-length input, which may have an invalid pointer. */ + if (input_length == 0) { + return PSA_SUCCESS; + } + + LOCAL_INPUT_ALLOC(input_external, input_length, input); + status = psa_driver_wrapper_hash_update(operation, input, input_length); + +exit: + if (status != PSA_SUCCESS) { + psa_hash_abort(operation); + } + + LOCAL_INPUT_FREE(input_external, input); + return status; +} + +static psa_status_t psa_hash_finish_internal(psa_hash_operation_t *operation, + uint8_t *hash, + size_t hash_size, + size_t *hash_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + *hash_length = 0; + if (operation->id == 0) { + return PSA_ERROR_BAD_STATE; + } + + status = psa_driver_wrapper_hash_finish( + operation, hash, hash_size, hash_length); + psa_hash_abort(operation); + + return status; +} + +psa_status_t psa_hash_finish(psa_hash_operation_t *operation, + uint8_t *hash_external, + size_t hash_size, + size_t *hash_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + LOCAL_OUTPUT_DECLARE(hash_external, hash); + + LOCAL_OUTPUT_ALLOC(hash_external, hash_size, hash); + status = psa_hash_finish_internal(operation, hash, hash_size, hash_length); + +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + LOCAL_OUTPUT_FREE(hash_external, hash); + return status; +} + +psa_status_t psa_hash_verify(psa_hash_operation_t *operation, + const uint8_t *hash_external, + size_t hash_length) +{ + uint8_t actual_hash[PSA_HASH_MAX_SIZE]; + size_t actual_hash_length; + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + LOCAL_INPUT_DECLARE(hash_external, hash); + + status = psa_hash_finish_internal( + operation, + actual_hash, sizeof(actual_hash), + &actual_hash_length); + + if (status != PSA_SUCCESS) { + goto exit; + } + + if (actual_hash_length != hash_length) { + status = PSA_ERROR_INVALID_SIGNATURE; + goto exit; + } + + LOCAL_INPUT_ALLOC(hash_external, hash_length, hash); + if (mbedtls_psa_safer_memcmp(hash, actual_hash, actual_hash_length) != 0) { + status = PSA_ERROR_INVALID_SIGNATURE; + } + +exit: + mbedtls_platform_zeroize(actual_hash, sizeof(actual_hash)); + if (status != PSA_SUCCESS) { + psa_hash_abort(operation); + } + LOCAL_INPUT_FREE(hash_external, hash); + return status; +} + +psa_status_t psa_hash_compute(psa_algorithm_t alg, + const uint8_t *input_external, size_t input_length, + uint8_t *hash_external, size_t hash_size, + size_t *hash_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + LOCAL_INPUT_DECLARE(input_external, input); + LOCAL_OUTPUT_DECLARE(hash_external, hash); + + *hash_length = 0; + if (!PSA_ALG_IS_HASH(alg)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + LOCAL_INPUT_ALLOC(input_external, input_length, input); + LOCAL_OUTPUT_ALLOC(hash_external, hash_size, hash); + status = psa_driver_wrapper_hash_compute(alg, input, input_length, + hash, hash_size, hash_length); + +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + LOCAL_INPUT_FREE(input_external, input); + LOCAL_OUTPUT_FREE(hash_external, hash); + return status; +} + +psa_status_t psa_hash_compare(psa_algorithm_t alg, + const uint8_t *input_external, size_t input_length, + const uint8_t *hash_external, size_t hash_length) +{ + uint8_t actual_hash[PSA_HASH_MAX_SIZE]; + size_t actual_hash_length; + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + LOCAL_INPUT_DECLARE(input_external, input); + LOCAL_INPUT_DECLARE(hash_external, hash); + + if (!PSA_ALG_IS_HASH(alg)) { + status = PSA_ERROR_INVALID_ARGUMENT; + return status; + } + + LOCAL_INPUT_ALLOC(input_external, input_length, input); + status = psa_driver_wrapper_hash_compute( + alg, input, input_length, + actual_hash, sizeof(actual_hash), + &actual_hash_length); + if (status != PSA_SUCCESS) { + goto exit; + } + if (actual_hash_length != hash_length) { + status = PSA_ERROR_INVALID_SIGNATURE; + goto exit; + } + + LOCAL_INPUT_ALLOC(hash_external, hash_length, hash); + if (mbedtls_psa_safer_memcmp(hash, actual_hash, actual_hash_length) != 0) { + status = PSA_ERROR_INVALID_SIGNATURE; + } + +exit: + mbedtls_platform_zeroize(actual_hash, sizeof(actual_hash)); + + LOCAL_INPUT_FREE(input_external, input); + LOCAL_INPUT_FREE(hash_external, hash); + + return status; +} + +psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation, + psa_hash_operation_t *target_operation) +{ + if (source_operation->id == 0 || + target_operation->id != 0) { + return PSA_ERROR_BAD_STATE; + } + + psa_status_t status = psa_driver_wrapper_hash_clone(source_operation, + target_operation); + if (status != PSA_SUCCESS) { + psa_hash_abort(target_operation); + } + + return status; +} + + +/****************************************************************/ +/* MAC */ +/****************************************************************/ + +psa_status_t psa_mac_abort(psa_mac_operation_t *operation) +{ + /* Aborting a non-active operation is allowed */ + if (operation->id == 0) { + return PSA_SUCCESS; + } + + psa_status_t status = psa_driver_wrapper_mac_abort(operation); + operation->mac_size = 0; + operation->is_sign = 0; + operation->id = 0; + + return status; +} + +static psa_status_t psa_mac_finalize_alg_and_key_validation( + psa_algorithm_t alg, + const psa_key_attributes_t *attributes, + uint8_t *mac_size) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_type_t key_type = psa_get_key_type(attributes); + size_t key_bits = psa_get_key_bits(attributes); + + if (!PSA_ALG_IS_MAC(alg)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + /* Validate the combination of key type and algorithm */ + status = psa_mac_key_can_do(alg, key_type); + if (status != PSA_SUCCESS) { + return status; + } + + /* Get the output length for the algorithm and key combination */ + *mac_size = PSA_MAC_LENGTH(key_type, key_bits, alg); + + if (*mac_size < 4) { + /* A very short MAC is too short for security since it can be + * brute-forced. Ancient protocols with 32-bit MACs do exist, + * so we make this our minimum, even though 32 bits is still + * too small for security. */ + return PSA_ERROR_NOT_SUPPORTED; + } + + if (*mac_size > PSA_MAC_LENGTH(key_type, key_bits, + PSA_ALG_FULL_LENGTH_MAC(alg))) { + /* It's impossible to "truncate" to a larger length than the full length + * of the algorithm. */ + return PSA_ERROR_INVALID_ARGUMENT; + } + + if (*mac_size > PSA_MAC_MAX_SIZE) { + /* PSA_MAC_LENGTH returns the correct length even for a MAC algorithm + * that is disabled in the compile-time configuration. The result can + * therefore be larger than PSA_MAC_MAX_SIZE, which does take the + * configuration into account. In this case, force a return of + * PSA_ERROR_NOT_SUPPORTED here. Otherwise psa_mac_verify(), or + * psa_mac_compute(mac_size=PSA_MAC_MAX_SIZE), would return + * PSA_ERROR_BUFFER_TOO_SMALL for an unsupported algorithm whose MAC size + * is larger than PSA_MAC_MAX_SIZE, which is misleading and which breaks + * systematically generated tests. */ + return PSA_ERROR_NOT_SUPPORTED; + } + + return PSA_SUCCESS; +} + +static psa_status_t psa_mac_setup(psa_mac_operation_t *operation, + mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + int is_sign) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_attributes_t attributes; + psa_key_slot_t *slot = NULL; + + /* A context must be freshly initialized before it can be set up. */ + if (operation->id != 0) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + status = psa_get_and_lock_key_slot_with_policy( + key, + &slot, + is_sign ? PSA_KEY_USAGE_SIGN_MESSAGE : PSA_KEY_USAGE_VERIFY_MESSAGE, + alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + attributes = (psa_key_attributes_t) { + .core = slot->attr + }; + + status = psa_mac_finalize_alg_and_key_validation(alg, &attributes, + &operation->mac_size); + if (status != PSA_SUCCESS) { + goto exit; + } + + operation->is_sign = is_sign; + /* Dispatch the MAC setup call with validated input */ + if (is_sign) { + status = psa_driver_wrapper_mac_sign_setup(operation, + &attributes, + slot->key.data, + slot->key.bytes, + alg); + } else { + status = psa_driver_wrapper_mac_verify_setup(operation, + &attributes, + slot->key.data, + slot->key.bytes, + alg); + } + +exit: + if (status != PSA_SUCCESS) { + psa_mac_abort(operation); + } + + unlock_status = psa_unlock_key_slot(slot); + + return (status == PSA_SUCCESS) ? unlock_status : status; +} + +psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation, + mbedtls_svc_key_id_t key, + psa_algorithm_t alg) +{ + return psa_mac_setup(operation, key, alg, 1); +} + +psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation, + mbedtls_svc_key_id_t key, + psa_algorithm_t alg) +{ + return psa_mac_setup(operation, key, alg, 0); +} + +psa_status_t psa_mac_update(psa_mac_operation_t *operation, + const uint8_t *input_external, + size_t input_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + LOCAL_INPUT_DECLARE(input_external, input); + + if (operation->id == 0) { + status = PSA_ERROR_BAD_STATE; + return status; + } + + /* Don't require hash implementations to behave correctly on a + * zero-length input, which may have an invalid pointer. */ + if (input_length == 0) { + status = PSA_SUCCESS; + return status; + } + + LOCAL_INPUT_ALLOC(input_external, input_length, input); + status = psa_driver_wrapper_mac_update(operation, input, input_length); + + if (status != PSA_SUCCESS) { + psa_mac_abort(operation); + } + +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + LOCAL_INPUT_FREE(input_external, input); + + return status; +} + +psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation, + uint8_t *mac_external, + size_t mac_size, + size_t *mac_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED; + LOCAL_OUTPUT_DECLARE(mac_external, mac); + LOCAL_OUTPUT_ALLOC(mac_external, mac_size, mac); + + if (operation->id == 0) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + if (!operation->is_sign) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + /* Sanity check. This will guarantee that mac_size != 0 (and so mac != NULL) + * once all the error checks are done. */ + if (operation->mac_size == 0) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + if (mac_size < operation->mac_size) { + status = PSA_ERROR_BUFFER_TOO_SMALL; + goto exit; + } + + status = psa_driver_wrapper_mac_sign_finish(operation, + mac, operation->mac_size, + mac_length); + +exit: + /* In case of success, set the potential excess room in the output buffer + * to an invalid value, to avoid potentially leaking a longer MAC. + * In case of error, set the output length and content to a safe default, + * such that in case the caller misses an error check, the output would be + * an unachievable MAC. + */ + if (status != PSA_SUCCESS) { + *mac_length = mac_size; + operation->mac_size = 0; + } + + if ((mac != NULL) && (mac_size > operation->mac_size)) { + memset(&mac[operation->mac_size], '!', + mac_size - operation->mac_size); + } + + abort_status = psa_mac_abort(operation); + LOCAL_OUTPUT_FREE(mac_external, mac); + + return status == PSA_SUCCESS ? abort_status : status; +} + +psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation, + const uint8_t *mac_external, + size_t mac_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED; + LOCAL_INPUT_DECLARE(mac_external, mac); + + if (operation->id == 0) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + if (operation->is_sign) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + if (operation->mac_size != mac_length) { + status = PSA_ERROR_INVALID_SIGNATURE; + goto exit; + } + + LOCAL_INPUT_ALLOC(mac_external, mac_length, mac); + status = psa_driver_wrapper_mac_verify_finish(operation, + mac, mac_length); + +exit: + abort_status = psa_mac_abort(operation); + LOCAL_INPUT_FREE(mac_external, mac); + + return status == PSA_SUCCESS ? abort_status : status; +} + +static psa_status_t psa_mac_compute_internal(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *mac, + size_t mac_size, + size_t *mac_length, + int is_sign) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_attributes_t attributes; + psa_key_slot_t *slot; + uint8_t operation_mac_size = 0; + + status = psa_get_and_lock_key_slot_with_policy( + key, + &slot, + is_sign ? PSA_KEY_USAGE_SIGN_MESSAGE : PSA_KEY_USAGE_VERIFY_MESSAGE, + alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + attributes = (psa_key_attributes_t) { + .core = slot->attr + }; + + status = psa_mac_finalize_alg_and_key_validation(alg, &attributes, + &operation_mac_size); + if (status != PSA_SUCCESS) { + goto exit; + } + + if (mac_size < operation_mac_size) { + status = PSA_ERROR_BUFFER_TOO_SMALL; + goto exit; + } + + status = psa_driver_wrapper_mac_compute( + &attributes, + slot->key.data, slot->key.bytes, + alg, + input, input_length, + mac, operation_mac_size, mac_length); + +exit: + /* In case of success, set the potential excess room in the output buffer + * to an invalid value, to avoid potentially leaking a longer MAC. + * In case of error, set the output length and content to a safe default, + * such that in case the caller misses an error check, the output would be + * an unachievable MAC. + */ + if (status != PSA_SUCCESS) { + *mac_length = mac_size; + operation_mac_size = 0; + } + if (mac_size > operation_mac_size) { + memset(&mac[operation_mac_size], '!', mac_size - operation_mac_size); + } + + unlock_status = psa_unlock_key_slot(slot); + + return (status == PSA_SUCCESS) ? unlock_status : status; +} + +psa_status_t psa_mac_compute(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input_external, + size_t input_length, + uint8_t *mac_external, + size_t mac_size, + size_t *mac_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + LOCAL_INPUT_DECLARE(input_external, input); + LOCAL_OUTPUT_DECLARE(mac_external, mac); + + LOCAL_INPUT_ALLOC(input_external, input_length, input); + LOCAL_OUTPUT_ALLOC(mac_external, mac_size, mac); + status = psa_mac_compute_internal(key, alg, + input, input_length, + mac, mac_size, mac_length, 1); + +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + LOCAL_INPUT_FREE(input_external, input); + LOCAL_OUTPUT_FREE(mac_external, mac); + + return status; +} + +psa_status_t psa_mac_verify(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input_external, + size_t input_length, + const uint8_t *mac_external, + size_t mac_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + uint8_t actual_mac[PSA_MAC_MAX_SIZE]; + size_t actual_mac_length; + LOCAL_INPUT_DECLARE(input_external, input); + LOCAL_INPUT_DECLARE(mac_external, mac); + + LOCAL_INPUT_ALLOC(input_external, input_length, input); + status = psa_mac_compute_internal(key, alg, + input, input_length, + actual_mac, sizeof(actual_mac), + &actual_mac_length, 0); + if (status != PSA_SUCCESS) { + goto exit; + } + + if (mac_length != actual_mac_length) { + status = PSA_ERROR_INVALID_SIGNATURE; + goto exit; + } + + LOCAL_INPUT_ALLOC(mac_external, mac_length, mac); + if (mbedtls_psa_safer_memcmp(mac, actual_mac, actual_mac_length) != 0) { + status = PSA_ERROR_INVALID_SIGNATURE; + goto exit; + } + +exit: + mbedtls_platform_zeroize(actual_mac, sizeof(actual_mac)); + LOCAL_INPUT_FREE(input_external, input); + LOCAL_INPUT_FREE(mac_external, mac); + + return status; +} + +/****************************************************************/ +/* Asymmetric cryptography */ +/****************************************************************/ + +static psa_status_t psa_sign_verify_check_alg(int input_is_message, + psa_algorithm_t alg) +{ + if (input_is_message) { + if (!PSA_ALG_IS_SIGN_MESSAGE(alg)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + } + + psa_algorithm_t hash_alg = 0; + if (PSA_ALG_IS_SIGN_HASH(alg)) { + hash_alg = PSA_ALG_SIGN_GET_HASH(alg); + } + + /* Now hash_alg==0 if alg by itself doesn't need a hash. + * This is good enough for sign-hash, but a guaranteed failure for + * sign-message which needs to hash first for all algorithms + * supported at the moment. */ + + if (hash_alg == 0 && input_is_message) { + return PSA_ERROR_INVALID_ARGUMENT; + } + if (hash_alg == PSA_ALG_ANY_HASH) { + return PSA_ERROR_INVALID_ARGUMENT; + } + /* Give up immediately if the hash is not supported. This has + * several advantages: + * - For mechanisms that don't use the hash at all (e.g. + * ECDSA verification, randomized ECDSA signature), without + * this check, the operation would succeed even though it has + * been given an invalid argument. This would not be insecure + * since the hash was not necessary, but it would be weird. + * - For mechanisms that do use the hash, we avoid an error + * deep inside the execution. In principle this doesn't matter, + * but there is a little more risk of a bug in error handling + * deep inside than in this preliminary check. + * - When calling a driver, the driver might be capable of using + * a hash that the core doesn't support. This could potentially + * result in a buffer overflow if the hash is larger than the + * maximum hash size assumed by the core. + * - Returning a consistent error makes it possible to test + * not-supported hashes in a consistent way. + */ + if (hash_alg != 0 && !is_hash_supported(hash_alg)) { + return PSA_ERROR_NOT_SUPPORTED; + } + + return PSA_SUCCESS; +} + +static psa_status_t psa_sign_internal(mbedtls_svc_key_id_t key, + int input_is_message, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *signature, + size_t signature_size, + size_t *signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_attributes_t attributes; + psa_key_slot_t *slot; + + *signature_length = 0; + + status = psa_sign_verify_check_alg(input_is_message, alg); + if (status != PSA_SUCCESS) { + return status; + } + + /* Immediately reject a zero-length signature buffer. This guarantees + * that signature must be a valid pointer. (On the other hand, the input + * buffer can in principle be empty since it doesn't actually have + * to be a hash.) */ + if (signature_size == 0) { + return PSA_ERROR_BUFFER_TOO_SMALL; + } + + status = psa_get_and_lock_key_slot_with_policy( + key, &slot, + input_is_message ? PSA_KEY_USAGE_SIGN_MESSAGE : + PSA_KEY_USAGE_SIGN_HASH, + alg); + + if (status != PSA_SUCCESS) { + goto exit; + } + + if (!PSA_KEY_TYPE_IS_KEY_PAIR(slot->attr.type)) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + attributes = (psa_key_attributes_t) { + .core = slot->attr + }; + + if (input_is_message) { + status = psa_driver_wrapper_sign_message( + &attributes, slot->key.data, slot->key.bytes, + alg, input, input_length, + signature, signature_size, signature_length); + } else { + + status = psa_driver_wrapper_sign_hash( + &attributes, slot->key.data, slot->key.bytes, + alg, input, input_length, + signature, signature_size, signature_length); + } + + +exit: + /* Fill the unused part of the output buffer (the whole buffer on error, + * the trailing part on success) with something that isn't a valid signature + * (barring an attack on the signature and deliberately-crafted input), + * in case the caller doesn't check the return status properly. */ + if (status == PSA_SUCCESS) { + memset(signature + *signature_length, '!', + signature_size - *signature_length); + } else { + memset(signature, '!', signature_size); + } + /* If signature_size is 0 then we have nothing to do. We must not call + * memset because signature may be NULL in this case. */ + + unlock_status = psa_unlock_key_slot(slot); + + return (status == PSA_SUCCESS) ? unlock_status : status; +} + +static psa_status_t psa_verify_internal(mbedtls_svc_key_id_t key, + int input_is_message, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *signature, + size_t signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_slot_t *slot; + + status = psa_sign_verify_check_alg(input_is_message, alg); + if (status != PSA_SUCCESS) { + return status; + } + + status = psa_get_and_lock_key_slot_with_policy( + key, &slot, + input_is_message ? PSA_KEY_USAGE_VERIFY_MESSAGE : + PSA_KEY_USAGE_VERIFY_HASH, + alg); + + if (status != PSA_SUCCESS) { + return status; + } + + psa_key_attributes_t attributes = { + .core = slot->attr + }; + + if (input_is_message) { + status = psa_driver_wrapper_verify_message( + &attributes, slot->key.data, slot->key.bytes, + alg, input, input_length, + signature, signature_length); + } else { + status = psa_driver_wrapper_verify_hash( + &attributes, slot->key.data, slot->key.bytes, + alg, input, input_length, + signature, signature_length); + } + + unlock_status = psa_unlock_key_slot(slot); + + return (status == PSA_SUCCESS) ? unlock_status : status; + +} + +psa_status_t psa_sign_message_builtin( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *signature, + size_t signature_size, + size_t *signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + if (PSA_ALG_IS_SIGN_HASH(alg)) { + size_t hash_length; + uint8_t hash[PSA_HASH_MAX_SIZE]; + + status = psa_driver_wrapper_hash_compute( + PSA_ALG_SIGN_GET_HASH(alg), + input, input_length, + hash, sizeof(hash), &hash_length); + + if (status != PSA_SUCCESS) { + return status; + } + + return psa_driver_wrapper_sign_hash( + attributes, key_buffer, key_buffer_size, + alg, hash, hash_length, + signature, signature_size, signature_length); + } + + return PSA_ERROR_NOT_SUPPORTED; +} + +psa_status_t psa_sign_message(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input_external, + size_t input_length, + uint8_t *signature_external, + size_t signature_size, + size_t *signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + LOCAL_INPUT_DECLARE(input_external, input); + LOCAL_OUTPUT_DECLARE(signature_external, signature); + + LOCAL_INPUT_ALLOC(input_external, input_length, input); + LOCAL_OUTPUT_ALLOC(signature_external, signature_size, signature); + status = psa_sign_internal(key, 1, alg, input, input_length, signature, + signature_size, signature_length); + +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + LOCAL_INPUT_FREE(input_external, input); + LOCAL_OUTPUT_FREE(signature_external, signature); + return status; +} + +psa_status_t psa_verify_message_builtin( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *signature, + size_t signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + if (PSA_ALG_IS_SIGN_HASH(alg)) { + size_t hash_length; + uint8_t hash[PSA_HASH_MAX_SIZE]; + + status = psa_driver_wrapper_hash_compute( + PSA_ALG_SIGN_GET_HASH(alg), + input, input_length, + hash, sizeof(hash), &hash_length); + + if (status != PSA_SUCCESS) { + return status; + } + + return psa_driver_wrapper_verify_hash( + attributes, key_buffer, key_buffer_size, + alg, hash, hash_length, + signature, signature_length); + } + + return PSA_ERROR_NOT_SUPPORTED; +} + +psa_status_t psa_verify_message(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input_external, + size_t input_length, + const uint8_t *signature_external, + size_t signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + LOCAL_INPUT_DECLARE(input_external, input); + LOCAL_INPUT_DECLARE(signature_external, signature); + + LOCAL_INPUT_ALLOC(input_external, input_length, input); + LOCAL_INPUT_ALLOC(signature_external, signature_length, signature); + status = psa_verify_internal(key, 1, alg, input, input_length, signature, + signature_length); + +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + LOCAL_INPUT_FREE(input_external, input); + LOCAL_INPUT_FREE(signature_external, signature); + + return status; +} + +psa_status_t psa_sign_hash_builtin( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + uint8_t *signature, size_t signature_size, size_t *signature_length) +{ + if (attributes->core.type == PSA_KEY_TYPE_RSA_KEY_PAIR) { + if (PSA_ALG_IS_RSA_PKCS1V15_SIGN(alg) || + PSA_ALG_IS_RSA_PSS(alg)) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) + return mbedtls_psa_rsa_sign_hash( + attributes, + key_buffer, key_buffer_size, + alg, hash, hash_length, + signature, signature_size, signature_length); +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) */ + } else { + return PSA_ERROR_INVALID_ARGUMENT; + } + } else if (PSA_KEY_TYPE_IS_ECC(attributes->core.type)) { + if (PSA_ALG_IS_ECDSA(alg)) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) + return mbedtls_psa_ecdsa_sign_hash( + attributes, + key_buffer, key_buffer_size, + alg, hash, hash_length, + signature, signature_size, signature_length); +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */ + } else { + return PSA_ERROR_INVALID_ARGUMENT; + } + } + + (void) key_buffer; + (void) key_buffer_size; + (void) hash; + (void) hash_length; + (void) signature; + (void) signature_size; + (void) signature_length; + + return PSA_ERROR_NOT_SUPPORTED; +} + +psa_status_t psa_sign_hash(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *hash_external, + size_t hash_length, + uint8_t *signature_external, + size_t signature_size, + size_t *signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + LOCAL_INPUT_DECLARE(hash_external, hash); + LOCAL_OUTPUT_DECLARE(signature_external, signature); + + LOCAL_INPUT_ALLOC(hash_external, hash_length, hash); + LOCAL_OUTPUT_ALLOC(signature_external, signature_size, signature); + status = psa_sign_internal(key, 0, alg, hash, hash_length, signature, + signature_size, signature_length); + +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + LOCAL_INPUT_FREE(hash_external, hash); + LOCAL_OUTPUT_FREE(signature_external, signature); + + return status; +} + +psa_status_t psa_verify_hash_builtin( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + const uint8_t *signature, size_t signature_length) +{ + if (PSA_KEY_TYPE_IS_RSA(attributes->core.type)) { + if (PSA_ALG_IS_RSA_PKCS1V15_SIGN(alg) || + PSA_ALG_IS_RSA_PSS(alg)) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) + return mbedtls_psa_rsa_verify_hash( + attributes, + key_buffer, key_buffer_size, + alg, hash, hash_length, + signature, signature_length); +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) */ + } else { + return PSA_ERROR_INVALID_ARGUMENT; + } + } else if (PSA_KEY_TYPE_IS_ECC(attributes->core.type)) { + if (PSA_ALG_IS_ECDSA(alg)) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) + return mbedtls_psa_ecdsa_verify_hash( + attributes, + key_buffer, key_buffer_size, + alg, hash, hash_length, + signature, signature_length); +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */ + } else { + return PSA_ERROR_INVALID_ARGUMENT; + } + } + + (void) key_buffer; + (void) key_buffer_size; + (void) hash; + (void) hash_length; + (void) signature; + (void) signature_length; + + return PSA_ERROR_NOT_SUPPORTED; +} + +psa_status_t psa_verify_hash(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *hash_external, + size_t hash_length, + const uint8_t *signature_external, + size_t signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + LOCAL_INPUT_DECLARE(hash_external, hash); + LOCAL_INPUT_DECLARE(signature_external, signature); + + LOCAL_INPUT_ALLOC(hash_external, hash_length, hash); + LOCAL_INPUT_ALLOC(signature_external, signature_length, signature); + status = psa_verify_internal(key, 0, alg, hash, hash_length, signature, + signature_length); + +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + LOCAL_INPUT_FREE(hash_external, hash); + LOCAL_INPUT_FREE(signature_external, signature); + + return status; +} + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) +static void psa_rsa_oaep_set_padding_mode(psa_algorithm_t alg, + mbedtls_rsa_context *rsa) +{ + psa_algorithm_t hash_alg = PSA_ALG_RSA_OAEP_GET_HASH(alg); + const mbedtls_md_info_t *md_info = mbedtls_md_info_from_psa(hash_alg); + mbedtls_md_type_t md_alg = mbedtls_md_get_type(md_info); + mbedtls_rsa_set_padding(rsa, MBEDTLS_RSA_PKCS_V21, md_alg); +} +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) */ + +psa_status_t psa_asymmetric_encrypt(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input_external, + size_t input_length, + const uint8_t *salt_external, + size_t salt_length, + uint8_t *output_external, + size_t output_size, + size_t *output_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_slot_t *slot; + LOCAL_INPUT_DECLARE(input_external, input); + LOCAL_INPUT_DECLARE(salt_external, salt); + LOCAL_OUTPUT_DECLARE(output_external, output); + + (void) input; + (void) input_length; + (void) salt; + (void) output; + (void) output_size; + + *output_length = 0; + + if (!PSA_ALG_IS_RSA_OAEP(alg) && salt_length != 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + status = psa_get_and_lock_transparent_key_slot_with_policy( + key, &slot, PSA_KEY_USAGE_ENCRYPT, alg); + if (status != PSA_SUCCESS) { + return status; + } + if (!(PSA_KEY_TYPE_IS_PUBLIC_KEY(slot->attr.type) || + PSA_KEY_TYPE_IS_KEY_PAIR(slot->attr.type))) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + if (PSA_KEY_TYPE_IS_RSA(slot->attr.type)) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) + mbedtls_rsa_context *rsa = NULL; + status = mbedtls_psa_rsa_load_representation(slot->attr.type, + slot->key.data, + slot->key.bytes, + &rsa); + if (status != PSA_SUCCESS) { + goto rsa_exit; + } + + if (output_size < mbedtls_rsa_get_len(rsa)) { + status = PSA_ERROR_BUFFER_TOO_SMALL; + goto rsa_exit; + } +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) */ + LOCAL_INPUT_ALLOC(input_external, input_length, input); + LOCAL_INPUT_ALLOC(salt_external, salt_length, salt); + LOCAL_OUTPUT_ALLOC(output_external, output_size, output); + if (alg == PSA_ALG_RSA_PKCS1V15_CRYPT) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT) + status = mbedtls_to_psa_error( + mbedtls_rsa_pkcs1_encrypt(rsa, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE, + MBEDTLS_RSA_PUBLIC, + input_length, + input, + output)); +#else + status = PSA_ERROR_NOT_SUPPORTED; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT */ + } else + if (PSA_ALG_IS_RSA_OAEP(alg)) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) + psa_rsa_oaep_set_padding_mode(alg, rsa); + status = mbedtls_to_psa_error( + mbedtls_rsa_rsaes_oaep_encrypt(rsa, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE, + MBEDTLS_RSA_PUBLIC, + salt, salt_length, + input_length, + input, + output)); +#else + status = PSA_ERROR_NOT_SUPPORTED; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP */ + } else { + status = PSA_ERROR_INVALID_ARGUMENT; + } +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) +rsa_exit: + if (status == PSA_SUCCESS) { + *output_length = mbedtls_rsa_get_len(rsa); + } + + mbedtls_rsa_free(rsa); + mbedtls_free(rsa); +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) */ + } else { + status = PSA_ERROR_NOT_SUPPORTED; + } + +exit: + unlock_status = psa_unlock_key_slot(slot); + + LOCAL_INPUT_FREE(input_external, input); + LOCAL_INPUT_FREE(salt_external, salt); + LOCAL_OUTPUT_FREE(output_external, output); + + return (status == PSA_SUCCESS) ? unlock_status : status; +} + +psa_status_t psa_asymmetric_decrypt(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input_external, + size_t input_length, + const uint8_t *salt_external, + size_t salt_length, + uint8_t *output_external, + size_t output_size, + size_t *output_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_slot_t *slot; + LOCAL_INPUT_DECLARE(input_external, input); + LOCAL_INPUT_DECLARE(salt_external, salt); + LOCAL_OUTPUT_DECLARE(output_external, output); + + (void) input; + (void) input_length; + (void) salt; + (void) output; + (void) output_size; + + *output_length = 0; + + if (!PSA_ALG_IS_RSA_OAEP(alg) && salt_length != 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + status = psa_get_and_lock_transparent_key_slot_with_policy( + key, &slot, PSA_KEY_USAGE_DECRYPT, alg); + if (status != PSA_SUCCESS) { + return status; + } + if (!PSA_KEY_TYPE_IS_KEY_PAIR(slot->attr.type)) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + if (slot->attr.type == PSA_KEY_TYPE_RSA_KEY_PAIR) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) + mbedtls_rsa_context *rsa = NULL; + status = mbedtls_psa_rsa_load_representation(slot->attr.type, + slot->key.data, + slot->key.bytes, + &rsa); + if (status != PSA_SUCCESS) { + goto exit; + } + + if (input_length != mbedtls_rsa_get_len(rsa)) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto rsa_exit; + } +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) */ + LOCAL_INPUT_ALLOC(input_external, input_length, input); + LOCAL_INPUT_ALLOC(salt_external, salt_length, salt); + LOCAL_OUTPUT_ALLOC(output_external, output_size, output); + if (alg == PSA_ALG_RSA_PKCS1V15_CRYPT) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT) + status = mbedtls_to_psa_error( + mbedtls_rsa_pkcs1_decrypt(rsa, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE, + MBEDTLS_RSA_PRIVATE, + output_length, + input, + output, + output_size)); +#else + status = PSA_ERROR_NOT_SUPPORTED; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT */ + } else + if (PSA_ALG_IS_RSA_OAEP(alg)) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) + psa_rsa_oaep_set_padding_mode(alg, rsa); + status = mbedtls_to_psa_error( + mbedtls_rsa_rsaes_oaep_decrypt(rsa, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE, + MBEDTLS_RSA_PRIVATE, + salt, salt_length, + output_length, + input, + output, + output_size)); +#else + status = PSA_ERROR_NOT_SUPPORTED; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP */ + } else { + status = PSA_ERROR_INVALID_ARGUMENT; + } + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) +rsa_exit: + mbedtls_rsa_free(rsa); + mbedtls_free(rsa); +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) */ + } else { + status = PSA_ERROR_NOT_SUPPORTED; + } + +exit: + unlock_status = psa_unlock_key_slot(slot); + + LOCAL_INPUT_FREE(input_external, input); + LOCAL_INPUT_FREE(salt_external, salt); + LOCAL_OUTPUT_FREE(output_external, output); + + return (status == PSA_SUCCESS) ? unlock_status : status; +} + +static psa_status_t psa_generate_random_internal(uint8_t *output, + size_t output_size) +{ + GUARD_MODULE_INITIALIZED; + + psa_status_t status; + +#if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) + + size_t output_length = 0; + status = mbedtls_psa_external_get_random(&global_data.rng, + output, output_size, + &output_length); + if (status != PSA_SUCCESS) { + goto exit; + } + /* Breaking up a request into smaller chunks is currently not supported + * for the external RNG interface. */ + if (output_length != output_size) { + status = PSA_ERROR_INSUFFICIENT_ENTROPY; + goto exit; + } + status = PSA_SUCCESS; + +#else /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ + + while (output_size > 0) { + size_t request_size = + (output_size > MBEDTLS_PSA_RANDOM_MAX_REQUEST ? + MBEDTLS_PSA_RANDOM_MAX_REQUEST : + output_size); + int ret = mbedtls_psa_get_random(MBEDTLS_PSA_RANDOM_STATE, + output, request_size); + if (ret != 0) { + status = mbedtls_to_psa_error(ret); + goto exit; + } + output_size -= request_size; + output += request_size; + } + status = PSA_SUCCESS; +#endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ + +exit: + return status; +} + + +/****************************************************************/ +/* Symmetric cryptography */ +/****************************************************************/ + +static psa_status_t psa_cipher_setup(psa_cipher_operation_t *operation, + mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + mbedtls_operation_t cipher_operation) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_attributes_t attributes; + psa_key_slot_t *slot = NULL; + psa_key_usage_t usage = (cipher_operation == MBEDTLS_ENCRYPT ? + PSA_KEY_USAGE_ENCRYPT : + PSA_KEY_USAGE_DECRYPT); + + /* A context must be freshly initialized before it can be set up. */ + if (operation->id != 0) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + if (!PSA_ALG_IS_CIPHER(alg)) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + status = psa_get_and_lock_key_slot_with_policy(key, &slot, usage, alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + /* Initialize the operation struct members, except for id. The id member + * is used to indicate to psa_cipher_abort that there are resources to free, + * so we only set it (in the driver wrapper) after resources have been + * allocated/initialized. */ + operation->iv_set = 0; + if (alg == PSA_ALG_ECB_NO_PADDING) { + operation->iv_required = 0; + } else if (slot->attr.type == PSA_KEY_TYPE_ARC4) { + operation->iv_required = 0; + } else { + operation->iv_required = 1; + } + operation->default_iv_length = PSA_CIPHER_IV_LENGTH(slot->attr.type, alg); + + attributes = (psa_key_attributes_t) { + .core = slot->attr + }; + + /* Try doing the operation through a driver before using software fallback. */ + if (cipher_operation == MBEDTLS_ENCRYPT) { + status = psa_driver_wrapper_cipher_encrypt_setup(operation, + &attributes, + slot->key.data, + slot->key.bytes, + alg); + } else { + status = psa_driver_wrapper_cipher_decrypt_setup(operation, + &attributes, + slot->key.data, + slot->key.bytes, + alg); + } + +exit: + if (status != PSA_SUCCESS) { + psa_cipher_abort(operation); + } + + unlock_status = psa_unlock_key_slot(slot); + + return (status == PSA_SUCCESS) ? unlock_status : status; +} + +psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation, + mbedtls_svc_key_id_t key, + psa_algorithm_t alg) +{ + return psa_cipher_setup(operation, key, alg, MBEDTLS_ENCRYPT); +} + +psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation, + mbedtls_svc_key_id_t key, + psa_algorithm_t alg) +{ + return psa_cipher_setup(operation, key, alg, MBEDTLS_DECRYPT); +} + +psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation, + uint8_t *iv_external, + size_t iv_size, + size_t *iv_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + size_t default_iv_length = 0; + + LOCAL_OUTPUT_DECLARE(iv_external, iv); + + if (operation->id == 0) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + if (operation->iv_set || !operation->iv_required) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + default_iv_length = operation->default_iv_length; + if (iv_size < default_iv_length) { + status = PSA_ERROR_BUFFER_TOO_SMALL; + goto exit; + } + + if (default_iv_length > PSA_CIPHER_IV_MAX_SIZE) { + status = PSA_ERROR_GENERIC_ERROR; + goto exit; + } + + LOCAL_OUTPUT_ALLOC(iv_external, default_iv_length, iv); + + status = psa_generate_random_internal(iv, default_iv_length); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_driver_wrapper_cipher_set_iv(operation, + iv, default_iv_length); + +exit: + if (status == PSA_SUCCESS) { + *iv_length = default_iv_length; + operation->iv_set = 1; + } else { + *iv_length = 0; + psa_cipher_abort(operation); + if (iv != NULL) { + mbedtls_platform_zeroize(iv, default_iv_length); + } + } + + LOCAL_OUTPUT_FREE(iv_external, iv); + return status; +} + +psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation, + const uint8_t *iv_external, + size_t iv_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + LOCAL_INPUT_DECLARE(iv_external, iv); + + if (operation->id == 0) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + if (operation->iv_set || !operation->iv_required) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + if (iv_length > PSA_CIPHER_IV_MAX_SIZE) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + LOCAL_INPUT_ALLOC(iv_external, iv_length, iv); + + status = psa_driver_wrapper_cipher_set_iv(operation, + iv, + iv_length); + +exit: + if (status == PSA_SUCCESS) { + operation->iv_set = 1; + } else { + psa_cipher_abort(operation); + } + + LOCAL_INPUT_FREE(iv_external, iv); + + return status; +} + +psa_status_t psa_cipher_update(psa_cipher_operation_t *operation, + const uint8_t *input_external, + size_t input_length, + uint8_t *output_external, + size_t output_size, + size_t *output_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + LOCAL_INPUT_DECLARE(input_external, input); + LOCAL_OUTPUT_DECLARE(output_external, output); + + if (operation->id == 0) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + if (operation->iv_required && !operation->iv_set) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + LOCAL_INPUT_ALLOC(input_external, input_length, input); + LOCAL_OUTPUT_ALLOC(output_external, output_size, output); + + status = psa_driver_wrapper_cipher_update(operation, + input, + input_length, + output, + output_size, + output_length); + +exit: + if (status != PSA_SUCCESS) { + psa_cipher_abort(operation); + } + + LOCAL_INPUT_FREE(input_external, input); + LOCAL_OUTPUT_FREE(output_external, output); + + return status; +} + +psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation, + uint8_t *output_external, + size_t output_size, + size_t *output_length) +{ + psa_status_t status = PSA_ERROR_GENERIC_ERROR; + + LOCAL_OUTPUT_DECLARE(output_external, output); + + if (operation->id == 0) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + if (operation->iv_required && !operation->iv_set) { + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + LOCAL_OUTPUT_ALLOC(output_external, output_size, output); + + status = psa_driver_wrapper_cipher_finish(operation, + output, + output_size, + output_length); + +exit: + if (status == PSA_SUCCESS) { + status = psa_cipher_abort(operation); + } else { + *output_length = 0; + (void) psa_cipher_abort(operation); + } + + LOCAL_OUTPUT_FREE(output_external, output); + + return status; +} + +psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation) +{ + if (operation->id == 0) { + /* The object has (apparently) been initialized but it is not (yet) + * in use. It's ok to call abort on such an object, and there's + * nothing to do. */ + return PSA_SUCCESS; + } + + psa_driver_wrapper_cipher_abort(operation); + + operation->id = 0; + operation->iv_set = 0; + operation->iv_required = 0; + + return PSA_SUCCESS; +} + +psa_status_t psa_cipher_encrypt(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input_external, + size_t input_length, + uint8_t *output_external, + size_t output_size, + size_t *output_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_attributes_t attributes; + psa_key_slot_t *slot = NULL; + uint8_t local_iv[PSA_CIPHER_IV_MAX_SIZE]; + size_t default_iv_length = 0; + + LOCAL_INPUT_DECLARE(input_external, input); + LOCAL_OUTPUT_DECLARE(output_external, output); + + if (!PSA_ALG_IS_CIPHER(alg)) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + status = psa_get_and_lock_key_slot_with_policy(key, &slot, + PSA_KEY_USAGE_ENCRYPT, + alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + attributes = (psa_key_attributes_t) { + .core = slot->attr + }; + + default_iv_length = PSA_CIPHER_IV_LENGTH(slot->attr.type, alg); + if (default_iv_length > PSA_CIPHER_IV_MAX_SIZE) { + status = PSA_ERROR_GENERIC_ERROR; + goto exit; + } + + if (default_iv_length > 0) { + if (output_size < default_iv_length) { + status = PSA_ERROR_BUFFER_TOO_SMALL; + goto exit; + } + + status = psa_generate_random_internal(local_iv, default_iv_length); + if (status != PSA_SUCCESS) { + goto exit; + } + } + + LOCAL_INPUT_ALLOC(input_external, input_length, input); + LOCAL_OUTPUT_ALLOC(output_external, output_size, output); + + status = psa_driver_wrapper_cipher_encrypt( + &attributes, slot->key.data, slot->key.bytes, + alg, local_iv, default_iv_length, input, input_length, + mbedtls_buffer_offset(output, default_iv_length), + output_size - default_iv_length, output_length); + +exit: + unlock_status = psa_unlock_key_slot(slot); + if (status == PSA_SUCCESS) { + status = unlock_status; + } + + if (status == PSA_SUCCESS) { + if (default_iv_length > 0) { + memcpy(output, local_iv, default_iv_length); + } + *output_length += default_iv_length; + } else { + *output_length = 0; + } + + LOCAL_INPUT_FREE(input_external, input); + LOCAL_OUTPUT_FREE(output_external, output); + + return status; +} + +psa_status_t psa_cipher_decrypt(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *input_external, + size_t input_length, + uint8_t *output_external, + size_t output_size, + size_t *output_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_attributes_t attributes; + psa_key_slot_t *slot = NULL; + + LOCAL_INPUT_DECLARE(input_external, input); + LOCAL_OUTPUT_DECLARE(output_external, output); + + if (!PSA_ALG_IS_CIPHER(alg)) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + status = psa_get_and_lock_key_slot_with_policy(key, &slot, + PSA_KEY_USAGE_DECRYPT, + alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + attributes = (psa_key_attributes_t) { + .core = slot->attr + }; + + if (input_length < PSA_CIPHER_IV_LENGTH(slot->attr.type, alg)) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + LOCAL_INPUT_ALLOC(input_external, input_length, input); + LOCAL_OUTPUT_ALLOC(output_external, output_size, output); + + status = psa_driver_wrapper_cipher_decrypt( + &attributes, slot->key.data, slot->key.bytes, + alg, input, input_length, + output, output_size, output_length); + +exit: + unlock_status = psa_unlock_key_slot(slot); + if (status == PSA_SUCCESS) { + status = unlock_status; + } + + if (status != PSA_SUCCESS) { + *output_length = 0; + } + + LOCAL_INPUT_FREE(input_external, input); + LOCAL_OUTPUT_FREE(output_external, output); + + return status; +} + + +/****************************************************************/ +/* AEAD */ +/****************************************************************/ + +psa_status_t psa_aead_encrypt(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *nonce_external, + size_t nonce_length, + const uint8_t *additional_data_external, + size_t additional_data_length, + const uint8_t *plaintext_external, + size_t plaintext_length, + uint8_t *ciphertext_external, + size_t ciphertext_size, + size_t *ciphertext_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_slot_t *slot; + + LOCAL_INPUT_DECLARE(nonce_external, nonce); + LOCAL_INPUT_DECLARE(additional_data_external, additional_data); + LOCAL_INPUT_DECLARE(plaintext_external, plaintext); + LOCAL_OUTPUT_DECLARE(ciphertext_external, ciphertext); + + *ciphertext_length = 0; + + if (!PSA_ALG_IS_AEAD(alg) || PSA_ALG_IS_WILDCARD(alg)) { + return PSA_ERROR_NOT_SUPPORTED; + } + + status = psa_get_and_lock_key_slot_with_policy( + key, &slot, PSA_KEY_USAGE_ENCRYPT, alg); + if (status != PSA_SUCCESS) { + return status; + } + + psa_key_attributes_t attributes = { + .core = slot->attr + }; + + LOCAL_INPUT_ALLOC(nonce_external, nonce_length, nonce); + LOCAL_INPUT_ALLOC(additional_data_external, additional_data_length, additional_data); + LOCAL_INPUT_ALLOC(plaintext_external, plaintext_length, plaintext); + LOCAL_OUTPUT_ALLOC(ciphertext_external, ciphertext_size, ciphertext); + + status = psa_driver_wrapper_aead_encrypt( + &attributes, slot->key.data, slot->key.bytes, + alg, + nonce, nonce_length, + additional_data, additional_data_length, + plaintext, plaintext_length, + ciphertext, ciphertext_size, ciphertext_length); + + if (status != PSA_SUCCESS && ciphertext_size != 0) { + memset(ciphertext, 0, ciphertext_size); + } + +/* Exit label is only used for buffer copying, prevent unused warnings. */ +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + LOCAL_INPUT_FREE(nonce_external, nonce); + LOCAL_INPUT_FREE(additional_data_external, additional_data); + LOCAL_INPUT_FREE(plaintext_external, plaintext); + LOCAL_OUTPUT_FREE(ciphertext_external, ciphertext); + + psa_unlock_key_slot(slot); + + return status; +} + +psa_status_t psa_aead_decrypt(mbedtls_svc_key_id_t key, + psa_algorithm_t alg, + const uint8_t *nonce_external, + size_t nonce_length, + const uint8_t *additional_data_external, + size_t additional_data_length, + const uint8_t *ciphertext_external, + size_t ciphertext_length, + uint8_t *plaintext_external, + size_t plaintext_size, + size_t *plaintext_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_slot_t *slot; + + LOCAL_INPUT_DECLARE(nonce_external, nonce); + LOCAL_INPUT_DECLARE(additional_data_external, additional_data); + LOCAL_INPUT_DECLARE(ciphertext_external, ciphertext); + LOCAL_OUTPUT_DECLARE(plaintext_external, plaintext); + + *plaintext_length = 0; + + if (!PSA_ALG_IS_AEAD(alg) || PSA_ALG_IS_WILDCARD(alg)) { + return PSA_ERROR_NOT_SUPPORTED; + } + + status = psa_get_and_lock_key_slot_with_policy( + key, &slot, PSA_KEY_USAGE_DECRYPT, alg); + if (status != PSA_SUCCESS) { + return status; + } + + psa_key_attributes_t attributes = { + .core = slot->attr + }; + + LOCAL_INPUT_ALLOC(nonce_external, nonce_length, nonce); + LOCAL_INPUT_ALLOC(additional_data_external, additional_data_length, + additional_data); + LOCAL_INPUT_ALLOC(ciphertext_external, ciphertext_length, ciphertext); + LOCAL_OUTPUT_ALLOC(plaintext_external, plaintext_size, plaintext); + + status = psa_driver_wrapper_aead_decrypt( + &attributes, slot->key.data, slot->key.bytes, + alg, + nonce, nonce_length, + additional_data, additional_data_length, + ciphertext, ciphertext_length, + plaintext, plaintext_size, plaintext_length); + + if (status != PSA_SUCCESS && plaintext_size != 0) { + memset(plaintext, 0, plaintext_size); + } + +/* Exit label is only used for buffer copying, prevent unused warnings. */ +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + LOCAL_INPUT_FREE(nonce_external, nonce); + LOCAL_INPUT_FREE(additional_data_external, additional_data); + LOCAL_INPUT_FREE(ciphertext_external, ciphertext); + LOCAL_OUTPUT_FREE(plaintext_external, plaintext); + + psa_unlock_key_slot(slot); + + return status; +} + +/****************************************************************/ +/* Generators */ +/****************************************************************/ + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) +#define AT_LEAST_ONE_BUILTIN_KDF +#endif /* At least one builtin KDF */ + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) +static psa_status_t psa_key_derivation_start_hmac( + psa_mac_operation_t *operation, + psa_algorithm_t hash_alg, + const uint8_t *hmac_key, + size_t hmac_key_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + psa_set_key_type(&attributes, PSA_KEY_TYPE_HMAC); + psa_set_key_bits(&attributes, PSA_BYTES_TO_BITS(hmac_key_length)); + psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH); + + operation->is_sign = 1; + operation->mac_size = PSA_HASH_LENGTH(hash_alg); + + status = psa_driver_wrapper_mac_sign_setup(operation, + &attributes, + hmac_key, hmac_key_length, + PSA_ALG_HMAC(hash_alg)); + + psa_reset_key_attributes(&attributes); + return status; +} +#endif /* KDF algorithms reliant on HMAC */ + +#define HKDF_STATE_INIT 0 /* no input yet */ +#define HKDF_STATE_STARTED 1 /* got salt */ +#define HKDF_STATE_KEYED 2 /* got key */ +#define HKDF_STATE_OUTPUT 3 /* output started */ + +static psa_algorithm_t psa_key_derivation_get_kdf_alg( + const psa_key_derivation_operation_t *operation) +{ + if (PSA_ALG_IS_KEY_AGREEMENT(operation->alg)) { + return PSA_ALG_KEY_AGREEMENT_GET_KDF(operation->alg); + } else { + return operation->alg; + } +} + +psa_status_t psa_key_derivation_abort(psa_key_derivation_operation_t *operation) +{ + psa_status_t status = PSA_SUCCESS; + psa_algorithm_t kdf_alg = psa_key_derivation_get_kdf_alg(operation); + if (kdf_alg == 0) { + /* The object has (apparently) been initialized but it is not + * in use. It's ok to call abort on such an object, and there's + * nothing to do. */ + } else +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF) + if (PSA_ALG_IS_HKDF(kdf_alg)) { + mbedtls_free(operation->ctx.hkdf.info); + status = psa_mac_abort(&operation->ctx.hkdf.hmac); + } else +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) + if (PSA_ALG_IS_TLS12_PRF(kdf_alg) || + /* TLS-1.2 PSK-to-MS KDF uses the same core as TLS-1.2 PRF */ + PSA_ALG_IS_TLS12_PSK_TO_MS(kdf_alg)) { + if (operation->ctx.tls12_prf.secret != NULL) { + mbedtls_platform_zeroize(operation->ctx.tls12_prf.secret, + operation->ctx.tls12_prf.secret_length); + mbedtls_free(operation->ctx.tls12_prf.secret); + } + + if (operation->ctx.tls12_prf.seed != NULL) { + mbedtls_platform_zeroize(operation->ctx.tls12_prf.seed, + operation->ctx.tls12_prf.seed_length); + mbedtls_free(operation->ctx.tls12_prf.seed); + } + + if (operation->ctx.tls12_prf.label != NULL) { + mbedtls_platform_zeroize(operation->ctx.tls12_prf.label, + operation->ctx.tls12_prf.label_length); + mbedtls_free(operation->ctx.tls12_prf.label); + } + + status = PSA_SUCCESS; + + /* We leave the fields Ai and output_block to be erased safely by the + * mbedtls_platform_zeroize() in the end of this function. */ + } else +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) */ + { + status = PSA_ERROR_BAD_STATE; + } + mbedtls_platform_zeroize(operation, sizeof(*operation)); + return status; +} + +psa_status_t psa_key_derivation_get_capacity(const psa_key_derivation_operation_t *operation, + size_t *capacity) +{ + if (operation->alg == 0) { + /* This is a blank key derivation operation. */ + return PSA_ERROR_BAD_STATE; + } + + *capacity = operation->capacity; + return PSA_SUCCESS; +} + +psa_status_t psa_key_derivation_set_capacity(psa_key_derivation_operation_t *operation, + size_t capacity) +{ + if (operation->alg == 0) { + return PSA_ERROR_BAD_STATE; + } + if (capacity > operation->capacity) { + return PSA_ERROR_INVALID_ARGUMENT; + } + operation->capacity = capacity; + return PSA_SUCCESS; +} + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF) +/* Read some bytes from an HKDF-based operation. This performs a chunk + * of the expand phase of the HKDF algorithm. */ +static psa_status_t psa_key_derivation_hkdf_read(psa_hkdf_key_derivation_t *hkdf, + psa_algorithm_t hash_alg, + uint8_t *output, + size_t output_length) +{ + uint8_t hash_length = PSA_HASH_LENGTH(hash_alg); + size_t hmac_output_length; + psa_status_t status; + + if (hkdf->state < HKDF_STATE_KEYED || !hkdf->info_set) { + return PSA_ERROR_BAD_STATE; + } + hkdf->state = HKDF_STATE_OUTPUT; + + while (output_length != 0) { + /* Copy what remains of the current block */ + uint8_t n = hash_length - hkdf->offset_in_block; + if (n > output_length) { + n = (uint8_t) output_length; + } + memcpy(output, hkdf->output_block + hkdf->offset_in_block, n); + output += n; + output_length -= n; + hkdf->offset_in_block += n; + if (output_length == 0) { + break; + } + /* We can't be wanting more output after block 0xff, otherwise + * the capacity check in psa_key_derivation_output_bytes() would have + * prevented this call. It could happen only if the operation + * object was corrupted or if this function is called directly + * inside the library. */ + if (hkdf->block_number == 0xff) { + return PSA_ERROR_BAD_STATE; + } + + /* We need a new block */ + ++hkdf->block_number; + hkdf->offset_in_block = 0; + + status = psa_key_derivation_start_hmac(&hkdf->hmac, + hash_alg, + hkdf->prk, + hash_length); + if (status != PSA_SUCCESS) { + return status; + } + + if (hkdf->block_number != 1) { + status = psa_mac_update(&hkdf->hmac, + hkdf->output_block, + hash_length); + if (status != PSA_SUCCESS) { + return status; + } + } + status = psa_mac_update(&hkdf->hmac, + hkdf->info, + hkdf->info_length); + if (status != PSA_SUCCESS) { + return status; + } + status = psa_mac_update(&hkdf->hmac, + &hkdf->block_number, 1); + if (status != PSA_SUCCESS) { + return status; + } + status = psa_mac_sign_finish(&hkdf->hmac, + hkdf->output_block, + sizeof(hkdf->output_block), + &hmac_output_length); + if (status != PSA_SUCCESS) { + return status; + } + } + + return PSA_SUCCESS; +} +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF */ + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) +static psa_status_t psa_key_derivation_tls12_prf_generate_next_block( + psa_tls12_prf_key_derivation_t *tls12_prf, + psa_algorithm_t alg) +{ + psa_algorithm_t hash_alg = PSA_ALG_HKDF_GET_HASH(alg); + uint8_t hash_length = PSA_HASH_LENGTH(hash_alg); + psa_mac_operation_t hmac = PSA_MAC_OPERATION_INIT; + size_t hmac_output_length; + psa_status_t status, cleanup_status; + + /* We can't be wanting more output after block 0xff, otherwise + * the capacity check in psa_key_derivation_output_bytes() would have + * prevented this call. It could happen only if the operation + * object was corrupted or if this function is called directly + * inside the library. */ + if (tls12_prf->block_number == 0xff) { + return PSA_ERROR_CORRUPTION_DETECTED; + } + + /* We need a new block */ + ++tls12_prf->block_number; + tls12_prf->left_in_block = hash_length; + + /* Recall the definition of the TLS-1.2-PRF from RFC 5246: + * + * PRF(secret, label, seed) = P_(secret, label + seed) + * + * P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) + + * HMAC_hash(secret, A(2) + seed) + + * HMAC_hash(secret, A(3) + seed) + ... + * + * A(0) = seed + * A(i) = HMAC_hash(secret, A(i-1)) + * + * The `psa_tls12_prf_key_derivation` structure saves the block + * `HMAC_hash(secret, A(i) + seed)` from which the output + * is currently extracted as `output_block` and where i is + * `block_number`. + */ + + status = psa_key_derivation_start_hmac(&hmac, + hash_alg, + tls12_prf->secret, + tls12_prf->secret_length); + if (status != PSA_SUCCESS) { + goto cleanup; + } + + /* Calculate A(i) where i = tls12_prf->block_number. */ + if (tls12_prf->block_number == 1) { + /* A(1) = HMAC_hash(secret, A(0)), where A(0) = seed. (The RFC overloads + * the variable seed and in this instance means it in the context of the + * P_hash function, where seed = label + seed.) */ + status = psa_mac_update(&hmac, + tls12_prf->label, + tls12_prf->label_length); + if (status != PSA_SUCCESS) { + goto cleanup; + } + status = psa_mac_update(&hmac, + tls12_prf->seed, + tls12_prf->seed_length); + if (status != PSA_SUCCESS) { + goto cleanup; + } + } else { + /* A(i) = HMAC_hash(secret, A(i-1)) */ + status = psa_mac_update(&hmac, tls12_prf->Ai, hash_length); + if (status != PSA_SUCCESS) { + goto cleanup; + } + } + + status = psa_mac_sign_finish(&hmac, + tls12_prf->Ai, hash_length, + &hmac_output_length); + if (hmac_output_length != hash_length) { + status = PSA_ERROR_CORRUPTION_DETECTED; + } + if (status != PSA_SUCCESS) { + goto cleanup; + } + + /* Calculate HMAC_hash(secret, A(i) + label + seed). */ + status = psa_key_derivation_start_hmac(&hmac, + hash_alg, + tls12_prf->secret, + tls12_prf->secret_length); + if (status != PSA_SUCCESS) { + goto cleanup; + } + status = psa_mac_update(&hmac, tls12_prf->Ai, hash_length); + if (status != PSA_SUCCESS) { + goto cleanup; + } + status = psa_mac_update(&hmac, tls12_prf->label, tls12_prf->label_length); + if (status != PSA_SUCCESS) { + goto cleanup; + } + status = psa_mac_update(&hmac, tls12_prf->seed, tls12_prf->seed_length); + if (status != PSA_SUCCESS) { + goto cleanup; + } + status = psa_mac_sign_finish(&hmac, + tls12_prf->output_block, hash_length, + &hmac_output_length); + if (status != PSA_SUCCESS) { + goto cleanup; + } + + +cleanup: + cleanup_status = psa_mac_abort(&hmac); + if (status == PSA_SUCCESS && cleanup_status != PSA_SUCCESS) { + status = cleanup_status; + } + + return status; +} + +static psa_status_t psa_key_derivation_tls12_prf_read( + psa_tls12_prf_key_derivation_t *tls12_prf, + psa_algorithm_t alg, + uint8_t *output, + size_t output_length) +{ + psa_algorithm_t hash_alg = PSA_ALG_TLS12_PRF_GET_HASH(alg); + uint8_t hash_length = PSA_HASH_LENGTH(hash_alg); + psa_status_t status; + uint8_t offset, length; + + switch (tls12_prf->state) { + case PSA_TLS12_PRF_STATE_LABEL_SET: + tls12_prf->state = PSA_TLS12_PRF_STATE_OUTPUT; + break; + case PSA_TLS12_PRF_STATE_OUTPUT: + break; + default: + return PSA_ERROR_BAD_STATE; + } + + while (output_length != 0) { + /* Check if we have fully processed the current block. */ + if (tls12_prf->left_in_block == 0) { + status = psa_key_derivation_tls12_prf_generate_next_block(tls12_prf, + alg); + if (status != PSA_SUCCESS) { + return status; + } + + continue; + } + + if (tls12_prf->left_in_block > output_length) { + length = (uint8_t) output_length; + } else { + length = tls12_prf->left_in_block; + } + + offset = hash_length - tls12_prf->left_in_block; + memcpy(output, tls12_prf->output_block + offset, length); + output += length; + output_length -= length; + tls12_prf->left_in_block -= length; + } + + return PSA_SUCCESS; +} +#endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF || + * MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS */ + +psa_status_t psa_key_derivation_output_bytes( + psa_key_derivation_operation_t *operation, + uint8_t *output_external, + size_t output_length) +{ + psa_status_t status; + LOCAL_OUTPUT_DECLARE(output_external, output); + + psa_algorithm_t kdf_alg = psa_key_derivation_get_kdf_alg(operation); + + if (operation->alg == 0) { + /* This is a blank operation. */ + return PSA_ERROR_BAD_STATE; + } + + if (output_length == 0 && operation->capacity == 0) { + /* Edge case: this is a finished operation, and 0 bytes + * were requested. The right error in this case could + * be either INSUFFICIENT_CAPACITY or BAD_STATE. Return + * INSUFFICIENT_CAPACITY, which is right for a finished + * operation, for consistency with the case when + * output_length > 0. */ + return PSA_ERROR_INSUFFICIENT_DATA; + } + + LOCAL_OUTPUT_ALLOC(output_external, output_length, output); + if (output_length > operation->capacity) { + operation->capacity = 0; + /* Go through the error path to wipe all confidential data now + * that the operation object is useless. */ + status = PSA_ERROR_INSUFFICIENT_DATA; + goto exit; + } + operation->capacity -= output_length; + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF) + if (PSA_ALG_IS_HKDF(kdf_alg)) { + psa_algorithm_t hash_alg = PSA_ALG_HKDF_GET_HASH(kdf_alg); + status = psa_key_derivation_hkdf_read(&operation->ctx.hkdf, hash_alg, + output, output_length); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) + if (PSA_ALG_IS_TLS12_PRF(kdf_alg) || + PSA_ALG_IS_TLS12_PSK_TO_MS(kdf_alg)) { + status = psa_key_derivation_tls12_prf_read(&operation->ctx.tls12_prf, + kdf_alg, output, + output_length); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF || + * MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS */ + { + (void) kdf_alg; + status = PSA_ERROR_BAD_STATE; + LOCAL_OUTPUT_FREE(output_external, output); + + return status; + } + +exit: + if (status != PSA_SUCCESS) { + /* Preserve the algorithm upon errors, but clear all sensitive state. + * This allows us to differentiate between exhausted operations and + * blank operations, so we can return PSA_ERROR_BAD_STATE on blank + * operations. */ + psa_algorithm_t alg = operation->alg; + psa_key_derivation_abort(operation); + operation->alg = alg; + if (output != NULL) { + memset(output, '!', output_length); + } + } + + LOCAL_OUTPUT_FREE(output_external, output); + return status; +} + +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES) +static void psa_des_set_key_parity(uint8_t *data, size_t data_size) +{ + if (data_size >= 8) { + mbedtls_des_key_set_parity(data); + } + if (data_size >= 16) { + mbedtls_des_key_set_parity(data + 8); + } + if (data_size >= 24) { + mbedtls_des_key_set_parity(data + 16); + } +} +#endif /* MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES */ + +static psa_status_t psa_generate_derived_key_internal( + psa_key_slot_t *slot, + size_t bits, + psa_key_derivation_operation_t *operation) +{ + uint8_t *data = NULL; + size_t bytes = PSA_BITS_TO_BYTES(bits); + psa_status_t status; + psa_key_attributes_t attributes; + + if (!key_type_is_raw_bytes(slot->attr.type)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + if (bits % 8 != 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + data = mbedtls_calloc(1, bytes); + if (data == NULL) { + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + + status = psa_key_derivation_output_bytes(operation, data, bytes); + if (status != PSA_SUCCESS) { + goto exit; + } +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES) + if (slot->attr.type == PSA_KEY_TYPE_DES) { + psa_des_set_key_parity(data, bytes); + } +#endif /* MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES */ + + status = psa_allocate_buffer_to_slot(slot, bytes); + if (status != PSA_SUCCESS) { + goto exit; + } + + slot->attr.bits = (psa_key_bits_t) bits; + attributes = (psa_key_attributes_t) { + .core = slot->attr + }; + + status = psa_driver_wrapper_import_key(&attributes, + data, bytes, + slot->key.data, + slot->key.bytes, + &slot->key.bytes, &bits); + if (bits != slot->attr.bits) { + status = PSA_ERROR_INVALID_ARGUMENT; + } + +exit: + mbedtls_free(data); + return status; +} + +psa_status_t psa_key_derivation_output_key(const psa_key_attributes_t *attributes, + psa_key_derivation_operation_t *operation, + mbedtls_svc_key_id_t *key) +{ + psa_status_t status; + psa_key_slot_t *slot = NULL; + psa_se_drv_table_entry_t *driver = NULL; + + *key = MBEDTLS_SVC_KEY_ID_INIT; + + /* Reject any attempt to create a zero-length key so that we don't + * risk tripping up later, e.g. on a malloc(0) that returns NULL. */ + if (psa_get_key_bits(attributes) == 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + if (operation->alg == PSA_ALG_NONE) { + return PSA_ERROR_BAD_STATE; + } + + if (!operation->can_output_key) { + return PSA_ERROR_NOT_PERMITTED; + } + + status = psa_start_key_creation(PSA_KEY_CREATION_DERIVE, attributes, + &slot, &driver); +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + if (driver != NULL) { + /* Deriving a key in a secure element is not implemented yet. */ + status = PSA_ERROR_NOT_SUPPORTED; + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + if (status == PSA_SUCCESS) { + status = psa_generate_derived_key_internal(slot, + attributes->core.bits, + operation); + } + if (status == PSA_SUCCESS) { + status = psa_finish_key_creation(slot, driver, key); + } + if (status != PSA_SUCCESS) { + psa_fail_key_creation(slot, driver); + } + + return status; +} + + + +/****************************************************************/ +/* Key derivation */ +/****************************************************************/ + +#if defined(AT_LEAST_ONE_BUILTIN_KDF) +static int is_kdf_alg_supported(psa_algorithm_t kdf_alg) +{ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF) + if (PSA_ALG_IS_HKDF(kdf_alg)) { + return 1; + } +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) + if (PSA_ALG_IS_TLS12_PRF(kdf_alg)) { + return 1; + } +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) + if (PSA_ALG_IS_TLS12_PSK_TO_MS(kdf_alg)) { + return 1; + } +#endif + return 0; +} + +static psa_status_t psa_hash_try_support(psa_algorithm_t alg) +{ + psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT; + psa_status_t status = psa_hash_setup(&operation, alg); + psa_hash_abort(&operation); + return status; +} + +static psa_status_t psa_key_derivation_set_maximum_capacity( + psa_key_derivation_operation_t *operation, + psa_algorithm_t kdf_alg) +{ + psa_algorithm_t hash_alg = PSA_ALG_HKDF_GET_HASH(kdf_alg); + size_t hash_size = PSA_HASH_LENGTH(hash_alg); + if (hash_size == 0) { + return PSA_ERROR_NOT_SUPPORTED; + } + + /* Make sure that hash_alg is a supported hash algorithm. Otherwise + * we might fail later, which is somewhat unfriendly and potentially + * risk-prone. */ + psa_status_t status = psa_hash_try_support(hash_alg); + if (status != PSA_SUCCESS) { + return status; + } + +#if defined(PSA_WANT_ALG_HKDF) + if (PSA_ALG_IS_HKDF(kdf_alg)) { + operation->capacity = 255 * hash_size; + } else +#endif +#if defined(PSA_WANT_ALG_TLS12_PRF) + if (PSA_ALG_IS_TLS12_PRF(kdf_alg) && + (hash_alg == PSA_ALG_SHA_256 || hash_alg == PSA_ALG_SHA_384)) { + operation->capacity = SIZE_MAX; + } else +#endif +#if defined(PSA_WANT_ALG_TLS12_PSK_TO_MS) + if (PSA_ALG_IS_TLS12_PSK_TO_MS(kdf_alg) && + (hash_alg == PSA_ALG_SHA_256 || hash_alg == PSA_ALG_SHA_384)) { + /* Master Secret is always 48 bytes + * https://datatracker.ietf.org/doc/html/rfc5246.html#section-8.1 */ + operation->capacity = 48U; + } else +#endif + { + (void) hash_size; + status = PSA_ERROR_NOT_SUPPORTED; + } + return status; +} + + +static psa_status_t psa_key_derivation_setup_kdf( + psa_key_derivation_operation_t *operation, + psa_algorithm_t kdf_alg) +{ + /* Make sure that operation->ctx is properly zero-initialised. (Macro + * initialisers for this union leave some bytes unspecified.) */ + memset(&operation->ctx, 0, sizeof(operation->ctx)); + /* Make sure that kdf_alg is a supported key derivation algorithm. */ + if (!is_kdf_alg_supported(kdf_alg)) { + return PSA_ERROR_NOT_SUPPORTED; + } + + psa_status_t status = psa_key_derivation_set_maximum_capacity(operation, + kdf_alg); + return status; +} + +static psa_status_t psa_key_agreement_try_support(psa_algorithm_t alg) +{ +#if defined(PSA_WANT_ALG_ECDH) + if (alg == PSA_ALG_ECDH) { + return PSA_SUCCESS; + } +#endif + (void) alg; + return PSA_ERROR_NOT_SUPPORTED; +} +#endif /* AT_LEAST_ONE_BUILTIN_KDF */ + +psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation, + psa_algorithm_t alg) +{ + psa_status_t status; + + if (operation->alg != 0) { + return PSA_ERROR_BAD_STATE; + } + + if (PSA_ALG_IS_RAW_KEY_AGREEMENT(alg)) { + return PSA_ERROR_INVALID_ARGUMENT; + } else if (PSA_ALG_IS_KEY_AGREEMENT(alg)) { +#if defined(AT_LEAST_ONE_BUILTIN_KDF) + psa_algorithm_t kdf_alg = PSA_ALG_KEY_AGREEMENT_GET_KDF(alg); + psa_algorithm_t ka_alg = PSA_ALG_KEY_AGREEMENT_GET_BASE(alg); + status = psa_key_agreement_try_support(ka_alg); + if (status != PSA_SUCCESS) { + return status; + } + status = psa_key_derivation_setup_kdf(operation, kdf_alg); +#else + return PSA_ERROR_NOT_SUPPORTED; +#endif /* AT_LEAST_ONE_BUILTIN_KDF */ + } else if (PSA_ALG_IS_KEY_DERIVATION(alg)) { +#if defined(AT_LEAST_ONE_BUILTIN_KDF) + status = psa_key_derivation_setup_kdf(operation, alg); +#else + return PSA_ERROR_NOT_SUPPORTED; +#endif /* AT_LEAST_ONE_BUILTIN_KDF */ + } else { + return PSA_ERROR_INVALID_ARGUMENT; + } + + if (status == PSA_SUCCESS) { + operation->alg = alg; + } + return status; +} + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF) +static psa_status_t psa_hkdf_input(psa_hkdf_key_derivation_t *hkdf, + psa_algorithm_t hash_alg, + psa_key_derivation_step_t step, + const uint8_t *data, + size_t data_length) +{ + psa_status_t status; + switch (step) { + case PSA_KEY_DERIVATION_INPUT_SALT: + if (hkdf->state != HKDF_STATE_INIT) { + return PSA_ERROR_BAD_STATE; + } else { + status = psa_key_derivation_start_hmac(&hkdf->hmac, + hash_alg, + data, data_length); + if (status != PSA_SUCCESS) { + return status; + } + hkdf->state = HKDF_STATE_STARTED; + return PSA_SUCCESS; + } + case PSA_KEY_DERIVATION_INPUT_SECRET: + /* If no salt was provided, use an empty salt. */ + if (hkdf->state == HKDF_STATE_INIT) { + status = psa_key_derivation_start_hmac(&hkdf->hmac, + hash_alg, + NULL, 0); + if (status != PSA_SUCCESS) { + return status; + } + hkdf->state = HKDF_STATE_STARTED; + } + if (hkdf->state != HKDF_STATE_STARTED) { + return PSA_ERROR_BAD_STATE; + } + status = psa_mac_update(&hkdf->hmac, + data, data_length); + if (status != PSA_SUCCESS) { + return status; + } + status = psa_mac_sign_finish(&hkdf->hmac, + hkdf->prk, + sizeof(hkdf->prk), + &data_length); + if (status != PSA_SUCCESS) { + return status; + } + hkdf->offset_in_block = PSA_HASH_LENGTH(hash_alg); + hkdf->block_number = 0; + hkdf->state = HKDF_STATE_KEYED; + return PSA_SUCCESS; + case PSA_KEY_DERIVATION_INPUT_INFO: + if (hkdf->state == HKDF_STATE_OUTPUT) { + return PSA_ERROR_BAD_STATE; + } + if (hkdf->info_set) { + return PSA_ERROR_BAD_STATE; + } + hkdf->info_length = data_length; + if (data_length != 0) { + hkdf->info = mbedtls_calloc(1, data_length); + if (hkdf->info == NULL) { + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + memcpy(hkdf->info, data, data_length); + } + hkdf->info_set = 1; + return PSA_SUCCESS; + default: + return PSA_ERROR_INVALID_ARGUMENT; + } +} +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF */ + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) +static psa_status_t psa_tls12_prf_set_seed(psa_tls12_prf_key_derivation_t *prf, + const uint8_t *data, + size_t data_length) +{ + if (prf->state != PSA_TLS12_PRF_STATE_INIT) { + return PSA_ERROR_BAD_STATE; + } + + if (data_length != 0) { + prf->seed = mbedtls_calloc(1, data_length); + if (prf->seed == NULL) { + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + + memcpy(prf->seed, data, data_length); + prf->seed_length = data_length; + } + + prf->state = PSA_TLS12_PRF_STATE_SEED_SET; + + return PSA_SUCCESS; +} + +static psa_status_t psa_tls12_prf_set_key(psa_tls12_prf_key_derivation_t *prf, + const uint8_t *data, + size_t data_length) +{ + if (prf->state != PSA_TLS12_PRF_STATE_SEED_SET) { + return PSA_ERROR_BAD_STATE; + } + + if (data_length != 0) { + prf->secret = mbedtls_calloc(1, data_length); + if (prf->secret == NULL) { + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + + memcpy(prf->secret, data, data_length); + prf->secret_length = data_length; + } + + prf->state = PSA_TLS12_PRF_STATE_KEY_SET; + + return PSA_SUCCESS; +} + +static psa_status_t psa_tls12_prf_set_label(psa_tls12_prf_key_derivation_t *prf, + const uint8_t *data, + size_t data_length) +{ + if (prf->state != PSA_TLS12_PRF_STATE_KEY_SET) { + return PSA_ERROR_BAD_STATE; + } + + if (data_length != 0) { + prf->label = mbedtls_calloc(1, data_length); + if (prf->label == NULL) { + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + + memcpy(prf->label, data, data_length); + prf->label_length = data_length; + } + + prf->state = PSA_TLS12_PRF_STATE_LABEL_SET; + + return PSA_SUCCESS; +} + +static psa_status_t psa_tls12_prf_input(psa_tls12_prf_key_derivation_t *prf, + psa_key_derivation_step_t step, + const uint8_t *data, + size_t data_length) +{ + switch (step) { + case PSA_KEY_DERIVATION_INPUT_SEED: + return psa_tls12_prf_set_seed(prf, data, data_length); + case PSA_KEY_DERIVATION_INPUT_SECRET: + return psa_tls12_prf_set_key(prf, data, data_length); + case PSA_KEY_DERIVATION_INPUT_LABEL: + return psa_tls12_prf_set_label(prf, data, data_length); + default: + return PSA_ERROR_INVALID_ARGUMENT; + } +} +#endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) || + * MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS */ + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) +static psa_status_t psa_tls12_prf_psk_to_ms_set_key( + psa_tls12_prf_key_derivation_t *prf, + const uint8_t *data, + size_t data_length) +{ + psa_status_t status; + uint8_t pms[4 + 2 * PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE]; + uint8_t *cur = pms; + + if (data_length > PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + /* Quoting RFC 4279, Section 2: + * + * The premaster secret is formed as follows: if the PSK is N octets + * long, concatenate a uint16 with the value N, N zero octets, a second + * uint16 with the value N, and the PSK itself. + */ + + *cur++ = MBEDTLS_BYTE_1(data_length); + *cur++ = MBEDTLS_BYTE_0(data_length); + memset(cur, 0, data_length); + cur += data_length; + *cur++ = pms[0]; + *cur++ = pms[1]; + memcpy(cur, data, data_length); + cur += data_length; + + status = psa_tls12_prf_set_key(prf, pms, cur - pms); + + mbedtls_platform_zeroize(pms, sizeof(pms)); + return status; +} + +static psa_status_t psa_tls12_prf_psk_to_ms_input( + psa_tls12_prf_key_derivation_t *prf, + psa_key_derivation_step_t step, + const uint8_t *data, + size_t data_length) +{ + if (step == PSA_KEY_DERIVATION_INPUT_SECRET) { + return psa_tls12_prf_psk_to_ms_set_key(prf, + data, data_length); + } + + return psa_tls12_prf_input(prf, step, data, data_length); +} +#endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS */ + +/** Check whether the given key type is acceptable for the given + * input step of a key derivation. + * + * Secret inputs must have the type #PSA_KEY_TYPE_DERIVE. + * Non-secret inputs must have the type #PSA_KEY_TYPE_RAW_DATA. + * Both secret and non-secret inputs can alternatively have the type + * #PSA_KEY_TYPE_NONE, which is never the type of a key object, meaning + * that the input was passed as a buffer rather than via a key object. + */ +static int psa_key_derivation_check_input_type( + psa_key_derivation_step_t step, + psa_key_type_t key_type) +{ + switch (step) { + case PSA_KEY_DERIVATION_INPUT_SECRET: + if (key_type == PSA_KEY_TYPE_DERIVE) { + return PSA_SUCCESS; + } + if (key_type == PSA_KEY_TYPE_NONE) { + return PSA_SUCCESS; + } + break; + case PSA_KEY_DERIVATION_INPUT_LABEL: + case PSA_KEY_DERIVATION_INPUT_SALT: + case PSA_KEY_DERIVATION_INPUT_INFO: + case PSA_KEY_DERIVATION_INPUT_SEED: + if (key_type == PSA_KEY_TYPE_RAW_DATA) { + return PSA_SUCCESS; + } + if (key_type == PSA_KEY_TYPE_NONE) { + return PSA_SUCCESS; + } + break; + } + return PSA_ERROR_INVALID_ARGUMENT; +} + +static psa_status_t psa_key_derivation_input_internal( + psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + psa_key_type_t key_type, + const uint8_t *data, + size_t data_length) +{ + psa_status_t status; + psa_algorithm_t kdf_alg = psa_key_derivation_get_kdf_alg(operation); + + if (kdf_alg == PSA_ALG_NONE) { + /* This is a blank or aborted operation. */ + status = PSA_ERROR_BAD_STATE; + goto exit; + } + + status = psa_key_derivation_check_input_type(step, key_type); + if (status != PSA_SUCCESS) { + goto exit; + } + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HKDF) + if (PSA_ALG_IS_HKDF(kdf_alg)) { + status = psa_hkdf_input(&operation->ctx.hkdf, + PSA_ALG_HKDF_GET_HASH(kdf_alg), + step, data, data_length); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF) + if (PSA_ALG_IS_TLS12_PRF(kdf_alg)) { + status = psa_tls12_prf_input(&operation->ctx.tls12_prf, + step, data, data_length); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PRF */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS) + if (PSA_ALG_IS_TLS12_PSK_TO_MS(kdf_alg)) { + status = psa_tls12_prf_psk_to_ms_input(&operation->ctx.tls12_prf, + step, data, data_length); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_PSK_TO_MS */ + { + /* This can't happen unless the operation object was not initialized */ + (void) data; + (void) data_length; + (void) kdf_alg; + return PSA_ERROR_BAD_STATE; + } + +exit: + if (status != PSA_SUCCESS) { + psa_key_derivation_abort(operation); + } + return status; +} + +psa_status_t psa_key_derivation_input_bytes( + psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + const uint8_t *data_external, + size_t data_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + LOCAL_INPUT_DECLARE(data_external, data); + + LOCAL_INPUT_ALLOC(data_external, data_length, data); + + status = psa_key_derivation_input_internal(operation, step, + PSA_KEY_TYPE_NONE, + data, data_length); +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + LOCAL_INPUT_FREE(data_external, data); + return status; +} + +psa_status_t psa_key_derivation_input_key( + psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + mbedtls_svc_key_id_t key) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_slot_t *slot; + + status = psa_get_and_lock_transparent_key_slot_with_policy( + key, &slot, PSA_KEY_USAGE_DERIVE, operation->alg); + if (status != PSA_SUCCESS) { + psa_key_derivation_abort(operation); + return status; + } + + /* Passing a key object as a SECRET input unlocks the permission + * to output to a key object. */ + if (step == PSA_KEY_DERIVATION_INPUT_SECRET) { + operation->can_output_key = 1; + } + + status = psa_key_derivation_input_internal(operation, + step, slot->attr.type, + slot->key.data, + slot->key.bytes); + + unlock_status = psa_unlock_key_slot(slot); + + return (status == PSA_SUCCESS) ? unlock_status : status; +} + + + +/****************************************************************/ +/* Key agreement */ +/****************************************************************/ + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_ECDH) +static psa_status_t psa_key_agreement_ecdh(const uint8_t *peer_key, + size_t peer_key_length, + const mbedtls_ecp_keypair *our_key, + uint8_t *shared_secret, + size_t shared_secret_size, + size_t *shared_secret_length) +{ + mbedtls_ecp_keypair *their_key = NULL; + mbedtls_ecdh_context ecdh; + psa_status_t status; + size_t bits = 0; + psa_ecc_family_t curve = mbedtls_ecc_group_to_psa(our_key->grp.id, &bits); + mbedtls_ecdh_init(&ecdh); + + status = mbedtls_psa_ecp_load_representation( + PSA_KEY_TYPE_ECC_PUBLIC_KEY(curve), + bits, + peer_key, + peer_key_length, + &their_key); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = mbedtls_to_psa_error( + mbedtls_ecdh_get_params(&ecdh, their_key, MBEDTLS_ECDH_THEIRS)); + if (status != PSA_SUCCESS) { + goto exit; + } + status = mbedtls_to_psa_error( + mbedtls_ecdh_get_params(&ecdh, our_key, MBEDTLS_ECDH_OURS)); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = mbedtls_to_psa_error( + mbedtls_ecdh_calc_secret(&ecdh, + shared_secret_length, + shared_secret, shared_secret_size, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE)); + if (status != PSA_SUCCESS) { + goto exit; + } + if (PSA_BITS_TO_BYTES(bits) != *shared_secret_length) { + status = PSA_ERROR_CORRUPTION_DETECTED; + } + +exit: + if (status != PSA_SUCCESS) { + mbedtls_platform_zeroize(shared_secret, shared_secret_size); + } + mbedtls_ecdh_free(&ecdh); + mbedtls_ecp_keypair_free(their_key); + mbedtls_free(their_key); + + return status; +} +#endif /* MBEDTLS_PSA_BUILTIN_ALG_ECDH */ + +#define PSA_KEY_AGREEMENT_MAX_SHARED_SECRET_SIZE MBEDTLS_ECP_MAX_BYTES + +static psa_status_t psa_key_agreement_raw_internal(psa_algorithm_t alg, + psa_key_slot_t *private_key, + const uint8_t *peer_key, + size_t peer_key_length, + uint8_t *shared_secret, + size_t shared_secret_size, + size_t *shared_secret_length) +{ + mbedtls_ecp_keypair *ecp = NULL; + psa_status_t status; + + switch (alg) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_ECDH) + case PSA_ALG_ECDH: + if (!PSA_KEY_TYPE_IS_ECC_KEY_PAIR(private_key->attr.type)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + status = mbedtls_psa_ecp_load_representation( + private_key->attr.type, + private_key->attr.bits, + private_key->key.data, + private_key->key.bytes, + &ecp); + if (status != PSA_SUCCESS) { + return status; + } + status = psa_key_agreement_ecdh(peer_key, peer_key_length, + ecp, + shared_secret, shared_secret_size, + shared_secret_length); + mbedtls_ecp_keypair_free(ecp); + mbedtls_free(ecp); + return status; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_ECDH */ + default: + (void) ecp; + (void) status; + (void) private_key; + (void) peer_key; + (void) peer_key_length; + (void) shared_secret; + (void) shared_secret_size; + (void) shared_secret_length; + return PSA_ERROR_NOT_SUPPORTED; + } +} + +/* Note that if this function fails, you must call psa_key_derivation_abort() + * to potentially free embedded data structures and wipe confidential data. + */ +static psa_status_t psa_key_agreement_internal(psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + psa_key_slot_t *private_key, + const uint8_t *peer_key, + size_t peer_key_length) +{ + psa_status_t status; + uint8_t shared_secret[PSA_KEY_AGREEMENT_MAX_SHARED_SECRET_SIZE]; + size_t shared_secret_length = 0; + psa_algorithm_t ka_alg = PSA_ALG_KEY_AGREEMENT_GET_BASE(operation->alg); + + /* Step 1: run the secret agreement algorithm to generate the shared + * secret. */ + status = psa_key_agreement_raw_internal(ka_alg, + private_key, + peer_key, peer_key_length, + shared_secret, + sizeof(shared_secret), + &shared_secret_length); + if (status != PSA_SUCCESS) { + goto exit; + } + + /* Step 2: set up the key derivation to generate key material from + * the shared secret. A shared secret is permitted wherever a key + * of type DERIVE is permitted. */ + status = psa_key_derivation_input_internal(operation, step, + PSA_KEY_TYPE_DERIVE, + shared_secret, + shared_secret_length); +exit: + mbedtls_platform_zeroize(shared_secret, shared_secret_length); + return status; +} + +psa_status_t psa_key_derivation_key_agreement(psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + mbedtls_svc_key_id_t private_key, + const uint8_t *peer_key_external, + size_t peer_key_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_slot_t *slot; + LOCAL_INPUT_DECLARE(peer_key_external, peer_key); + + if (!PSA_ALG_IS_KEY_AGREEMENT(operation->alg)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + status = psa_get_and_lock_transparent_key_slot_with_policy( + private_key, &slot, PSA_KEY_USAGE_DERIVE, operation->alg); + if (status != PSA_SUCCESS) { + return status; + } + + LOCAL_INPUT_ALLOC(peer_key_external, peer_key_length, peer_key); + status = psa_key_agreement_internal(operation, step, + slot, + peer_key, peer_key_length); + +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + if (status != PSA_SUCCESS) { + psa_key_derivation_abort(operation); + } else { + /* If a private key has been added as SECRET, we allow the derived + * key material to be used as a key in PSA Crypto. */ + if (step == PSA_KEY_DERIVATION_INPUT_SECRET) { + operation->can_output_key = 1; + } + } + + unlock_status = psa_unlock_key_slot(slot); + + LOCAL_INPUT_FREE(peer_key_external, peer_key); + return (status == PSA_SUCCESS) ? unlock_status : status; +} + +psa_status_t psa_raw_key_agreement(psa_algorithm_t alg, + mbedtls_svc_key_id_t private_key, + const uint8_t *peer_key_external, + size_t peer_key_length, + uint8_t *output_external, + size_t output_size, + size_t *output_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_slot_t *slot = NULL; + size_t expected_length; + LOCAL_INPUT_DECLARE(peer_key_external, peer_key); + LOCAL_OUTPUT_DECLARE(output_external, output); + LOCAL_OUTPUT_ALLOC(output_external, output_size, output); + + if (!PSA_ALG_IS_KEY_AGREEMENT(alg)) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + status = psa_get_and_lock_transparent_key_slot_with_policy( + private_key, &slot, PSA_KEY_USAGE_DERIVE, alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + /* PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE() is in general an upper bound + * for the output size. The PSA specification only guarantees that this + * function works if output_size >= PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE(...), + * but it might be nice to allow smaller buffers if the output fits. + * At the time of writing this comment, with only ECDH implemented, + * PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE() is exact so the point is moot. + * If FFDH is implemented, PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE() can easily + * be exact for it as well. */ + expected_length = + PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE(slot->attr.type, slot->attr.bits); + if (output_size < expected_length) { + status = PSA_ERROR_BUFFER_TOO_SMALL; + goto exit; + } + + LOCAL_INPUT_ALLOC(peer_key_external, peer_key_length, peer_key); + status = psa_key_agreement_raw_internal(alg, slot, + peer_key, peer_key_length, + output, output_size, + output_length); + +exit: + /* Check for successful allocation of output, + * with an unsuccessful status. */ + if (output != NULL && status != PSA_SUCCESS) { + /* If an error happens and is not handled properly, the output + * may be used as a key to protect sensitive data. Arrange for such + * a key to be random, which is likely to result in decryption or + * verification errors. This is better than filling the buffer with + * some constant data such as zeros, which would result in the data + * being protected with a reproducible, easily knowable key. + */ + psa_generate_random_internal(output, output_size); + *output_length = output_size; + } + + if (output == NULL) { + /* output allocation failed. */ + *output_length = 0; + } + + unlock_status = psa_unlock_key_slot(slot); + + LOCAL_INPUT_FREE(peer_key_external, peer_key); + LOCAL_OUTPUT_FREE(output_external, output); + return (status == PSA_SUCCESS) ? unlock_status : status; +} + + +/****************************************************************/ +/* Random generation */ +/****************************************************************/ + +#if defined(MBEDTLS_PSA_INJECT_ENTROPY) +#include "mbedtls/entropy_poll.h" +#endif + +/** Initialize the PSA random generator. + */ +static void mbedtls_psa_random_init(mbedtls_psa_random_context_t *rng) +{ +#if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) + memset(rng, 0, sizeof(*rng)); +#else /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ + + /* Set default configuration if + * mbedtls_psa_crypto_configure_entropy_sources() hasn't been called. */ + if (rng->entropy_init == NULL) { + rng->entropy_init = mbedtls_entropy_init; + } + if (rng->entropy_free == NULL) { + rng->entropy_free = mbedtls_entropy_free; + } + + rng->entropy_init(&rng->entropy); +#if defined(MBEDTLS_PSA_INJECT_ENTROPY) && \ + defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) + /* The PSA entropy injection feature depends on using NV seed as an entropy + * source. Add NV seed as an entropy source for PSA entropy injection. */ + mbedtls_entropy_add_source(&rng->entropy, + mbedtls_nv_seed_poll, NULL, + MBEDTLS_ENTROPY_BLOCK_SIZE, + MBEDTLS_ENTROPY_SOURCE_STRONG); +#endif + + mbedtls_psa_drbg_init(MBEDTLS_PSA_RANDOM_STATE); +#endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ +} + +/** Deinitialize the PSA random generator. + */ +static void mbedtls_psa_random_free(mbedtls_psa_random_context_t *rng) +{ +#if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) + memset(rng, 0, sizeof(*rng)); +#else /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ + mbedtls_psa_drbg_free(MBEDTLS_PSA_RANDOM_STATE); + rng->entropy_free(&rng->entropy); +#endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ +} + +/** Seed the PSA random generator. + */ +static psa_status_t mbedtls_psa_random_seed(mbedtls_psa_random_context_t *rng) +{ +#if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) + /* Do nothing: the external RNG seeds itself. */ + (void) rng; + return PSA_SUCCESS; +#else /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ + const unsigned char drbg_seed[] = "PSA"; + int ret = mbedtls_psa_drbg_seed(&rng->entropy, + drbg_seed, sizeof(drbg_seed) - 1); + return mbedtls_to_psa_error(ret); +#endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ +} + +psa_status_t psa_generate_random(uint8_t *output_external, + size_t output_size) +{ + psa_status_t status; + + LOCAL_OUTPUT_DECLARE(output_external, output); + LOCAL_OUTPUT_ALLOC(output_external, output_size, output); + + status = psa_generate_random_internal(output, output_size); + +#if !defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) +exit: +#endif + LOCAL_OUTPUT_FREE(output_external, output); + return status; +} + +/* Wrapper function allowing the classic API to use the PSA RNG. + * + * `mbedtls_psa_get_random(MBEDTLS_PSA_RANDOM_STATE, ...)` calls + * `psa_generate_random(...)`. The state parameter is ignored since the + * PSA API doesn't support passing an explicit state. + * + * In the non-external case, psa_generate_random() calls an + * `mbedtls_xxx_drbg_random` function which has exactly the same signature + * and semantics as mbedtls_psa_get_random(). As an optimization, + * instead of doing this back-and-forth between the PSA API and the + * classic API, psa_crypto_random_impl.h defines `mbedtls_psa_get_random` + * as a constant function pointer to `mbedtls_xxx_drbg_random`. + */ +#if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) +int mbedtls_psa_get_random(void *p_rng, + unsigned char *output, + size_t output_size) +{ + /* This function takes a pointer to the RNG state because that's what + * classic mbedtls functions using an RNG expect. The PSA RNG manages + * its own state internally and doesn't let the caller access that state. + * So we just ignore the state parameter, and in practice we'll pass + * NULL. */ + (void) p_rng; + psa_status_t status = psa_generate_random(output, output_size); + if (status == PSA_SUCCESS) { + return 0; + } else { + return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; + } +} +#endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ + +#if defined(MBEDTLS_PSA_INJECT_ENTROPY) +psa_status_t mbedtls_psa_inject_entropy(const uint8_t *seed, + size_t seed_size) +{ + if (global_data.initialized) { + return PSA_ERROR_NOT_PERMITTED; + } + + if (((seed_size < MBEDTLS_ENTROPY_MIN_PLATFORM) || + (seed_size < MBEDTLS_ENTROPY_BLOCK_SIZE)) || + (seed_size > MBEDTLS_ENTROPY_MAX_SEED_SIZE)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + return mbedtls_psa_storage_inject_entropy(seed, seed_size); +} +#endif /* MBEDTLS_PSA_INJECT_ENTROPY */ + +/** Validate the key type and size for key generation + * + * \param type The key type + * \param bits The number of bits of the key + * + * \retval #PSA_SUCCESS + * The key type and size are valid. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The size in bits of the key is not valid. + * \retval #PSA_ERROR_NOT_SUPPORTED + * The type and/or the size in bits of the key or the combination of + * the two is not supported. + */ +static psa_status_t psa_validate_key_type_and_size_for_key_generation( + psa_key_type_t type, size_t bits) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + if (key_type_is_raw_bytes(type)) { + status = validate_unstructured_key_bit_size(type, bits); + if (status != PSA_SUCCESS) { + return status; + } + } else +#if defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR) + if (PSA_KEY_TYPE_IS_RSA(type) && PSA_KEY_TYPE_IS_KEY_PAIR(type)) { + if (bits > PSA_VENDOR_RSA_MAX_KEY_BITS) { + return PSA_ERROR_NOT_SUPPORTED; + } + + /* Accept only byte-aligned keys, for the same reasons as + * in psa_import_rsa_key(). */ + if (bits % 8 != 0) { + return PSA_ERROR_NOT_SUPPORTED; + } + } else +#endif /* defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR) */ + +#if defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR) + if (PSA_KEY_TYPE_IS_ECC(type) && PSA_KEY_TYPE_IS_KEY_PAIR(type)) { + /* To avoid empty block, return successfully here. */ + return PSA_SUCCESS; + } else +#endif /* defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR) */ + { + return PSA_ERROR_NOT_SUPPORTED; + } + + return PSA_SUCCESS; +} + +psa_status_t psa_generate_key_internal( + const psa_key_attributes_t *attributes, + uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_type_t type = attributes->core.type; + + if ((attributes->domain_parameters == NULL) && + (attributes->domain_parameters_size != 0)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + if (key_type_is_raw_bytes(type)) { + status = psa_generate_random(key_buffer, key_buffer_size); + if (status != PSA_SUCCESS) { + return status; + } + +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES) + if (type == PSA_KEY_TYPE_DES) { + psa_des_set_key_parity(key_buffer, key_buffer_size); + } +#endif /* MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES */ + } else + +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) && \ + defined(MBEDTLS_GENPRIME) + if (type == PSA_KEY_TYPE_RSA_KEY_PAIR) { + return mbedtls_psa_rsa_generate_key(attributes, + key_buffer, + key_buffer_size, + key_buffer_length); + } else +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) + * defined(MBEDTLS_GENPRIME) */ + +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) + if (PSA_KEY_TYPE_IS_ECC(type) && PSA_KEY_TYPE_IS_KEY_PAIR(type)) { + return mbedtls_psa_ecp_generate_key(attributes, + key_buffer, + key_buffer_size, + key_buffer_length); + } else +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) */ + { + (void) key_buffer_length; + return PSA_ERROR_NOT_SUPPORTED; + } + + return PSA_SUCCESS; +} + +psa_status_t psa_generate_key(const psa_key_attributes_t *attributes, + mbedtls_svc_key_id_t *key) +{ + psa_status_t status; + psa_key_slot_t *slot = NULL; + psa_se_drv_table_entry_t *driver = NULL; + size_t key_buffer_size; + + *key = MBEDTLS_SVC_KEY_ID_INIT; + + /* Reject any attempt to create a zero-length key so that we don't + * risk tripping up later, e.g. on a malloc(0) that returns NULL. */ + if (psa_get_key_bits(attributes) == 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + /* Reject any attempt to create a public key. */ + if (PSA_KEY_TYPE_IS_PUBLIC_KEY(attributes->core.type)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + status = psa_start_key_creation(PSA_KEY_CREATION_GENERATE, attributes, + &slot, &driver); + if (status != PSA_SUCCESS) { + goto exit; + } + + /* In the case of a transparent key or an opaque key stored in local + * storage (thus not in the case of generating a key in a secure element + * or cryptoprocessor with storage), we have to allocate a buffer to + * hold the generated key material. */ + if (slot->key.data == NULL) { + if (PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime) == + PSA_KEY_LOCATION_LOCAL_STORAGE) { + status = psa_validate_key_type_and_size_for_key_generation( + attributes->core.type, attributes->core.bits); + if (status != PSA_SUCCESS) { + goto exit; + } + + key_buffer_size = PSA_EXPORT_KEY_OUTPUT_SIZE( + attributes->core.type, + attributes->core.bits); + } else { + status = psa_driver_wrapper_get_key_buffer_size( + attributes, &key_buffer_size); + if (status != PSA_SUCCESS) { + goto exit; + } + } + + status = psa_allocate_buffer_to_slot(slot, key_buffer_size); + if (status != PSA_SUCCESS) { + goto exit; + } + } + + status = psa_driver_wrapper_generate_key(attributes, + slot->key.data, slot->key.bytes, &slot->key.bytes); + + if (status != PSA_SUCCESS) { + psa_remove_key_data_from_memory(slot); + } + +exit: + if (status == PSA_SUCCESS) { + status = psa_finish_key_creation(slot, driver, key); + } + if (status != PSA_SUCCESS) { + psa_fail_key_creation(slot, driver); + } + + return status; +} + +/****************************************************************/ +/* Module setup */ +/****************************************************************/ + +#if !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) +psa_status_t mbedtls_psa_crypto_configure_entropy_sources( + void (* entropy_init)(mbedtls_entropy_context *ctx), + void (* entropy_free)(mbedtls_entropy_context *ctx)) +{ + if (global_data.rng_state != RNG_NOT_INITIALIZED) { + return PSA_ERROR_BAD_STATE; + } + global_data.rng.entropy_init = entropy_init; + global_data.rng.entropy_free = entropy_free; + return PSA_SUCCESS; +} +#endif /* !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) */ + +void mbedtls_psa_crypto_free(void) +{ + psa_wipe_all_key_slots(); + if (global_data.rng_state != RNG_NOT_INITIALIZED) { + mbedtls_psa_random_free(&global_data.rng); + } + /* Wipe all remaining data, including configuration. + * In particular, this sets all state indicator to the value + * indicating "uninitialized". */ + mbedtls_platform_zeroize(&global_data, sizeof(global_data)); + + /* Terminate drivers */ + psa_driver_wrapper_free(); +} + +#if defined(PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS) +/** Recover a transaction that was interrupted by a power failure. + * + * This function is called during initialization, before psa_crypto_init() + * returns. If this function returns a failure status, the initialization + * fails. + */ +static psa_status_t psa_crypto_recover_transaction( + const psa_crypto_transaction_t *transaction) +{ + switch (transaction->unknown.type) { + case PSA_CRYPTO_TRANSACTION_CREATE_KEY: + case PSA_CRYPTO_TRANSACTION_DESTROY_KEY: + /* TODO - fall through to the failure case until this + * is implemented. + * https://github.com/ARMmbed/mbed-crypto/issues/218 + */ + default: + /* We found an unsupported transaction in the storage. + * We don't know what state the storage is in. Give up. */ + return PSA_ERROR_DATA_INVALID; + } +} +#endif /* PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS */ + +psa_status_t psa_crypto_init(void) +{ + psa_status_t status; + + /* Double initialization is explicitly allowed. */ + if (global_data.initialized != 0) { + return PSA_SUCCESS; + } + + /* Initialize and seed the random generator. */ + mbedtls_psa_random_init(&global_data.rng); + global_data.rng_state = RNG_INITIALIZED; + status = mbedtls_psa_random_seed(&global_data.rng); + if (status != PSA_SUCCESS) { + goto exit; + } + global_data.rng_state = RNG_SEEDED; + + status = psa_initialize_key_slots(); + if (status != PSA_SUCCESS) { + goto exit; + } + + /* Init drivers */ + status = psa_driver_wrapper_init(); + if (status != PSA_SUCCESS) { + goto exit; + } + +#if defined(PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS) + status = psa_crypto_load_transaction(); + if (status == PSA_SUCCESS) { + status = psa_crypto_recover_transaction(&psa_crypto_transaction); + if (status != PSA_SUCCESS) { + goto exit; + } + status = psa_crypto_stop_transaction(); + } else if (status == PSA_ERROR_DOES_NOT_EXIST) { + /* There's no transaction to complete. It's all good. */ + status = PSA_SUCCESS; + } +#endif /* PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS */ + + /* All done. */ + global_data.initialized = 1; + +exit: + if (status != PSA_SUCCESS) { + mbedtls_psa_crypto_free(); + } + return status; +} + +/* Memory copying test hooks. These are called before input copy, after input + * copy, before output copy and after output copy, respectively. + * They are used by memory-poisoning tests to temporarily unpoison buffers + * while they are copied. */ +#if defined(MBEDTLS_TEST_HOOKS) +void (*psa_input_pre_copy_hook)(const uint8_t *input, size_t input_len) = NULL; +void (*psa_input_post_copy_hook)(const uint8_t *input, size_t input_len) = NULL; +void (*psa_output_pre_copy_hook)(const uint8_t *output, size_t output_len) = NULL; +void (*psa_output_post_copy_hook)(const uint8_t *output, size_t output_len) = NULL; +#endif + +/** Copy from an input buffer to a local copy. + * + * \param[in] input Pointer to input buffer. + * \param[in] input_len Length of the input buffer. + * \param[out] input_copy Pointer to a local copy in which to store the input data. + * \param[out] input_copy_len Length of the local copy buffer. + * \return #PSA_SUCCESS, if the buffer was successfully + * copied. + * \return #PSA_ERROR_CORRUPTION_DETECTED, if the local + * copy is too small to hold contents of the + * input buffer. + */ +MBEDTLS_STATIC_TESTABLE +psa_status_t psa_crypto_copy_input(const uint8_t *input, size_t input_len, + uint8_t *input_copy, size_t input_copy_len) +{ + if (input_len > input_copy_len) { + return PSA_ERROR_CORRUPTION_DETECTED; + } + +#if defined(MBEDTLS_TEST_HOOKS) + if (psa_input_pre_copy_hook != NULL) { + psa_input_pre_copy_hook(input, input_len); + } +#endif + + if (input_len > 0) { + memcpy(input_copy, input, input_len); + } + +#if defined(MBEDTLS_TEST_HOOKS) + if (psa_input_post_copy_hook != NULL) { + psa_input_post_copy_hook(input, input_len); + } +#endif + + return PSA_SUCCESS; +} + +/** Copy from a local output buffer into a user-supplied one. + * + * \param[in] output_copy Pointer to a local buffer containing the output. + * \param[in] output_copy_len Length of the local buffer. + * \param[out] output Pointer to user-supplied output buffer. + * \param[out] output_len Length of the user-supplied output buffer. + * \return #PSA_SUCCESS, if the buffer was successfully + * copied. + * \return #PSA_ERROR_BUFFER_TOO_SMALL, if the + * user-supplied output buffer is too small to + * hold the contents of the local buffer. + */ +MBEDTLS_STATIC_TESTABLE +psa_status_t psa_crypto_copy_output(const uint8_t *output_copy, size_t output_copy_len, + uint8_t *output, size_t output_len) +{ + if (output_len < output_copy_len) { + return PSA_ERROR_BUFFER_TOO_SMALL; + } + +#if defined(MBEDTLS_TEST_HOOKS) + if (psa_output_pre_copy_hook != NULL) { + psa_output_pre_copy_hook(output, output_len); + } +#endif + + if (output_copy_len > 0) { + memcpy(output, output_copy, output_copy_len); + } + +#if defined(MBEDTLS_TEST_HOOKS) + if (psa_output_post_copy_hook != NULL) { + psa_output_post_copy_hook(output, output_len); + } +#endif + + return PSA_SUCCESS; +} + +psa_status_t psa_crypto_local_input_alloc(const uint8_t *input, size_t input_len, + psa_crypto_local_input_t *local_input) +{ + psa_status_t status; + + *local_input = PSA_CRYPTO_LOCAL_INPUT_INIT; + + if (input_len == 0) { + return PSA_SUCCESS; + } + + local_input->buffer = mbedtls_calloc(input_len, 1); + if (local_input->buffer == NULL) { + /* Since we dealt with the zero-length case above, we know that + * a NULL return value means a failure of allocation. */ + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + /* From now on, we must free local_input->buffer on error. */ + + local_input->length = input_len; + + status = psa_crypto_copy_input(input, input_len, + local_input->buffer, local_input->length); + if (status != PSA_SUCCESS) { + goto error; + } + + return PSA_SUCCESS; + +error: + if (local_input->buffer != NULL) { + mbedtls_platform_zeroize(local_input->buffer, local_input->length); + mbedtls_free(local_input->buffer); + local_input->buffer = NULL; + } + local_input->length = 0; + return status; +} + +void psa_crypto_local_input_free(psa_crypto_local_input_t *local_input) +{ + if (local_input->buffer != NULL) { + mbedtls_platform_zeroize(local_input->buffer, local_input->length); + mbedtls_free(local_input->buffer); + local_input->buffer = NULL; + } + local_input->length = 0; +} + +psa_status_t psa_crypto_local_output_alloc(uint8_t *output, size_t output_len, + psa_crypto_local_output_t *local_output) +{ + *local_output = PSA_CRYPTO_LOCAL_OUTPUT_INIT; + + if (output_len == 0) { + return PSA_SUCCESS; + } + local_output->buffer = mbedtls_calloc(output_len, 1); + if (local_output->buffer == NULL) { + /* Since we dealt with the zero-length case above, we know that + * a NULL return value means a failure of allocation. */ + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + local_output->length = output_len; + local_output->original = output; + + return PSA_SUCCESS; +} + +psa_status_t psa_crypto_local_output_free(psa_crypto_local_output_t *local_output) +{ + psa_status_t status; + + if (local_output->buffer == NULL) { + local_output->length = 0; + return PSA_SUCCESS; + } + if (local_output->original == NULL) { + /* We have an internal copy but nothing to copy back to. */ + return PSA_ERROR_CORRUPTION_DETECTED; + } + + status = psa_crypto_copy_output(local_output->buffer, local_output->length, + local_output->original, local_output->length); + if (status != PSA_SUCCESS) { + return status; + } + + if (local_output->buffer != NULL) { + mbedtls_platform_zeroize(local_output->buffer, local_output->length); + mbedtls_free(local_output->buffer); + local_output->buffer = NULL; + } + local_output->length = 0; + + return PSA_SUCCESS; +} + +#endif /* MBEDTLS_PSA_CRYPTO_C */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_aead.c b/ext/opcua_client/mbedtls/library/psa_crypto_aead.c new file mode 100644 index 0000000..ed9e55a --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_aead.c @@ -0,0 +1,382 @@ +/* + * PSA AEAD entry points + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PSA_CRYPTO_C) + +#include "psa_crypto_aead.h" +#include "psa_crypto_core.h" +#include "psa_crypto_cipher.h" + +#include "mbedtls/ccm.h" +#include "mbedtls/chachapoly.h" +#include "mbedtls/cipher.h" +#include "mbedtls/gcm.h" + +typedef struct { + psa_algorithm_t core_alg; + uint8_t tag_length; + union { + unsigned dummy; /* Make the union non-empty even with no supported algorithms. */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CCM) + mbedtls_ccm_context ccm; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CCM */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_GCM) + mbedtls_gcm_context gcm; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_GCM */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305) + mbedtls_chachapoly_context chachapoly; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305 */ + } ctx; +} aead_operation_t; + +#define AEAD_OPERATION_INIT { 0, 0, { 0 } } + +static void psa_aead_abort_internal(aead_operation_t *operation) +{ + switch (operation->core_alg) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CCM) + case PSA_ALG_CCM: + mbedtls_ccm_free(&operation->ctx.ccm); + break; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CCM */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_GCM) + case PSA_ALG_GCM: + mbedtls_gcm_free(&operation->ctx.gcm); + break; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_GCM */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305) + case PSA_ALG_CHACHA20_POLY1305: + mbedtls_chachapoly_free(&operation->ctx.chachapoly); + break; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305 */ + } +} + +static psa_status_t psa_aead_setup( + aead_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + psa_algorithm_t alg) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + size_t key_bits; + const mbedtls_cipher_info_t *cipher_info; + mbedtls_cipher_id_t cipher_id; + size_t full_tag_length = 0; + + key_bits = attributes->core.bits; + + cipher_info = mbedtls_cipher_info_from_psa(alg, + attributes->core.type, key_bits, + &cipher_id); + if (cipher_info == NULL) { + return PSA_ERROR_NOT_SUPPORTED; + } + + switch (PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg, 0)) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CCM) + case PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, 0): + operation->core_alg = PSA_ALG_CCM; + full_tag_length = 16; + /* CCM allows the following tag lengths: 4, 6, 8, 10, 12, 14, 16. + * The call to mbedtls_ccm_encrypt_and_tag or + * mbedtls_ccm_auth_decrypt will validate the tag length. */ + if (PSA_BLOCK_CIPHER_BLOCK_LENGTH(attributes->core.type) != 16) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + mbedtls_ccm_init(&operation->ctx.ccm); + status = mbedtls_to_psa_error( + mbedtls_ccm_setkey(&operation->ctx.ccm, cipher_id, + key_buffer, (unsigned int) key_bits)); + if (status != PSA_SUCCESS) { + return status; + } + break; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CCM */ + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_GCM) + case PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_GCM, 0): + operation->core_alg = PSA_ALG_GCM; + full_tag_length = 16; + /* GCM allows the following tag lengths: 4, 8, 12, 13, 14, 15, 16. + * The call to mbedtls_gcm_crypt_and_tag or + * mbedtls_gcm_auth_decrypt will validate the tag length. */ + if (PSA_BLOCK_CIPHER_BLOCK_LENGTH(attributes->core.type) != 16) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + mbedtls_gcm_init(&operation->ctx.gcm); + status = mbedtls_to_psa_error( + mbedtls_gcm_setkey(&operation->ctx.gcm, cipher_id, + key_buffer, (unsigned int) key_bits)); + if (status != PSA_SUCCESS) { + return status; + } + break; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_GCM */ + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305) + case PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CHACHA20_POLY1305, 0): + operation->core_alg = PSA_ALG_CHACHA20_POLY1305; + full_tag_length = 16; + /* We only support the default tag length. */ + if (alg != PSA_ALG_CHACHA20_POLY1305) { + return PSA_ERROR_NOT_SUPPORTED; + } + + mbedtls_chachapoly_init(&operation->ctx.chachapoly); + status = mbedtls_to_psa_error( + mbedtls_chachapoly_setkey(&operation->ctx.chachapoly, + key_buffer)); + if (status != PSA_SUCCESS) { + return status; + } + break; +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305 */ + + default: + (void) status; + (void) key_buffer; + return PSA_ERROR_NOT_SUPPORTED; + } + + if (PSA_AEAD_TAG_LENGTH(attributes->core.type, + key_bits, alg) + > full_tag_length) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + operation->tag_length = PSA_AEAD_TAG_LENGTH(attributes->core.type, + key_bits, + alg); + + return PSA_SUCCESS; +} + +psa_status_t mbedtls_psa_aead_encrypt( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *nonce, size_t nonce_length, + const uint8_t *additional_data, size_t additional_data_length, + const uint8_t *plaintext, size_t plaintext_length, + uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + aead_operation_t operation = AEAD_OPERATION_INIT; + uint8_t *tag; + (void) key_buffer_size; + + status = psa_aead_setup(&operation, attributes, key_buffer, alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + /* For all currently supported modes, the tag is at the end of the + * ciphertext. */ + if (ciphertext_size < (plaintext_length + operation.tag_length)) { + status = PSA_ERROR_BUFFER_TOO_SMALL; + goto exit; + } + tag = ciphertext + plaintext_length; + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CCM) + if (operation.core_alg == PSA_ALG_CCM) { + status = mbedtls_to_psa_error( + mbedtls_ccm_encrypt_and_tag(&operation.ctx.ccm, + plaintext_length, + nonce, nonce_length, + additional_data, + additional_data_length, + plaintext, ciphertext, + tag, operation.tag_length)); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CCM */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_GCM) + if (operation.core_alg == PSA_ALG_GCM) { + status = mbedtls_to_psa_error( + mbedtls_gcm_crypt_and_tag(&operation.ctx.gcm, + MBEDTLS_GCM_ENCRYPT, + plaintext_length, + nonce, nonce_length, + additional_data, additional_data_length, + plaintext, ciphertext, + operation.tag_length, tag)); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_GCM */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305) + if (operation.core_alg == PSA_ALG_CHACHA20_POLY1305) { + if (nonce_length != 12) { + if (nonce_length == 8) { + status = PSA_ERROR_NOT_SUPPORTED; + } else { + status = PSA_ERROR_INVALID_ARGUMENT; + } + goto exit; + } + + if (operation.tag_length != 16) { + status = PSA_ERROR_NOT_SUPPORTED; + goto exit; + } + status = mbedtls_to_psa_error( + mbedtls_chachapoly_encrypt_and_tag(&operation.ctx.chachapoly, + plaintext_length, + nonce, + additional_data, + additional_data_length, + plaintext, + ciphertext, + tag)); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305 */ + { + (void) tag; + (void) nonce; + (void) nonce_length; + (void) additional_data; + (void) additional_data_length; + (void) plaintext; + return PSA_ERROR_NOT_SUPPORTED; + } + + if (status == PSA_SUCCESS) { + *ciphertext_length = plaintext_length + operation.tag_length; + } + +exit: + psa_aead_abort_internal(&operation); + + return status; +} + +/* Locate the tag in a ciphertext buffer containing the encrypted data + * followed by the tag. Return the length of the part preceding the tag in + * *plaintext_length. This is the size of the plaintext in modes where + * the encrypted data has the same size as the plaintext, such as + * CCM and GCM. */ +static psa_status_t psa_aead_unpadded_locate_tag(size_t tag_length, + const uint8_t *ciphertext, + size_t ciphertext_length, + size_t plaintext_size, + const uint8_t **p_tag) +{ + size_t payload_length; + if (tag_length > ciphertext_length) { + return PSA_ERROR_INVALID_ARGUMENT; + } + payload_length = ciphertext_length - tag_length; + if (payload_length > plaintext_size) { + return PSA_ERROR_BUFFER_TOO_SMALL; + } + *p_tag = ciphertext + payload_length; + return PSA_SUCCESS; +} + +psa_status_t mbedtls_psa_aead_decrypt( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *nonce, size_t nonce_length, + const uint8_t *additional_data, size_t additional_data_length, + const uint8_t *ciphertext, size_t ciphertext_length, + uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + aead_operation_t operation = AEAD_OPERATION_INIT; + const uint8_t *tag = NULL; + (void) key_buffer_size; + + status = psa_aead_setup(&operation, attributes, key_buffer, alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_aead_unpadded_locate_tag(operation.tag_length, + ciphertext, ciphertext_length, + plaintext_size, &tag); + if (status != PSA_SUCCESS) { + goto exit; + } + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CCM) + if (operation.core_alg == PSA_ALG_CCM) { + status = mbedtls_to_psa_error( + mbedtls_ccm_auth_decrypt(&operation.ctx.ccm, + ciphertext_length - operation.tag_length, + nonce, nonce_length, + additional_data, + additional_data_length, + ciphertext, plaintext, + tag, operation.tag_length)); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CCM */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_GCM) + if (operation.core_alg == PSA_ALG_GCM) { + status = mbedtls_to_psa_error( + mbedtls_gcm_auth_decrypt(&operation.ctx.gcm, + ciphertext_length - operation.tag_length, + nonce, nonce_length, + additional_data, + additional_data_length, + tag, operation.tag_length, + ciphertext, plaintext)); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_GCM */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305) + if (operation.core_alg == PSA_ALG_CHACHA20_POLY1305) { + if (nonce_length != 12) { + if (nonce_length == 8) { + status = PSA_ERROR_NOT_SUPPORTED; + } else { + status = PSA_ERROR_INVALID_ARGUMENT; + } + goto exit; + } + + if (operation.tag_length != 16) { + status = PSA_ERROR_NOT_SUPPORTED; + goto exit; + } + status = mbedtls_to_psa_error( + mbedtls_chachapoly_auth_decrypt(&operation.ctx.chachapoly, + ciphertext_length - operation.tag_length, + nonce, + additional_data, + additional_data_length, + tag, + ciphertext, + plaintext)); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305 */ + { + (void) nonce; + (void) nonce_length; + (void) additional_data; + (void) additional_data_length; + (void) plaintext; + return PSA_ERROR_NOT_SUPPORTED; + } + + if (status == PSA_SUCCESS) { + *plaintext_length = ciphertext_length - operation.tag_length; + } + +exit: + psa_aead_abort_internal(&operation); + + if (status == PSA_SUCCESS) { + *plaintext_length = ciphertext_length - operation.tag_length; + } + return status; +} + +#endif /* MBEDTLS_PSA_CRYPTO_C */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_aead.h b/ext/opcua_client/mbedtls/library/psa_crypto_aead.h new file mode 100644 index 0000000..e1ff0e5 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_aead.h @@ -0,0 +1,139 @@ +/* + * PSA AEAD driver entry points + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_AEAD_H +#define PSA_CRYPTO_AEAD_H + +#include + +/** + * \brief Process an authenticated encryption operation. + * + * \note The signature of this function is that of a PSA driver + * aead_encrypt entry point. This function behaves as an aead_encrypt + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param alg The AEAD algorithm to compute. + * \param[in] nonce Nonce or IV to use. + * \param nonce_length Size of the nonce buffer in bytes. This must + * be appropriate for the selected algorithm. + * The default nonce size is + * PSA_AEAD_NONCE_LENGTH(key_type, alg) where + * key_type is the type of key. + * \param[in] additional_data Additional data that will be authenticated + * but not encrypted. + * \param additional_data_length Size of additional_data in bytes. + * \param[in] plaintext Data that will be authenticated and encrypted. + * \param plaintext_length Size of plaintext in bytes. + * \param[out] ciphertext Output buffer for the authenticated and + * encrypted data. The additional data is not + * part of this output. For algorithms where the + * encrypted data and the authentication tag are + * defined as separate outputs, the + * authentication tag is appended to the + * encrypted data. + * \param ciphertext_size Size of the ciphertext buffer in bytes. This + * must be appropriate for the selected algorithm + * and key: + * - A sufficient output size is + * PSA_AEAD_ENCRYPT_OUTPUT_SIZE(key_type, alg, + * plaintext_length) where key_type is the type + * of key. + * - PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE( + * plaintext_length) evaluates to the maximum + * ciphertext size of any supported AEAD + * encryption. + * \param[out] ciphertext_length On success, the size of the output in the + * ciphertext buffer. + * + * \retval #PSA_SUCCESS Success. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * ciphertext_size is too small. + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_aead_encrypt( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *nonce, size_t nonce_length, + const uint8_t *additional_data, size_t additional_data_length, + const uint8_t *plaintext, size_t plaintext_length, + uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length); + +/** + * \brief Process an authenticated decryption operation. + * + * \note The signature of this function is that of a PSA driver + * aead_decrypt entry point. This function behaves as an aead_decrypt + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param alg The AEAD algorithm to compute. + * \param[in] nonce Nonce or IV to use. + * \param nonce_length Size of the nonce buffer in bytes. This must + * be appropriate for the selected algorithm. + * The default nonce size is + * PSA_AEAD_NONCE_LENGTH(key_type, alg) where + * key_type is the type of key. + * \param[in] additional_data Additional data that has been authenticated + * but not encrypted. + * \param additional_data_length Size of additional_data in bytes. + * \param[in] ciphertext Data that has been authenticated and + * encrypted. For algorithms where the encrypted + * data and the authentication tag are defined + * as separate inputs, the buffer contains + * encrypted data followed by the authentication + * tag. + * \param ciphertext_length Size of ciphertext in bytes. + * \param[out] plaintext Output buffer for the decrypted data. + * \param plaintext_size Size of the plaintext buffer in bytes. This + * must be appropriate for the selected algorithm + * and key: + * - A sufficient output size is + * PSA_AEAD_DECRYPT_OUTPUT_SIZE(key_type, alg, + * ciphertext_length) where key_type is the + * type of key. + * - PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE( + * ciphertext_length) evaluates to the maximum + * plaintext size of any supported AEAD + * decryption. + * \param[out] plaintext_length On success, the size of the output in the + * plaintext buffer. + * + * \retval #PSA_SUCCESS Success. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The cipher is not authentic. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * plaintext_size is too small. + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_aead_decrypt( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *nonce, size_t nonce_length, + const uint8_t *additional_data, size_t additional_data_length, + const uint8_t *ciphertext, size_t ciphertext_length, + uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length); + +#endif /* PSA_CRYPTO_AEAD_H */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_cipher.c b/ext/opcua_client/mbedtls/library/psa_crypto_cipher.c new file mode 100644 index 0000000..173ca29 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_cipher.c @@ -0,0 +1,592 @@ +/* + * PSA cipher driver entry points + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PSA_CRYPTO_C) + +#include "psa_crypto_cipher.h" +#include "psa_crypto_core.h" +#include "psa_crypto_random_impl.h" + +#include "mbedtls/cipher.h" +#include "mbedtls/error.h" + +#include + +const mbedtls_cipher_info_t *mbedtls_cipher_info_from_psa( + psa_algorithm_t alg, + psa_key_type_t key_type, + size_t key_bits, + mbedtls_cipher_id_t *cipher_id) +{ + mbedtls_cipher_mode_t mode; + mbedtls_cipher_id_t cipher_id_tmp = MBEDTLS_CIPHER_ID_NONE; + + if (PSA_ALG_IS_AEAD(alg)) { + alg = PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg, 0); + } + + if (PSA_ALG_IS_CIPHER(alg) || PSA_ALG_IS_AEAD(alg)) { + switch (alg) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_STREAM_CIPHER) + case PSA_ALG_STREAM_CIPHER: + mode = MBEDTLS_MODE_STREAM; + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CTR) + case PSA_ALG_CTR: + mode = MBEDTLS_MODE_CTR; + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CFB) + case PSA_ALG_CFB: + mode = MBEDTLS_MODE_CFB; + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_OFB) + case PSA_ALG_OFB: + mode = MBEDTLS_MODE_OFB; + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_ECB_NO_PADDING) + case PSA_ALG_ECB_NO_PADDING: + mode = MBEDTLS_MODE_ECB; + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CBC_NO_PADDING) + case PSA_ALG_CBC_NO_PADDING: + mode = MBEDTLS_MODE_CBC; + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CBC_PKCS7) + case PSA_ALG_CBC_PKCS7: + mode = MBEDTLS_MODE_CBC; + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CCM) + case PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, 0): + mode = MBEDTLS_MODE_CCM; + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_GCM) + case PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_GCM, 0): + mode = MBEDTLS_MODE_GCM; + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CHACHA20_POLY1305) + case PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CHACHA20_POLY1305, 0): + mode = MBEDTLS_MODE_CHACHAPOLY; + break; +#endif + default: + return NULL; + } + } else if (alg == PSA_ALG_CMAC) { + mode = MBEDTLS_MODE_ECB; + } else { + return NULL; + } + + switch (key_type) { +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_AES) + case PSA_KEY_TYPE_AES: + cipher_id_tmp = MBEDTLS_CIPHER_ID_AES; + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ARIA) + case PSA_KEY_TYPE_ARIA: + cipher_id_tmp = MBEDTLS_CIPHER_ID_ARIA; + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES) + case PSA_KEY_TYPE_DES: + /* key_bits is 64 for Single-DES, 128 for two-key Triple-DES, + * and 192 for three-key Triple-DES. */ + if (key_bits == 64) { + cipher_id_tmp = MBEDTLS_CIPHER_ID_DES; + } else { + cipher_id_tmp = MBEDTLS_CIPHER_ID_3DES; + } + /* mbedtls doesn't recognize two-key Triple-DES as an algorithm, + * but two-key Triple-DES is functionally three-key Triple-DES + * with K1=K3, so that's how we present it to mbedtls. */ + if (key_bits == 128) { + key_bits = 192; + } + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_CAMELLIA) + case PSA_KEY_TYPE_CAMELLIA: + cipher_id_tmp = MBEDTLS_CIPHER_ID_CAMELLIA; + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ARC4) + case PSA_KEY_TYPE_ARC4: + cipher_id_tmp = MBEDTLS_CIPHER_ID_ARC4; + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_CHACHA20) + case PSA_KEY_TYPE_CHACHA20: + cipher_id_tmp = MBEDTLS_CIPHER_ID_CHACHA20; + break; +#endif + default: + return NULL; + } + if (cipher_id != NULL) { + *cipher_id = cipher_id_tmp; + } + + return mbedtls_cipher_info_from_values(cipher_id_tmp, + (int) key_bits, mode); +} + +#if defined(MBEDTLS_PSA_BUILTIN_CIPHER) + +static psa_status_t psa_cipher_setup( + mbedtls_psa_cipher_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, + mbedtls_operation_t cipher_operation) +{ + int ret = 0; + size_t key_bits; + const mbedtls_cipher_info_t *cipher_info = NULL; + psa_key_type_t key_type = attributes->core.type; + + (void) key_buffer_size; + + mbedtls_cipher_init(&operation->ctx.cipher); + + operation->alg = alg; + key_bits = attributes->core.bits; + cipher_info = mbedtls_cipher_info_from_psa(alg, key_type, + key_bits, NULL); + if (cipher_info == NULL) { + return PSA_ERROR_NOT_SUPPORTED; + } + + ret = mbedtls_cipher_setup(&operation->ctx.cipher, cipher_info); + if (ret != 0) { + goto exit; + } + +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_DES) + if (key_type == PSA_KEY_TYPE_DES && key_bits == 128) { + /* Two-key Triple-DES is 3-key Triple-DES with K1=K3 */ + uint8_t keys[24]; + memcpy(keys, key_buffer, 16); + memcpy(keys + 16, key_buffer, 8); + ret = mbedtls_cipher_setkey(&operation->ctx.cipher, + keys, + 192, cipher_operation); + } else +#endif + { + ret = mbedtls_cipher_setkey(&operation->ctx.cipher, key_buffer, + (int) key_bits, cipher_operation); + } + if (ret != 0) { + goto exit; + } + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CBC_NO_PADDING) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_CBC_PKCS7) + switch (alg) { + case PSA_ALG_CBC_NO_PADDING: + ret = mbedtls_cipher_set_padding_mode(&operation->ctx.cipher, + MBEDTLS_PADDING_NONE); + break; + case PSA_ALG_CBC_PKCS7: + ret = mbedtls_cipher_set_padding_mode(&operation->ctx.cipher, + MBEDTLS_PADDING_PKCS7); + break; + default: + /* The algorithm doesn't involve padding. */ + ret = 0; + break; + } + if (ret != 0) { + goto exit; + } +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CBC_NO_PADDING || + MBEDTLS_PSA_BUILTIN_ALG_CBC_PKCS7 */ + + operation->block_length = (PSA_ALG_IS_STREAM_CIPHER(alg) ? 1 : + PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type)); + operation->iv_length = PSA_CIPHER_IV_LENGTH(key_type, alg); + +exit: + return mbedtls_to_psa_error(ret); +} + +psa_status_t mbedtls_psa_cipher_encrypt_setup( + mbedtls_psa_cipher_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg) +{ + return psa_cipher_setup(operation, attributes, + key_buffer, key_buffer_size, + alg, MBEDTLS_ENCRYPT); +} + +psa_status_t mbedtls_psa_cipher_decrypt_setup( + mbedtls_psa_cipher_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg) +{ + return psa_cipher_setup(operation, attributes, + key_buffer, key_buffer_size, + alg, MBEDTLS_DECRYPT); +} + +psa_status_t mbedtls_psa_cipher_set_iv( + mbedtls_psa_cipher_operation_t *operation, + const uint8_t *iv, size_t iv_length) +{ + if (iv_length != operation->iv_length) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + return mbedtls_to_psa_error( + mbedtls_cipher_set_iv(&operation->ctx.cipher, + iv, iv_length)); +} + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_ECB_NO_PADDING) +/** Process input for which the algorithm is set to ECB mode. + * + * This requires manual processing, since the PSA API is defined as being + * able to process arbitrary-length calls to psa_cipher_update() with ECB mode, + * but the underlying mbedtls_cipher_update only takes full blocks. + * + * \param ctx The mbedtls cipher context to use. It must have been + * set up for ECB. + * \param[in] input The input plaintext or ciphertext to process. + * \param input_length The number of bytes to process from \p input. + * This does not need to be aligned to a block boundary. + * If there is a partial block at the end of the input, + * it is stored in \p ctx for future processing. + * \param output The buffer where the output is written. It must be + * at least `BS * floor((p + input_length) / BS)` bytes + * long, where `p` is the number of bytes in the + * unprocessed partial block in \p ctx (with + * `0 <= p <= BS - 1`) and `BS` is the block size. + * \param output_length On success, the number of bytes written to \p output. + * \c 0 on error. + * + * \return #PSA_SUCCESS or an error from a hardware accelerator + */ +static psa_status_t psa_cipher_update_ecb( + mbedtls_cipher_context_t *ctx, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t *output_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + size_t block_size = ctx->cipher_info->block_size; + size_t internal_output_length = 0; + *output_length = 0; + + if (input_length == 0) { + status = PSA_SUCCESS; + goto exit; + } + + if (ctx->unprocessed_len > 0) { + /* Fill up to block size, and run the block if there's a full one. */ + size_t bytes_to_copy = block_size - ctx->unprocessed_len; + + if (input_length < bytes_to_copy) { + bytes_to_copy = input_length; + } + + memcpy(&(ctx->unprocessed_data[ctx->unprocessed_len]), + input, bytes_to_copy); + input_length -= bytes_to_copy; + input += bytes_to_copy; + ctx->unprocessed_len += bytes_to_copy; + + if (ctx->unprocessed_len == block_size) { + status = mbedtls_to_psa_error( + mbedtls_cipher_update(ctx, + ctx->unprocessed_data, + block_size, + output, &internal_output_length)); + + if (status != PSA_SUCCESS) { + goto exit; + } + + output += internal_output_length; + *output_length += internal_output_length; + ctx->unprocessed_len = 0; + } + } + + while (input_length >= block_size) { + /* Run all full blocks we have, one by one */ + status = mbedtls_to_psa_error( + mbedtls_cipher_update(ctx, input, + block_size, + output, &internal_output_length)); + + if (status != PSA_SUCCESS) { + goto exit; + } + + input_length -= block_size; + input += block_size; + + output += internal_output_length; + *output_length += internal_output_length; + } + + if (input_length > 0) { + /* Save unprocessed bytes for later processing */ + memcpy(&(ctx->unprocessed_data[ctx->unprocessed_len]), + input, input_length); + ctx->unprocessed_len += input_length; + } + + status = PSA_SUCCESS; + +exit: + return status; +} +#endif /* MBEDTLS_PSA_BUILTIN_ALG_ECB_NO_PADDING */ + +psa_status_t mbedtls_psa_cipher_update( + mbedtls_psa_cipher_operation_t *operation, + const uint8_t *input, size_t input_length, + uint8_t *output, size_t output_size, size_t *output_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + size_t expected_output_size; + + if (!PSA_ALG_IS_STREAM_CIPHER(operation->alg)) { + /* Take the unprocessed partial block left over from previous + * update calls, if any, plus the input to this call. Remove + * the last partial block, if any. You get the data that will be + * output in this call. */ + expected_output_size = + (operation->ctx.cipher.unprocessed_len + input_length) + / operation->block_length * operation->block_length; + } else { + expected_output_size = input_length; + } + + if (output_size < expected_output_size) { + return PSA_ERROR_BUFFER_TOO_SMALL; + } + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_ECB_NO_PADDING) + if (operation->alg == PSA_ALG_ECB_NO_PADDING) { + /* mbedtls_cipher_update has an API inconsistency: it will only + * process a single block at a time in ECB mode. Abstract away that + * inconsistency here to match the PSA API behaviour. */ + status = psa_cipher_update_ecb(&operation->ctx.cipher, + input, + input_length, + output, + output_length); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_ECB_NO_PADDING */ + if (input_length == 0) { + /* There is no input, nothing to be done */ + *output_length = 0; + status = PSA_SUCCESS; + } else { + status = mbedtls_to_psa_error( + mbedtls_cipher_update(&operation->ctx.cipher, input, + input_length, output, output_length)); + + if (*output_length > output_size) { + return PSA_ERROR_CORRUPTION_DETECTED; + } + } + + return status; +} + +psa_status_t mbedtls_psa_cipher_finish( + mbedtls_psa_cipher_operation_t *operation, + uint8_t *output, size_t output_size, size_t *output_length) +{ + psa_status_t status = PSA_ERROR_GENERIC_ERROR; + uint8_t temp_output_buffer[MBEDTLS_MAX_BLOCK_LENGTH]; + + if (operation->ctx.cipher.unprocessed_len != 0) { + if (operation->alg == PSA_ALG_ECB_NO_PADDING || + operation->alg == PSA_ALG_CBC_NO_PADDING) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + } + + status = mbedtls_to_psa_error( + mbedtls_cipher_finish(&operation->ctx.cipher, + temp_output_buffer, + output_length)); + if (status != PSA_SUCCESS) { + goto exit; + } + + if (*output_length == 0) { + ; /* Nothing to copy. Note that output may be NULL in this case. */ + } else if (output_size >= *output_length) { + memcpy(output, temp_output_buffer, *output_length); + } else { + status = PSA_ERROR_BUFFER_TOO_SMALL; + } + +exit: + mbedtls_platform_zeroize(temp_output_buffer, + sizeof(temp_output_buffer)); + + return status; +} + +psa_status_t mbedtls_psa_cipher_abort( + mbedtls_psa_cipher_operation_t *operation) +{ + /* Sanity check (shouldn't happen: operation->alg should + * always have been initialized to a valid value). */ + if (!PSA_ALG_IS_CIPHER(operation->alg)) { + return PSA_ERROR_BAD_STATE; + } + + mbedtls_cipher_free(&operation->ctx.cipher); + + return PSA_SUCCESS; +} + +psa_status_t mbedtls_psa_cipher_encrypt(const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *iv, + size_t iv_length, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + mbedtls_psa_cipher_operation_t operation = MBEDTLS_PSA_CIPHER_OPERATION_INIT; + size_t update_output_length, finish_output_length; + + status = mbedtls_psa_cipher_encrypt_setup(&operation, attributes, + key_buffer, key_buffer_size, + alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + if (iv_length > 0) { + status = mbedtls_psa_cipher_set_iv(&operation, iv, iv_length); + if (status != PSA_SUCCESS) { + goto exit; + } + } + + status = mbedtls_psa_cipher_update(&operation, input, input_length, + output, output_size, &update_output_length); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = mbedtls_psa_cipher_finish( + &operation, + mbedtls_buffer_offset(output, update_output_length), + output_size - update_output_length, &finish_output_length); + if (status != PSA_SUCCESS) { + goto exit; + } + + *output_length = update_output_length + finish_output_length; + +exit: + if (status == PSA_SUCCESS) { + status = mbedtls_psa_cipher_abort(&operation); + } else { + mbedtls_psa_cipher_abort(&operation); + } + + return status; +} + +psa_status_t mbedtls_psa_cipher_decrypt( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + mbedtls_psa_cipher_operation_t operation = MBEDTLS_PSA_CIPHER_OPERATION_INIT; + size_t olength, accumulated_length; + + status = mbedtls_psa_cipher_decrypt_setup(&operation, attributes, + key_buffer, key_buffer_size, + alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + if (operation.iv_length > 0) { + status = mbedtls_psa_cipher_set_iv(&operation, + input, operation.iv_length); + if (status != PSA_SUCCESS) { + goto exit; + } + } + + status = mbedtls_psa_cipher_update( + &operation, + mbedtls_buffer_offset_const(input, operation.iv_length), + input_length - operation.iv_length, + output, output_size, &olength); + if (status != PSA_SUCCESS) { + goto exit; + } + + accumulated_length = olength; + + status = mbedtls_psa_cipher_finish( + &operation, + mbedtls_buffer_offset(output, accumulated_length), + output_size - accumulated_length, &olength); + if (status != PSA_SUCCESS) { + goto exit; + } + + *output_length = accumulated_length + olength; + +exit: + if (status == PSA_SUCCESS) { + status = mbedtls_psa_cipher_abort(&operation); + } else { + mbedtls_psa_cipher_abort(&operation); + } + + return status; +} +#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */ + +#endif /* MBEDTLS_PSA_CRYPTO_C */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_cipher.h b/ext/opcua_client/mbedtls/library/psa_crypto_cipher.h new file mode 100644 index 0000000..2478d58 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_cipher.h @@ -0,0 +1,293 @@ +/* + * PSA cipher driver entry points and associated auxiliary functions + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_CIPHER_H +#define PSA_CRYPTO_CIPHER_H + +#include +#include + +/** Get Mbed TLS cipher information given the cipher algorithm PSA identifier + * as well as the PSA type and size of the key to be used with the cipher + * algorithm. + * + * \param alg PSA cipher algorithm identifier + * \param key_type PSA key type + * \param key_bits Size of the key in bits + * \param[out] cipher_id Mbed TLS cipher algorithm identifier + * + * \return The Mbed TLS cipher information of the cipher algorithm. + * \c NULL if the PSA cipher algorithm is not supported. + */ +const mbedtls_cipher_info_t *mbedtls_cipher_info_from_psa( + psa_algorithm_t alg, psa_key_type_t key_type, size_t key_bits, + mbedtls_cipher_id_t *cipher_id); + +/** + * \brief Set the key for a multipart symmetric encryption operation. + * + * \note The signature of this function is that of a PSA driver + * cipher_encrypt_setup entry point. This function behaves as a + * cipher_encrypt_setup entry point as defined in the PSA driver + * interface specification for transparent drivers. + * + * \param[in,out] operation The operation object to set up. It has been + * initialized as per the documentation for + * #psa_cipher_operation_t and not yet in use. + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg The cipher algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_cipher_encrypt_setup( + mbedtls_psa_cipher_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg); + +/** + * \brief Set the key for a multipart symmetric decryption operation. + * + * \note The signature of this function is that of a PSA driver + * cipher_decrypt_setup entry point. This function behaves as a + * cipher_decrypt_setup entry point as defined in the PSA driver + * interface specification for transparent drivers. + * + * \param[in,out] operation The operation object to set up. It has been + * initialized as per the documentation for + * #psa_cipher_operation_t and not yet in use. + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg The cipher algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_cipher_decrypt_setup( + mbedtls_psa_cipher_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg); + +/** Set the IV for a symmetric encryption or decryption operation. + * + * This function sets the IV (initialization vector), nonce + * or initial counter value for the encryption or decryption operation. + * + * \note The signature of this function is that of a PSA driver + * cipher_set_iv entry point. This function behaves as a + * cipher_set_iv entry point as defined in the PSA driver + * interface specification for transparent drivers. + * + * \param[in,out] operation Active cipher operation. + * \param[in] iv Buffer containing the IV to use. + * \param[in] iv_length Size of the IV in bytes. It is guaranteed by + * the core to be less or equal to + * PSA_CIPHER_IV_MAX_SIZE. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The size of \p iv is not acceptable for the chosen algorithm, + * or the chosen algorithm does not use an IV. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t mbedtls_psa_cipher_set_iv( + mbedtls_psa_cipher_operation_t *operation, + const uint8_t *iv, size_t iv_length); + +/** Encrypt or decrypt a message fragment in an active cipher operation. + * + * \note The signature of this function is that of a PSA driver + * cipher_update entry point. This function behaves as a + * cipher_update entry point as defined in the PSA driver + * interface specification for transparent drivers. + * + * \param[in,out] operation Active cipher operation. + * \param[in] input Buffer containing the message fragment to + * encrypt or decrypt. + * \param[in] input_length Size of the \p input buffer in bytes. + * \param[out] output Buffer where the output is to be written. + * \param[in] output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t mbedtls_psa_cipher_update( + mbedtls_psa_cipher_operation_t *operation, + const uint8_t *input, size_t input_length, + uint8_t *output, size_t output_size, size_t *output_length); + +/** Finish encrypting or decrypting a message in a cipher operation. + * + * \note The signature of this function is that of a PSA driver + * cipher_finish entry point. This function behaves as a + * cipher_finish entry point as defined in the PSA driver + * interface specification for transparent drivers. + * + * \param[in,out] operation Active cipher operation. + * \param[out] output Buffer where the output is to be written. + * \param[in] output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total input size passed to this operation is not valid for + * this particular algorithm. For example, the algorithm is a based + * on block cipher and requires a whole number of blocks, but the + * total input size is not a multiple of the block size. + * \retval #PSA_ERROR_INVALID_PADDING + * This is a decryption operation for an algorithm that includes + * padding, and the ciphertext does not contain valid padding. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t mbedtls_psa_cipher_finish( + mbedtls_psa_cipher_operation_t *operation, + uint8_t *output, size_t output_size, size_t *output_length); + +/** Abort a cipher operation. + * + * Aborting an operation frees all associated resources except for the + * \p operation structure itself. Once aborted, the operation object + * can be reused for another operation. + * + * \note The signature of this function is that of a PSA driver + * cipher_abort entry point. This function behaves as a + * cipher_abort entry point as defined in the PSA driver + * interface specification for transparent drivers. + * + * \param[in,out] operation Initialized cipher operation. + * + * \retval #PSA_SUCCESS \emptydescription + */ +psa_status_t mbedtls_psa_cipher_abort(mbedtls_psa_cipher_operation_t *operation); + +/** Encrypt a message using a symmetric cipher. + * + * \note The signature of this function is that of a PSA driver + * cipher_encrypt entry point. This function behaves as a + * cipher_encrypt entry point as defined in the PSA driver + * interface specification for transparent drivers. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg The cipher algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * \param[in] iv Buffer containing the IV for encryption. The + * IV has been generated by the core. + * \param[in] iv_length Size of the \p iv in bytes. + * \param[in] input Buffer containing the message to encrypt. + * \param[in] input_length Size of the \p input buffer in bytes. + * \param[in,out] output Buffer where the output is to be written. + * \param[in] output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes that make up + * the returned output. Initialized to zero + * by the core. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The size \p iv_length is not acceptable for the chosen algorithm, + * or the chosen algorithm does not use an IV. + * The total input size passed to this operation is not valid for + * this particular algorithm. For example, the algorithm is a based + * on block cipher and requires a whole number of blocks, but the + * total input size is not a multiple of the block size. + * \retval #PSA_ERROR_INVALID_PADDING + * This is a decryption operation for an algorithm that includes + * padding, and the ciphertext does not contain valid padding. + */ +psa_status_t mbedtls_psa_cipher_encrypt(const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *iv, + size_t iv_length, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/** Decrypt a message using a symmetric cipher. + * + * \note The signature of this function is that of a PSA driver + * cipher_decrypt entry point. This function behaves as a + * cipher_decrypt entry point as defined in the PSA driver + * interface specification for transparent drivers. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg The cipher algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * \param[in] input Buffer containing the iv and the ciphertext. + * \param[in] input_length Size of the \p input buffer in bytes. + * \param[out] output Buffer where the output is to be written. + * \param[in] output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes that make up + * the returned output. Initialized to zero + * by the core. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The size of \p iv is not acceptable for the chosen algorithm, + * or the chosen algorithm does not use an IV. + * The total input size passed to this operation is not valid for + * this particular algorithm. For example, the algorithm is a based + * on block cipher and requires a whole number of blocks, but the + * total input size is not a multiple of the block size. + * \retval #PSA_ERROR_INVALID_PADDING + * This is a decryption operation for an algorithm that includes + * padding, and the ciphertext does not contain valid padding. + */ +psa_status_t mbedtls_psa_cipher_decrypt(const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +#endif /* PSA_CRYPTO_CIPHER_H */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_client.c b/ext/opcua_client/mbedtls/library/psa_crypto_client.c new file mode 100644 index 0000000..564463f --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_client.c @@ -0,0 +1,67 @@ +/* + * PSA crypto client code + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" +#include "psa/crypto.h" + +#if defined(MBEDTLS_PSA_CRYPTO_CLIENT) + +#include +#include "mbedtls/platform.h" + +void psa_reset_key_attributes(psa_key_attributes_t *attributes) +{ + mbedtls_free(attributes->domain_parameters); + memset(attributes, 0, sizeof(*attributes)); +} + +psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes, + psa_key_type_t type, + const uint8_t *data, + size_t data_length) +{ + uint8_t *copy = NULL; + + if (data_length != 0) { + copy = mbedtls_calloc(1, data_length); + if (copy == NULL) { + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + memcpy(copy, data, data_length); + } + /* After this point, this function is guaranteed to succeed, so it + * can start modifying `*attributes`. */ + + if (attributes->domain_parameters != NULL) { + mbedtls_free(attributes->domain_parameters); + attributes->domain_parameters = NULL; + attributes->domain_parameters_size = 0; + } + + attributes->domain_parameters = copy; + attributes->domain_parameters_size = data_length; + attributes->core.type = type; + return PSA_SUCCESS; +} + +psa_status_t psa_get_key_domain_parameters( + const psa_key_attributes_t *attributes, + uint8_t *data, size_t data_size, size_t *data_length) +{ + if (attributes->domain_parameters_size > data_size) { + return PSA_ERROR_BUFFER_TOO_SMALL; + } + *data_length = attributes->domain_parameters_size; + if (attributes->domain_parameters_size != 0) { + memcpy(data, attributes->domain_parameters, + attributes->domain_parameters_size); + } + return PSA_SUCCESS; +} + +#endif /* MBEDTLS_PSA_CRYPTO_CLIENT */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_core.h b/ext/opcua_client/mbedtls/library/psa_crypto_core.h new file mode 100644 index 0000000..4731064 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_core.h @@ -0,0 +1,576 @@ +/* + * PSA crypto core internal interfaces + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_CORE_H +#define PSA_CRYPTO_CORE_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "psa/crypto.h" +#include "psa/crypto_se_driver.h" + +/** Constant-time buffer comparison + * + * \param[in] a Left-hand buffer for comparison. + * \param[in] b Right-hand buffer for comparison. + * \param n Amount of bytes to compare. + * + * \return 0 if the buffer contents are equal, non-zero otherwise + */ +static inline int mbedtls_psa_safer_memcmp( + const uint8_t *a, const uint8_t *b, size_t n) +{ + size_t i; + unsigned char diff = 0; + + for (i = 0; i < n; i++) { + diff |= a[i] ^ b[i]; + } + + return diff; +} + +/** The data structure representing a key slot, containing key material + * and metadata for one key. + */ +typedef struct { + psa_core_key_attributes_t attr; + + /* + * Number of locks on the key slot held by the library. + * + * This counter is incremented by one each time a library function + * retrieves through one of the dedicated internal API a pointer to the + * key slot. + * + * This counter is decremented by one each time a library function stops + * accessing the key slot and states it by calling the + * psa_unlock_key_slot() API. + * + * This counter is used to prevent resetting the key slot while the library + * may access it. For example, such control is needed in the following + * scenarios: + * . In case of key slot starvation, all key slots contain the description + * of a key, and the library asks for the description of a persistent + * key not present in the key slots, the key slots currently accessed by + * the library cannot be reclaimed to free a key slot to load the + * persistent key. + * . In case of a multi-threaded application where one thread asks to close + * or purge or destroy a key while it is in used by the library through + * another thread. + */ + size_t lock_count; + + /* Dynamically allocated key data buffer. + * Format as specified in psa_export_key(). */ + struct key_data { + uint8_t *data; + size_t bytes; + } key; +} psa_key_slot_t; + +/* A mask of key attribute flags used only internally. + * Currently there aren't any. */ +#define PSA_KA_MASK_INTERNAL_ONLY ( \ + 0) + +/** Test whether a key slot is occupied. + * + * A key slot is occupied iff the key type is nonzero. This works because + * no valid key can have 0 as its key type. + * + * \param[in] slot The key slot to test. + * + * \return 1 if the slot is occupied, 0 otherwise. + */ +static inline int psa_is_key_slot_occupied(const psa_key_slot_t *slot) +{ + return slot->attr.type != 0; +} + +/** Test whether a key slot is locked. + * + * A key slot is locked iff its lock counter is strictly greater than 0. + * + * \param[in] slot The key slot to test. + * + * \return 1 if the slot is locked, 0 otherwise. + */ +static inline int psa_is_key_slot_locked(const psa_key_slot_t *slot) +{ + return slot->lock_count > 0; +} + +/** Retrieve flags from psa_key_slot_t::attr::core::flags. + * + * \param[in] slot The key slot to query. + * \param mask The mask of bits to extract. + * + * \return The key attribute flags in the given slot, + * bitwise-anded with \p mask. + */ +static inline uint16_t psa_key_slot_get_flags(const psa_key_slot_t *slot, + uint16_t mask) +{ + return slot->attr.flags & mask; +} + +/** Set flags in psa_key_slot_t::attr::core::flags. + * + * \param[in,out] slot The key slot to modify. + * \param mask The mask of bits to modify. + * \param value The new value of the selected bits. + */ +static inline void psa_key_slot_set_flags(psa_key_slot_t *slot, + uint16_t mask, + uint16_t value) +{ + slot->attr.flags = ((~mask & slot->attr.flags) | + (mask & value)); +} + +/** Turn on flags in psa_key_slot_t::attr::core::flags. + * + * \param[in,out] slot The key slot to modify. + * \param mask The mask of bits to set. + */ +static inline void psa_key_slot_set_bits_in_flags(psa_key_slot_t *slot, + uint16_t mask) +{ + slot->attr.flags |= mask; +} + +/** Turn off flags in psa_key_slot_t::attr::core::flags. + * + * \param[in,out] slot The key slot to modify. + * \param mask The mask of bits to clear. + */ +static inline void psa_key_slot_clear_bits(psa_key_slot_t *slot, + uint16_t mask) +{ + slot->attr.flags &= ~mask; +} + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) +/** Get the SE slot number of a key from the key slot storing its description. + * + * \param[in] slot The key slot to query. This must be a key slot storing + * the description of a key of a dynamically registered + * secure element, otherwise the behaviour is undefined. + */ +static inline psa_key_slot_number_t psa_key_slot_get_slot_number( + const psa_key_slot_t *slot) +{ + return *((psa_key_slot_number_t *) (slot->key.data)); +} +#endif + +/** Completely wipe a slot in memory, including its policy. + * + * Persistent storage is not affected. + * + * \param[in,out] slot The key slot to wipe. + * + * \retval #PSA_SUCCESS + * Success. This includes the case of a key slot that was + * already fully wiped. + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t psa_wipe_key_slot(psa_key_slot_t *slot); + +/** Try to allocate a buffer to an empty key slot. + * + * \param[in,out] slot Key slot to attach buffer to. + * \param[in] buffer_length Requested size of the buffer. + * + * \retval #PSA_SUCCESS + * The buffer has been successfully allocated. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * Not enough memory was available for allocation. + * \retval #PSA_ERROR_ALREADY_EXISTS + * Trying to allocate a buffer to a non-empty key slot. + */ +psa_status_t psa_allocate_buffer_to_slot(psa_key_slot_t *slot, + size_t buffer_length); + +/** Wipe key data from a slot. Preserves metadata such as the policy. */ +psa_status_t psa_remove_key_data_from_memory(psa_key_slot_t *slot); + +/** Copy key data (in export format) into an empty key slot. + * + * This function assumes that the slot does not contain + * any key material yet. On failure, the slot content is unchanged. + * + * \param[in,out] slot Key slot to copy the key into. + * \param[in] data Buffer containing the key material. + * \param data_length Size of the key buffer. + * + * \retval #PSA_SUCCESS + * The key has been copied successfully. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * Not enough memory was available for allocation of the + * copy buffer. + * \retval #PSA_ERROR_ALREADY_EXISTS + * There was other key material already present in the slot. + */ +psa_status_t psa_copy_key_material_into_slot(psa_key_slot_t *slot, + const uint8_t *data, + size_t data_length); + +/** Convert an Mbed TLS error code to a PSA error code + * + * \note This function is provided solely for the convenience of + * Mbed TLS and may be removed at any time without notice. + * + * \param ret An Mbed TLS-thrown error code + * + * \return The corresponding PSA error code + */ +psa_status_t mbedtls_to_psa_error(int ret); + +/** Import a key in binary format. + * + * \note The signature of this function is that of a PSA driver + * import_key entry point. This function behaves as an import_key + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes for the key to import. + * \param[in] data The buffer containing the key data in import + * format. + * \param[in] data_length Size of the \p data buffer in bytes. + * \param[out] key_buffer The buffer to contain the key data in output + * format upon successful return. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. This + * size is greater or equal to \p data_length. + * \param[out] key_buffer_length The length of the data written in \p + * key_buffer in bytes. + * \param[out] bits The key size in number of bits. + * + * \retval #PSA_SUCCESS The key was imported successfully. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The key data is not correctly formatted. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t psa_import_key_into_slot( + const psa_key_attributes_t *attributes, + const uint8_t *data, size_t data_length, + uint8_t *key_buffer, size_t key_buffer_size, + size_t *key_buffer_length, size_t *bits); + +/** Export a key in binary format + * + * \note The signature of this function is that of a PSA driver export_key + * entry point. This function behaves as an export_key entry point as + * defined in the PSA driver interface specification. + * + * \param[in] attributes The attributes for the key to export. + * \param[in] key_buffer Material or context of the key to export. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[out] data Buffer where the key data is to be written. + * \param[in] data_size Size of the \p data buffer in bytes. + * \param[out] data_length On success, the number of bytes written in + * \p data + * + * \retval #PSA_SUCCESS The key was exported successfully. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t psa_export_key_internal( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + uint8_t *data, size_t data_size, size_t *data_length); + +/** Export a public key or the public part of a key pair in binary format. + * + * \note The signature of this function is that of a PSA driver + * export_public_key entry point. This function behaves as an + * export_public_key entry point as defined in the PSA driver interface + * specification. + * + * \param[in] attributes The attributes for the key to export. + * \param[in] key_buffer Material or context of the key to export. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[out] data Buffer where the key data is to be written. + * \param[in] data_size Size of the \p data buffer in bytes. + * \param[out] data_length On success, the number of bytes written in + * \p data + * + * \retval #PSA_SUCCESS The public key was exported successfully. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t psa_export_public_key_internal( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + uint8_t *data, size_t data_size, size_t *data_length); + +/** + * \brief Generate a key. + * + * \note The signature of the function is that of a PSA driver generate_key + * entry point. + * + * \param[in] attributes The attributes for the key to generate. + * \param[out] key_buffer Buffer where the key data is to be written. + * \param[in] key_buffer_size Size of \p key_buffer in bytes. + * \param[out] key_buffer_length On success, the number of bytes written in + * \p key_buffer. + * + * \retval #PSA_SUCCESS + * The key was generated successfully. + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_NOT_SUPPORTED + * Key size in bits or type not supported. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of \p key_buffer is too small. + */ +psa_status_t psa_generate_key_internal(const psa_key_attributes_t *attributes, + uint8_t *key_buffer, + size_t key_buffer_size, + size_t *key_buffer_length); + +/** Sign a message with a private key. For hash-and-sign algorithms, + * this includes the hashing step. + * + * \note The signature of this function is that of a PSA driver + * sign_message entry point. This function behaves as a sign_message + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \note This function will call the driver for psa_sign_hash + * and go through driver dispatch again. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg A signature algorithm that is compatible with + * the type of the key. + * \param[in] input The input message to sign. + * \param[in] input_length Size of the \p input buffer in bytes. + * \param[out] signature Buffer where the signature is to be written. + * \param[in] signature_size Size of the \p signature buffer in bytes. + * \param[out] signature_length On success, the number of bytes + * that make up the returned signature value. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p signature buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg) + * where \c key_type and \c key_bits are the type and bit-size + * respectively of the key. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + */ +psa_status_t psa_sign_message_builtin( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *input, size_t input_length, + uint8_t *signature, size_t signature_size, size_t *signature_length); + +/** Verify the signature of a message with a public key, using + * a hash-and-sign verification algorithm. + * + * \note The signature of this function is that of a PSA driver + * verify_message entry point. This function behaves as a verify_message + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \note This function will call the driver for psa_verify_hash + * and go through driver dispatch again. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg A signature algorithm that is compatible with + * the type of the key. + * \param[in] input The message whose signature is to be verified. + * \param[in] input_length Size of the \p input buffer in bytes. + * \param[in] signature Buffer containing the signature to verify. + * \param[in] signature_length Size of the \p signature buffer in bytes. + * + * \retval #PSA_SUCCESS + * The signature is valid. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The calculation was performed successfully, but the passed + * signature is not a valid signature. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t psa_verify_message_builtin( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *input, size_t input_length, + const uint8_t *signature, size_t signature_length); + +/** Sign an already-calculated hash with a private key. + * + * \note The signature of this function is that of a PSA driver + * sign_hash entry point. This function behaves as a sign_hash + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg A signature algorithm that is compatible with + * the type of the key. + * \param[in] hash The hash or message to sign. + * \param[in] hash_length Size of the \p hash buffer in bytes. + * \param[out] signature Buffer where the signature is to be written. + * \param[in] signature_size Size of the \p signature buffer in bytes. + * \param[out] signature_length On success, the number of bytes + * that make up the returned signature value. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p signature buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg) + * where \c key_type and \c key_bits are the type and bit-size + * respectively of the key. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + */ +psa_status_t psa_sign_hash_builtin( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + uint8_t *signature, size_t signature_size, size_t *signature_length); + +/** + * \brief Verify the signature a hash or short message using a public key. + * + * \note The signature of this function is that of a PSA driver + * verify_hash entry point. This function behaves as a verify_hash + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg A signature algorithm that is compatible with + * the type of the key. + * \param[in] hash The hash or message whose signature is to be + * verified. + * \param[in] hash_length Size of the \p hash buffer in bytes. + * \param[in] signature Buffer containing the signature to verify. + * \param[in] signature_length Size of the \p signature buffer in bytes. + * + * \retval #PSA_SUCCESS + * The signature is valid. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The calculation was performed successfully, but the passed + * signature is not a valid signature. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t psa_verify_hash_builtin( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + const uint8_t *signature, size_t signature_length); + +typedef struct psa_crypto_local_input_s { + uint8_t *buffer; + size_t length; +} psa_crypto_local_input_t; + +#define PSA_CRYPTO_LOCAL_INPUT_INIT ((psa_crypto_local_input_t) { NULL, 0 }) + +/** Allocate a local copy of an input buffer and copy the contents into it. + * + * \param[in] input Pointer to input buffer. + * \param[in] input_len Length of the input buffer. + * \param[out] local_input Pointer to a psa_crypto_local_input_t struct + * containing a local input copy. + * \return #PSA_SUCCESS, if the buffer was successfully + * copied. + * \return #PSA_ERROR_INSUFFICIENT_MEMORY, if a copy of + * the buffer cannot be allocated. + */ +psa_status_t psa_crypto_local_input_alloc(const uint8_t *input, size_t input_len, + psa_crypto_local_input_t *local_input); + +/** Free a local copy of an input buffer. + * + * \param[in] local_input Pointer to a psa_crypto_local_input_t struct + * populated by a previous call to + * psa_crypto_local_input_alloc(). + */ +void psa_crypto_local_input_free(psa_crypto_local_input_t *local_input); + +typedef struct psa_crypto_local_output_s { + uint8_t *original; + uint8_t *buffer; + size_t length; +} psa_crypto_local_output_t; + +#define PSA_CRYPTO_LOCAL_OUTPUT_INIT ((psa_crypto_local_output_t) { NULL, NULL, 0 }) + +/** Allocate a local copy of an output buffer. + * + * \note This does not copy any data from the original + * output buffer but only allocates a buffer + * whose contents will be copied back to the + * original in a future call to + * psa_crypto_local_output_free(). + * + * \param[in] output Pointer to output buffer. + * \param[in] output_len Length of the output buffer. + * \param[out] local_output Pointer to a psa_crypto_local_output_t struct to + * populate with the local output copy. + * \return #PSA_SUCCESS, if the buffer was successfully + * copied. + * \return #PSA_ERROR_INSUFFICIENT_MEMORY, if a copy of + * the buffer cannot be allocated. + */ +psa_status_t psa_crypto_local_output_alloc(uint8_t *output, size_t output_len, + psa_crypto_local_output_t *local_output); + +/** Copy from a local copy of an output buffer back to the original, then + * free the local copy. + * + * \param[in] local_output Pointer to a psa_crypto_local_output_t struct + * populated by a previous call to + * psa_crypto_local_output_alloc(). + * \return #PSA_SUCCESS, if the local output was + * successfully copied back to the original. + * \return #PSA_ERROR_CORRUPTION_DETECTED, if the output + * could not be copied back to the original. + */ +psa_status_t psa_crypto_local_output_free(psa_crypto_local_output_t *local_output); + +#endif /* PSA_CRYPTO_CORE_H */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_driver_wrappers.c b/ext/opcua_client/mbedtls/library/psa_crypto_driver_wrappers.c new file mode 100644 index 0000000..196cd2e --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_driver_wrappers.c @@ -0,0 +1,1856 @@ +/* + * Functions to delegate cryptographic operations to an available + * and appropriate accelerator. + * Warning: This file will be auto-generated in the future. + */ +/* Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "psa_crypto_aead.h" +#include "psa_crypto_cipher.h" +#include "psa_crypto_core.h" +#include "psa_crypto_driver_wrappers.h" +#include "psa_crypto_hash.h" +#include "psa_crypto_mac.h" + +#include "mbedtls/platform.h" + +#if defined(MBEDTLS_PSA_CRYPTO_C) + +#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS) + +/* Include test driver definition when running tests */ +#if defined(PSA_CRYPTO_DRIVER_TEST) +#ifndef PSA_CRYPTO_DRIVER_PRESENT +#define PSA_CRYPTO_DRIVER_PRESENT +#endif +#ifndef PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT +#define PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT +#endif +#include "test/drivers/test_driver.h" +#endif /* PSA_CRYPTO_DRIVER_TEST */ + +/* Repeat above block for each JSON-declared driver during autogeneration */ +#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */ + +/* Auto-generated values depending on which drivers are registered. + * ID 0 is reserved for unallocated operations. + * ID 1 is reserved for the Mbed TLS software driver. */ +#define PSA_CRYPTO_MBED_TLS_DRIVER_ID (1) + +#if defined(PSA_CRYPTO_DRIVER_TEST) +#define PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID (2) +#define PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID (3) +#endif /* PSA_CRYPTO_DRIVER_TEST */ + +/* Support the 'old' SE interface when asked to */ +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) +/* PSA_CRYPTO_DRIVER_PRESENT is defined when either a new-style or old-style + * SE driver is present, to avoid unused argument errors at compile time. */ +#ifndef PSA_CRYPTO_DRIVER_PRESENT +#define PSA_CRYPTO_DRIVER_PRESENT +#endif +#include "psa_crypto_se.h" +#endif + +psa_status_t psa_driver_wrapper_init(void) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + status = psa_init_all_se_drivers(); + if (status != PSA_SUCCESS) { + return status; + } +#endif + +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_init(); + if (status != PSA_SUCCESS) { + return status; + } + + status = mbedtls_test_opaque_init(); + if (status != PSA_SUCCESS) { + return status; + } +#endif + + (void) status; + return PSA_SUCCESS; +} + +void psa_driver_wrapper_free(void) +{ +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + /* Unregister all secure element drivers, so that we restart from + * a pristine state. */ + psa_unregister_all_se_drivers(); +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + +#if defined(PSA_CRYPTO_DRIVER_TEST) + mbedtls_test_transparent_free(); + mbedtls_test_opaque_free(); +#endif +} + +/* Start delegation functions */ +psa_status_t psa_driver_wrapper_sign_message( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *signature, + size_t signature_size, + size_t *signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_signature_sign_message( + attributes, + key_buffer, + key_buffer_size, + alg, + input, + input_length, + signature, + signature_size, + signature_length); + /* Declared with fallback == true */ + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + break; + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + status = mbedtls_test_opaque_signature_sign_message( + attributes, + key_buffer, + key_buffer_size, + alg, + input, + input_length, + signature, + signature_size, + signature_length); + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } + break; +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + /* Key is declared with a lifetime not known to us */ + (void) status; + break; + } + + return psa_sign_message_builtin(attributes, + key_buffer, + key_buffer_size, + alg, + input, + input_length, + signature, + signature_size, + signature_length); +} + +psa_status_t psa_driver_wrapper_verify_message( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *signature, + size_t signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_signature_verify_message( + attributes, + key_buffer, + key_buffer_size, + alg, + input, + input_length, + signature, + signature_length); + /* Declared with fallback == true */ + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + break; + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + return mbedtls_test_opaque_signature_verify_message( + attributes, + key_buffer, + key_buffer_size, + alg, + input, + input_length, + signature, + signature_length); + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } + break; +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + /* Key is declared with a lifetime not known to us */ + (void) status; + break; + } + + return psa_verify_message_builtin(attributes, + key_buffer, + key_buffer_size, + alg, + input, + input_length, + signature, + signature_length); +} + +psa_status_t psa_driver_wrapper_sign_hash( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + uint8_t *signature, size_t signature_size, size_t *signature_length) +{ + /* Try dynamically-registered SE interface first */ +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + const psa_drv_se_t *drv; + psa_drv_se_context_t *drv_context; + + if (psa_get_se_driver(attributes->core.lifetime, &drv, &drv_context)) { + if (drv->asymmetric == NULL || + drv->asymmetric->p_sign == NULL) { + /* Key is defined in SE, but we have no way to exercise it */ + return PSA_ERROR_NOT_SUPPORTED; + } + return drv->asymmetric->p_sign( + drv_context, *((psa_key_slot_number_t *) key_buffer), + alg, hash, hash_length, + signature, signature_size, signature_length); + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_signature_sign_hash(attributes, + key_buffer, + key_buffer_size, + alg, + hash, + hash_length, + signature, + signature_size, + signature_length); + /* Declared with fallback == true */ + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + /* Fell through, meaning no accelerator supports this operation */ + return psa_sign_hash_builtin(attributes, + key_buffer, + key_buffer_size, + alg, + hash, + hash_length, + signature, + signature_size, + signature_length); + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + return mbedtls_test_opaque_signature_sign_hash(attributes, + key_buffer, + key_buffer_size, + alg, + hash, + hash_length, + signature, + signature_size, + signature_length); +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + /* Key is declared with a lifetime not known to us */ + (void) status; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +psa_status_t psa_driver_wrapper_verify_hash( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + const uint8_t *signature, size_t signature_length) +{ + /* Try dynamically-registered SE interface first */ +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + const psa_drv_se_t *drv; + psa_drv_se_context_t *drv_context; + + if (psa_get_se_driver(attributes->core.lifetime, &drv, &drv_context)) { + if (drv->asymmetric == NULL || + drv->asymmetric->p_verify == NULL) { + /* Key is defined in SE, but we have no way to exercise it */ + return PSA_ERROR_NOT_SUPPORTED; + } + return drv->asymmetric->p_verify( + drv_context, *((psa_key_slot_number_t *) key_buffer), + alg, hash, hash_length, + signature, signature_length); + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_signature_verify_hash( + attributes, + key_buffer, + key_buffer_size, + alg, + hash, + hash_length, + signature, + signature_length); + /* Declared with fallback == true */ + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + + return psa_verify_hash_builtin(attributes, + key_buffer, + key_buffer_size, + alg, + hash, + hash_length, + signature, + signature_length); + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + return mbedtls_test_opaque_signature_verify_hash(attributes, + key_buffer, + key_buffer_size, + alg, + hash, + hash_length, + signature, + signature_length); +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + /* Key is declared with a lifetime not known to us */ + (void) status; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +/** Get the key buffer size required to store the key material of a key + * associated with an opaque driver without storage. + * + * \param[in] attributes The key attributes. + * \param[out] key_buffer_size Minimum buffer size to contain the key material + * + * \retval #PSA_SUCCESS + * The minimum size for a buffer to contain the key material has been + * returned successfully. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The size in bits of the key is not valid. + * \retval #PSA_ERROR_NOT_SUPPORTED + * The type and/or the size in bits of the key or the combination of + * the two is not supported. + */ +psa_status_t psa_driver_wrapper_get_key_buffer_size( + const psa_key_attributes_t *attributes, + size_t *key_buffer_size) +{ + psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + psa_key_type_t key_type = attributes->core.type; + size_t key_bits = attributes->core.bits; + + *key_buffer_size = 0; + switch (location) { +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: +#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS) + /* Emulate property 'builtin_key_size' */ + if (psa_key_id_is_builtin( + MBEDTLS_SVC_KEY_ID_GET_KEY_ID( + psa_get_key_id(attributes)))) { + *key_buffer_size = sizeof(psa_drv_slot_number_t); + return PSA_SUCCESS; + } +#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */ + *key_buffer_size = mbedtls_test_size_function(key_type, key_bits); + return (*key_buffer_size != 0) ? + PSA_SUCCESS : PSA_ERROR_NOT_SUPPORTED; +#endif /* PSA_CRYPTO_DRIVER_TEST */ + + default: + (void) key_type; + (void) key_bits; + return PSA_ERROR_NOT_SUPPORTED; + } +} + +psa_status_t psa_driver_wrapper_generate_key( + const psa_key_attributes_t *attributes, + uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + /* Try dynamically-registered SE interface first */ +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + const psa_drv_se_t *drv; + psa_drv_se_context_t *drv_context; + + if (psa_get_se_driver(attributes->core.lifetime, &drv, &drv_context)) { + size_t pubkey_length = 0; /* We don't support this feature yet */ + if (drv->key_management == NULL || + drv->key_management->p_generate == NULL) { + /* Key is defined as being in SE, but we have no way to generate it */ + return PSA_ERROR_NOT_SUPPORTED; + } + return drv->key_management->p_generate( + drv_context, + *((psa_key_slot_number_t *) key_buffer), + attributes, NULL, 0, &pubkey_length); + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) + /* Transparent drivers are limited to generating asymmetric keys */ + if (PSA_KEY_TYPE_IS_ASYMMETRIC(attributes->core.type)) { + /* Cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_generate_key( + attributes, key_buffer, key_buffer_size, + key_buffer_length); + /* Declared with fallback == true */ + if (status != PSA_ERROR_NOT_SUPPORTED) { + break; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ + } +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + + /* Software fallback */ + status = psa_generate_key_internal( + attributes, key_buffer, key_buffer_size, key_buffer_length); + break; + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + status = mbedtls_test_opaque_generate_key( + attributes, key_buffer, key_buffer_size, key_buffer_length); + break; +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + + default: + /* Key is declared with a lifetime not known to us */ + status = PSA_ERROR_INVALID_ARGUMENT; + break; + } + + return status; +} + +psa_status_t psa_driver_wrapper_import_key( + const psa_key_attributes_t *attributes, + const uint8_t *data, + size_t data_length, + uint8_t *key_buffer, + size_t key_buffer_size, + size_t *key_buffer_length, + size_t *bits) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( + psa_get_key_lifetime(attributes)); + + /* Try dynamically-registered SE interface first */ +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + const psa_drv_se_t *drv; + psa_drv_se_context_t *drv_context; + + if (psa_get_se_driver(attributes->core.lifetime, &drv, &drv_context)) { + if (drv->key_management == NULL || + drv->key_management->p_import == NULL) { + return PSA_ERROR_NOT_SUPPORTED; + } + + /* The driver should set the number of key bits, however in + * case it doesn't, we initialize bits to an invalid value. */ + *bits = PSA_MAX_KEY_BITS + 1; + status = drv->key_management->p_import( + drv_context, + *((psa_key_slot_number_t *) key_buffer), + attributes, data, data_length, bits); + + if (status != PSA_SUCCESS) { + return status; + } + + if ((*bits) > PSA_MAX_KEY_BITS) { + return PSA_ERROR_NOT_SUPPORTED; + } + + return PSA_SUCCESS; + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_import_key( + attributes, + data, data_length, + key_buffer, key_buffer_size, + key_buffer_length, bits); + /* Declared with fallback == true */ + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + /* Fell through, meaning no accelerator supports this operation */ + return psa_import_key_into_slot(attributes, + data, data_length, + key_buffer, key_buffer_size, + key_buffer_length, bits); + + default: + /* Importing a key with external storage in not yet supported. + * Return in error indicating that the lifetime is not valid. */ + (void) status; + return PSA_ERROR_INVALID_ARGUMENT; + } + +} + +psa_status_t psa_driver_wrapper_export_key( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + uint8_t *data, size_t data_size, size_t *data_length) + +{ + psa_status_t status = PSA_ERROR_INVALID_ARGUMENT; + psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( + psa_get_key_lifetime(attributes)); + + /* Try dynamically-registered SE interface first */ +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + const psa_drv_se_t *drv; + psa_drv_se_context_t *drv_context; + + if (psa_get_se_driver(attributes->core.lifetime, &drv, &drv_context)) { + if ((drv->key_management == NULL) || + (drv->key_management->p_export == NULL)) { + return PSA_ERROR_NOT_SUPPORTED; + } + + return drv->key_management->p_export( + drv_context, + *((psa_key_slot_number_t *) key_buffer), + data, data_size, data_length); + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + return psa_export_key_internal(attributes, + key_buffer, + key_buffer_size, + data, + data_size, + data_length); + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + return mbedtls_test_opaque_export_key(attributes, + key_buffer, + key_buffer_size, + data, + data_size, + data_length); +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + /* Key is declared with a lifetime not known to us */ + return status; + } +} + +psa_status_t psa_driver_wrapper_export_public_key( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + uint8_t *data, size_t data_size, size_t *data_length) + +{ + psa_status_t status = PSA_ERROR_INVALID_ARGUMENT; + psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION( + psa_get_key_lifetime(attributes)); + + /* Try dynamically-registered SE interface first */ +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + const psa_drv_se_t *drv; + psa_drv_se_context_t *drv_context; + + if (psa_get_se_driver(attributes->core.lifetime, &drv, &drv_context)) { + if ((drv->key_management == NULL) || + (drv->key_management->p_export_public == NULL)) { + return PSA_ERROR_NOT_SUPPORTED; + } + + return drv->key_management->p_export_public( + drv_context, + *((psa_key_slot_number_t *) key_buffer), + data, data_size, data_length); + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_export_public_key( + attributes, + key_buffer, + key_buffer_size, + data, + data_size, + data_length); + /* Declared with fallback == true */ + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + /* Fell through, meaning no accelerator supports this operation */ + return psa_export_public_key_internal(attributes, + key_buffer, + key_buffer_size, + data, + data_size, + data_length); + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + return mbedtls_test_opaque_export_public_key(attributes, + key_buffer, + key_buffer_size, + data, + data_size, + data_length); +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + /* Key is declared with a lifetime not known to us */ + return status; + } +} + +psa_status_t psa_driver_wrapper_get_builtin_key( + psa_drv_slot_number_t slot_number, + psa_key_attributes_t *attributes, + uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length) +{ + psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + switch (location) { +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + return mbedtls_test_opaque_get_builtin_key( + slot_number, + attributes, + key_buffer, key_buffer_size, key_buffer_length); +#endif /* PSA_CRYPTO_DRIVER_TEST */ + default: + (void) slot_number; + (void) key_buffer; + (void) key_buffer_size; + (void) key_buffer_length; + return PSA_ERROR_DOES_NOT_EXIST; + } +} + +/* + * Cipher functions + */ +psa_status_t psa_driver_wrapper_cipher_encrypt( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *iv, + size_t iv_length, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_cipher_encrypt(attributes, + key_buffer, + key_buffer_size, + alg, + iv, + iv_length, + input, + input_length, + output, + output_size, + output_length); + /* Declared with fallback == true */ + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + +#if defined(MBEDTLS_PSA_BUILTIN_CIPHER) + return mbedtls_psa_cipher_encrypt(attributes, + key_buffer, + key_buffer_size, + alg, + iv, + iv_length, + input, + input_length, + output, + output_size, + output_length); +#else + return PSA_ERROR_NOT_SUPPORTED; +#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */ + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + return mbedtls_test_opaque_cipher_encrypt(attributes, + key_buffer, + key_buffer_size, + alg, + iv, + iv_length, + input, + input_length, + output, + output_size, + output_length); +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + + default: + /* Key is declared with a lifetime not known to us */ + (void) status; + (void) key_buffer; + (void) key_buffer_size; + (void) alg; + (void) iv; + (void) iv_length; + (void) input; + (void) input_length; + (void) output; + (void) output_size; + (void) output_length; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +psa_status_t psa_driver_wrapper_cipher_decrypt( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_cipher_decrypt(attributes, + key_buffer, + key_buffer_size, + alg, + input, + input_length, + output, + output_size, + output_length); + /* Declared with fallback == true */ + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + +#if defined(MBEDTLS_PSA_BUILTIN_CIPHER) + return mbedtls_psa_cipher_decrypt(attributes, + key_buffer, + key_buffer_size, + alg, + input, + input_length, + output, + output_size, + output_length); +#else + return PSA_ERROR_NOT_SUPPORTED; +#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */ + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + return mbedtls_test_opaque_cipher_decrypt(attributes, + key_buffer, + key_buffer_size, + alg, + input, + input_length, + output, + output_size, + output_length); +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + + default: + /* Key is declared with a lifetime not known to us */ + (void) status; + (void) key_buffer; + (void) key_buffer_size; + (void) alg; + (void) input; + (void) input_length; + (void) output; + (void) output_size; + (void) output_length; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +psa_status_t psa_driver_wrapper_cipher_encrypt_setup( + psa_cipher_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_cipher_encrypt_setup( + &operation->ctx.transparent_test_driver_ctx, + attributes, + key_buffer, + key_buffer_size, + alg); + /* Declared with fallback == true */ + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID; + } + + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ +#if defined(MBEDTLS_PSA_BUILTIN_CIPHER) + /* Fell through, meaning no accelerator supports this operation */ + status = mbedtls_psa_cipher_encrypt_setup(&operation->ctx.mbedtls_ctx, + attributes, + key_buffer, + key_buffer_size, + alg); + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID; + } + + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */ + return PSA_ERROR_NOT_SUPPORTED; + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + status = mbedtls_test_opaque_cipher_encrypt_setup( + &operation->ctx.opaque_test_driver_ctx, + attributes, + key_buffer, key_buffer_size, + alg); + + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID; + } + + return status; +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + /* Key is declared with a lifetime not known to us */ + (void) status; + (void) operation; + (void) key_buffer; + (void) key_buffer_size; + (void) alg; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +psa_status_t psa_driver_wrapper_cipher_decrypt_setup( + psa_cipher_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg) +{ + psa_status_t status = PSA_ERROR_INVALID_ARGUMENT; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_cipher_decrypt_setup( + &operation->ctx.transparent_test_driver_ctx, + attributes, + key_buffer, + key_buffer_size, + alg); + /* Declared with fallback == true */ + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID; + } + + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ +#if defined(MBEDTLS_PSA_BUILTIN_CIPHER) + /* Fell through, meaning no accelerator supports this operation */ + status = mbedtls_psa_cipher_decrypt_setup(&operation->ctx.mbedtls_ctx, + attributes, + key_buffer, + key_buffer_size, + alg); + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID; + } + + return status; +#else /* MBEDTLS_PSA_BUILTIN_CIPHER */ + return PSA_ERROR_NOT_SUPPORTED; +#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */ + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + status = mbedtls_test_opaque_cipher_decrypt_setup( + &operation->ctx.opaque_test_driver_ctx, + attributes, + key_buffer, key_buffer_size, + alg); + + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID; + } + + return status; +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + /* Key is declared with a lifetime not known to us */ + (void) status; + (void) operation; + (void) key_buffer; + (void) key_buffer_size; + (void) alg; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +psa_status_t psa_driver_wrapper_cipher_set_iv( + psa_cipher_operation_t *operation, + const uint8_t *iv, + size_t iv_length) +{ + switch (operation->id) { +#if defined(MBEDTLS_PSA_BUILTIN_CIPHER) + case PSA_CRYPTO_MBED_TLS_DRIVER_ID: + return mbedtls_psa_cipher_set_iv(&operation->ctx.mbedtls_ctx, + iv, + iv_length); +#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */ + +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID: + return mbedtls_test_transparent_cipher_set_iv( + &operation->ctx.transparent_test_driver_ctx, + iv, iv_length); + + case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID: + return mbedtls_test_opaque_cipher_set_iv( + &operation->ctx.opaque_test_driver_ctx, + iv, iv_length); +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + } + + (void) iv; + (void) iv_length; + + return PSA_ERROR_INVALID_ARGUMENT; +} + +psa_status_t psa_driver_wrapper_cipher_update( + psa_cipher_operation_t *operation, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length) +{ + switch (operation->id) { +#if defined(MBEDTLS_PSA_BUILTIN_CIPHER) + case PSA_CRYPTO_MBED_TLS_DRIVER_ID: + return mbedtls_psa_cipher_update(&operation->ctx.mbedtls_ctx, + input, + input_length, + output, + output_size, + output_length); +#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */ + +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID: + return mbedtls_test_transparent_cipher_update( + &operation->ctx.transparent_test_driver_ctx, + input, input_length, + output, output_size, output_length); + + case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID: + return mbedtls_test_opaque_cipher_update( + &operation->ctx.opaque_test_driver_ctx, + input, input_length, + output, output_size, output_length); +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + } + + (void) input; + (void) input_length; + (void) output; + (void) output_size; + (void) output_length; + + return PSA_ERROR_INVALID_ARGUMENT; +} + +psa_status_t psa_driver_wrapper_cipher_finish( + psa_cipher_operation_t *operation, + uint8_t *output, + size_t output_size, + size_t *output_length) +{ + switch (operation->id) { +#if defined(MBEDTLS_PSA_BUILTIN_CIPHER) + case PSA_CRYPTO_MBED_TLS_DRIVER_ID: + return mbedtls_psa_cipher_finish(&operation->ctx.mbedtls_ctx, + output, + output_size, + output_length); +#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */ + +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID: + return mbedtls_test_transparent_cipher_finish( + &operation->ctx.transparent_test_driver_ctx, + output, output_size, output_length); + + case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID: + return mbedtls_test_opaque_cipher_finish( + &operation->ctx.opaque_test_driver_ctx, + output, output_size, output_length); +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + } + + (void) output; + (void) output_size; + (void) output_length; + + return PSA_ERROR_INVALID_ARGUMENT; +} + +psa_status_t psa_driver_wrapper_cipher_abort( + psa_cipher_operation_t *operation) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + switch (operation->id) { +#if defined(MBEDTLS_PSA_BUILTIN_CIPHER) + case PSA_CRYPTO_MBED_TLS_DRIVER_ID: + return mbedtls_psa_cipher_abort(&operation->ctx.mbedtls_ctx); +#endif /* MBEDTLS_PSA_BUILTIN_CIPHER */ + +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID: + status = mbedtls_test_transparent_cipher_abort( + &operation->ctx.transparent_test_driver_ctx); + mbedtls_platform_zeroize( + &operation->ctx.transparent_test_driver_ctx, + sizeof(operation->ctx.transparent_test_driver_ctx)); + return status; + + case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID: + status = mbedtls_test_opaque_cipher_abort( + &operation->ctx.opaque_test_driver_ctx); + mbedtls_platform_zeroize( + &operation->ctx.opaque_test_driver_ctx, + sizeof(operation->ctx.opaque_test_driver_ctx)); + return status; +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + } + + (void) status; + return PSA_ERROR_INVALID_ARGUMENT; +} + +/* + * Hashing functions + */ +psa_status_t psa_driver_wrapper_hash_compute( + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *hash, + size_t hash_size, + size_t *hash_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + /* Try accelerators first */ +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_hash_compute( + alg, input, input_length, hash, hash_size, hash_length); + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif + + /* If software fallback is compiled in, try fallback */ +#if defined(MBEDTLS_PSA_BUILTIN_HASH) + status = mbedtls_psa_hash_compute(alg, input, input_length, + hash, hash_size, hash_length); + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif + (void) status; + (void) alg; + (void) input; + (void) input_length; + (void) hash; + (void) hash_size; + (void) hash_length; + + return PSA_ERROR_NOT_SUPPORTED; +} + +psa_status_t psa_driver_wrapper_hash_setup( + psa_hash_operation_t *operation, + psa_algorithm_t alg) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + /* Try setup on accelerators first */ +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_hash_setup( + &operation->ctx.test_driver_ctx, alg); + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID; + } + + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif + + /* If software fallback is compiled in, try fallback */ +#if defined(MBEDTLS_PSA_BUILTIN_HASH) + status = mbedtls_psa_hash_setup(&operation->ctx.mbedtls_ctx, alg); + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID; + } + + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif + /* Nothing left to try if we fall through here */ + (void) status; + (void) operation; + (void) alg; + return PSA_ERROR_NOT_SUPPORTED; +} + +psa_status_t psa_driver_wrapper_hash_clone( + const psa_hash_operation_t *source_operation, + psa_hash_operation_t *target_operation) +{ + switch (source_operation->id) { +#if defined(MBEDTLS_PSA_BUILTIN_HASH) + case PSA_CRYPTO_MBED_TLS_DRIVER_ID: + target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID; + return mbedtls_psa_hash_clone(&source_operation->ctx.mbedtls_ctx, + &target_operation->ctx.mbedtls_ctx); +#endif +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID: + target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID; + return mbedtls_test_transparent_hash_clone( + &source_operation->ctx.test_driver_ctx, + &target_operation->ctx.test_driver_ctx); +#endif + default: + (void) target_operation; + return PSA_ERROR_BAD_STATE; + } +} + +psa_status_t psa_driver_wrapper_hash_update( + psa_hash_operation_t *operation, + const uint8_t *input, + size_t input_length) +{ + switch (operation->id) { +#if defined(MBEDTLS_PSA_BUILTIN_HASH) + case PSA_CRYPTO_MBED_TLS_DRIVER_ID: + return mbedtls_psa_hash_update(&operation->ctx.mbedtls_ctx, + input, input_length); +#endif +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID: + return mbedtls_test_transparent_hash_update( + &operation->ctx.test_driver_ctx, + input, input_length); +#endif + default: + (void) input; + (void) input_length; + return PSA_ERROR_BAD_STATE; + } +} + +psa_status_t psa_driver_wrapper_hash_finish( + psa_hash_operation_t *operation, + uint8_t *hash, + size_t hash_size, + size_t *hash_length) +{ + switch (operation->id) { +#if defined(MBEDTLS_PSA_BUILTIN_HASH) + case PSA_CRYPTO_MBED_TLS_DRIVER_ID: + return mbedtls_psa_hash_finish(&operation->ctx.mbedtls_ctx, + hash, hash_size, hash_length); +#endif +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID: + return mbedtls_test_transparent_hash_finish( + &operation->ctx.test_driver_ctx, + hash, hash_size, hash_length); +#endif + default: + (void) hash; + (void) hash_size; + (void) hash_length; + return PSA_ERROR_BAD_STATE; + } +} + +psa_status_t psa_driver_wrapper_hash_abort( + psa_hash_operation_t *operation) +{ + switch (operation->id) { +#if defined(MBEDTLS_PSA_BUILTIN_HASH) + case PSA_CRYPTO_MBED_TLS_DRIVER_ID: + return mbedtls_psa_hash_abort(&operation->ctx.mbedtls_ctx); +#endif +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID: + return mbedtls_test_transparent_hash_abort( + &operation->ctx.test_driver_ctx); +#endif + default: + return PSA_ERROR_BAD_STATE; + } +} + +psa_status_t psa_driver_wrapper_aead_encrypt( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *nonce, size_t nonce_length, + const uint8_t *additional_data, size_t additional_data_length, + const uint8_t *plaintext, size_t plaintext_length, + uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ + +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_aead_encrypt( + attributes, key_buffer, key_buffer_size, + alg, + nonce, nonce_length, + additional_data, additional_data_length, + plaintext, plaintext_length, + ciphertext, ciphertext_size, ciphertext_length); + /* Declared with fallback == true */ + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + + /* Fell through, meaning no accelerator supports this operation */ + return mbedtls_psa_aead_encrypt( + attributes, key_buffer, key_buffer_size, + alg, + nonce, nonce_length, + additional_data, additional_data_length, + plaintext, plaintext_length, + ciphertext, ciphertext_size, ciphertext_length); + + /* Add cases for opaque driver here */ + + default: + /* Key is declared with a lifetime not known to us */ + (void) status; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +psa_status_t psa_driver_wrapper_aead_decrypt( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *nonce, size_t nonce_length, + const uint8_t *additional_data, size_t additional_data_length, + const uint8_t *ciphertext, size_t ciphertext_length, + uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ + +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_aead_decrypt( + attributes, key_buffer, key_buffer_size, + alg, + nonce, nonce_length, + additional_data, additional_data_length, + ciphertext, ciphertext_length, + plaintext, plaintext_size, plaintext_length); + /* Declared with fallback == true */ + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + + /* Fell through, meaning no accelerator supports this operation */ + return mbedtls_psa_aead_decrypt( + attributes, key_buffer, key_buffer_size, + alg, + nonce, nonce_length, + additional_data, additional_data_length, + ciphertext, ciphertext_length, + plaintext, plaintext_size, plaintext_length); + + /* Add cases for opaque driver here */ + + default: + /* Key is declared with a lifetime not known to us */ + (void) status; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + + +/* + * MAC functions + */ +psa_status_t psa_driver_wrapper_mac_compute( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *mac, + size_t mac_size, + size_t *mac_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_mac_compute( + attributes, key_buffer, key_buffer_size, alg, + input, input_length, + mac, mac_size, mac_length); + /* Declared with fallback == true */ + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ +#if defined(MBEDTLS_PSA_BUILTIN_MAC) + /* Fell through, meaning no accelerator supports this operation */ + status = mbedtls_psa_mac_compute( + attributes, key_buffer, key_buffer_size, alg, + input, input_length, + mac, mac_size, mac_length); + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* MBEDTLS_PSA_BUILTIN_MAC */ + return PSA_ERROR_NOT_SUPPORTED; + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + status = mbedtls_test_opaque_mac_compute( + attributes, key_buffer, key_buffer_size, alg, + input, input_length, + mac, mac_size, mac_length); + return status; +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + /* Key is declared with a lifetime not known to us */ + (void) key_buffer; + (void) key_buffer_size; + (void) alg; + (void) input; + (void) input_length; + (void) mac; + (void) mac_size; + (void) mac_length; + (void) status; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +psa_status_t psa_driver_wrapper_mac_sign_setup( + psa_mac_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_mac_sign_setup( + &operation->ctx.transparent_test_driver_ctx, + attributes, + key_buffer, key_buffer_size, + alg); + /* Declared with fallback == true */ + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID; + } + + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ +#if defined(MBEDTLS_PSA_BUILTIN_MAC) + /* Fell through, meaning no accelerator supports this operation */ + status = mbedtls_psa_mac_sign_setup(&operation->ctx.mbedtls_ctx, + attributes, + key_buffer, key_buffer_size, + alg); + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID; + } + + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* MBEDTLS_PSA_BUILTIN_MAC */ + return PSA_ERROR_NOT_SUPPORTED; + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + status = mbedtls_test_opaque_mac_sign_setup( + &operation->ctx.opaque_test_driver_ctx, + attributes, + key_buffer, key_buffer_size, + alg); + + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID; + } + + return status; +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + /* Key is declared with a lifetime not known to us */ + (void) status; + (void) operation; + (void) key_buffer; + (void) key_buffer_size; + (void) alg; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +psa_status_t psa_driver_wrapper_mac_verify_setup( + psa_mac_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_location_t location = + PSA_KEY_LIFETIME_GET_LOCATION(attributes->core.lifetime); + + switch (location) { + case PSA_KEY_LOCATION_LOCAL_STORAGE: + /* Key is stored in the slot in export representation, so + * cycle through all known transparent accelerators */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + status = mbedtls_test_transparent_mac_verify_setup( + &operation->ctx.transparent_test_driver_ctx, + attributes, + key_buffer, key_buffer_size, + alg); + /* Declared with fallback == true */ + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID; + } + + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ +#if defined(MBEDTLS_PSA_BUILTIN_MAC) + /* Fell through, meaning no accelerator supports this operation */ + status = mbedtls_psa_mac_verify_setup(&operation->ctx.mbedtls_ctx, + attributes, + key_buffer, key_buffer_size, + alg); + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID; + } + + if (status != PSA_ERROR_NOT_SUPPORTED) { + return status; + } +#endif /* MBEDTLS_PSA_BUILTIN_MAC */ + return PSA_ERROR_NOT_SUPPORTED; + + /* Add cases for opaque driver here */ +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TEST_DRIVER_LOCATION: + status = mbedtls_test_opaque_mac_verify_setup( + &operation->ctx.opaque_test_driver_ctx, + attributes, + key_buffer, key_buffer_size, + alg); + + if (status == PSA_SUCCESS) { + operation->id = PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID; + } + + return status; +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + /* Key is declared with a lifetime not known to us */ + (void) status; + (void) operation; + (void) key_buffer; + (void) key_buffer_size; + (void) alg; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +psa_status_t psa_driver_wrapper_mac_update( + psa_mac_operation_t *operation, + const uint8_t *input, + size_t input_length) +{ + switch (operation->id) { +#if defined(MBEDTLS_PSA_BUILTIN_MAC) + case PSA_CRYPTO_MBED_TLS_DRIVER_ID: + return mbedtls_psa_mac_update(&operation->ctx.mbedtls_ctx, + input, input_length); +#endif /* MBEDTLS_PSA_BUILTIN_MAC */ + +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID: + return mbedtls_test_transparent_mac_update( + &operation->ctx.transparent_test_driver_ctx, + input, input_length); + + case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID: + return mbedtls_test_opaque_mac_update( + &operation->ctx.opaque_test_driver_ctx, + input, input_length); +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + (void) input; + (void) input_length; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +psa_status_t psa_driver_wrapper_mac_sign_finish( + psa_mac_operation_t *operation, + uint8_t *mac, + size_t mac_size, + size_t *mac_length) +{ + switch (operation->id) { +#if defined(MBEDTLS_PSA_BUILTIN_MAC) + case PSA_CRYPTO_MBED_TLS_DRIVER_ID: + return mbedtls_psa_mac_sign_finish(&operation->ctx.mbedtls_ctx, + mac, mac_size, mac_length); +#endif /* MBEDTLS_PSA_BUILTIN_MAC */ + +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID: + return mbedtls_test_transparent_mac_sign_finish( + &operation->ctx.transparent_test_driver_ctx, + mac, mac_size, mac_length); + + case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID: + return mbedtls_test_opaque_mac_sign_finish( + &operation->ctx.opaque_test_driver_ctx, + mac, mac_size, mac_length); +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + (void) mac; + (void) mac_size; + (void) mac_length; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +psa_status_t psa_driver_wrapper_mac_verify_finish( + psa_mac_operation_t *operation, + const uint8_t *mac, + size_t mac_length) +{ + switch (operation->id) { +#if defined(MBEDTLS_PSA_BUILTIN_MAC) + case PSA_CRYPTO_MBED_TLS_DRIVER_ID: + return mbedtls_psa_mac_verify_finish(&operation->ctx.mbedtls_ctx, + mac, mac_length); +#endif /* MBEDTLS_PSA_BUILTIN_MAC */ + +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID: + return mbedtls_test_transparent_mac_verify_finish( + &operation->ctx.transparent_test_driver_ctx, + mac, mac_length); + + case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID: + return mbedtls_test_opaque_mac_verify_finish( + &operation->ctx.opaque_test_driver_ctx, + mac, mac_length); +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + (void) mac; + (void) mac_length; + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +psa_status_t psa_driver_wrapper_mac_abort( + psa_mac_operation_t *operation) +{ + switch (operation->id) { +#if defined(MBEDTLS_PSA_BUILTIN_MAC) + case PSA_CRYPTO_MBED_TLS_DRIVER_ID: + return mbedtls_psa_mac_abort(&operation->ctx.mbedtls_ctx); +#endif /* MBEDTLS_PSA_BUILTIN_MAC */ + +#if defined(PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT) +#if defined(PSA_CRYPTO_DRIVER_TEST) + case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID: + return mbedtls_test_transparent_mac_abort( + &operation->ctx.transparent_test_driver_ctx); + case PSA_CRYPTO_OPAQUE_TEST_DRIVER_ID: + return mbedtls_test_opaque_mac_abort( + &operation->ctx.opaque_test_driver_ctx); +#endif /* PSA_CRYPTO_DRIVER_TEST */ +#endif /* PSA_CRYPTO_ACCELERATOR_DRIVER_PRESENT */ + default: + return PSA_ERROR_INVALID_ARGUMENT; + } +} + +#endif /* MBEDTLS_PSA_CRYPTO_C */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_driver_wrappers.h b/ext/opcua_client/mbedtls/library/psa_crypto_driver_wrappers.h new file mode 100644 index 0000000..7e76977 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_driver_wrappers.h @@ -0,0 +1,256 @@ +/* + * Function signatures for functionality that can be provided by + * cryptographic accelerators. + * Warning: This file will be auto-generated in the future. + */ +/* Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_DRIVER_WRAPPERS_H +#define PSA_CRYPTO_DRIVER_WRAPPERS_H + +#include "psa/crypto.h" +#include "psa/crypto_driver_common.h" + +/* + * Initialization and termination functions + */ +psa_status_t psa_driver_wrapper_init(void); +void psa_driver_wrapper_free(void); + +/* + * Signature functions + */ +psa_status_t psa_driver_wrapper_sign_message( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *signature, + size_t signature_size, + size_t *signature_length); + +psa_status_t psa_driver_wrapper_verify_message( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *signature, + size_t signature_length); + +psa_status_t psa_driver_wrapper_sign_hash( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + uint8_t *signature, size_t signature_size, size_t *signature_length); + +psa_status_t psa_driver_wrapper_verify_hash( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + const uint8_t *signature, size_t signature_length); + +/* + * Key handling functions + */ + +psa_status_t psa_driver_wrapper_import_key( + const psa_key_attributes_t *attributes, + const uint8_t *data, size_t data_length, + uint8_t *key_buffer, size_t key_buffer_size, + size_t *key_buffer_length, size_t *bits); + +psa_status_t psa_driver_wrapper_export_key( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + uint8_t *data, size_t data_size, size_t *data_length); + +psa_status_t psa_driver_wrapper_export_public_key( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + uint8_t *data, size_t data_size, size_t *data_length); + +psa_status_t psa_driver_wrapper_get_key_buffer_size( + const psa_key_attributes_t *attributes, + size_t *key_buffer_size); + +psa_status_t psa_driver_wrapper_generate_key( + const psa_key_attributes_t *attributes, + uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length); + +psa_status_t psa_driver_wrapper_get_builtin_key( + psa_drv_slot_number_t slot_number, + psa_key_attributes_t *attributes, + uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length); + +/* + * Cipher functions + */ +psa_status_t psa_driver_wrapper_cipher_encrypt( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *iv, + size_t iv_length, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +psa_status_t psa_driver_wrapper_cipher_decrypt( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +psa_status_t psa_driver_wrapper_cipher_encrypt_setup( + psa_cipher_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg); + +psa_status_t psa_driver_wrapper_cipher_decrypt_setup( + psa_cipher_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg); + +psa_status_t psa_driver_wrapper_cipher_set_iv( + psa_cipher_operation_t *operation, + const uint8_t *iv, + size_t iv_length); + +psa_status_t psa_driver_wrapper_cipher_update( + psa_cipher_operation_t *operation, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +psa_status_t psa_driver_wrapper_cipher_finish( + psa_cipher_operation_t *operation, + uint8_t *output, + size_t output_size, + size_t *output_length); + +psa_status_t psa_driver_wrapper_cipher_abort( + psa_cipher_operation_t *operation); + +/* + * Hashing functions + */ +psa_status_t psa_driver_wrapper_hash_compute( + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *hash, + size_t hash_size, + size_t *hash_length); + +psa_status_t psa_driver_wrapper_hash_setup( + psa_hash_operation_t *operation, + psa_algorithm_t alg); + +psa_status_t psa_driver_wrapper_hash_clone( + const psa_hash_operation_t *source_operation, + psa_hash_operation_t *target_operation); + +psa_status_t psa_driver_wrapper_hash_update( + psa_hash_operation_t *operation, + const uint8_t *input, + size_t input_length); + +psa_status_t psa_driver_wrapper_hash_finish( + psa_hash_operation_t *operation, + uint8_t *hash, + size_t hash_size, + size_t *hash_length); + +psa_status_t psa_driver_wrapper_hash_abort( + psa_hash_operation_t *operation); + +/* + * AEAD functions + */ + +psa_status_t psa_driver_wrapper_aead_encrypt( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *nonce, size_t nonce_length, + const uint8_t *additional_data, size_t additional_data_length, + const uint8_t *plaintext, size_t plaintext_length, + uint8_t *ciphertext, size_t ciphertext_size, size_t *ciphertext_length); + +psa_status_t psa_driver_wrapper_aead_decrypt( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *nonce, size_t nonce_length, + const uint8_t *additional_data, size_t additional_data_length, + const uint8_t *ciphertext, size_t ciphertext_length, + uint8_t *plaintext, size_t plaintext_size, size_t *plaintext_length); + +/* + * MAC functions + */ +psa_status_t psa_driver_wrapper_mac_compute( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *mac, + size_t mac_size, + size_t *mac_length); + +psa_status_t psa_driver_wrapper_mac_sign_setup( + psa_mac_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg); + +psa_status_t psa_driver_wrapper_mac_verify_setup( + psa_mac_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg); + +psa_status_t psa_driver_wrapper_mac_update( + psa_mac_operation_t *operation, + const uint8_t *input, + size_t input_length); + +psa_status_t psa_driver_wrapper_mac_sign_finish( + psa_mac_operation_t *operation, + uint8_t *mac, + size_t mac_size, + size_t *mac_length); + +psa_status_t psa_driver_wrapper_mac_verify_finish( + psa_mac_operation_t *operation, + const uint8_t *mac, + size_t mac_length); + +psa_status_t psa_driver_wrapper_mac_abort( + psa_mac_operation_t *operation); + +#endif /* PSA_CRYPTO_DRIVER_WRAPPERS_H */ + +/* End of automatically generated file. */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_ecp.c b/ext/opcua_client/mbedtls/library/psa_crypto_ecp.c new file mode 100644 index 0000000..b00f558 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_ecp.c @@ -0,0 +1,456 @@ +/* + * PSA ECP layer on top of Mbed TLS crypto + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PSA_CRYPTO_C) + +#include +#include "psa_crypto_core.h" +#include "psa_crypto_ecp.h" +#include "psa_crypto_random_impl.h" +#include "psa_crypto_hash.h" + +#include +#include +#include "mbedtls/platform.h" + +#include +#include +#include + +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || \ + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_ECDH) +psa_status_t mbedtls_psa_ecp_load_representation( + psa_key_type_t type, size_t curve_bits, + const uint8_t *data, size_t data_length, + mbedtls_ecp_keypair **p_ecp) +{ + mbedtls_ecp_group_id grp_id = MBEDTLS_ECP_DP_NONE; + psa_status_t status; + mbedtls_ecp_keypair *ecp = NULL; + size_t curve_bytes = data_length; + int explicit_bits = (curve_bits != 0); + + if (PSA_KEY_TYPE_IS_PUBLIC_KEY(type) && + PSA_KEY_TYPE_ECC_GET_FAMILY(type) != PSA_ECC_FAMILY_MONTGOMERY) { + /* A Weierstrass public key is represented as: + * - The byte 0x04; + * - `x_P` as a `ceiling(m/8)`-byte string, big-endian; + * - `y_P` as a `ceiling(m/8)`-byte string, big-endian. + * So its data length is 2m+1 where m is the curve size in bits. + */ + if ((data_length & 1) == 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + curve_bytes = data_length / 2; + + /* Montgomery public keys are represented in compressed format, meaning + * their curve_bytes is equal to the amount of input. */ + + /* Private keys are represented in uncompressed private random integer + * format, meaning their curve_bytes is equal to the amount of input. */ + } + + if (explicit_bits) { + /* With an explicit bit-size, the data must have the matching length. */ + if (curve_bytes != PSA_BITS_TO_BYTES(curve_bits)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + } else { + /* We need to infer the bit-size from the data. Since the only + * information we have is the length in bytes, the value of curve_bits + * at this stage is rounded up to the nearest multiple of 8. */ + curve_bits = PSA_BYTES_TO_BITS(curve_bytes); + } + + /* Allocate and initialize a key representation. */ + ecp = mbedtls_calloc(1, sizeof(mbedtls_ecp_keypair)); + if (ecp == NULL) { + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + mbedtls_ecp_keypair_init(ecp); + + /* Load the group. */ + grp_id = mbedtls_ecc_group_of_psa(PSA_KEY_TYPE_ECC_GET_FAMILY(type), + curve_bits, !explicit_bits); + if (grp_id == MBEDTLS_ECP_DP_NONE) { + /* We can't distinguish between a nonsensical family/size combination + * (which would warrant PSA_ERROR_INVALID_ARGUMENT) and a + * well-regarded curve that Mbed TLS just doesn't know about (which + * would warrant PSA_ERROR_NOT_SUPPORTED). For uniformity with how + * curves that Mbed TLS knows about but for which support is disabled + * at build time, return NOT_SUPPORTED. */ + status = PSA_ERROR_NOT_SUPPORTED; + goto exit; + } + + status = mbedtls_to_psa_error( + mbedtls_ecp_group_load(&ecp->grp, grp_id)); + if (status != PSA_SUCCESS) { + goto exit; + } + + /* Load the key material. */ + if (PSA_KEY_TYPE_IS_PUBLIC_KEY(type)) { + /* Load the public value. */ + status = mbedtls_to_psa_error( + mbedtls_ecp_point_read_binary(&ecp->grp, &ecp->Q, + data, + data_length)); + if (status != PSA_SUCCESS) { + goto exit; + } + + /* Check that the point is on the curve. */ + status = mbedtls_to_psa_error( + mbedtls_ecp_check_pubkey(&ecp->grp, &ecp->Q)); + if (status != PSA_SUCCESS) { + goto exit; + } + } else { + /* Load and validate the secret value. */ + status = mbedtls_to_psa_error( + mbedtls_ecp_read_key(ecp->grp.id, + ecp, + data, + data_length)); + if (status != PSA_SUCCESS) { + goto exit; + } + } + + *p_ecp = ecp; +exit: + if (status != PSA_SUCCESS) { + mbedtls_ecp_keypair_free(ecp); + mbedtls_free(ecp); + } + + return status; +} +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || + * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_ECDH) */ + +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || \ + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) + +psa_status_t mbedtls_psa_ecp_import_key( + const psa_key_attributes_t *attributes, + const uint8_t *data, size_t data_length, + uint8_t *key_buffer, size_t key_buffer_size, + size_t *key_buffer_length, size_t *bits) +{ + psa_status_t status; + mbedtls_ecp_keypair *ecp = NULL; + + /* Parse input */ + status = mbedtls_psa_ecp_load_representation(attributes->core.type, + attributes->core.bits, + data, + data_length, + &ecp); + if (status != PSA_SUCCESS) { + goto exit; + } + + if (PSA_KEY_TYPE_ECC_GET_FAMILY(attributes->core.type) == + PSA_ECC_FAMILY_MONTGOMERY) { + *bits = ecp->grp.nbits + 1; + } else { + *bits = ecp->grp.nbits; + } + + /* Re-export the data to PSA export format. There is currently no support + * for other input formats then the export format, so this is a 1-1 + * copy operation. */ + status = mbedtls_psa_ecp_export_key(attributes->core.type, + ecp, + key_buffer, + key_buffer_size, + key_buffer_length); +exit: + /* Always free the PK object (will also free contained ECP context) */ + mbedtls_ecp_keypair_free(ecp); + mbedtls_free(ecp); + + return status; +} + +psa_status_t mbedtls_psa_ecp_export_key(psa_key_type_t type, + mbedtls_ecp_keypair *ecp, + uint8_t *data, + size_t data_size, + size_t *data_length) +{ + psa_status_t status; + + if (PSA_KEY_TYPE_IS_PUBLIC_KEY(type)) { + /* Check whether the public part is loaded */ + if (mbedtls_ecp_is_zero(&ecp->Q)) { + /* Calculate the public key */ + status = mbedtls_to_psa_error( + mbedtls_ecp_mul(&ecp->grp, &ecp->Q, &ecp->d, &ecp->grp.G, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE)); + if (status != PSA_SUCCESS) { + return status; + } + } + + status = mbedtls_to_psa_error( + mbedtls_ecp_point_write_binary(&ecp->grp, &ecp->Q, + MBEDTLS_ECP_PF_UNCOMPRESSED, + data_length, + data, + data_size)); + if (status != PSA_SUCCESS) { + memset(data, 0, data_size); + } + + return status; + } else { + if (data_size < PSA_BITS_TO_BYTES(ecp->grp.nbits)) { + return PSA_ERROR_BUFFER_TOO_SMALL; + } + + status = mbedtls_to_psa_error( + mbedtls_ecp_write_key(ecp, + data, + PSA_BITS_TO_BYTES(ecp->grp.nbits))); + if (status == PSA_SUCCESS) { + *data_length = PSA_BITS_TO_BYTES(ecp->grp.nbits); + } else { + memset(data, 0, data_size); + } + + return status; + } +} + +psa_status_t mbedtls_psa_ecp_export_public_key( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + uint8_t *data, size_t data_size, size_t *data_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_keypair *ecp = NULL; + + status = mbedtls_psa_ecp_load_representation( + attributes->core.type, attributes->core.bits, + key_buffer, key_buffer_size, &ecp); + if (status != PSA_SUCCESS) { + return status; + } + + status = mbedtls_psa_ecp_export_key( + PSA_KEY_TYPE_ECC_PUBLIC_KEY( + PSA_KEY_TYPE_ECC_GET_FAMILY(attributes->core.type)), + ecp, data, data_size, data_length); + + mbedtls_ecp_keypair_free(ecp); + mbedtls_free(ecp); + + return status; +} +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || + * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) */ + +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) +psa_status_t mbedtls_psa_ecp_generate_key( + const psa_key_attributes_t *attributes, + uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + psa_ecc_family_t curve = PSA_KEY_TYPE_ECC_GET_FAMILY( + attributes->core.type); + mbedtls_ecp_group_id grp_id = + mbedtls_ecc_group_of_psa(curve, attributes->core.bits, 0); + + const mbedtls_ecp_curve_info *curve_info = + mbedtls_ecp_curve_info_from_grp_id(grp_id); + mbedtls_ecp_keypair ecp; + + if (attributes->domain_parameters_size != 0) { + return PSA_ERROR_NOT_SUPPORTED; + } + + if (grp_id == MBEDTLS_ECP_DP_NONE || curve_info == NULL) { + return PSA_ERROR_NOT_SUPPORTED; + } + + mbedtls_ecp_keypair_init(&ecp); + ret = mbedtls_ecp_gen_key(grp_id, &ecp, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE); + if (ret != 0) { + mbedtls_ecp_keypair_free(&ecp); + return mbedtls_to_psa_error(ret); + } + + status = mbedtls_to_psa_error( + mbedtls_ecp_write_key(&ecp, key_buffer, key_buffer_size)); + + mbedtls_ecp_keypair_free(&ecp); + + if (status == PSA_SUCCESS) { + *key_buffer_length = key_buffer_size; + } + + return status; +} +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) */ + +/****************************************************************/ +/* ECDSA sign/verify */ +/****************************************************************/ + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) +psa_status_t mbedtls_psa_ecdsa_sign_hash( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + uint8_t *signature, size_t signature_size, size_t *signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_keypair *ecp = NULL; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t curve_bytes; + mbedtls_mpi r, s; + + status = mbedtls_psa_ecp_load_representation(attributes->core.type, + attributes->core.bits, + key_buffer, + key_buffer_size, + &ecp); + if (status != PSA_SUCCESS) { + return status; + } + + curve_bytes = PSA_BITS_TO_BYTES(ecp->grp.pbits); + mbedtls_mpi_init(&r); + mbedtls_mpi_init(&s); + + if (signature_size < 2 * curve_bytes) { + ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; + goto cleanup; + } + + if (PSA_ALG_ECDSA_IS_DETERMINISTIC(alg)) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) + psa_algorithm_t hash_alg = PSA_ALG_SIGN_GET_HASH(alg); + const mbedtls_md_info_t *md_info = mbedtls_md_info_from_psa(hash_alg); + mbedtls_md_type_t md_alg = mbedtls_md_get_type(md_info); + MBEDTLS_MPI_CHK(mbedtls_ecdsa_sign_det_ext( + &ecp->grp, &r, &s, + &ecp->d, hash, + hash_length, md_alg, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE)); +#else + ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; + goto cleanup; +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */ + } else { + (void) alg; + MBEDTLS_MPI_CHK(mbedtls_ecdsa_sign(&ecp->grp, &r, &s, &ecp->d, + hash, hash_length, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE)); + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&r, + signature, + curve_bytes)); + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&s, + signature + curve_bytes, + curve_bytes)); +cleanup: + mbedtls_mpi_free(&r); + mbedtls_mpi_free(&s); + if (ret == 0) { + *signature_length = 2 * curve_bytes; + } + + mbedtls_ecp_keypair_free(ecp); + mbedtls_free(ecp); + + return mbedtls_to_psa_error(ret); +} + +psa_status_t mbedtls_psa_ecdsa_verify_hash( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + const uint8_t *signature, size_t signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + mbedtls_ecp_keypair *ecp = NULL; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t curve_bytes; + mbedtls_mpi r, s; + + (void) alg; + + status = mbedtls_psa_ecp_load_representation(attributes->core.type, + attributes->core.bits, + key_buffer, + key_buffer_size, + &ecp); + if (status != PSA_SUCCESS) { + return status; + } + + curve_bytes = PSA_BITS_TO_BYTES(ecp->grp.pbits); + mbedtls_mpi_init(&r); + mbedtls_mpi_init(&s); + + if (signature_length != 2 * curve_bytes) { + ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&r, + signature, + curve_bytes)); + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&s, + signature + curve_bytes, + curve_bytes)); + + /* Check whether the public part is loaded. If not, load it. */ + if (mbedtls_ecp_is_zero(&ecp->Q)) { + MBEDTLS_MPI_CHK( + mbedtls_ecp_mul(&ecp->grp, &ecp->Q, &ecp->d, &ecp->grp.G, + mbedtls_psa_get_random, MBEDTLS_PSA_RANDOM_STATE)); + } + + ret = mbedtls_ecdsa_verify(&ecp->grp, hash, hash_length, + &ecp->Q, &r, &s); + +cleanup: + mbedtls_mpi_free(&r); + mbedtls_mpi_free(&s); + mbedtls_ecp_keypair_free(ecp); + mbedtls_free(ecp); + + return mbedtls_to_psa_error(ret); +} + +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \ + * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */ + +#endif /* MBEDTLS_PSA_CRYPTO_C */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_ecp.h b/ext/opcua_client/mbedtls/library/psa_crypto_ecp.h new file mode 100644 index 0000000..44c4a58 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_ecp.h @@ -0,0 +1,210 @@ +/* + * PSA ECP layer on top of Mbed TLS crypto + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_ECP_H +#define PSA_CRYPTO_ECP_H + +#include +#include + +/** Load the contents of a key buffer into an internal ECP representation + * + * \param[in] type The type of key contained in \p data. + * \param[in] curve_bits The nominal bit-size of the curve. + * It must be consistent with the representation + * passed in \p data. + * This can be 0, in which case the bit-size + * is inferred from \p data_length (which is possible + * for all key types and representation formats + * formats that are currently supported or will + * be in the foreseeable future). + * \param[in] data The buffer from which to load the representation. + * \param[in] data_length The size in bytes of \p data. + * \param[out] p_ecp Returns a pointer to an ECP context on success. + * The caller is responsible for freeing both the + * contents of the context and the context itself + * when done. + */ +psa_status_t mbedtls_psa_ecp_load_representation(psa_key_type_t type, + size_t curve_bits, + const uint8_t *data, + size_t data_length, + mbedtls_ecp_keypair **p_ecp); + +/** Import an ECP key in binary format. + * + * \note The signature of this function is that of a PSA driver + * import_key entry point. This function behaves as an import_key + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes for the key to import. + * \param[in] data The buffer containing the key data in import + * format. + * \param[in] data_length Size of the \p data buffer in bytes. + * \param[out] key_buffer The buffer containing the key data in output + * format. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. This + * size is greater or equal to \p data_length. + * \param[out] key_buffer_length The length of the data written in \p + * key_buffer in bytes. + * \param[out] bits The key size in number of bits. + * + * \retval #PSA_SUCCESS The ECP key was imported successfully. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The key data is not correctly formatted. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_ecp_import_key( + const psa_key_attributes_t *attributes, + const uint8_t *data, size_t data_length, + uint8_t *key_buffer, size_t key_buffer_size, + size_t *key_buffer_length, size_t *bits); + +/** Export an ECP key to export representation + * + * \param[in] type The type of key (public/private) to export + * \param[in] ecp The internal ECP representation from which to export + * \param[out] data The buffer to export to + * \param[in] data_size The length of the buffer to export to + * \param[out] data_length The amount of bytes written to \p data + */ +psa_status_t mbedtls_psa_ecp_export_key(psa_key_type_t type, + mbedtls_ecp_keypair *ecp, + uint8_t *data, + size_t data_size, + size_t *data_length); + +/** Export an ECP public key or the public part of an ECP key pair in binary + * format. + * + * \note The signature of this function is that of a PSA driver + * export_public_key entry point. This function behaves as an + * export_public_key entry point as defined in the PSA driver interface + * specification. + * + * \param[in] attributes The attributes for the key to export. + * \param[in] key_buffer Material or context of the key to export. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[out] data Buffer where the key data is to be written. + * \param[in] data_size Size of the \p data buffer in bytes. + * \param[out] data_length On success, the number of bytes written in + * \p data + * + * \retval #PSA_SUCCESS The ECP public key was exported successfully. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t mbedtls_psa_ecp_export_public_key( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + uint8_t *data, size_t data_size, size_t *data_length); + +/** + * \brief Generate an ECP key. + * + * \note The signature of the function is that of a PSA driver generate_key + * entry point. + * + * \param[in] attributes The attributes for the ECP key to generate. + * \param[out] key_buffer Buffer where the key data is to be written. + * \param[in] key_buffer_size Size of \p key_buffer in bytes. + * \param[out] key_buffer_length On success, the number of bytes written in + * \p key_buffer. + * + * \retval #PSA_SUCCESS + * The key was successfully generated. + * \retval #PSA_ERROR_NOT_SUPPORTED + * Key length or type not supported. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of \p key_buffer is too small. + */ +psa_status_t mbedtls_psa_ecp_generate_key( + const psa_key_attributes_t *attributes, + uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length); + +/** Sign an already-calculated hash with ECDSA. + * + * \note The signature of this function is that of a PSA driver + * sign_hash entry point. This function behaves as a sign_hash + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes of the ECC key to use for the + * operation. + * \param[in] key_buffer The buffer containing the ECC key context. + * format. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg Randomized or deterministic ECDSA algorithm. + * \param[in] hash The hash or message to sign. + * \param[in] hash_length Size of the \p hash buffer in bytes. + * \param[out] signature Buffer where the signature is to be written. + * \param[in] signature_size Size of the \p signature buffer in bytes. + * \param[out] signature_length On success, the number of bytes + * that make up the returned signature value. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p signature buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_SIGN_OUTPUT_SIZE(\c PSA_KEY_TYPE_ECC_KEY_PAIR, \c key_bits, + * \p alg) where \c key_bits is the bit-size of the ECC key. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + */ +psa_status_t mbedtls_psa_ecdsa_sign_hash( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + uint8_t *signature, size_t signature_size, size_t *signature_length); + +/** + * \brief Verify an ECDSA hash or short message signature. + * + * \note The signature of this function is that of a PSA driver + * verify_hash entry point. This function behaves as a verify_hash + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes of the ECC key to use for the + * operation. + * \param[in] key_buffer The buffer containing the ECC key context. + * format. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg Randomized or deterministic ECDSA algorithm. + * \param[in] hash The hash or message whose signature is to be + * verified. + * \param[in] hash_length Size of the \p hash buffer in bytes. + * \param[in] signature Buffer containing the signature to verify. + * \param[in] signature_length Size of the \p signature buffer in bytes. + * + * \retval #PSA_SUCCESS + * The signature is valid. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The calculation was performed successfully, but the passed + * signature is not a valid signature. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t mbedtls_psa_ecdsa_verify_hash( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + const uint8_t *signature, size_t signature_length); + +#endif /* PSA_CRYPTO_ECP_H */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_hash.c b/ext/opcua_client/mbedtls/library/psa_crypto_hash.c new file mode 100644 index 0000000..484c81b --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_hash.c @@ -0,0 +1,476 @@ +/* + * PSA hashing layer on top of Mbed TLS software crypto + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PSA_CRYPTO_C) + +#include +#include "psa_crypto_core.h" +#include "psa_crypto_hash.h" + +#include +#include + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) +const mbedtls_md_info_t *mbedtls_md_info_from_psa(psa_algorithm_t alg) +{ + switch (alg) { +#if defined(MBEDTLS_MD2_C) + case PSA_ALG_MD2: + return &mbedtls_md2_info; +#endif +#if defined(MBEDTLS_MD4_C) + case PSA_ALG_MD4: + return &mbedtls_md4_info; +#endif +#if defined(MBEDTLS_MD5_C) + case PSA_ALG_MD5: + return &mbedtls_md5_info; +#endif +#if defined(MBEDTLS_RIPEMD160_C) + case PSA_ALG_RIPEMD160: + return &mbedtls_ripemd160_info; +#endif +#if defined(MBEDTLS_SHA1_C) + case PSA_ALG_SHA_1: + return &mbedtls_sha1_info; +#endif +#if defined(MBEDTLS_SHA256_C) + case PSA_ALG_SHA_224: + return &mbedtls_sha224_info; +#endif +#if defined(MBEDTLS_SHA256_C) + case PSA_ALG_SHA_256: + return &mbedtls_sha256_info; +#endif +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) + case PSA_ALG_SHA_384: + return &mbedtls_sha384_info; +#endif +#if defined(MBEDTLS_SHA512_C) + case PSA_ALG_SHA_512: + return &mbedtls_sha512_info; +#endif + default: + return NULL; + } +} +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */ + +#if defined(MBEDTLS_PSA_BUILTIN_HASH) +psa_status_t mbedtls_psa_hash_abort( + mbedtls_psa_hash_operation_t *operation) +{ + switch (operation->alg) { + case 0: + /* The object has (apparently) been initialized but it is not + * in use. It's ok to call abort on such an object, and there's + * nothing to do. */ + break; +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD2) + case PSA_ALG_MD2: + mbedtls_md2_free(&operation->ctx.md2); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD4) + case PSA_ALG_MD4: + mbedtls_md4_free(&operation->ctx.md4); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD5) + case PSA_ALG_MD5: + mbedtls_md5_free(&operation->ctx.md5); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160) + case PSA_ALG_RIPEMD160: + mbedtls_ripemd160_free(&operation->ctx.ripemd160); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1) + case PSA_ALG_SHA_1: + mbedtls_sha1_free(&operation->ctx.sha1); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224) + case PSA_ALG_SHA_224: + mbedtls_sha256_free(&operation->ctx.sha256); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256) + case PSA_ALG_SHA_256: + mbedtls_sha256_free(&operation->ctx.sha256); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384) + case PSA_ALG_SHA_384: + mbedtls_sha512_free(&operation->ctx.sha512); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512) + case PSA_ALG_SHA_512: + mbedtls_sha512_free(&operation->ctx.sha512); + break; +#endif + default: + return PSA_ERROR_BAD_STATE; + } + operation->alg = 0; + return PSA_SUCCESS; +} + +psa_status_t mbedtls_psa_hash_setup( + mbedtls_psa_hash_operation_t *operation, + psa_algorithm_t alg) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + /* A context must be freshly initialized before it can be set up. */ + if (operation->alg != 0) { + return PSA_ERROR_BAD_STATE; + } + + switch (alg) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD2) + case PSA_ALG_MD2: + mbedtls_md2_init(&operation->ctx.md2); + ret = mbedtls_md2_starts_ret(&operation->ctx.md2); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD4) + case PSA_ALG_MD4: + mbedtls_md4_init(&operation->ctx.md4); + ret = mbedtls_md4_starts_ret(&operation->ctx.md4); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD5) + case PSA_ALG_MD5: + mbedtls_md5_init(&operation->ctx.md5); + ret = mbedtls_md5_starts_ret(&operation->ctx.md5); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160) + case PSA_ALG_RIPEMD160: + mbedtls_ripemd160_init(&operation->ctx.ripemd160); + ret = mbedtls_ripemd160_starts_ret(&operation->ctx.ripemd160); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1) + case PSA_ALG_SHA_1: + mbedtls_sha1_init(&operation->ctx.sha1); + ret = mbedtls_sha1_starts_ret(&operation->ctx.sha1); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224) + case PSA_ALG_SHA_224: + mbedtls_sha256_init(&operation->ctx.sha256); + ret = mbedtls_sha256_starts_ret(&operation->ctx.sha256, 1); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256) + case PSA_ALG_SHA_256: + mbedtls_sha256_init(&operation->ctx.sha256); + ret = mbedtls_sha256_starts_ret(&operation->ctx.sha256, 0); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384) + case PSA_ALG_SHA_384: + mbedtls_sha512_init(&operation->ctx.sha512); + ret = mbedtls_sha512_starts_ret(&operation->ctx.sha512, 1); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512) + case PSA_ALG_SHA_512: + mbedtls_sha512_init(&operation->ctx.sha512); + ret = mbedtls_sha512_starts_ret(&operation->ctx.sha512, 0); + break; +#endif + default: + return PSA_ALG_IS_HASH(alg) ? + PSA_ERROR_NOT_SUPPORTED : + PSA_ERROR_INVALID_ARGUMENT; + } + if (ret == 0) { + operation->alg = alg; + } else { + mbedtls_psa_hash_abort(operation); + } + return mbedtls_to_psa_error(ret); +} + +psa_status_t mbedtls_psa_hash_clone( + const mbedtls_psa_hash_operation_t *source_operation, + mbedtls_psa_hash_operation_t *target_operation) +{ + switch (source_operation->alg) { + case 0: + return PSA_ERROR_BAD_STATE; +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD2) + case PSA_ALG_MD2: + mbedtls_md2_clone(&target_operation->ctx.md2, + &source_operation->ctx.md2); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD4) + case PSA_ALG_MD4: + mbedtls_md4_clone(&target_operation->ctx.md4, + &source_operation->ctx.md4); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD5) + case PSA_ALG_MD5: + mbedtls_md5_clone(&target_operation->ctx.md5, + &source_operation->ctx.md5); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160) + case PSA_ALG_RIPEMD160: + mbedtls_ripemd160_clone(&target_operation->ctx.ripemd160, + &source_operation->ctx.ripemd160); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1) + case PSA_ALG_SHA_1: + mbedtls_sha1_clone(&target_operation->ctx.sha1, + &source_operation->ctx.sha1); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224) + case PSA_ALG_SHA_224: + mbedtls_sha256_clone(&target_operation->ctx.sha256, + &source_operation->ctx.sha256); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256) + case PSA_ALG_SHA_256: + mbedtls_sha256_clone(&target_operation->ctx.sha256, + &source_operation->ctx.sha256); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384) + case PSA_ALG_SHA_384: + mbedtls_sha512_clone(&target_operation->ctx.sha512, + &source_operation->ctx.sha512); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512) + case PSA_ALG_SHA_512: + mbedtls_sha512_clone(&target_operation->ctx.sha512, + &source_operation->ctx.sha512); + break; +#endif + default: + (void) source_operation; + (void) target_operation; + return PSA_ERROR_NOT_SUPPORTED; + } + + target_operation->alg = source_operation->alg; + return PSA_SUCCESS; +} + +psa_status_t mbedtls_psa_hash_update( + mbedtls_psa_hash_operation_t *operation, + const uint8_t *input, + size_t input_length) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + switch (operation->alg) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD2) + case PSA_ALG_MD2: + ret = mbedtls_md2_update_ret(&operation->ctx.md2, + input, input_length); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD4) + case PSA_ALG_MD4: + ret = mbedtls_md4_update_ret(&operation->ctx.md4, + input, input_length); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD5) + case PSA_ALG_MD5: + ret = mbedtls_md5_update_ret(&operation->ctx.md5, + input, input_length); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160) + case PSA_ALG_RIPEMD160: + ret = mbedtls_ripemd160_update_ret(&operation->ctx.ripemd160, + input, input_length); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1) + case PSA_ALG_SHA_1: + ret = mbedtls_sha1_update_ret(&operation->ctx.sha1, + input, input_length); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224) + case PSA_ALG_SHA_224: + ret = mbedtls_sha256_update_ret(&operation->ctx.sha256, + input, input_length); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256) + case PSA_ALG_SHA_256: + ret = mbedtls_sha256_update_ret(&operation->ctx.sha256, + input, input_length); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384) + case PSA_ALG_SHA_384: + ret = mbedtls_sha512_update_ret(&operation->ctx.sha512, + input, input_length); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512) + case PSA_ALG_SHA_512: + ret = mbedtls_sha512_update_ret(&operation->ctx.sha512, + input, input_length); + break; +#endif + default: + (void) input; + (void) input_length; + return PSA_ERROR_BAD_STATE; + } + + return mbedtls_to_psa_error(ret); +} + +psa_status_t mbedtls_psa_hash_finish( + mbedtls_psa_hash_operation_t *operation, + uint8_t *hash, + size_t hash_size, + size_t *hash_length) +{ + psa_status_t status; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t actual_hash_length = PSA_HASH_LENGTH(operation->alg); + + /* Fill the output buffer with something that isn't a valid hash + * (barring an attack on the hash and deliberately-crafted input), + * in case the caller doesn't check the return status properly. */ + *hash_length = hash_size; + /* If hash_size is 0 then hash may be NULL and then the + * call to memset would have undefined behavior. */ + if (hash_size != 0) { + memset(hash, '!', hash_size); + } + + if (hash_size < actual_hash_length) { + status = PSA_ERROR_BUFFER_TOO_SMALL; + goto exit; + } + + switch (operation->alg) { +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD2) + case PSA_ALG_MD2: + ret = mbedtls_md2_finish_ret(&operation->ctx.md2, hash); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD4) + case PSA_ALG_MD4: + ret = mbedtls_md4_finish_ret(&operation->ctx.md4, hash); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_MD5) + case PSA_ALG_MD5: + ret = mbedtls_md5_finish_ret(&operation->ctx.md5, hash); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RIPEMD160) + case PSA_ALG_RIPEMD160: + ret = mbedtls_ripemd160_finish_ret(&operation->ctx.ripemd160, hash); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_1) + case PSA_ALG_SHA_1: + ret = mbedtls_sha1_finish_ret(&operation->ctx.sha1, hash); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_224) + case PSA_ALG_SHA_224: + ret = mbedtls_sha256_finish_ret(&operation->ctx.sha256, hash); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_256) + case PSA_ALG_SHA_256: + ret = mbedtls_sha256_finish_ret(&operation->ctx.sha256, hash); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_384) + case PSA_ALG_SHA_384: + ret = mbedtls_sha512_finish_ret(&operation->ctx.sha512, hash); + break; +#endif +#if defined(MBEDTLS_PSA_BUILTIN_ALG_SHA_512) + case PSA_ALG_SHA_512: + ret = mbedtls_sha512_finish_ret(&operation->ctx.sha512, hash); + break; +#endif + default: + (void) hash; + return PSA_ERROR_BAD_STATE; + } + status = mbedtls_to_psa_error(ret); + +exit: + if (status == PSA_SUCCESS) { + *hash_length = actual_hash_length; + } + return status; +} + +psa_status_t mbedtls_psa_hash_compute( + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *hash, + size_t hash_size, + size_t *hash_length) +{ + mbedtls_psa_hash_operation_t operation = MBEDTLS_PSA_HASH_OPERATION_INIT; + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED; + + *hash_length = hash_size; + status = mbedtls_psa_hash_setup(&operation, alg); + if (status != PSA_SUCCESS) { + goto exit; + } + status = mbedtls_psa_hash_update(&operation, input, input_length); + if (status != PSA_SUCCESS) { + goto exit; + } + status = mbedtls_psa_hash_finish(&operation, hash, hash_size, hash_length); + if (status != PSA_SUCCESS) { + goto exit; + } + +exit: + abort_status = mbedtls_psa_hash_abort(&operation); + if (status == PSA_SUCCESS) { + return abort_status; + } else { + return status; + } + +} +#endif /* MBEDTLS_PSA_BUILTIN_HASH */ + +#endif /* MBEDTLS_PSA_CRYPTO_C */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_hash.h b/ext/opcua_client/mbedtls/library/psa_crypto_hash.h new file mode 100644 index 0000000..5c196b2 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_hash.h @@ -0,0 +1,222 @@ +/* + * PSA hashing layer on top of Mbed TLS software crypto + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_HASH_H +#define PSA_CRYPTO_HASH_H + +#include + +#include + +/** Get Mbed TLS MD information of a hash algorithm given its PSA identifier + * + * \param[in] alg PSA hash algorithm identifier + * + * \return The Mbed TLS MD information of the hash algorithm. \c NULL if the + * PSA hash algorithm is not supported. + */ +const mbedtls_md_info_t *mbedtls_md_info_from_psa(psa_algorithm_t alg); + +/** Calculate the hash (digest) of a message using Mbed TLS routines. + * + * \note The signature of this function is that of a PSA driver hash_compute + * entry point. This function behaves as a hash_compute entry point as + * defined in the PSA driver interface specification for transparent + * drivers. + * + * \param alg The hash algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_HASH(\p alg) is true). + * \param[in] input Buffer containing the message to hash. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] hash Buffer where the hash is to be written. + * \param hash_size Size of the \p hash buffer in bytes. + * \param[out] hash_length On success, the number of bytes + * that make up the hash value. This is always + * #PSA_HASH_LENGTH(\p alg). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \p hash_size is too small + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_hash_compute( + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *hash, + size_t hash_size, + size_t *hash_length); + +/** Set up a multipart hash operation using Mbed TLS routines. + * + * \note The signature of this function is that of a PSA driver hash_setup + * entry point. This function behaves as a hash_setup entry point as + * defined in the PSA driver interface specification for transparent + * drivers. + * + * If an error occurs at any step after a call to mbedtls_psa_hash_setup(), the + * operation will need to be reset by a call to mbedtls_psa_hash_abort(). The + * core may call mbedtls_psa_hash_abort() at any time after the operation + * has been initialized. + * + * After a successful call to mbedtls_psa_hash_setup(), the core must + * eventually terminate the operation. The following events terminate an + * operation: + * - A successful call to mbedtls_psa_hash_finish() or mbedtls_psa_hash_verify(). + * - A call to mbedtls_psa_hash_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized to all-zero and not yet be in use. + * \param alg The hash algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_HASH(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_hash_setup( + mbedtls_psa_hash_operation_t *operation, + psa_algorithm_t alg); + +/** Clone an Mbed TLS hash operation. + * + * \note The signature of this function is that of a PSA driver hash_clone + * entry point. This function behaves as a hash_clone entry point as + * defined in the PSA driver interface specification for transparent + * drivers. + * + * This function copies the state of an ongoing hash operation to + * a new operation object. In other words, this function is equivalent + * to calling mbedtls_psa_hash_setup() on \p target_operation with the same + * algorithm that \p source_operation was set up for, then + * mbedtls_psa_hash_update() on \p target_operation with the same input that + * that was passed to \p source_operation. After this function returns, the + * two objects are independent, i.e. subsequent calls involving one of + * the objects do not affect the other object. + * + * \param[in] source_operation The active hash operation to clone. + * \param[in,out] target_operation The operation object to set up. + * It must be initialized but not active. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The \p source_operation state is not valid (it must be active). + * \retval #PSA_ERROR_BAD_STATE + * The \p target_operation state is not valid (it must be inactive). + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t mbedtls_psa_hash_clone( + const mbedtls_psa_hash_operation_t *source_operation, + mbedtls_psa_hash_operation_t *target_operation); + +/** Add a message fragment to a multipart Mbed TLS hash operation. + * + * \note The signature of this function is that of a PSA driver hash_update + * entry point. This function behaves as a hash_update entry point as + * defined in the PSA driver interface specification for transparent + * drivers. + * + * The application must call mbedtls_psa_hash_setup() before calling this function. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling mbedtls_psa_hash_abort(). + * + * \param[in,out] operation Active hash operation. + * \param[in] input Buffer containing the message fragment to hash. + * \param input_length Size of the \p input buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_hash_update( + mbedtls_psa_hash_operation_t *operation, + const uint8_t *input, + size_t input_length); + +/** Finish the calculation of the Mbed TLS-calculated hash of a message. + * + * \note The signature of this function is that of a PSA driver hash_finish + * entry point. This function behaves as a hash_finish entry point as + * defined in the PSA driver interface specification for transparent + * drivers. + * + * The application must call mbedtls_psa_hash_setup() before calling this function. + * This function calculates the hash of the message formed by concatenating + * the inputs passed to preceding calls to mbedtls_psa_hash_update(). + * + * When this function returns successfully, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling mbedtls_psa_hash_abort(). + * + * \param[in,out] operation Active hash operation. + * \param[out] hash Buffer where the hash is to be written. + * \param hash_size Size of the \p hash buffer in bytes. + * \param[out] hash_length On success, the number of bytes + * that make up the hash value. This is always + * #PSA_HASH_LENGTH(\c alg) where \c alg is the + * hash algorithm that is calculated. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active). + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p hash buffer is too small. You can determine a + * sufficient buffer size by calling #PSA_HASH_LENGTH(\c alg) + * where \c alg is the hash algorithm that is calculated. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_hash_finish( + mbedtls_psa_hash_operation_t *operation, + uint8_t *hash, + size_t hash_size, + size_t *hash_length); + +/** Abort an Mbed TLS hash operation. + * + * \note The signature of this function is that of a PSA driver hash_abort + * entry point. This function behaves as a hash_abort entry point as + * defined in the PSA driver interface specification for transparent + * drivers. + * + * Aborting an operation frees all associated resources except for the + * \p operation structure itself. Once aborted, the operation object + * can be reused for another operation by calling + * mbedtls_psa_hash_setup() again. + * + * You may call this function any time after the operation object has + * been initialized by one of the methods described in #psa_hash_operation_t. + * + * In particular, calling mbedtls_psa_hash_abort() after the operation has been + * terminated by a call to mbedtls_psa_hash_abort(), mbedtls_psa_hash_finish() or + * mbedtls_psa_hash_verify() is safe and has no effect. + * + * \param[in,out] operation Initialized hash operation. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_hash_abort( + mbedtls_psa_hash_operation_t *operation); + +#endif /* PSA_CRYPTO_HASH_H */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_invasive.h b/ext/opcua_client/mbedtls/library/psa_crypto_invasive.h new file mode 100644 index 0000000..a1281d1 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_invasive.h @@ -0,0 +1,89 @@ +/** + * \file psa_crypto_invasive.h + * + * \brief PSA cryptography module: invasive interfaces for test only. + * + * The interfaces in this file are intended for testing purposes only. + * They MUST NOT be made available to clients over IPC in integrations + * with isolation, and they SHOULD NOT be made available in library + * integrations except when building the library for testing. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_INVASIVE_H +#define PSA_CRYPTO_INVASIVE_H + +#if defined(MBEDTLS_CONFIG_FILE) +#include MBEDTLS_CONFIG_FILE +#else +#include "mbedtls/config.h" +#endif + +#include "psa/crypto.h" +#include "common.h" + +#include "mbedtls/entropy.h" + +#if !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) +/** \brief Configure entropy sources. + * + * This function may only be called before a call to psa_crypto_init(), + * or after a call to mbedtls_psa_crypto_free() and before any + * subsequent call to psa_crypto_init(). + * + * This function is only intended for test purposes. The functionality + * it provides is also useful for system integrators, but + * system integrators should configure entropy drivers instead of + * breaking through to the Mbed TLS API. + * + * \param entropy_init Function to initialize the entropy context + * and set up the desired entropy sources. + * It is called by psa_crypto_init(). + * By default this is mbedtls_entropy_init(). + * This function cannot report failures directly. + * To indicate a failure, set the entropy context + * to a state where mbedtls_entropy_func() will + * return an error. + * \param entropy_free Function to free the entropy context + * and associated resources. + * It is called by mbedtls_psa_crypto_free(). + * By default this is mbedtls_entropy_free(). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_NOT_PERMITTED + * The caller does not have the permission to configure + * entropy sources. + * \retval #PSA_ERROR_BAD_STATE + * The library has already been initialized. + */ +psa_status_t mbedtls_psa_crypto_configure_entropy_sources( + void (* entropy_init)(mbedtls_entropy_context *ctx), + void (* entropy_free)(mbedtls_entropy_context *ctx)); +#endif /* !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) */ + +#if defined(MBEDTLS_TEST_HOOKS) && defined(MBEDTLS_PSA_CRYPTO_C) +psa_status_t psa_mac_key_can_do( + psa_algorithm_t algorithm, + psa_key_type_t key_type); + +psa_status_t psa_crypto_copy_input(const uint8_t *input, size_t input_len, + uint8_t *input_copy, size_t input_copy_len); + +psa_status_t psa_crypto_copy_output(const uint8_t *output_copy, size_t output_copy_len, + uint8_t *output, size_t output_len); + +/* + * Test hooks to use for memory unpoisoning/poisoning in copy functions. + */ +extern void (*psa_input_pre_copy_hook)(const uint8_t *input, size_t input_len); +extern void (*psa_input_post_copy_hook)(const uint8_t *input, size_t input_len); +extern void (*psa_output_pre_copy_hook)(const uint8_t *output, size_t output_len); +extern void (*psa_output_post_copy_hook)(const uint8_t *output, size_t output_len); + +#endif /* MBEDTLS_TEST_HOOKS && MBEDTLS_PSA_CRYPTO_C */ + +#endif /* PSA_CRYPTO_INVASIVE_H */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_its.h b/ext/opcua_client/mbedtls/library/psa_crypto_its.h new file mode 100644 index 0000000..877063b --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_its.h @@ -0,0 +1,131 @@ +/** \file psa_crypto_its.h + * \brief Interface of trusted storage that crypto is built on. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_ITS_H +#define PSA_CRYPTO_ITS_H + +#include +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \brief Flags used when creating a data entry + */ +typedef uint32_t psa_storage_create_flags_t; + +/** \brief A type for UIDs used for identifying data + */ +typedef uint64_t psa_storage_uid_t; + +#define PSA_STORAGE_FLAG_NONE 0 /**< No flags to pass */ +#define PSA_STORAGE_FLAG_WRITE_ONCE (1 << 0) /**< The data associated with the uid will not be able to be modified or deleted. Intended to be used to set bits in `psa_storage_create_flags_t`*/ + +/** + * \brief A container for metadata associated with a specific uid + */ +struct psa_storage_info_t { + uint32_t size; /**< The size of the data associated with a uid **/ + psa_storage_create_flags_t flags; /**< The flags set when the uid was created **/ +}; + +/** Flag indicating that \ref psa_storage_create and \ref psa_storage_set_extended are supported */ +#define PSA_STORAGE_SUPPORT_SET_EXTENDED (1 << 0) + +#define PSA_ITS_API_VERSION_MAJOR 1 /**< The major version number of the PSA ITS API. It will be incremented on significant updates that may include breaking changes */ +#define PSA_ITS_API_VERSION_MINOR 1 /**< The minor version number of the PSA ITS API. It will be incremented in small updates that are unlikely to include breaking changes */ + +/** + * \brief create a new or modify an existing uid/value pair + * + * \param[in] uid the identifier for the data + * \param[in] data_length The size in bytes of the data in `p_data` + * \param[in] p_data A buffer containing the data + * \param[in] create_flags The flags that the data will be stored with + * + * \return A status indicating the success/failure of the operation + * + * \retval #PSA_SUCCESS The operation completed successfully + * \retval #PSA_ERROR_NOT_PERMITTED The operation failed because the provided `uid` value was already created with PSA_STORAGE_FLAG_WRITE_ONCE + * \retval #PSA_ERROR_NOT_SUPPORTED The operation failed because one or more of the flags provided in `create_flags` is not supported or is not valid + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE The operation failed because there was insufficient space on the storage medium + * \retval #PSA_ERROR_STORAGE_FAILURE The operation failed because the physical storage has failed (Fatal error) + * \retval #PSA_ERROR_INVALID_ARGUMENT The operation failed because one of the provided pointers(`p_data`) + * is invalid, for example is `NULL` or references memory the caller cannot access + */ +psa_status_t psa_its_set(psa_storage_uid_t uid, + uint32_t data_length, + const void *p_data, + psa_storage_create_flags_t create_flags); + +/** + * \brief Retrieve the value associated with a provided uid + * + * \param[in] uid The uid value + * \param[in] data_offset The starting offset of the data requested + * \param[in] data_length the amount of data requested (and the minimum allocated size of the `p_data` buffer) + * \param[out] p_data The buffer where the data will be placed upon successful completion + * \param[out] p_data_length The amount of data returned in the p_data buffer + * + * + * \return A status indicating the success/failure of the operation + * + * \retval #PSA_SUCCESS The operation completed successfully + * \retval #PSA_ERROR_DOES_NOT_EXIST The operation failed because the provided `uid` value was not found in the storage + * \retval #PSA_ERROR_STORAGE_FAILURE The operation failed because the physical storage has failed (Fatal error) + * \retval #PSA_ERROR_DATA_CORRUPT The operation failed because stored data has been corrupted + * \retval #PSA_ERROR_INVALID_ARGUMENT The operation failed because one of the provided pointers(`p_data`, `p_data_length`) + * is invalid. For example is `NULL` or references memory the caller cannot access. + * In addition, this can also happen if an invalid offset was provided. + */ +psa_status_t psa_its_get(psa_storage_uid_t uid, + uint32_t data_offset, + uint32_t data_length, + void *p_data, + size_t *p_data_length); + +/** + * \brief Retrieve the metadata about the provided uid + * + * \param[in] uid The uid value + * \param[out] p_info A pointer to the `psa_storage_info_t` struct that will be populated with the metadata + * + * \return A status indicating the success/failure of the operation + * + * \retval #PSA_SUCCESS The operation completed successfully + * \retval #PSA_ERROR_DOES_NOT_EXIST The operation failed because the provided uid value was not found in the storage + * \retval #PSA_ERROR_DATA_CORRUPT The operation failed because stored data has been corrupted + * \retval #PSA_ERROR_INVALID_ARGUMENT The operation failed because one of the provided pointers(`p_info`) + * is invalid, for example is `NULL` or references memory the caller cannot access + */ +psa_status_t psa_its_get_info(psa_storage_uid_t uid, + struct psa_storage_info_t *p_info); + +/** + * \brief Remove the provided key and its associated data from the storage + * + * \param[in] uid The uid value + * + * \return A status indicating the success/failure of the operation + * + * \retval #PSA_SUCCESS The operation completed successfully + * \retval #PSA_ERROR_DOES_NOT_EXIST The operation failed because the provided key value was not found in the storage + * \retval #PSA_ERROR_NOT_PERMITTED The operation failed because the provided key value was created with PSA_STORAGE_FLAG_WRITE_ONCE + * \retval #PSA_ERROR_STORAGE_FAILURE The operation failed because the physical storage has failed (Fatal error) + */ +psa_status_t psa_its_remove(psa_storage_uid_t uid); + +#ifdef __cplusplus +} +#endif + +#endif /* PSA_CRYPTO_ITS_H */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_mac.c b/ext/opcua_client/mbedtls/library/psa_crypto_mac.c new file mode 100644 index 0000000..2e722d2 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_mac.c @@ -0,0 +1,495 @@ +/* + * PSA MAC layer on top of Mbed TLS software crypto + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PSA_CRYPTO_C) + +#include +#include "psa_crypto_core.h" +#include "psa_crypto_cipher.h" +#include "psa_crypto_mac.h" +#include + +#include +#include + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HMAC) +static psa_status_t psa_hmac_abort_internal( + mbedtls_psa_hmac_operation_t *hmac) +{ + mbedtls_platform_zeroize(hmac->opad, sizeof(hmac->opad)); + return psa_hash_abort(&hmac->hash_ctx); +} + +static psa_status_t psa_hmac_setup_internal( + mbedtls_psa_hmac_operation_t *hmac, + const uint8_t *key, + size_t key_length, + psa_algorithm_t hash_alg) +{ + uint8_t ipad[PSA_HMAC_MAX_HASH_BLOCK_SIZE]; + size_t i; + size_t hash_size = PSA_HASH_LENGTH(hash_alg); + size_t block_size = PSA_HASH_BLOCK_LENGTH(hash_alg); + psa_status_t status; + + hmac->alg = hash_alg; + + /* Sanity checks on block_size, to guarantee that there won't be a buffer + * overflow below. This should never trigger if the hash algorithm + * is implemented correctly. */ + /* The size checks against the ipad and opad buffers cannot be written + * `block_size > sizeof( ipad ) || block_size > sizeof( hmac->opad )` + * because that triggers -Wlogical-op on GCC 7.3. */ + if (block_size > sizeof(ipad)) { + return PSA_ERROR_NOT_SUPPORTED; + } + if (block_size > sizeof(hmac->opad)) { + return PSA_ERROR_NOT_SUPPORTED; + } + if (block_size < hash_size) { + return PSA_ERROR_NOT_SUPPORTED; + } + + if (key_length > block_size) { + status = psa_hash_compute(hash_alg, key, key_length, + ipad, sizeof(ipad), &key_length); + if (status != PSA_SUCCESS) { + goto cleanup; + } + } + /* A 0-length key is not commonly used in HMAC when used as a MAC, + * but it is permitted. It is common when HMAC is used in HKDF, for + * example. Don't call `memcpy` in the 0-length because `key` could be + * an invalid pointer which would make the behavior undefined. */ + else if (key_length != 0) { + memcpy(ipad, key, key_length); + } + + /* ipad contains the key followed by garbage. Xor and fill with 0x36 + * to create the ipad value. */ + for (i = 0; i < key_length; i++) { + ipad[i] ^= 0x36; + } + memset(ipad + key_length, 0x36, block_size - key_length); + + /* Copy the key material from ipad to opad, flipping the requisite bits, + * and filling the rest of opad with the requisite constant. */ + for (i = 0; i < key_length; i++) { + hmac->opad[i] = ipad[i] ^ 0x36 ^ 0x5C; + } + memset(hmac->opad + key_length, 0x5C, block_size - key_length); + + status = psa_hash_setup(&hmac->hash_ctx, hash_alg); + if (status != PSA_SUCCESS) { + goto cleanup; + } + + status = psa_hash_update(&hmac->hash_ctx, ipad, block_size); + +cleanup: + mbedtls_platform_zeroize(ipad, sizeof(ipad)); + + return status; +} + +static psa_status_t psa_hmac_update_internal( + mbedtls_psa_hmac_operation_t *hmac, + const uint8_t *data, + size_t data_length) +{ + return psa_hash_update(&hmac->hash_ctx, data, data_length); +} + +static psa_status_t psa_hmac_finish_internal( + mbedtls_psa_hmac_operation_t *hmac, + uint8_t *mac, + size_t mac_size) +{ + uint8_t tmp[PSA_HASH_MAX_SIZE]; + psa_algorithm_t hash_alg = hmac->alg; + size_t hash_size = 0; + size_t block_size = PSA_HASH_BLOCK_LENGTH(hash_alg); + psa_status_t status; + + status = psa_hash_finish(&hmac->hash_ctx, tmp, sizeof(tmp), &hash_size); + if (status != PSA_SUCCESS) { + return status; + } + /* From here on, tmp needs to be wiped. */ + + status = psa_hash_setup(&hmac->hash_ctx, hash_alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_hash_update(&hmac->hash_ctx, hmac->opad, block_size); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_hash_update(&hmac->hash_ctx, tmp, hash_size); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_hash_finish(&hmac->hash_ctx, tmp, sizeof(tmp), &hash_size); + if (status != PSA_SUCCESS) { + goto exit; + } + + memcpy(mac, tmp, mac_size); + +exit: + mbedtls_platform_zeroize(tmp, hash_size); + return status; +} +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HMAC */ + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CMAC) +static psa_status_t cmac_setup(mbedtls_psa_mac_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + +#if defined(PSA_WANT_KEY_TYPE_DES) + /* Mbed TLS CMAC does not accept 3DES with only two keys, nor does it accept + * to do CMAC with pure DES, so return NOT_SUPPORTED here. */ + if (psa_get_key_type(attributes) == PSA_KEY_TYPE_DES && + (psa_get_key_bits(attributes) == 64 || + psa_get_key_bits(attributes) == 128)) { + return PSA_ERROR_NOT_SUPPORTED; + } +#endif + + const mbedtls_cipher_info_t *cipher_info = + mbedtls_cipher_info_from_psa( + PSA_ALG_CMAC, + psa_get_key_type(attributes), + psa_get_key_bits(attributes), + NULL); + + if (cipher_info == NULL) { + return PSA_ERROR_NOT_SUPPORTED; + } + + ret = mbedtls_cipher_setup(&operation->ctx.cmac, cipher_info); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_cipher_cmac_starts(&operation->ctx.cmac, + key_buffer, + psa_get_key_bits(attributes)); +exit: + return mbedtls_to_psa_error(ret); +} +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CMAC */ + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HMAC) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_CMAC) + +/* Initialize this driver's MAC operation structure. Once this function has been + * called, mbedtls_psa_mac_abort can run and will do the right thing. */ +static psa_status_t mac_init( + mbedtls_psa_mac_operation_t *operation, + psa_algorithm_t alg) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + operation->alg = alg; + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CMAC) + if (PSA_ALG_FULL_LENGTH_MAC(operation->alg) == PSA_ALG_CMAC) { + mbedtls_cipher_init(&operation->ctx.cmac); + status = PSA_SUCCESS; + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CMAC */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HMAC) + if (PSA_ALG_IS_HMAC(operation->alg)) { + /* We'll set up the hash operation later in psa_hmac_setup_internal. */ + operation->ctx.hmac.alg = 0; + status = PSA_SUCCESS; + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HMAC */ + { + (void) operation; + status = PSA_ERROR_NOT_SUPPORTED; + } + + if (status != PSA_SUCCESS) { + memset(operation, 0, sizeof(*operation)); + } + return status; +} + +psa_status_t mbedtls_psa_mac_abort(mbedtls_psa_mac_operation_t *operation) +{ + if (operation->alg == 0) { + /* The object has (apparently) been initialized but it is not + * in use. It's ok to call abort on such an object, and there's + * nothing to do. */ + return PSA_SUCCESS; + } else +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CMAC) + if (PSA_ALG_FULL_LENGTH_MAC(operation->alg) == PSA_ALG_CMAC) { + mbedtls_cipher_free(&operation->ctx.cmac); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CMAC */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HMAC) + if (PSA_ALG_IS_HMAC(operation->alg)) { + psa_hmac_abort_internal(&operation->ctx.hmac); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HMAC */ + { + /* Sanity check (shouldn't happen: operation->alg should + * always have been initialized to a valid value). */ + goto bad_state; + } + + operation->alg = 0; + + return PSA_SUCCESS; + +bad_state: + /* If abort is called on an uninitialized object, we can't trust + * anything. Wipe the object in case it contains confidential data. + * This may result in a memory leak if a pointer gets overwritten, + * but it's too late to do anything about this. */ + memset(operation, 0, sizeof(*operation)); + return PSA_ERROR_BAD_STATE; +} + +static psa_status_t psa_mac_setup(mbedtls_psa_mac_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + /* A context must be freshly initialized before it can be set up. */ + if (operation->alg != 0) { + return PSA_ERROR_BAD_STATE; + } + + status = mac_init(operation, alg); + if (status != PSA_SUCCESS) { + return status; + } + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CMAC) + if (PSA_ALG_FULL_LENGTH_MAC(alg) == PSA_ALG_CMAC) { + /* Key buffer size for CMAC is dictated by the key bits set on the + * attributes, and previously validated by the core on key import. */ + (void) key_buffer_size; + status = cmac_setup(operation, attributes, key_buffer); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CMAC */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HMAC) + if (PSA_ALG_IS_HMAC(alg)) { + status = psa_hmac_setup_internal(&operation->ctx.hmac, + key_buffer, + key_buffer_size, + PSA_ALG_HMAC_GET_HASH(alg)); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HMAC */ + { + (void) attributes; + (void) key_buffer; + (void) key_buffer_size; + status = PSA_ERROR_NOT_SUPPORTED; + } + + if (status != PSA_SUCCESS) { + mbedtls_psa_mac_abort(operation); + } + + return status; +} + +psa_status_t mbedtls_psa_mac_sign_setup( + mbedtls_psa_mac_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg) +{ + return psa_mac_setup(operation, attributes, + key_buffer, key_buffer_size, alg); +} + +psa_status_t mbedtls_psa_mac_verify_setup( + mbedtls_psa_mac_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg) +{ + return psa_mac_setup(operation, attributes, + key_buffer, key_buffer_size, alg); +} + +psa_status_t mbedtls_psa_mac_update( + mbedtls_psa_mac_operation_t *operation, + const uint8_t *input, + size_t input_length) +{ + if (operation->alg == 0) { + return PSA_ERROR_BAD_STATE; + } + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CMAC) + if (PSA_ALG_FULL_LENGTH_MAC(operation->alg) == PSA_ALG_CMAC) { + return mbedtls_to_psa_error( + mbedtls_cipher_cmac_update(&operation->ctx.cmac, + input, input_length)); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CMAC */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HMAC) + if (PSA_ALG_IS_HMAC(operation->alg)) { + return psa_hmac_update_internal(&operation->ctx.hmac, + input, input_length); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HMAC */ + { + /* This shouldn't happen if `operation` was initialized by + * a setup function. */ + (void) input; + (void) input_length; + return PSA_ERROR_BAD_STATE; + } +} + +static psa_status_t psa_mac_finish_internal( + mbedtls_psa_mac_operation_t *operation, + uint8_t *mac, size_t mac_size) +{ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_CMAC) + if (PSA_ALG_FULL_LENGTH_MAC(operation->alg) == PSA_ALG_CMAC) { + uint8_t tmp[PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE]; + int ret = mbedtls_cipher_cmac_finish(&operation->ctx.cmac, tmp); + if (ret == 0) { + memcpy(mac, tmp, mac_size); + } + mbedtls_platform_zeroize(tmp, sizeof(tmp)); + return mbedtls_to_psa_error(ret); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_CMAC */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_HMAC) + if (PSA_ALG_IS_HMAC(operation->alg)) { + return psa_hmac_finish_internal(&operation->ctx.hmac, + mac, mac_size); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HMAC */ + { + /* This shouldn't happen if `operation` was initialized by + * a setup function. */ + (void) operation; + (void) mac; + (void) mac_size; + return PSA_ERROR_BAD_STATE; + } +} + +psa_status_t mbedtls_psa_mac_sign_finish( + mbedtls_psa_mac_operation_t *operation, + uint8_t *mac, + size_t mac_size, + size_t *mac_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + if (operation->alg == 0) { + return PSA_ERROR_BAD_STATE; + } + + status = psa_mac_finish_internal(operation, mac, mac_size); + if (status == PSA_SUCCESS) { + *mac_length = mac_size; + } + + return status; +} + +psa_status_t mbedtls_psa_mac_verify_finish( + mbedtls_psa_mac_operation_t *operation, + const uint8_t *mac, + size_t mac_length) +{ + uint8_t actual_mac[PSA_MAC_MAX_SIZE]; + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + if (operation->alg == 0) { + return PSA_ERROR_BAD_STATE; + } + + /* Consistency check: requested MAC length fits our local buffer */ + if (mac_length > sizeof(actual_mac)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + status = psa_mac_finish_internal(operation, actual_mac, mac_length); + if (status != PSA_SUCCESS) { + goto cleanup; + } + + if (mbedtls_psa_safer_memcmp(mac, actual_mac, mac_length) != 0) { + status = PSA_ERROR_INVALID_SIGNATURE; + } + +cleanup: + mbedtls_platform_zeroize(actual_mac, sizeof(actual_mac)); + + return status; +} + +psa_status_t mbedtls_psa_mac_compute( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *mac, + size_t mac_size, + size_t *mac_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + mbedtls_psa_mac_operation_t operation = MBEDTLS_PSA_MAC_OPERATION_INIT; + + status = psa_mac_setup(&operation, + attributes, key_buffer, key_buffer_size, + alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + if (input_length > 0) { + status = mbedtls_psa_mac_update(&operation, input, input_length); + if (status != PSA_SUCCESS) { + goto exit; + } + } + + status = psa_mac_finish_internal(&operation, mac, mac_size); + if (status == PSA_SUCCESS) { + *mac_length = mac_size; + } + +exit: + mbedtls_psa_mac_abort(&operation); + + return status; +} + +#endif /* MBEDTLS_PSA_BUILTIN_ALG_HMAC || MBEDTLS_PSA_BUILTIN_ALG_CMAC */ + +#endif /* MBEDTLS_PSA_CRYPTO_C */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_mac.h b/ext/opcua_client/mbedtls/library/psa_crypto_mac.h new file mode 100644 index 0000000..2f614bc --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_mac.h @@ -0,0 +1,264 @@ +/* + * PSA MAC layer on top of Mbed TLS software crypto + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_MAC_H +#define PSA_CRYPTO_MAC_H + +#include + +/** Calculate the MAC (message authentication code) of a message using Mbed TLS. + * + * \note The signature of this function is that of a PSA driver mac_compute + * entry point. This function behaves as a mac_compute entry point as + * defined in the PSA driver interface specification for transparent + * drivers. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key to use for + * computing the MAC. This buffer contains the key + * in export representation as defined by + * psa_export_key() (i.e. the raw key bytes). + * \param key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param alg The MAC algorithm to use (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_MAC(\p alg) is true). + * \param[in] input Buffer containing the input message. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] mac Buffer where the MAC value is to be written. + * \param mac_size Size of the \p mac buffer in bytes. + * \param[out] mac_length On success, the number of bytes + * that make up the MAC value. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \p mac_size is too small + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_mac_compute( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *mac, + size_t mac_size, + size_t *mac_length); + +/** Set up a multipart MAC calculation operation using Mbed TLS. + * + * \note The signature of this function is that of a PSA driver mac_sign_setup + * entry point. This function behaves as a mac_sign_setup entry point as + * defined in the PSA driver interface specification for transparent + * drivers. + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized and not yet in use. + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key to use for + * computing the MAC. This buffer contains the key + * in export representation as defined by + * psa_export_key() (i.e. the raw key bytes). + * \param key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param alg The MAC algorithm to use (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_MAC(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive). + */ +psa_status_t mbedtls_psa_mac_sign_setup( + mbedtls_psa_mac_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg); + +/** Set up a multipart MAC verification operation using Mbed TLS. + * + * \note The signature of this function is that of a PSA driver mac_verify_setup + * entry point. This function behaves as a mac_verify_setup entry point as + * defined in the PSA driver interface specification for transparent + * drivers. + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized and not yet in use. + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key to use for + * computing the MAC. This buffer contains the key + * in export representation as defined by + * psa_export_key() (i.e. the raw key bytes). + * \param key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param alg The MAC algorithm to use (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_MAC(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive). + */ +psa_status_t mbedtls_psa_mac_verify_setup( + mbedtls_psa_mac_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg); + +/** Add a message fragment to a multipart MAC operation using Mbed TLS. + * + * \note The signature of this function is that of a PSA driver mac_update + * entry point. This function behaves as a mac_update entry point as + * defined in the PSA driver interface specification for transparent + * drivers. + * + * The PSA core calls mbedtls_psa_mac_sign_setup() or + * mbedtls_psa_mac_verify_setup() before calling this function. + * + * If this function returns an error status, the PSA core aborts the + * operation by calling mbedtls_psa_mac_abort(). + * + * \param[in,out] operation Active MAC operation. + * \param[in] input Buffer containing the message fragment to add to + * the MAC calculation. + * \param input_length Size of the \p input buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_mac_update( + mbedtls_psa_mac_operation_t *operation, + const uint8_t *input, + size_t input_length); + +/** Finish the calculation of the MAC of a message using Mbed TLS. + * + * \note The signature of this function is that of a PSA driver mac_sign_finish + * entry point. This function behaves as a mac_sign_finish entry point as + * defined in the PSA driver interface specification for transparent + * drivers. + * + * The PSA core calls mbedtls_psa_mac_sign_setup() before calling this function. + * This function calculates the MAC of the message formed by concatenating + * the inputs passed to preceding calls to mbedtls_psa_mac_update(). + * + * Whether this function returns successfully or not, the PSA core subsequently + * aborts the operation by calling mbedtls_psa_mac_abort(). + * + * \param[in,out] operation Active MAC operation. + * \param[out] mac Buffer where the MAC value is to be written. + * \param mac_size Output size requested for the MAC algorithm. The PSA + * core guarantees this is a valid MAC length for the + * algorithm and key combination passed to + * mbedtls_psa_mac_sign_setup(). It also guarantees the + * \p mac buffer is large enough to contain the + * requested output size. + * \param[out] mac_length On success, the number of bytes output to buffer + * \p mac, which will be equal to the requested length + * \p mac_size. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active mac sign + * operation). + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p mac buffer is too small. A sufficient buffer size + * can be determined by calling PSA_MAC_LENGTH(). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_mac_sign_finish( + mbedtls_psa_mac_operation_t *operation, + uint8_t *mac, + size_t mac_size, + size_t *mac_length); + +/** Finish the calculation of the MAC of a message and compare it with + * an expected value using Mbed TLS. + * + * \note The signature of this function is that of a PSA driver + * mac_verify_finish entry point. This function behaves as a + * mac_verify_finish entry point as defined in the PSA driver interface + * specification for transparent drivers. + * + * The PSA core calls mbedtls_psa_mac_verify_setup() before calling this + * function. This function calculates the MAC of the message formed by + * concatenating the inputs passed to preceding calls to + * mbedtls_psa_mac_update(). It then compares the calculated MAC with the + * expected MAC passed as a parameter to this function. + * + * Whether this function returns successfully or not, the PSA core subsequently + * aborts the operation by calling mbedtls_psa_mac_abort(). + * + * \param[in,out] operation Active MAC operation. + * \param[in] mac Buffer containing the expected MAC value. + * \param mac_length Length in bytes of the expected MAC value. The PSA + * core guarantees that this length is a valid MAC + * length for the algorithm and key combination passed + * to mbedtls_psa_mac_verify_setup(). + * + * \retval #PSA_SUCCESS + * The expected MAC is identical to the actual MAC of the message. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The MAC of the message was calculated successfully, but it + * differs from the expected MAC. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active mac verify + * operation). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_mac_verify_finish( + mbedtls_psa_mac_operation_t *operation, + const uint8_t *mac, + size_t mac_length); + +/** Abort a MAC operation using Mbed TLS. + * + * Aborting an operation frees all associated resources except for the + * \p operation structure itself. Once aborted, the operation object + * can be reused for another operation by calling + * mbedtls_psa_mac_sign_setup() or mbedtls_psa_mac_verify_setup() again. + * + * The PSA core may call this function any time after the operation object has + * been initialized by one of the methods described in + * #mbedtls_psa_mac_operation_t. + * + * In particular, calling mbedtls_psa_mac_abort() after the operation has been + * terminated by a call to mbedtls_psa_mac_abort(), + * mbedtls_psa_mac_sign_finish() or mbedtls_psa_mac_verify_finish() is safe and + * has no effect. + * + * \param[in,out] operation Initialized MAC operation. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_mac_abort( + mbedtls_psa_mac_operation_t *operation); + +#endif /* PSA_CRYPTO_MAC_H */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_random_impl.h b/ext/opcua_client/mbedtls/library/psa_crypto_random_impl.h new file mode 100644 index 0000000..d47e057 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_random_impl.h @@ -0,0 +1,191 @@ +/** \file psa_crypto_random_impl.h + * + * \brief PSA crypto random generator implementation abstraction. + * + * The definitions here need to be consistent with the declarations + * in include/mbedtls/psa_util.h. This file contains some redundant + * declarations to increase the chance that a compiler will detect + * inconsistencies if one file is changed without updating the other, + * but not all potential inconsistencies can be enforced, so make sure + * to check the public declarations and contracts in + * include/mbedtls/psa_util.h if you modify this file. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_RANDOM_IMPL_H +#define PSA_CRYPTO_RANDOM_IMPL_H + +#include + +#if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) + +#include +#include // only for error codes +#include + +typedef mbedtls_psa_external_random_context_t mbedtls_psa_random_context_t; + +/* Trivial wrapper around psa_generate_random(). */ +int mbedtls_psa_get_random(void *p_rng, + unsigned char *output, + size_t output_size); + +/* The PSA RNG API doesn't need any externally maintained state. */ +#define MBEDTLS_PSA_RANDOM_STATE NULL + +#else /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ + +/* Choose a DRBG based on configuration and availability */ +#if defined(MBEDTLS_CTR_DRBG_C) + +#include "mbedtls/ctr_drbg.h" +#undef MBEDTLS_PSA_HMAC_DRBG_MD_TYPE + +#elif defined(MBEDTLS_HMAC_DRBG_C) + +#include "mbedtls/hmac_drbg.h" +#if defined(MBEDTLS_SHA512_C) && defined(MBEDTLS_SHA256_C) +#include +#if SIZE_MAX > 0xffffffff +/* Looks like a 64-bit system, so prefer SHA-512. */ +#define MBEDTLS_PSA_HMAC_DRBG_MD_TYPE MBEDTLS_MD_SHA512 +#else +/* Looks like a 32-bit system, so prefer SHA-256. */ +#define MBEDTLS_PSA_HMAC_DRBG_MD_TYPE MBEDTLS_MD_SHA256 +#endif +#elif defined(MBEDTLS_SHA512_C) +#define MBEDTLS_PSA_HMAC_DRBG_MD_TYPE MBEDTLS_MD_SHA512 +#elif defined(MBEDTLS_SHA256_C) +#define MBEDTLS_PSA_HMAC_DRBG_MD_TYPE MBEDTLS_MD_SHA256 +#else +#error "No hash algorithm available for HMAC_DBRG." +#endif + +#else /* !MBEDTLS_CTR_DRBG_C && !MBEDTLS_HMAC_DRBG_C*/ + +#error "No DRBG module available for the psa_crypto module." + +#endif /* !MBEDTLS_CTR_DRBG_C && !MBEDTLS_HMAC_DRBG_C*/ + +#include "mbedtls/entropy.h" + +/** Initialize the PSA DRBG. + * + * \param p_rng Pointer to the Mbed TLS DRBG state. + */ +static inline void mbedtls_psa_drbg_init(mbedtls_psa_drbg_context_t *p_rng) +{ +#if defined(MBEDTLS_CTR_DRBG_C) + mbedtls_ctr_drbg_init(p_rng); +#elif defined(MBEDTLS_HMAC_DRBG_C) + mbedtls_hmac_drbg_init(p_rng); +#endif +} + +/** Deinitialize the PSA DRBG. + * + * \param p_rng Pointer to the Mbed TLS DRBG state. + */ +static inline void mbedtls_psa_drbg_free(mbedtls_psa_drbg_context_t *p_rng) +{ +#if defined(MBEDTLS_CTR_DRBG_C) + mbedtls_ctr_drbg_free(p_rng); +#elif defined(MBEDTLS_HMAC_DRBG_C) + mbedtls_hmac_drbg_free(p_rng); +#endif +} + +/** The type of the PSA random generator context. + * + * The random generator context is composed of an entropy context and + * a DRBG context. + */ +typedef struct { + void (* entropy_init)(mbedtls_entropy_context *ctx); + void (* entropy_free)(mbedtls_entropy_context *ctx); + mbedtls_entropy_context entropy; + mbedtls_psa_drbg_context_t drbg; +} mbedtls_psa_random_context_t; + +/* Defined in include/mbedtls/psa_util.h so that it's visible to + * application code. The declaration here is redundant, but included + * as a safety net to make it more likely that a future change that + * accidentally causes the implementation to diverge from the interface + * will be noticed. */ +/* Do not include the declaration under MSVC because it doesn't accept it + * ("error C2370: 'mbedtls_psa_get_random' : redefinition; different storage class"). + * Observed with Visual Studio 2013. A known bug apparently: + * https://stackoverflow.com/questions/8146541/duplicate-external-static-declarations-not-allowed-in-visual-studio + */ +#if !defined(_MSC_VER) +static mbedtls_f_rng_t *const mbedtls_psa_get_random; +#endif + +/** The maximum number of bytes that mbedtls_psa_get_random() is expected to + * return. + */ +#if defined(MBEDTLS_CTR_DRBG_C) +#define MBEDTLS_PSA_RANDOM_MAX_REQUEST MBEDTLS_CTR_DRBG_MAX_REQUEST +#elif defined(MBEDTLS_HMAC_DRBG_C) +#define MBEDTLS_PSA_RANDOM_MAX_REQUEST MBEDTLS_HMAC_DRBG_MAX_REQUEST +#endif + +/** A pointer to the PSA DRBG state. + * + * This variable is only intended to be used through the macro + * #MBEDTLS_PSA_RANDOM_STATE. + */ +/* psa_crypto.c sets this variable to a pointer to the DRBG state in the + * global PSA crypto state. */ +/* The type `mbedtls_psa_drbg_context_t` is defined in + * include/mbedtls/psa_util.h so that `mbedtls_psa_random_state` can be + * declared there and be visible to application code. */ +extern mbedtls_psa_drbg_context_t *const mbedtls_psa_random_state; + +/** A pointer to the PSA DRBG state. + * + * This macro expands to an expression that is suitable as the \c p_rng + * parameter to pass to mbedtls_psa_get_random(). + * + * This macro exists in all configurations where the psa_crypto module is + * enabled. Its expansion depends on the configuration. + */ +#define MBEDTLS_PSA_RANDOM_STATE mbedtls_psa_random_state + +/** Seed the PSA DRBG. + * + * \param entropy An entropy context to read the seed from. + * \param custom The personalization string. + * This can be \c NULL, in which case the personalization + * string is empty regardless of the value of \p len. + * \param len The length of the personalization string. + * + * \return \c 0 on success. + * \return An Mbed TLS error code (\c MBEDTLS_ERR_xxx) on failure. + */ +static inline int mbedtls_psa_drbg_seed( + mbedtls_entropy_context *entropy, + const unsigned char *custom, size_t len) +{ +#if defined(MBEDTLS_CTR_DRBG_C) + return mbedtls_ctr_drbg_seed(MBEDTLS_PSA_RANDOM_STATE, + mbedtls_entropy_func, + entropy, + custom, len); +#elif defined(MBEDTLS_HMAC_DRBG_C) + const mbedtls_md_info_t *md_info = + mbedtls_md_info_from_type(MBEDTLS_PSA_HMAC_DRBG_MD_TYPE); + return mbedtls_hmac_drbg_seed(MBEDTLS_PSA_RANDOM_STATE, + md_info, + mbedtls_entropy_func, + entropy, + custom, len); +#endif +} + +#endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ + +#endif /* PSA_CRYPTO_RANDOM_IMPL_H */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_rsa.c b/ext/opcua_client/mbedtls/library/psa_crypto_rsa.c new file mode 100644 index 0000000..3e878ad --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_rsa.c @@ -0,0 +1,517 @@ +/* + * PSA RSA layer on top of Mbed TLS crypto + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PSA_CRYPTO_C) + +#include +#include "psa_crypto_core.h" +#include "psa_crypto_random_impl.h" +#include "psa_crypto_rsa.h" +#include "psa_crypto_hash.h" + +#include +#include +#include +#include "mbedtls/platform.h" + +#include +#include +#include +#include + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) || \ + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || \ + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) + +/* Mbed TLS doesn't support non-byte-aligned key sizes (i.e. key sizes + * that are not a multiple of 8) well. For example, there is only + * mbedtls_rsa_get_len(), which returns a number of bytes, and no + * way to return the exact bit size of a key. + * To keep things simple, reject non-byte-aligned key sizes. */ +static psa_status_t psa_check_rsa_key_byte_aligned( + const mbedtls_rsa_context *rsa) +{ + mbedtls_mpi n; + psa_status_t status; + mbedtls_mpi_init(&n); + status = mbedtls_to_psa_error( + mbedtls_rsa_export(rsa, &n, NULL, NULL, NULL, NULL)); + if (status == PSA_SUCCESS) { + if (mbedtls_mpi_bitlen(&n) % 8 != 0) { + status = PSA_ERROR_NOT_SUPPORTED; + } + } + mbedtls_mpi_free(&n); + return status; +} + +psa_status_t mbedtls_psa_rsa_load_representation( + psa_key_type_t type, const uint8_t *data, size_t data_length, + mbedtls_rsa_context **p_rsa) +{ + psa_status_t status; + mbedtls_pk_context ctx; + size_t bits; + mbedtls_pk_init(&ctx); + + /* Parse the data. */ + if (PSA_KEY_TYPE_IS_KEY_PAIR(type)) { + status = mbedtls_to_psa_error( + mbedtls_pk_parse_key(&ctx, data, data_length, NULL, 0)); + } else { + status = mbedtls_to_psa_error( + mbedtls_pk_parse_public_key(&ctx, data, data_length)); + } + if (status != PSA_SUCCESS) { + goto exit; + } + + /* We have something that the pkparse module recognizes. If it is a + * valid RSA key, store it. */ + if (mbedtls_pk_get_type(&ctx) != MBEDTLS_PK_RSA) { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + /* The size of an RSA key doesn't have to be a multiple of 8. Mbed TLS + * supports non-byte-aligned key sizes, but not well. For example, + * mbedtls_rsa_get_len() returns the key size in bytes, not in bits. */ + bits = PSA_BYTES_TO_BITS(mbedtls_rsa_get_len(mbedtls_pk_rsa(ctx))); + if (bits > PSA_VENDOR_RSA_MAX_KEY_BITS) { + status = PSA_ERROR_NOT_SUPPORTED; + goto exit; + } + status = psa_check_rsa_key_byte_aligned(mbedtls_pk_rsa(ctx)); + if (status != PSA_SUCCESS) { + goto exit; + } + + /* Copy out the pointer to the RSA context, and reset the PK context + * such that pk_free doesn't free the RSA context we just grabbed. */ + *p_rsa = mbedtls_pk_rsa(ctx); + ctx.pk_info = NULL; + +exit: + mbedtls_pk_free(&ctx); + return status; +} +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_CRYPT) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_OAEP) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) || + * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || + * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) */ + +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || \ + defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) + +psa_status_t mbedtls_psa_rsa_import_key( + const psa_key_attributes_t *attributes, + const uint8_t *data, size_t data_length, + uint8_t *key_buffer, size_t key_buffer_size, + size_t *key_buffer_length, size_t *bits) +{ + psa_status_t status; + mbedtls_rsa_context *rsa = NULL; + + /* Parse input */ + status = mbedtls_psa_rsa_load_representation(attributes->core.type, + data, + data_length, + &rsa); + if (status != PSA_SUCCESS) { + goto exit; + } + + *bits = (psa_key_bits_t) PSA_BYTES_TO_BITS(mbedtls_rsa_get_len(rsa)); + + /* Re-export the data to PSA export format, such that we can store export + * representation in the key slot. Export representation in case of RSA is + * the smallest representation that's allowed as input, so a straight-up + * allocation of the same size as the input buffer will be large enough. */ + status = mbedtls_psa_rsa_export_key(attributes->core.type, + rsa, + key_buffer, + key_buffer_size, + key_buffer_length); +exit: + /* Always free the RSA object */ + mbedtls_rsa_free(rsa); + mbedtls_free(rsa); + + return status; +} + +psa_status_t mbedtls_psa_rsa_export_key(psa_key_type_t type, + mbedtls_rsa_context *rsa, + uint8_t *data, + size_t data_size, + size_t *data_length) +{ +#if defined(MBEDTLS_PK_WRITE_C) + int ret; + mbedtls_pk_context pk; + uint8_t *pos = data + data_size; + + mbedtls_pk_init(&pk); + pk.pk_info = &mbedtls_rsa_info; + pk.pk_ctx = rsa; + + /* PSA Crypto API defines the format of an RSA key as a DER-encoded + * representation of the non-encrypted PKCS#1 RSAPrivateKey for a + * private key and of the RFC3279 RSAPublicKey for a public key. */ + if (PSA_KEY_TYPE_IS_KEY_PAIR(type)) { + ret = mbedtls_pk_write_key_der(&pk, data, data_size); + } else { + ret = mbedtls_pk_write_pubkey(&pos, data, &pk); + } + + if (ret < 0) { + /* Clean up in case pk_write failed halfway through. */ + memset(data, 0, data_size); + return mbedtls_to_psa_error(ret); + } + + /* The mbedtls_pk_xxx functions write to the end of the buffer. + * Move the data to the beginning and erase remaining data + * at the original location. */ + if (2 * (size_t) ret <= data_size) { + memcpy(data, data + data_size - ret, ret); + memset(data + data_size - ret, 0, ret); + } else if ((size_t) ret < data_size) { + memmove(data, data + data_size - ret, ret); + memset(data + ret, 0, data_size - ret); + } + + *data_length = ret; + return PSA_SUCCESS; +#else + (void) type; + (void) rsa; + (void) data; + (void) data_size; + (void) data_length; + return PSA_ERROR_NOT_SUPPORTED; +#endif /* MBEDTLS_PK_WRITE_C */ +} + +psa_status_t mbedtls_psa_rsa_export_public_key( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + uint8_t *data, size_t data_size, size_t *data_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + mbedtls_rsa_context *rsa = NULL; + + status = mbedtls_psa_rsa_load_representation( + attributes->core.type, key_buffer, key_buffer_size, &rsa); + if (status == PSA_SUCCESS) { + status = mbedtls_psa_rsa_export_key(PSA_KEY_TYPE_RSA_PUBLIC_KEY, + rsa, + data, + data_size, + data_length); + } + + mbedtls_rsa_free(rsa); + mbedtls_free(rsa); + + return status; +} +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) || + * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_PUBLIC_KEY) */ + +#if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) && \ + defined(MBEDTLS_GENPRIME) +static psa_status_t psa_rsa_read_exponent(const uint8_t *domain_parameters, + size_t domain_parameters_size, + int *exponent) +{ + size_t i; + uint32_t acc = 0; + + if (domain_parameters_size == 0) { + *exponent = 65537; + return PSA_SUCCESS; + } + + /* Mbed TLS encodes the public exponent as an int. For simplicity, only + * support values that fit in a 32-bit integer, which is larger than + * int on just about every platform anyway. */ + if (domain_parameters_size > sizeof(acc)) { + return PSA_ERROR_NOT_SUPPORTED; + } + for (i = 0; i < domain_parameters_size; i++) { + acc = (acc << 8) | domain_parameters[i]; + } + if (acc > INT_MAX) { + return PSA_ERROR_NOT_SUPPORTED; + } + *exponent = acc; + return PSA_SUCCESS; +} + +psa_status_t mbedtls_psa_rsa_generate_key( + const psa_key_attributes_t *attributes, + uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length) +{ + psa_status_t status; + mbedtls_rsa_context rsa; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + int exponent; + + status = psa_rsa_read_exponent(attributes->domain_parameters, + attributes->domain_parameters_size, + &exponent); + if (status != PSA_SUCCESS) { + return status; + } + + mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_NONE); + ret = mbedtls_rsa_gen_key(&rsa, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE, + (unsigned int) attributes->core.bits, + exponent); + if (ret != 0) { + mbedtls_rsa_free(&rsa); + return mbedtls_to_psa_error(ret); + } + + status = mbedtls_psa_rsa_export_key(attributes->core.type, + &rsa, key_buffer, key_buffer_size, + key_buffer_length); + mbedtls_rsa_free(&rsa); + + return status; +} +#endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_RSA_KEY_PAIR) + * defined(MBEDTLS_GENPRIME) */ + +/****************************************************************/ +/* Sign/verify hashes */ +/****************************************************************/ + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \ + defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) + +/* Decode the hash algorithm from alg and store the mbedtls encoding in + * md_alg. Verify that the hash length is acceptable. */ +static psa_status_t psa_rsa_decode_md_type(psa_algorithm_t alg, + size_t hash_length, + mbedtls_md_type_t *md_alg) +{ + psa_algorithm_t hash_alg = PSA_ALG_SIGN_GET_HASH(alg); + const mbedtls_md_info_t *md_info = mbedtls_md_info_from_psa(hash_alg); + *md_alg = mbedtls_md_get_type(md_info); + + /* The Mbed TLS RSA module uses an unsigned int for hash length + * parameters. Validate that it fits so that we don't risk an + * overflow later. */ +#if SIZE_MAX > UINT_MAX + if (hash_length > UINT_MAX) { + return PSA_ERROR_INVALID_ARGUMENT; + } +#endif + + /* For signatures using a hash, the hash length must be correct. */ + if (alg != PSA_ALG_RSA_PKCS1V15_SIGN_RAW) { + if (md_info == NULL) { + return PSA_ERROR_NOT_SUPPORTED; + } + if (mbedtls_md_get_size(md_info) != hash_length) { + return PSA_ERROR_INVALID_ARGUMENT; + } + } + + return PSA_SUCCESS; +} + +psa_status_t mbedtls_psa_rsa_sign_hash( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + uint8_t *signature, size_t signature_size, size_t *signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + mbedtls_rsa_context *rsa = NULL; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_md_type_t md_alg; + + status = mbedtls_psa_rsa_load_representation(attributes->core.type, + key_buffer, + key_buffer_size, + &rsa); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_rsa_decode_md_type(alg, hash_length, &md_alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + if (signature_size < mbedtls_rsa_get_len(rsa)) { + status = PSA_ERROR_BUFFER_TOO_SMALL; + goto exit; + } + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) + if (PSA_ALG_IS_RSA_PKCS1V15_SIGN(alg)) { + mbedtls_rsa_set_padding(rsa, MBEDTLS_RSA_PKCS_V15, + MBEDTLS_MD_NONE); + ret = mbedtls_rsa_pkcs1_sign(rsa, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE, + MBEDTLS_RSA_PRIVATE, + md_alg, + (unsigned int) hash_length, + hash, + signature); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) + if (PSA_ALG_IS_RSA_PSS(alg)) { + mbedtls_rsa_set_padding(rsa, MBEDTLS_RSA_PKCS_V21, md_alg); + ret = mbedtls_rsa_rsassa_pss_sign(rsa, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE, + MBEDTLS_RSA_PRIVATE, + MBEDTLS_MD_NONE, + (unsigned int) hash_length, + hash, + signature); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS */ + { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + if (ret == 0) { + *signature_length = mbedtls_rsa_get_len(rsa); + } + status = mbedtls_to_psa_error(ret); + +exit: + mbedtls_rsa_free(rsa); + mbedtls_free(rsa); + + return status; +} + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) +static int rsa_pss_expected_salt_len(psa_algorithm_t alg, + const mbedtls_rsa_context *rsa, + size_t hash_length) +{ + if (PSA_ALG_IS_RSA_PSS_ANY_SALT(alg)) { + return MBEDTLS_RSA_SALT_LEN_ANY; + } + /* Otherwise: standard salt length, i.e. largest possible salt length + * up to the hash length. */ + int klen = (int) mbedtls_rsa_get_len(rsa); // known to fit + int hlen = (int) hash_length; // known to fit + int room = klen - 2 - hlen; + if (room < 0) { + return 0; // there is no valid signature in this case anyway + } else if (room > hlen) { + return hlen; + } else { + return room; + } +} +#endif /* MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS */ + +psa_status_t mbedtls_psa_rsa_verify_hash( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + const uint8_t *signature, size_t signature_length) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + mbedtls_rsa_context *rsa = NULL; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_md_type_t md_alg; + + status = mbedtls_psa_rsa_load_representation(attributes->core.type, + key_buffer, + key_buffer_size, + &rsa); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_rsa_decode_md_type(alg, hash_length, &md_alg); + if (status != PSA_SUCCESS) { + goto exit; + } + + if (signature_length != mbedtls_rsa_get_len(rsa)) { + status = PSA_ERROR_INVALID_SIGNATURE; + goto exit; + } + +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) + if (PSA_ALG_IS_RSA_PKCS1V15_SIGN(alg)) { + mbedtls_rsa_set_padding(rsa, MBEDTLS_RSA_PKCS_V15, + MBEDTLS_MD_NONE); + ret = mbedtls_rsa_pkcs1_verify(rsa, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE, + MBEDTLS_RSA_PUBLIC, + md_alg, + (unsigned int) hash_length, + hash, + signature); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN */ +#if defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) + if (PSA_ALG_IS_RSA_PSS(alg)) { + int slen = rsa_pss_expected_salt_len(alg, rsa, hash_length); + mbedtls_rsa_set_padding(rsa, MBEDTLS_RSA_PKCS_V21, md_alg); + ret = mbedtls_rsa_rsassa_pss_verify_ext(rsa, + mbedtls_psa_get_random, + MBEDTLS_PSA_RANDOM_STATE, + MBEDTLS_RSA_PUBLIC, + md_alg, + (unsigned int) hash_length, + hash, + md_alg, + slen, + signature); + } else +#endif /* MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS */ + { + status = PSA_ERROR_INVALID_ARGUMENT; + goto exit; + } + + /* Mbed TLS distinguishes "invalid padding" from "valid padding but + * the rest of the signature is invalid". This has little use in + * practice and PSA doesn't report this distinction. */ + status = (ret == MBEDTLS_ERR_RSA_INVALID_PADDING) ? + PSA_ERROR_INVALID_SIGNATURE : + mbedtls_to_psa_error(ret); + +exit: + mbedtls_rsa_free(rsa); + mbedtls_free(rsa); + + return status; +} + +#endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || + * defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS) */ + +#endif /* MBEDTLS_PSA_CRYPTO_C */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_rsa.h b/ext/opcua_client/mbedtls/library/psa_crypto_rsa.h new file mode 100644 index 0000000..f4aadda --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_rsa.h @@ -0,0 +1,203 @@ +/* + * PSA RSA layer on top of Mbed TLS crypto + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_RSA_H +#define PSA_CRYPTO_RSA_H + +#include +#include + +/** Load the contents of a key buffer into an internal RSA representation + * + * \param[in] type The type of key contained in \p data. + * \param[in] data The buffer from which to load the representation. + * \param[in] data_length The size in bytes of \p data. + * \param[out] p_rsa Returns a pointer to an RSA context on success. + * The caller is responsible for freeing both the + * contents of the context and the context itself + * when done. + */ +psa_status_t mbedtls_psa_rsa_load_representation(psa_key_type_t type, + const uint8_t *data, + size_t data_length, + mbedtls_rsa_context **p_rsa); + +/** Import an RSA key in binary format. + * + * \note The signature of this function is that of a PSA driver + * import_key entry point. This function behaves as an import_key + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes for the key to import. + * \param[in] data The buffer containing the key data in import + * format. + * \param[in] data_length Size of the \p data buffer in bytes. + * \param[out] key_buffer The buffer containing the key data in output + * format. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. This + * size is greater or equal to \p data_length. + * \param[out] key_buffer_length The length of the data written in \p + * key_buffer in bytes. + * \param[out] bits The key size in number of bits. + * + * \retval #PSA_SUCCESS The RSA key was imported successfully. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The key data is not correctly formatted. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t mbedtls_psa_rsa_import_key( + const psa_key_attributes_t *attributes, + const uint8_t *data, size_t data_length, + uint8_t *key_buffer, size_t key_buffer_size, + size_t *key_buffer_length, size_t *bits); + +/** Export an RSA key to export representation + * + * \param[in] type The type of key (public/private) to export + * \param[in] rsa The internal RSA representation from which to export + * \param[out] data The buffer to export to + * \param[in] data_size The length of the buffer to export to + * \param[out] data_length The amount of bytes written to \p data + */ +psa_status_t mbedtls_psa_rsa_export_key(psa_key_type_t type, + mbedtls_rsa_context *rsa, + uint8_t *data, + size_t data_size, + size_t *data_length); + +/** Export a public RSA key or the public part of an RSA key pair in binary + * format. + * + * \note The signature of this function is that of a PSA driver + * export_public_key entry point. This function behaves as an + * export_public_key entry point as defined in the PSA driver interface + * specification. + * + * \param[in] attributes The attributes for the key to export. + * \param[in] key_buffer Material or context of the key to export. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[out] data Buffer where the key data is to be written. + * \param[in] data_size Size of the \p data buffer in bytes. + * \param[out] data_length On success, the number of bytes written in + * \p data. + * + * \retval #PSA_SUCCESS The RSA public key was exported successfully. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t mbedtls_psa_rsa_export_public_key( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + uint8_t *data, size_t data_size, size_t *data_length); + +/** + * \brief Generate an RSA key. + * + * \note The signature of the function is that of a PSA driver generate_key + * entry point. + * + * \param[in] attributes The attributes for the RSA key to generate. + * \param[out] key_buffer Buffer where the key data is to be written. + * \param[in] key_buffer_size Size of \p key_buffer in bytes. + * \param[out] key_buffer_length On success, the number of bytes written in + * \p key_buffer. + * + * \retval #PSA_SUCCESS + * The key was successfully generated. + * \retval #PSA_ERROR_NOT_SUPPORTED + * Key length or type not supported. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of \p key_buffer is too small. + */ +psa_status_t mbedtls_psa_rsa_generate_key( + const psa_key_attributes_t *attributes, + uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length); + +/** Sign an already-calculated hash with an RSA private key. + * + * \note The signature of this function is that of a PSA driver + * sign_hash entry point. This function behaves as a sign_hash + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes of the RSA key to use for the + * operation. + * \param[in] key_buffer The buffer containing the RSA key context. + * format. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg A signature algorithm that is compatible with + * an RSA key. + * \param[in] hash The hash or message to sign. + * \param[in] hash_length Size of the \p hash buffer in bytes. + * \param[out] signature Buffer where the signature is to be written. + * \param[in] signature_size Size of the \p signature buffer in bytes. + * \param[out] signature_length On success, the number of bytes + * that make up the returned signature value. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p signature buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_SIGN_OUTPUT_SIZE(\c PSA_KEY_TYPE_RSA_KEY_PAIR, \c key_bits, + * \p alg) where \c key_bits is the bit-size of the RSA key. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + */ +psa_status_t mbedtls_psa_rsa_sign_hash( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + uint8_t *signature, size_t signature_size, size_t *signature_length); + +/** + * \brief Verify the signature a hash or short message using a public RSA key. + * + * \note The signature of this function is that of a PSA driver + * verify_hash entry point. This function behaves as a verify_hash + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes of the RSA key to use for the + * operation. + * \param[in] key_buffer The buffer containing the RSA key context. + * format. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg A signature algorithm that is compatible with + * an RSA key. + * \param[in] hash The hash or message whose signature is to be + * verified. + * \param[in] hash_length Size of the \p hash buffer in bytes. + * \param[in] signature Buffer containing the signature to verify. + * \param[in] signature_length Size of the \p signature buffer in bytes. + * + * \retval #PSA_SUCCESS + * The signature is valid. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The calculation was performed successfully, but the passed + * signature is not a valid signature. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t mbedtls_psa_rsa_verify_hash( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + const uint8_t *signature, size_t signature_length); + +#endif /* PSA_CRYPTO_RSA_H */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_se.c b/ext/opcua_client/mbedtls/library/psa_crypto_se.c new file mode 100644 index 0000000..9628ff2 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_se.c @@ -0,0 +1,374 @@ +/* + * PSA crypto support for secure element drivers + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + +#include +#include + +#include "psa/crypto_se_driver.h" + +#include "psa_crypto_se.h" + +#if defined(MBEDTLS_PSA_ITS_FILE_C) +#include "psa_crypto_its.h" +#else /* Native ITS implementation */ +#include "psa/error.h" +#include "psa/internal_trusted_storage.h" +#endif + +#include "mbedtls/platform.h" + + + +/****************************************************************/ +/* Driver lookup */ +/****************************************************************/ + +/* This structure is identical to psa_drv_se_context_t declared in + * `crypto_se_driver.h`, except that some parts are writable here + * (non-const, or pointer to non-const). */ +typedef struct { + void *persistent_data; + size_t persistent_data_size; + uintptr_t transient_data; +} psa_drv_se_internal_context_t; + +struct psa_se_drv_table_entry_s { + psa_key_location_t location; + const psa_drv_se_t *methods; + union { + psa_drv_se_internal_context_t internal; + psa_drv_se_context_t context; + } u; +}; + +static psa_se_drv_table_entry_t driver_table[PSA_MAX_SE_DRIVERS]; + +psa_se_drv_table_entry_t *psa_get_se_driver_entry( + psa_key_lifetime_t lifetime) +{ + size_t i; + psa_key_location_t location = PSA_KEY_LIFETIME_GET_LOCATION(lifetime); + /* In the driver table, location=0 means an entry that isn't used. + * No driver has a location of 0 because it's a reserved value + * (which designates transparent keys). Make sure we never return + * a driver entry for location 0. */ + if (location == 0) { + return NULL; + } + for (i = 0; i < PSA_MAX_SE_DRIVERS; i++) { + if (driver_table[i].location == location) { + return &driver_table[i]; + } + } + return NULL; +} + +const psa_drv_se_t *psa_get_se_driver_methods( + const psa_se_drv_table_entry_t *driver) +{ + return driver->methods; +} + +psa_drv_se_context_t *psa_get_se_driver_context( + psa_se_drv_table_entry_t *driver) +{ + return &driver->u.context; +} + +int psa_get_se_driver(psa_key_lifetime_t lifetime, + const psa_drv_se_t **p_methods, + psa_drv_se_context_t **p_drv_context) +{ + psa_se_drv_table_entry_t *driver = psa_get_se_driver_entry(lifetime); + if (p_methods != NULL) { + *p_methods = (driver ? driver->methods : NULL); + } + if (p_drv_context != NULL) { + *p_drv_context = (driver ? &driver->u.context : NULL); + } + return driver != NULL; +} + + + +/****************************************************************/ +/* Persistent data management */ +/****************************************************************/ + +static psa_status_t psa_get_se_driver_its_file_uid( + const psa_se_drv_table_entry_t *driver, + psa_storage_uid_t *uid) +{ + if (driver->location > PSA_MAX_SE_LOCATION) { + return PSA_ERROR_NOT_SUPPORTED; + } + +#if SIZE_MAX > UINT32_MAX + /* ITS file sizes are limited to 32 bits. */ + if (driver->u.internal.persistent_data_size > UINT32_MAX) { + return PSA_ERROR_NOT_SUPPORTED; + } +#endif + + /* See the documentation of PSA_CRYPTO_SE_DRIVER_ITS_UID_BASE. */ + *uid = PSA_CRYPTO_SE_DRIVER_ITS_UID_BASE + driver->location; + return PSA_SUCCESS; +} + +psa_status_t psa_load_se_persistent_data( + const psa_se_drv_table_entry_t *driver) +{ + psa_status_t status; + psa_storage_uid_t uid; + size_t length; + + status = psa_get_se_driver_its_file_uid(driver, &uid); + if (status != PSA_SUCCESS) { + return status; + } + + /* Read the amount of persistent data that the driver requests. + * If the data in storage is larger, it is truncated. If the data + * in storage is smaller, silently keep what is already at the end + * of the output buffer. */ + /* psa_get_se_driver_its_file_uid ensures that the size_t + * persistent_data_size is in range, but compilers don't know that, + * so cast to reassure them. */ + return psa_its_get(uid, 0, + (uint32_t) driver->u.internal.persistent_data_size, + driver->u.internal.persistent_data, + &length); +} + +psa_status_t psa_save_se_persistent_data( + const psa_se_drv_table_entry_t *driver) +{ + psa_status_t status; + psa_storage_uid_t uid; + + status = psa_get_se_driver_its_file_uid(driver, &uid); + if (status != PSA_SUCCESS) { + return status; + } + + /* psa_get_se_driver_its_file_uid ensures that the size_t + * persistent_data_size is in range, but compilers don't know that, + * so cast to reassure them. */ + return psa_its_set(uid, + (uint32_t) driver->u.internal.persistent_data_size, + driver->u.internal.persistent_data, + 0); +} + +psa_status_t psa_destroy_se_persistent_data(psa_key_location_t location) +{ + psa_storage_uid_t uid; + if (location > PSA_MAX_SE_LOCATION) { + return PSA_ERROR_NOT_SUPPORTED; + } + uid = PSA_CRYPTO_SE_DRIVER_ITS_UID_BASE + location; + return psa_its_remove(uid); +} + +psa_status_t psa_find_se_slot_for_key( + const psa_key_attributes_t *attributes, + psa_key_creation_method_t method, + psa_se_drv_table_entry_t *driver, + psa_key_slot_number_t *slot_number) +{ + psa_status_t status; + psa_key_location_t key_location = + PSA_KEY_LIFETIME_GET_LOCATION(psa_get_key_lifetime(attributes)); + + /* If the location is wrong, it's a bug in the library. */ + if (driver->location != key_location) { + return PSA_ERROR_CORRUPTION_DETECTED; + } + + /* If the driver doesn't support key creation in any way, give up now. */ + if (driver->methods->key_management == NULL) { + return PSA_ERROR_NOT_SUPPORTED; + } + + if (psa_get_key_slot_number(attributes, slot_number) == PSA_SUCCESS) { + /* The application wants to use a specific slot. Allow it if + * the driver supports it. On a system with isolation, + * the crypto service must check that the application is + * permitted to request this slot. */ + psa_drv_se_validate_slot_number_t p_validate_slot_number = + driver->methods->key_management->p_validate_slot_number; + if (p_validate_slot_number == NULL) { + return PSA_ERROR_NOT_SUPPORTED; + } + status = p_validate_slot_number(&driver->u.context, + driver->u.internal.persistent_data, + attributes, method, + *slot_number); + } else if (method == PSA_KEY_CREATION_REGISTER) { + /* The application didn't specify a slot number. This doesn't + * make sense when registering a slot. */ + return PSA_ERROR_INVALID_ARGUMENT; + } else { + /* The application didn't tell us which slot to use. Let the driver + * choose. This is the normal case. */ + psa_drv_se_allocate_key_t p_allocate = + driver->methods->key_management->p_allocate; + if (p_allocate == NULL) { + return PSA_ERROR_NOT_SUPPORTED; + } + status = p_allocate(&driver->u.context, + driver->u.internal.persistent_data, + attributes, method, + slot_number); + } + return status; +} + +psa_status_t psa_destroy_se_key(psa_se_drv_table_entry_t *driver, + psa_key_slot_number_t slot_number) +{ + psa_status_t status; + psa_status_t storage_status; + /* Normally a missing method would mean that the action is not + * supported. But psa_destroy_key() is not supposed to return + * PSA_ERROR_NOT_SUPPORTED: if you can create a key, you should + * be able to destroy it. The only use case for a driver that + * does not have a way to destroy keys at all is if the keys are + * locked in a read-only state: we can use the keys but not + * destroy them. Hence, if the driver doesn't support destroying + * keys, it's really a lack of permission. */ + if (driver->methods->key_management == NULL || + driver->methods->key_management->p_destroy == NULL) { + return PSA_ERROR_NOT_PERMITTED; + } + status = driver->methods->key_management->p_destroy( + &driver->u.context, + driver->u.internal.persistent_data, + slot_number); + storage_status = psa_save_se_persistent_data(driver); + return status == PSA_SUCCESS ? storage_status : status; +} + +psa_status_t psa_init_all_se_drivers(void) +{ + size_t i; + for (i = 0; i < PSA_MAX_SE_DRIVERS; i++) { + psa_se_drv_table_entry_t *driver = &driver_table[i]; + if (driver->location == 0) { + continue; /* skipping unused entry */ + } + const psa_drv_se_t *methods = psa_get_se_driver_methods(driver); + if (methods->p_init != NULL) { + psa_status_t status = methods->p_init( + &driver->u.context, + driver->u.internal.persistent_data, + driver->location); + if (status != PSA_SUCCESS) { + return status; + } + status = psa_save_se_persistent_data(driver); + if (status != PSA_SUCCESS) { + return status; + } + } + } + return PSA_SUCCESS; +} + + + +/****************************************************************/ +/* Driver registration */ +/****************************************************************/ + +psa_status_t psa_register_se_driver( + psa_key_location_t location, + const psa_drv_se_t *methods) +{ + size_t i; + psa_status_t status; + + if (methods->hal_version != PSA_DRV_SE_HAL_VERSION) { + return PSA_ERROR_NOT_SUPPORTED; + } + /* Driver table entries are 0-initialized. 0 is not a valid driver + * location because it means a transparent key. */ + MBEDTLS_STATIC_ASSERT(PSA_KEY_LOCATION_LOCAL_STORAGE == 0, + "Secure element support requires 0 to mean a local key"); + if (location == PSA_KEY_LOCATION_LOCAL_STORAGE) { + return PSA_ERROR_INVALID_ARGUMENT; + } + if (location > PSA_MAX_SE_LOCATION) { + return PSA_ERROR_NOT_SUPPORTED; + } + + for (i = 0; i < PSA_MAX_SE_DRIVERS; i++) { + if (driver_table[i].location == 0) { + break; + } + /* Check that location isn't already in use up to the first free + * entry. Since entries are created in order and never deleted, + * there can't be a used entry after the first free entry. */ + if (driver_table[i].location == location) { + return PSA_ERROR_ALREADY_EXISTS; + } + } + if (i == PSA_MAX_SE_DRIVERS) { + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + + driver_table[i].location = location; + driver_table[i].methods = methods; + driver_table[i].u.internal.persistent_data_size = + methods->persistent_data_size; + + if (methods->persistent_data_size != 0) { + driver_table[i].u.internal.persistent_data = + mbedtls_calloc(1, methods->persistent_data_size); + if (driver_table[i].u.internal.persistent_data == NULL) { + status = PSA_ERROR_INSUFFICIENT_MEMORY; + goto error; + } + /* Load the driver's persistent data. On first use, the persistent + * data does not exist in storage, and is initialized to + * all-bits-zero by the calloc call just above. */ + status = psa_load_se_persistent_data(&driver_table[i]); + if (status != PSA_SUCCESS && status != PSA_ERROR_DOES_NOT_EXIST) { + goto error; + } + } + + return PSA_SUCCESS; + +error: + memset(&driver_table[i], 0, sizeof(driver_table[i])); + return status; +} + +void psa_unregister_all_se_drivers(void) +{ + size_t i; + for (i = 0; i < PSA_MAX_SE_DRIVERS; i++) { + if (driver_table[i].u.internal.persistent_data != NULL) { + mbedtls_free(driver_table[i].u.internal.persistent_data); + } + } + memset(driver_table, 0, sizeof(driver_table)); +} + + + +/****************************************************************/ +/* The end */ +/****************************************************************/ + +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_se.h b/ext/opcua_client/mbedtls/library/psa_crypto_se.h new file mode 100644 index 0000000..14a7000 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_se.h @@ -0,0 +1,189 @@ +/* + * PSA crypto support for secure element drivers + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_SE_H +#define PSA_CRYPTO_SE_H + +#if !defined(MBEDTLS_CONFIG_FILE) +#include "mbedtls/config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + +#include "psa/crypto.h" +#include "psa/crypto_se_driver.h" + +/** The maximum location value that this implementation supports + * for a secure element. + * + * This is not a characteristic that each PSA implementation has, but a + * limitation of the current implementation due to the constraints imposed + * by storage. See #PSA_CRYPTO_SE_DRIVER_ITS_UID_BASE. + * + * The minimum location value for a secure element is 1, like on any + * PSA implementation (0 means a transparent key). + */ +#define PSA_MAX_SE_LOCATION 255 + +/** The base of the range of ITS file identifiers for secure element + * driver persistent data. + * + * We use a slice of the implementation reserved range 0xffff0000..0xffffffff, + * specifically the range 0xfffffe00..0xfffffeff. The length of this range + * drives the value of #PSA_MAX_SE_LOCATION. The identifier 0xfffffe00 is + * actually not used since it corresponds to #PSA_KEY_LOCATION_LOCAL_STORAGE + * which doesn't have a driver. + */ +#define PSA_CRYPTO_SE_DRIVER_ITS_UID_BASE ((psa_key_id_t) 0xfffffe00) + +/** The maximum number of registered secure element driver locations. */ +#define PSA_MAX_SE_DRIVERS 4 + +/** Unregister all secure element drivers. + * + * \warning Do not call this function while the library is in the initialized + * state. This function is only intended to be called at the end + * of mbedtls_psa_crypto_free(). + */ +void psa_unregister_all_se_drivers(void); + +/** Initialize all secure element drivers. + * + * Called from psa_crypto_init(). + */ +psa_status_t psa_init_all_se_drivers(void); + +/** A structure that describes a registered secure element driver. + * + * A secure element driver table entry contains a pointer to the + * driver's method table as well as the driver context structure. + */ +typedef struct psa_se_drv_table_entry_s psa_se_drv_table_entry_t; + +/** Return the secure element driver information for a lifetime value. + * + * \param lifetime The lifetime value to query. + * \param[out] p_methods On output, if there is a driver, + * \c *methods points to its method table. + * Otherwise \c *methods is \c NULL. + * \param[out] p_drv_context On output, if there is a driver, + * \c *drv_context points to its context + * structure. + * Otherwise \c *drv_context is \c NULL. + * + * \retval 1 + * \p lifetime corresponds to a registered driver. + * \retval 0 + * \p lifetime does not correspond to a registered driver. + */ +int psa_get_se_driver(psa_key_lifetime_t lifetime, + const psa_drv_se_t **p_methods, + psa_drv_se_context_t **p_drv_context); + +/** Return the secure element driver table entry for a lifetime value. + * + * \param lifetime The lifetime value to query. + * + * \return The driver table entry for \p lifetime, or + * \p NULL if \p lifetime does not correspond to a registered driver. + */ +psa_se_drv_table_entry_t *psa_get_se_driver_entry( + psa_key_lifetime_t lifetime); + +/** Return the method table for a secure element driver. + * + * \param[in] driver The driver table entry to access, or \c NULL. + * + * \return The driver's method table. + * \c NULL if \p driver is \c NULL. + */ +const psa_drv_se_t *psa_get_se_driver_methods( + const psa_se_drv_table_entry_t *driver); + +/** Return the context of a secure element driver. + * + * \param[in] driver The driver table entry to access, or \c NULL. + * + * \return A pointer to the driver context. + * \c NULL if \p driver is \c NULL. + */ +psa_drv_se_context_t *psa_get_se_driver_context( + psa_se_drv_table_entry_t *driver); + +/** Find a free slot for a key that is to be created. + * + * This function calls the relevant method in the driver to find a suitable + * slot for a key with the given attributes. + * + * \param[in] attributes Metadata about the key that is about to be created. + * \param[in] driver The driver table entry to query. + * \param[out] slot_number On success, a slot number that is free in this + * secure element. + */ +psa_status_t psa_find_se_slot_for_key( + const psa_key_attributes_t *attributes, + psa_key_creation_method_t method, + psa_se_drv_table_entry_t *driver, + psa_key_slot_number_t *slot_number); + +/** Destroy a key in a secure element. + * + * This function calls the relevant driver method to destroy a key + * and updates the driver's persistent data. + */ +psa_status_t psa_destroy_se_key(psa_se_drv_table_entry_t *driver, + psa_key_slot_number_t slot_number); + +/** Load the persistent data of a secure element driver. + * + * \param driver The driver table entry containing the persistent + * data to load from storage. + * + * \return #PSA_SUCCESS + * \return #PSA_ERROR_NOT_SUPPORTED + * \return #PSA_ERROR_DOES_NOT_EXIST + * \return #PSA_ERROR_STORAGE_FAILURE + * \return #PSA_ERROR_DATA_CORRUPT + * \return #PSA_ERROR_INVALID_ARGUMENT + */ +psa_status_t psa_load_se_persistent_data( + const psa_se_drv_table_entry_t *driver); + +/** Save the persistent data of a secure element driver. + * + * \param[in] driver The driver table entry containing the persistent + * data to save to storage. + * + * \return #PSA_SUCCESS + * \return #PSA_ERROR_NOT_SUPPORTED + * \return #PSA_ERROR_NOT_PERMITTED + * \return #PSA_ERROR_NOT_SUPPORTED + * \return #PSA_ERROR_INSUFFICIENT_STORAGE + * \return #PSA_ERROR_STORAGE_FAILURE + * \return #PSA_ERROR_INVALID_ARGUMENT + */ +psa_status_t psa_save_se_persistent_data( + const psa_se_drv_table_entry_t *driver); + +/** Destroy the persistent data of a secure element driver. + * + * This is currently only used for testing. + * + * \param[in] location The location identifier for the driver whose + * persistent data is to be erased. + */ +psa_status_t psa_destroy_se_persistent_data(psa_key_location_t location); + + +/** The storage representation of a key whose data is in a secure element. + */ +typedef struct { + uint8_t slot_number[sizeof(psa_key_slot_number_t)]; +} psa_se_key_data_storage_t; + +#endif /* PSA_CRYPTO_SE_H */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_slot_management.c b/ext/opcua_client/mbedtls/library/psa_crypto_slot_management.c new file mode 100644 index 0000000..1a54420 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_slot_management.c @@ -0,0 +1,604 @@ +/* + * PSA crypto layer on top of Mbed TLS crypto + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PSA_CRYPTO_C) + +#include "psa/crypto.h" + +#include "psa_crypto_core.h" +#include "psa_crypto_driver_wrappers.h" +#include "psa_crypto_slot_management.h" +#include "psa_crypto_storage.h" +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) +#include "psa_crypto_se.h" +#endif + +#include +#include +#include "mbedtls/platform.h" + +#define ARRAY_LENGTH(array) (sizeof(array) / sizeof(*(array))) + + + +/* Make sure we have distinct ranges of key identifiers for distinct + * purposes. */ +MBEDTLS_STATIC_ASSERT(PSA_KEY_ID_USER_MIN < PSA_KEY_ID_USER_MAX, + "Empty user key ID range"); +MBEDTLS_STATIC_ASSERT(PSA_KEY_ID_VENDOR_MIN < PSA_KEY_ID_VENDOR_MAX, + "Empty vendor key ID range"); +MBEDTLS_STATIC_ASSERT(MBEDTLS_PSA_KEY_ID_BUILTIN_MIN < MBEDTLS_PSA_KEY_ID_BUILTIN_MAX, + "Empty builtin key ID range"); +MBEDTLS_STATIC_ASSERT(PSA_KEY_ID_VOLATILE_MIN < PSA_KEY_ID_VOLATILE_MAX, + "Empty volatile key ID range"); + +MBEDTLS_STATIC_ASSERT(PSA_KEY_ID_USER_MAX < PSA_KEY_ID_VENDOR_MIN || + PSA_KEY_ID_VENDOR_MAX < PSA_KEY_ID_USER_MIN, + "Overlap between user key IDs and vendor key IDs"); + +MBEDTLS_STATIC_ASSERT(PSA_KEY_ID_VENDOR_MIN <= MBEDTLS_PSA_KEY_ID_BUILTIN_MIN && + MBEDTLS_PSA_KEY_ID_BUILTIN_MAX <= PSA_KEY_ID_VENDOR_MAX, + "Builtin key identifiers are not in the vendor range"); + +MBEDTLS_STATIC_ASSERT(PSA_KEY_ID_VENDOR_MIN <= PSA_KEY_ID_VOLATILE_MIN && + PSA_KEY_ID_VOLATILE_MAX <= PSA_KEY_ID_VENDOR_MAX, + "Volatile key identifiers are not in the vendor range"); + +MBEDTLS_STATIC_ASSERT(PSA_KEY_ID_VOLATILE_MAX < MBEDTLS_PSA_KEY_ID_BUILTIN_MIN || + MBEDTLS_PSA_KEY_ID_BUILTIN_MAX < PSA_KEY_ID_VOLATILE_MIN, + "Overlap between builtin key IDs and volatile key IDs"); + + + +typedef struct { + psa_key_slot_t key_slots[MBEDTLS_PSA_KEY_SLOT_COUNT]; + unsigned key_slots_initialized : 1; +} psa_global_data_t; + +static psa_global_data_t global_data; + +MBEDTLS_STATIC_ASSERT(ARRAY_LENGTH(global_data.key_slots) <= + PSA_KEY_ID_VOLATILE_MAX - PSA_KEY_ID_VOLATILE_MIN + 1, + "The key slot array is larger than the volatile key ID range"); + +int psa_is_valid_key_id(mbedtls_svc_key_id_t key, int vendor_ok) +{ + psa_key_id_t key_id = MBEDTLS_SVC_KEY_ID_GET_KEY_ID(key); + + if ((PSA_KEY_ID_USER_MIN <= key_id) && + (key_id <= PSA_KEY_ID_USER_MAX)) { + return 1; + } + + if (vendor_ok && + (PSA_KEY_ID_VENDOR_MIN <= key_id) && + (key_id <= PSA_KEY_ID_VENDOR_MAX)) { + return 1; + } + + return 0; +} + +/** Get the description in memory of a key given its identifier and lock it. + * + * The descriptions of volatile keys and loaded persistent keys are + * stored in key slots. This function returns a pointer to the key slot + * containing the description of a key given its identifier. + * + * The function searches the key slots containing the description of the key + * with \p key identifier. The function does only read accesses to the key + * slots. The function does not load any persistent key thus does not access + * any storage. + * + * For volatile key identifiers, only one key slot is queried as a volatile + * key with identifier key_id can only be stored in slot of index + * ( key_id - #PSA_KEY_ID_VOLATILE_MIN ). + * + * On success, the function locks the key slot. It is the responsibility of + * the caller to unlock the key slot when it does not access it anymore. + * + * \param key Key identifier to query. + * \param[out] p_slot On success, `*p_slot` contains a pointer to the + * key slot containing the description of the key + * identified by \p key. + * + * \retval #PSA_SUCCESS + * The pointer to the key slot containing the description of the key + * identified by \p key was returned. + * \retval #PSA_ERROR_INVALID_HANDLE + * \p key is not a valid key identifier. + * \retval #PSA_ERROR_DOES_NOT_EXIST + * There is no key with key identifier \p key in the key slots. + */ +static psa_status_t psa_get_and_lock_key_slot_in_memory( + mbedtls_svc_key_id_t key, psa_key_slot_t **p_slot) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_id_t key_id = MBEDTLS_SVC_KEY_ID_GET_KEY_ID(key); + size_t slot_idx; + psa_key_slot_t *slot = NULL; + + if (psa_key_id_is_volatile(key_id)) { + slot = &global_data.key_slots[key_id - PSA_KEY_ID_VOLATILE_MIN]; + + /* + * Check if both the PSA key identifier key_id and the owner + * identifier of key match those of the key slot. + * + * Note that, if the key slot is not occupied, its PSA key identifier + * is equal to zero. This is an invalid value for a PSA key identifier + * and thus cannot be equal to the valid PSA key identifier key_id. + */ + status = mbedtls_svc_key_id_equal(key, slot->attr.id) ? + PSA_SUCCESS : PSA_ERROR_DOES_NOT_EXIST; + } else { + if (!psa_is_valid_key_id(key, 1)) { + return PSA_ERROR_INVALID_HANDLE; + } + + for (slot_idx = 0; slot_idx < MBEDTLS_PSA_KEY_SLOT_COUNT; slot_idx++) { + slot = &global_data.key_slots[slot_idx]; + if (mbedtls_svc_key_id_equal(key, slot->attr.id)) { + break; + } + } + status = (slot_idx < MBEDTLS_PSA_KEY_SLOT_COUNT) ? + PSA_SUCCESS : PSA_ERROR_DOES_NOT_EXIST; + } + + if (status == PSA_SUCCESS) { + status = psa_lock_key_slot(slot); + if (status == PSA_SUCCESS) { + *p_slot = slot; + } + } + + return status; +} + +psa_status_t psa_initialize_key_slots(void) +{ + /* Nothing to do: program startup and psa_wipe_all_key_slots() both + * guarantee that the key slots are initialized to all-zero, which + * means that all the key slots are in a valid, empty state. */ + global_data.key_slots_initialized = 1; + return PSA_SUCCESS; +} + +void psa_wipe_all_key_slots(void) +{ + size_t slot_idx; + + for (slot_idx = 0; slot_idx < MBEDTLS_PSA_KEY_SLOT_COUNT; slot_idx++) { + psa_key_slot_t *slot = &global_data.key_slots[slot_idx]; + slot->lock_count = 1; + (void) psa_wipe_key_slot(slot); + } + global_data.key_slots_initialized = 0; +} + +psa_status_t psa_get_empty_key_slot(psa_key_id_t *volatile_key_id, + psa_key_slot_t **p_slot) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + size_t slot_idx; + psa_key_slot_t *selected_slot, *unlocked_persistent_key_slot; + + if (!global_data.key_slots_initialized) { + status = PSA_ERROR_BAD_STATE; + goto error; + } + + selected_slot = unlocked_persistent_key_slot = NULL; + for (slot_idx = 0; slot_idx < MBEDTLS_PSA_KEY_SLOT_COUNT; slot_idx++) { + psa_key_slot_t *slot = &global_data.key_slots[slot_idx]; + if (!psa_is_key_slot_occupied(slot)) { + selected_slot = slot; + break; + } + + if ((unlocked_persistent_key_slot == NULL) && + (!PSA_KEY_LIFETIME_IS_VOLATILE(slot->attr.lifetime)) && + (!psa_is_key_slot_locked(slot))) { + unlocked_persistent_key_slot = slot; + } + } + + /* + * If there is no unused key slot and there is at least one unlocked key + * slot containing the description of a persistent key, recycle the first + * such key slot we encountered. If we later need to operate on the + * persistent key we are evicting now, we will reload its description from + * storage. + */ + if ((selected_slot == NULL) && + (unlocked_persistent_key_slot != NULL)) { + selected_slot = unlocked_persistent_key_slot; + selected_slot->lock_count = 1; + psa_wipe_key_slot(selected_slot); + } + + if (selected_slot != NULL) { + status = psa_lock_key_slot(selected_slot); + if (status != PSA_SUCCESS) { + goto error; + } + + *volatile_key_id = PSA_KEY_ID_VOLATILE_MIN + + ((psa_key_id_t) (selected_slot - global_data.key_slots)); + *p_slot = selected_slot; + + return PSA_SUCCESS; + } + status = PSA_ERROR_INSUFFICIENT_MEMORY; + +error: + *p_slot = NULL; + *volatile_key_id = 0; + + return status; +} + +#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) +static psa_status_t psa_load_persistent_key_into_slot(psa_key_slot_t *slot) +{ + psa_status_t status = PSA_SUCCESS; + uint8_t *key_data = NULL; + size_t key_data_length = 0; + + status = psa_load_persistent_key(&slot->attr, + &key_data, &key_data_length); + if (status != PSA_SUCCESS) { + goto exit; + } + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + /* Special handling is required for loading keys associated with a + * dynamically registered SE interface. */ + const psa_drv_se_t *drv; + psa_drv_se_context_t *drv_context; + if (psa_get_se_driver(slot->attr.lifetime, &drv, &drv_context)) { + psa_se_key_data_storage_t *data; + + if (key_data_length != sizeof(*data)) { + status = PSA_ERROR_DATA_INVALID; + goto exit; + } + data = (psa_se_key_data_storage_t *) key_data; + status = psa_copy_key_material_into_slot( + slot, data->slot_number, sizeof(data->slot_number)); + goto exit; + } +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + + status = psa_copy_key_material_into_slot(slot, key_data, key_data_length); + +exit: + psa_free_persistent_key_data(key_data, key_data_length); + return status; +} +#endif /* MBEDTLS_PSA_CRYPTO_STORAGE_C */ + +#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS) + +static psa_status_t psa_load_builtin_key_into_slot(psa_key_slot_t *slot) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + psa_key_lifetime_t lifetime = PSA_KEY_LIFETIME_VOLATILE; + psa_drv_slot_number_t slot_number = 0; + size_t key_buffer_size = 0; + size_t key_buffer_length = 0; + + if (!psa_key_id_is_builtin( + MBEDTLS_SVC_KEY_ID_GET_KEY_ID(slot->attr.id))) { + return PSA_ERROR_DOES_NOT_EXIST; + } + + /* Check the platform function to see whether this key actually exists */ + status = mbedtls_psa_platform_get_builtin_key( + slot->attr.id, &lifetime, &slot_number); + if (status != PSA_SUCCESS) { + return status; + } + + /* Set required key attributes to ensure get_builtin_key can retrieve the + * full attributes. */ + psa_set_key_id(&attributes, slot->attr.id); + psa_set_key_lifetime(&attributes, lifetime); + + /* Get the full key attributes from the driver in order to be able to + * calculate the required buffer size. */ + status = psa_driver_wrapper_get_builtin_key( + slot_number, &attributes, + NULL, 0, NULL); + if (status != PSA_ERROR_BUFFER_TOO_SMALL) { + /* Builtin keys cannot be defined by the attributes alone */ + if (status == PSA_SUCCESS) { + status = PSA_ERROR_CORRUPTION_DETECTED; + } + return status; + } + + /* If the key should exist according to the platform, then ask the driver + * what its expected size is. */ + status = psa_driver_wrapper_get_key_buffer_size(&attributes, + &key_buffer_size); + if (status != PSA_SUCCESS) { + return status; + } + + /* Allocate a buffer of the required size and load the builtin key directly + * into the (now properly sized) slot buffer. */ + status = psa_allocate_buffer_to_slot(slot, key_buffer_size); + if (status != PSA_SUCCESS) { + return status; + } + + status = psa_driver_wrapper_get_builtin_key( + slot_number, &attributes, + slot->key.data, slot->key.bytes, &key_buffer_length); + if (status != PSA_SUCCESS) { + goto exit; + } + + /* Copy actual key length and core attributes into the slot on success */ + slot->key.bytes = key_buffer_length; + slot->attr = attributes.core; + +exit: + if (status != PSA_SUCCESS) { + psa_remove_key_data_from_memory(slot); + } + return status; +} +#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */ + +psa_status_t psa_get_and_lock_key_slot(mbedtls_svc_key_id_t key, + psa_key_slot_t **p_slot) +{ + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + + *p_slot = NULL; + if (!global_data.key_slots_initialized) { + return PSA_ERROR_BAD_STATE; + } + + /* + * On success, the pointer to the slot is passed directly to the caller + * thus no need to unlock the key slot here. + */ + status = psa_get_and_lock_key_slot_in_memory(key, p_slot); + if (status != PSA_ERROR_DOES_NOT_EXIST) { + return status; + } + + /* Loading keys from storage requires support for such a mechanism */ +#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) || \ + defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS) + psa_key_id_t volatile_key_id; + + status = psa_get_empty_key_slot(&volatile_key_id, p_slot); + if (status != PSA_SUCCESS) { + return status; + } + + (*p_slot)->attr.id = key; + (*p_slot)->attr.lifetime = PSA_KEY_LIFETIME_PERSISTENT; + + status = PSA_ERROR_DOES_NOT_EXIST; +#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS) + /* Load keys in the 'builtin' range through their own interface */ + status = psa_load_builtin_key_into_slot(*p_slot); +#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */ + +#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) + if (status == PSA_ERROR_DOES_NOT_EXIST) { + status = psa_load_persistent_key_into_slot(*p_slot); + } +#endif /* defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) */ + + if (status != PSA_SUCCESS) { + psa_wipe_key_slot(*p_slot); + if (status == PSA_ERROR_DOES_NOT_EXIST) { + status = PSA_ERROR_INVALID_HANDLE; + } + } else { + /* Add implicit usage flags. */ + psa_extend_key_usage_flags(&(*p_slot)->attr.policy.usage); + } + + return status; +#else /* MBEDTLS_PSA_CRYPTO_STORAGE_C || MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */ + return PSA_ERROR_INVALID_HANDLE; +#endif /* MBEDTLS_PSA_CRYPTO_STORAGE_C || MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */ +} + +psa_status_t psa_unlock_key_slot(psa_key_slot_t *slot) +{ + if (slot == NULL) { + return PSA_SUCCESS; + } + + if (slot->lock_count > 0) { + slot->lock_count--; + return PSA_SUCCESS; + } + + /* + * As the return error code may not be handled in case of multiple errors, + * do our best to report if the lock counter is equal to zero: if + * available call MBEDTLS_PARAM_FAILED that may terminate execution (if + * called as part of the execution of a unit test suite this will stop the + * test suite execution). + */ +#ifdef MBEDTLS_CHECK_PARAMS + MBEDTLS_PARAM_FAILED(slot->lock_count > 0); +#endif + + return PSA_ERROR_CORRUPTION_DETECTED; +} + +psa_status_t psa_validate_key_location(psa_key_lifetime_t lifetime, + psa_se_drv_table_entry_t **p_drv) +{ + if (psa_key_lifetime_is_external(lifetime)) { +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + /* Check whether a driver is registered against this lifetime */ + psa_se_drv_table_entry_t *driver = psa_get_se_driver_entry(lifetime); + if (driver != NULL) { + if (p_drv != NULL) { + *p_drv = driver; + } + return PSA_SUCCESS; + } +#else /* MBEDTLS_PSA_CRYPTO_SE_C */ + (void) p_drv; +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ + +#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS) + /* Key location for external keys gets checked by the wrapper */ + return PSA_SUCCESS; +#else /* MBEDTLS_PSA_CRYPTO_DRIVERS */ + /* No support for external lifetimes at all, or dynamic interface + * did not find driver for requested lifetime. */ + return PSA_ERROR_INVALID_ARGUMENT; +#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */ + } else { + /* Local/internal keys are always valid */ + return PSA_SUCCESS; + } +} + +psa_status_t psa_validate_key_persistence(psa_key_lifetime_t lifetime) +{ + if (PSA_KEY_LIFETIME_IS_VOLATILE(lifetime)) { + /* Volatile keys are always supported */ + return PSA_SUCCESS; + } else { + /* Persistent keys require storage support */ +#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) + if (PSA_KEY_LIFETIME_IS_READ_ONLY(lifetime)) { + return PSA_ERROR_INVALID_ARGUMENT; + } else { + return PSA_SUCCESS; + } +#else /* MBEDTLS_PSA_CRYPTO_STORAGE_C */ + return PSA_ERROR_NOT_SUPPORTED; +#endif /* !MBEDTLS_PSA_CRYPTO_STORAGE_C */ + } +} + +psa_status_t psa_open_key(mbedtls_svc_key_id_t key, psa_key_handle_t *handle) +{ +#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) || \ + defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS) + psa_status_t status; + psa_key_slot_t *slot; + + status = psa_get_and_lock_key_slot(key, &slot); + if (status != PSA_SUCCESS) { + *handle = PSA_KEY_HANDLE_INIT; + if (status == PSA_ERROR_INVALID_HANDLE) { + status = PSA_ERROR_DOES_NOT_EXIST; + } + + return status; + } + + *handle = key; + + return psa_unlock_key_slot(slot); + +#else /* MBEDTLS_PSA_CRYPTO_STORAGE_C || MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */ + (void) key; + *handle = PSA_KEY_HANDLE_INIT; + return PSA_ERROR_NOT_SUPPORTED; +#endif /* MBEDTLS_PSA_CRYPTO_STORAGE_C || MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */ +} + +psa_status_t psa_close_key(psa_key_handle_t handle) +{ + psa_status_t status; + psa_key_slot_t *slot; + + if (psa_key_handle_is_null(handle)) { + return PSA_SUCCESS; + } + + status = psa_get_and_lock_key_slot_in_memory(handle, &slot); + if (status != PSA_SUCCESS) { + if (status == PSA_ERROR_DOES_NOT_EXIST) { + status = PSA_ERROR_INVALID_HANDLE; + } + + return status; + } + if (slot->lock_count <= 1) { + return psa_wipe_key_slot(slot); + } else { + return psa_unlock_key_slot(slot); + } +} + +psa_status_t psa_purge_key(mbedtls_svc_key_id_t key) +{ + psa_status_t status; + psa_key_slot_t *slot; + + status = psa_get_and_lock_key_slot_in_memory(key, &slot); + if (status != PSA_SUCCESS) { + return status; + } + + if ((!PSA_KEY_LIFETIME_IS_VOLATILE(slot->attr.lifetime)) && + (slot->lock_count <= 1)) { + return psa_wipe_key_slot(slot); + } else { + return psa_unlock_key_slot(slot); + } +} + +void mbedtls_psa_get_stats(mbedtls_psa_stats_t *stats) +{ + size_t slot_idx; + + memset(stats, 0, sizeof(*stats)); + + for (slot_idx = 0; slot_idx < MBEDTLS_PSA_KEY_SLOT_COUNT; slot_idx++) { + const psa_key_slot_t *slot = &global_data.key_slots[slot_idx]; + if (psa_is_key_slot_locked(slot)) { + ++stats->locked_slots; + } + if (!psa_is_key_slot_occupied(slot)) { + ++stats->empty_slots; + continue; + } + if (PSA_KEY_LIFETIME_IS_VOLATILE(slot->attr.lifetime)) { + ++stats->volatile_slots; + } else { + psa_key_id_t id = MBEDTLS_SVC_KEY_ID_GET_KEY_ID(slot->attr.id); + ++stats->persistent_slots; + if (id > stats->max_open_internal_key_id) { + stats->max_open_internal_key_id = id; + } + } + if (PSA_KEY_LIFETIME_GET_LOCATION(slot->attr.lifetime) != + PSA_KEY_LOCATION_LOCAL_STORAGE) { + psa_key_id_t id = MBEDTLS_SVC_KEY_ID_GET_KEY_ID(slot->attr.id); + ++stats->external_slots; + if (id > stats->max_open_external_key_id) { + stats->max_open_external_key_id = id; + } + } + } +} + +#endif /* MBEDTLS_PSA_CRYPTO_C */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_slot_management.h b/ext/opcua_client/mbedtls/library/psa_crypto_slot_management.h new file mode 100644 index 0000000..6041a35 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_slot_management.h @@ -0,0 +1,213 @@ +/* + * PSA crypto layer on top of Mbed TLS crypto + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_SLOT_MANAGEMENT_H +#define PSA_CRYPTO_SLOT_MANAGEMENT_H + +#include "psa/crypto.h" +#include "psa_crypto_core.h" +#include "psa_crypto_se.h" + +/** Range of volatile key identifiers. + * + * The last #MBEDTLS_PSA_KEY_SLOT_COUNT identifiers of the implementation + * range of key identifiers are reserved for volatile key identifiers. + * A volatile key identifier is equal to #PSA_KEY_ID_VOLATILE_MIN plus the + * index of the key slot containing the volatile key definition. + */ + +/** The minimum value for a volatile key identifier. + */ +#define PSA_KEY_ID_VOLATILE_MIN (PSA_KEY_ID_VENDOR_MAX - \ + MBEDTLS_PSA_KEY_SLOT_COUNT + 1) + +/** The maximum value for a volatile key identifier. + */ +#define PSA_KEY_ID_VOLATILE_MAX PSA_KEY_ID_VENDOR_MAX + +/** Test whether a key identifier is a volatile key identifier. + * + * \param key_id Key identifier to test. + * + * \retval 1 + * The key identifier is a volatile key identifier. + * \retval 0 + * The key identifier is not a volatile key identifier. + */ +static inline int psa_key_id_is_volatile(psa_key_id_t key_id) +{ + return (key_id >= PSA_KEY_ID_VOLATILE_MIN) && + (key_id <= PSA_KEY_ID_VOLATILE_MAX); +} + +/** Get the description of a key given its identifier and lock it. + * + * The descriptions of volatile keys and loaded persistent keys are stored in + * key slots. This function returns a pointer to the key slot containing the + * description of a key given its identifier. + * + * In case of a persistent key, the function loads the description of the key + * into a key slot if not already done. + * + * On success, the returned key slot is locked. It is the responsibility of + * the caller to unlock the key slot when it does not access it anymore. + * + * \param key Key identifier to query. + * \param[out] p_slot On success, `*p_slot` contains a pointer to the + * key slot containing the description of the key + * identified by \p key. + * + * \retval #PSA_SUCCESS + * \p *p_slot contains a pointer to the key slot containing the + * description of the key identified by \p key. + * The key slot counter has been incremented. + * \retval #PSA_ERROR_BAD_STATE + * The library has not been initialized. + * \retval #PSA_ERROR_INVALID_HANDLE + * \p key is not a valid key identifier. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \p key is a persistent key identifier. The implementation does not + * have sufficient resources to load the persistent key. This can be + * due to a lack of empty key slot, or available memory. + * \retval #PSA_ERROR_DOES_NOT_EXIST + * There is no key with key identifier \p key. + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + */ +psa_status_t psa_get_and_lock_key_slot(mbedtls_svc_key_id_t key, + psa_key_slot_t **p_slot); + +/** Initialize the key slot structures. + * + * \retval #PSA_SUCCESS + * Currently this function always succeeds. + */ +psa_status_t psa_initialize_key_slots(void); + +/** Delete all data from key slots in memory. + * + * This does not affect persistent storage. */ +void psa_wipe_all_key_slots(void); + +/** Find a free key slot. + * + * This function returns a key slot that is available for use and is in its + * ground state (all-bits-zero). On success, the key slot is locked. It is + * the responsibility of the caller to unlock the key slot when it does not + * access it anymore. + * + * \param[out] volatile_key_id On success, volatile key identifier + * associated to the returned slot. + * \param[out] p_slot On success, a pointer to the slot. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_BAD_STATE \emptydescription + */ +psa_status_t psa_get_empty_key_slot(psa_key_id_t *volatile_key_id, + psa_key_slot_t **p_slot); + +/** Lock a key slot. + * + * This function increments the key slot lock counter by one. + * + * \param[in] slot The key slot. + * + * \retval #PSA_SUCCESS + The key slot lock counter was incremented. + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * The lock counter already reached its maximum value and was not + * increased. + */ +static inline psa_status_t psa_lock_key_slot(psa_key_slot_t *slot) +{ + if (slot->lock_count >= SIZE_MAX) { + return PSA_ERROR_CORRUPTION_DETECTED; + } + + slot->lock_count++; + + return PSA_SUCCESS; +} + +/** Unlock a key slot. + * + * This function decrements the key slot lock counter by one. + * + * \note To ease the handling of errors in retrieving a key slot + * a NULL input pointer is valid, and the function returns + * successfully without doing anything in that case. + * + * \param[in] slot The key slot. + * \retval #PSA_SUCCESS + * \p slot is NULL or the key slot lock counter has been + * decremented successfully. + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * The lock counter was equal to 0. + * + */ +psa_status_t psa_unlock_key_slot(psa_key_slot_t *slot); + +/** Test whether a lifetime designates a key in an external cryptoprocessor. + * + * \param lifetime The lifetime to test. + * + * \retval 1 + * The lifetime designates an external key. There should be a + * registered driver for this lifetime, otherwise the key cannot + * be created or manipulated. + * \retval 0 + * The lifetime designates a key that is volatile or in internal + * storage. + */ +static inline int psa_key_lifetime_is_external(psa_key_lifetime_t lifetime) +{ + return PSA_KEY_LIFETIME_GET_LOCATION(lifetime) + != PSA_KEY_LOCATION_LOCAL_STORAGE; +} + +/** Validate a key's location. + * + * This function checks whether the key's attributes point to a location that + * is known to the PSA Core, and returns the driver function table if the key + * is to be found in an external location. + * + * \param[in] lifetime The key lifetime attribute. + * \param[out] p_drv On success, when a key is located in external + * storage, returns a pointer to the driver table + * associated with the key's storage location. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + */ +psa_status_t psa_validate_key_location(psa_key_lifetime_t lifetime, + psa_se_drv_table_entry_t **p_drv); + +/** Validate the persistence of a key. + * + * \param[in] lifetime The key lifetime attribute. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_NOT_SUPPORTED The key is persistent but persistent keys + * are not supported. + */ +psa_status_t psa_validate_key_persistence(psa_key_lifetime_t lifetime); + +/** Validate a key identifier. + * + * \param[in] key The key identifier. + * \param[in] vendor_ok Non-zero to indicate that key identifiers in the + * vendor range are allowed, volatile key identifiers + * excepted \c 0 otherwise. + * + * \retval <> 0 if the key identifier is valid, 0 otherwise. + */ +int psa_is_valid_key_id(mbedtls_svc_key_id_t key, int vendor_ok); + +#endif /* PSA_CRYPTO_SLOT_MANAGEMENT_H */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_storage.c b/ext/opcua_client/mbedtls/library/psa_crypto_storage.c new file mode 100644 index 0000000..a0e40c8 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_storage.c @@ -0,0 +1,484 @@ +/* + * PSA persistent key storage + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) + +#include +#include + +#include "psa/crypto.h" +#include "psa_crypto_storage.h" +#include "mbedtls/platform_util.h" + +#if defined(MBEDTLS_PSA_ITS_FILE_C) +#include "psa_crypto_its.h" +#else /* Native ITS implementation */ +#include "psa/error.h" +#include "psa/internal_trusted_storage.h" +#endif + +#include "mbedtls/platform.h" + +/****************************************************************/ +/* Key storage */ +/****************************************************************/ + +/* Determine a file name (ITS file identifier) for the given key identifier. + * The file name must be distinct from any file that is used for a purpose + * other than storing a key. Currently, the only such file is the random seed + * file whose name is PSA_CRYPTO_ITS_RANDOM_SEED_UID and whose value is + * 0xFFFFFF52. */ +static psa_storage_uid_t psa_its_identifier_of_slot(mbedtls_svc_key_id_t key) +{ +#if defined(MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER) + /* Encode the owner in the upper 32 bits. This means that if + * owner values are nonzero (as they are on a PSA platform), + * no key file will ever have a value less than 0x100000000, so + * the whole range 0..0xffffffff is available for non-key files. */ + uint32_t unsigned_owner_id = MBEDTLS_SVC_KEY_ID_GET_OWNER_ID(key); + return ((uint64_t) unsigned_owner_id << 32) | + MBEDTLS_SVC_KEY_ID_GET_KEY_ID(key); +#else + /* Use the key id directly as a file name. + * psa_is_key_id_valid() in psa_crypto_slot_management.c + * is responsible for ensuring that key identifiers do not have a + * value that is reserved for non-key files. */ + return key; +#endif +} + +/** + * \brief Load persistent data for the given key slot number. + * + * This function reads data from a storage backend and returns the data in a + * buffer. + * + * \param key Persistent identifier of the key to be loaded. This + * should be an occupied storage location. + * \param[out] data Buffer where the data is to be written. + * \param data_size Size of the \c data buffer in bytes. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_DOES_NOT_EXIST \emptydescription + */ +static psa_status_t psa_crypto_storage_load( + const mbedtls_svc_key_id_t key, uint8_t *data, size_t data_size) +{ + psa_status_t status; + psa_storage_uid_t data_identifier = psa_its_identifier_of_slot(key); + struct psa_storage_info_t data_identifier_info; + size_t data_length = 0; + + status = psa_its_get_info(data_identifier, &data_identifier_info); + if (status != PSA_SUCCESS) { + return status; + } + + status = psa_its_get(data_identifier, 0, (uint32_t) data_size, data, &data_length); + if (data_size != data_length) { + return PSA_ERROR_DATA_INVALID; + } + + return status; +} + +int psa_is_key_present_in_storage(const mbedtls_svc_key_id_t key) +{ + psa_status_t ret; + psa_storage_uid_t data_identifier = psa_its_identifier_of_slot(key); + struct psa_storage_info_t data_identifier_info; + + ret = psa_its_get_info(data_identifier, &data_identifier_info); + + if (ret == PSA_ERROR_DOES_NOT_EXIST) { + return 0; + } + return 1; +} + +/** + * \brief Store persistent data for the given key slot number. + * + * This function stores the given data buffer to a persistent storage. + * + * \param key Persistent identifier of the key to be stored. This + * should be an unoccupied storage location. + * \param[in] data Buffer containing the data to be stored. + * \param data_length The number of bytes + * that make up the data. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription + * \retval #PSA_ERROR_ALREADY_EXISTS \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + */ +static psa_status_t psa_crypto_storage_store(const mbedtls_svc_key_id_t key, + const uint8_t *data, + size_t data_length) +{ + psa_status_t status; + psa_storage_uid_t data_identifier = psa_its_identifier_of_slot(key); + struct psa_storage_info_t data_identifier_info; + + if (psa_is_key_present_in_storage(key) == 1) { + return PSA_ERROR_ALREADY_EXISTS; + } + + status = psa_its_set(data_identifier, (uint32_t) data_length, data, 0); + if (status != PSA_SUCCESS) { + return PSA_ERROR_DATA_INVALID; + } + + status = psa_its_get_info(data_identifier, &data_identifier_info); + if (status != PSA_SUCCESS) { + goto exit; + } + + if (data_identifier_info.size != data_length) { + status = PSA_ERROR_DATA_INVALID; + goto exit; + } + +exit: + if (status != PSA_SUCCESS) { + /* Remove the file in case we managed to create it but something + * went wrong. It's ok if the file doesn't exist. If the file exists + * but the removal fails, we're already reporting an error so there's + * nothing else we can do. */ + (void) psa_its_remove(data_identifier); + } + return status; +} + +psa_status_t psa_destroy_persistent_key(const mbedtls_svc_key_id_t key) +{ + psa_status_t ret; + psa_storage_uid_t data_identifier = psa_its_identifier_of_slot(key); + struct psa_storage_info_t data_identifier_info; + + ret = psa_its_get_info(data_identifier, &data_identifier_info); + if (ret == PSA_ERROR_DOES_NOT_EXIST) { + return PSA_SUCCESS; + } + + if (psa_its_remove(data_identifier) != PSA_SUCCESS) { + return PSA_ERROR_DATA_INVALID; + } + + ret = psa_its_get_info(data_identifier, &data_identifier_info); + if (ret != PSA_ERROR_DOES_NOT_EXIST) { + return PSA_ERROR_DATA_INVALID; + } + + return PSA_SUCCESS; +} + +/** + * \brief Get data length for given key slot number. + * + * \param key Persistent identifier whose stored data length + * is to be obtained. + * \param[out] data_length The number of bytes that make up the data. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_DOES_NOT_EXIST \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + */ +static psa_status_t psa_crypto_storage_get_data_length( + const mbedtls_svc_key_id_t key, + size_t *data_length) +{ + psa_status_t status; + psa_storage_uid_t data_identifier = psa_its_identifier_of_slot(key); + struct psa_storage_info_t data_identifier_info; + + status = psa_its_get_info(data_identifier, &data_identifier_info); + if (status != PSA_SUCCESS) { + return status; + } + + *data_length = (size_t) data_identifier_info.size; + + return PSA_SUCCESS; +} + +/** + * Persistent key storage magic header. + */ +#define PSA_KEY_STORAGE_MAGIC_HEADER "PSA\0KEY" +#define PSA_KEY_STORAGE_MAGIC_HEADER_LENGTH (sizeof(PSA_KEY_STORAGE_MAGIC_HEADER)) + +typedef struct { + uint8_t magic[PSA_KEY_STORAGE_MAGIC_HEADER_LENGTH]; + uint8_t version[4]; + uint8_t lifetime[sizeof(psa_key_lifetime_t)]; + uint8_t type[2]; + uint8_t bits[2]; + uint8_t policy[sizeof(psa_key_policy_t)]; + uint8_t data_len[4]; + uint8_t key_data[]; +} psa_persistent_key_storage_format; + +void psa_format_key_data_for_storage(const uint8_t *data, + const size_t data_length, + const psa_core_key_attributes_t *attr, + uint8_t *storage_data) +{ + psa_persistent_key_storage_format *storage_format = + (psa_persistent_key_storage_format *) storage_data; + + memcpy(storage_format->magic, PSA_KEY_STORAGE_MAGIC_HEADER, + PSA_KEY_STORAGE_MAGIC_HEADER_LENGTH); + MBEDTLS_PUT_UINT32_LE(0, storage_format->version, 0); + MBEDTLS_PUT_UINT32_LE(attr->lifetime, storage_format->lifetime, 0); + MBEDTLS_PUT_UINT16_LE((uint16_t) attr->type, storage_format->type, 0); + MBEDTLS_PUT_UINT16_LE((uint16_t) attr->bits, storage_format->bits, 0); + MBEDTLS_PUT_UINT32_LE(attr->policy.usage, storage_format->policy, 0); + MBEDTLS_PUT_UINT32_LE(attr->policy.alg, storage_format->policy, sizeof(uint32_t)); + MBEDTLS_PUT_UINT32_LE(attr->policy.alg2, storage_format->policy, 2 * sizeof(uint32_t)); + MBEDTLS_PUT_UINT32_LE(data_length, storage_format->data_len, 0); + memcpy(storage_format->key_data, data, data_length); +} + +static psa_status_t check_magic_header(const uint8_t *data) +{ + if (memcmp(data, PSA_KEY_STORAGE_MAGIC_HEADER, + PSA_KEY_STORAGE_MAGIC_HEADER_LENGTH) != 0) { + return PSA_ERROR_DATA_INVALID; + } + return PSA_SUCCESS; +} + +psa_status_t psa_parse_key_data_from_storage(const uint8_t *storage_data, + size_t storage_data_length, + uint8_t **key_data, + size_t *key_data_length, + psa_core_key_attributes_t *attr) +{ + psa_status_t status; + const psa_persistent_key_storage_format *storage_format = + (const psa_persistent_key_storage_format *) storage_data; + uint32_t version; + + if (storage_data_length < sizeof(*storage_format)) { + return PSA_ERROR_DATA_INVALID; + } + + status = check_magic_header(storage_data); + if (status != PSA_SUCCESS) { + return status; + } + + version = MBEDTLS_GET_UINT32_LE(storage_format->version, 0); + if (version != 0) { + return PSA_ERROR_DATA_INVALID; + } + + *key_data_length = MBEDTLS_GET_UINT32_LE(storage_format->data_len, 0); + if (*key_data_length > (storage_data_length - sizeof(*storage_format)) || + *key_data_length > PSA_CRYPTO_MAX_STORAGE_SIZE) { + return PSA_ERROR_DATA_INVALID; + } + + if (*key_data_length == 0) { + *key_data = NULL; + } else { + *key_data = mbedtls_calloc(1, *key_data_length); + if (*key_data == NULL) { + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + memcpy(*key_data, storage_format->key_data, *key_data_length); + } + + attr->lifetime = MBEDTLS_GET_UINT32_LE(storage_format->lifetime, 0); + attr->type = MBEDTLS_GET_UINT16_LE(storage_format->type, 0); + attr->bits = MBEDTLS_GET_UINT16_LE(storage_format->bits, 0); + attr->policy.usage = MBEDTLS_GET_UINT32_LE(storage_format->policy, 0); + attr->policy.alg = MBEDTLS_GET_UINT32_LE(storage_format->policy, sizeof(uint32_t)); + attr->policy.alg2 = MBEDTLS_GET_UINT32_LE(storage_format->policy, 2 * sizeof(uint32_t)); + + return PSA_SUCCESS; +} + +psa_status_t psa_save_persistent_key(const psa_core_key_attributes_t *attr, + const uint8_t *data, + const size_t data_length) +{ + size_t storage_data_length; + uint8_t *storage_data; + psa_status_t status; + + /* All keys saved to persistent storage always have a key context */ + if (data == NULL || data_length == 0) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + if (data_length > PSA_CRYPTO_MAX_STORAGE_SIZE) { + return PSA_ERROR_INSUFFICIENT_STORAGE; + } + storage_data_length = data_length + sizeof(psa_persistent_key_storage_format); + + storage_data = mbedtls_calloc(1, storage_data_length); + if (storage_data == NULL) { + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + + psa_format_key_data_for_storage(data, data_length, attr, storage_data); + + status = psa_crypto_storage_store(attr->id, + storage_data, storage_data_length); + + mbedtls_platform_zeroize(storage_data, storage_data_length); + mbedtls_free(storage_data); + + return status; +} + +void psa_free_persistent_key_data(uint8_t *key_data, size_t key_data_length) +{ + if (key_data != NULL) { + mbedtls_platform_zeroize(key_data, key_data_length); + } + mbedtls_free(key_data); +} + +psa_status_t psa_load_persistent_key(psa_core_key_attributes_t *attr, + uint8_t **data, + size_t *data_length) +{ + psa_status_t status = PSA_SUCCESS; + uint8_t *loaded_data; + size_t storage_data_length = 0; + mbedtls_svc_key_id_t key = attr->id; + + status = psa_crypto_storage_get_data_length(key, &storage_data_length); + if (status != PSA_SUCCESS) { + return status; + } + + loaded_data = mbedtls_calloc(1, storage_data_length); + + if (loaded_data == NULL) { + return PSA_ERROR_INSUFFICIENT_MEMORY; + } + + status = psa_crypto_storage_load(key, loaded_data, storage_data_length); + if (status != PSA_SUCCESS) { + goto exit; + } + + status = psa_parse_key_data_from_storage(loaded_data, storage_data_length, + data, data_length, attr); + + /* All keys saved to persistent storage always have a key context */ + if (status == PSA_SUCCESS && + (*data == NULL || *data_length == 0)) { + status = PSA_ERROR_STORAGE_FAILURE; + } + +exit: + mbedtls_platform_zeroize(loaded_data, storage_data_length); + mbedtls_free(loaded_data); + return status; +} + + + +/****************************************************************/ +/* Transactions */ +/****************************************************************/ + +#if defined(PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS) + +psa_crypto_transaction_t psa_crypto_transaction; + +psa_status_t psa_crypto_save_transaction(void) +{ + struct psa_storage_info_t p_info; + psa_status_t status; + status = psa_its_get_info(PSA_CRYPTO_ITS_TRANSACTION_UID, &p_info); + if (status == PSA_SUCCESS) { + /* This shouldn't happen: we're trying to start a transaction while + * there is still a transaction that hasn't been replayed. */ + return PSA_ERROR_CORRUPTION_DETECTED; + } else if (status != PSA_ERROR_DOES_NOT_EXIST) { + return status; + } + return psa_its_set(PSA_CRYPTO_ITS_TRANSACTION_UID, + sizeof(psa_crypto_transaction), + &psa_crypto_transaction, + 0); +} + +psa_status_t psa_crypto_load_transaction(void) +{ + psa_status_t status; + size_t length; + status = psa_its_get(PSA_CRYPTO_ITS_TRANSACTION_UID, 0, + sizeof(psa_crypto_transaction), + &psa_crypto_transaction, &length); + if (status != PSA_SUCCESS) { + return status; + } + if (length != sizeof(psa_crypto_transaction)) { + return PSA_ERROR_DATA_INVALID; + } + return PSA_SUCCESS; +} + +psa_status_t psa_crypto_stop_transaction(void) +{ + psa_status_t status = psa_its_remove(PSA_CRYPTO_ITS_TRANSACTION_UID); + /* Whether or not updating the storage succeeded, the transaction is + * finished now. It's too late to go back, so zero out the in-memory + * data. */ + memset(&psa_crypto_transaction, 0, sizeof(psa_crypto_transaction)); + return status; +} + +#endif /* PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS */ + + + +/****************************************************************/ +/* Random generator state */ +/****************************************************************/ + +#if defined(MBEDTLS_PSA_INJECT_ENTROPY) +psa_status_t mbedtls_psa_storage_inject_entropy(const unsigned char *seed, + size_t seed_size) +{ + psa_status_t status; + struct psa_storage_info_t p_info; + + status = psa_its_get_info(PSA_CRYPTO_ITS_RANDOM_SEED_UID, &p_info); + + if (PSA_ERROR_DOES_NOT_EXIST == status) { /* No seed exists */ + status = psa_its_set(PSA_CRYPTO_ITS_RANDOM_SEED_UID, seed_size, seed, 0); + } else if (PSA_SUCCESS == status) { + /* You should not be here. Seed needs to be injected only once */ + status = PSA_ERROR_NOT_PERMITTED; + } + return status; +} +#endif /* MBEDTLS_PSA_INJECT_ENTROPY */ + + + +/****************************************************************/ +/* The end */ +/****************************************************************/ + +#endif /* MBEDTLS_PSA_CRYPTO_STORAGE_C */ diff --git a/ext/opcua_client/mbedtls/library/psa_crypto_storage.h b/ext/opcua_client/mbedtls/library/psa_crypto_storage.h new file mode 100644 index 0000000..b6b5e15 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_crypto_storage.h @@ -0,0 +1,384 @@ +/** + * \file psa_crypto_storage.h + * + * \brief PSA cryptography module: Mbed TLS key storage + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_STORAGE_H +#define PSA_CRYPTO_STORAGE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psa/crypto.h" +#include "psa/crypto_se_driver.h" + +#include +#include + +/* Limit the maximum key size in storage. This should have no effect + * since the key size is limited in memory. */ +#define PSA_CRYPTO_MAX_STORAGE_SIZE (PSA_BITS_TO_BYTES(PSA_MAX_KEY_BITS)) +/* Sanity check: a file size must fit in 32 bits. Allow a generous + * 64kB of metadata. */ +#if PSA_CRYPTO_MAX_STORAGE_SIZE > 0xffff0000 +#error "PSA_CRYPTO_MAX_STORAGE_SIZE > 0xffff0000" +#endif + +/** The maximum permitted persistent slot number. + * + * In Mbed Crypto 0.1.0b: + * - Using the file backend, all key ids are ok except 0. + * - Using the ITS backend, all key ids are ok except 0xFFFFFF52 + * (#PSA_CRYPTO_ITS_RANDOM_SEED_UID) for which the file contains the + * device's random seed (if this feature is enabled). + * - Only key ids from 1 to #MBEDTLS_PSA_KEY_SLOT_COUNT are actually used. + * + * Since we need to preserve the random seed, avoid using that key slot. + * Reserve a whole range of key slots just in case something else comes up. + * + * This limitation will probably become moot when we implement client + * separation for key storage. + */ +#define PSA_MAX_PERSISTENT_KEY_IDENTIFIER PSA_KEY_ID_VENDOR_MAX + +/** + * \brief Checks if persistent data is stored for the given key slot number + * + * This function checks if any key data or metadata exists for the key slot in + * the persistent storage. + * + * \param key Persistent identifier to check. + * + * \retval 0 + * No persistent data present for slot number + * \retval 1 + * Persistent data present for slot number + */ +int psa_is_key_present_in_storage(const mbedtls_svc_key_id_t key); + +/** + * \brief Format key data and metadata and save to a location for given key + * slot. + * + * This function formats the key data and metadata and saves it to a + * persistent storage backend. The storage location corresponding to the + * key slot must be empty, otherwise this function will fail. This function + * should be called after loading the key into an internal slot to ensure the + * persistent key is not saved into a storage location corresponding to an + * already occupied non-persistent key, as well as ensuring the key data is + * validated. + * + * Note: This function will only succeed for key buffers which are not + * empty. If passed a NULL pointer or zero-length, the function will fail + * with #PSA_ERROR_INVALID_ARGUMENT. + * + * \param[in] attr The attributes of the key to save. + * The key identifier field in the attributes + * determines the key's location. + * \param[in] data Buffer containing the key data. + * \param data_length The number of bytes that make up the key data. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_ALREADY_EXISTS \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + */ +psa_status_t psa_save_persistent_key(const psa_core_key_attributes_t *attr, + const uint8_t *data, + const size_t data_length); + +/** + * \brief Parses key data and metadata and load persistent key for given + * key slot number. + * + * This function reads from a storage backend, parses the key data and + * metadata and writes them to the appropriate output parameters. + * + * Note: This function allocates a buffer and returns a pointer to it through + * the data parameter. On successful return, the pointer is guaranteed to be + * valid and the buffer contains at least one byte of data. + * psa_free_persistent_key_data() must be called on the data buffer + * afterwards to zeroize and free this buffer. + * + * \param[in,out] attr On input, the key identifier field identifies + * the key to load. Other fields are ignored. + * On success, the attribute structure contains + * the key metadata that was loaded from storage. + * \param[out] data Pointer to an allocated key data buffer on return. + * \param[out] data_length The number of bytes that make up the key data. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + * \retval #PSA_ERROR_DOES_NOT_EXIST \emptydescription + */ +psa_status_t psa_load_persistent_key(psa_core_key_attributes_t *attr, + uint8_t **data, + size_t *data_length); + +/** + * \brief Remove persistent data for the given key slot number. + * + * \param key Persistent identifier of the key to remove + * from persistent storage. + * + * \retval #PSA_SUCCESS + * The key was successfully removed, + * or the key did not exist. + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + */ +psa_status_t psa_destroy_persistent_key(const mbedtls_svc_key_id_t key); + +/** + * \brief Free the temporary buffer allocated by psa_load_persistent_key(). + * + * This function must be called at some point after psa_load_persistent_key() + * to zeroize and free the memory allocated to the buffer in that function. + * + * \param key_data Buffer for the key data. + * \param key_data_length Size of the key data buffer. + * + */ +void psa_free_persistent_key_data(uint8_t *key_data, size_t key_data_length); + +/** + * \brief Formats key data and metadata for persistent storage + * + * \param[in] data Buffer containing the key data. + * \param data_length Length of the key data buffer. + * \param[in] attr The core attributes of the key. + * \param[out] storage_data Output buffer for the formatted data. + * + */ +void psa_format_key_data_for_storage(const uint8_t *data, + const size_t data_length, + const psa_core_key_attributes_t *attr, + uint8_t *storage_data); + +/** + * \brief Parses persistent storage data into key data and metadata + * + * \param[in] storage_data Buffer for the storage data. + * \param storage_data_length Length of the storage data buffer + * \param[out] key_data On output, pointer to a newly allocated buffer + * containing the key data. This must be freed + * using psa_free_persistent_key_data() + * \param[out] key_data_length Length of the key data buffer + * \param[out] attr On success, the attribute structure is filled + * with the loaded key metadata. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + */ +psa_status_t psa_parse_key_data_from_storage(const uint8_t *storage_data, + size_t storage_data_length, + uint8_t **key_data, + size_t *key_data_length, + psa_core_key_attributes_t *attr); + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) +/** This symbol is defined if transaction support is required. */ +#define PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS 1 +#endif + +#if defined(PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS) + +/** The type of transaction that is in progress. + */ +/* This is an integer type rather than an enum for two reasons: to support + * unknown values when loading a transaction file, and to ensure that the + * type has a known size. + */ +typedef uint16_t psa_crypto_transaction_type_t; + +/** No transaction is in progress. + * + * This has the value 0, so zero-initialization sets a transaction's type to + * this value. + */ +#define PSA_CRYPTO_TRANSACTION_NONE ((psa_crypto_transaction_type_t) 0x0000) + +/** A key creation transaction. + * + * This is only used for keys in an external cryptoprocessor (secure element). + * Keys in RAM or in internal storage are created atomically in storage + * (simple file creation), so they do not need a transaction mechanism. + */ +#define PSA_CRYPTO_TRANSACTION_CREATE_KEY ((psa_crypto_transaction_type_t) 0x0001) + +/** A key destruction transaction. + * + * This is only used for keys in an external cryptoprocessor (secure element). + * Keys in RAM or in internal storage are destroyed atomically in storage + * (simple file deletion), so they do not need a transaction mechanism. + */ +#define PSA_CRYPTO_TRANSACTION_DESTROY_KEY ((psa_crypto_transaction_type_t) 0x0002) + +/** Transaction data. + * + * This type is designed to be serialized by writing the memory representation + * and reading it back on the same device. + * + * \note The transaction mechanism is designed for a single active transaction + * at a time. The transaction object is #psa_crypto_transaction. + * + * \note If an API call starts a transaction, it must complete this transaction + * before returning to the application. + * + * The lifetime of a transaction is the following (note that only one + * transaction may be active at a time): + * + * -# Call psa_crypto_prepare_transaction() to initialize the transaction + * object in memory and declare the type of transaction that is starting. + * -# Fill in the type-specific fields of #psa_crypto_transaction. + * -# Call psa_crypto_save_transaction() to start the transaction. This + * saves the transaction data to internal storage. + * -# Perform the work of the transaction by modifying files, contacting + * external entities, or whatever needs doing. Note that the transaction + * may be interrupted by a power failure, so you need to have a way + * recover from interruptions either by undoing what has been done + * so far or by resuming where you left off. + * -# If there are intermediate stages in the transaction, update + * the fields of #psa_crypto_transaction and call + * psa_crypto_save_transaction() again when each stage is reached. + * -# When the transaction is over, call psa_crypto_stop_transaction() to + * remove the transaction data in storage and in memory. + * + * If the system crashes while a transaction is in progress, psa_crypto_init() + * calls psa_crypto_load_transaction() and takes care of completing or + * rewinding the transaction. This is done in psa_crypto_recover_transaction() + * in psa_crypto.c. If you add a new type of transaction, be + * sure to add code for it in psa_crypto_recover_transaction(). + */ +typedef union { + /* Each element of this union must have the following properties + * to facilitate serialization and deserialization: + * + * - The element is a struct. + * - The first field of the struct is `psa_crypto_transaction_type_t type`. + * - Elements of the struct are arranged such a way that there is + * no padding. + */ + struct psa_crypto_transaction_unknown_s { + psa_crypto_transaction_type_t type; + uint16_t unused1; + uint32_t unused2; + uint64_t unused3; + uint64_t unused4; + } unknown; + /* ::type is #PSA_CRYPTO_TRANSACTION_CREATE_KEY or + * #PSA_CRYPTO_TRANSACTION_DESTROY_KEY. */ + struct psa_crypto_transaction_key_s { + psa_crypto_transaction_type_t type; + uint16_t unused1; + psa_key_lifetime_t lifetime; + psa_key_slot_number_t slot; + mbedtls_svc_key_id_t id; + } key; +} psa_crypto_transaction_t; + +/** The single active transaction. + */ +extern psa_crypto_transaction_t psa_crypto_transaction; + +/** Prepare for a transaction. + * + * There must not be an ongoing transaction. + * + * \param type The type of transaction to start. + */ +static inline void psa_crypto_prepare_transaction( + psa_crypto_transaction_type_t type) +{ + psa_crypto_transaction.unknown.type = type; +} + +/** Save the transaction data to storage. + * + * You may call this function multiple times during a transaction to + * atomically update the transaction state. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + */ +psa_status_t psa_crypto_save_transaction(void); + +/** Load the transaction data from storage, if any. + * + * This function is meant to be called from psa_crypto_init() to recover + * in case a transaction was interrupted by a system crash. + * + * \retval #PSA_SUCCESS + * The data about the ongoing transaction has been loaded to + * #psa_crypto_transaction. + * \retval #PSA_ERROR_DOES_NOT_EXIST + * There is no ongoing transaction. + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_DATA_INVALID \emptydescription + * \retval #PSA_ERROR_DATA_CORRUPT \emptydescription + */ +psa_status_t psa_crypto_load_transaction(void); + +/** Indicate that the current transaction is finished. + * + * Call this function at the very end of transaction processing. + * This function does not "commit" or "abort" the transaction: the storage + * subsystem has no concept of "commit" and "abort", just saving and + * removing the transaction information in storage. + * + * This function erases the transaction data in storage (if any) and + * resets the transaction data in memory. + * + * \retval #PSA_SUCCESS + * There was transaction data in storage. + * \retval #PSA_ERROR_DOES_NOT_EXIST + * There was no transaction data in storage. + * \retval #PSA_ERROR_STORAGE_FAILURE + * It was impossible to determine whether there was transaction data + * in storage, or the transaction data could not be erased. + */ +psa_status_t psa_crypto_stop_transaction(void); + +/** The ITS file identifier for the transaction data. + * + * 0xffffffNN = special file; 0x74 = 't' for transaction. + */ +#define PSA_CRYPTO_ITS_TRANSACTION_UID ((psa_key_id_t) 0xffffff74) + +#endif /* PSA_CRYPTO_STORAGE_HAS_TRANSACTIONS */ + +#if defined(MBEDTLS_PSA_INJECT_ENTROPY) +/** Backend side of mbedtls_psa_inject_entropy(). + * + * This function stores the supplied data into the entropy seed file. + * + * \retval #PSA_SUCCESS + * Success + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED + * The entropy seed file already exists. + */ +psa_status_t mbedtls_psa_storage_inject_entropy(const unsigned char *seed, + size_t seed_size); +#endif /* MBEDTLS_PSA_INJECT_ENTROPY */ + +#ifdef __cplusplus +} +#endif + +#endif /* PSA_CRYPTO_STORAGE_H */ diff --git a/ext/opcua_client/mbedtls/library/psa_its_file.c b/ext/opcua_client/mbedtls/library/psa_its_file.c new file mode 100644 index 0000000..7ac99bd --- /dev/null +++ b/ext/opcua_client/mbedtls/library/psa_its_file.c @@ -0,0 +1,252 @@ +/* + * PSA ITS simulator over stdio files. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_PSA_ITS_FILE_C) + +#include "mbedtls/platform.h" + +#if defined(_WIN32) +#include +#endif + +#include "psa_crypto_its.h" + +#include +#include +#include +#include + +#if !defined(PSA_ITS_STORAGE_PREFIX) +#define PSA_ITS_STORAGE_PREFIX "" +#endif + +#define PSA_ITS_STORAGE_FILENAME_PATTERN "%08x%08x" +#define PSA_ITS_STORAGE_SUFFIX ".psa_its" +#define PSA_ITS_STORAGE_FILENAME_LENGTH \ + (sizeof(PSA_ITS_STORAGE_PREFIX) - 1 + /*prefix without terminating 0*/ \ + 16 + /*UID (64-bit number in hex)*/ \ + sizeof(PSA_ITS_STORAGE_SUFFIX) - 1 + /*suffix without terminating 0*/ \ + 1 /*terminating null byte*/) +#define PSA_ITS_STORAGE_TEMP \ + PSA_ITS_STORAGE_PREFIX "tempfile" PSA_ITS_STORAGE_SUFFIX + +/* The maximum value of psa_storage_info_t.size */ +#define PSA_ITS_MAX_SIZE 0xffffffff + +#define PSA_ITS_MAGIC_STRING "PSA\0ITS\0" +#define PSA_ITS_MAGIC_LENGTH 8 + +/* As rename fails on Windows if the new filepath already exists, + * use MoveFileExA with the MOVEFILE_REPLACE_EXISTING flag instead. + * Returns 0 on success, nonzero on failure. */ +#if defined(_WIN32) +#define rename_replace_existing(oldpath, newpath) \ + (!MoveFileExA(oldpath, newpath, MOVEFILE_REPLACE_EXISTING)) +#else +#define rename_replace_existing(oldpath, newpath) rename(oldpath, newpath) +#endif + +typedef struct { + uint8_t magic[PSA_ITS_MAGIC_LENGTH]; + uint8_t size[sizeof(uint32_t)]; + uint8_t flags[sizeof(psa_storage_create_flags_t)]; +} psa_its_file_header_t; + +static void psa_its_fill_filename(psa_storage_uid_t uid, char *filename) +{ + /* Break up the UID into two 32-bit pieces so as not to rely on + * long long support in snprintf. */ + mbedtls_snprintf(filename, PSA_ITS_STORAGE_FILENAME_LENGTH, + "%s" PSA_ITS_STORAGE_FILENAME_PATTERN "%s", + PSA_ITS_STORAGE_PREFIX, + (unsigned) (uid >> 32), + (unsigned) (uid & 0xffffffff), + PSA_ITS_STORAGE_SUFFIX); +} + +static psa_status_t psa_its_read_file(psa_storage_uid_t uid, + struct psa_storage_info_t *p_info, + FILE **p_stream) +{ + char filename[PSA_ITS_STORAGE_FILENAME_LENGTH]; + psa_its_file_header_t header; + size_t n; + + *p_stream = NULL; + psa_its_fill_filename(uid, filename); + *p_stream = fopen(filename, "rb"); + if (*p_stream == NULL) { + return PSA_ERROR_DOES_NOT_EXIST; + } + + n = fread(&header, 1, sizeof(header), *p_stream); + if (n != sizeof(header)) { + return PSA_ERROR_DATA_CORRUPT; + } + if (memcmp(header.magic, PSA_ITS_MAGIC_STRING, + PSA_ITS_MAGIC_LENGTH) != 0) { + return PSA_ERROR_DATA_CORRUPT; + } + + p_info->size = (header.size[0] | + header.size[1] << 8 | + header.size[2] << 16 | + header.size[3] << 24); + p_info->flags = (header.flags[0] | + header.flags[1] << 8 | + header.flags[2] << 16 | + header.flags[3] << 24); + return PSA_SUCCESS; +} + +psa_status_t psa_its_get_info(psa_storage_uid_t uid, + struct psa_storage_info_t *p_info) +{ + psa_status_t status; + FILE *stream = NULL; + status = psa_its_read_file(uid, p_info, &stream); + if (stream != NULL) { + fclose(stream); + } + return status; +} + +psa_status_t psa_its_get(psa_storage_uid_t uid, + uint32_t data_offset, + uint32_t data_length, + void *p_data, + size_t *p_data_length) +{ + psa_status_t status; + FILE *stream = NULL; + size_t n; + struct psa_storage_info_t info; + + status = psa_its_read_file(uid, &info, &stream); + if (status != PSA_SUCCESS) { + goto exit; + } + status = PSA_ERROR_INVALID_ARGUMENT; + if (data_offset + data_length < data_offset) { + goto exit; + } +#if SIZE_MAX < 0xffffffff + if (data_offset + data_length > SIZE_MAX) { + goto exit; + } +#endif + if (data_offset + data_length > info.size) { + goto exit; + } + + status = PSA_ERROR_STORAGE_FAILURE; +#if LONG_MAX < 0xffffffff + while (data_offset > LONG_MAX) { + if (fseek(stream, LONG_MAX, SEEK_CUR) != 0) { + goto exit; + } + data_offset -= LONG_MAX; + } +#endif + if (fseek(stream, data_offset, SEEK_CUR) != 0) { + goto exit; + } + n = fread(p_data, 1, data_length, stream); + if (n != data_length) { + goto exit; + } + status = PSA_SUCCESS; + if (p_data_length != NULL) { + *p_data_length = n; + } + +exit: + if (stream != NULL) { + fclose(stream); + } + return status; +} + +psa_status_t psa_its_set(psa_storage_uid_t uid, + uint32_t data_length, + const void *p_data, + psa_storage_create_flags_t create_flags) +{ + if (uid == 0) { + return PSA_ERROR_INVALID_HANDLE; + } + + psa_status_t status = PSA_ERROR_STORAGE_FAILURE; + char filename[PSA_ITS_STORAGE_FILENAME_LENGTH]; + FILE *stream = NULL; + psa_its_file_header_t header; + size_t n; + + memcpy(header.magic, PSA_ITS_MAGIC_STRING, PSA_ITS_MAGIC_LENGTH); + MBEDTLS_PUT_UINT32_LE(data_length, header.size, 0); + MBEDTLS_PUT_UINT32_LE(create_flags, header.flags, 0); + + psa_its_fill_filename(uid, filename); + stream = fopen(PSA_ITS_STORAGE_TEMP, "wb"); + if (stream == NULL) { + goto exit; + } + + status = PSA_ERROR_INSUFFICIENT_STORAGE; + n = fwrite(&header, 1, sizeof(header), stream); + if (n != sizeof(header)) { + goto exit; + } + if (data_length != 0) { + n = fwrite(p_data, 1, data_length, stream); + if (n != data_length) { + goto exit; + } + } + status = PSA_SUCCESS; + +exit: + if (stream != NULL) { + int ret = fclose(stream); + if (status == PSA_SUCCESS && ret != 0) { + status = PSA_ERROR_INSUFFICIENT_STORAGE; + } + } + if (status == PSA_SUCCESS) { + if (rename_replace_existing(PSA_ITS_STORAGE_TEMP, filename) != 0) { + status = PSA_ERROR_STORAGE_FAILURE; + } + } + /* The temporary file may still exist, but only in failure cases where + * we're already reporting an error. So there's nothing we can do on + * failure. If the function succeeded, and in some error cases, the + * temporary file doesn't exist and so remove() is expected to fail. + * Thus we just ignore the return status of remove(). */ + (void) remove(PSA_ITS_STORAGE_TEMP); + return status; +} + +psa_status_t psa_its_remove(psa_storage_uid_t uid) +{ + char filename[PSA_ITS_STORAGE_FILENAME_LENGTH]; + FILE *stream; + psa_its_fill_filename(uid, filename); + stream = fopen(filename, "rb"); + if (stream == NULL) { + return PSA_ERROR_DOES_NOT_EXIST; + } + fclose(stream); + if (remove(filename) != 0) { + return PSA_ERROR_STORAGE_FAILURE; + } + return PSA_SUCCESS; +} + +#endif /* MBEDTLS_PSA_ITS_FILE_C */ diff --git a/ext/opcua_client/mbedtls/library/ripemd160.c b/ext/opcua_client/mbedtls/library/ripemd160.c new file mode 100644 index 0000000..3e8ede3 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ripemd160.c @@ -0,0 +1,526 @@ +/* + * RIPE MD-160 implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * The RIPEMD-160 algorithm was designed by RIPE in 1996 + * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html + * http://ehash.iaik.tugraz.at/wiki/RIPEMD-160 + */ + +#include "common.h" + +#if defined(MBEDTLS_RIPEMD160_C) + +#include "mbedtls/ripemd160.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_RIPEMD160_ALT) + +void mbedtls_ripemd160_init(mbedtls_ripemd160_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_ripemd160_context)); +} + +void mbedtls_ripemd160_free(mbedtls_ripemd160_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_ripemd160_context)); +} + +void mbedtls_ripemd160_clone(mbedtls_ripemd160_context *dst, + const mbedtls_ripemd160_context *src) +{ + *dst = *src; +} + +/* + * RIPEMD-160 context setup + */ +int mbedtls_ripemd160_starts_ret(mbedtls_ripemd160_context *ctx) +{ + ctx->total[0] = 0; + ctx->total[1] = 0; + + ctx->state[0] = 0x67452301; + ctx->state[1] = 0xEFCDAB89; + ctx->state[2] = 0x98BADCFE; + ctx->state[3] = 0x10325476; + ctx->state[4] = 0xC3D2E1F0; + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_ripemd160_starts(mbedtls_ripemd160_context *ctx) +{ + mbedtls_ripemd160_starts_ret(ctx); +} +#endif + +#if !defined(MBEDTLS_RIPEMD160_PROCESS_ALT) +/* + * Process one block + */ +int mbedtls_internal_ripemd160_process(mbedtls_ripemd160_context *ctx, + const unsigned char data[64]) +{ + struct { + uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16]; + } local; + + local.X[0] = MBEDTLS_GET_UINT32_LE(data, 0); + local.X[1] = MBEDTLS_GET_UINT32_LE(data, 4); + local.X[2] = MBEDTLS_GET_UINT32_LE(data, 8); + local.X[3] = MBEDTLS_GET_UINT32_LE(data, 12); + local.X[4] = MBEDTLS_GET_UINT32_LE(data, 16); + local.X[5] = MBEDTLS_GET_UINT32_LE(data, 20); + local.X[6] = MBEDTLS_GET_UINT32_LE(data, 24); + local.X[7] = MBEDTLS_GET_UINT32_LE(data, 28); + local.X[8] = MBEDTLS_GET_UINT32_LE(data, 32); + local.X[9] = MBEDTLS_GET_UINT32_LE(data, 36); + local.X[10] = MBEDTLS_GET_UINT32_LE(data, 40); + local.X[11] = MBEDTLS_GET_UINT32_LE(data, 44); + local.X[12] = MBEDTLS_GET_UINT32_LE(data, 48); + local.X[13] = MBEDTLS_GET_UINT32_LE(data, 52); + local.X[14] = MBEDTLS_GET_UINT32_LE(data, 56); + local.X[15] = MBEDTLS_GET_UINT32_LE(data, 60); + + local.A = local.Ap = ctx->state[0]; + local.B = local.Bp = ctx->state[1]; + local.C = local.Cp = ctx->state[2]; + local.D = local.Dp = ctx->state[3]; + local.E = local.Ep = ctx->state[4]; + +#define F1(x, y, z) ((x) ^ (y) ^ (z)) +#define F2(x, y, z) (((x) & (y)) | (~(x) & (z))) +#define F3(x, y, z) (((x) | ~(y)) ^ (z)) +#define F4(x, y, z) (((x) & (z)) | ((y) & ~(z))) +#define F5(x, y, z) ((x) ^ ((y) | ~(z))) + +#define S(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) + +#define P(a, b, c, d, e, r, s, f, k) \ + do \ + { \ + (a) += f((b), (c), (d)) + local.X[r] + (k); \ + (a) = S((a), (s)) + (e); \ + (c) = S((c), 10); \ + } while (0) + +#define P2(a, b, c, d, e, r, s, rp, sp) \ + do \ + { \ + P((a), (b), (c), (d), (e), (r), (s), F, K); \ + P(a ## p, b ## p, c ## p, d ## p, e ## p, \ + (rp), (sp), Fp, Kp); \ + } while (0) + +#define F F1 +#define K 0x00000000 +#define Fp F5 +#define Kp 0x50A28BE6 + P2(local.A, local.B, local.C, local.D, local.E, 0, 11, 5, 8); + P2(local.E, local.A, local.B, local.C, local.D, 1, 14, 14, 9); + P2(local.D, local.E, local.A, local.B, local.C, 2, 15, 7, 9); + P2(local.C, local.D, local.E, local.A, local.B, 3, 12, 0, 11); + P2(local.B, local.C, local.D, local.E, local.A, 4, 5, 9, 13); + P2(local.A, local.B, local.C, local.D, local.E, 5, 8, 2, 15); + P2(local.E, local.A, local.B, local.C, local.D, 6, 7, 11, 15); + P2(local.D, local.E, local.A, local.B, local.C, 7, 9, 4, 5); + P2(local.C, local.D, local.E, local.A, local.B, 8, 11, 13, 7); + P2(local.B, local.C, local.D, local.E, local.A, 9, 13, 6, 7); + P2(local.A, local.B, local.C, local.D, local.E, 10, 14, 15, 8); + P2(local.E, local.A, local.B, local.C, local.D, 11, 15, 8, 11); + P2(local.D, local.E, local.A, local.B, local.C, 12, 6, 1, 14); + P2(local.C, local.D, local.E, local.A, local.B, 13, 7, 10, 14); + P2(local.B, local.C, local.D, local.E, local.A, 14, 9, 3, 12); + P2(local.A, local.B, local.C, local.D, local.E, 15, 8, 12, 6); +#undef F +#undef K +#undef Fp +#undef Kp + +#define F F2 +#define K 0x5A827999 +#define Fp F4 +#define Kp 0x5C4DD124 + P2(local.E, local.A, local.B, local.C, local.D, 7, 7, 6, 9); + P2(local.D, local.E, local.A, local.B, local.C, 4, 6, 11, 13); + P2(local.C, local.D, local.E, local.A, local.B, 13, 8, 3, 15); + P2(local.B, local.C, local.D, local.E, local.A, 1, 13, 7, 7); + P2(local.A, local.B, local.C, local.D, local.E, 10, 11, 0, 12); + P2(local.E, local.A, local.B, local.C, local.D, 6, 9, 13, 8); + P2(local.D, local.E, local.A, local.B, local.C, 15, 7, 5, 9); + P2(local.C, local.D, local.E, local.A, local.B, 3, 15, 10, 11); + P2(local.B, local.C, local.D, local.E, local.A, 12, 7, 14, 7); + P2(local.A, local.B, local.C, local.D, local.E, 0, 12, 15, 7); + P2(local.E, local.A, local.B, local.C, local.D, 9, 15, 8, 12); + P2(local.D, local.E, local.A, local.B, local.C, 5, 9, 12, 7); + P2(local.C, local.D, local.E, local.A, local.B, 2, 11, 4, 6); + P2(local.B, local.C, local.D, local.E, local.A, 14, 7, 9, 15); + P2(local.A, local.B, local.C, local.D, local.E, 11, 13, 1, 13); + P2(local.E, local.A, local.B, local.C, local.D, 8, 12, 2, 11); +#undef F +#undef K +#undef Fp +#undef Kp + +#define F F3 +#define K 0x6ED9EBA1 +#define Fp F3 +#define Kp 0x6D703EF3 + P2(local.D, local.E, local.A, local.B, local.C, 3, 11, 15, 9); + P2(local.C, local.D, local.E, local.A, local.B, 10, 13, 5, 7); + P2(local.B, local.C, local.D, local.E, local.A, 14, 6, 1, 15); + P2(local.A, local.B, local.C, local.D, local.E, 4, 7, 3, 11); + P2(local.E, local.A, local.B, local.C, local.D, 9, 14, 7, 8); + P2(local.D, local.E, local.A, local.B, local.C, 15, 9, 14, 6); + P2(local.C, local.D, local.E, local.A, local.B, 8, 13, 6, 6); + P2(local.B, local.C, local.D, local.E, local.A, 1, 15, 9, 14); + P2(local.A, local.B, local.C, local.D, local.E, 2, 14, 11, 12); + P2(local.E, local.A, local.B, local.C, local.D, 7, 8, 8, 13); + P2(local.D, local.E, local.A, local.B, local.C, 0, 13, 12, 5); + P2(local.C, local.D, local.E, local.A, local.B, 6, 6, 2, 14); + P2(local.B, local.C, local.D, local.E, local.A, 13, 5, 10, 13); + P2(local.A, local.B, local.C, local.D, local.E, 11, 12, 0, 13); + P2(local.E, local.A, local.B, local.C, local.D, 5, 7, 4, 7); + P2(local.D, local.E, local.A, local.B, local.C, 12, 5, 13, 5); +#undef F +#undef K +#undef Fp +#undef Kp + +#define F F4 +#define K 0x8F1BBCDC +#define Fp F2 +#define Kp 0x7A6D76E9 + P2(local.C, local.D, local.E, local.A, local.B, 1, 11, 8, 15); + P2(local.B, local.C, local.D, local.E, local.A, 9, 12, 6, 5); + P2(local.A, local.B, local.C, local.D, local.E, 11, 14, 4, 8); + P2(local.E, local.A, local.B, local.C, local.D, 10, 15, 1, 11); + P2(local.D, local.E, local.A, local.B, local.C, 0, 14, 3, 14); + P2(local.C, local.D, local.E, local.A, local.B, 8, 15, 11, 14); + P2(local.B, local.C, local.D, local.E, local.A, 12, 9, 15, 6); + P2(local.A, local.B, local.C, local.D, local.E, 4, 8, 0, 14); + P2(local.E, local.A, local.B, local.C, local.D, 13, 9, 5, 6); + P2(local.D, local.E, local.A, local.B, local.C, 3, 14, 12, 9); + P2(local.C, local.D, local.E, local.A, local.B, 7, 5, 2, 12); + P2(local.B, local.C, local.D, local.E, local.A, 15, 6, 13, 9); + P2(local.A, local.B, local.C, local.D, local.E, 14, 8, 9, 12); + P2(local.E, local.A, local.B, local.C, local.D, 5, 6, 7, 5); + P2(local.D, local.E, local.A, local.B, local.C, 6, 5, 10, 15); + P2(local.C, local.D, local.E, local.A, local.B, 2, 12, 14, 8); +#undef F +#undef K +#undef Fp +#undef Kp + +#define F F5 +#define K 0xA953FD4E +#define Fp F1 +#define Kp 0x00000000 + P2(local.B, local.C, local.D, local.E, local.A, 4, 9, 12, 8); + P2(local.A, local.B, local.C, local.D, local.E, 0, 15, 15, 5); + P2(local.E, local.A, local.B, local.C, local.D, 5, 5, 10, 12); + P2(local.D, local.E, local.A, local.B, local.C, 9, 11, 4, 9); + P2(local.C, local.D, local.E, local.A, local.B, 7, 6, 1, 12); + P2(local.B, local.C, local.D, local.E, local.A, 12, 8, 5, 5); + P2(local.A, local.B, local.C, local.D, local.E, 2, 13, 8, 14); + P2(local.E, local.A, local.B, local.C, local.D, 10, 12, 7, 6); + P2(local.D, local.E, local.A, local.B, local.C, 14, 5, 6, 8); + P2(local.C, local.D, local.E, local.A, local.B, 1, 12, 2, 13); + P2(local.B, local.C, local.D, local.E, local.A, 3, 13, 13, 6); + P2(local.A, local.B, local.C, local.D, local.E, 8, 14, 14, 5); + P2(local.E, local.A, local.B, local.C, local.D, 11, 11, 0, 15); + P2(local.D, local.E, local.A, local.B, local.C, 6, 8, 3, 13); + P2(local.C, local.D, local.E, local.A, local.B, 15, 5, 9, 11); + P2(local.B, local.C, local.D, local.E, local.A, 13, 6, 11, 11); +#undef F +#undef K +#undef Fp +#undef Kp + + local.C = ctx->state[1] + local.C + local.Dp; + ctx->state[1] = ctx->state[2] + local.D + local.Ep; + ctx->state[2] = ctx->state[3] + local.E + local.Ap; + ctx->state[3] = ctx->state[4] + local.A + local.Bp; + ctx->state[4] = ctx->state[0] + local.B + local.Cp; + ctx->state[0] = local.C; + + /* Zeroise variables to clear sensitive data from memory. */ + mbedtls_platform_zeroize(&local, sizeof(local)); + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_ripemd160_process(mbedtls_ripemd160_context *ctx, + const unsigned char data[64]) +{ + mbedtls_internal_ripemd160_process(ctx, data); +} +#endif +#endif /* !MBEDTLS_RIPEMD160_PROCESS_ALT */ + +/* + * RIPEMD-160 process buffer + */ +int mbedtls_ripemd160_update_ret(mbedtls_ripemd160_context *ctx, + const unsigned char *input, + size_t ilen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t fill; + uint32_t left; + + if (ilen == 0) { + return 0; + } + + left = ctx->total[0] & 0x3F; + fill = 64 - left; + + ctx->total[0] += (uint32_t) ilen; + ctx->total[0] &= 0xFFFFFFFF; + + if (ctx->total[0] < (uint32_t) ilen) { + ctx->total[1]++; + } + + if (left && ilen >= fill) { + memcpy((void *) (ctx->buffer + left), input, fill); + + if ((ret = mbedtls_internal_ripemd160_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + input += fill; + ilen -= fill; + left = 0; + } + + while (ilen >= 64) { + if ((ret = mbedtls_internal_ripemd160_process(ctx, input)) != 0) { + return ret; + } + + input += 64; + ilen -= 64; + } + + if (ilen > 0) { + memcpy((void *) (ctx->buffer + left), input, ilen); + } + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_ripemd160_update(mbedtls_ripemd160_context *ctx, + const unsigned char *input, + size_t ilen) +{ + mbedtls_ripemd160_update_ret(ctx, input, ilen); +} +#endif + +static const unsigned char ripemd160_padding[64] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* + * RIPEMD-160 final digest + */ +int mbedtls_ripemd160_finish_ret(mbedtls_ripemd160_context *ctx, + unsigned char output[20]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + uint32_t last, padn; + uint32_t high, low; + unsigned char msglen[8]; + + high = (ctx->total[0] >> 29) + | (ctx->total[1] << 3); + low = (ctx->total[0] << 3); + + MBEDTLS_PUT_UINT32_LE(low, msglen, 0); + MBEDTLS_PUT_UINT32_LE(high, msglen, 4); + + last = ctx->total[0] & 0x3F; + padn = (last < 56) ? (56 - last) : (120 - last); + + ret = mbedtls_ripemd160_update_ret(ctx, ripemd160_padding, padn); + if (ret != 0) { + return ret; + } + + ret = mbedtls_ripemd160_update_ret(ctx, msglen, 8); + if (ret != 0) { + return ret; + } + + MBEDTLS_PUT_UINT32_LE(ctx->state[0], output, 0); + MBEDTLS_PUT_UINT32_LE(ctx->state[1], output, 4); + MBEDTLS_PUT_UINT32_LE(ctx->state[2], output, 8); + MBEDTLS_PUT_UINT32_LE(ctx->state[3], output, 12); + MBEDTLS_PUT_UINT32_LE(ctx->state[4], output, 16); + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_ripemd160_finish(mbedtls_ripemd160_context *ctx, + unsigned char output[20]) +{ + mbedtls_ripemd160_finish_ret(ctx, output); +} +#endif + +#endif /* ! MBEDTLS_RIPEMD160_ALT */ + +/* + * output = RIPEMD-160( input buffer ) + */ +int mbedtls_ripemd160_ret(const unsigned char *input, + size_t ilen, + unsigned char output[20]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ripemd160_context ctx; + + mbedtls_ripemd160_init(&ctx); + + if ((ret = mbedtls_ripemd160_starts_ret(&ctx)) != 0) { + goto exit; + } + + if ((ret = mbedtls_ripemd160_update_ret(&ctx, input, ilen)) != 0) { + goto exit; + } + + if ((ret = mbedtls_ripemd160_finish_ret(&ctx, output)) != 0) { + goto exit; + } + +exit: + mbedtls_ripemd160_free(&ctx); + + return ret; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_ripemd160(const unsigned char *input, + size_t ilen, + unsigned char output[20]) +{ + mbedtls_ripemd160_ret(input, ilen, output); +} +#endif + +#if defined(MBEDTLS_SELF_TEST) +/* + * Test vectors from the RIPEMD-160 paper and + * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html#HMAC + */ +#define TESTS 8 +static const unsigned char ripemd160_test_str[TESTS][81] = +{ + { "" }, + { "a" }, + { "abc" }, + { "message digest" }, + { "abcdefghijklmnopqrstuvwxyz" }, + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, + { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, + { "12345678901234567890123456789012345678901234567890123456789012345678901234567890" }, +}; + +static const size_t ripemd160_test_strlen[TESTS] = +{ + 0, 1, 3, 14, 26, 56, 62, 80 +}; + +static const unsigned char ripemd160_test_md[TESTS][20] = +{ + { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28, + 0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 }, + { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae, + 0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe }, + { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04, + 0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc }, + { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8, + 0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 }, + { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb, + 0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc }, + { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05, + 0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b }, + { 0xb0, 0xe2, 0x0b, 0x6e, 0x31, 0x16, 0x64, 0x02, 0x86, 0xed, + 0x3a, 0x87, 0xa5, 0x71, 0x30, 0x79, 0xb2, 0x1f, 0x51, 0x89 }, + { 0x9b, 0x75, 0x2e, 0x45, 0x57, 0x3d, 0x4b, 0x39, 0xf4, 0xdb, + 0xd3, 0x32, 0x3c, 0xab, 0x82, 0xbf, 0x63, 0x32, 0x6b, 0xfb }, +}; + +/* + * Checkup routine + */ +int mbedtls_ripemd160_self_test(int verbose) +{ + int i, ret = 0; + unsigned char output[20]; + + memset(output, 0, sizeof(output)); + + for (i = 0; i < TESTS; i++) { + if (verbose != 0) { + mbedtls_printf(" RIPEMD-160 test #%d: ", i + 1); + } + + ret = mbedtls_ripemd160_ret(ripemd160_test_str[i], + ripemd160_test_strlen[i], output); + if (ret != 0) { + goto fail; + } + + if (memcmp(output, ripemd160_test_md[i], 20) != 0) { + ret = 1; + goto fail; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return 0; + +fail: + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_RIPEMD160_C */ diff --git a/ext/opcua_client/mbedtls/library/rsa.c b/ext/opcua_client/mbedtls/library/rsa.c new file mode 100644 index 0000000..0a0c2e3 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/rsa.c @@ -0,0 +1,2657 @@ +/* + * The RSA public-key cryptosystem + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * The following sources were referenced in the design of this implementation + * of the RSA algorithm: + * + * [1] A method for obtaining digital signatures and public-key cryptosystems + * R Rivest, A Shamir, and L Adleman + * http://people.csail.mit.edu/rivest/pubs.html#RSA78 + * + * [2] Handbook of Applied Cryptography - 1997, Chapter 8 + * Menezes, van Oorschot and Vanstone + * + * [3] Malware Guard Extension: Using SGX to Conceal Cache Attacks + * Michael Schwarz, Samuel Weiser, Daniel Gruss, Clémentine Maurice and + * Stefan Mangard + * https://arxiv.org/abs/1702.08719v2 + * + */ + +#include "common.h" + +#if defined(MBEDTLS_RSA_C) + +#include "mbedtls/rsa.h" +#include "mbedtls/rsa_internal.h" +#include "mbedtls/oid.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" +#include "constant_time_internal.h" +#include "mbedtls/constant_time.h" +#include "bignum_internal.h" + +#include + +#if defined(MBEDTLS_PKCS1_V21) +#include "mbedtls/md.h" +#endif + +#if defined(MBEDTLS_PKCS1_V15) && !defined(__OpenBSD__) && !defined(__NetBSD__) +#include +#endif + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_RSA_ALT) + +/* Parameter validation macros */ +#define RSA_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_RSA_BAD_INPUT_DATA) +#define RSA_VALIDATE(cond) \ + MBEDTLS_INTERNAL_VALIDATE(cond) + +int mbedtls_rsa_import(mbedtls_rsa_context *ctx, + const mbedtls_mpi *N, + const mbedtls_mpi *P, const mbedtls_mpi *Q, + const mbedtls_mpi *D, const mbedtls_mpi *E) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + RSA_VALIDATE_RET(ctx != NULL); + + if ((N != NULL && (ret = mbedtls_mpi_copy(&ctx->N, N)) != 0) || + (P != NULL && (ret = mbedtls_mpi_copy(&ctx->P, P)) != 0) || + (Q != NULL && (ret = mbedtls_mpi_copy(&ctx->Q, Q)) != 0) || + (D != NULL && (ret = mbedtls_mpi_copy(&ctx->D, D)) != 0) || + (E != NULL && (ret = mbedtls_mpi_copy(&ctx->E, E)) != 0)) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_BAD_INPUT_DATA, ret); + } + + if (N != NULL) { + ctx->len = mbedtls_mpi_size(&ctx->N); + } + + return 0; +} + +int mbedtls_rsa_import_raw(mbedtls_rsa_context *ctx, + unsigned char const *N, size_t N_len, + unsigned char const *P, size_t P_len, + unsigned char const *Q, size_t Q_len, + unsigned char const *D, size_t D_len, + unsigned char const *E, size_t E_len) +{ + int ret = 0; + RSA_VALIDATE_RET(ctx != NULL); + + if (N != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&ctx->N, N, N_len)); + ctx->len = mbedtls_mpi_size(&ctx->N); + } + + if (P != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&ctx->P, P, P_len)); + } + + if (Q != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&ctx->Q, Q, Q_len)); + } + + if (D != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&ctx->D, D, D_len)); + } + + if (E != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&ctx->E, E, E_len)); + } + +cleanup: + + if (ret != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_BAD_INPUT_DATA, ret); + } + + return 0; +} + +/* + * Checks whether the context fields are set in such a way + * that the RSA primitives will be able to execute without error. + * It does *not* make guarantees for consistency of the parameters. + */ +static int rsa_check_context(mbedtls_rsa_context const *ctx, int is_priv, + int blinding_needed) +{ +#if !defined(MBEDTLS_RSA_NO_CRT) + /* blinding_needed is only used for NO_CRT to decide whether + * P,Q need to be present or not. */ + ((void) blinding_needed); +#endif + + if (ctx->len != mbedtls_mpi_size(&ctx->N) || + ctx->len > MBEDTLS_MPI_MAX_SIZE) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + /* + * 1. Modular exponentiation needs positive, odd moduli. + */ + + /* Modular exponentiation wrt. N is always used for + * RSA public key operations. */ + if (mbedtls_mpi_cmp_int(&ctx->N, 0) <= 0 || + mbedtls_mpi_get_bit(&ctx->N, 0) == 0) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + +#if !defined(MBEDTLS_RSA_NO_CRT) + /* Modular exponentiation for P and Q is only + * used for private key operations and if CRT + * is used. */ + if (is_priv && + (mbedtls_mpi_cmp_int(&ctx->P, 0) <= 0 || + mbedtls_mpi_get_bit(&ctx->P, 0) == 0 || + mbedtls_mpi_cmp_int(&ctx->Q, 0) <= 0 || + mbedtls_mpi_get_bit(&ctx->Q, 0) == 0)) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } +#endif /* !MBEDTLS_RSA_NO_CRT */ + + /* + * 2. Exponents must be positive + */ + + /* Always need E for public key operations */ + if (mbedtls_mpi_cmp_int(&ctx->E, 0) <= 0) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_RSA_NO_CRT) + /* For private key operations, use D or DP & DQ + * as (unblinded) exponents. */ + if (is_priv && mbedtls_mpi_cmp_int(&ctx->D, 0) <= 0) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } +#else + if (is_priv && + (mbedtls_mpi_cmp_int(&ctx->DP, 0) <= 0 || + mbedtls_mpi_cmp_int(&ctx->DQ, 0) <= 0)) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } +#endif /* MBEDTLS_RSA_NO_CRT */ + + /* Blinding shouldn't make exponents negative either, + * so check that P, Q >= 1 if that hasn't yet been + * done as part of 1. */ +#if defined(MBEDTLS_RSA_NO_CRT) + if (is_priv && blinding_needed && + (mbedtls_mpi_cmp_int(&ctx->P, 0) <= 0 || + mbedtls_mpi_cmp_int(&ctx->Q, 0) <= 0)) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } +#endif + + /* It wouldn't lead to an error if it wasn't satisfied, + * but check for QP >= 1 nonetheless. */ +#if !defined(MBEDTLS_RSA_NO_CRT) + if (is_priv && + mbedtls_mpi_cmp_int(&ctx->QP, 0) <= 0) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } +#endif + + return 0; +} + +int mbedtls_rsa_complete(mbedtls_rsa_context *ctx) +{ + int ret = 0; + int have_N, have_P, have_Q, have_D, have_E; +#if !defined(MBEDTLS_RSA_NO_CRT) + int have_DP, have_DQ, have_QP; +#endif + int n_missing, pq_missing, d_missing, is_pub, is_priv; + + RSA_VALIDATE_RET(ctx != NULL); + + have_N = (mbedtls_mpi_cmp_int(&ctx->N, 0) != 0); + have_P = (mbedtls_mpi_cmp_int(&ctx->P, 0) != 0); + have_Q = (mbedtls_mpi_cmp_int(&ctx->Q, 0) != 0); + have_D = (mbedtls_mpi_cmp_int(&ctx->D, 0) != 0); + have_E = (mbedtls_mpi_cmp_int(&ctx->E, 0) != 0); + +#if !defined(MBEDTLS_RSA_NO_CRT) + have_DP = (mbedtls_mpi_cmp_int(&ctx->DP, 0) != 0); + have_DQ = (mbedtls_mpi_cmp_int(&ctx->DQ, 0) != 0); + have_QP = (mbedtls_mpi_cmp_int(&ctx->QP, 0) != 0); +#endif + + /* + * Check whether provided parameters are enough + * to deduce all others. The following incomplete + * parameter sets for private keys are supported: + * + * (1) P, Q missing. + * (2) D and potentially N missing. + * + */ + + n_missing = have_P && have_Q && have_D && have_E; + pq_missing = have_N && !have_P && !have_Q && have_D && have_E; + d_missing = have_P && have_Q && !have_D && have_E; + is_pub = have_N && !have_P && !have_Q && !have_D && have_E; + + /* These three alternatives are mutually exclusive */ + is_priv = n_missing || pq_missing || d_missing; + + if (!is_priv && !is_pub) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + /* + * Step 1: Deduce N if P, Q are provided. + */ + + if (!have_N && have_P && have_Q) { + if ((ret = mbedtls_mpi_mul_mpi(&ctx->N, &ctx->P, + &ctx->Q)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_BAD_INPUT_DATA, ret); + } + + ctx->len = mbedtls_mpi_size(&ctx->N); + } + + /* + * Step 2: Deduce and verify all remaining core parameters. + */ + + if (pq_missing) { + ret = mbedtls_rsa_deduce_primes(&ctx->N, &ctx->E, &ctx->D, + &ctx->P, &ctx->Q); + if (ret != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_BAD_INPUT_DATA, ret); + } + + } else if (d_missing) { + if ((ret = mbedtls_rsa_deduce_private_exponent(&ctx->P, + &ctx->Q, + &ctx->E, + &ctx->D)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_BAD_INPUT_DATA, ret); + } + } + + /* + * Step 3: Deduce all additional parameters specific + * to our current RSA implementation. + */ + +#if !defined(MBEDTLS_RSA_NO_CRT) + if (is_priv && !(have_DP && have_DQ && have_QP)) { + ret = mbedtls_rsa_deduce_crt(&ctx->P, &ctx->Q, &ctx->D, + &ctx->DP, &ctx->DQ, &ctx->QP); + if (ret != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_BAD_INPUT_DATA, ret); + } + } +#endif /* MBEDTLS_RSA_NO_CRT */ + + /* + * Step 3: Basic sanity checks + */ + + return rsa_check_context(ctx, is_priv, 1); +} + +int mbedtls_rsa_export_raw(const mbedtls_rsa_context *ctx, + unsigned char *N, size_t N_len, + unsigned char *P, size_t P_len, + unsigned char *Q, size_t Q_len, + unsigned char *D, size_t D_len, + unsigned char *E, size_t E_len) +{ + int ret = 0; + int is_priv; + RSA_VALIDATE_RET(ctx != NULL); + + /* Check if key is private or public */ + is_priv = + mbedtls_mpi_cmp_int(&ctx->N, 0) != 0 && + mbedtls_mpi_cmp_int(&ctx->P, 0) != 0 && + mbedtls_mpi_cmp_int(&ctx->Q, 0) != 0 && + mbedtls_mpi_cmp_int(&ctx->D, 0) != 0 && + mbedtls_mpi_cmp_int(&ctx->E, 0) != 0; + + if (!is_priv) { + /* If we're trying to export private parameters for a public key, + * something must be wrong. */ + if (P != NULL || Q != NULL || D != NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + } + + if (N != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&ctx->N, N, N_len)); + } + + if (P != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&ctx->P, P, P_len)); + } + + if (Q != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&ctx->Q, Q, Q_len)); + } + + if (D != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&ctx->D, D, D_len)); + } + + if (E != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&ctx->E, E, E_len)); + } + +cleanup: + + return ret; +} + +int mbedtls_rsa_export(const mbedtls_rsa_context *ctx, + mbedtls_mpi *N, mbedtls_mpi *P, mbedtls_mpi *Q, + mbedtls_mpi *D, mbedtls_mpi *E) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + int is_priv; + RSA_VALIDATE_RET(ctx != NULL); + + /* Check if key is private or public */ + is_priv = + mbedtls_mpi_cmp_int(&ctx->N, 0) != 0 && + mbedtls_mpi_cmp_int(&ctx->P, 0) != 0 && + mbedtls_mpi_cmp_int(&ctx->Q, 0) != 0 && + mbedtls_mpi_cmp_int(&ctx->D, 0) != 0 && + mbedtls_mpi_cmp_int(&ctx->E, 0) != 0; + + if (!is_priv) { + /* If we're trying to export private parameters for a public key, + * something must be wrong. */ + if (P != NULL || Q != NULL || D != NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + } + + /* Export all requested core parameters. */ + + if ((N != NULL && (ret = mbedtls_mpi_copy(N, &ctx->N)) != 0) || + (P != NULL && (ret = mbedtls_mpi_copy(P, &ctx->P)) != 0) || + (Q != NULL && (ret = mbedtls_mpi_copy(Q, &ctx->Q)) != 0) || + (D != NULL && (ret = mbedtls_mpi_copy(D, &ctx->D)) != 0) || + (E != NULL && (ret = mbedtls_mpi_copy(E, &ctx->E)) != 0)) { + return ret; + } + + return 0; +} + +/* + * Export CRT parameters + * This must also be implemented if CRT is not used, for being able to + * write DER encoded RSA keys. The helper function mbedtls_rsa_deduce_crt + * can be used in this case. + */ +int mbedtls_rsa_export_crt(const mbedtls_rsa_context *ctx, + mbedtls_mpi *DP, mbedtls_mpi *DQ, mbedtls_mpi *QP) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + int is_priv; + RSA_VALIDATE_RET(ctx != NULL); + + /* Check if key is private or public */ + is_priv = + mbedtls_mpi_cmp_int(&ctx->N, 0) != 0 && + mbedtls_mpi_cmp_int(&ctx->P, 0) != 0 && + mbedtls_mpi_cmp_int(&ctx->Q, 0) != 0 && + mbedtls_mpi_cmp_int(&ctx->D, 0) != 0 && + mbedtls_mpi_cmp_int(&ctx->E, 0) != 0; + + if (!is_priv) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + +#if !defined(MBEDTLS_RSA_NO_CRT) + /* Export all requested blinding parameters. */ + if ((DP != NULL && (ret = mbedtls_mpi_copy(DP, &ctx->DP)) != 0) || + (DQ != NULL && (ret = mbedtls_mpi_copy(DQ, &ctx->DQ)) != 0) || + (QP != NULL && (ret = mbedtls_mpi_copy(QP, &ctx->QP)) != 0)) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_BAD_INPUT_DATA, ret); + } +#else + if ((ret = mbedtls_rsa_deduce_crt(&ctx->P, &ctx->Q, &ctx->D, + DP, DQ, QP)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_BAD_INPUT_DATA, ret); + } +#endif + + return 0; +} + +/* + * Initialize an RSA context + */ +void mbedtls_rsa_init(mbedtls_rsa_context *ctx, + int padding, + int hash_id) +{ + RSA_VALIDATE(ctx != NULL); + RSA_VALIDATE(padding == MBEDTLS_RSA_PKCS_V15 || + padding == MBEDTLS_RSA_PKCS_V21); + + memset(ctx, 0, sizeof(mbedtls_rsa_context)); + + mbedtls_rsa_set_padding(ctx, padding, hash_id); + +#if defined(MBEDTLS_THREADING_C) + /* Set ctx->ver to nonzero to indicate that the mutex has been + * initialized and will need to be freed. */ + ctx->ver = 1; + mbedtls_mutex_init(&ctx->mutex); +#endif +} + +/* + * Set padding for an existing RSA context + */ +void mbedtls_rsa_set_padding(mbedtls_rsa_context *ctx, int padding, + int hash_id) +{ + RSA_VALIDATE(ctx != NULL); + RSA_VALIDATE(padding == MBEDTLS_RSA_PKCS_V15 || + padding == MBEDTLS_RSA_PKCS_V21); + + ctx->padding = padding; + ctx->hash_id = hash_id; +} + +/* + * Get length in bytes of RSA modulus + */ + +size_t mbedtls_rsa_get_len(const mbedtls_rsa_context *ctx) +{ + return ctx->len; +} + + +#if defined(MBEDTLS_GENPRIME) + +/* + * Generate an RSA keypair + * + * This generation method follows the RSA key pair generation procedure of + * FIPS 186-4 if 2^16 < exponent < 2^256 and nbits = 2048 or nbits = 3072. + */ +int mbedtls_rsa_gen_key(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + unsigned int nbits, int exponent) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_mpi H, G, L; + int prime_quality = 0; + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(f_rng != NULL); + + /* + * If the modulus is 1024 bit long or shorter, then the security strength of + * the RSA algorithm is less than or equal to 80 bits and therefore an error + * rate of 2^-80 is sufficient. + */ + if (nbits > 1024) { + prime_quality = MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR; + } + + mbedtls_mpi_init(&H); + mbedtls_mpi_init(&G); + mbedtls_mpi_init(&L); + + if (nbits < 128 || exponent < 3 || nbits % 2 != 0) { + ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + goto cleanup; + } + + /* + * find primes P and Q with Q < P so that: + * 1. |P-Q| > 2^( nbits / 2 - 100 ) + * 2. GCD( E, (P-1)*(Q-1) ) == 1 + * 3. E^-1 mod LCM(P-1, Q-1) > 2^( nbits / 2 ) + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&ctx->E, exponent)); + + do { + MBEDTLS_MPI_CHK(mbedtls_mpi_gen_prime(&ctx->P, nbits >> 1, + prime_quality, f_rng, p_rng)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_gen_prime(&ctx->Q, nbits >> 1, + prime_quality, f_rng, p_rng)); + + /* make sure the difference between p and q is not too small (FIPS 186-4 §B.3.3 step 5.4) */ + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&H, &ctx->P, &ctx->Q)); + if (mbedtls_mpi_bitlen(&H) <= ((nbits >= 200) ? ((nbits >> 1) - 99) : 0)) { + continue; + } + + /* not required by any standards, but some users rely on the fact that P > Q */ + if (H.s < 0) { + mbedtls_mpi_swap(&ctx->P, &ctx->Q); + } + + /* Temporarily replace P,Q by P-1, Q-1 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&ctx->P, &ctx->P, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&ctx->Q, &ctx->Q, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&H, &ctx->P, &ctx->Q)); + + /* check GCD( E, (P-1)*(Q-1) ) == 1 (FIPS 186-4 §B.3.1 criterion 2(a)) */ + MBEDTLS_MPI_CHK(mbedtls_mpi_gcd(&G, &ctx->E, &H)); + if (mbedtls_mpi_cmp_int(&G, 1) != 0) { + continue; + } + + /* compute smallest possible D = E^-1 mod LCM(P-1, Q-1) (FIPS 186-4 §B.3.1 criterion 3(b)) */ + MBEDTLS_MPI_CHK(mbedtls_mpi_gcd(&G, &ctx->P, &ctx->Q)); + MBEDTLS_MPI_CHK(mbedtls_mpi_div_mpi(&L, NULL, &H, &G)); + MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(&ctx->D, &ctx->E, &L)); + + if (mbedtls_mpi_bitlen(&ctx->D) <= ((nbits + 1) / 2)) { // (FIPS 186-4 §B.3.1 criterion 3(a)) + continue; + } + + break; + } while (1); + + /* Restore P,Q */ + MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(&ctx->P, &ctx->P, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(&ctx->Q, &ctx->Q, 1)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&ctx->N, &ctx->P, &ctx->Q)); + + ctx->len = mbedtls_mpi_size(&ctx->N); + +#if !defined(MBEDTLS_RSA_NO_CRT) + /* + * DP = D mod (P - 1) + * DQ = D mod (Q - 1) + * QP = Q^-1 mod P + */ + MBEDTLS_MPI_CHK(mbedtls_rsa_deduce_crt(&ctx->P, &ctx->Q, &ctx->D, + &ctx->DP, &ctx->DQ, &ctx->QP)); +#endif /* MBEDTLS_RSA_NO_CRT */ + + /* Double-check */ + MBEDTLS_MPI_CHK(mbedtls_rsa_check_privkey(ctx)); + +cleanup: + + mbedtls_mpi_free(&H); + mbedtls_mpi_free(&G); + mbedtls_mpi_free(&L); + + if (ret != 0) { + mbedtls_rsa_free(ctx); + + if ((-ret & ~0x7f) == 0) { + ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_KEY_GEN_FAILED, ret); + } + return ret; + } + + return 0; +} + +#endif /* MBEDTLS_GENPRIME */ + +/* + * Check a public RSA key + */ +int mbedtls_rsa_check_pubkey(const mbedtls_rsa_context *ctx) +{ + RSA_VALIDATE_RET(ctx != NULL); + + if (rsa_check_context(ctx, 0 /* public */, 0 /* no blinding */) != 0) { + return MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + } + + if (mbedtls_mpi_bitlen(&ctx->N) < 128) { + return MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + } + + if (mbedtls_mpi_get_bit(&ctx->E, 0) == 0 || + mbedtls_mpi_bitlen(&ctx->E) < 2 || + mbedtls_mpi_cmp_mpi(&ctx->E, &ctx->N) >= 0) { + return MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + } + + return 0; +} + +/* + * Check for the consistency of all fields in an RSA private key context + */ +int mbedtls_rsa_check_privkey(const mbedtls_rsa_context *ctx) +{ + RSA_VALIDATE_RET(ctx != NULL); + + if (mbedtls_rsa_check_pubkey(ctx) != 0 || + rsa_check_context(ctx, 1 /* private */, 1 /* blinding */) != 0) { + return MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + } + + if (mbedtls_rsa_validate_params(&ctx->N, &ctx->P, &ctx->Q, + &ctx->D, &ctx->E, NULL, NULL) != 0) { + return MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + } + +#if !defined(MBEDTLS_RSA_NO_CRT) + else if (mbedtls_rsa_validate_crt(&ctx->P, &ctx->Q, &ctx->D, + &ctx->DP, &ctx->DQ, &ctx->QP) != 0) { + return MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + } +#endif + + return 0; +} + +/* + * Check if contexts holding a public and private key match + */ +int mbedtls_rsa_check_pub_priv(const mbedtls_rsa_context *pub, + const mbedtls_rsa_context *prv) +{ + RSA_VALIDATE_RET(pub != NULL); + RSA_VALIDATE_RET(prv != NULL); + + if (mbedtls_rsa_check_pubkey(pub) != 0 || + mbedtls_rsa_check_privkey(prv) != 0) { + return MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + } + + if (mbedtls_mpi_cmp_mpi(&pub->N, &prv->N) != 0 || + mbedtls_mpi_cmp_mpi(&pub->E, &prv->E) != 0) { + return MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + } + + return 0; +} + +/* + * Do an RSA public key operation + */ +int mbedtls_rsa_public(mbedtls_rsa_context *ctx, + const unsigned char *input, + unsigned char *output) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t olen; + mbedtls_mpi T; + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(input != NULL); + RSA_VALIDATE_RET(output != NULL); + + if (rsa_check_context(ctx, 0 /* public */, 0 /* no blinding */)) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + mbedtls_mpi_init(&T); + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&ctx->mutex)) != 0) { + return ret; + } +#endif + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&T, input, ctx->len)); + + if (mbedtls_mpi_cmp_mpi(&T, &ctx->N) >= 0) { + ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + goto cleanup; + } + + olen = ctx->len; + MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&T, &T, &ctx->E, &ctx->N, &ctx->RN)); + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&T, output, olen)); + +cleanup: +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&ctx->mutex) != 0) { + return MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } +#endif + + mbedtls_mpi_free(&T); + + if (ret != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_PUBLIC_FAILED, ret); + } + + return 0; +} + +/* + * Generate or update blinding values, see section 10 of: + * KOCHER, Paul C. Timing attacks on implementations of Diffie-Hellman, RSA, + * DSS, and other systems. In : Advances in Cryptology-CRYPTO'96. Springer + * Berlin Heidelberg, 1996. p. 104-113. + */ +static int rsa_prepare_blinding(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) +{ + int ret, count = 0; + mbedtls_mpi R; + + mbedtls_mpi_init(&R); + + if (ctx->Vf.p != NULL) { + /* We already have blinding values, just update them by squaring */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&ctx->Vi, &ctx->Vi, &ctx->Vi)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&ctx->Vi, &ctx->Vi, &ctx->N)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&ctx->Vf, &ctx->Vf, &ctx->Vf)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&ctx->Vf, &ctx->Vf, &ctx->N)); + + goto cleanup; + } + + /* Unblinding value: Vf = random number, invertible mod N */ + do { + if (count++ > 10) { + ret = MBEDTLS_ERR_RSA_RNG_FAILED; + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_fill_random(&ctx->Vf, ctx->len - 1, f_rng, p_rng)); + + /* Compute Vf^-1 as R * (R Vf)^-1 to avoid leaks from inv_mod. */ + MBEDTLS_MPI_CHK(mbedtls_mpi_fill_random(&R, ctx->len - 1, f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&ctx->Vi, &ctx->Vf, &R)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&ctx->Vi, &ctx->Vi, &ctx->N)); + + /* At this point, Vi is invertible mod N if and only if both Vf and R + * are invertible mod N. If one of them isn't, we don't need to know + * which one, we just loop and choose new values for both of them. + * (Each iteration succeeds with overwhelming probability.) */ + ret = mbedtls_mpi_inv_mod(&ctx->Vi, &ctx->Vi, &ctx->N); + if (ret != 0 && ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE) { + goto cleanup; + } + + } while (ret == MBEDTLS_ERR_MPI_NOT_ACCEPTABLE); + + /* Finish the computation of Vf^-1 = R * (R Vf)^-1 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&ctx->Vi, &ctx->Vi, &R)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&ctx->Vi, &ctx->Vi, &ctx->N)); + + /* Blinding value: Vi = Vf^(-e) mod N + * (Vi already contains Vf^-1 at this point) */ + MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&ctx->Vi, &ctx->Vi, &ctx->E, &ctx->N, &ctx->RN)); + + +cleanup: + mbedtls_mpi_free(&R); + + return ret; +} + +/* + * Unblind + * T = T * Vf mod N + */ +static int rsa_unblind(mbedtls_mpi *T, mbedtls_mpi *Vf, const mbedtls_mpi *N) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const size_t nlimbs = N->n; + const size_t tlimbs = 2 * (nlimbs + 1); + + mbedtls_mpi_uint mm = mbedtls_mpi_montmul_init(N->p); + + mbedtls_mpi RR, M_T; + + mbedtls_mpi_init(&RR); + mbedtls_mpi_init(&M_T); + + MBEDTLS_MPI_CHK(mbedtls_mpi_get_mont_r2_unsafe(&RR, N)); + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(&M_T, tlimbs)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(T, nlimbs)); + MBEDTLS_MPI_CHK(mbedtls_mpi_grow(Vf, nlimbs)); + + /* T = T * Vf mod N + * Reminder: montmul(A, B, N) = A * B * R^-1 mod N + * Usually both operands are multiplied by R mod N beforehand, yielding a + * result that's also * R mod N (aka "in the Montgomery domain"). Here we + * only multiply one operand by R mod N, so the result is directly what we + * want - no need to call `mpi_montred()` on it. */ + mbedtls_mpi_montmul(T, &RR, N, mm, &M_T); + mbedtls_mpi_montmul(T, Vf, N, mm, &M_T); + +cleanup: + + mbedtls_mpi_free(&RR); + mbedtls_mpi_free(&M_T); + + return ret; +} + +/* + * Exponent blinding supposed to prevent side-channel attacks using multiple + * traces of measurements to recover the RSA key. The more collisions are there, + * the more bits of the key can be recovered. See [3]. + * + * Collecting n collisions with m bit long blinding value requires 2^(m-m/n) + * observations on average. + * + * For example with 28 byte blinding to achieve 2 collisions the adversary has + * to make 2^112 observations on average. + * + * (With the currently (as of 2017 April) known best algorithms breaking 2048 + * bit RSA requires approximately as much time as trying out 2^112 random keys. + * Thus in this sense with 28 byte blinding the security is not reduced by + * side-channel attacks like the one in [3]) + * + * This countermeasure does not help if the key recovery is possible with a + * single trace. + */ +#define RSA_EXPONENT_BLINDING 28 + +/* + * Do an RSA private key operation + */ +int mbedtls_rsa_private(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + const unsigned char *input, + unsigned char *output) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t olen; + + /* Temporary holding the result */ + mbedtls_mpi T; + + /* Temporaries holding P-1, Q-1 and the + * exponent blinding factor, respectively. */ + mbedtls_mpi P1, Q1, R; + +#if !defined(MBEDTLS_RSA_NO_CRT) + /* Temporaries holding the results mod p resp. mod q. */ + mbedtls_mpi TP, TQ; + + /* Temporaries holding the blinded exponents for + * the mod p resp. mod q computation (if used). */ + mbedtls_mpi DP_blind, DQ_blind; + + /* Pointers to actual exponents to be used - either the unblinded + * or the blinded ones, depending on the presence of a PRNG. */ + mbedtls_mpi *DP = &ctx->DP; + mbedtls_mpi *DQ = &ctx->DQ; +#else + /* Temporary holding the blinded exponent (if used). */ + mbedtls_mpi D_blind; + + /* Pointer to actual exponent to be used - either the unblinded + * or the blinded one, depending on the presence of a PRNG. */ + mbedtls_mpi *D = &ctx->D; +#endif /* MBEDTLS_RSA_NO_CRT */ + + /* Temporaries holding the initial input and the double + * checked result; should be the same in the end. */ + mbedtls_mpi input_blinded, check_result_blinded; + + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(input != NULL); + RSA_VALIDATE_RET(output != NULL); + + if (rsa_check_context(ctx, 1 /* private key checks */, + f_rng != NULL /* blinding y/n */) != 0) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&ctx->mutex)) != 0) { + return ret; + } +#endif + + /* MPI Initialization */ + mbedtls_mpi_init(&T); + + mbedtls_mpi_init(&P1); + mbedtls_mpi_init(&Q1); + mbedtls_mpi_init(&R); + + if (f_rng != NULL) { +#if defined(MBEDTLS_RSA_NO_CRT) + mbedtls_mpi_init(&D_blind); +#else + mbedtls_mpi_init(&DP_blind); + mbedtls_mpi_init(&DQ_blind); +#endif + } + +#if !defined(MBEDTLS_RSA_NO_CRT) + mbedtls_mpi_init(&TP); mbedtls_mpi_init(&TQ); +#endif + + mbedtls_mpi_init(&input_blinded); + mbedtls_mpi_init(&check_result_blinded); + + /* End of MPI initialization */ + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_binary(&T, input, ctx->len)); + if (mbedtls_mpi_cmp_mpi(&T, &ctx->N) >= 0) { + ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + goto cleanup; + } + + if (f_rng != NULL) { + /* + * Blinding + * T = T * Vi mod N + */ + MBEDTLS_MPI_CHK(rsa_prepare_blinding(ctx, f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&T, &T, &ctx->Vi)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&T, &T, &ctx->N)); + + /* + * Exponent blinding + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&P1, &ctx->P, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&Q1, &ctx->Q, 1)); + +#if defined(MBEDTLS_RSA_NO_CRT) + /* + * D_blind = ( P - 1 ) * ( Q - 1 ) * R + D + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_fill_random(&R, RSA_EXPONENT_BLINDING, + f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&D_blind, &P1, &Q1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&D_blind, &D_blind, &R)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&D_blind, &D_blind, &ctx->D)); + + D = &D_blind; +#else + /* + * DP_blind = ( P - 1 ) * R + DP + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_fill_random(&R, RSA_EXPONENT_BLINDING, + f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&DP_blind, &P1, &R)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&DP_blind, &DP_blind, + &ctx->DP)); + + DP = &DP_blind; + + /* + * DQ_blind = ( Q - 1 ) * R + DQ + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_fill_random(&R, RSA_EXPONENT_BLINDING, + f_rng, p_rng)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&DQ_blind, &Q1, &R)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&DQ_blind, &DQ_blind, + &ctx->DQ)); + + DQ = &DQ_blind; +#endif /* MBEDTLS_RSA_NO_CRT */ + } + + /* Make a copy of the input (after blinding if there was any) */ + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&input_blinded, &T)); + +#if defined(MBEDTLS_RSA_NO_CRT) + MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&T, &T, D, &ctx->N, &ctx->RN)); +#else + /* + * Faster decryption using the CRT + * + * TP = input ^ dP mod P + * TQ = input ^ dQ mod Q + */ + + MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&TP, &T, DP, &ctx->P, &ctx->RP)); + MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&TQ, &T, DQ, &ctx->Q, &ctx->RQ)); + + /* + * T = (TP - TQ) * (Q^-1 mod P) mod P + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&T, &TP, &TQ)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&TP, &T, &ctx->QP)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&T, &TP, &ctx->P)); + + /* + * T = TQ + T * Q + */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&TP, &T, &ctx->Q)); + MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&T, &TQ, &TP)); +#endif /* MBEDTLS_RSA_NO_CRT */ + + /* Verify the result to prevent glitching attacks. */ + MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&check_result_blinded, &T, &ctx->E, + &ctx->N, &ctx->RN)); + if (mbedtls_mpi_cmp_mpi(&check_result_blinded, &input_blinded) != 0) { + ret = MBEDTLS_ERR_RSA_VERIFY_FAILED; + goto cleanup; + } + + if (f_rng != NULL) { + /* + * Unblind + * T = T * Vf mod N + */ + MBEDTLS_MPI_CHK(rsa_unblind(&T, &ctx->Vf, &ctx->N)); + } + + olen = ctx->len; + MBEDTLS_MPI_CHK(mbedtls_mpi_write_binary(&T, output, olen)); + +cleanup: +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&ctx->mutex) != 0) { + return MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } +#endif + + mbedtls_mpi_free(&P1); + mbedtls_mpi_free(&Q1); + mbedtls_mpi_free(&R); + + if (f_rng != NULL) { +#if defined(MBEDTLS_RSA_NO_CRT) + mbedtls_mpi_free(&D_blind); +#else + mbedtls_mpi_free(&DP_blind); + mbedtls_mpi_free(&DQ_blind); +#endif + } + + mbedtls_mpi_free(&T); + +#if !defined(MBEDTLS_RSA_NO_CRT) + mbedtls_mpi_free(&TP); mbedtls_mpi_free(&TQ); +#endif + + mbedtls_mpi_free(&check_result_blinded); + mbedtls_mpi_free(&input_blinded); + + if (ret != 0 && ret >= -0x007f) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_PRIVATE_FAILED, ret); + } + + return ret; +} + +#if defined(MBEDTLS_PKCS1_V21) +/** + * Generate and apply the MGF1 operation (from PKCS#1 v2.1) to a buffer. + * + * \param dst buffer to mask + * \param dlen length of destination buffer + * \param src source of the mask generation + * \param slen length of the source buffer + * \param md_ctx message digest context to use + */ +static int mgf_mask(unsigned char *dst, size_t dlen, unsigned char *src, + size_t slen, mbedtls_md_context_t *md_ctx) +{ + unsigned char mask[MBEDTLS_MD_MAX_SIZE]; + unsigned char counter[4]; + unsigned char *p; + unsigned int hlen; + size_t i, use_len; + int ret = 0; + + memset(mask, 0, MBEDTLS_MD_MAX_SIZE); + memset(counter, 0, 4); + + hlen = mbedtls_md_get_size(md_ctx->md_info); + + /* Generate and apply dbMask */ + p = dst; + + while (dlen > 0) { + use_len = hlen; + if (dlen < hlen) { + use_len = dlen; + } + + if ((ret = mbedtls_md_starts(md_ctx)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_update(md_ctx, src, slen)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_update(md_ctx, counter, 4)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_finish(md_ctx, mask)) != 0) { + goto exit; + } + + for (i = 0; i < use_len; ++i) { + *p++ ^= mask[i]; + } + + counter[3]++; + + dlen -= use_len; + } + +exit: + mbedtls_platform_zeroize(mask, sizeof(mask)); + + return ret; +} +#endif /* MBEDTLS_PKCS1_V21 */ + +#if defined(MBEDTLS_PKCS1_V21) +/* + * Implementation of the PKCS#1 v2.1 RSAES-OAEP-ENCRYPT function + */ +int mbedtls_rsa_rsaes_oaep_encrypt(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + const unsigned char *label, size_t label_len, + size_t ilen, + const unsigned char *input, + unsigned char *output) +{ + size_t olen; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *p = output; + unsigned int hlen; + const mbedtls_md_info_t *md_info; + mbedtls_md_context_t md_ctx; + + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(mode == MBEDTLS_RSA_PRIVATE || + mode == MBEDTLS_RSA_PUBLIC); + RSA_VALIDATE_RET(output != NULL); + RSA_VALIDATE_RET(ilen == 0 || input != NULL); + RSA_VALIDATE_RET(label_len == 0 || label != NULL); + + if (mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if (f_rng == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) ctx->hash_id); + if (md_info == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + olen = ctx->len; + hlen = mbedtls_md_get_size(md_info); + + /* first comparison checks for overflow */ + if (ilen + 2 * hlen + 2 < ilen || olen < ilen + 2 * hlen + 2) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + memset(output, 0, olen); + + *p++ = 0; + + /* Generate a random octet string seed */ + if ((ret = f_rng(p_rng, p, hlen)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_RNG_FAILED, ret); + } + + p += hlen; + + /* Construct DB */ + if ((ret = mbedtls_md(md_info, label, label_len, p)) != 0) { + return ret; + } + p += hlen; + p += olen - 2 * hlen - 2 - ilen; + *p++ = 1; + if (ilen != 0) { + memcpy(p, input, ilen); + } + + mbedtls_md_init(&md_ctx); + if ((ret = mbedtls_md_setup(&md_ctx, md_info, 0)) != 0) { + goto exit; + } + + /* maskedDB: Apply dbMask to DB */ + if ((ret = mgf_mask(output + hlen + 1, olen - hlen - 1, output + 1, hlen, + &md_ctx)) != 0) { + goto exit; + } + + /* maskedSeed: Apply seedMask to seed */ + if ((ret = mgf_mask(output + 1, hlen, output + hlen + 1, olen - hlen - 1, + &md_ctx)) != 0) { + goto exit; + } + +exit: + mbedtls_md_free(&md_ctx); + + if (ret != 0) { + return ret; + } + + return (mode == MBEDTLS_RSA_PUBLIC) + ? mbedtls_rsa_public(ctx, output, output) + : mbedtls_rsa_private(ctx, f_rng, p_rng, output, output); +} +#endif /* MBEDTLS_PKCS1_V21 */ + +#if defined(MBEDTLS_PKCS1_V15) +/* + * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-ENCRYPT function + */ +int mbedtls_rsa_rsaes_pkcs1_v15_encrypt(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, size_t ilen, + const unsigned char *input, + unsigned char *output) +{ + size_t nb_pad, olen; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *p = output; + + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(mode == MBEDTLS_RSA_PRIVATE || + mode == MBEDTLS_RSA_PUBLIC); + RSA_VALIDATE_RET(output != NULL); + RSA_VALIDATE_RET(ilen == 0 || input != NULL); + + if (mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + olen = ctx->len; + + /* first comparison checks for overflow */ + if (ilen + 11 < ilen || olen < ilen + 11) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + nb_pad = olen - 3 - ilen; + + *p++ = 0; + if (mode == MBEDTLS_RSA_PUBLIC) { + if (f_rng == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + *p++ = MBEDTLS_RSA_CRYPT; + + while (nb_pad-- > 0) { + int rng_dl = 100; + + do { + ret = f_rng(p_rng, p, 1); + } while (*p == 0 && --rng_dl && ret == 0); + + /* Check if RNG failed to generate data */ + if (rng_dl == 0 || ret != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_RNG_FAILED, ret); + } + + p++; + } + } else { + *p++ = MBEDTLS_RSA_SIGN; + + while (nb_pad-- > 0) { + *p++ = 0xFF; + } + } + + *p++ = 0; + if (ilen != 0) { + memcpy(p, input, ilen); + } + + return (mode == MBEDTLS_RSA_PUBLIC) + ? mbedtls_rsa_public(ctx, output, output) + : mbedtls_rsa_private(ctx, f_rng, p_rng, output, output); +} +#endif /* MBEDTLS_PKCS1_V15 */ + +/* + * Add the message padding, then do an RSA operation + */ +int mbedtls_rsa_pkcs1_encrypt(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, size_t ilen, + const unsigned char *input, + unsigned char *output) +{ + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(mode == MBEDTLS_RSA_PRIVATE || + mode == MBEDTLS_RSA_PUBLIC); + RSA_VALIDATE_RET(output != NULL); + RSA_VALIDATE_RET(ilen == 0 || input != NULL); + + switch (ctx->padding) { +#if defined(MBEDTLS_PKCS1_V15) + case MBEDTLS_RSA_PKCS_V15: + return mbedtls_rsa_rsaes_pkcs1_v15_encrypt(ctx, f_rng, p_rng, mode, ilen, + input, output); +#endif + +#if defined(MBEDTLS_PKCS1_V21) + case MBEDTLS_RSA_PKCS_V21: + return mbedtls_rsa_rsaes_oaep_encrypt(ctx, f_rng, p_rng, mode, NULL, 0, + ilen, input, output); +#endif + + default: + return MBEDTLS_ERR_RSA_INVALID_PADDING; + } +} + +#if defined(MBEDTLS_PKCS1_V21) +/* + * Implementation of the PKCS#1 v2.1 RSAES-OAEP-DECRYPT function + */ +int mbedtls_rsa_rsaes_oaep_decrypt(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + const unsigned char *label, size_t label_len, + size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t ilen, i, pad_len; + unsigned char *p, pad_done; + int bad; + unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; + unsigned char lhash[MBEDTLS_MD_MAX_SIZE]; + unsigned int hlen; + const mbedtls_md_info_t *md_info; + mbedtls_md_context_t md_ctx; + + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(mode == MBEDTLS_RSA_PRIVATE || + mode == MBEDTLS_RSA_PUBLIC); + RSA_VALIDATE_RET(output_max_len == 0 || output != NULL); + RSA_VALIDATE_RET(label_len == 0 || label != NULL); + RSA_VALIDATE_RET(input != NULL); + RSA_VALIDATE_RET(olen != NULL); + + /* + * Parameters sanity checks + */ + if (mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + ilen = ctx->len; + + if (ilen < 16 || ilen > sizeof(buf)) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) ctx->hash_id); + if (md_info == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + hlen = mbedtls_md_get_size(md_info); + + // checking for integer underflow + if (2 * hlen + 2 > ilen) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + /* + * RSA operation + */ + ret = (mode == MBEDTLS_RSA_PUBLIC) + ? mbedtls_rsa_public(ctx, input, buf) + : mbedtls_rsa_private(ctx, f_rng, p_rng, input, buf); + + if (ret != 0) { + goto cleanup; + } + + /* + * Unmask data and generate lHash + */ + mbedtls_md_init(&md_ctx); + if ((ret = mbedtls_md_setup(&md_ctx, md_info, 0)) != 0) { + mbedtls_md_free(&md_ctx); + goto cleanup; + } + + /* seed: Apply seedMask to maskedSeed */ + if ((ret = mgf_mask(buf + 1, hlen, buf + hlen + 1, ilen - hlen - 1, + &md_ctx)) != 0 || + /* DB: Apply dbMask to maskedDB */ + (ret = mgf_mask(buf + hlen + 1, ilen - hlen - 1, buf + 1, hlen, + &md_ctx)) != 0) { + mbedtls_md_free(&md_ctx); + goto cleanup; + } + + mbedtls_md_free(&md_ctx); + + /* Generate lHash */ + if ((ret = mbedtls_md(md_info, label, label_len, lhash)) != 0) { + goto cleanup; + } + + /* + * Check contents, in "constant-time" + */ + p = buf; + bad = 0; + + bad |= *p++; /* First byte must be 0 */ + + p += hlen; /* Skip seed */ + + /* Check lHash */ + bad |= mbedtls_ct_memcmp(lhash, p, hlen); + p += hlen; + + /* Get zero-padding len, but always read till end of buffer + * (minus one, for the 01 byte) */ + pad_len = 0; + pad_done = 0; + for (i = 0; i < ilen - 2 * hlen - 2; i++) { + pad_done |= p[i]; + pad_len += ((pad_done | (unsigned char) -pad_done) >> 7) ^ 1; + } + + p += pad_len; + bad |= *p++ ^ 0x01; + + /* + * The only information "leaked" is whether the padding was correct or not + * (eg, no data is copied if it was not correct). This meets the + * recommendations in PKCS#1 v2.2: an opponent cannot distinguish between + * the different error conditions. + */ + if (bad != 0) { + ret = MBEDTLS_ERR_RSA_INVALID_PADDING; + goto cleanup; + } + + if (ilen - (p - buf) > output_max_len) { + ret = MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE; + goto cleanup; + } + + *olen = ilen - (p - buf); + if (*olen != 0) { + memcpy(output, p, *olen); + } + ret = 0; + +cleanup: + mbedtls_platform_zeroize(buf, sizeof(buf)); + mbedtls_platform_zeroize(lhash, sizeof(lhash)); + + return ret; +} +#endif /* MBEDTLS_PKCS1_V21 */ + +#if defined(MBEDTLS_PKCS1_V15) +/* + * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-DECRYPT function + */ +int mbedtls_rsa_rsaes_pkcs1_v15_decrypt(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t ilen; + unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; + + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(mode == MBEDTLS_RSA_PRIVATE || + mode == MBEDTLS_RSA_PUBLIC); + RSA_VALIDATE_RET(output_max_len == 0 || output != NULL); + RSA_VALIDATE_RET(input != NULL); + RSA_VALIDATE_RET(olen != NULL); + + ilen = ctx->len; + + if (mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if (ilen < 16 || ilen > sizeof(buf)) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + ret = (mode == MBEDTLS_RSA_PUBLIC) + ? mbedtls_rsa_public(ctx, input, buf) + : mbedtls_rsa_private(ctx, f_rng, p_rng, input, buf); + + if (ret != 0) { + goto cleanup; + } + + ret = mbedtls_ct_rsaes_pkcs1_v15_unpadding(mode, buf, ilen, + output, output_max_len, olen); + +cleanup: + mbedtls_platform_zeroize(buf, sizeof(buf)); + + return ret; +} +#endif /* MBEDTLS_PKCS1_V15 */ + +/* + * Do an RSA operation, then remove the message padding + */ +int mbedtls_rsa_pkcs1_decrypt(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, size_t *olen, + const unsigned char *input, + unsigned char *output, + size_t output_max_len) +{ + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(mode == MBEDTLS_RSA_PRIVATE || + mode == MBEDTLS_RSA_PUBLIC); + RSA_VALIDATE_RET(output_max_len == 0 || output != NULL); + RSA_VALIDATE_RET(input != NULL); + RSA_VALIDATE_RET(olen != NULL); + + switch (ctx->padding) { +#if defined(MBEDTLS_PKCS1_V15) + case MBEDTLS_RSA_PKCS_V15: + return mbedtls_rsa_rsaes_pkcs1_v15_decrypt(ctx, f_rng, p_rng, mode, olen, + input, output, output_max_len); +#endif + +#if defined(MBEDTLS_PKCS1_V21) + case MBEDTLS_RSA_PKCS_V21: + return mbedtls_rsa_rsaes_oaep_decrypt(ctx, f_rng, p_rng, mode, NULL, 0, + olen, input, output, + output_max_len); +#endif + + default: + return MBEDTLS_ERR_RSA_INVALID_PADDING; + } +} + +#if defined(MBEDTLS_PKCS1_V21) +static int rsa_rsassa_pss_sign(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + int saltlen, + unsigned char *sig) +{ + size_t olen; + unsigned char *p = sig; + unsigned char *salt = NULL; + size_t slen, min_slen, hlen, offset = 0; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t msb; + const mbedtls_md_info_t *md_info; + mbedtls_md_context_t md_ctx; + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(mode == MBEDTLS_RSA_PRIVATE || + mode == MBEDTLS_RSA_PUBLIC); + RSA_VALIDATE_RET((md_alg == MBEDTLS_MD_NONE && + hashlen == 0) || + hash != NULL); + RSA_VALIDATE_RET(sig != NULL); + + if (mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if (f_rng == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + olen = ctx->len; + + if (md_alg != MBEDTLS_MD_NONE) { + /* Gather length of hash to sign */ + md_info = mbedtls_md_info_from_type(md_alg); + if (md_info == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + hashlen = mbedtls_md_get_size(md_info); + } + + md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) ctx->hash_id); + if (md_info == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + hlen = mbedtls_md_get_size(md_info); + + if (saltlen == MBEDTLS_RSA_SALT_LEN_ANY) { + /* Calculate the largest possible salt length, up to the hash size. + * Normally this is the hash length, which is the maximum salt length + * according to FIPS 185-4 §5.5 (e) and common practice. If there is not + * enough room, use the maximum salt length that fits. The constraint is + * that the hash length plus the salt length plus 2 bytes must be at most + * the key length. This complies with FIPS 186-4 §5.5 (e) and RFC 8017 + * (PKCS#1 v2.2) §9.1.1 step 3. */ + min_slen = hlen - 2; + if (olen < hlen + min_slen + 2) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } else if (olen >= hlen + hlen + 2) { + slen = hlen; + } else { + slen = olen - hlen - 2; + } + } else if ((saltlen < 0) || (saltlen + hlen + 2 > olen)) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } else { + slen = (size_t) saltlen; + } + + memset(sig, 0, olen); + + /* Note: EMSA-PSS encoding is over the length of N - 1 bits */ + msb = mbedtls_mpi_bitlen(&ctx->N) - 1; + p += olen - hlen - slen - 2; + *p++ = 0x01; + + /* Generate salt of length slen in place in the encoded message */ + salt = p; + if ((ret = f_rng(p_rng, salt, slen)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_RNG_FAILED, ret); + } + + p += slen; + + mbedtls_md_init(&md_ctx); + if ((ret = mbedtls_md_setup(&md_ctx, md_info, 0)) != 0) { + goto exit; + } + + /* Generate H = Hash( M' ) */ + if ((ret = mbedtls_md_starts(&md_ctx)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_update(&md_ctx, p, 8)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_update(&md_ctx, hash, hashlen)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_update(&md_ctx, salt, slen)) != 0) { + goto exit; + } + if ((ret = mbedtls_md_finish(&md_ctx, p)) != 0) { + goto exit; + } + + /* Compensate for boundary condition when applying mask */ + if (msb % 8 == 0) { + offset = 1; + } + + /* maskedDB: Apply dbMask to DB */ + if ((ret = mgf_mask(sig + offset, olen - hlen - 1 - offset, p, hlen, + &md_ctx)) != 0) { + goto exit; + } + + msb = mbedtls_mpi_bitlen(&ctx->N) - 1; + sig[0] &= 0xFF >> (olen * 8 - msb); + + p += hlen; + *p++ = 0xBC; + +exit: + mbedtls_md_free(&md_ctx); + + if (ret != 0) { + return ret; + } + + return (mode == MBEDTLS_RSA_PUBLIC) + ? mbedtls_rsa_public(ctx, sig, sig) + : mbedtls_rsa_private(ctx, f_rng, p_rng, sig, sig); +} + +/* + * Implementation of the PKCS#1 v2.1 RSASSA-PSS-SIGN function with + * the option to pass in the salt length. + */ +int mbedtls_rsa_rsassa_pss_sign_ext(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + int saltlen, + unsigned char *sig) +{ + return rsa_rsassa_pss_sign(ctx, f_rng, p_rng, MBEDTLS_RSA_PRIVATE, md_alg, + hashlen, hash, saltlen, sig); +} + + +/* + * Implementation of the PKCS#1 v2.1 RSASSA-PSS-SIGN function + */ +int mbedtls_rsa_rsassa_pss_sign(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig) +{ + return rsa_rsassa_pss_sign(ctx, f_rng, p_rng, mode, md_alg, + hashlen, hash, MBEDTLS_RSA_SALT_LEN_ANY, sig); +} +#endif /* MBEDTLS_PKCS1_V21 */ + +#if defined(MBEDTLS_PKCS1_V15) +/* + * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-V1_5-SIGN function + */ + +/* Construct a PKCS v1.5 encoding of a hashed message + * + * This is used both for signature generation and verification. + * + * Parameters: + * - md_alg: Identifies the hash algorithm used to generate the given hash; + * MBEDTLS_MD_NONE if raw data is signed. + * - hashlen: Length of hash in case hashlen is MBEDTLS_MD_NONE. + * - hash: Buffer containing the hashed message or the raw data. + * - dst_len: Length of the encoded message. + * - dst: Buffer to hold the encoded message. + * + * Assumptions: + * - hash has size hashlen if md_alg == MBEDTLS_MD_NONE. + * - hash has size corresponding to md_alg if md_alg != MBEDTLS_MD_NONE. + * - dst points to a buffer of size at least dst_len. + * + */ +static int rsa_rsassa_pkcs1_v15_encode(mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + size_t dst_len, + unsigned char *dst) +{ + size_t oid_size = 0; + size_t nb_pad = dst_len; + unsigned char *p = dst; + const char *oid = NULL; + + /* Are we signing hashed or raw data? */ + if (md_alg != MBEDTLS_MD_NONE) { + const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_alg); + if (md_info == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + if (mbedtls_oid_get_oid_by_md(md_alg, &oid, &oid_size) != 0) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + hashlen = mbedtls_md_get_size(md_info); + + /* Double-check that 8 + hashlen + oid_size can be used as a + * 1-byte ASN.1 length encoding and that there's no overflow. */ + if (8 + hashlen + oid_size >= 0x80 || + 10 + hashlen < hashlen || + 10 + hashlen + oid_size < 10 + hashlen) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + /* + * Static bounds check: + * - Need 10 bytes for five tag-length pairs. + * (Insist on 1-byte length encodings to protect against variants of + * Bleichenbacher's forgery attack against lax PKCS#1v1.5 verification) + * - Need hashlen bytes for hash + * - Need oid_size bytes for hash alg OID. + */ + if (nb_pad < 10 + hashlen + oid_size) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + nb_pad -= 10 + hashlen + oid_size; + } else { + if (nb_pad < hashlen) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + nb_pad -= hashlen; + } + + /* Need space for signature header and padding delimiter (3 bytes), + * and 8 bytes for the minimal padding */ + if (nb_pad < 3 + 8) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + nb_pad -= 3; + + /* Now nb_pad is the amount of memory to be filled + * with padding, and at least 8 bytes long. */ + + /* Write signature header and padding */ + *p++ = 0; + *p++ = MBEDTLS_RSA_SIGN; + memset(p, 0xFF, nb_pad); + p += nb_pad; + *p++ = 0; + + /* Are we signing raw data? */ + if (md_alg == MBEDTLS_MD_NONE) { + memcpy(p, hash, hashlen); + return 0; + } + + /* Signing hashed data, add corresponding ASN.1 structure + * + * DigestInfo ::= SEQUENCE { + * digestAlgorithm DigestAlgorithmIdentifier, + * digest Digest } + * DigestAlgorithmIdentifier ::= AlgorithmIdentifier + * Digest ::= OCTET STRING + * + * Schematic: + * TAG-SEQ + LEN [ TAG-SEQ + LEN [ TAG-OID + LEN [ OID ] + * TAG-NULL + LEN [ NULL ] ] + * TAG-OCTET + LEN [ HASH ] ] + */ + *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; + *p++ = (unsigned char) (0x08 + oid_size + hashlen); + *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; + *p++ = (unsigned char) (0x04 + oid_size); + *p++ = MBEDTLS_ASN1_OID; + *p++ = (unsigned char) oid_size; + memcpy(p, oid, oid_size); + p += oid_size; + *p++ = MBEDTLS_ASN1_NULL; + *p++ = 0x00; + *p++ = MBEDTLS_ASN1_OCTET_STRING; + *p++ = (unsigned char) hashlen; + memcpy(p, hash, hashlen); + p += hashlen; + + /* Just a sanity-check, should be automatic + * after the initial bounds check. */ + if (p != dst + dst_len) { + mbedtls_platform_zeroize(dst, dst_len); + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + return 0; +} + +/* + * Do an RSA operation to sign the message digest + */ +int mbedtls_rsa_rsassa_pkcs1_v15_sign(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *sig_try = NULL, *verif = NULL; + + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(mode == MBEDTLS_RSA_PRIVATE || + mode == MBEDTLS_RSA_PUBLIC); + RSA_VALIDATE_RET((md_alg == MBEDTLS_MD_NONE && + hashlen == 0) || + hash != NULL); + RSA_VALIDATE_RET(sig != NULL); + + if (mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + /* + * Prepare PKCS1-v1.5 encoding (padding and hash identifier) + */ + + if ((ret = rsa_rsassa_pkcs1_v15_encode(md_alg, hashlen, hash, + ctx->len, sig)) != 0) { + return ret; + } + + /* + * Call respective RSA primitive + */ + + if (mode == MBEDTLS_RSA_PUBLIC) { + /* Skip verification on a public key operation */ + return mbedtls_rsa_public(ctx, sig, sig); + } + + /* Private key operation + * + * In order to prevent Lenstra's attack, make the signature in a + * temporary buffer and check it before returning it. + */ + + sig_try = mbedtls_calloc(1, ctx->len); + if (sig_try == NULL) { + return MBEDTLS_ERR_MPI_ALLOC_FAILED; + } + + verif = mbedtls_calloc(1, ctx->len); + if (verif == NULL) { + mbedtls_free(sig_try); + return MBEDTLS_ERR_MPI_ALLOC_FAILED; + } + + MBEDTLS_MPI_CHK(mbedtls_rsa_private(ctx, f_rng, p_rng, sig, sig_try)); + MBEDTLS_MPI_CHK(mbedtls_rsa_public(ctx, sig_try, verif)); + + if (mbedtls_ct_memcmp(verif, sig, ctx->len) != 0) { + ret = MBEDTLS_ERR_RSA_PRIVATE_FAILED; + goto cleanup; + } + + memcpy(sig, sig_try, ctx->len); + +cleanup: + mbedtls_platform_zeroize(sig_try, ctx->len); + mbedtls_platform_zeroize(verif, ctx->len); + mbedtls_free(sig_try); + mbedtls_free(verif); + + if (ret != 0) { + memset(sig, '!', ctx->len); + } + return ret; +} +#endif /* MBEDTLS_PKCS1_V15 */ + +/* + * Do an RSA operation to sign the message digest + */ +int mbedtls_rsa_pkcs1_sign(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + unsigned char *sig) +{ + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(mode == MBEDTLS_RSA_PRIVATE || + mode == MBEDTLS_RSA_PUBLIC); + RSA_VALIDATE_RET((md_alg == MBEDTLS_MD_NONE && + hashlen == 0) || + hash != NULL); + RSA_VALIDATE_RET(sig != NULL); + + switch (ctx->padding) { +#if defined(MBEDTLS_PKCS1_V15) + case MBEDTLS_RSA_PKCS_V15: + return mbedtls_rsa_rsassa_pkcs1_v15_sign(ctx, f_rng, p_rng, mode, md_alg, + hashlen, hash, sig); +#endif + +#if defined(MBEDTLS_PKCS1_V21) + case MBEDTLS_RSA_PKCS_V21: + return mbedtls_rsa_rsassa_pss_sign(ctx, f_rng, p_rng, mode, md_alg, + hashlen, hash, sig); +#endif + + default: + return MBEDTLS_ERR_RSA_INVALID_PADDING; + } +} + +#if defined(MBEDTLS_PKCS1_V21) +/* + * Implementation of the PKCS#1 v2.1 RSASSA-PSS-VERIFY function + */ +int mbedtls_rsa_rsassa_pss_verify_ext(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + mbedtls_md_type_t mgf1_hash_id, + int expected_salt_len, + const unsigned char *sig) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t siglen; + unsigned char *p; + unsigned char *hash_start; + unsigned char result[MBEDTLS_MD_MAX_SIZE]; + unsigned char zeros[8]; + unsigned int hlen; + size_t observed_salt_len, msb; + const mbedtls_md_info_t *md_info; + mbedtls_md_context_t md_ctx; + unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; + + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(mode == MBEDTLS_RSA_PRIVATE || + mode == MBEDTLS_RSA_PUBLIC); + RSA_VALIDATE_RET(sig != NULL); + RSA_VALIDATE_RET((md_alg == MBEDTLS_MD_NONE && + hashlen == 0) || + hash != NULL); + + if (mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + siglen = ctx->len; + + if (siglen < 16 || siglen > sizeof(buf)) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + ret = (mode == MBEDTLS_RSA_PUBLIC) + ? mbedtls_rsa_public(ctx, sig, buf) + : mbedtls_rsa_private(ctx, f_rng, p_rng, sig, buf); + + if (ret != 0) { + return ret; + } + + p = buf; + + if (buf[siglen - 1] != 0xBC) { + return MBEDTLS_ERR_RSA_INVALID_PADDING; + } + + if (md_alg != MBEDTLS_MD_NONE) { + /* Gather length of hash to sign */ + md_info = mbedtls_md_info_from_type(md_alg); + if (md_info == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + hashlen = mbedtls_md_get_size(md_info); + } + + md_info = mbedtls_md_info_from_type(mgf1_hash_id); + if (md_info == NULL) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + hlen = mbedtls_md_get_size(md_info); + + memset(zeros, 0, 8); + + /* + * Note: EMSA-PSS verification is over the length of N - 1 bits + */ + msb = mbedtls_mpi_bitlen(&ctx->N) - 1; + + if (buf[0] >> (8 - siglen * 8 + msb)) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + /* Compensate for boundary condition when applying mask */ + if (msb % 8 == 0) { + p++; + siglen -= 1; + } + + if (siglen < hlen + 2) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + hash_start = p + siglen - hlen - 1; + + mbedtls_md_init(&md_ctx); + if ((ret = mbedtls_md_setup(&md_ctx, md_info, 0)) != 0) { + goto exit; + } + + ret = mgf_mask(p, siglen - hlen - 1, hash_start, hlen, &md_ctx); + if (ret != 0) { + goto exit; + } + + buf[0] &= 0xFF >> (siglen * 8 - msb); + + while (p < hash_start - 1 && *p == 0) { + p++; + } + + if (*p++ != 0x01) { + ret = MBEDTLS_ERR_RSA_INVALID_PADDING; + goto exit; + } + + observed_salt_len = hash_start - p; + + if (expected_salt_len != MBEDTLS_RSA_SALT_LEN_ANY && + observed_salt_len != (size_t) expected_salt_len) { + ret = MBEDTLS_ERR_RSA_INVALID_PADDING; + goto exit; + } + + /* + * Generate H = Hash( M' ) + */ + ret = mbedtls_md_starts(&md_ctx); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_update(&md_ctx, zeros, 8); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_update(&md_ctx, hash, hashlen); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_update(&md_ctx, p, observed_salt_len); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_finish(&md_ctx, result); + if (ret != 0) { + goto exit; + } + + if (memcmp(hash_start, result, hlen) != 0) { + ret = MBEDTLS_ERR_RSA_VERIFY_FAILED; + goto exit; + } + +exit: + mbedtls_md_free(&md_ctx); + + return ret; +} + +/* + * Simplified PKCS#1 v2.1 RSASSA-PSS-VERIFY function + */ +int mbedtls_rsa_rsassa_pss_verify(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + const unsigned char *sig) +{ + mbedtls_md_type_t mgf1_hash_id; + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(mode == MBEDTLS_RSA_PRIVATE || + mode == MBEDTLS_RSA_PUBLIC); + RSA_VALIDATE_RET(sig != NULL); + RSA_VALIDATE_RET((md_alg == MBEDTLS_MD_NONE && + hashlen == 0) || + hash != NULL); + + mgf1_hash_id = (ctx->hash_id != MBEDTLS_MD_NONE) + ? (mbedtls_md_type_t) ctx->hash_id + : md_alg; + + return mbedtls_rsa_rsassa_pss_verify_ext(ctx, f_rng, p_rng, mode, + md_alg, hashlen, hash, + mgf1_hash_id, MBEDTLS_RSA_SALT_LEN_ANY, + sig); + +} +#endif /* MBEDTLS_PKCS1_V21 */ + +#if defined(MBEDTLS_PKCS1_V15) +/* + * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-v1_5-VERIFY function + */ +int mbedtls_rsa_rsassa_pkcs1_v15_verify(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + const unsigned char *sig) +{ + int ret = 0; + size_t sig_len; + unsigned char *encoded = NULL, *encoded_expected = NULL; + + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(mode == MBEDTLS_RSA_PRIVATE || + mode == MBEDTLS_RSA_PUBLIC); + RSA_VALIDATE_RET(sig != NULL); + RSA_VALIDATE_RET((md_alg == MBEDTLS_MD_NONE && + hashlen == 0) || + hash != NULL); + + sig_len = ctx->len; + + if (mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15) { + return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + } + + /* + * Prepare expected PKCS1 v1.5 encoding of hash. + */ + + if ((encoded = mbedtls_calloc(1, sig_len)) == NULL || + (encoded_expected = mbedtls_calloc(1, sig_len)) == NULL) { + ret = MBEDTLS_ERR_MPI_ALLOC_FAILED; + goto cleanup; + } + + if ((ret = rsa_rsassa_pkcs1_v15_encode(md_alg, hashlen, hash, sig_len, + encoded_expected)) != 0) { + goto cleanup; + } + + /* + * Apply RSA primitive to get what should be PKCS1 encoded hash. + */ + + ret = (mode == MBEDTLS_RSA_PUBLIC) + ? mbedtls_rsa_public(ctx, sig, encoded) + : mbedtls_rsa_private(ctx, f_rng, p_rng, sig, encoded); + if (ret != 0) { + goto cleanup; + } + + /* + * Compare + */ + + if ((ret = mbedtls_ct_memcmp(encoded, encoded_expected, + sig_len)) != 0) { + ret = MBEDTLS_ERR_RSA_VERIFY_FAILED; + goto cleanup; + } + +cleanup: + + if (encoded != NULL) { + mbedtls_platform_zeroize(encoded, sig_len); + mbedtls_free(encoded); + } + + if (encoded_expected != NULL) { + mbedtls_platform_zeroize(encoded_expected, sig_len); + mbedtls_free(encoded_expected); + } + + return ret; +} +#endif /* MBEDTLS_PKCS1_V15 */ + +/* + * Do an RSA operation and check the message digest + */ +int mbedtls_rsa_pkcs1_verify(mbedtls_rsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + int mode, + mbedtls_md_type_t md_alg, + unsigned int hashlen, + const unsigned char *hash, + const unsigned char *sig) +{ + RSA_VALIDATE_RET(ctx != NULL); + RSA_VALIDATE_RET(mode == MBEDTLS_RSA_PRIVATE || + mode == MBEDTLS_RSA_PUBLIC); + RSA_VALIDATE_RET(sig != NULL); + RSA_VALIDATE_RET((md_alg == MBEDTLS_MD_NONE && + hashlen == 0) || + hash != NULL); + + switch (ctx->padding) { +#if defined(MBEDTLS_PKCS1_V15) + case MBEDTLS_RSA_PKCS_V15: + return mbedtls_rsa_rsassa_pkcs1_v15_verify(ctx, f_rng, p_rng, mode, md_alg, + hashlen, hash, sig); +#endif + +#if defined(MBEDTLS_PKCS1_V21) + case MBEDTLS_RSA_PKCS_V21: + return mbedtls_rsa_rsassa_pss_verify(ctx, f_rng, p_rng, mode, md_alg, + hashlen, hash, sig); +#endif + + default: + return MBEDTLS_ERR_RSA_INVALID_PADDING; + } +} + +/* + * Copy the components of an RSA key + */ +int mbedtls_rsa_copy(mbedtls_rsa_context *dst, const mbedtls_rsa_context *src) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + RSA_VALIDATE_RET(dst != NULL); + RSA_VALIDATE_RET(src != NULL); + + dst->len = src->len; + + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&dst->N, &src->N)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&dst->E, &src->E)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&dst->D, &src->D)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&dst->P, &src->P)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&dst->Q, &src->Q)); + +#if !defined(MBEDTLS_RSA_NO_CRT) + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&dst->DP, &src->DP)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&dst->DQ, &src->DQ)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&dst->QP, &src->QP)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&dst->RP, &src->RP)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&dst->RQ, &src->RQ)); +#endif + + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&dst->RN, &src->RN)); + + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&dst->Vi, &src->Vi)); + MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&dst->Vf, &src->Vf)); + + dst->padding = src->padding; + dst->hash_id = src->hash_id; + +cleanup: + if (ret != 0) { + mbedtls_rsa_free(dst); + } + + return ret; +} + +/* + * Free the components of an RSA key + */ +void mbedtls_rsa_free(mbedtls_rsa_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_mpi_free(&ctx->Vi); + mbedtls_mpi_free(&ctx->Vf); + mbedtls_mpi_free(&ctx->RN); + mbedtls_mpi_free(&ctx->D); + mbedtls_mpi_free(&ctx->Q); + mbedtls_mpi_free(&ctx->P); + mbedtls_mpi_free(&ctx->E); + mbedtls_mpi_free(&ctx->N); + +#if !defined(MBEDTLS_RSA_NO_CRT) + mbedtls_mpi_free(&ctx->RQ); + mbedtls_mpi_free(&ctx->RP); + mbedtls_mpi_free(&ctx->QP); + mbedtls_mpi_free(&ctx->DQ); + mbedtls_mpi_free(&ctx->DP); +#endif /* MBEDTLS_RSA_NO_CRT */ + +#if defined(MBEDTLS_THREADING_C) + /* Free the mutex, but only if it hasn't been freed already. */ + if (ctx->ver != 0) { + mbedtls_mutex_free(&ctx->mutex); + ctx->ver = 0; + } +#endif +} + +#endif /* !MBEDTLS_RSA_ALT */ + +#if defined(MBEDTLS_SELF_TEST) + +#include "mbedtls/sha1.h" + +/* + * Example RSA-1024 keypair, for test purposes + */ +#define KEY_LEN 128 + +#define RSA_N "9292758453063D803DD603D5E777D788" \ + "8ED1D5BF35786190FA2F23EBC0848AEA" \ + "DDA92CA6C3D80B32C4D109BE0F36D6AE" \ + "7130B9CED7ACDF54CFC7555AC14EEBAB" \ + "93A89813FBF3C4F8066D2D800F7C38A8" \ + "1AE31942917403FF4946B0A83D3D3E05" \ + "EE57C6F5F5606FB5D4BC6CD34EE0801A" \ + "5E94BB77B07507233A0BC7BAC8F90F79" + +#define RSA_E "10001" + +#define RSA_D "24BF6185468786FDD303083D25E64EFC" \ + "66CA472BC44D253102F8B4A9D3BFA750" \ + "91386C0077937FE33FA3252D28855837" \ + "AE1B484A8A9A45F7EE8C0C634F99E8CD" \ + "DF79C5CE07EE72C7F123142198164234" \ + "CABB724CF78B8173B9F880FC86322407" \ + "AF1FEDFDDE2BEB674CA15F3E81A1521E" \ + "071513A1E85B5DFA031F21ECAE91A34D" + +#define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \ + "2C01CAD19EA484A87EA4377637E75500" \ + "FCB2005C5C7DD6EC4AC023CDA285D796" \ + "C3D9E75E1EFC42488BB4F1D13AC30A57" + +#define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \ + "E211C2B9E5DB1ED0BF61D0D9899620F4" \ + "910E4168387E3C30AA1E00C339A79508" \ + "8452DD96A9A5EA5D9DCA68DA636032AF" + +#define PT_LEN 24 +#define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \ + "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD" + +#if defined(MBEDTLS_PKCS1_V15) +static int myrand(void *rng_state, unsigned char *output, size_t len) +{ +#if !defined(__OpenBSD__) && !defined(__NetBSD__) + size_t i; + + if (rng_state != NULL) { + rng_state = NULL; + } + + for (i = 0; i < len; ++i) { + output[i] = rand(); + } +#else + if (rng_state != NULL) { + rng_state = NULL; + } + + arc4random_buf(output, len); +#endif /* !OpenBSD && !NetBSD */ + + return 0; +} +#endif /* MBEDTLS_PKCS1_V15 */ + +/* + * Checkup routine + */ +int mbedtls_rsa_self_test(int verbose) +{ + int ret = 0; +#if defined(MBEDTLS_PKCS1_V15) + size_t len; + mbedtls_rsa_context rsa; + unsigned char rsa_plaintext[PT_LEN]; + unsigned char rsa_decrypted[PT_LEN]; + unsigned char rsa_ciphertext[KEY_LEN]; +#if defined(MBEDTLS_SHA1_C) + unsigned char sha1sum[20]; +#endif + + mbedtls_mpi K; + + mbedtls_mpi_init(&K); + mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, 0); + + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&K, 16, RSA_N)); + MBEDTLS_MPI_CHK(mbedtls_rsa_import(&rsa, &K, NULL, NULL, NULL, NULL)); + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&K, 16, RSA_P)); + MBEDTLS_MPI_CHK(mbedtls_rsa_import(&rsa, NULL, &K, NULL, NULL, NULL)); + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&K, 16, RSA_Q)); + MBEDTLS_MPI_CHK(mbedtls_rsa_import(&rsa, NULL, NULL, &K, NULL, NULL)); + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&K, 16, RSA_D)); + MBEDTLS_MPI_CHK(mbedtls_rsa_import(&rsa, NULL, NULL, NULL, &K, NULL)); + MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&K, 16, RSA_E)); + MBEDTLS_MPI_CHK(mbedtls_rsa_import(&rsa, NULL, NULL, NULL, NULL, &K)); + + MBEDTLS_MPI_CHK(mbedtls_rsa_complete(&rsa)); + + if (verbose != 0) { + mbedtls_printf(" RSA key validation: "); + } + + if (mbedtls_rsa_check_pubkey(&rsa) != 0 || + mbedtls_rsa_check_privkey(&rsa) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto cleanup; + } + + if (verbose != 0) { + mbedtls_printf("passed\n PKCS#1 encryption : "); + } + + memcpy(rsa_plaintext, RSA_PT, PT_LEN); + + if (mbedtls_rsa_pkcs1_encrypt(&rsa, myrand, NULL, MBEDTLS_RSA_PUBLIC, + PT_LEN, rsa_plaintext, + rsa_ciphertext) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto cleanup; + } + + if (verbose != 0) { + mbedtls_printf("passed\n PKCS#1 decryption : "); + } + + if (mbedtls_rsa_pkcs1_decrypt(&rsa, myrand, NULL, MBEDTLS_RSA_PRIVATE, + &len, rsa_ciphertext, rsa_decrypted, + sizeof(rsa_decrypted)) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto cleanup; + } + + if (memcmp(rsa_decrypted, rsa_plaintext, len) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto cleanup; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + +#if defined(MBEDTLS_SHA1_C) + if (verbose != 0) { + mbedtls_printf(" PKCS#1 data sign : "); + } + + if (mbedtls_sha1_ret(rsa_plaintext, PT_LEN, sha1sum) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + return 1; + } + + if (mbedtls_rsa_pkcs1_sign(&rsa, myrand, NULL, + MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_SHA1, 0, + sha1sum, rsa_ciphertext) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto cleanup; + } + + if (verbose != 0) { + mbedtls_printf("passed\n PKCS#1 sig. verify: "); + } + + if (mbedtls_rsa_pkcs1_verify(&rsa, NULL, NULL, + MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA1, 0, + sha1sum, rsa_ciphertext) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto cleanup; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } +#endif /* MBEDTLS_SHA1_C */ + + if (verbose != 0) { + mbedtls_printf("\n"); + } + +cleanup: + mbedtls_mpi_free(&K); + mbedtls_rsa_free(&rsa); +#else /* MBEDTLS_PKCS1_V15 */ + ((void) verbose); +#endif /* MBEDTLS_PKCS1_V15 */ + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_RSA_C */ diff --git a/ext/opcua_client/mbedtls/library/rsa_internal.c b/ext/opcua_client/mbedtls/library/rsa_internal.c new file mode 100644 index 0000000..5a9e5c3 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/rsa_internal.c @@ -0,0 +1,447 @@ +/* + * Helper functions for the RSA module + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + * + */ + +#include "common.h" + +#if defined(MBEDTLS_RSA_C) + +#include "mbedtls/rsa.h" +#include "mbedtls/bignum.h" +#include "mbedtls/rsa_internal.h" + +/* + * Compute RSA prime factors from public and private exponents + * + * Summary of algorithm: + * Setting F := lcm(P-1,Q-1), the idea is as follows: + * + * (a) For any 1 <= X < N with gcd(X,N)=1, we have X^F = 1 modulo N, so X^(F/2) + * is a square root of 1 in Z/NZ. Since Z/NZ ~= Z/PZ x Z/QZ by CRT and the + * square roots of 1 in Z/PZ and Z/QZ are +1 and -1, this leaves the four + * possibilities X^(F/2) = (+-1, +-1). If it happens that X^(F/2) = (-1,+1) + * or (+1,-1), then gcd(X^(F/2) + 1, N) will be equal to one of the prime + * factors of N. + * + * (b) If we don't know F/2 but (F/2) * K for some odd (!) K, then the same + * construction still applies since (-)^K is the identity on the set of + * roots of 1 in Z/NZ. + * + * The public and private key primitives (-)^E and (-)^D are mutually inverse + * bijections on Z/NZ if and only if (-)^(DE) is the identity on Z/NZ, i.e. + * if and only if DE - 1 is a multiple of F, say DE - 1 = F * L. + * Splitting L = 2^t * K with K odd, we have + * + * DE - 1 = FL = (F/2) * (2^(t+1)) * K, + * + * so (F / 2) * K is among the numbers + * + * (DE - 1) >> 1, (DE - 1) >> 2, ..., (DE - 1) >> ord + * + * where ord is the order of 2 in (DE - 1). + * We can therefore iterate through these numbers apply the construction + * of (a) and (b) above to attempt to factor N. + * + */ +int mbedtls_rsa_deduce_primes(mbedtls_mpi const *N, + mbedtls_mpi const *E, mbedtls_mpi const *D, + mbedtls_mpi *P, mbedtls_mpi *Q) +{ + int ret = 0; + + uint16_t attempt; /* Number of current attempt */ + uint16_t iter; /* Number of squares computed in the current attempt */ + + uint16_t order; /* Order of 2 in DE - 1 */ + + mbedtls_mpi T; /* Holds largest odd divisor of DE - 1 */ + mbedtls_mpi K; /* Temporary holding the current candidate */ + + const unsigned char primes[] = { 2, + 3, 5, 7, 11, 13, 17, 19, 23, + 29, 31, 37, 41, 43, 47, 53, 59, + 61, 67, 71, 73, 79, 83, 89, 97, + 101, 103, 107, 109, 113, 127, 131, 137, + 139, 149, 151, 157, 163, 167, 173, 179, + 181, 191, 193, 197, 199, 211, 223, 227, + 229, 233, 239, 241, 251 }; + + const size_t num_primes = sizeof(primes) / sizeof(*primes); + + if (P == NULL || Q == NULL || P->p != NULL || Q->p != NULL) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + if (mbedtls_mpi_cmp_int(N, 0) <= 0 || + mbedtls_mpi_cmp_int(D, 1) <= 0 || + mbedtls_mpi_cmp_mpi(D, N) >= 0 || + mbedtls_mpi_cmp_int(E, 1) <= 0 || + mbedtls_mpi_cmp_mpi(E, N) >= 0) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + /* + * Initializations and temporary changes + */ + + mbedtls_mpi_init(&K); + mbedtls_mpi_init(&T); + + /* T := DE - 1 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&T, D, E)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&T, &T, 1)); + + if ((order = (uint16_t) mbedtls_mpi_lsb(&T)) == 0) { + ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + goto cleanup; + } + + /* After this operation, T holds the largest odd divisor of DE - 1. */ + MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&T, order)); + + /* + * Actual work + */ + + /* Skip trying 2 if N == 1 mod 8 */ + attempt = 0; + if (N->p[0] % 8 == 1) { + attempt = 1; + } + + for (; attempt < num_primes; ++attempt) { + MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&K, primes[attempt])); + + /* Check if gcd(K,N) = 1 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_gcd(P, &K, N)); + if (mbedtls_mpi_cmp_int(P, 1) != 0) { + continue; + } + + /* Go through K^T + 1, K^(2T) + 1, K^(4T) + 1, ... + * and check whether they have nontrivial GCD with N. */ + MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&K, &K, &T, N, + Q /* temporarily use Q for storing Montgomery + * multiplication helper values */)); + + for (iter = 1; iter <= order; ++iter) { + /* If we reach 1 prematurely, there's no point + * in continuing to square K */ + if (mbedtls_mpi_cmp_int(&K, 1) == 0) { + break; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(&K, &K, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_gcd(P, &K, N)); + + if (mbedtls_mpi_cmp_int(P, 1) == 1 && + mbedtls_mpi_cmp_mpi(P, N) == -1) { + /* + * Have found a nontrivial divisor P of N. + * Set Q := N / P. + */ + + MBEDTLS_MPI_CHK(mbedtls_mpi_div_mpi(Q, NULL, N, P)); + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&K, &K, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&K, &K, &K)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&K, &K, N)); + } + + /* + * If we get here, then either we prematurely aborted the loop because + * we reached 1, or K holds primes[attempt]^(DE - 1) mod N, which must + * be 1 if D,E,N were consistent. + * Check if that's the case and abort if not, to avoid very long, + * yet eventually failing, computations if N,D,E were not sane. + */ + if (mbedtls_mpi_cmp_int(&K, 1) != 0) { + break; + } + } + + ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + +cleanup: + + mbedtls_mpi_free(&K); + mbedtls_mpi_free(&T); + return ret; +} + +/* + * Given P, Q and the public exponent E, deduce D. + * This is essentially a modular inversion. + */ +int mbedtls_rsa_deduce_private_exponent(mbedtls_mpi const *P, + mbedtls_mpi const *Q, + mbedtls_mpi const *E, + mbedtls_mpi *D) +{ + int ret = 0; + mbedtls_mpi K, L; + + if (D == NULL || mbedtls_mpi_cmp_int(D, 0) != 0) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + if (mbedtls_mpi_cmp_int(P, 1) <= 0 || + mbedtls_mpi_cmp_int(Q, 1) <= 0 || + mbedtls_mpi_cmp_int(E, 0) == 0) { + return MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + } + + mbedtls_mpi_init(&K); + mbedtls_mpi_init(&L); + + /* Temporarily put K := P-1 and L := Q-1 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&K, P, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&L, Q, 1)); + + /* Temporarily put D := gcd(P-1, Q-1) */ + MBEDTLS_MPI_CHK(mbedtls_mpi_gcd(D, &K, &L)); + + /* K := LCM(P-1, Q-1) */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&K, &K, &L)); + MBEDTLS_MPI_CHK(mbedtls_mpi_div_mpi(&K, NULL, &K, D)); + + /* Compute modular inverse of E in LCM(P-1, Q-1) */ + MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(D, E, &K)); + +cleanup: + + mbedtls_mpi_free(&K); + mbedtls_mpi_free(&L); + + return ret; +} + +/* + * Check that RSA CRT parameters are in accordance with core parameters. + */ +int mbedtls_rsa_validate_crt(const mbedtls_mpi *P, const mbedtls_mpi *Q, + const mbedtls_mpi *D, const mbedtls_mpi *DP, + const mbedtls_mpi *DQ, const mbedtls_mpi *QP) +{ + int ret = 0; + + mbedtls_mpi K, L; + mbedtls_mpi_init(&K); + mbedtls_mpi_init(&L); + + /* Check that DP - D == 0 mod P - 1 */ + if (DP != NULL) { + if (P == NULL) { + ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&K, P, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&L, DP, D)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&L, &L, &K)); + + if (mbedtls_mpi_cmp_int(&L, 0) != 0) { + ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + goto cleanup; + } + } + + /* Check that DQ - D == 0 mod Q - 1 */ + if (DQ != NULL) { + if (Q == NULL) { + ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&K, Q, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&L, DQ, D)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&L, &L, &K)); + + if (mbedtls_mpi_cmp_int(&L, 0) != 0) { + ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + goto cleanup; + } + } + + /* Check that QP * Q - 1 == 0 mod P */ + if (QP != NULL) { + if (P == NULL || Q == NULL) { + ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA; + goto cleanup; + } + + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&K, QP, Q)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&K, &K, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&K, &K, P)); + if (mbedtls_mpi_cmp_int(&K, 0) != 0) { + ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + goto cleanup; + } + } + +cleanup: + + /* Wrap MPI error codes by RSA check failure error code */ + if (ret != 0 && + ret != MBEDTLS_ERR_RSA_KEY_CHECK_FAILED && + ret != MBEDTLS_ERR_RSA_BAD_INPUT_DATA) { + ret += MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + } + + mbedtls_mpi_free(&K); + mbedtls_mpi_free(&L); + + return ret; +} + +/* + * Check that core RSA parameters are sane. + */ +int mbedtls_rsa_validate_params(const mbedtls_mpi *N, const mbedtls_mpi *P, + const mbedtls_mpi *Q, const mbedtls_mpi *D, + const mbedtls_mpi *E, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = 0; + mbedtls_mpi K, L; + + mbedtls_mpi_init(&K); + mbedtls_mpi_init(&L); + + /* + * Step 1: If PRNG provided, check that P and Q are prime + */ + +#if defined(MBEDTLS_GENPRIME) + /* + * When generating keys, the strongest security we support aims for an error + * rate of at most 2^-100 and we are aiming for the same certainty here as + * well. + */ + if (f_rng != NULL && P != NULL && + (ret = mbedtls_mpi_is_prime_ext(P, 50, f_rng, p_rng)) != 0) { + ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + goto cleanup; + } + + if (f_rng != NULL && Q != NULL && + (ret = mbedtls_mpi_is_prime_ext(Q, 50, f_rng, p_rng)) != 0) { + ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + goto cleanup; + } +#else + ((void) f_rng); + ((void) p_rng); +#endif /* MBEDTLS_GENPRIME */ + + /* + * Step 2: Check that 1 < N = P * Q + */ + + if (P != NULL && Q != NULL && N != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&K, P, Q)); + if (mbedtls_mpi_cmp_int(N, 1) <= 0 || + mbedtls_mpi_cmp_mpi(&K, N) != 0) { + ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + goto cleanup; + } + } + + /* + * Step 3: Check and 1 < D, E < N if present. + */ + + if (N != NULL && D != NULL && E != NULL) { + if (mbedtls_mpi_cmp_int(D, 1) <= 0 || + mbedtls_mpi_cmp_int(E, 1) <= 0 || + mbedtls_mpi_cmp_mpi(D, N) >= 0 || + mbedtls_mpi_cmp_mpi(E, N) >= 0) { + ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + goto cleanup; + } + } + + /* + * Step 4: Check that D, E are inverse modulo P-1 and Q-1 + */ + + if (P != NULL && Q != NULL && D != NULL && E != NULL) { + if (mbedtls_mpi_cmp_int(P, 1) <= 0 || + mbedtls_mpi_cmp_int(Q, 1) <= 0) { + ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + goto cleanup; + } + + /* Compute DE-1 mod P-1 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&K, D, E)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&K, &K, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&L, P, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&K, &K, &L)); + if (mbedtls_mpi_cmp_int(&K, 0) != 0) { + ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + goto cleanup; + } + + /* Compute DE-1 mod Q-1 */ + MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&K, D, E)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&K, &K, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&L, Q, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&K, &K, &L)); + if (mbedtls_mpi_cmp_int(&K, 0) != 0) { + ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + goto cleanup; + } + } + +cleanup: + + mbedtls_mpi_free(&K); + mbedtls_mpi_free(&L); + + /* Wrap MPI error codes by RSA check failure error code */ + if (ret != 0 && ret != MBEDTLS_ERR_RSA_KEY_CHECK_FAILED) { + ret += MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; + } + + return ret; +} + +int mbedtls_rsa_deduce_crt(const mbedtls_mpi *P, const mbedtls_mpi *Q, + const mbedtls_mpi *D, mbedtls_mpi *DP, + mbedtls_mpi *DQ, mbedtls_mpi *QP) +{ + int ret = 0; + mbedtls_mpi K; + mbedtls_mpi_init(&K); + + /* DP = D mod P-1 */ + if (DP != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&K, P, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(DP, D, &K)); + } + + /* DQ = D mod Q-1 */ + if (DQ != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&K, Q, 1)); + MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(DQ, D, &K)); + } + + /* QP = Q^{-1} mod P */ + if (QP != NULL) { + MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(QP, Q, P)); + } + +cleanup: + mbedtls_mpi_free(&K); + + return ret; +} + +#endif /* MBEDTLS_RSA_C */ diff --git a/ext/opcua_client/mbedtls/library/sha1.c b/ext/opcua_client/mbedtls/library/sha1.c new file mode 100644 index 0000000..9dd958e --- /dev/null +++ b/ext/opcua_client/mbedtls/library/sha1.c @@ -0,0 +1,541 @@ +/* + * FIPS-180-1 compliant SHA-1 implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The SHA-1 standard was published by NIST in 1993. + * + * http://www.itl.nist.gov/fipspubs/fip180-1.htm + */ + +#include "common.h" + +#if defined(MBEDTLS_SHA1_C) + +#include "mbedtls/sha1.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#include "mbedtls/platform.h" + +#define SHA1_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_SHA1_BAD_INPUT_DATA) + +#define SHA1_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE(cond) + +#if !defined(MBEDTLS_SHA1_ALT) + +void mbedtls_sha1_init(mbedtls_sha1_context *ctx) +{ + SHA1_VALIDATE(ctx != NULL); + + memset(ctx, 0, sizeof(mbedtls_sha1_context)); +} + +void mbedtls_sha1_free(mbedtls_sha1_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_sha1_context)); +} + +void mbedtls_sha1_clone(mbedtls_sha1_context *dst, + const mbedtls_sha1_context *src) +{ + SHA1_VALIDATE(dst != NULL); + SHA1_VALIDATE(src != NULL); + + *dst = *src; +} + +/* + * SHA-1 context setup + */ +int mbedtls_sha1_starts_ret(mbedtls_sha1_context *ctx) +{ + SHA1_VALIDATE_RET(ctx != NULL); + + ctx->total[0] = 0; + ctx->total[1] = 0; + + ctx->state[0] = 0x67452301; + ctx->state[1] = 0xEFCDAB89; + ctx->state[2] = 0x98BADCFE; + ctx->state[3] = 0x10325476; + ctx->state[4] = 0xC3D2E1F0; + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha1_starts(mbedtls_sha1_context *ctx) +{ + mbedtls_sha1_starts_ret(ctx); +} +#endif + +#if !defined(MBEDTLS_SHA1_PROCESS_ALT) +int mbedtls_internal_sha1_process(mbedtls_sha1_context *ctx, + const unsigned char data[64]) +{ + struct { + uint32_t temp, W[16], A, B, C, D, E; + } local; + + SHA1_VALIDATE_RET(ctx != NULL); + SHA1_VALIDATE_RET((const unsigned char *) data != NULL); + + local.W[0] = MBEDTLS_GET_UINT32_BE(data, 0); + local.W[1] = MBEDTLS_GET_UINT32_BE(data, 4); + local.W[2] = MBEDTLS_GET_UINT32_BE(data, 8); + local.W[3] = MBEDTLS_GET_UINT32_BE(data, 12); + local.W[4] = MBEDTLS_GET_UINT32_BE(data, 16); + local.W[5] = MBEDTLS_GET_UINT32_BE(data, 20); + local.W[6] = MBEDTLS_GET_UINT32_BE(data, 24); + local.W[7] = MBEDTLS_GET_UINT32_BE(data, 28); + local.W[8] = MBEDTLS_GET_UINT32_BE(data, 32); + local.W[9] = MBEDTLS_GET_UINT32_BE(data, 36); + local.W[10] = MBEDTLS_GET_UINT32_BE(data, 40); + local.W[11] = MBEDTLS_GET_UINT32_BE(data, 44); + local.W[12] = MBEDTLS_GET_UINT32_BE(data, 48); + local.W[13] = MBEDTLS_GET_UINT32_BE(data, 52); + local.W[14] = MBEDTLS_GET_UINT32_BE(data, 56); + local.W[15] = MBEDTLS_GET_UINT32_BE(data, 60); + +#define S(x, n) (((x) << (n)) | (((x) & 0xFFFFFFFF) >> (32 - (n)))) + +#define R(t) \ + ( \ + local.temp = local.W[((t) - 3) & 0x0F] ^ \ + local.W[((t) - 8) & 0x0F] ^ \ + local.W[((t) - 14) & 0x0F] ^ \ + local.W[(t) & 0x0F], \ + (local.W[(t) & 0x0F] = S(local.temp, 1)) \ + ) + +#define P(a, b, c, d, e, x) \ + do \ + { \ + (e) += S((a), 5) + F((b), (c), (d)) + K + (x); \ + (b) = S((b), 30); \ + } while (0) + + local.A = ctx->state[0]; + local.B = ctx->state[1]; + local.C = ctx->state[2]; + local.D = ctx->state[3]; + local.E = ctx->state[4]; + +#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) +#define K 0x5A827999 + + P(local.A, local.B, local.C, local.D, local.E, local.W[0]); + P(local.E, local.A, local.B, local.C, local.D, local.W[1]); + P(local.D, local.E, local.A, local.B, local.C, local.W[2]); + P(local.C, local.D, local.E, local.A, local.B, local.W[3]); + P(local.B, local.C, local.D, local.E, local.A, local.W[4]); + P(local.A, local.B, local.C, local.D, local.E, local.W[5]); + P(local.E, local.A, local.B, local.C, local.D, local.W[6]); + P(local.D, local.E, local.A, local.B, local.C, local.W[7]); + P(local.C, local.D, local.E, local.A, local.B, local.W[8]); + P(local.B, local.C, local.D, local.E, local.A, local.W[9]); + P(local.A, local.B, local.C, local.D, local.E, local.W[10]); + P(local.E, local.A, local.B, local.C, local.D, local.W[11]); + P(local.D, local.E, local.A, local.B, local.C, local.W[12]); + P(local.C, local.D, local.E, local.A, local.B, local.W[13]); + P(local.B, local.C, local.D, local.E, local.A, local.W[14]); + P(local.A, local.B, local.C, local.D, local.E, local.W[15]); + P(local.E, local.A, local.B, local.C, local.D, R(16)); + P(local.D, local.E, local.A, local.B, local.C, R(17)); + P(local.C, local.D, local.E, local.A, local.B, R(18)); + P(local.B, local.C, local.D, local.E, local.A, R(19)); + +#undef K +#undef F + +#define F(x, y, z) ((x) ^ (y) ^ (z)) +#define K 0x6ED9EBA1 + + P(local.A, local.B, local.C, local.D, local.E, R(20)); + P(local.E, local.A, local.B, local.C, local.D, R(21)); + P(local.D, local.E, local.A, local.B, local.C, R(22)); + P(local.C, local.D, local.E, local.A, local.B, R(23)); + P(local.B, local.C, local.D, local.E, local.A, R(24)); + P(local.A, local.B, local.C, local.D, local.E, R(25)); + P(local.E, local.A, local.B, local.C, local.D, R(26)); + P(local.D, local.E, local.A, local.B, local.C, R(27)); + P(local.C, local.D, local.E, local.A, local.B, R(28)); + P(local.B, local.C, local.D, local.E, local.A, R(29)); + P(local.A, local.B, local.C, local.D, local.E, R(30)); + P(local.E, local.A, local.B, local.C, local.D, R(31)); + P(local.D, local.E, local.A, local.B, local.C, R(32)); + P(local.C, local.D, local.E, local.A, local.B, R(33)); + P(local.B, local.C, local.D, local.E, local.A, R(34)); + P(local.A, local.B, local.C, local.D, local.E, R(35)); + P(local.E, local.A, local.B, local.C, local.D, R(36)); + P(local.D, local.E, local.A, local.B, local.C, R(37)); + P(local.C, local.D, local.E, local.A, local.B, R(38)); + P(local.B, local.C, local.D, local.E, local.A, R(39)); + +#undef K +#undef F + +#define F(x, y, z) (((x) & (y)) | ((z) & ((x) | (y)))) +#define K 0x8F1BBCDC + + P(local.A, local.B, local.C, local.D, local.E, R(40)); + P(local.E, local.A, local.B, local.C, local.D, R(41)); + P(local.D, local.E, local.A, local.B, local.C, R(42)); + P(local.C, local.D, local.E, local.A, local.B, R(43)); + P(local.B, local.C, local.D, local.E, local.A, R(44)); + P(local.A, local.B, local.C, local.D, local.E, R(45)); + P(local.E, local.A, local.B, local.C, local.D, R(46)); + P(local.D, local.E, local.A, local.B, local.C, R(47)); + P(local.C, local.D, local.E, local.A, local.B, R(48)); + P(local.B, local.C, local.D, local.E, local.A, R(49)); + P(local.A, local.B, local.C, local.D, local.E, R(50)); + P(local.E, local.A, local.B, local.C, local.D, R(51)); + P(local.D, local.E, local.A, local.B, local.C, R(52)); + P(local.C, local.D, local.E, local.A, local.B, R(53)); + P(local.B, local.C, local.D, local.E, local.A, R(54)); + P(local.A, local.B, local.C, local.D, local.E, R(55)); + P(local.E, local.A, local.B, local.C, local.D, R(56)); + P(local.D, local.E, local.A, local.B, local.C, R(57)); + P(local.C, local.D, local.E, local.A, local.B, R(58)); + P(local.B, local.C, local.D, local.E, local.A, R(59)); + +#undef K +#undef F + +#define F(x, y, z) ((x) ^ (y) ^ (z)) +#define K 0xCA62C1D6 + + P(local.A, local.B, local.C, local.D, local.E, R(60)); + P(local.E, local.A, local.B, local.C, local.D, R(61)); + P(local.D, local.E, local.A, local.B, local.C, R(62)); + P(local.C, local.D, local.E, local.A, local.B, R(63)); + P(local.B, local.C, local.D, local.E, local.A, R(64)); + P(local.A, local.B, local.C, local.D, local.E, R(65)); + P(local.E, local.A, local.B, local.C, local.D, R(66)); + P(local.D, local.E, local.A, local.B, local.C, R(67)); + P(local.C, local.D, local.E, local.A, local.B, R(68)); + P(local.B, local.C, local.D, local.E, local.A, R(69)); + P(local.A, local.B, local.C, local.D, local.E, R(70)); + P(local.E, local.A, local.B, local.C, local.D, R(71)); + P(local.D, local.E, local.A, local.B, local.C, R(72)); + P(local.C, local.D, local.E, local.A, local.B, R(73)); + P(local.B, local.C, local.D, local.E, local.A, R(74)); + P(local.A, local.B, local.C, local.D, local.E, R(75)); + P(local.E, local.A, local.B, local.C, local.D, R(76)); + P(local.D, local.E, local.A, local.B, local.C, R(77)); + P(local.C, local.D, local.E, local.A, local.B, R(78)); + P(local.B, local.C, local.D, local.E, local.A, R(79)); + +#undef K +#undef F + + ctx->state[0] += local.A; + ctx->state[1] += local.B; + ctx->state[2] += local.C; + ctx->state[3] += local.D; + ctx->state[4] += local.E; + + /* Zeroise buffers and variables to clear sensitive data from memory. */ + mbedtls_platform_zeroize(&local, sizeof(local)); + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha1_process(mbedtls_sha1_context *ctx, + const unsigned char data[64]) +{ + mbedtls_internal_sha1_process(ctx, data); +} +#endif +#endif /* !MBEDTLS_SHA1_PROCESS_ALT */ + +/* + * SHA-1 process buffer + */ +int mbedtls_sha1_update_ret(mbedtls_sha1_context *ctx, + const unsigned char *input, + size_t ilen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t fill; + uint32_t left; + + SHA1_VALIDATE_RET(ctx != NULL); + SHA1_VALIDATE_RET(ilen == 0 || input != NULL); + + if (ilen == 0) { + return 0; + } + + left = ctx->total[0] & 0x3F; + fill = 64 - left; + + ctx->total[0] += (uint32_t) ilen; + ctx->total[0] &= 0xFFFFFFFF; + + if (ctx->total[0] < (uint32_t) ilen) { + ctx->total[1]++; + } + + if (left && ilen >= fill) { + memcpy((void *) (ctx->buffer + left), input, fill); + + if ((ret = mbedtls_internal_sha1_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + input += fill; + ilen -= fill; + left = 0; + } + + while (ilen >= 64) { + if ((ret = mbedtls_internal_sha1_process(ctx, input)) != 0) { + return ret; + } + + input += 64; + ilen -= 64; + } + + if (ilen > 0) { + memcpy((void *) (ctx->buffer + left), input, ilen); + } + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha1_update(mbedtls_sha1_context *ctx, + const unsigned char *input, + size_t ilen) +{ + mbedtls_sha1_update_ret(ctx, input, ilen); +} +#endif + +/* + * SHA-1 final digest + */ +int mbedtls_sha1_finish_ret(mbedtls_sha1_context *ctx, + unsigned char output[20]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + uint32_t used; + uint32_t high, low; + + SHA1_VALIDATE_RET(ctx != NULL); + SHA1_VALIDATE_RET((unsigned char *) output != NULL); + + /* + * Add padding: 0x80 then 0x00 until 8 bytes remain for the length + */ + used = ctx->total[0] & 0x3F; + + ctx->buffer[used++] = 0x80; + + if (used <= 56) { + /* Enough room for padding + length in current block */ + memset(ctx->buffer + used, 0, 56 - used); + } else { + /* We'll need an extra block */ + memset(ctx->buffer + used, 0, 64 - used); + + if ((ret = mbedtls_internal_sha1_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + memset(ctx->buffer, 0, 56); + } + + /* + * Add message length + */ + high = (ctx->total[0] >> 29) + | (ctx->total[1] << 3); + low = (ctx->total[0] << 3); + + MBEDTLS_PUT_UINT32_BE(high, ctx->buffer, 56); + MBEDTLS_PUT_UINT32_BE(low, ctx->buffer, 60); + + if ((ret = mbedtls_internal_sha1_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + /* + * Output final state + */ + MBEDTLS_PUT_UINT32_BE(ctx->state[0], output, 0); + MBEDTLS_PUT_UINT32_BE(ctx->state[1], output, 4); + MBEDTLS_PUT_UINT32_BE(ctx->state[2], output, 8); + MBEDTLS_PUT_UINT32_BE(ctx->state[3], output, 12); + MBEDTLS_PUT_UINT32_BE(ctx->state[4], output, 16); + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha1_finish(mbedtls_sha1_context *ctx, + unsigned char output[20]) +{ + mbedtls_sha1_finish_ret(ctx, output); +} +#endif + +#endif /* !MBEDTLS_SHA1_ALT */ + +/* + * output = SHA-1( input buffer ) + */ +int mbedtls_sha1_ret(const unsigned char *input, + size_t ilen, + unsigned char output[20]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_sha1_context ctx; + + SHA1_VALIDATE_RET(ilen == 0 || input != NULL); + SHA1_VALIDATE_RET((unsigned char *) output != NULL); + + mbedtls_sha1_init(&ctx); + + if ((ret = mbedtls_sha1_starts_ret(&ctx)) != 0) { + goto exit; + } + + if ((ret = mbedtls_sha1_update_ret(&ctx, input, ilen)) != 0) { + goto exit; + } + + if ((ret = mbedtls_sha1_finish_ret(&ctx, output)) != 0) { + goto exit; + } + +exit: + mbedtls_sha1_free(&ctx); + + return ret; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha1(const unsigned char *input, + size_t ilen, + unsigned char output[20]) +{ + mbedtls_sha1_ret(input, ilen, output); +} +#endif + +#if defined(MBEDTLS_SELF_TEST) +/* + * FIPS-180-1 test vectors + */ +static const unsigned char sha1_test_buf[3][57] = +{ + { "abc" }, + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, + { "" } +}; + +static const size_t sha1_test_buflen[3] = +{ + 3, 56, 1000 +}; + +static const unsigned char sha1_test_sum[3][20] = +{ + { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E, + 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D }, + { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE, + 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 }, + { 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E, + 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F } +}; + +/* + * Checkup routine + */ +int mbedtls_sha1_self_test(int verbose) +{ + int i, j, buflen, ret = 0; + unsigned char buf[1024]; + unsigned char sha1sum[20]; + mbedtls_sha1_context ctx; + + mbedtls_sha1_init(&ctx); + + /* + * SHA-1 + */ + for (i = 0; i < 3; i++) { + if (verbose != 0) { + mbedtls_printf(" SHA-1 test #%d: ", i + 1); + } + + if ((ret = mbedtls_sha1_starts_ret(&ctx)) != 0) { + goto fail; + } + + if (i == 2) { + memset(buf, 'a', buflen = 1000); + + for (j = 0; j < 1000; j++) { + ret = mbedtls_sha1_update_ret(&ctx, buf, buflen); + if (ret != 0) { + goto fail; + } + } + } else { + ret = mbedtls_sha1_update_ret(&ctx, sha1_test_buf[i], + sha1_test_buflen[i]); + if (ret != 0) { + goto fail; + } + } + + if ((ret = mbedtls_sha1_finish_ret(&ctx, sha1sum)) != 0) { + goto fail; + } + + if (memcmp(sha1sum, sha1_test_sum[i], 20) != 0) { + ret = 1; + goto fail; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + goto exit; + +fail: + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + +exit: + mbedtls_sha1_free(&ctx); + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_SHA1_C */ diff --git a/ext/opcua_client/mbedtls/library/sha256.c b/ext/opcua_client/mbedtls/library/sha256.c new file mode 100644 index 0000000..74f3236 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/sha256.c @@ -0,0 +1,569 @@ +/* + * FIPS-180-2 compliant SHA-256 implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The SHA-256 Secure Hash Standard was published by NIST in 2002. + * + * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf + */ + +#include "common.h" + +#if defined(MBEDTLS_SHA256_C) + +#include "mbedtls/sha256.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#include + +#include "mbedtls/platform.h" + +#define SHA256_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA) +#define SHA256_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE(cond) + +#if !defined(MBEDTLS_SHA256_ALT) + +void mbedtls_sha256_init(mbedtls_sha256_context *ctx) +{ + SHA256_VALIDATE(ctx != NULL); + + memset(ctx, 0, sizeof(mbedtls_sha256_context)); +} + +void mbedtls_sha256_free(mbedtls_sha256_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_sha256_context)); +} + +void mbedtls_sha256_clone(mbedtls_sha256_context *dst, + const mbedtls_sha256_context *src) +{ + SHA256_VALIDATE(dst != NULL); + SHA256_VALIDATE(src != NULL); + + *dst = *src; +} + +/* + * SHA-256 context setup + */ +int mbedtls_sha256_starts_ret(mbedtls_sha256_context *ctx, int is224) +{ + SHA256_VALIDATE_RET(ctx != NULL); + SHA256_VALIDATE_RET(is224 == 0 || is224 == 1); + + ctx->total[0] = 0; + ctx->total[1] = 0; + + if (is224 == 0) { + /* SHA-256 */ + ctx->state[0] = 0x6A09E667; + ctx->state[1] = 0xBB67AE85; + ctx->state[2] = 0x3C6EF372; + ctx->state[3] = 0xA54FF53A; + ctx->state[4] = 0x510E527F; + ctx->state[5] = 0x9B05688C; + ctx->state[6] = 0x1F83D9AB; + ctx->state[7] = 0x5BE0CD19; + } else { + /* SHA-224 */ + ctx->state[0] = 0xC1059ED8; + ctx->state[1] = 0x367CD507; + ctx->state[2] = 0x3070DD17; + ctx->state[3] = 0xF70E5939; + ctx->state[4] = 0xFFC00B31; + ctx->state[5] = 0x68581511; + ctx->state[6] = 0x64F98FA7; + ctx->state[7] = 0xBEFA4FA4; + } + + ctx->is224 = is224; + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha256_starts(mbedtls_sha256_context *ctx, + int is224) +{ + mbedtls_sha256_starts_ret(ctx, is224); +} +#endif + +#if !defined(MBEDTLS_SHA256_PROCESS_ALT) +static const uint32_t K[] = +{ + 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, + 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, + 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, + 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, + 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, + 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, + 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, + 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, + 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, + 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, + 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, + 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, + 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, + 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, + 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, + 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2, +}; + +#define SHR(x, n) (((x) & 0xFFFFFFFF) >> (n)) +#define ROTR(x, n) (SHR(x, n) | ((x) << (32 - (n)))) + +#define S0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) +#define S1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) + +#define S2(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) +#define S3(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) + +#define F0(x, y, z) (((x) & (y)) | ((z) & ((x) | (y)))) +#define F1(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) + +#define R(t) \ + ( \ + local.W[t] = S1(local.W[(t) - 2]) + local.W[(t) - 7] + \ + S0(local.W[(t) - 15]) + local.W[(t) - 16] \ + ) + +#define P(a, b, c, d, e, f, g, h, x, K) \ + do \ + { \ + local.temp1 = (h) + S3(e) + F1((e), (f), (g)) + (K) + (x); \ + local.temp2 = S2(a) + F0((a), (b), (c)); \ + (d) += local.temp1; (h) = local.temp1 + local.temp2; \ + } while (0) + +int mbedtls_internal_sha256_process(mbedtls_sha256_context *ctx, + const unsigned char data[64]) +{ + struct { + uint32_t temp1, temp2, W[64]; + uint32_t A[8]; + } local; + + unsigned int i; + + SHA256_VALIDATE_RET(ctx != NULL); + SHA256_VALIDATE_RET((const unsigned char *) data != NULL); + + for (i = 0; i < 8; i++) { + local.A[i] = ctx->state[i]; + } + +#if defined(MBEDTLS_SHA256_SMALLER) + for (i = 0; i < 64; i++) { + if (i < 16) { + local.W[i] = MBEDTLS_GET_UINT32_BE(data, 4 * i); + } else { + R(i); + } + + P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4], + local.A[5], local.A[6], local.A[7], local.W[i], K[i]); + + local.temp1 = local.A[7]; local.A[7] = local.A[6]; + local.A[6] = local.A[5]; local.A[5] = local.A[4]; + local.A[4] = local.A[3]; local.A[3] = local.A[2]; + local.A[2] = local.A[1]; local.A[1] = local.A[0]; + local.A[0] = local.temp1; + } +#else /* MBEDTLS_SHA256_SMALLER */ + for (i = 0; i < 16; i++) { + local.W[i] = MBEDTLS_GET_UINT32_BE(data, 4 * i); + } + + for (i = 0; i < 16; i += 8) { + P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4], + local.A[5], local.A[6], local.A[7], local.W[i+0], K[i+0]); + P(local.A[7], local.A[0], local.A[1], local.A[2], local.A[3], + local.A[4], local.A[5], local.A[6], local.W[i+1], K[i+1]); + P(local.A[6], local.A[7], local.A[0], local.A[1], local.A[2], + local.A[3], local.A[4], local.A[5], local.W[i+2], K[i+2]); + P(local.A[5], local.A[6], local.A[7], local.A[0], local.A[1], + local.A[2], local.A[3], local.A[4], local.W[i+3], K[i+3]); + P(local.A[4], local.A[5], local.A[6], local.A[7], local.A[0], + local.A[1], local.A[2], local.A[3], local.W[i+4], K[i+4]); + P(local.A[3], local.A[4], local.A[5], local.A[6], local.A[7], + local.A[0], local.A[1], local.A[2], local.W[i+5], K[i+5]); + P(local.A[2], local.A[3], local.A[4], local.A[5], local.A[6], + local.A[7], local.A[0], local.A[1], local.W[i+6], K[i+6]); + P(local.A[1], local.A[2], local.A[3], local.A[4], local.A[5], + local.A[6], local.A[7], local.A[0], local.W[i+7], K[i+7]); + } + + for (i = 16; i < 64; i += 8) { + P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4], + local.A[5], local.A[6], local.A[7], R(i+0), K[i+0]); + P(local.A[7], local.A[0], local.A[1], local.A[2], local.A[3], + local.A[4], local.A[5], local.A[6], R(i+1), K[i+1]); + P(local.A[6], local.A[7], local.A[0], local.A[1], local.A[2], + local.A[3], local.A[4], local.A[5], R(i+2), K[i+2]); + P(local.A[5], local.A[6], local.A[7], local.A[0], local.A[1], + local.A[2], local.A[3], local.A[4], R(i+3), K[i+3]); + P(local.A[4], local.A[5], local.A[6], local.A[7], local.A[0], + local.A[1], local.A[2], local.A[3], R(i+4), K[i+4]); + P(local.A[3], local.A[4], local.A[5], local.A[6], local.A[7], + local.A[0], local.A[1], local.A[2], R(i+5), K[i+5]); + P(local.A[2], local.A[3], local.A[4], local.A[5], local.A[6], + local.A[7], local.A[0], local.A[1], R(i+6), K[i+6]); + P(local.A[1], local.A[2], local.A[3], local.A[4], local.A[5], + local.A[6], local.A[7], local.A[0], R(i+7), K[i+7]); + } +#endif /* MBEDTLS_SHA256_SMALLER */ + + for (i = 0; i < 8; i++) { + ctx->state[i] += local.A[i]; + } + + /* Zeroise buffers and variables to clear sensitive data from memory. */ + mbedtls_platform_zeroize(&local, sizeof(local)); + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha256_process(mbedtls_sha256_context *ctx, + const unsigned char data[64]) +{ + mbedtls_internal_sha256_process(ctx, data); +} +#endif +#endif /* !MBEDTLS_SHA256_PROCESS_ALT */ + +/* + * SHA-256 process buffer + */ +int mbedtls_sha256_update_ret(mbedtls_sha256_context *ctx, + const unsigned char *input, + size_t ilen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t fill; + uint32_t left; + + SHA256_VALIDATE_RET(ctx != NULL); + SHA256_VALIDATE_RET(ilen == 0 || input != NULL); + + if (ilen == 0) { + return 0; + } + + left = ctx->total[0] & 0x3F; + fill = 64 - left; + + ctx->total[0] += (uint32_t) ilen; + ctx->total[0] &= 0xFFFFFFFF; + + if (ctx->total[0] < (uint32_t) ilen) { + ctx->total[1]++; + } + + if (left && ilen >= fill) { + memcpy((void *) (ctx->buffer + left), input, fill); + + if ((ret = mbedtls_internal_sha256_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + input += fill; + ilen -= fill; + left = 0; + } + + while (ilen >= 64) { + if ((ret = mbedtls_internal_sha256_process(ctx, input)) != 0) { + return ret; + } + + input += 64; + ilen -= 64; + } + + if (ilen > 0) { + memcpy((void *) (ctx->buffer + left), input, ilen); + } + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha256_update(mbedtls_sha256_context *ctx, + const unsigned char *input, + size_t ilen) +{ + mbedtls_sha256_update_ret(ctx, input, ilen); +} +#endif + +/* + * SHA-256 final digest + */ +int mbedtls_sha256_finish_ret(mbedtls_sha256_context *ctx, + unsigned char output[32]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + uint32_t used; + uint32_t high, low; + + SHA256_VALIDATE_RET(ctx != NULL); + SHA256_VALIDATE_RET((unsigned char *) output != NULL); + + /* + * Add padding: 0x80 then 0x00 until 8 bytes remain for the length + */ + used = ctx->total[0] & 0x3F; + + ctx->buffer[used++] = 0x80; + + if (used <= 56) { + /* Enough room for padding + length in current block */ + memset(ctx->buffer + used, 0, 56 - used); + } else { + /* We'll need an extra block */ + memset(ctx->buffer + used, 0, 64 - used); + + if ((ret = mbedtls_internal_sha256_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + memset(ctx->buffer, 0, 56); + } + + /* + * Add message length + */ + high = (ctx->total[0] >> 29) + | (ctx->total[1] << 3); + low = (ctx->total[0] << 3); + + MBEDTLS_PUT_UINT32_BE(high, ctx->buffer, 56); + MBEDTLS_PUT_UINT32_BE(low, ctx->buffer, 60); + + if ((ret = mbedtls_internal_sha256_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + /* + * Output final state + */ + MBEDTLS_PUT_UINT32_BE(ctx->state[0], output, 0); + MBEDTLS_PUT_UINT32_BE(ctx->state[1], output, 4); + MBEDTLS_PUT_UINT32_BE(ctx->state[2], output, 8); + MBEDTLS_PUT_UINT32_BE(ctx->state[3], output, 12); + MBEDTLS_PUT_UINT32_BE(ctx->state[4], output, 16); + MBEDTLS_PUT_UINT32_BE(ctx->state[5], output, 20); + MBEDTLS_PUT_UINT32_BE(ctx->state[6], output, 24); + + if (ctx->is224 == 0) { + MBEDTLS_PUT_UINT32_BE(ctx->state[7], output, 28); + } + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha256_finish(mbedtls_sha256_context *ctx, + unsigned char output[32]) +{ + mbedtls_sha256_finish_ret(ctx, output); +} +#endif + +#endif /* !MBEDTLS_SHA256_ALT */ + +/* + * output = SHA-256( input buffer ) + */ +int mbedtls_sha256_ret(const unsigned char *input, + size_t ilen, + unsigned char output[32], + int is224) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_sha256_context ctx; + + SHA256_VALIDATE_RET(is224 == 0 || is224 == 1); + SHA256_VALIDATE_RET(ilen == 0 || input != NULL); + SHA256_VALIDATE_RET((unsigned char *) output != NULL); + + mbedtls_sha256_init(&ctx); + + if ((ret = mbedtls_sha256_starts_ret(&ctx, is224)) != 0) { + goto exit; + } + + if ((ret = mbedtls_sha256_update_ret(&ctx, input, ilen)) != 0) { + goto exit; + } + + if ((ret = mbedtls_sha256_finish_ret(&ctx, output)) != 0) { + goto exit; + } + +exit: + mbedtls_sha256_free(&ctx); + + return ret; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha256(const unsigned char *input, + size_t ilen, + unsigned char output[32], + int is224) +{ + mbedtls_sha256_ret(input, ilen, output, is224); +} +#endif + +#if defined(MBEDTLS_SELF_TEST) +/* + * FIPS-180-2 test vectors + */ +static const unsigned char sha256_test_buf[3][57] = +{ + { "abc" }, + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, + { "" } +}; + +static const size_t sha256_test_buflen[3] = +{ + 3, 56, 1000 +}; + +static const unsigned char sha256_test_sum[6][32] = +{ + /* + * SHA-224 test vectors + */ + { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22, + 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3, + 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7, + 0xE3, 0x6C, 0x9D, 0xA7 }, + { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC, + 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50, + 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19, + 0x52, 0x52, 0x25, 0x25 }, + { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8, + 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B, + 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE, + 0x4E, 0xE7, 0xAD, 0x67 }, + + /* + * SHA-256 test vectors + */ + { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA, + 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23, + 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C, + 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD }, + { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8, + 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39, + 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67, + 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 }, + { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92, + 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67, + 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E, + 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 } +}; + +/* + * Checkup routine + */ +int mbedtls_sha256_self_test(int verbose) +{ + int i, j, k, buflen, ret = 0; + unsigned char *buf; + unsigned char sha256sum[32]; + mbedtls_sha256_context ctx; + + buf = mbedtls_calloc(1024, sizeof(unsigned char)); + if (NULL == buf) { + if (verbose != 0) { + mbedtls_printf("Buffer allocation failed\n"); + } + + return 1; + } + + mbedtls_sha256_init(&ctx); + + for (i = 0; i < 6; i++) { + j = i % 3; + k = i < 3; + + if (verbose != 0) { + mbedtls_printf(" SHA-%d test #%d: ", 256 - k * 32, j + 1); + } + + if ((ret = mbedtls_sha256_starts_ret(&ctx, k)) != 0) { + goto fail; + } + + if (j == 2) { + memset(buf, 'a', buflen = 1000); + + for (j = 0; j < 1000; j++) { + ret = mbedtls_sha256_update_ret(&ctx, buf, buflen); + if (ret != 0) { + goto fail; + } + } + + } else { + ret = mbedtls_sha256_update_ret(&ctx, sha256_test_buf[j], + sha256_test_buflen[j]); + if (ret != 0) { + goto fail; + } + } + + if ((ret = mbedtls_sha256_finish_ret(&ctx, sha256sum)) != 0) { + goto fail; + } + + + if (memcmp(sha256sum, sha256_test_sum[i], 32 - k * 4) != 0) { + ret = 1; + goto fail; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + goto exit; + +fail: + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + +exit: + mbedtls_sha256_free(&ctx); + mbedtls_free(buf); + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_SHA256_C */ diff --git a/ext/opcua_client/mbedtls/library/sha512.c b/ext/opcua_client/mbedtls/library/sha512.c new file mode 100644 index 0000000..77bdc2e --- /dev/null +++ b/ext/opcua_client/mbedtls/library/sha512.c @@ -0,0 +1,639 @@ +/* + * FIPS-180-2 compliant SHA-384/512 implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The SHA-512 Secure Hash Standard was published by NIST in 2002. + * + * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf + */ + +#include "common.h" + +#if defined(MBEDTLS_SHA512_C) + +#include "mbedtls/sha512.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/error.h" + +#if defined(_MSC_VER) || defined(__WATCOMC__) + #define UL64(x) x##ui64 +#else + #define UL64(x) x##ULL +#endif + +#include + +#include "mbedtls/platform.h" + +#define SHA512_VALIDATE_RET(cond) \ + MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_SHA512_BAD_INPUT_DATA) +#define SHA512_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE(cond) + +#if !defined(MBEDTLS_SHA512_ALT) + +#if defined(MBEDTLS_SHA512_SMALLER) +static void sha512_put_uint64_be(uint64_t n, unsigned char *b, uint8_t i) +{ + MBEDTLS_PUT_UINT64_BE(n, b, i); +} +#else +#define sha512_put_uint64_be MBEDTLS_PUT_UINT64_BE +#endif /* MBEDTLS_SHA512_SMALLER */ + +void mbedtls_sha512_init(mbedtls_sha512_context *ctx) +{ + SHA512_VALIDATE(ctx != NULL); + + memset(ctx, 0, sizeof(mbedtls_sha512_context)); +} + +void mbedtls_sha512_free(mbedtls_sha512_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_sha512_context)); +} + +void mbedtls_sha512_clone(mbedtls_sha512_context *dst, + const mbedtls_sha512_context *src) +{ + SHA512_VALIDATE(dst != NULL); + SHA512_VALIDATE(src != NULL); + + *dst = *src; +} + +/* + * SHA-512 context setup + */ +int mbedtls_sha512_starts_ret(mbedtls_sha512_context *ctx, int is384) +{ + SHA512_VALIDATE_RET(ctx != NULL); +#if !defined(MBEDTLS_SHA512_NO_SHA384) + SHA512_VALIDATE_RET(is384 == 0 || is384 == 1); +#else + SHA512_VALIDATE_RET(is384 == 0); +#endif + + ctx->total[0] = 0; + ctx->total[1] = 0; + + if (is384 == 0) { + /* SHA-512 */ + ctx->state[0] = UL64(0x6A09E667F3BCC908); + ctx->state[1] = UL64(0xBB67AE8584CAA73B); + ctx->state[2] = UL64(0x3C6EF372FE94F82B); + ctx->state[3] = UL64(0xA54FF53A5F1D36F1); + ctx->state[4] = UL64(0x510E527FADE682D1); + ctx->state[5] = UL64(0x9B05688C2B3E6C1F); + ctx->state[6] = UL64(0x1F83D9ABFB41BD6B); + ctx->state[7] = UL64(0x5BE0CD19137E2179); + } else { +#if defined(MBEDTLS_SHA512_NO_SHA384) + return MBEDTLS_ERR_SHA512_BAD_INPUT_DATA; +#else + /* SHA-384 */ + ctx->state[0] = UL64(0xCBBB9D5DC1059ED8); + ctx->state[1] = UL64(0x629A292A367CD507); + ctx->state[2] = UL64(0x9159015A3070DD17); + ctx->state[3] = UL64(0x152FECD8F70E5939); + ctx->state[4] = UL64(0x67332667FFC00B31); + ctx->state[5] = UL64(0x8EB44A8768581511); + ctx->state[6] = UL64(0xDB0C2E0D64F98FA7); + ctx->state[7] = UL64(0x47B5481DBEFA4FA4); +#endif /* MBEDTLS_SHA512_NO_SHA384 */ + } + +#if !defined(MBEDTLS_SHA512_NO_SHA384) + ctx->is384 = is384; +#endif + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha512_starts(mbedtls_sha512_context *ctx, + int is384) +{ + mbedtls_sha512_starts_ret(ctx, is384); +} +#endif + +#if !defined(MBEDTLS_SHA512_PROCESS_ALT) + +/* + * Round constants + */ +static const uint64_t K[80] = +{ + UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD), + UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC), + UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019), + UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118), + UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE), + UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2), + UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1), + UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694), + UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3), + UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65), + UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483), + UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5), + UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210), + UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4), + UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725), + UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70), + UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926), + UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF), + UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8), + UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B), + UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001), + UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30), + UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910), + UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8), + UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53), + UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8), + UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB), + UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3), + UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60), + UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC), + UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9), + UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B), + UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207), + UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178), + UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6), + UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B), + UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493), + UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C), + UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A), + UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817) +}; + +int mbedtls_internal_sha512_process(mbedtls_sha512_context *ctx, + const unsigned char data[128]) +{ + int i; + struct { + uint64_t temp1, temp2, W[80]; + uint64_t A[8]; + } local; + + SHA512_VALIDATE_RET(ctx != NULL); + SHA512_VALIDATE_RET((const unsigned char *) data != NULL); + +#define SHR(x, n) ((x) >> (n)) +#define ROTR(x, n) (SHR((x), (n)) | ((x) << (64 - (n)))) + +#define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7)) +#define S1(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6)) + +#define S2(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39)) +#define S3(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41)) + +#define F0(x, y, z) (((x) & (y)) | ((z) & ((x) | (y)))) +#define F1(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) + +#define P(a, b, c, d, e, f, g, h, x, K) \ + do \ + { \ + local.temp1 = (h) + S3(e) + F1((e), (f), (g)) + (K) + (x); \ + local.temp2 = S2(a) + F0((a), (b), (c)); \ + (d) += local.temp1; (h) = local.temp1 + local.temp2; \ + } while (0) + + for (i = 0; i < 8; i++) { + local.A[i] = ctx->state[i]; + } + +#if defined(MBEDTLS_SHA512_SMALLER) + for (i = 0; i < 80; i++) { + if (i < 16) { + local.W[i] = MBEDTLS_GET_UINT64_BE(data, i << 3); + } else { + local.W[i] = S1(local.W[i - 2]) + local.W[i - 7] + + S0(local.W[i - 15]) + local.W[i - 16]; + } + + P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4], + local.A[5], local.A[6], local.A[7], local.W[i], K[i]); + + local.temp1 = local.A[7]; local.A[7] = local.A[6]; + local.A[6] = local.A[5]; local.A[5] = local.A[4]; + local.A[4] = local.A[3]; local.A[3] = local.A[2]; + local.A[2] = local.A[1]; local.A[1] = local.A[0]; + local.A[0] = local.temp1; + } +#else /* MBEDTLS_SHA512_SMALLER */ + for (i = 0; i < 16; i++) { + local.W[i] = MBEDTLS_GET_UINT64_BE(data, i << 3); + } + + for (; i < 80; i++) { + local.W[i] = S1(local.W[i - 2]) + local.W[i - 7] + + S0(local.W[i - 15]) + local.W[i - 16]; + } + + i = 0; + do { + P(local.A[0], local.A[1], local.A[2], local.A[3], local.A[4], + local.A[5], local.A[6], local.A[7], local.W[i], K[i]); i++; + P(local.A[7], local.A[0], local.A[1], local.A[2], local.A[3], + local.A[4], local.A[5], local.A[6], local.W[i], K[i]); i++; + P(local.A[6], local.A[7], local.A[0], local.A[1], local.A[2], + local.A[3], local.A[4], local.A[5], local.W[i], K[i]); i++; + P(local.A[5], local.A[6], local.A[7], local.A[0], local.A[1], + local.A[2], local.A[3], local.A[4], local.W[i], K[i]); i++; + P(local.A[4], local.A[5], local.A[6], local.A[7], local.A[0], + local.A[1], local.A[2], local.A[3], local.W[i], K[i]); i++; + P(local.A[3], local.A[4], local.A[5], local.A[6], local.A[7], + local.A[0], local.A[1], local.A[2], local.W[i], K[i]); i++; + P(local.A[2], local.A[3], local.A[4], local.A[5], local.A[6], + local.A[7], local.A[0], local.A[1], local.W[i], K[i]); i++; + P(local.A[1], local.A[2], local.A[3], local.A[4], local.A[5], + local.A[6], local.A[7], local.A[0], local.W[i], K[i]); i++; + } while (i < 80); +#endif /* MBEDTLS_SHA512_SMALLER */ + + for (i = 0; i < 8; i++) { + ctx->state[i] += local.A[i]; + } + + /* Zeroise buffers and variables to clear sensitive data from memory. */ + mbedtls_platform_zeroize(&local, sizeof(local)); + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha512_process(mbedtls_sha512_context *ctx, + const unsigned char data[128]) +{ + mbedtls_internal_sha512_process(ctx, data); +} +#endif +#endif /* !MBEDTLS_SHA512_PROCESS_ALT */ + +/* + * SHA-512 process buffer + */ +int mbedtls_sha512_update_ret(mbedtls_sha512_context *ctx, + const unsigned char *input, + size_t ilen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t fill; + unsigned int left; + + SHA512_VALIDATE_RET(ctx != NULL); + SHA512_VALIDATE_RET(ilen == 0 || input != NULL); + + if (ilen == 0) { + return 0; + } + + left = (unsigned int) (ctx->total[0] & 0x7F); + fill = 128 - left; + + ctx->total[0] += (uint64_t) ilen; + + if (ctx->total[0] < (uint64_t) ilen) { + ctx->total[1]++; + } + + if (left && ilen >= fill) { + memcpy((void *) (ctx->buffer + left), input, fill); + + if ((ret = mbedtls_internal_sha512_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + input += fill; + ilen -= fill; + left = 0; + } + + while (ilen >= 128) { + if ((ret = mbedtls_internal_sha512_process(ctx, input)) != 0) { + return ret; + } + + input += 128; + ilen -= 128; + } + + if (ilen > 0) { + memcpy((void *) (ctx->buffer + left), input, ilen); + } + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha512_update(mbedtls_sha512_context *ctx, + const unsigned char *input, + size_t ilen) +{ + mbedtls_sha512_update_ret(ctx, input, ilen); +} +#endif + +/* + * SHA-512 final digest + */ +int mbedtls_sha512_finish_ret(mbedtls_sha512_context *ctx, + unsigned char output[64]) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned used; + uint64_t high, low; + + SHA512_VALIDATE_RET(ctx != NULL); + SHA512_VALIDATE_RET((unsigned char *) output != NULL); + + /* + * Add padding: 0x80 then 0x00 until 16 bytes remain for the length + */ + used = ctx->total[0] & 0x7F; + + ctx->buffer[used++] = 0x80; + + if (used <= 112) { + /* Enough room for padding + length in current block */ + memset(ctx->buffer + used, 0, 112 - used); + } else { + /* We'll need an extra block */ + memset(ctx->buffer + used, 0, 128 - used); + + if ((ret = mbedtls_internal_sha512_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + memset(ctx->buffer, 0, 112); + } + + /* + * Add message length + */ + high = (ctx->total[0] >> 61) + | (ctx->total[1] << 3); + low = (ctx->total[0] << 3); + + sha512_put_uint64_be(high, ctx->buffer, 112); + sha512_put_uint64_be(low, ctx->buffer, 120); + + if ((ret = mbedtls_internal_sha512_process(ctx, ctx->buffer)) != 0) { + return ret; + } + + /* + * Output final state + */ + sha512_put_uint64_be(ctx->state[0], output, 0); + sha512_put_uint64_be(ctx->state[1], output, 8); + sha512_put_uint64_be(ctx->state[2], output, 16); + sha512_put_uint64_be(ctx->state[3], output, 24); + sha512_put_uint64_be(ctx->state[4], output, 32); + sha512_put_uint64_be(ctx->state[5], output, 40); + + int truncated = 0; +#if !defined(MBEDTLS_SHA512_NO_SHA384) + truncated = ctx->is384; +#endif + if (!truncated) { + sha512_put_uint64_be(ctx->state[6], output, 48); + sha512_put_uint64_be(ctx->state[7], output, 56); + } + + return 0; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha512_finish(mbedtls_sha512_context *ctx, + unsigned char output[64]) +{ + mbedtls_sha512_finish_ret(ctx, output); +} +#endif + +#endif /* !MBEDTLS_SHA512_ALT */ + +/* + * output = SHA-512( input buffer ) + */ +int mbedtls_sha512_ret(const unsigned char *input, + size_t ilen, + unsigned char output[64], + int is384) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_sha512_context ctx; + +#if !defined(MBEDTLS_SHA512_NO_SHA384) + SHA512_VALIDATE_RET(is384 == 0 || is384 == 1); +#else + SHA512_VALIDATE_RET(is384 == 0); +#endif + SHA512_VALIDATE_RET(ilen == 0 || input != NULL); + SHA512_VALIDATE_RET((unsigned char *) output != NULL); + + mbedtls_sha512_init(&ctx); + + if ((ret = mbedtls_sha512_starts_ret(&ctx, is384)) != 0) { + goto exit; + } + + if ((ret = mbedtls_sha512_update_ret(&ctx, input, ilen)) != 0) { + goto exit; + } + + if ((ret = mbedtls_sha512_finish_ret(&ctx, output)) != 0) { + goto exit; + } + +exit: + mbedtls_sha512_free(&ctx); + + return ret; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +void mbedtls_sha512(const unsigned char *input, + size_t ilen, + unsigned char output[64], + int is384) +{ + mbedtls_sha512_ret(input, ilen, output, is384); +} +#endif + +#if defined(MBEDTLS_SELF_TEST) + +/* + * FIPS-180-2 test vectors + */ +static const unsigned char sha512_test_buf[3][113] = +{ + { "abc" }, + { + "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" + }, + { "" } +}; + +static const size_t sha512_test_buflen[3] = +{ + 3, 112, 1000 +}; + +static const unsigned char sha512_test_sum[][64] = +{ +#if !defined(MBEDTLS_SHA512_NO_SHA384) + /* + * SHA-384 test vectors + */ + { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B, + 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07, + 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63, + 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED, + 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23, + 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 }, + { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8, + 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47, + 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2, + 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12, + 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9, + 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 }, + { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB, + 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C, + 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52, + 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B, + 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB, + 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 }, +#endif /* !MBEDTLS_SHA512_NO_SHA384 */ + + /* + * SHA-512 test vectors + */ + { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA, + 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31, + 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2, + 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A, + 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8, + 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD, + 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E, + 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F }, + { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA, + 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F, + 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1, + 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18, + 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4, + 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A, + 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54, + 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 }, + { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64, + 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63, + 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28, + 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB, + 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A, + 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B, + 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E, + 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B } +}; + +#define ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0])) + +/* + * Checkup routine + */ +int mbedtls_sha512_self_test(int verbose) +{ + int i, j, k, buflen, ret = 0; + unsigned char *buf; + unsigned char sha512sum[64]; + mbedtls_sha512_context ctx; + + buf = mbedtls_calloc(1024, sizeof(unsigned char)); + if (NULL == buf) { + if (verbose != 0) { + mbedtls_printf("Buffer allocation failed\n"); + } + + return 1; + } + + mbedtls_sha512_init(&ctx); + + for (i = 0; i < (int) ARRAY_LENGTH(sha512_test_sum); i++) { + j = i % 3; +#if !defined(MBEDTLS_SHA512_NO_SHA384) + k = i < 3; +#else + k = 0; +#endif + + if (verbose != 0) { + mbedtls_printf(" SHA-%d test #%d: ", 512 - k * 128, j + 1); + } + + if ((ret = mbedtls_sha512_starts_ret(&ctx, k)) != 0) { + goto fail; + } + + if (j == 2) { + memset(buf, 'a', buflen = 1000); + + for (j = 0; j < 1000; j++) { + ret = mbedtls_sha512_update_ret(&ctx, buf, buflen); + if (ret != 0) { + goto fail; + } + } + } else { + ret = mbedtls_sha512_update_ret(&ctx, sha512_test_buf[j], + sha512_test_buflen[j]); + if (ret != 0) { + goto fail; + } + } + + if ((ret = mbedtls_sha512_finish_ret(&ctx, sha512sum)) != 0) { + goto fail; + } + + if (memcmp(sha512sum, sha512_test_sum[i], 64 - k * 16) != 0) { + ret = 1; + goto fail; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + goto exit; + +fail: + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + +exit: + mbedtls_sha512_free(&ctx); + mbedtls_free(buf); + + return ret; +} + +#undef ARRAY_LENGTH + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_SHA512_C */ diff --git a/ext/opcua_client/mbedtls/library/ssl_cache.c b/ext/opcua_client/mbedtls/library/ssl_cache.c new file mode 100644 index 0000000..21e38cd --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ssl_cache.c @@ -0,0 +1,317 @@ +/* + * SSL session cache implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * These session callbacks use a simple chained list + * to store and retrieve the session information. + */ + +#include "common.h" + +#if defined(MBEDTLS_SSL_CACHE_C) + +#include "mbedtls/platform.h" +#include "mbedtls/error.h" + +#include "mbedtls/ssl_cache.h" +#include "mbedtls/ssl_internal.h" + +#include + +void mbedtls_ssl_cache_init(mbedtls_ssl_cache_context *cache) +{ + memset(cache, 0, sizeof(mbedtls_ssl_cache_context)); + + cache->timeout = MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT; + cache->max_entries = MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES; + +#if defined(MBEDTLS_THREADING_C) + mbedtls_mutex_init(&cache->mutex); +#endif +} + +int mbedtls_ssl_cache_get(void *data, mbedtls_ssl_session *session) +{ + int ret = MBEDTLS_ERR_SSL_CACHE_ENTRY_NOT_FOUND; +#if defined(MBEDTLS_HAVE_TIME) + mbedtls_time_t t = mbedtls_time(NULL); +#endif + mbedtls_ssl_cache_context *cache = (mbedtls_ssl_cache_context *) data; + mbedtls_ssl_cache_entry *cur, *entry; + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&cache->mutex)) != 0) { + return ret; + } +#endif + + cur = cache->chain; + entry = NULL; + + while (cur != NULL) { + entry = cur; + cur = cur->next; + +#if defined(MBEDTLS_HAVE_TIME) + if (cache->timeout != 0 && + (int) (t - entry->timestamp) > cache->timeout) { + continue; + } +#endif + + if (session->id_len != entry->session.id_len || + memcmp(session->id, entry->session.id, + entry->session.id_len) != 0) { + continue; + } + + ret = mbedtls_ssl_session_copy(session, &entry->session); + if (ret != 0) { + goto exit; + } + +#if defined(MBEDTLS_X509_CRT_PARSE_C) && \ + defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + /* + * Restore peer certificate (without rest of the original chain) + */ + if (entry->peer_cert.p != NULL) { + /* `session->peer_cert` is NULL after the call to + * mbedtls_ssl_session_copy(), because cache entries + * have the `peer_cert` field set to NULL. */ + + if ((session->peer_cert = mbedtls_calloc(1, + sizeof(mbedtls_x509_crt))) == NULL) { + ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; + goto exit; + } + + mbedtls_x509_crt_init(session->peer_cert); + if ((ret = mbedtls_x509_crt_parse(session->peer_cert, entry->peer_cert.p, + entry->peer_cert.len)) != 0) { + mbedtls_free(session->peer_cert); + session->peer_cert = NULL; + goto exit; + } + } +#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + + ret = 0; + goto exit; + } + +exit: +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&cache->mutex) != 0) { + ret = MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } +#endif + + return ret; +} + +int mbedtls_ssl_cache_set(void *data, const mbedtls_ssl_session *session) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; +#if defined(MBEDTLS_HAVE_TIME) + mbedtls_time_t t = mbedtls_time(NULL), oldest = 0; + mbedtls_ssl_cache_entry *old = NULL; +#endif + mbedtls_ssl_cache_context *cache = (mbedtls_ssl_cache_context *) data; + mbedtls_ssl_cache_entry *cur, *prv; + int count = 0; + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&cache->mutex)) != 0) { + return ret; + } +#endif + + cur = cache->chain; + prv = NULL; + + while (cur != NULL) { + count++; + +#if defined(MBEDTLS_HAVE_TIME) + if (cache->timeout != 0 && + (int) (t - cur->timestamp) > cache->timeout) { + cur->timestamp = t; + break; /* expired, reuse this slot, update timestamp */ + } +#endif + + if (memcmp(session->id, cur->session.id, cur->session.id_len) == 0) { + break; /* client reconnected, keep timestamp for session id */ + + } +#if defined(MBEDTLS_HAVE_TIME) + if (oldest == 0 || cur->timestamp < oldest) { + oldest = cur->timestamp; + old = cur; + } +#endif + + prv = cur; + cur = cur->next; + } + + if (cur == NULL) { +#if defined(MBEDTLS_HAVE_TIME) + /* + * Reuse oldest entry if max_entries reached + */ + if (count >= cache->max_entries) { + if (old == NULL) { + /* This should only happen on an ill-configured cache + * with max_entries == 0. */ + ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; + goto exit; + } + + cur = old; + } +#else /* MBEDTLS_HAVE_TIME */ + /* + * Reuse first entry in chain if max_entries reached, + * but move to last place + */ + if (count >= cache->max_entries) { + if (cache->chain == NULL) { + ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; + goto exit; + } + + cur = cache->chain; + cache->chain = cur->next; + cur->next = NULL; + prv->next = cur; + } +#endif /* MBEDTLS_HAVE_TIME */ + else { + /* + * max_entries not reached, create new entry + */ + cur = mbedtls_calloc(1, sizeof(mbedtls_ssl_cache_entry)); + if (cur == NULL) { + ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; + goto exit; + } + + if (prv == NULL) { + cache->chain = cur; + } else { + prv->next = cur; + } + } + +#if defined(MBEDTLS_HAVE_TIME) + cur->timestamp = t; +#endif + } + +#if defined(MBEDTLS_X509_CRT_PARSE_C) && \ + defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + /* + * If we're reusing an entry, free its certificate first + */ + if (cur->peer_cert.p != NULL) { + mbedtls_free(cur->peer_cert.p); + memset(&cur->peer_cert, 0, sizeof(mbedtls_x509_buf)); + } +#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + + /* Copy the entire session; this temporarily makes a copy of the + * X.509 CRT structure even though we only want to store the raw CRT. + * This inefficiency will go away as soon as we implement on-demand + * parsing of CRTs, in which case there's no need for the `peer_cert` + * field anymore in the first place, and we're done after this call. */ + ret = mbedtls_ssl_session_copy(&cur->session, session); + if (ret != 0) { + goto exit; + } + +#if defined(MBEDTLS_X509_CRT_PARSE_C) && \ + defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + /* If present, free the X.509 structure and only store the raw CRT data. */ + if (cur->session.peer_cert != NULL) { + cur->peer_cert.p = + mbedtls_calloc(1, cur->session.peer_cert->raw.len); + if (cur->peer_cert.p == NULL) { + ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; + goto exit; + } + + memcpy(cur->peer_cert.p, + cur->session.peer_cert->raw.p, + cur->session.peer_cert->raw.len); + cur->peer_cert.len = session->peer_cert->raw.len; + + mbedtls_x509_crt_free(cur->session.peer_cert); + mbedtls_free(cur->session.peer_cert); + cur->session.peer_cert = NULL; + } +#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + + ret = 0; + +exit: +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&cache->mutex) != 0) { + ret = MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } +#endif + + return ret; +} + +#if defined(MBEDTLS_HAVE_TIME) +void mbedtls_ssl_cache_set_timeout(mbedtls_ssl_cache_context *cache, int timeout) +{ + if (timeout < 0) { + timeout = 0; + } + + cache->timeout = timeout; +} +#endif /* MBEDTLS_HAVE_TIME */ + +void mbedtls_ssl_cache_set_max_entries(mbedtls_ssl_cache_context *cache, int max) +{ + if (max < 0) { + max = 0; + } + + cache->max_entries = max; +} + +void mbedtls_ssl_cache_free(mbedtls_ssl_cache_context *cache) +{ + mbedtls_ssl_cache_entry *cur, *prv; + + cur = cache->chain; + + while (cur != NULL) { + prv = cur; + cur = cur->next; + + mbedtls_ssl_session_free(&prv->session); + +#if defined(MBEDTLS_X509_CRT_PARSE_C) && \ + defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + mbedtls_free(prv->peer_cert.p); +#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + + mbedtls_free(prv); + } + +#if defined(MBEDTLS_THREADING_C) + mbedtls_mutex_free(&cache->mutex); +#endif + cache->chain = NULL; +} + +#endif /* MBEDTLS_SSL_CACHE_C */ diff --git a/ext/opcua_client/mbedtls/library/ssl_ciphersuites.c b/ext/opcua_client/mbedtls/library/ssl_ciphersuites.c new file mode 100644 index 0000000..7a46537 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ssl_ciphersuites.c @@ -0,0 +1,2371 @@ +/** + * \file ssl_ciphersuites.c + * + * \brief SSL ciphersuites for Mbed TLS + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_SSL_TLS_C) + +#include "mbedtls/platform.h" + +#include "mbedtls/ssl_ciphersuites.h" +#include "mbedtls/ssl.h" + +#include + +#undef HAVE_SHA384 +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) +#define HAVE_SHA384 +#endif + +/* + * Ordered from most preferred to least preferred in terms of security. + * + * Current rule (except RC4 and 3DES, weak and null which come last): + * 1. By key exchange: + * Forward-secure non-PSK > forward-secure PSK > ECJPAKE > other non-PSK > other PSK + * 2. By key length and cipher: + * ChaCha > AES-256 > Camellia-256 > ARIA-256 > AES-128 > Camellia-128 > ARIA-128 + * 3. By cipher mode when relevant GCM > CCM > CBC > CCM_8 + * 4. By hash function used when relevant + * 5. By key exchange/auth again: EC > non-EC + */ +static const int ciphersuite_preference[] = +{ +#if defined(MBEDTLS_SSL_CIPHERSUITES) + MBEDTLS_SSL_CIPHERSUITES, +#else + /* Chacha-Poly ephemeral suites */ + MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, + MBEDTLS_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + + /* All AES-256 ephemeral suites */ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM, + MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, + MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8, + + /* All CAMELLIA-256 ephemeral suites */ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, + MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, + MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, + MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384, + MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, + MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, + + /* All ARIA-256 ephemeral suites */ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384, + MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384, + MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384, + MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384, + MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384, + + /* All AES-128 ephemeral suites */ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM, + MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, + MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8, + + /* All CAMELLIA-128 ephemeral suites */ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, + MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, + MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, + MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, + MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, + MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, + + /* All ARIA-128 ephemeral suites */ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256, + MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256, + MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256, + MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256, + MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256, + + /* The PSK ephemeral suites */ + MBEDTLS_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, + MBEDTLS_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256, + MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384, + MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM, + MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384, + MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384, + MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, + MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA, + MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384, + MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, + MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, + MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8, + MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384, + MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384, + MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384, + + MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256, + MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM, + MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, + MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256, + MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA, + MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA, + MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256, + MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, + MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, + MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8, + MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256, + MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256, + MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256, + + /* The ECJPAKE suite */ + MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8, + + /* All AES-256 suites */ + MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384, + MBEDTLS_TLS_RSA_WITH_AES_256_CCM, + MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256, + MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA, + MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, + MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, + MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, + MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, + MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, + MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, + MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8, + + /* All CAMELLIA-256 suites */ + MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384, + MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, + MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, + MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384, + MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384, + MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, + MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, + + /* All ARIA-256 suites */ + MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384, + MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384, + MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384, + MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384, + MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384, + MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384, + + /* All AES-128 suites */ + MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256, + MBEDTLS_TLS_RSA_WITH_AES_128_CCM, + MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256, + MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA, + MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, + MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, + MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, + MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, + MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, + MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, + MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8, + + /* All CAMELLIA-128 suites */ + MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256, + MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, + MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, + MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256, + MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256, + MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, + MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, + + /* All ARIA-128 suites */ + MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256, + MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256, + MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256, + MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256, + MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256, + MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256, + + /* The RSA PSK suites */ + MBEDTLS_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256, + MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, + MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, + MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA, + MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384, + MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384, + MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384, + MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384, + + MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, + MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, + MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA, + MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256, + MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256, + MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256, + MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256, + + /* The PSK suites */ + MBEDTLS_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256, + MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384, + MBEDTLS_TLS_PSK_WITH_AES_256_CCM, + MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384, + MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA, + MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384, + MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384, + MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8, + MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384, + MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384, + + MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256, + MBEDTLS_TLS_PSK_WITH_AES_128_CCM, + MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256, + MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA, + MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256, + MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256, + MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8, + MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256, + MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256, + + /* 3DES suites */ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA, + + /* RC4 suites */ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, + MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA, + MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA, + MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA, + MBEDTLS_TLS_RSA_WITH_RC4_128_SHA, + MBEDTLS_TLS_RSA_WITH_RC4_128_MD5, + MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA, + MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA, + MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA, + MBEDTLS_TLS_PSK_WITH_RC4_128_SHA, + + /* Weak suites */ + MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA, + MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA, + + /* NULL suites */ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA, + MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA, + MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384, + MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256, + MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA, + MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384, + MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256, + MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA, + + MBEDTLS_TLS_RSA_WITH_NULL_SHA256, + MBEDTLS_TLS_RSA_WITH_NULL_SHA, + MBEDTLS_TLS_RSA_WITH_NULL_MD5, + MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA, + MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA, + MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384, + MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256, + MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA, + MBEDTLS_TLS_PSK_WITH_NULL_SHA384, + MBEDTLS_TLS_PSK_WITH_NULL_SHA256, + MBEDTLS_TLS_PSK_WITH_NULL_SHA, + +#endif /* MBEDTLS_SSL_CIPHERSUITES */ + 0 +}; + +static const mbedtls_ssl_ciphersuite_t ciphersuite_definitions[] = +{ +#if defined(MBEDTLS_CHACHAPOLY_C) && \ + defined(MBEDTLS_SHA256_C) && \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) + { MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + "TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256", + MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, + MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, + "TLS-ECDHE-ECDSA-WITH-CHACHA20-POLY1305-SHA256", + MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, + MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) + { MBEDTLS_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + "TLS-DHE-RSA-WITH-CHACHA20-POLY1305-SHA256", + MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, + MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) + { MBEDTLS_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256, + "TLS-PSK-WITH-CHACHA20-POLY1305-SHA256", + MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, + MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) + { MBEDTLS_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, + "TLS-ECDHE-PSK-WITH-CHACHA20-POLY1305-SHA256", + MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, + MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) + { MBEDTLS_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256, + "TLS-DHE-PSK-WITH-CHACHA20-POLY1305-SHA256", + MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, + MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) + { MBEDTLS_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256, + "TLS-RSA-PSK-WITH-CHACHA20-POLY1305-SHA256", + MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, + MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#endif /* MBEDTLS_CHACHAPOLY_C && + MBEDTLS_SHA256_C && + MBEDTLS_SSL_PROTO_TLS1_2 */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) +#if defined(MBEDTLS_AES_C) +#if defined(MBEDTLS_SHA1_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, "TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, "TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_SHA1_C */ +#if defined(MBEDTLS_SHA256_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, "TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_GCM_C) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, "TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256", + MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_GCM_C */ +#endif /* MBEDTLS_SHA256_C */ +#if defined(HAVE_SHA384) +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, "TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_GCM_C) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, "TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384", + MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_GCM_C */ +#endif /* HAVE_SHA384 */ +#if defined(MBEDTLS_CCM_C) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM, "TLS-ECDHE-ECDSA-WITH-AES-256-CCM", + MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, "TLS-ECDHE-ECDSA-WITH-AES-256-CCM-8", + MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_SHORT_TAG }, + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM, "TLS-ECDHE-ECDSA-WITH-AES-128-CCM", + MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, "TLS-ECDHE-ECDSA-WITH-AES-128-CCM-8", + MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_SHORT_TAG }, +#endif /* MBEDTLS_CCM_C */ +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_CAMELLIA_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, + "TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-CBC-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, + "TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-CBC-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_GCM_C) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, + "TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-GCM-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, + "TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-GCM-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_GCM_C */ +#endif /* MBEDTLS_CAMELLIA_C */ + +#if defined(MBEDTLS_DES_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDHE-ECDSA-WITH-3DES-EDE-CBC-SHA", + MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_ARC4_C) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, "TLS-ECDHE-ECDSA-WITH-RC4-128-SHA", + MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_NODTLS }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_ARC4_C */ + +#if defined(MBEDTLS_CIPHER_NULL_CIPHER) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA, "TLS-ECDHE-ECDSA-WITH-NULL-SHA", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_NULL_CIPHER */ +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) +#if defined(MBEDTLS_AES_C) +#if defined(MBEDTLS_SHA1_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, "TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, "TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_SHA1_C */ +#if defined(MBEDTLS_SHA256_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, "TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_GCM_C) + { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, "TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256", + MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_GCM_C */ +#endif /* MBEDTLS_SHA256_C */ +#if defined(HAVE_SHA384) +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, "TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_GCM_C) + { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, "TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384", + MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_GCM_C */ +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_CAMELLIA_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, + "TLS-ECDHE-RSA-WITH-CAMELLIA-128-CBC-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384, + "TLS-ECDHE-RSA-WITH-CAMELLIA-256-CBC-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_GCM_C) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, + "TLS-ECDHE-RSA-WITH-CAMELLIA-128-GCM-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, + "TLS-ECDHE-RSA-WITH-CAMELLIA-256-GCM-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_GCM_C */ +#endif /* MBEDTLS_CAMELLIA_C */ + +#if defined(MBEDTLS_DES_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDHE-RSA-WITH-3DES-EDE-CBC-SHA", + MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_ARC4_C) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA, "TLS-ECDHE-RSA-WITH-RC4-128-SHA", + MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_NODTLS }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_ARC4_C */ + +#if defined(MBEDTLS_CIPHER_NULL_CIPHER) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA, "TLS-ECDHE-RSA-WITH-NULL-SHA", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_NULL_CIPHER */ +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) +#if defined(MBEDTLS_AES_C) +#if defined(HAVE_SHA384) && defined(MBEDTLS_GCM_C) + { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, "TLS-DHE-RSA-WITH-AES-256-GCM-SHA384", + MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 && MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_SHA256_C) +#if defined(MBEDTLS_GCM_C) + { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, "TLS-DHE-RSA-WITH-AES-128-GCM-SHA256", + MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, "TLS-DHE-RSA-WITH-AES-128-CBC-SHA256", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + + { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_SHA256_C */ + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA, "TLS-DHE-RSA-WITH-AES-128-CBC-SHA", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + + { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA, "TLS-DHE-RSA-WITH-AES-256-CBC-SHA", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_CCM_C) + { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM, "TLS-DHE-RSA-WITH-AES-256-CCM", + MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8, "TLS-DHE-RSA-WITH-AES-256-CCM-8", + MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_SHORT_TAG }, + { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM, "TLS-DHE-RSA-WITH-AES-128-CCM", + MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8, "TLS-DHE-RSA-WITH-AES-128-CCM-8", + MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_SHORT_TAG }, +#endif /* MBEDTLS_CCM_C */ +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_CAMELLIA_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + + { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256", + MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA", + MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + + { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA", + MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_GCM_C) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-DHE-RSA-WITH-CAMELLIA-128-GCM-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-DHE-RSA-WITH-CAMELLIA-256-GCM-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_GCM_C */ +#endif /* MBEDTLS_CAMELLIA_C */ + +#if defined(MBEDTLS_DES_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA", + MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_DES_C */ +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) +#if defined(MBEDTLS_AES_C) +#if defined(HAVE_SHA384) && defined(MBEDTLS_GCM_C) + { MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384, "TLS-RSA-WITH-AES-256-GCM-SHA384", + MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 && MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_SHA256_C) +#if defined(MBEDTLS_GCM_C) + { MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256, "TLS-RSA-WITH-AES-128-GCM-SHA256", + MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256, "TLS-RSA-WITH-AES-128-CBC-SHA256", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + + { MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256, "TLS-RSA-WITH-AES-256-CBC-SHA256", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_SHA256_C */ + +#if defined(MBEDTLS_SHA1_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA, "TLS-RSA-WITH-AES-128-CBC-SHA", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + + { MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA, "TLS-RSA-WITH-AES-256-CBC-SHA", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_SHA1_C */ +#if defined(MBEDTLS_CCM_C) + { MBEDTLS_TLS_RSA_WITH_AES_256_CCM, "TLS-RSA-WITH-AES-256-CCM", + MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8, "TLS-RSA-WITH-AES-256-CCM-8", + MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_SHORT_TAG }, + { MBEDTLS_TLS_RSA_WITH_AES_128_CCM, "TLS-RSA-WITH-AES-128-CCM", + MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8, "TLS-RSA-WITH-AES-128-CCM-8", + MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_SHORT_TAG }, +#endif /* MBEDTLS_CCM_C */ +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_CAMELLIA_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + + { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256", + MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA", + MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + + { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA", + MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_GCM_C) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-RSA-WITH-CAMELLIA-128-GCM-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-RSA-WITH-CAMELLIA-256-GCM-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_GCM_C */ +#endif /* MBEDTLS_CAMELLIA_C */ + +#if defined(MBEDTLS_DES_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-RSA-WITH-3DES-EDE-CBC-SHA", + MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_ARC4_C) +#if defined(MBEDTLS_MD5_C) + { MBEDTLS_TLS_RSA_WITH_RC4_128_MD5, "TLS-RSA-WITH-RC4-128-MD5", + MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_MD5, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_NODTLS }, +#endif + +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_RSA_WITH_RC4_128_SHA, "TLS-RSA-WITH-RC4-128-SHA", + MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_NODTLS }, +#endif +#endif /* MBEDTLS_ARC4_C */ +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) +#if defined(MBEDTLS_AES_C) +#if defined(MBEDTLS_SHA1_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, "TLS-ECDH-RSA-WITH-AES-128-CBC-SHA", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, "TLS-ECDH-RSA-WITH-AES-256-CBC-SHA", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_SHA1_C */ +#if defined(MBEDTLS_SHA256_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, "TLS-ECDH-RSA-WITH-AES-128-CBC-SHA256", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_GCM_C) + { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, "TLS-ECDH-RSA-WITH-AES-128-GCM-SHA256", + MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_GCM_C */ +#endif /* MBEDTLS_SHA256_C */ +#if defined(HAVE_SHA384) +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, "TLS-ECDH-RSA-WITH-AES-256-CBC-SHA384", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_GCM_C) + { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, "TLS-ECDH-RSA-WITH-AES-256-GCM-SHA384", + MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_GCM_C */ +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_CAMELLIA_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256, + "TLS-ECDH-RSA-WITH-CAMELLIA-128-CBC-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384, + "TLS-ECDH-RSA-WITH-CAMELLIA-256-CBC-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_GCM_C) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256, + "TLS-ECDH-RSA-WITH-CAMELLIA-128-GCM-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384, + "TLS-ECDH-RSA-WITH-CAMELLIA-256-GCM-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_GCM_C */ +#endif /* MBEDTLS_CAMELLIA_C */ + +#if defined(MBEDTLS_DES_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDH-RSA-WITH-3DES-EDE-CBC-SHA", + MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_ARC4_C) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA, "TLS-ECDH-RSA-WITH-RC4-128-SHA", + MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_NODTLS }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_ARC4_C */ + +#if defined(MBEDTLS_CIPHER_NULL_CIPHER) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA, "TLS-ECDH-RSA-WITH-NULL-SHA", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_NULL_CIPHER */ +#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) +#if defined(MBEDTLS_AES_C) +#if defined(MBEDTLS_SHA1_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, "TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, "TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_SHA1_C */ +#if defined(MBEDTLS_SHA256_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, "TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA256", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_GCM_C) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, "TLS-ECDH-ECDSA-WITH-AES-128-GCM-SHA256", + MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_GCM_C */ +#endif /* MBEDTLS_SHA256_C */ +#if defined(HAVE_SHA384) +#if defined(MBEDTLS_CIPHER_MODE_CBC) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, "TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA384", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_GCM_C) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, "TLS-ECDH-ECDSA-WITH-AES-256-GCM-SHA384", + MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_GCM_C */ +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_CAMELLIA_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, + "TLS-ECDH-ECDSA-WITH-CAMELLIA-128-CBC-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, + "TLS-ECDH-ECDSA-WITH-CAMELLIA-256-CBC-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_GCM_C) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, + "TLS-ECDH-ECDSA-WITH-CAMELLIA-128-GCM-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, + "TLS-ECDH-ECDSA-WITH-CAMELLIA-256-GCM-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_GCM_C */ +#endif /* MBEDTLS_CAMELLIA_C */ + +#if defined(MBEDTLS_DES_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDH-ECDSA-WITH-3DES-EDE-CBC-SHA", + MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_ARC4_C) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA, "TLS-ECDH-ECDSA-WITH-RC4-128-SHA", + MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_NODTLS }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_ARC4_C */ + +#if defined(MBEDTLS_CIPHER_NULL_CIPHER) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA, "TLS-ECDH-ECDSA-WITH-NULL-SHA", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_NULL_CIPHER */ +#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) +#if defined(MBEDTLS_AES_C) +#if defined(MBEDTLS_GCM_C) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256, "TLS-PSK-WITH-AES-128-GCM-SHA256", + MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384, "TLS-PSK-WITH-AES-256-GCM-SHA384", + MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256, "TLS-PSK-WITH-AES-128-CBC-SHA256", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384, "TLS-PSK-WITH-AES-256-CBC-SHA384", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ + +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA, "TLS-PSK-WITH-AES-128-CBC-SHA", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + + { MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA, "TLS-PSK-WITH-AES-256-CBC-SHA", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_CCM_C) + { MBEDTLS_TLS_PSK_WITH_AES_256_CCM, "TLS-PSK-WITH-AES-256-CCM", + MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8, "TLS-PSK-WITH-AES-256-CCM-8", + MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_SHORT_TAG }, + { MBEDTLS_TLS_PSK_WITH_AES_128_CCM, "TLS-PSK-WITH-AES-128-CCM", + MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8, "TLS-PSK-WITH-AES-128-CCM-8", + MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_SHORT_TAG }, +#endif /* MBEDTLS_CCM_C */ +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_CAMELLIA_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-PSK-WITH-CAMELLIA-128-CBC-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-PSK-WITH-CAMELLIA-256-CBC-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_GCM_C) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256, "TLS-PSK-WITH-CAMELLIA-128-GCM-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384, "TLS-PSK-WITH-CAMELLIA-256-GCM-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_GCM_C */ +#endif /* MBEDTLS_CAMELLIA_C */ + +#if defined(MBEDTLS_DES_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-PSK-WITH-3DES-EDE-CBC-SHA", + MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_ARC4_C) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_PSK_WITH_RC4_128_SHA, "TLS-PSK-WITH-RC4-128-SHA", + MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_NODTLS }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_ARC4_C */ +#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) +#if defined(MBEDTLS_AES_C) +#if defined(MBEDTLS_GCM_C) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256, "TLS-DHE-PSK-WITH-AES-128-GCM-SHA256", + MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384, "TLS-DHE-PSK-WITH-AES-256-GCM-SHA384", + MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256, "TLS-DHE-PSK-WITH-AES-128-CBC-SHA256", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384, "TLS-DHE-PSK-WITH-AES-256-CBC-SHA384", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ + +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA, "TLS-DHE-PSK-WITH-AES-128-CBC-SHA", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + + { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA, "TLS-DHE-PSK-WITH-AES-256-CBC-SHA", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_CCM_C) + { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM, "TLS-DHE-PSK-WITH-AES-256-CCM", + MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8, "TLS-DHE-PSK-WITH-AES-256-CCM-8", + MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_SHORT_TAG }, + { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM, "TLS-DHE-PSK-WITH-AES-128-CCM", + MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8, "TLS-DHE-PSK-WITH-AES-128-CCM-8", + MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_SHORT_TAG }, +#endif /* MBEDTLS_CCM_C */ +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_CAMELLIA_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-DHE-PSK-WITH-CAMELLIA-128-CBC-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-DHE-PSK-WITH-CAMELLIA-256-CBC-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_GCM_C) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256, "TLS-DHE-PSK-WITH-CAMELLIA-128-GCM-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384, "TLS-DHE-PSK-WITH-CAMELLIA-256-GCM-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_GCM_C */ +#endif /* MBEDTLS_CAMELLIA_C */ + +#if defined(MBEDTLS_DES_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-DHE-PSK-WITH-3DES-EDE-CBC-SHA", + MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_ARC4_C) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA, "TLS-DHE-PSK-WITH-RC4-128-SHA", + MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_NODTLS }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_ARC4_C */ +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) +#if defined(MBEDTLS_AES_C) + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, "TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384, "TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA384", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ + +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA, "TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + + { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, "TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_CAMELLIA_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, + "TLS-ECDHE-PSK-WITH-CAMELLIA-128-CBC-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, + "TLS-ECDHE-PSK-WITH-CAMELLIA-256-CBC-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_CAMELLIA_C */ + +#if defined(MBEDTLS_DES_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-ECDHE-PSK-WITH-3DES-EDE-CBC-SHA", + MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_ARC4_C) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA, "TLS-ECDHE-PSK-WITH-RC4-128-SHA", + MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_NODTLS }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_ARC4_C */ +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) +#if defined(MBEDTLS_AES_C) +#if defined(MBEDTLS_GCM_C) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, "TLS-RSA-PSK-WITH-AES-128-GCM-SHA256", + MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, "TLS-RSA-PSK-WITH-AES-256-GCM-SHA384", + MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_GCM_C */ + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, "TLS-RSA-PSK-WITH-AES-128-CBC-SHA256", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, "TLS-RSA-PSK-WITH-AES-256-CBC-SHA384", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ + +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA, "TLS-RSA-PSK-WITH-AES-128-CBC-SHA", + MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, + + { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA, "TLS-RSA-PSK-WITH-AES-256-CBC-SHA", + MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_AES_C */ + +#if defined(MBEDTLS_CAMELLIA_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-RSA-PSK-WITH-CAMELLIA-128-CBC-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-RSA-PSK-WITH-CAMELLIA-256-CBC-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + +#if defined(MBEDTLS_GCM_C) +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256, "TLS-RSA-PSK-WITH-CAMELLIA-128-GCM-SHA256", + MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA256_C */ + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384, "TLS-RSA-PSK-WITH-CAMELLIA-256-GCM-SHA384", + MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* HAVE_SHA384 */ +#endif /* MBEDTLS_GCM_C */ +#endif /* MBEDTLS_CAMELLIA_C */ + +#if defined(MBEDTLS_DES_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-RSA-PSK-WITH-3DES-EDE-CBC-SHA", + MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_DES_C */ + +#if defined(MBEDTLS_ARC4_C) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA, "TLS-RSA-PSK-WITH-RC4-128-SHA", + MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_NODTLS }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_ARC4_C */ +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +#if defined(MBEDTLS_AES_C) +#if defined(MBEDTLS_CCM_C) + { MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8, "TLS-ECJPAKE-WITH-AES-128-CCM-8", + MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECJPAKE, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_SHORT_TAG }, +#endif /* MBEDTLS_CCM_C */ +#endif /* MBEDTLS_AES_C */ +#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_ENABLE_WEAK_CIPHERSUITES) +#if defined(MBEDTLS_CIPHER_NULL_CIPHER) +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) +#if defined(MBEDTLS_MD5_C) + { MBEDTLS_TLS_RSA_WITH_NULL_MD5, "TLS-RSA-WITH-NULL-MD5", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_MD5, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif + +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_RSA_WITH_NULL_SHA, "TLS-RSA-WITH-NULL-SHA", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif + +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_RSA_WITH_NULL_SHA256, "TLS-RSA-WITH-NULL-SHA256", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_PSK_WITH_NULL_SHA, "TLS-PSK-WITH-NULL-SHA", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif /* MBEDTLS_SHA1_C */ + +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_PSK_WITH_NULL_SHA256, "TLS-PSK-WITH-NULL-SHA256", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_PSK_WITH_NULL_SHA384, "TLS-PSK-WITH-NULL-SHA384", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif +#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA, "TLS-DHE-PSK-WITH-NULL-SHA", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif /* MBEDTLS_SHA1_C */ + +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256, "TLS-DHE-PSK-WITH-NULL-SHA256", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384, "TLS-DHE-PSK-WITH-NULL-SHA384", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA, "TLS-ECDHE-PSK-WITH-NULL-SHA", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif /* MBEDTLS_SHA1_C */ + +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256, "TLS-ECDHE-PSK-WITH-NULL-SHA256", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384, "TLS-ECDHE-PSK-WITH-NULL-SHA384", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA, "TLS-RSA-PSK-WITH-NULL-SHA", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif /* MBEDTLS_SHA1_C */ + +#if defined(MBEDTLS_SHA256_C) + { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256, "TLS-RSA-PSK-WITH-NULL-SHA256", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif + +#if defined(HAVE_SHA384) + { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384, "TLS-RSA-PSK-WITH-NULL-SHA384", + MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ +#endif /* MBEDTLS_CIPHER_NULL_CIPHER */ + +#if defined(MBEDTLS_DES_C) +#if defined(MBEDTLS_CIPHER_MODE_CBC) +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA, "TLS-DHE-RSA-WITH-DES-CBC-SHA", + MBEDTLS_CIPHER_DES_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) +#if defined(MBEDTLS_SHA1_C) + { MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA, "TLS-RSA-WITH-DES-CBC-SHA", + MBEDTLS_CIPHER_DES_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_CIPHERSUITE_WEAK }, +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* MBEDTLS_DES_C */ +#endif /* MBEDTLS_ENABLE_WEAK_CIPHERSUITES */ + +#if defined(MBEDTLS_ARIA_C) + +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) + +#if (defined(MBEDTLS_GCM_C) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384, + "TLS-RSA-WITH-ARIA-256-GCM-SHA384", + MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384, + "TLS-RSA-WITH-ARIA-256-CBC-SHA384", + MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256, + "TLS-RSA-WITH-ARIA-128-GCM-SHA256", + MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256, + "TLS-RSA-WITH-ARIA-128-CBC-SHA256", + MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif + +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) + +#if (defined(MBEDTLS_GCM_C) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384, + "TLS-RSA-PSK-WITH-ARIA-256-GCM-SHA384", + MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384, + "TLS-RSA-PSK-WITH-ARIA-256-CBC-SHA384", + MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256, + "TLS-RSA-PSK-WITH-ARIA-128-GCM-SHA256", + MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256, + "TLS-RSA-PSK-WITH-ARIA-128-CBC-SHA256", + MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif + +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) + +#if (defined(MBEDTLS_GCM_C) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384, + "TLS-PSK-WITH-ARIA-256-GCM-SHA384", + MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384, + "TLS-PSK-WITH-ARIA-256-CBC-SHA384", + MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256, + "TLS-PSK-WITH-ARIA-128-GCM-SHA256", + MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256, + "TLS-PSK-WITH-ARIA-128-CBC-SHA256", + MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif + +#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) + +#if (defined(MBEDTLS_GCM_C) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384, + "TLS-ECDH-RSA-WITH-ARIA-256-GCM-SHA384", + MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384, + "TLS-ECDH-RSA-WITH-ARIA-256-CBC-SHA384", + MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256, + "TLS-ECDH-RSA-WITH-ARIA-128-GCM-SHA256", + MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256, + "TLS-ECDH-RSA-WITH-ARIA-128-CBC-SHA256", + MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif + +#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) + +#if (defined(MBEDTLS_GCM_C) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384, + "TLS-ECDHE-RSA-WITH-ARIA-256-GCM-SHA384", + MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384, + "TLS-ECDHE-RSA-WITH-ARIA-256-CBC-SHA384", + MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256, + "TLS-ECDHE-RSA-WITH-ARIA-128-GCM-SHA256", + MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256, + "TLS-ECDHE-RSA-WITH-ARIA-128-CBC-SHA256", + MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif + +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) + +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384, + "TLS-ECDHE-PSK-WITH-ARIA-256-CBC-SHA384", + MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256, + "TLS-ECDHE-PSK-WITH-ARIA-128-CBC-SHA256", + MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif + +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) + +#if (defined(MBEDTLS_GCM_C) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384, + "TLS-ECDHE-ECDSA-WITH-ARIA-256-GCM-SHA384", + MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384, + "TLS-ECDHE-ECDSA-WITH-ARIA-256-CBC-SHA384", + MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256, + "TLS-ECDHE-ECDSA-WITH-ARIA-128-GCM-SHA256", + MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256, + "TLS-ECDHE-ECDSA-WITH-ARIA-128-CBC-SHA256", + MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif + +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) + +#if (defined(MBEDTLS_GCM_C) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384, + "TLS-ECDH-ECDSA-WITH-ARIA-256-GCM-SHA384", + MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384, + "TLS-ECDH-ECDSA-WITH-ARIA-256-CBC-SHA384", + MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256, + "TLS-ECDH-ECDSA-WITH-ARIA-128-GCM-SHA256", + MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256, + "TLS-ECDH-ECDSA-WITH-ARIA-128-CBC-SHA256", + MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif + +#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) + +#if (defined(MBEDTLS_GCM_C) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384, + "TLS-DHE-RSA-WITH-ARIA-256-GCM-SHA384", + MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384, + "TLS-DHE-RSA-WITH-ARIA-256-CBC-SHA384", + MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256, + "TLS-DHE-RSA-WITH-ARIA-128-GCM-SHA256", + MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256, + "TLS-DHE-RSA-WITH-ARIA-128-CBC-SHA256", + MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif + +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) + +#if (defined(MBEDTLS_GCM_C) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384, + "TLS-DHE-PSK-WITH-ARIA-256-GCM-SHA384", + MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(HAVE_SHA384)) + { MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384, + "TLS-DHE-PSK-WITH-ARIA-256-CBC-SHA384", + MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256, + "TLS-DHE-PSK-WITH-ARIA-128-GCM-SHA256", + MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif +#if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) + { MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256, + "TLS-DHE-PSK-WITH-ARIA-128-CBC-SHA256", + MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, + 0 }, +#endif + +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ + +#endif /* MBEDTLS_ARIA_C */ + + + { 0, "", + MBEDTLS_CIPHER_NONE, MBEDTLS_MD_NONE, MBEDTLS_KEY_EXCHANGE_NONE, + 0, 0, 0, 0, 0 } +}; + +#if defined(MBEDTLS_SSL_CIPHERSUITES) +const int *mbedtls_ssl_list_ciphersuites(void) +{ + return ciphersuite_preference; +} +#else +#define MAX_CIPHERSUITES sizeof(ciphersuite_definitions) / \ + sizeof(ciphersuite_definitions[0]) +static int supported_ciphersuites[MAX_CIPHERSUITES]; +static int supported_init = 0; + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ciphersuite_is_removed(const mbedtls_ssl_ciphersuite_t *cs_info) +{ + (void) cs_info; + +#if defined(MBEDTLS_REMOVE_ARC4_CIPHERSUITES) + if (cs_info->cipher == MBEDTLS_CIPHER_ARC4_128) { + return 1; + } +#endif /* MBEDTLS_REMOVE_ARC4_CIPHERSUITES */ + +#if defined(MBEDTLS_REMOVE_3DES_CIPHERSUITES) + if (cs_info->cipher == MBEDTLS_CIPHER_DES_EDE3_ECB || + cs_info->cipher == MBEDTLS_CIPHER_DES_EDE3_CBC) { + return 1; + } +#endif /* MBEDTLS_REMOVE_3DES_CIPHERSUITES */ + + return 0; +} + +const int *mbedtls_ssl_list_ciphersuites(void) +{ + /* + * On initial call filter out all ciphersuites not supported by current + * build based on presence in the ciphersuite_definitions. + */ + if (supported_init == 0) { + const int *p; + int *q; + + for (p = ciphersuite_preference, q = supported_ciphersuites; + *p != 0 && q < supported_ciphersuites + MAX_CIPHERSUITES - 1; + p++) { + const mbedtls_ssl_ciphersuite_t *cs_info; + if ((cs_info = mbedtls_ssl_ciphersuite_from_id(*p)) != NULL && + !ciphersuite_is_removed(cs_info)) { + *(q++) = *p; + } + } + *q = 0; + + supported_init = 1; + } + + return supported_ciphersuites; +} +#endif /* MBEDTLS_SSL_CIPHERSUITES */ + +const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_string( + const char *ciphersuite_name) +{ + const mbedtls_ssl_ciphersuite_t *cur = ciphersuite_definitions; + + if (NULL == ciphersuite_name) { + return NULL; + } + + while (cur->id != 0) { + if (0 == strcmp(cur->name, ciphersuite_name)) { + return cur; + } + + cur++; + } + + return NULL; +} + +const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_id(int ciphersuite) +{ + const mbedtls_ssl_ciphersuite_t *cur = ciphersuite_definitions; + + while (cur->id != 0) { + if (cur->id == ciphersuite) { + return cur; + } + + cur++; + } + + return NULL; +} + +const char *mbedtls_ssl_get_ciphersuite_name(const int ciphersuite_id) +{ + const mbedtls_ssl_ciphersuite_t *cur; + + cur = mbedtls_ssl_ciphersuite_from_id(ciphersuite_id); + + if (cur == NULL) { + return "unknown"; + } + + return cur->name; +} + +int mbedtls_ssl_get_ciphersuite_id(const char *ciphersuite_name) +{ + const mbedtls_ssl_ciphersuite_t *cur; + + cur = mbedtls_ssl_ciphersuite_from_string(ciphersuite_name); + + if (cur == NULL) { + return 0; + } + + return cur->id; +} + +#if defined(MBEDTLS_PK_C) +mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_pk_alg(const mbedtls_ssl_ciphersuite_t *info) +{ + switch (info->key_exchange) { + case MBEDTLS_KEY_EXCHANGE_RSA: + case MBEDTLS_KEY_EXCHANGE_DHE_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: + case MBEDTLS_KEY_EXCHANGE_RSA_PSK: + return MBEDTLS_PK_RSA; + + case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: + return MBEDTLS_PK_ECDSA; + + case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: + return MBEDTLS_PK_ECKEY; + + default: + return MBEDTLS_PK_NONE; + } +} + +mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_alg(const mbedtls_ssl_ciphersuite_t *info) +{ + switch (info->key_exchange) { + case MBEDTLS_KEY_EXCHANGE_RSA: + case MBEDTLS_KEY_EXCHANGE_DHE_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: + return MBEDTLS_PK_RSA; + + case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: + return MBEDTLS_PK_ECDSA; + + default: + return MBEDTLS_PK_NONE; + } +} + +#endif /* MBEDTLS_PK_C */ + +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +int mbedtls_ssl_ciphersuite_uses_ec(const mbedtls_ssl_ciphersuite_t *info) +{ + switch (info->key_exchange) { + case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: + case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: + case MBEDTLS_KEY_EXCHANGE_ECJPAKE: + return 1; + + default: + return 0; + } +} +#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED*/ + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) +int mbedtls_ssl_ciphersuite_uses_psk(const mbedtls_ssl_ciphersuite_t *info) +{ + switch (info->key_exchange) { + case MBEDTLS_KEY_EXCHANGE_PSK: + case MBEDTLS_KEY_EXCHANGE_RSA_PSK: + case MBEDTLS_KEY_EXCHANGE_DHE_PSK: + case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: + return 1; + + default: + return 0; + } +} +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ + +#endif /* MBEDTLS_SSL_TLS_C */ diff --git a/ext/opcua_client/mbedtls/library/ssl_cli.c b/ext/opcua_client/mbedtls/library/ssl_cli.c new file mode 100644 index 0000000..2854e00 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ssl_cli.c @@ -0,0 +1,4386 @@ +/* + * SSLv3/TLSv1 client-side functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_SSL_CLI_C) + +#include "mbedtls/platform.h" + +#include "mbedtls/ssl.h" +#include "mbedtls/ssl_internal.h" +#include "mbedtls/debug.h" +#include "mbedtls/error.h" +#include "mbedtls/constant_time.h" + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "mbedtls/psa_util.h" +#include "psa/crypto.h" +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#include + +#include + +#if defined(MBEDTLS_HAVE_TIME) +#include "mbedtls/platform_time.h" +#endif + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) +#include "mbedtls/platform_util.h" +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_conf_has_static_psk(mbedtls_ssl_config const *conf) +{ + if (conf->psk_identity == NULL || + conf->psk_identity_len == 0) { + return 0; + } + + if (conf->psk != NULL && conf->psk_len != 0) { + return 1; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) { + return 1; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + return 0; +} + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_conf_has_static_raw_psk(mbedtls_ssl_config const *conf) +{ + if (conf->psk_identity == NULL || + conf->psk_identity_len == 0) { + return 0; + } + + if (conf->psk != NULL && conf->psk_len != 0) { + return 1; + } + + return 0; +} +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ + +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_hostname_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + unsigned char *p = buf; + const char *hostname = mbedtls_ssl_get_hostname_pointer(ssl); + size_t hostname_len; + + *olen = 0; + + if (hostname == NULL) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(3, + ("client hello, adding server name extension: %s", + hostname)); + + hostname_len = strlen(hostname); + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, hostname_len + 9); + + /* + * Sect. 3, RFC 6066 (TLS Extensions Definitions) + * + * In order to provide any of the server names, clients MAY include an + * extension of type "server_name" in the (extended) client hello. The + * "extension_data" field of this extension SHALL contain + * "ServerNameList" where: + * + * struct { + * NameType name_type; + * select (name_type) { + * case host_name: HostName; + * } name; + * } ServerName; + * + * enum { + * host_name(0), (255) + * } NameType; + * + * opaque HostName<1..2^16-1>; + * + * struct { + * ServerName server_name_list<1..2^16-1> + * } ServerNameList; + * + */ + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SERVERNAME, p, 0); + p += 2; + + MBEDTLS_PUT_UINT16_BE(hostname_len + 5, p, 0); + p += 2; + + MBEDTLS_PUT_UINT16_BE(hostname_len + 3, p, 0); + p += 2; + + *p++ = MBEDTLS_BYTE_0(MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME); + + MBEDTLS_PUT_UINT16_BE(hostname_len, p, 0); + p += 2; + + memcpy(p, hostname, hostname_len); + + *olen = hostname_len + 9; + + return 0; +} +#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ + +#if defined(MBEDTLS_SSL_RENEGOTIATION) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + unsigned char *p = buf; + + *olen = 0; + + /* We're always including a TLS_EMPTY_RENEGOTIATION_INFO_SCSV in the + * initial ClientHello, in which case also adding the renegotiation + * info extension is NOT RECOMMENDED as per RFC 5746 Section 3.4. */ + if (ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(3, + ("client hello, adding renegotiation extension")); + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 5 + ssl->verify_data_len); + + /* + * Secure renegotiation + */ + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0); + p += 2; + + *p++ = 0x00; + *p++ = MBEDTLS_BYTE_0(ssl->verify_data_len + 1); + *p++ = MBEDTLS_BYTE_0(ssl->verify_data_len); + + memcpy(p, ssl->own_verify_data, ssl->verify_data_len); + + *olen = 5 + ssl->verify_data_len; + + return 0; +} +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + +/* + * Only if we handle at least one key exchange that needs signatures. + */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_signature_algorithms_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + unsigned char *p = buf; + size_t sig_alg_len = 0; + const int *md; + +#if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) + unsigned char *sig_alg_list = buf + 6; +#endif + + *olen = 0; + + if (ssl->conf->max_minor_ver != MBEDTLS_SSL_MINOR_VERSION_3) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(3, + ("client hello, adding signature_algorithms extension")); + + if (ssl->conf->sig_hashes == NULL) { + return MBEDTLS_ERR_SSL_BAD_CONFIG; + } + + for (md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++) { +#if defined(MBEDTLS_ECDSA_C) + sig_alg_len += 2; +#endif +#if defined(MBEDTLS_RSA_C) + sig_alg_len += 2; +#endif + if (sig_alg_len > MBEDTLS_SSL_MAX_SIG_HASH_ALG_LIST_LEN) { + MBEDTLS_SSL_DEBUG_MSG(3, + ("length in bytes of sig-hash-alg extension too big")); + return MBEDTLS_ERR_SSL_BAD_CONFIG; + } + } + + /* Empty signature algorithms list, this is a configuration error. */ + if (sig_alg_len == 0) { + return MBEDTLS_ERR_SSL_BAD_CONFIG; + } + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, sig_alg_len + 6); + + /* + * Prepare signature_algorithms extension (TLS 1.2) + */ + sig_alg_len = 0; + + for (md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++) { +#if defined(MBEDTLS_ECDSA_C) + sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg(*md); + sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_ECDSA; +#endif +#if defined(MBEDTLS_RSA_C) + sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg(*md); + sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_RSA; +#endif + } + + /* + * enum { + * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5), + * sha512(6), (255) + * } HashAlgorithm; + * + * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) } + * SignatureAlgorithm; + * + * struct { + * HashAlgorithm hash; + * SignatureAlgorithm signature; + * } SignatureAndHashAlgorithm; + * + * SignatureAndHashAlgorithm + * supported_signature_algorithms<2..2^16-2>; + */ + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SIG_ALG, p, 0); + p += 2; + + MBEDTLS_PUT_UINT16_BE(sig_alg_len + 2, p, 0); + p += 2; + + MBEDTLS_PUT_UINT16_BE(sig_alg_len, p, 0); + p += 2; + + *olen = 6 + sig_alg_len; + + return 0; +} +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && + MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ + +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_supported_elliptic_curves_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + unsigned char *p = buf; + unsigned char *elliptic_curve_list = p + 6; + size_t elliptic_curve_len = 0; + const mbedtls_ecp_curve_info *info; + const mbedtls_ecp_group_id *grp_id; + + *olen = 0; + + MBEDTLS_SSL_DEBUG_MSG(3, + ("client hello, adding supported_elliptic_curves extension")); + + if (ssl->conf->curve_list == NULL) { + return MBEDTLS_ERR_SSL_BAD_CONFIG; + } + + for (grp_id = ssl->conf->curve_list; + *grp_id != MBEDTLS_ECP_DP_NONE; + grp_id++) { + info = mbedtls_ecp_curve_info_from_grp_id(*grp_id); + if (info == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("invalid curve in ssl configuration")); + return MBEDTLS_ERR_SSL_BAD_CONFIG; + } + elliptic_curve_len += 2; + + if (elliptic_curve_len > MBEDTLS_SSL_MAX_CURVE_LIST_LEN) { + MBEDTLS_SSL_DEBUG_MSG(3, + ("malformed supported_elliptic_curves extension in config")); + return MBEDTLS_ERR_SSL_BAD_CONFIG; + } + } + + /* Empty elliptic curve list, this is a configuration error. */ + if (elliptic_curve_len == 0) { + return MBEDTLS_ERR_SSL_BAD_CONFIG; + } + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6 + elliptic_curve_len); + + elliptic_curve_len = 0; + + for (grp_id = ssl->conf->curve_list; + *grp_id != MBEDTLS_ECP_DP_NONE; + grp_id++) { + info = mbedtls_ecp_curve_info_from_grp_id(*grp_id); + elliptic_curve_list[elliptic_curve_len++] = MBEDTLS_BYTE_1(info->tls_id); + elliptic_curve_list[elliptic_curve_len++] = MBEDTLS_BYTE_0(info->tls_id); + } + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES, p, 0); + p += 2; + + MBEDTLS_PUT_UINT16_BE(elliptic_curve_len + 2, p, 0); + p += 2; + + MBEDTLS_PUT_UINT16_BE(elliptic_curve_len, p, 0); + p += 2; + + *olen = 6 + elliptic_curve_len; + + return 0; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + unsigned char *p = buf; + (void) ssl; /* ssl used for debugging only */ + + *olen = 0; + + MBEDTLS_SSL_DEBUG_MSG(3, + ("client hello, adding supported_point_formats extension")); + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0); + p += 2; + + *p++ = 0x00; + *p++ = 2; + + *p++ = 1; + *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED; + + *olen = 6; + + return 0; +} +#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || + MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *p = buf; + size_t kkpp_len; + + *olen = 0; + + /* Skip costly extension if we can't use EC J-PAKE anyway */ + if (mbedtls_ecjpake_check(&ssl->handshake->ecjpake_ctx) != 0) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(3, + ("client hello, adding ecjpake_kkpp extension")); + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0); + p += 2; + + /* + * We may need to send ClientHello multiple times for Hello verification. + * We don't want to compute fresh values every time (both for performance + * and consistency reasons), so cache the extension content. + */ + if (ssl->handshake->ecjpake_cache == NULL || + ssl->handshake->ecjpake_cache_len == 0) { + MBEDTLS_SSL_DEBUG_MSG(3, ("generating new ecjpake parameters")); + + ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx, + p + 2, end - p - 2, &kkpp_len, + ssl->conf->f_rng, ssl->conf->p_rng); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, + "mbedtls_ecjpake_write_round_one", ret); + return ret; + } + + ssl->handshake->ecjpake_cache = mbedtls_calloc(1, kkpp_len); + if (ssl->handshake->ecjpake_cache == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("allocation failed")); + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + memcpy(ssl->handshake->ecjpake_cache, p + 2, kkpp_len); + ssl->handshake->ecjpake_cache_len = kkpp_len; + } else { + MBEDTLS_SSL_DEBUG_MSG(3, ("re-using cached ecjpake parameters")); + + kkpp_len = ssl->handshake->ecjpake_cache_len; + MBEDTLS_SSL_CHK_BUF_PTR(p + 2, end, kkpp_len); + + memcpy(p + 2, ssl->handshake->ecjpake_cache, kkpp_len); + } + + MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0); + p += 2; + + *olen = kkpp_len + 4; + + return 0; +} +#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_cid_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + unsigned char *p = buf; + size_t ext_len; + + /* + * Quoting draft-ietf-tls-dtls-connection-id-05 + * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05 + * + * struct { + * opaque cid<0..2^8-1>; + * } ConnectionId; + */ + + *olen = 0; + if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM || + ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) { + return 0; + } + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding CID extension")); + + /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX + * which is at most 255, so the increment cannot overflow. */ + MBEDTLS_SSL_CHK_BUF_PTR(p, end, (unsigned) (ssl->own_cid_len + 5)); + + /* Add extension ID + size */ + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0); + p += 2; + ext_len = (size_t) ssl->own_cid_len + 1; + MBEDTLS_PUT_UINT16_BE(ext_len, p, 0); + p += 2; + + *p++ = (uint8_t) ssl->own_cid_len; + memcpy(p, ssl->own_cid, ssl->own_cid_len); + + *olen = ssl->own_cid_len + 5; + + return 0; +} +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + unsigned char *p = buf; + + *olen = 0; + + if (ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(3, + ("client hello, adding max_fragment_length extension")); + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 5); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0); + p += 2; + + *p++ = 0x00; + *p++ = 1; + + *p++ = ssl->conf->mfl_code; + + *olen = 5; + + return 0; +} +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_truncated_hmac_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + unsigned char *p = buf; + + *olen = 0; + + if (ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(3, + ("client hello, adding truncated_hmac extension")); + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_TRUNCATED_HMAC, p, 0); + p += 2; + + *p++ = 0x00; + *p++ = 0x00; + + *olen = 4; + + return 0; +} +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + unsigned char *p = buf; + + *olen = 0; + + if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED || + ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(3, + ("client hello, adding encrypt_then_mac extension")); + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0); + p += 2; + + *p++ = 0x00; + *p++ = 0x00; + + *olen = 4; + + return 0; +} +#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + unsigned char *p = buf; + + *olen = 0; + + if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED || + ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(3, + ("client hello, adding extended_master_secret extension")); + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0); + p += 2; + + *p++ = 0x00; + *p++ = 0x00; + + *olen = 4; + + return 0; +} +#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + unsigned char *p = buf; + size_t tlen = ssl->session_negotiate->ticket_len; + + *olen = 0; + + if (ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(3, + ("client hello, adding session ticket extension")); + + /* The addition is safe here since the ticket length is 16 bit. */ + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4 + tlen); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0); + p += 2; + + MBEDTLS_PUT_UINT16_BE(tlen, p, 0); + p += 2; + + *olen = 4; + + if (ssl->session_negotiate->ticket == NULL || tlen == 0) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(3, + ("sending session ticket of length %" MBEDTLS_PRINTF_SIZET, tlen)); + + memcpy(p, ssl->session_negotiate->ticket, tlen); + + *olen += tlen; + + return 0; +} +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + +#if defined(MBEDTLS_SSL_ALPN) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_alpn_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + unsigned char *p = buf; + size_t alpnlen = 0; + const char **cur; + + *olen = 0; + + if (ssl->conf->alpn_list == NULL) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding alpn extension")); + + for (cur = ssl->conf->alpn_list; *cur != NULL; cur++) { + alpnlen += strlen(*cur) + 1; + } + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6 + alpnlen); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ALPN, p, 0); + p += 2; + + /* + * opaque ProtocolName<1..2^8-1>; + * + * struct { + * ProtocolName protocol_name_list<2..2^16-1> + * } ProtocolNameList; + */ + + /* Skip writing extension and list length for now */ + p += 4; + + for (cur = ssl->conf->alpn_list; *cur != NULL; cur++) { + /* + * mbedtls_ssl_conf_set_alpn_protocols() checked that the length of + * protocol names is less than 255. + */ + *p = (unsigned char) strlen(*cur); + memcpy(p + 1, *cur, *p); + p += 1 + *p; + } + + *olen = p - buf; + + /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */ + MBEDTLS_PUT_UINT16_BE(*olen - 6, buf, 4); + + /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */ + MBEDTLS_PUT_UINT16_BE(*olen - 4, buf, 2); + + return 0; +} +#endif /* MBEDTLS_SSL_ALPN */ + +#if defined(MBEDTLS_SSL_DTLS_SRTP) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + const unsigned char *end, + size_t *olen) +{ + unsigned char *p = buf; + size_t protection_profiles_index = 0, ext_len = 0; + uint16_t mki_len = 0, profile_value = 0; + + *olen = 0; + + if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) || + (ssl->conf->dtls_srtp_profile_list == NULL) || + (ssl->conf->dtls_srtp_profile_list_len == 0)) { + return 0; + } + + /* RFC 5764 section 4.1.1 + * uint8 SRTPProtectionProfile[2]; + * + * struct { + * SRTPProtectionProfiles SRTPProtectionProfiles; + * opaque srtp_mki<0..255>; + * } UseSRTPData; + * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>; + */ + if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) { + mki_len = ssl->dtls_srtp_info.mki_len; + } + /* Extension length = 2 bytes for profiles length, + * ssl->conf->dtls_srtp_profile_list_len * 2 (each profile is 2 bytes length ), + * 1 byte for srtp_mki vector length and the mki_len value + */ + ext_len = 2 + 2 * (ssl->conf->dtls_srtp_profile_list_len) + 1 + mki_len; + + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding use_srtp extension")); + + /* Check there is room in the buffer for the extension + 4 bytes + * - the extension tag (2 bytes) + * - the extension length (2 bytes) + */ + MBEDTLS_SSL_CHK_BUF_PTR(p, end, ext_len + 4); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, p, 0); + p += 2; + + MBEDTLS_PUT_UINT16_BE(ext_len, p, 0); + p += 2; + + /* protection profile length: 2*(ssl->conf->dtls_srtp_profile_list_len) */ + /* micro-optimization: + * the list size is limited to MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH + * which is lower than 127, so the upper byte of the length is always 0 + * For the documentation, the more generic code is left in comments + * *p++ = (unsigned char)( ( ( 2 * ssl->conf->dtls_srtp_profile_list_len ) + * >> 8 ) & 0xFF ); + */ + *p++ = 0; + *p++ = MBEDTLS_BYTE_0(2 * ssl->conf->dtls_srtp_profile_list_len); + + for (protection_profiles_index = 0; + protection_profiles_index < ssl->conf->dtls_srtp_profile_list_len; + protection_profiles_index++) { + profile_value = mbedtls_ssl_check_srtp_profile_value + (ssl->conf->dtls_srtp_profile_list[protection_profiles_index]); + if (profile_value != MBEDTLS_TLS_SRTP_UNSET) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ssl_write_use_srtp_ext, add profile: %04x", + profile_value)); + MBEDTLS_PUT_UINT16_BE(profile_value, p, 0); + p += 2; + } else { + /* + * Note: we shall never arrive here as protection profiles + * is checked by mbedtls_ssl_conf_dtls_srtp_protection_profiles function + */ + MBEDTLS_SSL_DEBUG_MSG(3, + ("client hello, " + "illegal DTLS-SRTP protection profile %d", + ssl->conf->dtls_srtp_profile_list[protection_profiles_index] + )); + return MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + } + } + + *p++ = mki_len & 0xFF; + + if (mki_len != 0) { + memcpy(p, ssl->dtls_srtp_info.mki_value, mki_len); + /* + * Increment p to point to the current position. + */ + p += mki_len; + MBEDTLS_SSL_DEBUG_BUF(3, "sending mki", ssl->dtls_srtp_info.mki_value, + ssl->dtls_srtp_info.mki_len); + } + + /* + * total extension length: extension type (2 bytes) + * + extension length (2 bytes) + * + protection profile length (2 bytes) + * + 2 * number of protection profiles + * + srtp_mki vector length(1 byte) + * + mki value + */ + *olen = p - buf; + + return 0; +} +#endif /* MBEDTLS_SSL_DTLS_SRTP */ + +/* + * Generate random bytes for ClientHello + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_generate_random(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *p = ssl->handshake->randbytes; +#if defined(MBEDTLS_HAVE_TIME) + mbedtls_time_t t; +#endif + + /* + * When responding to a verify request, MUST reuse random (RFC 6347 4.2.1) + */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + ssl->handshake->verify_cookie != NULL) { + return 0; + } +#endif + +#if defined(MBEDTLS_HAVE_TIME) + t = mbedtls_time(NULL); + MBEDTLS_PUT_UINT32_BE(t, p, 0); + p += 4; + + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, current time: %" MBEDTLS_PRINTF_LONGLONG, + (long long) t)); +#else + if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) { + return ret; + } + + p += 4; +#endif /* MBEDTLS_HAVE_TIME */ + + if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 28)) != 0) { + return ret; + } + + return 0; +} + +/** + * \brief Validate cipher suite against config in SSL context. + * + * \param suite_info cipher suite to validate + * \param ssl SSL context + * \param min_minor_ver Minimal minor version to accept a cipher suite + * \param max_minor_ver Maximal minor version to accept a cipher suite + * + * \return 0 if valid, else 1 + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_validate_ciphersuite( + const mbedtls_ssl_ciphersuite_t *suite_info, + const mbedtls_ssl_context *ssl, + int min_minor_ver, int max_minor_ver) +{ + (void) ssl; + if (suite_info == NULL) { + return 1; + } + + if (suite_info->min_minor_ver > max_minor_ver || + suite_info->max_minor_ver < min_minor_ver) { + return 1; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + (suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS)) { + return 1; + } +#endif + +#if defined(MBEDTLS_ARC4_C) + if (ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED && + suite_info->cipher == MBEDTLS_CIPHER_ARC4_128) { + return 1; + } +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE && + mbedtls_ecjpake_check(&ssl->handshake->ecjpake_ctx) != 0) { + return 1; + } +#endif + + /* Don't suggest PSK-based ciphersuite if no PSK is available. */ +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) + if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) && + ssl_conf_has_static_psk(ssl->conf) == 0) { + return 1; + } +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ + + return 0; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_client_hello(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i, n, olen, ext_len = 0; + + unsigned char *buf; + unsigned char *p, *q; + const unsigned char *end; + + unsigned char offer_compress; + const int *ciphersuites; + const mbedtls_ssl_ciphersuite_t *ciphersuite_info; +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + int uses_ec = 0; +#endif + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write client hello")); + + if (ssl->conf->f_rng == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("no RNG provided")); + return MBEDTLS_ERR_SSL_NO_RNG; + } + + int renegotiating = 0; +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) { + renegotiating = 1; + } +#endif + if (!renegotiating) { + ssl->major_ver = ssl->conf->min_major_ver; + ssl->minor_ver = ssl->conf->min_minor_ver; + } + + if (ssl->conf->max_major_ver == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, + ( + "configured max major version is invalid, consider using mbedtls_ssl_config_defaults()")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + buf = ssl->out_msg; + end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN; + + /* + * Check if there's enough space for the first part of the ClientHello + * consisting of the 38 bytes described below, the session identifier (at + * most 32 bytes) and its length (1 byte). + * + * Use static upper bounds instead of the actual values + * to allow the compiler to optimize this away. + */ + MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 38 + 1 + 32); + + /* + * The 38 first bytes of the ClientHello: + * 0 . 0 handshake type (written later) + * 1 . 3 handshake length (written later) + * 4 . 5 highest version supported + * 6 . 9 current UNIX time + * 10 . 37 random bytes + * + * The current UNIX time (4 bytes) and following 28 random bytes are written + * by ssl_generate_random() into ssl->handshake->randbytes buffer and then + * copied from there into the output buffer. + */ + + p = buf + 4; + mbedtls_ssl_write_version(ssl->conf->max_major_ver, + ssl->conf->max_minor_ver, + ssl->conf->transport, p); + p += 2; + + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, max version: [%d:%d]", + buf[4], buf[5])); + + if ((ret = ssl_generate_random(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_generate_random", ret); + return ret; + } + + memcpy(p, ssl->handshake->randbytes, 32); + MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", p, 32); + p += 32; + + /* + * 38 . 38 session id length + * 39 . 39+n session id + * 39+n . 39+n DTLS only: cookie length (1 byte) + * 40+n . .. DTLS only: cookie + * .. . .. ciphersuitelist length (2 bytes) + * .. . .. ciphersuitelist + * .. . .. compression methods length (1 byte) + * .. . .. compression methods + * .. . .. extensions length (2 bytes) + * .. . .. extensions + */ + n = ssl->session_negotiate->id_len; + + if (n < 16 || n > 32 || +#if defined(MBEDTLS_SSL_RENEGOTIATION) + ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE || +#endif + ssl->handshake->resume == 0) { + n = 0; + } + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) + /* + * RFC 5077 section 3.4: "When presenting a ticket, the client MAY + * generate and include a Session ID in the TLS ClientHello." + */ + if (!renegotiating) { + if (ssl->session_negotiate->ticket != NULL && + ssl->session_negotiate->ticket_len != 0) { + ret = ssl->conf->f_rng(ssl->conf->p_rng, + ssl->session_negotiate->id, 32); + + if (ret != 0) { + return ret; + } + + ssl->session_negotiate->id_len = n = 32; + } + } +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + + /* + * The first check of the output buffer size above ( + * MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 38 + 1 + 32 );) + * has checked that there is enough space in the output buffer for the + * session identifier length byte and the session identifier (n <= 32). + */ + *p++ = (unsigned char) n; + + for (i = 0; i < n; i++) { + *p++ = ssl->session_negotiate->id[i]; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n)); + MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 39, n); + + /* + * With 'n' being the length of the session identifier + * + * 39+n . 39+n DTLS only: cookie length (1 byte) + * 40+n . .. DTLS only: cookie + * .. . .. ciphersuitelist length (2 bytes) + * .. . .. ciphersuitelist + * .. . .. compression methods length (1 byte) + * .. . .. compression methods + * .. . .. extensions length (2 bytes) + * .. . .. extensions + */ + + /* + * DTLS cookie + */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 1); + + if (ssl->handshake->verify_cookie == NULL) { + MBEDTLS_SSL_DEBUG_MSG(3, ("no verify cookie to send")); + *p++ = 0; + } else { + MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie", + ssl->handshake->verify_cookie, + ssl->handshake->verify_cookie_len); + + *p++ = ssl->handshake->verify_cookie_len; + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, + ssl->handshake->verify_cookie_len); + memcpy(p, ssl->handshake->verify_cookie, + ssl->handshake->verify_cookie_len); + p += ssl->handshake->verify_cookie_len; + } + } +#endif + + /* + * Ciphersuite list + */ + ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver]; + + /* Skip writing ciphersuite length for now */ + n = 0; + q = p; + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); + p += 2; + + for (i = 0; ciphersuites[i] != 0; i++) { + ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(ciphersuites[i]); + + if (ssl_validate_ciphersuite(ciphersuite_info, ssl, + ssl->conf->min_minor_ver, + ssl->conf->max_minor_ver) != 0) { + continue; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, add ciphersuite: %#04x (%s)", + (unsigned int) ciphersuites[i], ciphersuite_info->name)); + +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + uses_ec |= mbedtls_ssl_ciphersuite_uses_ec(ciphersuite_info); +#endif + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); + + n++; + MBEDTLS_PUT_UINT16_BE(ciphersuites[i], p, 0); + p += 2; + } + + MBEDTLS_SSL_DEBUG_MSG(3, + ("client hello, got %" MBEDTLS_PRINTF_SIZET + " ciphersuites (excluding SCSVs)", n)); + + /* + * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV + */ + if (!renegotiating) { + MBEDTLS_SSL_DEBUG_MSG(3, ("adding EMPTY_RENEGOTIATION_INFO_SCSV")); + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); + MBEDTLS_PUT_UINT16_BE(MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO, p, 0); + p += 2; + n++; + } + + /* Some versions of OpenSSL don't handle it correctly if not at end */ +#if defined(MBEDTLS_SSL_FALLBACK_SCSV) + if (ssl->conf->fallback == MBEDTLS_SSL_IS_FALLBACK) { + MBEDTLS_SSL_DEBUG_MSG(3, ("adding FALLBACK_SCSV")); + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); + MBEDTLS_PUT_UINT16_BE(MBEDTLS_SSL_FALLBACK_SCSV_VALUE, p, 0); + p += 2; + n++; + } +#endif + + *q++ = (unsigned char) (n >> 7); + *q++ = (unsigned char) (n << 1); + +#if defined(MBEDTLS_ZLIB_SUPPORT) + offer_compress = 1; +#else + offer_compress = 0; +#endif + + /* + * We don't support compression with DTLS right now: if many records come + * in the same datagram, uncompressing one could overwrite the next one. + * We don't want to add complexity for handling that case unless there is + * an actual need for it. + */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + offer_compress = 0; + } +#endif + + if (offer_compress) { + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, compress len.: %d", 2)); + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, compress alg.: %d %d", + MBEDTLS_SSL_COMPRESS_DEFLATE, + MBEDTLS_SSL_COMPRESS_NULL)); + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 3); + *p++ = 2; + *p++ = MBEDTLS_SSL_COMPRESS_DEFLATE; + *p++ = MBEDTLS_SSL_COMPRESS_NULL; + } else { + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, compress len.: %d", 1)); + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, compress alg.: %d", + MBEDTLS_SSL_COMPRESS_NULL)); + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); + *p++ = 1; + *p++ = MBEDTLS_SSL_COMPRESS_NULL; + } + + /* First write extensions, then the total length */ + + MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); + +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) + if ((ret = ssl_write_hostname_ext(ssl, p + 2 + ext_len, + end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_hostname_ext", ret); + return ret; + } + ext_len += olen; +#endif + + /* Note that TLS_EMPTY_RENEGOTIATION_INFO_SCSV is always added + * even if MBEDTLS_SSL_RENEGOTIATION is not defined. */ +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if ((ret = ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, + end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_renegotiation_ext", ret); + return ret; + } + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + if ((ret = ssl_write_signature_algorithms_ext(ssl, p + 2 + ext_len, + end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_signature_algorithms_ext", ret); + return ret; + } + ext_len += olen; +#endif + +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + if (uses_ec) { + if ((ret = ssl_write_supported_elliptic_curves_ext(ssl, p + 2 + ext_len, + end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_supported_elliptic_curves_ext", ret); + return ret; + } + ext_len += olen; + + if ((ret = ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, + end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_supported_point_formats_ext", ret); + return ret; + } + ext_len += olen; + } +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + if ((ret = ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, + end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_ecjpake_kkpp_ext", ret); + return ret; + } + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + if ((ret = ssl_write_cid_ext(ssl, p + 2 + ext_len, end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_cid_ext", ret); + return ret; + } + ext_len += olen; +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) + if ((ret = ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, + end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_max_fragment_length_ext", ret); + return ret; + } + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + if ((ret = ssl_write_truncated_hmac_ext(ssl, p + 2 + ext_len, + end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_truncated_hmac_ext", ret); + return ret; + } + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + if ((ret = ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, + end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_encrypt_then_mac_ext", ret); + return ret; + } + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) + if ((ret = ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, + end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_extended_ms_ext", ret); + return ret; + } + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_ALPN) + if ((ret = ssl_write_alpn_ext(ssl, p + 2 + ext_len, + end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_alpn_ext", ret); + return ret; + } + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_DTLS_SRTP) + if ((ret = ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, + end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_use_srtp_ext", ret); + return ret; + } + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) + if ((ret = ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, + end, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_session_ticket_ext", ret); + return ret; + } + ext_len += olen; +#endif + + /* olen unused if all extensions are disabled */ + ((void) olen); + + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, total extension length: %" MBEDTLS_PRINTF_SIZET, + ext_len)); + + if (ext_len > 0) { + /* No need to check for space here, because the extension + * writing functions already took care of that. */ + MBEDTLS_PUT_UINT16_BE(ext_len, p, 0); + p += 2 + ext_len; + } + + ssl->out_msglen = p - buf; + ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_HELLO; + + ssl->state++; + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + mbedtls_ssl_send_flight_completed(ssl); + } +#endif + + if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret); + return ret; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret); + return ret; + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write client hello")); + + return 0; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_renegotiation_info(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) { + /* Check verify-data in constant-time. The length OTOH is no secret */ + if (len != 1 + ssl->verify_data_len * 2 || + buf[0] != ssl->verify_data_len * 2 || + mbedtls_ct_memcmp(buf + 1, + ssl->own_verify_data, ssl->verify_data_len) != 0 || + mbedtls_ct_memcmp(buf + 1 + ssl->verify_data_len, + ssl->peer_verify_data, ssl->verify_data_len) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching renegotiation info")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + } else +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + { + if (len != 1 || buf[0] != 0x00) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("non-zero length renegotiation info")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; + } + + return 0; +} + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + /* + * server should use the extension only if we did, + * and if so the server's value should match ours (and len is always 1) + */ + if (ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE || + len != 1 || + buf[0] != ssl->conf->mfl_code) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("non-matching max fragment length extension")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + return 0; +} +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_truncated_hmac_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + if (ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED || + len != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("non-matching truncated HMAC extension")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + ((void) buf); + + ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED; + + return 0; +} +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + size_t peer_cid_len; + + if ( /* CID extension only makes sense in DTLS */ + ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM || + /* The server must only send the CID extension if we have offered it. */ + ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) { + MBEDTLS_SSL_DEBUG_MSG(1, ("CID extension unexpected")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + if (len == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("CID extension invalid")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + peer_cid_len = *buf++; + len--; + + if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) { + MBEDTLS_SSL_DEBUG_MSG(1, ("CID extension invalid")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + if (len != peer_cid_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("CID extension invalid")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED; + ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len; + memcpy(ssl->handshake->peer_cid, buf, peer_cid_len); + + MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated")); + MBEDTLS_SSL_DEBUG_BUF(3, "Server CID", buf, peer_cid_len); + + return 0; +} +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED || + ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 || + len != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("non-matching encrypt-then-MAC extension")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + ((void) buf); + + ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED; + + return 0; +} +#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED || + ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 || + len != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("non-matching extended master secret extension")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + ((void) buf); + + ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED; + + return 0; +} +#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + if (ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED || + len != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("non-matching session ticket extension")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + ((void) buf); + + ssl->handshake->new_session_ticket = 1; + + return 0; +} +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_supported_point_formats_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + size_t list_size; + const unsigned char *p; + + if (len == 0 || (size_t) (buf[0] + 1) != len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + list_size = buf[0]; + + p = buf + 1; + while (list_size > 0) { + if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED || + p[0] == MBEDTLS_ECP_PF_COMPRESSED) { +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) + ssl->handshake->ecdh_ctx.point_format = p[0]; +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + ssl->handshake->ecjpake_ctx.point_format = p[0]; +#endif + MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0])); + return 0; + } + + list_size--; + p++; + } + + MBEDTLS_SSL_DEBUG_MSG(1, ("no point format in common")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; +} +#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || + MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (ssl->handshake->ciphersuite_info->key_exchange != + MBEDTLS_KEY_EXCHANGE_ECJPAKE) { + MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension")); + return 0; + } + + /* If we got here, we no longer need our cached extension */ + mbedtls_free(ssl->handshake->ecjpake_cache); + ssl->handshake->ecjpake_cache = NULL; + ssl->handshake->ecjpake_cache_len = 0; + + if ((ret = mbedtls_ecjpake_read_round_one(&ssl->handshake->ecjpake_ctx, + buf, len)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_one", ret); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return ret; + } + + return 0; +} +#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_SSL_ALPN) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_alpn_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, size_t len) +{ + size_t list_len, name_len; + const char **p; + + /* If we didn't send it, the server shouldn't send it */ + if (ssl->conf->alpn_list == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching ALPN extension")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + /* + * opaque ProtocolName<1..2^8-1>; + * + * struct { + * ProtocolName protocol_name_list<2..2^16-1> + * } ProtocolNameList; + * + * the "ProtocolNameList" MUST contain exactly one "ProtocolName" + */ + + /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */ + if (len < 4) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + list_len = (buf[0] << 8) | buf[1]; + if (list_len != len - 2) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + name_len = buf[2]; + if (name_len != list_len - 1) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + /* Check that the server chosen protocol was in our list and save it */ + for (p = ssl->conf->alpn_list; *p != NULL; p++) { + if (name_len == strlen(*p) && + memcmp(buf + 3, *p, name_len) == 0) { + ssl->alpn_chosen = *p; + return 0; + } + } + + MBEDTLS_SSL_DEBUG_MSG(1, ("ALPN extension: no matching protocol")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; +} +#endif /* MBEDTLS_SSL_ALPN */ + +#if defined(MBEDTLS_SSL_DTLS_SRTP) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + mbedtls_ssl_srtp_profile server_protection = MBEDTLS_TLS_SRTP_UNSET; + size_t i, mki_len = 0; + uint16_t server_protection_profile_value = 0; + + /* If use_srtp is not configured, just ignore the extension */ + if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) || + (ssl->conf->dtls_srtp_profile_list == NULL) || + (ssl->conf->dtls_srtp_profile_list_len == 0)) { + return 0; + } + + /* RFC 5764 section 4.1.1 + * uint8 SRTPProtectionProfile[2]; + * + * struct { + * SRTPProtectionProfiles SRTPProtectionProfiles; + * opaque srtp_mki<0..255>; + * } UseSRTPData; + + * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>; + * + */ + if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) { + mki_len = ssl->dtls_srtp_info.mki_len; + } + + /* + * Length is 5 + optional mki_value : one protection profile length (2 bytes) + * + protection profile (2 bytes) + * + mki_len(1 byte) + * and optional srtp_mki + */ + if ((len < 5) || (len != (buf[4] + 5u))) { + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + /* + * get the server protection profile + */ + + /* + * protection profile length must be 0x0002 as we must have only + * one protection profile in server Hello + */ + if ((buf[0] != 0) || (buf[1] != 2)) { + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + server_protection_profile_value = (buf[2] << 8) | buf[3]; + server_protection = mbedtls_ssl_check_srtp_profile_value( + server_protection_profile_value); + if (server_protection != MBEDTLS_TLS_SRTP_UNSET) { + MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s", + mbedtls_ssl_get_srtp_profile_as_string( + server_protection))); + } + + ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET; + + /* + * Check we have the server profile in our list + */ + for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) { + if (server_protection == ssl->conf->dtls_srtp_profile_list[i]) { + ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i]; + MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s", + mbedtls_ssl_get_srtp_profile_as_string( + server_protection))); + break; + } + } + + /* If no match was found : server problem, it shall never answer with incompatible profile */ + if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + /* If server does not use mki in its reply, make sure the client won't keep + * one as negotiated */ + if (len == 5) { + ssl->dtls_srtp_info.mki_len = 0; + } + + /* + * RFC5764: + * If the client detects a nonzero-length MKI in the server's response + * that is different than the one the client offered, then the client + * MUST abort the handshake and SHOULD send an invalid_parameter alert. + */ + if (len > 5 && (buf[4] != mki_len || + (memcmp(ssl->dtls_srtp_info.mki_value, &buf[5], mki_len)))) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } +#if defined(MBEDTLS_DEBUG_C) + if (len > 5) { + MBEDTLS_SSL_DEBUG_BUF(3, "received mki", ssl->dtls_srtp_info.mki_value, + ssl->dtls_srtp_info.mki_len); + } +#endif + return 0; +} +#endif /* MBEDTLS_SSL_DTLS_SRTP */ + +/* + * Parse HelloVerifyRequest. Only called after verifying the HS type. + */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_hello_verify_request(mbedtls_ssl_context *ssl) +{ + const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl); + int major_ver, minor_ver; + unsigned char cookie_len; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse hello verify request")); + + /* Check that there is enough room for: + * - 2 bytes of version + * - 1 byte of cookie_len + */ + if (mbedtls_ssl_hs_hdr_len(ssl) + 3 > ssl->in_msglen) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("incoming HelloVerifyRequest message is too short")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + /* + * struct { + * ProtocolVersion server_version; + * opaque cookie<0..2^8-1>; + * } HelloVerifyRequest; + */ + MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2); + mbedtls_ssl_read_version(&major_ver, &minor_ver, ssl->conf->transport, p); + p += 2; + + /* + * Since the RFC is not clear on this point, accept DTLS 1.0 (TLS 1.1) + * even is lower than our min version. + */ + if (major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 || + minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 || + major_ver > ssl->conf->max_major_ver || + minor_ver > ssl->conf->max_minor_ver) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server version")); + + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION); + + return MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION; + } + + cookie_len = *p++; + if ((ssl->in_msg + ssl->in_msglen) - p < cookie_len) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("cookie length does not match incoming message size")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + MBEDTLS_SSL_DEBUG_BUF(3, "cookie", p, cookie_len); + + mbedtls_free(ssl->handshake->verify_cookie); + + ssl->handshake->verify_cookie = mbedtls_calloc(1, cookie_len); + if (ssl->handshake->verify_cookie == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("alloc failed (%d bytes)", cookie_len)); + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + memcpy(ssl->handshake->verify_cookie, p, cookie_len); + ssl->handshake->verify_cookie_len = cookie_len; + + /* Start over at ClientHello */ + ssl->state = MBEDTLS_SSL_CLIENT_HELLO; + mbedtls_ssl_reset_checksum(ssl); + + mbedtls_ssl_recv_flight_completed(ssl); + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse hello verify request")); + + return 0; +} +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +static int is_compression_bad(mbedtls_ssl_context *ssl, unsigned char comp) +{ + int bad_comp = 0; + + /* Suppress warnings in some configurations */ + (void) ssl; +#if defined(MBEDTLS_ZLIB_SUPPORT) + /* See comments in ssl_write_client_hello() */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + comp != MBEDTLS_SSL_COMPRESS_NULL) { + bad_comp = 1; + } +#endif + + if (comp != MBEDTLS_SSL_COMPRESS_NULL && + comp != MBEDTLS_SSL_COMPRESS_DEFLATE) { + bad_comp = 1; + } +#else /* MBEDTLS_ZLIB_SUPPORT */ + if (comp != MBEDTLS_SSL_COMPRESS_NULL) { + bad_comp = 1; + } +#endif /* MBEDTLS_ZLIB_SUPPORT */ + return bad_comp; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_server_hello(mbedtls_ssl_context *ssl) +{ + int ret, i; + size_t n; + size_t ext_len; + unsigned char *buf, *ext; + unsigned char comp; +#if defined(MBEDTLS_SSL_RENEGOTIATION) + int renegotiation_info_seen = 0; +#endif + int handshake_failure = 0; + const mbedtls_ssl_ciphersuite_t *suite_info; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse server hello")); + + if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) { + /* No alert on a read error. */ + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret); + return ret; + } + + buf = ssl->in_msg; + + if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) { +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) { + ssl->renego_records_seen++; + + if (ssl->conf->renego_max_records >= 0 && + ssl->renego_records_seen > ssl->conf->renego_max_records) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("renegotiation requested, but not honored by server")); + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } + + MBEDTLS_SSL_DEBUG_MSG(1, + ("non-handshake message during renegotiation")); + + ssl->keep_current_message = 1; + return MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO; + } +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE); + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + if (buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST) { + MBEDTLS_SSL_DEBUG_MSG(2, ("received hello verify request")); + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse server hello")); + return ssl_parse_hello_verify_request(ssl); + } else { + /* We made it through the verification process */ + mbedtls_free(ssl->handshake->verify_cookie); + ssl->handshake->verify_cookie = NULL; + ssl->handshake->verify_cookie_len = 0; + } + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + if (ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len(ssl) || + buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + /* + * 0 . 1 server_version + * 2 . 33 random (maybe including 4 bytes of Unix time) + * 34 . 34 session_id length = n + * 35 . 34+n session_id + * 35+n . 36+n cipher_suite + * 37+n . 37+n compression_method + * + * 38+n . 39+n extensions length (optional) + * 40+n . .. extensions + */ + buf += mbedtls_ssl_hs_hdr_len(ssl); + + MBEDTLS_SSL_DEBUG_BUF(3, "server hello, version", buf + 0, 2); + mbedtls_ssl_read_version(&ssl->major_ver, &ssl->minor_ver, + ssl->conf->transport, buf + 0); + + if (ssl->major_ver < ssl->conf->min_major_ver || + ssl->minor_ver < ssl->conf->min_minor_ver || + ssl->major_ver > ssl->conf->max_major_ver || + ssl->minor_ver > ssl->conf->max_minor_ver) { + MBEDTLS_SSL_DEBUG_MSG(1, + ( + "server version out of bounds - min: [%d:%d], server: [%d:%d], max: [%d:%d]", + ssl->conf->min_major_ver, + ssl->conf->min_minor_ver, + ssl->major_ver, ssl->minor_ver, + ssl->conf->max_major_ver, + ssl->conf->max_minor_ver)); + + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION); + + return MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %lu", + ((unsigned long) buf[2] << 24) | + ((unsigned long) buf[3] << 16) | + ((unsigned long) buf[4] << 8) | + ((unsigned long) buf[5]))); + + memcpy(ssl->handshake->randbytes + 32, buf + 2, 32); + + n = buf[34]; + + MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 2, 32); + + if (n > 32) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + if (ssl->in_hslen > mbedtls_ssl_hs_hdr_len(ssl) + 39 + n) { + ext_len = ((buf[38 + n] << 8) + | (buf[39 + n])); + + if ((ext_len > 0 && ext_len < 4) || + ssl->in_hslen != mbedtls_ssl_hs_hdr_len(ssl) + 40 + n + ext_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + } else if (ssl->in_hslen == mbedtls_ssl_hs_hdr_len(ssl) + 38 + n) { + ext_len = 0; + } else { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + /* ciphersuite (used later) */ + i = (buf[35 + n] << 8) | buf[36 + n]; + + /* + * Read and check compression + */ + comp = buf[37 + n]; + + if (is_compression_bad(ssl, comp)) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("server hello, bad compression: %d", comp)); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + } + + /* + * Initialize update checksum functions + */ + ssl->handshake->ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(i); + if (ssl->handshake->ciphersuite_info == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("ciphersuite info for %04x not found", (unsigned int) i)); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + mbedtls_ssl_optimize_checksum(ssl, ssl->handshake->ciphersuite_info); + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n)); + MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 35, n); + + /* + * Check if the session can be resumed + */ + if (ssl->handshake->resume == 0 || n == 0 || +#if defined(MBEDTLS_SSL_RENEGOTIATION) + ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE || +#endif + ssl->session_negotiate->ciphersuite != i || + ssl->session_negotiate->compression != comp || + ssl->session_negotiate->id_len != n || + memcmp(ssl->session_negotiate->id, buf + 35, n) != 0) { + ssl->state++; + ssl->handshake->resume = 0; +#if defined(MBEDTLS_HAVE_TIME) + ssl->session_negotiate->start = mbedtls_time(NULL); +#endif + ssl->session_negotiate->ciphersuite = i; + ssl->session_negotiate->compression = comp; + ssl->session_negotiate->id_len = n; + memcpy(ssl->session_negotiate->id, buf + 35, n); + } else { + ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed", + ssl->handshake->resume ? "a" : "no")); + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %04x", (unsigned) i)); + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: %d", + buf[37 + n])); + + /* + * Perform cipher suite validation in same way as in ssl_write_client_hello. + */ + i = 0; + while (1) { + if (ssl->conf->ciphersuite_list[ssl->minor_ver][i] == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + if (ssl->conf->ciphersuite_list[ssl->minor_ver][i++] == + ssl->session_negotiate->ciphersuite) { + break; + } + } + + suite_info = mbedtls_ssl_ciphersuite_from_id( + ssl->session_negotiate->ciphersuite); + if (ssl_validate_ciphersuite(suite_info, ssl, ssl->minor_ver, + ssl->minor_ver) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + MBEDTLS_SSL_DEBUG_MSG(3, + ("server hello, chosen ciphersuite: %s", suite_info->name)); + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA && + ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + ssl->handshake->ecrs_enabled = 1; + } +#endif + + if (comp != MBEDTLS_SSL_COMPRESS_NULL +#if defined(MBEDTLS_ZLIB_SUPPORT) + && comp != MBEDTLS_SSL_COMPRESS_DEFLATE +#endif + ) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + ssl->session_negotiate->compression = comp; + + ext = buf + 40 + n; + + MBEDTLS_SSL_DEBUG_MSG(2, + ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET, + ext_len)); + + while (ext_len) { + unsigned int ext_id = ((ext[0] << 8) + | (ext[1])); + unsigned int ext_size = ((ext[2] << 8) + | (ext[3])); + + if (ext_size + 4 > ext_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message")); + mbedtls_ssl_send_alert_message( + ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + switch (ext_id) { + case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO: + MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension")); +#if defined(MBEDTLS_SSL_RENEGOTIATION) + renegotiation_info_seen = 1; +#endif + + if ((ret = ssl_parse_renegotiation_info(ssl, ext + 4, + ext_size)) != 0) { + return ret; + } + + break; + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) + case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH: + MBEDTLS_SSL_DEBUG_MSG(3, + ("found max_fragment_length extension")); + + if ((ret = ssl_parse_max_fragment_length_ext(ssl, + ext + 4, ext_size)) != 0) { + return ret; + } + + break; +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + case MBEDTLS_TLS_EXT_TRUNCATED_HMAC: + MBEDTLS_SSL_DEBUG_MSG(3, ("found truncated_hmac extension")); + + if ((ret = ssl_parse_truncated_hmac_ext(ssl, + ext + 4, ext_size)) != 0) { + return ret; + } + + break; +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + case MBEDTLS_TLS_EXT_CID: + MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension")); + + if ((ret = ssl_parse_cid_ext(ssl, + ext + 4, + ext_size)) != 0) { + return ret; + } + + break; +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC: + MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt_then_mac extension")); + + if ((ret = ssl_parse_encrypt_then_mac_ext(ssl, + ext + 4, ext_size)) != 0) { + return ret; + } + + break; +#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) + case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET: + MBEDTLS_SSL_DEBUG_MSG(3, + ("found extended_master_secret extension")); + + if ((ret = ssl_parse_extended_ms_ext(ssl, + ext + 4, ext_size)) != 0) { + return ret; + } + + break; +#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) + case MBEDTLS_TLS_EXT_SESSION_TICKET: + MBEDTLS_SSL_DEBUG_MSG(3, ("found session_ticket extension")); + + if ((ret = ssl_parse_session_ticket_ext(ssl, + ext + 4, ext_size)) != 0) { + return ret; + } + + break; +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS: + MBEDTLS_SSL_DEBUG_MSG(3, + ("found supported_point_formats extension")); + + if ((ret = ssl_parse_supported_point_formats_ext(ssl, + ext + 4, ext_size)) != 0) { + return ret; + } + + break; +#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || + MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + case MBEDTLS_TLS_EXT_ECJPAKE_KKPP: + MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake_kkpp extension")); + + if ((ret = ssl_parse_ecjpake_kkpp(ssl, + ext + 4, ext_size)) != 0) { + return ret; + } + + break; +#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_SSL_ALPN) + case MBEDTLS_TLS_EXT_ALPN: + MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension")); + + if ((ret = ssl_parse_alpn_ext(ssl, ext + 4, ext_size)) != 0) { + return ret; + } + + break; +#endif /* MBEDTLS_SSL_ALPN */ + +#if defined(MBEDTLS_SSL_DTLS_SRTP) + case MBEDTLS_TLS_EXT_USE_SRTP: + MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension")); + + if ((ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size)) != 0) { + return ret; + } + + break; +#endif /* MBEDTLS_SSL_DTLS_SRTP */ + + default: + MBEDTLS_SSL_DEBUG_MSG(3, + ("unknown extension found: %u (ignoring)", ext_id)); + } + + ext_len -= 4 + ext_size; + ext += 4 + ext_size; + + if (ext_len > 0 && ext_len < 4) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + } + + /* + * mbedtls_ssl_derive_keys() has to be called after the parsing of the + * extensions. It sets the transform data for the resumed session which in + * case of DTLS includes the server CID extracted from the CID extension. + */ + if (ssl->handshake->resume) { + if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR); + return ret; + } + } + + /* + * Renegotiation security checks + */ + if (ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && + ssl->conf->allow_legacy_renegotiation == + MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("legacy renegotiation, breaking off handshake")); + handshake_failure = 1; + } +#if defined(MBEDTLS_SSL_RENEGOTIATION) + else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && + ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION && + renegotiation_info_seen == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("renegotiation_info extension missing (secure)")); + handshake_failure = 1; + } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && + ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && + ssl->conf->allow_legacy_renegotiation == + MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) { + MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed")); + handshake_failure = 1; + } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && + ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && + renegotiation_info_seen == 1) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("renegotiation_info extension present (legacy)")); + handshake_failure = 1; + } +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + + if (handshake_failure == 1) { + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse server hello")); + + return 0; +} + +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_server_dh_params(mbedtls_ssl_context *ssl, + unsigned char **p, + unsigned char *end) +{ + int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + size_t dhm_actual_bitlen; + + /* + * Ephemeral DH parameters: + * + * struct { + * opaque dh_p<1..2^16-1>; + * opaque dh_g<1..2^16-1>; + * opaque dh_Ys<1..2^16-1>; + * } ServerDHParams; + */ + if ((ret = mbedtls_dhm_read_params(&ssl->handshake->dhm_ctx, + p, end)) != 0) { + MBEDTLS_SSL_DEBUG_RET(2, ("mbedtls_dhm_read_params"), ret); + return ret; + } + + dhm_actual_bitlen = mbedtls_mpi_bitlen(&ssl->handshake->dhm_ctx.P); + if (dhm_actual_bitlen < ssl->conf->dhm_min_bitlen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("DHM prime too short: %" MBEDTLS_PRINTF_SIZET " < %u", + dhm_actual_bitlen, + ssl->conf->dhm_min_bitlen)); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P); + MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G); + MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY); + + return ret; +} +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_check_server_ecdh_params(const mbedtls_ssl_context *ssl) +{ + const mbedtls_ecp_curve_info *curve_info; + mbedtls_ecp_group_id grp_id; +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + grp_id = ssl->handshake->ecdh_ctx.grp.id; +#else + grp_id = ssl->handshake->ecdh_ctx.grp_id; +#endif /* MBEDTLS_ECDH_LEGACY_CONTEXT */ + + curve_info = mbedtls_ecp_curve_info_from_grp_id(grp_id); + if (curve_info == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("ECDH curve: %s", curve_info->name)); + +#if defined(MBEDTLS_ECP_C) + if (mbedtls_ssl_check_curve(ssl, grp_id) != 0) { + return -1; + } +#else + if (ssl->handshake->ecdh_ctx.grp.nbits < 163 || + ssl->handshake->ecdh_ctx.grp.nbits > 521) { + return -1; + } +#endif /* MBEDTLS_ECP_C */ + + MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx, + MBEDTLS_DEBUG_ECDH_QP); + + return 0; +} +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ + +#if defined(MBEDTLS_USE_PSA_CRYPTO) && \ + (defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_server_ecdh_params_psa(mbedtls_ssl_context *ssl, + unsigned char **p, + unsigned char *end) +{ + uint16_t tls_id; + size_t ecdh_bits = 0; + uint8_t ecpoint_len; + mbedtls_ssl_handshake_params *handshake = ssl->handshake; + + /* + * Parse ECC group + */ + + if (end - *p < 4) { + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + /* First byte is curve_type; only named_curve is handled */ + if (*(*p)++ != MBEDTLS_ECP_TLS_NAMED_CURVE) { + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + /* Next two bytes are the namedcurve value */ + tls_id = *(*p)++; + tls_id <<= 8; + tls_id |= *(*p)++; + + /* Check it's a curve we offered */ + if (mbedtls_ssl_check_curve_tls_id(ssl, tls_id) != 0) { + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + /* Convert EC group to PSA key type. */ + if ((handshake->ecdh_psa_type = + mbedtls_psa_parse_tls_ecc_group(tls_id, &ecdh_bits)) == 0) { + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + if (ecdh_bits > 0xffff) { + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + handshake->ecdh_bits = (uint16_t) ecdh_bits; + + /* + * Put peer's ECDH public key in the format understood by PSA. + */ + + ecpoint_len = *(*p)++; + if ((size_t) (end - *p) < ecpoint_len) { + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + if (mbedtls_psa_tls_ecpoint_to_psa_ec( + *p, ecpoint_len, + handshake->ecdh_psa_peerkey, + sizeof(handshake->ecdh_psa_peerkey), + &handshake->ecdh_psa_peerkey_len) != 0) { + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + + *p += ecpoint_len; + return 0; +} +#endif /* MBEDTLS_USE_PSA_CRYPTO && + ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_server_ecdh_params(mbedtls_ssl_context *ssl, + unsigned char **p, + unsigned char *end) +{ + int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + + /* + * Ephemeral ECDH parameters: + * + * struct { + * ECParameters curve_params; + * ECPoint public; + * } ServerECDHParams; + */ + if ((ret = mbedtls_ecdh_read_params(&ssl->handshake->ecdh_ctx, + (const unsigned char **) p, end)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_read_params"), ret); +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS) { + ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; + } +#endif + return ret; + } + + if (ssl_check_server_ecdh_params(ssl) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("bad server key exchange message (ECDHE curve)")); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + return ret; +} +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_server_psk_hint(mbedtls_ssl_context *ssl, + unsigned char **p, + unsigned char *end) +{ + int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + uint16_t len; + ((void) ssl); + + /* + * PSK parameters: + * + * opaque psk_identity_hint<0..2^16-1>; + */ + if (end - (*p) < 2) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("bad server key exchange message (psk_identity_hint length)")); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + len = (*p)[0] << 8 | (*p)[1]; + *p += 2; + + if (end - (*p) < len) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("bad server key exchange message (psk_identity_hint length)")); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + /* + * Note: we currently ignore the PSK identity hint, as we only allow one + * PSK to be provisioned on the client. This could be changed later if + * someone needs that feature. + */ + *p += len; + ret = 0; + + return ret; +} +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) +/* + * Generate a pre-master secret and encrypt it with the server's RSA key + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_encrypted_pms(mbedtls_ssl_context *ssl, + size_t offset, size_t *olen, + size_t pms_offset) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len_bytes = ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ? 0 : 2; + unsigned char *p = ssl->handshake->premaster + pms_offset; + mbedtls_pk_context *peer_pk; + + if (offset + len_bytes > MBEDTLS_SSL_OUT_CONTENT_LEN) { + MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small for encrypted pms")); + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + + /* + * Generate (part of) the pre-master as + * struct { + * ProtocolVersion client_version; + * opaque random[46]; + * } PreMasterSecret; + */ + mbedtls_ssl_write_version(ssl->conf->max_major_ver, + ssl->conf->max_minor_ver, + ssl->conf->transport, p); + + if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p + 2, 46)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "f_rng", ret); + return ret; + } + + ssl->handshake->pmslen = 48; + +#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + peer_pk = &ssl->handshake->peer_pubkey; +#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + if (ssl->session_negotiate->peer_cert == NULL) { + /* Should never happen */ + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + peer_pk = &ssl->session_negotiate->peer_cert->pk; +#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + + /* + * Now write it out, encrypted + */ + if (!mbedtls_pk_can_do(peer_pk, MBEDTLS_PK_RSA)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("certificate key type mismatch")); + return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH; + } + + if ((ret = mbedtls_pk_encrypt(peer_pk, + p, ssl->handshake->pmslen, + ssl->out_msg + offset + len_bytes, olen, + MBEDTLS_SSL_OUT_CONTENT_LEN - offset - len_bytes, + ssl->conf->f_rng, ssl->conf->p_rng)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_rsa_pkcs1_encrypt", ret); + return ret; + } + +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (len_bytes == 2) { + MBEDTLS_PUT_UINT16_BE(*olen, ssl->out_msg, offset); + *olen += 2; + } +#endif + +#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + /* We don't need the peer's public key anymore. Free it. */ + mbedtls_pk_free(peer_pk); +#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + return 0; +} +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_signature_algorithm(mbedtls_ssl_context *ssl, + unsigned char **p, + unsigned char *end, + mbedtls_md_type_t *md_alg, + mbedtls_pk_type_t *pk_alg) +{ + ((void) ssl); + *md_alg = MBEDTLS_MD_NONE; + *pk_alg = MBEDTLS_PK_NONE; + + /* Only in TLS 1.2 */ + if (ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3) { + return 0; + } + + if ((*p) + 2 > end) { + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + /* + * Get hash algorithm + */ + if ((*md_alg = mbedtls_ssl_md_alg_from_hash((*p)[0])) + == MBEDTLS_MD_NONE) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("Server used unsupported HashAlgorithm %d", *(p)[0])); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + /* + * Get signature algorithm + */ + if ((*pk_alg = mbedtls_ssl_pk_alg_from_sig((*p)[1])) + == MBEDTLS_PK_NONE) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("server used unsupported SignatureAlgorithm %d", (*p)[1])); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + /* + * Check if the hash is acceptable + */ + if (mbedtls_ssl_check_sig_hash(ssl, *md_alg) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("server used HashAlgorithm %d that was not offered", *(p)[0])); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("Server used SignatureAlgorithm %d", + (*p)[1])); + MBEDTLS_SSL_DEBUG_MSG(2, ("Server used HashAlgorithm %d", + (*p)[0])); + *p += 2; + + return 0; +} +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const mbedtls_ecp_keypair *peer_key; + mbedtls_pk_context *peer_pk; + +#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + peer_pk = &ssl->handshake->peer_pubkey; +#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + if (ssl->session_negotiate->peer_cert == NULL) { + /* Should never happen */ + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + peer_pk = &ssl->session_negotiate->peer_cert->pk; +#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + + /* This is a public key, so it can't be opaque, so can_do() is a good + * enough check to ensure pk_ec() is safe to use below. */ + if (!mbedtls_pk_can_do(peer_pk, MBEDTLS_PK_ECKEY)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable")); + return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH; + } + + peer_key = mbedtls_pk_ec(*peer_pk); + + if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx, peer_key, + MBEDTLS_ECDH_THEIRS)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret); + return ret; + } + + if (ssl_check_server_ecdh_params(ssl) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server certificate (ECDH curve)")); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; + } + +#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + /* We don't need the peer's public key anymore. Free it, + * so that more RAM is available for upcoming expensive + * operations like ECDHE. */ + mbedtls_pk_free(peer_pk); +#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + + return ret; +} +#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || + MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_server_key_exchange(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + unsigned char *p = NULL, *end = NULL; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse server key exchange")); + +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse server key exchange")); + ssl->state++; + return 0; + } + ((void) p); + ((void) end); +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) { + if ((ret = ssl_get_ecdh_params_from_cert(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return ret; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse server key exchange")); + ssl->state++; + return 0; + } + ((void) p); + ((void) end); +#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ssl->handshake->ecrs_enabled && + ssl->handshake->ecrs_state == ssl_ecrs_ske_start_processing) { + goto start_processing; + } +#endif + + if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret); + return ret; + } + + if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE); + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } + + /* + * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server + * doesn't use a psk_identity_hint + */ + if (ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE) { + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) { + /* Current message is probably either + * CertificateRequest or ServerHelloDone */ + ssl->keep_current_message = 1; + goto exit; + } + + MBEDTLS_SSL_DEBUG_MSG(1, + ("server key exchange message must not be skipped")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE); + + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ssl->handshake->ecrs_enabled) { + ssl->handshake->ecrs_state = ssl_ecrs_ske_start_processing; + } + +start_processing: +#endif + p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl); + end = ssl->in_msg + ssl->in_hslen; + MBEDTLS_SSL_DEBUG_BUF(3, "server key exchange", p, end - p); + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) { + if (ssl_parse_server_psk_hint(ssl, &p, end) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + } /* FALLTHROUGH */ +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) { + ; /* nothing more to do */ + } else +#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED || + MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) { + if (ssl_parse_server_dh_params(ssl, &p, end) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + } else +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ +#if defined(MBEDTLS_USE_PSA_CRYPTO) && \ + (defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA) { + if (ssl_parse_server_ecdh_params_psa(ssl, &p, end) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + } else +#endif /* MBEDTLS_USE_PSA_CRYPTO && + ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA) { + if (ssl_parse_server_ecdh_params(ssl, &p, end) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + } else +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) { + ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx, + p, end - p); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + } else +#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) + if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) { + size_t sig_len, hashlen; +#if defined(MBEDTLS_USE_PSA_CRYPTO) + unsigned char hash[PSA_HASH_MAX_SIZE]; +#else + unsigned char hash[MBEDTLS_MD_MAX_SIZE]; +#endif + mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE; + mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE; + unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl); + size_t params_len = p - params; + void *rs_ctx = NULL; + + mbedtls_pk_context *peer_pk; + + /* + * Handle the digitally-signed structure + */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + if (ssl_parse_signature_algorithm(ssl, &p, end, + &md_alg, &pk_alg) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("bad server key exchange message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + if (pk_alg != + mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info)) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("bad server key exchange message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + } else +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) + if (ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3) { + pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info); + + /* Default hash for ECDSA is SHA-1 */ + if (pk_alg == MBEDTLS_PK_ECDSA && md_alg == MBEDTLS_MD_NONE) { + md_alg = MBEDTLS_MD_SHA1; + } + } else +#endif + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + /* + * Read signature + */ + + if (p > end - 2) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + sig_len = (p[0] << 8) | p[1]; + p += 2; + + if (p != end - sig_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + MBEDTLS_SSL_DEBUG_BUF(3, "signature", p, sig_len); + + /* + * Compute the hash that has been signed + */ +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) + if (md_alg == MBEDTLS_MD_NONE) { + hashlen = 36; + ret = mbedtls_ssl_get_key_exchange_md_ssl_tls(ssl, hash, params, + params_len); + if (ret != 0) { + return ret; + } + } else +#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ + MBEDTLS_SSL_PROTO_TLS1_1 */ +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (md_alg != MBEDTLS_MD_NONE) { + ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen, + params, params_len, + md_alg); + if (ret != 0) { + return ret; + } + } else +#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ + MBEDTLS_SSL_PROTO_TLS1_2 */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen); + +#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + peer_pk = &ssl->handshake->peer_pubkey; +#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + if (ssl->session_negotiate->peer_cert == NULL) { + /* Should never happen */ + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + peer_pk = &ssl->session_negotiate->peer_cert->pk; +#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + + /* + * Verify signature + */ + if (!mbedtls_pk_can_do(peer_pk, pk_alg)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH; + } + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ssl->handshake->ecrs_enabled) { + rs_ctx = &ssl->handshake->ecrs_ctx.pk; + } +#endif /* MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED */ + + if ((ret = mbedtls_pk_verify_restartable(peer_pk, + md_alg, hash, hashlen, p, sig_len, rs_ctx)) != 0) { +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret); + return MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; + } +#endif /* MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED */ + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR); + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret); + return ret; + } + +#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + /* We don't need the peer's public key anymore. Free it, + * so that more RAM is available for upcoming expensive + * operations like ECDHE. */ + mbedtls_pk_free(peer_pk); +#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + } +#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */ + +exit: + ssl->state++; + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse server key exchange")); + + return 0; +} + +#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_certificate_request(mbedtls_ssl_context *ssl) +{ + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate request")); + + if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate request")); + ssl->state++; + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; +} +#else /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_certificate_request(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *buf; + size_t n = 0; + size_t cert_type_len = 0, dn_len = 0; + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate request")); + + if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate request")); + ssl->state++; + return 0; + } + + if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret); + return ret; + } + + if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate request message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE); + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } + + ssl->state++; + ssl->client_auth = (ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST); + + MBEDTLS_SSL_DEBUG_MSG(3, ("got %s certificate request", + ssl->client_auth ? "a" : "no")); + + if (ssl->client_auth == 0) { + /* Current message is probably the ServerHelloDone */ + ssl->keep_current_message = 1; + goto exit; + } + + /* + * struct { + * ClientCertificateType certificate_types<1..2^8-1>; + * SignatureAndHashAlgorithm + * supported_signature_algorithms<2^16-1>; -- TLS 1.2 only + * DistinguishedName certificate_authorities<0..2^16-1>; + * } CertificateRequest; + * + * Since we only support a single certificate on clients, let's just + * ignore all the information that's supposed to help us pick a + * certificate. + * + * We could check that our certificate matches the request, and bail out + * if it doesn't, but it's simpler to just send the certificate anyway, + * and give the server the opportunity to decide if it should terminate + * the connection when it doesn't like our certificate. + * + * Same goes for the hash in TLS 1.2's signature_algorithms: at this + * point we only have one hash available (see comments in + * write_certificate_verify), so let's just use what we have. + * + * However, we still minimally parse the message to check it is at least + * superficially sane. + */ + buf = ssl->in_msg; + + /* certificate_types */ + if (ssl->in_hslen <= mbedtls_ssl_hs_hdr_len(ssl)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate request message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST; + } + cert_type_len = buf[mbedtls_ssl_hs_hdr_len(ssl)]; + n = cert_type_len; + + /* + * In the subsequent code there are two paths that read from buf: + * * the length of the signature algorithms field (if minor version of + * SSL is 3), + * * distinguished name length otherwise. + * Both reach at most the index: + * ...hdr_len + 2 + n, + * therefore the buffer length at this point must be greater than that + * regardless of the actual code path. + */ + if (ssl->in_hslen <= mbedtls_ssl_hs_hdr_len(ssl) + 2 + n) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate request message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST; + } + + /* supported_signature_algorithms */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + size_t sig_alg_len = + ((buf[mbedtls_ssl_hs_hdr_len(ssl) + 1 + n] << 8) + | (buf[mbedtls_ssl_hs_hdr_len(ssl) + 2 + n])); +#if defined(MBEDTLS_DEBUG_C) + unsigned char *sig_alg; + size_t i; +#endif + + /* + * The furthest access in buf is in the loop few lines below: + * sig_alg[i + 1], + * where: + * sig_alg = buf + ...hdr_len + 3 + n, + * max(i) = sig_alg_len - 1. + * Therefore the furthest access is: + * buf[...hdr_len + 3 + n + sig_alg_len - 1 + 1], + * which reduces to: + * buf[...hdr_len + 3 + n + sig_alg_len], + * which is one less than we need the buf to be. + */ + if (ssl->in_hslen <= mbedtls_ssl_hs_hdr_len(ssl) + + 3 + n + sig_alg_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate request message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST; + } + +#if defined(MBEDTLS_DEBUG_C) + sig_alg = buf + mbedtls_ssl_hs_hdr_len(ssl) + 3 + n; + for (i = 0; i < sig_alg_len; i += 2) { + MBEDTLS_SSL_DEBUG_MSG(3, + ("Supported Signature Algorithm found: %d,%d", + sig_alg[i], sig_alg[i + 1])); + } +#endif + + n += 2 + sig_alg_len; + } +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + + /* certificate_authorities */ + dn_len = ((buf[mbedtls_ssl_hs_hdr_len(ssl) + 1 + n] << 8) + | (buf[mbedtls_ssl_hs_hdr_len(ssl) + 2 + n])); + + n += dn_len; + if (ssl->in_hslen != mbedtls_ssl_hs_hdr_len(ssl) + 3 + n) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate request message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST; + } + +exit: + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate request")); + + return 0; +} +#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */ + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_server_hello_done(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse server hello done")); + + if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret); + return ret; + } + + if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello done message")); + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } + + if (ssl->in_hslen != mbedtls_ssl_hs_hdr_len(ssl) || + ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello done message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE; + } + + ssl->state++; + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + mbedtls_ssl_recv_flight_completed(ssl); + } +#endif + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse server hello done")); + + return 0; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_client_key_exchange(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + size_t header_len; + size_t content_len; + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write client key exchange")); + +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) { + /* + * DHM key exchange -- send G^X mod P + */ + content_len = ssl->handshake->dhm_ctx.len; + + MBEDTLS_PUT_UINT16_BE(content_len, ssl->out_msg, 4); + header_len = 6; + + ret = mbedtls_dhm_make_public(&ssl->handshake->dhm_ctx, + (int) mbedtls_mpi_size(&ssl->handshake->dhm_ctx.P), + &ssl->out_msg[header_len], content_len, + ssl->conf->f_rng, ssl->conf->p_rng); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_public", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X); + MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX); + + if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx, + ssl->handshake->premaster, + MBEDTLS_PREMASTER_SIZE, + &ssl->handshake->pmslen, + ssl->conf->f_rng, ssl->conf->p_rng)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K); + } else +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ +#if defined(MBEDTLS_USE_PSA_CRYPTO) && \ + (defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA) { + psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; + psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED; + psa_key_attributes_t key_attributes; + + mbedtls_ssl_handshake_params *handshake = ssl->handshake; + + unsigned char own_pubkey[MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH]; + size_t own_pubkey_len; + unsigned char *own_pubkey_ecpoint; + size_t own_pubkey_ecpoint_len; + + header_len = 4; + + MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation.")); + + /* + * Generate EC private key for ECDHE exchange. + */ + + /* The master secret is obtained from the shared ECDH secret by + * applying the TLS 1.2 PRF with a specific salt and label. While + * the PSA Crypto API encourages combining key agreement schemes + * such as ECDH with fixed KDFs such as TLS 1.2 PRF, it does not + * yet support the provisioning of salt + label to the KDF. + * For the time being, we therefore need to split the computation + * of the ECDH secret and the application of the TLS 1.2 PRF. */ + key_attributes = psa_key_attributes_init(); + psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE); + psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH); + psa_set_key_type(&key_attributes, handshake->ecdh_psa_type); + psa_set_key_bits(&key_attributes, handshake->ecdh_bits); + + /* Generate ECDH private key. */ + status = psa_generate_key(&key_attributes, + &handshake->ecdh_psa_privkey); + if (status != PSA_SUCCESS) { + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + + /* Export the public part of the ECDH private key from PSA + * and convert it to ECPoint format used in ClientKeyExchange. */ + status = psa_export_public_key(handshake->ecdh_psa_privkey, + own_pubkey, sizeof(own_pubkey), + &own_pubkey_len); + if (status != PSA_SUCCESS) { + psa_destroy_key(handshake->ecdh_psa_privkey); + handshake->ecdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT; + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + + if (mbedtls_psa_tls_psa_ec_to_ecpoint(own_pubkey, + own_pubkey_len, + &own_pubkey_ecpoint, + &own_pubkey_ecpoint_len) != 0) { + psa_destroy_key(handshake->ecdh_psa_privkey); + handshake->ecdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT; + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + + /* Copy ECPoint structure to outgoing message buffer. */ + ssl->out_msg[header_len] = (unsigned char) own_pubkey_ecpoint_len; + memcpy(ssl->out_msg + header_len + 1, + own_pubkey_ecpoint, own_pubkey_ecpoint_len); + content_len = own_pubkey_ecpoint_len + 1; + + /* The ECDH secret is the premaster secret used for key derivation. */ + + /* Compute ECDH shared secret. */ + status = psa_raw_key_agreement(PSA_ALG_ECDH, + handshake->ecdh_psa_privkey, + handshake->ecdh_psa_peerkey, + handshake->ecdh_psa_peerkey_len, + ssl->handshake->premaster, + sizeof(ssl->handshake->premaster), + &ssl->handshake->pmslen); + + destruction_status = psa_destroy_key(handshake->ecdh_psa_privkey); + handshake->ecdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT; + + if (status != PSA_SUCCESS || destruction_status != PSA_SUCCESS) { + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + } else +#endif /* MBEDTLS_USE_PSA_CRYPTO && + ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) { + /* + * ECDH key exchange -- send client public value + */ + header_len = 4; + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ssl->handshake->ecrs_enabled) { + if (ssl->handshake->ecrs_state == ssl_ecrs_cke_ecdh_calc_secret) { + goto ecdh_calc_secret; + } + + mbedtls_ecdh_enable_restart(&ssl->handshake->ecdh_ctx); + } +#endif + + ret = mbedtls_ecdh_make_public(&ssl->handshake->ecdh_ctx, + &content_len, + &ssl->out_msg[header_len], 1000, + ssl->conf->f_rng, ssl->conf->p_rng); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_public", ret); +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS) { + ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; + } +#endif + return ret; + } + + MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx, + MBEDTLS_DEBUG_ECDH_Q); + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ssl->handshake->ecrs_enabled) { + ssl->handshake->ecrs_n = content_len; + ssl->handshake->ecrs_state = ssl_ecrs_cke_ecdh_calc_secret; + } + +ecdh_calc_secret: + if (ssl->handshake->ecrs_enabled) { + content_len = ssl->handshake->ecrs_n; + } +#endif + if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx, + &ssl->handshake->pmslen, + ssl->handshake->premaster, + MBEDTLS_MPI_MAX_SIZE, + ssl->conf->f_rng, ssl->conf->p_rng)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret); +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS) { + ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; + } +#endif + return ret; + } + + MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx, + MBEDTLS_DEBUG_ECDH_Z); + } else +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) + if (mbedtls_ssl_ciphersuite_uses_psk(ciphersuite_info)) { + /* + * opaque psk_identity<0..2^16-1>; + */ + if (ssl_conf_has_static_psk(ssl->conf) == 0) { + /* We don't offer PSK suites if we don't have a PSK, + * and we check that the server's choice is among the + * ciphersuites we offered, so this should never happen. */ + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + header_len = 4; + content_len = ssl->conf->psk_identity_len; + + if (header_len + 2 + content_len > MBEDTLS_SSL_OUT_CONTENT_LEN) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("psk identity too long or SSL buffer too short")); + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + + ssl->out_msg[header_len++] = MBEDTLS_BYTE_1(content_len); + ssl->out_msg[header_len++] = MBEDTLS_BYTE_0(content_len); + + memcpy(ssl->out_msg + header_len, + ssl->conf->psk_identity, + ssl->conf->psk_identity_len); + header_len += ssl->conf->psk_identity_len; + +#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) { + content_len = 0; + } else +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) { +#if defined(MBEDTLS_USE_PSA_CRYPTO) + /* Opaque PSKs are currently only supported for PSK-only suites. */ + if (ssl_conf_has_static_raw_psk(ssl->conf) == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("opaque PSK not supported with RSA-PSK")); + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + if ((ret = ssl_write_encrypted_pms(ssl, header_len, + &content_len, 2)) != 0) { + return ret; + } + } else +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) { +#if defined(MBEDTLS_USE_PSA_CRYPTO) + /* Opaque PSKs are currently only supported for PSK-only suites. */ + if (ssl_conf_has_static_raw_psk(ssl->conf) == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("opaque PSK not supported with DHE-PSK")); + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + /* + * ClientDiffieHellmanPublic public (DHM send G^X mod P) + */ + content_len = ssl->handshake->dhm_ctx.len; + + if (header_len + 2 + content_len > + MBEDTLS_SSL_OUT_CONTENT_LEN) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("psk identity or DHM size too long or SSL buffer too short")); + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + + ssl->out_msg[header_len++] = MBEDTLS_BYTE_1(content_len); + ssl->out_msg[header_len++] = MBEDTLS_BYTE_0(content_len); + + ret = mbedtls_dhm_make_public(&ssl->handshake->dhm_ctx, + (int) mbedtls_mpi_size(&ssl->handshake->dhm_ctx.P), + &ssl->out_msg[header_len], content_len, + ssl->conf->f_rng, ssl->conf->p_rng); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_public", ret); + return ret; + } + } else +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) { +#if defined(MBEDTLS_USE_PSA_CRYPTO) + /* Opaque PSKs are currently only supported for PSK-only suites. */ + if (ssl_conf_has_static_raw_psk(ssl->conf) == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("opaque PSK not supported with ECDHE-PSK")); + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + /* + * ClientECDiffieHellmanPublic public; + */ + ret = mbedtls_ecdh_make_public(&ssl->handshake->ecdh_ctx, + &content_len, + &ssl->out_msg[header_len], + MBEDTLS_SSL_OUT_CONTENT_LEN - header_len, + ssl->conf->f_rng, ssl->conf->p_rng); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_public", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx, + MBEDTLS_DEBUG_ECDH_Q); + } else +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) && \ + defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK && + ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 && + ssl_conf_has_static_raw_psk(ssl->conf) == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("skip PMS generation for opaque PSK")); + } else +#endif /* MBEDTLS_USE_PSA_CRYPTO && + MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ + if ((ret = mbedtls_ssl_psk_derive_premaster(ssl, + ciphersuite_info->key_exchange)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, + "mbedtls_ssl_psk_derive_premaster", ret); + return ret; + } + } else +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) { + header_len = 4; + if ((ret = ssl_write_encrypted_pms(ssl, header_len, + &content_len, 0)) != 0) { + return ret; + } + } else +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) { + header_len = 4; + + ret = mbedtls_ecjpake_write_round_two(&ssl->handshake->ecjpake_ctx, + ssl->out_msg + header_len, + MBEDTLS_SSL_OUT_CONTENT_LEN - header_len, + &content_len, + ssl->conf->f_rng, ssl->conf->p_rng); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret); + return ret; + } + + ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx, + ssl->handshake->premaster, 32, &ssl->handshake->pmslen, + ssl->conf->f_rng, ssl->conf->p_rng); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret); + return ret; + } + } else +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ + { + ((void) ciphersuite_info); + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + ssl->out_msglen = header_len + content_len; + ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE; + + ssl->state++; + + if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write client key exchange")); + + return 0; +} + +#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_certificate_verify(mbedtls_ssl_context *ssl) +{ + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate verify")); + + if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret); + return ret; + } + + if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate verify")); + ssl->state++; + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; +} +#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_certificate_verify(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + size_t n = 0, offset = 0; + unsigned char hash[48]; + unsigned char *hash_start = hash; + mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE; + size_t hashlen; + void *rs_ctx = NULL; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate verify")); + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ssl->handshake->ecrs_enabled && + ssl->handshake->ecrs_state == ssl_ecrs_crt_vrfy_sign) { + goto sign; + } +#endif + + if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret); + return ret; + } + + if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate verify")); + ssl->state++; + return 0; + } + + if (ssl->client_auth == 0 || mbedtls_ssl_own_cert(ssl) == NULL) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate verify")); + ssl->state++; + return 0; + } + + if (mbedtls_ssl_own_key(ssl) == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key for certificate")); + return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED; + } + + /* + * Make a signature of the handshake digests + */ +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ssl->handshake->ecrs_enabled) { + ssl->handshake->ecrs_state = ssl_ecrs_crt_vrfy_sign; + } + +sign: +#endif + + ssl->handshake->calc_verify(ssl, hash, &hashlen); + +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) + if (ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3) { + /* + * digitally-signed struct { + * opaque md5_hash[16]; + * opaque sha_hash[20]; + * }; + * + * md5_hash + * MD5(handshake_messages); + * + * sha_hash + * SHA(handshake_messages); + */ + md_alg = MBEDTLS_MD_NONE; + + /* + * For ECDSA, default hash is SHA-1 only + */ + if (mbedtls_pk_can_do(mbedtls_ssl_own_key(ssl), MBEDTLS_PK_ECDSA)) { + hash_start += 16; + hashlen -= 16; + md_alg = MBEDTLS_MD_SHA1; + } + } else +#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ + MBEDTLS_SSL_PROTO_TLS1_1 */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + /* + * digitally-signed struct { + * opaque handshake_messages[handshake_messages_length]; + * }; + * + * Taking shortcut here. We assume that the server always allows the + * PRF Hash function and has sent it in the allowed signature + * algorithms list received in the Certificate Request message. + * + * Until we encounter a server that does not, we will take this + * shortcut. + * + * Reason: Otherwise we should have running hashes for SHA512 and + * SHA224 in order to satisfy 'weird' needs from the server + * side. + */ + if (ssl->handshake->ciphersuite_info->mac == MBEDTLS_MD_SHA384) { + md_alg = MBEDTLS_MD_SHA384; + ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384; + } else { + md_alg = MBEDTLS_MD_SHA256; + ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256; + } + ssl->out_msg[5] = mbedtls_ssl_sig_from_pk(mbedtls_ssl_own_key(ssl)); + + /* Info from md_alg will be used instead */ + hashlen = 0; + offset = 2; + } else +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ssl->handshake->ecrs_enabled) { + rs_ctx = &ssl->handshake->ecrs_ctx.pk; + } +#endif + + if ((ret = mbedtls_pk_sign_restartable(mbedtls_ssl_own_key(ssl), + md_alg, hash_start, hashlen, + ssl->out_msg + 6 + offset, &n, + ssl->conf->f_rng, ssl->conf->p_rng, rs_ctx)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret); +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS) { + ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; + } +#endif + return ret; + } + + MBEDTLS_PUT_UINT16_BE(n, ssl->out_msg, offset + 4); + + ssl->out_msglen = 6 + n + offset; + ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY; + + ssl->state++; + + if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate verify")); + + return ret; +} +#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */ + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_new_session_ticket(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + uint32_t lifetime; + size_t ticket_len; + unsigned char *ticket; + const unsigned char *msg; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse new session ticket")); + + if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret); + return ret; + } + + if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad new session ticket message")); + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE); + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } + + /* + * struct { + * uint32 ticket_lifetime_hint; + * opaque ticket<0..2^16-1>; + * } NewSessionTicket; + * + * 0 . 3 ticket_lifetime_hint + * 4 . 5 ticket_len (n) + * 6 . 5+n ticket content + */ + if (ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET || + ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len(ssl)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad new session ticket message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET; + } + + msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl); + + lifetime = (((uint32_t) msg[0]) << 24) | (msg[1] << 16) | + (msg[2] << 8) | (msg[3]); + + ticket_len = (msg[4] << 8) | (msg[5]); + + if (ticket_len + 6 + mbedtls_ssl_hs_hdr_len(ssl) != ssl->in_hslen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad new session ticket message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, ticket_len)); + + /* We're not waiting for a NewSessionTicket message any more */ + ssl->handshake->new_session_ticket = 0; + ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC; + + /* + * Zero-length ticket means the server changed his mind and doesn't want + * to send a ticket after all, so just forget it + */ + if (ticket_len == 0) { + return 0; + } + + if (ssl->session != NULL && ssl->session->ticket != NULL) { + mbedtls_platform_zeroize(ssl->session->ticket, + ssl->session->ticket_len); + mbedtls_free(ssl->session->ticket); + ssl->session->ticket = NULL; + ssl->session->ticket_len = 0; + } + + mbedtls_platform_zeroize(ssl->session_negotiate->ticket, + ssl->session_negotiate->ticket_len); + mbedtls_free(ssl->session_negotiate->ticket); + ssl->session_negotiate->ticket = NULL; + ssl->session_negotiate->ticket_len = 0; + + if ((ticket = mbedtls_calloc(1, ticket_len)) == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("ticket alloc failed")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR); + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + memcpy(ticket, msg + 6, ticket_len); + + ssl->session_negotiate->ticket = ticket; + ssl->session_negotiate->ticket_len = ticket_len; + ssl->session_negotiate->ticket_lifetime = lifetime; + + /* + * RFC 5077 section 3.4: + * "If the client receives a session ticket from the server, then it + * discards any Session ID that was sent in the ServerHello." + */ + MBEDTLS_SSL_DEBUG_MSG(3, ("ticket in use, discarding session id")); + ssl->session_negotiate->id_len = 0; + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse new session ticket")); + + return 0; +} +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + +/* + * SSL handshake -- client side -- single step + */ +int mbedtls_ssl_handshake_client_step(mbedtls_ssl_context *ssl) +{ + int ret = 0; + + if (ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("client state: %d", ssl->state)); + + if ((ret = mbedtls_ssl_flush_output(ssl)) != 0) { + return ret; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING) { + if ((ret = mbedtls_ssl_flight_transmit(ssl)) != 0) { + return ret; + } + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + /* Change state now, so that it is right in mbedtls_ssl_read_record(), used + * by DTLS for dropping out-of-sequence ChangeCipherSpec records */ +#if defined(MBEDTLS_SSL_SESSION_TICKETS) + if (ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC && + ssl->handshake->new_session_ticket != 0) { + ssl->state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET; + } +#endif + + switch (ssl->state) { + case MBEDTLS_SSL_HELLO_REQUEST: + ssl->state = MBEDTLS_SSL_CLIENT_HELLO; + break; + + /* + * ==> ClientHello + */ + case MBEDTLS_SSL_CLIENT_HELLO: + ret = ssl_write_client_hello(ssl); + break; + + /* + * <== ServerHello + * Certificate + * ( ServerKeyExchange ) + * ( CertificateRequest ) + * ServerHelloDone + */ + case MBEDTLS_SSL_SERVER_HELLO: + ret = ssl_parse_server_hello(ssl); + break; + + case MBEDTLS_SSL_SERVER_CERTIFICATE: + ret = mbedtls_ssl_parse_certificate(ssl); + break; + + case MBEDTLS_SSL_SERVER_KEY_EXCHANGE: + ret = ssl_parse_server_key_exchange(ssl); + break; + + case MBEDTLS_SSL_CERTIFICATE_REQUEST: + ret = ssl_parse_certificate_request(ssl); + break; + + case MBEDTLS_SSL_SERVER_HELLO_DONE: + ret = ssl_parse_server_hello_done(ssl); + break; + + /* + * ==> ( Certificate/Alert ) + * ClientKeyExchange + * ( CertificateVerify ) + * ChangeCipherSpec + * Finished + */ + case MBEDTLS_SSL_CLIENT_CERTIFICATE: + ret = mbedtls_ssl_write_certificate(ssl); + break; + + case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE: + ret = ssl_write_client_key_exchange(ssl); + break; + + case MBEDTLS_SSL_CERTIFICATE_VERIFY: + ret = ssl_write_certificate_verify(ssl); + break; + + case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC: + ret = mbedtls_ssl_write_change_cipher_spec(ssl); + break; + + case MBEDTLS_SSL_CLIENT_FINISHED: + ret = mbedtls_ssl_write_finished(ssl); + break; + + /* + * <== ( NewSessionTicket ) + * ChangeCipherSpec + * Finished + */ +#if defined(MBEDTLS_SSL_SESSION_TICKETS) + case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET: + ret = ssl_parse_new_session_ticket(ssl); + break; +#endif + + case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC: + ret = mbedtls_ssl_parse_change_cipher_spec(ssl); + break; + + case MBEDTLS_SSL_SERVER_FINISHED: + ret = mbedtls_ssl_parse_finished(ssl); + break; + + case MBEDTLS_SSL_FLUSH_BUFFERS: + MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done")); + ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; + break; + + case MBEDTLS_SSL_HANDSHAKE_WRAPUP: + mbedtls_ssl_handshake_wrapup(ssl); + break; + + default: + MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state)); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + return ret; +} +#endif /* MBEDTLS_SSL_CLI_C */ diff --git a/ext/opcua_client/mbedtls/library/ssl_cookie.c b/ext/opcua_client/mbedtls/library/ssl_cookie.c new file mode 100644 index 0000000..067a491 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ssl_cookie.c @@ -0,0 +1,248 @@ +/* + * DTLS cookie callbacks implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * These session callbacks use a simple chained list + * to store and retrieve the session information. + */ + +#include "common.h" + +#if defined(MBEDTLS_SSL_COOKIE_C) + +#include "mbedtls/platform.h" + +#include "mbedtls/ssl_cookie.h" +#include "mbedtls/ssl_internal.h" +#include "mbedtls/error.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/constant_time.h" + +#include + +/* + * If DTLS is in use, then at least one of SHA-1, SHA-256, SHA-512 is + * available. Try SHA-256 first, 512 wastes resources since we need to stay + * with max 32 bytes of cookie for DTLS 1.0 + */ +#if defined(MBEDTLS_SHA256_C) +#define COOKIE_MD MBEDTLS_MD_SHA224 +#define COOKIE_MD_OUTLEN 32 +#define COOKIE_HMAC_LEN 28 +#elif defined(MBEDTLS_SHA512_C) +#define COOKIE_MD MBEDTLS_MD_SHA384 +#define COOKIE_MD_OUTLEN 48 +#define COOKIE_HMAC_LEN 28 +#elif defined(MBEDTLS_SHA1_C) +#define COOKIE_MD MBEDTLS_MD_SHA1 +#define COOKIE_MD_OUTLEN 20 +#define COOKIE_HMAC_LEN 20 +#else +#error "DTLS hello verify needs SHA-1 or SHA-2" +#endif + +/* + * Cookies are formed of a 4-bytes timestamp (or serial number) and + * an HMAC of timestamp and client ID. + */ +#define COOKIE_LEN (4 + COOKIE_HMAC_LEN) + +void mbedtls_ssl_cookie_init(mbedtls_ssl_cookie_ctx *ctx) +{ + mbedtls_md_init(&ctx->hmac_ctx); +#if !defined(MBEDTLS_HAVE_TIME) + ctx->serial = 0; +#endif + ctx->timeout = MBEDTLS_SSL_COOKIE_TIMEOUT; + +#if defined(MBEDTLS_THREADING_C) + mbedtls_mutex_init(&ctx->mutex); +#endif +} + +void mbedtls_ssl_cookie_set_timeout(mbedtls_ssl_cookie_ctx *ctx, unsigned long delay) +{ + ctx->timeout = delay; +} + +void mbedtls_ssl_cookie_free(mbedtls_ssl_cookie_ctx *ctx) +{ + mbedtls_md_free(&ctx->hmac_ctx); + +#if defined(MBEDTLS_THREADING_C) + mbedtls_mutex_free(&ctx->mutex); +#endif + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_ssl_cookie_ctx)); +} + +int mbedtls_ssl_cookie_setup(mbedtls_ssl_cookie_ctx *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char key[COOKIE_MD_OUTLEN]; + + if ((ret = f_rng(p_rng, key, sizeof(key))) != 0) { + return ret; + } + + ret = mbedtls_md_setup(&ctx->hmac_ctx, mbedtls_md_info_from_type(COOKIE_MD), 1); + if (ret != 0) { + return ret; + } + + ret = mbedtls_md_hmac_starts(&ctx->hmac_ctx, key, sizeof(key)); + if (ret != 0) { + return ret; + } + + mbedtls_platform_zeroize(key, sizeof(key)); + + return 0; +} + +/* + * Generate the HMAC part of a cookie + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_cookie_hmac(mbedtls_md_context_t *hmac_ctx, + const unsigned char time[4], + unsigned char **p, unsigned char *end, + const unsigned char *cli_id, size_t cli_id_len) +{ + unsigned char hmac_out[COOKIE_MD_OUTLEN]; + + MBEDTLS_SSL_CHK_BUF_PTR(*p, end, COOKIE_HMAC_LEN); + + if (mbedtls_md_hmac_reset(hmac_ctx) != 0 || + mbedtls_md_hmac_update(hmac_ctx, time, 4) != 0 || + mbedtls_md_hmac_update(hmac_ctx, cli_id, cli_id_len) != 0 || + mbedtls_md_hmac_finish(hmac_ctx, hmac_out) != 0) { + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + memcpy(*p, hmac_out, COOKIE_HMAC_LEN); + *p += COOKIE_HMAC_LEN; + + return 0; +} + +/* + * Generate cookie for DTLS ClientHello verification + */ +int mbedtls_ssl_cookie_write(void *p_ctx, + unsigned char **p, unsigned char *end, + const unsigned char *cli_id, size_t cli_id_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ssl_cookie_ctx *ctx = (mbedtls_ssl_cookie_ctx *) p_ctx; + unsigned long t; + + if (ctx == NULL || cli_id == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + MBEDTLS_SSL_CHK_BUF_PTR(*p, end, COOKIE_LEN); + +#if defined(MBEDTLS_HAVE_TIME) + t = (unsigned long) mbedtls_time(NULL); +#else + t = ctx->serial++; +#endif + + MBEDTLS_PUT_UINT32_BE(t, *p, 0); + *p += 4; + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&ctx->mutex)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_SSL_INTERNAL_ERROR, ret); + } +#endif + + ret = ssl_cookie_hmac(&ctx->hmac_ctx, *p - 4, + p, end, cli_id, cli_id_len); + +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&ctx->mutex) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_SSL_INTERNAL_ERROR, + MBEDTLS_ERR_THREADING_MUTEX_ERROR); + } +#endif + + return ret; +} + +/* + * Check a cookie + */ +int mbedtls_ssl_cookie_check(void *p_ctx, + const unsigned char *cookie, size_t cookie_len, + const unsigned char *cli_id, size_t cli_id_len) +{ + unsigned char ref_hmac[COOKIE_HMAC_LEN]; + int ret = 0; + unsigned char *p = ref_hmac; + mbedtls_ssl_cookie_ctx *ctx = (mbedtls_ssl_cookie_ctx *) p_ctx; + unsigned long cur_time, cookie_time; + + if (ctx == NULL || cli_id == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (cookie_len != COOKIE_LEN) { + return -1; + } + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&ctx->mutex)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_SSL_INTERNAL_ERROR, ret); + } +#endif + + if (ssl_cookie_hmac(&ctx->hmac_ctx, cookie, + &p, p + sizeof(ref_hmac), + cli_id, cli_id_len) != 0) { + ret = -1; + } + +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&ctx->mutex) != 0) { + ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_SSL_INTERNAL_ERROR, + MBEDTLS_ERR_THREADING_MUTEX_ERROR); + } +#endif + + if (ret != 0) { + goto exit; + } + + if (mbedtls_ct_memcmp(cookie + 4, ref_hmac, sizeof(ref_hmac)) != 0) { + ret = -1; + goto exit; + } + +#if defined(MBEDTLS_HAVE_TIME) + cur_time = (unsigned long) mbedtls_time(NULL); +#else + cur_time = ctx->serial; +#endif + + cookie_time = ((unsigned long) cookie[0] << 24) | + ((unsigned long) cookie[1] << 16) | + ((unsigned long) cookie[2] << 8) | + ((unsigned long) cookie[3]); + + if (ctx->timeout != 0 && cur_time - cookie_time > ctx->timeout) { + ret = -1; + goto exit; + } + +exit: + mbedtls_platform_zeroize(ref_hmac, sizeof(ref_hmac)); + return ret; +} +#endif /* MBEDTLS_SSL_COOKIE_C */ diff --git a/ext/opcua_client/mbedtls/library/ssl_msg.c b/ext/opcua_client/mbedtls/library/ssl_msg.c new file mode 100644 index 0000000..1613a1e --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ssl_msg.c @@ -0,0 +1,5739 @@ +/* + * Generic SSL/TLS messaging layer functions + * (record layer + retransmission state machine) + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The SSL 3.0 specification was drafted by Netscape in 1996, + * and became an IETF standard in 1999. + * + * http://wp.netscape.com/eng/ssl3/ + * http://www.ietf.org/rfc/rfc2246.txt + * http://www.ietf.org/rfc/rfc4346.txt + */ + +#include "common.h" + +#if defined(MBEDTLS_SSL_TLS_C) + +#include "mbedtls/platform.h" + +#include "mbedtls/ssl.h" +#include "mbedtls/ssl_internal.h" +#include "mbedtls/debug.h" +#include "mbedtls/error.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/version.h" +#include "constant_time_internal.h" +#include "mbedtls/constant_time.h" + +#include +#include + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "mbedtls/psa_util.h" +#include "psa/crypto.h" +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +#include "mbedtls/oid.h" +#endif + +static uint32_t ssl_get_hs_total_len(mbedtls_ssl_context const *ssl); + +/* + * Start a timer. + * Passing millisecs = 0 cancels a running timer. + */ +void mbedtls_ssl_set_timer(mbedtls_ssl_context *ssl, uint32_t millisecs) +{ + if (ssl->f_set_timer == NULL) { + return; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("set_timer to %d ms", (int) millisecs)); + ssl->f_set_timer(ssl->p_timer, millisecs / 4, millisecs); +} + +/* + * Return -1 is timer is expired, 0 if it isn't. + */ +int mbedtls_ssl_check_timer(mbedtls_ssl_context *ssl) +{ + if (ssl->f_get_timer == NULL) { + return 0; + } + + if (ssl->f_get_timer(ssl->p_timer) == 2) { + MBEDTLS_SSL_DEBUG_MSG(3, ("timer expired")); + return -1; + } + + return 0; +} + +#if defined(MBEDTLS_SSL_RECORD_CHECKING) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_record_header(mbedtls_ssl_context const *ssl, + unsigned char *buf, + size_t len, + mbedtls_record *rec); + +int mbedtls_ssl_check_record(mbedtls_ssl_context const *ssl, + unsigned char *buf, + size_t buflen) +{ + int ret = 0; + MBEDTLS_SSL_DEBUG_MSG(1, ("=> mbedtls_ssl_check_record")); + MBEDTLS_SSL_DEBUG_BUF(3, "record buffer", buf, buflen); + + /* We don't support record checking in TLS because + * (a) there doesn't seem to be a usecase for it, and + * (b) In SSLv3 and TLS 1.0, CBC record decryption has state + * and we'd need to backup the transform here. + */ + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_STREAM) { + ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + goto exit; + } +#if defined(MBEDTLS_SSL_PROTO_DTLS) + else { + mbedtls_record rec; + + ret = ssl_parse_record_header(ssl, buf, buflen, &rec); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(3, "ssl_parse_record_header", ret); + goto exit; + } + + if (ssl->transform_in != NULL) { + ret = mbedtls_ssl_decrypt_buf(ssl, ssl->transform_in, &rec); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(3, "mbedtls_ssl_decrypt_buf", ret); + goto exit; + } + } + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +exit: + /* On success, we have decrypted the buffer in-place, so make + * sure we don't leak any plaintext data. */ + mbedtls_platform_zeroize(buf, buflen); + + /* For the purpose of this API, treat messages with unexpected CID + * as well as such from future epochs as unexpected. */ + if (ret == MBEDTLS_ERR_SSL_UNEXPECTED_CID || + ret == MBEDTLS_ERR_SSL_EARLY_MESSAGE) { + ret = MBEDTLS_ERR_SSL_UNEXPECTED_RECORD; + } + + MBEDTLS_SSL_DEBUG_MSG(1, ("<= mbedtls_ssl_check_record")); + return ret; +} +#endif /* MBEDTLS_SSL_RECORD_CHECKING */ + +#define SSL_DONT_FORCE_FLUSH 0 +#define SSL_FORCE_FLUSH 1 + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + +/* Forward declarations for functions related to message buffering. */ +static void ssl_buffering_free_slot(mbedtls_ssl_context *ssl, + uint8_t slot); +static void ssl_free_buffered_record(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_load_buffered_message(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_load_buffered_record(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_buffer_message(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_buffer_future_record(mbedtls_ssl_context *ssl, + mbedtls_record const *rec); +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_next_record_is_in_datagram(mbedtls_ssl_context *ssl); + +static size_t ssl_get_maximum_datagram_size(mbedtls_ssl_context const *ssl) +{ + size_t mtu = mbedtls_ssl_get_current_mtu(ssl); +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + size_t out_buf_len = ssl->out_buf_len; +#else + size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN; +#endif + + if (mtu != 0 && mtu < out_buf_len) { + return mtu; + } + + return out_buf_len; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_get_remaining_space_in_datagram(mbedtls_ssl_context const *ssl) +{ + size_t const bytes_written = ssl->out_left; + size_t const mtu = ssl_get_maximum_datagram_size(ssl); + + /* Double-check that the write-index hasn't gone + * past what we can transmit in a single datagram. */ + if (bytes_written > mtu) { + /* Should never happen... */ + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + return (int) (mtu - bytes_written); +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_get_remaining_payload_in_datagram(mbedtls_ssl_context const *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t remaining, expansion; + size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN; + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) + const size_t mfl = mbedtls_ssl_get_output_max_frag_len(ssl); + + if (max_len > mfl) { + max_len = mfl; + } + + /* By the standard (RFC 6066 Sect. 4), the MFL extension + * only limits the maximum record payload size, so in theory + * we would be allowed to pack multiple records of payload size + * MFL into a single datagram. However, this would mean that there's + * no way to explicitly communicate MTU restrictions to the peer. + * + * The following reduction of max_len makes sure that we never + * write datagrams larger than MFL + Record Expansion Overhead. + */ + if (max_len <= ssl->out_left) { + return 0; + } + + max_len -= ssl->out_left; +#endif + + ret = ssl_get_remaining_space_in_datagram(ssl); + if (ret < 0) { + return ret; + } + remaining = (size_t) ret; + + ret = mbedtls_ssl_get_record_expansion(ssl); + if (ret < 0) { + return ret; + } + expansion = (size_t) ret; + + if (remaining <= expansion) { + return 0; + } + + remaining -= expansion; + if (remaining >= max_len) { + remaining = max_len; + } + + return (int) remaining; +} + +/* + * Double the retransmit timeout value, within the allowed range, + * returning -1 if the maximum value has already been reached. + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_double_retransmit_timeout(mbedtls_ssl_context *ssl) +{ + uint32_t new_timeout; + + if (ssl->handshake->retransmit_timeout >= ssl->conf->hs_timeout_max) { + return -1; + } + + /* Implement the final paragraph of RFC 6347 section 4.1.1.1 + * in the following way: after the initial transmission and a first + * retransmission, back off to a temporary estimated MTU of 508 bytes. + * This value is guaranteed to be deliverable (if not guaranteed to be + * delivered) of any compliant IPv4 (and IPv6) network, and should work + * on most non-IP stacks too. */ + if (ssl->handshake->retransmit_timeout != ssl->conf->hs_timeout_min) { + ssl->handshake->mtu = 508; + MBEDTLS_SSL_DEBUG_MSG(2, ("mtu autoreduction to %d bytes", ssl->handshake->mtu)); + } + + new_timeout = 2 * ssl->handshake->retransmit_timeout; + + /* Avoid arithmetic overflow and range overflow */ + if (new_timeout < ssl->handshake->retransmit_timeout || + new_timeout > ssl->conf->hs_timeout_max) { + new_timeout = ssl->conf->hs_timeout_max; + } + + ssl->handshake->retransmit_timeout = new_timeout; + MBEDTLS_SSL_DEBUG_MSG(3, ("update timeout value to %lu millisecs", + (unsigned long) ssl->handshake->retransmit_timeout)); + + return 0; +} + +static void ssl_reset_retransmit_timeout(mbedtls_ssl_context *ssl) +{ + ssl->handshake->retransmit_timeout = ssl->conf->hs_timeout_min; + MBEDTLS_SSL_DEBUG_MSG(3, ("update timeout value to %lu millisecs", + (unsigned long) ssl->handshake->retransmit_timeout)); +} +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) +int (*mbedtls_ssl_hw_record_init)(mbedtls_ssl_context *ssl, + const unsigned char *key_enc, const unsigned char *key_dec, + size_t keylen, + const unsigned char *iv_enc, const unsigned char *iv_dec, + size_t ivlen, + const unsigned char *mac_enc, const unsigned char *mac_dec, + size_t maclen) = NULL; +int (*mbedtls_ssl_hw_record_activate)(mbedtls_ssl_context *ssl, int direction) = NULL; +int (*mbedtls_ssl_hw_record_reset)(mbedtls_ssl_context *ssl) = NULL; +int (*mbedtls_ssl_hw_record_write)(mbedtls_ssl_context *ssl) = NULL; +int (*mbedtls_ssl_hw_record_read)(mbedtls_ssl_context *ssl) = NULL; +int (*mbedtls_ssl_hw_record_finish)(mbedtls_ssl_context *ssl) = NULL; +#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ + +/* + * Encryption/decryption functions + */ + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) + +static size_t ssl_compute_padding_length(size_t len, + size_t granularity) +{ + return (granularity - (len + 1) % granularity) % granularity; +} + +/* This functions transforms a (D)TLS plaintext fragment and a record content + * type into an instance of the (D)TLSInnerPlaintext structure. This is used + * in DTLS 1.2 + CID and within TLS 1.3 to allow flexible padding and to protect + * a record's content type. + * + * struct { + * opaque content[DTLSPlaintext.length]; + * ContentType real_type; + * uint8 zeros[length_of_padding]; + * } (D)TLSInnerPlaintext; + * + * Input: + * - `content`: The beginning of the buffer holding the + * plaintext to be wrapped. + * - `*content_size`: The length of the plaintext in Bytes. + * - `max_len`: The number of Bytes available starting from + * `content`. This must be `>= *content_size`. + * - `rec_type`: The desired record content type. + * + * Output: + * - `content`: The beginning of the resulting (D)TLSInnerPlaintext structure. + * - `*content_size`: The length of the resulting (D)TLSInnerPlaintext structure. + * + * Returns: + * - `0` on success. + * - A negative error code if `max_len` didn't offer enough space + * for the expansion. + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_build_inner_plaintext(unsigned char *content, + size_t *content_size, + size_t remaining, + uint8_t rec_type, + size_t pad) +{ + size_t len = *content_size; + + /* Write real content type */ + if (remaining == 0) { + return -1; + } + content[len] = rec_type; + len++; + remaining--; + + if (remaining < pad) { + return -1; + } + memset(content + len, 0, pad); + len += pad; + remaining -= pad; + + *content_size = len; + return 0; +} + +/* This function parses a (D)TLSInnerPlaintext structure. + * See ssl_build_inner_plaintext() for details. */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_inner_plaintext(unsigned char const *content, + size_t *content_size, + uint8_t *rec_type) +{ + size_t remaining = *content_size; + + /* Determine length of padding by skipping zeroes from the back. */ + do { + if (remaining == 0) { + return -1; + } + remaining--; + } while (content[remaining] == 0); + + *content_size = remaining; + *rec_type = content[remaining]; + + return 0; +} +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID || + MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ + +/* `add_data` must have size 13 Bytes if the CID extension is disabled, + * and 13 + 1 + CID-length Bytes if the CID extension is enabled. */ +static void ssl_extract_add_data_from_record(unsigned char *add_data, + size_t *add_data_len, + mbedtls_record *rec, + unsigned minor_ver) +{ + /* Quoting RFC 5246 (TLS 1.2): + * + * additional_data = seq_num + TLSCompressed.type + + * TLSCompressed.version + TLSCompressed.length; + * + * For the CID extension, this is extended as follows + * (quoting draft-ietf-tls-dtls-connection-id-05, + * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05): + * + * additional_data = seq_num + DTLSPlaintext.type + + * DTLSPlaintext.version + + * cid + + * cid_length + + * length_of_DTLSInnerPlaintext; + * + * For TLS 1.3, the record sequence number is dropped from the AAD + * and encoded within the nonce of the AEAD operation instead. + */ + + unsigned char *cur = add_data; + + int is_tls13 = 0; +#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) + if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_4) { + is_tls13 = 1; + } +#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ + if (!is_tls13) { + ((void) minor_ver); + memcpy(cur, rec->ctr, sizeof(rec->ctr)); + cur += sizeof(rec->ctr); + } + + *cur = rec->type; + cur++; + + memcpy(cur, rec->ver, sizeof(rec->ver)); + cur += sizeof(rec->ver); + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + if (rec->cid_len != 0) { + memcpy(cur, rec->cid, rec->cid_len); + cur += rec->cid_len; + + *cur = rec->cid_len; + cur++; + + MBEDTLS_PUT_UINT16_BE(rec->data_len, cur, 0); + cur += 2; + } else +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + { + MBEDTLS_PUT_UINT16_BE(rec->data_len, cur, 0); + cur += 2; + } + + *add_data_len = cur - add_data; +} + +#if defined(MBEDTLS_SSL_PROTO_SSL3) + +#define SSL3_MAC_MAX_BYTES 20 /* MD-5 or SHA-1 */ + +/* + * SSLv3.0 MAC functions + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_mac(mbedtls_md_context_t *md_ctx, + const unsigned char *secret, + const unsigned char *buf, size_t len, + const unsigned char *ctr, int type, + unsigned char out[SSL3_MAC_MAX_BYTES]) +{ + unsigned char header[11]; + unsigned char padding[48]; + int padlen; + int md_size = mbedtls_md_get_size(md_ctx->md_info); + int md_type = mbedtls_md_get_type(md_ctx->md_info); + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + /* Only MD5 and SHA-1 supported */ + if (md_type == MBEDTLS_MD_MD5) { + padlen = 48; + } else { + padlen = 40; + } + + memcpy(header, ctr, 8); + header[8] = (unsigned char) type; + MBEDTLS_PUT_UINT16_BE(len, header, 9); + + memset(padding, 0x36, padlen); + ret = mbedtls_md_starts(md_ctx); + if (ret != 0) { + return ret; + } + ret = mbedtls_md_update(md_ctx, secret, md_size); + if (ret != 0) { + return ret; + } + ret = mbedtls_md_update(md_ctx, padding, padlen); + if (ret != 0) { + return ret; + } + ret = mbedtls_md_update(md_ctx, header, 11); + if (ret != 0) { + return ret; + } + ret = mbedtls_md_update(md_ctx, buf, len); + if (ret != 0) { + return ret; + } + ret = mbedtls_md_finish(md_ctx, out); + if (ret != 0) { + return ret; + } + + memset(padding, 0x5C, padlen); + ret = mbedtls_md_starts(md_ctx); + if (ret != 0) { + return ret; + } + ret = mbedtls_md_update(md_ctx, secret, md_size); + if (ret != 0) { + return ret; + } + ret = mbedtls_md_update(md_ctx, padding, padlen); + if (ret != 0) { + return ret; + } + ret = mbedtls_md_update(md_ctx, out, md_size); + if (ret != 0) { + return ret; + } + ret = mbedtls_md_finish(md_ctx, out); + if (ret != 0) { + return ret; + } + + return 0; +} +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ + +#if defined(MBEDTLS_GCM_C) || \ + defined(MBEDTLS_CCM_C) || \ + defined(MBEDTLS_CHACHAPOLY_C) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_transform_aead_dynamic_iv_is_explicit( + mbedtls_ssl_transform const *transform) +{ + return transform->ivlen != transform->fixed_ivlen; +} + +/* Compute IV := ( fixed_iv || 0 ) XOR ( 0 || dynamic_IV ) + * + * Concretely, this occurs in two variants: + * + * a) Fixed and dynamic IV lengths add up to total IV length, giving + * IV = fixed_iv || dynamic_iv + * + * This variant is used in TLS 1.2 when used with GCM or CCM. + * + * b) Fixed IV lengths matches total IV length, giving + * IV = fixed_iv XOR ( 0 || dynamic_iv ) + * + * This variant occurs in TLS 1.3 and for TLS 1.2 when using ChaChaPoly. + * + * See also the documentation of mbedtls_ssl_transform. + * + * This function has the precondition that + * + * dst_iv_len >= max( fixed_iv_len, dynamic_iv_len ) + * + * which has to be ensured by the caller. If this precondition + * violated, the behavior of this function is undefined. + */ +static void ssl_build_record_nonce(unsigned char *dst_iv, + size_t dst_iv_len, + unsigned char const *fixed_iv, + size_t fixed_iv_len, + unsigned char const *dynamic_iv, + size_t dynamic_iv_len) +{ + size_t i; + + /* Start with Fixed IV || 0 */ + memset(dst_iv, 0, dst_iv_len); + memcpy(dst_iv, fixed_iv, fixed_iv_len); + + dst_iv += dst_iv_len - dynamic_iv_len; + for (i = 0; i < dynamic_iv_len; i++) { + dst_iv[i] ^= dynamic_iv[i]; + } +} +#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */ + +int mbedtls_ssl_encrypt_buf(mbedtls_ssl_context *ssl, + mbedtls_ssl_transform *transform, + mbedtls_record *rec, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + mbedtls_cipher_mode_t mode; + int auth_done = 0; + unsigned char *data; + unsigned char add_data[13 + 1 + MBEDTLS_SSL_CID_OUT_LEN_MAX]; + size_t add_data_len; + size_t post_avail; + + /* The SSL context is only used for debugging purposes! */ +#if !defined(MBEDTLS_DEBUG_C) + ssl = NULL; /* make sure we don't use it except for debug */ + ((void) ssl); +#endif + + /* The PRNG is used for dynamic IV generation that's used + * for CBC transformations in TLS 1.1 and TLS 1.2. */ +#if !(defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC) && \ + (defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2))) + ((void) f_rng); + ((void) p_rng); +#endif + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> encrypt buf")); + + if (transform == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("no transform provided to encrypt_buf")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + if (rec == NULL + || rec->buf == NULL + || rec->buf_len < rec->data_offset + || rec->buf_len - rec->data_offset < rec->data_len +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + || rec->cid_len != 0 +#endif + ) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad record structure provided to encrypt_buf")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + data = rec->buf + rec->data_offset; + post_avail = rec->buf_len - (rec->data_len + rec->data_offset); + MBEDTLS_SSL_DEBUG_BUF(4, "before encrypt: output payload", + data, rec->data_len); + + mode = mbedtls_cipher_get_cipher_mode(&transform->cipher_ctx_enc); + + if (rec->data_len > MBEDTLS_SSL_OUT_CONTENT_LEN) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Record content %" MBEDTLS_PRINTF_SIZET + " too large, maximum %" MBEDTLS_PRINTF_SIZET, + rec->data_len, + (size_t) MBEDTLS_SSL_OUT_CONTENT_LEN)); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + /* The following two code paths implement the (D)TLSInnerPlaintext + * structure present in TLS 1.3 and DTLS 1.2 + CID. + * + * See ssl_build_inner_plaintext() for more information. + * + * Note that this changes `rec->data_len`, and hence + * `post_avail` needs to be recalculated afterwards. + * + * Note also that the two code paths cannot occur simultaneously + * since they apply to different versions of the protocol. There + * is hence no risk of double-addition of the inner plaintext. + */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) + if (transform->minor_ver == MBEDTLS_SSL_MINOR_VERSION_4) { + size_t padding = + ssl_compute_padding_length(rec->data_len, + MBEDTLS_SSL_TLS1_3_PADDING_GRANULARITY); + if (ssl_build_inner_plaintext(data, + &rec->data_len, + post_avail, + rec->type, + padding) != 0) { + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + + rec->type = MBEDTLS_SSL_MSG_APPLICATION_DATA; + } +#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + /* + * Add CID information + */ + rec->cid_len = transform->out_cid_len; + memcpy(rec->cid, transform->out_cid, transform->out_cid_len); + MBEDTLS_SSL_DEBUG_BUF(3, "CID", rec->cid, rec->cid_len); + + if (rec->cid_len != 0) { + size_t padding = + ssl_compute_padding_length(rec->data_len, + MBEDTLS_SSL_CID_PADDING_GRANULARITY); + /* + * Wrap plaintext into DTLSInnerPlaintext structure. + * See ssl_build_inner_plaintext() for more information. + * + * Note that this changes `rec->data_len`, and hence + * `post_avail` needs to be recalculated afterwards. + */ + if (ssl_build_inner_plaintext(data, + &rec->data_len, + post_avail, + rec->type, + padding) != 0) { + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + + rec->type = MBEDTLS_SSL_MSG_CID; + } +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + + post_avail = rec->buf_len - (rec->data_len + rec->data_offset); + + /* + * Add MAC before if needed + */ +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) + if (mode == MBEDTLS_MODE_STREAM || + (mode == MBEDTLS_MODE_CBC +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + && transform->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED +#endif + )) { + if (post_avail < transform->maclen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Buffer provided for encrypted record not large enough")); + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + +#if defined(MBEDTLS_SSL_PROTO_SSL3) + if (transform->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) { + unsigned char mac[SSL3_MAC_MAX_BYTES]; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + ret = ssl_mac(&transform->md_ctx_enc, transform->mac_enc, + data, rec->data_len, rec->ctr, rec->type, mac); + if (ret == 0) { + memcpy(data + rec->data_len, mac, transform->maclen); + } + mbedtls_platform_zeroize(mac, transform->maclen); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_mac", ret); + return ret; + } + } else +#endif +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (transform->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1) { + unsigned char mac[MBEDTLS_SSL_MAC_ADD]; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + ssl_extract_add_data_from_record(add_data, &add_data_len, rec, + transform->minor_ver); + + ret = mbedtls_md_hmac_update(&transform->md_ctx_enc, + add_data, add_data_len); + if (ret != 0) { + goto hmac_failed_etm_disabled; + } + ret = mbedtls_md_hmac_update(&transform->md_ctx_enc, + data, rec->data_len); + if (ret != 0) { + goto hmac_failed_etm_disabled; + } + ret = mbedtls_md_hmac_finish(&transform->md_ctx_enc, mac); + if (ret != 0) { + goto hmac_failed_etm_disabled; + } + ret = mbedtls_md_hmac_reset(&transform->md_ctx_enc); + if (ret != 0) { + goto hmac_failed_etm_disabled; + } + + memcpy(data + rec->data_len, mac, transform->maclen); + +hmac_failed_etm_disabled: + mbedtls_platform_zeroize(mac, transform->maclen); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_hmac_xxx", ret); + return ret; + } + } else +#endif + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + MBEDTLS_SSL_DEBUG_BUF(4, "computed mac", data + rec->data_len, + transform->maclen); + + rec->data_len += transform->maclen; + post_avail -= transform->maclen; + auth_done++; + } +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ + + /* + * Encrypt + */ +#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) + if (mode == MBEDTLS_MODE_STREAM) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t olen; + MBEDTLS_SSL_DEBUG_MSG(3, ("before encrypt: msglen = %" MBEDTLS_PRINTF_SIZET ", " + "including %d bytes of padding", + rec->data_len, 0)); + + if ((ret = mbedtls_cipher_crypt(&transform->cipher_ctx_enc, + transform->iv_enc, transform->ivlen, + data, rec->data_len, + data, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_crypt", ret); + return ret; + } + + if (rec->data_len != olen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + } else +#endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */ + +#if defined(MBEDTLS_GCM_C) || \ + defined(MBEDTLS_CCM_C) || \ + defined(MBEDTLS_CHACHAPOLY_C) + if (mode == MBEDTLS_MODE_GCM || + mode == MBEDTLS_MODE_CCM || + mode == MBEDTLS_MODE_CHACHAPOLY) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char iv[12]; + unsigned char *dynamic_iv; + size_t dynamic_iv_len; + int dynamic_iv_is_explicit = + ssl_transform_aead_dynamic_iv_is_explicit(transform); + + /* Check that there's space for the authentication tag. */ + if (post_avail < transform->taglen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Buffer provided for encrypted record not large enough")); + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + + /* + * Build nonce for AEAD encryption. + * + * Note: In the case of CCM and GCM in TLS 1.2, the dynamic + * part of the IV is prepended to the ciphertext and + * can be chosen freely - in particular, it need not + * agree with the record sequence number. + * However, since ChaChaPoly as well as all AEAD modes + * in TLS 1.3 use the record sequence number as the + * dynamic part of the nonce, we uniformly use the + * record sequence number here in all cases. + */ + dynamic_iv = rec->ctr; + dynamic_iv_len = sizeof(rec->ctr); + + ssl_build_record_nonce(iv, sizeof(iv), + transform->iv_enc, + transform->fixed_ivlen, + dynamic_iv, + dynamic_iv_len); + + /* + * Build additional data for AEAD encryption. + * This depends on the TLS version. + */ + ssl_extract_add_data_from_record(add_data, &add_data_len, rec, + transform->minor_ver); + + MBEDTLS_SSL_DEBUG_BUF(4, "IV used (internal)", + iv, transform->ivlen); + MBEDTLS_SSL_DEBUG_BUF(4, "IV used (transmitted)", + dynamic_iv, + dynamic_iv_is_explicit ? dynamic_iv_len : 0); + MBEDTLS_SSL_DEBUG_BUF(4, "additional data used for AEAD", + add_data, add_data_len); + MBEDTLS_SSL_DEBUG_MSG(3, ("before encrypt: msglen = %" MBEDTLS_PRINTF_SIZET ", " + "including 0 bytes of padding", + rec->data_len)); + + /* + * Encrypt and authenticate + */ + + if ((ret = mbedtls_cipher_auth_encrypt_ext(&transform->cipher_ctx_enc, + iv, transform->ivlen, + add_data, add_data_len, + data, rec->data_len, /* src */ + data, rec->buf_len - (data - rec->buf), /* dst */ + &rec->data_len, + transform->taglen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_auth_encrypt", ret); + return ret; + } + MBEDTLS_SSL_DEBUG_BUF(4, "after encrypt: tag", + data + rec->data_len - transform->taglen, + transform->taglen); + /* Account for authentication tag. */ + post_avail -= transform->taglen; + + /* + * Prefix record content with dynamic IV in case it is explicit. + */ + if (dynamic_iv_is_explicit != 0) { + if (rec->data_offset < dynamic_iv_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Buffer provided for encrypted record not large enough")); + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + + memcpy(data - dynamic_iv_len, dynamic_iv, dynamic_iv_len); + rec->data_offset -= dynamic_iv_len; + rec->data_len += dynamic_iv_len; + } + + auth_done++; + } else +#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */ +#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC) + if (mode == MBEDTLS_MODE_CBC) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t padlen, i; + size_t olen; + + /* Currently we're always using minimal padding + * (up to 255 bytes would be allowed). */ + padlen = transform->ivlen - (rec->data_len + 1) % transform->ivlen; + if (padlen == transform->ivlen) { + padlen = 0; + } + + /* Check there's enough space in the buffer for the padding. */ + if (post_avail < padlen + 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Buffer provided for encrypted record not large enough")); + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + + for (i = 0; i <= padlen; i++) { + data[rec->data_len + i] = (unsigned char) padlen; + } + + rec->data_len += padlen + 1; + post_avail -= padlen + 1; + +#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) + /* + * Prepend per-record IV for block cipher in TLS v1.1 and up as per + * Method 1 (6.2.3.2. in RFC4346 and RFC5246) + */ + if (transform->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2) { + if (f_rng == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("No PRNG provided to encrypt_record routine")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + if (rec->data_offset < transform->ivlen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Buffer provided for encrypted record not large enough")); + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + + /* + * Generate IV + */ + ret = f_rng(p_rng, transform->iv_enc, transform->ivlen); + if (ret != 0) { + return ret; + } + + memcpy(data - transform->ivlen, transform->iv_enc, + transform->ivlen); + + } +#endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */ + + MBEDTLS_SSL_DEBUG_MSG(3, ("before encrypt: msglen = %" MBEDTLS_PRINTF_SIZET ", " + "including %" + MBEDTLS_PRINTF_SIZET + " bytes of IV and %" MBEDTLS_PRINTF_SIZET " bytes of padding", + rec->data_len, transform->ivlen, + padlen + 1)); + + if ((ret = mbedtls_cipher_crypt(&transform->cipher_ctx_enc, + transform->iv_enc, + transform->ivlen, + data, rec->data_len, + data, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_crypt", ret); + return ret; + } + + if (rec->data_len != olen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) + if (transform->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2) { + /* + * Save IV in SSL3 and TLS1 + */ + memcpy(transform->iv_enc, transform->cipher_ctx_enc.iv, + transform->ivlen); + } else +#endif + { + data -= transform->ivlen; + rec->data_offset -= transform->ivlen; + rec->data_len += transform->ivlen; + } + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + if (auth_done == 0) { + unsigned char mac[MBEDTLS_SSL_MAC_ADD]; + + /* + * MAC(MAC_write_key, seq_num + + * TLSCipherText.type + + * TLSCipherText.version + + * length_of( (IV +) ENC(...) ) + + * IV + // except for TLS 1.0 + * ENC(content + padding + padding_length)); + */ + + if (post_avail < transform->maclen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Buffer provided for encrypted record not large enough")); + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + + ssl_extract_add_data_from_record(add_data, &add_data_len, + rec, transform->minor_ver); + + MBEDTLS_SSL_DEBUG_MSG(3, ("using encrypt then mac")); + MBEDTLS_SSL_DEBUG_BUF(4, "MAC'd meta-data", add_data, + add_data_len); + + ret = mbedtls_md_hmac_update(&transform->md_ctx_enc, add_data, + add_data_len); + if (ret != 0) { + goto hmac_failed_etm_enabled; + } + ret = mbedtls_md_hmac_update(&transform->md_ctx_enc, + data, rec->data_len); + if (ret != 0) { + goto hmac_failed_etm_enabled; + } + ret = mbedtls_md_hmac_finish(&transform->md_ctx_enc, mac); + if (ret != 0) { + goto hmac_failed_etm_enabled; + } + ret = mbedtls_md_hmac_reset(&transform->md_ctx_enc); + if (ret != 0) { + goto hmac_failed_etm_enabled; + } + + memcpy(data + rec->data_len, mac, transform->maclen); + + rec->data_len += transform->maclen; + post_avail -= transform->maclen; + auth_done++; + +hmac_failed_etm_enabled: + mbedtls_platform_zeroize(mac, transform->maclen); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "HMAC calculation failed", ret); + return ret; + } + } +#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ + } else +#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC) */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + /* Make extra sure authentication was performed, exactly once */ + if (auth_done != 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= encrypt buf")); + + return 0; +} + +int mbedtls_ssl_decrypt_buf(mbedtls_ssl_context const *ssl, + mbedtls_ssl_transform *transform, + mbedtls_record *rec) +{ + size_t olen; + mbedtls_cipher_mode_t mode; + int ret, auth_done = 0; +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) + size_t padlen = 0, correct = 1; +#endif + unsigned char *data; + unsigned char add_data[13 + 1 + MBEDTLS_SSL_CID_IN_LEN_MAX]; + size_t add_data_len; + +#if !defined(MBEDTLS_DEBUG_C) + ssl = NULL; /* make sure we don't use it except for debug */ + ((void) ssl); +#endif + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> decrypt buf")); + if (rec == NULL || + rec->buf == NULL || + rec->buf_len < rec->data_offset || + rec->buf_len - rec->data_offset < rec->data_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad record structure provided to decrypt_buf")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + data = rec->buf + rec->data_offset; + mode = mbedtls_cipher_get_cipher_mode(&transform->cipher_ctx_dec); + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + /* + * Match record's CID with incoming CID. + */ + if (rec->cid_len != transform->in_cid_len || + memcmp(rec->cid, transform->in_cid, rec->cid_len) != 0) { + return MBEDTLS_ERR_SSL_UNEXPECTED_CID; + } +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + +#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) + if (mode == MBEDTLS_MODE_STREAM) { + if (rec->data_len < transform->maclen) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("Record too short for MAC:" + " %" MBEDTLS_PRINTF_SIZET " < %" MBEDTLS_PRINTF_SIZET, + rec->data_len, transform->maclen)); + return MBEDTLS_ERR_SSL_INVALID_MAC; + } + + padlen = 0; + if ((ret = mbedtls_cipher_crypt(&transform->cipher_ctx_dec, + transform->iv_dec, + transform->ivlen, + data, rec->data_len, + data, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_crypt", ret); + return ret; + } + + if (rec->data_len != olen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + } else +#endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */ +#if defined(MBEDTLS_GCM_C) || \ + defined(MBEDTLS_CCM_C) || \ + defined(MBEDTLS_CHACHAPOLY_C) + if (mode == MBEDTLS_MODE_GCM || + mode == MBEDTLS_MODE_CCM || + mode == MBEDTLS_MODE_CHACHAPOLY) { + unsigned char iv[12]; + unsigned char *dynamic_iv; + size_t dynamic_iv_len; + + /* + * Extract dynamic part of nonce for AEAD decryption. + * + * Note: In the case of CCM and GCM in TLS 1.2, the dynamic + * part of the IV is prepended to the ciphertext and + * can be chosen freely - in particular, it need not + * agree with the record sequence number. + */ + dynamic_iv_len = sizeof(rec->ctr); + if (ssl_transform_aead_dynamic_iv_is_explicit(transform) == 1) { + if (rec->data_len < dynamic_iv_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("msglen (%" MBEDTLS_PRINTF_SIZET + " ) < explicit_iv_len (%" MBEDTLS_PRINTF_SIZET ") ", + rec->data_len, + dynamic_iv_len)); + return MBEDTLS_ERR_SSL_INVALID_MAC; + } + dynamic_iv = data; + + data += dynamic_iv_len; + rec->data_offset += dynamic_iv_len; + rec->data_len -= dynamic_iv_len; + } else { + dynamic_iv = rec->ctr; + } + + /* Check that there's space for the authentication tag. */ + if (rec->data_len < transform->taglen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("msglen (%" MBEDTLS_PRINTF_SIZET + ") < taglen (%" MBEDTLS_PRINTF_SIZET ") ", + rec->data_len, + transform->taglen)); + return MBEDTLS_ERR_SSL_INVALID_MAC; + } + rec->data_len -= transform->taglen; + + /* + * Prepare nonce from dynamic and static parts. + */ + ssl_build_record_nonce(iv, sizeof(iv), + transform->iv_dec, + transform->fixed_ivlen, + dynamic_iv, + dynamic_iv_len); + + /* + * Build additional data for AEAD encryption. + * This depends on the TLS version. + */ + ssl_extract_add_data_from_record(add_data, &add_data_len, rec, + transform->minor_ver); + MBEDTLS_SSL_DEBUG_BUF(4, "additional data used for AEAD", + add_data, add_data_len); + + /* Because of the check above, we know that there are + * explicit_iv_len Bytes preceding data, and taglen + * bytes following data + data_len. This justifies + * the debug message and the invocation of + * mbedtls_cipher_auth_decrypt() below. */ + + MBEDTLS_SSL_DEBUG_BUF(4, "IV used", iv, transform->ivlen); + MBEDTLS_SSL_DEBUG_BUF(4, "TAG used", data + rec->data_len, + transform->taglen); + + /* + * Decrypt and authenticate + */ + if ((ret = mbedtls_cipher_auth_decrypt_ext(&transform->cipher_ctx_dec, + iv, transform->ivlen, + add_data, add_data_len, + data, rec->data_len + transform->taglen, /* src */ + data, rec->buf_len - (data - rec->buf), &olen, /* dst */ + transform->taglen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_auth_decrypt", ret); + + if (ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED) { + return MBEDTLS_ERR_SSL_INVALID_MAC; + } + + return ret; + } + auth_done++; + + /* Double-check that AEAD decryption doesn't change content length. */ + if (olen != rec->data_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + } else +#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C */ +#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC) + if (mode == MBEDTLS_MODE_CBC) { + size_t minlen = 0; + + /* + * Check immediate ciphertext sanity + */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (transform->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2) { + /* The ciphertext is prefixed with the CBC IV. */ + minlen += transform->ivlen; + } +#endif + + /* Size considerations: + * + * - The CBC cipher text must not be empty and hence + * at least of size transform->ivlen. + * + * Together with the potential IV-prefix, this explains + * the first of the two checks below. + * + * - The record must contain a MAC, either in plain or + * encrypted, depending on whether Encrypt-then-MAC + * is used or not. + * - If it is, the message contains the IV-prefix, + * the CBC ciphertext, and the MAC. + * - If it is not, the padded plaintext, and hence + * the CBC ciphertext, has at least length maclen + 1 + * because there is at least the padding length byte. + * + * As the CBC ciphertext is not empty, both cases give the + * lower bound minlen + maclen + 1 on the record size, which + * we test for in the second check below. + */ + if (rec->data_len < minlen + transform->ivlen || + rec->data_len < minlen + transform->maclen + 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("msglen (%" MBEDTLS_PRINTF_SIZET + ") < max( ivlen(%" MBEDTLS_PRINTF_SIZET + "), maclen (%" MBEDTLS_PRINTF_SIZET ") " + "+ 1 ) ( + expl IV )", + rec->data_len, + transform->ivlen, + transform->maclen)); + return MBEDTLS_ERR_SSL_INVALID_MAC; + } + + /* + * Authenticate before decrypt if enabled + */ +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + if (transform->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) { + unsigned char mac_expect[MBEDTLS_SSL_MAC_ADD]; + + MBEDTLS_SSL_DEBUG_MSG(3, ("using encrypt then mac")); + + /* Update data_len in tandem with add_data. + * + * The subtraction is safe because of the previous check + * data_len >= minlen + maclen + 1. + * + * Afterwards, we know that data + data_len is followed by at + * least maclen Bytes, which justifies the call to + * mbedtls_ct_memcmp() below. + * + * Further, we still know that data_len > minlen */ + rec->data_len -= transform->maclen; + ssl_extract_add_data_from_record(add_data, &add_data_len, rec, + transform->minor_ver); + + /* Calculate expected MAC. */ + MBEDTLS_SSL_DEBUG_BUF(4, "MAC'd meta-data", add_data, + add_data_len); + ret = mbedtls_md_hmac_update(&transform->md_ctx_dec, add_data, + add_data_len); + if (ret != 0) { + goto hmac_failed_etm_enabled; + } + ret = mbedtls_md_hmac_update(&transform->md_ctx_dec, + data, rec->data_len); + if (ret != 0) { + goto hmac_failed_etm_enabled; + } + ret = mbedtls_md_hmac_finish(&transform->md_ctx_dec, mac_expect); + if (ret != 0) { + goto hmac_failed_etm_enabled; + } + ret = mbedtls_md_hmac_reset(&transform->md_ctx_dec); + if (ret != 0) { + goto hmac_failed_etm_enabled; + } + + MBEDTLS_SSL_DEBUG_BUF(4, "message mac", data + rec->data_len, + transform->maclen); + MBEDTLS_SSL_DEBUG_BUF(4, "expected mac", mac_expect, + transform->maclen); + + /* Compare expected MAC with MAC at the end of the record. */ + if (mbedtls_ct_memcmp(data + rec->data_len, mac_expect, + transform->maclen) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("message mac does not match")); + ret = MBEDTLS_ERR_SSL_INVALID_MAC; + goto hmac_failed_etm_enabled; + } + auth_done++; + +hmac_failed_etm_enabled: + mbedtls_platform_zeroize(mac_expect, transform->maclen); + if (ret != 0) { + if (ret != MBEDTLS_ERR_SSL_INVALID_MAC) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_hmac_xxx", ret); + } + return ret; + } + } +#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ + + /* + * Check length sanity + */ + + /* We know from above that data_len > minlen >= 0, + * so the following check in particular implies that + * data_len >= minlen + ivlen ( = minlen or 2 * minlen ). */ + if (rec->data_len % transform->ivlen != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("msglen (%" MBEDTLS_PRINTF_SIZET + ") %% ivlen (%" MBEDTLS_PRINTF_SIZET ") != 0", + rec->data_len, transform->ivlen)); + return MBEDTLS_ERR_SSL_INVALID_MAC; + } + +#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) + /* + * Initialize for prepended IV for block cipher in TLS v1.1 and up + */ + if (transform->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2) { + /* Safe because data_len >= minlen + ivlen = 2 * ivlen. */ + memcpy(transform->iv_dec, data, transform->ivlen); + + data += transform->ivlen; + rec->data_offset += transform->ivlen; + rec->data_len -= transform->ivlen; + } +#endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */ + + /* We still have data_len % ivlen == 0 and data_len >= ivlen here. */ + + if ((ret = mbedtls_cipher_crypt(&transform->cipher_ctx_dec, + transform->iv_dec, transform->ivlen, + data, rec->data_len, data, &olen)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_crypt", ret); + return ret; + } + + /* Double-check that length hasn't changed during decryption. */ + if (rec->data_len != olen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) + if (transform->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2) { + /* + * Save IV in SSL3 and TLS1, where CBC decryption of consecutive + * records is equivalent to CBC decryption of the concatenation + * of the records; in other words, IVs are maintained across + * record decryptions. + */ + memcpy(transform->iv_dec, transform->cipher_ctx_dec.iv, + transform->ivlen); + } +#endif + + /* Safe since data_len >= minlen + maclen + 1, so after having + * subtracted at most minlen and maclen up to this point, + * data_len > 0 (because of data_len % ivlen == 0, it's actually + * >= ivlen ). */ + padlen = data[rec->data_len - 1]; + + if (auth_done == 1) { + const size_t mask = mbedtls_ct_size_mask_ge( + rec->data_len, + padlen + 1); + correct &= mask; + padlen &= mask; + } else { +#if defined(MBEDTLS_SSL_DEBUG_ALL) + if (rec->data_len < transform->maclen + padlen + 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("msglen (%" MBEDTLS_PRINTF_SIZET + ") < maclen (%" MBEDTLS_PRINTF_SIZET + ") + padlen (%" MBEDTLS_PRINTF_SIZET ")", + rec->data_len, + transform->maclen, + padlen + 1)); + } +#endif + + const size_t mask = mbedtls_ct_size_mask_ge( + rec->data_len, + transform->maclen + padlen + 1); + correct &= mask; + padlen &= mask; + } + + padlen++; + + /* Regardless of the validity of the padding, + * we have data_len >= padlen here. */ + +#if defined(MBEDTLS_SSL_PROTO_SSL3) + if (transform->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) { + /* This is the SSL 3.0 path, we don't have to worry about Lucky + * 13, because there's a strictly worse padding attack built in + * the protocol (known as part of POODLE), so we don't care if the + * code is not constant-time, in particular branches are OK. */ + if (padlen > transform->ivlen) { +#if defined(MBEDTLS_SSL_DEBUG_ALL) + MBEDTLS_SSL_DEBUG_MSG(1, ("bad padding length: is %" MBEDTLS_PRINTF_SIZET ", " + "should be no more than %" + MBEDTLS_PRINTF_SIZET, + padlen, transform->ivlen)); +#endif + correct = 0; + } + } else +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (transform->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0) { + /* The padding check involves a series of up to 256 + * consecutive memory reads at the end of the record + * plaintext buffer. In order to hide the length and + * validity of the padding, always perform exactly + * `min(256,plaintext_len)` reads (but take into account + * only the last `padlen` bytes for the padding check). */ + size_t pad_count = 0; + volatile unsigned char * const check = data; + + /* Index of first padding byte; it has been ensured above + * that the subtraction is safe. */ + size_t const padding_idx = rec->data_len - padlen; + size_t const num_checks = rec->data_len <= 256 ? rec->data_len : 256; + size_t const start_idx = rec->data_len - num_checks; + size_t idx; + + for (idx = start_idx; idx < rec->data_len; idx++) { + /* pad_count += (idx >= padding_idx) && + * (check[idx] == padlen - 1); + */ + const size_t mask = mbedtls_ct_size_mask_ge(idx, padding_idx); + const size_t equal = mbedtls_ct_size_bool_eq(check[idx], + padlen - 1); + pad_count += mask & equal; + } + correct &= mbedtls_ct_size_bool_eq(pad_count, padlen); + +#if defined(MBEDTLS_SSL_DEBUG_ALL) + if (padlen > 0 && correct == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad padding byte detected")); + } +#endif + padlen &= mbedtls_ct_size_mask(correct); + } else +#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ + MBEDTLS_SSL_PROTO_TLS1_2 */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + /* If the padding was found to be invalid, padlen == 0 + * and the subtraction is safe. If the padding was found valid, + * padlen hasn't been changed and the previous assertion + * data_len >= padlen still holds. */ + rec->data_len -= padlen; + } else +#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + +#if defined(MBEDTLS_SSL_DEBUG_ALL) + MBEDTLS_SSL_DEBUG_BUF(4, "raw buffer after decryption", + data, rec->data_len); +#endif + + /* + * Authenticate if not done yet. + * Compute the MAC regardless of the padding result (RFC4346, CBCTIME). + */ +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) + if (auth_done == 0) { + unsigned char mac_expect[MBEDTLS_SSL_MAC_ADD] = { 0 }; + unsigned char mac_peer[MBEDTLS_SSL_MAC_ADD] = { 0 }; + + /* For CBC+MAC, If the initial value of padlen was such that + * data_len < maclen + padlen + 1, then padlen + * got reset to 1, and the initial check + * data_len >= minlen + maclen + 1 + * guarantees that at this point we still + * have at least data_len >= maclen. + * + * If the initial value of padlen was such that + * data_len >= maclen + padlen + 1, then we have + * subtracted either padlen + 1 (if the padding was correct) + * or 0 (if the padding was incorrect) since then, + * hence data_len >= maclen in any case. + * + * For stream ciphers, we checked above that + * data_len >= maclen. + */ + rec->data_len -= transform->maclen; + ssl_extract_add_data_from_record(add_data, &add_data_len, rec, + transform->minor_ver); + +#if defined(MBEDTLS_SSL_PROTO_SSL3) + if (transform->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) { + ret = ssl_mac(&transform->md_ctx_dec, + transform->mac_dec, + data, rec->data_len, + rec->ctr, rec->type, + mac_expect); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_mac", ret); + goto hmac_failed_etm_disabled; + } + memcpy(mac_peer, data + rec->data_len, transform->maclen); + } else +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (transform->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0) { + /* + * The next two sizes are the minimum and maximum values of + * data_len over all padlen values. + * + * They're independent of padlen, since we previously did + * data_len -= padlen. + * + * Note that max_len + maclen is never more than the buffer + * length, as we previously did in_msglen -= maclen too. + */ + const size_t max_len = rec->data_len + padlen; + const size_t min_len = (max_len > 256) ? max_len - 256 : 0; + + ret = mbedtls_ct_hmac(&transform->md_ctx_dec, + add_data, add_data_len, + data, rec->data_len, min_len, max_len, + mac_expect); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ct_hmac", ret); + goto hmac_failed_etm_disabled; + } + + mbedtls_ct_memcpy_offset(mac_peer, data, + rec->data_len, + min_len, max_len, + transform->maclen); + } else +#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ + MBEDTLS_SSL_PROTO_TLS1_2 */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + +#if defined(MBEDTLS_SSL_DEBUG_ALL) + MBEDTLS_SSL_DEBUG_BUF(4, "expected mac", mac_expect, transform->maclen); + MBEDTLS_SSL_DEBUG_BUF(4, "message mac", mac_peer, transform->maclen); +#endif + + if (mbedtls_ct_memcmp(mac_peer, mac_expect, + transform->maclen) != 0) { +#if defined(MBEDTLS_SSL_DEBUG_ALL) + MBEDTLS_SSL_DEBUG_MSG(1, ("message mac does not match")); +#endif + correct = 0; + } + auth_done++; + +hmac_failed_etm_disabled: + mbedtls_platform_zeroize(mac_peer, transform->maclen); + mbedtls_platform_zeroize(mac_expect, transform->maclen); + if (ret != 0) { + return ret; + } + } + + /* + * Finally check the correct flag + */ + if (correct == 0) { + return MBEDTLS_ERR_SSL_INVALID_MAC; + } +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ + + /* Make extra sure authentication was performed, exactly once */ + if (auth_done != 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + +#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) + if (transform->minor_ver == MBEDTLS_SSL_MINOR_VERSION_4) { + /* Remove inner padding and infer true content type. */ + ret = ssl_parse_inner_plaintext(data, &rec->data_len, + &rec->type); + + if (ret != 0) { + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + } +#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + if (rec->cid_len != 0) { + ret = ssl_parse_inner_plaintext(data, &rec->data_len, + &rec->type); + if (ret != 0) { + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + } +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= decrypt buf")); + + return 0; +} + +#undef MAC_NONE +#undef MAC_PLAINTEXT +#undef MAC_CIPHERTEXT + +#if defined(MBEDTLS_ZLIB_SUPPORT) +/* + * Compression/decompression functions + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_compress_buf(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *msg_post = ssl->out_msg; + ptrdiff_t bytes_written = ssl->out_msg - ssl->out_buf; + size_t len_pre = ssl->out_msglen; + unsigned char *msg_pre = ssl->compress_buf; +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + size_t out_buf_len = ssl->out_buf_len; +#else + size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN; +#endif + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> compress buf")); + + if (len_pre == 0) { + return 0; + } + + memcpy(msg_pre, ssl->out_msg, len_pre); + + MBEDTLS_SSL_DEBUG_MSG(3, ("before compression: msglen = %" MBEDTLS_PRINTF_SIZET ", ", + ssl->out_msglen)); + + MBEDTLS_SSL_DEBUG_BUF(4, "before compression: output payload", + ssl->out_msg, ssl->out_msglen); + + ssl->transform_out->ctx_deflate.next_in = msg_pre; + ssl->transform_out->ctx_deflate.avail_in = len_pre; + ssl->transform_out->ctx_deflate.next_out = msg_post; + ssl->transform_out->ctx_deflate.avail_out = out_buf_len - bytes_written; + + ret = deflate(&ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH); + if (ret != Z_OK) { + MBEDTLS_SSL_DEBUG_MSG(1, ("failed to perform compression (%d)", ret)); + return MBEDTLS_ERR_SSL_COMPRESSION_FAILED; + } + + ssl->out_msglen = out_buf_len - + ssl->transform_out->ctx_deflate.avail_out - bytes_written; + + MBEDTLS_SSL_DEBUG_MSG(3, ("after compression: msglen = %" MBEDTLS_PRINTF_SIZET ", ", + ssl->out_msglen)); + + MBEDTLS_SSL_DEBUG_BUF(4, "after compression: output payload", + ssl->out_msg, ssl->out_msglen); + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= compress buf")); + + return 0; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_decompress_buf(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *msg_post = ssl->in_msg; + ptrdiff_t header_bytes = ssl->in_msg - ssl->in_buf; + size_t len_pre = ssl->in_msglen; + unsigned char *msg_pre = ssl->compress_buf; +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + size_t in_buf_len = ssl->in_buf_len; +#else + size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN; +#endif + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> decompress buf")); + + if (len_pre == 0) { + return 0; + } + + memcpy(msg_pre, ssl->in_msg, len_pre); + + MBEDTLS_SSL_DEBUG_MSG(3, ("before decompression: msglen = %" MBEDTLS_PRINTF_SIZET ", ", + ssl->in_msglen)); + + MBEDTLS_SSL_DEBUG_BUF(4, "before decompression: input payload", + ssl->in_msg, ssl->in_msglen); + + ssl->transform_in->ctx_inflate.next_in = msg_pre; + ssl->transform_in->ctx_inflate.avail_in = len_pre; + ssl->transform_in->ctx_inflate.next_out = msg_post; + ssl->transform_in->ctx_inflate.avail_out = in_buf_len - header_bytes; + + ret = inflate(&ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH); + if (ret != Z_OK) { + MBEDTLS_SSL_DEBUG_MSG(1, ("failed to perform decompression (%d)", ret)); + return MBEDTLS_ERR_SSL_COMPRESSION_FAILED; + } + + ssl->in_msglen = in_buf_len - + ssl->transform_in->ctx_inflate.avail_out - header_bytes; + + MBEDTLS_SSL_DEBUG_MSG(3, ("after decompression: msglen = %" MBEDTLS_PRINTF_SIZET ", ", + ssl->in_msglen)); + + MBEDTLS_SSL_DEBUG_BUF(4, "after decompression: input payload", + ssl->in_msg, ssl->in_msglen); + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= decompress buf")); + + return 0; +} +#endif /* MBEDTLS_ZLIB_SUPPORT */ + +/* + * Fill the input message buffer by appending data to it. + * The amount of data already fetched is in ssl->in_left. + * + * If we return 0, is it guaranteed that (at least) nb_want bytes are + * available (from this read and/or a previous one). Otherwise, an error code + * is returned (possibly EOF or WANT_READ). + * + * With stream transport (TLS) on success ssl->in_left == nb_want, but + * with datagram transport (DTLS) on success ssl->in_left >= nb_want, + * since we always read a whole datagram at once. + * + * For DTLS, it is up to the caller to set ssl->next_record_offset when + * they're done reading a record. + */ +int mbedtls_ssl_fetch_input(mbedtls_ssl_context *ssl, size_t nb_want) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + size_t in_buf_len = ssl->in_buf_len; +#else + size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN; +#endif + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> fetch input")); + + if (ssl->f_recv == NULL && ssl->f_recv_timeout == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Bad usage of mbedtls_ssl_set_bio() ")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (nb_want > in_buf_len - (size_t) (ssl->in_hdr - ssl->in_buf)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("requesting more data than fits")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + uint32_t timeout; + + /* + * The point is, we need to always read a full datagram at once, so we + * sometimes read more then requested, and handle the additional data. + * It could be the rest of the current record (while fetching the + * header) and/or some other records in the same datagram. + */ + + /* + * Move to the next record in the already read datagram if applicable + */ + if (ssl->next_record_offset != 0) { + if (ssl->in_left < ssl->next_record_offset) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + ssl->in_left -= ssl->next_record_offset; + + if (ssl->in_left != 0) { + MBEDTLS_SSL_DEBUG_MSG(2, ("next record in same datagram, offset: %" + MBEDTLS_PRINTF_SIZET, + ssl->next_record_offset)); + memmove(ssl->in_hdr, + ssl->in_hdr + ssl->next_record_offset, + ssl->in_left); + } + + ssl->next_record_offset = 0; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("in_left: %" MBEDTLS_PRINTF_SIZET + ", nb_want: %" MBEDTLS_PRINTF_SIZET, + ssl->in_left, nb_want)); + + /* + * Done if we already have enough data. + */ + if (nb_want <= ssl->in_left) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= fetch input")); + return 0; + } + + /* + * A record can't be split across datagrams. If we need to read but + * are not at the beginning of a new record, the caller did something + * wrong. + */ + if (ssl->in_left != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + /* + * Don't even try to read if time's out already. + * This avoids by-passing the timer when repeatedly receiving messages + * that will end up being dropped. + */ + if (mbedtls_ssl_check_timer(ssl) != 0) { + MBEDTLS_SSL_DEBUG_MSG(2, ("timer has expired")); + ret = MBEDTLS_ERR_SSL_TIMEOUT; + } else { + len = in_buf_len - (ssl->in_hdr - ssl->in_buf); + + if (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) { + timeout = ssl->handshake->retransmit_timeout; + } else { + timeout = ssl->conf->read_timeout; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("f_recv_timeout: %lu ms", (unsigned long) timeout)); + + if (ssl->f_recv_timeout != NULL) { + ret = ssl->f_recv_timeout(ssl->p_bio, ssl->in_hdr, len, + timeout); + } else { + ret = ssl->f_recv(ssl->p_bio, ssl->in_hdr, len); + } + + MBEDTLS_SSL_DEBUG_RET(2, "ssl->f_recv(_timeout)", ret); + + if (ret == 0) { + return MBEDTLS_ERR_SSL_CONN_EOF; + } + } + + if (ret == MBEDTLS_ERR_SSL_TIMEOUT) { + MBEDTLS_SSL_DEBUG_MSG(2, ("timeout")); + mbedtls_ssl_set_timer(ssl, 0); + + if (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) { + if (ssl_double_retransmit_timeout(ssl) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("handshake timeout")); + return MBEDTLS_ERR_SSL_TIMEOUT; + } + + if ((ret = mbedtls_ssl_resend(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_resend", ret); + return ret; + } + + return MBEDTLS_ERR_SSL_WANT_READ; + } +#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION) + else if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && + ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING) { + if ((ret = mbedtls_ssl_resend_hello_request(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_resend_hello_request", + ret); + return ret; + } + + return MBEDTLS_ERR_SSL_WANT_READ; + } +#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */ + } + + if (ret < 0) { + return ret; + } + + ssl->in_left = ret; + } else +#endif + { + MBEDTLS_SSL_DEBUG_MSG(2, ("in_left: %" MBEDTLS_PRINTF_SIZET + ", nb_want: %" MBEDTLS_PRINTF_SIZET, + ssl->in_left, nb_want)); + + while (ssl->in_left < nb_want) { + len = nb_want - ssl->in_left; + + if (mbedtls_ssl_check_timer(ssl) != 0) { + ret = MBEDTLS_ERR_SSL_TIMEOUT; + } else { + if (ssl->f_recv_timeout != NULL) { + ret = ssl->f_recv_timeout(ssl->p_bio, + ssl->in_hdr + ssl->in_left, len, + ssl->conf->read_timeout); + } else { + ret = ssl->f_recv(ssl->p_bio, + ssl->in_hdr + ssl->in_left, len); + } + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("in_left: %" MBEDTLS_PRINTF_SIZET + ", nb_want: %" MBEDTLS_PRINTF_SIZET, + ssl->in_left, nb_want)); + MBEDTLS_SSL_DEBUG_RET(2, "ssl->f_recv(_timeout)", ret); + + if (ret == 0) { + return MBEDTLS_ERR_SSL_CONN_EOF; + } + + if (ret < 0) { + return ret; + } + + if ((size_t) ret > len || (INT_MAX > SIZE_MAX && ret > (int) SIZE_MAX)) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("f_recv returned %d bytes but only %" MBEDTLS_PRINTF_SIZET + " were requested", + ret, len)); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + ssl->in_left += ret; + } + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= fetch input")); + + return 0; +} + +/* + * Flush any data not yet written + */ +int mbedtls_ssl_flush_output(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *buf; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> flush output")); + + if (ssl->f_send == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Bad usage of mbedtls_ssl_set_bio() ")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + /* Avoid incrementing counter if data is flushed */ + if (ssl->out_left == 0) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= flush output")); + return 0; + } + + while (ssl->out_left > 0) { + MBEDTLS_SSL_DEBUG_MSG(2, ("message length: %" MBEDTLS_PRINTF_SIZET + ", out_left: %" MBEDTLS_PRINTF_SIZET, + mbedtls_ssl_out_hdr_len(ssl) + ssl->out_msglen, ssl->out_left)); + + buf = ssl->out_hdr - ssl->out_left; + ret = ssl->f_send(ssl->p_bio, buf, ssl->out_left); + + MBEDTLS_SSL_DEBUG_RET(2, "ssl->f_send", ret); + + if (ret <= 0) { + return ret; + } + + if ((size_t) ret > ssl->out_left || (INT_MAX > SIZE_MAX && ret > (int) SIZE_MAX)) { + MBEDTLS_SSL_DEBUG_MSG(1, + ("f_send returned %d bytes but only %" MBEDTLS_PRINTF_SIZET + " bytes were sent", + ret, ssl->out_left)); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + ssl->out_left -= ret; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + ssl->out_hdr = ssl->out_buf; + } else +#endif + { + ssl->out_hdr = ssl->out_buf + 8; + } + mbedtls_ssl_update_out_pointers(ssl, ssl->transform_out); + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= flush output")); + + return 0; +} + +/* + * Functions to handle the DTLS retransmission state machine + */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) +/* + * Append current handshake message to current outgoing flight + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_flight_append(mbedtls_ssl_context *ssl) +{ + mbedtls_ssl_flight_item *msg; + MBEDTLS_SSL_DEBUG_MSG(2, ("=> ssl_flight_append")); + MBEDTLS_SSL_DEBUG_BUF(4, "message appended to flight", + ssl->out_msg, ssl->out_msglen); + + /* Allocate space for current message */ + if ((msg = mbedtls_calloc(1, sizeof(mbedtls_ssl_flight_item))) == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("alloc %" MBEDTLS_PRINTF_SIZET " bytes failed", + sizeof(mbedtls_ssl_flight_item))); + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + if ((msg->p = mbedtls_calloc(1, ssl->out_msglen)) == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("alloc %" MBEDTLS_PRINTF_SIZET " bytes failed", + ssl->out_msglen)); + mbedtls_free(msg); + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + /* Copy current handshake message with headers */ + memcpy(msg->p, ssl->out_msg, ssl->out_msglen); + msg->len = ssl->out_msglen; + msg->type = ssl->out_msgtype; + msg->next = NULL; + + /* Append to the current flight */ + if (ssl->handshake->flight == NULL) { + ssl->handshake->flight = msg; + } else { + mbedtls_ssl_flight_item *cur = ssl->handshake->flight; + while (cur->next != NULL) { + cur = cur->next; + } + cur->next = msg; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= ssl_flight_append")); + return 0; +} + +/* + * Free the current flight of handshake messages + */ +void mbedtls_ssl_flight_free(mbedtls_ssl_flight_item *flight) +{ + mbedtls_ssl_flight_item *cur = flight; + mbedtls_ssl_flight_item *next; + + while (cur != NULL) { + next = cur->next; + + mbedtls_free(cur->p); + mbedtls_free(cur); + + cur = next; + } +} + +/* + * Swap transform_out and out_ctr with the alternative ones + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_swap_epochs(mbedtls_ssl_context *ssl) +{ + mbedtls_ssl_transform *tmp_transform; + unsigned char tmp_out_ctr[8]; + + if (ssl->transform_out == ssl->handshake->alt_transform_out) { + MBEDTLS_SSL_DEBUG_MSG(3, ("skip swap epochs")); + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("swap epochs")); + + /* Swap transforms */ + tmp_transform = ssl->transform_out; + ssl->transform_out = ssl->handshake->alt_transform_out; + ssl->handshake->alt_transform_out = tmp_transform; + + /* Swap epoch + sequence_number */ + memcpy(tmp_out_ctr, ssl->cur_out_ctr, 8); + memcpy(ssl->cur_out_ctr, ssl->handshake->alt_out_ctr, 8); + memcpy(ssl->handshake->alt_out_ctr, tmp_out_ctr, 8); + + /* Adjust to the newly activated transform */ + mbedtls_ssl_update_out_pointers(ssl, ssl->transform_out); + +#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) + if (mbedtls_ssl_hw_record_activate != NULL) { + int ret = mbedtls_ssl_hw_record_activate(ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_hw_record_activate", ret); + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + } +#endif + + return 0; +} + +/* + * Retransmit the current flight of messages. + */ +int mbedtls_ssl_resend(mbedtls_ssl_context *ssl) +{ + int ret = 0; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> mbedtls_ssl_resend")); + + ret = mbedtls_ssl_flight_transmit(ssl); + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= mbedtls_ssl_resend")); + + return ret; +} + +/* + * Transmit or retransmit the current flight of messages. + * + * Need to remember the current message in case flush_output returns + * WANT_WRITE, causing us to exit this function and come back later. + * This function must be called until state is no longer SENDING. + */ +int mbedtls_ssl_flight_transmit(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + MBEDTLS_SSL_DEBUG_MSG(2, ("=> mbedtls_ssl_flight_transmit")); + + if (ssl->handshake->retransmit_state != MBEDTLS_SSL_RETRANS_SENDING) { + MBEDTLS_SSL_DEBUG_MSG(2, ("initialise flight transmission")); + + ssl->handshake->cur_msg = ssl->handshake->flight; + ssl->handshake->cur_msg_p = ssl->handshake->flight->p + 12; + ret = ssl_swap_epochs(ssl); + if (ret != 0) { + return ret; + } + + ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_SENDING; + } + + while (ssl->handshake->cur_msg != NULL) { + size_t max_frag_len; + const mbedtls_ssl_flight_item * const cur = ssl->handshake->cur_msg; + + int const is_finished = + (cur->type == MBEDTLS_SSL_MSG_HANDSHAKE && + cur->p[0] == MBEDTLS_SSL_HS_FINISHED); + + uint8_t const force_flush = ssl->disable_datagram_packing == 1 ? + SSL_FORCE_FLUSH : SSL_DONT_FORCE_FLUSH; + + /* Swap epochs before sending Finished: we can't do it after + * sending ChangeCipherSpec, in case write returns WANT_READ. + * Must be done before copying, may change out_msg pointer */ + if (is_finished && ssl->handshake->cur_msg_p == (cur->p + 12)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("swap epochs to send finished message")); + ret = ssl_swap_epochs(ssl); + if (ret != 0) { + return ret; + } + } + + ret = ssl_get_remaining_payload_in_datagram(ssl); + if (ret < 0) { + return ret; + } + max_frag_len = (size_t) ret; + + /* CCS is copied as is, while HS messages may need fragmentation */ + if (cur->type == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC) { + if (max_frag_len == 0) { + if ((ret = mbedtls_ssl_flush_output(ssl)) != 0) { + return ret; + } + + continue; + } + + memcpy(ssl->out_msg, cur->p, cur->len); + ssl->out_msglen = cur->len; + ssl->out_msgtype = cur->type; + + /* Update position inside current message */ + ssl->handshake->cur_msg_p += cur->len; + } else { + const unsigned char * const p = ssl->handshake->cur_msg_p; + const size_t hs_len = cur->len - 12; + const size_t frag_off = p - (cur->p + 12); + const size_t rem_len = hs_len - frag_off; + size_t cur_hs_frag_len, max_hs_frag_len; + + if ((max_frag_len < 12) || (max_frag_len == 12 && hs_len != 0)) { + if (is_finished) { + ret = ssl_swap_epochs(ssl); + if (ret != 0) { + return ret; + } + } + + if ((ret = mbedtls_ssl_flush_output(ssl)) != 0) { + return ret; + } + + continue; + } + max_hs_frag_len = max_frag_len - 12; + + cur_hs_frag_len = rem_len > max_hs_frag_len ? + max_hs_frag_len : rem_len; + + if (frag_off == 0 && cur_hs_frag_len != hs_len) { + MBEDTLS_SSL_DEBUG_MSG(2, ("fragmenting handshake message (%u > %u)", + (unsigned) cur_hs_frag_len, + (unsigned) max_hs_frag_len)); + } + + /* Messages are stored with handshake headers as if not fragmented, + * copy beginning of headers then fill fragmentation fields. + * Handshake headers: type(1) len(3) seq(2) f_off(3) f_len(3) */ + memcpy(ssl->out_msg, cur->p, 6); + + ssl->out_msg[6] = MBEDTLS_BYTE_2(frag_off); + ssl->out_msg[7] = MBEDTLS_BYTE_1(frag_off); + ssl->out_msg[8] = MBEDTLS_BYTE_0(frag_off); + + ssl->out_msg[9] = MBEDTLS_BYTE_2(cur_hs_frag_len); + ssl->out_msg[10] = MBEDTLS_BYTE_1(cur_hs_frag_len); + ssl->out_msg[11] = MBEDTLS_BYTE_0(cur_hs_frag_len); + + MBEDTLS_SSL_DEBUG_BUF(3, "handshake header", ssl->out_msg, 12); + + /* Copy the handshake message content and set records fields */ + memcpy(ssl->out_msg + 12, p, cur_hs_frag_len); + ssl->out_msglen = cur_hs_frag_len + 12; + ssl->out_msgtype = cur->type; + + /* Update position inside current message */ + ssl->handshake->cur_msg_p += cur_hs_frag_len; + } + + /* If done with the current message move to the next one if any */ + if (ssl->handshake->cur_msg_p >= cur->p + cur->len) { + if (cur->next != NULL) { + ssl->handshake->cur_msg = cur->next; + ssl->handshake->cur_msg_p = cur->next->p + 12; + } else { + ssl->handshake->cur_msg = NULL; + ssl->handshake->cur_msg_p = NULL; + } + } + + /* Actually send the message out */ + if ((ret = mbedtls_ssl_write_record(ssl, force_flush)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_record", ret); + return ret; + } + } + + if ((ret = mbedtls_ssl_flush_output(ssl)) != 0) { + return ret; + } + + /* Update state and set timer */ + if (ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER) { + ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED; + } else { + ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING; + mbedtls_ssl_set_timer(ssl, ssl->handshake->retransmit_timeout); + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= mbedtls_ssl_flight_transmit")); + + return 0; +} + +/* + * To be called when the last message of an incoming flight is received. + */ +void mbedtls_ssl_recv_flight_completed(mbedtls_ssl_context *ssl) +{ + /* We won't need to resend that one any more */ + mbedtls_ssl_flight_free(ssl->handshake->flight); + ssl->handshake->flight = NULL; + ssl->handshake->cur_msg = NULL; + + /* The next incoming flight will start with this msg_seq */ + ssl->handshake->in_flight_start_seq = ssl->handshake->in_msg_seq; + + /* We don't want to remember CCS's across flight boundaries. */ + ssl->handshake->buffering.seen_ccs = 0; + + /* Clear future message buffering structure. */ + mbedtls_ssl_buffering_free(ssl); + + /* Cancel timer */ + mbedtls_ssl_set_timer(ssl, 0); + + if (ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && + ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED) { + ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED; + } else { + ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING; + } +} + +/* + * To be called when the last message of an outgoing flight is send. + */ +void mbedtls_ssl_send_flight_completed(mbedtls_ssl_context *ssl) +{ + ssl_reset_retransmit_timeout(ssl); + mbedtls_ssl_set_timer(ssl, ssl->handshake->retransmit_timeout); + + if (ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && + ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED) { + ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED; + } else { + ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING; + } +} +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +/* + * Handshake layer functions + */ + +/* + * Write (DTLS: or queue) current handshake (including CCS) message. + * + * - fill in handshake headers + * - update handshake checksum + * - DTLS: save message for resending + * - then pass to the record layer + * + * DTLS: except for HelloRequest, messages are only queued, and will only be + * actually sent when calling flight_transmit() or resend(). + * + * Inputs: + * - ssl->out_msglen: 4 + actual handshake message len + * (4 is the size of handshake headers for TLS) + * - ssl->out_msg[0]: the handshake type (ClientHello, ServerHello, etc) + * - ssl->out_msg + 4: the handshake message body + * + * Outputs, ie state before passing to flight_append() or write_record(): + * - ssl->out_msglen: the length of the record contents + * (including handshake headers but excluding record headers) + * - ssl->out_msg: the record contents (handshake headers + content) + */ +int mbedtls_ssl_write_handshake_msg(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const size_t hs_len = ssl->out_msglen - 4; + const unsigned char hs_type = ssl->out_msg[0]; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write handshake message")); + + /* + * Sanity checks + */ + if (ssl->out_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE && + ssl->out_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC) { + /* In SSLv3, the client might send a NoCertificate alert. */ +#if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C) + if (!(ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 && + ssl->out_msgtype == MBEDTLS_SSL_MSG_ALERT && + ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT)) +#endif /* MBEDTLS_SSL_PROTO_SSL3 && MBEDTLS_SSL_SRV_C */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + } + + /* Whenever we send anything different from a + * HelloRequest we should be in a handshake - double check. */ + if (!(ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && + hs_type == MBEDTLS_SSL_HS_HELLO_REQUEST) && + ssl->handshake == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + ssl->handshake != NULL && + ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } +#endif + + /* Double-check that we did not exceed the bounds + * of the outgoing record buffer. + * This should never fail as the various message + * writing functions must obey the bounds of the + * outgoing record buffer, but better be safe. + * + * Note: We deliberately do not check for the MTU or MFL here. + */ + if (ssl->out_msglen > MBEDTLS_SSL_OUT_CONTENT_LEN) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Record too large: " + "size %" MBEDTLS_PRINTF_SIZET + ", maximum %" MBEDTLS_PRINTF_SIZET, + ssl->out_msglen, + (size_t) MBEDTLS_SSL_OUT_CONTENT_LEN)); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + /* + * Fill handshake headers + */ + if (ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE) { + ssl->out_msg[1] = MBEDTLS_BYTE_2(hs_len); + ssl->out_msg[2] = MBEDTLS_BYTE_1(hs_len); + ssl->out_msg[3] = MBEDTLS_BYTE_0(hs_len); + + /* + * DTLS has additional fields in the Handshake layer, + * between the length field and the actual payload: + * uint16 message_seq; + * uint24 fragment_offset; + * uint24 fragment_length; + */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + /* Make room for the additional DTLS fields */ + if (MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen < 8) { + MBEDTLS_SSL_DEBUG_MSG(1, ("DTLS handshake message too large: " + "size %" MBEDTLS_PRINTF_SIZET ", maximum %" + MBEDTLS_PRINTF_SIZET, + hs_len, + (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN - 12))); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + memmove(ssl->out_msg + 12, ssl->out_msg + 4, hs_len); + ssl->out_msglen += 8; + + /* Write message_seq and update it, except for HelloRequest */ + if (hs_type != MBEDTLS_SSL_HS_HELLO_REQUEST) { + MBEDTLS_PUT_UINT16_BE(ssl->handshake->out_msg_seq, ssl->out_msg, 4); + ++(ssl->handshake->out_msg_seq); + } else { + ssl->out_msg[4] = 0; + ssl->out_msg[5] = 0; + } + + /* Handshake hashes are computed without fragmentation, + * so set frag_offset = 0 and frag_len = hs_len for now */ + memset(ssl->out_msg + 6, 0x00, 3); + memcpy(ssl->out_msg + 9, ssl->out_msg + 1, 3); + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + /* Update running hashes of handshake messages seen */ + if (hs_type != MBEDTLS_SSL_HS_HELLO_REQUEST) { + ssl->handshake->update_checksum(ssl, ssl->out_msg, ssl->out_msglen); + } + } + + /* Either send now, or just save to be sent (and resent) later */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + !(ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && + hs_type == MBEDTLS_SSL_HS_HELLO_REQUEST)) { + if ((ret = ssl_flight_append(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_flight_append", ret); + return ret; + } + } else +#endif + { + if ((ret = mbedtls_ssl_write_record(ssl, SSL_FORCE_FLUSH)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_record", ret); + return ret; + } + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write handshake message")); + + return 0; +} + +/* + * Record layer functions + */ + +/* + * Write current record. + * + * Uses: + * - ssl->out_msgtype: type of the message (AppData, Handshake, Alert, CCS) + * - ssl->out_msglen: length of the record content (excl headers) + * - ssl->out_msg: record content + */ +int mbedtls_ssl_write_record(mbedtls_ssl_context *ssl, uint8_t force_flush) +{ + int ret, done = 0; + size_t len = ssl->out_msglen; + uint8_t flush = force_flush; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write record")); + +#if defined(MBEDTLS_ZLIB_SUPPORT) + if (ssl->transform_out != NULL && + ssl->session_out->compression == MBEDTLS_SSL_COMPRESS_DEFLATE) { + if ((ret = ssl_compress_buf(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_compress_buf", ret); + return ret; + } + + len = ssl->out_msglen; + } +#endif /*MBEDTLS_ZLIB_SUPPORT */ + +#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) + if (mbedtls_ssl_hw_record_write != NULL) { + MBEDTLS_SSL_DEBUG_MSG(2, ("going for mbedtls_ssl_hw_record_write()")); + + ret = mbedtls_ssl_hw_record_write(ssl); + if (ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_hw_record_write", ret); + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + + if (ret == 0) { + done = 1; + } + } +#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ + if (!done) { + unsigned i; + size_t protected_record_size; +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + size_t out_buf_len = ssl->out_buf_len; +#else + size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN; +#endif + /* Skip writing the record content type to after the encryption, + * as it may change when using the CID extension. */ + + mbedtls_ssl_write_version(ssl->major_ver, ssl->minor_ver, + ssl->conf->transport, ssl->out_hdr + 1); + + memcpy(ssl->out_ctr, ssl->cur_out_ctr, 8); + MBEDTLS_PUT_UINT16_BE(len, ssl->out_len, 0); + + if (ssl->transform_out != NULL) { + mbedtls_record rec; + + rec.buf = ssl->out_iv; + rec.buf_len = out_buf_len - (ssl->out_iv - ssl->out_buf); + rec.data_len = ssl->out_msglen; + rec.data_offset = ssl->out_msg - rec.buf; + + memcpy(&rec.ctr[0], ssl->out_ctr, 8); + mbedtls_ssl_write_version(ssl->major_ver, ssl->minor_ver, + ssl->conf->transport, rec.ver); + rec.type = ssl->out_msgtype; + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + /* The CID is set by mbedtls_ssl_encrypt_buf(). */ + rec.cid_len = 0; +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + + if ((ret = mbedtls_ssl_encrypt_buf(ssl, ssl->transform_out, &rec, + ssl->conf->f_rng, ssl->conf->p_rng)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_encrypt_buf", ret); + return ret; + } + + if (rec.data_offset != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + /* Update the record content type and CID. */ + ssl->out_msgtype = rec.type; +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + memcpy(ssl->out_cid, rec.cid, rec.cid_len); +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + ssl->out_msglen = len = rec.data_len; + MBEDTLS_PUT_UINT16_BE(rec.data_len, ssl->out_len, 0); + } + + protected_record_size = len + mbedtls_ssl_out_hdr_len(ssl); + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + /* In case of DTLS, double-check that we don't exceed + * the remaining space in the datagram. */ + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + ret = ssl_get_remaining_space_in_datagram(ssl); + if (ret < 0) { + return ret; + } + + if (protected_record_size > (size_t) ret) { + /* Should never happen */ + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + /* Now write the potentially updated record content type. */ + ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype; + + MBEDTLS_SSL_DEBUG_MSG(3, ("output record: msgtype = %u, " + "version = [%u:%u], msglen = %" MBEDTLS_PRINTF_SIZET, + ssl->out_hdr[0], ssl->out_hdr[1], + ssl->out_hdr[2], len)); + + MBEDTLS_SSL_DEBUG_BUF(4, "output record sent to network", + ssl->out_hdr, protected_record_size); + + ssl->out_left += protected_record_size; + ssl->out_hdr += protected_record_size; + mbedtls_ssl_update_out_pointers(ssl, ssl->transform_out); + + for (i = 8; i > mbedtls_ssl_ep_len(ssl); i--) { + if (++ssl->cur_out_ctr[i - 1] != 0) { + break; + } + } + + /* The loop goes to its end iff the counter is wrapping */ + if (i == mbedtls_ssl_ep_len(ssl)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("outgoing message counter would wrap")); + return MBEDTLS_ERR_SSL_COUNTER_WRAPPING; + } + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + flush == SSL_DONT_FORCE_FLUSH) { + size_t remaining; + ret = ssl_get_remaining_payload_in_datagram(ssl); + if (ret < 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_remaining_payload_in_datagram", + ret); + return ret; + } + + remaining = (size_t) ret; + if (remaining == 0) { + flush = SSL_FORCE_FLUSH; + } else { + MBEDTLS_SSL_DEBUG_MSG(2, + ("Still %u bytes available in current datagram", + (unsigned) remaining)); + } + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + if ((flush == SSL_FORCE_FLUSH) && + (ret = mbedtls_ssl_flush_output(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flush_output", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write record")); + + return 0; +} + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_hs_is_proper_fragment(mbedtls_ssl_context *ssl) +{ + if (ssl->in_msglen < ssl->in_hslen || + memcmp(ssl->in_msg + 6, "\0\0\0", 3) != 0 || + memcmp(ssl->in_msg + 9, ssl->in_msg + 1, 3) != 0) { + return 1; + } + return 0; +} + +static uint32_t ssl_get_hs_frag_len(mbedtls_ssl_context const *ssl) +{ + return (ssl->in_msg[9] << 16) | + (ssl->in_msg[10] << 8) | + ssl->in_msg[11]; +} + +static uint32_t ssl_get_hs_frag_off(mbedtls_ssl_context const *ssl) +{ + return (ssl->in_msg[6] << 16) | + (ssl->in_msg[7] << 8) | + ssl->in_msg[8]; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_check_hs_header(mbedtls_ssl_context const *ssl) +{ + uint32_t msg_len, frag_off, frag_len; + + msg_len = ssl_get_hs_total_len(ssl); + frag_off = ssl_get_hs_frag_off(ssl); + frag_len = ssl_get_hs_frag_len(ssl); + + if (frag_off > msg_len) { + return -1; + } + + if (frag_len > msg_len - frag_off) { + return -1; + } + + if (frag_len + 12 > ssl->in_msglen) { + return -1; + } + + return 0; +} + +/* + * Mark bits in bitmask (used for DTLS HS reassembly) + */ +static void ssl_bitmask_set(unsigned char *mask, size_t offset, size_t len) +{ + unsigned int start_bits, end_bits; + + start_bits = 8 - (offset % 8); + if (start_bits != 8) { + size_t first_byte_idx = offset / 8; + + /* Special case */ + if (len <= start_bits) { + for (; len != 0; len--) { + mask[first_byte_idx] |= 1 << (start_bits - len); + } + + /* Avoid potential issues with offset or len becoming invalid */ + return; + } + + offset += start_bits; /* Now offset % 8 == 0 */ + len -= start_bits; + + for (; start_bits != 0; start_bits--) { + mask[first_byte_idx] |= 1 << (start_bits - 1); + } + } + + end_bits = len % 8; + if (end_bits != 0) { + size_t last_byte_idx = (offset + len) / 8; + + len -= end_bits; /* Now len % 8 == 0 */ + + for (; end_bits != 0; end_bits--) { + mask[last_byte_idx] |= 1 << (8 - end_bits); + } + } + + memset(mask + offset / 8, 0xFF, len / 8); +} + +/* + * Check that bitmask is full + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_bitmask_check(unsigned char *mask, size_t len) +{ + size_t i; + + for (i = 0; i < len / 8; i++) { + if (mask[i] != 0xFF) { + return -1; + } + } + + for (i = 0; i < len % 8; i++) { + if ((mask[len / 8] & (1 << (7 - i))) == 0) { + return -1; + } + } + + return 0; +} + +/* msg_len does not include the handshake header */ +static size_t ssl_get_reassembly_buffer_size(size_t msg_len, + unsigned add_bitmap) +{ + size_t alloc_len; + + alloc_len = 12; /* Handshake header */ + alloc_len += msg_len; /* Content buffer */ + + if (add_bitmap) { + alloc_len += msg_len / 8 + (msg_len % 8 != 0); /* Bitmap */ + + } + return alloc_len; +} + +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +static uint32_t ssl_get_hs_total_len(mbedtls_ssl_context const *ssl) +{ + return (ssl->in_msg[1] << 16) | + (ssl->in_msg[2] << 8) | + ssl->in_msg[3]; +} + +int mbedtls_ssl_prepare_handshake_record(mbedtls_ssl_context *ssl) +{ + if (ssl->in_msglen < mbedtls_ssl_hs_hdr_len(ssl)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("handshake message too short: %" MBEDTLS_PRINTF_SIZET, + ssl->in_msglen)); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + + ssl->in_hslen = mbedtls_ssl_hs_hdr_len(ssl) + ssl_get_hs_total_len(ssl); + + MBEDTLS_SSL_DEBUG_MSG(3, ("handshake message: msglen =" + " %" MBEDTLS_PRINTF_SIZET ", type = %u, hslen = %" + MBEDTLS_PRINTF_SIZET, + ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen)); + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned int recv_msg_seq = (ssl->in_msg[4] << 8) | ssl->in_msg[5]; + + if (ssl_check_hs_header(ssl) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("invalid handshake header")); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + + if (ssl->handshake != NULL && + ((ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER && + recv_msg_seq != ssl->handshake->in_msg_seq) || + (ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER && + ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_HELLO))) { + if (recv_msg_seq > ssl->handshake->in_msg_seq) { + MBEDTLS_SSL_DEBUG_MSG(2, + ( + "received future handshake message of sequence number %u (next %u)", + recv_msg_seq, + ssl->handshake->in_msg_seq)); + return MBEDTLS_ERR_SSL_EARLY_MESSAGE; + } + + /* Retransmit only on last message from previous flight, to avoid + * too many retransmissions. + * Besides, No sane server ever retransmits HelloVerifyRequest */ + if (recv_msg_seq == ssl->handshake->in_flight_start_seq - 1 && + ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST) { + MBEDTLS_SSL_DEBUG_MSG(2, ("received message from last flight, " + "message_seq = %u, start_of_flight = %u", + recv_msg_seq, + ssl->handshake->in_flight_start_seq)); + + if ((ret = mbedtls_ssl_resend(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_resend", ret); + return ret; + } + } else { + MBEDTLS_SSL_DEBUG_MSG(2, ("dropping out-of-sequence message: " + "message_seq = %u, expected = %u", + recv_msg_seq, + ssl->handshake->in_msg_seq)); + } + + return MBEDTLS_ERR_SSL_CONTINUE_PROCESSING; + } + /* Wait until message completion to increment in_msg_seq */ + + /* Message reassembly is handled alongside buffering of future + * messages; the commonality is that both handshake fragments and + * future messages cannot be forwarded immediately to the + * handshake logic layer. */ + if (ssl_hs_is_proper_fragment(ssl) == 1) { + MBEDTLS_SSL_DEBUG_MSG(2, ("found fragmented DTLS handshake message")); + return MBEDTLS_ERR_SSL_EARLY_MESSAGE; + } + } else +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + /* With TLS we don't handle fragmentation (for now) */ + if (ssl->in_msglen < ssl->in_hslen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("TLS handshake fragmentation not supported")); + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + } + + return 0; +} + +void mbedtls_ssl_update_handshake_status(mbedtls_ssl_context *ssl) +{ + mbedtls_ssl_handshake_params * const hs = ssl->handshake; + + if (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER && hs != NULL) { + ssl->handshake->update_checksum(ssl, ssl->in_msg, ssl->in_hslen); + } + + /* Handshake message is complete, increment counter */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + ssl->handshake != NULL) { + unsigned offset; + mbedtls_ssl_hs_buffer *hs_buf; + + /* Increment handshake sequence number */ + hs->in_msg_seq++; + + /* + * Clear up handshake buffering and reassembly structure. + */ + + /* Free first entry */ + ssl_buffering_free_slot(ssl, 0); + + /* Shift all other entries */ + for (offset = 0, hs_buf = &hs->buffering.hs[0]; + offset + 1 < MBEDTLS_SSL_MAX_BUFFERED_HS; + offset++, hs_buf++) { + *hs_buf = *(hs_buf + 1); + } + + /* Create a fresh last entry */ + memset(hs_buf, 0, sizeof(mbedtls_ssl_hs_buffer)); + } +#endif +} + +/* + * DTLS anti-replay: RFC 6347 4.1.2.6 + * + * in_window is a field of bits numbered from 0 (lsb) to 63 (msb). + * Bit n is set iff record number in_window_top - n has been seen. + * + * Usually, in_window_top is the last record number seen and the lsb of + * in_window is set. The only exception is the initial state (record number 0 + * not seen yet). + */ +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) +void mbedtls_ssl_dtls_replay_reset(mbedtls_ssl_context *ssl) +{ + ssl->in_window_top = 0; + ssl->in_window = 0; +} + +static inline uint64_t ssl_load_six_bytes(unsigned char *buf) +{ + return ((uint64_t) buf[0] << 40) | + ((uint64_t) buf[1] << 32) | + ((uint64_t) buf[2] << 24) | + ((uint64_t) buf[3] << 16) | + ((uint64_t) buf[4] << 8) | + ((uint64_t) buf[5]); +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int mbedtls_ssl_dtls_record_replay_check(mbedtls_ssl_context *ssl, uint8_t *record_in_ctr) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *original_in_ctr; + + // save original in_ctr + original_in_ctr = ssl->in_ctr; + + // use counter from record + ssl->in_ctr = record_in_ctr; + + ret = mbedtls_ssl_dtls_replay_check((mbedtls_ssl_context const *) ssl); + + // restore the counter + ssl->in_ctr = original_in_ctr; + + return ret; +} + +/* + * Return 0 if sequence number is acceptable, -1 otherwise + */ +int mbedtls_ssl_dtls_replay_check(mbedtls_ssl_context const *ssl) +{ + uint64_t rec_seqnum = ssl_load_six_bytes(ssl->in_ctr + 2); + uint64_t bit; + + if (ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED) { + return 0; + } + + if (rec_seqnum > ssl->in_window_top) { + return 0; + } + + bit = ssl->in_window_top - rec_seqnum; + + if (bit >= 64) { + return -1; + } + + if ((ssl->in_window & ((uint64_t) 1 << bit)) != 0) { + return -1; + } + + return 0; +} + +/* + * Update replay window on new validated record + */ +void mbedtls_ssl_dtls_replay_update(mbedtls_ssl_context *ssl) +{ + uint64_t rec_seqnum = ssl_load_six_bytes(ssl->in_ctr + 2); + + if (ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED) { + return; + } + + if (rec_seqnum > ssl->in_window_top) { + /* Update window_top and the contents of the window */ + uint64_t shift = rec_seqnum - ssl->in_window_top; + + if (shift >= 64) { + ssl->in_window = 1; + } else { + ssl->in_window <<= shift; + ssl->in_window |= 1; + } + + ssl->in_window_top = rec_seqnum; + } else { + /* Mark that number as seen in the current window */ + uint64_t bit = ssl->in_window_top - rec_seqnum; + + if (bit < 64) { /* Always true, but be extra sure */ + ssl->in_window |= (uint64_t) 1 << bit; + } + } +} +#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ + +#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C) +/* + * Check if a datagram looks like a ClientHello with a valid cookie, + * and if it doesn't, generate a HelloVerifyRequest message. + * Both input and output include full DTLS headers. + * + * - if cookie is valid, return 0 + * - if ClientHello looks superficially valid but cookie is not, + * fill obuf and set olen, then + * return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED + * - otherwise return a specific error code + */ +MBEDTLS_CHECK_RETURN_CRITICAL +MBEDTLS_STATIC_TESTABLE +int mbedtls_ssl_check_dtls_clihlo_cookie( + mbedtls_ssl_context *ssl, + const unsigned char *cli_id, size_t cli_id_len, + const unsigned char *in, size_t in_len, + unsigned char *obuf, size_t buf_len, size_t *olen) +{ + size_t sid_len, cookie_len; + unsigned char *p; + + /* + * Structure of ClientHello with record and handshake headers, + * and expected values. We don't need to check a lot, more checks will be + * done when actually parsing the ClientHello - skipping those checks + * avoids code duplication and does not make cookie forging any easier. + * + * 0-0 ContentType type; copied, must be handshake + * 1-2 ProtocolVersion version; copied + * 3-4 uint16 epoch; copied, must be 0 + * 5-10 uint48 sequence_number; copied + * 11-12 uint16 length; (ignored) + * + * 13-13 HandshakeType msg_type; (ignored) + * 14-16 uint24 length; (ignored) + * 17-18 uint16 message_seq; copied + * 19-21 uint24 fragment_offset; copied, must be 0 + * 22-24 uint24 fragment_length; (ignored) + * + * 25-26 ProtocolVersion client_version; (ignored) + * 27-58 Random random; (ignored) + * 59-xx SessionID session_id; 1 byte len + sid_len content + * 60+ opaque cookie<0..2^8-1>; 1 byte len + content + * ... + * + * Minimum length is 61 bytes. + */ + MBEDTLS_SSL_DEBUG_MSG(4, ("check cookie: in_len=%u", + (unsigned) in_len)); + MBEDTLS_SSL_DEBUG_BUF(4, "cli_id", cli_id, cli_id_len); + if (in_len < 61) { + MBEDTLS_SSL_DEBUG_MSG(4, ("check cookie: record too short")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + if (in[0] != MBEDTLS_SSL_MSG_HANDSHAKE || + in[3] != 0 || in[4] != 0 || + in[19] != 0 || in[20] != 0 || in[21] != 0) { + MBEDTLS_SSL_DEBUG_MSG(4, ("check cookie: not a good ClientHello")); + MBEDTLS_SSL_DEBUG_MSG(4, (" type=%u epoch=%u fragment_offset=%u", + in[0], + (unsigned) in[3] << 8 | in[4], + (unsigned) in[19] << 16 | in[20] << 8 | in[21])); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + sid_len = in[59]; + if (59 + 1 + sid_len + 1 > in_len) { + MBEDTLS_SSL_DEBUG_MSG(4, ("check cookie: sid_len=%u > %u", + (unsigned) sid_len, + (unsigned) in_len - 61)); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + MBEDTLS_SSL_DEBUG_BUF(4, "sid received from network", + in + 60, sid_len); + + cookie_len = in[60 + sid_len]; + if (59 + 1 + sid_len + 1 + cookie_len > in_len) { + MBEDTLS_SSL_DEBUG_MSG(4, ("check cookie: cookie_len=%u > %u", + (unsigned) cookie_len, + (unsigned) (in_len - sid_len - 61))); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + MBEDTLS_SSL_DEBUG_BUF(4, "cookie received from network", + in + sid_len + 61, cookie_len); + if (ssl->conf->f_cookie_check(ssl->conf->p_cookie, + in + sid_len + 61, cookie_len, + cli_id, cli_id_len) == 0) { + MBEDTLS_SSL_DEBUG_MSG(4, ("check cookie: valid")); + return 0; + } + + /* + * If we get here, we've got an invalid cookie, let's prepare HVR. + * + * 0-0 ContentType type; copied + * 1-2 ProtocolVersion version; copied + * 3-4 uint16 epoch; copied + * 5-10 uint48 sequence_number; copied + * 11-12 uint16 length; olen - 13 + * + * 13-13 HandshakeType msg_type; hello_verify_request + * 14-16 uint24 length; olen - 25 + * 17-18 uint16 message_seq; copied + * 19-21 uint24 fragment_offset; copied + * 22-24 uint24 fragment_length; olen - 25 + * + * 25-26 ProtocolVersion server_version; 0xfe 0xff + * 27-27 opaque cookie<0..2^8-1>; cookie_len = olen - 27, cookie + * + * Minimum length is 28. + */ + if (buf_len < 28) { + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + + /* Copy most fields and adapt others */ + memcpy(obuf, in, 25); + obuf[13] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST; + obuf[25] = 0xfe; + obuf[26] = 0xff; + + /* Generate and write actual cookie */ + p = obuf + 28; + if (ssl->conf->f_cookie_write(ssl->conf->p_cookie, + &p, obuf + buf_len, + cli_id, cli_id_len) != 0) { + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + *olen = p - obuf; + + /* Go back and fill length fields */ + obuf[27] = (unsigned char) (*olen - 28); + + obuf[14] = obuf[22] = MBEDTLS_BYTE_2(*olen - 25); + obuf[15] = obuf[23] = MBEDTLS_BYTE_1(*olen - 25); + obuf[16] = obuf[24] = MBEDTLS_BYTE_0(*olen - 25); + + MBEDTLS_PUT_UINT16_BE(*olen - 13, obuf, 11); + + return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED; +} + +/* + * Handle possible client reconnect with the same UDP quadruplet + * (RFC 6347 Section 4.2.8). + * + * Called by ssl_parse_record_header() in case we receive an epoch 0 record + * that looks like a ClientHello. + * + * - if the input looks like a ClientHello without cookies, + * send back HelloVerifyRequest, then return 0 + * - if the input looks like a ClientHello with a valid cookie, + * reset the session of the current context, and + * return MBEDTLS_ERR_SSL_CLIENT_RECONNECT + * - if anything goes wrong, return a specific error code + * + * This function is called (through ssl_check_client_reconnect()) when an + * unexpected record is found in ssl_get_next_record(), which will discard the + * record if we return 0, and bubble up the return value otherwise (this + * includes the case of MBEDTLS_ERR_SSL_CLIENT_RECONNECT and of unexpected + * errors, and is the right thing to do in both cases). + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_handle_possible_reconnect(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + + if (ssl->conf->f_cookie_write == NULL || + ssl->conf->f_cookie_check == NULL) { + /* If we can't use cookies to verify reachability of the peer, + * drop the record. */ + MBEDTLS_SSL_DEBUG_MSG(1, ("no cookie callbacks, " + "can't check reconnect validity")); + return 0; + } + + ret = mbedtls_ssl_check_dtls_clihlo_cookie( + ssl, + ssl->cli_id, ssl->cli_id_len, + ssl->in_buf, ssl->in_left, + ssl->out_buf, MBEDTLS_SSL_OUT_CONTENT_LEN, &len); + + MBEDTLS_SSL_DEBUG_RET(2, "mbedtls_ssl_check_dtls_clihlo_cookie", ret); + + if (ret == MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED) { + int send_ret; + MBEDTLS_SSL_DEBUG_MSG(1, ("sending HelloVerifyRequest")); + MBEDTLS_SSL_DEBUG_BUF(4, "output record sent to network", + ssl->out_buf, len); + /* Don't check write errors as we can't do anything here. + * If the error is permanent we'll catch it later, + * if it's not, then hopefully it'll work next time. */ + send_ret = ssl->f_send(ssl->p_bio, ssl->out_buf, len); + MBEDTLS_SSL_DEBUG_RET(2, "ssl->f_send", send_ret); + (void) send_ret; + + return 0; + } + + if (ret == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("cookie is valid, resetting context")); + if ((ret = mbedtls_ssl_session_reset_int(ssl, 1)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "reset", ret); + return ret; + } + + return MBEDTLS_ERR_SSL_CLIENT_RECONNECT; + } + + return ret; +} +#endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */ + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_check_record_type(uint8_t record_type) +{ + if (record_type != MBEDTLS_SSL_MSG_HANDSHAKE && + record_type != MBEDTLS_SSL_MSG_ALERT && + record_type != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC && + record_type != MBEDTLS_SSL_MSG_APPLICATION_DATA) { + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + + return 0; +} + +/* + * ContentType type; + * ProtocolVersion version; + * uint16 epoch; // DTLS only + * uint48 sequence_number; // DTLS only + * uint16 length; + * + * Return 0 if header looks sane (and, for DTLS, the record is expected) + * MBEDTLS_ERR_SSL_INVALID_RECORD if the header looks bad, + * MBEDTLS_ERR_SSL_UNEXPECTED_RECORD (DTLS only) if sane but unexpected. + * + * With DTLS, mbedtls_ssl_read_record() will: + * 1. proceed with the record if this function returns 0 + * 2. drop only the current record if this function returns UNEXPECTED_RECORD + * 3. return CLIENT_RECONNECT if this function return that value + * 4. drop the whole datagram if this function returns anything else. + * Point 2 is needed when the peer is resending, and we have already received + * the first record from a datagram but are still waiting for the others. + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_record_header(mbedtls_ssl_context const *ssl, + unsigned char *buf, + size_t len, + mbedtls_record *rec) +{ + int major_ver, minor_ver; + + size_t const rec_hdr_type_offset = 0; + size_t const rec_hdr_type_len = 1; + + size_t const rec_hdr_version_offset = rec_hdr_type_offset + + rec_hdr_type_len; + size_t const rec_hdr_version_len = 2; + + size_t const rec_hdr_ctr_len = 8; +#if defined(MBEDTLS_SSL_PROTO_DTLS) + uint32_t rec_epoch; + size_t const rec_hdr_ctr_offset = rec_hdr_version_offset + + rec_hdr_version_len; + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + size_t const rec_hdr_cid_offset = rec_hdr_ctr_offset + + rec_hdr_ctr_len; + size_t rec_hdr_cid_len = 0; +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + size_t rec_hdr_len_offset; /* To be determined */ + size_t const rec_hdr_len_len = 2; + + /* + * Check minimum lengths for record header. + */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + rec_hdr_len_offset = rec_hdr_ctr_offset + rec_hdr_ctr_len; + } else +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + { + rec_hdr_len_offset = rec_hdr_version_offset + rec_hdr_version_len; + } + + if (len < rec_hdr_len_offset + rec_hdr_len_len) { + MBEDTLS_SSL_DEBUG_MSG(1, + ( + "datagram of length %u too small to hold DTLS record header of length %u", + (unsigned) len, + (unsigned) (rec_hdr_len_len + rec_hdr_len_len))); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + + /* + * Parse and validate record content type + */ + + rec->type = buf[rec_hdr_type_offset]; + + /* Check record content type */ +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + rec->cid_len = 0; + + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + ssl->conf->cid_len != 0 && + rec->type == MBEDTLS_SSL_MSG_CID) { + /* Shift pointers to account for record header including CID + * struct { + * ContentType special_type = tls12_cid; + * ProtocolVersion version; + * uint16 epoch; + * uint48 sequence_number; + * opaque cid[cid_length]; // Additional field compared to + * // default DTLS record format + * uint16 length; + * opaque enc_content[DTLSCiphertext.length]; + * } DTLSCiphertext; + */ + + /* So far, we only support static CID lengths + * fixed in the configuration. */ + rec_hdr_cid_len = ssl->conf->cid_len; + rec_hdr_len_offset += rec_hdr_cid_len; + + if (len < rec_hdr_len_offset + rec_hdr_len_len) { + MBEDTLS_SSL_DEBUG_MSG(1, + ( + "datagram of length %u too small to hold DTLS record header including CID, length %u", + (unsigned) len, + (unsigned) (rec_hdr_len_offset + rec_hdr_len_len))); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + + /* configured CID len is guaranteed at most 255, see + * MBEDTLS_SSL_CID_OUT_LEN_MAX in check_config.h */ + rec->cid_len = (uint8_t) rec_hdr_cid_len; + memcpy(rec->cid, buf + rec_hdr_cid_offset, rec_hdr_cid_len); + } else +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + { + if (ssl_check_record_type(rec->type)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("unknown record type %u", + (unsigned) rec->type)); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + } + + /* + * Parse and validate record version + */ + rec->ver[0] = buf[rec_hdr_version_offset + 0]; + rec->ver[1] = buf[rec_hdr_version_offset + 1]; + mbedtls_ssl_read_version(&major_ver, &minor_ver, + ssl->conf->transport, + &rec->ver[0]); + + if (major_ver != ssl->major_ver) { + MBEDTLS_SSL_DEBUG_MSG(1, ("major version mismatch: got %u, expected %u", + (unsigned) major_ver, + (unsigned) ssl->major_ver)); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + + if (minor_ver > ssl->conf->max_minor_ver) { + MBEDTLS_SSL_DEBUG_MSG(1, ("minor version mismatch: got %u, expected max %u", + (unsigned) minor_ver, + (unsigned) ssl->conf->max_minor_ver)); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + /* + * Parse/Copy record sequence number. + */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + /* Copy explicit record sequence number from input buffer. */ + memcpy(&rec->ctr[0], buf + rec_hdr_ctr_offset, + rec_hdr_ctr_len); + } else +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + { + /* Copy implicit record sequence number from SSL context structure. */ + memcpy(&rec->ctr[0], ssl->in_ctr, rec_hdr_ctr_len); + } + + /* + * Parse record length. + */ + + rec->data_offset = rec_hdr_len_offset + rec_hdr_len_len; + rec->data_len = ((size_t) buf[rec_hdr_len_offset + 0] << 8) | + ((size_t) buf[rec_hdr_len_offset + 1] << 0); + MBEDTLS_SSL_DEBUG_BUF(4, "input record header", buf, rec->data_offset); + + MBEDTLS_SSL_DEBUG_MSG(3, ("input record: msgtype = %u, " + "version = [%d:%d], msglen = %" MBEDTLS_PRINTF_SIZET, + rec->type, + major_ver, minor_ver, rec->data_len)); + + rec->buf = buf; + rec->buf_len = rec->data_offset + rec->data_len; + + if (rec->data_len == 0) { + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + + /* + * DTLS-related tests. + * Check epoch before checking length constraint because + * the latter varies with the epoch. E.g., if a ChangeCipherSpec + * message gets duplicated before the corresponding Finished message, + * the second ChangeCipherSpec should be discarded because it belongs + * to an old epoch, but not because its length is shorter than + * the minimum record length for packets using the new record transform. + * Note that these two kinds of failures are handled differently, + * as an unexpected record is silently skipped but an invalid + * record leads to the entire datagram being dropped. + */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + rec_epoch = (rec->ctr[0] << 8) | rec->ctr[1]; + + /* Check that the datagram is large enough to contain a record + * of the advertised length. */ + if (len < rec->data_offset + rec->data_len) { + MBEDTLS_SSL_DEBUG_MSG(1, + ( + "Datagram of length %u too small to contain record of advertised length %u.", + (unsigned) len, + (unsigned) (rec->data_offset + rec->data_len))); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + + /* Records from other, non-matching epochs are silently discarded. + * (The case of same-port Client reconnects must be considered in + * the caller). */ + if (rec_epoch != ssl->in_epoch) { + MBEDTLS_SSL_DEBUG_MSG(1, ("record from another epoch: " + "expected %u, received %lu", + ssl->in_epoch, (unsigned long) rec_epoch)); + + /* Records from the next epoch are considered for buffering + * (concretely: early Finished messages). */ + if (rec_epoch == (unsigned) ssl->in_epoch + 1) { + MBEDTLS_SSL_DEBUG_MSG(2, ("Consider record for buffering")); + return MBEDTLS_ERR_SSL_EARLY_MESSAGE; + } + + return MBEDTLS_ERR_SSL_UNEXPECTED_RECORD; + } +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) + /* For records from the correct epoch, check whether their + * sequence number has been seen before. */ + else if (mbedtls_ssl_dtls_record_replay_check((mbedtls_ssl_context *) ssl, + &rec->ctr[0]) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record")); + return MBEDTLS_ERR_SSL_UNEXPECTED_RECORD; + } +#endif + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + return 0; +} + + +#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_check_client_reconnect(mbedtls_ssl_context *ssl) +{ + unsigned int rec_epoch = (ssl->in_ctr[0] << 8) | ssl->in_ctr[1]; + + /* + * Check for an epoch 0 ClientHello. We can't use in_msg here to + * access the first byte of record content (handshake type), as we + * have an active transform (possibly iv_len != 0), so use the + * fact that the record header len is 13 instead. + */ + if (rec_epoch == 0 && + ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && + ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER && + ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && + ssl->in_left > 13 && + ssl->in_buf[13] == MBEDTLS_SSL_HS_CLIENT_HELLO) { + MBEDTLS_SSL_DEBUG_MSG(1, ("possible client reconnect " + "from the same port")); + return ssl_handle_possible_reconnect(ssl); + } + + return 0; +} +#endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */ + +/* + * If applicable, decrypt record content + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_prepare_record_content(mbedtls_ssl_context *ssl, + mbedtls_record *rec) +{ + int ret, done = 0; + + MBEDTLS_SSL_DEBUG_BUF(4, "input record from network", + rec->buf, rec->buf_len); + +#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) + if (mbedtls_ssl_hw_record_read != NULL) { + MBEDTLS_SSL_DEBUG_MSG(2, ("going for mbedtls_ssl_hw_record_read()")); + + ret = mbedtls_ssl_hw_record_read(ssl); + if (ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_hw_record_read", ret); + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + + if (ret == 0) { + done = 1; + } + } +#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ + if (!done && ssl->transform_in != NULL) { + unsigned char const old_msg_type = rec->type; + + if ((ret = mbedtls_ssl_decrypt_buf(ssl, ssl->transform_in, + rec)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_decrypt_buf", ret); + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + if (ret == MBEDTLS_ERR_SSL_UNEXPECTED_CID && + ssl->conf->ignore_unexpected_cid + == MBEDTLS_SSL_UNEXPECTED_CID_IGNORE) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ignoring unexpected CID")); + ret = MBEDTLS_ERR_SSL_CONTINUE_PROCESSING; + } +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + + return ret; + } + + if (old_msg_type != rec->type) { + MBEDTLS_SSL_DEBUG_MSG(4, ("record type after decrypt (before %d): %d", + old_msg_type, rec->type)); + } + + MBEDTLS_SSL_DEBUG_BUF(4, "input payload after decrypt", + rec->buf + rec->data_offset, rec->data_len); + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + /* We have already checked the record content type + * in ssl_parse_record_header(), failing or silently + * dropping the record in the case of an unknown type. + * + * Since with the use of CIDs, the record content type + * might change during decryption, re-check the record + * content type, but treat a failure as fatal this time. */ + if (ssl_check_record_type(rec->type)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("unknown record type")); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + + if (rec->data_len == 0) { +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 + && rec->type != MBEDTLS_SSL_MSG_APPLICATION_DATA) { + /* TLS v1.2 explicitly disallows zero-length messages which are not application data */ + MBEDTLS_SSL_DEBUG_MSG(1, ("invalid zero-length message type: %d", ssl->in_msgtype)); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + + ssl->nb_zero++; + + /* + * Three or more empty messages may be a DoS attack + * (excessive CPU consumption). + */ + if (ssl->nb_zero > 3) { + MBEDTLS_SSL_DEBUG_MSG(1, ("received four consecutive empty " + "messages, possible DoS attack")); + /* Treat the records as if they were not properly authenticated, + * thereby failing the connection if we see more than allowed + * by the configured bad MAC threshold. */ + return MBEDTLS_ERR_SSL_INVALID_MAC; + } + } else { + ssl->nb_zero = 0; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + ; /* in_ctr read from peer, not maintained internally */ + } else +#endif + { + unsigned i; + for (i = 8; i > mbedtls_ssl_ep_len(ssl); i--) { + if (++ssl->in_ctr[i - 1] != 0) { + break; + } + } + + /* The loop goes to its end iff the counter is wrapping */ + if (i == mbedtls_ssl_ep_len(ssl)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("incoming message counter would wrap")); + return MBEDTLS_ERR_SSL_COUNTER_WRAPPING; + } + } + + } + +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + mbedtls_ssl_dtls_replay_update(ssl); + } +#endif + + /* Check actual (decrypted) record content length against + * configured maximum. */ + if (rec->data_len > MBEDTLS_SSL_IN_CONTENT_LEN) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad message length")); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + + return 0; +} + +/* + * Read a record. + * + * Silently ignore non-fatal alert (and for DTLS, invalid records as well, + * RFC 6347 4.1.2.7) and continue reading until a valid record is found. + * + */ + +/* Helper functions for mbedtls_ssl_read_record(). */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_consume_current_message(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_get_next_record(mbedtls_ssl_context *ssl); +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_record_is_in_progress(mbedtls_ssl_context *ssl); + +int mbedtls_ssl_read_record(mbedtls_ssl_context *ssl, + unsigned update_hs_digest) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> read record")); + + if (ssl->keep_current_message == 0) { + do { + + ret = ssl_consume_current_message(ssl); + if (ret != 0) { + return ret; + } + + if (ssl_record_is_in_progress(ssl) == 0) { + int dtls_have_buffered = 0; +#if defined(MBEDTLS_SSL_PROTO_DTLS) + + /* We only check for buffered messages if the + * current datagram is fully consumed. */ + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + ssl_next_record_is_in_datagram(ssl) == 0) { + if (ssl_load_buffered_message(ssl) == 0) { + dtls_have_buffered = 1; + } + } + +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + if (dtls_have_buffered == 0) { + ret = ssl_get_next_record(ssl); + if (ret == MBEDTLS_ERR_SSL_CONTINUE_PROCESSING) { + continue; + } + + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, ("ssl_get_next_record"), ret); + return ret; + } + } + } + + ret = mbedtls_ssl_handle_message_type(ssl); + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ret == MBEDTLS_ERR_SSL_EARLY_MESSAGE) { + /* Buffer future message */ + ret = ssl_buffer_message(ssl); + if (ret != 0) { + return ret; + } + + ret = MBEDTLS_ERR_SSL_CONTINUE_PROCESSING; + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + } while (MBEDTLS_ERR_SSL_NON_FATAL == ret || + MBEDTLS_ERR_SSL_CONTINUE_PROCESSING == ret); + + if (0 != ret) { + MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_handle_message_type"), ret); + return ret; + } + + if (ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && + update_hs_digest == 1) { + mbedtls_ssl_update_handshake_status(ssl); + } + } else { + MBEDTLS_SSL_DEBUG_MSG(2, ("reuse previously read message")); + ssl->keep_current_message = 0; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= read record")); + + return 0; +} + +#if defined(MBEDTLS_SSL_PROTO_DTLS) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_next_record_is_in_datagram(mbedtls_ssl_context *ssl) +{ + if (ssl->in_left > ssl->next_record_offset) { + return 1; + } + + return 0; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_load_buffered_message(mbedtls_ssl_context *ssl) +{ + mbedtls_ssl_handshake_params * const hs = ssl->handshake; + mbedtls_ssl_hs_buffer *hs_buf; + int ret = 0; + + if (hs == NULL) { + return -1; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> ssl_load_buffered_message")); + + if (ssl->state == MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC || + ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC) { + /* Check if we have seen a ChangeCipherSpec before. + * If yes, synthesize a CCS record. */ + if (!hs->buffering.seen_ccs) { + MBEDTLS_SSL_DEBUG_MSG(2, ("CCS not seen in the current flight")); + ret = -1; + goto exit; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("Injecting buffered CCS message")); + ssl->in_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC; + ssl->in_msglen = 1; + ssl->in_msg[0] = 1; + + /* As long as they are equal, the exact value doesn't matter. */ + ssl->in_left = 0; + ssl->next_record_offset = 0; + + hs->buffering.seen_ccs = 0; + goto exit; + } + +#if defined(MBEDTLS_DEBUG_C) + /* Debug only */ + { + unsigned offset; + for (offset = 1; offset < MBEDTLS_SSL_MAX_BUFFERED_HS; offset++) { + hs_buf = &hs->buffering.hs[offset]; + if (hs_buf->is_valid == 1) { + MBEDTLS_SSL_DEBUG_MSG(2, ("Future message with sequence number %u %s buffered.", + hs->in_msg_seq + offset, + hs_buf->is_complete ? "fully" : "partially")); + } + } + } +#endif /* MBEDTLS_DEBUG_C */ + + /* Check if we have buffered and/or fully reassembled the + * next handshake message. */ + hs_buf = &hs->buffering.hs[0]; + if ((hs_buf->is_valid == 1) && (hs_buf->is_complete == 1)) { + /* Synthesize a record containing the buffered HS message. */ + size_t msg_len = (hs_buf->data[1] << 16) | + (hs_buf->data[2] << 8) | + hs_buf->data[3]; + + /* Double-check that we haven't accidentally buffered + * a message that doesn't fit into the input buffer. */ + if (msg_len + 12 > MBEDTLS_SSL_IN_CONTENT_LEN) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("Next handshake message has been buffered - load")); + MBEDTLS_SSL_DEBUG_BUF(3, "Buffered handshake message (incl. header)", + hs_buf->data, msg_len + 12); + + ssl->in_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; + ssl->in_hslen = msg_len + 12; + ssl->in_msglen = msg_len + 12; + memcpy(ssl->in_msg, hs_buf->data, ssl->in_hslen); + + ret = 0; + goto exit; + } else { + MBEDTLS_SSL_DEBUG_MSG(2, ("Next handshake message %u not or only partially bufffered", + hs->in_msg_seq)); + } + + ret = -1; + +exit: + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= ssl_load_buffered_message")); + return ret; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_buffer_make_space(mbedtls_ssl_context *ssl, + size_t desired) +{ + int offset; + mbedtls_ssl_handshake_params * const hs = ssl->handshake; + MBEDTLS_SSL_DEBUG_MSG(2, ("Attempt to free buffered messages to have %u bytes available", + (unsigned) desired)); + + /* Get rid of future records epoch first, if such exist. */ + ssl_free_buffered_record(ssl); + + /* Check if we have enough space available now. */ + if (desired <= (MBEDTLS_SSL_DTLS_MAX_BUFFERING - + hs->buffering.total_bytes_buffered)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("Enough space available after freeing future epoch record")); + return 0; + } + + /* We don't have enough space to buffer the next expected handshake + * message. Remove buffers used for future messages to gain space, + * starting with the most distant one. */ + for (offset = MBEDTLS_SSL_MAX_BUFFERED_HS - 1; + offset >= 0; offset--) { + MBEDTLS_SSL_DEBUG_MSG(2, + ( + "Free buffering slot %d to make space for reassembly of next handshake message", + offset)); + + ssl_buffering_free_slot(ssl, (uint8_t) offset); + + /* Check if we have enough space available now. */ + if (desired <= (MBEDTLS_SSL_DTLS_MAX_BUFFERING - + hs->buffering.total_bytes_buffered)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("Enough space available after freeing buffered HS messages")); + return 0; + } + } + + return -1; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_buffer_message(mbedtls_ssl_context *ssl) +{ + int ret = 0; + mbedtls_ssl_handshake_params * const hs = ssl->handshake; + + if (hs == NULL) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> ssl_buffer_message")); + + switch (ssl->in_msgtype) { + case MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC: + MBEDTLS_SSL_DEBUG_MSG(2, ("Remember CCS message")); + + hs->buffering.seen_ccs = 1; + break; + + case MBEDTLS_SSL_MSG_HANDSHAKE: + { + unsigned recv_msg_seq_offset; + unsigned recv_msg_seq = (ssl->in_msg[4] << 8) | ssl->in_msg[5]; + mbedtls_ssl_hs_buffer *hs_buf; + size_t msg_len = ssl->in_hslen - 12; + + /* We should never receive an old handshake + * message - double-check nonetheless. */ + if (recv_msg_seq < ssl->handshake->in_msg_seq) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + recv_msg_seq_offset = recv_msg_seq - ssl->handshake->in_msg_seq; + if (recv_msg_seq_offset >= MBEDTLS_SSL_MAX_BUFFERED_HS) { + /* Silently ignore -- message too far in the future */ + MBEDTLS_SSL_DEBUG_MSG(2, + ("Ignore future HS message with sequence number %u, " + "buffering window %u - %u", + recv_msg_seq, ssl->handshake->in_msg_seq, + ssl->handshake->in_msg_seq + MBEDTLS_SSL_MAX_BUFFERED_HS - + 1)); + + goto exit; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("Buffering HS message with sequence number %u, offset %u ", + recv_msg_seq, recv_msg_seq_offset)); + + hs_buf = &hs->buffering.hs[recv_msg_seq_offset]; + + /* Check if the buffering for this seq nr has already commenced. */ + if (!hs_buf->is_valid) { + size_t reassembly_buf_sz; + + hs_buf->is_fragmented = + (ssl_hs_is_proper_fragment(ssl) == 1); + + /* We copy the message back into the input buffer + * after reassembly, so check that it's not too large. + * This is an implementation-specific limitation + * and not one from the standard, hence it is not + * checked in ssl_check_hs_header(). */ + if (msg_len + 12 > MBEDTLS_SSL_IN_CONTENT_LEN) { + /* Ignore message */ + goto exit; + } + + /* Check if we have enough space to buffer the message. */ + if (hs->buffering.total_bytes_buffered > + MBEDTLS_SSL_DTLS_MAX_BUFFERING) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + reassembly_buf_sz = ssl_get_reassembly_buffer_size(msg_len, + hs_buf->is_fragmented); + + if (reassembly_buf_sz > (MBEDTLS_SSL_DTLS_MAX_BUFFERING - + hs->buffering.total_bytes_buffered)) { + if (recv_msg_seq_offset > 0) { + /* If we can't buffer a future message because + * of space limitations -- ignore. */ + MBEDTLS_SSL_DEBUG_MSG(2, + ("Buffering of future message of size %" + MBEDTLS_PRINTF_SIZET + " would exceed the compile-time limit %" + MBEDTLS_PRINTF_SIZET + " (already %" MBEDTLS_PRINTF_SIZET + " bytes buffered) -- ignore\n", + msg_len, (size_t) MBEDTLS_SSL_DTLS_MAX_BUFFERING, + hs->buffering.total_bytes_buffered)); + goto exit; + } else { + MBEDTLS_SSL_DEBUG_MSG(2, + ("Buffering of future message of size %" + MBEDTLS_PRINTF_SIZET + " would exceed the compile-time limit %" + MBEDTLS_PRINTF_SIZET + " (already %" MBEDTLS_PRINTF_SIZET + " bytes buffered) -- attempt to make space by freeing buffered future messages\n", + msg_len, (size_t) MBEDTLS_SSL_DTLS_MAX_BUFFERING, + hs->buffering.total_bytes_buffered)); + } + + if (ssl_buffer_make_space(ssl, reassembly_buf_sz) != 0) { + MBEDTLS_SSL_DEBUG_MSG(2, + ("Reassembly of next message of size %" + MBEDTLS_PRINTF_SIZET + " (%" MBEDTLS_PRINTF_SIZET + " with bitmap) would exceed" + " the compile-time limit %" + MBEDTLS_PRINTF_SIZET + " (already %" MBEDTLS_PRINTF_SIZET + " bytes buffered) -- fail\n", + msg_len, + reassembly_buf_sz, + (size_t) MBEDTLS_SSL_DTLS_MAX_BUFFERING, + hs->buffering.total_bytes_buffered)); + ret = MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + goto exit; + } + } + + MBEDTLS_SSL_DEBUG_MSG(2, + ("initialize reassembly, total length = %" + MBEDTLS_PRINTF_SIZET, + msg_len)); + + hs_buf->data = mbedtls_calloc(1, reassembly_buf_sz); + if (hs_buf->data == NULL) { + ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; + goto exit; + } + hs_buf->data_len = reassembly_buf_sz; + + /* Prepare final header: copy msg_type, length and message_seq, + * then add standardised fragment_offset and fragment_length */ + memcpy(hs_buf->data, ssl->in_msg, 6); + memset(hs_buf->data + 6, 0, 3); + memcpy(hs_buf->data + 9, hs_buf->data + 1, 3); + + hs_buf->is_valid = 1; + + hs->buffering.total_bytes_buffered += reassembly_buf_sz; + } else { + /* Make sure msg_type and length are consistent */ + if (memcmp(hs_buf->data, ssl->in_msg, 4) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Fragment header mismatch - ignore")); + /* Ignore */ + goto exit; + } + } + + if (!hs_buf->is_complete) { + size_t frag_len, frag_off; + unsigned char * const msg = hs_buf->data + 12; + + /* + * Check and copy current fragment + */ + + /* Validation of header fields already done in + * mbedtls_ssl_prepare_handshake_record(). */ + frag_off = ssl_get_hs_frag_off(ssl); + frag_len = ssl_get_hs_frag_len(ssl); + + MBEDTLS_SSL_DEBUG_MSG(2, ("adding fragment, offset = %" MBEDTLS_PRINTF_SIZET + ", length = %" MBEDTLS_PRINTF_SIZET, + frag_off, frag_len)); + memcpy(msg + frag_off, ssl->in_msg + 12, frag_len); + + if (hs_buf->is_fragmented) { + unsigned char * const bitmask = msg + msg_len; + ssl_bitmask_set(bitmask, frag_off, frag_len); + hs_buf->is_complete = (ssl_bitmask_check(bitmask, + msg_len) == 0); + } else { + hs_buf->is_complete = 1; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("message %scomplete", + hs_buf->is_complete ? "" : "not yet ")); + } + + break; + } + + default: + /* We don't buffer other types of messages. */ + break; + } + +exit: + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= ssl_buffer_message")); + return ret; +} +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_consume_current_message(mbedtls_ssl_context *ssl) +{ + /* + * Consume last content-layer message and potentially + * update in_msglen which keeps track of the contents' + * consumption state. + * + * (1) Handshake messages: + * Remove last handshake message, move content + * and adapt in_msglen. + * + * (2) Alert messages: + * Consume whole record content, in_msglen = 0. + * + * (3) Change cipher spec: + * Consume whole record content, in_msglen = 0. + * + * (4) Application data: + * Don't do anything - the record layer provides + * the application data as a stream transport + * and consumes through mbedtls_ssl_read only. + * + */ + + /* Case (1): Handshake messages */ + if (ssl->in_hslen != 0) { + /* Hard assertion to be sure that no application data + * is in flight, as corrupting ssl->in_msglen during + * ssl->in_offt != NULL is fatal. */ + if (ssl->in_offt != NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + /* + * Get next Handshake message in the current record + */ + + /* Notes: + * (1) in_hslen is not necessarily the size of the + * current handshake content: If DTLS handshake + * fragmentation is used, that's the fragment + * size instead. Using the total handshake message + * size here is faulty and should be changed at + * some point. + * (2) While it doesn't seem to cause problems, one + * has to be very careful not to assume that in_hslen + * is always <= in_msglen in a sensible communication. + * Again, it's wrong for DTLS handshake fragmentation. + * The following check is therefore mandatory, and + * should not be treated as a silently corrected assertion. + * Additionally, ssl->in_hslen might be arbitrarily out of + * bounds after handling a DTLS message with an unexpected + * sequence number, see mbedtls_ssl_prepare_handshake_record. + */ + if (ssl->in_hslen < ssl->in_msglen) { + ssl->in_msglen -= ssl->in_hslen; + memmove(ssl->in_msg, ssl->in_msg + ssl->in_hslen, + ssl->in_msglen); + + MBEDTLS_SSL_DEBUG_BUF(4, "remaining content in record", + ssl->in_msg, ssl->in_msglen); + } else { + ssl->in_msglen = 0; + } + + ssl->in_hslen = 0; + } + /* Case (4): Application data */ + else if (ssl->in_offt != NULL) { + return 0; + } + /* Everything else (CCS & Alerts) */ + else { + ssl->in_msglen = 0; + } + + return 0; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_record_is_in_progress(mbedtls_ssl_context *ssl) +{ + if (ssl->in_msglen > 0) { + return 1; + } + + return 0; +} + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + +static void ssl_free_buffered_record(mbedtls_ssl_context *ssl) +{ + mbedtls_ssl_handshake_params * const hs = ssl->handshake; + if (hs == NULL) { + return; + } + + if (hs->buffering.future_record.data != NULL) { + hs->buffering.total_bytes_buffered -= + hs->buffering.future_record.len; + + mbedtls_free(hs->buffering.future_record.data); + hs->buffering.future_record.data = NULL; + } +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_load_buffered_record(mbedtls_ssl_context *ssl) +{ + mbedtls_ssl_handshake_params * const hs = ssl->handshake; + unsigned char *rec; + size_t rec_len; + unsigned rec_epoch; +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + size_t in_buf_len = ssl->in_buf_len; +#else + size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN; +#endif + if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + return 0; + } + + if (hs == NULL) { + return 0; + } + + rec = hs->buffering.future_record.data; + rec_len = hs->buffering.future_record.len; + rec_epoch = hs->buffering.future_record.epoch; + + if (rec == NULL) { + return 0; + } + + /* Only consider loading future records if the + * input buffer is empty. */ + if (ssl_next_record_is_in_datagram(ssl) == 1) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> ssl_load_buffered_record")); + + if (rec_epoch != ssl->in_epoch) { + MBEDTLS_SSL_DEBUG_MSG(2, ("Buffered record not from current epoch.")); + goto exit; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("Found buffered record from current epoch - load")); + + /* Double-check that the record is not too large */ + if (rec_len > in_buf_len - (size_t) (ssl->in_hdr - ssl->in_buf)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + memcpy(ssl->in_hdr, rec, rec_len); + ssl->in_left = rec_len; + ssl->next_record_offset = 0; + + ssl_free_buffered_record(ssl); + +exit: + MBEDTLS_SSL_DEBUG_MSG(2, ("<= ssl_load_buffered_record")); + return 0; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_buffer_future_record(mbedtls_ssl_context *ssl, + mbedtls_record const *rec) +{ + mbedtls_ssl_handshake_params * const hs = ssl->handshake; + + /* Don't buffer future records outside handshakes. */ + if (hs == NULL) { + return 0; + } + + /* Only buffer handshake records (we are only interested + * in Finished messages). */ + if (rec->type != MBEDTLS_SSL_MSG_HANDSHAKE) { + return 0; + } + + /* Don't buffer more than one future epoch record. */ + if (hs->buffering.future_record.data != NULL) { + return 0; + } + + /* Don't buffer record if there's not enough buffering space remaining. */ + if (rec->buf_len > (MBEDTLS_SSL_DTLS_MAX_BUFFERING - + hs->buffering.total_bytes_buffered)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("Buffering of future epoch record of size %" MBEDTLS_PRINTF_SIZET + " would exceed the compile-time limit %" MBEDTLS_PRINTF_SIZET + " (already %" MBEDTLS_PRINTF_SIZET + " bytes buffered) -- ignore\n", + rec->buf_len, (size_t) MBEDTLS_SSL_DTLS_MAX_BUFFERING, + hs->buffering.total_bytes_buffered)); + return 0; + } + + /* Buffer record */ + MBEDTLS_SSL_DEBUG_MSG(2, ("Buffer record from epoch %u", + ssl->in_epoch + 1U)); + MBEDTLS_SSL_DEBUG_BUF(3, "Buffered record", rec->buf, rec->buf_len); + + /* ssl_parse_record_header() only considers records + * of the next epoch as candidates for buffering. */ + hs->buffering.future_record.epoch = ssl->in_epoch + 1; + hs->buffering.future_record.len = rec->buf_len; + + hs->buffering.future_record.data = + mbedtls_calloc(1, hs->buffering.future_record.len); + if (hs->buffering.future_record.data == NULL) { + /* If we run out of RAM trying to buffer a + * record from the next epoch, just ignore. */ + return 0; + } + + memcpy(hs->buffering.future_record.data, rec->buf, rec->buf_len); + + hs->buffering.total_bytes_buffered += rec->buf_len; + return 0; +} + +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_get_next_record(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_record rec; + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + /* We might have buffered a future record; if so, + * and if the epoch matches now, load it. + * On success, this call will set ssl->in_left to + * the length of the buffered record, so that + * the calls to ssl_fetch_input() below will + * essentially be no-ops. */ + ret = ssl_load_buffered_record(ssl); + if (ret != 0) { + return ret; + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + /* Ensure that we have enough space available for the default form + * of TLS / DTLS record headers (5 Bytes for TLS, 13 Bytes for DTLS, + * with no space for CIDs counted in). */ + ret = mbedtls_ssl_fetch_input(ssl, mbedtls_ssl_in_hdr_len(ssl)); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret); + return ret; + } + + ret = ssl_parse_record_header(ssl, ssl->in_hdr, ssl->in_left, &rec); + if (ret != 0) { +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + if (ret == MBEDTLS_ERR_SSL_EARLY_MESSAGE) { + ret = ssl_buffer_future_record(ssl, &rec); + if (ret != 0) { + return ret; + } + + /* Fall through to handling of unexpected records */ + ret = MBEDTLS_ERR_SSL_UNEXPECTED_RECORD; + } + + if (ret == MBEDTLS_ERR_SSL_UNEXPECTED_RECORD) { +#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C) + /* Reset in pointers to default state for TLS/DTLS records, + * assuming no CID and no offset between record content and + * record plaintext. */ + mbedtls_ssl_update_in_pointers(ssl); + + /* Setup internal message pointers from record structure. */ + ssl->in_msgtype = rec.type; +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + ssl->in_len = ssl->in_cid + rec.cid_len; +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + ssl->in_iv = ssl->in_msg = ssl->in_len + 2; + ssl->in_msglen = rec.data_len; + + ret = ssl_check_client_reconnect(ssl); + MBEDTLS_SSL_DEBUG_RET(2, "ssl_check_client_reconnect", ret); + if (ret != 0) { + return ret; + } +#endif + + /* Skip unexpected record (but not whole datagram) */ + ssl->next_record_offset = rec.buf_len; + + MBEDTLS_SSL_DEBUG_MSG(1, ("discarding unexpected record " + "(header)")); + } else { + /* Skip invalid record and the rest of the datagram */ + ssl->next_record_offset = 0; + ssl->in_left = 0; + + MBEDTLS_SSL_DEBUG_MSG(1, ("discarding invalid record " + "(header)")); + } + + /* Get next record */ + return MBEDTLS_ERR_SSL_CONTINUE_PROCESSING; + } else +#endif + { + return ret; + } + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + /* Remember offset of next record within datagram. */ + ssl->next_record_offset = rec.buf_len; + if (ssl->next_record_offset < ssl->in_left) { + MBEDTLS_SSL_DEBUG_MSG(3, ("more than one record within datagram")); + } + } else +#endif + { + /* + * Fetch record contents from underlying transport. + */ + ret = mbedtls_ssl_fetch_input(ssl, rec.buf_len); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret); + return ret; + } + + ssl->in_left = 0; + } + + /* + * Decrypt record contents. + */ + + if ((ret = ssl_prepare_record_content(ssl, &rec)) != 0) { +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + /* Silently discard invalid records */ + if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) { + /* Except when waiting for Finished as a bad mac here + * probably means something went wrong in the handshake + * (eg wrong psk used, mitm downgrade attempt, etc.) */ + if (ssl->state == MBEDTLS_SSL_CLIENT_FINISHED || + ssl->state == MBEDTLS_SSL_SERVER_FINISHED) { +#if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES) + if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) { + mbedtls_ssl_send_alert_message(ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC); + } +#endif + return ret; + } + +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) + if (ssl->conf->badmac_limit != 0 && + ++ssl->badmac_seen >= ssl->conf->badmac_limit) { + MBEDTLS_SSL_DEBUG_MSG(1, ("too many records with bad MAC")); + return MBEDTLS_ERR_SSL_INVALID_MAC; + } +#endif + + /* As above, invalid records cause + * dismissal of the whole datagram. */ + + ssl->next_record_offset = 0; + ssl->in_left = 0; + + MBEDTLS_SSL_DEBUG_MSG(1, ("discarding invalid record (mac)")); + return MBEDTLS_ERR_SSL_CONTINUE_PROCESSING; + } + + return ret; + } else +#endif + { + /* Error out (and send alert) on invalid records */ +#if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES) + if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) { + mbedtls_ssl_send_alert_message(ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC); + } +#endif + return ret; + } + } + + + /* Reset in pointers to default state for TLS/DTLS records, + * assuming no CID and no offset between record content and + * record plaintext. */ + mbedtls_ssl_update_in_pointers(ssl); +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + ssl->in_len = ssl->in_cid + rec.cid_len; +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + ssl->in_iv = ssl->in_len + 2; + + /* The record content type may change during decryption, + * so re-read it. */ + ssl->in_msgtype = rec.type; + /* Also update the input buffer, because unfortunately + * the server-side ssl_parse_client_hello() reparses the + * record header when receiving a ClientHello initiating + * a renegotiation. */ + ssl->in_hdr[0] = rec.type; + ssl->in_msg = rec.buf + rec.data_offset; + ssl->in_msglen = rec.data_len; + MBEDTLS_PUT_UINT16_BE(rec.data_len, ssl->in_len, 0); + +#if defined(MBEDTLS_ZLIB_SUPPORT) + if (ssl->transform_in != NULL && + ssl->session_in->compression == MBEDTLS_SSL_COMPRESS_DEFLATE) { + if ((ret = ssl_decompress_buf(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_decompress_buf", ret); + return ret; + } + + /* Check actual (decompress) record content length against + * configured maximum. */ + if (ssl->in_msglen > MBEDTLS_SSL_IN_CONTENT_LEN) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad message length")); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + } +#endif /* MBEDTLS_ZLIB_SUPPORT */ + + return 0; +} + +int mbedtls_ssl_handle_message_type(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + /* + * Handle particular types of records + */ + if (ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE) { + if ((ret = mbedtls_ssl_prepare_handshake_record(ssl)) != 0) { + return ret; + } + } + + if (ssl->in_msgtype == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC) { + if (ssl->in_msglen != 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("invalid CCS message, len: %" MBEDTLS_PRINTF_SIZET, + ssl->in_msglen)); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + + if (ssl->in_msg[0] != 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("invalid CCS message, content: %02x", + ssl->in_msg[0])); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + ssl->state != MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC && + ssl->state != MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC) { + if (ssl->handshake == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("dropping ChangeCipherSpec outside handshake")); + return MBEDTLS_ERR_SSL_UNEXPECTED_RECORD; + } + + MBEDTLS_SSL_DEBUG_MSG(1, ("received out-of-order ChangeCipherSpec - remember")); + return MBEDTLS_ERR_SSL_EARLY_MESSAGE; + } +#endif + } + + if (ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT) { + if (ssl->in_msglen != 2) { + /* Note: Standard allows for more than one 2 byte alert + to be packed in a single message, but Mbed TLS doesn't + currently support this. */ + MBEDTLS_SSL_DEBUG_MSG(1, ("invalid alert message, len: %" MBEDTLS_PRINTF_SIZET, + ssl->in_msglen)); + return MBEDTLS_ERR_SSL_INVALID_RECORD; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("got an alert message, type: [%u:%u]", + ssl->in_msg[0], ssl->in_msg[1])); + + /* + * Ignore non-fatal alerts, except close_notify and no_renegotiation + */ + if (ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_FATAL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("is a fatal alert message (msg %d)", + ssl->in_msg[1])); + return MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE; + } + + if (ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && + ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY) { + MBEDTLS_SSL_DEBUG_MSG(2, ("is a close notify message")); + return MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY; + } + +#if defined(MBEDTLS_SSL_RENEGOTIATION_ENABLED) + if (ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && + ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION) { + MBEDTLS_SSL_DEBUG_MSG(2, ("is a SSLv3 no renegotiation alert")); + /* Will be handled when trying to parse ServerHello */ + return 0; + } +#endif + +#if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_SRV_C) + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 && + ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && + ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && + ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT) { + MBEDTLS_SSL_DEBUG_MSG(2, ("is a SSLv3 no_cert")); + /* Will be handled in mbedtls_ssl_parse_certificate() */ + return 0; + } +#endif /* MBEDTLS_SSL_PROTO_SSL3 && MBEDTLS_SSL_SRV_C */ + + /* Silently ignore: fetch new message */ + return MBEDTLS_ERR_SSL_NON_FATAL; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + /* Drop unexpected ApplicationData records, + * except at the beginning of renegotiations */ + if (ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA && + ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER +#if defined(MBEDTLS_SSL_RENEGOTIATION) + && !(ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && + ssl->state == MBEDTLS_SSL_SERVER_HELLO) +#endif + ) { + MBEDTLS_SSL_DEBUG_MSG(1, ("dropping unexpected ApplicationData")); + return MBEDTLS_ERR_SSL_NON_FATAL; + } + + if (ssl->handshake != NULL && + ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER) { + mbedtls_ssl_handshake_wrapup_free_hs_transform(ssl); + } + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + return 0; +} + +int mbedtls_ssl_send_fatal_handshake_failure(mbedtls_ssl_context *ssl) +{ + return mbedtls_ssl_send_alert_message(ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); +} + +int mbedtls_ssl_send_alert_message(mbedtls_ssl_context *ssl, + unsigned char level, + unsigned char message) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (ssl == NULL || ssl->conf == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (ssl->out_left != 0) { + return mbedtls_ssl_flush_output(ssl); + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> send alert message")); + MBEDTLS_SSL_DEBUG_MSG(3, ("send alert level=%u message=%u", level, message)); + + ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT; + ssl->out_msglen = 2; + ssl->out_msg[0] = level; + ssl->out_msg[1] = message; + + if ((ret = mbedtls_ssl_write_record(ssl, SSL_FORCE_FLUSH)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_record", ret); + return ret; + } + MBEDTLS_SSL_DEBUG_MSG(2, ("<= send alert message")); + + return 0; +} + +int mbedtls_ssl_write_change_cipher_spec(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write change cipher spec")); + + ssl->out_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC; + ssl->out_msglen = 1; + ssl->out_msg[0] = 1; + + ssl->state++; + + if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write change cipher spec")); + + return 0; +} + +int mbedtls_ssl_parse_change_cipher_spec(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse change cipher spec")); + + if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret); + return ret; + } + + if (ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad change cipher spec message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE); + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } + + /* CCS records are only accepted if they have length 1 and content '1', + * so we don't need to check this here. */ + + /* + * Switch to our negotiated transform and session parameters for inbound + * data. + */ + MBEDTLS_SSL_DEBUG_MSG(3, ("switching to new transform spec for inbound data")); + ssl->transform_in = ssl->transform_negotiate; + ssl->session_in = ssl->session_negotiate; + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) + mbedtls_ssl_dtls_replay_reset(ssl); +#endif + + /* Increment epoch */ + if (++ssl->in_epoch == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("DTLS epoch would wrap")); + /* This is highly unlikely to happen for legitimate reasons, so + treat it as an attack and don't send an alert. */ + return MBEDTLS_ERR_SSL_COUNTER_WRAPPING; + } + } else +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + memset(ssl->in_ctr, 0, 8); + + mbedtls_ssl_update_in_pointers(ssl); + +#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) + if (mbedtls_ssl_hw_record_activate != NULL) { + if ((ret = mbedtls_ssl_hw_record_activate(ssl, MBEDTLS_SSL_CHANNEL_INBOUND)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_hw_record_activate", ret); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR); + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + } +#endif + + ssl->state++; + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse change cipher spec")); + + return 0; +} + +/* Once ssl->out_hdr as the address of the beginning of the + * next outgoing record is set, deduce the other pointers. + * + * Note: For TLS, we save the implicit record sequence number + * (entering MAC computation) in the 8 bytes before ssl->out_hdr, + * and the caller has to make sure there's space for this. + */ + +static size_t ssl_transform_get_explicit_iv_len( + mbedtls_ssl_transform const *transform) +{ + if (transform->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2) { + return 0; + } + + return transform->ivlen - transform->fixed_ivlen; +} + +void mbedtls_ssl_update_out_pointers(mbedtls_ssl_context *ssl, + mbedtls_ssl_transform *transform) +{ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + ssl->out_ctr = ssl->out_hdr + 3; +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + ssl->out_cid = ssl->out_ctr + 8; + ssl->out_len = ssl->out_cid; + if (transform != NULL) { + ssl->out_len += transform->out_cid_len; + } +#else /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + ssl->out_len = ssl->out_ctr + 8; +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + ssl->out_iv = ssl->out_len + 2; + } else +#endif + { + ssl->out_ctr = ssl->out_hdr - 8; + ssl->out_len = ssl->out_hdr + 3; +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + ssl->out_cid = ssl->out_len; +#endif + ssl->out_iv = ssl->out_hdr + 5; + } + + ssl->out_msg = ssl->out_iv; + /* Adjust out_msg to make space for explicit IV, if used. */ + if (transform != NULL) { + ssl->out_msg += ssl_transform_get_explicit_iv_len(transform); + } +} + +/* Once ssl->in_hdr as the address of the beginning of the + * next incoming record is set, deduce the other pointers. + * + * Note: For TLS, we save the implicit record sequence number + * (entering MAC computation) in the 8 bytes before ssl->in_hdr, + * and the caller has to make sure there's space for this. + */ + +void mbedtls_ssl_update_in_pointers(mbedtls_ssl_context *ssl) +{ + /* This function sets the pointers to match the case + * of unprotected TLS/DTLS records, with both ssl->in_iv + * and ssl->in_msg pointing to the beginning of the record + * content. + * + * When decrypting a protected record, ssl->in_msg + * will be shifted to point to the beginning of the + * record plaintext. + */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + /* This sets the header pointers to match records + * without CID. When we receive a record containing + * a CID, the fields are shifted accordingly in + * ssl_parse_record_header(). */ + ssl->in_ctr = ssl->in_hdr + 3; +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + ssl->in_cid = ssl->in_ctr + 8; + ssl->in_len = ssl->in_cid; /* Default: no CID */ +#else /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + ssl->in_len = ssl->in_ctr + 8; +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + ssl->in_iv = ssl->in_len + 2; + } else +#endif + { + ssl->in_ctr = ssl->in_hdr - 8; + ssl->in_len = ssl->in_hdr + 3; +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + ssl->in_cid = ssl->in_len; +#endif + ssl->in_iv = ssl->in_hdr + 5; + } + + /* This will be adjusted at record decryption time. */ + ssl->in_msg = ssl->in_iv; +} + +/* + * Setup an SSL context + */ + +void mbedtls_ssl_reset_in_out_pointers(mbedtls_ssl_context *ssl) +{ + /* Set the incoming and outgoing record pointers. */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + ssl->out_hdr = ssl->out_buf; + ssl->in_hdr = ssl->in_buf; + } else +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + { + ssl->out_hdr = ssl->out_buf + 8; + ssl->in_hdr = ssl->in_buf + 8; + } + + /* Derive other internal pointers. */ + mbedtls_ssl_update_out_pointers(ssl, NULL /* no transform enabled */); + mbedtls_ssl_update_in_pointers(ssl); +} + +/* + * SSL get accessors + */ +size_t mbedtls_ssl_get_bytes_avail(const mbedtls_ssl_context *ssl) +{ + return ssl->in_offt == NULL ? 0 : ssl->in_msglen; +} + +int mbedtls_ssl_check_pending(const mbedtls_ssl_context *ssl) +{ + /* + * Case A: We're currently holding back + * a message for further processing. + */ + + if (ssl->keep_current_message == 1) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ssl_check_pending: record held back for processing")); + return 1; + } + + /* + * Case B: Further records are pending in the current datagram. + */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + ssl->in_left > ssl->next_record_offset) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ssl_check_pending: more records within current datagram")); + return 1; + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + /* + * Case C: A handshake message is being processed. + */ + + if (ssl->in_hslen > 0 && ssl->in_hslen < ssl->in_msglen) { + MBEDTLS_SSL_DEBUG_MSG(3, + ("ssl_check_pending: more handshake messages within current record")); + return 1; + } + + /* + * Case D: An application data message is being processed + */ + if (ssl->in_offt != NULL) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ssl_check_pending: application data record is being processed")); + return 1; + } + + /* + * In all other cases, the rest of the message can be dropped. + * As in ssl_get_next_record, this needs to be adapted if + * we implement support for multiple alerts in single records. + */ + + MBEDTLS_SSL_DEBUG_MSG(3, ("ssl_check_pending: nothing pending")); + return 0; +} + + +int mbedtls_ssl_get_record_expansion(const mbedtls_ssl_context *ssl) +{ + size_t transform_expansion = 0; + const mbedtls_ssl_transform *transform = ssl->transform_out; + unsigned block_size; + + size_t out_hdr_len = mbedtls_ssl_out_hdr_len(ssl); + + if (transform == NULL) { + return (int) out_hdr_len; + } + +#if defined(MBEDTLS_ZLIB_SUPPORT) + if (ssl->session_out->compression != MBEDTLS_SSL_COMPRESS_NULL) { + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + } +#endif + + switch (mbedtls_cipher_get_cipher_mode(&transform->cipher_ctx_enc)) { + case MBEDTLS_MODE_GCM: + case MBEDTLS_MODE_CCM: + case MBEDTLS_MODE_CHACHAPOLY: + case MBEDTLS_MODE_STREAM: + transform_expansion = transform->minlen; + break; + + case MBEDTLS_MODE_CBC: + + block_size = mbedtls_cipher_get_block_size( + &transform->cipher_ctx_enc); + + /* Expansion due to the addition of the MAC. */ + transform_expansion += transform->maclen; + + /* Expansion due to the addition of CBC padding; + * Theoretically up to 256 bytes, but we never use + * more than the block size of the underlying cipher. */ + transform_expansion += block_size; + + /* For TLS 1.1 or higher, an explicit IV is added + * after the record header. */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2) { + transform_expansion += block_size; + } +#endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */ + + break; + + default: + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + if (transform->out_cid_len != 0) { + transform_expansion += MBEDTLS_SSL_MAX_CID_EXPANSION; + } +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + + return (int) (out_hdr_len + transform_expansion); +} + +#if defined(MBEDTLS_SSL_RENEGOTIATION) +/* + * Check record counters and renegotiate if they're above the limit. + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_check_ctr_renegotiate(mbedtls_ssl_context *ssl) +{ + size_t ep_len = mbedtls_ssl_ep_len(ssl); + int in_ctr_cmp; + int out_ctr_cmp; + + if (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER || + ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING || + ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED) { + return 0; + } + + in_ctr_cmp = memcmp(ssl->in_ctr + ep_len, + ssl->conf->renego_period + ep_len, 8 - ep_len); + out_ctr_cmp = memcmp(ssl->cur_out_ctr + ep_len, + ssl->conf->renego_period + ep_len, 8 - ep_len); + + if (in_ctr_cmp <= 0 && out_ctr_cmp <= 0) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(1, ("record counter limit reached: renegotiate")); + return mbedtls_ssl_renegotiate(ssl); +} +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + +/* + * Receive application data decrypted from the SSL layer + */ +int mbedtls_ssl_read(mbedtls_ssl_context *ssl, unsigned char *buf, size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n; + + if (ssl == NULL || ssl->conf == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> read")); + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + if ((ret = mbedtls_ssl_flush_output(ssl)) != 0) { + return ret; + } + + if (ssl->handshake != NULL && + ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING) { + if ((ret = mbedtls_ssl_flight_transmit(ssl)) != 0) { + return ret; + } + } + } +#endif + + /* + * Check if renegotiation is necessary and/or handshake is + * in process. If yes, perform/continue, and fall through + * if an unexpected packet is received while the client + * is waiting for the ServerHello. + * + * (There is no equivalent to the last condition on + * the server-side as it is not treated as within + * a handshake while waiting for the ClientHello + * after a renegotiation request.) + */ + +#if defined(MBEDTLS_SSL_RENEGOTIATION) + ret = ssl_check_ctr_renegotiate(ssl); + if (ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO && + ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_check_ctr_renegotiate", ret); + return ret; + } +#endif + + if (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) { + ret = mbedtls_ssl_handshake(ssl); + if (ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO && + ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_handshake", ret); + return ret; + } + } + + /* Loop as long as no application data record is available */ + while (ssl->in_offt == NULL) { + /* Start timer if not already running */ + if (ssl->f_get_timer != NULL && + ssl->f_get_timer(ssl->p_timer) == -1) { + mbedtls_ssl_set_timer(ssl, ssl->conf->read_timeout); + } + + if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) { + if (ret == MBEDTLS_ERR_SSL_CONN_EOF) { + return 0; + } + + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret); + return ret; + } + + if (ssl->in_msglen == 0 && + ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA) { + /* + * OpenSSL sends empty messages to randomize the IV + */ + if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) { + if (ret == MBEDTLS_ERR_SSL_CONN_EOF) { + return 0; + } + + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret); + return ret; + } + } + + if (ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("received handshake message")); + + /* + * - For client-side, expect SERVER_HELLO_REQUEST. + * - For server-side, expect CLIENT_HELLO. + * - Fail (TLS) or silently drop record (DTLS) in other cases. + */ + +#if defined(MBEDTLS_SSL_CLI_C) + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT && + (ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_REQUEST || + ssl->in_hslen != mbedtls_ssl_hs_hdr_len(ssl))) { + MBEDTLS_SSL_DEBUG_MSG(1, ("handshake received (not HelloRequest)")); + + /* With DTLS, drop the packet (probably from last handshake) */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + continue; + } +#endif + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } +#endif /* MBEDTLS_SSL_CLI_C */ + +#if defined(MBEDTLS_SSL_SRV_C) + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && + ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) { + MBEDTLS_SSL_DEBUG_MSG(1, ("handshake received (not ClientHello)")); + + /* With DTLS, drop the packet (probably from last handshake) */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + continue; + } +#endif + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } +#endif /* MBEDTLS_SSL_SRV_C */ + +#if defined(MBEDTLS_SSL_RENEGOTIATION) + /* Determine whether renegotiation attempt should be accepted */ + if (!(ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED || + (ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && + ssl->conf->allow_legacy_renegotiation == + MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION))) { + /* + * Accept renegotiation request + */ + + /* DTLS clients need to know renego is server-initiated */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) { + ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING; + } +#endif + ret = mbedtls_ssl_start_renegotiation(ssl); + if (ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO && + ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_start_renegotiation", + ret); + return ret; + } + } else +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + { + /* + * Refuse renegotiation + */ + + MBEDTLS_SSL_DEBUG_MSG(3, ("refusing renegotiation, sending alert")); + +#if defined(MBEDTLS_SSL_PROTO_SSL3) + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) { + /* SSLv3 does not have a "no_renegotiation" warning, so + we send a fatal alert and abort the connection. */ + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE); + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } else +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1) { + if ((ret = mbedtls_ssl_send_alert_message(ssl, + MBEDTLS_SSL_ALERT_LEVEL_WARNING, + MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION)) + != 0) { + return ret; + } + } else +#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || + MBEDTLS_SSL_PROTO_TLS1_2 */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + } + + /* At this point, we don't know whether the renegotiation has been + * completed or not. The cases to consider are the following: + * 1) The renegotiation is complete. In this case, no new record + * has been read yet. + * 2) The renegotiation is incomplete because the client received + * an application data record while awaiting the ServerHello. + * 3) The renegotiation is incomplete because the client received + * a non-handshake, non-application data message while awaiting + * the ServerHello. + * In each of these case, looping will be the proper action: + * - For 1), the next iteration will read a new record and check + * if it's application data. + * - For 2), the loop condition isn't satisfied as application data + * is present, hence continue is the same as break + * - For 3), the loop condition is satisfied and read_record + * will re-deliver the message that was held back by the client + * when expecting the ServerHello. + */ + continue; + } +#if defined(MBEDTLS_SSL_RENEGOTIATION) + else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING) { + if (ssl->conf->renego_max_records >= 0) { + if (++ssl->renego_records_seen > ssl->conf->renego_max_records) { + MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation requested, " + "but not honored by client")); + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } + } + } +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + + /* Fatal and closure alerts handled by mbedtls_ssl_read_record() */ + if (ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT) { + MBEDTLS_SSL_DEBUG_MSG(2, ("ignoring non-fatal non-closure alert")); + return MBEDTLS_ERR_SSL_WANT_READ; + } + + if (ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad application data message")); + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } + + ssl->in_offt = ssl->in_msg; + + /* We're going to return something now, cancel timer, + * except if handshake (renegotiation) is in progress */ + if (ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER) { + mbedtls_ssl_set_timer(ssl, 0); + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + /* If we requested renego but received AppData, resend HelloRequest. + * Do it now, after setting in_offt, to avoid taking this branch + * again if ssl_write_hello_request() returns WANT_WRITE */ +#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && + ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING) { + if ((ret = mbedtls_ssl_resend_hello_request(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_resend_hello_request", + ret); + return ret; + } + } +#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */ +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + } + + n = (len < ssl->in_msglen) + ? len : ssl->in_msglen; + + if (len != 0) { + memcpy(buf, ssl->in_offt, n); + ssl->in_msglen -= n; + } + + /* Zeroising the plaintext buffer to erase unused application data + from the memory. */ + mbedtls_platform_zeroize(ssl->in_offt, n); + + if (ssl->in_msglen == 0) { + /* all bytes consumed */ + ssl->in_offt = NULL; + ssl->keep_current_message = 0; + } else { + /* more data available */ + ssl->in_offt += n; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= read")); + + return (int) n; +} + +/* + * Send application data to be encrypted by the SSL layer, taking care of max + * fragment length and buffer size. + * + * According to RFC 5246 Section 6.2.1: + * + * Zero-length fragments of Application data MAY be sent as they are + * potentially useful as a traffic analysis countermeasure. + * + * Therefore, it is possible that the input message length is 0 and the + * corresponding return code is 0 on success. + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_real(mbedtls_ssl_context *ssl, + const unsigned char *buf, size_t len) +{ + int ret = mbedtls_ssl_get_max_out_record_payload(ssl); + const size_t max_len = (size_t) ret; + + if (ret < 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_get_max_out_record_payload", ret); + return ret; + } + + if (len > max_len) { +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + MBEDTLS_SSL_DEBUG_MSG(1, ("fragment larger than the (negotiated) " + "maximum fragment length: %" MBEDTLS_PRINTF_SIZET + " > %" MBEDTLS_PRINTF_SIZET, + len, max_len)); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } else +#endif + len = max_len; + } + + if (ssl->out_left != 0) { + /* + * The user has previously tried to send the data and + * MBEDTLS_ERR_SSL_WANT_WRITE or the message was only partially + * written. In this case, we expect the high-level write function + * (e.g. mbedtls_ssl_write()) to be called with the same parameters + */ + if ((ret = mbedtls_ssl_flush_output(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flush_output", ret); + return ret; + } + } else { + /* + * The user is trying to send a message the first time, so we need to + * copy the data into the internal buffers and setup the data structure + * to keep track of partial writes + */ + ssl->out_msglen = len; + ssl->out_msgtype = MBEDTLS_SSL_MSG_APPLICATION_DATA; + if (len > 0) { + memcpy(ssl->out_msg, buf, len); + } + + if ((ret = mbedtls_ssl_write_record(ssl, SSL_FORCE_FLUSH)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_record", ret); + return ret; + } + } + + return (int) len; +} + +/* + * Write application data, doing 1/n-1 splitting if necessary. + * + * With non-blocking I/O, ssl_write_real() may return WANT_WRITE, + * then the caller will call us again with the same arguments, so + * remember whether we already did the split or not. + */ +#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_split(mbedtls_ssl_context *ssl, + const unsigned char *buf, size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (ssl->conf->cbc_record_splitting == + MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED || + len <= 1 || + ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_1 || + mbedtls_cipher_get_cipher_mode(&ssl->transform_out->cipher_ctx_enc) + != MBEDTLS_MODE_CBC) { + return ssl_write_real(ssl, buf, len); + } + + if (ssl->split_done == 0) { + if ((ret = ssl_write_real(ssl, buf, 1)) <= 0) { + return ret; + } + ssl->split_done = 1; + } + + if ((ret = ssl_write_real(ssl, buf + 1, len - 1)) <= 0) { + return ret; + } + ssl->split_done = 0; + + return ret + 1; +} +#endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ + +/* + * Write application data (public-facing wrapper) + */ +int mbedtls_ssl_write(mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write")); + + if (ssl == NULL || ssl->conf == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if ((ret = ssl_check_ctr_renegotiate(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_check_ctr_renegotiate", ret); + return ret; + } +#endif + + if (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) { + if ((ret = mbedtls_ssl_handshake(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_handshake", ret); + return ret; + } + } + +#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) + ret = ssl_write_split(ssl, buf, len); +#else + ret = ssl_write_real(ssl, buf, len); +#endif + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write")); + + return ret; +} + +/* + * Notify the peer that the connection is being closed + */ +int mbedtls_ssl_close_notify(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (ssl == NULL || ssl->conf == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write close notify")); + + if (ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER) { + if ((ret = mbedtls_ssl_send_alert_message(ssl, + MBEDTLS_SSL_ALERT_LEVEL_WARNING, + MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_send_alert_message", ret); + return ret; + } + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write close notify")); + + return 0; +} + +void mbedtls_ssl_transform_free(mbedtls_ssl_transform *transform) +{ + if (transform == NULL) { + return; + } + +#if defined(MBEDTLS_ZLIB_SUPPORT) + deflateEnd(&transform->ctx_deflate); + inflateEnd(&transform->ctx_inflate); +#endif + + mbedtls_cipher_free(&transform->cipher_ctx_enc); + mbedtls_cipher_free(&transform->cipher_ctx_dec); + +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) + mbedtls_md_free(&transform->md_ctx_enc); + mbedtls_md_free(&transform->md_ctx_dec); +#endif + + mbedtls_platform_zeroize(transform, sizeof(mbedtls_ssl_transform)); +} + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + +void mbedtls_ssl_buffering_free(mbedtls_ssl_context *ssl) +{ + unsigned offset; + mbedtls_ssl_handshake_params * const hs = ssl->handshake; + + if (hs == NULL) { + return; + } + + ssl_free_buffered_record(ssl); + + for (offset = 0; offset < MBEDTLS_SSL_MAX_BUFFERED_HS; offset++) { + ssl_buffering_free_slot(ssl, offset); + } +} + +static void ssl_buffering_free_slot(mbedtls_ssl_context *ssl, + uint8_t slot) +{ + mbedtls_ssl_handshake_params * const hs = ssl->handshake; + mbedtls_ssl_hs_buffer * const hs_buf = &hs->buffering.hs[slot]; + + if (slot >= MBEDTLS_SSL_MAX_BUFFERED_HS) { + return; + } + + if (hs_buf->is_valid == 1) { + hs->buffering.total_bytes_buffered -= hs_buf->data_len; + mbedtls_platform_zeroize(hs_buf->data, hs_buf->data_len); + mbedtls_free(hs_buf->data); + memset(hs_buf, 0, sizeof(mbedtls_ssl_hs_buffer)); + } +} + +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +/* + * Convert version numbers to/from wire format + * and, for DTLS, to/from TLS equivalent. + * + * For TLS this is the identity. + * For DTLS, use 1's complement (v -> 255 - v, and then map as follows: + * 1.0 <-> 3.2 (DTLS 1.0 is based on TLS 1.1) + * 1.x <-> 3.x+1 for x != 0 (DTLS 1.2 based on TLS 1.2) + */ +void mbedtls_ssl_write_version(int major, int minor, int transport, + unsigned char ver[2]) +{ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + if (minor == MBEDTLS_SSL_MINOR_VERSION_2) { + --minor; /* DTLS 1.0 stored as TLS 1.1 internally */ + + } + ver[0] = (unsigned char) (255 - (major - 2)); + ver[1] = (unsigned char) (255 - (minor - 1)); + } else +#else + ((void) transport); +#endif + { + ver[0] = (unsigned char) major; + ver[1] = (unsigned char) minor; + } +} + +void mbedtls_ssl_read_version(int *major, int *minor, int transport, + const unsigned char ver[2]) +{ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + *major = 255 - ver[0] + 2; + *minor = 255 - ver[1] + 1; + + if (*minor == MBEDTLS_SSL_MINOR_VERSION_1) { + ++*minor; /* DTLS 1.0 stored as TLS 1.1 internally */ + } + } else +#else + ((void) transport); +#endif + { + *major = ver[0]; + *minor = ver[1]; + } +} + +#endif /* MBEDTLS_SSL_TLS_C */ diff --git a/ext/opcua_client/mbedtls/library/ssl_srv.c b/ext/opcua_client/mbedtls/library/ssl_srv.c new file mode 100644 index 0000000..544e50e --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ssl_srv.c @@ -0,0 +1,4619 @@ +/* + * SSLv3/TLSv1 server-side functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_SSL_SRV_C) + +#include "mbedtls/platform.h" + +#include "mbedtls/ssl.h" +#include "mbedtls/ssl_internal.h" +#include "mbedtls/debug.h" +#include "mbedtls/error.h" +#include "mbedtls/platform_util.h" +#include "constant_time_internal.h" +#include "mbedtls/constant_time.h" + +#include + +#if defined(MBEDTLS_ECP_C) +#include "mbedtls/ecp.h" +#endif + +#if defined(MBEDTLS_HAVE_TIME) +#include "mbedtls/platform_time.h" +#endif + +#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) +int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl, + const unsigned char *info, + size_t ilen) +{ + if (ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + mbedtls_free(ssl->cli_id); + + if ((ssl->cli_id = mbedtls_calloc(1, ilen)) == NULL) { + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + memcpy(ssl->cli_id, info, ilen); + ssl->cli_id_len = ilen; + + return 0; +} + +void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf, + mbedtls_ssl_cookie_write_t *f_cookie_write, + mbedtls_ssl_cookie_check_t *f_cookie_check, + void *p_cookie) +{ + conf->f_cookie_write = f_cookie_write; + conf->f_cookie_check = f_cookie_check; + conf->p_cookie = p_cookie; +} +#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ + +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_servername_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t servername_list_size, hostname_len; + const unsigned char *p; + + MBEDTLS_SSL_DEBUG_MSG(3, ("parse ServerName extension")); + + if (len < 2) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + servername_list_size = ((buf[0] << 8) | (buf[1])); + if (servername_list_size + 2 != len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + p = buf + 2; + while (servername_list_size > 2) { + hostname_len = ((p[1] << 8) | p[2]); + if (hostname_len + 3 > servername_list_size) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + if (p[0] == MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME) { + ret = ssl->conf->f_sni(ssl->conf->p_sni, + ssl, p + 3, hostname_len); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_sni_wrapper", ret); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + return 0; + } + + servername_list_size -= hostname_len + 3; + p += hostname_len + 3; + } + + if (servername_list_size != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + return 0; +} +#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_conf_has_psk_or_cb(mbedtls_ssl_config const *conf) +{ + if (conf->f_psk != NULL) { + return 1; + } + + if (conf->psk_identity_len == 0 || conf->psk_identity == NULL) { + return 0; + } + + if (conf->psk != NULL && conf->psk_len != 0) { + return 1; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) { + return 1; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + return 0; +} + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_use_opaque_psk(mbedtls_ssl_context const *ssl) +{ + if (ssl->conf->f_psk != NULL) { + /* If we've used a callback to select the PSK, + * the static configuration is irrelevant. */ + + if (!mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque)) { + return 1; + } + + return 0; + } + + if (!mbedtls_svc_key_id_is_null(ssl->conf->psk_opaque)) { + return 1; + } + + return 0; +} +#endif /* MBEDTLS_USE_PSA_CRYPTO */ +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_renegotiation_info(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) { + /* Check verify-data in constant-time. The length OTOH is no secret */ + if (len != 1 + ssl->verify_data_len || + buf[0] != ssl->verify_data_len || + mbedtls_ct_memcmp(buf + 1, ssl->peer_verify_data, + ssl->verify_data_len) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching renegotiation info")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + } else +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + { + if (len != 1 || buf[0] != 0x0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("non-zero length renegotiation info")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; + } + + return 0; +} + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + +/* + * Status of the implementation of signature-algorithms extension: + * + * Currently, we are only considering the signature-algorithm extension + * to pick a ciphersuite which allows us to send the ServerKeyExchange + * message with a signature-hash combination that the user allows. + * + * We do *not* check whether all certificates in our certificate + * chain are signed with an allowed signature-hash pair. + * This needs to be done at a later stage. + * + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_signature_algorithms_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + size_t sig_alg_list_size; + + const unsigned char *p; + const unsigned char *end = buf + len; + + mbedtls_md_type_t md_cur; + mbedtls_pk_type_t sig_cur; + + if (len < 2) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + sig_alg_list_size = ((buf[0] << 8) | (buf[1])); + if (sig_alg_list_size + 2 != len || + sig_alg_list_size % 2 != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + /* Currently we only guarantee signing the ServerKeyExchange message according + * to the constraints specified in this extension (see above), so it suffices + * to remember only one suitable hash for each possible signature algorithm. + * + * This will change when we also consider certificate signatures, + * in which case we will need to remember the whole signature-hash + * pair list from the extension. + */ + + for (p = buf + 2; p < end; p += 2) { + /* Silently ignore unknown signature or hash algorithms. */ + + if ((sig_cur = mbedtls_ssl_pk_alg_from_sig(p[1])) == MBEDTLS_PK_NONE) { + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext" + " unknown sig alg encoding %d", p[1])); + continue; + } + + /* Check if we support the hash the user proposes */ + md_cur = mbedtls_ssl_md_alg_from_hash(p[0]); + if (md_cur == MBEDTLS_MD_NONE) { + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext:" + " unknown hash alg encoding %d", p[0])); + continue; + } + + if (mbedtls_ssl_check_sig_hash(ssl, md_cur) == 0) { + mbedtls_ssl_sig_hash_set_add(&ssl->handshake->hash_algs, sig_cur, md_cur); + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext:" + " match sig %u and hash %u", + (unsigned) sig_cur, (unsigned) md_cur)); + } else { + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: " + "hash alg %u not supported", (unsigned) md_cur)); + } + } + + return 0; +} +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && + MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ + +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_supported_elliptic_curves(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + size_t list_size, our_size; + const unsigned char *p; + const mbedtls_ecp_curve_info *curve_info, **curves; + + if (len < 2) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + list_size = ((buf[0] << 8) | (buf[1])); + if (list_size + 2 != len || + list_size % 2 != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + /* Should never happen unless client duplicates the extension */ + if (ssl->handshake->curves != NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + /* Don't allow our peer to make us allocate too much memory, + * and leave room for a final 0 */ + our_size = list_size / 2 + 1; + if (our_size > MBEDTLS_ECP_DP_MAX) { + our_size = MBEDTLS_ECP_DP_MAX; + } + + if ((curves = mbedtls_calloc(our_size, sizeof(*curves))) == NULL) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR); + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + ssl->handshake->curves = curves; + + p = buf + 2; + while (list_size > 0 && our_size > 1) { + curve_info = mbedtls_ecp_curve_info_from_tls_id((p[0] << 8) | p[1]); + + if (curve_info != NULL) { + *curves++ = curve_info; + our_size--; + } + + list_size -= 2; + p += 2; + } + + return 0; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_supported_point_formats(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + size_t list_size; + const unsigned char *p; + + if (len == 0 || (size_t) (buf[0] + 1) != len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + list_size = buf[0]; + + p = buf + 1; + while (list_size > 0) { + if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED || + p[0] == MBEDTLS_ECP_PF_COMPRESSED) { +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) + ssl->handshake->ecdh_ctx.point_format = p[0]; +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + ssl->handshake->ecjpake_ctx.point_format = p[0]; +#endif + MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0])); + return 0; + } + + list_size--; + p++; + } + + return 0; +} +#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || + MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (mbedtls_ecjpake_check(&ssl->handshake->ecjpake_ctx) != 0) { + MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension")); + return 0; + } + + if ((ret = mbedtls_ecjpake_read_round_one(&ssl->handshake->ecjpake_ctx, + buf, len)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_one", ret); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return ret; + } + + /* Only mark the extension as OK when we're sure it is */ + ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK; + + return 0; +} +#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + if (len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + ssl->session_negotiate->mfl_code = buf[0]; + + return 0; +} +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + size_t peer_cid_len; + + /* CID extension only makes sense in DTLS */ + if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + /* + * Quoting draft-ietf-tls-dtls-connection-id-05 + * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05 + * + * struct { + * opaque cid<0..2^8-1>; + * } ConnectionId; + */ + + if (len < 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + peer_cid_len = *buf++; + len--; + + if (len != peer_cid_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + /* Ignore CID if the user has disabled its use. */ + if (ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) { + /* Leave ssl->handshake->cid_in_use in its default + * value of MBEDTLS_SSL_CID_DISABLED. */ + MBEDTLS_SSL_DEBUG_MSG(3, ("Client sent CID extension, but CID disabled")); + return 0; + } + + if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED; + ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len; + memcpy(ssl->handshake->peer_cid, buf, peer_cid_len); + + MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated")); + MBEDTLS_SSL_DEBUG_BUF(3, "Client CID", buf, peer_cid_len); + + return 0; +} +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_truncated_hmac_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + if (len != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + ((void) buf); + + if (ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED) { + ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED; + } + + return 0; +} +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + if (len != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + ((void) buf); + + if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED && + ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0) { + ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED; + } + + return 0; +} +#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + if (len != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + ((void) buf); + + if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED && + ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0) { + ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED; + } + + return 0; +} +#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ssl_session session; + + mbedtls_ssl_session_init(&session); + + if (ssl->conf->f_ticket_parse == NULL || + ssl->conf->f_ticket_write == NULL) { + return 0; + } + + /* Remember the client asked us to send a new ticket */ + ssl->handshake->new_session_ticket = 1; + + MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, len)); + + if (len == 0) { + return 0; + } + +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ticket rejected: renegotiating")); + return 0; + } +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + + /* + * Failures are ok: just ignore the ticket and proceed. + */ + if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket, &session, + buf, len)) != 0) { + mbedtls_ssl_session_free(&session); + + if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic")); + } else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired")); + } else { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_parse", ret); + } + + return 0; + } + + /* + * Keep the session ID sent by the client, since we MUST send it back to + * inform them we're accepting the ticket (RFC 5077 section 3.4) + */ + session.id_len = ssl->session_negotiate->id_len; + memcpy(&session.id, ssl->session_negotiate->id, session.id_len); + + mbedtls_ssl_session_free(ssl->session_negotiate); + memcpy(ssl->session_negotiate, &session, sizeof(mbedtls_ssl_session)); + + /* Zeroize instead of free as we copied the content */ + mbedtls_platform_zeroize(&session, sizeof(mbedtls_ssl_session)); + + MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from ticket")); + + ssl->handshake->resume = 1; + + /* Don't send a new ticket after all, this one is OK */ + ssl->handshake->new_session_ticket = 0; + + return 0; +} +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + +#if defined(MBEDTLS_SSL_ALPN) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_alpn_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, size_t len) +{ + size_t list_len, cur_len, ours_len; + const unsigned char *theirs, *start, *end; + const char **ours; + + /* If ALPN not configured, just ignore the extension */ + if (ssl->conf->alpn_list == NULL) { + return 0; + } + + /* + * opaque ProtocolName<1..2^8-1>; + * + * struct { + * ProtocolName protocol_name_list<2..2^16-1> + * } ProtocolNameList; + */ + + /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */ + if (len < 4) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + list_len = (buf[0] << 8) | buf[1]; + if (list_len != len - 2) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + /* + * Validate peer's list (lengths) + */ + start = buf + 2; + end = buf + len; + for (theirs = start; theirs != end; theirs += cur_len) { + cur_len = *theirs++; + + /* Current identifier must fit in list */ + if (cur_len > (size_t) (end - theirs)) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + /* Empty strings MUST NOT be included */ + if (cur_len == 0) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + } + + /* + * Use our order of preference + */ + for (ours = ssl->conf->alpn_list; *ours != NULL; ours++) { + ours_len = strlen(*ours); + for (theirs = start; theirs != end; theirs += cur_len) { + cur_len = *theirs++; + + if (cur_len == ours_len && + memcmp(theirs, *ours, cur_len) == 0) { + ssl->alpn_chosen = *ours; + return 0; + } + } + } + + /* If we get there, no match was found */ + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; +} +#endif /* MBEDTLS_SSL_ALPN */ + +#if defined(MBEDTLS_SSL_DTLS_SRTP) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + mbedtls_ssl_srtp_profile client_protection = MBEDTLS_TLS_SRTP_UNSET; + size_t i, j; + size_t profile_length; + uint16_t mki_length; + /*! 2 bytes for profile length and 1 byte for mki len */ + const size_t size_of_lengths = 3; + + /* If use_srtp is not configured, just ignore the extension */ + if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) || + (ssl->conf->dtls_srtp_profile_list == NULL) || + (ssl->conf->dtls_srtp_profile_list_len == 0)) { + return 0; + } + + /* RFC5764 section 4.1.1 + * uint8 SRTPProtectionProfile[2]; + * + * struct { + * SRTPProtectionProfiles SRTPProtectionProfiles; + * opaque srtp_mki<0..255>; + * } UseSRTPData; + + * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>; + */ + + /* + * Min length is 5: at least one protection profile(2 bytes) + * and length(2 bytes) + srtp_mki length(1 byte) + * Check here that we have at least 2 bytes of protection profiles length + * and one of srtp_mki length + */ + if (len < size_of_lengths) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET; + + /* first 2 bytes are protection profile length(in bytes) */ + profile_length = (buf[0] << 8) | buf[1]; + buf += 2; + + /* The profile length cannot be bigger than input buffer size - lengths fields */ + if (profile_length > len - size_of_lengths || + profile_length % 2 != 0) { /* profiles are 2 bytes long, so the length must be even */ + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + /* + * parse the extension list values are defined in + * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml + */ + for (j = 0; j < profile_length; j += 2) { + uint16_t protection_profile_value = buf[j] << 8 | buf[j + 1]; + client_protection = mbedtls_ssl_check_srtp_profile_value(protection_profile_value); + + if (client_protection != MBEDTLS_TLS_SRTP_UNSET) { + MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s", + mbedtls_ssl_get_srtp_profile_as_string( + client_protection))); + } else { + continue; + } + /* check if suggested profile is in our list */ + for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) { + if (client_protection == ssl->conf->dtls_srtp_profile_list[i]) { + ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i]; + MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s", + mbedtls_ssl_get_srtp_profile_as_string( + client_protection))); + break; + } + } + if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile != MBEDTLS_TLS_SRTP_UNSET) { + break; + } + } + buf += profile_length; /* buf points to the mki length */ + mki_length = *buf; + buf++; + + if (mki_length > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH || + mki_length + profile_length + size_of_lengths != len) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + /* Parse the mki only if present and mki is supported locally */ + if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED && + mki_length > 0) { + ssl->dtls_srtp_info.mki_len = mki_length; + + memcpy(ssl->dtls_srtp_info.mki_value, buf, mki_length); + + MBEDTLS_SSL_DEBUG_BUF(3, "using mki", ssl->dtls_srtp_info.mki_value, + ssl->dtls_srtp_info.mki_len); + } + + return 0; +} +#endif /* MBEDTLS_SSL_DTLS_SRTP */ + +/* + * Auxiliary functions for ServerHello parsing and related actions + */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +/* + * Return 0 if the given key uses one of the acceptable curves, -1 otherwise + */ +#if defined(MBEDTLS_ECDSA_C) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_check_key_curve(mbedtls_pk_context *pk, + const mbedtls_ecp_curve_info **curves) +{ + const mbedtls_ecp_curve_info **crv = curves; + mbedtls_ecp_group_id grp_id = mbedtls_pk_ec(*pk)->grp.id; + + while (*crv != NULL) { + if ((*crv)->grp_id == grp_id) { + return 0; + } + crv++; + } + + return -1; +} +#endif /* MBEDTLS_ECDSA_C */ + +/* + * Try picking a certificate for this ciphersuite, + * return 0 on success and -1 on failure. + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_pick_cert(mbedtls_ssl_context *ssl, + const mbedtls_ssl_ciphersuite_t *ciphersuite_info) +{ + mbedtls_ssl_key_cert *cur, *list, *fallback = NULL; + mbedtls_pk_type_t pk_alg = + mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info); + uint32_t flags; + +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) + if (ssl->handshake->sni_key_cert != NULL) { + list = ssl->handshake->sni_key_cert; + } else +#endif + list = ssl->conf->key_cert; + + if (pk_alg == MBEDTLS_PK_NONE) { + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate")); + + if (list == NULL) { + MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate")); + return -1; + } + + for (cur = list; cur != NULL; cur = cur->next) { + flags = 0; + MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate", + cur->cert); + + if (!mbedtls_pk_can_do(&cur->cert->pk, pk_alg)) { + MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type")); + continue; + } + + /* + * This avoids sending the client a cert it'll reject based on + * keyUsage or other extensions. + * + * It also allows the user to provision different certificates for + * different uses based on keyUsage, eg if they want to avoid signing + * and decrypting with the same RSA key. + */ + if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info, + MBEDTLS_SSL_IS_SERVER, &flags) != 0) { + MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: " + "(extended) key usage extension")); + continue; + } + +#if defined(MBEDTLS_ECDSA_C) + if (pk_alg == MBEDTLS_PK_ECDSA && + ssl_check_key_curve(&cur->cert->pk, ssl->handshake->curves) != 0) { + MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve")); + continue; + } +#endif + + /* + * Try to select a SHA-1 certificate for pre-1.2 clients, but still + * present them a SHA-higher cert rather than failing if it's the only + * one we got that satisfies the other conditions. + */ + if (ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 && + cur->cert->sig_md != MBEDTLS_MD_SHA1) { + if (fallback == NULL) { + fallback = cur; + } + { + MBEDTLS_SSL_DEBUG_MSG(3, ("certificate not preferred: " + "sha-2 with pre-TLS 1.2 client")); + continue; + } + } + + /* If we get there, we got a winner */ + break; + } + + if (cur == NULL) { + cur = fallback; + } + + /* Do not update ssl->handshake->key_cert unless there is a match */ + if (cur != NULL) { + ssl->handshake->key_cert = cur; + MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate", + ssl->handshake->key_cert->cert); + return 0; + } + + return -1; +} +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +/* + * Check if a given ciphersuite is suitable for use with our config/keys/etc + * Sets ciphersuite_info only if the suite matches. + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id, + const mbedtls_ssl_ciphersuite_t **ciphersuite_info) +{ + const mbedtls_ssl_ciphersuite_t *suite_info; + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + mbedtls_pk_type_t sig_type; +#endif + + suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id); + if (suite_info == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)", + (unsigned int) suite_id, suite_info->name)); + + if (suite_info->min_minor_ver > ssl->minor_ver || + suite_info->max_minor_ver < ssl->minor_ver) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version")); + return 0; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + (suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS)) { + return 0; + } +#endif + +#if defined(MBEDTLS_ARC4_C) + if (ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED && + suite_info->cipher == MBEDTLS_CIPHER_ARC4_128) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: rc4")); + return 0; + } +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE && + (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake " + "not configured or ext missing")); + return 0; + } +#endif + + +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) + if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) && + (ssl->handshake->curves == NULL || + ssl->handshake->curves[0] == NULL)) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: " + "no common elliptic curve")); + return 0; + } +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) + /* If the ciphersuite requires a pre-shared key and we don't + * have one, skip it now rather than failing later */ + if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) && + ssl_conf_has_psk_or_cb(ssl->conf) == 0) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key")); + return 0; + } +#endif + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + /* If the ciphersuite requires signing, check whether + * a suitable hash algorithm is present. */ + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info); + if (sig_type != MBEDTLS_PK_NONE && + mbedtls_ssl_sig_hash_set_find(&ssl->handshake->hash_algs, + sig_type) == MBEDTLS_MD_NONE) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm " + "for signature algorithm %u", (unsigned) sig_type)); + return 0; + } + } + +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && + MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + /* + * Final check: if ciphersuite requires us to have a + * certificate/key of a particular type: + * - select the appropriate certificate if we have one, or + * - try the next ciphersuite if we don't + * This must be done last since we modify the key_cert list. + */ + if (ssl_pick_cert(ssl, suite_info) != 0) { + MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: " + "no suitable certificate")); + return 0; + } +#endif + + *ciphersuite_info = suite_info; + return 0; +} + +#if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_client_hello_v2(mbedtls_ssl_context *ssl) +{ + int ret, got_common_suite; + unsigned int i, j; + size_t n; + unsigned int ciph_len, sess_len, chal_len; + unsigned char *buf, *p; + const int *ciphersuites; + const mbedtls_ssl_ciphersuite_t *ciphersuite_info; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello v2")); + +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("client hello v2 illegal for renegotiation")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + + buf = ssl->in_hdr; + + MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, 5); + + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v2, message type: %d", + buf[2])); + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v2, message len.: %d", + ((buf[0] & 0x7F) << 8) | buf[1])); + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v2, max. version: [%d:%d]", + buf[3], buf[4])); + + /* + * SSLv2 Client Hello + * + * Record layer: + * 0 . 1 message length + * + * SSL layer: + * 2 . 2 message type + * 3 . 4 protocol version + */ + if (buf[2] != MBEDTLS_SSL_HS_CLIENT_HELLO || + buf[3] != MBEDTLS_SSL_MAJOR_VERSION_3) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + n = ((buf[0] << 8) | buf[1]) & 0x7FFF; + + if (n < 17 || n > 512) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3; + ssl->minor_ver = (buf[4] <= ssl->conf->max_minor_ver) + ? buf[4] : ssl->conf->max_minor_ver; + + if (ssl->minor_ver < ssl->conf->min_minor_ver) { + MBEDTLS_SSL_DEBUG_MSG(1, ("client only supports ssl smaller than minimum" + " [%d:%d] < [%d:%d]", + ssl->major_ver, ssl->minor_ver, + ssl->conf->min_major_ver, ssl->conf->min_minor_ver)); + + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION); + return MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION; + } + + ssl->handshake->max_major_ver = buf[3]; + ssl->handshake->max_minor_ver = buf[4]; + + if ((ret = mbedtls_ssl_fetch_input(ssl, 2 + n)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret); + return ret; + } + + ssl->handshake->update_checksum(ssl, buf + 2, n); + + buf = ssl->in_msg; + n = ssl->in_left - 5; + + /* + * 0 . 1 ciphersuitelist length + * 2 . 3 session id length + * 4 . 5 challenge length + * 6 . .. ciphersuitelist + * .. . .. session id + * .. . .. challenge + */ + MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, n); + + ciph_len = (buf[0] << 8) | buf[1]; + sess_len = (buf[2] << 8) | buf[3]; + chal_len = (buf[4] << 8) | buf[5]; + + MBEDTLS_SSL_DEBUG_MSG(3, ("ciph_len: %u, sess_len: %u, chal_len: %u", + ciph_len, sess_len, chal_len)); + + /* + * Make sure each parameter length is valid + */ + if (ciph_len < 3 || (ciph_len % 3) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + if (sess_len > 32) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + if (chal_len < 8 || chal_len > 32) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + if (n != 6 + ciph_len + sess_len + chal_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist", + buf + 6, ciph_len); + MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", + buf + 6 + ciph_len, sess_len); + MBEDTLS_SSL_DEBUG_BUF(3, "client hello, challenge", + buf + 6 + ciph_len + sess_len, chal_len); + + p = buf + 6 + ciph_len; + ssl->session_negotiate->id_len = sess_len; + memset(ssl->session_negotiate->id, 0, + sizeof(ssl->session_negotiate->id)); + memcpy(ssl->session_negotiate->id, p, ssl->session_negotiate->id_len); + + p += sess_len; + memset(ssl->handshake->randbytes, 0, 64); + memcpy(ssl->handshake->randbytes + 32 - chal_len, p, chal_len); + + /* + * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV + */ + for (i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3) { + if (p[0] == 0 && p[1] == 0 && p[2] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) { + MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO ")); +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) { + MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV " + "during renegotiation")); + + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; + break; + } + } + +#if defined(MBEDTLS_SSL_FALLBACK_SCSV) + for (i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3) { + if (p[0] == 0 && + MBEDTLS_GET_UINT16_BE(p, 1) != MBEDTLS_SSL_FALLBACK_SCSV_VALUE) { + MBEDTLS_SSL_DEBUG_MSG(3, ("received FALLBACK_SCSV")); + + if (ssl->minor_ver < ssl->conf->max_minor_ver) { + MBEDTLS_SSL_DEBUG_MSG(1, ("inapropriate fallback")); + + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK); + + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + break; + } + } +#endif /* MBEDTLS_SSL_FALLBACK_SCSV */ + + got_common_suite = 0; + ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver]; + ciphersuite_info = NULL; +#if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE) + for (j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3) { + for (i = 0; ciphersuites[i] != 0; i++) { + if (p[0] != 0 || + MBEDTLS_GET_UINT16_BE(p, 1) != ciphersuites[i]) { + continue; + } + + got_common_suite = 1; + + if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i], + &ciphersuite_info)) != 0) { + return ret; + } + + if (ciphersuite_info != NULL) { + goto have_ciphersuite_v2; + } + } + } +#else + for (i = 0; ciphersuites[i] != 0; i++) { + for (j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3) { + if (p[0] != 0 || + MBEDTLS_GET_UINT16_BE(p, 1) != ciphersuites[i]) { + continue; + } + + got_common_suite = 1; + + if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i], + &ciphersuite_info)) != 0) { + return ret; + } + + if (ciphersuite_info != NULL) { + goto have_ciphersuite_v2; + } + } + } +#endif + + if (got_common_suite) { + MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, " + "but none of them usable")); + return MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE; + } else { + MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common")); + return MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN; + } + +have_ciphersuite_v2: + MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name)); + + ssl->session_negotiate->ciphersuite = ciphersuites[i]; + ssl->handshake->ciphersuite_info = ciphersuite_info; + + /* + * SSLv2 Client Hello relevant renegotiation security checks + */ + if (ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && + ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + ssl->in_left = 0; + ssl->state++; + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello v2")); + + return 0; +} +#endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */ + +/* This function doesn't alert on errors that happen early during + ClientHello parsing because they might indicate that the client is + not talking SSL/TLS at all and would not understand our alert. */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_client_hello(mbedtls_ssl_context *ssl) +{ + int ret, got_common_suite; + size_t i, j; + size_t ciph_offset, comp_offset, ext_offset; + size_t msg_len, ciph_len, sess_len, comp_len, ext_len; +#if defined(MBEDTLS_SSL_PROTO_DTLS) + size_t cookie_offset, cookie_len; +#endif + unsigned char *buf, *p, *ext; +#if defined(MBEDTLS_SSL_RENEGOTIATION) + int renegotiation_info_seen = 0; +#endif + int handshake_failure = 0; + const int *ciphersuites; + const mbedtls_ssl_ciphersuite_t *ciphersuite_info; + int major, minor; + + /* If there is no signature-algorithm extension present, + * we need to fall back to the default values for allowed + * signature-hash pairs. */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + int sig_hash_alg_ext_present = 0; +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && + MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello")); + + int renegotiating = 0; +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) +read_record_header: +#endif + /* + * If renegotiating, then the input was read with mbedtls_ssl_read_record(), + * otherwise read it ourselves manually in order to support SSLv2 + * ClientHello, which doesn't use the same record layer format. + */ +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) { + renegotiating = 1; + } +#endif + if (!renegotiating) { + if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) { + /* No alert on a read error. */ + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret); + return ret; + } + } + + buf = ssl->in_hdr; + +#if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) + int is_dtls = 0; +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + is_dtls = 1; + } +#endif + if (!is_dtls) { + if ((buf[0] & 0x80) != 0) { + return ssl_parse_client_hello_v2(ssl); + } + } +#endif + + MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl)); + + /* + * SSLv3/TLS Client Hello + * + * Record layer: + * 0 . 0 message type + * 1 . 2 protocol version + * 3 . 11 DTLS: epoch + record sequence number + * 3 . 4 message length + */ + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, message type: %d", + buf[0])); + + if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, message len.: %d", + (ssl->in_len[0] << 8) | ssl->in_len[1])); + + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, protocol version: [%d:%d]", + buf[1], buf[2])); + + mbedtls_ssl_read_version(&major, &minor, ssl->conf->transport, buf + 1); + + /* According to RFC 5246 Appendix E.1, the version here is typically + * "{03,00}, the lowest version number supported by the client, [or] the + * value of ClientHello.client_version", so the only meaningful check here + * is the major version shouldn't be less than 3 */ + if (major < MBEDTLS_SSL_MAJOR_VERSION_3) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + /* For DTLS if this is the initial handshake, remember the client sequence + * number to use it in our next message (RFC 6347 4.2.1) */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM +#if defined(MBEDTLS_SSL_RENEGOTIATION) + && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE +#endif + ) { + /* Epoch should be 0 for initial handshakes */ + if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + memcpy(ssl->cur_out_ctr + 2, ssl->in_ctr + 2, 6); + +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) + if (mbedtls_ssl_dtls_replay_check(ssl) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding")); + ssl->next_record_offset = 0; + ssl->in_left = 0; + goto read_record_header; + } + + /* No MAC to check yet, so we can update right now */ + mbedtls_ssl_dtls_replay_update(ssl); +#endif + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + msg_len = (ssl->in_len[0] << 8) | ssl->in_len[1]; + +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) { + /* Set by mbedtls_ssl_read_record() */ + msg_len = ssl->in_hslen; + } else +#endif + { + if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + if ((ret = mbedtls_ssl_fetch_input(ssl, + mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret); + return ret; + } + + /* Done reading this record, get ready for the next one */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl); + } else +#endif + ssl->in_left = 0; + } + + buf = ssl->in_msg; + + MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len); + + ssl->handshake->update_checksum(ssl, buf, msg_len); + + /* + * Handshake layer: + * 0 . 0 handshake type + * 1 . 3 handshake length + * 4 . 5 DTLS only: message sequence number + * 6 . 8 DTLS only: fragment offset + * 9 . 11 DTLS only: fragment length + */ + if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0])); + + if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake len.: %d", + (buf[1] << 16) | (buf[2] << 8) | buf[3])); + + if (buf[1] != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != 0", + (unsigned) buf[1])); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + /* We don't support fragmentation of ClientHello (yet?) */ + if (msg_len != mbedtls_ssl_hs_hdr_len(ssl) + ((buf[2] << 8) | buf[3])) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != %u + %u", + (unsigned) msg_len, + (unsigned) mbedtls_ssl_hs_hdr_len(ssl), + (unsigned) (buf[2] << 8) | buf[3])); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + /* + * Copy the client's handshake message_seq on initial handshakes, + * check sequence number on renego. + */ +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) { + /* This couldn't be done in ssl_prepare_handshake_record() */ + unsigned int cli_msg_seq = (ssl->in_msg[4] << 8) | + ssl->in_msg[5]; + + if (cli_msg_seq != ssl->handshake->in_msg_seq) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: " + "%u (expected %u)", cli_msg_seq, + ssl->handshake->in_msg_seq)); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + ssl->handshake->in_msg_seq++; + } else +#endif + { + unsigned int cli_msg_seq = (ssl->in_msg[4] << 8) | + ssl->in_msg[5]; + ssl->handshake->out_msg_seq = cli_msg_seq; + ssl->handshake->in_msg_seq = cli_msg_seq + 1; + } + + /* + * For now we don't support fragmentation, so make sure + * fragment_offset == 0 and fragment_length == length + */ + MBEDTLS_SSL_DEBUG_MSG( + 4, ("fragment_offset=%u fragment_length=%u length=%u", + (unsigned) (ssl->in_msg[6] << 16 | ssl->in_msg[7] << 8 | ssl->in_msg[8]), + (unsigned) (ssl->in_msg[9] << 16 | ssl->in_msg[10] << 8 | ssl->in_msg[11]), + (unsigned) (ssl->in_msg[1] << 16 | ssl->in_msg[2] << 8 | ssl->in_msg[3]))); + if (ssl->in_msg[6] != 0 || ssl->in_msg[7] != 0 || ssl->in_msg[8] != 0 || + memcmp(ssl->in_msg + 1, ssl->in_msg + 9, 3) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported")); + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + } + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + buf += mbedtls_ssl_hs_hdr_len(ssl); + msg_len -= mbedtls_ssl_hs_hdr_len(ssl); + + /* + * ClientHello layer: + * 0 . 1 protocol version + * 2 . 33 random bytes (starting with 4 bytes of Unix time) + * 34 . 35 session id length (1 byte) + * 35 . 34+x session id + * 35+x . 35+x DTLS only: cookie length (1 byte) + * 36+x . .. DTLS only: cookie + * .. . .. ciphersuite list length (2 bytes) + * .. . .. ciphersuite list + * .. . .. compression alg. list length (1 byte) + * .. . .. compression alg. list + * .. . .. extensions length (2 bytes, optional) + * .. . .. extensions (optional) + */ + + /* + * Minimal length (with everything empty and extensions omitted) is + * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can + * read at least up to session id length without worrying. + */ + if (msg_len < 38) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + /* + * Check and save the protocol version + */ + MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2); + + mbedtls_ssl_read_version(&ssl->major_ver, &ssl->minor_ver, + ssl->conf->transport, buf); + + ssl->handshake->max_major_ver = ssl->major_ver; + ssl->handshake->max_minor_ver = ssl->minor_ver; + + if (ssl->major_ver < ssl->conf->min_major_ver || + ssl->minor_ver < ssl->conf->min_minor_ver) { + MBEDTLS_SSL_DEBUG_MSG(1, ("client only supports ssl smaller than minimum" + " [%d:%d] < [%d:%d]", + ssl->major_ver, ssl->minor_ver, + ssl->conf->min_major_ver, ssl->conf->min_minor_ver)); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION); + return MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION; + } + + if (ssl->major_ver > ssl->conf->max_major_ver) { + ssl->major_ver = ssl->conf->max_major_ver; + ssl->minor_ver = ssl->conf->max_minor_ver; + } else if (ssl->minor_ver > ssl->conf->max_minor_ver) { + ssl->minor_ver = ssl->conf->max_minor_ver; + } + + /* + * Save client random (inc. Unix time) + */ + MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32); + + memcpy(ssl->handshake->randbytes, buf + 2, 32); + + /* + * Check the session ID length and save session ID + */ + sess_len = buf[34]; + + if (sess_len > sizeof(ssl->session_negotiate->id) || + sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */ + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len); + + ssl->session_negotiate->id_len = sess_len; + memset(ssl->session_negotiate->id, 0, + sizeof(ssl->session_negotiate->id)); + memcpy(ssl->session_negotiate->id, buf + 35, + ssl->session_negotiate->id_len); + + /* + * Check the cookie length and content + */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + cookie_offset = 35 + sess_len; + cookie_len = buf[cookie_offset]; + + if (cookie_offset + 1 + cookie_len + 2 > msg_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie", + buf + cookie_offset + 1, cookie_len); + +#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) + if (ssl->conf->f_cookie_check != NULL +#if defined(MBEDTLS_SSL_RENEGOTIATION) + && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE +#endif + ) { + if (ssl->conf->f_cookie_check(ssl->conf->p_cookie, + buf + cookie_offset + 1, cookie_len, + ssl->cli_id, ssl->cli_id_len) != 0) { + MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed")); + ssl->handshake->verify_cookie_len = 1; + } else { + MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed")); + ssl->handshake->verify_cookie_len = 0; + } + } else +#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ + { + /* We know we didn't send a cookie, so it should be empty */ + if (cookie_len != 0) { + /* This may be an attacker's probe, so don't send an alert */ + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped")); + } + + /* + * Check the ciphersuitelist length (will be parsed later) + */ + ciph_offset = cookie_offset + 1 + cookie_len; + } else +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + ciph_offset = 35 + sess_len; + + ciph_len = (buf[ciph_offset + 0] << 8) + | (buf[ciph_offset + 1]); + + if (ciph_len < 2 || + ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */ + (ciph_len % 2) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist", + buf + ciph_offset + 2, ciph_len); + + /* + * Check the compression algorithms length and pick one + */ + comp_offset = ciph_offset + 2 + ciph_len; + + comp_len = buf[comp_offset]; + + if (comp_len < 1 || + comp_len > 16 || + comp_len + comp_offset + 1 > msg_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression", + buf + comp_offset + 1, comp_len); + + ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL; +#if defined(MBEDTLS_ZLIB_SUPPORT) + for (i = 0; i < comp_len; ++i) { + if (buf[comp_offset + 1 + i] == MBEDTLS_SSL_COMPRESS_DEFLATE) { + ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_DEFLATE; + break; + } + } +#endif + + /* See comments in ssl_write_client_hello() */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL; + } +#endif + + /* Do not parse the extensions if the protocol is SSLv3 */ +#if defined(MBEDTLS_SSL_PROTO_SSL3) + if ((ssl->major_ver != 3) || (ssl->minor_ver != 0)) { +#endif + /* + * Check the extension length + */ + ext_offset = comp_offset + 1 + comp_len; + if (msg_len > ext_offset) { + if (msg_len < ext_offset + 2) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + ext_len = (buf[ext_offset + 0] << 8) + | (buf[ext_offset + 1]); + + if (msg_len != ext_offset + 2 + ext_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + } else { + ext_len = 0; + } + + ext = buf + ext_offset + 2; + MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len); + + while (ext_len != 0) { + unsigned int ext_id; + unsigned int ext_size; + if (ext_len < 4) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + ext_id = ((ext[0] << 8) | (ext[1])); + ext_size = ((ext[2] << 8) | (ext[3])); + + if (ext_size + 4 > ext_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + switch (ext_id) { +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) + case MBEDTLS_TLS_EXT_SERVERNAME: + MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension")); + if (ssl->conf->f_sni == NULL) { + break; + } + + ret = ssl_parse_servername_ext(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + break; +#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ + + case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO: + MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension")); +#if defined(MBEDTLS_SSL_RENEGOTIATION) + renegotiation_info_seen = 1; +#endif + + ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + break; + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + case MBEDTLS_TLS_EXT_SIG_ALG: + MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension")); + + ret = ssl_parse_signature_algorithms_ext(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + + sig_hash_alg_ext_present = 1; + break; +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && + MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ + +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + case MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES: + MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension")); + + ret = ssl_parse_supported_elliptic_curves(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + break; + + case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS: + MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension")); + ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT; + + ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + break; +#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || + MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + case MBEDTLS_TLS_EXT_ECJPAKE_KKPP: + MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension")); + + ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + break; +#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) + case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH: + MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension")); + + ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + break; +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + case MBEDTLS_TLS_EXT_TRUNCATED_HMAC: + MBEDTLS_SSL_DEBUG_MSG(3, ("found truncated hmac extension")); + + ret = ssl_parse_truncated_hmac_ext(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + break; +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + case MBEDTLS_TLS_EXT_CID: + MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension")); + + ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + break; +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC: + MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension")); + + ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + break; +#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) + case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET: + MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension")); + + ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + break; +#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) + case MBEDTLS_TLS_EXT_SESSION_TICKET: + MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension")); + + ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + break; +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + +#if defined(MBEDTLS_SSL_ALPN) + case MBEDTLS_TLS_EXT_ALPN: + MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension")); + + ret = ssl_parse_alpn_ext(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + break; +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + +#if defined(MBEDTLS_SSL_DTLS_SRTP) + case MBEDTLS_TLS_EXT_USE_SRTP: + MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension")); + + ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size); + if (ret != 0) { + return ret; + } + break; +#endif /* MBEDTLS_SSL_DTLS_SRTP */ + + default: + MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)", + ext_id)); + } + + ext_len -= 4 + ext_size; + ext += 4 + ext_size; + } +#if defined(MBEDTLS_SSL_PROTO_SSL3) +} +#endif + +#if defined(MBEDTLS_SSL_FALLBACK_SCSV) + for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) { + if (MBEDTLS_GET_UINT16_BE(p, 0) == MBEDTLS_SSL_FALLBACK_SCSV_VALUE) { + MBEDTLS_SSL_DEBUG_MSG(2, ("received FALLBACK_SCSV")); + + if (ssl->minor_ver < ssl->conf->max_minor_ver) { + MBEDTLS_SSL_DEBUG_MSG(1, ("inapropriate fallback")); + + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK); + + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + break; + } + } +#endif /* MBEDTLS_SSL_FALLBACK_SCSV */ + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + + /* + * Try to fall back to default hash SHA1 if the client + * hasn't provided any preferred signature-hash combinations. + */ + if (sig_hash_alg_ext_present == 0) { + mbedtls_md_type_t md_default = MBEDTLS_MD_SHA1; + + if (mbedtls_ssl_check_sig_hash(ssl, md_default) != 0) { + md_default = MBEDTLS_MD_NONE; + } + + mbedtls_ssl_sig_hash_set_const_hash(&ssl->handshake->hash_algs, md_default); + } + +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && + MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ + + /* + * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV + */ + for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) { + if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) { + MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO ")); +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) { + MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV " + "during renegotiation")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } +#endif + ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; + break; + } + } + + /* + * Renegotiation security checks + */ + if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION && + ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake")); + handshake_failure = 1; + } +#if defined(MBEDTLS_SSL_RENEGOTIATION) + else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && + ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION && + renegotiation_info_seen == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)")); + handshake_failure = 1; + } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && + ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && + ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) { + MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed")); + handshake_failure = 1; + } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && + ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && + renegotiation_info_seen == 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)")); + handshake_failure = 1; + } +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + + if (handshake_failure == 1) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO; + } + + /* + * Search for a matching ciphersuite + * (At the end because we need information from the EC-based extensions + * and certificate from the SNI callback triggered by the SNI extension.) + */ + got_common_suite = 0; + ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver]; + ciphersuite_info = NULL; +#if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE) + for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) { + for (i = 0; ciphersuites[i] != 0; i++) { + if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) { + continue; + } + + got_common_suite = 1; + + if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i], + &ciphersuite_info)) != 0) { + return ret; + } + + if (ciphersuite_info != NULL) { + goto have_ciphersuite; + } + } + } +#else + for (i = 0; ciphersuites[i] != 0; i++) { + for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) { + if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) { + continue; + } + + got_common_suite = 1; + + if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i], + &ciphersuite_info)) != 0) { + return ret; + } + + if (ciphersuite_info != NULL) { + goto have_ciphersuite; + } + } + } +#endif + + if (got_common_suite) { + MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, " + "but none of them usable")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE; + } else { + MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + return MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN; + } + +have_ciphersuite: + MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name)); + + ssl->session_negotiate->ciphersuite = ciphersuites[i]; + ssl->handshake->ciphersuite_info = ciphersuite_info; + + ssl->state++; + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + mbedtls_ssl_recv_flight_completed(ssl); + } +#endif + + /* Debugging-only output for testsuite */ +#if defined(MBEDTLS_DEBUG_C) && \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info); + if (sig_alg != MBEDTLS_PK_NONE) { + mbedtls_md_type_t md_alg = mbedtls_ssl_sig_hash_set_find(&ssl->handshake->hash_algs, + sig_alg); + MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %d", + mbedtls_ssl_hash_from_md_alg(md_alg))); + } else { + MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm " + "%u - should not happen", (unsigned) sig_alg)); + } + } +#endif + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello")); + + return 0; +} + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) +static void ssl_write_truncated_hmac_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + size_t *olen) +{ + unsigned char *p = buf; + + if (ssl->session_negotiate->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED) { + *olen = 0; + return; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding truncated hmac extension")); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_TRUNCATED_HMAC, p, 0); + p += 2; + + *p++ = 0x00; + *p++ = 0x00; + + *olen = 4; +} +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) +static void ssl_write_cid_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + size_t *olen) +{ + unsigned char *p = buf; + size_t ext_len; + const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; + + *olen = 0; + + /* Skip writing the extension if we don't want to use it or if + * the client hasn't offered it. */ + if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) { + return; + } + + /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX + * which is at most 255, so the increment cannot overflow. */ + if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small")); + return; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension")); + + /* + * Quoting draft-ietf-tls-dtls-connection-id-05 + * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05 + * + * struct { + * opaque cid<0..2^8-1>; + * } ConnectionId; + */ + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0); + p += 2; + ext_len = (size_t) ssl->own_cid_len + 1; + MBEDTLS_PUT_UINT16_BE(ext_len, p, 0); + p += 2; + + *p++ = (uint8_t) ssl->own_cid_len; + memcpy(p, ssl->own_cid, ssl->own_cid_len); + + *olen = ssl->own_cid_len + 5; +} +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) +static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + size_t *olen) +{ + unsigned char *p = buf; + const mbedtls_ssl_ciphersuite_t *suite = NULL; + const mbedtls_cipher_info_t *cipher = NULL; + + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) { + ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED; + } + + /* + * RFC 7366: "If a server receives an encrypt-then-MAC request extension + * from a client and then selects a stream or Authenticated Encryption + * with Associated Data (AEAD) ciphersuite, it MUST NOT send an + * encrypt-then-MAC response extension back to the client." + */ + if ((suite = mbedtls_ssl_ciphersuite_from_id( + ssl->session_negotiate->ciphersuite)) == NULL || + (cipher = mbedtls_cipher_info_from_type(suite->cipher)) == NULL || + cipher->mode != MBEDTLS_MODE_CBC) { + ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED; + } + + if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) { + *olen = 0; + return; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension")); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0); + p += 2; + + *p++ = 0x00; + *p++ = 0x00; + + *olen = 4; +} +#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) +static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + size_t *olen) +{ + unsigned char *p = buf; + + if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED || + ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) { + *olen = 0; + return; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret " + "extension")); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0); + p += 2; + + *p++ = 0x00; + *p++ = 0x00; + + *olen = 4; +} +#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) +static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + size_t *olen) +{ + unsigned char *p = buf; + + if (ssl->handshake->new_session_ticket == 0) { + *olen = 0; + return; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension")); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0); + p += 2; + + *p++ = 0x00; + *p++ = 0x00; + + *olen = 4; +} +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + +static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + size_t *olen) +{ + unsigned char *p = buf; + + if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) { + *olen = 0; + return; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension")); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0); + p += 2; + +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) { + *p++ = 0x00; + *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF; + *p++ = ssl->verify_data_len * 2 & 0xFF; + + memcpy(p, ssl->peer_verify_data, ssl->verify_data_len); + p += ssl->verify_data_len; + memcpy(p, ssl->own_verify_data, ssl->verify_data_len); + p += ssl->verify_data_len; + } else +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + { + *p++ = 0x00; + *p++ = 0x01; + *p++ = 0x00; + } + + *olen = p - buf; +} + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) +static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + size_t *olen) +{ + unsigned char *p = buf; + + if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) { + *olen = 0; + return; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension")); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0); + p += 2; + + *p++ = 0x00; + *p++ = 1; + + *p++ = ssl->session_negotiate->mfl_code; + + *olen = 5; +} +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ + +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + size_t *olen) +{ + unsigned char *p = buf; + ((void) ssl); + + if ((ssl->handshake->cli_exts & + MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) { + *olen = 0; + return; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension")); + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0); + p += 2; + + *p++ = 0x00; + *p++ = 2; + + *p++ = 1; + *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED; + + *olen = 6; +} +#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + size_t *olen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *p = buf; + const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; + size_t kkpp_len; + + *olen = 0; + + /* Skip costly computation if not needed */ + if (ssl->handshake->ciphersuite_info->key_exchange != + MBEDTLS_KEY_EXCHANGE_ECJPAKE) { + return; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension")); + + if (end - p < 4) { + MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small")); + return; + } + + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0); + p += 2; + + ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx, + p + 2, end - p - 2, &kkpp_len, + ssl->conf->f_rng, ssl->conf->p_rng); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_one", ret); + return; + } + + MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0); + p += 2; + + *olen = kkpp_len + 4; +} +#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_SSL_ALPN) +static void ssl_write_alpn_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, size_t *olen) +{ + if (ssl->alpn_chosen == NULL) { + *olen = 0; + return; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding alpn extension")); + + /* + * 0 . 1 ext identifier + * 2 . 3 ext length + * 4 . 5 protocol list length + * 6 . 6 protocol name length + * 7 . 7+n protocol name + */ + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ALPN, buf, 0); + + *olen = 7 + strlen(ssl->alpn_chosen); + + MBEDTLS_PUT_UINT16_BE(*olen - 4, buf, 2); + + MBEDTLS_PUT_UINT16_BE(*olen - 6, buf, 4); + + buf[6] = MBEDTLS_BYTE_0(*olen - 7); + + memcpy(buf + 7, ssl->alpn_chosen, *olen - 7); +} +#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */ + +#if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS) +static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl, + unsigned char *buf, + size_t *olen) +{ + size_t mki_len = 0, ext_len = 0; + uint16_t profile_value = 0; + const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; + + *olen = 0; + + if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) || + (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) { + return; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension")); + + if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) { + mki_len = ssl->dtls_srtp_info.mki_len; + } + + /* The extension total size is 9 bytes : + * - 2 bytes for the extension tag + * - 2 bytes for the total size + * - 2 bytes for the protection profile length + * - 2 bytes for the protection profile + * - 1 byte for the mki length + * + the actual mki length + * Check we have enough room in the output buffer */ + if ((size_t) (end - buf) < mki_len + 9) { + MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small")); + return; + } + + /* extension */ + MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0); + /* + * total length 5 and mki value: only one profile(2 bytes) + * and length(2 bytes) and srtp_mki ) + */ + ext_len = 5 + mki_len; + MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2); + + /* protection profile length: 2 */ + buf[4] = 0x00; + buf[5] = 0x02; + profile_value = mbedtls_ssl_check_srtp_profile_value( + ssl->dtls_srtp_info.chosen_dtls_srtp_profile); + if (profile_value != MBEDTLS_TLS_SRTP_UNSET) { + MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6); + } else { + MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile")); + return; + } + + buf[8] = mki_len & 0xFF; + memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len); + + *olen = 9 + mki_len; +} +#endif /* MBEDTLS_SSL_DTLS_SRTP */ + +#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *p = ssl->out_msg + 4; + unsigned char *cookie_len_byte; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request")); + + /* + * struct { + * ProtocolVersion server_version; + * opaque cookie<0..2^8-1>; + * } HelloVerifyRequest; + */ + + /* The RFC is not clear on this point, but sending the actual negotiated + * version looks like the most interoperable thing to do. */ + mbedtls_ssl_write_version(ssl->major_ver, ssl->minor_ver, + ssl->conf->transport, p); + MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2); + p += 2; + + /* If we get here, f_cookie_check is not null */ + if (ssl->conf->f_cookie_write == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + /* Skip length byte until we know the length */ + cookie_len_byte = p++; + + if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie, + &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN, + ssl->cli_id, ssl->cli_id_len)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret); + return ret; + } + + *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1)); + + MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte); + + ssl->out_msglen = p - ssl->out_msg; + ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST; + + ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT; + + if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret); + return ret; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret); + return ret; + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request")); + + return 0; +} +#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ + +static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl) +{ + int ret; + mbedtls_ssl_session session_tmp; + mbedtls_ssl_session * const session = ssl->session_negotiate; + + /* Resume is 0 by default, see ssl_handshake_init(). + * It may be already set to 1 by ssl_parse_session_ticket_ext(). */ + if (ssl->handshake->resume == 1) { + return; + } + if (session->id_len == 0) { + return; + } + if (ssl->conf->f_get_cache == NULL) { + return; + } +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) { + return; + } +#endif + + mbedtls_ssl_session_init(&session_tmp); + + session_tmp.id_len = session->id_len; + memcpy(session_tmp.id, session->id, session->id_len); + + ret = ssl->conf->f_get_cache(ssl->conf->p_cache, + &session_tmp); + if (ret != 0) { + goto exit; + } + + if (session->ciphersuite != session_tmp.ciphersuite || + session->compression != session_tmp.compression) { + /* Mismatch between cached and negotiated session */ + goto exit; + } + + /* Move semantics */ + mbedtls_ssl_session_free(session); + *session = session_tmp; + memset(&session_tmp, 0, sizeof(session_tmp)); + + MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache")); + ssl->handshake->resume = 1; + +exit: + + mbedtls_ssl_session_free(&session_tmp); +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_server_hello(mbedtls_ssl_context *ssl) +{ +#if defined(MBEDTLS_HAVE_TIME) + mbedtls_time_t t; +#endif + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t olen, ext_len = 0, n; + unsigned char *buf, *p; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello")); + +#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + ssl->handshake->verify_cookie_len != 0) { + MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated")); + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello")); + + return ssl_write_hello_verify_request(ssl); + } +#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ + + if (ssl->conf->f_rng == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("no RNG provided")); + return MBEDTLS_ERR_SSL_NO_RNG; + } + + /* + * 0 . 0 handshake type + * 1 . 3 handshake length + * 4 . 5 protocol version + * 6 . 9 UNIX time() + * 10 . 37 random bytes + */ + buf = ssl->out_msg; + p = buf + 4; + + mbedtls_ssl_write_version(ssl->major_ver, ssl->minor_ver, + ssl->conf->transport, p); + p += 2; + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]", + buf[4], buf[5])); + +#if defined(MBEDTLS_HAVE_TIME) + t = mbedtls_time(NULL); + MBEDTLS_PUT_UINT32_BE(t, p, 0); + p += 4; + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG, + (long long) t)); +#else + if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) { + return ret; + } + + p += 4; +#endif /* MBEDTLS_HAVE_TIME */ + + if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 28)) != 0) { + return ret; + } + + p += 28; + + memcpy(ssl->handshake->randbytes + 32, buf + 6, 32); + + MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32); + + ssl_handle_id_based_session_resumption(ssl); + + if (ssl->handshake->resume == 0) { + /* + * New session, create a new session id, + * unless we're about to issue a session ticket + */ + ssl->state++; + +#if defined(MBEDTLS_HAVE_TIME) + ssl->session_negotiate->start = mbedtls_time(NULL); +#endif + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) + if (ssl->handshake->new_session_ticket != 0) { + ssl->session_negotiate->id_len = n = 0; + memset(ssl->session_negotiate->id, 0, 32); + } else +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + { + ssl->session_negotiate->id_len = n = 32; + if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id, + n)) != 0) { + return ret; + } + } + } else { + /* + * Resuming a session + */ + n = ssl->session_negotiate->id_len; + ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC; + + if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret); + return ret; + } + } + + /* + * 38 . 38 session id length + * 39 . 38+n session id + * 39+n . 40+n chosen ciphersuite + * 41+n . 41+n chosen compression alg. + * 42+n . 43+n extensions length + * 44+n . 43+n+m extensions + */ + *p++ = (unsigned char) ssl->session_negotiate->id_len; + memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len); + p += ssl->session_negotiate->id_len; + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n)); + MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 39, n); + MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed", + ssl->handshake->resume ? "a" : "no")); + + MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0); + p += 2; + *p++ = MBEDTLS_BYTE_0(ssl->session_negotiate->compression); + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s", + mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite))); + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X", + (unsigned int) ssl->session_negotiate->compression)); + + /* Do not write the extensions if the protocol is SSLv3 */ +#if defined(MBEDTLS_SSL_PROTO_SSL3) + if ((ssl->major_ver != 3) || (ssl->minor_ver != 0)) { +#endif + + /* + * First write extensions, then the total length + */ + ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen); + ext_len += olen; + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) + ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen); + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + ssl_write_truncated_hmac_ext(ssl, p + 2 + ext_len, &olen); + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen); + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen); + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) + ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen); + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) + ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen); + ext_len += olen; +#endif + +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + if (mbedtls_ssl_ciphersuite_uses_ec( + mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite))) { + ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen); + ext_len += olen; + } +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen); + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_ALPN) + ssl_write_alpn_ext(ssl, p + 2 + ext_len, &olen); + ext_len += olen; +#endif + +#if defined(MBEDTLS_SSL_DTLS_SRTP) + ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen); + ext_len += olen; +#endif + + MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET, + ext_len)); + + if (ext_len > 0) { + MBEDTLS_PUT_UINT16_BE(ext_len, p, 0); + p += 2 + ext_len; + } + +#if defined(MBEDTLS_SSL_PROTO_SSL3) +} +#endif + + ssl->out_msglen = p - buf; + ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO; + + ret = mbedtls_ssl_write_handshake_msg(ssl); + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello")); + + return ret; +} + +#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_certificate_request(mbedtls_ssl_context *ssl) +{ + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request")); + + if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request")); + ssl->state++; + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; +} +#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_certificate_request(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + uint16_t dn_size, total_dn_size; /* excluding length bytes */ + size_t ct_len, sa_len; /* including length bytes */ + unsigned char *buf, *p; + const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; + const mbedtls_x509_crt *crt; + int authmode; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request")); + + ssl->state++; + +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) + if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) { + authmode = ssl->handshake->sni_authmode; + } else +#endif + authmode = ssl->conf->authmode; + + if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) || + authmode == MBEDTLS_SSL_VERIFY_NONE) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request")); + return 0; + } + + /* + * 0 . 0 handshake type + * 1 . 3 handshake length + * 4 . 4 cert type count + * 5 .. m-1 cert types + * m .. m+1 sig alg length (TLS 1.2 only) + * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only) + * n .. n+1 length of all DNs + * n+2 .. n+3 length of DN 1 + * n+4 .. ... Distinguished Name #1 + * ... .. ... length of DN 2, etc. + */ + buf = ssl->out_msg; + p = buf + 4; + + /* + * Supported certificate types + * + * ClientCertificateType certificate_types<1..2^8-1>; + * enum { (255) } ClientCertificateType; + */ + ct_len = 0; + +#if defined(MBEDTLS_RSA_C) + p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN; +#endif +#if defined(MBEDTLS_ECDSA_C) + p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN; +#endif + + p[0] = (unsigned char) ct_len++; + p += ct_len; + + sa_len = 0; +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) + /* + * Add signature_algorithms for verify (TLS 1.2) + * + * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>; + * + * struct { + * HashAlgorithm hash; + * SignatureAlgorithm signature; + * } SignatureAndHashAlgorithm; + * + * enum { (255) } HashAlgorithm; + * enum { (255) } SignatureAlgorithm; + */ + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + const int *cur; + + /* + * Supported signature algorithms + */ + for (cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++) { + unsigned char hash = mbedtls_ssl_hash_from_md_alg(*cur); + + if (MBEDTLS_SSL_HASH_NONE == hash || mbedtls_ssl_set_calc_verify_md(ssl, hash)) { + continue; + } + +#if defined(MBEDTLS_RSA_C) + p[2 + sa_len++] = hash; + p[2 + sa_len++] = MBEDTLS_SSL_SIG_RSA; +#endif +#if defined(MBEDTLS_ECDSA_C) + p[2 + sa_len++] = hash; + p[2 + sa_len++] = MBEDTLS_SSL_SIG_ECDSA; +#endif + } + + MBEDTLS_PUT_UINT16_BE(sa_len, p, 0); + sa_len += 2; + p += sa_len; + } +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + + /* + * DistinguishedName certificate_authorities<0..2^16-1>; + * opaque DistinguishedName<1..2^16-1>; + */ + p += 2; + + total_dn_size = 0; + + if (ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) { + /* NOTE: If trusted certificates are provisioned + * via a CA callback (configured through + * `mbedtls_ssl_conf_ca_cb()`, then the + * CertificateRequest is currently left empty. */ + +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) + if (ssl->handshake->sni_ca_chain != NULL) { + crt = ssl->handshake->sni_ca_chain; + } else +#endif + crt = ssl->conf->ca_chain; + + while (crt != NULL && crt->version != 0) { + /* It follows from RFC 5280 A.1 that this length + * can be represented in at most 11 bits. */ + dn_size = (uint16_t) crt->subject_raw.len; + + if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) { + MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short")); + break; + } + + MBEDTLS_PUT_UINT16_BE(dn_size, p, 0); + p += 2; + memcpy(p, crt->subject_raw.p, dn_size); + p += dn_size; + + MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size); + + total_dn_size += 2 + dn_size; + crt = crt->next; + } + } + + ssl->out_msglen = p - buf; + ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST; + MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len); + + ret = mbedtls_ssl_write_handshake_msg(ssl); + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request")); + + return ret; +} +#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_pk_context *own_key = mbedtls_ssl_own_key(ssl); + + /* Check if the key is a transparent ECDH key. + * This also ensures that it is safe to call mbedtls_pk_ec(). */ + if (mbedtls_pk_get_type(own_key) != MBEDTLS_PK_ECKEY && + mbedtls_pk_get_type(own_key) != MBEDTLS_PK_ECKEY_DH) { + MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable")); + return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH; + } + + if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx, + mbedtls_pk_ec(*own_key), + MBEDTLS_ECDH_OURS)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret); + return ret; + } + + return 0; +} +#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || + MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \ + defined(MBEDTLS_SSL_ASYNC_PRIVATE) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl, + size_t *signature_len) +{ + /* Append the signature to ssl->out_msg, leaving 2 bytes for the + * signature length which will be added in ssl_write_server_key_exchange + * after the call to ssl_prepare_server_key_exchange. + * ssl_write_server_key_exchange also takes care of incrementing + * ssl->out_msglen. */ + unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2; + size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN + - sig_start); + int ret = ssl->conf->f_async_resume(ssl, + sig_start, signature_len, sig_max_len); + if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) { + ssl->handshake->async_in_progress = 0; + mbedtls_ssl_set_async_operation_data(ssl, NULL); + } + MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret); + return ret; +} +#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && + defined(MBEDTLS_SSL_ASYNC_PRIVATE) */ + +/* Prepare the ServerKeyExchange message, up to and including + * calculating the signature if any, but excluding formatting the + * signature and sending the message. */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl, + size_t *signature_len) +{ + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED) +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) + unsigned char *dig_signed = NULL; +#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */ +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */ + + (void) ciphersuite_info; /* unused in some configurations */ +#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) + (void) signature_len; +#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */ + + ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */ + + /* + * + * Part 1: Provide key exchange parameters for chosen ciphersuite. + * + */ + + /* + * - ECJPAKE key exchanges + */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + ret = mbedtls_ecjpake_write_round_two( + &ssl->handshake->ecjpake_ctx, + ssl->out_msg + ssl->out_msglen, + MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len, + ssl->conf->f_rng, ssl->conf->p_rng); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret); + return ret; + } + + ssl->out_msglen += len; + } +#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + + /* + * For (EC)DHE key exchanges with PSK, parameters are prefixed by support + * identity hint (RFC 4279, Sec. 3). Until someone needs this feature, + * we use empty support identity hints here. + **/ +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) { + ssl->out_msg[ssl->out_msglen++] = 0x00; + ssl->out_msg[ssl->out_msglen++] = 0x00; + } +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ + + /* + * - DHE key exchanges + */ +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED) + if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + /* + * Ephemeral DH parameters: + * + * struct { + * opaque dh_p<1..2^16-1>; + * opaque dh_g<1..2^16-1>; + * opaque dh_Ys<1..2^16-1>; + * } ServerDHParams; + */ + if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx, + &ssl->conf->dhm_P, + &ssl->conf->dhm_G)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret); + return ret; + } + + if ((ret = mbedtls_dhm_make_params( + &ssl->handshake->dhm_ctx, + (int) mbedtls_mpi_size(&ssl->handshake->dhm_ctx.P), + ssl->out_msg + ssl->out_msglen, &len, + ssl->conf->f_rng, ssl->conf->p_rng)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret); + return ret; + } + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) + dig_signed = ssl->out_msg + ssl->out_msglen; +#endif + + ssl->out_msglen += len; + + MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X); + MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P); + MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G); + MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX); + } +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */ + + /* + * - ECDHE key exchanges + */ +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED) + if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) { + /* + * Ephemeral ECDH parameters: + * + * struct { + * ECParameters curve_params; + * ECPoint public; + * } ServerECDHParams; + */ + const mbedtls_ecp_curve_info **curve = NULL; + const mbedtls_ecp_group_id *gid; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + /* Match our preference list against the offered curves */ + for (gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++) { + for (curve = ssl->handshake->curves; *curve != NULL; curve++) { + if ((*curve)->grp_id == *gid) { + goto curve_matching_done; + } + } + } + +curve_matching_done: + if (curve == NULL || *curve == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE")); + return MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s", (*curve)->name)); + + if ((ret = mbedtls_ecdh_setup(&ssl->handshake->ecdh_ctx, + (*curve)->grp_id)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecp_group_load", ret); + return ret; + } + + if ((ret = mbedtls_ecdh_make_params( + &ssl->handshake->ecdh_ctx, &len, + ssl->out_msg + ssl->out_msglen, + MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, + ssl->conf->f_rng, ssl->conf->p_rng)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_params", ret); + return ret; + } + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) + dig_signed = ssl->out_msg + ssl->out_msglen; +#endif + + ssl->out_msglen += len; + + MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx, + MBEDTLS_DEBUG_ECDH_Q); + } +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */ + + /* + * + * Part 2: For key exchanges involving the server signing the + * exchange parameters, compute and add the signature here. + * + */ +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) + if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) { + size_t dig_signed_len = ssl->out_msg + ssl->out_msglen - dig_signed; + size_t hashlen = 0; +#if defined(MBEDTLS_USE_PSA_CRYPTO) + unsigned char hash[PSA_HASH_MAX_SIZE]; +#else + unsigned char hash[MBEDTLS_MD_MAX_SIZE]; +#endif + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + /* + * 2.1: Choose hash algorithm: + * A: For TLS 1.2, obey signature-hash-algorithm extension + * to choose appropriate hash. + * B: For SSL3, TLS1.0, TLS1.1 and ECDHE_ECDSA, use SHA1 + * (RFC 4492, Sec. 5.4) + * C: Otherwise, use MD5 + SHA1 (RFC 4346, Sec. 7.4.3) + */ + + mbedtls_md_type_t md_alg; + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) + mbedtls_pk_type_t sig_alg = + mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info); + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + /* A: For TLS 1.2, obey signature-hash-algorithm extension + * (RFC 5246, Sec. 7.4.1.4.1). */ + if (sig_alg == MBEDTLS_PK_NONE || + (md_alg = mbedtls_ssl_sig_hash_set_find(&ssl->handshake->hash_algs, + sig_alg)) == MBEDTLS_MD_NONE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + /* (... because we choose a cipher suite + * only if there is a matching hash.) */ + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + } else +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA) { + /* B: Default hash SHA1 */ + md_alg = MBEDTLS_MD_SHA1; + } else +#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ + MBEDTLS_SSL_PROTO_TLS1_1 */ + { + /* C: MD5 + SHA1 */ + md_alg = MBEDTLS_MD_NONE; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg)); + + /* + * 2.2: Compute the hash to be signed + */ +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) + if (md_alg == MBEDTLS_MD_NONE) { + hashlen = 36; + ret = mbedtls_ssl_get_key_exchange_md_ssl_tls(ssl, hash, + dig_signed, + dig_signed_len); + if (ret != 0) { + return ret; + } + } else +#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ + MBEDTLS_SSL_PROTO_TLS1_1 */ +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (md_alg != MBEDTLS_MD_NONE) { + ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen, + dig_signed, + dig_signed_len, + md_alg); + if (ret != 0) { + return ret; + } + } else +#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ + MBEDTLS_SSL_PROTO_TLS1_2 */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen); + + /* + * 2.3: Compute and add the signature + */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + /* + * For TLS 1.2, we need to specify signature and hash algorithm + * explicitly through a prefix to the signature. + * + * struct { + * HashAlgorithm hash; + * SignatureAlgorithm signature; + * } SignatureAndHashAlgorithm; + * + * struct { + * SignatureAndHashAlgorithm algorithm; + * opaque signature<0..2^16-1>; + * } DigitallySigned; + * + */ + + ssl->out_msg[ssl->out_msglen++] = + mbedtls_ssl_hash_from_md_alg(md_alg); + ssl->out_msg[ssl->out_msglen++] = + mbedtls_ssl_sig_from_pk_alg(sig_alg); + } +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) + if (ssl->conf->f_async_sign_start != NULL) { + ret = ssl->conf->f_async_sign_start(ssl, + mbedtls_ssl_own_cert(ssl), + md_alg, hash, hashlen); + switch (ret) { + case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH: + /* act as if f_async_sign was null */ + break; + case 0: + ssl->handshake->async_in_progress = 1; + return ssl_resume_server_key_exchange(ssl, signature_len); + case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS: + ssl->handshake->async_in_progress = 1; + return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS; + default: + MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret); + return ret; + } + } +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ + + if (mbedtls_ssl_own_key(ssl) == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key")); + return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED; + } + + /* Append the signature to ssl->out_msg, leaving 2 bytes for the + * signature length which will be added in ssl_write_server_key_exchange + * after the call to ssl_prepare_server_key_exchange. + * ssl_write_server_key_exchange also takes care of incrementing + * ssl->out_msglen. */ + if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl), + md_alg, hash, hashlen, + ssl->out_msg + ssl->out_msglen + 2, + signature_len, + ssl->conf->f_rng, + ssl->conf->p_rng)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret); + return ret; + } + } +#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */ + + return 0; +} + +/* Prepare the ServerKeyExchange message and send it. For ciphersuites + * that do not include a ServerKeyExchange message, do nothing. Either + * way, if successful, move on to the next step in the SSL state + * machine. */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t signature_len = 0; +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED) + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */ + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange")); + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED) + /* Extract static ECDH parameters and abort if ServerKeyExchange + * is not needed. */ + if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) { + /* For suites involving ECDH, extract DH parameters + * from certificate at this point. */ +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED) + if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) { + ret = ssl_get_ecdh_params_from_cert(ssl); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret); + return ret; + } + } +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */ + + /* Key exchanges not involving ephemeral keys don't use + * ServerKeyExchange, so end here. */ + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange")); + ssl->state++; + return 0; + } +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \ + defined(MBEDTLS_SSL_ASYNC_PRIVATE) + /* If we have already prepared the message and there is an ongoing + * signature operation, resume signing. */ + if (ssl->handshake->async_in_progress != 0) { + MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation")); + ret = ssl_resume_server_key_exchange(ssl, &signature_len); + } else +#endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && + defined(MBEDTLS_SSL_ASYNC_PRIVATE) */ + { + /* ServerKeyExchange is needed. Prepare the message. */ + ret = ssl_prepare_server_key_exchange(ssl, &signature_len); + } + + if (ret != 0) { + /* If we're starting to write a new message, set ssl->out_msglen + * to 0. But if we're resuming after an asynchronous message, + * out_msglen is the amount of data written so far and mst be + * preserved. */ + if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)")); + } else { + ssl->out_msglen = 0; + } + return ret; + } + + /* If there is a signature, write its length. + * ssl_prepare_server_key_exchange already wrote the signature + * itself at its proper place in the output buffer. */ +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) + if (signature_len != 0) { + ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len); + ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len); + + MBEDTLS_SSL_DEBUG_BUF(3, "my signature", + ssl->out_msg + ssl->out_msglen, + signature_len); + + /* Skip over the already-written signature */ + ssl->out_msglen += signature_len; + } +#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */ + + /* Add header and send. */ + ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE; + + ssl->state++; + + if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange")); + return 0; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done")); + + ssl->out_msglen = 4; + ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE; + + ssl->state++; + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + mbedtls_ssl_send_flight_completed(ssl); + } +#endif + + if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret); + return ret; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret); + return ret; + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done")); + + return 0; +} + +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl, unsigned char **p, + const unsigned char *end) +{ + int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + size_t n; + + /* + * Receive G^Y mod P, premaster = (G^Y)^X mod P + */ + if (*p + 2 > end) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE; + } + + n = ((*p)[0] << 8) | (*p)[1]; + *p += 2; + + if (*p + n > end) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE; + } + + if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP; + } + + *p += n; + + MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY); + + return ret; +} +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) + +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl, + unsigned char *peer_pms, + size_t *peer_pmslen, + size_t peer_pmssize) +{ + int ret = ssl->conf->f_async_resume(ssl, + peer_pms, peer_pmslen, peer_pmssize); + if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) { + ssl->handshake->async_in_progress = 0; + mbedtls_ssl_set_async_operation_data(ssl, NULL); + } + MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret); + return ret; +} +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl, + const unsigned char *p, + const unsigned char *end, + unsigned char *peer_pms, + size_t *peer_pmslen, + size_t peer_pmssize) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl); + if (own_cert == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate")); + return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE; + } + mbedtls_pk_context *public_key = &own_cert->pk; + mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl); + size_t len = mbedtls_pk_get_len(public_key); + +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) + /* If we have already started decoding the message and there is an ongoing + * decryption operation, resume signing. */ + if (ssl->handshake->async_in_progress != 0) { + MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation")); + return ssl_resume_decrypt_pms(ssl, + peer_pms, peer_pmslen, peer_pmssize); + } +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ + + /* + * Prepare to decrypt the premaster using own private RSA key + */ +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0) { + if (p + 2 > end) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE; + } + if (*p++ != MBEDTLS_BYTE_1(len) || + *p++ != MBEDTLS_BYTE_0(len)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE; + } + } +#endif + + if (p + len != end) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE; + } + + /* + * Decrypt the premaster secret + */ +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) + if (ssl->conf->f_async_decrypt_start != NULL) { + ret = ssl->conf->f_async_decrypt_start(ssl, + mbedtls_ssl_own_cert(ssl), + p, len); + switch (ret) { + case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH: + /* act as if f_async_decrypt_start was null */ + break; + case 0: + ssl->handshake->async_in_progress = 1; + return ssl_resume_decrypt_pms(ssl, + peer_pms, + peer_pmslen, + peer_pmssize); + case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS: + ssl->handshake->async_in_progress = 1; + return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS; + default: + MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret); + return ret; + } + } +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ + + if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key")); + return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED; + } + + ret = mbedtls_pk_decrypt(private_key, p, len, + peer_pms, peer_pmslen, peer_pmssize, + ssl->conf->f_rng, ssl->conf->p_rng); + return ret; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl, + const unsigned char *p, + const unsigned char *end, + size_t pms_offset) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *pms = ssl->handshake->premaster + pms_offset; + unsigned char ver[2]; + unsigned char fake_pms[48], peer_pms[48]; + unsigned char mask; + size_t i, peer_pmslen; + unsigned int diff; + + /* In case of a failure in decryption, the decryption may write less than + * 2 bytes of output, but we always read the first two bytes. It doesn't + * matter in the end because diff will be nonzero in that case due to + * ret being nonzero, and we only care whether diff is 0. + * But do initialize peer_pms and peer_pmslen for robustness anyway. This + * also makes memory analyzers happy (don't access uninitialized memory, + * even if it's an unsigned char). */ + peer_pms[0] = peer_pms[1] = ~0; + peer_pmslen = 0; + + ret = ssl_decrypt_encrypted_pms(ssl, p, end, + peer_pms, + &peer_pmslen, + sizeof(peer_pms)); + +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) + if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) { + return ret; + } +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ + + mbedtls_ssl_write_version(ssl->handshake->max_major_ver, + ssl->handshake->max_minor_ver, + ssl->conf->transport, ver); + + /* Avoid data-dependent branches while checking for invalid + * padding, to protect against timing-based Bleichenbacher-type + * attacks. */ + diff = (unsigned int) ret; + diff |= peer_pmslen ^ 48; + diff |= peer_pms[0] ^ ver[0]; + diff |= peer_pms[1] ^ ver[1]; + + /* mask = diff ? 0xff : 0x00 using bit operations to avoid branches */ + mask = mbedtls_ct_uint_mask(diff); + + /* + * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding + * must not cause the connection to end immediately; instead, send a + * bad_record_mac later in the handshake. + * To protect against timing-based variants of the attack, we must + * not have any branch that depends on whether the decryption was + * successful. In particular, always generate the fake premaster secret, + * regardless of whether it will ultimately influence the output or not. + */ + ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms)); + if (ret != 0) { + /* It's ok to abort on an RNG failure, since this does not reveal + * anything about the RSA decryption. */ + return ret; + } + +#if defined(MBEDTLS_SSL_DEBUG_ALL) + if (diff != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message")); + } +#endif + + if (sizeof(ssl->handshake->premaster) < pms_offset || + sizeof(ssl->handshake->premaster) - pms_offset < 48) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + ssl->handshake->pmslen = 48; + + /* Set pms to either the true or the fake PMS, without + * data-dependent branches. */ + for (i = 0; i < ssl->handshake->pmslen; i++) { + pms[i] = (mask & fake_pms[i]) | ((~mask) & peer_pms[i]); + } + + return 0; +} +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p, + const unsigned char *end) +{ + int ret = 0; + uint16_t n; + + if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key")); + return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED; + } + + /* + * Receive client pre-shared key identity name + */ + if (end - *p < 2) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE; + } + + n = ((*p)[0] << 8) | (*p)[1]; + *p += 2; + + if (n == 0 || n > end - *p) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE; + } + + if (ssl->conf->f_psk != NULL) { + if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) { + ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY; + } + } else { + /* Identity is not a big secret since clients send it in the clear, + * but treat it carefully anyway, just in case */ + if (n != ssl->conf->psk_identity_len || + mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) { + ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY; + } + } + + if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) { + MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY); + return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY; + } + + *p += n; + + return 0; +} +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const mbedtls_ssl_ciphersuite_t *ciphersuite_info; + unsigned char *p, *end; + + ciphersuite_info = ssl->handshake->ciphersuite_info; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange")); + +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \ + (defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)) + if ((ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) && + (ssl->handshake->async_in_progress != 0)) { + /* We've already read a record and there is an asynchronous + * operation in progress to decrypt it. So skip reading the + * record. */ + MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record")); + } else +#endif + if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret); + return ret; + } + + p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl); + end = ssl->in_msg + ssl->in_hslen; + + if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE; + } + + if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE; + } + +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) { + if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret); + return ret; + } + + if (p != end) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE; + } + + if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx, + ssl->handshake->premaster, + MBEDTLS_PREMASTER_SIZE, + &ssl->handshake->pmslen, + ssl->conf->f_rng, ssl->conf->p_rng)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS; + } + + MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K); + } else +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA || + ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) { + if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx, + p, end - p)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP; + } + + MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx, + MBEDTLS_DEBUG_ECDH_QP); + + if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx, + &ssl->handshake->pmslen, + ssl->handshake->premaster, + MBEDTLS_MPI_MAX_SIZE, + ssl->conf->f_rng, ssl->conf->p_rng)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS; + } + + MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx, + MBEDTLS_DEBUG_ECDH_Z); + } else +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || + MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) { + if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret); + return ret; + } + + if (p != end) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + /* For opaque PSKs, we perform the PSK-to-MS derivation automatically + * and skip the intermediate PMS. */ + if (ssl_use_opaque_psk(ssl) == 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("skip PMS generation for opaque PSK")); + } else +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + if ((ret = mbedtls_ssl_psk_derive_premaster(ssl, + ciphersuite_info->key_exchange)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret); + return ret; + } + } else +#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) { +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) + if (ssl->handshake->async_in_progress != 0) { + /* There is an asynchronous operation in progress to + * decrypt the encrypted premaster secret, so skip + * directly to resuming this operation. */ + MBEDTLS_SSL_DEBUG_MSG(3, ("PSK identity already parsed")); + /* Update p to skip the PSK identity. ssl_parse_encrypted_pms + * won't actually use it, but maintain p anyway for robustness. */ + p += ssl->conf->psk_identity_len + 2; + } else +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ + if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret); + return ret; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + /* Opaque PSKs are currently only supported for PSK-only. */ + if (ssl_use_opaque_psk(ssl) == 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("opaque PSK not supported with RSA-PSK")); + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + } +#endif + + if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 2)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_encrypted_pms"), ret); + return ret; + } + + if ((ret = mbedtls_ssl_psk_derive_premaster(ssl, + ciphersuite_info->key_exchange)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret); + return ret; + } + } else +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) { + if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret); + return ret; + } + if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret); + return ret; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + /* Opaque PSKs are currently only supported for PSK-only. */ + if (ssl_use_opaque_psk(ssl) == 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("opaque PSK not supported with DHE-PSK")); + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + } +#endif + + if (p != end) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange")); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE; + } + + if ((ret = mbedtls_ssl_psk_derive_premaster(ssl, + ciphersuite_info->key_exchange)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret); + return ret; + } + } else +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) { + if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret); + return ret; + } + + if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx, + p, end - p)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret); + return MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP; + } + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + /* Opaque PSKs are currently only supported for PSK-only. */ + if (ssl_use_opaque_psk(ssl) == 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("opaque PSK not supported with ECDHE-PSK")); + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + } +#endif + + MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx, + MBEDTLS_DEBUG_ECDH_QP); + + if ((ret = mbedtls_ssl_psk_derive_premaster(ssl, + ciphersuite_info->key_exchange)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret); + return ret; + } + } else +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) { + if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret); + return ret; + } + } else +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) { + ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx, + p, end - p); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret); + return MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE; + } + + ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx, + ssl->handshake->premaster, 32, &ssl->handshake->pmslen, + ssl->conf->f_rng, ssl->conf->p_rng); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret); + return ret; + } + } else +#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret); + return ret; + } + + ssl->state++; + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange")); + + return 0; +} + +#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl) +{ + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify")); + + if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify")); + ssl->state++; + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; +} +#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + size_t i, sig_len; + unsigned char hash[48]; + unsigned char *hash_start = hash; + size_t hashlen; +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) + mbedtls_pk_type_t pk_alg; +#endif + mbedtls_md_type_t md_alg; + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + mbedtls_pk_context *peer_pk; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify")); + + if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify")); + ssl->state++; + return 0; + } + +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + if (ssl->session_negotiate->peer_cert == NULL) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify")); + ssl->state++; + return 0; + } +#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + if (ssl->session_negotiate->peer_cert_digest == NULL) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify")); + ssl->state++; + return 0; + } +#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + + /* Read the message without adding it to the checksum */ + ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */); + if (0 != ret) { + MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret); + return ret; + } + + ssl->state++; + + /* Process the message contents */ + if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE || + ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message")); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY; + } + + i = mbedtls_ssl_hs_hdr_len(ssl); + +#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + peer_pk = &ssl->handshake->peer_pubkey; +#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + if (ssl->session_negotiate->peer_cert == NULL) { + /* Should never happen */ + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + peer_pk = &ssl->session_negotiate->peer_cert->pk; +#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + + /* + * struct { + * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only + * opaque signature<0..2^16-1>; + * } DigitallySigned; + */ +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) + if (ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3) { + md_alg = MBEDTLS_MD_NONE; + hashlen = 36; + + /* For ECDSA, use SHA-1, not MD-5 + SHA-1 */ + if (mbedtls_pk_can_do(peer_pk, MBEDTLS_PK_ECDSA)) { + hash_start += 16; + hashlen -= 16; + md_alg = MBEDTLS_MD_SHA1; + } + } else +#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || + MBEDTLS_SSL_PROTO_TLS1_1 */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + if (i + 2 > ssl->in_hslen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message")); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY; + } + + /* + * Hash + */ + md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]); + + if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) { + MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg" + " for verify message")); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY; + } + +#if !defined(MBEDTLS_MD_SHA1) + if (MBEDTLS_MD_SHA1 == md_alg) { + hash_start += 16; + } +#endif + + /* Info from md_alg will be used instead */ + hashlen = 0; + + i++; + + /* + * Signature + */ + if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i])) + == MBEDTLS_PK_NONE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg" + " for verify message")); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY; + } + + /* + * Check the certificate's key type matches the signature alg + */ + if (!mbedtls_pk_can_do(peer_pk, pk_alg)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key")); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY; + } + + i++; + } else +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + if (i + 2 > ssl->in_hslen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message")); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY; + } + + sig_len = (ssl->in_msg[i] << 8) | ssl->in_msg[i+1]; + i += 2; + + if (i + sig_len != ssl->in_hslen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message")); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY; + } + + /* Calculate hash and verify signature */ + { + size_t dummy_hlen; + ssl->handshake->calc_verify(ssl, hash, &dummy_hlen); + } + + if ((ret = mbedtls_pk_verify(peer_pk, + md_alg, hash_start, hashlen, + ssl->in_msg + i, sig_len)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret); + return ret; + } + + mbedtls_ssl_update_handshake_status(ssl); + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify")); + + return ret; +} +#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */ + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t tlen; + uint32_t lifetime; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket")); + + ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET; + + /* + * struct { + * uint32 ticket_lifetime_hint; + * opaque ticket<0..2^16-1>; + * } NewSessionTicket; + * + * 4 . 7 ticket_lifetime_hint (0 = unspecified) + * 8 . 9 ticket_len (n) + * 10 . 9+n ticket content + */ + + if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket, + ssl->session_negotiate, + ssl->out_msg + 10, + ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN, + &tlen, &lifetime)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret); + tlen = 0; + } + + MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4); + MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8); + ssl->out_msglen = 10 + tlen; + + /* + * Morally equivalent to updating ssl->state, but NewSessionTicket and + * ChangeCipherSpec share the same state. + */ + ssl->handshake->new_session_ticket = 0; + + if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket")); + + return 0; +} +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + +/* + * SSL handshake -- server side -- single step + */ +int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl) +{ + int ret = 0; + + if (ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state)); + + if ((ret = mbedtls_ssl_flush_output(ssl)) != 0) { + return ret; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING) { + if ((ret = mbedtls_ssl_flight_transmit(ssl)) != 0) { + return ret; + } + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + switch (ssl->state) { + case MBEDTLS_SSL_HELLO_REQUEST: + ssl->state = MBEDTLS_SSL_CLIENT_HELLO; + break; + + /* + * <== ClientHello + */ + case MBEDTLS_SSL_CLIENT_HELLO: + ret = ssl_parse_client_hello(ssl); + break; + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT: + return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED; +#endif + + /* + * ==> ServerHello + * Certificate + * ( ServerKeyExchange ) + * ( CertificateRequest ) + * ServerHelloDone + */ + case MBEDTLS_SSL_SERVER_HELLO: + ret = ssl_write_server_hello(ssl); + break; + + case MBEDTLS_SSL_SERVER_CERTIFICATE: + ret = mbedtls_ssl_write_certificate(ssl); + break; + + case MBEDTLS_SSL_SERVER_KEY_EXCHANGE: + ret = ssl_write_server_key_exchange(ssl); + break; + + case MBEDTLS_SSL_CERTIFICATE_REQUEST: + ret = ssl_write_certificate_request(ssl); + break; + + case MBEDTLS_SSL_SERVER_HELLO_DONE: + ret = ssl_write_server_hello_done(ssl); + break; + + /* + * <== ( Certificate/Alert ) + * ClientKeyExchange + * ( CertificateVerify ) + * ChangeCipherSpec + * Finished + */ + case MBEDTLS_SSL_CLIENT_CERTIFICATE: + ret = mbedtls_ssl_parse_certificate(ssl); + break; + + case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE: + ret = ssl_parse_client_key_exchange(ssl); + break; + + case MBEDTLS_SSL_CERTIFICATE_VERIFY: + ret = ssl_parse_certificate_verify(ssl); + break; + + case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC: + ret = mbedtls_ssl_parse_change_cipher_spec(ssl); + break; + + case MBEDTLS_SSL_CLIENT_FINISHED: + ret = mbedtls_ssl_parse_finished(ssl); + break; + + /* + * ==> ( NewSessionTicket ) + * ChangeCipherSpec + * Finished + */ + case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC: +#if defined(MBEDTLS_SSL_SESSION_TICKETS) + if (ssl->handshake->new_session_ticket != 0) { + ret = ssl_write_new_session_ticket(ssl); + } else +#endif + ret = mbedtls_ssl_write_change_cipher_spec(ssl); + break; + + case MBEDTLS_SSL_SERVER_FINISHED: + ret = mbedtls_ssl_write_finished(ssl); + break; + + case MBEDTLS_SSL_FLUSH_BUFFERS: + MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done")); + ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; + break; + + case MBEDTLS_SSL_HANDSHAKE_WRAPUP: + mbedtls_ssl_handshake_wrapup(ssl); + break; + + default: + MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state)); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + return ret; +} +#endif /* MBEDTLS_SSL_SRV_C */ diff --git a/ext/opcua_client/mbedtls/library/ssl_ticket.c b/ext/opcua_client/mbedtls/library/ssl_ticket.c new file mode 100644 index 0000000..f910290 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ssl_ticket.c @@ -0,0 +1,416 @@ +/* + * TLS server tickets callbacks implementation + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_SSL_TICKET_C) + +#include "mbedtls/platform.h" + +#include "mbedtls/ssl_internal.h" +#include "mbedtls/ssl_ticket.h" +#include "mbedtls/error.h" +#include "mbedtls/platform_util.h" + +#include + +/* + * Initialize context + */ +void mbedtls_ssl_ticket_init(mbedtls_ssl_ticket_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_ssl_ticket_context)); + +#if defined(MBEDTLS_THREADING_C) + mbedtls_mutex_init(&ctx->mutex); +#endif +} + +#define MAX_KEY_BYTES 32 /* 256 bits */ + +#define TICKET_KEY_NAME_BYTES 4 +#define TICKET_IV_BYTES 12 +#define TICKET_CRYPT_LEN_BYTES 2 +#define TICKET_AUTH_TAG_BYTES 16 + +#define TICKET_MIN_LEN (TICKET_KEY_NAME_BYTES + \ + TICKET_IV_BYTES + \ + TICKET_CRYPT_LEN_BYTES + \ + TICKET_AUTH_TAG_BYTES) +#define TICKET_ADD_DATA_LEN (TICKET_KEY_NAME_BYTES + \ + TICKET_IV_BYTES + \ + TICKET_CRYPT_LEN_BYTES) + +/* + * Generate/update a key + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_ticket_gen_key(mbedtls_ssl_ticket_context *ctx, + unsigned char index) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char buf[MAX_KEY_BYTES]; + mbedtls_ssl_ticket_key *key = ctx->keys + index; + +#if defined(MBEDTLS_HAVE_TIME) + key->generation_time = (uint32_t) mbedtls_time(NULL); +#endif + + if ((ret = ctx->f_rng(ctx->p_rng, key->name, sizeof(key->name))) != 0) { + return ret; + } + + if ((ret = ctx->f_rng(ctx->p_rng, buf, sizeof(buf))) != 0) { + return ret; + } + + /* With GCM and CCM, same context can encrypt & decrypt */ + ret = mbedtls_cipher_setkey(&key->ctx, buf, + mbedtls_cipher_get_key_bitlen(&key->ctx), + MBEDTLS_ENCRYPT); + + mbedtls_platform_zeroize(buf, sizeof(buf)); + + return ret; +} + +/* + * Rotate/generate keys if necessary + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_ticket_update_keys(mbedtls_ssl_ticket_context *ctx) +{ +#if !defined(MBEDTLS_HAVE_TIME) + ((void) ctx); +#else + if (ctx->ticket_lifetime != 0) { + uint32_t current_time = (uint32_t) mbedtls_time(NULL); + uint32_t key_time = ctx->keys[ctx->active].generation_time; + + if (current_time >= key_time && + current_time - key_time < ctx->ticket_lifetime) { + return 0; + } + + ctx->active = 1 - ctx->active; + + return ssl_ticket_gen_key(ctx, ctx->active); + } else +#endif /* MBEDTLS_HAVE_TIME */ + return 0; +} + +/* + * Setup context for actual use + */ +int mbedtls_ssl_ticket_setup(mbedtls_ssl_ticket_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, + mbedtls_cipher_type_t cipher, + uint32_t lifetime) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const mbedtls_cipher_info_t *cipher_info; + + ctx->f_rng = f_rng; + ctx->p_rng = p_rng; + + ctx->ticket_lifetime = lifetime; + + cipher_info = mbedtls_cipher_info_from_type(cipher); + if (cipher_info == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (cipher_info->mode != MBEDTLS_MODE_GCM && + cipher_info->mode != MBEDTLS_MODE_CCM) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (cipher_info->key_bitlen > 8 * MAX_KEY_BYTES) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + int do_mbedtls_cipher_setup = 1; +#if defined(MBEDTLS_USE_PSA_CRYPTO) + ret = mbedtls_cipher_setup_psa(&ctx->keys[0].ctx, + cipher_info, TICKET_AUTH_TAG_BYTES); + + switch (ret) { + case 0: + do_mbedtls_cipher_setup = 0; + break; + case MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE: + /* We don't yet expect to support all ciphers through PSA, + * so allow fallback to ordinary mbedtls_cipher_setup(). */ + do_mbedtls_cipher_setup = 1; + break; + default: + return ret; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + if (do_mbedtls_cipher_setup) { + if ((ret = mbedtls_cipher_setup(&ctx->keys[0].ctx, cipher_info)) + != 0) { + return ret; + } + } + + do_mbedtls_cipher_setup = 1; +#if defined(MBEDTLS_USE_PSA_CRYPTO) + do_mbedtls_cipher_setup = 0; + + ret = mbedtls_cipher_setup_psa(&ctx->keys[1].ctx, + cipher_info, TICKET_AUTH_TAG_BYTES); + if (ret != 0 && ret != MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) { + return ret; + } + if (ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) { + do_mbedtls_cipher_setup = 1; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + if (do_mbedtls_cipher_setup) { + if ((ret = mbedtls_cipher_setup(&ctx->keys[1].ctx, cipher_info)) + != 0) { + return ret; + } + } + + if ((ret = ssl_ticket_gen_key(ctx, 0)) != 0 || + (ret = ssl_ticket_gen_key(ctx, 1)) != 0) { + return ret; + } + + return 0; +} + +/* + * Create session ticket, with the following structure: + * + * struct { + * opaque key_name[4]; + * opaque iv[12]; + * opaque encrypted_state<0..2^16-1>; + * opaque tag[16]; + * } ticket; + * + * The key_name, iv, and length of encrypted_state are the additional + * authenticated data. + */ + +int mbedtls_ssl_ticket_write(void *p_ticket, + const mbedtls_ssl_session *session, + unsigned char *start, + const unsigned char *end, + size_t *tlen, + uint32_t *ticket_lifetime) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ssl_ticket_context *ctx = p_ticket; + mbedtls_ssl_ticket_key *key; + unsigned char *key_name = start; + unsigned char *iv = start + TICKET_KEY_NAME_BYTES; + unsigned char *state_len_bytes = iv + TICKET_IV_BYTES; + unsigned char *state = state_len_bytes + TICKET_CRYPT_LEN_BYTES; + size_t clear_len, ciph_len; + + *tlen = 0; + + if (ctx == NULL || ctx->f_rng == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + /* We need at least 4 bytes for key_name, 12 for IV, 2 for len 16 for tag, + * in addition to session itself, that will be checked when writing it. */ + MBEDTLS_SSL_CHK_BUF_PTR(start, end, TICKET_MIN_LEN); + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&ctx->mutex)) != 0) { + return ret; + } +#endif + + if ((ret = ssl_ticket_update_keys(ctx)) != 0) { + goto cleanup; + } + + key = &ctx->keys[ctx->active]; + + *ticket_lifetime = ctx->ticket_lifetime; + + memcpy(key_name, key->name, TICKET_KEY_NAME_BYTES); + + if ((ret = ctx->f_rng(ctx->p_rng, iv, TICKET_IV_BYTES)) != 0) { + goto cleanup; + } + + /* Dump session state */ + if ((ret = mbedtls_ssl_session_save(session, + state, end - state, + &clear_len)) != 0 || + (unsigned long) clear_len > 65535) { + goto cleanup; + } + MBEDTLS_PUT_UINT16_BE(clear_len, state_len_bytes, 0); + + /* Encrypt and authenticate */ + if ((ret = mbedtls_cipher_auth_encrypt_ext(&key->ctx, + iv, TICKET_IV_BYTES, + /* Additional data: key name, IV and length */ + key_name, TICKET_ADD_DATA_LEN, + state, clear_len, + state, end - state, &ciph_len, + TICKET_AUTH_TAG_BYTES)) != 0) { + goto cleanup; + } + if (ciph_len != clear_len + TICKET_AUTH_TAG_BYTES) { + ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; + goto cleanup; + } + + *tlen = TICKET_MIN_LEN + ciph_len - TICKET_AUTH_TAG_BYTES; + +cleanup: +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&ctx->mutex) != 0) { + return MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } +#endif + + return ret; +} + +/* + * Select key based on name + */ +static mbedtls_ssl_ticket_key *ssl_ticket_select_key( + mbedtls_ssl_ticket_context *ctx, + const unsigned char name[4]) +{ + unsigned char i; + + for (i = 0; i < sizeof(ctx->keys) / sizeof(*ctx->keys); i++) { + if (memcmp(name, ctx->keys[i].name, 4) == 0) { + return &ctx->keys[i]; + } + } + + return NULL; +} + +/* + * Load session ticket (see mbedtls_ssl_ticket_write for structure) + */ +int mbedtls_ssl_ticket_parse(void *p_ticket, + mbedtls_ssl_session *session, + unsigned char *buf, + size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_ssl_ticket_context *ctx = p_ticket; + mbedtls_ssl_ticket_key *key; + unsigned char *key_name = buf; + unsigned char *iv = buf + TICKET_KEY_NAME_BYTES; + unsigned char *enc_len_p = iv + TICKET_IV_BYTES; + unsigned char *ticket = enc_len_p + TICKET_CRYPT_LEN_BYTES; + size_t enc_len, clear_len; + + if (ctx == NULL || ctx->f_rng == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (len < TICKET_MIN_LEN) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&ctx->mutex)) != 0) { + return ret; + } +#endif + + if ((ret = ssl_ticket_update_keys(ctx)) != 0) { + goto cleanup; + } + + enc_len = (enc_len_p[0] << 8) | enc_len_p[1]; + + if (len != TICKET_MIN_LEN + enc_len) { + ret = MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + goto cleanup; + } + + /* Select key */ + if ((key = ssl_ticket_select_key(ctx, key_name)) == NULL) { + /* We can't know for sure but this is a likely option unless we're + * under attack - this is only informative anyway */ + ret = MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED; + goto cleanup; + } + + /* Decrypt and authenticate */ + if ((ret = mbedtls_cipher_auth_decrypt_ext(&key->ctx, + iv, TICKET_IV_BYTES, + /* Additional data: key name, IV and length */ + key_name, TICKET_ADD_DATA_LEN, + ticket, enc_len + TICKET_AUTH_TAG_BYTES, + ticket, enc_len, &clear_len, + TICKET_AUTH_TAG_BYTES)) != 0) { + if (ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED) { + ret = MBEDTLS_ERR_SSL_INVALID_MAC; + } + + goto cleanup; + } + if (clear_len != enc_len) { + ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; + goto cleanup; + } + + /* Actually load session */ + if ((ret = mbedtls_ssl_session_load(session, ticket, clear_len)) != 0) { + goto cleanup; + } + +#if defined(MBEDTLS_HAVE_TIME) + { + /* Check for expiration */ + mbedtls_time_t current_time = mbedtls_time(NULL); + + if (current_time < session->start || + (uint32_t) (current_time - session->start) > ctx->ticket_lifetime) { + ret = MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED; + goto cleanup; + } + } +#endif + +cleanup: +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&ctx->mutex) != 0) { + return MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } +#endif + + return ret; +} + +/* + * Free context + */ +void mbedtls_ssl_ticket_free(mbedtls_ssl_ticket_context *ctx) +{ + mbedtls_cipher_free(&ctx->keys[0].ctx); + mbedtls_cipher_free(&ctx->keys[1].ctx); + +#if defined(MBEDTLS_THREADING_C) + mbedtls_mutex_free(&ctx->mutex); +#endif + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_ssl_ticket_context)); +} + +#endif /* MBEDTLS_SSL_TICKET_C */ diff --git a/ext/opcua_client/mbedtls/library/ssl_tls.c b/ext/opcua_client/mbedtls/library/ssl_tls.c new file mode 100644 index 0000000..73f9c7f --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ssl_tls.c @@ -0,0 +1,7728 @@ +/* + * SSLv3/TLSv1 shared functions + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The SSL 3.0 specification was drafted by Netscape in 1996, + * and became an IETF standard in 1999. + * + * http://wp.netscape.com/eng/ssl3/ + * http://www.ietf.org/rfc/rfc2246.txt + * http://www.ietf.org/rfc/rfc4346.txt + */ + +#include "common.h" + +#if defined(MBEDTLS_SSL_TLS_C) + +#include "mbedtls/platform.h" + +#include "mbedtls/ssl.h" +#include "mbedtls/ssl_internal.h" +#include "mbedtls/debug.h" +#include "mbedtls/error.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/version.h" +#include "mbedtls/constant_time.h" + +#include + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "mbedtls/psa_util.h" +#include "psa/crypto.h" +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +#include "mbedtls/oid.h" +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + +/* A magic value for `ssl->hostname` indicating that + * mbedtls_ssl_set_hostname() has been called with `NULL`. + * If mbedtls_ssl_set_hostname() has never been called on `ssl`, then + * `ssl->hostname == NULL`. */ +static const char *const ssl_hostname_skip_cn_verification = ""; + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) +/** Whether mbedtls_ssl_set_hostname() has been called. + * + * \param[in] ssl SSL context + * + * \return \c 1 if mbedtls_ssl_set_hostname() has been called on \p ssl + * (including `mbedtls_ssl_set_hostname(ssl, NULL)`), + * otherwise \c 0. + */ +static int mbedtls_ssl_has_set_hostname_been_called( + const mbedtls_ssl_context *ssl) +{ + return ssl->hostname != NULL; +} +#endif + +const char *mbedtls_ssl_get_hostname_pointer(const mbedtls_ssl_context *ssl) +{ + if (ssl->hostname == ssl_hostname_skip_cn_verification) { + return NULL; + } + return ssl->hostname; +} + +static void mbedtls_ssl_free_hostname(mbedtls_ssl_context *ssl) +{ + if (ssl->hostname != NULL && + ssl->hostname != ssl_hostname_skip_cn_verification) { + mbedtls_platform_zeroize(ssl->hostname, strlen(ssl->hostname)); + mbedtls_free(ssl->hostname); + } + ssl->hostname = NULL; +} + +int mbedtls_ssl_set_hostname(mbedtls_ssl_context *ssl, const char *hostname) +{ + /* Initialize to suppress unnecessary compiler warning */ + size_t hostname_len = 0; + + /* Check if new hostname is valid before + * making any change to current one */ + if (hostname != NULL) { + hostname_len = strlen(hostname); + + if (hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + } + + /* Now it's clear that we will overwrite the old hostname, + * so we can free it safely */ + mbedtls_ssl_free_hostname(ssl); + + if (hostname == NULL) { + /* Passing NULL as hostname clears the old one, but leaves a + * special marker to indicate that mbedtls_ssl_set_hostname() + * has been called. */ + /* ssl->hostname should be const, but isn't. We won't actually + * write to the buffer, so it's ok to cast away the const. */ + ssl->hostname = (char *) ssl_hostname_skip_cn_verification; + } else { + ssl->hostname = mbedtls_calloc(1, hostname_len + 1); + if (ssl->hostname == NULL) { + /* mbedtls_ssl_set_hostname() has been called, but unsuccessfully. + * Leave ssl->hostname in the same state as if the function had + * not been called, i.e. a null pointer. */ + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + memcpy(ssl->hostname, hostname, hostname_len); + + ssl->hostname[hostname_len] = '\0'; + } + + return 0; +} +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) +/* Top-level Connection ID API */ + +int mbedtls_ssl_conf_cid(mbedtls_ssl_config *conf, + size_t len, + int ignore_other_cid) +{ + if (len > MBEDTLS_SSL_CID_IN_LEN_MAX) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_FAIL && + ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_IGNORE) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + conf->ignore_unexpected_cid = ignore_other_cid; + conf->cid_len = len; + return 0; +} + +int mbedtls_ssl_set_cid(mbedtls_ssl_context *ssl, + int enable, + unsigned char const *own_cid, + size_t own_cid_len) +{ + if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + ssl->negotiate_cid = enable; + if (enable == MBEDTLS_SSL_CID_DISABLED) { + MBEDTLS_SSL_DEBUG_MSG(3, ("Disable use of CID extension.")); + return 0; + } + MBEDTLS_SSL_DEBUG_MSG(3, ("Enable use of CID extension.")); + MBEDTLS_SSL_DEBUG_BUF(3, "Own CID", own_cid, own_cid_len); + + if (own_cid_len != ssl->conf->cid_len) { + MBEDTLS_SSL_DEBUG_MSG(3, ("CID length %u does not match CID length %u in config", + (unsigned) own_cid_len, + (unsigned) ssl->conf->cid_len)); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + memcpy(ssl->own_cid, own_cid, own_cid_len); + /* Truncation is not an issue here because + * MBEDTLS_SSL_CID_IN_LEN_MAX at most 255. */ + ssl->own_cid_len = (uint8_t) own_cid_len; + + return 0; +} + +int mbedtls_ssl_get_peer_cid(mbedtls_ssl_context *ssl, + int *enabled, + unsigned char peer_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX], + size_t *peer_cid_len) +{ + *enabled = MBEDTLS_SSL_CID_DISABLED; + + if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM || + ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + /* We report MBEDTLS_SSL_CID_DISABLED in case the CID extensions + * were used, but client and server requested the empty CID. + * This is indistinguishable from not using the CID extension + * in the first place. */ + if (ssl->transform_in->in_cid_len == 0 && + ssl->transform_in->out_cid_len == 0) { + return 0; + } + + if (peer_cid_len != NULL) { + *peer_cid_len = ssl->transform_in->out_cid_len; + if (peer_cid != NULL) { + memcpy(peer_cid, ssl->transform_in->out_cid, + ssl->transform_in->out_cid_len); + } + } + + *enabled = MBEDTLS_SSL_CID_ENABLED; + + return 0; +} +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) +/* + * Convert max_fragment_length codes to length. + * RFC 6066 says: + * enum{ + * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255) + * } MaxFragmentLength; + * and we add 0 -> extension unused + */ +static unsigned int ssl_mfl_code_to_length(int mfl) +{ + switch (mfl) { + case MBEDTLS_SSL_MAX_FRAG_LEN_NONE: + return MBEDTLS_TLS_EXT_ADV_CONTENT_LEN; + case MBEDTLS_SSL_MAX_FRAG_LEN_512: + return 512; + case MBEDTLS_SSL_MAX_FRAG_LEN_1024: + return 1024; + case MBEDTLS_SSL_MAX_FRAG_LEN_2048: + return 2048; + case MBEDTLS_SSL_MAX_FRAG_LEN_4096: + return 4096; + default: + return MBEDTLS_TLS_EXT_ADV_CONTENT_LEN; + } +} +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ + +int mbedtls_ssl_session_copy(mbedtls_ssl_session *dst, + const mbedtls_ssl_session *src) +{ + mbedtls_ssl_session_free(dst); + memcpy(dst, src, sizeof(mbedtls_ssl_session)); + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) + dst->ticket = NULL; +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + if (src->peer_cert != NULL) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + dst->peer_cert = mbedtls_calloc(1, sizeof(mbedtls_x509_crt)); + if (dst->peer_cert == NULL) { + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + mbedtls_x509_crt_init(dst->peer_cert); + + if ((ret = mbedtls_x509_crt_parse_der(dst->peer_cert, src->peer_cert->raw.p, + src->peer_cert->raw.len)) != 0) { + mbedtls_free(dst->peer_cert); + dst->peer_cert = NULL; + return ret; + } + } +#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + if (src->peer_cert_digest != NULL) { + dst->peer_cert_digest = + mbedtls_calloc(1, src->peer_cert_digest_len); + if (dst->peer_cert_digest == NULL) { + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + memcpy(dst->peer_cert_digest, src->peer_cert_digest, + src->peer_cert_digest_len); + dst->peer_cert_digest_type = src->peer_cert_digest_type; + dst->peer_cert_digest_len = src->peer_cert_digest_len; + } +#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) + if (src->ticket != NULL) { + dst->ticket = mbedtls_calloc(1, src->ticket_len); + if (dst->ticket == NULL) { + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + memcpy(dst->ticket, src->ticket, src->ticket_len); + } +#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ + + return 0; +} + +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) +MBEDTLS_CHECK_RETURN_CRITICAL +static int resize_buffer(unsigned char **buffer, size_t len_new, size_t *len_old) +{ + unsigned char *resized_buffer = mbedtls_calloc(1, len_new); + if (resized_buffer == NULL) { + return -1; + } + + /* We want to copy len_new bytes when downsizing the buffer, and + * len_old bytes when upsizing, so we choose the smaller of two sizes, + * to fit one buffer into another. Size checks, ensuring that no data is + * lost, are done outside of this function. */ + memcpy(resized_buffer, *buffer, + (len_new < *len_old) ? len_new : *len_old); + mbedtls_platform_zeroize(*buffer, *len_old); + mbedtls_free(*buffer); + + *buffer = resized_buffer; + *len_old = len_new; + + return 0; +} + +static void handle_buffer_resizing(mbedtls_ssl_context *ssl, int downsizing, + size_t in_buf_new_len, + size_t out_buf_new_len) +{ + int modified = 0; + size_t written_in = 0, iv_offset_in = 0, len_offset_in = 0; + size_t written_out = 0, iv_offset_out = 0, len_offset_out = 0; + if (ssl->in_buf != NULL) { + written_in = ssl->in_msg - ssl->in_buf; + iv_offset_in = ssl->in_iv - ssl->in_buf; + len_offset_in = ssl->in_len - ssl->in_buf; + if (downsizing ? + ssl->in_buf_len > in_buf_new_len && ssl->in_left < in_buf_new_len : + ssl->in_buf_len < in_buf_new_len) { + if (resize_buffer(&ssl->in_buf, in_buf_new_len, &ssl->in_buf_len) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("input buffer resizing failed - out of memory")); + } else { + MBEDTLS_SSL_DEBUG_MSG(2, ("Reallocating in_buf to %" MBEDTLS_PRINTF_SIZET, + in_buf_new_len)); + modified = 1; + } + } + } + + if (ssl->out_buf != NULL) { + written_out = ssl->out_msg - ssl->out_buf; + iv_offset_out = ssl->out_iv - ssl->out_buf; + len_offset_out = ssl->out_len - ssl->out_buf; + if (downsizing ? + ssl->out_buf_len > out_buf_new_len && ssl->out_left < out_buf_new_len : + ssl->out_buf_len < out_buf_new_len) { + if (resize_buffer(&ssl->out_buf, out_buf_new_len, &ssl->out_buf_len) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("output buffer resizing failed - out of memory")); + } else { + MBEDTLS_SSL_DEBUG_MSG(2, ("Reallocating out_buf to %" MBEDTLS_PRINTF_SIZET, + out_buf_new_len)); + modified = 1; + } + } + } + if (modified) { + /* Update pointers here to avoid doing it twice. */ + mbedtls_ssl_reset_in_out_pointers(ssl); + /* Fields below might not be properly updated with record + * splitting or with CID, so they are manually updated here. */ + ssl->out_msg = ssl->out_buf + written_out; + ssl->out_len = ssl->out_buf + len_offset_out; + ssl->out_iv = ssl->out_buf + iv_offset_out; + + ssl->in_msg = ssl->in_buf + written_in; + ssl->in_len = ssl->in_buf + len_offset_in; + ssl->in_iv = ssl->in_buf + iv_offset_in; + } +} +#endif /* MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH */ + +/* + * Key material generation + */ +#if defined(MBEDTLS_SSL_PROTO_SSL3) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl3_prf(const unsigned char *secret, size_t slen, + const char *label, + const unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen) +{ + int ret = 0; + size_t i; + mbedtls_md5_context md5; + mbedtls_sha1_context sha1; + unsigned char padding[16]; + unsigned char sha1sum[20]; + ((void) label); + + mbedtls_md5_init(&md5); + mbedtls_sha1_init(&sha1); + + /* + * SSLv3: + * block = + * MD5( secret + SHA1( 'A' + secret + random ) ) + + * MD5( secret + SHA1( 'BB' + secret + random ) ) + + * MD5( secret + SHA1( 'CCC' + secret + random ) ) + + * ... + */ + for (i = 0; i < dlen / 16; i++) { + memset(padding, (unsigned char) ('A' + i), 1 + i); + + if ((ret = mbedtls_sha1_starts_ret(&sha1)) != 0) { + goto exit; + } + if ((ret = mbedtls_sha1_update_ret(&sha1, padding, 1 + i)) != 0) { + goto exit; + } + if ((ret = mbedtls_sha1_update_ret(&sha1, secret, slen)) != 0) { + goto exit; + } + if ((ret = mbedtls_sha1_update_ret(&sha1, random, rlen)) != 0) { + goto exit; + } + if ((ret = mbedtls_sha1_finish_ret(&sha1, sha1sum)) != 0) { + goto exit; + } + + if ((ret = mbedtls_md5_starts_ret(&md5)) != 0) { + goto exit; + } + if ((ret = mbedtls_md5_update_ret(&md5, secret, slen)) != 0) { + goto exit; + } + if ((ret = mbedtls_md5_update_ret(&md5, sha1sum, 20)) != 0) { + goto exit; + } + if ((ret = mbedtls_md5_finish_ret(&md5, dstbuf + i * 16)) != 0) { + goto exit; + } + } + +exit: + mbedtls_md5_free(&md5); + mbedtls_sha1_free(&sha1); + + mbedtls_platform_zeroize(padding, sizeof(padding)); + mbedtls_platform_zeroize(sha1sum, sizeof(sha1sum)); + + return ret; +} +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ + +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) +MBEDTLS_CHECK_RETURN_CRITICAL +static int tls1_prf(const unsigned char *secret, size_t slen, + const char *label, + const unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen) +{ + size_t nb, hs; + size_t i, j, k; + const unsigned char *S1, *S2; + unsigned char *tmp; + size_t tmp_len = 0; + unsigned char h_i[20]; + const mbedtls_md_info_t *md_info; + mbedtls_md_context_t md_ctx; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + mbedtls_md_init(&md_ctx); + + tmp_len = 20 + strlen(label) + rlen; + tmp = mbedtls_calloc(1, tmp_len); + if (tmp == NULL) { + ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; + goto exit; + } + + hs = (slen + 1) / 2; + S1 = secret; + S2 = secret + slen - hs; + + nb = strlen(label); + memcpy(tmp + 20, label, nb); + memcpy(tmp + 20 + nb, random, rlen); + nb += rlen; + + /* + * First compute P_md5(secret,label+random)[0..dlen] + */ + if ((md_info = mbedtls_md_info_from_type(MBEDTLS_MD_MD5)) == NULL) { + ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; + goto exit; + } + + if ((ret = mbedtls_md_setup(&md_ctx, md_info, 1)) != 0) { + goto exit; + } + + ret = mbedtls_md_hmac_starts(&md_ctx, S1, hs); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_update(&md_ctx, tmp + 20, nb); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_finish(&md_ctx, 4 + tmp); + if (ret != 0) { + goto exit; + } + + for (i = 0; i < dlen; i += 16) { + ret = mbedtls_md_hmac_reset(&md_ctx); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_update(&md_ctx, 4 + tmp, 16 + nb); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_finish(&md_ctx, h_i); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_md_hmac_reset(&md_ctx); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_update(&md_ctx, 4 + tmp, 16); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_finish(&md_ctx, 4 + tmp); + if (ret != 0) { + goto exit; + } + + k = (i + 16 > dlen) ? dlen % 16 : 16; + + for (j = 0; j < k; j++) { + dstbuf[i + j] = h_i[j]; + } + } + + mbedtls_md_free(&md_ctx); + + /* + * XOR out with P_sha1(secret,label+random)[0..dlen] + */ + if ((md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1)) == NULL) { + ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; + goto exit; + } + + if ((ret = mbedtls_md_setup(&md_ctx, md_info, 1)) != 0) { + goto exit; + } + + ret = mbedtls_md_hmac_starts(&md_ctx, S2, hs); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_update(&md_ctx, tmp + 20, nb); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_finish(&md_ctx, tmp); + if (ret != 0) { + goto exit; + } + + for (i = 0; i < dlen; i += 20) { + ret = mbedtls_md_hmac_reset(&md_ctx); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_update(&md_ctx, tmp, 20 + nb); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_finish(&md_ctx, h_i); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_md_hmac_reset(&md_ctx); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_update(&md_ctx, tmp, 20); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_finish(&md_ctx, tmp); + if (ret != 0) { + goto exit; + } + + k = (i + 20 > dlen) ? dlen % 20 : 20; + + for (j = 0; j < k; j++) { + dstbuf[i + j] = (unsigned char) (dstbuf[i + j] ^ h_i[j]); + } + } + +exit: + mbedtls_md_free(&md_ctx); + + mbedtls_platform_zeroize(tmp, tmp_len); + mbedtls_platform_zeroize(h_i, sizeof(h_i)); + + mbedtls_free(tmp); + return ret; +} +#endif /* MBEDTLS_SSL_PROTO_TLS1) || MBEDTLS_SSL_PROTO_TLS1_1 */ + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +static int mbedtls_ssl_md_error_from_psa(psa_status_t status) +{ + switch (status) { + case PSA_ERROR_NOT_SUPPORTED: + return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE; + case PSA_ERROR_BAD_STATE: /* Intentional fallthrough */ + case PSA_ERROR_BUFFER_TOO_SMALL: + return MBEDTLS_ERR_MD_BAD_INPUT_DATA; + case PSA_ERROR_INSUFFICIENT_MEMORY: + return MBEDTLS_ERR_MD_ALLOC_FAILED; + default: + return MBEDTLS_ERR_MD_HW_ACCEL_FAILED; + } +} +#endif + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_USE_PSA_CRYPTO) + +static psa_status_t setup_psa_key_derivation(psa_key_derivation_operation_t *derivation, + psa_key_id_t key, + psa_algorithm_t alg, + const unsigned char *seed, size_t seed_length, + const unsigned char *label, size_t label_length, + size_t capacity) +{ + psa_status_t status; + + status = psa_key_derivation_setup(derivation, alg); + if (status != PSA_SUCCESS) { + return status; + } + + if (PSA_ALG_IS_TLS12_PRF(alg) || PSA_ALG_IS_TLS12_PSK_TO_MS(alg)) { + status = psa_key_derivation_input_bytes(derivation, + PSA_KEY_DERIVATION_INPUT_SEED, + seed, seed_length); + if (status != PSA_SUCCESS) { + return status; + } + + if (mbedtls_svc_key_id_is_null(key)) { + status = psa_key_derivation_input_bytes( + derivation, PSA_KEY_DERIVATION_INPUT_SECRET, + NULL, 0); + } else { + status = psa_key_derivation_input_key( + derivation, PSA_KEY_DERIVATION_INPUT_SECRET, key); + } + if (status != PSA_SUCCESS) { + return status; + } + + status = psa_key_derivation_input_bytes(derivation, + PSA_KEY_DERIVATION_INPUT_LABEL, + label, label_length); + if (status != PSA_SUCCESS) { + return status; + } + } else { + return PSA_ERROR_NOT_SUPPORTED; + } + + status = psa_key_derivation_set_capacity(derivation, capacity); + if (status != PSA_SUCCESS) { + return status; + } + + return PSA_SUCCESS; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int tls_prf_generic(mbedtls_md_type_t md_type, + const unsigned char *secret, size_t slen, + const char *label, + const unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen) +{ + psa_status_t status; + psa_algorithm_t alg; + psa_key_id_t master_key = MBEDTLS_SVC_KEY_ID_INIT; + psa_key_derivation_operation_t derivation = + PSA_KEY_DERIVATION_OPERATION_INIT; + + if (md_type == MBEDTLS_MD_SHA384) { + alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_384); + } else { + alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_256); + } + + /* Normally a "secret" should be long enough to be impossible to + * find by brute force, and in particular should not be empty. But + * this PRF is also used to derive an IV, in particular in EAP-TLS, + * and for this use case it makes sense to have a 0-length "secret". + * Since the key API doesn't allow importing a key of length 0, + * keep master_key=0, which setup_psa_key_derivation() understands + * to mean a 0-length "secret" input. */ + if (slen != 0) { + psa_key_attributes_t key_attributes = psa_key_attributes_init(); + psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE); + psa_set_key_algorithm(&key_attributes, alg); + psa_set_key_type(&key_attributes, PSA_KEY_TYPE_DERIVE); + + status = psa_import_key(&key_attributes, secret, slen, &master_key); + if (status != PSA_SUCCESS) { + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + } + + status = setup_psa_key_derivation(&derivation, + master_key, alg, + random, rlen, + (unsigned char const *) label, + (size_t) strlen(label), + dlen); + if (status != PSA_SUCCESS) { + psa_key_derivation_abort(&derivation); + psa_destroy_key(master_key); + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + + status = psa_key_derivation_output_bytes(&derivation, dstbuf, dlen); + if (status != PSA_SUCCESS) { + psa_key_derivation_abort(&derivation); + psa_destroy_key(master_key); + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + + status = psa_key_derivation_abort(&derivation); + if (status != PSA_SUCCESS) { + psa_destroy_key(master_key); + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + + if (!mbedtls_svc_key_id_is_null(master_key)) { + status = psa_destroy_key(master_key); + } + if (status != PSA_SUCCESS) { + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + + return 0; +} + +#else /* MBEDTLS_USE_PSA_CRYPTO */ + +MBEDTLS_CHECK_RETURN_CRITICAL +static int tls_prf_generic(mbedtls_md_type_t md_type, + const unsigned char *secret, size_t slen, + const char *label, + const unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen) +{ + size_t nb; + size_t i, j, k, md_len; + unsigned char *tmp; + size_t tmp_len = 0; + unsigned char h_i[MBEDTLS_MD_MAX_SIZE]; + const mbedtls_md_info_t *md_info; + mbedtls_md_context_t md_ctx; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + mbedtls_md_init(&md_ctx); + + if ((md_info = mbedtls_md_info_from_type(md_type)) == NULL) { + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + md_len = mbedtls_md_get_size(md_info); + + tmp_len = md_len + strlen(label) + rlen; + tmp = mbedtls_calloc(1, tmp_len); + if (tmp == NULL) { + ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; + goto exit; + } + + nb = strlen(label); + memcpy(tmp + md_len, label, nb); + memcpy(tmp + md_len + nb, random, rlen); + nb += rlen; + + /* + * Compute P_(secret, label + random)[0..dlen] + */ + if ((ret = mbedtls_md_setup(&md_ctx, md_info, 1)) != 0) { + goto exit; + } + + ret = mbedtls_md_hmac_starts(&md_ctx, secret, slen); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_update(&md_ctx, tmp + md_len, nb); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_finish(&md_ctx, tmp); + if (ret != 0) { + goto exit; + } + + for (i = 0; i < dlen; i += md_len) { + ret = mbedtls_md_hmac_reset(&md_ctx); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_update(&md_ctx, tmp, md_len + nb); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_finish(&md_ctx, h_i); + if (ret != 0) { + goto exit; + } + + ret = mbedtls_md_hmac_reset(&md_ctx); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_update(&md_ctx, tmp, md_len); + if (ret != 0) { + goto exit; + } + ret = mbedtls_md_hmac_finish(&md_ctx, tmp); + if (ret != 0) { + goto exit; + } + + k = (i + md_len > dlen) ? dlen % md_len : md_len; + + for (j = 0; j < k; j++) { + dstbuf[i + j] = h_i[j]; + } + } + +exit: + mbedtls_md_free(&md_ctx); + + if (tmp != NULL) { + mbedtls_platform_zeroize(tmp, tmp_len); + } + + mbedtls_platform_zeroize(h_i, sizeof(h_i)); + + mbedtls_free(tmp); + + return ret; +} +#endif /* MBEDTLS_USE_PSA_CRYPTO */ +#if defined(MBEDTLS_SHA256_C) +MBEDTLS_CHECK_RETURN_CRITICAL +static int tls_prf_sha256(const unsigned char *secret, size_t slen, + const char *label, + const unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen) +{ + return tls_prf_generic(MBEDTLS_MD_SHA256, secret, slen, + label, random, rlen, dstbuf, dlen); +} +#endif /* MBEDTLS_SHA256_C */ + +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) +MBEDTLS_CHECK_RETURN_CRITICAL +static int tls_prf_sha384(const unsigned char *secret, size_t slen, + const char *label, + const unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen) +{ + return tls_prf_generic(MBEDTLS_MD_SHA384, secret, slen, + label, random, rlen, dstbuf, dlen); +} +#endif /* MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384 */ +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + +static void ssl_update_checksum_start(mbedtls_ssl_context *, const unsigned char *, size_t); + +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) +static void ssl_update_checksum_md5sha1(mbedtls_ssl_context *, const unsigned char *, size_t); +#endif + +#if defined(MBEDTLS_SSL_PROTO_SSL3) +static void ssl_calc_verify_ssl(const mbedtls_ssl_context *, unsigned char *, size_t *); +static int ssl_calc_finished_ssl(mbedtls_ssl_context *, unsigned char *, int); +#endif + +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) +static void ssl_calc_verify_tls(const mbedtls_ssl_context *, unsigned char *, size_t *); +static int ssl_calc_finished_tls(mbedtls_ssl_context *, unsigned char *, int); +#endif + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_SHA256_C) +static void ssl_update_checksum_sha256(mbedtls_ssl_context *, const unsigned char *, size_t); +static void ssl_calc_verify_tls_sha256(const mbedtls_ssl_context *, unsigned char *, size_t *); +static int ssl_calc_finished_tls_sha256(mbedtls_ssl_context *, unsigned char *, int); +#endif + +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) +static void ssl_update_checksum_sha384(mbedtls_ssl_context *, const unsigned char *, size_t); +static void ssl_calc_verify_tls_sha384(const mbedtls_ssl_context *, unsigned char *, size_t *); +static int ssl_calc_finished_tls_sha384(mbedtls_ssl_context *, unsigned char *, int); +#endif +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + +#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) && \ + defined(MBEDTLS_USE_PSA_CRYPTO) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_use_opaque_psk(mbedtls_ssl_context const *ssl) +{ + if (ssl->conf->f_psk != NULL) { + /* If we've used a callback to select the PSK, + * the static configuration is irrelevant. */ + if (!mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque)) { + return 1; + } + + return 0; + } + + if (!mbedtls_svc_key_id_is_null(ssl->conf->psk_opaque)) { + return 1; + } + + return 0; +} +#endif /* MBEDTLS_USE_PSA_CRYPTO && + MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ + +#if defined(MBEDTLS_SSL_EXPORT_KEYS) +static mbedtls_tls_prf_types tls_prf_get_type(mbedtls_ssl_tls_prf_cb *tls_prf) +{ +#if defined(MBEDTLS_SSL_PROTO_SSL3) + if (tls_prf == ssl3_prf) { + return MBEDTLS_SSL_TLS_PRF_SSL3; + } else +#endif +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) + if (tls_prf == tls1_prf) { + return MBEDTLS_SSL_TLS_PRF_TLS1; + } else +#endif +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) + if (tls_prf == tls_prf_sha384) { + return MBEDTLS_SSL_TLS_PRF_SHA384; + } else +#endif +#if defined(MBEDTLS_SHA256_C) + if (tls_prf == tls_prf_sha256) { + return MBEDTLS_SSL_TLS_PRF_SHA256; + } else +#endif +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + return MBEDTLS_SSL_TLS_PRF_NONE; +} +#endif /* MBEDTLS_SSL_EXPORT_KEYS */ + +int mbedtls_ssl_tls_prf(const mbedtls_tls_prf_types prf, + const unsigned char *secret, size_t slen, + const char *label, + const unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen) +{ + mbedtls_ssl_tls_prf_cb *tls_prf = NULL; + + switch (prf) { +#if defined(MBEDTLS_SSL_PROTO_SSL3) + case MBEDTLS_SSL_TLS_PRF_SSL3: + tls_prf = ssl3_prf; + break; +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) + case MBEDTLS_SSL_TLS_PRF_TLS1: + tls_prf = tls1_prf; + break; +#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) + case MBEDTLS_SSL_TLS_PRF_SHA384: + tls_prf = tls_prf_sha384; + break; +#endif /* MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384 */ +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_SSL_TLS_PRF_SHA256: + tls_prf = tls_prf_sha256; + break; +#endif /* MBEDTLS_SHA256_C */ +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + default: + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + } + + return tls_prf(secret, slen, label, random, rlen, dstbuf, dlen); +} + +/* Type for the TLS PRF */ +typedef int ssl_tls_prf_t(const unsigned char *, size_t, const char *, + const unsigned char *, size_t, + unsigned char *, size_t); + +/* + * Populate a transform structure with session keys and all the other + * necessary information. + * + * Parameters: + * - [in/out]: transform: structure to populate + * [in] must be just initialised with mbedtls_ssl_transform_init() + * [out] fully populated, ready for use by mbedtls_ssl_{en,de}crypt_buf() + * - [in] ciphersuite + * - [in] master + * - [in] encrypt_then_mac + * - [in] trunc_hmac + * - [in] compression + * - [in] tls_prf: pointer to PRF to use for key derivation + * - [in] randbytes: buffer holding ServerHello.random + ClientHello.random + * - [in] minor_ver: SSL/TLS minor version + * - [in] endpoint: client or server + * - [in] ssl: optionally used for: + * - MBEDTLS_SSL_HW_RECORD_ACCEL: whole context (non-const) + * - MBEDTLS_SSL_EXPORT_KEYS: ssl->conf->{f,p}_export_keys + * - MBEDTLS_DEBUG_C: ssl->conf->{f,p}_dbg + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_populate_transform(mbedtls_ssl_transform *transform, + int ciphersuite, + const unsigned char master[48], +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + int encrypt_then_mac, +#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + int trunc_hmac, +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ +#if defined(MBEDTLS_ZLIB_SUPPORT) + int compression, +#endif + ssl_tls_prf_t tls_prf, + const unsigned char randbytes[64], + int minor_ver, + unsigned endpoint, +#if !defined(MBEDTLS_SSL_HW_RECORD_ACCEL) + const +#endif + mbedtls_ssl_context *ssl) +{ + int ret = 0; +#if defined(MBEDTLS_USE_PSA_CRYPTO) + int psa_fallthrough; +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + int do_mbedtls_cipher_setup; + unsigned char keyblk[256]; + unsigned char *key1; + unsigned char *key2; + unsigned char *mac_enc; + unsigned char *mac_dec; + size_t mac_key_len = 0; + size_t iv_copy_len; + unsigned keylen; + const mbedtls_ssl_ciphersuite_t *ciphersuite_info; + const mbedtls_cipher_info_t *cipher_info; + const mbedtls_md_info_t *md_info; + +#if !defined(MBEDTLS_SSL_HW_RECORD_ACCEL) && \ + !defined(MBEDTLS_SSL_EXPORT_KEYS) && \ + !defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) && \ + !defined(MBEDTLS_DEBUG_C) + (void) ssl; /* ssl is unused except for those cases */ +#endif + + /* + * Some data just needs copying into the structure + */ +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \ + defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) + transform->encrypt_then_mac = encrypt_then_mac; +#endif + transform->minor_ver = minor_ver; + +#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION) + memcpy(transform->randbytes, randbytes, sizeof(transform->randbytes)); +#endif + + /* + * Get various info structures + */ + ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(ciphersuite); + if (ciphersuite_info == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("ciphersuite info for %d not found", + ciphersuite)); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + cipher_info = mbedtls_cipher_info_from_type(ciphersuite_info->cipher); + if (cipher_info == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("cipher info for %u not found", + ciphersuite_info->cipher)); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + md_info = mbedtls_md_info_from_type(ciphersuite_info->mac); + if (md_info == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("mbedtls_md info for %u not found", + (unsigned) ciphersuite_info->mac)); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + /* Copy own and peer's CID if the use of the CID + * extension has been negotiated. */ + if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_ENABLED) { + MBEDTLS_SSL_DEBUG_MSG(3, ("Copy CIDs into SSL transform")); + + transform->in_cid_len = ssl->own_cid_len; + memcpy(transform->in_cid, ssl->own_cid, ssl->own_cid_len); + MBEDTLS_SSL_DEBUG_BUF(3, "Incoming CID", transform->in_cid, + transform->in_cid_len); + + transform->out_cid_len = ssl->handshake->peer_cid_len; + memcpy(transform->out_cid, ssl->handshake->peer_cid, + ssl->handshake->peer_cid_len); + MBEDTLS_SSL_DEBUG_BUF(3, "Outgoing CID", transform->out_cid, + transform->out_cid_len); + } +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + + /* + * Compute key block using the PRF + */ + ret = tls_prf(master, 48, "key expansion", randbytes, 64, keyblk, 256); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "prf", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite = %s", + mbedtls_ssl_get_ciphersuite_name(ciphersuite))); + MBEDTLS_SSL_DEBUG_BUF(3, "master secret", master, 48); + MBEDTLS_SSL_DEBUG_BUF(4, "random bytes", randbytes, 64); + MBEDTLS_SSL_DEBUG_BUF(4, "key block", keyblk, 256); + + /* + * Determine the appropriate key, IV and MAC length. + */ + + keylen = cipher_info->key_bitlen / 8; + +#if defined(MBEDTLS_GCM_C) || \ + defined(MBEDTLS_CCM_C) || \ + defined(MBEDTLS_CHACHAPOLY_C) + if (cipher_info->mode == MBEDTLS_MODE_GCM || + cipher_info->mode == MBEDTLS_MODE_CCM || + cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY) { + size_t explicit_ivlen; + + transform->maclen = 0; + mac_key_len = 0; + transform->taglen = + ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16; + + /* All modes haves 96-bit IVs, but the length of the static parts vary + * with mode and version: + * - For GCM and CCM in TLS 1.2, there's a static IV of 4 Bytes + * (to be concatenated with a dynamically chosen IV of 8 Bytes) + * - For ChaChaPoly in TLS 1.2, and all modes in TLS 1.3, there's + * a static IV of 12 Bytes (to be XOR'ed with the 8 Byte record + * sequence number). + */ + transform->ivlen = 12; +#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) + if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_4) { + transform->fixed_ivlen = 12; + } else +#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ + { + if (cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY) { + transform->fixed_ivlen = 12; + } else { + transform->fixed_ivlen = 4; + } + } + + /* Minimum length of encrypted record */ + explicit_ivlen = transform->ivlen - transform->fixed_ivlen; + transform->minlen = explicit_ivlen + transform->taglen; + } else +#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */ +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) + if (cipher_info->mode == MBEDTLS_MODE_STREAM || + cipher_info->mode == MBEDTLS_MODE_CBC) { + /* Initialize HMAC contexts */ + if ((ret = mbedtls_md_setup(&transform->md_ctx_enc, md_info, 1)) != 0 || + (ret = mbedtls_md_setup(&transform->md_ctx_dec, md_info, 1)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_setup", ret); + goto end; + } + + /* Get MAC length */ + mac_key_len = mbedtls_md_get_size(md_info); + transform->maclen = mac_key_len; + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + /* + * If HMAC is to be truncated, we shall keep the leftmost bytes, + * (rfc 6066 page 13 or rfc 2104 section 4), + * so we only need to adjust the length here. + */ + if (trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED) { + transform->maclen = MBEDTLS_SSL_TRUNCATED_HMAC_LEN; + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT) + /* Fall back to old, non-compliant version of the truncated + * HMAC implementation which also truncates the key + * (Mbed TLS versions from 1.3 to 2.6.0) */ + mac_key_len = transform->maclen; +#endif + } +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ + + /* IV length */ + transform->ivlen = cipher_info->iv_size; + + /* Minimum length */ + if (cipher_info->mode == MBEDTLS_MODE_STREAM) { + transform->minlen = transform->maclen; + } else { + /* + * GenericBlockCipher: + * 1. if EtM is in use: one block plus MAC + * otherwise: * first multiple of blocklen greater than maclen + * 2. IV except for SSL3 and TLS 1.0 + */ +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + if (encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) { + transform->minlen = transform->maclen + + cipher_info->block_size; + } else +#endif + { + transform->minlen = transform->maclen + + cipher_info->block_size + - transform->maclen % cipher_info->block_size; + } + +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) + if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 || + minor_ver == MBEDTLS_SSL_MINOR_VERSION_1) { + ; /* No need to adjust minlen */ + } else +#endif +#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_2 || + minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + transform->minlen += transform->ivlen; + } else +#endif + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; + goto end; + } + } + } else +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + MBEDTLS_SSL_DEBUG_MSG(3, ("keylen: %u, minlen: %u, ivlen: %u, maclen: %u", + (unsigned) keylen, + (unsigned) transform->minlen, + (unsigned) transform->ivlen, + (unsigned) transform->maclen)); + + /* + * Finally setup the cipher contexts, IVs and MAC secrets. + */ +#if defined(MBEDTLS_SSL_CLI_C) + if (endpoint == MBEDTLS_SSL_IS_CLIENT) { + key1 = keyblk + mac_key_len * 2; + key2 = keyblk + mac_key_len * 2 + keylen; + + mac_enc = keyblk; + mac_dec = keyblk + mac_key_len; + + /* + * This is not used in TLS v1.1. + */ + iv_copy_len = (transform->fixed_ivlen) ? + transform->fixed_ivlen : transform->ivlen; + memcpy(transform->iv_enc, key2 + keylen, iv_copy_len); + memcpy(transform->iv_dec, key2 + keylen + iv_copy_len, + iv_copy_len); + } else +#endif /* MBEDTLS_SSL_CLI_C */ +#if defined(MBEDTLS_SSL_SRV_C) + if (endpoint == MBEDTLS_SSL_IS_SERVER) { + key1 = keyblk + mac_key_len * 2 + keylen; + key2 = keyblk + mac_key_len * 2; + + mac_enc = keyblk + mac_key_len; + mac_dec = keyblk; + + /* + * This is not used in TLS v1.1. + */ + iv_copy_len = (transform->fixed_ivlen) ? + transform->fixed_ivlen : transform->ivlen; + memcpy(transform->iv_dec, key1 + keylen, iv_copy_len); + memcpy(transform->iv_enc, key1 + keylen + iv_copy_len, + iv_copy_len); + } else +#endif /* MBEDTLS_SSL_SRV_C */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; + goto end; + } + +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) +#if defined(MBEDTLS_SSL_PROTO_SSL3) + if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) { + if (mac_key_len > sizeof(transform->mac_enc)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; + goto end; + } + + memcpy(transform->mac_enc, mac_enc, mac_key_len); + memcpy(transform->mac_dec, mac_dec, mac_key_len); + } else +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1) { + /* For HMAC-based ciphersuites, initialize the HMAC transforms. + For AEAD-based ciphersuites, there is nothing to do here. */ + if (mac_key_len != 0) { + ret = mbedtls_md_hmac_starts(&transform->md_ctx_enc, + mac_enc, mac_key_len); + if (ret != 0) { + goto end; + } + ret = mbedtls_md_hmac_starts(&transform->md_ctx_dec, + mac_dec, mac_key_len); + if (ret != 0) { + goto end; + } + } + } else +#endif + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; + goto end; + } +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ + +#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) + if (mbedtls_ssl_hw_record_init != NULL) { + ret = 0; + + MBEDTLS_SSL_DEBUG_MSG(2, ("going for mbedtls_ssl_hw_record_init()")); + + if ((ret = mbedtls_ssl_hw_record_init(ssl, key1, key2, keylen, + transform->iv_enc, transform->iv_dec, + iv_copy_len, + mac_enc, mac_dec, + mac_key_len)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_hw_record_init", ret); + ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + goto end; + } + } +#else + ((void) mac_dec); + ((void) mac_enc); +#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ + +#if defined(MBEDTLS_SSL_EXPORT_KEYS) + if (ssl->conf->f_export_keys != NULL) { + ssl->conf->f_export_keys(ssl->conf->p_export_keys, + master, keyblk, + mac_key_len, keylen, + iv_copy_len); + } + + if (ssl->conf->f_export_keys_ext != NULL) { + ssl->conf->f_export_keys_ext(ssl->conf->p_export_keys, + master, keyblk, + mac_key_len, keylen, + iv_copy_len, + randbytes + 32, + randbytes, + tls_prf_get_type(tls_prf)); + } +#endif + + do_mbedtls_cipher_setup = 1; +#if defined(MBEDTLS_USE_PSA_CRYPTO) + + /* Only use PSA-based ciphers for TLS-1.2. + * That's relevant at least for TLS-1.0, where + * we assume that mbedtls_cipher_crypt() updates + * the structure field for the IV, which the PSA-based + * implementation currently doesn't. */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + ret = mbedtls_cipher_setup_psa(&transform->cipher_ctx_enc, + cipher_info, transform->taglen); + if (ret != 0 && ret != MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup_psa", ret); + goto end; + } + + if (ret == 0) { + MBEDTLS_SSL_DEBUG_MSG(3, ("Successfully setup PSA-based encryption cipher context")); + psa_fallthrough = 0; + } else { + MBEDTLS_SSL_DEBUG_MSG(1, + ( + "Failed to setup PSA-based cipher context for record encryption - fall through to default setup.")); + psa_fallthrough = 1; + } + } else { + psa_fallthrough = 1; + } +#else + psa_fallthrough = 1; +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + + if (psa_fallthrough == 0) { + do_mbedtls_cipher_setup = 0; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + if (do_mbedtls_cipher_setup && + (ret = mbedtls_cipher_setup(&transform->cipher_ctx_enc, + cipher_info)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup", ret); + goto end; + } + + do_mbedtls_cipher_setup = 1; +#if defined(MBEDTLS_USE_PSA_CRYPTO) + /* Only use PSA-based ciphers for TLS-1.2. + * That's relevant at least for TLS-1.0, where + * we assume that mbedtls_cipher_crypt() updates + * the structure field for the IV, which the PSA-based + * implementation currently doesn't. */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + ret = mbedtls_cipher_setup_psa(&transform->cipher_ctx_dec, + cipher_info, transform->taglen); + if (ret != 0 && ret != MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup_psa", ret); + goto end; + } + + if (ret == 0) { + MBEDTLS_SSL_DEBUG_MSG(3, ("Successfully setup PSA-based decryption cipher context")); + psa_fallthrough = 0; + } else { + MBEDTLS_SSL_DEBUG_MSG(1, + ( + "Failed to setup PSA-based cipher context for record decryption - fall through to default setup.")); + psa_fallthrough = 1; + } + } else { + psa_fallthrough = 1; + } +#else + psa_fallthrough = 1; +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + + if (psa_fallthrough == 0) { + do_mbedtls_cipher_setup = 0; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + if (do_mbedtls_cipher_setup && + (ret = mbedtls_cipher_setup(&transform->cipher_ctx_dec, + cipher_info)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup", ret); + goto end; + } + + if ((ret = mbedtls_cipher_setkey(&transform->cipher_ctx_enc, key1, + cipher_info->key_bitlen, + MBEDTLS_ENCRYPT)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setkey", ret); + goto end; + } + + if ((ret = mbedtls_cipher_setkey(&transform->cipher_ctx_dec, key2, + cipher_info->key_bitlen, + MBEDTLS_DECRYPT)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setkey", ret); + goto end; + } + +#if defined(MBEDTLS_CIPHER_MODE_CBC) + if (cipher_info->mode == MBEDTLS_MODE_CBC) { + if ((ret = mbedtls_cipher_set_padding_mode(&transform->cipher_ctx_enc, + MBEDTLS_PADDING_NONE)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_set_padding_mode", ret); + goto end; + } + + if ((ret = mbedtls_cipher_set_padding_mode(&transform->cipher_ctx_dec, + MBEDTLS_PADDING_NONE)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_set_padding_mode", ret); + goto end; + } + } +#endif /* MBEDTLS_CIPHER_MODE_CBC */ + + + /* Initialize Zlib contexts */ +#if defined(MBEDTLS_ZLIB_SUPPORT) + if (compression == MBEDTLS_SSL_COMPRESS_DEFLATE) { + MBEDTLS_SSL_DEBUG_MSG(3, ("Initializing zlib states")); + + memset(&transform->ctx_deflate, 0, sizeof(transform->ctx_deflate)); + memset(&transform->ctx_inflate, 0, sizeof(transform->ctx_inflate)); + + if (deflateInit(&transform->ctx_deflate, + Z_DEFAULT_COMPRESSION) != Z_OK || + inflateInit(&transform->ctx_inflate) != Z_OK) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Failed to initialize compression")); + ret = MBEDTLS_ERR_SSL_COMPRESSION_FAILED; + goto end; + } + } +#endif /* MBEDTLS_ZLIB_SUPPORT */ + +end: + mbedtls_platform_zeroize(keyblk, sizeof(keyblk)); + return ret; +} + +/* + * Set appropriate PRF function and other SSL / TLS 1.0/1.1 / TLS1.2 functions + * + * Inputs: + * - SSL/TLS minor version + * - hash associated with the ciphersuite (only used by TLS 1.2) + * + * Outputs: + * - the tls_prf, calc_verify and calc_finished members of handshake structure + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_set_handshake_prfs(mbedtls_ssl_handshake_params *handshake, + int minor_ver, + mbedtls_md_type_t hash) +{ +#if !defined(MBEDTLS_SSL_PROTO_TLS1_2) || \ + !(defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)) + (void) hash; +#endif + +#if defined(MBEDTLS_SSL_PROTO_SSL3) + if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) { + handshake->tls_prf = ssl3_prf; + handshake->calc_verify = ssl_calc_verify_ssl; + handshake->calc_finished = ssl_calc_finished_ssl; + } else +#endif +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) + if (minor_ver < MBEDTLS_SSL_MINOR_VERSION_3) { + handshake->tls_prf = tls1_prf; + handshake->calc_verify = ssl_calc_verify_tls; + handshake->calc_finished = ssl_calc_finished_tls; + } else +#endif +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) + if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 && + hash == MBEDTLS_MD_SHA384) { + handshake->tls_prf = tls_prf_sha384; + handshake->calc_verify = ssl_calc_verify_tls_sha384; + handshake->calc_finished = ssl_calc_finished_tls_sha384; + } else +#endif +#if defined(MBEDTLS_SHA256_C) + if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) { + handshake->tls_prf = tls_prf_sha256; + handshake->calc_verify = ssl_calc_verify_tls_sha256; + handshake->calc_finished = ssl_calc_finished_tls_sha256; + } else +#endif +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + { + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + return 0; +} + +/* + * Compute master secret if needed + * + * Parameters: + * [in/out] handshake + * [in] resume, premaster, extended_ms, calc_verify, tls_prf + * (PSA-PSK) ciphersuite_info, psk_opaque + * [out] premaster (cleared) + * [out] master + * [in] ssl: optionally used for debugging, EMS and PSA-PSK + * debug: conf->f_dbg, conf->p_dbg + * EMS: passed to calc_verify (debug + (SSL3) session_negotiate) + * PSA-PSA: minor_ver, conf + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_compute_master(mbedtls_ssl_handshake_params *handshake, + unsigned char *master, + const mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + /* cf. RFC 5246, Section 8.1: + * "The master secret is always exactly 48 bytes in length." */ + size_t const master_secret_len = 48; + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) + unsigned char session_hash[48]; +#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ + + /* The label for the KDF used for key expansion. + * This is either "master secret" or "extended master secret" + * depending on whether the Extended Master Secret extension + * is used. */ + char const *lbl = "master secret"; + + /* The salt for the KDF used for key expansion. + * - If the Extended Master Secret extension is not used, + * this is ClientHello.Random + ServerHello.Random + * (see Sect. 8.1 in RFC 5246). + * - If the Extended Master Secret extension is used, + * this is the transcript of the handshake so far. + * (see Sect. 4 in RFC 7627). */ + unsigned char const *salt = handshake->randbytes; + size_t salt_len = 64; + +#if !defined(MBEDTLS_DEBUG_C) && \ + !defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \ + !(defined(MBEDTLS_USE_PSA_CRYPTO) && \ + defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)) + ssl = NULL; /* make sure we don't use it except for those cases */ + (void) ssl; +#endif + + if (handshake->resume != 0) { + MBEDTLS_SSL_DEBUG_MSG(3, ("no premaster (session resumed)")); + return 0; + } + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) + if (handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) { + lbl = "extended master secret"; + salt = session_hash; + handshake->calc_verify(ssl, session_hash, &salt_len); + + MBEDTLS_SSL_DEBUG_BUF(3, "session hash for extended master secret", + session_hash, salt_len); + } +#endif /* MBEDTLS_SSL_EXTENDED_MS_ENABLED */ + +#if defined(MBEDTLS_USE_PSA_CRYPTO) && \ + defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) + if (handshake->ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK && + ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 && + ssl_use_opaque_psk(ssl) == 1) { + /* Perform PSK-to-MS expansion in a single step. */ + psa_status_t status; + psa_algorithm_t alg; + psa_key_id_t psk; + psa_key_derivation_operation_t derivation = + PSA_KEY_DERIVATION_OPERATION_INIT; + mbedtls_md_type_t hash_alg = handshake->ciphersuite_info->mac; + + MBEDTLS_SSL_DEBUG_MSG(2, ("perform PSA-based PSK-to-MS expansion")); + + psk = mbedtls_ssl_get_opaque_psk(ssl); + + if (hash_alg == MBEDTLS_MD_SHA384) { + alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_384); + } else { + alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_256); + } + + status = setup_psa_key_derivation(&derivation, psk, alg, + salt, salt_len, + (unsigned char const *) lbl, + (size_t) strlen(lbl), + master_secret_len); + if (status != PSA_SUCCESS) { + psa_key_derivation_abort(&derivation); + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + + status = psa_key_derivation_output_bytes(&derivation, + master, + master_secret_len); + if (status != PSA_SUCCESS) { + psa_key_derivation_abort(&derivation); + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + + status = psa_key_derivation_abort(&derivation); + if (status != PSA_SUCCESS) { + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + } else +#endif + { + ret = handshake->tls_prf(handshake->premaster, handshake->pmslen, + lbl, salt, salt_len, + master, + master_secret_len); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "prf", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_BUF(3, "premaster secret", + handshake->premaster, + handshake->pmslen); + + mbedtls_platform_zeroize(handshake->premaster, + sizeof(handshake->premaster)); + } + + return 0; +} + +int mbedtls_ssl_derive_keys(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const mbedtls_ssl_ciphersuite_t * const ciphersuite_info = + ssl->handshake->ciphersuite_info; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> derive keys")); + + /* Set PRF, calc_verify and calc_finished function pointers */ + ret = ssl_set_handshake_prfs(ssl->handshake, + ssl->minor_ver, + ciphersuite_info->mac); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_set_handshake_prfs", ret); + return ret; + } + + /* Compute master secret if needed */ + ret = ssl_compute_master(ssl->handshake, + ssl->session_negotiate->master, + ssl); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_compute_master", ret); + return ret; + } + + /* Swap the client and server random values: + * - MS derivation wanted client+server (RFC 5246 8.1) + * - key derivation wants server+client (RFC 5246 6.3) */ + { + unsigned char tmp[64]; + memcpy(tmp, ssl->handshake->randbytes, 64); + memcpy(ssl->handshake->randbytes, tmp + 32, 32); + memcpy(ssl->handshake->randbytes + 32, tmp, 32); + mbedtls_platform_zeroize(tmp, sizeof(tmp)); + } + + /* Populate transform structure */ + ret = ssl_populate_transform(ssl->transform_negotiate, + ssl->session_negotiate->ciphersuite, + ssl->session_negotiate->master, +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + ssl->session_negotiate->encrypt_then_mac, +#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + ssl->session_negotiate->trunc_hmac, +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ +#if defined(MBEDTLS_ZLIB_SUPPORT) + ssl->session_negotiate->compression, +#endif + ssl->handshake->tls_prf, + ssl->handshake->randbytes, + ssl->minor_ver, + ssl->conf->endpoint, + ssl); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "ssl_populate_transform", ret); + return ret; + } + + /* We no longer need Server/ClientHello.random values */ + mbedtls_platform_zeroize(ssl->handshake->randbytes, + sizeof(ssl->handshake->randbytes)); + + /* Allocate compression buffer */ +#if defined(MBEDTLS_ZLIB_SUPPORT) + if (ssl->session_negotiate->compression == MBEDTLS_SSL_COMPRESS_DEFLATE && + ssl->compress_buf == NULL) { + MBEDTLS_SSL_DEBUG_MSG(3, ("Allocating compression buffer")); + ssl->compress_buf = mbedtls_calloc(1, MBEDTLS_SSL_COMPRESS_BUFFER_LEN); + if (ssl->compress_buf == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("alloc(%d bytes) failed", + MBEDTLS_SSL_COMPRESS_BUFFER_LEN)); + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + } +#endif + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= derive keys")); + + return 0; +} + +#if defined(MBEDTLS_SSL_PROTO_SSL3) +void ssl_calc_verify_ssl(const mbedtls_ssl_context *ssl, + unsigned char *hash, + size_t *hlen) +{ + mbedtls_md5_context md5; + mbedtls_sha1_context sha1; + unsigned char pad_1[48]; + unsigned char pad_2[48]; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc verify ssl")); + + mbedtls_md5_init(&md5); + mbedtls_sha1_init(&sha1); + + mbedtls_md5_clone(&md5, &ssl->handshake->fin_md5); + mbedtls_sha1_clone(&sha1, &ssl->handshake->fin_sha1); + + memset(pad_1, 0x36, 48); + memset(pad_2, 0x5C, 48); + + mbedtls_md5_update_ret(&md5, ssl->session_negotiate->master, 48); + mbedtls_md5_update_ret(&md5, pad_1, 48); + mbedtls_md5_finish_ret(&md5, hash); + + mbedtls_md5_starts_ret(&md5); + mbedtls_md5_update_ret(&md5, ssl->session_negotiate->master, 48); + mbedtls_md5_update_ret(&md5, pad_2, 48); + mbedtls_md5_update_ret(&md5, hash, 16); + mbedtls_md5_finish_ret(&md5, hash); + + mbedtls_sha1_update_ret(&sha1, ssl->session_negotiate->master, 48); + mbedtls_sha1_update_ret(&sha1, pad_1, 40); + mbedtls_sha1_finish_ret(&sha1, hash + 16); + + mbedtls_sha1_starts_ret(&sha1); + mbedtls_sha1_update_ret(&sha1, ssl->session_negotiate->master, 48); + mbedtls_sha1_update_ret(&sha1, pad_2, 40); + mbedtls_sha1_update_ret(&sha1, hash + 16, 20); + mbedtls_sha1_finish_ret(&sha1, hash + 16); + + *hlen = 36; + + MBEDTLS_SSL_DEBUG_BUF(3, "calculated verify result", hash, *hlen); + MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc verify")); + + mbedtls_md5_free(&md5); + mbedtls_sha1_free(&sha1); + + return; +} +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ + +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) +void ssl_calc_verify_tls(const mbedtls_ssl_context *ssl, + unsigned char *hash, + size_t *hlen) +{ + mbedtls_md5_context md5; + mbedtls_sha1_context sha1; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc verify tls")); + + mbedtls_md5_init(&md5); + mbedtls_sha1_init(&sha1); + + mbedtls_md5_clone(&md5, &ssl->handshake->fin_md5); + mbedtls_sha1_clone(&sha1, &ssl->handshake->fin_sha1); + + mbedtls_md5_finish_ret(&md5, hash); + mbedtls_sha1_finish_ret(&sha1, hash + 16); + + *hlen = 36; + + MBEDTLS_SSL_DEBUG_BUF(3, "calculated verify result", hash, *hlen); + MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc verify")); + + mbedtls_md5_free(&md5); + mbedtls_sha1_free(&sha1); + + return; +} +#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_SHA256_C) +void ssl_calc_verify_tls_sha256(const mbedtls_ssl_context *ssl, + unsigned char *hash, + size_t *hlen) +{ +#if defined(MBEDTLS_USE_PSA_CRYPTO) + size_t hash_size; + psa_status_t status; + psa_hash_operation_t sha256_psa = psa_hash_operation_init(); + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> PSA calc verify sha256")); + status = psa_hash_clone(&ssl->handshake->fin_sha256_psa, &sha256_psa); + if (status != PSA_SUCCESS) { + MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash clone failed")); + return; + } + + status = psa_hash_finish(&sha256_psa, hash, 32, &hash_size); + if (status != PSA_SUCCESS) { + MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash finish failed")); + return; + } + + *hlen = 32; + MBEDTLS_SSL_DEBUG_BUF(3, "PSA calculated verify result", hash, *hlen); + MBEDTLS_SSL_DEBUG_MSG(2, ("<= PSA calc verify")); +#else + mbedtls_sha256_context sha256; + + mbedtls_sha256_init(&sha256); + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc verify sha256")); + + mbedtls_sha256_clone(&sha256, &ssl->handshake->fin_sha256); + mbedtls_sha256_finish_ret(&sha256, hash); + + *hlen = 32; + + MBEDTLS_SSL_DEBUG_BUF(3, "calculated verify result", hash, *hlen); + MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc verify")); + + mbedtls_sha256_free(&sha256); +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + return; +} +#endif /* MBEDTLS_SHA256_C */ + +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) +void ssl_calc_verify_tls_sha384(const mbedtls_ssl_context *ssl, + unsigned char *hash, + size_t *hlen) +{ +#if defined(MBEDTLS_USE_PSA_CRYPTO) + size_t hash_size; + psa_status_t status; + psa_hash_operation_t sha384_psa = psa_hash_operation_init(); + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> PSA calc verify sha384")); + status = psa_hash_clone(&ssl->handshake->fin_sha384_psa, &sha384_psa); + if (status != PSA_SUCCESS) { + MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash clone failed")); + return; + } + + status = psa_hash_finish(&sha384_psa, hash, 48, &hash_size); + if (status != PSA_SUCCESS) { + MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash finish failed")); + return; + } + + *hlen = 48; + MBEDTLS_SSL_DEBUG_BUF(3, "PSA calculated verify result", hash, *hlen); + MBEDTLS_SSL_DEBUG_MSG(2, ("<= PSA calc verify")); +#else + mbedtls_sha512_context sha512; + + mbedtls_sha512_init(&sha512); + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc verify sha384")); + + mbedtls_sha512_clone(&sha512, &ssl->handshake->fin_sha512); + mbedtls_sha512_finish_ret(&sha512, hash); + + *hlen = 48; + + MBEDTLS_SSL_DEBUG_BUF(3, "calculated verify result", hash, *hlen); + MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc verify")); + + mbedtls_sha512_free(&sha512); +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + return; +} +#endif /* MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384 */ +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) +int mbedtls_ssl_psk_derive_premaster(mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex) +{ + unsigned char *p = ssl->handshake->premaster; + unsigned char *end = p + sizeof(ssl->handshake->premaster); + const unsigned char *psk = NULL; + size_t psk_len = 0; + + if (mbedtls_ssl_get_psk(ssl, &psk, &psk_len) + == MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED) { + /* + * This should never happen because the existence of a PSK is always + * checked before calling this function + */ + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + /* + * PMS = struct { + * opaque other_secret<0..2^16-1>; + * opaque psk<0..2^16-1>; + * }; + * with "other_secret" depending on the particular key exchange + */ +#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) + if (key_ex == MBEDTLS_KEY_EXCHANGE_PSK) { + if (end - p < 2) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + MBEDTLS_PUT_UINT16_BE(psk_len, p, 0); + p += 2; + + if (end < p || (size_t) (end - p) < psk_len) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + memset(p, 0, psk_len); + p += psk_len; + } else +#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) + if (key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK) { + /* + * other_secret already set by the ClientKeyExchange message, + * and is 48 bytes long + */ + if (end - p < 2) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + *p++ = 0; + *p++ = 48; + p += 48; + } else +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) + if (key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + + /* Write length only when we know the actual value */ + if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx, + p + 2, end - (p + 2), &len, + ssl->conf->f_rng, ssl->conf->p_rng)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret); + return ret; + } + MBEDTLS_PUT_UINT16_BE(len, p, 0); + p += 2 + len; + + MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K); + } else +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) + if (key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t zlen; + + if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx, &zlen, + p + 2, end - (p + 2), + ssl->conf->f_rng, ssl->conf->p_rng)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret); + return ret; + } + + MBEDTLS_PUT_UINT16_BE(zlen, p, 0); + p += 2 + zlen; + + MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx, + MBEDTLS_DEBUG_ECDH_Z); + } else +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + /* opaque psk<0..2^16-1>; */ + if (end - p < 2) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + MBEDTLS_PUT_UINT16_BE(psk_len, p, 0); + p += 2; + + if (end < p || (size_t) (end - p) < psk_len) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + memcpy(p, psk, psk_len); + p += psk_len; + + ssl->handshake->pmslen = p - ssl->handshake->premaster; + + return 0; +} +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ + +#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_hello_request(mbedtls_ssl_context *ssl); + +#if defined(MBEDTLS_SSL_PROTO_DTLS) +int mbedtls_ssl_resend_hello_request(mbedtls_ssl_context *ssl) +{ + /* If renegotiation is not enforced, retransmit until we would reach max + * timeout if we were using the usual handshake doubling scheme */ + if (ssl->conf->renego_max_records < 0) { + uint32_t ratio = ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1; + unsigned char doublings = 1; + + while (ratio != 0) { + ++doublings; + ratio >>= 1; + } + + if (++ssl->renego_records_seen > doublings) { + MBEDTLS_SSL_DEBUG_MSG(2, ("no longer retransmitting hello request")); + return 0; + } + } + + return ssl_write_hello_request(ssl); +} +#endif +#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +static void ssl_clear_peer_cert(mbedtls_ssl_session *session) +{ +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + if (session->peer_cert != NULL) { + mbedtls_x509_crt_free(session->peer_cert); + mbedtls_free(session->peer_cert); + session->peer_cert = NULL; + } +#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + if (session->peer_cert_digest != NULL) { + /* Zeroization is not necessary. */ + mbedtls_free(session->peer_cert_digest); + session->peer_cert_digest = NULL; + session->peer_cert_digest_type = MBEDTLS_MD_NONE; + session->peer_cert_digest_len = 0; + } +#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ +} +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +/* + * Handshake functions + */ +#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) +/* No certificate support -> dummy functions */ +int mbedtls_ssl_write_certificate(mbedtls_ssl_context *ssl) +{ + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate")); + + if (!mbedtls_ssl_ciphersuite_uses_srv_cert(ciphersuite_info)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate")); + ssl->state++; + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; +} + +int mbedtls_ssl_parse_certificate(mbedtls_ssl_context *ssl) +{ + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate")); + + if (!mbedtls_ssl_ciphersuite_uses_srv_cert(ciphersuite_info)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate")); + ssl->state++; + return 0; + } + + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; +} + +#else /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ +/* Some certificate support -> implement write and parse */ + +int mbedtls_ssl_write_certificate(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + size_t i, n; + const mbedtls_x509_crt *crt; + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate")); + + if (!mbedtls_ssl_ciphersuite_uses_srv_cert(ciphersuite_info)) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate")); + ssl->state++; + return 0; + } + +#if defined(MBEDTLS_SSL_CLI_C) + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) { + if (ssl->client_auth == 0) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate")); + ssl->state++; + return 0; + } + +#if defined(MBEDTLS_SSL_PROTO_SSL3) + /* + * If using SSLv3 and got no cert, send an Alert message + * (otherwise an empty Certificate message will be sent). + */ + if (mbedtls_ssl_own_cert(ssl) == NULL && + ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) { + ssl->out_msglen = 2; + ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT; + ssl->out_msg[0] = MBEDTLS_SSL_ALERT_LEVEL_WARNING; + ssl->out_msg[1] = MBEDTLS_SSL_ALERT_MSG_NO_CERT; + + MBEDTLS_SSL_DEBUG_MSG(2, ("got no certificate to send")); + goto write_msg; + } +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ + } +#endif /* MBEDTLS_SSL_CLI_C */ +#if defined(MBEDTLS_SSL_SRV_C) + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) { + if (mbedtls_ssl_own_cert(ssl) == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("got no certificate to send")); + return MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED; + } + } +#endif + + MBEDTLS_SSL_DEBUG_CRT(3, "own certificate", mbedtls_ssl_own_cert(ssl)); + + /* + * 0 . 0 handshake type + * 1 . 3 handshake length + * 4 . 6 length of all certs + * 7 . 9 length of cert. 1 + * 10 . n-1 peer certificate + * n . n+2 length of cert. 2 + * n+3 . ... upper level cert, etc. + */ + i = 7; + crt = mbedtls_ssl_own_cert(ssl); + + while (crt != NULL) { + n = crt->raw.len; + if (n > MBEDTLS_SSL_OUT_CONTENT_LEN - 3 - i) { + MBEDTLS_SSL_DEBUG_MSG(1, ("certificate too large, %" MBEDTLS_PRINTF_SIZET + " > %" MBEDTLS_PRINTF_SIZET, + i + 3 + n, (size_t) MBEDTLS_SSL_OUT_CONTENT_LEN)); + return MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE; + } + + ssl->out_msg[i] = MBEDTLS_BYTE_2(n); + ssl->out_msg[i + 1] = MBEDTLS_BYTE_1(n); + ssl->out_msg[i + 2] = MBEDTLS_BYTE_0(n); + + i += 3; memcpy(ssl->out_msg + i, crt->raw.p, n); + i += n; crt = crt->next; + } + + ssl->out_msg[4] = MBEDTLS_BYTE_2(i - 7); + ssl->out_msg[5] = MBEDTLS_BYTE_1(i - 7); + ssl->out_msg[6] = MBEDTLS_BYTE_0(i - 7); + + ssl->out_msglen = i; + ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE; + +#if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C) +write_msg: +#endif + + ssl->state++; + + if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate")); + + return ret; +} + +#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C) + +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_check_peer_crt_unchanged(mbedtls_ssl_context *ssl, + unsigned char *crt_buf, + size_t crt_buf_len) +{ + mbedtls_x509_crt const * const peer_crt = ssl->session->peer_cert; + + if (peer_crt == NULL) { + return -1; + } + + if (peer_crt->raw.len != crt_buf_len) { + return -1; + } + + return memcmp(peer_crt->raw.p, crt_buf, peer_crt->raw.len); +} +#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_check_peer_crt_unchanged(mbedtls_ssl_context *ssl, + unsigned char *crt_buf, + size_t crt_buf_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char const * const peer_cert_digest = + ssl->session->peer_cert_digest; + mbedtls_md_type_t const peer_cert_digest_type = + ssl->session->peer_cert_digest_type; + mbedtls_md_info_t const * const digest_info = + mbedtls_md_info_from_type(peer_cert_digest_type); + unsigned char tmp_digest[MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN]; + size_t digest_len; + + if (peer_cert_digest == NULL || digest_info == NULL) { + return -1; + } + + digest_len = mbedtls_md_get_size(digest_info); + if (digest_len > MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN) { + return -1; + } + + ret = mbedtls_md(digest_info, crt_buf, crt_buf_len, tmp_digest); + if (ret != 0) { + return -1; + } + + return memcmp(tmp_digest, peer_cert_digest, digest_len); +} +#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ +#endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */ + +/* + * Once the certificate message is read, parse it into a cert chain and + * perform basic checks, but leave actual verification to the caller + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_certificate_chain(mbedtls_ssl_context *ssl, + mbedtls_x509_crt *chain) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; +#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C) + int crt_cnt = 0; +#endif + size_t i, n; + uint8_t alert; + + if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE); + return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + } + + if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE || + ssl->in_hslen < mbedtls_ssl_hs_hdr_len(ssl) + 3 + 3) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; + } + + i = mbedtls_ssl_hs_hdr_len(ssl); + + /* + * Same message structure as in mbedtls_ssl_write_certificate() + */ + n = (ssl->in_msg[i+1] << 8) | ssl->in_msg[i+2]; + + if (ssl->in_msg[i] != 0 || + ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len(ssl)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; + } + + /* Make &ssl->in_msg[i] point to the beginning of the CRT chain. */ + i += 3; + + /* Iterate through and parse the CRTs in the provided chain. */ + while (i < ssl->in_hslen) { + /* Check that there's room for the next CRT's length fields. */ + if (i + 3 > ssl->in_hslen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message")); + mbedtls_ssl_send_alert_message(ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; + } + /* In theory, the CRT can be up to 2**24 Bytes, but we don't support + * anything beyond 2**16 ~ 64K. */ + if (ssl->in_msg[i] != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message")); + mbedtls_ssl_send_alert_message(ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; + } + + /* Read length of the next CRT in the chain. */ + n = ((unsigned int) ssl->in_msg[i + 1] << 8) + | (unsigned int) ssl->in_msg[i + 2]; + i += 3; + + if (n < 128 || i + n > ssl->in_hslen) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message")); + mbedtls_ssl_send_alert_message(ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; + } + + /* Check if we're handling the first CRT in the chain. */ +#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C) + if (crt_cnt++ == 0 && + ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT && + ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) { + /* During client-side renegotiation, check that the server's + * end-CRTs hasn't changed compared to the initial handshake, + * mitigating the triple handshake attack. On success, reuse + * the original end-CRT instead of parsing it again. */ + MBEDTLS_SSL_DEBUG_MSG(3, ("Check that peer CRT hasn't changed during renegotiation")); + if (ssl_check_peer_crt_unchanged(ssl, + &ssl->in_msg[i], + n) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("new server cert during renegotiation")); + mbedtls_ssl_send_alert_message(ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED); + return MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; + } + + /* Now we can safely free the original chain. */ + ssl_clear_peer_cert(ssl->session); + } +#endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */ + + /* Parse the next certificate in the chain. */ +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + ret = mbedtls_x509_crt_parse_der(chain, ssl->in_msg + i, n); +#else + /* If we don't need to store the CRT chain permanently, parse + * it in-place from the input buffer instead of making a copy. */ + ret = mbedtls_x509_crt_parse_der_nocopy(chain, ssl->in_msg + i, n); +#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + switch (ret) { + case 0: /*ok*/ + case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND: + /* Ignore certificate with an unknown algorithm: maybe a + prior certificate was already trusted. */ + break; + + case MBEDTLS_ERR_X509_ALLOC_FAILED: + alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR; + goto crt_parse_der_failed; + + case MBEDTLS_ERR_X509_UNKNOWN_VERSION: + alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; + goto crt_parse_der_failed; + + default: + alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT; +crt_parse_der_failed: + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert); + MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret); + return ret; + } + + i += n; + } + + MBEDTLS_SSL_DEBUG_CRT(3, "peer certificate", chain); + return 0; +} + +#if defined(MBEDTLS_SSL_SRV_C) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_srv_check_client_no_crt_notification(mbedtls_ssl_context *ssl) +{ + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) { + return -1; + } + +#if defined(MBEDTLS_SSL_PROTO_SSL3) + /* + * Check if the client sent an empty certificate + */ + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) { + if (ssl->in_msglen == 2 && + ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT && + ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && + ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT) { + MBEDTLS_SSL_DEBUG_MSG(1, ("SSLv3 client has no certificate")); + return 0; + } + + return -1; + } +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ + +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (ssl->in_hslen == 3 + mbedtls_ssl_hs_hdr_len(ssl) && + ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && + ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE && + memcmp(ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl), "\0\0\0", 3) == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("TLSv1 client has no certificate")); + return 0; + } + + return -1; +#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ + MBEDTLS_SSL_PROTO_TLS1_2 */ +} +#endif /* MBEDTLS_SSL_SRV_C */ + +/* Check if a certificate message is expected. + * Return either + * - SSL_CERTIFICATE_EXPECTED, or + * - SSL_CERTIFICATE_SKIP + * indicating whether a Certificate message is expected or not. + */ +#define SSL_CERTIFICATE_EXPECTED 0 +#define SSL_CERTIFICATE_SKIP 1 +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_certificate_coordinate(mbedtls_ssl_context *ssl, + int authmode) +{ + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + + if (!mbedtls_ssl_ciphersuite_uses_srv_cert(ciphersuite_info)) { + return SSL_CERTIFICATE_SKIP; + } + +#if defined(MBEDTLS_SSL_SRV_C) + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) { + if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) { + return SSL_CERTIFICATE_SKIP; + } + + if (authmode == MBEDTLS_SSL_VERIFY_NONE) { + ssl->session_negotiate->verify_result = + MBEDTLS_X509_BADCERT_SKIP_VERIFY; + return SSL_CERTIFICATE_SKIP; + } + } +#else + ((void) authmode); +#endif /* MBEDTLS_SSL_SRV_C */ + + return SSL_CERTIFICATE_EXPECTED; +} + +static int get_hostname_for_verification(mbedtls_ssl_context *ssl, + const char **hostname) +{ + if (!mbedtls_ssl_has_set_hostname_been_called(ssl)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Certificate verification without having set hostname")); +#if !defined(MBEDTLS_SSL_CLI_ALLOW_WEAK_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME) + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT && + ssl->conf->authmode == MBEDTLS_SSL_VERIFY_REQUIRED) { + return MBEDTLS_ERR_SSL_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME; + } +#endif + } + + *hostname = mbedtls_ssl_get_hostname_pointer(ssl); + if (*hostname == NULL) { + MBEDTLS_SSL_DEBUG_MSG(2, ("Certificate verification without CN verification")); + } + + return 0; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl, + int authmode, + mbedtls_x509_crt *chain, + void *rs_ctx) +{ + const mbedtls_ssl_ciphersuite_t *ciphersuite_info = + ssl->handshake->ciphersuite_info; + int have_ca_chain = 0; + + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *); + void *p_vrfy; + + if (authmode == MBEDTLS_SSL_VERIFY_NONE) { + return 0; + } + + if (ssl->f_vrfy != NULL) { + MBEDTLS_SSL_DEBUG_MSG(3, ("Use context-specific verification callback")); + f_vrfy = ssl->f_vrfy; + p_vrfy = ssl->p_vrfy; + } else { + MBEDTLS_SSL_DEBUG_MSG(3, ("Use configuration-specific verification callback")); + f_vrfy = ssl->conf->f_vrfy; + p_vrfy = ssl->conf->p_vrfy; + } + + const char *hostname = ""; + int ret = get_hostname_for_verification(ssl, &hostname); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "get_hostname_for_verification", ret); + return ret; + } + + /* + * Main check: verify certificate + */ +#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) + if (ssl->conf->f_ca_cb != NULL) { + ((void) rs_ctx); + have_ca_chain = 1; + + MBEDTLS_SSL_DEBUG_MSG(3, ("use CA callback for X.509 CRT verification")); + ret = mbedtls_x509_crt_verify_with_ca_cb( + chain, + ssl->conf->f_ca_cb, + ssl->conf->p_ca_cb, + ssl->conf->cert_profile, + hostname, + &ssl->session_negotiate->verify_result, + f_vrfy, p_vrfy); + } else +#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ + { + mbedtls_x509_crt *ca_chain; + mbedtls_x509_crl *ca_crl; + +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) + if (ssl->handshake->sni_ca_chain != NULL) { + ca_chain = ssl->handshake->sni_ca_chain; + ca_crl = ssl->handshake->sni_ca_crl; + } else +#endif + { + ca_chain = ssl->conf->ca_chain; + ca_crl = ssl->conf->ca_crl; + } + + if (ca_chain != NULL) { + have_ca_chain = 1; + } + + ret = mbedtls_x509_crt_verify_restartable( + chain, + ca_chain, ca_crl, + ssl->conf->cert_profile, + hostname, + &ssl->session_negotiate->verify_result, + f_vrfy, p_vrfy, rs_ctx); + } + + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "x509_verify_cert", ret); + } + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS) { + return MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; + } +#endif + + /* + * Secondary checks: always done, but change 'ret' only if it was 0 + */ + +#if defined(MBEDTLS_ECP_C) + { + const mbedtls_pk_context *pk = &chain->pk; + + /* If certificate uses an EC key, make sure the curve is OK. + * This is a public key, so it can't be opaque, so can_do() is a good + * enough check to ensure pk_ec() is safe to use here. */ + if (mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY) && + mbedtls_ssl_check_curve(ssl, mbedtls_pk_ec(*pk)->grp.id) != 0) { + ssl->session_negotiate->verify_result |= MBEDTLS_X509_BADCERT_BAD_KEY; + + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate (EC key curve)")); + if (ret == 0) { + ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; + } + } + } +#endif /* MBEDTLS_ECP_C */ + + if (mbedtls_ssl_check_cert_usage(chain, + ciphersuite_info, + !ssl->conf->endpoint, + &ssl->session_negotiate->verify_result) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate (usage extensions)")); + if (ret == 0) { + ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; + } + } + + /* mbedtls_x509_crt_verify_with_profile is supposed to report a + * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED, + * with details encoded in the verification flags. All other kinds + * of error codes, including those from the user provided f_vrfy + * functions, are treated as fatal and lead to a failure of + * ssl_parse_certificate even if verification was optional. */ + if (authmode == MBEDTLS_SSL_VERIFY_OPTIONAL && + (ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED || + ret == MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE)) { + ret = 0; + } + + if (have_ca_chain == 0 && authmode == MBEDTLS_SSL_VERIFY_REQUIRED) { + MBEDTLS_SSL_DEBUG_MSG(1, ("got no CA chain")); + ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED; + } + + if (ret != 0) { + uint8_t alert; + + /* The certificate may have been rejected for several reasons. + Pick one and send the corresponding alert. Which alert to send + may be a subject of debate in some cases. */ + if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER) { + alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED; + } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH) { + alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT; + } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_KEY_USAGE) { + alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; + } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE) { + alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; + } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NS_CERT_TYPE) { + alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; + } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_PK) { + alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; + } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_KEY) { + alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; + } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXPIRED) { + alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED; + } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_REVOKED) { + alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED; + } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED) { + alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA; + } else { + alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN; + } + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + alert); + } + +#if defined(MBEDTLS_DEBUG_C) + if (ssl->session_negotiate->verify_result != 0) { + MBEDTLS_SSL_DEBUG_MSG(3, ("! Certificate verification flags %08x", + (unsigned int) ssl->session_negotiate->verify_result)); + } else { + MBEDTLS_SSL_DEBUG_MSG(3, ("Certificate verification flags clear")); + } +#endif /* MBEDTLS_DEBUG_C */ + + return ret; +} + +#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_remember_peer_crt_digest(mbedtls_ssl_context *ssl, + unsigned char *start, size_t len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + /* Remember digest of the peer's end-CRT. */ + ssl->session_negotiate->peer_cert_digest = + mbedtls_calloc(1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN); + if (ssl->session_negotiate->peer_cert_digest == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("alloc(%d bytes) failed", + MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN)); + mbedtls_ssl_send_alert_message(ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR); + + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + ret = mbedtls_md(mbedtls_md_info_from_type( + MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE), + start, len, + ssl->session_negotiate->peer_cert_digest); + + ssl->session_negotiate->peer_cert_digest_type = + MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE; + ssl->session_negotiate->peer_cert_digest_len = + MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN; + + return ret; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_remember_peer_pubkey(mbedtls_ssl_context *ssl, + unsigned char *start, size_t len) +{ + unsigned char *end = start + len; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + /* Make a copy of the peer's raw public key. */ + mbedtls_pk_init(&ssl->handshake->peer_pubkey); + ret = mbedtls_pk_parse_subpubkey(&start, end, + &ssl->handshake->peer_pubkey); + if (ret != 0) { + /* We should have parsed the public key before. */ + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + return 0; +} +#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + +int mbedtls_ssl_parse_certificate(mbedtls_ssl_context *ssl) +{ + int ret = 0; + int crt_expected; +#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) + const int authmode = ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET + ? ssl->handshake->sni_authmode + : ssl->conf->authmode; +#else + const int authmode = ssl->conf->authmode; +#endif + void *rs_ctx = NULL; + mbedtls_x509_crt *chain = NULL; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate")); + + crt_expected = ssl_parse_certificate_coordinate(ssl, authmode); + if (crt_expected == SSL_CERTIFICATE_SKIP) { + MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate")); + goto exit; + } + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ssl->handshake->ecrs_enabled && + ssl->handshake->ecrs_state == ssl_ecrs_crt_verify) { + chain = ssl->handshake->ecrs_peer_cert; + ssl->handshake->ecrs_peer_cert = NULL; + goto crt_verify; + } +#endif + + if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) { + /* mbedtls_ssl_read_record may have sent an alert already. We + let it decide whether to alert. */ + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret); + goto exit; + } + +#if defined(MBEDTLS_SSL_SRV_C) + if (ssl_srv_check_client_no_crt_notification(ssl) == 0) { + ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING; + + if (authmode != MBEDTLS_SSL_VERIFY_OPTIONAL) { + ret = MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE; + } + + goto exit; + } +#endif /* MBEDTLS_SSL_SRV_C */ + + /* Clear existing peer CRT structure in case we tried to + * reuse a session but it failed, and allocate a new one. */ + ssl_clear_peer_cert(ssl->session_negotiate); + + chain = mbedtls_calloc(1, sizeof(mbedtls_x509_crt)); + if (chain == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", + sizeof(mbedtls_x509_crt))); + mbedtls_ssl_send_alert_message(ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR); + + ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; + goto exit; + } + mbedtls_x509_crt_init(chain); + + ret = ssl_parse_certificate_chain(ssl, chain); + if (ret != 0) { + goto exit; + } + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ssl->handshake->ecrs_enabled) { + ssl->handshake->ecrs_state = ssl_ecrs_crt_verify; + } + +crt_verify: + if (ssl->handshake->ecrs_enabled) { + rs_ctx = &ssl->handshake->ecrs_ctx; + } +#endif + + ret = ssl_parse_certificate_verify(ssl, authmode, + chain, rs_ctx); + if (ret != 0) { + goto exit; + } + +#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + { + unsigned char *crt_start, *pk_start; + size_t crt_len, pk_len; + + /* We parse the CRT chain without copying, so + * these pointers point into the input buffer, + * and are hence still valid after freeing the + * CRT chain. */ + + crt_start = chain->raw.p; + crt_len = chain->raw.len; + + pk_start = chain->pk_raw.p; + pk_len = chain->pk_raw.len; + + /* Free the CRT structures before computing + * digest and copying the peer's public key. */ + mbedtls_x509_crt_free(chain); + mbedtls_free(chain); + chain = NULL; + + ret = ssl_remember_peer_crt_digest(ssl, crt_start, crt_len); + if (ret != 0) { + goto exit; + } + + ret = ssl_remember_peer_pubkey(ssl, pk_start, pk_len); + if (ret != 0) { + goto exit; + } + } +#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + /* Pass ownership to session structure. */ + ssl->session_negotiate->peer_cert = chain; + chain = NULL; +#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate")); + +exit: + + if (ret == 0) { + ssl->state++; + } + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + if (ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) { + ssl->handshake->ecrs_peer_cert = chain; + chain = NULL; + } +#endif + + if (chain != NULL) { + mbedtls_x509_crt_free(chain); + mbedtls_free(chain); + } + + return ret; +} +#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ + +void mbedtls_ssl_optimize_checksum(mbedtls_ssl_context *ssl, + const mbedtls_ssl_ciphersuite_t *ciphersuite_info) +{ + ((void) ciphersuite_info); + +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) + if (ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3) { + ssl->handshake->update_checksum = ssl_update_checksum_md5sha1; + } else +#endif +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) + if (ciphersuite_info->mac == MBEDTLS_MD_SHA384) { + ssl->handshake->update_checksum = ssl_update_checksum_sha384; + } else +#endif +#if defined(MBEDTLS_SHA256_C) + if (ciphersuite_info->mac != MBEDTLS_MD_SHA384) { + ssl->handshake->update_checksum = ssl_update_checksum_sha256; + } else +#endif +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + { + MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); + return; + } +} + +void mbedtls_ssl_reset_checksum(mbedtls_ssl_context *ssl) +{ +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) + mbedtls_md5_starts_ret(&ssl->handshake->fin_md5); + mbedtls_sha1_starts_ret(&ssl->handshake->fin_sha1); +#endif +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_SHA256_C) +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_hash_abort(&ssl->handshake->fin_sha256_psa); + psa_hash_setup(&ssl->handshake->fin_sha256_psa, PSA_ALG_SHA_256); +#else + mbedtls_sha256_starts_ret(&ssl->handshake->fin_sha256, 0); +#endif +#endif +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_hash_abort(&ssl->handshake->fin_sha384_psa); + psa_hash_setup(&ssl->handshake->fin_sha384_psa, PSA_ALG_SHA_384); +#else + mbedtls_sha512_starts_ret(&ssl->handshake->fin_sha512, 1); +#endif +#endif +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ +} + +static void ssl_update_checksum_start(mbedtls_ssl_context *ssl, + const unsigned char *buf, size_t len) +{ +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) + mbedtls_md5_update_ret(&ssl->handshake->fin_md5, buf, len); + mbedtls_sha1_update_ret(&ssl->handshake->fin_sha1, buf, len); +#endif +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_SHA256_C) +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_hash_update(&ssl->handshake->fin_sha256_psa, buf, len); +#else + mbedtls_sha256_update_ret(&ssl->handshake->fin_sha256, buf, len); +#endif +#endif +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_hash_update(&ssl->handshake->fin_sha384_psa, buf, len); +#else + mbedtls_sha512_update_ret(&ssl->handshake->fin_sha512, buf, len); +#endif +#endif +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ +} + +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) +static void ssl_update_checksum_md5sha1(mbedtls_ssl_context *ssl, + const unsigned char *buf, size_t len) +{ + mbedtls_md5_update_ret(&ssl->handshake->fin_md5, buf, len); + mbedtls_sha1_update_ret(&ssl->handshake->fin_sha1, buf, len); +} +#endif + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_SHA256_C) +static void ssl_update_checksum_sha256(mbedtls_ssl_context *ssl, + const unsigned char *buf, size_t len) +{ +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_hash_update(&ssl->handshake->fin_sha256_psa, buf, len); +#else + mbedtls_sha256_update_ret(&ssl->handshake->fin_sha256, buf, len); +#endif +} +#endif + +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) +static void ssl_update_checksum_sha384(mbedtls_ssl_context *ssl, + const unsigned char *buf, size_t len) +{ +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_hash_update(&ssl->handshake->fin_sha384_psa, buf, len); +#else + mbedtls_sha512_update_ret(&ssl->handshake->fin_sha512, buf, len); +#endif +} +#endif +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + +#if defined(MBEDTLS_SSL_PROTO_SSL3) +static int ssl_calc_finished_ssl( + mbedtls_ssl_context *ssl, unsigned char *buf, int from) +{ + const char *sender; + mbedtls_md5_context md5; + mbedtls_sha1_context sha1; + + unsigned char padbuf[48]; + unsigned char md5sum[16]; + unsigned char sha1sum[20]; + + mbedtls_ssl_session *session = ssl->session_negotiate; + if (!session) { + session = ssl->session; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc finished ssl")); + + mbedtls_md5_init(&md5); + mbedtls_sha1_init(&sha1); + + mbedtls_md5_clone(&md5, &ssl->handshake->fin_md5); + mbedtls_sha1_clone(&sha1, &ssl->handshake->fin_sha1); + + /* + * SSLv3: + * hash = + * MD5( master + pad2 + + * MD5( handshake + sender + master + pad1 ) ) + * + SHA1( master + pad2 + + * SHA1( handshake + sender + master + pad1 ) ) + */ + +#if !defined(MBEDTLS_MD5_ALT) + MBEDTLS_SSL_DEBUG_BUF(4, "finished md5 state", (unsigned char *) + md5.state, sizeof(md5.state)); +#endif + +#if !defined(MBEDTLS_SHA1_ALT) + MBEDTLS_SSL_DEBUG_BUF(4, "finished sha1 state", (unsigned char *) + sha1.state, sizeof(sha1.state)); +#endif + + sender = (from == MBEDTLS_SSL_IS_CLIENT) ? "CLNT" + : "SRVR"; + + memset(padbuf, 0x36, 48); + + mbedtls_md5_update_ret(&md5, (const unsigned char *) sender, 4); + mbedtls_md5_update_ret(&md5, session->master, 48); + mbedtls_md5_update_ret(&md5, padbuf, 48); + mbedtls_md5_finish_ret(&md5, md5sum); + + mbedtls_sha1_update_ret(&sha1, (const unsigned char *) sender, 4); + mbedtls_sha1_update_ret(&sha1, session->master, 48); + mbedtls_sha1_update_ret(&sha1, padbuf, 40); + mbedtls_sha1_finish_ret(&sha1, sha1sum); + + memset(padbuf, 0x5C, 48); + + mbedtls_md5_starts_ret(&md5); + mbedtls_md5_update_ret(&md5, session->master, 48); + mbedtls_md5_update_ret(&md5, padbuf, 48); + mbedtls_md5_update_ret(&md5, md5sum, 16); + mbedtls_md5_finish_ret(&md5, buf); + + mbedtls_sha1_starts_ret(&sha1); + mbedtls_sha1_update_ret(&sha1, session->master, 48); + mbedtls_sha1_update_ret(&sha1, padbuf, 40); + mbedtls_sha1_update_ret(&sha1, sha1sum, 20); + mbedtls_sha1_finish_ret(&sha1, buf + 16); + + MBEDTLS_SSL_DEBUG_BUF(3, "calc finished result", buf, 36); + + mbedtls_md5_free(&md5); + mbedtls_sha1_free(&sha1); + + mbedtls_platform_zeroize(padbuf, sizeof(padbuf)); + mbedtls_platform_zeroize(md5sum, sizeof(md5sum)); + mbedtls_platform_zeroize(sha1sum, sizeof(sha1sum)); + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc finished")); + + return 0; +} +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ + +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) +static int ssl_calc_finished_tls( + mbedtls_ssl_context *ssl, unsigned char *buf, int from) +{ + int len = 12; + const char *sender; + mbedtls_md5_context md5; + mbedtls_sha1_context sha1; + unsigned char padbuf[36]; + + mbedtls_ssl_session *session = ssl->session_negotiate; + if (!session) { + session = ssl->session; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc finished tls")); + + mbedtls_md5_init(&md5); + mbedtls_sha1_init(&sha1); + + mbedtls_md5_clone(&md5, &ssl->handshake->fin_md5); + mbedtls_sha1_clone(&sha1, &ssl->handshake->fin_sha1); + + /* + * TLSv1: + * hash = PRF( master, finished_label, + * MD5( handshake ) + SHA1( handshake ) )[0..11] + */ + +#if !defined(MBEDTLS_MD5_ALT) + MBEDTLS_SSL_DEBUG_BUF(4, "finished md5 state", (unsigned char *) + md5.state, sizeof(md5.state)); +#endif + +#if !defined(MBEDTLS_SHA1_ALT) + MBEDTLS_SSL_DEBUG_BUF(4, "finished sha1 state", (unsigned char *) + sha1.state, sizeof(sha1.state)); +#endif + + sender = (from == MBEDTLS_SSL_IS_CLIENT) + ? "client finished" + : "server finished"; + + mbedtls_md5_finish_ret(&md5, padbuf); + mbedtls_sha1_finish_ret(&sha1, padbuf + 16); + + ssl->handshake->tls_prf(session->master, 48, sender, + padbuf, 36, buf, len); + + MBEDTLS_SSL_DEBUG_BUF(3, "calc finished result", buf, len); + + mbedtls_md5_free(&md5); + mbedtls_sha1_free(&sha1); + + mbedtls_platform_zeroize(padbuf, sizeof(padbuf)); + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc finished")); + + return 0; +} +#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_SHA256_C) +static int ssl_calc_finished_tls_sha256( + mbedtls_ssl_context *ssl, unsigned char *buf, int from) +{ + int len = 12; + const char *sender; + unsigned char padbuf[32]; +#if defined(MBEDTLS_USE_PSA_CRYPTO) + size_t hash_size; + psa_hash_operation_t sha256_psa = PSA_HASH_OPERATION_INIT; + psa_status_t status; +#else + mbedtls_sha256_context sha256; +#endif + + mbedtls_ssl_session *session = ssl->session_negotiate; + if (!session) { + session = ssl->session; + } + + sender = (from == MBEDTLS_SSL_IS_CLIENT) + ? "client finished" + : "server finished"; + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + sha256_psa = psa_hash_operation_init(); + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc PSA finished tls sha256")); + + status = psa_hash_clone(&ssl->handshake->fin_sha256_psa, &sha256_psa); + if (status != PSA_SUCCESS) { + MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash clone failed")); + return mbedtls_ssl_md_error_from_psa(status); + } + + status = psa_hash_finish(&sha256_psa, padbuf, sizeof(padbuf), &hash_size); + if (status != PSA_SUCCESS) { + MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash finish failed")); + return mbedtls_ssl_md_error_from_psa(status); + } + MBEDTLS_SSL_DEBUG_BUF(3, "PSA calculated padbuf", padbuf, 32); +#else + + mbedtls_sha256_init(&sha256); + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc finished tls sha256")); + + mbedtls_sha256_clone(&sha256, &ssl->handshake->fin_sha256); + + /* + * TLSv1.2: + * hash = PRF( master, finished_label, + * Hash( handshake ) )[0.11] + */ + +#if !defined(MBEDTLS_SHA256_ALT) + MBEDTLS_SSL_DEBUG_BUF(4, "finished sha2 state", (unsigned char *) + sha256.state, sizeof(sha256.state)); +#endif + + mbedtls_sha256_finish_ret(&sha256, padbuf); + mbedtls_sha256_free(&sha256); +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + ssl->handshake->tls_prf(session->master, 48, sender, + padbuf, 32, buf, len); + + MBEDTLS_SSL_DEBUG_BUF(3, "calc finished result", buf, len); + + mbedtls_platform_zeroize(padbuf, sizeof(padbuf)); + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc finished")); + + return 0; +} +#endif /* MBEDTLS_SHA256_C */ + +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) + +static int ssl_calc_finished_tls_sha384( + mbedtls_ssl_context *ssl, unsigned char *buf, int from) +{ + int len = 12; + const char *sender; + unsigned char padbuf[48]; +#if defined(MBEDTLS_USE_PSA_CRYPTO) + size_t hash_size; + psa_hash_operation_t sha384_psa = PSA_HASH_OPERATION_INIT; + psa_status_t status; +#else + mbedtls_sha512_context sha512; +#endif + + mbedtls_ssl_session *session = ssl->session_negotiate; + if (!session) { + session = ssl->session; + } + + sender = (from == MBEDTLS_SSL_IS_CLIENT) + ? "client finished" + : "server finished"; + +#if defined(MBEDTLS_USE_PSA_CRYPTO) + sha384_psa = psa_hash_operation_init(); + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc PSA finished tls sha384")); + + status = psa_hash_clone(&ssl->handshake->fin_sha384_psa, &sha384_psa); + if (status != PSA_SUCCESS) { + MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash clone failed")); + return mbedtls_ssl_md_error_from_psa(status); + } + + status = psa_hash_finish(&sha384_psa, padbuf, sizeof(padbuf), &hash_size); + if (status != PSA_SUCCESS) { + MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash finish failed")); + return mbedtls_ssl_md_error_from_psa(status); + } + MBEDTLS_SSL_DEBUG_BUF(3, "PSA calculated padbuf", padbuf, 48); +#else + mbedtls_sha512_init(&sha512); + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc finished tls sha384")); + + mbedtls_sha512_clone(&sha512, &ssl->handshake->fin_sha512); + + /* + * TLSv1.2: + * hash = PRF( master, finished_label, + * Hash( handshake ) )[0.11] + */ + +#if !defined(MBEDTLS_SHA512_ALT) + MBEDTLS_SSL_DEBUG_BUF(4, "finished sha512 state", (unsigned char *) + sha512.state, sizeof(sha512.state)); +#endif + /* mbedtls_sha512_finish_ret's output parameter is declared as a + * 64-byte buffer, but since we're using SHA-384, we know that the + * output fits in 48 bytes. This is correct C, but GCC 11.1 warns + * about it. + */ +#if defined(__GNUC__) && __GNUC__ >= 11 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow" +#endif + mbedtls_sha512_finish_ret(&sha512, padbuf); +#if defined(__GNUC__) && __GNUC__ >= 11 +#pragma GCC diagnostic pop +#endif + + mbedtls_sha512_free(&sha512); +#endif + + ssl->handshake->tls_prf(session->master, 48, sender, + padbuf, 48, buf, len); + + MBEDTLS_SSL_DEBUG_BUF(3, "calc finished result", buf, len); + + mbedtls_platform_zeroize(padbuf, sizeof(padbuf)); + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc finished")); + + return 0; +} +#endif /* MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384 */ +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + +void mbedtls_ssl_handshake_wrapup_free_hs_transform(mbedtls_ssl_context *ssl) +{ + MBEDTLS_SSL_DEBUG_MSG(3, ("=> handshake wrapup: final free")); + + /* + * Free our handshake params + */ + mbedtls_ssl_handshake_free(ssl); + mbedtls_free(ssl->handshake); + ssl->handshake = NULL; + + /* + * Free the previous transform and switch in the current one + */ + if (ssl->transform) { + mbedtls_ssl_transform_free(ssl->transform); + mbedtls_free(ssl->transform); + } + ssl->transform = ssl->transform_negotiate; + ssl->transform_negotiate = NULL; + + MBEDTLS_SSL_DEBUG_MSG(3, ("<= handshake wrapup: final free")); +} + +void mbedtls_ssl_handshake_wrapup(mbedtls_ssl_context *ssl) +{ + int resume = ssl->handshake->resume; + + MBEDTLS_SSL_DEBUG_MSG(3, ("=> handshake wrapup")); + +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) { + ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_DONE; + ssl->renego_records_seen = 0; + } +#endif + + /* + * Free the previous session and switch in the current one + */ + if (ssl->session) { +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + /* RFC 7366 3.1: keep the EtM state */ + ssl->session_negotiate->encrypt_then_mac = + ssl->session->encrypt_then_mac; +#endif + + mbedtls_ssl_session_free(ssl->session); + mbedtls_free(ssl->session); + } + ssl->session = ssl->session_negotiate; + ssl->session_negotiate = NULL; + + /* + * Add cache entry + */ + if (ssl->conf->f_set_cache != NULL && + ssl->session->id_len != 0 && + resume == 0) { + if (ssl->conf->f_set_cache(ssl->conf->p_cache, ssl->session) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("cache did not store session")); + } + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + ssl->handshake->flight != NULL) { + /* Cancel handshake timer */ + mbedtls_ssl_set_timer(ssl, 0); + + /* Keep last flight around in case we need to resend it: + * we need the handshake and transform structures for that */ + MBEDTLS_SSL_DEBUG_MSG(3, ("skip freeing handshake and transform")); + } else +#endif + mbedtls_ssl_handshake_wrapup_free_hs_transform(ssl); + + ssl->state++; + + MBEDTLS_SSL_DEBUG_MSG(3, ("<= handshake wrapup")); +} + +int mbedtls_ssl_write_finished(mbedtls_ssl_context *ssl) +{ + int ret, hash_len; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write finished")); + + mbedtls_ssl_update_out_pointers(ssl, ssl->transform_negotiate); + + ret = ssl->handshake->calc_finished(ssl, ssl->out_msg + 4, + ssl->conf->endpoint); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "calc_finished", ret); + return ret; + } + + /* + * RFC 5246 7.4.9 (Page 63) says 12 is the default length and ciphersuites + * may define some other value. Currently (early 2016), no defined + * ciphersuite does this (and this is unlikely to change as activity has + * moved to TLS 1.3 now) so we can keep the hardcoded 12 here. + */ + hash_len = (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) ? 36 : 12; + +#if defined(MBEDTLS_SSL_RENEGOTIATION) + ssl->verify_data_len = hash_len; + memcpy(ssl->own_verify_data, ssl->out_msg + 4, hash_len); +#endif + + ssl->out_msglen = 4 + hash_len; + ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = MBEDTLS_SSL_HS_FINISHED; + + /* + * In case of session resuming, invert the client and server + * ChangeCipherSpec messages order. + */ + if (ssl->handshake->resume != 0) { +#if defined(MBEDTLS_SSL_CLI_C) + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) { + ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; + } +#endif +#if defined(MBEDTLS_SSL_SRV_C) + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) { + ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC; + } +#endif + } else { + ssl->state++; + } + + /* + * Switch to our negotiated transform and session parameters for outbound + * data. + */ + MBEDTLS_SSL_DEBUG_MSG(3, ("switching to new transform spec for outbound data")); + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + unsigned char i; + + /* Remember current epoch settings for resending */ + ssl->handshake->alt_transform_out = ssl->transform_out; + memcpy(ssl->handshake->alt_out_ctr, ssl->cur_out_ctr, 8); + + /* Set sequence_number to zero */ + memset(ssl->cur_out_ctr + 2, 0, 6); + + /* Increment epoch */ + for (i = 2; i > 0; i--) { + if (++ssl->cur_out_ctr[i - 1] != 0) { + break; + } + } + + /* The loop goes to its end iff the counter is wrapping */ + if (i == 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("DTLS epoch would wrap")); + return MBEDTLS_ERR_SSL_COUNTER_WRAPPING; + } + } else +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + memset(ssl->cur_out_ctr, 0, 8); + + ssl->transform_out = ssl->transform_negotiate; + ssl->session_out = ssl->session_negotiate; + +#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) + if (mbedtls_ssl_hw_record_activate != NULL) { + if ((ret = mbedtls_ssl_hw_record_activate(ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_hw_record_activate", ret); + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + } +#endif + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + mbedtls_ssl_send_flight_completed(ssl); + } +#endif + + if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret); + return ret; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret); + return ret; + } +#endif + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write finished")); + + return 0; +} + +#if defined(MBEDTLS_SSL_PROTO_SSL3) +#define SSL_MAX_HASH_LEN 36 +#else +#define SSL_MAX_HASH_LEN 12 +#endif + +int mbedtls_ssl_parse_finished(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned int hash_len; + unsigned char buf[SSL_MAX_HASH_LEN]; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse finished")); + + /* There is currently no ciphersuite using another length with TLS 1.2 */ +#if defined(MBEDTLS_SSL_PROTO_SSL3) + if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0) { + hash_len = 36; + } else +#endif + hash_len = 12; + + ret = ssl->handshake->calc_finished(ssl, buf, ssl->conf->endpoint ^ 1); + if (ret != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "calc_finished", ret); + goto exit; + } + + if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret); + goto exit; + } + + if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE); + ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; + goto exit; + } + + if (ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED || + ssl->in_hslen != mbedtls_ssl_hs_hdr_len(ssl) + hash_len) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR); + ret = MBEDTLS_ERR_SSL_BAD_HS_FINISHED; + goto exit; + } + + if (mbedtls_ct_memcmp(ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl), + buf, hash_len) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message")); + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR); + ret = MBEDTLS_ERR_SSL_BAD_HS_FINISHED; + goto exit; + } + +#if defined(MBEDTLS_SSL_RENEGOTIATION) + ssl->verify_data_len = hash_len; + memcpy(ssl->peer_verify_data, buf, hash_len); +#endif + + if (ssl->handshake->resume != 0) { +#if defined(MBEDTLS_SSL_CLI_C) + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) { + ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC; + } +#endif +#if defined(MBEDTLS_SSL_SRV_C) + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) { + ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; + } +#endif + } else { + ssl->state++; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + mbedtls_ssl_recv_flight_completed(ssl); + } +#endif + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse finished")); + +exit: + mbedtls_platform_zeroize(buf, hash_len); + return ret; +} + +static void ssl_handshake_params_init(mbedtls_ssl_handshake_params *handshake) +{ + memset(handshake, 0, sizeof(mbedtls_ssl_handshake_params)); + +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) + mbedtls_md5_init(&handshake->fin_md5); + mbedtls_sha1_init(&handshake->fin_sha1); + mbedtls_md5_starts_ret(&handshake->fin_md5); + mbedtls_sha1_starts_ret(&handshake->fin_sha1); +#endif +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_SHA256_C) +#if defined(MBEDTLS_USE_PSA_CRYPTO) + handshake->fin_sha256_psa = psa_hash_operation_init(); + psa_hash_setup(&handshake->fin_sha256_psa, PSA_ALG_SHA_256); +#else + mbedtls_sha256_init(&handshake->fin_sha256); + mbedtls_sha256_starts_ret(&handshake->fin_sha256, 0); +#endif +#endif +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) +#if defined(MBEDTLS_USE_PSA_CRYPTO) + handshake->fin_sha384_psa = psa_hash_operation_init(); + psa_hash_setup(&handshake->fin_sha384_psa, PSA_ALG_SHA_384); +#else + mbedtls_sha512_init(&handshake->fin_sha512); + mbedtls_sha512_starts_ret(&handshake->fin_sha512, 1); +#endif +#endif +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + + handshake->update_checksum = ssl_update_checksum_start; + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + mbedtls_ssl_sig_hash_set_init(&handshake->hash_algs); +#endif + +#if defined(MBEDTLS_DHM_C) + mbedtls_dhm_init(&handshake->dhm_ctx); +#endif +#if defined(MBEDTLS_ECDH_C) + mbedtls_ecdh_init(&handshake->ecdh_ctx); +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + mbedtls_ecjpake_init(&handshake->ecjpake_ctx); +#if defined(MBEDTLS_SSL_CLI_C) + handshake->ecjpake_cache = NULL; + handshake->ecjpake_cache_len = 0; +#endif +#endif + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + mbedtls_x509_crt_restart_init(&handshake->ecrs_ctx); +#endif + +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) + handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET; +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) && \ + !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + mbedtls_pk_init(&handshake->peer_pubkey); +#endif +} + +void mbedtls_ssl_transform_init(mbedtls_ssl_transform *transform) +{ + memset(transform, 0, sizeof(mbedtls_ssl_transform)); + + mbedtls_cipher_init(&transform->cipher_ctx_enc); + mbedtls_cipher_init(&transform->cipher_ctx_dec); + +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) + mbedtls_md_init(&transform->md_ctx_enc); + mbedtls_md_init(&transform->md_ctx_dec); +#endif +} + +void mbedtls_ssl_session_init(mbedtls_ssl_session *session) +{ + memset(session, 0, sizeof(mbedtls_ssl_session)); +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_handshake_init(mbedtls_ssl_context *ssl) +{ + /* Clear old handshake information if present */ + if (ssl->transform_negotiate) { + mbedtls_ssl_transform_free(ssl->transform_negotiate); + } + if (ssl->session_negotiate) { + mbedtls_ssl_session_free(ssl->session_negotiate); + } + if (ssl->handshake) { + mbedtls_ssl_handshake_free(ssl); + } + + /* + * Either the pointers are now NULL or cleared properly and can be freed. + * Now allocate missing structures. + */ + if (ssl->transform_negotiate == NULL) { + ssl->transform_negotiate = mbedtls_calloc(1, sizeof(mbedtls_ssl_transform)); + } + + if (ssl->session_negotiate == NULL) { + ssl->session_negotiate = mbedtls_calloc(1, sizeof(mbedtls_ssl_session)); + } + + if (ssl->handshake == NULL) { + ssl->handshake = mbedtls_calloc(1, sizeof(mbedtls_ssl_handshake_params)); + } +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + /* If the buffers are too small - reallocate */ + + handle_buffer_resizing(ssl, 0, MBEDTLS_SSL_IN_BUFFER_LEN, + MBEDTLS_SSL_OUT_BUFFER_LEN); +#endif + + /* All pointers should exist and can be directly freed without issue */ + if (ssl->handshake == NULL || + ssl->transform_negotiate == NULL || + ssl->session_negotiate == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("alloc() of ssl sub-contexts failed")); + + mbedtls_free(ssl->handshake); + mbedtls_free(ssl->transform_negotiate); + mbedtls_free(ssl->session_negotiate); + + ssl->handshake = NULL; + ssl->transform_negotiate = NULL; + ssl->session_negotiate = NULL; + + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + /* Initialize structures */ + mbedtls_ssl_session_init(ssl->session_negotiate); + mbedtls_ssl_transform_init(ssl->transform_negotiate); + ssl_handshake_params_init(ssl->handshake); + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + ssl->handshake->alt_transform_out = ssl->transform_out; + + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) { + ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING; + } else { + ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING; + } + + mbedtls_ssl_set_timer(ssl, 0); + } +#endif + + return 0; +} + +#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) +/* Dummy cookie callbacks for defaults */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_cookie_write_dummy(void *ctx, + unsigned char **p, unsigned char *end, + const unsigned char *cli_id, size_t cli_id_len) +{ + ((void) ctx); + ((void) p); + ((void) end); + ((void) cli_id); + ((void) cli_id_len); + + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; +} + +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_cookie_check_dummy(void *ctx, + const unsigned char *cookie, size_t cookie_len, + const unsigned char *cli_id, size_t cli_id_len) +{ + ((void) ctx); + ((void) cookie); + ((void) cookie_len); + ((void) cli_id); + ((void) cli_id_len); + + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; +} +#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ + +/* + * Initialize an SSL context + */ +void mbedtls_ssl_init(mbedtls_ssl_context *ssl) +{ + memset(ssl, 0, sizeof(mbedtls_ssl_context)); +} + +/* + * Setup an SSL context + */ + +int mbedtls_ssl_setup(mbedtls_ssl_context *ssl, + const mbedtls_ssl_config *conf) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN; + size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN; + + ssl->conf = conf; + + /* + * Prepare base structures + */ + + /* Set to NULL in case of an error condition */ + ssl->out_buf = NULL; + +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + ssl->in_buf_len = in_buf_len; +#endif + ssl->in_buf = mbedtls_calloc(1, in_buf_len); + if (ssl->in_buf == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", in_buf_len)); + ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; + goto error; + } + +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + ssl->out_buf_len = out_buf_len; +#endif + ssl->out_buf = mbedtls_calloc(1, out_buf_len); + if (ssl->out_buf == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", out_buf_len)); + ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; + goto error; + } + + mbedtls_ssl_reset_in_out_pointers(ssl); + +#if defined(MBEDTLS_SSL_DTLS_SRTP) + memset(&ssl->dtls_srtp_info, 0, sizeof(ssl->dtls_srtp_info)); +#endif + + if ((ret = ssl_handshake_init(ssl)) != 0) { + goto error; + } + + return 0; + +error: + mbedtls_free(ssl->in_buf); + mbedtls_free(ssl->out_buf); + + ssl->conf = NULL; + +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + ssl->in_buf_len = 0; + ssl->out_buf_len = 0; +#endif + ssl->in_buf = NULL; + ssl->out_buf = NULL; + + ssl->in_hdr = NULL; + ssl->in_ctr = NULL; + ssl->in_len = NULL; + ssl->in_iv = NULL; + ssl->in_msg = NULL; + + ssl->out_hdr = NULL; + ssl->out_ctr = NULL; + ssl->out_len = NULL; + ssl->out_iv = NULL; + ssl->out_msg = NULL; + + return ret; +} + +/* + * Reset an initialized and used SSL context for re-use while retaining + * all application-set variables, function pointers and data. + * + * If partial is non-zero, keep data in the input buffer and client ID. + * (Use when a DTLS client reconnects from the same port.) + */ +int mbedtls_ssl_session_reset_int(mbedtls_ssl_context *ssl, int partial) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + size_t in_buf_len = ssl->in_buf_len; + size_t out_buf_len = ssl->out_buf_len; +#else + size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN; + size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN; +#endif + +#if !defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) || \ + !defined(MBEDTLS_SSL_SRV_C) + ((void) partial); +#endif + + ssl->state = MBEDTLS_SSL_HELLO_REQUEST; + + /* Cancel any possibly running timer */ + mbedtls_ssl_set_timer(ssl, 0); + +#if defined(MBEDTLS_SSL_RENEGOTIATION) + ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE; + ssl->renego_records_seen = 0; + + ssl->verify_data_len = 0; + memset(ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN); + memset(ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN); +#endif + ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION; + + ssl->in_offt = NULL; + mbedtls_ssl_reset_in_out_pointers(ssl); + + ssl->in_msgtype = 0; + ssl->in_msglen = 0; +#if defined(MBEDTLS_SSL_PROTO_DTLS) + ssl->next_record_offset = 0; + ssl->in_epoch = 0; +#endif +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) + mbedtls_ssl_dtls_replay_reset(ssl); +#endif + + ssl->in_hslen = 0; + ssl->nb_zero = 0; + + ssl->keep_current_message = 0; + + ssl->out_msgtype = 0; + ssl->out_msglen = 0; + ssl->out_left = 0; +#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) + if (ssl->split_done != MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED) { + ssl->split_done = 0; + } +#endif + + memset(ssl->cur_out_ctr, 0, sizeof(ssl->cur_out_ctr)); + + ssl->transform_in = NULL; + ssl->transform_out = NULL; + + ssl->session_in = NULL; + ssl->session_out = NULL; + + memset(ssl->out_buf, 0, out_buf_len); + + int clear_in_buf = 1; +#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C) + if (partial != 0) { + clear_in_buf = 0; + } +#endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */ + if (clear_in_buf) { + ssl->in_left = 0; + memset(ssl->in_buf, 0, in_buf_len); + } + +#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) + if (mbedtls_ssl_hw_record_reset != NULL) { + MBEDTLS_SSL_DEBUG_MSG(2, ("going for mbedtls_ssl_hw_record_reset()")); + if ((ret = mbedtls_ssl_hw_record_reset(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_hw_record_reset", ret); + return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; + } + } +#endif + + if (ssl->transform) { + mbedtls_ssl_transform_free(ssl->transform); + mbedtls_free(ssl->transform); + ssl->transform = NULL; + } + + if (ssl->session) { + mbedtls_ssl_session_free(ssl->session); + mbedtls_free(ssl->session); + ssl->session = NULL; + } + +#if defined(MBEDTLS_SSL_ALPN) + ssl->alpn_chosen = NULL; +#endif + +#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) + int free_cli_id = 1; +#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) + if (partial != 0) { + free_cli_id = 0; + } +#endif + if (free_cli_id) { + mbedtls_free(ssl->cli_id); + ssl->cli_id = NULL; + ssl->cli_id_len = 0; + } +#endif + + if ((ret = ssl_handshake_init(ssl)) != 0) { + return ret; + } + + return 0; +} + +/* + * Reset an initialized and used SSL context for re-use while retaining + * all application-set variables, function pointers and data. + */ +int mbedtls_ssl_session_reset(mbedtls_ssl_context *ssl) +{ + return mbedtls_ssl_session_reset_int(ssl, 0); +} + +/* + * SSL set accessors + */ +void mbedtls_ssl_conf_endpoint(mbedtls_ssl_config *conf, int endpoint) +{ + conf->endpoint = endpoint; +} + +void mbedtls_ssl_conf_transport(mbedtls_ssl_config *conf, int transport) +{ + conf->transport = transport; +} + +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) +void mbedtls_ssl_conf_dtls_anti_replay(mbedtls_ssl_config *conf, char mode) +{ + conf->anti_replay = mode; +} +#endif + +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) +void mbedtls_ssl_conf_dtls_badmac_limit(mbedtls_ssl_config *conf, unsigned limit) +{ + conf->badmac_limit = limit; +} +#endif + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + +void mbedtls_ssl_set_datagram_packing(mbedtls_ssl_context *ssl, + unsigned allow_packing) +{ + ssl->disable_datagram_packing = !allow_packing; +} + +void mbedtls_ssl_conf_handshake_timeout(mbedtls_ssl_config *conf, + uint32_t min, uint32_t max) +{ + conf->hs_timeout_min = min; + conf->hs_timeout_max = max; +} +#endif + +void mbedtls_ssl_conf_authmode(mbedtls_ssl_config *conf, int authmode) +{ + conf->authmode = authmode; +} + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +void mbedtls_ssl_conf_verify(mbedtls_ssl_config *conf, + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), + void *p_vrfy) +{ + conf->f_vrfy = f_vrfy; + conf->p_vrfy = p_vrfy; +} +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +void mbedtls_ssl_conf_rng(mbedtls_ssl_config *conf, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + conf->f_rng = f_rng; + conf->p_rng = p_rng; +} + +void mbedtls_ssl_conf_dbg(mbedtls_ssl_config *conf, + void (*f_dbg)(void *, int, const char *, int, const char *), + void *p_dbg) +{ + conf->f_dbg = f_dbg; + conf->p_dbg = p_dbg; +} + +void mbedtls_ssl_set_bio(mbedtls_ssl_context *ssl, + void *p_bio, + mbedtls_ssl_send_t *f_send, + mbedtls_ssl_recv_t *f_recv, + mbedtls_ssl_recv_timeout_t *f_recv_timeout) +{ + ssl->p_bio = p_bio; + ssl->f_send = f_send; + ssl->f_recv = f_recv; + ssl->f_recv_timeout = f_recv_timeout; +} + +#if defined(MBEDTLS_SSL_PROTO_DTLS) +void mbedtls_ssl_set_mtu(mbedtls_ssl_context *ssl, uint16_t mtu) +{ + ssl->mtu = mtu; +} +#endif + +void mbedtls_ssl_conf_read_timeout(mbedtls_ssl_config *conf, uint32_t timeout) +{ + conf->read_timeout = timeout; +} + +void mbedtls_ssl_set_timer_cb(mbedtls_ssl_context *ssl, + void *p_timer, + mbedtls_ssl_set_timer_t *f_set_timer, + mbedtls_ssl_get_timer_t *f_get_timer) +{ + ssl->p_timer = p_timer; + ssl->f_set_timer = f_set_timer; + ssl->f_get_timer = f_get_timer; + + /* Make sure we start with no timer running */ + mbedtls_ssl_set_timer(ssl, 0); +} + +#if defined(MBEDTLS_SSL_SRV_C) +void mbedtls_ssl_conf_session_cache(mbedtls_ssl_config *conf, + void *p_cache, + int (*f_get_cache)(void *, mbedtls_ssl_session *), + int (*f_set_cache)(void *, const mbedtls_ssl_session *)) +{ + conf->p_cache = p_cache; + conf->f_get_cache = f_get_cache; + conf->f_set_cache = f_set_cache; +} +#endif /* MBEDTLS_SSL_SRV_C */ + +#if defined(MBEDTLS_SSL_CLI_C) +int mbedtls_ssl_set_session(mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (ssl == NULL || + session == NULL || + ssl->session_negotiate == NULL || + ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if ((ret = mbedtls_ssl_session_copy(ssl->session_negotiate, + session)) != 0) { + return ret; + } + + ssl->handshake->resume = 1; + + return 0; +} +#endif /* MBEDTLS_SSL_CLI_C */ + +void mbedtls_ssl_conf_ciphersuites(mbedtls_ssl_config *conf, + const int *ciphersuites) +{ + conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = ciphersuites; + conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = ciphersuites; + conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = ciphersuites; + conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = ciphersuites; +} + +void mbedtls_ssl_conf_ciphersuites_for_version(mbedtls_ssl_config *conf, + const int *ciphersuites, + int major, int minor) +{ + if (major != MBEDTLS_SSL_MAJOR_VERSION_3) { + return; + } + + if (minor < MBEDTLS_SSL_MINOR_VERSION_0 || minor > MBEDTLS_SSL_MINOR_VERSION_3) { + return; + } + + conf->ciphersuite_list[minor] = ciphersuites; +} + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +void mbedtls_ssl_conf_cert_profile(mbedtls_ssl_config *conf, + const mbedtls_x509_crt_profile *profile) +{ + conf->cert_profile = profile; +} + +/* Append a new keycert entry to a (possibly empty) list */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_append_key_cert(mbedtls_ssl_key_cert **head, + mbedtls_x509_crt *cert, + mbedtls_pk_context *key) +{ + mbedtls_ssl_key_cert *new_cert; + + new_cert = mbedtls_calloc(1, sizeof(mbedtls_ssl_key_cert)); + if (new_cert == NULL) { + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + new_cert->cert = cert; + new_cert->key = key; + new_cert->next = NULL; + + /* Update head is the list was null, else add to the end */ + if (*head == NULL) { + *head = new_cert; + } else { + mbedtls_ssl_key_cert *cur = *head; + while (cur->next != NULL) { + cur = cur->next; + } + cur->next = new_cert; + } + + return 0; +} + +int mbedtls_ssl_conf_own_cert(mbedtls_ssl_config *conf, + mbedtls_x509_crt *own_cert, + mbedtls_pk_context *pk_key) +{ + return ssl_append_key_cert(&conf->key_cert, own_cert, pk_key); +} + +void mbedtls_ssl_conf_ca_chain(mbedtls_ssl_config *conf, + mbedtls_x509_crt *ca_chain, + mbedtls_x509_crl *ca_crl) +{ + conf->ca_chain = ca_chain; + conf->ca_crl = ca_crl; + +#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) + /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb() + * cannot be used together. */ + conf->f_ca_cb = NULL; + conf->p_ca_cb = NULL; +#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ +} + +#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) +void mbedtls_ssl_conf_ca_cb(mbedtls_ssl_config *conf, + mbedtls_x509_crt_ca_cb_t f_ca_cb, + void *p_ca_cb) +{ + conf->f_ca_cb = f_ca_cb; + conf->p_ca_cb = p_ca_cb; + + /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb() + * cannot be used together. */ + conf->ca_chain = NULL; + conf->ca_crl = NULL; +} +#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) +int mbedtls_ssl_set_hs_own_cert(mbedtls_ssl_context *ssl, + mbedtls_x509_crt *own_cert, + mbedtls_pk_context *pk_key) +{ + return ssl_append_key_cert(&ssl->handshake->sni_key_cert, + own_cert, pk_key); +} + +void mbedtls_ssl_set_hs_ca_chain(mbedtls_ssl_context *ssl, + mbedtls_x509_crt *ca_chain, + mbedtls_x509_crl *ca_crl) +{ + ssl->handshake->sni_ca_chain = ca_chain; + ssl->handshake->sni_ca_crl = ca_crl; +} + +void mbedtls_ssl_set_hs_authmode(mbedtls_ssl_context *ssl, + int authmode) +{ + ssl->handshake->sni_authmode = authmode; +} +#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +void mbedtls_ssl_set_verify(mbedtls_ssl_context *ssl, + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), + void *p_vrfy) +{ + ssl->f_vrfy = f_vrfy; + ssl->p_vrfy = p_vrfy; +} +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) +/* + * Set EC J-PAKE password for current handshake + */ +int mbedtls_ssl_set_hs_ecjpake_password(mbedtls_ssl_context *ssl, + const unsigned char *pw, + size_t pw_len) +{ + mbedtls_ecjpake_role role; + + if (ssl->handshake == NULL || ssl->conf == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) { + role = MBEDTLS_ECJPAKE_SERVER; + } else { + role = MBEDTLS_ECJPAKE_CLIENT; + } + + return mbedtls_ecjpake_setup(&ssl->handshake->ecjpake_ctx, + role, + MBEDTLS_MD_SHA256, + MBEDTLS_ECP_DP_SECP256R1, + pw, pw_len); +} +#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) + +static void ssl_conf_remove_psk(mbedtls_ssl_config *conf) +{ + /* Remove reference to existing PSK, if any. */ +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) { + /* The maintenance of the PSK key slot is the + * user's responsibility. */ + conf->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT; + } + /* This and the following branch should never + * be taken simultaneously as we maintain the + * invariant that raw and opaque PSKs are never + * configured simultaneously. As a safeguard, + * though, `else` is omitted here. */ +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + if (conf->psk != NULL) { + mbedtls_platform_zeroize(conf->psk, conf->psk_len); + + mbedtls_free(conf->psk); + conf->psk = NULL; + conf->psk_len = 0; + } + + /* Remove reference to PSK identity, if any. */ + if (conf->psk_identity != NULL) { + mbedtls_free(conf->psk_identity); + conf->psk_identity = NULL; + conf->psk_identity_len = 0; + } +} + +/* This function assumes that PSK identity in the SSL config is unset. + * It checks that the provided identity is well-formed and attempts + * to make a copy of it in the SSL config. + * On failure, the PSK identity in the config remains unset. */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_conf_set_psk_identity(mbedtls_ssl_config *conf, + unsigned char const *psk_identity, + size_t psk_identity_len) +{ + /* Identity len will be encoded on two bytes */ + if (psk_identity == NULL || + (psk_identity_len >> 16) != 0 || + psk_identity_len > MBEDTLS_SSL_OUT_CONTENT_LEN) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + conf->psk_identity = mbedtls_calloc(1, psk_identity_len); + if (conf->psk_identity == NULL) { + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + conf->psk_identity_len = psk_identity_len; + memcpy(conf->psk_identity, psk_identity, conf->psk_identity_len); + + return 0; +} + +int mbedtls_ssl_conf_psk(mbedtls_ssl_config *conf, + const unsigned char *psk, size_t psk_len, + const unsigned char *psk_identity, size_t psk_identity_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + /* Remove opaque/raw PSK + PSK Identity */ + ssl_conf_remove_psk(conf); + + /* Check and set raw PSK */ + if (psk == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + if (psk_len == 0) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + if (psk_len > MBEDTLS_PSK_MAX_LEN) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if ((conf->psk = mbedtls_calloc(1, psk_len)) == NULL) { + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + conf->psk_len = psk_len; + memcpy(conf->psk, psk, conf->psk_len); + + /* Check and set PSK Identity */ + ret = ssl_conf_set_psk_identity(conf, psk_identity, psk_identity_len); + if (ret != 0) { + ssl_conf_remove_psk(conf); + } + + return ret; +} + +static void ssl_remove_psk(mbedtls_ssl_context *ssl) +{ +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (!mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque)) { + ssl->handshake->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT; + } else +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + if (ssl->handshake->psk != NULL) { + mbedtls_platform_zeroize(ssl->handshake->psk, + ssl->handshake->psk_len); + mbedtls_free(ssl->handshake->psk); + ssl->handshake->psk_len = 0; + ssl->handshake->psk = NULL; + } +} + +int mbedtls_ssl_set_hs_psk(mbedtls_ssl_context *ssl, + const unsigned char *psk, size_t psk_len) +{ + if (psk == NULL || ssl->handshake == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (psk_len > MBEDTLS_PSK_MAX_LEN) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + ssl_remove_psk(ssl); + + if ((ssl->handshake->psk = mbedtls_calloc(1, psk_len)) == NULL) { + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + ssl->handshake->psk_len = psk_len; + memcpy(ssl->handshake->psk, psk, ssl->handshake->psk_len); + + return 0; +} + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +int mbedtls_ssl_conf_psk_opaque(mbedtls_ssl_config *conf, + psa_key_id_t psk, + const unsigned char *psk_identity, + size_t psk_identity_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + /* Clear opaque/raw PSK + PSK Identity, if present. */ + ssl_conf_remove_psk(conf); + + /* Check and set opaque PSK */ + if (mbedtls_svc_key_id_is_null(psk)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + conf->psk_opaque = psk; + + /* Check and set PSK Identity */ + ret = ssl_conf_set_psk_identity(conf, psk_identity, + psk_identity_len); + if (ret != 0) { + ssl_conf_remove_psk(conf); + } + + return ret; +} + +int mbedtls_ssl_set_hs_psk_opaque(mbedtls_ssl_context *ssl, + psa_key_id_t psk) +{ + if ((mbedtls_svc_key_id_is_null(psk)) || + (ssl->handshake == NULL)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + ssl_remove_psk(ssl); + ssl->handshake->psk_opaque = psk; + return 0; +} +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +void mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config *conf, + int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, + size_t), + void *p_psk) +{ + conf->f_psk = f_psk; + conf->p_psk = p_psk; +} +#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */ + +#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +int mbedtls_ssl_conf_dh_param(mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if ((ret = mbedtls_mpi_read_string(&conf->dhm_P, 16, dhm_P)) != 0 || + (ret = mbedtls_mpi_read_string(&conf->dhm_G, 16, dhm_G)) != 0) { + mbedtls_mpi_free(&conf->dhm_P); + mbedtls_mpi_free(&conf->dhm_G); + return ret; + } + + return 0; +} +#endif /* MBEDTLS_DEPRECATED_REMOVED */ + +int mbedtls_ssl_conf_dh_param_bin(mbedtls_ssl_config *conf, + const unsigned char *dhm_P, size_t P_len, + const unsigned char *dhm_G, size_t G_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + mbedtls_mpi_free(&conf->dhm_P); + mbedtls_mpi_free(&conf->dhm_G); + + if ((ret = mbedtls_mpi_read_binary(&conf->dhm_P, dhm_P, P_len)) != 0 || + (ret = mbedtls_mpi_read_binary(&conf->dhm_G, dhm_G, G_len)) != 0) { + mbedtls_mpi_free(&conf->dhm_P); + mbedtls_mpi_free(&conf->dhm_G); + return ret; + } + + return 0; +} + +int mbedtls_ssl_conf_dh_param_ctx(mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + mbedtls_mpi_free(&conf->dhm_P); + mbedtls_mpi_free(&conf->dhm_G); + + if ((ret = mbedtls_mpi_copy(&conf->dhm_P, &dhm_ctx->P)) != 0 || + (ret = mbedtls_mpi_copy(&conf->dhm_G, &dhm_ctx->G)) != 0) { + mbedtls_mpi_free(&conf->dhm_P); + mbedtls_mpi_free(&conf->dhm_G); + return ret; + } + + return 0; +} +#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */ + +#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) +/* + * Set the minimum length for Diffie-Hellman parameters + */ +void mbedtls_ssl_conf_dhm_min_bitlen(mbedtls_ssl_config *conf, + unsigned int bitlen) +{ + conf->dhm_min_bitlen = bitlen; +} +#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */ + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) +/* + * Set allowed/preferred hashes for handshake signatures + */ +void mbedtls_ssl_conf_sig_hashes(mbedtls_ssl_config *conf, + const int *hashes) +{ + conf->sig_hashes = hashes; +} +#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ + +#if defined(MBEDTLS_ECP_C) +/* + * Set the allowed elliptic curves + */ +void mbedtls_ssl_conf_curves(mbedtls_ssl_config *conf, + const mbedtls_ecp_group_id *curve_list) +{ + conf->curve_list = curve_list; +} +#endif /* MBEDTLS_ECP_C */ + +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) +void mbedtls_ssl_conf_sni(mbedtls_ssl_config *conf, + int (*f_sni)(void *, mbedtls_ssl_context *, + const unsigned char *, size_t), + void *p_sni) +{ + conf->f_sni = f_sni; + conf->p_sni = p_sni; +} +#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ + +#if defined(MBEDTLS_SSL_ALPN) +int mbedtls_ssl_conf_alpn_protocols(mbedtls_ssl_config *conf, const char **protos) +{ + size_t cur_len, tot_len; + const char **p; + + /* + * RFC 7301 3.1: "Empty strings MUST NOT be included and byte strings + * MUST NOT be truncated." + * We check lengths now rather than later. + */ + tot_len = 0; + for (p = protos; *p != NULL; p++) { + cur_len = strlen(*p); + tot_len += cur_len; + + if ((cur_len == 0) || + (cur_len > MBEDTLS_SSL_MAX_ALPN_NAME_LEN) || + (tot_len > MBEDTLS_SSL_MAX_ALPN_LIST_LEN)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + } + + conf->alpn_list = protos; + + return 0; +} + +const char *mbedtls_ssl_get_alpn_protocol(const mbedtls_ssl_context *ssl) +{ + return ssl->alpn_chosen; +} +#endif /* MBEDTLS_SSL_ALPN */ + +#if defined(MBEDTLS_SSL_DTLS_SRTP) +void mbedtls_ssl_conf_srtp_mki_value_supported(mbedtls_ssl_config *conf, + int support_mki_value) +{ + conf->dtls_srtp_mki_support = support_mki_value; +} + +int mbedtls_ssl_dtls_srtp_set_mki_value(mbedtls_ssl_context *ssl, + unsigned char *mki_value, + uint16_t mki_len) +{ + if (mki_len > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED) { + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + } + + memcpy(ssl->dtls_srtp_info.mki_value, mki_value, mki_len); + ssl->dtls_srtp_info.mki_len = mki_len; + return 0; +} + +int mbedtls_ssl_conf_dtls_srtp_protection_profiles(mbedtls_ssl_config *conf, + const mbedtls_ssl_srtp_profile *profiles) +{ + const mbedtls_ssl_srtp_profile *p; + size_t list_size = 0; + + /* check the profiles list: all entry must be valid, + * its size cannot be more than the total number of supported profiles, currently 4 */ + for (p = profiles; *p != MBEDTLS_TLS_SRTP_UNSET && + list_size <= MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH; + p++) { + if (mbedtls_ssl_check_srtp_profile_value(*p) != MBEDTLS_TLS_SRTP_UNSET) { + list_size++; + } else { + /* unsupported value, stop parsing and set the size to an error value */ + list_size = MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH + 1; + } + } + + if (list_size > MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH) { + conf->dtls_srtp_profile_list = NULL; + conf->dtls_srtp_profile_list_len = 0; + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + conf->dtls_srtp_profile_list = profiles; + conf->dtls_srtp_profile_list_len = list_size; + + return 0; +} + +void mbedtls_ssl_get_dtls_srtp_negotiation_result(const mbedtls_ssl_context *ssl, + mbedtls_dtls_srtp_info *dtls_srtp_info) +{ + dtls_srtp_info->chosen_dtls_srtp_profile = ssl->dtls_srtp_info.chosen_dtls_srtp_profile; + /* do not copy the mki value if there is no chosen profile */ + if (dtls_srtp_info->chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET) { + dtls_srtp_info->mki_len = 0; + } else { + dtls_srtp_info->mki_len = ssl->dtls_srtp_info.mki_len; + memcpy(dtls_srtp_info->mki_value, ssl->dtls_srtp_info.mki_value, + ssl->dtls_srtp_info.mki_len); + } +} +#endif /* MBEDTLS_SSL_DTLS_SRTP */ + +void mbedtls_ssl_conf_max_version(mbedtls_ssl_config *conf, int major, int minor) +{ + conf->max_major_ver = major; + conf->max_minor_ver = minor; +} + +void mbedtls_ssl_conf_min_version(mbedtls_ssl_config *conf, int major, int minor) +{ + conf->min_major_ver = major; + conf->min_minor_ver = minor; +} + +#if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) +void mbedtls_ssl_conf_fallback(mbedtls_ssl_config *conf, char fallback) +{ + conf->fallback = fallback; +} +#endif + +#if defined(MBEDTLS_SSL_SRV_C) +void mbedtls_ssl_conf_cert_req_ca_list(mbedtls_ssl_config *conf, + char cert_req_ca_list) +{ + conf->cert_req_ca_list = cert_req_ca_list; +} +#endif + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) +void mbedtls_ssl_conf_encrypt_then_mac(mbedtls_ssl_config *conf, char etm) +{ + conf->encrypt_then_mac = etm; +} +#endif + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) +void mbedtls_ssl_conf_extended_master_secret(mbedtls_ssl_config *conf, char ems) +{ + conf->extended_ms = ems; +} +#endif + +#if defined(MBEDTLS_ARC4_C) +void mbedtls_ssl_conf_arc4_support(mbedtls_ssl_config *conf, char arc4) +{ + conf->arc4_disabled = arc4; +} +#endif + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) +int mbedtls_ssl_conf_max_frag_len(mbedtls_ssl_config *conf, unsigned char mfl_code) +{ + if (mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID || + ssl_mfl_code_to_length(mfl_code) > MBEDTLS_TLS_EXT_ADV_CONTENT_LEN) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + conf->mfl_code = mfl_code; + + return 0; +} +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) +void mbedtls_ssl_conf_truncated_hmac(mbedtls_ssl_config *conf, int truncate) +{ + conf->trunc_hmac = truncate; +} +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ + +#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) +void mbedtls_ssl_conf_cbc_record_splitting(mbedtls_ssl_config *conf, char split) +{ + conf->cbc_record_splitting = split; +} +#endif + +void mbedtls_ssl_conf_legacy_renegotiation(mbedtls_ssl_config *conf, int allow_legacy) +{ + conf->allow_legacy_renegotiation = allow_legacy; +} + +#if defined(MBEDTLS_SSL_RENEGOTIATION) +void mbedtls_ssl_conf_renegotiation(mbedtls_ssl_config *conf, int renegotiation) +{ + conf->disable_renegotiation = renegotiation; +} + +void mbedtls_ssl_conf_renegotiation_enforced(mbedtls_ssl_config *conf, int max_records) +{ + conf->renego_max_records = max_records; +} + +void mbedtls_ssl_conf_renegotiation_period(mbedtls_ssl_config *conf, + const unsigned char period[8]) +{ + memcpy(conf->renego_period, period, 8); +} +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) +#if defined(MBEDTLS_SSL_CLI_C) +void mbedtls_ssl_conf_session_tickets(mbedtls_ssl_config *conf, int use_tickets) +{ + conf->session_tickets = use_tickets; +} +#endif + +#if defined(MBEDTLS_SSL_SRV_C) +void mbedtls_ssl_conf_session_tickets_cb(mbedtls_ssl_config *conf, + mbedtls_ssl_ticket_write_t *f_ticket_write, + mbedtls_ssl_ticket_parse_t *f_ticket_parse, + void *p_ticket) +{ + conf->f_ticket_write = f_ticket_write; + conf->f_ticket_parse = f_ticket_parse; + conf->p_ticket = p_ticket; +} +#endif +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + +#if defined(MBEDTLS_SSL_EXPORT_KEYS) +void mbedtls_ssl_conf_export_keys_cb(mbedtls_ssl_config *conf, + mbedtls_ssl_export_keys_t *f_export_keys, + void *p_export_keys) +{ + conf->f_export_keys = f_export_keys; + conf->p_export_keys = p_export_keys; +} + +void mbedtls_ssl_conf_export_keys_ext_cb(mbedtls_ssl_config *conf, + mbedtls_ssl_export_keys_ext_t *f_export_keys_ext, + void *p_export_keys) +{ + conf->f_export_keys_ext = f_export_keys_ext; + conf->p_export_keys = p_export_keys; +} +#endif + +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) +void mbedtls_ssl_conf_async_private_cb( + mbedtls_ssl_config *conf, + mbedtls_ssl_async_sign_t *f_async_sign, + mbedtls_ssl_async_decrypt_t *f_async_decrypt, + mbedtls_ssl_async_resume_t *f_async_resume, + mbedtls_ssl_async_cancel_t *f_async_cancel, + void *async_config_data) +{ + conf->f_async_sign_start = f_async_sign; + conf->f_async_decrypt_start = f_async_decrypt; + conf->f_async_resume = f_async_resume; + conf->f_async_cancel = f_async_cancel; + conf->p_async_config_data = async_config_data; +} + +void *mbedtls_ssl_conf_get_async_config_data(const mbedtls_ssl_config *conf) +{ + return conf->p_async_config_data; +} + +void *mbedtls_ssl_get_async_operation_data(const mbedtls_ssl_context *ssl) +{ + if (ssl->handshake == NULL) { + return NULL; + } else { + return ssl->handshake->user_async_ctx; + } +} + +void mbedtls_ssl_set_async_operation_data(mbedtls_ssl_context *ssl, + void *ctx) +{ + if (ssl->handshake != NULL) { + ssl->handshake->user_async_ctx = ctx; + } +} +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ + +/* + * SSL get accessors + */ +uint32_t mbedtls_ssl_get_verify_result(const mbedtls_ssl_context *ssl) +{ + if (ssl->session != NULL) { + return ssl->session->verify_result; + } + + if (ssl->session_negotiate != NULL) { + return ssl->session_negotiate->verify_result; + } + + return 0xFFFFFFFF; +} + +const char *mbedtls_ssl_get_ciphersuite(const mbedtls_ssl_context *ssl) +{ + if (ssl == NULL || ssl->session == NULL) { + return NULL; + } + + return mbedtls_ssl_get_ciphersuite_name(ssl->session->ciphersuite); +} + +const char *mbedtls_ssl_get_version(const mbedtls_ssl_context *ssl) +{ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + switch (ssl->minor_ver) { + case MBEDTLS_SSL_MINOR_VERSION_2: + return "DTLSv1.0"; + + case MBEDTLS_SSL_MINOR_VERSION_3: + return "DTLSv1.2"; + + default: + return "unknown (DTLS)"; + } + } +#endif + + switch (ssl->minor_ver) { + case MBEDTLS_SSL_MINOR_VERSION_0: + return "SSLv3.0"; + + case MBEDTLS_SSL_MINOR_VERSION_1: + return "TLSv1.0"; + + case MBEDTLS_SSL_MINOR_VERSION_2: + return "TLSv1.1"; + + case MBEDTLS_SSL_MINOR_VERSION_3: + return "TLSv1.2"; + + default: + return "unknown"; + } +} + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) +size_t mbedtls_ssl_get_input_max_frag_len(const mbedtls_ssl_context *ssl) +{ + size_t max_len = MBEDTLS_SSL_MAX_CONTENT_LEN; + size_t read_mfl; + + /* Use the configured MFL for the client if we're past SERVER_HELLO_DONE */ + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT && + ssl->state >= MBEDTLS_SSL_SERVER_HELLO_DONE) { + return ssl_mfl_code_to_length(ssl->conf->mfl_code); + } + + /* Check if a smaller max length was negotiated */ + if (ssl->session_out != NULL) { + read_mfl = ssl_mfl_code_to_length(ssl->session_out->mfl_code); + if (read_mfl < max_len) { + max_len = read_mfl; + } + } + + // During a handshake, use the value being negotiated + if (ssl->session_negotiate != NULL) { + read_mfl = ssl_mfl_code_to_length(ssl->session_negotiate->mfl_code); + if (read_mfl < max_len) { + max_len = read_mfl; + } + } + + return max_len; +} + +size_t mbedtls_ssl_get_output_max_frag_len(const mbedtls_ssl_context *ssl) +{ + size_t max_len; + + /* + * Assume mfl_code is correct since it was checked when set + */ + max_len = ssl_mfl_code_to_length(ssl->conf->mfl_code); + + /* Check if a smaller max length was negotiated */ + if (ssl->session_out != NULL && + ssl_mfl_code_to_length(ssl->session_out->mfl_code) < max_len) { + max_len = ssl_mfl_code_to_length(ssl->session_out->mfl_code); + } + + /* During a handshake, use the value being negotiated */ + if (ssl->session_negotiate != NULL && + ssl_mfl_code_to_length(ssl->session_negotiate->mfl_code) < max_len) { + max_len = ssl_mfl_code_to_length(ssl->session_negotiate->mfl_code); + } + + return max_len; +} + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) +size_t mbedtls_ssl_get_max_frag_len(const mbedtls_ssl_context *ssl) +{ + return mbedtls_ssl_get_output_max_frag_len(ssl); +} +#endif /* !MBEDTLS_DEPRECATED_REMOVED */ +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) +size_t mbedtls_ssl_get_current_mtu(const mbedtls_ssl_context *ssl) +{ + /* Return unlimited mtu for client hello messages to avoid fragmentation. */ + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT && + (ssl->state == MBEDTLS_SSL_CLIENT_HELLO || + ssl->state == MBEDTLS_SSL_SERVER_HELLO)) { + return 0; + } + + if (ssl->handshake == NULL || ssl->handshake->mtu == 0) { + return ssl->mtu; + } + + if (ssl->mtu == 0) { + return ssl->handshake->mtu; + } + + return ssl->mtu < ssl->handshake->mtu ? + ssl->mtu : ssl->handshake->mtu; +} +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +int mbedtls_ssl_get_max_out_record_payload(const mbedtls_ssl_context *ssl) +{ + size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN; + +#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \ + !defined(MBEDTLS_SSL_PROTO_DTLS) + (void) ssl; +#endif + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) + const size_t mfl = mbedtls_ssl_get_output_max_frag_len(ssl); + + if (max_len > mfl) { + max_len = mfl; + } +#endif + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (mbedtls_ssl_get_current_mtu(ssl) != 0) { + const size_t mtu = mbedtls_ssl_get_current_mtu(ssl); + const int ret = mbedtls_ssl_get_record_expansion(ssl); + const size_t overhead = (size_t) ret; + + if (ret < 0) { + return ret; + } + + if (mtu <= overhead) { + MBEDTLS_SSL_DEBUG_MSG(1, ("MTU too low for record expansion")); + return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + } + + if (max_len > mtu - overhead) { + max_len = mtu - overhead; + } + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \ + !defined(MBEDTLS_SSL_PROTO_DTLS) + ((void) ssl); +#endif + + return (int) max_len; +} + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert(const mbedtls_ssl_context *ssl) +{ + if (ssl == NULL || ssl->session == NULL) { + return NULL; + } + +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + return ssl->session->peer_cert; +#else + return NULL; +#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ +} +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +#if defined(MBEDTLS_SSL_CLI_C) +int mbedtls_ssl_get_session(const mbedtls_ssl_context *ssl, + mbedtls_ssl_session *dst) +{ + if (ssl == NULL || + dst == NULL || + ssl->session == NULL || + ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + return mbedtls_ssl_session_copy(dst, ssl->session); +} +#endif /* MBEDTLS_SSL_CLI_C */ + +const mbedtls_ssl_session *mbedtls_ssl_get_session_pointer(const mbedtls_ssl_context *ssl) +{ + if (ssl == NULL) { + return NULL; + } + + return ssl->session; +} + +/* + * Define ticket header determining Mbed TLS version + * and structure of the ticket. + */ + +/* + * Define bitflag determining compile-time settings influencing + * structure of serialized SSL sessions. + */ + +#if defined(MBEDTLS_HAVE_TIME) +#define SSL_SERIALIZED_SESSION_CONFIG_TIME 1 +#else +#define SSL_SERIALIZED_SESSION_CONFIG_TIME 0 +#endif /* MBEDTLS_HAVE_TIME */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +#define SSL_SERIALIZED_SESSION_CONFIG_CRT 1 +#else +#define SSL_SERIALIZED_SESSION_CONFIG_CRT 0 +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) +#define SSL_SERIALIZED_SESSION_CONFIG_KEEP_PEER_CRT 1 +#else +#define SSL_SERIALIZED_SESSION_CONFIG_KEEP_PEER_CRT 0 +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + +#if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_SESSION_TICKETS) +#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 1 +#else +#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 0 +#endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_SESSION_TICKETS */ + +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) +#define SSL_SERIALIZED_SESSION_CONFIG_MFL 1 +#else +#define SSL_SERIALIZED_SESSION_CONFIG_MFL 0 +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) +#define SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC 1 +#else +#define SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC 0 +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) +#define SSL_SERIALIZED_SESSION_CONFIG_ETM 1 +#else +#define SSL_SERIALIZED_SESSION_CONFIG_ETM 0 +#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) +#define SSL_SERIALIZED_SESSION_CONFIG_TICKET 1 +#else +#define SSL_SERIALIZED_SESSION_CONFIG_TICKET 0 +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ + +#define SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT 0 +#define SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT 1 +#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT 2 +#define SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT 3 +#define SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC_BIT 4 +#define SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT 5 +#define SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT 6 +#define SSL_SERIALIZED_SESSION_CONFIG_KEEP_PEER_CRT_BIT 7 + +#define SSL_SERIALIZED_SESSION_CONFIG_BITFLAG \ + ((uint16_t) ( \ + (SSL_SERIALIZED_SESSION_CONFIG_TIME << SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT) | \ + (SSL_SERIALIZED_SESSION_CONFIG_CRT << SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT) | \ + (SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET << \ + SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT) | \ + (SSL_SERIALIZED_SESSION_CONFIG_MFL << SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT) | \ + (SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC << \ + SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC_BIT) | \ + (SSL_SERIALIZED_SESSION_CONFIG_ETM << SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT) | \ + (SSL_SERIALIZED_SESSION_CONFIG_TICKET << SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT) | \ + (SSL_SERIALIZED_SESSION_CONFIG_KEEP_PEER_CRT << \ + SSL_SERIALIZED_SESSION_CONFIG_KEEP_PEER_CRT_BIT))) + +static const unsigned char ssl_serialized_session_header[] = { + MBEDTLS_VERSION_MAJOR, + MBEDTLS_VERSION_MINOR, + MBEDTLS_VERSION_PATCH, + MBEDTLS_BYTE_1(SSL_SERIALIZED_SESSION_CONFIG_BITFLAG), + MBEDTLS_BYTE_0(SSL_SERIALIZED_SESSION_CONFIG_BITFLAG), +}; + +/* + * Serialize a session in the following format: + * (in the presentation language of TLS, RFC 8446 section 3) + * + * opaque mbedtls_version[3]; // major, minor, patch + * opaque session_format[2]; // version-specific 16-bit field determining + * // the format of the remaining + * // serialized data. + * + * Note: When updating the format, remember to keep + * these version+format bytes. + * + * // In this version, `session_format` determines + * // the setting of those compile-time + * // configuration options which influence + * // the structure of mbedtls_ssl_session. + * #if defined(MBEDTLS_HAVE_TIME) + * uint64 start_time; + * #endif + * uint8 ciphersuite[2]; // defined by the standard + * uint8 compression; // 0 or 1 + * uint8 session_id_len; // at most 32 + * opaque session_id[32]; + * opaque master[48]; // fixed length in the standard + * uint32 verify_result; + * #if defined(MBEDTLS_X509_CRT_PARSE_C) + * #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + * opaque peer_cert<0..2^24-1>; // length 0 means no peer cert + * #else + * uint8 peer_cert_digest_type; + * opaque peer_cert_digest<0..2^8-1> + * #endif + * #endif + * #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) + * opaque ticket<0..2^24-1>; // length 0 means no ticket + * uint32 ticket_lifetime; + * #endif + * #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) + * uint8 mfl_code; // up to 255 according to standard + * #endif + * #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + * uint8 trunc_hmac; // 0 or 1 + * #endif + * #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + * uint8 encrypt_then_mac; // 0 or 1 + * #endif + * + * The order is the same as in the definition of the structure, except + * verify_result is put before peer_cert so that all mandatory fields come + * together in one block. + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_session_save(const mbedtls_ssl_session *session, + unsigned char omit_header, + unsigned char *buf, + size_t buf_len, + size_t *olen) +{ + unsigned char *p = buf; + size_t used = 0; +#if defined(MBEDTLS_HAVE_TIME) + uint64_t start; +#endif +#if defined(MBEDTLS_X509_CRT_PARSE_C) +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + size_t cert_len; +#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + + + if (!omit_header) { + /* + * Add version identifier + */ + + used += sizeof(ssl_serialized_session_header); + + if (used <= buf_len) { + memcpy(p, ssl_serialized_session_header, + sizeof(ssl_serialized_session_header)); + p += sizeof(ssl_serialized_session_header); + } + } + + /* + * Time + */ +#if defined(MBEDTLS_HAVE_TIME) + used += 8; + + if (used <= buf_len) { + start = (uint64_t) session->start; + + MBEDTLS_PUT_UINT64_BE(start, p, 0); + p += 8; + } +#endif /* MBEDTLS_HAVE_TIME */ + + /* + * Basic mandatory fields + */ + used += 2 /* ciphersuite */ + + 1 /* compression */ + + 1 /* id_len */ + + sizeof(session->id) + + sizeof(session->master) + + 4; /* verify_result */ + + if (used <= buf_len) { + MBEDTLS_PUT_UINT16_BE(session->ciphersuite, p, 0); + p += 2; + + *p++ = MBEDTLS_BYTE_0(session->compression); + + *p++ = MBEDTLS_BYTE_0(session->id_len); + memcpy(p, session->id, 32); + p += 32; + + memcpy(p, session->master, 48); + p += 48; + + MBEDTLS_PUT_UINT32_BE(session->verify_result, p, 0); + p += 4; + } + + /* + * Peer's end-entity certificate + */ +#if defined(MBEDTLS_X509_CRT_PARSE_C) +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + if (session->peer_cert == NULL) { + cert_len = 0; + } else { + cert_len = session->peer_cert->raw.len; + } + + used += 3 + cert_len; + + if (used <= buf_len) { + *p++ = MBEDTLS_BYTE_2(cert_len); + *p++ = MBEDTLS_BYTE_1(cert_len); + *p++ = MBEDTLS_BYTE_0(cert_len); + + if (session->peer_cert != NULL) { + memcpy(p, session->peer_cert->raw.p, cert_len); + p += cert_len; + } + } +#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + if (session->peer_cert_digest != NULL) { + used += 1 /* type */ + 1 /* length */ + session->peer_cert_digest_len; + if (used <= buf_len) { + *p++ = (unsigned char) session->peer_cert_digest_type; + *p++ = (unsigned char) session->peer_cert_digest_len; + memcpy(p, session->peer_cert_digest, + session->peer_cert_digest_len); + p += session->peer_cert_digest_len; + } + } else { + used += 2; + if (used <= buf_len) { + *p++ = (unsigned char) MBEDTLS_MD_NONE; + *p++ = 0; + } + } +#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + + /* + * Session ticket if any, plus associated data + */ +#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) + used += 3 + session->ticket_len + 4; /* len + ticket + lifetime */ + + if (used <= buf_len) { + *p++ = MBEDTLS_BYTE_2(session->ticket_len); + *p++ = MBEDTLS_BYTE_1(session->ticket_len); + *p++ = MBEDTLS_BYTE_0(session->ticket_len); + + if (session->ticket != NULL) { + memcpy(p, session->ticket, session->ticket_len); + p += session->ticket_len; + } + + MBEDTLS_PUT_UINT32_BE(session->ticket_lifetime, p, 0); + p += 4; + } +#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ + + /* + * Misc extension-related info + */ +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) + used += 1; + + if (used <= buf_len) { + *p++ = session->mfl_code; + } +#endif + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + used += 1; + + if (used <= buf_len) { + *p++ = (unsigned char) ((session->trunc_hmac) & 0xFF); + } +#endif + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + used += 1; + + if (used <= buf_len) { + *p++ = MBEDTLS_BYTE_0(session->encrypt_then_mac); + } +#endif + + /* Done */ + *olen = used; + + if (used > buf_len) { + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + + return 0; +} + +/* + * Public wrapper for ssl_session_save() + */ +int mbedtls_ssl_session_save(const mbedtls_ssl_session *session, + unsigned char *buf, + size_t buf_len, + size_t *olen) +{ + return ssl_session_save(session, 0, buf, buf_len, olen); +} + +/* + * Deserialize session, see mbedtls_ssl_session_save() for format. + * + * This internal version is wrapped by a public function that cleans up in + * case of error, and has an extra option omit_header. + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_session_load(mbedtls_ssl_session *session, + unsigned char omit_header, + const unsigned char *buf, + size_t len) +{ + const unsigned char *p = buf; + const unsigned char * const end = buf + len; +#if defined(MBEDTLS_HAVE_TIME) + uint64_t start; +#endif +#if defined(MBEDTLS_X509_CRT_PARSE_C) +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + size_t cert_len; +#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + + if (!omit_header) { + /* + * Check version identifier + */ + + if ((size_t) (end - p) < sizeof(ssl_serialized_session_header)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (memcmp(p, ssl_serialized_session_header, + sizeof(ssl_serialized_session_header)) != 0) { + return MBEDTLS_ERR_SSL_VERSION_MISMATCH; + } + p += sizeof(ssl_serialized_session_header); + } + + /* + * Time + */ +#if defined(MBEDTLS_HAVE_TIME) + if (8 > (size_t) (end - p)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + start = ((uint64_t) p[0] << 56) | + ((uint64_t) p[1] << 48) | + ((uint64_t) p[2] << 40) | + ((uint64_t) p[3] << 32) | + ((uint64_t) p[4] << 24) | + ((uint64_t) p[5] << 16) | + ((uint64_t) p[6] << 8) | + ((uint64_t) p[7]); + p += 8; + + session->start = (time_t) start; +#endif /* MBEDTLS_HAVE_TIME */ + + /* + * Basic mandatory fields + */ + if (2 + 1 + 1 + 32 + 48 + 4 > (size_t) (end - p)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + session->ciphersuite = (p[0] << 8) | p[1]; + p += 2; + + session->compression = *p++; + + session->id_len = *p++; + memcpy(session->id, p, 32); + p += 32; + + memcpy(session->master, p, 48); + p += 48; + + session->verify_result = ((uint32_t) p[0] << 24) | + ((uint32_t) p[1] << 16) | + ((uint32_t) p[2] << 8) | + ((uint32_t) p[3]); + p += 4; + + /* Immediately clear invalid pointer values that have been read, in case + * we exit early before we replaced them with valid ones. */ +#if defined(MBEDTLS_X509_CRT_PARSE_C) +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + session->peer_cert = NULL; +#else + session->peer_cert_digest = NULL; +#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ +#endif /* MBEDTLS_X509_CRT_PARSE_C */ +#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) + session->ticket = NULL; +#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ + + /* + * Peer certificate + */ +#if defined(MBEDTLS_X509_CRT_PARSE_C) +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + /* Deserialize CRT from the end of the ticket. */ + if (3 > (size_t) (end - p)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + cert_len = (p[0] << 16) | (p[1] << 8) | p[2]; + p += 3; + + if (cert_len != 0) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (cert_len > (size_t) (end - p)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + session->peer_cert = mbedtls_calloc(1, sizeof(mbedtls_x509_crt)); + + if (session->peer_cert == NULL) { + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + mbedtls_x509_crt_init(session->peer_cert); + + if ((ret = mbedtls_x509_crt_parse_der(session->peer_cert, + p, cert_len)) != 0) { + mbedtls_x509_crt_free(session->peer_cert); + mbedtls_free(session->peer_cert); + session->peer_cert = NULL; + return ret; + } + + p += cert_len; + } +#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + /* Deserialize CRT digest from the end of the ticket. */ + if (2 > (size_t) (end - p)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + session->peer_cert_digest_type = (mbedtls_md_type_t) *p++; + session->peer_cert_digest_len = (size_t) *p++; + + if (session->peer_cert_digest_len != 0) { + const mbedtls_md_info_t *md_info = + mbedtls_md_info_from_type(session->peer_cert_digest_type); + if (md_info == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + if (session->peer_cert_digest_len != mbedtls_md_get_size(md_info)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (session->peer_cert_digest_len > (size_t) (end - p)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + session->peer_cert_digest = + mbedtls_calloc(1, session->peer_cert_digest_len); + if (session->peer_cert_digest == NULL) { + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + memcpy(session->peer_cert_digest, p, + session->peer_cert_digest_len); + p += session->peer_cert_digest_len; + } +#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + + /* + * Session ticket and associated data + */ +#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) + if (3 > (size_t) (end - p)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + session->ticket_len = (p[0] << 16) | (p[1] << 8) | p[2]; + p += 3; + + if (session->ticket_len != 0) { + if (session->ticket_len > (size_t) (end - p)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + session->ticket = mbedtls_calloc(1, session->ticket_len); + if (session->ticket == NULL) { + return MBEDTLS_ERR_SSL_ALLOC_FAILED; + } + + memcpy(session->ticket, p, session->ticket_len); + p += session->ticket_len; + } + + if (4 > (size_t) (end - p)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + session->ticket_lifetime = ((uint32_t) p[0] << 24) | + ((uint32_t) p[1] << 16) | + ((uint32_t) p[2] << 8) | + ((uint32_t) p[3]); + p += 4; +#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ + + /* + * Misc extension-related info + */ +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) + if (1 > (size_t) (end - p)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + session->mfl_code = *p++; +#endif + +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + if (1 > (size_t) (end - p)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + session->trunc_hmac = *p++; +#endif + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + if (1 > (size_t) (end - p)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + session->encrypt_then_mac = *p++; +#endif + + /* Done, should have consumed entire buffer */ + if (p != end) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + return 0; +} + +/* + * Deserialize session: public wrapper for error cleaning + */ +int mbedtls_ssl_session_load(mbedtls_ssl_session *session, + const unsigned char *buf, + size_t len) +{ + int ret = ssl_session_load(session, 0, buf, len); + + if (ret != 0) { + mbedtls_ssl_session_free(session); + } + + return ret; +} + +/* + * Perform a single step of the SSL handshake + */ +int mbedtls_ssl_handshake_step(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + + if (ssl == NULL || ssl->conf == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_SSL_CLI_C) + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) { + ret = mbedtls_ssl_handshake_client_step(ssl); + } +#endif +#if defined(MBEDTLS_SSL_SRV_C) + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) { + ret = mbedtls_ssl_handshake_server_step(ssl); + } +#endif + + return ret; +} + +/* + * Perform the SSL handshake + */ +int mbedtls_ssl_handshake(mbedtls_ssl_context *ssl) +{ + int ret = 0; + + /* Sanity checks */ + + if (ssl == NULL || ssl->conf == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + (ssl->f_set_timer == NULL || ssl->f_get_timer == NULL)) { + MBEDTLS_SSL_DEBUG_MSG(1, ("You must use " + "mbedtls_ssl_set_timer_cb() for DTLS")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> handshake")); + + /* Main handshake loop */ + while (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) { + ret = mbedtls_ssl_handshake_step(ssl); + + if (ret != 0) { + break; + } + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= handshake")); + + return ret; +} + +#if defined(MBEDTLS_SSL_RENEGOTIATION) +#if defined(MBEDTLS_SSL_SRV_C) +/* + * Write HelloRequest to request renegotiation on server + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_write_hello_request(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello request")); + + ssl->out_msglen = 4; + ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; + ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_REQUEST; + + if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello request")); + + return 0; +} +#endif /* MBEDTLS_SSL_SRV_C */ + +/* + * Actually renegotiate current connection, triggered by either: + * - any side: calling mbedtls_ssl_renegotiate(), + * - client: receiving a HelloRequest during mbedtls_ssl_read(), + * - server: receiving any handshake message on server during mbedtls_ssl_read() after + * the initial handshake is completed. + * If the handshake doesn't complete due to waiting for I/O, it will continue + * during the next calls to mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively. + */ +int mbedtls_ssl_start_renegotiation(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> renegotiate")); + + if ((ret = ssl_handshake_init(ssl)) != 0) { + return ret; + } + + /* RFC 6347 4.2.2: "[...] the HelloRequest will have message_seq = 0 and + * the ServerHello will have message_seq = 1" */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING) { + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) { + ssl->handshake->out_msg_seq = 1; + } else { + ssl->handshake->in_msg_seq = 1; + } + } +#endif + + ssl->state = MBEDTLS_SSL_HELLO_REQUEST; + ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS; + + if ((ret = mbedtls_ssl_handshake(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_handshake", ret); + return ret; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= renegotiate")); + + return 0; +} + +/* + * Renegotiate current connection on client, + * or request renegotiation on server + */ +int mbedtls_ssl_renegotiate(mbedtls_ssl_context *ssl) +{ + int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; + + if (ssl == NULL || ssl->conf == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_SSL_SRV_C) + /* On server, just send the request */ + if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) { + if (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING; + + /* Did we already try/start sending HelloRequest? */ + if (ssl->out_left != 0) { + return mbedtls_ssl_flush_output(ssl); + } + + return ssl_write_hello_request(ssl); + } +#endif /* MBEDTLS_SSL_SRV_C */ + +#if defined(MBEDTLS_SSL_CLI_C) + /* + * On client, either start the renegotiation process or, + * if already in progress, continue the handshake + */ + if (ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) { + if (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if ((ret = mbedtls_ssl_start_renegotiation(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_start_renegotiation", ret); + return ret; + } + } else { + if ((ret = mbedtls_ssl_handshake(ssl)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_handshake", ret); + return ret; + } + } +#endif /* MBEDTLS_SSL_CLI_C */ + + return ret; +} +#endif /* MBEDTLS_SSL_RENEGOTIATION */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +static void ssl_key_cert_free(mbedtls_ssl_key_cert *key_cert) +{ + mbedtls_ssl_key_cert *cur = key_cert, *next; + + while (cur != NULL) { + next = cur->next; + mbedtls_free(cur); + cur = next; + } +} +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +void mbedtls_ssl_handshake_free(mbedtls_ssl_context *ssl) +{ + mbedtls_ssl_handshake_params *handshake = ssl->handshake; + + if (handshake == NULL) { + return; + } + +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) + if (ssl->conf->f_async_cancel != NULL && handshake->async_in_progress != 0) { + ssl->conf->f_async_cancel(ssl); + handshake->async_in_progress = 0; + } +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ + +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) + mbedtls_md5_free(&handshake->fin_md5); + mbedtls_sha1_free(&handshake->fin_sha1); +#endif +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) +#if defined(MBEDTLS_SHA256_C) +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_hash_abort(&handshake->fin_sha256_psa); +#else + mbedtls_sha256_free(&handshake->fin_sha256); +#endif +#endif +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_hash_abort(&handshake->fin_sha384_psa); +#else + mbedtls_sha512_free(&handshake->fin_sha512); +#endif +#endif +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ + +#if defined(MBEDTLS_DHM_C) + mbedtls_dhm_free(&handshake->dhm_ctx); +#endif +#if defined(MBEDTLS_ECDH_C) + mbedtls_ecdh_free(&handshake->ecdh_ctx); +#endif +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + mbedtls_ecjpake_free(&handshake->ecjpake_ctx); +#if defined(MBEDTLS_SSL_CLI_C) + mbedtls_free(handshake->ecjpake_cache); + handshake->ecjpake_cache = NULL; + handshake->ecjpake_cache_len = 0; +#endif +#endif + +#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + /* explicit void pointer cast for buggy MS compiler */ + mbedtls_free((void *) handshake->curves); +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) + if (handshake->psk != NULL) { + mbedtls_platform_zeroize(handshake->psk, handshake->psk_len); + mbedtls_free(handshake->psk); + } +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) && \ + defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) + /* + * Free only the linked list wrapper, not the keys themselves + * since the belong to the SNI callback + */ + if (handshake->sni_key_cert != NULL) { + mbedtls_ssl_key_cert *cur = handshake->sni_key_cert, *next; + + while (cur != NULL) { + next = cur->next; + mbedtls_free(cur); + cur = next; + } + } +#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION */ + +#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) + mbedtls_x509_crt_restart_free(&handshake->ecrs_ctx); + if (handshake->ecrs_peer_cert != NULL) { + mbedtls_x509_crt_free(handshake->ecrs_peer_cert); + mbedtls_free(handshake->ecrs_peer_cert); + } +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) && \ + !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + mbedtls_pk_free(&handshake->peer_pubkey); +#endif /* MBEDTLS_X509_CRT_PARSE_C && !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + mbedtls_free(handshake->verify_cookie); + mbedtls_ssl_flight_free(handshake->flight); + mbedtls_ssl_buffering_free(ssl); +#endif + +#if defined(MBEDTLS_ECDH_C) && \ + defined(MBEDTLS_USE_PSA_CRYPTO) + psa_destroy_key(handshake->ecdh_psa_privkey); +#endif /* MBEDTLS_ECDH_C && MBEDTLS_USE_PSA_CRYPTO */ + + mbedtls_platform_zeroize(handshake, + sizeof(mbedtls_ssl_handshake_params)); + +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + /* If the buffers are too big - reallocate. Because of the way Mbed TLS + * processes datagrams and the fact that a datagram is allowed to have + * several records in it, it is possible that the I/O buffers are not + * empty at this stage */ + handle_buffer_resizing(ssl, 1, mbedtls_ssl_get_input_buflen(ssl), + mbedtls_ssl_get_output_buflen(ssl)); +#endif +} + +void mbedtls_ssl_session_free(mbedtls_ssl_session *session) +{ + if (session == NULL) { + return; + } + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + ssl_clear_peer_cert(session); +#endif + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) + mbedtls_free(session->ticket); +#endif + + mbedtls_platform_zeroize(session, sizeof(mbedtls_ssl_session)); +} + +#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION) + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) +#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 1u +#else +#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 0u +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) +#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT 1u +#else +#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT 0u +#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ + +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) +#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 1u +#else +#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 0u +#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ + +#if defined(MBEDTLS_SSL_ALPN) +#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 1u +#else +#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 0u +#endif /* MBEDTLS_SSL_ALPN */ + +#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT 0 +#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT 1 +#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT 2 +#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT 3 + +#define SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG \ + ((uint32_t) ( \ + (SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID << \ + SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT) | \ + (SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT << \ + SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT) | \ + (SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY << \ + SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT) | \ + (SSL_SERIALIZED_CONTEXT_CONFIG_ALPN << SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT) | \ + 0u)) + +static const unsigned char ssl_serialized_context_header[] = { + MBEDTLS_VERSION_MAJOR, + MBEDTLS_VERSION_MINOR, + MBEDTLS_VERSION_PATCH, + MBEDTLS_BYTE_1(SSL_SERIALIZED_SESSION_CONFIG_BITFLAG), + MBEDTLS_BYTE_0(SSL_SERIALIZED_SESSION_CONFIG_BITFLAG), + MBEDTLS_BYTE_2(SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG), + MBEDTLS_BYTE_1(SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG), + MBEDTLS_BYTE_0(SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG), +}; + +/* + * Serialize a full SSL context + * + * The format of the serialized data is: + * (in the presentation language of TLS, RFC 8446 section 3) + * + * // header + * opaque mbedtls_version[3]; // major, minor, patch + * opaque context_format[5]; // version-specific field determining + * // the format of the remaining + * // serialized data. + * Note: When updating the format, remember to keep these + * version+format bytes. (We may make their size part of the API.) + * + * // session sub-structure + * opaque session<1..2^32-1>; // see mbedtls_ssl_session_save() + * // transform sub-structure + * uint8 random[64]; // ServerHello.random+ClientHello.random + * uint8 in_cid<0..2^8-1> // Connection ID: expected incoming value + * uint8 out_cid<0..2^8-1> // Connection ID: outgoing value to use + * // fields from ssl_context + * uint32 badmac_seen; // DTLS: number of records with failing MAC + * uint64 in_window_top; // DTLS: last validated record seq_num + * uint64 in_window; // DTLS: bitmask for replay protection + * uint8 disable_datagram_packing; // DTLS: only one record per datagram + * uint64 cur_out_ctr; // Record layer: outgoing sequence number + * uint16 mtu; // DTLS: path mtu (max outgoing fragment size) + * uint8 alpn_chosen<0..2^8-1> // ALPN: negotiated application protocol + * + * Note that many fields of the ssl_context or sub-structures are not + * serialized, as they fall in one of the following categories: + * + * 1. forced value (eg in_left must be 0) + * 2. pointer to dynamically-allocated memory (eg session, transform) + * 3. value can be re-derived from other data (eg session keys from MS) + * 4. value was temporary (eg content of input buffer) + * 5. value will be provided by the user again (eg I/O callbacks and context) + */ +int mbedtls_ssl_context_save(mbedtls_ssl_context *ssl, + unsigned char *buf, + size_t buf_len, + size_t *olen) +{ + unsigned char *p = buf; + size_t used = 0; + size_t session_len; + int ret = 0; + + /* + * Enforce usage restrictions, see "return BAD_INPUT_DATA" in + * this function's documentation. + * + * These are due to assumptions/limitations in the implementation. Some of + * them are likely to stay (no handshake in progress) some might go away + * (only DTLS) but are currently used to simplify the implementation. + */ + /* The initial handshake must be over */ + if (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Initial handshake isn't over")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + if (ssl->handshake != NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Handshake isn't completed")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + /* Double-check that sub-structures are indeed ready */ + if (ssl->transform == NULL || ssl->session == NULL) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Serialised structures aren't ready")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + /* There must be no pending incoming or outgoing data */ + if (mbedtls_ssl_check_pending(ssl) != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("There is pending incoming data")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + if (ssl->out_left != 0) { + MBEDTLS_SSL_DEBUG_MSG(1, ("There is pending outgoing data")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + /* Protocol must be DTLS, not TLS */ + if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Only DTLS is supported")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + /* Version must be 1.2 */ + if (ssl->major_ver != MBEDTLS_SSL_MAJOR_VERSION_3) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Only version 1.2 supported")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + if (ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Only version 1.2 supported")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + /* We must be using an AEAD ciphersuite */ + if (mbedtls_ssl_transform_uses_aead(ssl->transform) != 1) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Only AEAD ciphersuites supported")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + /* Renegotiation must not be enabled */ +#if defined(MBEDTLS_SSL_RENEGOTIATION) + if (ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED) { + MBEDTLS_SSL_DEBUG_MSG(1, ("Renegotiation must not be enabled")); + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } +#endif + + /* + * Version and format identifier + */ + used += sizeof(ssl_serialized_context_header); + + if (used <= buf_len) { + memcpy(p, ssl_serialized_context_header, + sizeof(ssl_serialized_context_header)); + p += sizeof(ssl_serialized_context_header); + } + + /* + * Session (length + data) + */ + ret = ssl_session_save(ssl->session, 1, NULL, 0, &session_len); + if (ret != MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) { + return ret; + } + + used += 4 + session_len; + if (used <= buf_len) { + MBEDTLS_PUT_UINT32_BE(session_len, p, 0); + p += 4; + + ret = ssl_session_save(ssl->session, 1, + p, session_len, &session_len); + if (ret != 0) { + return ret; + } + + p += session_len; + } + + /* + * Transform + */ + used += sizeof(ssl->transform->randbytes); + if (used <= buf_len) { + memcpy(p, ssl->transform->randbytes, + sizeof(ssl->transform->randbytes)); + p += sizeof(ssl->transform->randbytes); + } + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + used += 2 + ssl->transform->in_cid_len + ssl->transform->out_cid_len; + if (used <= buf_len) { + *p++ = ssl->transform->in_cid_len; + memcpy(p, ssl->transform->in_cid, ssl->transform->in_cid_len); + p += ssl->transform->in_cid_len; + + *p++ = ssl->transform->out_cid_len; + memcpy(p, ssl->transform->out_cid, ssl->transform->out_cid_len); + p += ssl->transform->out_cid_len; + } +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + + /* + * Saved fields from top-level ssl_context structure + */ +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) + used += 4; + if (used <= buf_len) { + MBEDTLS_PUT_UINT32_BE(ssl->badmac_seen, p, 0); + p += 4; + } +#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ + +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) + used += 16; + if (used <= buf_len) { + MBEDTLS_PUT_UINT64_BE(ssl->in_window_top, p, 0); + p += 8; + + MBEDTLS_PUT_UINT64_BE(ssl->in_window, p, 0); + p += 8; + } +#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + used += 1; + if (used <= buf_len) { + *p++ = ssl->disable_datagram_packing; + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + used += 8; + if (used <= buf_len) { + memcpy(p, ssl->cur_out_ctr, 8); + p += 8; + } + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + used += 2; + if (used <= buf_len) { + MBEDTLS_PUT_UINT16_BE(ssl->mtu, p, 0); + p += 2; + } +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +#if defined(MBEDTLS_SSL_ALPN) + { + const uint8_t alpn_len = ssl->alpn_chosen + ? (uint8_t) strlen(ssl->alpn_chosen) + : 0; + + used += 1 + alpn_len; + if (used <= buf_len) { + *p++ = alpn_len; + + if (ssl->alpn_chosen != NULL) { + memcpy(p, ssl->alpn_chosen, alpn_len); + p += alpn_len; + } + } + } +#endif /* MBEDTLS_SSL_ALPN */ + + /* + * Done + */ + *olen = used; + + if (used > buf_len) { + return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; + } + + MBEDTLS_SSL_DEBUG_BUF(4, "saved context", buf, used); + + return mbedtls_ssl_session_reset_int(ssl, 0); +} + +/* + * Helper to get TLS 1.2 PRF from ciphersuite + * (Duplicates bits of logic from ssl_set_handshake_prfs().) + */ +#if defined(MBEDTLS_SHA256_C) || \ + (defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)) +typedef int (*tls_prf_fn)(const unsigned char *secret, size_t slen, + const char *label, + const unsigned char *random, size_t rlen, + unsigned char *dstbuf, size_t dlen); +static tls_prf_fn ssl_tls12prf_from_cs(int ciphersuite_id) +{ + const mbedtls_ssl_ciphersuite_t * const ciphersuite_info = + mbedtls_ssl_ciphersuite_from_id(ciphersuite_id); + + if (ciphersuite_info == NULL) { + return NULL; + } + +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) + if (ciphersuite_info->mac == MBEDTLS_MD_SHA384) { + return tls_prf_sha384; + } else +#endif +#if defined(MBEDTLS_SHA256_C) + { + if (ciphersuite_info->mac == MBEDTLS_MD_SHA256) { + return tls_prf_sha256; + } + } +#endif +#if !defined(MBEDTLS_SHA256_C) && \ + (!defined(MBEDTLS_SHA512_C) || defined(MBEDTLS_SHA512_NO_SHA384)) + (void) ciphersuite_info; +#endif + return NULL; +} + +#endif /* MBEDTLS_SHA256_C || + (MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384) */ + +/* + * Deserialize context, see mbedtls_ssl_context_save() for format. + * + * This internal version is wrapped by a public function that cleans up in + * case of error. + */ +MBEDTLS_CHECK_RETURN_CRITICAL +static int ssl_context_load(mbedtls_ssl_context *ssl, + const unsigned char *buf, + size_t len) +{ + const unsigned char *p = buf; + const unsigned char * const end = buf + len; + size_t session_len; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + tls_prf_fn prf_func = NULL; + + /* + * The context should have been freshly setup or reset. + * Give the user an error in case of obvious misuse. + * (Checking session is useful because it won't be NULL if we're + * renegotiating, or if the user mistakenly loaded a session first.) + */ + if (ssl->state != MBEDTLS_SSL_HELLO_REQUEST || + ssl->session != NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + /* + * We can't check that the config matches the initial one, but we can at + * least check it matches the requirements for serializing. + */ + if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM || + ssl->conf->max_major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 || + ssl->conf->min_major_ver > MBEDTLS_SSL_MAJOR_VERSION_3 || + ssl->conf->max_minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 || + ssl->conf->min_minor_ver > MBEDTLS_SSL_MINOR_VERSION_3 || +#if defined(MBEDTLS_SSL_RENEGOTIATION) + ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED || +#endif + 0) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + MBEDTLS_SSL_DEBUG_BUF(4, "context to load", buf, len); + + /* + * Check version identifier + */ + if ((size_t) (end - p) < sizeof(ssl_serialized_context_header)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (memcmp(p, ssl_serialized_context_header, + sizeof(ssl_serialized_context_header)) != 0) { + return MBEDTLS_ERR_SSL_VERSION_MISMATCH; + } + p += sizeof(ssl_serialized_context_header); + + /* + * Session + */ + if ((size_t) (end - p) < 4) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + session_len = ((size_t) p[0] << 24) | + ((size_t) p[1] << 16) | + ((size_t) p[2] << 8) | + ((size_t) p[3]); + p += 4; + + /* This has been allocated by ssl_handshake_init(), called by + * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */ + ssl->session = ssl->session_negotiate; + ssl->session_in = ssl->session; + ssl->session_out = ssl->session; + ssl->session_negotiate = NULL; + + if ((size_t) (end - p) < session_len) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + ret = ssl_session_load(ssl->session, 1, p, session_len); + if (ret != 0) { + mbedtls_ssl_session_free(ssl->session); + return ret; + } + + p += session_len; + + /* + * Transform + */ + + /* This has been allocated by ssl_handshake_init(), called by + * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */ + ssl->transform = ssl->transform_negotiate; + ssl->transform_in = ssl->transform; + ssl->transform_out = ssl->transform; + ssl->transform_negotiate = NULL; + + prf_func = ssl_tls12prf_from_cs(ssl->session->ciphersuite); + if (prf_func == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + /* Read random bytes and populate structure */ + if ((size_t) (end - p) < sizeof(ssl->transform->randbytes)) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + ret = ssl_populate_transform(ssl->transform, + ssl->session->ciphersuite, + ssl->session->master, +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + ssl->session->encrypt_then_mac, +#endif +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + ssl->session->trunc_hmac, +#endif +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ +#if defined(MBEDTLS_ZLIB_SUPPORT) + ssl->session->compression, +#endif + prf_func, + p, /* currently pointing to randbytes */ + MBEDTLS_SSL_MINOR_VERSION_3, /* (D)TLS 1.2 is forced */ + ssl->conf->endpoint, + ssl); + if (ret != 0) { + return ret; + } + + p += sizeof(ssl->transform->randbytes); + +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + /* Read connection IDs and store them */ + if ((size_t) (end - p) < 1) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + ssl->transform->in_cid_len = *p++; + + if ((size_t) (end - p) < ssl->transform->in_cid_len + 1u) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + memcpy(ssl->transform->in_cid, p, ssl->transform->in_cid_len); + p += ssl->transform->in_cid_len; + + ssl->transform->out_cid_len = *p++; + + if ((size_t) (end - p) < ssl->transform->out_cid_len) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + memcpy(ssl->transform->out_cid, p, ssl->transform->out_cid_len); + p += ssl->transform->out_cid_len; +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ + + /* + * Saved fields from top-level ssl_context structure + */ +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) + if ((size_t) (end - p) < 4) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + ssl->badmac_seen = ((uint32_t) p[0] << 24) | + ((uint32_t) p[1] << 16) | + ((uint32_t) p[2] << 8) | + ((uint32_t) p[3]); + p += 4; +#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ + +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) + if ((size_t) (end - p) < 16) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + ssl->in_window_top = ((uint64_t) p[0] << 56) | + ((uint64_t) p[1] << 48) | + ((uint64_t) p[2] << 40) | + ((uint64_t) p[3] << 32) | + ((uint64_t) p[4] << 24) | + ((uint64_t) p[5] << 16) | + ((uint64_t) p[6] << 8) | + ((uint64_t) p[7]); + p += 8; + + ssl->in_window = ((uint64_t) p[0] << 56) | + ((uint64_t) p[1] << 48) | + ((uint64_t) p[2] << 40) | + ((uint64_t) p[3] << 32) | + ((uint64_t) p[4] << 24) | + ((uint64_t) p[5] << 16) | + ((uint64_t) p[6] << 8) | + ((uint64_t) p[7]); + p += 8; +#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if ((size_t) (end - p) < 1) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + ssl->disable_datagram_packing = *p++; +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + + if ((size_t) (end - p) < 8) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + memcpy(ssl->cur_out_ctr, p, 8); + p += 8; + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if ((size_t) (end - p) < 2) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + ssl->mtu = (p[0] << 8) | p[1]; + p += 2; +#endif /* MBEDTLS_SSL_PROTO_DTLS */ + +#if defined(MBEDTLS_SSL_ALPN) + { + uint8_t alpn_len; + const char **cur; + + if ((size_t) (end - p) < 1) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + alpn_len = *p++; + + if (alpn_len != 0 && ssl->conf->alpn_list != NULL) { + /* alpn_chosen should point to an item in the configured list */ + for (cur = ssl->conf->alpn_list; *cur != NULL; cur++) { + if (strlen(*cur) == alpn_len && + memcmp(p, *cur, alpn_len) == 0) { + ssl->alpn_chosen = *cur; + break; + } + } + } + + /* can only happen on conf mismatch */ + if (alpn_len != 0 && ssl->alpn_chosen == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + p += alpn_len; + } +#endif /* MBEDTLS_SSL_ALPN */ + + /* + * Forced fields from top-level ssl_context structure + * + * Most of them already set to the correct value by mbedtls_ssl_init() and + * mbedtls_ssl_reset(), so we only need to set the remaining ones. + */ + ssl->state = MBEDTLS_SSL_HANDSHAKE_OVER; + + ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3; + ssl->minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; + + /* Adjust pointers for header fields of outgoing records to + * the given transform, accounting for explicit IV and CID. */ + mbedtls_ssl_update_out_pointers(ssl, ssl->transform); + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + ssl->in_epoch = 1; +#endif + + /* mbedtls_ssl_reset() leaves the handshake sub-structure allocated, + * which we don't want - otherwise we'd end up freeing the wrong transform + * by calling mbedtls_ssl_handshake_wrapup_free_hs_transform() + * inappropriately. */ + if (ssl->handshake != NULL) { + mbedtls_ssl_handshake_free(ssl); + mbedtls_free(ssl->handshake); + ssl->handshake = NULL; + } + + /* + * Done - should have consumed entire buffer + */ + if (p != end) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + return 0; +} + +/* + * Deserialize context: public wrapper for error cleaning + */ +int mbedtls_ssl_context_load(mbedtls_ssl_context *context, + const unsigned char *buf, + size_t len) +{ + int ret = ssl_context_load(context, buf, len); + + if (ret != 0) { + mbedtls_ssl_free(context); + } + + return ret; +} +#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */ + +/* + * Free an SSL context + */ +void mbedtls_ssl_free(mbedtls_ssl_context *ssl) +{ + if (ssl == NULL) { + return; + } + + MBEDTLS_SSL_DEBUG_MSG(2, ("=> free")); + + if (ssl->out_buf != NULL) { +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + size_t out_buf_len = ssl->out_buf_len; +#else + size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN; +#endif + + mbedtls_platform_zeroize(ssl->out_buf, out_buf_len); + mbedtls_free(ssl->out_buf); + ssl->out_buf = NULL; + } + + if (ssl->in_buf != NULL) { +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + size_t in_buf_len = ssl->in_buf_len; +#else + size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN; +#endif + + mbedtls_platform_zeroize(ssl->in_buf, in_buf_len); + mbedtls_free(ssl->in_buf); + ssl->in_buf = NULL; + } + +#if defined(MBEDTLS_ZLIB_SUPPORT) + if (ssl->compress_buf != NULL) { + mbedtls_platform_zeroize(ssl->compress_buf, MBEDTLS_SSL_COMPRESS_BUFFER_LEN); + mbedtls_free(ssl->compress_buf); + } +#endif + + if (ssl->transform) { + mbedtls_ssl_transform_free(ssl->transform); + mbedtls_free(ssl->transform); + } + + if (ssl->handshake) { + mbedtls_ssl_handshake_free(ssl); + mbedtls_ssl_transform_free(ssl->transform_negotiate); + mbedtls_ssl_session_free(ssl->session_negotiate); + + mbedtls_free(ssl->handshake); + mbedtls_free(ssl->transform_negotiate); + mbedtls_free(ssl->session_negotiate); + } + + if (ssl->session) { + mbedtls_ssl_session_free(ssl->session); + mbedtls_free(ssl->session); + } + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + mbedtls_ssl_free_hostname(ssl); +#endif + +#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) + if (mbedtls_ssl_hw_record_finish != NULL) { + MBEDTLS_SSL_DEBUG_MSG(2, ("going for mbedtls_ssl_hw_record_finish()")); + mbedtls_ssl_hw_record_finish(ssl); + } +#endif + +#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) + mbedtls_free(ssl->cli_id); +#endif + + MBEDTLS_SSL_DEBUG_MSG(2, ("<= free")); + + /* Actually clear after last debug message */ + mbedtls_platform_zeroize(ssl, sizeof(mbedtls_ssl_context)); +} + +/* + * Initialize mbedtls_ssl_config + */ +void mbedtls_ssl_config_init(mbedtls_ssl_config *conf) +{ + memset(conf, 0, sizeof(mbedtls_ssl_config)); +} + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) +static const int ssl_preset_default_hashes[] = { +#if defined(MBEDTLS_SHA512_C) + MBEDTLS_MD_SHA512, +#endif +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) + MBEDTLS_MD_SHA384, +#endif +#if defined(MBEDTLS_SHA256_C) + MBEDTLS_MD_SHA256, + MBEDTLS_MD_SHA224, +#endif +#if defined(MBEDTLS_SHA1_C) && defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE) + MBEDTLS_MD_SHA1, +#endif + MBEDTLS_MD_NONE +}; +#endif + +static const int ssl_preset_suiteb_ciphersuites[] = { + MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + 0 +}; + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) +static const int ssl_preset_suiteb_hashes[] = { + MBEDTLS_MD_SHA256, + MBEDTLS_MD_SHA384, + MBEDTLS_MD_NONE +}; +#endif + +#if defined(MBEDTLS_ECP_C) +static const mbedtls_ecp_group_id ssl_preset_suiteb_curves[] = { +#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) + MBEDTLS_ECP_DP_SECP256R1, +#endif +#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) + MBEDTLS_ECP_DP_SECP384R1, +#endif + MBEDTLS_ECP_DP_NONE +}; +#endif + +/* + * Load default in mbedtls_ssl_config + */ +int mbedtls_ssl_config_defaults(mbedtls_ssl_config *conf, + int endpoint, int transport, int preset) +{ +#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; +#endif + + /* Use the functions here so that they are covered in tests, + * but otherwise access member directly for efficiency */ + mbedtls_ssl_conf_endpoint(conf, endpoint); + mbedtls_ssl_conf_transport(conf, transport); + + /* + * Things that are common to all presets + */ +#if defined(MBEDTLS_SSL_CLI_C) + if (endpoint == MBEDTLS_SSL_IS_CLIENT) { + conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED; +#if defined(MBEDTLS_SSL_SESSION_TICKETS) + conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED; +#endif + } +#endif + +#if defined(MBEDTLS_ARC4_C) + conf->arc4_disabled = MBEDTLS_SSL_ARC4_DISABLED; +#endif + +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED; +#endif + +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) + conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED; +#endif + +#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) + conf->cbc_record_splitting = MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED; +#endif + +#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) + conf->f_cookie_write = ssl_cookie_write_dummy; + conf->f_cookie_check = ssl_cookie_check_dummy; +#endif + +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) + conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED; +#endif + +#if defined(MBEDTLS_SSL_SRV_C) + conf->cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED; +#endif + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN; + conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX; +#endif + +#if defined(MBEDTLS_SSL_RENEGOTIATION) + conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT; + memset(conf->renego_period, 0x00, 2); + memset(conf->renego_period + 2, 0xFF, 6); +#endif + +#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) + if (endpoint == MBEDTLS_SSL_IS_SERVER) { + const unsigned char dhm_p[] = + MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN; + const unsigned char dhm_g[] = + MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN; + + if ((ret = mbedtls_ssl_conf_dh_param_bin(conf, + dhm_p, sizeof(dhm_p), + dhm_g, sizeof(dhm_g))) != 0) { + return ret; + } + } +#endif + + /* + * Preset-specific defaults + */ + switch (preset) { + /* + * NSA Suite B + */ + case MBEDTLS_SSL_PRESET_SUITEB: + conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3; + conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; /* TLS 1.2 */ + conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION; + conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION; + + conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = + conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = + conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = + conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = + ssl_preset_suiteb_ciphersuites; + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + conf->cert_profile = &mbedtls_x509_crt_profile_suiteb; +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + conf->sig_hashes = ssl_preset_suiteb_hashes; +#endif + +#if defined(MBEDTLS_ECP_C) + conf->curve_list = ssl_preset_suiteb_curves; +#endif + break; + + /* + * Default + */ + default: + conf->min_major_ver = (MBEDTLS_SSL_MIN_MAJOR_VERSION > + MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION) ? + MBEDTLS_SSL_MIN_MAJOR_VERSION : + MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION; + conf->min_minor_ver = (MBEDTLS_SSL_MIN_MINOR_VERSION > + MBEDTLS_SSL_MIN_VALID_MINOR_VERSION) ? + MBEDTLS_SSL_MIN_MINOR_VERSION : + MBEDTLS_SSL_MIN_VALID_MINOR_VERSION; + conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION; + conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION; + +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if (transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { + conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_2; + } +#endif + + conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = + conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = + conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = + conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = + mbedtls_ssl_list_ciphersuites(); + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + conf->cert_profile = &mbedtls_x509_crt_profile_default; +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + conf->sig_hashes = ssl_preset_default_hashes; +#endif + +#if defined(MBEDTLS_ECP_C) + conf->curve_list = mbedtls_ecp_grp_id_list(); +#endif + +#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) + conf->dhm_min_bitlen = 1024; +#endif + } + + return 0; +} + +/* + * Free mbedtls_ssl_config + */ +void mbedtls_ssl_config_free(mbedtls_ssl_config *conf) +{ +#if defined(MBEDTLS_DHM_C) + mbedtls_mpi_free(&conf->dhm_P); + mbedtls_mpi_free(&conf->dhm_G); +#endif + +#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) + if (conf->psk != NULL) { + mbedtls_platform_zeroize(conf->psk, conf->psk_len); + mbedtls_free(conf->psk); + conf->psk = NULL; + conf->psk_len = 0; + } + + if (conf->psk_identity != NULL) { + mbedtls_platform_zeroize(conf->psk_identity, conf->psk_identity_len); + mbedtls_free(conf->psk_identity); + conf->psk_identity = NULL; + conf->psk_identity_len = 0; + } +#endif + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + ssl_key_cert_free(conf->key_cert); +#endif + + mbedtls_platform_zeroize(conf, sizeof(mbedtls_ssl_config)); +} + +#if defined(MBEDTLS_PK_C) && \ + (defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C)) +/* + * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX + */ +unsigned char mbedtls_ssl_sig_from_pk(mbedtls_pk_context *pk) +{ +#if defined(MBEDTLS_RSA_C) + if (mbedtls_pk_can_do(pk, MBEDTLS_PK_RSA)) { + return MBEDTLS_SSL_SIG_RSA; + } +#endif +#if defined(MBEDTLS_ECDSA_C) + if (mbedtls_pk_can_do(pk, MBEDTLS_PK_ECDSA)) { + return MBEDTLS_SSL_SIG_ECDSA; + } +#endif + return MBEDTLS_SSL_SIG_ANON; +} + +unsigned char mbedtls_ssl_sig_from_pk_alg(mbedtls_pk_type_t type) +{ + switch (type) { + case MBEDTLS_PK_RSA: + return MBEDTLS_SSL_SIG_RSA; + case MBEDTLS_PK_ECDSA: + case MBEDTLS_PK_ECKEY: + return MBEDTLS_SSL_SIG_ECDSA; + default: + return MBEDTLS_SSL_SIG_ANON; + } +} + +mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig(unsigned char sig) +{ + switch (sig) { +#if defined(MBEDTLS_RSA_C) + case MBEDTLS_SSL_SIG_RSA: + return MBEDTLS_PK_RSA; +#endif +#if defined(MBEDTLS_ECDSA_C) + case MBEDTLS_SSL_SIG_ECDSA: + return MBEDTLS_PK_ECDSA; +#endif + default: + return MBEDTLS_PK_NONE; + } +} +#endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */ + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ + defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) + +/* Find an entry in a signature-hash set matching a given hash algorithm. */ +mbedtls_md_type_t mbedtls_ssl_sig_hash_set_find(mbedtls_ssl_sig_hash_set_t *set, + mbedtls_pk_type_t sig_alg) +{ + switch (sig_alg) { + case MBEDTLS_PK_RSA: + return set->rsa; + case MBEDTLS_PK_ECDSA: + return set->ecdsa; + default: + return MBEDTLS_MD_NONE; + } +} + +/* Add a signature-hash-pair to a signature-hash set */ +void mbedtls_ssl_sig_hash_set_add(mbedtls_ssl_sig_hash_set_t *set, + mbedtls_pk_type_t sig_alg, + mbedtls_md_type_t md_alg) +{ + switch (sig_alg) { + case MBEDTLS_PK_RSA: + if (set->rsa == MBEDTLS_MD_NONE) { + set->rsa = md_alg; + } + break; + + case MBEDTLS_PK_ECDSA: + if (set->ecdsa == MBEDTLS_MD_NONE) { + set->ecdsa = md_alg; + } + break; + + default: + break; + } +} + +/* Allow exactly one hash algorithm for each signature. */ +void mbedtls_ssl_sig_hash_set_const_hash(mbedtls_ssl_sig_hash_set_t *set, + mbedtls_md_type_t md_alg) +{ + set->rsa = md_alg; + set->ecdsa = md_alg; +} + +#endif /* MBEDTLS_SSL_PROTO_TLS1_2) && + MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ + +/* + * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX + */ +mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash(unsigned char hash) +{ + switch (hash) { +#if defined(MBEDTLS_MD5_C) + case MBEDTLS_SSL_HASH_MD5: + return MBEDTLS_MD_MD5; +#endif +#if defined(MBEDTLS_SHA1_C) + case MBEDTLS_SSL_HASH_SHA1: + return MBEDTLS_MD_SHA1; +#endif +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_SSL_HASH_SHA224: + return MBEDTLS_MD_SHA224; + case MBEDTLS_SSL_HASH_SHA256: + return MBEDTLS_MD_SHA256; +#endif +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) + case MBEDTLS_SSL_HASH_SHA384: + return MBEDTLS_MD_SHA384; +#endif +#if defined(MBEDTLS_SHA512_C) + case MBEDTLS_SSL_HASH_SHA512: + return MBEDTLS_MD_SHA512; +#endif + default: + return MBEDTLS_MD_NONE; + } +} + +/* + * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX + */ +unsigned char mbedtls_ssl_hash_from_md_alg(int md) +{ + switch (md) { +#if defined(MBEDTLS_MD5_C) + case MBEDTLS_MD_MD5: + return MBEDTLS_SSL_HASH_MD5; +#endif +#if defined(MBEDTLS_SHA1_C) + case MBEDTLS_MD_SHA1: + return MBEDTLS_SSL_HASH_SHA1; +#endif +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_MD_SHA224: + return MBEDTLS_SSL_HASH_SHA224; + case MBEDTLS_MD_SHA256: + return MBEDTLS_SSL_HASH_SHA256; +#endif +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) + case MBEDTLS_MD_SHA384: + return MBEDTLS_SSL_HASH_SHA384; +#endif +#if defined(MBEDTLS_SHA512_C) + case MBEDTLS_MD_SHA512: + return MBEDTLS_SSL_HASH_SHA512; +#endif + default: + return MBEDTLS_SSL_HASH_NONE; + } +} + +#if defined(MBEDTLS_ECP_C) +/* + * Check if a curve proposed by the peer is in our list. + * Return 0 if we're willing to use it, -1 otherwise. + */ +int mbedtls_ssl_check_curve(const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id) +{ + const mbedtls_ecp_group_id *gid; + + if (ssl->conf->curve_list == NULL) { + return -1; + } + + for (gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++) { + if (*gid == grp_id) { + return 0; + } + } + + return -1; +} + +/* + * Same as mbedtls_ssl_check_curve() but takes a TLS ID for the curve. + */ +int mbedtls_ssl_check_curve_tls_id(const mbedtls_ssl_context *ssl, uint16_t tls_id) +{ + const mbedtls_ecp_curve_info *curve_info = + mbedtls_ecp_curve_info_from_tls_id(tls_id); + if (curve_info == NULL) { + return -1; + } + return mbedtls_ssl_check_curve(ssl, curve_info->grp_id); +} +#endif /* MBEDTLS_ECP_C */ + +#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) +/* + * Check if a hash proposed by the peer is in our list. + * Return 0 if we're willing to use it, -1 otherwise. + */ +int mbedtls_ssl_check_sig_hash(const mbedtls_ssl_context *ssl, + mbedtls_md_type_t md) +{ + const int *cur; + + if (ssl->conf->sig_hashes == NULL) { + return -1; + } + + for (cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++) { + if (*cur == (int) md) { + return 0; + } + } + + return -1; +} +#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */ + +#if defined(MBEDTLS_X509_CRT_PARSE_C) +int mbedtls_ssl_check_cert_usage(const mbedtls_x509_crt *cert, + const mbedtls_ssl_ciphersuite_t *ciphersuite, + int cert_endpoint, + uint32_t *flags) +{ + int ret = 0; +#if defined(MBEDTLS_X509_CHECK_KEY_USAGE) + int usage = 0; +#endif +#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) + const char *ext_oid; + size_t ext_len; +#endif + +#if !defined(MBEDTLS_X509_CHECK_KEY_USAGE) && \ + !defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) + ((void) cert); + ((void) cert_endpoint); + ((void) flags); +#endif + +#if defined(MBEDTLS_X509_CHECK_KEY_USAGE) + if (cert_endpoint == MBEDTLS_SSL_IS_SERVER) { + /* Server part of the key exchange */ + switch (ciphersuite->key_exchange) { + case MBEDTLS_KEY_EXCHANGE_RSA: + case MBEDTLS_KEY_EXCHANGE_RSA_PSK: + usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT; + break; + + case MBEDTLS_KEY_EXCHANGE_DHE_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: + usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE; + break; + + case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: + case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: + usage = MBEDTLS_X509_KU_KEY_AGREEMENT; + break; + + /* Don't use default: we want warnings when adding new values */ + case MBEDTLS_KEY_EXCHANGE_NONE: + case MBEDTLS_KEY_EXCHANGE_PSK: + case MBEDTLS_KEY_EXCHANGE_DHE_PSK: + case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: + case MBEDTLS_KEY_EXCHANGE_ECJPAKE: + usage = 0; + } + } else { + /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for now */ + usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE; + } + + if (mbedtls_x509_crt_check_key_usage(cert, usage) != 0) { + *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE; + ret = -1; + } +#else + ((void) ciphersuite); +#endif /* MBEDTLS_X509_CHECK_KEY_USAGE */ + +#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) + if (cert_endpoint == MBEDTLS_SSL_IS_SERVER) { + ext_oid = MBEDTLS_OID_SERVER_AUTH; + ext_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_SERVER_AUTH); + } else { + ext_oid = MBEDTLS_OID_CLIENT_AUTH; + ext_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_CLIENT_AUTH); + } + + if (mbedtls_x509_crt_check_extended_key_usage(cert, ext_oid, ext_len) != 0) { + *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE; + ret = -1; + } +#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */ + + return ret; +} +#endif /* MBEDTLS_X509_CRT_PARSE_C */ + +int mbedtls_ssl_set_calc_verify_md(mbedtls_ssl_context *ssl, int md) +{ +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) + if (ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3) { + return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; + } + + switch (md) { +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) +#if defined(MBEDTLS_MD5_C) + case MBEDTLS_SSL_HASH_MD5: + return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; +#endif +#if defined(MBEDTLS_SHA1_C) + case MBEDTLS_SSL_HASH_SHA1: + ssl->handshake->calc_verify = ssl_calc_verify_tls; + break; +#endif +#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) + case MBEDTLS_SSL_HASH_SHA384: + ssl->handshake->calc_verify = ssl_calc_verify_tls_sha384; + break; +#endif +#if defined(MBEDTLS_SHA256_C) + case MBEDTLS_SSL_HASH_SHA256: + ssl->handshake->calc_verify = ssl_calc_verify_tls_sha256; + break; +#endif + default: + return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; + } + + return 0; +#else /* !MBEDTLS_SSL_PROTO_TLS1_2 */ + (void) ssl; + (void) md; + + return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ +} + +#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) +int mbedtls_ssl_get_key_exchange_md_ssl_tls(mbedtls_ssl_context *ssl, + unsigned char *output, + unsigned char *data, size_t data_len) +{ + int ret = 0; + mbedtls_md5_context mbedtls_md5; + mbedtls_sha1_context mbedtls_sha1; + + mbedtls_md5_init(&mbedtls_md5); + mbedtls_sha1_init(&mbedtls_sha1); + + /* + * digitally-signed struct { + * opaque md5_hash[16]; + * opaque sha_hash[20]; + * }; + * + * md5_hash + * MD5(ClientHello.random + ServerHello.random + * + ServerParams); + * sha_hash + * SHA(ClientHello.random + ServerHello.random + * + ServerParams); + */ + if ((ret = mbedtls_md5_starts_ret(&mbedtls_md5)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md5_starts_ret", ret); + goto exit; + } + if ((ret = mbedtls_md5_update_ret(&mbedtls_md5, + ssl->handshake->randbytes, 64)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md5_update_ret", ret); + goto exit; + } + if ((ret = mbedtls_md5_update_ret(&mbedtls_md5, data, data_len)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md5_update_ret", ret); + goto exit; + } + if ((ret = mbedtls_md5_finish_ret(&mbedtls_md5, output)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md5_finish_ret", ret); + goto exit; + } + + if ((ret = mbedtls_sha1_starts_ret(&mbedtls_sha1)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_sha1_starts_ret", ret); + goto exit; + } + if ((ret = mbedtls_sha1_update_ret(&mbedtls_sha1, + ssl->handshake->randbytes, 64)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_sha1_update_ret", ret); + goto exit; + } + if ((ret = mbedtls_sha1_update_ret(&mbedtls_sha1, data, + data_len)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_sha1_update_ret", ret); + goto exit; + } + if ((ret = mbedtls_sha1_finish_ret(&mbedtls_sha1, + output + 16)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_sha1_finish_ret", ret); + goto exit; + } + +exit: + mbedtls_md5_free(&mbedtls_md5); + mbedtls_sha1_free(&mbedtls_sha1); + + if (ret != 0) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR); + } + + return ret; + +} +#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ + MBEDTLS_SSL_PROTO_TLS1_1 */ + +#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_2) + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +int mbedtls_ssl_get_key_exchange_md_tls1_2(mbedtls_ssl_context *ssl, + unsigned char *hash, size_t *hashlen, + unsigned char *data, size_t data_len, + mbedtls_md_type_t md_alg) +{ + psa_status_t status; + psa_hash_operation_t hash_operation = PSA_HASH_OPERATION_INIT; + psa_algorithm_t hash_alg = mbedtls_psa_translate_md(md_alg); + + MBEDTLS_SSL_DEBUG_MSG(3, ("Perform PSA-based computation of digest of ServerKeyExchange")); + + if ((status = psa_hash_setup(&hash_operation, + hash_alg)) != PSA_SUCCESS) { + MBEDTLS_SSL_DEBUG_RET(1, "psa_hash_setup", status); + goto exit; + } + + if ((status = psa_hash_update(&hash_operation, ssl->handshake->randbytes, + 64)) != PSA_SUCCESS) { + MBEDTLS_SSL_DEBUG_RET(1, "psa_hash_update", status); + goto exit; + } + + if ((status = psa_hash_update(&hash_operation, + data, data_len)) != PSA_SUCCESS) { + MBEDTLS_SSL_DEBUG_RET(1, "psa_hash_update", status); + goto exit; + } + + if ((status = psa_hash_finish(&hash_operation, hash, PSA_HASH_MAX_SIZE, + hashlen)) != PSA_SUCCESS) { + MBEDTLS_SSL_DEBUG_RET(1, "psa_hash_finish", status); + goto exit; + } + +exit: + if (status != PSA_SUCCESS) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR); + + return mbedtls_ssl_md_error_from_psa(status); + } + return 0; +} + +#else + +int mbedtls_ssl_get_key_exchange_md_tls1_2(mbedtls_ssl_context *ssl, + unsigned char *hash, size_t *hashlen, + unsigned char *data, size_t data_len, + mbedtls_md_type_t md_alg) +{ + int ret = 0; + mbedtls_md_context_t ctx; + const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_alg); + *hashlen = mbedtls_md_get_size(md_info); + + MBEDTLS_SSL_DEBUG_MSG(3, ("Perform mbedtls-based computation of digest of ServerKeyExchange")); + + mbedtls_md_init(&ctx); + + /* + * digitally-signed struct { + * opaque client_random[32]; + * opaque server_random[32]; + * ServerDHParams params; + * }; + */ + if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_setup", ret); + goto exit; + } + if ((ret = mbedtls_md_starts(&ctx)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_starts", ret); + goto exit; + } + if ((ret = mbedtls_md_update(&ctx, ssl->handshake->randbytes, 64)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_update", ret); + goto exit; + } + if ((ret = mbedtls_md_update(&ctx, data, data_len)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_update", ret); + goto exit; + } + if ((ret = mbedtls_md_finish(&ctx, hash)) != 0) { + MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_finish", ret); + goto exit; + } + +exit: + mbedtls_md_free(&ctx); + + if (ret != 0) { + mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR); + } + + return ret; +} +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ + MBEDTLS_SSL_PROTO_TLS1_2 */ + +#endif /* MBEDTLS_SSL_TLS_C */ diff --git a/ext/opcua_client/mbedtls/library/ssl_tls13_keys.c b/ext/opcua_client/mbedtls/library/ssl_tls13_keys.c new file mode 100644 index 0000000..ae7bf10 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ssl_tls13_keys.c @@ -0,0 +1,341 @@ +/* + * TLS 1.3 key schedule + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) + +#include "mbedtls/hkdf.h" +#include "mbedtls/ssl_internal.h" +#include "ssl_tls13_keys.h" +#include "psa/crypto_sizes.h" + +#include +#include + +#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \ + .name = string, + +#define TLS1_3_EVOLVE_INPUT_SIZE (PSA_HASH_MAX_SIZE > PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE) ? \ + PSA_HASH_MAX_SIZE : PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE + +struct mbedtls_ssl_tls1_3_labels_struct const mbedtls_ssl_tls1_3_labels = +{ + /* This seems to work in C, despite the string literal being one + * character too long due to the 0-termination. */ + MBEDTLS_SSL_TLS1_3_LABEL_LIST +}; + +#undef MBEDTLS_SSL_TLS1_3_LABEL + +/* + * This function creates a HkdfLabel structure used in the TLS 1.3 key schedule. + * + * The HkdfLabel is specified in RFC 8446 as follows: + * + * struct HkdfLabel { + * uint16 length; // Length of expanded key material + * opaque label<7..255>; // Always prefixed by "tls13 " + * opaque context<0..255>; // Usually a communication transcript hash + * }; + * + * Parameters: + * - desired_length: Length of expanded key material + * Even though the standard allows expansion to up to + * 2**16 Bytes, TLS 1.3 never uses expansion to more than + * 255 Bytes, so we require `desired_length` to be at most + * 255. This allows us to save a few Bytes of code by + * hardcoding the writing of the high bytes. + * - (label, llen): label + label length, without "tls13 " prefix + * The label length MUST be less than or equal to + * MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN + * It is the caller's responsibility to ensure this. + * All (label, label length) pairs used in TLS 1.3 + * can be obtained via MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(). + * - (ctx, clen): context + context length + * The context length MUST be less than or equal to + * MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN + * It is the caller's responsibility to ensure this. + * - dst: Target buffer for HkdfLabel structure, + * This MUST be a writable buffer of size + * at least SSL_TLS1_3_KEY_SCHEDULE_MAX_HKDF_LABEL_LEN Bytes. + * - dlen: Pointer at which to store the actual length of + * the HkdfLabel structure on success. + */ + +static const char tls1_3_label_prefix[6] = "tls13 "; + +#define SSL_TLS1_3_KEY_SCHEDULE_HKDF_LABEL_LEN(label_len, context_len) \ + (2 /* expansion length */ \ + + 1 /* label length */ \ + + label_len \ + + 1 /* context length */ \ + + context_len) + +#define SSL_TLS1_3_KEY_SCHEDULE_MAX_HKDF_LABEL_LEN \ + SSL_TLS1_3_KEY_SCHEDULE_HKDF_LABEL_LEN( \ + sizeof(tls1_3_label_prefix) + \ + MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN, \ + MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN) + +static void ssl_tls1_3_hkdf_encode_label( + size_t desired_length, + const unsigned char *label, size_t llen, + const unsigned char *ctx, size_t clen, + unsigned char *dst, size_t *dlen) +{ + size_t total_label_len = + sizeof(tls1_3_label_prefix) + llen; + size_t total_hkdf_lbl_len = + SSL_TLS1_3_KEY_SCHEDULE_HKDF_LABEL_LEN(total_label_len, clen); + + unsigned char *p = dst; + + /* Add the size of the expanded key material. + * We're hardcoding the high byte to 0 here assuming that we never use + * TLS 1.3 HKDF key expansion to more than 255 Bytes. */ +#if MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN > 255 +#error "The implementation of ssl_tls1_3_hkdf_encode_label() is not fit for the \ + value of MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN" +#endif + + *p++ = 0; + *p++ = MBEDTLS_BYTE_0(desired_length); + + /* Add label incl. prefix */ + *p++ = MBEDTLS_BYTE_0(total_label_len); + memcpy(p, tls1_3_label_prefix, sizeof(tls1_3_label_prefix)); + p += sizeof(tls1_3_label_prefix); + memcpy(p, label, llen); + p += llen; + + /* Add context value */ + *p++ = MBEDTLS_BYTE_0(clen); + if (clen != 0) { + memcpy(p, ctx, clen); + } + + /* Return total length to the caller. */ + *dlen = total_hkdf_lbl_len; +} + +int mbedtls_ssl_tls1_3_hkdf_expand_label( + mbedtls_md_type_t hash_alg, + const unsigned char *secret, size_t slen, + const unsigned char *label, size_t llen, + const unsigned char *ctx, size_t clen, + unsigned char *buf, size_t blen) +{ + const mbedtls_md_info_t *md; + unsigned char hkdf_label[SSL_TLS1_3_KEY_SCHEDULE_MAX_HKDF_LABEL_LEN]; + size_t hkdf_label_len; + + if (llen > MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN) { + /* Should never happen since this is an internal + * function, and we know statically which labels + * are allowed. */ + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + if (clen > MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN) { + /* Should not happen, as above. */ + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + if (blen > MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN) { + /* Should not happen, as above. */ + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + md = mbedtls_md_info_from_type(hash_alg); + if (md == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + ssl_tls1_3_hkdf_encode_label(blen, + label, llen, + ctx, clen, + hkdf_label, + &hkdf_label_len); + + return mbedtls_hkdf_expand(md, + secret, slen, + hkdf_label, hkdf_label_len, + buf, blen); +} + +/* + * The traffic keying material is generated from the following inputs: + * + * - One secret value per sender. + * - A purpose value indicating the specific value being generated + * - The desired lengths of key and IV. + * + * The expansion itself is based on HKDF: + * + * [sender]_write_key = HKDF-Expand-Label( Secret, "key", "", key_length ) + * [sender]_write_iv = HKDF-Expand-Label( Secret, "iv" , "", iv_length ) + * + * [sender] denotes the sending side and the Secret value is provided + * by the function caller. Note that we generate server and client side + * keys in a single function call. + */ +int mbedtls_ssl_tls1_3_make_traffic_keys( + mbedtls_md_type_t hash_alg, + const unsigned char *client_secret, + const unsigned char *server_secret, + size_t slen, size_t key_len, size_t iv_len, + mbedtls_ssl_key_set *keys) +{ + int ret = 0; + + ret = mbedtls_ssl_tls1_3_hkdf_expand_label(hash_alg, + client_secret, slen, + MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(key), + NULL, 0, + keys->client_write_key, key_len); + if (ret != 0) { + return ret; + } + + ret = mbedtls_ssl_tls1_3_hkdf_expand_label(hash_alg, + server_secret, slen, + MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(key), + NULL, 0, + keys->server_write_key, key_len); + if (ret != 0) { + return ret; + } + + ret = mbedtls_ssl_tls1_3_hkdf_expand_label(hash_alg, + client_secret, slen, + MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(iv), + NULL, 0, + keys->client_write_iv, iv_len); + if (ret != 0) { + return ret; + } + + ret = mbedtls_ssl_tls1_3_hkdf_expand_label(hash_alg, + server_secret, slen, + MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(iv), + NULL, 0, + keys->server_write_iv, iv_len); + if (ret != 0) { + return ret; + } + + keys->key_len = key_len; + keys->iv_len = iv_len; + + return 0; +} + +int mbedtls_ssl_tls1_3_derive_secret( + mbedtls_md_type_t hash_alg, + const unsigned char *secret, size_t slen, + const unsigned char *label, size_t llen, + const unsigned char *ctx, size_t clen, + int ctx_hashed, + unsigned char *dstbuf, size_t buflen) +{ + int ret; + unsigned char hashed_context[MBEDTLS_MD_MAX_SIZE]; + + const mbedtls_md_info_t *md; + md = mbedtls_md_info_from_type(hash_alg); + if (md == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + if (ctx_hashed == MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED) { + ret = mbedtls_md(md, ctx, clen, hashed_context); + if (ret != 0) { + return ret; + } + clen = mbedtls_md_get_size(md); + } else { + if (clen > sizeof(hashed_context)) { + /* This should never happen since this function is internal + * and the code sets `ctx_hashed` correctly. + * Let's double-check nonetheless to not run at the risk + * of getting a stack overflow. */ + return MBEDTLS_ERR_SSL_INTERNAL_ERROR; + } + + memcpy(hashed_context, ctx, clen); + } + + return mbedtls_ssl_tls1_3_hkdf_expand_label(hash_alg, + secret, slen, + label, llen, + hashed_context, clen, + dstbuf, buflen); +} + +int mbedtls_ssl_tls1_3_evolve_secret( + mbedtls_md_type_t hash_alg, + const unsigned char *secret_old, + const unsigned char *input, size_t input_len, + unsigned char *secret_new) +{ + int ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; + size_t hlen, ilen; + unsigned char tmp_secret[PSA_MAC_MAX_SIZE] = { 0 }; + unsigned char tmp_input[TLS1_3_EVOLVE_INPUT_SIZE] = { 0 }; + + const mbedtls_md_info_t *md; + md = mbedtls_md_info_from_type(hash_alg); + if (md == NULL) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + + hlen = mbedtls_md_get_size(md); + + /* For non-initial runs, call Derive-Secret( ., "derived", "") + * on the old secret. */ + if (secret_old != NULL) { + ret = mbedtls_ssl_tls1_3_derive_secret( + hash_alg, + secret_old, hlen, + MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(derived), + NULL, 0, /* context */ + MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED, + tmp_secret, hlen); + if (ret != 0) { + goto cleanup; + } + } + + if (input != NULL) { + memcpy(tmp_input, input, input_len); + ilen = input_len; + } else { + ilen = hlen; + } + + /* HKDF-Extract takes a salt and input key material. + * The salt is the old secret, and the input key material + * is the input secret (PSK / ECDHE). */ + ret = mbedtls_hkdf_extract(md, + tmp_secret, hlen, + tmp_input, ilen, + secret_new); + if (ret != 0) { + goto cleanup; + } + + ret = 0; + +cleanup: + + mbedtls_platform_zeroize(tmp_secret, sizeof(tmp_secret)); + mbedtls_platform_zeroize(tmp_input, sizeof(tmp_input)); + return ret; +} + +#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ diff --git a/ext/opcua_client/mbedtls/library/ssl_tls13_keys.h b/ext/opcua_client/mbedtls/library/ssl_tls13_keys.h new file mode 100644 index 0000000..ca74132 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/ssl_tls13_keys.h @@ -0,0 +1,260 @@ +/* + * TLS 1.3 key schedule + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#if !defined(MBEDTLS_SSL_TLS1_3_KEYS_H) +#define MBEDTLS_SSL_TLS1_3_KEYS_H + +/* This requires MBEDTLS_SSL_TLS1_3_LABEL( idx, name, string ) to be defined at + * the point of use. See e.g. the definition of mbedtls_ssl_tls1_3_labels_union + * below. */ +#define MBEDTLS_SSL_TLS1_3_LABEL_LIST \ + MBEDTLS_SSL_TLS1_3_LABEL(finished, "finished") \ + MBEDTLS_SSL_TLS1_3_LABEL(resumption, "resumption") \ + MBEDTLS_SSL_TLS1_3_LABEL(traffic_upd, "traffic upd") \ + MBEDTLS_SSL_TLS1_3_LABEL(exporter, "exporter") \ + MBEDTLS_SSL_TLS1_3_LABEL(key, "key") \ + MBEDTLS_SSL_TLS1_3_LABEL(iv, "iv") \ + MBEDTLS_SSL_TLS1_3_LABEL(c_hs_traffic, "c hs traffic") \ + MBEDTLS_SSL_TLS1_3_LABEL(c_ap_traffic, "c ap traffic") \ + MBEDTLS_SSL_TLS1_3_LABEL(c_e_traffic, "c e traffic") \ + MBEDTLS_SSL_TLS1_3_LABEL(s_hs_traffic, "s hs traffic") \ + MBEDTLS_SSL_TLS1_3_LABEL(s_ap_traffic, "s ap traffic") \ + MBEDTLS_SSL_TLS1_3_LABEL(s_e_traffic, "s e traffic") \ + MBEDTLS_SSL_TLS1_3_LABEL(e_exp_master, "e exp master") \ + MBEDTLS_SSL_TLS1_3_LABEL(res_master, "res master") \ + MBEDTLS_SSL_TLS1_3_LABEL(exp_master, "exp master") \ + MBEDTLS_SSL_TLS1_3_LABEL(ext_binder, "ext binder") \ + MBEDTLS_SSL_TLS1_3_LABEL(res_binder, "res binder") \ + MBEDTLS_SSL_TLS1_3_LABEL(derived, "derived") + +#define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \ + const unsigned char name [sizeof(string) - 1]; + +union mbedtls_ssl_tls1_3_labels_union { + MBEDTLS_SSL_TLS1_3_LABEL_LIST +}; +struct mbedtls_ssl_tls1_3_labels_struct { + MBEDTLS_SSL_TLS1_3_LABEL_LIST +}; +#undef MBEDTLS_SSL_TLS1_3_LABEL + +extern const struct mbedtls_ssl_tls1_3_labels_struct mbedtls_ssl_tls1_3_labels; + +#define MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(LABEL) \ + mbedtls_ssl_tls1_3_labels.LABEL, \ + sizeof(mbedtls_ssl_tls1_3_labels.LABEL) + +#define MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN \ + sizeof(union mbedtls_ssl_tls1_3_labels_union) + +/* The maximum length of HKDF contexts used in the TLS 1.3 standard. + * Since contexts are always hashes of message transcripts, this can + * be approximated from above by the maximum hash size. */ +#define MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN \ + MBEDTLS_MD_MAX_SIZE + +/* Maximum desired length for expanded key material generated + * by HKDF-Expand-Label. + * + * Warning: If this ever needs to be increased, the implementation + * ssl_tls1_3_hkdf_encode_label() in ssl_tls13_keys.c needs to be + * adjusted since it currently assumes that HKDF key expansion + * is never used with more than 255 Bytes of output. */ +#define MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN 255 + +/** + * \brief The \c HKDF-Expand-Label function from + * the TLS 1.3 standard RFC 8446. + * + * + * HKDF-Expand-Label( Secret, Label, Context, Length ) = + * HKDF-Expand( Secret, HkdfLabel, Length ) + * + * + * \param hash_alg The identifier for the hash algorithm to use. + * \param secret The \c Secret argument to \c HKDF-Expand-Label. + * This must be a readable buffer of length \p slen Bytes. + * \param slen The length of \p secret in Bytes. + * \param label The \c Label argument to \c HKDF-Expand-Label. + * This must be a readable buffer of length \p llen Bytes. + * \param llen The length of \p label in Bytes. + * \param ctx The \c Context argument to \c HKDF-Expand-Label. + * This must be a readable buffer of length \p clen Bytes. + * \param clen The length of \p context in Bytes. + * \param buf The destination buffer to hold the expanded secret. + * This must be a writable buffer of length \p blen Bytes. + * \param blen The desired size of the expanded secret in Bytes. + * + * \returns \c 0 on success. + * \return A negative error code on failure. + */ + +int mbedtls_ssl_tls1_3_hkdf_expand_label( + mbedtls_md_type_t hash_alg, + const unsigned char *secret, size_t slen, + const unsigned char *label, size_t llen, + const unsigned char *ctx, size_t clen, + unsigned char *buf, size_t blen); + +/** + * \brief This function is part of the TLS 1.3 key schedule. + * It extracts key and IV for the actual client/server traffic + * from the client/server traffic secrets. + * + * From RFC 8446: + * + * + * [sender]_write_key = HKDF-Expand-Label(Secret, "key", "", key_length) + * [sender]_write_iv = HKDF-Expand-Label(Secret, "iv", "", iv_length)* + * + * + * \param hash_alg The identifier for the hash algorithm to be used + * for the HKDF-based expansion of the secret. + * \param client_secret The client traffic secret. + * This must be a readable buffer of size \p slen Bytes + * \param server_secret The server traffic secret. + * This must be a readable buffer of size \p slen Bytes + * \param slen Length of the secrets \p client_secret and + * \p server_secret in Bytes. + * \param key_len The desired length of the key to be extracted in Bytes. + * \param iv_len The desired length of the IV to be extracted in Bytes. + * \param keys The address of the structure holding the generated + * keys and IVs. + * + * \returns \c 0 on success. + * \returns A negative error code on failure. + */ + +int mbedtls_ssl_tls1_3_make_traffic_keys( + mbedtls_md_type_t hash_alg, + const unsigned char *client_secret, + const unsigned char *server_secret, + size_t slen, size_t key_len, size_t iv_len, + mbedtls_ssl_key_set *keys); + + +#define MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED 0 +#define MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED 1 + +/** + * \brief The \c Derive-Secret function from the TLS 1.3 standard RFC 8446. + * + * + * Derive-Secret( Secret, Label, Messages ) = + * HKDF-Expand-Label( Secret, Label, + * Hash( Messages ), + * Hash.Length ) ) + * + * + * \param hash_alg The identifier for the hash function used for the + * applications of HKDF. + * \param secret The \c Secret argument to the \c Derive-Secret function. + * This must be a readable buffer of length \p slen Bytes. + * \param slen The length of \p secret in Bytes. + * \param label The \c Label argument to the \c Derive-Secret function. + * This must be a readable buffer of length \p llen Bytes. + * \param llen The length of \p label in Bytes. + * \param ctx The hash of the \c Messages argument to the + * \c Derive-Secret function, or the \c Messages argument + * itself, depending on \p context_already_hashed. + * \param clen The length of \p hash. + * \param ctx_hashed This indicates whether the \p ctx contains the hash of + * the \c Messages argument in the application of the + * \c Derive-Secret function + * (value MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED), or whether + * it is the content of \c Messages itself, in which case + * the function takes care of the hashing + * (value MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED). + * \param dstbuf The target buffer to write the output of + * \c Derive-Secret to. This must be a writable buffer of + * size \p buflen Bytes. + * \param buflen The length of \p dstbuf in Bytes. + * + * \returns \c 0 on success. + * \returns A negative error code on failure. + */ +int mbedtls_ssl_tls1_3_derive_secret( + mbedtls_md_type_t hash_alg, + const unsigned char *secret, size_t slen, + const unsigned char *label, size_t llen, + const unsigned char *ctx, size_t clen, + int ctx_hashed, + unsigned char *dstbuf, size_t buflen); + +/** + * \brief Compute the next secret in the TLS 1.3 key schedule + * + * The TLS 1.3 key schedule proceeds as follows to compute + * the three main secrets during the handshake: The early + * secret for early data, the handshake secret for all + * other encrypted handshake messages, and the master + * secret for all application traffic. + * + * + * 0 + * | + * v + * PSK -> HKDF-Extract = Early Secret + * | + * v + * Derive-Secret( ., "derived", "" ) + * | + * v + * (EC)DHE -> HKDF-Extract = Handshake Secret + * | + * v + * Derive-Secret( ., "derived", "" ) + * | + * v + * 0 -> HKDF-Extract = Master Secret + * + * + * Each of the three secrets in turn is the basis for further + * key derivations, such as the derivation of traffic keys and IVs; + * see e.g. mbedtls_ssl_tls1_3_make_traffic_keys(). + * + * This function implements one step in this evolution of secrets: + * + * + * old_secret + * | + * v + * Derive-Secret( ., "derived", "" ) + * | + * v + * input -> HKDF-Extract = new_secret + * + * + * \param hash_alg The identifier for the hash function used for the + * applications of HKDF. + * \param secret_old The address of the buffer holding the old secret + * on function entry. If not \c NULL, this must be a + * readable buffer whose size matches the output size + * of the hash function represented by \p hash_alg. + * If \c NULL, an all \c 0 array will be used instead. + * \param input The address of the buffer holding the additional + * input for the key derivation (e.g., the PSK or the + * ephemeral (EC)DH secret). If not \c NULL, this must be + * a readable buffer whose size \p input_len Bytes. + * If \c NULL, an all \c 0 array will be used instead. + * \param input_len The length of \p input in Bytes. + * \param secret_new The address of the buffer holding the new secret + * on function exit. This must be a writable buffer + * whose size matches the output size of the hash + * function represented by \p hash_alg. + * This may be the same as \p secret_old. + * + * \returns \c 0 on success. + * \returns A negative error code on failure. + */ + +int mbedtls_ssl_tls1_3_evolve_secret( + mbedtls_md_type_t hash_alg, + const unsigned char *secret_old, + const unsigned char *input, size_t input_len, + unsigned char *secret_new); + +#endif /* MBEDTLS_SSL_TLS1_3_KEYS_H */ diff --git a/ext/opcua_client/mbedtls/library/threading.c b/ext/opcua_client/mbedtls/library/threading.c new file mode 100644 index 0000000..b03f0cc --- /dev/null +++ b/ext/opcua_client/mbedtls/library/threading.c @@ -0,0 +1,181 @@ +/* + * Threading abstraction layer + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * Ensure gmtime_r is available even with -std=c99; must be defined before + * config.h, which pulls in glibc's features.h. Harmless on other platforms. + */ +#if !defined(_POSIX_C_SOURCE) +#define _POSIX_C_SOURCE 200112L +#endif + +#include "common.h" + +#if defined(MBEDTLS_THREADING_C) + +#include "mbedtls/threading.h" + +#if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) + +#if !defined(_WIN32) && (defined(unix) || \ + defined(__unix) || defined(__unix__) || (defined(__APPLE__) && \ + defined(__MACH__))) +#include +#endif /* !_WIN32 && (unix || __unix || __unix__ || + * (__APPLE__ && __MACH__)) */ + +#if !((defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L) || \ + (defined(_POSIX_THREAD_SAFE_FUNCTIONS) && \ + _POSIX_THREAD_SAFE_FUNCTIONS >= 200112L)) +/* + * This is a convenience shorthand macro to avoid checking the long + * preprocessor conditions above. Ideally, we could expose this macro in + * platform_util.h and simply use it in platform_util.c, threading.c and + * threading.h. However, this macro is not part of the Mbed TLS public API, so + * we keep it private by only defining it in this file + */ + +#if !(defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)) +#define THREADING_USE_GMTIME +#endif /* ! ( defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) ) */ + +#endif /* !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ + ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ + _POSIX_THREAD_SAFE_FUNCTIONS >= 200112L ) ) */ + +#endif /* MBEDTLS_HAVE_TIME_DATE && !MBEDTLS_PLATFORM_GMTIME_R_ALT */ + +#if defined(MBEDTLS_THREADING_PTHREAD) +static void threading_mutex_init_pthread(mbedtls_threading_mutex_t *mutex) +{ + if (mutex == NULL) { + return; + } + + /* A nonzero value of is_valid indicates a successfully initialized + * mutex. This is a workaround for not being able to return an error + * code for this function. The lock/unlock functions return an error + * if is_valid is nonzero. The Mbed TLS unit test code uses this field + * to distinguish more states of the mutex; see + * tests/src/threading_helpers for details. */ + mutex->is_valid = pthread_mutex_init(&mutex->mutex, NULL) == 0; +} + +static void threading_mutex_free_pthread(mbedtls_threading_mutex_t *mutex) +{ + if (mutex == NULL || !mutex->is_valid) { + return; + } + + (void) pthread_mutex_destroy(&mutex->mutex); + mutex->is_valid = 0; +} + +static int threading_mutex_lock_pthread(mbedtls_threading_mutex_t *mutex) +{ + if (mutex == NULL || !mutex->is_valid) { + return MBEDTLS_ERR_THREADING_BAD_INPUT_DATA; + } + + if (pthread_mutex_lock(&mutex->mutex) != 0) { + return MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } + + return 0; +} + +static int threading_mutex_unlock_pthread(mbedtls_threading_mutex_t *mutex) +{ + if (mutex == NULL || !mutex->is_valid) { + return MBEDTLS_ERR_THREADING_BAD_INPUT_DATA; + } + + if (pthread_mutex_unlock(&mutex->mutex) != 0) { + return MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } + + return 0; +} + +void (*mbedtls_mutex_init)(mbedtls_threading_mutex_t *) = threading_mutex_init_pthread; +void (*mbedtls_mutex_free)(mbedtls_threading_mutex_t *) = threading_mutex_free_pthread; +int (*mbedtls_mutex_lock)(mbedtls_threading_mutex_t *) = threading_mutex_lock_pthread; +int (*mbedtls_mutex_unlock)(mbedtls_threading_mutex_t *) = threading_mutex_unlock_pthread; + +/* + * With pthreads we can statically initialize mutexes + */ +#define MUTEX_INIT = { PTHREAD_MUTEX_INITIALIZER, 1 } + +#endif /* MBEDTLS_THREADING_PTHREAD */ + +#if defined(MBEDTLS_THREADING_ALT) +static int threading_mutex_fail(mbedtls_threading_mutex_t *mutex) +{ + ((void) mutex); + return MBEDTLS_ERR_THREADING_BAD_INPUT_DATA; +} +static void threading_mutex_dummy(mbedtls_threading_mutex_t *mutex) +{ + ((void) mutex); + return; +} + +void (*mbedtls_mutex_init)(mbedtls_threading_mutex_t *) = threading_mutex_dummy; +void (*mbedtls_mutex_free)(mbedtls_threading_mutex_t *) = threading_mutex_dummy; +int (*mbedtls_mutex_lock)(mbedtls_threading_mutex_t *) = threading_mutex_fail; +int (*mbedtls_mutex_unlock)(mbedtls_threading_mutex_t *) = threading_mutex_fail; + +/* + * Set functions pointers and initialize global mutexes + */ +void mbedtls_threading_set_alt(void (*mutex_init)(mbedtls_threading_mutex_t *), + void (*mutex_free)(mbedtls_threading_mutex_t *), + int (*mutex_lock)(mbedtls_threading_mutex_t *), + int (*mutex_unlock)(mbedtls_threading_mutex_t *)) +{ + mbedtls_mutex_init = mutex_init; + mbedtls_mutex_free = mutex_free; + mbedtls_mutex_lock = mutex_lock; + mbedtls_mutex_unlock = mutex_unlock; + +#if defined(MBEDTLS_FS_IO) + mbedtls_mutex_init(&mbedtls_threading_readdir_mutex); +#endif +#if defined(THREADING_USE_GMTIME) + mbedtls_mutex_init(&mbedtls_threading_gmtime_mutex); +#endif +} + +/* + * Free global mutexes + */ +void mbedtls_threading_free_alt(void) +{ +#if defined(MBEDTLS_FS_IO) + mbedtls_mutex_free(&mbedtls_threading_readdir_mutex); +#endif +#if defined(THREADING_USE_GMTIME) + mbedtls_mutex_free(&mbedtls_threading_gmtime_mutex); +#endif +} +#endif /* MBEDTLS_THREADING_ALT */ + +/* + * Define global mutexes + */ +#ifndef MUTEX_INIT +#define MUTEX_INIT +#endif +#if defined(MBEDTLS_FS_IO) +mbedtls_threading_mutex_t mbedtls_threading_readdir_mutex MUTEX_INIT; +#endif +#if defined(THREADING_USE_GMTIME) +mbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex MUTEX_INIT; +#endif + +#endif /* MBEDTLS_THREADING_C */ diff --git a/ext/opcua_client/mbedtls/library/timing.c b/ext/opcua_client/mbedtls/library/timing.c new file mode 100644 index 0000000..b1f72fe --- /dev/null +++ b/ext/opcua_client/mbedtls/library/timing.c @@ -0,0 +1,525 @@ +/* + * Portable interface to the CPU cycle counter + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include + +#include "common.h" + +#include "mbedtls/platform.h" + +#if defined(MBEDTLS_TIMING_C) + +#include "mbedtls/timing.h" + +#if !defined(MBEDTLS_TIMING_ALT) + +#if !defined(unix) && !defined(__unix__) && !defined(__unix) && \ + !defined(__APPLE__) && !defined(_WIN32) && !defined(__QNXNTO__) && \ + !defined(__HAIKU__) && !defined(__midipix__) +#error "This module only works on Unix and Windows, see MBEDTLS_TIMING_C in config.h" +#endif + +/* *INDENT-OFF* */ +#ifndef asm +#define asm __asm +#endif +/* *INDENT-ON* */ + +#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) + +#include +#include + +struct _hr_time { + LARGE_INTEGER start; +}; + +#else + +#include +#include +#include +/* time.h should be included independently of MBEDTLS_HAVE_TIME. If the + * platform matches the ifdefs above, it will be used. */ +#include +#include +struct _hr_time { + struct timeval start; +}; +#endif /* _WIN32 && !EFIX64 && !EFI32 */ + +#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ + (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) + +#define HAVE_HARDCLOCK + +unsigned long mbedtls_timing_hardclock(void) +{ + unsigned long tsc; + __asm rdtsc + __asm mov[tsc], eax + return tsc; +} +#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && + ( _MSC_VER && _M_IX86 ) || __WATCOMC__ */ + +/* some versions of mingw-64 have 32-bit longs even on x84_64 */ +#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ + defined(__GNUC__) && (defined(__i386__) || ( \ + (defined(__amd64__) || defined(__x86_64__)) && __SIZEOF_LONG__ == 4)) + +#define HAVE_HARDCLOCK + +unsigned long mbedtls_timing_hardclock(void) +{ + unsigned long lo, hi; + asm volatile ("rdtsc" : "=a" (lo), "=d" (hi)); + return lo; +} +#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && + __GNUC__ && __i386__ */ + +#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ + defined(__GNUC__) && (defined(__amd64__) || defined(__x86_64__)) + +#define HAVE_HARDCLOCK + +unsigned long mbedtls_timing_hardclock(void) +{ + unsigned long lo, hi; + asm volatile ("rdtsc" : "=a" (lo), "=d" (hi)); + return lo | (hi << 32); +} +#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && + __GNUC__ && ( __amd64__ || __x86_64__ ) */ + +#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ + defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) + +#define HAVE_HARDCLOCK + +unsigned long mbedtls_timing_hardclock(void) +{ + unsigned long tbl, tbu0, tbu1; + + do { + asm volatile ("mftbu %0" : "=r" (tbu0)); + asm volatile ("mftb %0" : "=r" (tbl)); + asm volatile ("mftbu %0" : "=r" (tbu1)); + } while (tbu0 != tbu1); + + return tbl; +} +#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && + __GNUC__ && ( __powerpc__ || __ppc__ ) */ + +#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ + defined(__GNUC__) && defined(__sparc64__) + +#if defined(__OpenBSD__) +#warning OpenBSD does not allow access to tick register using software version instead +#else +#define HAVE_HARDCLOCK + +unsigned long mbedtls_timing_hardclock(void) +{ + unsigned long tick; + asm volatile ("rdpr %%tick, %0;" : "=&r" (tick)); + return tick; +} +#endif /* __OpenBSD__ */ +#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && + __GNUC__ && __sparc64__ */ + +#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ + defined(__GNUC__) && defined(__sparc__) && !defined(__sparc64__) + +#define HAVE_HARDCLOCK + +unsigned long mbedtls_timing_hardclock(void) +{ + unsigned long tick; + asm volatile (".byte 0x83, 0x41, 0x00, 0x00"); + asm volatile ("mov %%g1, %0" : "=r" (tick)); + return tick; +} +#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && + __GNUC__ && __sparc__ && !__sparc64__ */ + +#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ + defined(__GNUC__) && defined(__alpha__) + +#define HAVE_HARDCLOCK + +unsigned long mbedtls_timing_hardclock(void) +{ + unsigned long cc; + asm volatile ("rpcc %0" : "=r" (cc)); + return cc & 0xFFFFFFFF; +} +#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && + __GNUC__ && __alpha__ */ + +#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ + defined(__GNUC__) && defined(__ia64__) + +#define HAVE_HARDCLOCK + +unsigned long mbedtls_timing_hardclock(void) +{ + unsigned long itc; + asm volatile ("mov %0 = ar.itc" : "=r" (itc)); + return itc; +} +#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && + __GNUC__ && __ia64__ */ + +#if !defined(HAVE_HARDCLOCK) && defined(_MSC_VER) && \ + !defined(EFIX64) && !defined(EFI32) + +#define HAVE_HARDCLOCK + +unsigned long mbedtls_timing_hardclock(void) +{ + LARGE_INTEGER offset; + + QueryPerformanceCounter(&offset); + + return (unsigned long) (offset.QuadPart); +} +#endif /* !HAVE_HARDCLOCK && _MSC_VER && !EFIX64 && !EFI32 */ + +#if !defined(HAVE_HARDCLOCK) + +#define HAVE_HARDCLOCK + +static int hardclock_init = 0; +static struct timeval tv_init; + +unsigned long mbedtls_timing_hardclock(void) +{ + struct timeval tv_cur; + + if (hardclock_init == 0) { + gettimeofday(&tv_init, NULL); + hardclock_init = 1; + } + + gettimeofday(&tv_cur, NULL); + return (tv_cur.tv_sec - tv_init.tv_sec) * 1000000U + + (tv_cur.tv_usec - tv_init.tv_usec); +} +#endif /* !HAVE_HARDCLOCK */ + +volatile int mbedtls_timing_alarmed = 0; + +#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) + +unsigned long mbedtls_timing_get_timer(struct mbedtls_timing_hr_time *val, int reset) +{ + struct _hr_time t; + + if (reset) { + QueryPerformanceCounter(&t.start); + memcpy(val, &t, sizeof(struct _hr_time)); + return 0; + } else { + unsigned long delta; + LARGE_INTEGER now, hfreq; + /* We can't safely cast val because it may not be aligned, so use memcpy */ + memcpy(&t, val, sizeof(struct _hr_time)); + QueryPerformanceCounter(&now); + QueryPerformanceFrequency(&hfreq); + delta = (unsigned long) ((now.QuadPart - t.start.QuadPart) * 1000ul + / hfreq.QuadPart); + return delta; + } +} + +/* It's OK to use a global because alarm() is supposed to be global anyway */ +static DWORD alarmMs; + +static void TimerProc(void *TimerContext) +{ + (void) TimerContext; + Sleep(alarmMs); + mbedtls_timing_alarmed = 1; + /* _endthread will be called implicitly on return + * That ensures execution of thread function's epilogue */ +} + +void mbedtls_set_alarm(int seconds) +{ + if (seconds == 0) { + /* No need to create a thread for this simple case. + * Also, this shorcut is more reliable at least on MinGW32 */ + mbedtls_timing_alarmed = 1; + return; + } + + mbedtls_timing_alarmed = 0; + alarmMs = seconds * 1000; + (void) _beginthread(TimerProc, 0, NULL); +} + +#else /* _WIN32 && !EFIX64 && !EFI32 */ + +unsigned long mbedtls_timing_get_timer(struct mbedtls_timing_hr_time *val, int reset) +{ + struct _hr_time t; + + if (reset) { + gettimeofday(&t.start, NULL); + memcpy(val, &t, sizeof(struct _hr_time)); + return 0; + } else { + unsigned long delta; + struct timeval now; + /* We can't safely cast val because it may not be aligned, so use memcpy */ + memcpy(&t, val, sizeof(struct _hr_time)); + gettimeofday(&now, NULL); + delta = (now.tv_sec - t.start.tv_sec) * 1000ul + + (now.tv_usec - t.start.tv_usec) / 1000; + return delta; + } +} + +static void sighandler(int signum) +{ + mbedtls_timing_alarmed = 1; + signal(signum, sighandler); +} + +void mbedtls_set_alarm(int seconds) +{ + mbedtls_timing_alarmed = 0; + signal(SIGALRM, sighandler); + alarm(seconds); + if (seconds == 0) { + /* alarm(0) cancelled any previous pending alarm, but the + handler won't fire, so raise the flag straight away. */ + mbedtls_timing_alarmed = 1; + } +} + +#endif /* _WIN32 && !EFIX64 && !EFI32 */ + +/* + * Set delays to watch + */ +void mbedtls_timing_set_delay(void *data, uint32_t int_ms, uint32_t fin_ms) +{ + mbedtls_timing_delay_context *ctx = (mbedtls_timing_delay_context *) data; + + ctx->int_ms = int_ms; + ctx->fin_ms = fin_ms; + + if (fin_ms != 0) { + (void) mbedtls_timing_get_timer(&ctx->timer, 1); + } +} + +/* + * Get number of delays expired + */ +int mbedtls_timing_get_delay(void *data) +{ + mbedtls_timing_delay_context *ctx = (mbedtls_timing_delay_context *) data; + unsigned long elapsed_ms; + + if (ctx->fin_ms == 0) { + return -1; + } + + elapsed_ms = mbedtls_timing_get_timer(&ctx->timer, 0); + + if (elapsed_ms >= ctx->fin_ms) { + return 2; + } + + if (elapsed_ms >= ctx->int_ms) { + return 1; + } + + return 0; +} + +#endif /* !MBEDTLS_TIMING_ALT */ + +#if defined(MBEDTLS_SELF_TEST) +/* + * Busy-waits for the given number of milliseconds. + * Used for testing mbedtls_timing_hardclock. + */ +static void busy_msleep(unsigned long msec) +{ + struct mbedtls_timing_hr_time hires; + unsigned long i = 0; /* for busy-waiting */ + volatile unsigned long j; /* to prevent optimisation */ + + (void) mbedtls_timing_get_timer(&hires, 1); + + while (mbedtls_timing_get_timer(&hires, 0) < msec) { + i++; + } + + j = i; + (void) j; +} + +#define FAIL do \ + { \ + if (verbose != 0) \ + { \ + mbedtls_printf("failed at line %d\n", __LINE__); \ + mbedtls_printf(" cycles=%lu ratio=%lu millisecs=%lu secs=%lu hardfail=%d a=%lu b=%lu\n", \ + cycles, ratio, millisecs, secs, hardfail, \ + (unsigned long) a, (unsigned long) b); \ + mbedtls_printf(" elapsed(hires)=%lu status(ctx)=%d\n", \ + mbedtls_timing_get_timer(&hires, 0), \ + mbedtls_timing_get_delay(&ctx)); \ + } \ + return 1; \ + } while (0) + +/* + * Checkup routine + * + * Warning: this is work in progress, some tests may not be reliable enough + * yet! False positives may happen. + */ +int mbedtls_timing_self_test(int verbose) +{ + unsigned long cycles = 0, ratio = 0; + unsigned long millisecs = 0, secs = 0; + int hardfail = 0; + struct mbedtls_timing_hr_time hires; + uint32_t a = 0, b = 0; + mbedtls_timing_delay_context ctx; + + memset(&ctx, 0, sizeof(ctx)); + if (verbose != 0) { + mbedtls_printf(" TIMING tests note: will take some time!\n"); + } + + if (verbose != 0) { + mbedtls_printf(" TIMING test #1 (set_alarm / get_timer): "); + } + + { + secs = 1; + + (void) mbedtls_timing_get_timer(&hires, 1); + + mbedtls_set_alarm((int) secs); + while (!mbedtls_timing_alarmed) { + ; + } + + millisecs = mbedtls_timing_get_timer(&hires, 0); + + /* For some reason on Windows it looks like alarm has an extra delay + * (maybe related to creating a new thread). Allow some room here. */ + if (millisecs < 800 * secs || millisecs > 1200 * secs + 300) { + FAIL; + } + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + if (verbose != 0) { + mbedtls_printf(" TIMING test #2 (set/get_delay ): "); + } + + { + a = 800; + b = 400; + mbedtls_timing_set_delay(&ctx, a, a + b); /* T = 0 */ + + busy_msleep(a - a / 4); /* T = a - a/4 */ + if (mbedtls_timing_get_delay(&ctx) != 0) { + FAIL; + } + + busy_msleep(a / 4 + b / 4); /* T = a + b/4 */ + if (mbedtls_timing_get_delay(&ctx) != 1) { + FAIL; + } + + busy_msleep(b); /* T = a + b + b/4 */ + if (mbedtls_timing_get_delay(&ctx) != 2) { + FAIL; + } + } + + mbedtls_timing_set_delay(&ctx, 0, 0); + busy_msleep(200); + if (mbedtls_timing_get_delay(&ctx) != -1) { + FAIL; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + + if (verbose != 0) { + mbedtls_printf(" TIMING test #3 (hardclock / get_timer): "); + } + + /* + * Allow one failure for possible counter wrapping. + * On a 4Ghz 32-bit machine the cycle counter wraps about once per second; + * since the whole test is about 10ms, it shouldn't happen twice in a row. + */ + +hard_test: + if (hardfail > 1) { + if (verbose != 0) { + mbedtls_printf("failed (ignored)\n"); + } + + goto hard_test_done; + } + + /* Get a reference ratio cycles/ms */ + millisecs = 1; + cycles = mbedtls_timing_hardclock(); + busy_msleep(millisecs); + cycles = mbedtls_timing_hardclock() - cycles; + ratio = cycles / millisecs; + + /* Check that the ratio is mostly constant */ + for (millisecs = 2; millisecs <= 4; millisecs++) { + cycles = mbedtls_timing_hardclock(); + busy_msleep(millisecs); + cycles = mbedtls_timing_hardclock() - cycles; + + /* Allow variation up to 20% */ + if (cycles / millisecs < ratio - ratio / 5 || + cycles / millisecs > ratio + ratio / 5) { + hardfail++; + goto hard_test; + } + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + +hard_test_done: + + if (verbose != 0) { + mbedtls_printf("\n"); + } + + return 0; +} + +#endif /* MBEDTLS_SELF_TEST */ +#endif /* MBEDTLS_TIMING_C */ diff --git a/ext/opcua_client/mbedtls/library/version.c b/ext/opcua_client/mbedtls/library/version.c new file mode 100644 index 0000000..0439733 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/version.c @@ -0,0 +1,32 @@ +/* + * Version information + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_VERSION_C) + +#include "mbedtls/version.h" +#include + +unsigned int mbedtls_version_get_number(void) +{ + return MBEDTLS_VERSION_NUMBER; +} + +void mbedtls_version_get_string(char *string) +{ + memcpy(string, MBEDTLS_VERSION_STRING, + sizeof(MBEDTLS_VERSION_STRING)); +} + +void mbedtls_version_get_string_full(char *string) +{ + memcpy(string, MBEDTLS_VERSION_STRING_FULL, + sizeof(MBEDTLS_VERSION_STRING_FULL)); +} + +#endif /* MBEDTLS_VERSION_C */ diff --git a/ext/opcua_client/mbedtls/library/version_features.c b/ext/opcua_client/mbedtls/library/version_features.c new file mode 100644 index 0000000..f5734c4 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/version_features.c @@ -0,0 +1,880 @@ +/* + * Version feature information + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_VERSION_C) + +#include "mbedtls/version.h" + +#include + +static const char * const features[] = { +#if defined(MBEDTLS_VERSION_FEATURES) + #if defined(MBEDTLS_HAVE_ASM) + "MBEDTLS_HAVE_ASM", +#endif /* MBEDTLS_HAVE_ASM */ +#if defined(MBEDTLS_NO_UDBL_DIVISION) + "MBEDTLS_NO_UDBL_DIVISION", +#endif /* MBEDTLS_NO_UDBL_DIVISION */ +#if defined(MBEDTLS_NO_64BIT_MULTIPLICATION) + "MBEDTLS_NO_64BIT_MULTIPLICATION", +#endif /* MBEDTLS_NO_64BIT_MULTIPLICATION */ +#if defined(MBEDTLS_HAVE_SSE2) + "MBEDTLS_HAVE_SSE2", +#endif /* MBEDTLS_HAVE_SSE2 */ +#if defined(MBEDTLS_HAVE_TIME) + "MBEDTLS_HAVE_TIME", +#endif /* MBEDTLS_HAVE_TIME */ +#if defined(MBEDTLS_HAVE_TIME_DATE) + "MBEDTLS_HAVE_TIME_DATE", +#endif /* MBEDTLS_HAVE_TIME_DATE */ +#if defined(MBEDTLS_PLATFORM_MEMORY) + "MBEDTLS_PLATFORM_MEMORY", +#endif /* MBEDTLS_PLATFORM_MEMORY */ +#if defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) + "MBEDTLS_PLATFORM_NO_STD_FUNCTIONS", +#endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ +#if defined(MBEDTLS_PLATFORM_EXIT_ALT) + "MBEDTLS_PLATFORM_EXIT_ALT", +#endif /* MBEDTLS_PLATFORM_EXIT_ALT */ +#if defined(MBEDTLS_PLATFORM_TIME_ALT) + "MBEDTLS_PLATFORM_TIME_ALT", +#endif /* MBEDTLS_PLATFORM_TIME_ALT */ +#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) + "MBEDTLS_PLATFORM_FPRINTF_ALT", +#endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */ +#if defined(MBEDTLS_PLATFORM_PRINTF_ALT) + "MBEDTLS_PLATFORM_PRINTF_ALT", +#endif /* MBEDTLS_PLATFORM_PRINTF_ALT */ +#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) + "MBEDTLS_PLATFORM_SNPRINTF_ALT", +#endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ +#if defined(MBEDTLS_PLATFORM_VSNPRINTF_ALT) + "MBEDTLS_PLATFORM_VSNPRINTF_ALT", +#endif /* MBEDTLS_PLATFORM_VSNPRINTF_ALT */ +#if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) + "MBEDTLS_PLATFORM_NV_SEED_ALT", +#endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */ +#if defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT) + "MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT", +#endif /* MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */ +#if defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) + "MBEDTLS_PLATFORM_GMTIME_R_ALT", +#endif /* MBEDTLS_PLATFORM_GMTIME_R_ALT */ +#if defined(MBEDTLS_PLATFORM_ZEROIZE_ALT) + "MBEDTLS_PLATFORM_ZEROIZE_ALT", +#endif /* MBEDTLS_PLATFORM_ZEROIZE_ALT */ +#if defined(MBEDTLS_DEPRECATED_WARNING) + "MBEDTLS_DEPRECATED_WARNING", +#endif /* MBEDTLS_DEPRECATED_WARNING */ +#if defined(MBEDTLS_DEPRECATED_REMOVED) + "MBEDTLS_DEPRECATED_REMOVED", +#endif /* MBEDTLS_DEPRECATED_REMOVED */ +#if defined(MBEDTLS_CHECK_PARAMS) + "MBEDTLS_CHECK_PARAMS", +#endif /* MBEDTLS_CHECK_PARAMS */ +#if defined(MBEDTLS_CHECK_PARAMS_ASSERT) + "MBEDTLS_CHECK_PARAMS_ASSERT", +#endif /* MBEDTLS_CHECK_PARAMS_ASSERT */ +#if defined(MBEDTLS_TIMING_ALT) + "MBEDTLS_TIMING_ALT", +#endif /* MBEDTLS_TIMING_ALT */ +#if defined(MBEDTLS_AES_ALT) + "MBEDTLS_AES_ALT", +#endif /* MBEDTLS_AES_ALT */ +#if defined(MBEDTLS_ARC4_ALT) + "MBEDTLS_ARC4_ALT", +#endif /* MBEDTLS_ARC4_ALT */ +#if defined(MBEDTLS_ARIA_ALT) + "MBEDTLS_ARIA_ALT", +#endif /* MBEDTLS_ARIA_ALT */ +#if defined(MBEDTLS_BLOWFISH_ALT) + "MBEDTLS_BLOWFISH_ALT", +#endif /* MBEDTLS_BLOWFISH_ALT */ +#if defined(MBEDTLS_CAMELLIA_ALT) + "MBEDTLS_CAMELLIA_ALT", +#endif /* MBEDTLS_CAMELLIA_ALT */ +#if defined(MBEDTLS_CCM_ALT) + "MBEDTLS_CCM_ALT", +#endif /* MBEDTLS_CCM_ALT */ +#if defined(MBEDTLS_CHACHA20_ALT) + "MBEDTLS_CHACHA20_ALT", +#endif /* MBEDTLS_CHACHA20_ALT */ +#if defined(MBEDTLS_CHACHAPOLY_ALT) + "MBEDTLS_CHACHAPOLY_ALT", +#endif /* MBEDTLS_CHACHAPOLY_ALT */ +#if defined(MBEDTLS_CMAC_ALT) + "MBEDTLS_CMAC_ALT", +#endif /* MBEDTLS_CMAC_ALT */ +#if defined(MBEDTLS_DES_ALT) + "MBEDTLS_DES_ALT", +#endif /* MBEDTLS_DES_ALT */ +#if defined(MBEDTLS_DHM_ALT) + "MBEDTLS_DHM_ALT", +#endif /* MBEDTLS_DHM_ALT */ +#if defined(MBEDTLS_ECJPAKE_ALT) + "MBEDTLS_ECJPAKE_ALT", +#endif /* MBEDTLS_ECJPAKE_ALT */ +#if defined(MBEDTLS_GCM_ALT) + "MBEDTLS_GCM_ALT", +#endif /* MBEDTLS_GCM_ALT */ +#if defined(MBEDTLS_NIST_KW_ALT) + "MBEDTLS_NIST_KW_ALT", +#endif /* MBEDTLS_NIST_KW_ALT */ +#if defined(MBEDTLS_MD2_ALT) + "MBEDTLS_MD2_ALT", +#endif /* MBEDTLS_MD2_ALT */ +#if defined(MBEDTLS_MD4_ALT) + "MBEDTLS_MD4_ALT", +#endif /* MBEDTLS_MD4_ALT */ +#if defined(MBEDTLS_MD5_ALT) + "MBEDTLS_MD5_ALT", +#endif /* MBEDTLS_MD5_ALT */ +#if defined(MBEDTLS_POLY1305_ALT) + "MBEDTLS_POLY1305_ALT", +#endif /* MBEDTLS_POLY1305_ALT */ +#if defined(MBEDTLS_RIPEMD160_ALT) + "MBEDTLS_RIPEMD160_ALT", +#endif /* MBEDTLS_RIPEMD160_ALT */ +#if defined(MBEDTLS_RSA_ALT) + "MBEDTLS_RSA_ALT", +#endif /* MBEDTLS_RSA_ALT */ +#if defined(MBEDTLS_SHA1_ALT) + "MBEDTLS_SHA1_ALT", +#endif /* MBEDTLS_SHA1_ALT */ +#if defined(MBEDTLS_SHA256_ALT) + "MBEDTLS_SHA256_ALT", +#endif /* MBEDTLS_SHA256_ALT */ +#if defined(MBEDTLS_SHA512_ALT) + "MBEDTLS_SHA512_ALT", +#endif /* MBEDTLS_SHA512_ALT */ +#if defined(MBEDTLS_XTEA_ALT) + "MBEDTLS_XTEA_ALT", +#endif /* MBEDTLS_XTEA_ALT */ +#if defined(MBEDTLS_ECP_ALT) + "MBEDTLS_ECP_ALT", +#endif /* MBEDTLS_ECP_ALT */ +#if defined(MBEDTLS_MD2_PROCESS_ALT) + "MBEDTLS_MD2_PROCESS_ALT", +#endif /* MBEDTLS_MD2_PROCESS_ALT */ +#if defined(MBEDTLS_MD4_PROCESS_ALT) + "MBEDTLS_MD4_PROCESS_ALT", +#endif /* MBEDTLS_MD4_PROCESS_ALT */ +#if defined(MBEDTLS_MD5_PROCESS_ALT) + "MBEDTLS_MD5_PROCESS_ALT", +#endif /* MBEDTLS_MD5_PROCESS_ALT */ +#if defined(MBEDTLS_RIPEMD160_PROCESS_ALT) + "MBEDTLS_RIPEMD160_PROCESS_ALT", +#endif /* MBEDTLS_RIPEMD160_PROCESS_ALT */ +#if defined(MBEDTLS_SHA1_PROCESS_ALT) + "MBEDTLS_SHA1_PROCESS_ALT", +#endif /* MBEDTLS_SHA1_PROCESS_ALT */ +#if defined(MBEDTLS_SHA256_PROCESS_ALT) + "MBEDTLS_SHA256_PROCESS_ALT", +#endif /* MBEDTLS_SHA256_PROCESS_ALT */ +#if defined(MBEDTLS_SHA512_PROCESS_ALT) + "MBEDTLS_SHA512_PROCESS_ALT", +#endif /* MBEDTLS_SHA512_PROCESS_ALT */ +#if defined(MBEDTLS_DES_SETKEY_ALT) + "MBEDTLS_DES_SETKEY_ALT", +#endif /* MBEDTLS_DES_SETKEY_ALT */ +#if defined(MBEDTLS_DES_CRYPT_ECB_ALT) + "MBEDTLS_DES_CRYPT_ECB_ALT", +#endif /* MBEDTLS_DES_CRYPT_ECB_ALT */ +#if defined(MBEDTLS_DES3_CRYPT_ECB_ALT) + "MBEDTLS_DES3_CRYPT_ECB_ALT", +#endif /* MBEDTLS_DES3_CRYPT_ECB_ALT */ +#if defined(MBEDTLS_AES_SETKEY_ENC_ALT) + "MBEDTLS_AES_SETKEY_ENC_ALT", +#endif /* MBEDTLS_AES_SETKEY_ENC_ALT */ +#if defined(MBEDTLS_AES_SETKEY_DEC_ALT) + "MBEDTLS_AES_SETKEY_DEC_ALT", +#endif /* MBEDTLS_AES_SETKEY_DEC_ALT */ +#if defined(MBEDTLS_AES_ENCRYPT_ALT) + "MBEDTLS_AES_ENCRYPT_ALT", +#endif /* MBEDTLS_AES_ENCRYPT_ALT */ +#if defined(MBEDTLS_AES_DECRYPT_ALT) + "MBEDTLS_AES_DECRYPT_ALT", +#endif /* MBEDTLS_AES_DECRYPT_ALT */ +#if defined(MBEDTLS_ECDH_GEN_PUBLIC_ALT) + "MBEDTLS_ECDH_GEN_PUBLIC_ALT", +#endif /* MBEDTLS_ECDH_GEN_PUBLIC_ALT */ +#if defined(MBEDTLS_ECDH_COMPUTE_SHARED_ALT) + "MBEDTLS_ECDH_COMPUTE_SHARED_ALT", +#endif /* MBEDTLS_ECDH_COMPUTE_SHARED_ALT */ +#if defined(MBEDTLS_ECDSA_VERIFY_ALT) + "MBEDTLS_ECDSA_VERIFY_ALT", +#endif /* MBEDTLS_ECDSA_VERIFY_ALT */ +#if defined(MBEDTLS_ECDSA_SIGN_ALT) + "MBEDTLS_ECDSA_SIGN_ALT", +#endif /* MBEDTLS_ECDSA_SIGN_ALT */ +#if defined(MBEDTLS_ECDSA_GENKEY_ALT) + "MBEDTLS_ECDSA_GENKEY_ALT", +#endif /* MBEDTLS_ECDSA_GENKEY_ALT */ +#if defined(MBEDTLS_ECP_INTERNAL_ALT) + "MBEDTLS_ECP_INTERNAL_ALT", +#endif /* MBEDTLS_ECP_INTERNAL_ALT */ +#if defined(MBEDTLS_ECP_NO_FALLBACK) + "MBEDTLS_ECP_NO_FALLBACK", +#endif /* MBEDTLS_ECP_NO_FALLBACK */ +#if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) + "MBEDTLS_ECP_RANDOMIZE_JAC_ALT", +#endif /* MBEDTLS_ECP_RANDOMIZE_JAC_ALT */ +#if defined(MBEDTLS_ECP_ADD_MIXED_ALT) + "MBEDTLS_ECP_ADD_MIXED_ALT", +#endif /* MBEDTLS_ECP_ADD_MIXED_ALT */ +#if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) + "MBEDTLS_ECP_DOUBLE_JAC_ALT", +#endif /* MBEDTLS_ECP_DOUBLE_JAC_ALT */ +#if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) + "MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT", +#endif /* MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT */ +#if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) + "MBEDTLS_ECP_NORMALIZE_JAC_ALT", +#endif /* MBEDTLS_ECP_NORMALIZE_JAC_ALT */ +#if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) + "MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT", +#endif /* MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT */ +#if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) + "MBEDTLS_ECP_RANDOMIZE_MXZ_ALT", +#endif /* MBEDTLS_ECP_RANDOMIZE_MXZ_ALT */ +#if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) + "MBEDTLS_ECP_NORMALIZE_MXZ_ALT", +#endif /* MBEDTLS_ECP_NORMALIZE_MXZ_ALT */ +#if defined(MBEDTLS_TEST_NULL_ENTROPY) + "MBEDTLS_TEST_NULL_ENTROPY", +#endif /* MBEDTLS_TEST_NULL_ENTROPY */ +#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) + "MBEDTLS_ENTROPY_HARDWARE_ALT", +#endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */ +#if defined(MBEDTLS_AES_ROM_TABLES) + "MBEDTLS_AES_ROM_TABLES", +#endif /* MBEDTLS_AES_ROM_TABLES */ +#if defined(MBEDTLS_AES_FEWER_TABLES) + "MBEDTLS_AES_FEWER_TABLES", +#endif /* MBEDTLS_AES_FEWER_TABLES */ +#if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY) + "MBEDTLS_CAMELLIA_SMALL_MEMORY", +#endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */ +#if defined(MBEDTLS_CHECK_RETURN_WARNING) + "MBEDTLS_CHECK_RETURN_WARNING", +#endif /* MBEDTLS_CHECK_RETURN_WARNING */ +#if defined(MBEDTLS_CIPHER_MODE_CBC) + "MBEDTLS_CIPHER_MODE_CBC", +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_CIPHER_MODE_CFB) + "MBEDTLS_CIPHER_MODE_CFB", +#endif /* MBEDTLS_CIPHER_MODE_CFB */ +#if defined(MBEDTLS_CIPHER_MODE_CTR) + "MBEDTLS_CIPHER_MODE_CTR", +#endif /* MBEDTLS_CIPHER_MODE_CTR */ +#if defined(MBEDTLS_CIPHER_MODE_OFB) + "MBEDTLS_CIPHER_MODE_OFB", +#endif /* MBEDTLS_CIPHER_MODE_OFB */ +#if defined(MBEDTLS_CIPHER_MODE_XTS) + "MBEDTLS_CIPHER_MODE_XTS", +#endif /* MBEDTLS_CIPHER_MODE_XTS */ +#if defined(MBEDTLS_CIPHER_NULL_CIPHER) + "MBEDTLS_CIPHER_NULL_CIPHER", +#endif /* MBEDTLS_CIPHER_NULL_CIPHER */ +#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) + "MBEDTLS_CIPHER_PADDING_PKCS7", +#endif /* MBEDTLS_CIPHER_PADDING_PKCS7 */ +#if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS) + "MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS", +#endif /* MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS */ +#if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN) + "MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN", +#endif /* MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN */ +#if defined(MBEDTLS_CIPHER_PADDING_ZEROS) + "MBEDTLS_CIPHER_PADDING_ZEROS", +#endif /* MBEDTLS_CIPHER_PADDING_ZEROS */ +#if defined(MBEDTLS_CTR_DRBG_USE_128_BIT_KEY) + "MBEDTLS_CTR_DRBG_USE_128_BIT_KEY", +#endif /* MBEDTLS_CTR_DRBG_USE_128_BIT_KEY */ +#if defined(MBEDTLS_ENABLE_WEAK_CIPHERSUITES) + "MBEDTLS_ENABLE_WEAK_CIPHERSUITES", +#endif /* MBEDTLS_ENABLE_WEAK_CIPHERSUITES */ +#if defined(MBEDTLS_REMOVE_ARC4_CIPHERSUITES) + "MBEDTLS_REMOVE_ARC4_CIPHERSUITES", +#endif /* MBEDTLS_REMOVE_ARC4_CIPHERSUITES */ +#if defined(MBEDTLS_REMOVE_3DES_CIPHERSUITES) + "MBEDTLS_REMOVE_3DES_CIPHERSUITES", +#endif /* MBEDTLS_REMOVE_3DES_CIPHERSUITES */ +#if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED) + "MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED", +#endif /* MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) + "MBEDTLS_ECP_DP_SECP192R1_ENABLED", +#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) + "MBEDTLS_ECP_DP_SECP224R1_ENABLED", +#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) + "MBEDTLS_ECP_DP_SECP256R1_ENABLED", +#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) + "MBEDTLS_ECP_DP_SECP384R1_ENABLED", +#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) + "MBEDTLS_ECP_DP_SECP521R1_ENABLED", +#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) + "MBEDTLS_ECP_DP_SECP192K1_ENABLED", +#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) + "MBEDTLS_ECP_DP_SECP224K1_ENABLED", +#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) + "MBEDTLS_ECP_DP_SECP256K1_ENABLED", +#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) + "MBEDTLS_ECP_DP_BP256R1_ENABLED", +#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) + "MBEDTLS_ECP_DP_BP384R1_ENABLED", +#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) + "MBEDTLS_ECP_DP_BP512R1_ENABLED", +#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) + "MBEDTLS_ECP_DP_CURVE25519_ENABLED", +#endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */ +#if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) + "MBEDTLS_ECP_DP_CURVE448_ENABLED", +#endif /* MBEDTLS_ECP_DP_CURVE448_ENABLED */ +#if defined(MBEDTLS_ECP_NIST_OPTIM) + "MBEDTLS_ECP_NIST_OPTIM", +#endif /* MBEDTLS_ECP_NIST_OPTIM */ +#if defined(MBEDTLS_ECP_NO_INTERNAL_RNG) + "MBEDTLS_ECP_NO_INTERNAL_RNG", +#endif /* MBEDTLS_ECP_NO_INTERNAL_RNG */ +#if defined(MBEDTLS_ECP_RESTARTABLE) + "MBEDTLS_ECP_RESTARTABLE", +#endif /* MBEDTLS_ECP_RESTARTABLE */ +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + "MBEDTLS_ECDH_LEGACY_CONTEXT", +#endif /* MBEDTLS_ECDH_LEGACY_CONTEXT */ +#if defined(MBEDTLS_ECDSA_DETERMINISTIC) + "MBEDTLS_ECDSA_DETERMINISTIC", +#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ +#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) + "MBEDTLS_KEY_EXCHANGE_PSK_ENABLED", +#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) + "MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED", +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) + "MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED", +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) + "MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED", +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) + "MBEDTLS_KEY_EXCHANGE_RSA_ENABLED", +#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) + "MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED", +#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) + "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED", +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) + "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED", +#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) + "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED", +#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) + "MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED", +#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */ +#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) + "MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED", +#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ +#if defined(MBEDTLS_PK_PARSE_EC_EXTENDED) + "MBEDTLS_PK_PARSE_EC_EXTENDED", +#endif /* MBEDTLS_PK_PARSE_EC_EXTENDED */ +#if defined(MBEDTLS_ERROR_STRERROR_DUMMY) + "MBEDTLS_ERROR_STRERROR_DUMMY", +#endif /* MBEDTLS_ERROR_STRERROR_DUMMY */ +#if defined(MBEDTLS_GENPRIME) + "MBEDTLS_GENPRIME", +#endif /* MBEDTLS_GENPRIME */ +#if defined(MBEDTLS_FS_IO) + "MBEDTLS_FS_IO", +#endif /* MBEDTLS_FS_IO */ +#if defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) + "MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES", +#endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */ +#if defined(MBEDTLS_NO_PLATFORM_ENTROPY) + "MBEDTLS_NO_PLATFORM_ENTROPY", +#endif /* MBEDTLS_NO_PLATFORM_ENTROPY */ +#if defined(MBEDTLS_ENTROPY_FORCE_SHA256) + "MBEDTLS_ENTROPY_FORCE_SHA256", +#endif /* MBEDTLS_ENTROPY_FORCE_SHA256 */ +#if defined(MBEDTLS_ENTROPY_NV_SEED) + "MBEDTLS_ENTROPY_NV_SEED", +#endif /* MBEDTLS_ENTROPY_NV_SEED */ +#if defined(MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER) + "MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER", +#endif /* MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER */ +#if defined(MBEDTLS_MEMORY_DEBUG) + "MBEDTLS_MEMORY_DEBUG", +#endif /* MBEDTLS_MEMORY_DEBUG */ +#if defined(MBEDTLS_MEMORY_BACKTRACE) + "MBEDTLS_MEMORY_BACKTRACE", +#endif /* MBEDTLS_MEMORY_BACKTRACE */ +#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) + "MBEDTLS_PK_RSA_ALT_SUPPORT", +#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ +#if defined(MBEDTLS_PKCS1_V15) + "MBEDTLS_PKCS1_V15", +#endif /* MBEDTLS_PKCS1_V15 */ +#if defined(MBEDTLS_PKCS1_V21) + "MBEDTLS_PKCS1_V21", +#endif /* MBEDTLS_PKCS1_V21 */ +#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS) + "MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS", +#endif /* MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS */ +#if defined(MBEDTLS_PSA_CRYPTO_CLIENT) + "MBEDTLS_PSA_CRYPTO_CLIENT", +#endif /* MBEDTLS_PSA_CRYPTO_CLIENT */ +#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS) + "MBEDTLS_PSA_CRYPTO_DRIVERS", +#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS */ +#if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) + "MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG", +#endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ +#if defined(MBEDTLS_PSA_CRYPTO_SPM) + "MBEDTLS_PSA_CRYPTO_SPM", +#endif /* MBEDTLS_PSA_CRYPTO_SPM */ +#if defined(MBEDTLS_PSA_INJECT_ENTROPY) + "MBEDTLS_PSA_INJECT_ENTROPY", +#endif /* MBEDTLS_PSA_INJECT_ENTROPY */ +#if defined(MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS) + "MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS", +#endif /* MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS */ +#if defined(MBEDTLS_RSA_NO_CRT) + "MBEDTLS_RSA_NO_CRT", +#endif /* MBEDTLS_RSA_NO_CRT */ +#if defined(MBEDTLS_SELF_TEST) + "MBEDTLS_SELF_TEST", +#endif /* MBEDTLS_SELF_TEST */ +#if defined(MBEDTLS_SHA256_SMALLER) + "MBEDTLS_SHA256_SMALLER", +#endif /* MBEDTLS_SHA256_SMALLER */ +#if defined(MBEDTLS_SHA512_SMALLER) + "MBEDTLS_SHA512_SMALLER", +#endif /* MBEDTLS_SHA512_SMALLER */ +#if defined(MBEDTLS_SHA512_NO_SHA384) + "MBEDTLS_SHA512_NO_SHA384", +#endif /* MBEDTLS_SHA512_NO_SHA384 */ +#if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES) + "MBEDTLS_SSL_ALL_ALERT_MESSAGES", +#endif /* MBEDTLS_SSL_ALL_ALERT_MESSAGES */ +#if defined(MBEDTLS_SSL_RECORD_CHECKING) + "MBEDTLS_SSL_RECORD_CHECKING", +#endif /* MBEDTLS_SSL_RECORD_CHECKING */ +#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) + "MBEDTLS_SSL_DTLS_CONNECTION_ID", +#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ +#if defined(MBEDTLS_SSL_ASYNC_PRIVATE) + "MBEDTLS_SSL_ASYNC_PRIVATE", +#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ +#if defined(MBEDTLS_SSL_CLI_ALLOW_WEAK_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME) + "MBEDTLS_SSL_CLI_ALLOW_WEAK_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME", +#endif /* MBEDTLS_SSL_CLI_ALLOW_WEAK_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME */ +#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION) + "MBEDTLS_SSL_CONTEXT_SERIALIZATION", +#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */ +#if defined(MBEDTLS_SSL_DEBUG_ALL) + "MBEDTLS_SSL_DEBUG_ALL", +#endif /* MBEDTLS_SSL_DEBUG_ALL */ +#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) + "MBEDTLS_SSL_ENCRYPT_THEN_MAC", +#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ +#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) + "MBEDTLS_SSL_EXTENDED_MASTER_SECRET", +#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ +#if defined(MBEDTLS_SSL_FALLBACK_SCSV) + "MBEDTLS_SSL_FALLBACK_SCSV", +#endif /* MBEDTLS_SSL_FALLBACK_SCSV */ +#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) + "MBEDTLS_SSL_KEEP_PEER_CERTIFICATE", +#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ +#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) + "MBEDTLS_SSL_HW_RECORD_ACCEL", +#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ +#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) + "MBEDTLS_SSL_CBC_RECORD_SPLITTING", +#endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ +#if defined(MBEDTLS_SSL_RENEGOTIATION) + "MBEDTLS_SSL_RENEGOTIATION", +#endif /* MBEDTLS_SSL_RENEGOTIATION */ +#if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) + "MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO", +#endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */ +#if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE) + "MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE", +#endif /* MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE */ +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) + "MBEDTLS_SSL_MAX_FRAGMENT_LENGTH", +#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ +#if defined(MBEDTLS_SSL_PROTO_SSL3) + "MBEDTLS_SSL_PROTO_SSL3", +#endif /* MBEDTLS_SSL_PROTO_SSL3 */ +#if defined(MBEDTLS_SSL_PROTO_TLS1) + "MBEDTLS_SSL_PROTO_TLS1", +#endif /* MBEDTLS_SSL_PROTO_TLS1 */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_1) + "MBEDTLS_SSL_PROTO_TLS1_1", +#endif /* MBEDTLS_SSL_PROTO_TLS1_1 */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) + "MBEDTLS_SSL_PROTO_TLS1_2", +#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ +#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) + "MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL", +#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + "MBEDTLS_SSL_PROTO_DTLS", +#endif /* MBEDTLS_SSL_PROTO_DTLS */ +#if defined(MBEDTLS_SSL_ALPN) + "MBEDTLS_SSL_ALPN", +#endif /* MBEDTLS_SSL_ALPN */ +#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) + "MBEDTLS_SSL_DTLS_ANTI_REPLAY", +#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ +#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) + "MBEDTLS_SSL_DTLS_HELLO_VERIFY", +#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ +#if defined(MBEDTLS_SSL_DTLS_SRTP) + "MBEDTLS_SSL_DTLS_SRTP", +#endif /* MBEDTLS_SSL_DTLS_SRTP */ +#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) + "MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE", +#endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE */ +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) + "MBEDTLS_SSL_DTLS_BADMAC_LIMIT", +#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ +#if defined(MBEDTLS_SSL_SESSION_TICKETS) + "MBEDTLS_SSL_SESSION_TICKETS", +#endif /* MBEDTLS_SSL_SESSION_TICKETS */ +#if defined(MBEDTLS_SSL_EXPORT_KEYS) + "MBEDTLS_SSL_EXPORT_KEYS", +#endif /* MBEDTLS_SSL_EXPORT_KEYS */ +#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) + "MBEDTLS_SSL_SERVER_NAME_INDICATION", +#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) + "MBEDTLS_SSL_TRUNCATED_HMAC", +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ +#if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT) + "MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT", +#endif /* MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT */ +#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) + "MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH", +#endif /* MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH */ +#if defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE) + "MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE", +#endif /* MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE */ +#if defined(MBEDTLS_TEST_CONSTANT_FLOW_MEMSAN) + "MBEDTLS_TEST_CONSTANT_FLOW_MEMSAN", +#endif /* MBEDTLS_TEST_CONSTANT_FLOW_MEMSAN */ +#if defined(MBEDTLS_TEST_CONSTANT_FLOW_VALGRIND) + "MBEDTLS_TEST_CONSTANT_FLOW_VALGRIND", +#endif /* MBEDTLS_TEST_CONSTANT_FLOW_VALGRIND */ +#if defined(MBEDTLS_TEST_HOOKS) + "MBEDTLS_TEST_HOOKS", +#endif /* MBEDTLS_TEST_HOOKS */ +#if defined(MBEDTLS_THREADING_ALT) + "MBEDTLS_THREADING_ALT", +#endif /* MBEDTLS_THREADING_ALT */ +#if defined(MBEDTLS_THREADING_PTHREAD) + "MBEDTLS_THREADING_PTHREAD", +#endif /* MBEDTLS_THREADING_PTHREAD */ +#if defined(MBEDTLS_USE_PSA_CRYPTO) + "MBEDTLS_USE_PSA_CRYPTO", +#endif /* MBEDTLS_USE_PSA_CRYPTO */ +#if defined(MBEDTLS_PSA_CRYPTO_CONFIG) + "MBEDTLS_PSA_CRYPTO_CONFIG", +#endif /* MBEDTLS_PSA_CRYPTO_CONFIG */ +#if defined(MBEDTLS_VERSION_FEATURES) + "MBEDTLS_VERSION_FEATURES", +#endif /* MBEDTLS_VERSION_FEATURES */ +#if defined(MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3) + "MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3", +#endif /* MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 */ +#if defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION) + "MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION", +#endif /* MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION */ +#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) + "MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK", +#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ +#if defined(MBEDTLS_X509_CHECK_KEY_USAGE) + "MBEDTLS_X509_CHECK_KEY_USAGE", +#endif /* MBEDTLS_X509_CHECK_KEY_USAGE */ +#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) + "MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE", +#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */ +#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) + "MBEDTLS_X509_RSASSA_PSS_SUPPORT", +#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */ +#if defined(MBEDTLS_ZLIB_SUPPORT) + "MBEDTLS_ZLIB_SUPPORT", +#endif /* MBEDTLS_ZLIB_SUPPORT */ +#if defined(MBEDTLS_AESNI_C) + "MBEDTLS_AESNI_C", +#endif /* MBEDTLS_AESNI_C */ +#if defined(MBEDTLS_AES_C) + "MBEDTLS_AES_C", +#endif /* MBEDTLS_AES_C */ +#if defined(MBEDTLS_ARC4_C) + "MBEDTLS_ARC4_C", +#endif /* MBEDTLS_ARC4_C */ +#if defined(MBEDTLS_ASN1_PARSE_C) + "MBEDTLS_ASN1_PARSE_C", +#endif /* MBEDTLS_ASN1_PARSE_C */ +#if defined(MBEDTLS_ASN1_WRITE_C) + "MBEDTLS_ASN1_WRITE_C", +#endif /* MBEDTLS_ASN1_WRITE_C */ +#if defined(MBEDTLS_BASE64_C) + "MBEDTLS_BASE64_C", +#endif /* MBEDTLS_BASE64_C */ +#if defined(MBEDTLS_BIGNUM_C) + "MBEDTLS_BIGNUM_C", +#endif /* MBEDTLS_BIGNUM_C */ +#if defined(MBEDTLS_BLOWFISH_C) + "MBEDTLS_BLOWFISH_C", +#endif /* MBEDTLS_BLOWFISH_C */ +#if defined(MBEDTLS_CAMELLIA_C) + "MBEDTLS_CAMELLIA_C", +#endif /* MBEDTLS_CAMELLIA_C */ +#if defined(MBEDTLS_ARIA_C) + "MBEDTLS_ARIA_C", +#endif /* MBEDTLS_ARIA_C */ +#if defined(MBEDTLS_CCM_C) + "MBEDTLS_CCM_C", +#endif /* MBEDTLS_CCM_C */ +#if defined(MBEDTLS_CERTS_C) + "MBEDTLS_CERTS_C", +#endif /* MBEDTLS_CERTS_C */ +#if defined(MBEDTLS_CHACHA20_C) + "MBEDTLS_CHACHA20_C", +#endif /* MBEDTLS_CHACHA20_C */ +#if defined(MBEDTLS_CHACHAPOLY_C) + "MBEDTLS_CHACHAPOLY_C", +#endif /* MBEDTLS_CHACHAPOLY_C */ +#if defined(MBEDTLS_CIPHER_C) + "MBEDTLS_CIPHER_C", +#endif /* MBEDTLS_CIPHER_C */ +#if defined(MBEDTLS_CMAC_C) + "MBEDTLS_CMAC_C", +#endif /* MBEDTLS_CMAC_C */ +#if defined(MBEDTLS_CTR_DRBG_C) + "MBEDTLS_CTR_DRBG_C", +#endif /* MBEDTLS_CTR_DRBG_C */ +#if defined(MBEDTLS_DEBUG_C) + "MBEDTLS_DEBUG_C", +#endif /* MBEDTLS_DEBUG_C */ +#if defined(MBEDTLS_DES_C) + "MBEDTLS_DES_C", +#endif /* MBEDTLS_DES_C */ +#if defined(MBEDTLS_DHM_C) + "MBEDTLS_DHM_C", +#endif /* MBEDTLS_DHM_C */ +#if defined(MBEDTLS_ECDH_C) + "MBEDTLS_ECDH_C", +#endif /* MBEDTLS_ECDH_C */ +#if defined(MBEDTLS_ECDSA_C) + "MBEDTLS_ECDSA_C", +#endif /* MBEDTLS_ECDSA_C */ +#if defined(MBEDTLS_ECJPAKE_C) + "MBEDTLS_ECJPAKE_C", +#endif /* MBEDTLS_ECJPAKE_C */ +#if defined(MBEDTLS_ECP_C) + "MBEDTLS_ECP_C", +#endif /* MBEDTLS_ECP_C */ +#if defined(MBEDTLS_ENTROPY_C) + "MBEDTLS_ENTROPY_C", +#endif /* MBEDTLS_ENTROPY_C */ +#if defined(MBEDTLS_ERROR_C) + "MBEDTLS_ERROR_C", +#endif /* MBEDTLS_ERROR_C */ +#if defined(MBEDTLS_GCM_C) + "MBEDTLS_GCM_C", +#endif /* MBEDTLS_GCM_C */ +#if defined(MBEDTLS_HAVEGE_C) + "MBEDTLS_HAVEGE_C", +#endif /* MBEDTLS_HAVEGE_C */ +#if defined(MBEDTLS_HKDF_C) + "MBEDTLS_HKDF_C", +#endif /* MBEDTLS_HKDF_C */ +#if defined(MBEDTLS_HMAC_DRBG_C) + "MBEDTLS_HMAC_DRBG_C", +#endif /* MBEDTLS_HMAC_DRBG_C */ +#if defined(MBEDTLS_NIST_KW_C) + "MBEDTLS_NIST_KW_C", +#endif /* MBEDTLS_NIST_KW_C */ +#if defined(MBEDTLS_MD_C) + "MBEDTLS_MD_C", +#endif /* MBEDTLS_MD_C */ +#if defined(MBEDTLS_MD2_C) + "MBEDTLS_MD2_C", +#endif /* MBEDTLS_MD2_C */ +#if defined(MBEDTLS_MD4_C) + "MBEDTLS_MD4_C", +#endif /* MBEDTLS_MD4_C */ +#if defined(MBEDTLS_MD5_C) + "MBEDTLS_MD5_C", +#endif /* MBEDTLS_MD5_C */ +#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) + "MBEDTLS_MEMORY_BUFFER_ALLOC_C", +#endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */ +#if defined(MBEDTLS_NET_C) + "MBEDTLS_NET_C", +#endif /* MBEDTLS_NET_C */ +#if defined(MBEDTLS_OID_C) + "MBEDTLS_OID_C", +#endif /* MBEDTLS_OID_C */ +#if defined(MBEDTLS_PADLOCK_C) + "MBEDTLS_PADLOCK_C", +#endif /* MBEDTLS_PADLOCK_C */ +#if defined(MBEDTLS_PEM_PARSE_C) + "MBEDTLS_PEM_PARSE_C", +#endif /* MBEDTLS_PEM_PARSE_C */ +#if defined(MBEDTLS_PEM_WRITE_C) + "MBEDTLS_PEM_WRITE_C", +#endif /* MBEDTLS_PEM_WRITE_C */ +#if defined(MBEDTLS_PK_C) + "MBEDTLS_PK_C", +#endif /* MBEDTLS_PK_C */ +#if defined(MBEDTLS_PK_PARSE_C) + "MBEDTLS_PK_PARSE_C", +#endif /* MBEDTLS_PK_PARSE_C */ +#if defined(MBEDTLS_PK_WRITE_C) + "MBEDTLS_PK_WRITE_C", +#endif /* MBEDTLS_PK_WRITE_C */ +#if defined(MBEDTLS_PKCS5_C) + "MBEDTLS_PKCS5_C", +#endif /* MBEDTLS_PKCS5_C */ +#if defined(MBEDTLS_PKCS11_C) + "MBEDTLS_PKCS11_C", +#endif /* MBEDTLS_PKCS11_C */ +#if defined(MBEDTLS_PKCS12_C) + "MBEDTLS_PKCS12_C", +#endif /* MBEDTLS_PKCS12_C */ +#if defined(MBEDTLS_PLATFORM_C) + "MBEDTLS_PLATFORM_C", +#endif /* MBEDTLS_PLATFORM_C */ +#if defined(MBEDTLS_POLY1305_C) + "MBEDTLS_POLY1305_C", +#endif /* MBEDTLS_POLY1305_C */ +#if defined(MBEDTLS_PSA_CRYPTO_C) + "MBEDTLS_PSA_CRYPTO_C", +#endif /* MBEDTLS_PSA_CRYPTO_C */ +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) + "MBEDTLS_PSA_CRYPTO_SE_C", +#endif /* MBEDTLS_PSA_CRYPTO_SE_C */ +#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C) + "MBEDTLS_PSA_CRYPTO_STORAGE_C", +#endif /* MBEDTLS_PSA_CRYPTO_STORAGE_C */ +#if defined(MBEDTLS_PSA_ITS_FILE_C) + "MBEDTLS_PSA_ITS_FILE_C", +#endif /* MBEDTLS_PSA_ITS_FILE_C */ +#if defined(MBEDTLS_RIPEMD160_C) + "MBEDTLS_RIPEMD160_C", +#endif /* MBEDTLS_RIPEMD160_C */ +#if defined(MBEDTLS_RSA_C) + "MBEDTLS_RSA_C", +#endif /* MBEDTLS_RSA_C */ +#if defined(MBEDTLS_SHA1_C) + "MBEDTLS_SHA1_C", +#endif /* MBEDTLS_SHA1_C */ +#if defined(MBEDTLS_SHA256_C) + "MBEDTLS_SHA256_C", +#endif /* MBEDTLS_SHA256_C */ +#if defined(MBEDTLS_SHA512_C) + "MBEDTLS_SHA512_C", +#endif /* MBEDTLS_SHA512_C */ +#if defined(MBEDTLS_SSL_CACHE_C) + "MBEDTLS_SSL_CACHE_C", +#endif /* MBEDTLS_SSL_CACHE_C */ +#if defined(MBEDTLS_SSL_COOKIE_C) + "MBEDTLS_SSL_COOKIE_C", +#endif /* MBEDTLS_SSL_COOKIE_C */ +#if defined(MBEDTLS_SSL_TICKET_C) + "MBEDTLS_SSL_TICKET_C", +#endif /* MBEDTLS_SSL_TICKET_C */ +#if defined(MBEDTLS_SSL_CLI_C) + "MBEDTLS_SSL_CLI_C", +#endif /* MBEDTLS_SSL_CLI_C */ +#if defined(MBEDTLS_SSL_SRV_C) + "MBEDTLS_SSL_SRV_C", +#endif /* MBEDTLS_SSL_SRV_C */ +#if defined(MBEDTLS_SSL_TLS_C) + "MBEDTLS_SSL_TLS_C", +#endif /* MBEDTLS_SSL_TLS_C */ +#if defined(MBEDTLS_THREADING_C) + "MBEDTLS_THREADING_C", +#endif /* MBEDTLS_THREADING_C */ +#if defined(MBEDTLS_TIMING_C) + "MBEDTLS_TIMING_C", +#endif /* MBEDTLS_TIMING_C */ +#if defined(MBEDTLS_VERSION_C) + "MBEDTLS_VERSION_C", +#endif /* MBEDTLS_VERSION_C */ +#if defined(MBEDTLS_X509_USE_C) + "MBEDTLS_X509_USE_C", +#endif /* MBEDTLS_X509_USE_C */ +#if defined(MBEDTLS_X509_CRT_PARSE_C) + "MBEDTLS_X509_CRT_PARSE_C", +#endif /* MBEDTLS_X509_CRT_PARSE_C */ +#if defined(MBEDTLS_X509_CRL_PARSE_C) + "MBEDTLS_X509_CRL_PARSE_C", +#endif /* MBEDTLS_X509_CRL_PARSE_C */ +#if defined(MBEDTLS_X509_CSR_PARSE_C) + "MBEDTLS_X509_CSR_PARSE_C", +#endif /* MBEDTLS_X509_CSR_PARSE_C */ +#if defined(MBEDTLS_X509_CREATE_C) + "MBEDTLS_X509_CREATE_C", +#endif /* MBEDTLS_X509_CREATE_C */ +#if defined(MBEDTLS_X509_CRT_WRITE_C) + "MBEDTLS_X509_CRT_WRITE_C", +#endif /* MBEDTLS_X509_CRT_WRITE_C */ +#if defined(MBEDTLS_X509_CSR_WRITE_C) + "MBEDTLS_X509_CSR_WRITE_C", +#endif /* MBEDTLS_X509_CSR_WRITE_C */ +#if defined(MBEDTLS_XTEA_C) + "MBEDTLS_XTEA_C", +#endif /* MBEDTLS_XTEA_C */ +#endif /* MBEDTLS_VERSION_FEATURES */ + NULL +}; + +int mbedtls_version_check_feature(const char *feature) +{ + const char * const *idx = features; + + if (*idx == NULL) { + return -2; + } + + if (feature == NULL) { + return -1; + } + + while (*idx != NULL) { + if (!strcmp(*idx, feature)) { + return 0; + } + idx++; + } + return -1; +} + +#endif /* MBEDTLS_VERSION_C */ diff --git a/ext/opcua_client/mbedtls/library/x509.c b/ext/opcua_client/mbedtls/library/x509.c new file mode 100644 index 0000000..4233e53 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/x509.c @@ -0,0 +1,1140 @@ +/* + * X.509 common functions for parsing and verification + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The ITU-T X.509 standard defines a certificate format for PKI. + * + * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs) + * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs) + * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10) + * + * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf + * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf + */ + +#include "common.h" + +#if defined(MBEDTLS_X509_USE_C) + +#include "mbedtls/x509.h" +#include "mbedtls/asn1.h" +#include "mbedtls/error.h" +#include "mbedtls/oid.h" + +#include +#include + +#if defined(MBEDTLS_PEM_PARSE_C) +#include "mbedtls/pem.h" +#endif + +#include "mbedtls/platform.h" + +#if defined(MBEDTLS_HAVE_TIME) +#include "mbedtls/platform_time.h" +#endif +#if defined(MBEDTLS_HAVE_TIME_DATE) +#include "mbedtls/platform_util.h" +#include +#endif + +#define CHECK(code) \ + do { \ + if ((ret = (code)) != 0) { \ + return ret; \ + } \ + } while (0) + +#define CHECK_RANGE(min, max, val) \ + do { \ + if ((val) < (min) || (val) > (max)) { \ + return ret; \ + } \ + } while (0) + +/* + * CertificateSerialNumber ::= INTEGER + */ +int mbedtls_x509_get_serial(unsigned char **p, const unsigned char *end, + mbedtls_x509_buf *serial) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if ((end - *p) < 1) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_SERIAL, + MBEDTLS_ERR_ASN1_OUT_OF_DATA); + } + + if (**p != (MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_PRIMITIVE | 2) && + **p != MBEDTLS_ASN1_INTEGER) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_SERIAL, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG); + } + + serial->tag = *(*p)++; + + if ((ret = mbedtls_asn1_get_len(p, end, &serial->len)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_SERIAL, ret); + } + + serial->p = *p; + *p += serial->len; + + return 0; +} + +/* Get an algorithm identifier without parameters (eg for signatures) + * + * AlgorithmIdentifier ::= SEQUENCE { + * algorithm OBJECT IDENTIFIER, + * parameters ANY DEFINED BY algorithm OPTIONAL } + */ +int mbedtls_x509_get_alg_null(unsigned char **p, const unsigned char *end, + mbedtls_x509_buf *alg) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if ((ret = mbedtls_asn1_get_alg_null(p, end, alg)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, ret); + } + + return 0; +} + +/* + * Parse an algorithm identifier with (optional) parameters + */ +int mbedtls_x509_get_alg(unsigned char **p, const unsigned char *end, + mbedtls_x509_buf *alg, mbedtls_x509_buf *params) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if ((ret = mbedtls_asn1_get_alg(p, end, alg, params)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, ret); + } + + return 0; +} + +#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) +/* + * HashAlgorithm ::= AlgorithmIdentifier + * + * AlgorithmIdentifier ::= SEQUENCE { + * algorithm OBJECT IDENTIFIER, + * parameters ANY DEFINED BY algorithm OPTIONAL } + * + * For HashAlgorithm, parameters MUST be NULL or absent. + */ +static int x509_get_hash_alg(const mbedtls_x509_buf *alg, mbedtls_md_type_t *md_alg) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *p; + const unsigned char *end; + mbedtls_x509_buf md_oid; + size_t len; + + /* Make sure we got a SEQUENCE and setup bounds */ + if (alg->tag != (MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG); + } + + p = alg->p; + end = p + alg->len; + + if (p >= end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, + MBEDTLS_ERR_ASN1_OUT_OF_DATA); + } + + /* Parse md_oid */ + md_oid.tag = *p; + + if ((ret = mbedtls_asn1_get_tag(&p, end, &md_oid.len, MBEDTLS_ASN1_OID)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, ret); + } + + md_oid.p = p; + p += md_oid.len; + + /* Get md_alg from md_oid */ + if ((ret = mbedtls_oid_get_md_alg(&md_oid, md_alg)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, ret); + } + + /* Make sure params is absent of NULL */ + if (p == end) { + return 0; + } + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_NULL)) != 0 || len != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, ret); + } + + if (p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +/* + * RSASSA-PSS-params ::= SEQUENCE { + * hashAlgorithm [0] HashAlgorithm DEFAULT sha1Identifier, + * maskGenAlgorithm [1] MaskGenAlgorithm DEFAULT mgf1SHA1Identifier, + * saltLength [2] INTEGER DEFAULT 20, + * trailerField [3] INTEGER DEFAULT 1 } + * -- Note that the tags in this Sequence are explicit. + * + * RFC 4055 (which defines use of RSASSA-PSS in PKIX) states that the value + * of trailerField MUST be 1, and PKCS#1 v2.2 doesn't even define any other + * option. Enforce this at parsing time. + */ +int mbedtls_x509_get_rsassa_pss_params(const mbedtls_x509_buf *params, + mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md, + int *salt_len) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char *p; + const unsigned char *end, *end2; + size_t len; + mbedtls_x509_buf alg_id, alg_params; + + /* First set everything to defaults */ + *md_alg = MBEDTLS_MD_SHA1; + *mgf_md = MBEDTLS_MD_SHA1; + *salt_len = 20; + + /* Make sure params is a SEQUENCE and setup bounds */ + if (params->tag != (MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG); + } + + p = (unsigned char *) params->p; + end = p + params->len; + + if (p == end) { + return 0; + } + + /* + * HashAlgorithm + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | + 0)) == 0) { + end2 = p + len; + + /* HashAlgorithm ::= AlgorithmIdentifier (without parameters) */ + if ((ret = mbedtls_x509_get_alg_null(&p, end2, &alg_id)) != 0) { + return ret; + } + + if ((ret = mbedtls_oid_get_md_alg(&alg_id, md_alg)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, ret); + } + + if (p != end2) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + } else if (ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, ret); + } + + if (p == end) { + return 0; + } + + /* + * MaskGenAlgorithm + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | + 1)) == 0) { + end2 = p + len; + + /* MaskGenAlgorithm ::= AlgorithmIdentifier (params = HashAlgorithm) */ + if ((ret = mbedtls_x509_get_alg(&p, end2, &alg_id, &alg_params)) != 0) { + return ret; + } + + /* Only MFG1 is recognised for now */ + if (MBEDTLS_OID_CMP(MBEDTLS_OID_MGF1, &alg_id) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE, + MBEDTLS_ERR_OID_NOT_FOUND); + } + + /* Parse HashAlgorithm */ + if ((ret = x509_get_hash_alg(&alg_params, mgf_md)) != 0) { + return ret; + } + + if (p != end2) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + } else if (ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, ret); + } + + if (p == end) { + return 0; + } + + /* + * salt_len + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | + 2)) == 0) { + end2 = p + len; + + if ((ret = mbedtls_asn1_get_int(&p, end2, salt_len)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, ret); + } + + if (p != end2) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + } else if (ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, ret); + } + + if (p == end) { + return 0; + } + + /* + * trailer_field (if present, must be 1) + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | + 3)) == 0) { + int trailer_field; + + end2 = p + len; + + if ((ret = mbedtls_asn1_get_int(&p, end2, &trailer_field)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, ret); + } + + if (p != end2) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + if (trailer_field != 1) { + return MBEDTLS_ERR_X509_INVALID_ALG; + } + } else if (ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, ret); + } + + if (p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_ALG, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} +#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */ + +/* + * AttributeTypeAndValue ::= SEQUENCE { + * type AttributeType, + * value AttributeValue } + * + * AttributeType ::= OBJECT IDENTIFIER + * + * AttributeValue ::= ANY DEFINED BY AttributeType + */ +static int x509_get_attr_type_value(unsigned char **p, + const unsigned char *end, + mbedtls_x509_name *cur) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + mbedtls_x509_buf *oid; + mbedtls_x509_buf *val; + + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_NAME, ret); + } + + end = *p + len; + + if ((end - *p) < 1) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_NAME, + MBEDTLS_ERR_ASN1_OUT_OF_DATA); + } + + oid = &cur->oid; + oid->tag = **p; + + if ((ret = mbedtls_asn1_get_tag(p, end, &oid->len, MBEDTLS_ASN1_OID)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_NAME, ret); + } + + oid->p = *p; + *p += oid->len; + + if ((end - *p) < 1) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_NAME, + MBEDTLS_ERR_ASN1_OUT_OF_DATA); + } + + if (**p != MBEDTLS_ASN1_BMP_STRING && **p != MBEDTLS_ASN1_UTF8_STRING && + **p != MBEDTLS_ASN1_T61_STRING && **p != MBEDTLS_ASN1_PRINTABLE_STRING && + **p != MBEDTLS_ASN1_IA5_STRING && **p != MBEDTLS_ASN1_UNIVERSAL_STRING && + **p != MBEDTLS_ASN1_BIT_STRING) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_NAME, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG); + } + + val = &cur->val; + val->tag = *(*p)++; + + if ((ret = mbedtls_asn1_get_len(p, end, &val->len)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_NAME, ret); + } + + val->p = *p; + *p += val->len; + + if (*p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_NAME, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + cur->next = NULL; + + return 0; +} + +/* + * Name ::= CHOICE { -- only one possibility for now -- + * rdnSequence RDNSequence } + * + * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName + * + * RelativeDistinguishedName ::= + * SET OF AttributeTypeAndValue + * + * AttributeTypeAndValue ::= SEQUENCE { + * type AttributeType, + * value AttributeValue } + * + * AttributeType ::= OBJECT IDENTIFIER + * + * AttributeValue ::= ANY DEFINED BY AttributeType + * + * The data structure is optimized for the common case where each RDN has only + * one element, which is represented as a list of AttributeTypeAndValue. + * For the general case we still use a flat list, but we mark elements of the + * same set so that they are "merged" together in the functions that consume + * this list, eg mbedtls_x509_dn_gets(). + * + * On success, this function may allocate a linked list starting at cur->next + * that must later be free'd by the caller using mbedtls_free(). In error + * cases, this function frees all allocated memory internally and the caller + * has no freeing responsibilities. + */ +int mbedtls_x509_get_name(unsigned char **p, const unsigned char *end, + mbedtls_x509_name *cur) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t set_len; + const unsigned char *end_set; + mbedtls_x509_name *head = cur; + mbedtls_x509_name *prev, *allocated; + + /* don't use recursion, we'd risk stack overflow if not optimized */ + while (1) { + /* + * parse SET + */ + if ((ret = mbedtls_asn1_get_tag(p, end, &set_len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET)) != 0) { + ret = MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_NAME, ret); + goto error; + } + + end_set = *p + set_len; + + while (1) { + if ((ret = x509_get_attr_type_value(p, end_set, cur)) != 0) { + goto error; + } + + if (*p == end_set) { + break; + } + + /* Mark this item as being no the only one in a set */ + cur->next_merged = 1; + + cur->next = mbedtls_calloc(1, sizeof(mbedtls_x509_name)); + + if (cur->next == NULL) { + ret = MBEDTLS_ERR_X509_ALLOC_FAILED; + goto error; + } + + cur = cur->next; + } + + /* + * continue until end of SEQUENCE is reached + */ + if (*p == end) { + return 0; + } + + cur->next = mbedtls_calloc(1, sizeof(mbedtls_x509_name)); + + if (cur->next == NULL) { + ret = MBEDTLS_ERR_X509_ALLOC_FAILED; + goto error; + } + + cur = cur->next; + } + +error: + /* Skip the first element as we did not allocate it */ + allocated = head->next; + + while (allocated != NULL) { + prev = allocated; + allocated = allocated->next; + + mbedtls_platform_zeroize(prev, sizeof(*prev)); + mbedtls_free(prev); + } + + mbedtls_platform_zeroize(head, sizeof(*head)); + + return ret; +} + +static int x509_parse_int(unsigned char **p, size_t n, int *res) +{ + *res = 0; + + for (; n > 0; --n) { + if ((**p < '0') || (**p > '9')) { + return MBEDTLS_ERR_X509_INVALID_DATE; + } + + *res *= 10; + *res += (*(*p)++ - '0'); + } + + return 0; +} + +static int x509_date_is_valid(const mbedtls_x509_time *t) +{ + int ret = MBEDTLS_ERR_X509_INVALID_DATE; + int month_len; + + CHECK_RANGE(0, 9999, t->year); + CHECK_RANGE(0, 23, t->hour); + CHECK_RANGE(0, 59, t->min); + CHECK_RANGE(0, 59, t->sec); + + switch (t->mon) { + case 1: case 3: case 5: case 7: case 8: case 10: case 12: + month_len = 31; + break; + case 4: case 6: case 9: case 11: + month_len = 30; + break; + case 2: + if ((!(t->year % 4) && t->year % 100) || + !(t->year % 400)) { + month_len = 29; + } else { + month_len = 28; + } + break; + default: + return ret; + } + CHECK_RANGE(1, month_len, t->day); + + return 0; +} + +/* + * Parse an ASN1_UTC_TIME (yearlen=2) or ASN1_GENERALIZED_TIME (yearlen=4) + * field. + */ +static int x509_parse_time(unsigned char **p, size_t len, size_t yearlen, + mbedtls_x509_time *tm) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + /* + * Minimum length is 10 or 12 depending on yearlen + */ + if (len < yearlen + 8) { + return MBEDTLS_ERR_X509_INVALID_DATE; + } + len -= yearlen + 8; + + /* + * Parse year, month, day, hour, minute + */ + CHECK(x509_parse_int(p, yearlen, &tm->year)); + if (2 == yearlen) { + if (tm->year < 50) { + tm->year += 100; + } + + tm->year += 1900; + } + + CHECK(x509_parse_int(p, 2, &tm->mon)); + CHECK(x509_parse_int(p, 2, &tm->day)); + CHECK(x509_parse_int(p, 2, &tm->hour)); + CHECK(x509_parse_int(p, 2, &tm->min)); + + /* + * Parse seconds if present + */ + if (len >= 2) { + CHECK(x509_parse_int(p, 2, &tm->sec)); + len -= 2; + } else { + return MBEDTLS_ERR_X509_INVALID_DATE; + } + + /* + * Parse trailing 'Z' if present + */ + if (1 == len && 'Z' == **p) { + (*p)++; + len--; + } + + /* + * We should have parsed all characters at this point + */ + if (0 != len) { + return MBEDTLS_ERR_X509_INVALID_DATE; + } + + CHECK(x509_date_is_valid(tm)); + + return 0; +} + +/* + * Time ::= CHOICE { + * utcTime UTCTime, + * generalTime GeneralizedTime } + */ +int mbedtls_x509_get_time(unsigned char **p, const unsigned char *end, + mbedtls_x509_time *tm) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len, year_len; + unsigned char tag; + + if ((end - *p) < 1) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_DATE, + MBEDTLS_ERR_ASN1_OUT_OF_DATA); + } + + tag = **p; + + if (tag == MBEDTLS_ASN1_UTC_TIME) { + year_len = 2; + } else if (tag == MBEDTLS_ASN1_GENERALIZED_TIME) { + year_len = 4; + } else { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_DATE, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG); + } + + (*p)++; + ret = mbedtls_asn1_get_len(p, end, &len); + + if (ret != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_DATE, ret); + } + + return x509_parse_time(p, len, year_len, tm); +} + +int mbedtls_x509_get_sig(unsigned char **p, const unsigned char *end, mbedtls_x509_buf *sig) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + int tag_type; + + if ((end - *p) < 1) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_SIGNATURE, + MBEDTLS_ERR_ASN1_OUT_OF_DATA); + } + + tag_type = **p; + + if ((ret = mbedtls_asn1_get_bitstring_null(p, end, &len)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_SIGNATURE, ret); + } + + sig->tag = tag_type; + sig->len = len; + sig->p = *p; + + *p += len; + + return 0; +} + +/* + * Get signature algorithm from alg OID and optional parameters + */ +int mbedtls_x509_get_sig_alg(const mbedtls_x509_buf *sig_oid, const mbedtls_x509_buf *sig_params, + mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg, + void **sig_opts) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (*sig_opts != NULL) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + if ((ret = mbedtls_oid_get_sig_alg(sig_oid, md_alg, pk_alg)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG, ret); + } + +#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) + if (*pk_alg == MBEDTLS_PK_RSASSA_PSS) { + mbedtls_pk_rsassa_pss_options *pss_opts; + + pss_opts = mbedtls_calloc(1, sizeof(mbedtls_pk_rsassa_pss_options)); + if (pss_opts == NULL) { + return MBEDTLS_ERR_X509_ALLOC_FAILED; + } + + ret = mbedtls_x509_get_rsassa_pss_params(sig_params, + md_alg, + &pss_opts->mgf1_hash_id, + &pss_opts->expected_salt_len); + if (ret != 0) { + mbedtls_free(pss_opts); + return ret; + } + + *sig_opts = (void *) pss_opts; + } else +#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */ + { + /* Make sure parameters are absent or NULL */ + if ((sig_params->tag != MBEDTLS_ASN1_NULL && sig_params->tag != 0) || + sig_params->len != 0) { + return MBEDTLS_ERR_X509_INVALID_ALG; + } + } + + return 0; +} + +/* + * X.509 Extensions (No parsing of extensions, pointer should + * be either manually updated or extensions should be parsed!) + */ +int mbedtls_x509_get_ext(unsigned char **p, const unsigned char *end, + mbedtls_x509_buf *ext, int tag) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + + /* Extension structure use EXPLICIT tagging. That is, the actual + * `Extensions` structure is wrapped by a tag-length pair using + * the respective context-specific tag. */ + ret = mbedtls_asn1_get_tag(p, end, &ext->len, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | tag); + if (ret != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + ext->tag = MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | tag; + ext->p = *p; + end = *p + ext->len; + + /* + * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension + */ + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + if (end != *p + len) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +/* + * Store the name in printable form into buf; no more + * than size characters will be written + */ +int mbedtls_x509_dn_gets(char *buf, size_t size, const mbedtls_x509_name *dn) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i, j, n; + unsigned char c, merge = 0; + const mbedtls_x509_name *name; + const char *short_name = NULL; + char s[MBEDTLS_X509_MAX_DN_NAME_SIZE], *p; + + memset(s, 0, sizeof(s)); + + name = dn; + p = buf; + n = size; + + while (name != NULL) { + if (!name->oid.p) { + name = name->next; + continue; + } + + if (name != dn) { + ret = mbedtls_snprintf(p, n, merge ? " + " : ", "); + MBEDTLS_X509_SAFE_SNPRINTF; + } + + ret = mbedtls_oid_get_attr_short_name(&name->oid, &short_name); + + if (ret == 0) { + ret = mbedtls_snprintf(p, n, "%s=", short_name); + } else { + ret = mbedtls_snprintf(p, n, "\?\?="); + } + MBEDTLS_X509_SAFE_SNPRINTF; + + for (i = 0, j = 0; i < name->val.len; i++, j++) { + if (j >= sizeof(s) - 1) { + return MBEDTLS_ERR_X509_BUFFER_TOO_SMALL; + } + + c = name->val.p[i]; + // Special characters requiring escaping, RFC 1779 + if (c && strchr(",=+<>#;\"\\", c)) { + if (j + 1 >= sizeof(s) - 1) { + return MBEDTLS_ERR_X509_BUFFER_TOO_SMALL; + } + s[j++] = '\\'; + } + if (c < 32 || c >= 127) { + s[j] = '?'; + } else { + s[j] = c; + } + } + s[j] = '\0'; + ret = mbedtls_snprintf(p, n, "%s", s); + MBEDTLS_X509_SAFE_SNPRINTF; + + merge = name->next_merged; + name = name->next; + } + + return (int) (size - n); +} + +/* + * Store the serial in printable form into buf; no more + * than size characters will be written + */ +int mbedtls_x509_serial_gets(char *buf, size_t size, const mbedtls_x509_buf *serial) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i, n, nr; + char *p; + + p = buf; + n = size; + + nr = (serial->len <= 32) + ? serial->len : 28; + + for (i = 0; i < nr; i++) { + if (i == 0 && nr > 1 && serial->p[i] == 0x0) { + continue; + } + + ret = mbedtls_snprintf(p, n, "%02X%s", + serial->p[i], (i < nr - 1) ? ":" : ""); + MBEDTLS_X509_SAFE_SNPRINTF; + } + + if (nr != serial->len) { + ret = mbedtls_snprintf(p, n, "...."); + MBEDTLS_X509_SAFE_SNPRINTF; + } + + return (int) (size - n); +} + +/* + * Helper for writing signature algorithms + */ +int mbedtls_x509_sig_alg_gets(char *buf, size_t size, const mbedtls_x509_buf *sig_oid, + mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, + const void *sig_opts) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + char *p = buf; + size_t n = size; + const char *desc = NULL; + + ret = mbedtls_oid_get_sig_alg_desc(sig_oid, &desc); + if (ret != 0) { + ret = mbedtls_snprintf(p, n, "???"); + } else { + ret = mbedtls_snprintf(p, n, "%s", desc); + } + MBEDTLS_X509_SAFE_SNPRINTF; + +#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) + if (pk_alg == MBEDTLS_PK_RSASSA_PSS) { + const mbedtls_pk_rsassa_pss_options *pss_opts; + const mbedtls_md_info_t *md_info, *mgf_md_info; + + pss_opts = (const mbedtls_pk_rsassa_pss_options *) sig_opts; + + md_info = mbedtls_md_info_from_type(md_alg); + mgf_md_info = mbedtls_md_info_from_type(pss_opts->mgf1_hash_id); + + ret = mbedtls_snprintf(p, n, " (%s, MGF1-%s, 0x%02X)", + md_info ? mbedtls_md_get_name(md_info) : "???", + mgf_md_info ? mbedtls_md_get_name(mgf_md_info) : "???", + (unsigned int) pss_opts->expected_salt_len); + MBEDTLS_X509_SAFE_SNPRINTF; + } +#else + ((void) pk_alg); + ((void) md_alg); + ((void) sig_opts); +#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */ + + return (int) (size - n); +} + +/* + * Helper for writing "RSA key size", "EC key size", etc + */ +int mbedtls_x509_key_size_helper(char *buf, size_t buf_size, const char *name) +{ + char *p = buf; + size_t n = buf_size; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + ret = mbedtls_snprintf(p, n, "%s key size", name); + MBEDTLS_X509_SAFE_SNPRINTF; + + return 0; +} + +#if defined(MBEDTLS_HAVE_TIME_DATE) +/* + * Set the time structure to the current time. + * Return 0 on success, non-zero on failure. + */ +static int x509_get_current_time(mbedtls_x509_time *now) +{ + struct tm *lt, tm_buf; + mbedtls_time_t tt; + int ret = 0; + + tt = mbedtls_time(NULL); + lt = mbedtls_platform_gmtime_r(&tt, &tm_buf); + + if (lt == NULL) { + ret = -1; + } else { + now->year = lt->tm_year + 1900; + now->mon = lt->tm_mon + 1; + now->day = lt->tm_mday; + now->hour = lt->tm_hour; + now->min = lt->tm_min; + now->sec = lt->tm_sec; + } + + return ret; +} + +/* + * Return 0 if before <= after, 1 otherwise + */ +static int x509_check_time(const mbedtls_x509_time *before, const mbedtls_x509_time *after) +{ + if (before->year > after->year) { + return 1; + } + + if (before->year == after->year && + before->mon > after->mon) { + return 1; + } + + if (before->year == after->year && + before->mon == after->mon && + before->day > after->day) { + return 1; + } + + if (before->year == after->year && + before->mon == after->mon && + before->day == after->day && + before->hour > after->hour) { + return 1; + } + + if (before->year == after->year && + before->mon == after->mon && + before->day == after->day && + before->hour == after->hour && + before->min > after->min) { + return 1; + } + + if (before->year == after->year && + before->mon == after->mon && + before->day == after->day && + before->hour == after->hour && + before->min == after->min && + before->sec > after->sec) { + return 1; + } + + return 0; +} + +int mbedtls_x509_time_is_past(const mbedtls_x509_time *to) +{ + mbedtls_x509_time now; + + if (x509_get_current_time(&now) != 0) { + return 1; + } + + return x509_check_time(&now, to); +} + +int mbedtls_x509_time_is_future(const mbedtls_x509_time *from) +{ + mbedtls_x509_time now; + + if (x509_get_current_time(&now) != 0) { + return 1; + } + + return x509_check_time(from, &now); +} + +#else /* MBEDTLS_HAVE_TIME_DATE */ + +int mbedtls_x509_time_is_past(const mbedtls_x509_time *to) +{ + ((void) to); + return 0; +} + +int mbedtls_x509_time_is_future(const mbedtls_x509_time *from) +{ + ((void) from); + return 0; +} +#endif /* MBEDTLS_HAVE_TIME_DATE */ + +#if defined(MBEDTLS_SELF_TEST) + +#include "mbedtls/x509_crt.h" +#include "mbedtls/certs.h" + +/* + * Checkup routine + */ +int mbedtls_x509_self_test(int verbose) +{ + int ret = 0; +#if defined(MBEDTLS_CERTS_C) && defined(MBEDTLS_SHA256_C) + uint32_t flags; + mbedtls_x509_crt cacert; + mbedtls_x509_crt clicert; + + if (verbose != 0) { + mbedtls_printf(" X.509 certificate load: "); + } + + mbedtls_x509_crt_init(&cacert); + mbedtls_x509_crt_init(&clicert); + + ret = mbedtls_x509_crt_parse(&clicert, (const unsigned char *) mbedtls_test_cli_crt, + mbedtls_test_cli_crt_len); + if (ret != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + goto cleanup; + } + + ret = mbedtls_x509_crt_parse(&cacert, (const unsigned char *) mbedtls_test_ca_crt, + mbedtls_test_ca_crt_len); + if (ret != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + goto cleanup; + } + + if (verbose != 0) { + mbedtls_printf("passed\n X.509 signature verify: "); + } + + ret = mbedtls_x509_crt_verify(&clicert, &cacert, NULL, NULL, &flags, NULL, NULL); + if (ret != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + goto cleanup; + } + + if (verbose != 0) { + mbedtls_printf("passed\n\n"); + } + +cleanup: + mbedtls_x509_crt_free(&cacert); + mbedtls_x509_crt_free(&clicert); +#else + ((void) verbose); +#endif /* MBEDTLS_CERTS_C && MBEDTLS_SHA256_C */ + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_X509_USE_C */ diff --git a/ext/opcua_client/mbedtls/library/x509_create.c b/ext/opcua_client/mbedtls/library/x509_create.c new file mode 100644 index 0000000..4ffd3b6 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/x509_create.c @@ -0,0 +1,376 @@ +/* + * X.509 base functions for creating certificates / CSRs + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_X509_CREATE_C) + +#include "mbedtls/x509.h" +#include "mbedtls/asn1write.h" +#include "mbedtls/error.h" +#include "mbedtls/oid.h" + +#include + +/* Structure linking OIDs for X.509 DN AttributeTypes to their + * string representations and default string encodings used by Mbed TLS. */ +typedef struct { + const char *name; /* String representation of AttributeType, e.g. + * "CN" or "emailAddress". */ + size_t name_len; /* Length of 'name', without trailing 0 byte. */ + const char *oid; /* String representation of OID of AttributeType, + * as per RFC 5280, Appendix A.1. */ + int default_tag; /* The default character encoding used for the + * given attribute type, e.g. + * MBEDTLS_ASN1_UTF8_STRING for UTF-8. */ +} x509_attr_descriptor_t; + +#define ADD_STRLEN(s) s, sizeof(s) - 1 + +/* X.509 DN attributes from RFC 5280, Appendix A.1. */ +static const x509_attr_descriptor_t x509_attrs[] = +{ + { ADD_STRLEN("CN"), + MBEDTLS_OID_AT_CN, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("commonName"), + MBEDTLS_OID_AT_CN, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("C"), + MBEDTLS_OID_AT_COUNTRY, MBEDTLS_ASN1_PRINTABLE_STRING }, + { ADD_STRLEN("countryName"), + MBEDTLS_OID_AT_COUNTRY, MBEDTLS_ASN1_PRINTABLE_STRING }, + { ADD_STRLEN("O"), + MBEDTLS_OID_AT_ORGANIZATION, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("organizationName"), + MBEDTLS_OID_AT_ORGANIZATION, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("L"), + MBEDTLS_OID_AT_LOCALITY, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("locality"), + MBEDTLS_OID_AT_LOCALITY, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("R"), + MBEDTLS_OID_PKCS9_EMAIL, MBEDTLS_ASN1_IA5_STRING }, + { ADD_STRLEN("OU"), + MBEDTLS_OID_AT_ORG_UNIT, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("organizationalUnitName"), + MBEDTLS_OID_AT_ORG_UNIT, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("ST"), + MBEDTLS_OID_AT_STATE, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("stateOrProvinceName"), + MBEDTLS_OID_AT_STATE, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("emailAddress"), + MBEDTLS_OID_PKCS9_EMAIL, MBEDTLS_ASN1_IA5_STRING }, + { ADD_STRLEN("serialNumber"), + MBEDTLS_OID_AT_SERIAL_NUMBER, MBEDTLS_ASN1_PRINTABLE_STRING }, + { ADD_STRLEN("postalAddress"), + MBEDTLS_OID_AT_POSTAL_ADDRESS, MBEDTLS_ASN1_PRINTABLE_STRING }, + { ADD_STRLEN("postalCode"), + MBEDTLS_OID_AT_POSTAL_CODE, MBEDTLS_ASN1_PRINTABLE_STRING }, + { ADD_STRLEN("dnQualifier"), + MBEDTLS_OID_AT_DN_QUALIFIER, MBEDTLS_ASN1_PRINTABLE_STRING }, + { ADD_STRLEN("title"), + MBEDTLS_OID_AT_TITLE, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("surName"), + MBEDTLS_OID_AT_SUR_NAME, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("SN"), + MBEDTLS_OID_AT_SUR_NAME, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("givenName"), + MBEDTLS_OID_AT_GIVEN_NAME, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("GN"), + MBEDTLS_OID_AT_GIVEN_NAME, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("initials"), + MBEDTLS_OID_AT_INITIALS, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("pseudonym"), + MBEDTLS_OID_AT_PSEUDONYM, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("generationQualifier"), + MBEDTLS_OID_AT_GENERATION_QUALIFIER, MBEDTLS_ASN1_UTF8_STRING }, + { ADD_STRLEN("domainComponent"), + MBEDTLS_OID_DOMAIN_COMPONENT, MBEDTLS_ASN1_IA5_STRING }, + { ADD_STRLEN("DC"), + MBEDTLS_OID_DOMAIN_COMPONENT, MBEDTLS_ASN1_IA5_STRING }, + { NULL, 0, NULL, MBEDTLS_ASN1_NULL } +}; + +static const x509_attr_descriptor_t *x509_attr_descr_from_name(const char *name, size_t name_len) +{ + const x509_attr_descriptor_t *cur; + + for (cur = x509_attrs; cur->name != NULL; cur++) { + if (cur->name_len == name_len && + strncmp(cur->name, name, name_len) == 0) { + break; + } + } + + if (cur->name == NULL) { + return NULL; + } + + return cur; +} + +int mbedtls_x509_string_to_names(mbedtls_asn1_named_data **head, const char *name) +{ + int ret = MBEDTLS_ERR_X509_INVALID_NAME; + const char *s = name, *c = s; + const char *end = s + strlen(s); + const char *oid = NULL; + const x509_attr_descriptor_t *attr_descr = NULL; + int in_tag = 1; + char data[MBEDTLS_X509_MAX_DN_NAME_SIZE]; + char *d = data; + + /* Clear existing chain if present */ + mbedtls_asn1_free_named_data_list(head); + + while (c <= end) { + if (in_tag && *c == '=') { + if ((attr_descr = x509_attr_descr_from_name(s, c - s)) == NULL) { + ret = MBEDTLS_ERR_X509_UNKNOWN_OID; + goto exit; + } + + oid = attr_descr->oid; + s = c + 1; + in_tag = 0; + d = data; + } + + if (!in_tag && *c == '\\' && c != end) { + c++; + + /* Check for valid escaped characters */ + if (c == end || *c != ',') { + ret = MBEDTLS_ERR_X509_INVALID_NAME; + goto exit; + } + } else if (!in_tag && (*c == ',' || c == end)) { + mbedtls_asn1_named_data *cur = + mbedtls_asn1_store_named_data(head, oid, strlen(oid), + (unsigned char *) data, + d - data); + + if (cur == NULL) { + return MBEDTLS_ERR_X509_ALLOC_FAILED; + } + + // set tagType + cur->val.tag = attr_descr->default_tag; + + while (c < end && *(c + 1) == ' ') { + c++; + } + + s = c + 1; + in_tag = 1; + + /* Successfully parsed one name, update ret to success */ + ret = 0; + } + + if (!in_tag && s != c + 1) { + *(d++) = *c; + + if (d - data == MBEDTLS_X509_MAX_DN_NAME_SIZE) { + ret = MBEDTLS_ERR_X509_INVALID_NAME; + goto exit; + } + } + + c++; + } + +exit: + + return ret; +} + +/* The first byte of the value in the mbedtls_asn1_named_data structure is reserved + * to store the critical boolean for us + */ +int mbedtls_x509_set_extension(mbedtls_asn1_named_data **head, const char *oid, size_t oid_len, + int critical, const unsigned char *val, size_t val_len) +{ + mbedtls_asn1_named_data *cur; + + if (val_len > (SIZE_MAX - 1)) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + if ((cur = mbedtls_asn1_store_named_data(head, oid, oid_len, + NULL, val_len + 1)) == NULL) { + return MBEDTLS_ERR_X509_ALLOC_FAILED; + } + + cur->val.p[0] = critical; + memcpy(cur->val.p + 1, val, val_len); + + return 0; +} + +/* + * RelativeDistinguishedName ::= + * SET OF AttributeTypeAndValue + * + * AttributeTypeAndValue ::= SEQUENCE { + * type AttributeType, + * value AttributeValue } + * + * AttributeType ::= OBJECT IDENTIFIER + * + * AttributeValue ::= ANY DEFINED BY AttributeType + */ +static int x509_write_name(unsigned char **p, + unsigned char *start, + mbedtls_asn1_named_data *cur_name) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + const char *oid = (const char *) cur_name->oid.p; + size_t oid_len = cur_name->oid.len; + const unsigned char *name = cur_name->val.p; + size_t name_len = cur_name->val.len; + + // Write correct string tag and value + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tagged_string(p, start, + cur_name->val.tag, + (const char *) name, + name_len)); + // Write OID + // + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_oid(p, start, oid, + oid_len)); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, + MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, + MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SET)); + + return (int) len; +} + +int mbedtls_x509_write_names(unsigned char **p, unsigned char *start, + mbedtls_asn1_named_data *first) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + mbedtls_asn1_named_data *cur = first; + + while (cur != NULL) { + MBEDTLS_ASN1_CHK_ADD(len, x509_write_name(p, start, cur)); + cur = cur->next; + } + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + + return (int) len; +} + +int mbedtls_x509_write_sig(unsigned char **p, unsigned char *start, + const char *oid, size_t oid_len, + unsigned char *sig, size_t size, + mbedtls_pk_type_t pk_alg) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + int write_null_par; + size_t len = 0; + + if (*p < start || (size_t) (*p - start) < size) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + len = size; + (*p) -= len; + memcpy(*p, sig, len); + + if (*p - start < 1) { + return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; + } + + *--(*p) = 0; + len += 1; + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, MBEDTLS_ASN1_BIT_STRING)); + + // Write OID + // + if (pk_alg == MBEDTLS_PK_ECDSA) { + /* + * The AlgorithmIdentifier's parameters field must be absent for DSA/ECDSA signature + * algorithms, see https://www.rfc-editor.org/rfc/rfc5480#page-17 and + * https://www.rfc-editor.org/rfc/rfc5758#section-3. + */ + write_null_par = 0; + } else { + write_null_par = 1; + } + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_algorithm_identifier_ext(p, start, oid, oid_len, + 0, write_null_par)); + + return (int) len; +} + +static int x509_write_extension(unsigned char **p, unsigned char *start, + mbedtls_asn1_named_data *ext) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_raw_buffer(p, start, ext->val.p + 1, + ext->val.len - 1)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, ext->val.len - 1)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, MBEDTLS_ASN1_OCTET_STRING)); + + if (ext->val.p[0] != 0) { + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_bool(p, start, 1)); + } + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_raw_buffer(p, start, ext->oid.p, + ext->oid.len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, ext->oid.len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, MBEDTLS_ASN1_OID)); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + + return (int) len; +} + +/* + * Extension ::= SEQUENCE { + * extnID OBJECT IDENTIFIER, + * critical BOOLEAN DEFAULT FALSE, + * extnValue OCTET STRING + * -- contains the DER encoding of an ASN.1 value + * -- corresponding to the extension type identified + * -- by extnID + * } + */ +int mbedtls_x509_write_extensions(unsigned char **p, unsigned char *start, + mbedtls_asn1_named_data *first) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + mbedtls_asn1_named_data *cur_ext = first; + + while (cur_ext != NULL) { + MBEDTLS_ASN1_CHK_ADD(len, x509_write_extension(p, start, cur_ext)); + cur_ext = cur_ext->next; + } + + return (int) len; +} + +#endif /* MBEDTLS_X509_CREATE_C */ diff --git a/ext/opcua_client/mbedtls/library/x509_crl.c b/ext/opcua_client/mbedtls/library/x509_crl.c new file mode 100644 index 0000000..f98c22d --- /dev/null +++ b/ext/opcua_client/mbedtls/library/x509_crl.c @@ -0,0 +1,730 @@ +/* + * X.509 Certificate Revocation List (CRL) parsing + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The ITU-T X.509 standard defines a certificate format for PKI. + * + * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs) + * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs) + * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10) + * + * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf + * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf + */ + +#include "common.h" + +#if defined(MBEDTLS_X509_CRL_PARSE_C) + +#include "mbedtls/x509_crl.h" +#include "mbedtls/error.h" +#include "mbedtls/oid.h" +#include "mbedtls/platform_util.h" + +#include + +#if defined(MBEDTLS_PEM_PARSE_C) +#include "mbedtls/pem.h" +#endif + +#include "mbedtls/platform.h" + +#if defined(MBEDTLS_HAVE_TIME) +#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) +#include +#else +#include +#endif +#endif + +#if defined(MBEDTLS_FS_IO) || defined(EFIX64) || defined(EFI32) +#include +#endif + +/* + * Version ::= INTEGER { v1(0), v2(1) } + */ +static int x509_crl_get_version(unsigned char **p, + const unsigned char *end, + int *ver) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if ((ret = mbedtls_asn1_get_int(p, end, ver)) != 0) { + if (ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + *ver = 0; + return 0; + } + + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_VERSION, ret); + } + + return 0; +} + +/* + * X.509 CRL v2 extensions + * + * We currently don't parse any extension's content, but we do check that the + * list of extensions is well-formed and abort on critical extensions (that + * are unsupported as we don't support any extension so far) + */ +static int x509_get_crl_ext(unsigned char **p, + const unsigned char *end, + mbedtls_x509_buf *ext) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (*p == end) { + return 0; + } + + /* + * crlExtensions [0] EXPLICIT Extensions OPTIONAL + * -- if present, version MUST be v2 + */ + if ((ret = mbedtls_x509_get_ext(p, end, ext, 0)) != 0) { + return ret; + } + + end = ext->p + ext->len; + + while (*p < end) { + /* + * Extension ::= SEQUENCE { + * extnID OBJECT IDENTIFIER, + * critical BOOLEAN DEFAULT FALSE, + * extnValue OCTET STRING } + */ + int is_critical = 0; + const unsigned char *end_ext_data; + size_t len; + + /* Get enclosing sequence tag */ + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + end_ext_data = *p + len; + + /* Get OID (currently ignored) */ + if ((ret = mbedtls_asn1_get_tag(p, end_ext_data, &len, + MBEDTLS_ASN1_OID)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + *p += len; + + /* Get optional critical */ + if ((ret = mbedtls_asn1_get_bool(p, end_ext_data, + &is_critical)) != 0 && + (ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG)) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + /* Data should be octet string type */ + if ((ret = mbedtls_asn1_get_tag(p, end_ext_data, &len, + MBEDTLS_ASN1_OCTET_STRING)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + /* Ignore data so far and just check its length */ + *p += len; + if (*p != end_ext_data) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + /* Abort on (unsupported) critical extensions */ + if (is_critical) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG); + } + } + + if (*p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +/* + * X.509 CRL v2 entry extensions (no extensions parsed yet.) + */ +static int x509_get_crl_entry_ext(unsigned char **p, + const unsigned char *end, + mbedtls_x509_buf *ext) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + /* OPTIONAL */ + if (end <= *p) { + return 0; + } + + ext->tag = **p; + ext->p = *p; + + /* + * Get CRL-entry extension sequence header + * crlEntryExtensions Extensions OPTIONAL -- if present, MUST be v2 + */ + if ((ret = mbedtls_asn1_get_tag(p, end, &ext->len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + if (ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + ext->p = NULL; + return 0; + } + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + end = *p + ext->len; + + if (end != *p + ext->len) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + while (*p < end) { + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + *p += len; + } + + if (*p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +/* + * X.509 CRL Entries + */ +static int x509_get_entries(unsigned char **p, + const unsigned char *end, + mbedtls_x509_crl_entry *entry) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t entry_len; + mbedtls_x509_crl_entry *cur_entry = entry; + + if (*p == end) { + return 0; + } + + if ((ret = mbedtls_asn1_get_tag(p, end, &entry_len, + MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) { + if (ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + return 0; + } + + return ret; + } + + end = *p + entry_len; + + while (*p < end) { + size_t len2; + const unsigned char *end2; + + cur_entry->raw.tag = **p; + if ((ret = mbedtls_asn1_get_tag(p, end, &len2, + MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) { + return ret; + } + + cur_entry->raw.p = *p; + cur_entry->raw.len = len2; + end2 = *p + len2; + + if ((ret = mbedtls_x509_get_serial(p, end2, &cur_entry->serial)) != 0) { + return ret; + } + + if ((ret = mbedtls_x509_get_time(p, end2, + &cur_entry->revocation_date)) != 0) { + return ret; + } + + if ((ret = x509_get_crl_entry_ext(p, end2, + &cur_entry->entry_ext)) != 0) { + return ret; + } + + if (*p < end) { + cur_entry->next = mbedtls_calloc(1, sizeof(mbedtls_x509_crl_entry)); + + if (cur_entry->next == NULL) { + return MBEDTLS_ERR_X509_ALLOC_FAILED; + } + + cur_entry = cur_entry->next; + } + } + + return 0; +} + +/* + * Parse one CRLs in DER format and append it to the chained list + */ +int mbedtls_x509_crl_parse_der(mbedtls_x509_crl *chain, + const unsigned char *buf, size_t buflen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + unsigned char *p = NULL, *end = NULL; + mbedtls_x509_buf sig_params1, sig_params2, sig_oid2; + mbedtls_x509_crl *crl = chain; + + /* + * Check for valid input + */ + if (crl == NULL || buf == NULL) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + memset(&sig_params1, 0, sizeof(mbedtls_x509_buf)); + memset(&sig_params2, 0, sizeof(mbedtls_x509_buf)); + memset(&sig_oid2, 0, sizeof(mbedtls_x509_buf)); + + /* + * Add new CRL on the end of the chain if needed. + */ + while (crl->version != 0 && crl->next != NULL) { + crl = crl->next; + } + + if (crl->version != 0 && crl->next == NULL) { + crl->next = mbedtls_calloc(1, sizeof(mbedtls_x509_crl)); + + if (crl->next == NULL) { + mbedtls_x509_crl_free(crl); + return MBEDTLS_ERR_X509_ALLOC_FAILED; + } + + mbedtls_x509_crl_init(crl->next); + crl = crl->next; + } + + /* + * Copy raw DER-encoded CRL + */ + if (buflen == 0) { + return MBEDTLS_ERR_X509_INVALID_FORMAT; + } + + p = mbedtls_calloc(1, buflen); + if (p == NULL) { + return MBEDTLS_ERR_X509_ALLOC_FAILED; + } + + memcpy(p, buf, buflen); + + crl->raw.p = p; + crl->raw.len = buflen; + + end = p + buflen; + + /* + * CertificateList ::= SEQUENCE { + * tbsCertList TBSCertList, + * signatureAlgorithm AlgorithmIdentifier, + * signatureValue BIT STRING } + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + mbedtls_x509_crl_free(crl); + return MBEDTLS_ERR_X509_INVALID_FORMAT; + } + + if (len != (size_t) (end - p)) { + mbedtls_x509_crl_free(crl); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + /* + * TBSCertList ::= SEQUENCE { + */ + crl->tbs.p = p; + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + mbedtls_x509_crl_free(crl); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret); + } + + end = p + len; + crl->tbs.len = end - crl->tbs.p; + + /* + * Version ::= INTEGER OPTIONAL { v1(0), v2(1) } + * -- if present, MUST be v2 + * + * signature AlgorithmIdentifier + */ + if ((ret = x509_crl_get_version(&p, end, &crl->version)) != 0 || + (ret = mbedtls_x509_get_alg(&p, end, &crl->sig_oid, &sig_params1)) != 0) { + mbedtls_x509_crl_free(crl); + return ret; + } + + if (crl->version < 0 || crl->version > 1) { + mbedtls_x509_crl_free(crl); + return MBEDTLS_ERR_X509_UNKNOWN_VERSION; + } + + crl->version++; + + if ((ret = mbedtls_x509_get_sig_alg(&crl->sig_oid, &sig_params1, + &crl->sig_md, &crl->sig_pk, + &crl->sig_opts)) != 0) { + mbedtls_x509_crl_free(crl); + return MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG; + } + + /* + * issuer Name + */ + crl->issuer_raw.p = p; + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + mbedtls_x509_crl_free(crl); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret); + } + + if ((ret = mbedtls_x509_get_name(&p, p + len, &crl->issuer)) != 0) { + mbedtls_x509_crl_free(crl); + return ret; + } + + crl->issuer_raw.len = p - crl->issuer_raw.p; + + /* + * thisUpdate Time + * nextUpdate Time OPTIONAL + */ + if ((ret = mbedtls_x509_get_time(&p, end, &crl->this_update)) != 0) { + mbedtls_x509_crl_free(crl); + return ret; + } + + if ((ret = mbedtls_x509_get_time(&p, end, &crl->next_update)) != 0) { + if (ret != (MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_DATE, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG)) && + ret != (MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_DATE, + MBEDTLS_ERR_ASN1_OUT_OF_DATA))) { + mbedtls_x509_crl_free(crl); + return ret; + } + } + + /* + * revokedCertificates SEQUENCE OF SEQUENCE { + * userCertificate CertificateSerialNumber, + * revocationDate Time, + * crlEntryExtensions Extensions OPTIONAL + * -- if present, MUST be v2 + * } OPTIONAL + */ + if ((ret = x509_get_entries(&p, end, &crl->entry)) != 0) { + mbedtls_x509_crl_free(crl); + return ret; + } + + /* + * crlExtensions EXPLICIT Extensions OPTIONAL + * -- if present, MUST be v2 + */ + if (crl->version == 2) { + ret = x509_get_crl_ext(&p, end, &crl->crl_ext); + + if (ret != 0) { + mbedtls_x509_crl_free(crl); + return ret; + } + } + + if (p != end) { + mbedtls_x509_crl_free(crl); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + end = crl->raw.p + crl->raw.len; + + /* + * signatureAlgorithm AlgorithmIdentifier, + * signatureValue BIT STRING + */ + if ((ret = mbedtls_x509_get_alg(&p, end, &sig_oid2, &sig_params2)) != 0) { + mbedtls_x509_crl_free(crl); + return ret; + } + + if (crl->sig_oid.len != sig_oid2.len || + memcmp(crl->sig_oid.p, sig_oid2.p, crl->sig_oid.len) != 0 || + sig_params1.len != sig_params2.len || + (sig_params1.len != 0 && + memcmp(sig_params1.p, sig_params2.p, sig_params1.len) != 0)) { + mbedtls_x509_crl_free(crl); + return MBEDTLS_ERR_X509_SIG_MISMATCH; + } + + if ((ret = mbedtls_x509_get_sig(&p, end, &crl->sig)) != 0) { + mbedtls_x509_crl_free(crl); + return ret; + } + + if (p != end) { + mbedtls_x509_crl_free(crl); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +/* + * Parse one or more CRLs and add them to the chained list + */ +int mbedtls_x509_crl_parse(mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen) +{ +#if defined(MBEDTLS_PEM_PARSE_C) + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t use_len = 0; + mbedtls_pem_context pem; + int is_pem = 0; + + if (chain == NULL || buf == NULL) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + do { + mbedtls_pem_init(&pem); + + // Avoid calling mbedtls_pem_read_buffer() on non-null-terminated + // string + if (buflen == 0 || buf[buflen - 1] != '\0') { + ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; + } else { + ret = mbedtls_pem_read_buffer(&pem, + "-----BEGIN X509 CRL-----", + "-----END X509 CRL-----", + buf, NULL, 0, &use_len); + } + + if (ret == 0) { + /* + * Was PEM encoded + */ + is_pem = 1; + + buflen -= use_len; + buf += use_len; + + if ((ret = mbedtls_x509_crl_parse_der(chain, + pem.buf, pem.buflen)) != 0) { + mbedtls_pem_free(&pem); + return ret; + } + } else if (is_pem) { + mbedtls_pem_free(&pem); + return ret; + } + + mbedtls_pem_free(&pem); + } + /* In the PEM case, buflen is 1 at the end, for the terminated NULL byte. + * And a valid CRL cannot be less than 1 byte anyway. */ + while (is_pem && buflen > 1); + + if (is_pem) { + return 0; + } else +#endif /* MBEDTLS_PEM_PARSE_C */ + return mbedtls_x509_crl_parse_der(chain, buf, buflen); +} + +#if defined(MBEDTLS_FS_IO) +/* + * Load one or more CRLs and add them to the chained list + */ +int mbedtls_x509_crl_parse_file(mbedtls_x509_crl *chain, const char *path) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n; + unsigned char *buf; + + if ((ret = mbedtls_pk_load_file(path, &buf, &n)) != 0) { + return ret; + } + + ret = mbedtls_x509_crl_parse(chain, buf, n); + + mbedtls_platform_zeroize(buf, n); + mbedtls_free(buf); + + return ret; +} +#endif /* MBEDTLS_FS_IO */ + +/* + * Return an informational string about the certificate. + */ +#define BEFORE_COLON 14 +#define BC "14" +/* + * Return an informational string about the CRL. + */ +int mbedtls_x509_crl_info(char *buf, size_t size, const char *prefix, + const mbedtls_x509_crl *crl) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n; + char *p; + const mbedtls_x509_crl_entry *entry; + + p = buf; + n = size; + + ret = mbedtls_snprintf(p, n, "%sCRL version : %d", + prefix, crl->version); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_snprintf(p, n, "\n%sissuer name : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + ret = mbedtls_x509_dn_gets(p, n, &crl->issuer); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_snprintf(p, n, "\n%sthis update : " \ + "%04d-%02d-%02d %02d:%02d:%02d", prefix, + crl->this_update.year, crl->this_update.mon, + crl->this_update.day, crl->this_update.hour, + crl->this_update.min, crl->this_update.sec); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_snprintf(p, n, "\n%snext update : " \ + "%04d-%02d-%02d %02d:%02d:%02d", prefix, + crl->next_update.year, crl->next_update.mon, + crl->next_update.day, crl->next_update.hour, + crl->next_update.min, crl->next_update.sec); + MBEDTLS_X509_SAFE_SNPRINTF; + + entry = &crl->entry; + + ret = mbedtls_snprintf(p, n, "\n%sRevoked certificates:", + prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + while (entry != NULL && entry->raw.len != 0) { + ret = mbedtls_snprintf(p, n, "\n%sserial number: ", + prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_x509_serial_gets(p, n, &entry->serial); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_snprintf(p, n, " revocation date: " \ + "%04d-%02d-%02d %02d:%02d:%02d", + entry->revocation_date.year, entry->revocation_date.mon, + entry->revocation_date.day, entry->revocation_date.hour, + entry->revocation_date.min, entry->revocation_date.sec); + MBEDTLS_X509_SAFE_SNPRINTF; + + entry = entry->next; + } + + ret = mbedtls_snprintf(p, n, "\n%ssigned using : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_x509_sig_alg_gets(p, n, &crl->sig_oid, crl->sig_pk, crl->sig_md, + crl->sig_opts); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_snprintf(p, n, "\n"); + MBEDTLS_X509_SAFE_SNPRINTF; + + return (int) (size - n); +} + +/* + * Initialize a CRL chain + */ +void mbedtls_x509_crl_init(mbedtls_x509_crl *crl) +{ + memset(crl, 0, sizeof(mbedtls_x509_crl)); +} + +/* + * Unallocate all CRL data + */ +void mbedtls_x509_crl_free(mbedtls_x509_crl *crl) +{ + mbedtls_x509_crl *crl_cur = crl; + mbedtls_x509_crl *crl_prv; + mbedtls_x509_name *name_cur; + mbedtls_x509_name *name_prv; + mbedtls_x509_crl_entry *entry_cur; + mbedtls_x509_crl_entry *entry_prv; + + if (crl == NULL) { + return; + } + + do { +#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) + mbedtls_free(crl_cur->sig_opts); +#endif + + name_cur = crl_cur->issuer.next; + while (name_cur != NULL) { + name_prv = name_cur; + name_cur = name_cur->next; + mbedtls_platform_zeroize(name_prv, sizeof(mbedtls_x509_name)); + mbedtls_free(name_prv); + } + + entry_cur = crl_cur->entry.next; + while (entry_cur != NULL) { + entry_prv = entry_cur; + entry_cur = entry_cur->next; + mbedtls_platform_zeroize(entry_prv, + sizeof(mbedtls_x509_crl_entry)); + mbedtls_free(entry_prv); + } + + if (crl_cur->raw.p != NULL) { + mbedtls_platform_zeroize(crl_cur->raw.p, crl_cur->raw.len); + mbedtls_free(crl_cur->raw.p); + } + + crl_cur = crl_cur->next; + } while (crl_cur != NULL); + + crl_cur = crl; + do { + crl_prv = crl_cur; + crl_cur = crl_cur->next; + + mbedtls_platform_zeroize(crl_prv, sizeof(mbedtls_x509_crl)); + if (crl_prv != crl) { + mbedtls_free(crl_prv); + } + } while (crl_cur != NULL); +} + +#endif /* MBEDTLS_X509_CRL_PARSE_C */ diff --git a/ext/opcua_client/mbedtls/library/x509_crt.c b/ext/opcua_client/mbedtls/library/x509_crt.c new file mode 100644 index 0000000..6728fa0 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/x509_crt.c @@ -0,0 +1,3406 @@ +/* + * X.509 certificate parsing and verification + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The ITU-T X.509 standard defines a certificate format for PKI. + * + * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs) + * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs) + * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10) + * + * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf + * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf + * + * [SIRO] https://cabforum.org/wp-content/uploads/Chunghwatelecom201503cabforumV4.pdf + */ + +#include "common.h" + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + +#include "mbedtls/x509_crt.h" +#include "mbedtls/error.h" +#include "mbedtls/oid.h" +#include "mbedtls/platform_util.h" + +#include +#include + +#if defined(MBEDTLS_PEM_PARSE_C) +#include "mbedtls/pem.h" +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "psa/crypto.h" +#include "mbedtls/psa_util.h" +#endif + +#include "mbedtls/platform.h" + +#if defined(MBEDTLS_THREADING_C) +#include "mbedtls/threading.h" +#endif + +#if defined(MBEDTLS_HAVE_TIME) +#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) +#include +#else +#include +#endif +#endif + +#if defined(MBEDTLS_FS_IO) +#include +#if !defined(_WIN32) || defined(EFIX64) || defined(EFI32) +#include +#include +#include +#include +#endif /* !_WIN32 || EFIX64 || EFI32 */ +#endif + +/* + * Item in a verification chain: cert and flags for it + */ +typedef struct { + mbedtls_x509_crt *crt; + uint32_t flags; +} x509_crt_verify_chain_item; + +/* + * Max size of verification chain: end-entity + intermediates + trusted root + */ +#define X509_MAX_VERIFY_CHAIN_SIZE (MBEDTLS_X509_MAX_INTERMEDIATE_CA + 2) + +/* Default profile. Do not remove items unless there are serious security + * concerns. */ +const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_default = +{ + /* Only SHA-2 hashes */ + MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA224) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA384) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA512), + 0xFFFFFFF, /* Any PK alg */ + 0xFFFFFFF, /* Any curve */ + 2048, +}; + +/* + * Next-default profile + */ +const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_next = +{ + /* Hashes from SHA-256 and above */ + MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA384) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA512), + 0xFFFFFFF, /* Any PK alg */ +#if defined(MBEDTLS_ECP_C) + /* Curves at or above 128-bit security level */ + MBEDTLS_X509_ID_FLAG(MBEDTLS_ECP_DP_SECP256R1) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_ECP_DP_SECP384R1) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_ECP_DP_SECP521R1) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_ECP_DP_BP256R1) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_ECP_DP_BP384R1) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_ECP_DP_BP512R1) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_ECP_DP_SECP256K1), +#else + 0, +#endif + 2048, +}; + +/* + * NSA Suite B Profile + */ +const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_suiteb = +{ + /* Only SHA-256 and 384 */ + MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA384), + /* Only ECDSA */ + MBEDTLS_X509_ID_FLAG(MBEDTLS_PK_ECDSA) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_PK_ECKEY), +#if defined(MBEDTLS_ECP_C) + /* Only NIST P-256 and P-384 */ + MBEDTLS_X509_ID_FLAG(MBEDTLS_ECP_DP_SECP256R1) | + MBEDTLS_X509_ID_FLAG(MBEDTLS_ECP_DP_SECP384R1), +#else + 0, +#endif + 0, +}; + +/* + * Check md_alg against profile + * Return 0 if md_alg is acceptable for this profile, -1 otherwise + */ +static int x509_profile_check_md_alg(const mbedtls_x509_crt_profile *profile, + mbedtls_md_type_t md_alg) +{ + if (md_alg == MBEDTLS_MD_NONE) { + return -1; + } + + if ((profile->allowed_mds & MBEDTLS_X509_ID_FLAG(md_alg)) != 0) { + return 0; + } + + return -1; +} + +/* + * Check pk_alg against profile + * Return 0 if pk_alg is acceptable for this profile, -1 otherwise + */ +static int x509_profile_check_pk_alg(const mbedtls_x509_crt_profile *profile, + mbedtls_pk_type_t pk_alg) +{ + if (pk_alg == MBEDTLS_PK_NONE) { + return -1; + } + + if ((profile->allowed_pks & MBEDTLS_X509_ID_FLAG(pk_alg)) != 0) { + return 0; + } + + return -1; +} + +/* + * Check key against profile + * Return 0 if pk is acceptable for this profile, -1 otherwise + */ +static int x509_profile_check_key(const mbedtls_x509_crt_profile *profile, + const mbedtls_pk_context *pk) +{ + const mbedtls_pk_type_t pk_alg = mbedtls_pk_get_type(pk); + +#if defined(MBEDTLS_RSA_C) + if (pk_alg == MBEDTLS_PK_RSA || pk_alg == MBEDTLS_PK_RSASSA_PSS) { + if (mbedtls_pk_get_bitlen(pk) >= profile->rsa_min_bitlen) { + return 0; + } + + return -1; + } +#endif + +#if defined(MBEDTLS_ECP_C) + if (pk_alg == MBEDTLS_PK_ECDSA || + pk_alg == MBEDTLS_PK_ECKEY || + pk_alg == MBEDTLS_PK_ECKEY_DH) { + const mbedtls_ecp_group_id gid = mbedtls_pk_ec(*pk)->grp.id; + + if (gid == MBEDTLS_ECP_DP_NONE) { + return -1; + } + + if ((profile->allowed_curves & MBEDTLS_X509_ID_FLAG(gid)) != 0) { + return 0; + } + + return -1; + } +#endif + + return -1; +} + +/* + * Like memcmp, but case-insensitive and always returns -1 if different + */ +static int x509_memcasecmp(const void *s1, const void *s2, size_t len) +{ + size_t i; + unsigned char diff; + const unsigned char *n1 = s1, *n2 = s2; + + for (i = 0; i < len; i++) { + diff = n1[i] ^ n2[i]; + + if (diff == 0) { + continue; + } + + if (diff == 32 && + ((n1[i] >= 'a' && n1[i] <= 'z') || + (n1[i] >= 'A' && n1[i] <= 'Z'))) { + continue; + } + + return -1; + } + + return 0; +} + +/* + * Return 0 if name matches wildcard, -1 otherwise + */ +static int x509_check_wildcard(const char *cn, const mbedtls_x509_buf *name) +{ + size_t i; + size_t cn_idx = 0, cn_len = strlen(cn); + + /* We can't have a match if there is no wildcard to match */ + if (name->len < 3 || name->p[0] != '*' || name->p[1] != '.') { + return -1; + } + + for (i = 0; i < cn_len; ++i) { + if (cn[i] == '.') { + cn_idx = i; + break; + } + } + + if (cn_idx == 0) { + return -1; + } + + if (cn_len - cn_idx == name->len - 1 && + x509_memcasecmp(name->p + 1, cn + cn_idx, name->len - 1) == 0) { + return 0; + } + + return -1; +} + +/* + * Compare two X.509 strings, case-insensitive, and allowing for some encoding + * variations (but not all). + * + * Return 0 if equal, -1 otherwise. + */ +static int x509_string_cmp(const mbedtls_x509_buf *a, const mbedtls_x509_buf *b) +{ + if (a->tag == b->tag && + a->len == b->len && + memcmp(a->p, b->p, b->len) == 0) { + return 0; + } + + if ((a->tag == MBEDTLS_ASN1_UTF8_STRING || a->tag == MBEDTLS_ASN1_PRINTABLE_STRING) && + (b->tag == MBEDTLS_ASN1_UTF8_STRING || b->tag == MBEDTLS_ASN1_PRINTABLE_STRING) && + a->len == b->len && + x509_memcasecmp(a->p, b->p, b->len) == 0) { + return 0; + } + + return -1; +} + +/* + * Compare two X.509 Names (aka rdnSequence). + * + * See RFC 5280 section 7.1, though we don't implement the whole algorithm: + * we sometimes return unequal when the full algorithm would return equal, + * but never the other way. (In particular, we don't do Unicode normalisation + * or space folding.) + * + * Return 0 if equal, -1 otherwise. + */ +static int x509_name_cmp(const mbedtls_x509_name *a, const mbedtls_x509_name *b) +{ + /* Avoid recursion, it might not be optimised by the compiler */ + while (a != NULL || b != NULL) { + if (a == NULL || b == NULL) { + return -1; + } + + /* type */ + if (a->oid.tag != b->oid.tag || + a->oid.len != b->oid.len || + memcmp(a->oid.p, b->oid.p, b->oid.len) != 0) { + return -1; + } + + /* value */ + if (x509_string_cmp(&a->val, &b->val) != 0) { + return -1; + } + + /* structure of the list of sets */ + if (a->next_merged != b->next_merged) { + return -1; + } + + a = a->next; + b = b->next; + } + + /* a == NULL == b */ + return 0; +} + +/* + * Reset (init or clear) a verify_chain + */ +static void x509_crt_verify_chain_reset( + mbedtls_x509_crt_verify_chain *ver_chain) +{ + size_t i; + + for (i = 0; i < MBEDTLS_X509_MAX_VERIFY_CHAIN_SIZE; i++) { + ver_chain->items[i].crt = NULL; + ver_chain->items[i].flags = (uint32_t) -1; + } + + ver_chain->len = 0; + +#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) + ver_chain->trust_ca_cb_result = NULL; +#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ +} + +/* + * Version ::= INTEGER { v1(0), v2(1), v3(2) } + */ +static int x509_get_version(unsigned char **p, + const unsigned char *end, + int *ver) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | + 0)) != 0) { + if (ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + *ver = 0; + return 0; + } + + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret); + } + + end = *p + len; + + if ((ret = mbedtls_asn1_get_int(p, end, ver)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_VERSION, ret); + } + + if (*p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_VERSION, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +/* + * Validity ::= SEQUENCE { + * notBefore Time, + * notAfter Time } + */ +static int x509_get_dates(unsigned char **p, + const unsigned char *end, + mbedtls_x509_time *from, + mbedtls_x509_time *to) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_DATE, ret); + } + + end = *p + len; + + if ((ret = mbedtls_x509_get_time(p, end, from)) != 0) { + return ret; + } + + if ((ret = mbedtls_x509_get_time(p, end, to)) != 0) { + return ret; + } + + if (*p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_DATE, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +/* + * X.509 v2/v3 unique identifier (not parsed) + */ +static int x509_get_uid(unsigned char **p, + const unsigned char *end, + mbedtls_x509_buf *uid, int n) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (*p == end) { + return 0; + } + + uid->tag = **p; + + if ((ret = mbedtls_asn1_get_tag(p, end, &uid->len, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | + n)) != 0) { + if (ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + return 0; + } + + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret); + } + + uid->p = *p; + *p += uid->len; + + return 0; +} + +static int x509_get_basic_constraints(unsigned char **p, + const unsigned char *end, + int *ca_istrue, + int *max_pathlen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + + /* + * BasicConstraints ::= SEQUENCE { + * cA BOOLEAN DEFAULT FALSE, + * pathLenConstraint INTEGER (0..MAX) OPTIONAL } + */ + *ca_istrue = 0; /* DEFAULT FALSE */ + *max_pathlen = 0; /* endless */ + + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + if (*p == end) { + return 0; + } + + if ((ret = mbedtls_asn1_get_bool(p, end, ca_istrue)) != 0) { + if (ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + ret = mbedtls_asn1_get_int(p, end, ca_istrue); + } + + if (ret != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + if (*ca_istrue != 0) { + *ca_istrue = 1; + } + } + + if (*p == end) { + return 0; + } + + if ((ret = mbedtls_asn1_get_int(p, end, max_pathlen)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + if (*p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + /* Do not accept max_pathlen equal to INT_MAX to avoid a signed integer + * overflow, which is an undefined behavior. */ + if (*max_pathlen == INT_MAX) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_INVALID_LENGTH); + } + + (*max_pathlen)++; + + return 0; +} + +static int x509_get_ns_cert_type(unsigned char **p, + const unsigned char *end, + unsigned char *ns_cert_type) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_x509_bitstring bs = { 0, 0, NULL }; + + if ((ret = mbedtls_asn1_get_bitstring(p, end, &bs)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + if (bs.len != 1) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_INVALID_LENGTH); + } + + /* Get actual bitstring */ + *ns_cert_type = *bs.p; + return 0; +} + +static int x509_get_key_usage(unsigned char **p, + const unsigned char *end, + unsigned int *key_usage) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i; + mbedtls_x509_bitstring bs = { 0, 0, NULL }; + + if ((ret = mbedtls_asn1_get_bitstring(p, end, &bs)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + if (bs.len < 1) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_INVALID_LENGTH); + } + + /* Get actual bitstring */ + *key_usage = 0; + for (i = 0; i < bs.len && i < sizeof(unsigned int); i++) { + *key_usage |= (unsigned int) bs.p[i] << (8*i); + } + + return 0; +} + +/* + * ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId + * + * KeyPurposeId ::= OBJECT IDENTIFIER + */ +static int x509_get_ext_key_usage(unsigned char **p, + const unsigned char *end, + mbedtls_x509_sequence *ext_key_usage) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if ((ret = mbedtls_asn1_get_sequence_of(p, end, ext_key_usage, MBEDTLS_ASN1_OID)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + /* Sequence length must be >= 1 */ + if (ext_key_usage->buf.p == NULL) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_INVALID_LENGTH); + } + + return 0; +} + +/* + * SubjectAltName ::= GeneralNames + * + * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName + * + * GeneralName ::= CHOICE { + * otherName [0] OtherName, + * rfc822Name [1] IA5String, + * dNSName [2] IA5String, + * x400Address [3] ORAddress, + * directoryName [4] Name, + * ediPartyName [5] EDIPartyName, + * uniformResourceIdentifier [6] IA5String, + * iPAddress [7] OCTET STRING, + * registeredID [8] OBJECT IDENTIFIER } + * + * OtherName ::= SEQUENCE { + * type-id OBJECT IDENTIFIER, + * value [0] EXPLICIT ANY DEFINED BY type-id } + * + * EDIPartyName ::= SEQUENCE { + * nameAssigner [0] DirectoryString OPTIONAL, + * partyName [1] DirectoryString } + * + * NOTE: we list all types, but only use dNSName and otherName + * of type HwModuleName, as defined in RFC 4108, at this point. + */ +static int x509_get_subject_alt_name(unsigned char **p, + const unsigned char *end, + mbedtls_x509_sequence *subject_alt_name) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len, tag_len; + mbedtls_asn1_sequence *cur = subject_alt_name; + + /* Get main sequence tag */ + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + if (*p + len != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + while (*p < end) { + mbedtls_x509_subject_alternative_name dummy_san_buf; + mbedtls_x509_buf tmp_san_buf; + memset(&dummy_san_buf, 0, sizeof(dummy_san_buf)); + + tmp_san_buf.tag = **p; + (*p)++; + + if ((ret = mbedtls_asn1_get_len(p, end, &tag_len)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + tmp_san_buf.p = *p; + tmp_san_buf.len = tag_len; + + if ((tmp_san_buf.tag & MBEDTLS_ASN1_TAG_CLASS_MASK) != + MBEDTLS_ASN1_CONTEXT_SPECIFIC) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG); + } + + /* + * Check that the SAN is structured correctly. + */ + ret = mbedtls_x509_parse_subject_alt_name(&tmp_san_buf, &dummy_san_buf); + /* + * In case the extension is malformed, return an error, + * and clear the allocated sequences. + */ + if (ret != 0 && ret != MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE) { + mbedtls_x509_sequence *seq_cur = subject_alt_name->next; + mbedtls_x509_sequence *seq_prv; + while (seq_cur != NULL) { + seq_prv = seq_cur; + seq_cur = seq_cur->next; + mbedtls_platform_zeroize(seq_prv, + sizeof(mbedtls_x509_sequence)); + mbedtls_free(seq_prv); + } + subject_alt_name->next = NULL; + return ret; + } + + /* Allocate and assign next pointer */ + if (cur->buf.p != NULL) { + if (cur->next != NULL) { + return MBEDTLS_ERR_X509_INVALID_EXTENSIONS; + } + + cur->next = mbedtls_calloc(1, sizeof(mbedtls_asn1_sequence)); + + if (cur->next == NULL) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_ALLOC_FAILED); + } + + cur = cur->next; + } + + cur->buf = tmp_san_buf; + *p += tmp_san_buf.len; + } + + /* Set final sequence entry's next pointer to NULL */ + cur->next = NULL; + + if (*p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +/* + * id-ce-certificatePolicies OBJECT IDENTIFIER ::= { id-ce 32 } + * + * anyPolicy OBJECT IDENTIFIER ::= { id-ce-certificatePolicies 0 } + * + * certificatePolicies ::= SEQUENCE SIZE (1..MAX) OF PolicyInformation + * + * PolicyInformation ::= SEQUENCE { + * policyIdentifier CertPolicyId, + * policyQualifiers SEQUENCE SIZE (1..MAX) OF + * PolicyQualifierInfo OPTIONAL } + * + * CertPolicyId ::= OBJECT IDENTIFIER + * + * PolicyQualifierInfo ::= SEQUENCE { + * policyQualifierId PolicyQualifierId, + * qualifier ANY DEFINED BY policyQualifierId } + * + * -- policyQualifierIds for Internet policy qualifiers + * + * id-qt OBJECT IDENTIFIER ::= { id-pkix 2 } + * id-qt-cps OBJECT IDENTIFIER ::= { id-qt 1 } + * id-qt-unotice OBJECT IDENTIFIER ::= { id-qt 2 } + * + * PolicyQualifierId ::= OBJECT IDENTIFIER ( id-qt-cps | id-qt-unotice ) + * + * Qualifier ::= CHOICE { + * cPSuri CPSuri, + * userNotice UserNotice } + * + * CPSuri ::= IA5String + * + * UserNotice ::= SEQUENCE { + * noticeRef NoticeReference OPTIONAL, + * explicitText DisplayText OPTIONAL } + * + * NoticeReference ::= SEQUENCE { + * organization DisplayText, + * noticeNumbers SEQUENCE OF INTEGER } + * + * DisplayText ::= CHOICE { + * ia5String IA5String (SIZE (1..200)), + * visibleString VisibleString (SIZE (1..200)), + * bmpString BMPString (SIZE (1..200)), + * utf8String UTF8String (SIZE (1..200)) } + * + * NOTE: we only parse and use anyPolicy without qualifiers at this point + * as defined in RFC 5280. + */ +static int x509_get_certificate_policies(unsigned char **p, + const unsigned char *end, + mbedtls_x509_sequence *certificate_policies) +{ + int ret, parse_ret = 0; + size_t len; + mbedtls_asn1_buf *buf; + mbedtls_asn1_sequence *cur = certificate_policies; + + /* Get main sequence tag */ + ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE); + if (ret != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + if (*p + len != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + /* + * Cannot be an empty sequence. + */ + if (len == 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + while (*p < end) { + mbedtls_x509_buf policy_oid; + const unsigned char *policy_end; + + /* + * Get the policy sequence + */ + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + policy_end = *p + len; + + if ((ret = mbedtls_asn1_get_tag(p, policy_end, &len, + MBEDTLS_ASN1_OID)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + policy_oid.tag = MBEDTLS_ASN1_OID; + policy_oid.len = len; + policy_oid.p = *p; + + /* + * Only AnyPolicy is currently supported when enforcing policy. + */ + if (MBEDTLS_OID_CMP(MBEDTLS_OID_ANY_POLICY, &policy_oid) != 0) { + /* + * Set the parsing return code but continue parsing, in case this + * extension is critical and MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION + * is configured. + */ + parse_ret = MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE; + } + + /* Allocate and assign next pointer */ + if (cur->buf.p != NULL) { + if (cur->next != NULL) { + return MBEDTLS_ERR_X509_INVALID_EXTENSIONS; + } + + cur->next = mbedtls_calloc(1, sizeof(mbedtls_asn1_sequence)); + + if (cur->next == NULL) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_ALLOC_FAILED); + } + + cur = cur->next; + } + + buf = &(cur->buf); + buf->tag = policy_oid.tag; + buf->p = policy_oid.p; + buf->len = policy_oid.len; + + *p += len; + + /* + * If there is an optional qualifier, then *p < policy_end + * Check the Qualifier len to verify it doesn't exceed policy_end. + */ + if (*p < policy_end) { + if ((ret = mbedtls_asn1_get_tag(p, policy_end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != + 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + /* + * Skip the optional policy qualifiers. + */ + *p += len; + } + + if (*p != policy_end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + } + + /* Set final sequence entry's next pointer to NULL */ + cur->next = NULL; + + if (*p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return parse_ret; +} + +/* + * X.509 v3 extensions + * + */ +static int x509_get_crt_ext(unsigned char **p, + const unsigned char *end, + mbedtls_x509_crt *crt, + mbedtls_x509_crt_ext_cb_t cb, + void *p_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + unsigned char *end_ext_data, *start_ext_octet, *end_ext_octet; + + if (*p == end) { + return 0; + } + + if ((ret = mbedtls_x509_get_ext(p, end, &crt->v3_ext, 3)) != 0) { + return ret; + } + + end = crt->v3_ext.p + crt->v3_ext.len; + while (*p < end) { + /* + * Extension ::= SEQUENCE { + * extnID OBJECT IDENTIFIER, + * critical BOOLEAN DEFAULT FALSE, + * extnValue OCTET STRING } + */ + mbedtls_x509_buf extn_oid = { 0, 0, NULL }; + int is_critical = 0; /* DEFAULT FALSE */ + int ext_type = 0; + + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + end_ext_data = *p + len; + + /* Get extension ID */ + if ((ret = mbedtls_asn1_get_tag(p, end_ext_data, &extn_oid.len, + MBEDTLS_ASN1_OID)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + extn_oid.tag = MBEDTLS_ASN1_OID; + extn_oid.p = *p; + *p += extn_oid.len; + + /* Get optional critical */ + if ((ret = mbedtls_asn1_get_bool(p, end_ext_data, &is_critical)) != 0 && + (ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG)) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + /* Data should be octet string type */ + if ((ret = mbedtls_asn1_get_tag(p, end_ext_data, &len, + MBEDTLS_ASN1_OCTET_STRING)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + start_ext_octet = *p; + end_ext_octet = *p + len; + + if (end_ext_octet != end_ext_data) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + /* + * Detect supported extensions + */ + ret = mbedtls_oid_get_x509_ext_type(&extn_oid, &ext_type); + + if (ret != 0) { + /* Give the callback (if any) a chance to handle the extension */ + if (cb != NULL) { + ret = cb(p_ctx, crt, &extn_oid, is_critical, *p, end_ext_octet); + if (ret != 0 && is_critical) { + return ret; + } + *p = end_ext_octet; + continue; + } + + /* No parser found, skip extension */ + *p = end_ext_octet; + +#if !defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION) + if (is_critical) { + /* Data is marked as critical: fail */ + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG); + } +#endif + continue; + } + + /* Forbid repeated extensions */ + if ((crt->ext_types & ext_type) != 0) { + return MBEDTLS_ERR_X509_INVALID_EXTENSIONS; + } + + crt->ext_types |= ext_type; + + switch (ext_type) { + case MBEDTLS_X509_EXT_BASIC_CONSTRAINTS: + /* Parse basic constraints */ + if ((ret = x509_get_basic_constraints(p, end_ext_octet, + &crt->ca_istrue, &crt->max_pathlen)) != 0) { + return ret; + } + break; + + case MBEDTLS_X509_EXT_KEY_USAGE: + /* Parse key usage */ + if ((ret = x509_get_key_usage(p, end_ext_octet, + &crt->key_usage)) != 0) { + return ret; + } + break; + + case MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE: + /* Parse extended key usage */ + if ((ret = x509_get_ext_key_usage(p, end_ext_octet, + &crt->ext_key_usage)) != 0) { + return ret; + } + break; + + case MBEDTLS_X509_EXT_SUBJECT_ALT_NAME: + /* Parse subject alt name */ + if ((ret = x509_get_subject_alt_name(p, end_ext_octet, + &crt->subject_alt_names)) != 0) { + return ret; + } + break; + + case MBEDTLS_X509_EXT_NS_CERT_TYPE: + /* Parse netscape certificate type */ + if ((ret = x509_get_ns_cert_type(p, end_ext_octet, + &crt->ns_cert_type)) != 0) { + return ret; + } + break; + + case MBEDTLS_OID_X509_EXT_CERTIFICATE_POLICIES: + /* Parse certificate policies type */ + if ((ret = x509_get_certificate_policies(p, end_ext_octet, + &crt->certificate_policies)) != 0) { + /* Give the callback (if any) a chance to handle the extension + * if it contains unsupported policies */ + if (ret == MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE && cb != NULL && + cb(p_ctx, crt, &extn_oid, is_critical, + start_ext_octet, end_ext_octet) == 0) { + break; + } + +#if !defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION) + if (is_critical) { + return ret; + } else +#endif + /* + * If MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE is returned, then we + * cannot interpret or enforce the policy. However, it is up to + * the user to choose how to enforce the policies, + * unless the extension is critical. + */ + if (ret != MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE) { + return ret; + } + } + break; + + default: + /* + * If this is a non-critical extension, which the oid layer + * supports, but there isn't an x509 parser for it, + * skip the extension. + */ +#if !defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION) + if (is_critical) { + return MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE; + } else +#endif + *p = end_ext_octet; + } + } + + if (*p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +/* + * Parse and fill a single X.509 certificate in DER format + */ +static int x509_crt_parse_der_core(mbedtls_x509_crt *crt, + const unsigned char *buf, + size_t buflen, + int make_copy, + mbedtls_x509_crt_ext_cb_t cb, + void *p_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + unsigned char *p, *end, *crt_end; + mbedtls_x509_buf sig_params1, sig_params2, sig_oid2; + + memset(&sig_params1, 0, sizeof(mbedtls_x509_buf)); + memset(&sig_params2, 0, sizeof(mbedtls_x509_buf)); + memset(&sig_oid2, 0, sizeof(mbedtls_x509_buf)); + + /* + * Check for valid input + */ + if (crt == NULL || buf == NULL) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + /* Use the original buffer until we figure out actual length. */ + p = (unsigned char *) buf; + len = buflen; + end = p + len; + + /* + * Certificate ::= SEQUENCE { + * tbsCertificate TBSCertificate, + * signatureAlgorithm AlgorithmIdentifier, + * signatureValue BIT STRING } + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + mbedtls_x509_crt_free(crt); + return MBEDTLS_ERR_X509_INVALID_FORMAT; + } + + end = crt_end = p + len; + crt->raw.len = crt_end - buf; + if (make_copy != 0) { + /* Create and populate a new buffer for the raw field. */ + crt->raw.p = p = mbedtls_calloc(1, crt->raw.len); + if (crt->raw.p == NULL) { + return MBEDTLS_ERR_X509_ALLOC_FAILED; + } + + memcpy(crt->raw.p, buf, crt->raw.len); + crt->own_buffer = 1; + + p += crt->raw.len - len; + end = crt_end = p + len; + } else { + crt->raw.p = (unsigned char *) buf; + crt->own_buffer = 0; + } + + /* + * TBSCertificate ::= SEQUENCE { + */ + crt->tbs.p = p; + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + mbedtls_x509_crt_free(crt); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret); + } + + end = p + len; + crt->tbs.len = end - crt->tbs.p; + + /* + * Version ::= INTEGER { v1(0), v2(1), v3(2) } + * + * CertificateSerialNumber ::= INTEGER + * + * signature AlgorithmIdentifier + */ + if ((ret = x509_get_version(&p, end, &crt->version)) != 0 || + (ret = mbedtls_x509_get_serial(&p, end, &crt->serial)) != 0 || + (ret = mbedtls_x509_get_alg(&p, end, &crt->sig_oid, + &sig_params1)) != 0) { + mbedtls_x509_crt_free(crt); + return ret; + } + + if (crt->version < 0 || crt->version > 2) { + mbedtls_x509_crt_free(crt); + return MBEDTLS_ERR_X509_UNKNOWN_VERSION; + } + + crt->version++; + + if ((ret = mbedtls_x509_get_sig_alg(&crt->sig_oid, &sig_params1, + &crt->sig_md, &crt->sig_pk, + &crt->sig_opts)) != 0) { + mbedtls_x509_crt_free(crt); + return ret; + } + + /* + * issuer Name + */ + crt->issuer_raw.p = p; + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + mbedtls_x509_crt_free(crt); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret); + } + + if ((ret = mbedtls_x509_get_name(&p, p + len, &crt->issuer)) != 0) { + mbedtls_x509_crt_free(crt); + return ret; + } + + crt->issuer_raw.len = p - crt->issuer_raw.p; + + /* + * Validity ::= SEQUENCE { + * notBefore Time, + * notAfter Time } + * + */ + if ((ret = x509_get_dates(&p, end, &crt->valid_from, + &crt->valid_to)) != 0) { + mbedtls_x509_crt_free(crt); + return ret; + } + + /* + * subject Name + */ + crt->subject_raw.p = p; + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + mbedtls_x509_crt_free(crt); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret); + } + + if (len && (ret = mbedtls_x509_get_name(&p, p + len, &crt->subject)) != 0) { + mbedtls_x509_crt_free(crt); + return ret; + } + + crt->subject_raw.len = p - crt->subject_raw.p; + + /* + * SubjectPublicKeyInfo + */ + crt->pk_raw.p = p; + if ((ret = mbedtls_pk_parse_subpubkey(&p, end, &crt->pk)) != 0) { + mbedtls_x509_crt_free(crt); + return ret; + } + crt->pk_raw.len = p - crt->pk_raw.p; + + /* + * issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, + * -- If present, version shall be v2 or v3 + * subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, + * -- If present, version shall be v2 or v3 + * extensions [3] EXPLICIT Extensions OPTIONAL + * -- If present, version shall be v3 + */ + if (crt->version == 2 || crt->version == 3) { + ret = x509_get_uid(&p, end, &crt->issuer_id, 1); + if (ret != 0) { + mbedtls_x509_crt_free(crt); + return ret; + } + } + + if (crt->version == 2 || crt->version == 3) { + ret = x509_get_uid(&p, end, &crt->subject_id, 2); + if (ret != 0) { + mbedtls_x509_crt_free(crt); + return ret; + } + } + + int extensions_allowed = 1; +#if !defined(MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3) + if (crt->version != 3) { + extensions_allowed = 0; + } +#endif + if (extensions_allowed) { + ret = x509_get_crt_ext(&p, end, crt, cb, p_ctx); + if (ret != 0) { + mbedtls_x509_crt_free(crt); + return ret; + } + } + + if (p != end) { + mbedtls_x509_crt_free(crt); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + end = crt_end; + + /* + * } + * -- end of TBSCertificate + * + * signatureAlgorithm AlgorithmIdentifier, + * signatureValue BIT STRING + */ + if ((ret = mbedtls_x509_get_alg(&p, end, &sig_oid2, &sig_params2)) != 0) { + mbedtls_x509_crt_free(crt); + return ret; + } + + if (crt->sig_oid.len != sig_oid2.len || + memcmp(crt->sig_oid.p, sig_oid2.p, crt->sig_oid.len) != 0 || + sig_params1.tag != sig_params2.tag || + sig_params1.len != sig_params2.len || + (sig_params1.len != 0 && + memcmp(sig_params1.p, sig_params2.p, sig_params1.len) != 0)) { + mbedtls_x509_crt_free(crt); + return MBEDTLS_ERR_X509_SIG_MISMATCH; + } + + if ((ret = mbedtls_x509_get_sig(&p, end, &crt->sig)) != 0) { + mbedtls_x509_crt_free(crt); + return ret; + } + + if (p != end) { + mbedtls_x509_crt_free(crt); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +/* + * Parse one X.509 certificate in DER format from a buffer and add them to a + * chained list + */ +static int mbedtls_x509_crt_parse_der_internal(mbedtls_x509_crt *chain, + const unsigned char *buf, + size_t buflen, + int make_copy, + mbedtls_x509_crt_ext_cb_t cb, + void *p_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_x509_crt *crt = chain, *prev = NULL; + + /* + * Check for valid input + */ + if (crt == NULL || buf == NULL) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + while (crt->version != 0 && crt->next != NULL) { + prev = crt; + crt = crt->next; + } + + /* + * Add new certificate on the end of the chain if needed. + */ + if (crt->version != 0 && crt->next == NULL) { + crt->next = mbedtls_calloc(1, sizeof(mbedtls_x509_crt)); + + if (crt->next == NULL) { + return MBEDTLS_ERR_X509_ALLOC_FAILED; + } + + prev = crt; + mbedtls_x509_crt_init(crt->next); + crt = crt->next; + } + + ret = x509_crt_parse_der_core(crt, buf, buflen, make_copy, cb, p_ctx); + if (ret != 0) { + if (prev) { + prev->next = NULL; + } + + if (crt != chain) { + mbedtls_free(crt); + } + + return ret; + } + + return 0; +} + +int mbedtls_x509_crt_parse_der_nocopy(mbedtls_x509_crt *chain, + const unsigned char *buf, + size_t buflen) +{ + return mbedtls_x509_crt_parse_der_internal(chain, buf, buflen, 0, NULL, NULL); +} + +int mbedtls_x509_crt_parse_der_with_ext_cb(mbedtls_x509_crt *chain, + const unsigned char *buf, + size_t buflen, + int make_copy, + mbedtls_x509_crt_ext_cb_t cb, + void *p_ctx) +{ + return mbedtls_x509_crt_parse_der_internal(chain, buf, buflen, make_copy, cb, p_ctx); +} + +int mbedtls_x509_crt_parse_der(mbedtls_x509_crt *chain, + const unsigned char *buf, + size_t buflen) +{ + return mbedtls_x509_crt_parse_der_internal(chain, buf, buflen, 1, NULL, NULL); +} + +/* + * Parse one or more PEM certificates from a buffer and add them to the chained + * list + */ +int mbedtls_x509_crt_parse(mbedtls_x509_crt *chain, + const unsigned char *buf, + size_t buflen) +{ +#if defined(MBEDTLS_PEM_PARSE_C) + int success = 0, first_error = 0, total_failed = 0; + int buf_format = MBEDTLS_X509_FORMAT_DER; +#endif + + /* + * Check for valid input + */ + if (chain == NULL || buf == NULL) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + /* + * Determine buffer content. Buffer contains either one DER certificate or + * one or more PEM certificates. + */ +#if defined(MBEDTLS_PEM_PARSE_C) + if (buflen != 0 && buf[buflen - 1] == '\0' && + strstr((const char *) buf, "-----BEGIN CERTIFICATE-----") != NULL) { + buf_format = MBEDTLS_X509_FORMAT_PEM; + } + + if (buf_format == MBEDTLS_X509_FORMAT_DER) { + return mbedtls_x509_crt_parse_der(chain, buf, buflen); + } +#else + return mbedtls_x509_crt_parse_der(chain, buf, buflen); +#endif + +#if defined(MBEDTLS_PEM_PARSE_C) + if (buf_format == MBEDTLS_X509_FORMAT_PEM) { + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_pem_context pem; + + /* 1 rather than 0 since the terminating NULL byte is counted in */ + while (buflen > 1) { + size_t use_len; + mbedtls_pem_init(&pem); + + /* If we get there, we know the string is null-terminated */ + ret = mbedtls_pem_read_buffer(&pem, + "-----BEGIN CERTIFICATE-----", + "-----END CERTIFICATE-----", + buf, NULL, 0, &use_len); + + if (ret == 0) { + /* + * Was PEM encoded + */ + buflen -= use_len; + buf += use_len; + } else if (ret == MBEDTLS_ERR_PEM_BAD_INPUT_DATA) { + return ret; + } else if (ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) { + mbedtls_pem_free(&pem); + + /* + * PEM header and footer were found + */ + buflen -= use_len; + buf += use_len; + + if (first_error == 0) { + first_error = ret; + } + + total_failed++; + continue; + } else { + break; + } + + ret = mbedtls_x509_crt_parse_der(chain, pem.buf, pem.buflen); + + mbedtls_pem_free(&pem); + + if (ret != 0) { + /* + * Quit parsing on a memory error + */ + if (ret == MBEDTLS_ERR_X509_ALLOC_FAILED) { + return ret; + } + + if (first_error == 0) { + first_error = ret; + } + + total_failed++; + continue; + } + + success = 1; + } + } + + if (success) { + return total_failed; + } else if (first_error) { + return first_error; + } else { + return MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT; + } +#endif /* MBEDTLS_PEM_PARSE_C */ +} + +#if defined(MBEDTLS_FS_IO) +/* + * Load one or more certificates and add them to the chained list + */ +int mbedtls_x509_crt_parse_file(mbedtls_x509_crt *chain, const char *path) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n; + unsigned char *buf; + + if ((ret = mbedtls_pk_load_file(path, &buf, &n)) != 0) { + return ret; + } + + ret = mbedtls_x509_crt_parse(chain, buf, n); + + mbedtls_platform_zeroize(buf, n); + mbedtls_free(buf); + + return ret; +} + +int mbedtls_x509_crt_parse_path(mbedtls_x509_crt *chain, const char *path) +{ + int ret = 0; +#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) + int w_ret; + WCHAR szDir[MAX_PATH]; + char filename[MAX_PATH]; + char *p; + size_t len = strlen(path); + + WIN32_FIND_DATAW file_data; + HANDLE hFind; + + if (len > MAX_PATH - 3) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + memset(szDir, 0, sizeof(szDir)); + memset(filename, 0, MAX_PATH); + memcpy(filename, path, len); + filename[len++] = '\\'; + p = filename + len; + filename[len++] = '*'; + + w_ret = MultiByteToWideChar(CP_ACP, 0, filename, (int) len, szDir, + MAX_PATH - 3); + if (w_ret == 0) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + hFind = FindFirstFileW(szDir, &file_data); + if (hFind == INVALID_HANDLE_VALUE) { + return MBEDTLS_ERR_X509_FILE_IO_ERROR; + } + + len = MAX_PATH - len; + do { + memset(p, 0, len); + + if (file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + continue; + } + + w_ret = WideCharToMultiByte(CP_ACP, 0, file_data.cFileName, + -1, + p, (int) len, + NULL, NULL); + if (w_ret == 0) { + ret = MBEDTLS_ERR_X509_FILE_IO_ERROR; + goto cleanup; + } + + w_ret = mbedtls_x509_crt_parse_file(chain, filename); + if (w_ret < 0) { + ret++; + } else { + ret += w_ret; + } + } while (FindNextFileW(hFind, &file_data) != 0); + + if (GetLastError() != ERROR_NO_MORE_FILES) { + ret = MBEDTLS_ERR_X509_FILE_IO_ERROR; + } + +cleanup: + FindClose(hFind); +#else /* _WIN32 */ + int t_ret; + int snp_ret; + struct stat sb; + struct dirent *entry; + char entry_name[MBEDTLS_X509_MAX_FILE_PATH_LEN]; + DIR *dir = opendir(path); + + if (dir == NULL) { + return MBEDTLS_ERR_X509_FILE_IO_ERROR; + } + +#if defined(MBEDTLS_THREADING_C) + if ((ret = mbedtls_mutex_lock(&mbedtls_threading_readdir_mutex)) != 0) { + closedir(dir); + return ret; + } +#endif /* MBEDTLS_THREADING_C */ + + memset(&sb, 0, sizeof(sb)); + + while ((entry = readdir(dir)) != NULL) { + snp_ret = mbedtls_snprintf(entry_name, sizeof(entry_name), + "%s/%s", path, entry->d_name); + + if (snp_ret < 0 || (size_t) snp_ret >= sizeof(entry_name)) { + ret = MBEDTLS_ERR_X509_BUFFER_TOO_SMALL; + goto cleanup; + } else if (stat(entry_name, &sb) == -1) { + if (errno == ENOENT) { + /* Broken symbolic link - ignore this entry. + stat(2) will return this error for either (a) a dangling + symlink or (b) a missing file. + Given that we have just obtained the filename from readdir, + assume that it does exist and therefore treat this as a + dangling symlink. */ + continue; + } else { + /* Some other file error; report the error. */ + ret = MBEDTLS_ERR_X509_FILE_IO_ERROR; + goto cleanup; + } + } + + if (!S_ISREG(sb.st_mode)) { + continue; + } + + // Ignore parse errors + // + t_ret = mbedtls_x509_crt_parse_file(chain, entry_name); + if (t_ret < 0) { + ret++; + } else { + ret += t_ret; + } + } + +cleanup: + closedir(dir); + +#if defined(MBEDTLS_THREADING_C) + if (mbedtls_mutex_unlock(&mbedtls_threading_readdir_mutex) != 0) { + ret = MBEDTLS_ERR_THREADING_MUTEX_ERROR; + } +#endif /* MBEDTLS_THREADING_C */ + +#endif /* _WIN32 */ + + return ret; +} +#endif /* MBEDTLS_FS_IO */ + +/* + * OtherName ::= SEQUENCE { + * type-id OBJECT IDENTIFIER, + * value [0] EXPLICIT ANY DEFINED BY type-id } + * + * HardwareModuleName ::= SEQUENCE { + * hwType OBJECT IDENTIFIER, + * hwSerialNum OCTET STRING } + * + * NOTE: we currently only parse and use otherName of type HwModuleName, + * as defined in RFC 4108. + */ +static int x509_get_other_name(const mbedtls_x509_buf *subject_alt_name, + mbedtls_x509_san_other_name *other_name) +{ + int ret = 0; + size_t len; + unsigned char *p = subject_alt_name->p; + const unsigned char *end = p + subject_alt_name->len; + mbedtls_x509_buf cur_oid; + + if ((subject_alt_name->tag & + (MBEDTLS_ASN1_TAG_CLASS_MASK | MBEDTLS_ASN1_TAG_VALUE_MASK)) != + (MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_X509_SAN_OTHER_NAME)) { + /* + * The given subject alternative name is not of type "othername". + */ + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_OID)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + cur_oid.tag = MBEDTLS_ASN1_OID; + cur_oid.p = p; + cur_oid.len = len; + + /* + * Only HwModuleName is currently supported. + */ + if (MBEDTLS_OID_CMP(MBEDTLS_OID_ON_HW_MODULE_NAME, &cur_oid) != 0) { + return MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE; + } + other_name->type_id = cur_oid; + + p += len; + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC)) != + 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + if (end != p + len) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + if (end != p + len) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OID)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + other_name->value.hardware_module_name.oid.tag = MBEDTLS_ASN1_OID; + other_name->value.hardware_module_name.oid.p = p; + other_name->value.hardware_module_name.oid.len = len; + + p += len; + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_OCTET_STRING)) != 0) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret); + } + + other_name->value.hardware_module_name.val.tag = MBEDTLS_ASN1_OCTET_STRING; + other_name->value.hardware_module_name.val.p = p; + other_name->value.hardware_module_name.val.len = len; + p += len; + if (p != end) { + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_EXTENSIONS, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + return 0; +} + +static int x509_info_subject_alt_name(char **buf, size_t *size, + const mbedtls_x509_sequence + *subject_alt_name, + const char *prefix) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i; + size_t n = *size; + char *p = *buf; + const mbedtls_x509_sequence *cur = subject_alt_name; + mbedtls_x509_subject_alternative_name san; + int parse_ret; + + while (cur != NULL) { + memset(&san, 0, sizeof(san)); + parse_ret = mbedtls_x509_parse_subject_alt_name(&cur->buf, &san); + if (parse_ret != 0) { + if (parse_ret == MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE) { + ret = mbedtls_snprintf(p, n, "\n%s ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + } else { + ret = mbedtls_snprintf(p, n, "\n%s ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + } + cur = cur->next; + continue; + } + + switch (san.type) { + /* + * otherName + */ + case MBEDTLS_X509_SAN_OTHER_NAME: + { + mbedtls_x509_san_other_name *other_name = &san.san.other_name; + + ret = mbedtls_snprintf(p, n, "\n%s otherName :", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + if (MBEDTLS_OID_CMP(MBEDTLS_OID_ON_HW_MODULE_NAME, + &other_name->type_id) == 0) { + ret = mbedtls_snprintf(p, n, "\n%s hardware module name :", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + ret = + mbedtls_snprintf(p, n, "\n%s hardware type : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_oid_get_numeric_string(p, + n, + &other_name->value.hardware_module_name.oid); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = + mbedtls_snprintf(p, n, "\n%s hardware serial number : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + for (i = 0; i < other_name->value.hardware_module_name.val.len; i++) { + ret = mbedtls_snprintf(p, + n, + "%02X", + other_name->value.hardware_module_name.val.p[i]); + MBEDTLS_X509_SAFE_SNPRINTF; + } + }/* MBEDTLS_OID_ON_HW_MODULE_NAME */ + } + break; + + /* + * dNSName + */ + case MBEDTLS_X509_SAN_DNS_NAME: + { + ret = mbedtls_snprintf(p, n, "\n%s dNSName : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + if (san.san.unstructured_name.len >= n) { + *p = '\0'; + return MBEDTLS_ERR_X509_BUFFER_TOO_SMALL; + } + + memcpy(p, san.san.unstructured_name.p, san.san.unstructured_name.len); + p += san.san.unstructured_name.len; + n -= san.san.unstructured_name.len; + } + break; + + /* + * Type not supported, skip item. + */ + default: + ret = mbedtls_snprintf(p, n, "\n%s ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + break; + } + + cur = cur->next; + } + + *p = '\0'; + + *size = n; + *buf = p; + + return 0; +} + +int mbedtls_x509_parse_subject_alt_name(const mbedtls_x509_buf *san_buf, + mbedtls_x509_subject_alternative_name *san) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + switch (san_buf->tag & + (MBEDTLS_ASN1_TAG_CLASS_MASK | + MBEDTLS_ASN1_TAG_VALUE_MASK)) { + /* + * otherName + */ + case (MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_X509_SAN_OTHER_NAME): + { + mbedtls_x509_san_other_name other_name; + + ret = x509_get_other_name(san_buf, &other_name); + if (ret != 0) { + return ret; + } + + memset(san, 0, sizeof(mbedtls_x509_subject_alternative_name)); + san->type = MBEDTLS_X509_SAN_OTHER_NAME; + memcpy(&san->san.other_name, + &other_name, sizeof(other_name)); + + } + break; + + /* + * dNSName + */ + case (MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_X509_SAN_DNS_NAME): + { + memset(san, 0, sizeof(mbedtls_x509_subject_alternative_name)); + san->type = MBEDTLS_X509_SAN_DNS_NAME; + + memcpy(&san->san.unstructured_name, + san_buf, sizeof(*san_buf)); + + } + break; + + /* + * Type not supported + */ + default: + return MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE; + } + return 0; +} + +#define PRINT_ITEM(i) \ + do { \ + ret = mbedtls_snprintf(p, n, "%s" i, sep); \ + MBEDTLS_X509_SAFE_SNPRINTF; \ + sep = ", "; \ + } while (0) + +#define CERT_TYPE(type, name) \ + do { \ + if (ns_cert_type & (type)) { \ + PRINT_ITEM(name); \ + } \ + } while (0) + +static int x509_info_cert_type(char **buf, size_t *size, + unsigned char ns_cert_type) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n = *size; + char *p = *buf; + const char *sep = ""; + + CERT_TYPE(MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT, "SSL Client"); + CERT_TYPE(MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER, "SSL Server"); + CERT_TYPE(MBEDTLS_X509_NS_CERT_TYPE_EMAIL, "Email"); + CERT_TYPE(MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING, "Object Signing"); + CERT_TYPE(MBEDTLS_X509_NS_CERT_TYPE_RESERVED, "Reserved"); + CERT_TYPE(MBEDTLS_X509_NS_CERT_TYPE_SSL_CA, "SSL CA"); + CERT_TYPE(MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA, "Email CA"); + CERT_TYPE(MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA, "Object Signing CA"); + + *size = n; + *buf = p; + + return 0; +} + +#define KEY_USAGE(code, name) \ + do { \ + if (key_usage & (code)) { \ + PRINT_ITEM(name); \ + } \ + } while (0) + +static int x509_info_key_usage(char **buf, size_t *size, + unsigned int key_usage) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n = *size; + char *p = *buf; + const char *sep = ""; + + KEY_USAGE(MBEDTLS_X509_KU_DIGITAL_SIGNATURE, "Digital Signature"); + KEY_USAGE(MBEDTLS_X509_KU_NON_REPUDIATION, "Non Repudiation"); + KEY_USAGE(MBEDTLS_X509_KU_KEY_ENCIPHERMENT, "Key Encipherment"); + KEY_USAGE(MBEDTLS_X509_KU_DATA_ENCIPHERMENT, "Data Encipherment"); + KEY_USAGE(MBEDTLS_X509_KU_KEY_AGREEMENT, "Key Agreement"); + KEY_USAGE(MBEDTLS_X509_KU_KEY_CERT_SIGN, "Key Cert Sign"); + KEY_USAGE(MBEDTLS_X509_KU_CRL_SIGN, "CRL Sign"); + KEY_USAGE(MBEDTLS_X509_KU_ENCIPHER_ONLY, "Encipher Only"); + KEY_USAGE(MBEDTLS_X509_KU_DECIPHER_ONLY, "Decipher Only"); + + *size = n; + *buf = p; + + return 0; +} + +static int x509_info_ext_key_usage(char **buf, size_t *size, + const mbedtls_x509_sequence *extended_key_usage) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const char *desc; + size_t n = *size; + char *p = *buf; + const mbedtls_x509_sequence *cur = extended_key_usage; + const char *sep = ""; + + while (cur != NULL) { + if (mbedtls_oid_get_extended_key_usage(&cur->buf, &desc) != 0) { + desc = "???"; + } + + ret = mbedtls_snprintf(p, n, "%s%s", sep, desc); + MBEDTLS_X509_SAFE_SNPRINTF; + + sep = ", "; + + cur = cur->next; + } + + *size = n; + *buf = p; + + return 0; +} + +static int x509_info_cert_policies(char **buf, size_t *size, + const mbedtls_x509_sequence *certificate_policies) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const char *desc; + size_t n = *size; + char *p = *buf; + const mbedtls_x509_sequence *cur = certificate_policies; + const char *sep = ""; + + while (cur != NULL) { + if (mbedtls_oid_get_certificate_policies(&cur->buf, &desc) != 0) { + desc = "???"; + } + + ret = mbedtls_snprintf(p, n, "%s%s", sep, desc); + MBEDTLS_X509_SAFE_SNPRINTF; + + sep = ", "; + + cur = cur->next; + } + + *size = n; + *buf = p; + + return 0; +} + +/* + * Return an informational string about the certificate. + */ +#define BEFORE_COLON 18 +#define BC "18" +int mbedtls_x509_crt_info(char *buf, size_t size, const char *prefix, + const mbedtls_x509_crt *crt) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n; + char *p; + char key_size_str[BEFORE_COLON]; + + p = buf; + n = size; + + if (NULL == crt) { + ret = mbedtls_snprintf(p, n, "\nCertificate is uninitialised!\n"); + MBEDTLS_X509_SAFE_SNPRINTF; + + return (int) (size - n); + } + + ret = mbedtls_snprintf(p, n, "%scert. version : %d\n", + prefix, crt->version); + MBEDTLS_X509_SAFE_SNPRINTF; + ret = mbedtls_snprintf(p, n, "%sserial number : ", + prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_x509_serial_gets(p, n, &crt->serial); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_snprintf(p, n, "\n%sissuer name : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + ret = mbedtls_x509_dn_gets(p, n, &crt->issuer); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_snprintf(p, n, "\n%ssubject name : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + ret = mbedtls_x509_dn_gets(p, n, &crt->subject); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_snprintf(p, n, "\n%sissued on : " \ + "%04d-%02d-%02d %02d:%02d:%02d", prefix, + crt->valid_from.year, crt->valid_from.mon, + crt->valid_from.day, crt->valid_from.hour, + crt->valid_from.min, crt->valid_from.sec); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_snprintf(p, n, "\n%sexpires on : " \ + "%04d-%02d-%02d %02d:%02d:%02d", prefix, + crt->valid_to.year, crt->valid_to.mon, + crt->valid_to.day, crt->valid_to.hour, + crt->valid_to.min, crt->valid_to.sec); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_snprintf(p, n, "\n%ssigned using : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_x509_sig_alg_gets(p, n, &crt->sig_oid, crt->sig_pk, + crt->sig_md, crt->sig_opts); + MBEDTLS_X509_SAFE_SNPRINTF; + + /* Key size */ + if ((ret = mbedtls_x509_key_size_helper(key_size_str, BEFORE_COLON, + mbedtls_pk_get_name(&crt->pk))) != 0) { + return ret; + } + + ret = mbedtls_snprintf(p, n, "\n%s%-" BC "s: %d bits", prefix, key_size_str, + (int) mbedtls_pk_get_bitlen(&crt->pk)); + MBEDTLS_X509_SAFE_SNPRINTF; + + /* + * Optional extensions + */ + + if (crt->ext_types & MBEDTLS_X509_EXT_BASIC_CONSTRAINTS) { + ret = mbedtls_snprintf(p, n, "\n%sbasic constraints : CA=%s", prefix, + crt->ca_istrue ? "true" : "false"); + MBEDTLS_X509_SAFE_SNPRINTF; + + if (crt->max_pathlen > 0) { + ret = mbedtls_snprintf(p, n, ", max_pathlen=%d", crt->max_pathlen - 1); + MBEDTLS_X509_SAFE_SNPRINTF; + } + } + + if (crt->ext_types & MBEDTLS_X509_EXT_SUBJECT_ALT_NAME) { + ret = mbedtls_snprintf(p, n, "\n%ssubject alt name :", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + if ((ret = x509_info_subject_alt_name(&p, &n, + &crt->subject_alt_names, + prefix)) != 0) { + return ret; + } + } + + if (crt->ext_types & MBEDTLS_X509_EXT_NS_CERT_TYPE) { + ret = mbedtls_snprintf(p, n, "\n%scert. type : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + if ((ret = x509_info_cert_type(&p, &n, crt->ns_cert_type)) != 0) { + return ret; + } + } + + if (crt->ext_types & MBEDTLS_X509_EXT_KEY_USAGE) { + ret = mbedtls_snprintf(p, n, "\n%skey usage : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + if ((ret = x509_info_key_usage(&p, &n, crt->key_usage)) != 0) { + return ret; + } + } + + if (crt->ext_types & MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE) { + ret = mbedtls_snprintf(p, n, "\n%sext key usage : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + if ((ret = x509_info_ext_key_usage(&p, &n, + &crt->ext_key_usage)) != 0) { + return ret; + } + } + + if (crt->ext_types & MBEDTLS_OID_X509_EXT_CERTIFICATE_POLICIES) { + ret = mbedtls_snprintf(p, n, "\n%scertificate policies : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + if ((ret = x509_info_cert_policies(&p, &n, + &crt->certificate_policies)) != 0) { + return ret; + } + } + + ret = mbedtls_snprintf(p, n, "\n"); + MBEDTLS_X509_SAFE_SNPRINTF; + + return (int) (size - n); +} + +struct x509_crt_verify_string { + int code; + const char *string; +}; + +static const struct x509_crt_verify_string x509_crt_verify_strings[] = { + { MBEDTLS_X509_BADCERT_EXPIRED, "The certificate validity has expired" }, + { MBEDTLS_X509_BADCERT_REVOKED, "The certificate has been revoked (is on a CRL)" }, + { MBEDTLS_X509_BADCERT_CN_MISMATCH, + "The certificate Common Name (CN) does not match with the expected CN" }, + { MBEDTLS_X509_BADCERT_NOT_TRUSTED, + "The certificate is not correctly signed by the trusted CA" }, + { MBEDTLS_X509_BADCRL_NOT_TRUSTED, "The CRL is not correctly signed by the trusted CA" }, + { MBEDTLS_X509_BADCRL_EXPIRED, "The CRL is expired" }, + { MBEDTLS_X509_BADCERT_MISSING, "Certificate was missing" }, + { MBEDTLS_X509_BADCERT_SKIP_VERIFY, "Certificate verification was skipped" }, + { MBEDTLS_X509_BADCERT_OTHER, "Other reason (can be used by verify callback)" }, + { MBEDTLS_X509_BADCERT_FUTURE, "The certificate validity starts in the future" }, + { MBEDTLS_X509_BADCRL_FUTURE, "The CRL is from the future" }, + { MBEDTLS_X509_BADCERT_KEY_USAGE, "Usage does not match the keyUsage extension" }, + { MBEDTLS_X509_BADCERT_EXT_KEY_USAGE, "Usage does not match the extendedKeyUsage extension" }, + { MBEDTLS_X509_BADCERT_NS_CERT_TYPE, "Usage does not match the nsCertType extension" }, + { MBEDTLS_X509_BADCERT_BAD_MD, "The certificate is signed with an unacceptable hash." }, + { MBEDTLS_X509_BADCERT_BAD_PK, + "The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA)." }, + { MBEDTLS_X509_BADCERT_BAD_KEY, + "The certificate is signed with an unacceptable key (eg bad curve, RSA too short)." }, + { MBEDTLS_X509_BADCRL_BAD_MD, "The CRL is signed with an unacceptable hash." }, + { MBEDTLS_X509_BADCRL_BAD_PK, + "The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA)." }, + { MBEDTLS_X509_BADCRL_BAD_KEY, + "The CRL is signed with an unacceptable key (eg bad curve, RSA too short)." }, + { 0, NULL } +}; + +int mbedtls_x509_crt_verify_info(char *buf, size_t size, const char *prefix, + uint32_t flags) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const struct x509_crt_verify_string *cur; + char *p = buf; + size_t n = size; + + for (cur = x509_crt_verify_strings; cur->string != NULL; cur++) { + if ((flags & cur->code) == 0) { + continue; + } + + ret = mbedtls_snprintf(p, n, "%s%s\n", prefix, cur->string); + MBEDTLS_X509_SAFE_SNPRINTF; + flags ^= cur->code; + } + + if (flags != 0) { + ret = mbedtls_snprintf(p, n, "%sUnknown reason " + "(this should not happen)\n", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + } + + return (int) (size - n); +} + +#if defined(MBEDTLS_X509_CHECK_KEY_USAGE) +int mbedtls_x509_crt_check_key_usage(const mbedtls_x509_crt *crt, + unsigned int usage) +{ + unsigned int usage_must, usage_may; + unsigned int may_mask = MBEDTLS_X509_KU_ENCIPHER_ONLY + | MBEDTLS_X509_KU_DECIPHER_ONLY; + + if ((crt->ext_types & MBEDTLS_X509_EXT_KEY_USAGE) == 0) { + return 0; + } + + usage_must = usage & ~may_mask; + + if (((crt->key_usage & ~may_mask) & usage_must) != usage_must) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + usage_may = usage & may_mask; + + if (((crt->key_usage & may_mask) | usage_may) != usage_may) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + return 0; +} +#endif + +#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) +int mbedtls_x509_crt_check_extended_key_usage(const mbedtls_x509_crt *crt, + const char *usage_oid, + size_t usage_len) +{ + const mbedtls_x509_sequence *cur; + + /* Extension is not mandatory, absent means no restriction */ + if ((crt->ext_types & MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE) == 0) { + return 0; + } + + /* + * Look for the requested usage (or wildcard ANY) in our list + */ + for (cur = &crt->ext_key_usage; cur != NULL; cur = cur->next) { + const mbedtls_x509_buf *cur_oid = &cur->buf; + + if (cur_oid->len == usage_len && + memcmp(cur_oid->p, usage_oid, usage_len) == 0) { + return 0; + } + + if (MBEDTLS_OID_CMP(MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE, cur_oid) == 0) { + return 0; + } + } + + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; +} +#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */ + +#if defined(MBEDTLS_X509_CRL_PARSE_C) +/* + * Return 1 if the certificate is revoked, or 0 otherwise. + */ +int mbedtls_x509_crt_is_revoked(const mbedtls_x509_crt *crt, const mbedtls_x509_crl *crl) +{ + const mbedtls_x509_crl_entry *cur = &crl->entry; + + while (cur != NULL && cur->serial.len != 0) { + if (crt->serial.len == cur->serial.len && + memcmp(crt->serial.p, cur->serial.p, crt->serial.len) == 0) { + return 1; + } + + cur = cur->next; + } + + return 0; +} + +/* + * Check that the given certificate is not revoked according to the CRL. + * Skip validation if no CRL for the given CA is present. + */ +static int x509_crt_verifycrl(mbedtls_x509_crt *crt, mbedtls_x509_crt *ca, + mbedtls_x509_crl *crl_list, + const mbedtls_x509_crt_profile *profile) +{ + int flags = 0; + unsigned char hash[MBEDTLS_MD_MAX_SIZE]; + const mbedtls_md_info_t *md_info; + + if (ca == NULL) { + return flags; + } + + while (crl_list != NULL) { + if (crl_list->version == 0 || + x509_name_cmp(&crl_list->issuer, &ca->subject) != 0) { + crl_list = crl_list->next; + continue; + } + + /* + * Check if the CA is configured to sign CRLs + */ +#if defined(MBEDTLS_X509_CHECK_KEY_USAGE) + if (mbedtls_x509_crt_check_key_usage(ca, + MBEDTLS_X509_KU_CRL_SIGN) != 0) { + flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED; + break; + } +#endif + + /* + * Check if CRL is correctly signed by the trusted CA + */ + if (x509_profile_check_md_alg(profile, crl_list->sig_md) != 0) { + flags |= MBEDTLS_X509_BADCRL_BAD_MD; + } + + if (x509_profile_check_pk_alg(profile, crl_list->sig_pk) != 0) { + flags |= MBEDTLS_X509_BADCRL_BAD_PK; + } + + md_info = mbedtls_md_info_from_type(crl_list->sig_md); + if (mbedtls_md(md_info, crl_list->tbs.p, crl_list->tbs.len, hash) != 0) { + /* Note: this can't happen except after an internal error */ + flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED; + break; + } + + if (x509_profile_check_key(profile, &ca->pk) != 0) { + flags |= MBEDTLS_X509_BADCERT_BAD_KEY; + } + + if (mbedtls_pk_verify_ext(crl_list->sig_pk, crl_list->sig_opts, &ca->pk, + crl_list->sig_md, hash, mbedtls_md_get_size(md_info), + crl_list->sig.p, crl_list->sig.len) != 0) { + flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED; + break; + } + + /* + * Check for validity of CRL (Do not drop out) + */ + if (mbedtls_x509_time_is_past(&crl_list->next_update)) { + flags |= MBEDTLS_X509_BADCRL_EXPIRED; + } + + if (mbedtls_x509_time_is_future(&crl_list->this_update)) { + flags |= MBEDTLS_X509_BADCRL_FUTURE; + } + + /* + * Check if certificate is revoked + */ + if (mbedtls_x509_crt_is_revoked(crt, crl_list)) { + flags |= MBEDTLS_X509_BADCERT_REVOKED; + break; + } + + crl_list = crl_list->next; + } + + return flags; +} +#endif /* MBEDTLS_X509_CRL_PARSE_C */ + +/* + * Check the signature of a certificate by its parent + */ +static int x509_crt_check_signature(const mbedtls_x509_crt *child, + mbedtls_x509_crt *parent, + mbedtls_x509_crt_restart_ctx *rs_ctx) +{ + unsigned char hash[MBEDTLS_MD_MAX_SIZE]; + size_t hash_len; +#if !defined(MBEDTLS_USE_PSA_CRYPTO) + const mbedtls_md_info_t *md_info; + md_info = mbedtls_md_info_from_type(child->sig_md); + hash_len = mbedtls_md_get_size(md_info); + + /* Note: hash errors can happen only after an internal error */ + if (mbedtls_md(md_info, child->tbs.p, child->tbs.len, hash) != 0) { + return -1; + } +#else + psa_hash_operation_t hash_operation = PSA_HASH_OPERATION_INIT; + psa_algorithm_t hash_alg = mbedtls_psa_translate_md(child->sig_md); + + if (psa_hash_setup(&hash_operation, hash_alg) != PSA_SUCCESS) { + return -1; + } + + if (psa_hash_update(&hash_operation, child->tbs.p, child->tbs.len) + != PSA_SUCCESS) { + return -1; + } + + if (psa_hash_finish(&hash_operation, hash, sizeof(hash), &hash_len) + != PSA_SUCCESS) { + return -1; + } +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + /* Skip expensive computation on obvious mismatch */ + if (!mbedtls_pk_can_do(&parent->pk, child->sig_pk)) { + return -1; + } + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && child->sig_pk == MBEDTLS_PK_ECDSA) { + return mbedtls_pk_verify_restartable(&parent->pk, + child->sig_md, hash, hash_len, + child->sig.p, child->sig.len, &rs_ctx->pk); + } +#else + (void) rs_ctx; +#endif + + return mbedtls_pk_verify_ext(child->sig_pk, child->sig_opts, &parent->pk, + child->sig_md, hash, hash_len, + child->sig.p, child->sig.len); +} + +/* + * Check if 'parent' is a suitable parent (signing CA) for 'child'. + * Return 0 if yes, -1 if not. + * + * top means parent is a locally-trusted certificate + */ +static int x509_crt_check_parent(const mbedtls_x509_crt *child, + const mbedtls_x509_crt *parent, + int top) +{ + int need_ca_bit; + + /* Parent must be the issuer */ + if (x509_name_cmp(&child->issuer, &parent->subject) != 0) { + return -1; + } + + /* Parent must have the basicConstraints CA bit set as a general rule */ + need_ca_bit = 1; + + /* Exception: v1/v2 certificates that are locally trusted. */ + if (top && parent->version < 3) { + need_ca_bit = 0; + } + + if (need_ca_bit && !parent->ca_istrue) { + return -1; + } + +#if defined(MBEDTLS_X509_CHECK_KEY_USAGE) + if (need_ca_bit && + mbedtls_x509_crt_check_key_usage(parent, MBEDTLS_X509_KU_KEY_CERT_SIGN) != 0) { + return -1; + } +#endif + + return 0; +} + +/* + * Find a suitable parent for child in candidates, or return NULL. + * + * Here suitable is defined as: + * 1. subject name matches child's issuer + * 2. if necessary, the CA bit is set and key usage allows signing certs + * 3. for trusted roots, the signature is correct + * (for intermediates, the signature is checked and the result reported) + * 4. pathlen constraints are satisfied + * + * If there's a suitable candidate which is also time-valid, return the first + * such. Otherwise, return the first suitable candidate (or NULL if there is + * none). + * + * The rationale for this rule is that someone could have a list of trusted + * roots with two versions on the same root with different validity periods. + * (At least one user reported having such a list and wanted it to just work.) + * The reason we don't just require time-validity is that generally there is + * only one version, and if it's expired we want the flags to state that + * rather than NOT_TRUSTED, as would be the case if we required it here. + * + * The rationale for rule 3 (signature for trusted roots) is that users might + * have two versions of the same CA with different keys in their list, and the + * way we select the correct one is by checking the signature (as we don't + * rely on key identifier extensions). (This is one way users might choose to + * handle key rollover, another relies on self-issued certs, see [SIRO].) + * + * Arguments: + * - [in] child: certificate for which we're looking for a parent + * - [in] candidates: chained list of potential parents + * - [out] r_parent: parent found (or NULL) + * - [out] r_signature_is_good: 1 if child signature by parent is valid, or 0 + * - [in] top: 1 if candidates consists of trusted roots, ie we're at the top + * of the chain, 0 otherwise + * - [in] path_cnt: number of intermediates seen so far + * - [in] self_cnt: number of self-signed intermediates seen so far + * (will never be greater than path_cnt) + * - [in-out] rs_ctx: context for restarting operations + * + * Return value: + * - 0 on success + * - MBEDTLS_ERR_ECP_IN_PROGRESS otherwise + */ +static int x509_crt_find_parent_in( + mbedtls_x509_crt *child, + mbedtls_x509_crt *candidates, + mbedtls_x509_crt **r_parent, + int *r_signature_is_good, + int top, + unsigned path_cnt, + unsigned self_cnt, + mbedtls_x509_crt_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_x509_crt *parent, *fallback_parent; + int signature_is_good = 0, fallback_signature_is_good; + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + /* did we have something in progress? */ + if (rs_ctx != NULL && rs_ctx->parent != NULL) { + /* restore saved state */ + parent = rs_ctx->parent; + fallback_parent = rs_ctx->fallback_parent; + fallback_signature_is_good = rs_ctx->fallback_signature_is_good; + + /* clear saved state */ + rs_ctx->parent = NULL; + rs_ctx->fallback_parent = NULL; + rs_ctx->fallback_signature_is_good = 0; + + /* resume where we left */ + goto check_signature; + } +#endif + + fallback_parent = NULL; + fallback_signature_is_good = 0; + + for (parent = candidates; parent != NULL; parent = parent->next) { + /* basic parenting skills (name, CA bit, key usage) */ + if (x509_crt_check_parent(child, parent, top) != 0) { + continue; + } + + /* +1 because stored max_pathlen is 1 higher that the actual value */ + if (parent->max_pathlen > 0 && + (size_t) parent->max_pathlen < 1 + path_cnt - self_cnt) { + continue; + } + + /* Signature */ +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) +check_signature: +#endif + ret = x509_crt_check_signature(child, parent, rs_ctx); + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS) { + /* save state */ + rs_ctx->parent = parent; + rs_ctx->fallback_parent = fallback_parent; + rs_ctx->fallback_signature_is_good = fallback_signature_is_good; + + return ret; + } +#else + (void) ret; +#endif + + signature_is_good = ret == 0; + if (top && !signature_is_good) { + continue; + } + + /* optional time check */ + if (mbedtls_x509_time_is_past(&parent->valid_to) || + mbedtls_x509_time_is_future(&parent->valid_from)) { + if (fallback_parent == NULL) { + fallback_parent = parent; + fallback_signature_is_good = signature_is_good; + } + + continue; + } + + *r_parent = parent; + *r_signature_is_good = signature_is_good; + + break; + } + + if (parent == NULL) { + *r_parent = fallback_parent; + *r_signature_is_good = fallback_signature_is_good; + } + + return 0; +} + +/* + * Find a parent in trusted CAs or the provided chain, or return NULL. + * + * Searches in trusted CAs first, and return the first suitable parent found + * (see find_parent_in() for definition of suitable). + * + * Arguments: + * - [in] child: certificate for which we're looking for a parent, followed + * by a chain of possible intermediates + * - [in] trust_ca: list of locally trusted certificates + * - [out] parent: parent found (or NULL) + * - [out] parent_is_trusted: 1 if returned `parent` is trusted, or 0 + * - [out] signature_is_good: 1 if child signature by parent is valid, or 0 + * - [in] path_cnt: number of links in the chain so far (EE -> ... -> child) + * - [in] self_cnt: number of self-signed certs in the chain so far + * (will always be no greater than path_cnt) + * - [in-out] rs_ctx: context for restarting operations + * + * Return value: + * - 0 on success + * - MBEDTLS_ERR_ECP_IN_PROGRESS otherwise + */ +static int x509_crt_find_parent( + mbedtls_x509_crt *child, + mbedtls_x509_crt *trust_ca, + mbedtls_x509_crt **parent, + int *parent_is_trusted, + int *signature_is_good, + unsigned path_cnt, + unsigned self_cnt, + mbedtls_x509_crt_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_x509_crt *search_list; + + *parent_is_trusted = 1; + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + /* restore then clear saved state if we have some stored */ + if (rs_ctx != NULL && rs_ctx->parent_is_trusted != -1) { + *parent_is_trusted = rs_ctx->parent_is_trusted; + rs_ctx->parent_is_trusted = -1; + } +#endif + + while (1) { + search_list = *parent_is_trusted ? trust_ca : child->next; + + ret = x509_crt_find_parent_in(child, search_list, + parent, signature_is_good, + *parent_is_trusted, + path_cnt, self_cnt, rs_ctx); + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS) { + /* save state */ + rs_ctx->parent_is_trusted = *parent_is_trusted; + return ret; + } +#else + (void) ret; +#endif + + /* stop here if found or already in second iteration */ + if (*parent != NULL || *parent_is_trusted == 0) { + break; + } + + /* prepare second iteration */ + *parent_is_trusted = 0; + } + + /* extra precaution against mistakes in the caller */ + if (*parent == NULL) { + *parent_is_trusted = 0; + *signature_is_good = 0; + } + + return 0; +} + +/* + * Check if an end-entity certificate is locally trusted + * + * Currently we require such certificates to be self-signed (actually only + * check for self-issued as self-signatures are not checked) + */ +static int x509_crt_check_ee_locally_trusted( + mbedtls_x509_crt *crt, + mbedtls_x509_crt *trust_ca) +{ + mbedtls_x509_crt *cur; + + /* must be self-issued */ + if (x509_name_cmp(&crt->issuer, &crt->subject) != 0) { + return -1; + } + + /* look for an exact match with trusted cert */ + for (cur = trust_ca; cur != NULL; cur = cur->next) { + if (crt->raw.len == cur->raw.len && + memcmp(crt->raw.p, cur->raw.p, crt->raw.len) == 0) { + return 0; + } + } + + /* too bad */ + return -1; +} + +/* + * Build and verify a certificate chain + * + * Given a peer-provided list of certificates EE, C1, ..., Cn and + * a list of trusted certs R1, ... Rp, try to build and verify a chain + * EE, Ci1, ... Ciq [, Rj] + * such that every cert in the chain is a child of the next one, + * jumping to a trusted root as early as possible. + * + * Verify that chain and return it with flags for all issues found. + * + * Special cases: + * - EE == Rj -> return a one-element list containing it + * - EE, Ci1, ..., Ciq cannot be continued with a trusted root + * -> return that chain with NOT_TRUSTED set on Ciq + * + * Tests for (aspects of) this function should include at least: + * - trusted EE + * - EE -> trusted root + * - EE -> intermediate CA -> trusted root + * - if relevant: EE untrusted + * - if relevant: EE -> intermediate, untrusted + * with the aspect under test checked at each relevant level (EE, int, root). + * For some aspects longer chains are required, but usually length 2 is + * enough (but length 1 is not in general). + * + * Arguments: + * - [in] crt: the cert list EE, C1, ..., Cn + * - [in] trust_ca: the trusted list R1, ..., Rp + * - [in] ca_crl, profile: as in verify_with_profile() + * - [out] ver_chain: the built and verified chain + * Only valid when return value is 0, may contain garbage otherwise! + * Restart note: need not be the same when calling again to resume. + * - [in-out] rs_ctx: context for restarting operations + * + * Return value: + * - non-zero if the chain could not be fully built and examined + * - 0 is the chain was successfully built and examined, + * even if it was found to be invalid + */ +static int x509_crt_verify_chain( + mbedtls_x509_crt *crt, + mbedtls_x509_crt *trust_ca, + mbedtls_x509_crl *ca_crl, + mbedtls_x509_crt_ca_cb_t f_ca_cb, + void *p_ca_cb, + const mbedtls_x509_crt_profile *profile, + mbedtls_x509_crt_verify_chain *ver_chain, + mbedtls_x509_crt_restart_ctx *rs_ctx) +{ + /* Don't initialize any of those variables here, so that the compiler can + * catch potential issues with jumping ahead when restarting */ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + uint32_t *flags; + mbedtls_x509_crt_verify_chain_item *cur; + mbedtls_x509_crt *child; + mbedtls_x509_crt *parent; + int parent_is_trusted; + int child_is_trusted; + int signature_is_good; + unsigned self_cnt; + mbedtls_x509_crt *cur_trust_ca = NULL; + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + /* resume if we had an operation in progress */ + if (rs_ctx != NULL && rs_ctx->in_progress == x509_crt_rs_find_parent) { + /* restore saved state */ + *ver_chain = rs_ctx->ver_chain; /* struct copy */ + self_cnt = rs_ctx->self_cnt; + + /* restore derived state */ + cur = &ver_chain->items[ver_chain->len - 1]; + child = cur->crt; + flags = &cur->flags; + + goto find_parent; + } +#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + + child = crt; + self_cnt = 0; + parent_is_trusted = 0; + child_is_trusted = 0; + + while (1) { + /* Add certificate to the verification chain */ + cur = &ver_chain->items[ver_chain->len]; + cur->crt = child; + cur->flags = 0; + ver_chain->len++; + flags = &cur->flags; + + /* Check time-validity (all certificates) */ + if (mbedtls_x509_time_is_past(&child->valid_to)) { + *flags |= MBEDTLS_X509_BADCERT_EXPIRED; + } + + if (mbedtls_x509_time_is_future(&child->valid_from)) { + *flags |= MBEDTLS_X509_BADCERT_FUTURE; + } + + /* Stop here for trusted roots (but not for trusted EE certs) */ + if (child_is_trusted) { + return 0; + } + + /* Check signature algorithm: MD & PK algs */ + if (x509_profile_check_md_alg(profile, child->sig_md) != 0) { + *flags |= MBEDTLS_X509_BADCERT_BAD_MD; + } + + if (x509_profile_check_pk_alg(profile, child->sig_pk) != 0) { + *flags |= MBEDTLS_X509_BADCERT_BAD_PK; + } + + /* Special case: EE certs that are locally trusted */ + if (ver_chain->len == 1 && + x509_crt_check_ee_locally_trusted(child, trust_ca) == 0) { + return 0; + } + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) +find_parent: +#endif + + /* Obtain list of potential trusted signers from CA callback, + * or use statically provided list. */ +#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) + if (f_ca_cb != NULL) { + mbedtls_x509_crt_free(ver_chain->trust_ca_cb_result); + mbedtls_free(ver_chain->trust_ca_cb_result); + ver_chain->trust_ca_cb_result = NULL; + + ret = f_ca_cb(p_ca_cb, child, &ver_chain->trust_ca_cb_result); + if (ret != 0) { + return MBEDTLS_ERR_X509_FATAL_ERROR; + } + + cur_trust_ca = ver_chain->trust_ca_cb_result; + } else +#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ + { + ((void) f_ca_cb); + ((void) p_ca_cb); + cur_trust_ca = trust_ca; + } + + /* Look for a parent in trusted CAs or up the chain */ + ret = x509_crt_find_parent(child, cur_trust_ca, &parent, + &parent_is_trusted, &signature_is_good, + ver_chain->len - 1, self_cnt, rs_ctx); + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS) { + /* save state */ + rs_ctx->in_progress = x509_crt_rs_find_parent; + rs_ctx->self_cnt = self_cnt; + rs_ctx->ver_chain = *ver_chain; /* struct copy */ + + return ret; + } +#else + (void) ret; +#endif + + /* No parent? We're done here */ + if (parent == NULL) { + *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED; + return 0; + } + + /* Count intermediate self-issued (not necessarily self-signed) certs. + * These can occur with some strategies for key rollover, see [SIRO], + * and should be excluded from max_pathlen checks. */ + if (ver_chain->len != 1 && + x509_name_cmp(&child->issuer, &child->subject) == 0) { + self_cnt++; + } + + /* path_cnt is 0 for the first intermediate CA, + * and if parent is trusted it's not an intermediate CA */ + if (!parent_is_trusted && + ver_chain->len > MBEDTLS_X509_MAX_INTERMEDIATE_CA) { + /* return immediately to avoid overflow the chain array */ + return MBEDTLS_ERR_X509_FATAL_ERROR; + } + + /* signature was checked while searching parent */ + if (!signature_is_good) { + *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED; + } + + /* check size of signing key */ + if (x509_profile_check_key(profile, &parent->pk) != 0) { + *flags |= MBEDTLS_X509_BADCERT_BAD_KEY; + } + +#if defined(MBEDTLS_X509_CRL_PARSE_C) + /* Check trusted CA's CRL for the given crt */ + *flags |= x509_crt_verifycrl(child, parent, ca_crl, profile); +#else + (void) ca_crl; +#endif + + /* prepare for next iteration */ + child = parent; + parent = NULL; + child_is_trusted = parent_is_trusted; + signature_is_good = 0; + } +} + +/* + * Check for CN match + */ +static int x509_crt_check_cn(const mbedtls_x509_buf *name, + const char *cn, size_t cn_len) +{ + /* try exact match */ + if (name->len == cn_len && + x509_memcasecmp(cn, name->p, cn_len) == 0) { + return 0; + } + + /* try wildcard match */ + if (x509_check_wildcard(cn, name) == 0) { + return 0; + } + + return -1; +} + +/* + * Check for SAN match, see RFC 5280 Section 4.2.1.6 + */ +static int x509_crt_check_san(const mbedtls_x509_buf *name, + const char *cn, size_t cn_len) +{ + const unsigned char san_type = (unsigned char) name->tag & + MBEDTLS_ASN1_TAG_VALUE_MASK; + + /* dNSName */ + if (san_type == MBEDTLS_X509_SAN_DNS_NAME) { + return x509_crt_check_cn(name, cn, cn_len); + } + + /* (We may handle other types here later.) */ + + /* Unrecognized type */ + return -1; +} + +/* + * Verify the requested CN - only call this if cn is not NULL! + */ +static void x509_crt_verify_name(const mbedtls_x509_crt *crt, + const char *cn, + uint32_t *flags) +{ + const mbedtls_x509_name *name; + const mbedtls_x509_sequence *cur; + size_t cn_len = strlen(cn); + + if (crt->ext_types & MBEDTLS_X509_EXT_SUBJECT_ALT_NAME) { + for (cur = &crt->subject_alt_names; cur != NULL; cur = cur->next) { + if (x509_crt_check_san(&cur->buf, cn, cn_len) == 0) { + break; + } + } + + if (cur == NULL) { + *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; + } + } else { + for (name = &crt->subject; name != NULL; name = name->next) { + if (MBEDTLS_OID_CMP(MBEDTLS_OID_AT_CN, &name->oid) == 0 && + x509_crt_check_cn(&name->val, cn, cn_len) == 0) { + break; + } + } + + if (name == NULL) { + *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; + } + } +} + +/* + * Merge the flags for all certs in the chain, after calling callback + */ +static int x509_crt_merge_flags_with_cb( + uint32_t *flags, + const mbedtls_x509_crt_verify_chain *ver_chain, + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), + void *p_vrfy) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned i; + uint32_t cur_flags; + const mbedtls_x509_crt_verify_chain_item *cur; + + for (i = ver_chain->len; i != 0; --i) { + cur = &ver_chain->items[i-1]; + cur_flags = cur->flags; + + if (NULL != f_vrfy) { + if ((ret = f_vrfy(p_vrfy, cur->crt, (int) i-1, &cur_flags)) != 0) { + return ret; + } + } + + *flags |= cur_flags; + } + + return 0; +} + +/* + * Verify the certificate validity, with profile, restartable version + * + * This function: + * - checks the requested CN (if any) + * - checks the type and size of the EE cert's key, + * as that isn't done as part of chain building/verification currently + * - builds and verifies the chain + * - then calls the callback and merges the flags + * + * The parameters pairs `trust_ca`, `ca_crl` and `f_ca_cb`, `p_ca_cb` + * are mutually exclusive: If `f_ca_cb != NULL`, it will be used by the + * verification routine to search for trusted signers, and CRLs will + * be disabled. Otherwise, `trust_ca` will be used as the static list + * of trusted signers, and `ca_crl` will be use as the static list + * of CRLs. + */ +static int x509_crt_verify_restartable_ca_cb(mbedtls_x509_crt *crt, + mbedtls_x509_crt *trust_ca, + mbedtls_x509_crl *ca_crl, + mbedtls_x509_crt_ca_cb_t f_ca_cb, + void *p_ca_cb, + const mbedtls_x509_crt_profile *profile, + const char *cn, uint32_t *flags, + int (*f_vrfy)(void *, + mbedtls_x509_crt *, + int, + uint32_t *), + void *p_vrfy, + mbedtls_x509_crt_restart_ctx *rs_ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + mbedtls_pk_type_t pk_type; + mbedtls_x509_crt_verify_chain ver_chain; + uint32_t ee_flags; + + *flags = 0; + ee_flags = 0; + x509_crt_verify_chain_reset(&ver_chain); + + if (profile == NULL) { + ret = MBEDTLS_ERR_X509_BAD_INPUT_DATA; + goto exit; + } + + /* check name if requested */ + if (cn != NULL) { + x509_crt_verify_name(crt, cn, &ee_flags); + } + + /* Check the type and size of the key */ + pk_type = mbedtls_pk_get_type(&crt->pk); + + if (x509_profile_check_pk_alg(profile, pk_type) != 0) { + ee_flags |= MBEDTLS_X509_BADCERT_BAD_PK; + } + + if (x509_profile_check_key(profile, &crt->pk) != 0) { + ee_flags |= MBEDTLS_X509_BADCERT_BAD_KEY; + } + + /* Check the chain */ + ret = x509_crt_verify_chain(crt, trust_ca, ca_crl, + f_ca_cb, p_ca_cb, profile, + &ver_chain, rs_ctx); + + if (ret != 0) { + goto exit; + } + + /* Merge end-entity flags */ + ver_chain.items[0].flags |= ee_flags; + + /* Build final flags, calling callback on the way if any */ + ret = x509_crt_merge_flags_with_cb(flags, &ver_chain, f_vrfy, p_vrfy); + +exit: + +#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) + mbedtls_x509_crt_free(ver_chain.trust_ca_cb_result); + mbedtls_free(ver_chain.trust_ca_cb_result); + ver_chain.trust_ca_cb_result = NULL; +#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) + if (rs_ctx != NULL && ret != MBEDTLS_ERR_ECP_IN_PROGRESS) { + mbedtls_x509_crt_restart_free(rs_ctx); + } +#endif + + /* prevent misuse of the vrfy callback - VERIFY_FAILED would be ignored by + * the SSL module for authmode optional, but non-zero return from the + * callback means a fatal error so it shouldn't be ignored */ + if (ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED) { + ret = MBEDTLS_ERR_X509_FATAL_ERROR; + } + + if (ret != 0) { + *flags = (uint32_t) -1; + return ret; + } + + if (*flags != 0) { + return MBEDTLS_ERR_X509_CERT_VERIFY_FAILED; + } + + return 0; +} + + +/* + * Verify the certificate validity (default profile, not restartable) + */ +int mbedtls_x509_crt_verify(mbedtls_x509_crt *crt, + mbedtls_x509_crt *trust_ca, + mbedtls_x509_crl *ca_crl, + const char *cn, uint32_t *flags, + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), + void *p_vrfy) +{ + return x509_crt_verify_restartable_ca_cb(crt, trust_ca, ca_crl, + NULL, NULL, + &mbedtls_x509_crt_profile_default, + cn, flags, + f_vrfy, p_vrfy, NULL); +} + +/* + * Verify the certificate validity (user-chosen profile, not restartable) + */ +int mbedtls_x509_crt_verify_with_profile(mbedtls_x509_crt *crt, + mbedtls_x509_crt *trust_ca, + mbedtls_x509_crl *ca_crl, + const mbedtls_x509_crt_profile *profile, + const char *cn, uint32_t *flags, + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), + void *p_vrfy) +{ + return x509_crt_verify_restartable_ca_cb(crt, trust_ca, ca_crl, + NULL, NULL, + profile, cn, flags, + f_vrfy, p_vrfy, NULL); +} + +#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) +/* + * Verify the certificate validity (user-chosen profile, CA callback, + * not restartable). + */ +int mbedtls_x509_crt_verify_with_ca_cb(mbedtls_x509_crt *crt, + mbedtls_x509_crt_ca_cb_t f_ca_cb, + void *p_ca_cb, + const mbedtls_x509_crt_profile *profile, + const char *cn, uint32_t *flags, + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), + void *p_vrfy) +{ + return x509_crt_verify_restartable_ca_cb(crt, NULL, NULL, + f_ca_cb, p_ca_cb, + profile, cn, flags, + f_vrfy, p_vrfy, NULL); +} +#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ + +int mbedtls_x509_crt_verify_restartable(mbedtls_x509_crt *crt, + mbedtls_x509_crt *trust_ca, + mbedtls_x509_crl *ca_crl, + const mbedtls_x509_crt_profile *profile, + const char *cn, uint32_t *flags, + int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), + void *p_vrfy, + mbedtls_x509_crt_restart_ctx *rs_ctx) +{ + return x509_crt_verify_restartable_ca_cb(crt, trust_ca, ca_crl, + NULL, NULL, + profile, cn, flags, + f_vrfy, p_vrfy, rs_ctx); +} + + +/* + * Initialize a certificate chain + */ +void mbedtls_x509_crt_init(mbedtls_x509_crt *crt) +{ + memset(crt, 0, sizeof(mbedtls_x509_crt)); +} + +/* + * Unallocate all certificate data + */ +void mbedtls_x509_crt_free(mbedtls_x509_crt *crt) +{ + mbedtls_x509_crt *cert_cur = crt; + mbedtls_x509_crt *cert_prv; + mbedtls_x509_name *name_cur; + mbedtls_x509_name *name_prv; + mbedtls_x509_sequence *seq_cur; + mbedtls_x509_sequence *seq_prv; + + if (crt == NULL) { + return; + } + + do { + mbedtls_pk_free(&cert_cur->pk); + +#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) + mbedtls_free(cert_cur->sig_opts); +#endif + + name_cur = cert_cur->issuer.next; + while (name_cur != NULL) { + name_prv = name_cur; + name_cur = name_cur->next; + mbedtls_platform_zeroize(name_prv, sizeof(mbedtls_x509_name)); + mbedtls_free(name_prv); + } + + name_cur = cert_cur->subject.next; + while (name_cur != NULL) { + name_prv = name_cur; + name_cur = name_cur->next; + mbedtls_platform_zeroize(name_prv, sizeof(mbedtls_x509_name)); + mbedtls_free(name_prv); + } + + seq_cur = cert_cur->ext_key_usage.next; + while (seq_cur != NULL) { + seq_prv = seq_cur; + seq_cur = seq_cur->next; + mbedtls_platform_zeroize(seq_prv, + sizeof(mbedtls_x509_sequence)); + mbedtls_free(seq_prv); + } + + seq_cur = cert_cur->subject_alt_names.next; + while (seq_cur != NULL) { + seq_prv = seq_cur; + seq_cur = seq_cur->next; + mbedtls_platform_zeroize(seq_prv, + sizeof(mbedtls_x509_sequence)); + mbedtls_free(seq_prv); + } + + seq_cur = cert_cur->certificate_policies.next; + while (seq_cur != NULL) { + seq_prv = seq_cur; + seq_cur = seq_cur->next; + mbedtls_platform_zeroize(seq_prv, + sizeof(mbedtls_x509_sequence)); + mbedtls_free(seq_prv); + } + + if (cert_cur->raw.p != NULL && cert_cur->own_buffer) { + mbedtls_platform_zeroize(cert_cur->raw.p, cert_cur->raw.len); + mbedtls_free(cert_cur->raw.p); + } + + cert_cur = cert_cur->next; + } while (cert_cur != NULL); + + cert_cur = crt; + do { + cert_prv = cert_cur; + cert_cur = cert_cur->next; + + mbedtls_platform_zeroize(cert_prv, sizeof(mbedtls_x509_crt)); + if (cert_prv != crt) { + mbedtls_free(cert_prv); + } + } while (cert_cur != NULL); +} + +#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) +/* + * Initialize a restart context + */ +void mbedtls_x509_crt_restart_init(mbedtls_x509_crt_restart_ctx *ctx) +{ + mbedtls_pk_restart_init(&ctx->pk); + + ctx->parent = NULL; + ctx->fallback_parent = NULL; + ctx->fallback_signature_is_good = 0; + + ctx->parent_is_trusted = -1; + + ctx->in_progress = x509_crt_rs_none; + ctx->self_cnt = 0; + x509_crt_verify_chain_reset(&ctx->ver_chain); +} + +/* + * Free the components of a restart context + */ +void mbedtls_x509_crt_restart_free(mbedtls_x509_crt_restart_ctx *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_pk_restart_free(&ctx->pk); + mbedtls_x509_crt_restart_init(ctx); +} +#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ + +#endif /* MBEDTLS_X509_CRT_PARSE_C */ diff --git a/ext/opcua_client/mbedtls/library/x509_csr.c b/ext/opcua_client/mbedtls/library/x509_csr.c new file mode 100644 index 0000000..095364e --- /dev/null +++ b/ext/opcua_client/mbedtls/library/x509_csr.c @@ -0,0 +1,380 @@ +/* + * X.509 Certificate Signing Request (CSR) parsing + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * The ITU-T X.509 standard defines a certificate format for PKI. + * + * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs) + * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs) + * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10) + * + * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf + * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf + */ + +#include "common.h" + +#if defined(MBEDTLS_X509_CSR_PARSE_C) + +#include "mbedtls/x509_csr.h" +#include "mbedtls/error.h" +#include "mbedtls/oid.h" +#include "mbedtls/platform_util.h" + +#include + +#if defined(MBEDTLS_PEM_PARSE_C) +#include "mbedtls/pem.h" +#endif + +#include "mbedtls/platform.h" + +#if defined(MBEDTLS_FS_IO) || defined(EFIX64) || defined(EFI32) +#include +#endif + +/* + * Version ::= INTEGER { v1(0) } + */ +static int x509_csr_get_version(unsigned char **p, + const unsigned char *end, + int *ver) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if ((ret = mbedtls_asn1_get_int(p, end, ver)) != 0) { + if (ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) { + *ver = 0; + return 0; + } + + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_VERSION, ret); + } + + return 0; +} + +/* + * Parse a CSR in DER format + */ +int mbedtls_x509_csr_parse_der(mbedtls_x509_csr *csr, + const unsigned char *buf, size_t buflen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len; + unsigned char *p, *end; + mbedtls_x509_buf sig_params; + + memset(&sig_params, 0, sizeof(mbedtls_x509_buf)); + + /* + * Check for valid input + */ + if (csr == NULL || buf == NULL || buflen == 0) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + mbedtls_x509_csr_init(csr); + + /* + * first copy the raw DER data + */ + p = mbedtls_calloc(1, len = buflen); + + if (p == NULL) { + return MBEDTLS_ERR_X509_ALLOC_FAILED; + } + + memcpy(p, buf, buflen); + + csr->raw.p = p; + csr->raw.len = len; + end = p + len; + + /* + * CertificationRequest ::= SEQUENCE { + * certificationRequestInfo CertificationRequestInfo, + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING + * } + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + mbedtls_x509_csr_free(csr); + return MBEDTLS_ERR_X509_INVALID_FORMAT; + } + + if (len != (size_t) (end - p)) { + mbedtls_x509_csr_free(csr); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + /* + * CertificationRequestInfo ::= SEQUENCE { + */ + csr->cri.p = p; + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + mbedtls_x509_csr_free(csr); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret); + } + + end = p + len; + csr->cri.len = end - csr->cri.p; + + /* + * Version ::= INTEGER { v1(0) } + */ + if ((ret = x509_csr_get_version(&p, end, &csr->version)) != 0) { + mbedtls_x509_csr_free(csr); + return ret; + } + + if (csr->version != 0) { + mbedtls_x509_csr_free(csr); + return MBEDTLS_ERR_X509_UNKNOWN_VERSION; + } + + csr->version++; + + /* + * subject Name + */ + csr->subject_raw.p = p; + + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + mbedtls_x509_csr_free(csr); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret); + } + + if ((ret = mbedtls_x509_get_name(&p, p + len, &csr->subject)) != 0) { + mbedtls_x509_csr_free(csr); + return ret; + } + + csr->subject_raw.len = p - csr->subject_raw.p; + + /* + * subjectPKInfo SubjectPublicKeyInfo + */ + if ((ret = mbedtls_pk_parse_subpubkey(&p, end, &csr->pk)) != 0) { + mbedtls_x509_csr_free(csr); + return ret; + } + + /* + * attributes [0] Attributes + * + * The list of possible attributes is open-ended, though RFC 2985 + * (PKCS#9) defines a few in section 5.4. We currently don't support any, + * so we just ignore them. This is a safe thing to do as the worst thing + * that could happen is that we issue a certificate that does not match + * the requester's expectations - this cannot cause a violation of our + * signature policies. + */ + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC)) != + 0) { + mbedtls_x509_csr_free(csr); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret); + } + + p += len; + + end = csr->raw.p + csr->raw.len; + + /* + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING + */ + if ((ret = mbedtls_x509_get_alg(&p, end, &csr->sig_oid, &sig_params)) != 0) { + mbedtls_x509_csr_free(csr); + return ret; + } + + if ((ret = mbedtls_x509_get_sig_alg(&csr->sig_oid, &sig_params, + &csr->sig_md, &csr->sig_pk, + &csr->sig_opts)) != 0) { + mbedtls_x509_csr_free(csr); + return MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG; + } + + if ((ret = mbedtls_x509_get_sig(&p, end, &csr->sig)) != 0) { + mbedtls_x509_csr_free(csr); + return ret; + } + + if (p != end) { + mbedtls_x509_csr_free(csr); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH); + } + + return 0; +} + +/* + * Parse a CSR, allowing for PEM or raw DER encoding + */ +int mbedtls_x509_csr_parse(mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen) +{ +#if defined(MBEDTLS_PEM_PARSE_C) + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t use_len; + mbedtls_pem_context pem; +#endif + + /* + * Check for valid input + */ + if (csr == NULL || buf == NULL || buflen == 0) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + +#if defined(MBEDTLS_PEM_PARSE_C) + /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ + if (buf[buflen - 1] == '\0') { + mbedtls_pem_init(&pem); + ret = mbedtls_pem_read_buffer(&pem, + "-----BEGIN CERTIFICATE REQUEST-----", + "-----END CERTIFICATE REQUEST-----", + buf, NULL, 0, &use_len); + if (ret == MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) { + ret = mbedtls_pem_read_buffer(&pem, + "-----BEGIN NEW CERTIFICATE REQUEST-----", + "-----END NEW CERTIFICATE REQUEST-----", + buf, NULL, 0, &use_len); + } + + if (ret == 0) { + /* + * Was PEM encoded, parse the result + */ + ret = mbedtls_x509_csr_parse_der(csr, pem.buf, pem.buflen); + } + + mbedtls_pem_free(&pem); + if (ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) { + return ret; + } + } +#endif /* MBEDTLS_PEM_PARSE_C */ + return mbedtls_x509_csr_parse_der(csr, buf, buflen); +} + +#if defined(MBEDTLS_FS_IO) +/* + * Load a CSR into the structure + */ +int mbedtls_x509_csr_parse_file(mbedtls_x509_csr *csr, const char *path) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n; + unsigned char *buf; + + if ((ret = mbedtls_pk_load_file(path, &buf, &n)) != 0) { + return ret; + } + + ret = mbedtls_x509_csr_parse(csr, buf, n); + + mbedtls_platform_zeroize(buf, n); + mbedtls_free(buf); + + return ret; +} +#endif /* MBEDTLS_FS_IO */ + +#define BEFORE_COLON 14 +#define BC "14" +/* + * Return an informational string about the CSR. + */ +int mbedtls_x509_csr_info(char *buf, size_t size, const char *prefix, + const mbedtls_x509_csr *csr) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t n; + char *p; + char key_size_str[BEFORE_COLON]; + + p = buf; + n = size; + + ret = mbedtls_snprintf(p, n, "%sCSR version : %d", + prefix, csr->version); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_snprintf(p, n, "\n%ssubject name : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + ret = mbedtls_x509_dn_gets(p, n, &csr->subject); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_snprintf(p, n, "\n%ssigned using : ", prefix); + MBEDTLS_X509_SAFE_SNPRINTF; + + ret = mbedtls_x509_sig_alg_gets(p, n, &csr->sig_oid, csr->sig_pk, csr->sig_md, + csr->sig_opts); + MBEDTLS_X509_SAFE_SNPRINTF; + + if ((ret = mbedtls_x509_key_size_helper(key_size_str, BEFORE_COLON, + mbedtls_pk_get_name(&csr->pk))) != 0) { + return ret; + } + + ret = mbedtls_snprintf(p, n, "\n%s%-" BC "s: %d bits\n", prefix, key_size_str, + (int) mbedtls_pk_get_bitlen(&csr->pk)); + MBEDTLS_X509_SAFE_SNPRINTF; + + return (int) (size - n); +} + +/* + * Initialize a CSR + */ +void mbedtls_x509_csr_init(mbedtls_x509_csr *csr) +{ + memset(csr, 0, sizeof(mbedtls_x509_csr)); +} + +/* + * Unallocate all CSR data + */ +void mbedtls_x509_csr_free(mbedtls_x509_csr *csr) +{ + mbedtls_x509_name *name_cur; + mbedtls_x509_name *name_prv; + + if (csr == NULL) { + return; + } + + mbedtls_pk_free(&csr->pk); + +#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) + mbedtls_free(csr->sig_opts); +#endif + + name_cur = csr->subject.next; + while (name_cur != NULL) { + name_prv = name_cur; + name_cur = name_cur->next; + mbedtls_platform_zeroize(name_prv, sizeof(mbedtls_x509_name)); + mbedtls_free(name_prv); + } + + if (csr->raw.p != NULL) { + mbedtls_platform_zeroize(csr->raw.p, csr->raw.len); + mbedtls_free(csr->raw.p); + } + + mbedtls_platform_zeroize(csr, sizeof(mbedtls_x509_csr)); +} + +#endif /* MBEDTLS_X509_CSR_PARSE_C */ diff --git a/ext/opcua_client/mbedtls/library/x509write_crt.c b/ext/opcua_client/mbedtls/library/x509write_crt.c new file mode 100644 index 0000000..1e16b53 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/x509write_crt.c @@ -0,0 +1,545 @@ +/* + * X.509 certificate writing + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * References: + * - certificates: RFC 5280, updated by RFC 6818 + * - CSRs: PKCS#10 v1.7 aka RFC 2986 + * - attributes: PKCS#9 v2.0 aka RFC 2985 + */ + +#include "common.h" + +#if defined(MBEDTLS_X509_CRT_WRITE_C) + +#include "mbedtls/x509_crt.h" +#include "mbedtls/asn1write.h" +#include "mbedtls/error.h" +#include "mbedtls/oid.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/sha1.h" + +#include + +#if defined(MBEDTLS_PEM_WRITE_C) +#include "mbedtls/pem.h" +#endif /* MBEDTLS_PEM_WRITE_C */ + +void mbedtls_x509write_crt_init(mbedtls_x509write_cert *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_x509write_cert)); + + mbedtls_mpi_init(&ctx->serial); + ctx->version = MBEDTLS_X509_CRT_VERSION_3; +} + +void mbedtls_x509write_crt_free(mbedtls_x509write_cert *ctx) +{ + mbedtls_mpi_free(&ctx->serial); + + mbedtls_asn1_free_named_data_list(&ctx->subject); + mbedtls_asn1_free_named_data_list(&ctx->issuer); + mbedtls_asn1_free_named_data_list(&ctx->extensions); + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_x509write_cert)); +} + +void mbedtls_x509write_crt_set_version(mbedtls_x509write_cert *ctx, + int version) +{ + ctx->version = version; +} + +void mbedtls_x509write_crt_set_md_alg(mbedtls_x509write_cert *ctx, + mbedtls_md_type_t md_alg) +{ + ctx->md_alg = md_alg; +} + +void mbedtls_x509write_crt_set_subject_key(mbedtls_x509write_cert *ctx, + mbedtls_pk_context *key) +{ + ctx->subject_key = key; +} + +void mbedtls_x509write_crt_set_issuer_key(mbedtls_x509write_cert *ctx, + mbedtls_pk_context *key) +{ + ctx->issuer_key = key; +} + +int mbedtls_x509write_crt_set_subject_name(mbedtls_x509write_cert *ctx, + const char *subject_name) +{ + return mbedtls_x509_string_to_names(&ctx->subject, subject_name); +} + +int mbedtls_x509write_crt_set_issuer_name(mbedtls_x509write_cert *ctx, + const char *issuer_name) +{ + return mbedtls_x509_string_to_names(&ctx->issuer, issuer_name); +} + +int mbedtls_x509write_crt_set_serial(mbedtls_x509write_cert *ctx, + const mbedtls_mpi *serial) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if (mbedtls_mpi_size(serial) > MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + if ((ret = mbedtls_mpi_copy(&ctx->serial, serial)) != 0) { + return ret; + } + + return 0; +} + +int mbedtls_x509write_crt_set_validity(mbedtls_x509write_cert *ctx, + const char *not_before, + const char *not_after) +{ + if (strlen(not_before) != MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1 || + strlen(not_after) != MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + strncpy(ctx->not_before, not_before, MBEDTLS_X509_RFC5280_UTC_TIME_LEN); + strncpy(ctx->not_after, not_after, MBEDTLS_X509_RFC5280_UTC_TIME_LEN); + ctx->not_before[MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1] = 'Z'; + ctx->not_after[MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1] = 'Z'; + + return 0; +} + +int mbedtls_x509write_crt_set_extension(mbedtls_x509write_cert *ctx, + const char *oid, size_t oid_len, + int critical, + const unsigned char *val, size_t val_len) +{ + return mbedtls_x509_set_extension(&ctx->extensions, oid, oid_len, + critical, val, val_len); +} + +int mbedtls_x509write_crt_set_basic_constraints(mbedtls_x509write_cert *ctx, + int is_ca, int max_pathlen) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char buf[9]; + unsigned char *c = buf + sizeof(buf); + size_t len = 0; + + memset(buf, 0, sizeof(buf)); + + if (is_ca && max_pathlen > 127) { + return MBEDTLS_ERR_X509_BAD_INPUT_DATA; + } + + if (is_ca) { + if (max_pathlen >= 0) { + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_int(&c, buf, + max_pathlen)); + } + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_bool(&c, buf, 1)); + } + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(&c, buf, + MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + + return + mbedtls_x509write_crt_set_extension(ctx, MBEDTLS_OID_BASIC_CONSTRAINTS, + MBEDTLS_OID_SIZE(MBEDTLS_OID_BASIC_CONSTRAINTS), + is_ca, buf + sizeof(buf) - len, len); +} + +#if defined(MBEDTLS_SHA1_C) +int mbedtls_x509write_crt_set_subject_key_identifier(mbedtls_x509write_cert *ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char buf[MBEDTLS_MPI_MAX_SIZE * 2 + 20]; /* tag, length + 2xMPI */ + unsigned char *c = buf + sizeof(buf); + size_t len = 0; + + memset(buf, 0, sizeof(buf)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_pk_write_pubkey(&c, buf, ctx->subject_key)); + + ret = mbedtls_sha1_ret(buf + sizeof(buf) - len, len, + buf + sizeof(buf) - 20); + if (ret != 0) { + return ret; + } + c = buf + sizeof(buf) - 20; + len = 20; + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag(&c, buf, MBEDTLS_ASN1_OCTET_STRING)); + + return mbedtls_x509write_crt_set_extension(ctx, + MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER, + MBEDTLS_OID_SIZE(MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER), + 0, buf + sizeof(buf) - len, len); +} + +int mbedtls_x509write_crt_set_authority_key_identifier(mbedtls_x509write_cert *ctx) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + unsigned char buf[MBEDTLS_MPI_MAX_SIZE * 2 + 20]; /* tag, length + 2xMPI */ + unsigned char *c = buf + sizeof(buf); + size_t len = 0; + + memset(buf, 0, sizeof(buf)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_pk_write_pubkey(&c, buf, ctx->issuer_key)); + + ret = mbedtls_sha1_ret(buf + sizeof(buf) - len, len, + buf + sizeof(buf) - 20); + if (ret != 0) { + return ret; + } + c = buf + sizeof(buf) - 20; + len = 20; + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag(&c, buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC | 0)); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag(&c, buf, + MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + + return mbedtls_x509write_crt_set_extension( + ctx, MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER, + MBEDTLS_OID_SIZE(MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER), + 0, buf + sizeof(buf) - len, len); +} +#endif /* MBEDTLS_SHA1_C */ + +int mbedtls_x509write_crt_set_key_usage(mbedtls_x509write_cert *ctx, + unsigned int key_usage) +{ + unsigned char buf[5] = { 0 }, ku[2] = { 0 }; + unsigned char *c; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const unsigned int allowed_bits = MBEDTLS_X509_KU_DIGITAL_SIGNATURE | + MBEDTLS_X509_KU_NON_REPUDIATION | + MBEDTLS_X509_KU_KEY_ENCIPHERMENT | + MBEDTLS_X509_KU_DATA_ENCIPHERMENT | + MBEDTLS_X509_KU_KEY_AGREEMENT | + MBEDTLS_X509_KU_KEY_CERT_SIGN | + MBEDTLS_X509_KU_CRL_SIGN | + MBEDTLS_X509_KU_ENCIPHER_ONLY | + MBEDTLS_X509_KU_DECIPHER_ONLY; + + /* Check that nothing other than the allowed flags is set */ + if ((key_usage & ~allowed_bits) != 0) { + return MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE; + } + + c = buf + 5; + MBEDTLS_PUT_UINT16_LE(key_usage, ku, 0); + ret = mbedtls_asn1_write_named_bitstring(&c, buf, ku, 9); + + if (ret < 0) { + return ret; + } else if (ret < 3 || ret > 5) { + return MBEDTLS_ERR_X509_INVALID_FORMAT; + } + + ret = mbedtls_x509write_crt_set_extension(ctx, MBEDTLS_OID_KEY_USAGE, + MBEDTLS_OID_SIZE(MBEDTLS_OID_KEY_USAGE), + 1, c, (size_t) ret); + if (ret != 0) { + return ret; + } + + return 0; +} + +int mbedtls_x509write_crt_set_ns_cert_type(mbedtls_x509write_cert *ctx, + unsigned char ns_cert_type) +{ + unsigned char buf[4] = { 0 }; + unsigned char *c; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + c = buf + 4; + + ret = mbedtls_asn1_write_named_bitstring(&c, buf, &ns_cert_type, 8); + if (ret < 3 || ret > 4) { + return ret; + } + + ret = mbedtls_x509write_crt_set_extension(ctx, MBEDTLS_OID_NS_CERT_TYPE, + MBEDTLS_OID_SIZE(MBEDTLS_OID_NS_CERT_TYPE), + 0, c, (size_t) ret); + if (ret != 0) { + return ret; + } + + return 0; +} + +static int x509_write_time(unsigned char **p, unsigned char *start, + const char *t, size_t size) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t len = 0; + + /* + * write MBEDTLS_ASN1_UTC_TIME if year < 2050 (2 bytes shorter) + */ + if (t[0] < '2' || (t[0] == '2' && t[1] == '0' && t[2] < '5')) { + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_raw_buffer(p, start, + (const unsigned char *) t + 2, + size - 2)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, + MBEDTLS_ASN1_UTC_TIME)); + } else { + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_raw_buffer(p, start, + (const unsigned char *) t, + size)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(p, start, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(p, start, + MBEDTLS_ASN1_GENERALIZED_TIME)); + } + + return (int) len; +} + +int mbedtls_x509write_crt_der(mbedtls_x509write_cert *ctx, + unsigned char *buf, size_t size, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const char *sig_oid; + size_t sig_oid_len = 0; + unsigned char *c, *c2; + unsigned char hash[64]; + unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE]; + size_t sub_len = 0, pub_len = 0, sig_and_oid_len = 0, sig_len; + size_t len = 0; + mbedtls_pk_type_t pk_alg; + int write_sig_null_par; + + /* + * Prepare data to be signed at the end of the target buffer + */ + c = buf + size; + + /* Signature algorithm needed in TBS, and later for actual signature */ + + /* There's no direct way of extracting a signature algorithm + * (represented as an element of mbedtls_pk_type_t) from a PK instance. */ + if (mbedtls_pk_can_do(ctx->issuer_key, MBEDTLS_PK_RSA)) { + pk_alg = MBEDTLS_PK_RSA; + } else if (mbedtls_pk_can_do(ctx->issuer_key, MBEDTLS_PK_ECDSA)) { + pk_alg = MBEDTLS_PK_ECDSA; + } else { + return MBEDTLS_ERR_X509_INVALID_ALG; + } + + if ((ret = mbedtls_oid_get_oid_by_sig_alg(pk_alg, ctx->md_alg, + &sig_oid, &sig_oid_len)) != 0) { + return ret; + } + + /* + * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension + */ + + /* Only for v3 */ + if (ctx->version == MBEDTLS_X509_CRT_VERSION_3) { + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_x509_write_extensions(&c, + buf, ctx->extensions)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag(&c, buf, + MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag(&c, buf, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | + MBEDTLS_ASN1_CONSTRUCTED | 3)); + } + + /* + * SubjectPublicKeyInfo + */ + MBEDTLS_ASN1_CHK_ADD(pub_len, + mbedtls_pk_write_pubkey_der(ctx->subject_key, + buf, c - buf)); + c -= pub_len; + len += pub_len; + + /* + * Subject ::= Name + */ + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_x509_write_names(&c, buf, + ctx->subject)); + + /* + * Validity ::= SEQUENCE { + * notBefore Time, + * notAfter Time } + */ + sub_len = 0; + + MBEDTLS_ASN1_CHK_ADD(sub_len, + x509_write_time(&c, buf, ctx->not_after, + MBEDTLS_X509_RFC5280_UTC_TIME_LEN)); + + MBEDTLS_ASN1_CHK_ADD(sub_len, + x509_write_time(&c, buf, ctx->not_before, + MBEDTLS_X509_RFC5280_UTC_TIME_LEN)); + + len += sub_len; + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, sub_len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag(&c, buf, + MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + + /* + * Issuer ::= Name + */ + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_x509_write_names(&c, buf, + ctx->issuer)); + + /* + * Signature ::= AlgorithmIdentifier + */ + if (pk_alg == MBEDTLS_PK_ECDSA) { + /* + * The AlgorithmIdentifier's parameters field must be absent for DSA/ECDSA signature + * algorithms, see https://www.rfc-editor.org/rfc/rfc5480#page-17 and + * https://www.rfc-editor.org/rfc/rfc5758#section-3. + */ + write_sig_null_par = 0; + } else { + write_sig_null_par = 1; + } + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_algorithm_identifier_ext(&c, buf, + sig_oid, strlen(sig_oid), + 0, write_sig_null_par)); + + /* + * Serial ::= INTEGER + */ + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_mpi(&c, buf, + &ctx->serial)); + + /* + * Version ::= INTEGER { v1(0), v2(1), v3(2) } + */ + + /* Can be omitted for v1 */ + if (ctx->version != MBEDTLS_X509_CRT_VERSION_1) { + sub_len = 0; + MBEDTLS_ASN1_CHK_ADD(sub_len, + mbedtls_asn1_write_int(&c, buf, ctx->version)); + len += sub_len; + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_len(&c, buf, sub_len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag(&c, buf, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | + MBEDTLS_ASN1_CONSTRUCTED | 0)); + } + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag(&c, buf, MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + + /* + * Make signature + */ + + /* Compute hash of CRT. */ + if ((ret = mbedtls_md(mbedtls_md_info_from_type(ctx->md_alg), c, + len, hash)) != 0) { + return ret; + } + + if ((ret = mbedtls_pk_sign(ctx->issuer_key, ctx->md_alg, + hash, 0, sig, &sig_len, + f_rng, p_rng)) != 0) { + return ret; + } + + /* Move CRT to the front of the buffer to have space + * for the signature. */ + memmove(buf, c, len); + c = buf + len; + + /* Add signature at the end of the buffer, + * making sure that it doesn't underflow + * into the CRT buffer. */ + c2 = buf + size; + MBEDTLS_ASN1_CHK_ADD(sig_and_oid_len, mbedtls_x509_write_sig(&c2, c, + sig_oid, sig_oid_len, + sig, sig_len, pk_alg)); + + /* + * Memory layout after this step: + * + * buf c=buf+len c2 buf+size + * [CRT0,...,CRTn, UNUSED, ..., UNUSED, SIG0, ..., SIGm] + */ + + /* Move raw CRT to just before the signature. */ + c = c2 - len; + memmove(c, buf, len); + + len += sig_and_oid_len; + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(&c, buf, + MBEDTLS_ASN1_CONSTRUCTED | + MBEDTLS_ASN1_SEQUENCE)); + + return (int) len; +} + +#define PEM_BEGIN_CRT "-----BEGIN CERTIFICATE-----\n" +#define PEM_END_CRT "-----END CERTIFICATE-----\n" + +#if defined(MBEDTLS_PEM_WRITE_C) +int mbedtls_x509write_crt_pem(mbedtls_x509write_cert *crt, + unsigned char *buf, size_t size, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t olen; + + if ((ret = mbedtls_x509write_crt_der(crt, buf, size, + f_rng, p_rng)) < 0) { + return ret; + } + + if ((ret = mbedtls_pem_write_buffer(PEM_BEGIN_CRT, PEM_END_CRT, + buf + size - ret, ret, + buf, size, &olen)) != 0) { + return ret; + } + + return 0; +} +#endif /* MBEDTLS_PEM_WRITE_C */ + +#endif /* MBEDTLS_X509_CRT_WRITE_C */ diff --git a/ext/opcua_client/mbedtls/library/x509write_csr.c b/ext/opcua_client/mbedtls/library/x509write_csr.c new file mode 100644 index 0000000..3c3ab3a --- /dev/null +++ b/ext/opcua_client/mbedtls/library/x509write_csr.c @@ -0,0 +1,324 @@ +/* + * X.509 Certificate Signing Request writing + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +/* + * References: + * - CSRs: PKCS#10 v1.7 aka RFC 2986 + * - attributes: PKCS#9 v2.0 aka RFC 2985 + */ + +#include "common.h" + +#if defined(MBEDTLS_X509_CSR_WRITE_C) + +#include "mbedtls/x509_csr.h" +#include "mbedtls/asn1write.h" +#include "mbedtls/error.h" +#include "mbedtls/oid.h" +#include "mbedtls/platform_util.h" + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "psa/crypto.h" +#include "mbedtls/psa_util.h" +#endif + +#include +#include + +#if defined(MBEDTLS_PEM_WRITE_C) +#include "mbedtls/pem.h" +#endif + +#include "mbedtls/platform.h" + +void mbedtls_x509write_csr_init(mbedtls_x509write_csr *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_x509write_csr)); +} + +void mbedtls_x509write_csr_free(mbedtls_x509write_csr *ctx) +{ + mbedtls_asn1_free_named_data_list(&ctx->subject); + mbedtls_asn1_free_named_data_list(&ctx->extensions); + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_x509write_csr)); +} + +void mbedtls_x509write_csr_set_md_alg(mbedtls_x509write_csr *ctx, mbedtls_md_type_t md_alg) +{ + ctx->md_alg = md_alg; +} + +void mbedtls_x509write_csr_set_key(mbedtls_x509write_csr *ctx, mbedtls_pk_context *key) +{ + ctx->key = key; +} + +int mbedtls_x509write_csr_set_subject_name(mbedtls_x509write_csr *ctx, + const char *subject_name) +{ + return mbedtls_x509_string_to_names(&ctx->subject, subject_name); +} + +int mbedtls_x509write_csr_set_extension(mbedtls_x509write_csr *ctx, + const char *oid, size_t oid_len, + const unsigned char *val, size_t val_len) +{ + return mbedtls_x509_set_extension(&ctx->extensions, oid, oid_len, + 0, val, val_len); +} + +int mbedtls_x509write_csr_set_key_usage(mbedtls_x509write_csr *ctx, unsigned char key_usage) +{ + unsigned char buf[4] = { 0 }; + unsigned char *c; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + c = buf + 4; + + ret = mbedtls_asn1_write_named_bitstring(&c, buf, &key_usage, 8); + if (ret < 3 || ret > 4) { + return ret; + } + + ret = mbedtls_x509write_csr_set_extension(ctx, MBEDTLS_OID_KEY_USAGE, + MBEDTLS_OID_SIZE(MBEDTLS_OID_KEY_USAGE), + c, (size_t) ret); + if (ret != 0) { + return ret; + } + + return 0; +} + +int mbedtls_x509write_csr_set_ns_cert_type(mbedtls_x509write_csr *ctx, + unsigned char ns_cert_type) +{ + unsigned char buf[4] = { 0 }; + unsigned char *c; + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + c = buf + 4; + + ret = mbedtls_asn1_write_named_bitstring(&c, buf, &ns_cert_type, 8); + if (ret < 3 || ret > 4) { + return ret; + } + + ret = mbedtls_x509write_csr_set_extension(ctx, MBEDTLS_OID_NS_CERT_TYPE, + MBEDTLS_OID_SIZE(MBEDTLS_OID_NS_CERT_TYPE), + c, (size_t) ret); + if (ret != 0) { + return ret; + } + + return 0; +} + +static int x509write_csr_der_internal(mbedtls_x509write_csr *ctx, + unsigned char *buf, + size_t size, + unsigned char *sig, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + const char *sig_oid; + size_t sig_oid_len = 0; + unsigned char *c, *c2; + unsigned char hash[64]; + size_t pub_len = 0, sig_and_oid_len = 0, sig_len; + size_t len = 0; + mbedtls_pk_type_t pk_alg; +#if defined(MBEDTLS_USE_PSA_CRYPTO) + psa_hash_operation_t hash_operation = PSA_HASH_OPERATION_INIT; + size_t hash_len; + psa_algorithm_t hash_alg = mbedtls_psa_translate_md(ctx->md_alg); +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + + /* Write the CSR backwards starting from the end of buf */ + c = buf + size; + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_x509_write_extensions(&c, buf, + ctx->extensions)); + + if (len) { + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag( + &c, buf, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag( + &c, buf, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET)); + + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_oid( + &c, buf, MBEDTLS_OID_PKCS9_CSR_EXT_REQ, + MBEDTLS_OID_SIZE(MBEDTLS_OID_PKCS9_CSR_EXT_REQ))); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag( + &c, buf, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)); + } + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag( + &c, buf, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC)); + + MBEDTLS_ASN1_CHK_ADD(pub_len, mbedtls_pk_write_pubkey_der(ctx->key, + buf, c - buf)); + c -= pub_len; + len += pub_len; + + /* + * Subject ::= Name + */ + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_x509_write_names(&c, buf, + ctx->subject)); + + /* + * Version ::= INTEGER { v1(0), v2(1), v3(2) } + */ + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_int(&c, buf, 0)); + + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag( + &c, buf, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)); + + /* + * Sign the written CSR data into the sig buffer + * Note: hash errors can happen only after an internal error + */ +#if defined(MBEDTLS_USE_PSA_CRYPTO) + if (psa_hash_setup(&hash_operation, hash_alg) != PSA_SUCCESS) { + return MBEDTLS_ERR_X509_FATAL_ERROR; + } + + if (psa_hash_update(&hash_operation, c, len) != PSA_SUCCESS) { + return MBEDTLS_ERR_X509_FATAL_ERROR; + } + + if (psa_hash_finish(&hash_operation, hash, sizeof(hash), &hash_len) + != PSA_SUCCESS) { + return MBEDTLS_ERR_X509_FATAL_ERROR; + } +#else /* MBEDTLS_USE_PSA_CRYPTO */ + ret = mbedtls_md(mbedtls_md_info_from_type(ctx->md_alg), c, len, hash); + if (ret != 0) { + return ret; + } +#endif + if ((ret = mbedtls_pk_sign(ctx->key, ctx->md_alg, hash, 0, sig, &sig_len, + f_rng, p_rng)) != 0) { + return ret; + } + + if (mbedtls_pk_can_do(ctx->key, MBEDTLS_PK_RSA)) { + pk_alg = MBEDTLS_PK_RSA; + } else if (mbedtls_pk_can_do(ctx->key, MBEDTLS_PK_ECDSA)) { + pk_alg = MBEDTLS_PK_ECDSA; + } else { + return MBEDTLS_ERR_X509_INVALID_ALG; + } + + if ((ret = mbedtls_oid_get_oid_by_sig_alg(pk_alg, ctx->md_alg, + &sig_oid, &sig_oid_len)) != 0) { + return ret; + } + + /* + * Move the written CSR data to the start of buf to create space for + * writing the signature into buf. + */ + memmove(buf, c, len); + + /* + * Write sig and its OID into buf backwards from the end of buf. + * Note: mbedtls_x509_write_sig will check for c2 - ( buf + len ) < sig_len + * and return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL if needed. + */ + c2 = buf + size; + MBEDTLS_ASN1_CHK_ADD(sig_and_oid_len, + mbedtls_x509_write_sig(&c2, buf + len, sig_oid, sig_oid_len, + sig, sig_len, pk_alg)); + + /* + * Compact the space between the CSR data and signature by moving the + * CSR data to the start of the signature. + */ + c2 -= len; + memmove(c2, buf, len); + + /* ASN encode the total size and tag the CSR data with it. */ + len += sig_and_oid_len; + MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c2, buf, len)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag( + &c2, buf, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)); + + /* Zero the unused bytes at the start of buf */ + memset(buf, 0, c2 - buf); + + return (int) len; +} + +int mbedtls_x509write_csr_der(mbedtls_x509write_csr *ctx, unsigned char *buf, + size_t size, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret; + unsigned char *sig; + + if ((sig = mbedtls_calloc(1, MBEDTLS_PK_SIGNATURE_MAX_SIZE)) == NULL) { + return MBEDTLS_ERR_X509_ALLOC_FAILED; + } + + ret = x509write_csr_der_internal(ctx, buf, size, sig, f_rng, p_rng); + + mbedtls_free(sig); + + return ret; +} + +#define PEM_BEGIN_CSR "-----BEGIN CERTIFICATE REQUEST-----\n" +#define PEM_END_CSR "-----END CERTIFICATE REQUEST-----\n" + +#if defined(MBEDTLS_PEM_WRITE_C) +int mbedtls_x509write_csr_pem(mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t olen = 0; + + if ((ret = mbedtls_x509write_csr_der(ctx, buf, size, + f_rng, p_rng)) < 0) { + return ret; + } + + if ((ret = mbedtls_pem_write_buffer(PEM_BEGIN_CSR, PEM_END_CSR, + buf + size - ret, + ret, buf, size, &olen)) != 0) { + return ret; + } + + return 0; +} +#endif /* MBEDTLS_PEM_WRITE_C */ + +#endif /* MBEDTLS_X509_CSR_WRITE_C */ diff --git a/ext/opcua_client/mbedtls/library/xtea.c b/ext/opcua_client/mbedtls/library/xtea.c new file mode 100644 index 0000000..f4aca56 --- /dev/null +++ b/ext/opcua_client/mbedtls/library/xtea.c @@ -0,0 +1,224 @@ +/* + * A 32-bit implementation of the XTEA algorithm + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#include "common.h" + +#if defined(MBEDTLS_XTEA_C) + +#include "mbedtls/xtea.h" +#include "mbedtls/platform_util.h" + +#include + +#include "mbedtls/platform.h" + +#if !defined(MBEDTLS_XTEA_ALT) + +void mbedtls_xtea_init(mbedtls_xtea_context *ctx) +{ + memset(ctx, 0, sizeof(mbedtls_xtea_context)); +} + +void mbedtls_xtea_free(mbedtls_xtea_context *ctx) +{ + if (ctx == NULL) { + return; + } + + mbedtls_platform_zeroize(ctx, sizeof(mbedtls_xtea_context)); +} + +/* + * XTEA key schedule + */ +void mbedtls_xtea_setup(mbedtls_xtea_context *ctx, const unsigned char key[16]) +{ + int i; + + memset(ctx, 0, sizeof(mbedtls_xtea_context)); + + for (i = 0; i < 4; i++) { + ctx->k[i] = MBEDTLS_GET_UINT32_BE(key, i << 2); + } +} + +/* + * XTEA encrypt function + */ +int mbedtls_xtea_crypt_ecb(mbedtls_xtea_context *ctx, int mode, + const unsigned char input[8], unsigned char output[8]) +{ + uint32_t *k, v0, v1, i; + + k = ctx->k; + + v0 = MBEDTLS_GET_UINT32_BE(input, 0); + v1 = MBEDTLS_GET_UINT32_BE(input, 4); + + if (mode == MBEDTLS_XTEA_ENCRYPT) { + uint32_t sum = 0, delta = 0x9E3779B9; + + for (i = 0; i < 32; i++) { + v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); + sum += delta; + v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]); + } + } else { /* MBEDTLS_XTEA_DECRYPT */ + uint32_t delta = 0x9E3779B9, sum = delta * 32; + + for (i = 0; i < 32; i++) { + v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]); + sum -= delta; + v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); + } + } + + MBEDTLS_PUT_UINT32_BE(v0, output, 0); + MBEDTLS_PUT_UINT32_BE(v1, output, 4); + + return 0; +} + +#if defined(MBEDTLS_CIPHER_MODE_CBC) +/* + * XTEA-CBC buffer encryption/decryption + */ +int mbedtls_xtea_crypt_cbc(mbedtls_xtea_context *ctx, int mode, size_t length, + unsigned char iv[8], const unsigned char *input, + unsigned char *output) +{ + int i; + unsigned char temp[8]; + + if (length % 8) { + return MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH; + } + + if (mode == MBEDTLS_XTEA_DECRYPT) { + while (length > 0) { + memcpy(temp, input, 8); + mbedtls_xtea_crypt_ecb(ctx, mode, input, output); + + for (i = 0; i < 8; i++) { + output[i] = (unsigned char) (output[i] ^ iv[i]); + } + + memcpy(iv, temp, 8); + + input += 8; + output += 8; + length -= 8; + } + } else { + while (length > 0) { + for (i = 0; i < 8; i++) { + output[i] = (unsigned char) (input[i] ^ iv[i]); + } + + mbedtls_xtea_crypt_ecb(ctx, mode, output, output); + memcpy(iv, output, 8); + + input += 8; + output += 8; + length -= 8; + } + } + + return 0; +} +#endif /* MBEDTLS_CIPHER_MODE_CBC */ +#endif /* !MBEDTLS_XTEA_ALT */ + +#if defined(MBEDTLS_SELF_TEST) + +/* + * XTEA tests vectors (non-official) + */ + +static const unsigned char xtea_test_key[6][16] = +{ + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f }, + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f }, + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 } +}; + +static const unsigned char xtea_test_pt[6][8] = +{ + { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 }, + { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, + { 0x5a, 0x5b, 0x6e, 0x27, 0x89, 0x48, 0xd7, 0x7f }, + { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 }, + { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, + { 0x70, 0xe1, 0x22, 0x5d, 0x6e, 0x4e, 0x76, 0x55 } +}; + +static const unsigned char xtea_test_ct[6][8] = +{ + { 0x49, 0x7d, 0xf3, 0xd0, 0x72, 0x61, 0x2c, 0xb5 }, + { 0xe7, 0x8f, 0x2d, 0x13, 0x74, 0x43, 0x41, 0xd8 }, + { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, + { 0xa0, 0x39, 0x05, 0x89, 0xf8, 0xb8, 0xef, 0xa5 }, + { 0xed, 0x23, 0x37, 0x5a, 0x82, 0x1a, 0x8c, 0x2d }, + { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 } +}; + +/* + * Checkup routine + */ +int mbedtls_xtea_self_test(int verbose) +{ + int i, ret = 0; + unsigned char buf[8]; + mbedtls_xtea_context ctx; + + mbedtls_xtea_init(&ctx); + for (i = 0; i < 6; i++) { + if (verbose != 0) { + mbedtls_printf(" XTEA test #%d: ", i + 1); + } + + memcpy(buf, xtea_test_pt[i], 8); + + mbedtls_xtea_setup(&ctx, xtea_test_key[i]); + mbedtls_xtea_crypt_ecb(&ctx, MBEDTLS_XTEA_ENCRYPT, buf, buf); + + if (memcmp(buf, xtea_test_ct[i], 8) != 0) { + if (verbose != 0) { + mbedtls_printf("failed\n"); + } + + ret = 1; + goto exit; + } + + if (verbose != 0) { + mbedtls_printf("passed\n"); + } + } + + if (verbose != 0) { + mbedtls_printf("\n"); + } + +exit: + mbedtls_xtea_free(&ctx); + + return ret; +} + +#endif /* MBEDTLS_SELF_TEST */ + +#endif /* MBEDTLS_XTEA_C */ diff --git a/ext/opcua_client/opcua_client.c b/ext/opcua_client/opcua_client.c index 9e97024..459b088 100644 --- a/ext/opcua_client/opcua_client.c +++ b/ext/opcua_client/opcua_client.c @@ -1,4 +1,12 @@ #include +#include +#include +#include +#include +#include +#include +#include +#include #include "open62541.h" VALUE cClient; @@ -13,6 +21,133 @@ struct OpcuaClientContext { VALUE rubyClientInstance; }; +UA_ByteString loadFile(const char *path) { + FILE *fp = fopen(path, "rb"); + if (!fp) { + printf("Failed to open file: %s\n", path); + return UA_STRING_NULL; + } + + // Seek to the end of the file to determine its size + fseek(fp, 0, SEEK_END); + size_t fileSize = ftell(fp); + rewind(fp); + + // Allocate memory for the file contents + UA_ByteString fileContents; + fileContents.data = (uint8_t *)malloc(fileSize); + if (!fileContents.data) { + printf("Failed to allocate memory for file: %s\n", path); + fclose(fp); + return UA_STRING_NULL; + } + + // Set the length of the ByteString + fileContents.length = fileSize; + + // Read the file into the allocated memory + size_t bytesRead = fread(fileContents.data, 1, fileSize, fp); + if (bytesRead != fileSize) { + printf("Failed to read file: %s\n", path); + free(fileContents.data); + fileContents.data = NULL; + fileContents.length = 0; + fclose(fp); + return UA_STRING_NULL; + } + + fclose(fp); + return fileContents; +} + +UA_ByteString convertPemToDer(const char *pem_data, int is_private_key) { + UA_ByteString der_data = UA_STRING_NULL; + int ret = 0; + + printf("Converting PEM to DER using mbedtls library...\n"); + + if (is_private_key) { + // Handle private key conversion + mbedtls_pk_context pk; + mbedtls_pk_init(&pk); + + // Parse PEM private key + ret = mbedtls_pk_parse_key(&pk, (const unsigned char *)pem_data, strlen(pem_data) + 1, NULL, 0); + if (ret != 0) { + printf("Failed to parse PEM private key, mbedtls error: -0x%04x\n", -ret); + mbedtls_pk_free(&pk); + return UA_STRING_NULL; + } + + // Allocate buffer with a reasonable size for DER private key (typically < 2KB) + size_t der_len = 2048; + unsigned char *der_buffer = malloc(der_len); + if (!der_buffer) { + printf("Failed to allocate memory for DER private key\n"); + mbedtls_pk_free(&pk); + return UA_STRING_NULL; + } + + // Write DER data - the function writes from the end of buffer backwards + ret = mbedtls_pk_write_key_der(&pk, der_buffer, der_len); + if (ret <= 0) { + printf("Failed to write DER private key, mbedtls error: -0x%04x\n", -ret); + free(der_buffer); + mbedtls_pk_free(&pk); + return UA_STRING_NULL; + } + + // The actual DER data starts at (der_buffer + der_len - ret) and has length ret + size_t actual_der_len = ret; + unsigned char *actual_der_start = der_buffer + der_len - ret; + + // Allocate the exact amount needed and copy + der_data.data = (uint8_t *)malloc(actual_der_len); + if (!der_data.data) { + printf("Failed to allocate final DER buffer\n"); + free(der_buffer); + mbedtls_pk_free(&pk); + return UA_STRING_NULL; + } + + memcpy(der_data.data, actual_der_start, actual_der_len); + der_data.length = actual_der_len; + + free(der_buffer); + mbedtls_pk_free(&pk); + + printf("Successfully converted private key from PEM to DER, size: %lu bytes\n", der_data.length); + } else { + // Handle certificate conversion + mbedtls_x509_crt crt; + mbedtls_x509_crt_init(&crt); + + // Parse PEM certificate + ret = mbedtls_x509_crt_parse(&crt, (const unsigned char *)pem_data, strlen(pem_data) + 1); + if (ret != 0) { + printf("Failed to parse PEM certificate, mbedtls error: -0x%04x\n", -ret); + mbedtls_x509_crt_free(&crt); + return UA_STRING_NULL; + } + + // The certificate's DER data is already available in the parsed structure + der_data.data = (uint8_t *)malloc(crt.raw.len); + if (!der_data.data) { + printf("Failed to allocate memory for DER certificate\n"); + mbedtls_x509_crt_free(&crt); + return UA_STRING_NULL; + } + + memcpy(der_data.data, crt.raw.p, crt.raw.len); + der_data.length = crt.raw.len; + mbedtls_x509_crt_free(&crt); + + printf("Successfully converted certificate from PEM to DER, size: %lu bytes\n", der_data.length); + } + + return der_data; +} + static VALUE toRubyTime(UA_DateTime raw_date) { UA_DateTimeStruct dts = UA_DateTime_toStruct(raw_date); VALUE year = UINT2NUM(dts.year); @@ -27,6 +162,40 @@ static VALUE toRubyTime(UA_DateTime raw_date) { return rb_date; } +static UA_DateTime fromRubyTime(VALUE ruby_time) { + // Handle both Time objects and numeric values (milliseconds) + if (RB_TYPE_P(ruby_time, T_FIXNUM) || RB_TYPE_P(ruby_time, T_BIGNUM)) { + // Treat as milliseconds and convert to UA_DateTime + long long milliseconds = NUM2LL(ruby_time); + return milliseconds * UA_DATETIME_MSEC; + } else if (rb_obj_is_kind_of(ruby_time, rb_cTime)) { + // Ruby Time object - extract components + VALUE year = rb_funcall(ruby_time, rb_intern("year"), 0); + VALUE month = rb_funcall(ruby_time, rb_intern("month"), 0); + VALUE day = rb_funcall(ruby_time, rb_intern("day"), 0); + VALUE hour = rb_funcall(ruby_time, rb_intern("hour"), 0); + VALUE min = rb_funcall(ruby_time, rb_intern("min"), 0); + VALUE sec = rb_funcall(ruby_time, rb_intern("sec"), 0); + VALUE usec = rb_funcall(ruby_time, rb_intern("usec"), 0); + + // Convert to UA_DateTime using Unix timestamp approach + VALUE unix_time = rb_funcall(ruby_time, rb_intern("to_i"), 0); + long long unix_seconds = NUM2LL(unix_time); + long long microseconds = NUM2LL(usec); + + // Convert Unix timestamp to OPC UA DateTime + // OPC UA DateTime is 100-nanosecond intervals since January 1, 1601 UTC + UA_DateTime ua_time = (unix_seconds * UA_DATETIME_SEC) + UA_DATETIME_UNIX_EPOCH; + ua_time += microseconds * UA_DATETIME_USEC; + + return ua_time; + } else { + // Fallback: treat as numeric milliseconds + double ms = NUM2DBL(ruby_time); + return (UA_DateTime)(ms * UA_DATETIME_MSEC); + } +} + static void handler_dataChanged(UA_Client *client, UA_UInt32 subId, void *subContext, UA_UInt32 monId, void *monContext, UA_DataValue *value) { @@ -159,40 +328,173 @@ static VALUE allocate(VALUE klass) { } static VALUE rb_initialize(VALUE self) { - struct UninitializedClient * uclient; + struct UninitializedClient *uclient; TypedData_Get_Struct(self, struct UninitializedClient, &UA_Client_Type, uclient); - UA_ClientConfig customConfig = UA_ClientConfig_default; - customConfig.stateCallback = stateCallback; - customConfig.subscriptionInactivityCallback = subscriptionInactivityCallback; + uclient->client = UA_Client_new(); + + UA_ClientConfig *config = UA_Client_getConfig(uclient->client); + + config->stateCallback = stateCallback; + + config->subscriptionInactivityCallback = subscriptionInactivityCallback; struct OpcuaClientContext *ctx = ALLOC(struct OpcuaClientContext); *ctx = (const struct OpcuaClientContext){ 0 }; ctx->rubyClientInstance = self; - customConfig.clientContext = ctx; - - uclient->client = UA_Client_new(customConfig); + config->clientContext = ctx; return Qnil; } -static VALUE rb_connect(VALUE self, VALUE v_connectionString) { +// Helper function to check if a string value is nil or empty +static bool is_empty_or_nil(VALUE val) { + return NIL_P(val) || (RB_TYPE_P(val, T_STRING) && RSTRING_LEN(val) == 0); +} + +static VALUE rb_connect(int argc, VALUE *argv, VALUE self) { + VALUE v_connectionString, v_username, v_password, v_client_cert, v_private_key; + + // Require 1 arg (url), allow up to 5 (url, username, password, client_cert, private_key) + rb_scan_args(argc, argv, "14", &v_connectionString, &v_username, &v_password, &v_client_cert, &v_private_key); + if (RB_TYPE_P(v_connectionString, T_STRING) != 1) { + printf("Invalid connection string provided.\n"); return raise_invalid_arguments_error(); } char *connectionString = StringValueCStr(v_connectionString); - struct UninitializedClient * uclient; + struct UninitializedClient *uclient; TypedData_Get_Struct(self, struct UninitializedClient, &UA_Client_Type, uclient); UA_Client *client = uclient->client; - UA_StatusCode status = UA_Client_connect(client, connectionString); + UA_StatusCode status; + UA_ClientConfig *config = UA_Client_getConfig(client); + + struct OpcuaClientContext *existing_ctx = (struct OpcuaClientContext *)config->clientContext; + + // Check if we need to avoid reconfiguring security policies for reconnection + bool hasExistingSecurityPolicies = (config->securityPoliciesSize > 0); + + // Check client state - only proceed with connection if not already in session + UA_ClientState clientState = UA_Client_getState(client); + bool isDisconnected = (clientState == UA_CLIENTSTATE_DISCONNECTED); + + // If we're already connected/in session, return success immediately + if (clientState == UA_CLIENTSTATE_SESSION || clientState == UA_CLIENTSTATE_SESSION_RENEWED) { + printf("Client already has active session (state: %d), skipping connection...\n", clientState); + return Qnil; + } + + // Only clear cached endpoint info if we're actually disconnected + // This prevents disrupting active sessions + if (isDisconnected) { + printf("Client is disconnected, clearing endpoint cache for fresh discovery...\n"); + UA_EndpointDescription_clear(&config->endpoint); + UA_UserTokenPolicy_clear(&config->userTokenPolicy); + UA_String_clear(&config->securityPolicyUri); + } else { + printf("Client is connecting, preserving endpoint configuration...\n"); + } + + bool useEncryption = !is_empty_or_nil(v_username) && !is_empty_or_nil(v_password) && + !is_empty_or_nil(v_client_cert) && !is_empty_or_nil(v_private_key); + + if (useEncryption) { + printf("Setting up encrypted connection...\n"); + printf("***CONNECTING***\n"); + if (hasExistingSecurityPolicies) { + printf("Security policies already configured, skipping encryption setup...\n"); + + config->stateCallback = stateCallback; + config->subscriptionInactivityCallback = subscriptionInactivityCallback; + config->clientContext = existing_ctx; + } else { + // First-time encryption setup + // Validate certificate and private key parameters + if (RB_TYPE_P(v_client_cert, T_STRING) != 1 || RB_TYPE_P(v_private_key, T_STRING) != 1) { + printf("Invalid certificate or private key provided.\n"); + return raise_invalid_arguments_error(); + } + + // Convert PEM certificates to DER format + char *cert_pem = StringValueCStr(v_client_cert); + char *key_pem = StringValueCStr(v_private_key); + + printf("Converting PEM certificates to DER format...\n"); + UA_ByteString certificate = convertPemToDer(cert_pem, 0); // 0 = certificate + UA_ByteString privateKey = convertPemToDer(key_pem, 1); // 1 = private key + + if (certificate.data == NULL || privateKey.data == NULL) { + printf("Failed to convert certificates to DER format.\n"); + if (certificate.data) UA_ByteString_clear(&certificate); + if (privateKey.data) UA_ByteString_clear(&privateKey); + return raise_invalid_arguments_error(); + } + + printf("Configuring encryption...\n"); + status = UA_ClientConfig_setDefaultEncryption(config, certificate, privateKey, + NULL, 0, NULL, 0); + + UA_ByteString_clear(&certificate); + UA_ByteString_clear(&privateKey); + + if (status != UA_STATUSCODE_GOOD) { + printf("Failed to set encryption configuration: %s\n", UA_StatusCode_name(status)); + return raise_ua_status_error(status); + } + + config->stateCallback = stateCallback; + config->subscriptionInactivityCallback = subscriptionInactivityCallback; + config->clientContext = existing_ctx; + + printf("Encryption configuration successful.\n"); + } + } else { + printf("Setting up non-encrypted connection...\n"); + + if (!hasExistingSecurityPolicies) { + status = UA_ClientConfig_setDefault(config); + if (status != UA_STATUSCODE_GOOD) { + printf("Failed to set default configuration: %s\n", UA_StatusCode_name(status)); + return raise_ua_status_error(status); + } + } else { + printf("Security policies already exist, skipping default config setup...\n"); + } + + config->stateCallback = stateCallback; + config->subscriptionInactivityCallback = subscriptionInactivityCallback; + config->clientContext = existing_ctx; + } + + UA_String_deleteMembers(&config->clientDescription.applicationUri); + config->clientDescription.applicationUri = UA_STRING_NULL; + + if (!is_empty_or_nil(v_username) && !is_empty_or_nil(v_password)) { + // Username/password authentication + const char *username = StringValueCStr(v_username); + const char *password = StringValueCStr(v_password); + + printf("Connecting with username/password authentication%s...\n", useEncryption ? " and encryption" : ""); + + // Connect with username and password + status = UA_Client_connect_username(client, connectionString, username, password); + } else { + // Anonymous authentication + printf("Connecting anonymously%s...\n", useEncryption ? " with encryption" : ""); + + // Connect anonymously + status = UA_Client_connect(client, connectionString); + } if (status == UA_STATUSCODE_GOOD) { + printf("Connection successful!\n"); return Qnil; } else { + printf("Connection failed: %s\n", UA_StatusCode_name(status)); return raise_ua_status_error(status); } } @@ -238,12 +540,89 @@ static VALUE rb_addMonitoredItem(VALUE self, VALUE v_subscriptionId, VALUE v_mon } } +static VALUE rb_deleteMonitoredItem(VALUE self, VALUE v_subscriptionId, VALUE v_monitoredItemId) { + struct UninitializedClient * uclient; + TypedData_Get_Struct(self, struct UninitializedClient, &UA_Client_Type, uclient); + UA_Client *client = uclient->client; + + UA_UInt32 subscriptionId = NUM2UINT(v_subscriptionId); + UA_UInt32 monitoredItemId = NUM2UINT(v_monitoredItemId); + + UA_DeleteMonitoredItemsRequest deleteRequest; + UA_DeleteMonitoredItemsRequest_init(&deleteRequest); + deleteRequest.subscriptionId = subscriptionId; + deleteRequest.monitoredItemIds = &monitoredItemId; + deleteRequest.monitoredItemIdsSize = 1; + + UA_DeleteMonitoredItemsResponse deleteResponse = + UA_Client_MonitoredItems_delete(client, deleteRequest); + + if (deleteResponse.responseHeader.serviceResult == UA_STATUSCODE_GOOD && + deleteResponse.resultsSize > 0 && + deleteResponse.results[0] == UA_STATUSCODE_GOOD) { + printf("Successfully deleted monitored item %u from subscription %u\n", monitoredItemId, subscriptionId); + UA_DeleteMonitoredItemsResponse_clear(&deleteResponse); + return Qtrue; + } else { + printf("Failed to delete monitored item %u from subscription %u\n", monitoredItemId, subscriptionId); + UA_DeleteMonitoredItemsResponse_clear(&deleteResponse); + return Qfalse; + } +} + +static VALUE rb_deleteSubscription(VALUE self, VALUE v_subscriptionId) { + struct UninitializedClient * uclient; + TypedData_Get_Struct(self, struct UninitializedClient, &UA_Client_Type, uclient); + UA_Client *client = uclient->client; + + UA_UInt32 subscriptionId = NUM2UINT(v_subscriptionId); + + UA_DeleteSubscriptionsRequest deleteRequest; + UA_DeleteSubscriptionsRequest_init(&deleteRequest); + deleteRequest.subscriptionIds = &subscriptionId; + deleteRequest.subscriptionIdsSize = 1; + + UA_DeleteSubscriptionsResponse deleteResponse = + UA_Client_Subscriptions_delete(client, deleteRequest); + + if (deleteResponse.responseHeader.serviceResult == UA_STATUSCODE_GOOD && + deleteResponse.resultsSize > 0 && + deleteResponse.results[0] == UA_STATUSCODE_GOOD) { + printf("Successfully deleted subscription %u\n", subscriptionId); + UA_DeleteSubscriptionsResponse_clear(&deleteResponse); + return Qtrue; + } else { + printf("Failed to delete subscription %u\n", subscriptionId); + UA_DeleteSubscriptionsResponse_clear(&deleteResponse); + return Qfalse; + } +} + +static VALUE rb_deleteAllSubscriptions(VALUE self) { + struct UninitializedClient * uclient; + TypedData_Get_Struct(self, struct UninitializedClient, &UA_Client_Type, uclient); + UA_Client *client = uclient->client; + + // This will delete all subscriptions for the client session + UA_StatusCode status = UA_Client_Subscriptions_deleteSingle(client, 0); + + if (status == UA_STATUSCODE_GOOD || status == UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID) { + // BADSUBSCRIPTIONIDINVALID means no subscriptions exist, which is also success for our purpose + printf("Successfully deleted all subscriptions\n"); + return Qtrue; + } else { + printf("Failed to delete all subscriptions: %s\n", UA_StatusCode_name(status)); + return Qfalse; + } +} + static VALUE rb_disconnect(VALUE self) { struct UninitializedClient * uclient; TypedData_Get_Struct(self, struct UninitializedClient, &UA_Client_Type, uclient); UA_Client *client = uclient->client; UA_StatusCode status = UA_Client_disconnect(client); + printf("***DISCONNECTING***\n"); return RB_UINT2NUM(status); } @@ -252,7 +631,7 @@ static UA_StatusCode multiRead(UA_Client *client, const UA_NodeId *nodeId, UA_Va UA_UInt16 rvSize = UA_TYPES[UA_TYPES_READVALUEID].memSize; UA_ReadValueId *rValues = UA_calloc(varsCount, rvSize); - for (int i=0; inodeId = nodeId[i]; readItem->attributeId = UA_ATTRIBUTEID_VALUE; @@ -265,14 +644,14 @@ static UA_StatusCode multiRead(UA_Client *client, const UA_NodeId *nodeId, UA_Va UA_ReadResponse response = UA_Client_Service_read(client, request); UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD) { - if(response.resultsSize == varsCount) + if (retval == UA_STATUSCODE_GOOD) { + if (response.resultsSize == (size_t)varsCount) retval = response.results[0].status; else retval = UA_STATUSCODE_BADUNEXPECTEDERROR; } - if(retval != UA_STATUSCODE_GOOD) { + if (retval != UA_STATUSCODE_GOOD) { UA_ReadResponse_deleteMembers(&response); UA_free(rValues); return retval; @@ -281,14 +660,14 @@ static UA_StatusCode multiRead(UA_Client *client, const UA_NodeId *nodeId, UA_Va /* Set the StatusCode */ UA_DataValue *results = response.results; - if (response.resultsSize != varsCount) { + if (response.resultsSize != (size_t)varsCount) { retval = UA_STATUSCODE_BADUNEXPECTEDERROR; UA_ReadResponse_deleteMembers(&response); UA_free(rValues); return retval; } - for (int i=0; iattributeId = attributeId; wValue->nodeId = nodeId[i]; @@ -330,11 +709,11 @@ static UA_StatusCode multiWrite(UA_Client *client, const UA_NodeId *nodeId, cons UA_WriteResponse wResp = UA_Client_Service_write(client, wReq); UA_StatusCode retval = wResp.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD) { - if(wResp.resultsSize == varsSize) { + if (retval == UA_STATUSCODE_GOOD) { + if (wResp.resultsSize == (size_t)varsSize) { retval = wResp.results[0]; - for (int i=0; iclient; + + UA_UInt16 nidSize = UA_TYPES[UA_TYPES_NODEID].memSize; + UA_UInt16 variantSize = UA_TYPES[UA_TYPES_VARIANT].memSize; + + UA_NodeId *nodes = UA_calloc(nodeIdsCount, nidSize); + UA_Variant *readValues = UA_calloc(nodeIdsCount, variantSize); + + for (int i=0; iclient; + + UA_UInt16 nidSize = UA_TYPES[UA_TYPES_NODEID].memSize; + UA_UInt16 variantSize = UA_TYPES[UA_TYPES_VARIANT].memSize; + + UA_NodeId *nodes = UA_calloc(namesCount, nidSize); + UA_Variant *readValues = UA_calloc(namesCount, variantSize); + + for (int i=0; i + +/** + * base64_encode - Base64 encode + * @src: Data to be encoded + * @len: Length of the data to be encoded + * @out_len: Pointer to output length variable + * Returns: Allocated buffer of out_len bytes of encoded data, + * or %NULL on failure. The output is NOT Null-terminated. */ +unsigned char * +UA_base64(const unsigned char *src, size_t len, size_t *out_len); + +/** + * base64_decode - Base64 decode + * @src: Data to be decoded + * @len: Length of the data to be decoded + * @out_len: Pointer to output length variable + * Returns: Allocated buffer of out_len bytes of decoded data, + * or %NULL on failure. */ +unsigned char * +UA_unbase64(const unsigned char *src, size_t len, size_t *out_len); + +_UA_END_DECLS + +#endif /* UA_BASE64_H_ */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/ua_util_internal.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2014, 2017 (c) Florian Palm * Copyright 2015 (c) LEvertz * Copyright 2015-2016 (c) Sten Grüner @@ -776,16 +788,21 @@ int __secs_to_tm(long long t, struct mytm *tm); */ +#define UA_INTERNAL -#ifdef __cplusplus -extern "C" { -#endif - -/* BSD Queue Macros */ +_UA_BEGIN_DECLS /* Macro-Expand for MSVC workarounds */ #define UA_MACRO_EXPAND(x) x +/* Print a NodeId in logs */ +#define UA_LOG_NODEID_WRAP(NODEID, LOG) { \ + UA_String nodeIdStr = UA_STRING_NULL; \ + UA_NodeId_toString(NODEID, &nodeIdStr); \ + LOG; \ + UA_String_clear(&nodeIdStr); \ +} + /* Integer Shortnames * ------------------ * These are not exposed on the public API, since many user-applications make @@ -801,136 +818,23 @@ typedef UA_UInt64 u64; typedef UA_Int64 i64; typedef UA_StatusCode status; -/* Atomic Operations - * ----------------- - * Atomic operations that synchronize across processor cores (for - * multithreading). Only the inline-functions defined next are used. Replace - * with architecture-specific operations if necessary. */ -#ifndef UA_ENABLE_MULTITHREADING -# define UA_atomic_sync() -#else -# ifdef _MSC_VER /* Visual Studio */ -# define UA_atomic_sync() _ReadWriteBarrier() -# else /* GCC/Clang */ -# define UA_atomic_sync() __sync_synchronize() -# endif -#endif - -static UA_INLINE void * -UA_atomic_xchg(void * volatile * addr, void *newptr) { -#ifndef UA_ENABLE_MULTITHREADING - void *old = *addr; - *addr = newptr; - return old; -#else -# ifdef _MSC_VER /* Visual Studio */ - return _InterlockedExchangePointer(addr, newptr); -# else /* GCC/Clang */ - return __sync_lock_test_and_set(addr, newptr); -# endif -#endif -} - -static UA_INLINE void * -UA_atomic_cmpxchg(void * volatile * addr, void *expected, void *newptr) { -#ifndef UA_ENABLE_MULTITHREADING - void *old = *addr; - if(old == expected) { - *addr = newptr; - } - return old; -#else -# ifdef _MSC_VER /* Visual Studio */ - return _InterlockedCompareExchangePointer(addr, expected, newptr); -# else /* GCC/Clang */ - return __sync_val_compare_and_swap(addr, expected, newptr); -# endif -#endif -} - -static UA_INLINE uint32_t -UA_atomic_addUInt32(volatile uint32_t *addr, uint32_t increase) { -#ifndef UA_ENABLE_MULTITHREADING - *addr += increase; - return *addr; -#else -# ifdef _MSC_VER /* Visual Studio */ - return _InterlockedExchangeAdd(addr, increase) + increase; -# else /* GCC/Clang */ - return __sync_add_and_fetch(addr, increase); -# endif -#endif -} - -static UA_INLINE size_t -UA_atomic_addSize(volatile size_t *addr, size_t increase) { -#ifndef UA_ENABLE_MULTITHREADING - *addr += increase; - return *addr; -#else -# ifdef _MSC_VER /* Visual Studio */ - return _InterlockedExchangeAdd(addr, increase) + increase; -# else /* GCC/Clang */ - return __sync_add_and_fetch(addr, increase); -# endif -#endif -} - -static UA_INLINE uint32_t -UA_atomic_subUInt32(volatile uint32_t *addr, uint32_t decrease) { -#ifndef UA_ENABLE_MULTITHREADING - *addr -= decrease; - return *addr; -#else -# ifdef _MSC_VER /* Visual Studio */ - return _InterlockedExchangeSub(addr, decrease) - decrease; -# else /* GCC/Clang */ - return __sync_sub_and_fetch(addr, decrease); -# endif -#endif -} - -static UA_INLINE size_t -UA_atomic_subSize(volatile size_t *addr, size_t decrease) { -#ifndef UA_ENABLE_MULTITHREADING - *addr -= decrease; - return *addr; -#else -# ifdef _MSC_VER /* Visual Studio */ - return _InterlockedExchangeSub(addr, decrease) - decrease; -# else /* GCC/Clang */ - return __sync_sub_and_fetch(addr, decrease); -# endif -#endif -} - /* Utility Functions * ----------------- */ -/* Convert given byte string to a positive number. Returns the number of valid - * digits. Stops if a non-digit char is found and returns the number of digits - * up to that point. */ -size_t UA_readNumber(u8 *buf, size_t buflen, u32 *number); - -#define UA_MIN(A,B) (A > B ? B : A) -#define UA_MAX(A,B) (A > B ? A : B) - #ifdef UA_DEBUG_DUMP_PKGS void UA_EXPORT UA_dump_hex_pkg(UA_Byte* buffer, size_t bufferLen); #endif -#ifdef __cplusplus -} // extern "C" -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/ua_types_encoding_binary.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/ua_types_encoding_binary.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2015 (c) Sten Grüner * Copyright 2014, 2017 (c) Florian Palm * Copyright 2017 (c) Stefan Profanter, fortiss GmbH @@ -938,10 +842,8 @@ void UA_EXPORT UA_dump_hex_pkg(UA_Byte* buffer, size_t bufferLen); */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS typedef UA_StatusCode (*UA_exchangeEncodeBuffer)(void *handle, UA_Byte **bufPos, const UA_Byte **bufEnd); @@ -964,7 +866,7 @@ typedef UA_StatusCode (*UA_exchangeEncodeBuffer)(void *handle, UA_Byte **bufPos, Is ignored if NULL. * @param exchangeHandle Custom data passed into the exchangeCallback. * @return Returns a statuscode whether encoding succeeded. */ -UA_StatusCode +UA_StatusCode UA_encodeBinary(const void *src, const UA_DataType *type, UA_Byte **bufPos, const UA_Byte **bufEnd, UA_exchangeEncodeBuffer exchangeCallback, @@ -989,2034 +891,3181 @@ UA_encodeBinary(const void *src, const UA_DataType *type, * @return Returns a statuscode whether decoding succeeded. */ UA_StatusCode UA_decodeBinary(const UA_ByteString *src, size_t *offset, void *dst, - const UA_DataType *type, size_t customTypesSize, - const UA_DataType *customTypes) UA_FUNC_ATTR_WARN_UNUSED_RESULT; + const UA_DataType *type, const UA_DataTypeArray *customTypes) + UA_FUNC_ATTR_WARN_UNUSED_RESULT; /* Returns the number of bytes the value p takes in binary encoding. Returns * zero if an error occurs. UA_calcSizeBinary is thread-safe and reentrant since * it does not access global (thread-local) variables. */ size_t -UA_calcSizeBinary(void *p, const UA_DataType *type); +UA_calcSizeBinary(const void *p, const UA_DataType *type); const UA_DataType * UA_findDataTypeByBinary(const UA_NodeId *typeId); -#ifdef __cplusplus -} -#endif +_UA_END_DECLS + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/types_generated_encoding_binary.h" ***********************************/ -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/build/src_generated/ua_types_generated_encoding_binary.h" ***********************************/ +/* Generated from Opc.Ua.Types.bsd with script /Users/jelena/Desktop/open62541/tools/generate_datatypes.py + * on host Jelena-2.local by user jelena at 2025-09-11 03:30:41 */ + +#ifdef UA_ENABLE_AMALGAMATION +#else +#endif -/* Generated from Opc.Ua.Types.bsd with script /home/travis/build/open62541/open62541/tools/generate_datatypes.py - * on host travis-job-193db498-e14a-4886-911f-7172c9e50b7a by user travis at 2018-12-19 02:29:43 */ /* Boolean */ +static UA_INLINE size_t +UA_Boolean_calcSizeBinary(const UA_Boolean *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BOOLEAN]); +} static UA_INLINE UA_StatusCode -UA_Boolean_encodeBinary(const UA_Boolean *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BOOLEAN], bufPos, bufEnd, NULL, NULL); +UA_Boolean_encodeBinary(const UA_Boolean *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BOOLEAN], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_Boolean_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Boolean *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BOOLEAN], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BOOLEAN], NULL); } /* SByte */ +static UA_INLINE size_t +UA_SByte_calcSizeBinary(const UA_SByte *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SBYTE]); +} static UA_INLINE UA_StatusCode -UA_SByte_encodeBinary(const UA_SByte *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SBYTE], bufPos, bufEnd, NULL, NULL); +UA_SByte_encodeBinary(const UA_SByte *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SBYTE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_SByte_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SByte *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SBYTE], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SBYTE], NULL); } /* Byte */ +static UA_INLINE size_t +UA_Byte_calcSizeBinary(const UA_Byte *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BYTE]); +} static UA_INLINE UA_StatusCode -UA_Byte_encodeBinary(const UA_Byte *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BYTE], bufPos, bufEnd, NULL, NULL); +UA_Byte_encodeBinary(const UA_Byte *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BYTE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_Byte_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Byte *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BYTE], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BYTE], NULL); } /* Int16 */ +static UA_INLINE size_t +UA_Int16_calcSizeBinary(const UA_Int16 *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_INT16]); +} static UA_INLINE UA_StatusCode -UA_Int16_encodeBinary(const UA_Int16 *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_INT16], bufPos, bufEnd, NULL, NULL); +UA_Int16_encodeBinary(const UA_Int16 *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_INT16], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_Int16_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Int16 *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_INT16], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_INT16], NULL); } /* UInt16 */ +static UA_INLINE size_t +UA_UInt16_calcSizeBinary(const UA_UInt16 *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UINT16]); +} static UA_INLINE UA_StatusCode -UA_UInt16_encodeBinary(const UA_UInt16 *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UINT16], bufPos, bufEnd, NULL, NULL); +UA_UInt16_encodeBinary(const UA_UInt16 *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UINT16], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_UInt16_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UInt16 *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UINT16], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UINT16], NULL); } /* Int32 */ +static UA_INLINE size_t +UA_Int32_calcSizeBinary(const UA_Int32 *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_INT32]); +} static UA_INLINE UA_StatusCode -UA_Int32_encodeBinary(const UA_Int32 *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_INT32], bufPos, bufEnd, NULL, NULL); +UA_Int32_encodeBinary(const UA_Int32 *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_INT32], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_Int32_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Int32 *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_INT32], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_INT32], NULL); } /* UInt32 */ +static UA_INLINE size_t +UA_UInt32_calcSizeBinary(const UA_UInt32 *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UINT32]); +} static UA_INLINE UA_StatusCode -UA_UInt32_encodeBinary(const UA_UInt32 *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UINT32], bufPos, bufEnd, NULL, NULL); +UA_UInt32_encodeBinary(const UA_UInt32 *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UINT32], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_UInt32_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UInt32 *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UINT32], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UINT32], NULL); } /* Int64 */ +static UA_INLINE size_t +UA_Int64_calcSizeBinary(const UA_Int64 *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_INT64]); +} static UA_INLINE UA_StatusCode -UA_Int64_encodeBinary(const UA_Int64 *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_INT64], bufPos, bufEnd, NULL, NULL); +UA_Int64_encodeBinary(const UA_Int64 *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_INT64], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_Int64_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Int64 *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_INT64], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_INT64], NULL); } /* UInt64 */ +static UA_INLINE size_t +UA_UInt64_calcSizeBinary(const UA_UInt64 *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UINT64]); +} static UA_INLINE UA_StatusCode -UA_UInt64_encodeBinary(const UA_UInt64 *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UINT64], bufPos, bufEnd, NULL, NULL); +UA_UInt64_encodeBinary(const UA_UInt64 *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UINT64], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_UInt64_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UInt64 *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UINT64], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UINT64], NULL); } /* Float */ +static UA_INLINE size_t +UA_Float_calcSizeBinary(const UA_Float *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FLOAT]); +} static UA_INLINE UA_StatusCode -UA_Float_encodeBinary(const UA_Float *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FLOAT], bufPos, bufEnd, NULL, NULL); +UA_Float_encodeBinary(const UA_Float *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FLOAT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_Float_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Float *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FLOAT], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FLOAT], NULL); } /* Double */ +static UA_INLINE size_t +UA_Double_calcSizeBinary(const UA_Double *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DOUBLE]); +} static UA_INLINE UA_StatusCode -UA_Double_encodeBinary(const UA_Double *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DOUBLE], bufPos, bufEnd, NULL, NULL); +UA_Double_encodeBinary(const UA_Double *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DOUBLE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_Double_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Double *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DOUBLE], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DOUBLE], NULL); } /* String */ +static UA_INLINE size_t +UA_String_calcSizeBinary(const UA_String *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_STRING]); +} static UA_INLINE UA_StatusCode -UA_String_encodeBinary(const UA_String *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STRING], bufPos, bufEnd, NULL, NULL); +UA_String_encodeBinary(const UA_String *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STRING], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_String_decodeBinary(const UA_ByteString *src, size_t *offset, UA_String *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STRING], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STRING], NULL); } /* DateTime */ +static UA_INLINE size_t +UA_DateTime_calcSizeBinary(const UA_DateTime *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATETIME]); +} static UA_INLINE UA_StatusCode -UA_DateTime_encodeBinary(const UA_DateTime *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATETIME], bufPos, bufEnd, NULL, NULL); +UA_DateTime_encodeBinary(const UA_DateTime *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATETIME], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_DateTime_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DateTime *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATETIME], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATETIME], NULL); } /* Guid */ +static UA_INLINE size_t +UA_Guid_calcSizeBinary(const UA_Guid *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_GUID]); +} static UA_INLINE UA_StatusCode -UA_Guid_encodeBinary(const UA_Guid *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_GUID], bufPos, bufEnd, NULL, NULL); +UA_Guid_encodeBinary(const UA_Guid *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_GUID], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_Guid_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Guid *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_GUID], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_GUID], NULL); } /* ByteString */ +static UA_INLINE size_t +UA_ByteString_calcSizeBinary(const UA_ByteString *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BYTESTRING]); +} static UA_INLINE UA_StatusCode -UA_ByteString_encodeBinary(const UA_ByteString *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BYTESTRING], bufPos, bufEnd, NULL, NULL); +UA_ByteString_encodeBinary(const UA_ByteString *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BYTESTRING], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_ByteString_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ByteString *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BYTESTRING], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BYTESTRING], NULL); } /* XmlElement */ +static UA_INLINE size_t +UA_XmlElement_calcSizeBinary(const UA_XmlElement *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_XMLELEMENT]); +} static UA_INLINE UA_StatusCode -UA_XmlElement_encodeBinary(const UA_XmlElement *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_XMLELEMENT], bufPos, bufEnd, NULL, NULL); +UA_XmlElement_encodeBinary(const UA_XmlElement *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_XMLELEMENT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_XmlElement_decodeBinary(const UA_ByteString *src, size_t *offset, UA_XmlElement *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_XMLELEMENT], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_XMLELEMENT], NULL); } /* NodeId */ +static UA_INLINE size_t +UA_NodeId_calcSizeBinary(const UA_NodeId *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_NODEID]); +} static UA_INLINE UA_StatusCode -UA_NodeId_encodeBinary(const UA_NodeId *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NODEID], bufPos, bufEnd, NULL, NULL); +UA_NodeId_encodeBinary(const UA_NodeId *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NODEID], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_NodeId_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NodeId *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NODEID], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NODEID], NULL); } /* ExpandedNodeId */ +static UA_INLINE size_t +UA_ExpandedNodeId_calcSizeBinary(const UA_ExpandedNodeId *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); +} static UA_INLINE UA_StatusCode -UA_ExpandedNodeId_encodeBinary(const UA_ExpandedNodeId *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EXPANDEDNODEID], bufPos, bufEnd, NULL, NULL); +UA_ExpandedNodeId_encodeBinary(const UA_ExpandedNodeId *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EXPANDEDNODEID], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_ExpandedNodeId_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ExpandedNodeId *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EXPANDEDNODEID], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EXPANDEDNODEID], NULL); } /* StatusCode */ +static UA_INLINE size_t +UA_StatusCode_calcSizeBinary(const UA_StatusCode *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_STATUSCODE]); +} static UA_INLINE UA_StatusCode -UA_StatusCode_encodeBinary(const UA_StatusCode *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STATUSCODE], bufPos, bufEnd, NULL, NULL); +UA_StatusCode_encodeBinary(const UA_StatusCode *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STATUSCODE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_StatusCode_decodeBinary(const UA_ByteString *src, size_t *offset, UA_StatusCode *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STATUSCODE], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STATUSCODE], NULL); } /* QualifiedName */ +static UA_INLINE size_t +UA_QualifiedName_calcSizeBinary(const UA_QualifiedName *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]); +} static UA_INLINE UA_StatusCode -UA_QualifiedName_encodeBinary(const UA_QualifiedName *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_QUALIFIEDNAME], bufPos, bufEnd, NULL, NULL); +UA_QualifiedName_encodeBinary(const UA_QualifiedName *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_QUALIFIEDNAME], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_QualifiedName_decodeBinary(const UA_ByteString *src, size_t *offset, UA_QualifiedName *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_QUALIFIEDNAME], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_QUALIFIEDNAME], NULL); } /* LocalizedText */ +static UA_INLINE size_t +UA_LocalizedText_calcSizeBinary(const UA_LocalizedText *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); +} static UA_INLINE UA_StatusCode -UA_LocalizedText_encodeBinary(const UA_LocalizedText *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], bufPos, bufEnd, NULL, NULL); +UA_LocalizedText_encodeBinary(const UA_LocalizedText *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_LocalizedText_decodeBinary(const UA_ByteString *src, size_t *offset, UA_LocalizedText *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], NULL); } /* ExtensionObject */ +static UA_INLINE size_t +UA_ExtensionObject_calcSizeBinary(const UA_ExtensionObject *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); +} static UA_INLINE UA_StatusCode -UA_ExtensionObject_encodeBinary(const UA_ExtensionObject *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT], bufPos, bufEnd, NULL, NULL); +UA_ExtensionObject_encodeBinary(const UA_ExtensionObject *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_ExtensionObject_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ExtensionObject *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT], NULL); } /* DataValue */ +static UA_INLINE size_t +UA_DataValue_calcSizeBinary(const UA_DataValue *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATAVALUE]); +} static UA_INLINE UA_StatusCode -UA_DataValue_encodeBinary(const UA_DataValue *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATAVALUE], bufPos, bufEnd, NULL, NULL); +UA_DataValue_encodeBinary(const UA_DataValue *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATAVALUE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_DataValue_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataValue *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATAVALUE], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATAVALUE], NULL); } /* Variant */ +static UA_INLINE size_t +UA_Variant_calcSizeBinary(const UA_Variant *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_VARIANT]); +} static UA_INLINE UA_StatusCode -UA_Variant_encodeBinary(const UA_Variant *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VARIANT], bufPos, bufEnd, NULL, NULL); +UA_Variant_encodeBinary(const UA_Variant *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VARIANT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_Variant_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Variant *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VARIANT], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VARIANT], NULL); } /* DiagnosticInfo */ +static UA_INLINE size_t +UA_DiagnosticInfo_calcSizeBinary(const UA_DiagnosticInfo *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]); +} static UA_INLINE UA_StatusCode -UA_DiagnosticInfo_encodeBinary(const UA_DiagnosticInfo *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO], bufPos, bufEnd, NULL, NULL); +UA_DiagnosticInfo_encodeBinary(const UA_DiagnosticInfo *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode UA_DiagnosticInfo_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DiagnosticInfo *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO], 0, NULL); + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO], NULL); } -/* SignedSoftwareCertificate */ +/* KeyValuePair */ +static UA_INLINE size_t +UA_KeyValuePair_calcSizeBinary(const UA_KeyValuePair *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_KEYVALUEPAIR]); +} static UA_INLINE UA_StatusCode -UA_SignedSoftwareCertificate_encodeBinary(const UA_SignedSoftwareCertificate *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE], bufPos, bufEnd, NULL, NULL); +UA_KeyValuePair_encodeBinary(const UA_KeyValuePair *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_KEYVALUEPAIR], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SignedSoftwareCertificate_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SignedSoftwareCertificate *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE], 0, NULL); +UA_KeyValuePair_decodeBinary(const UA_ByteString *src, size_t *offset, UA_KeyValuePair *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_KEYVALUEPAIR], NULL); } -/* SemanticChangeStructureDataType */ +/* SimpleTypeDescription */ +static UA_INLINE size_t +UA_SimpleTypeDescription_calcSizeBinary(const UA_SimpleTypeDescription *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SIMPLETYPEDESCRIPTION]); +} static UA_INLINE UA_StatusCode -UA_SemanticChangeStructureDataType_encodeBinary(const UA_SemanticChangeStructureDataType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SEMANTICCHANGESTRUCTUREDATATYPE], bufPos, bufEnd, NULL, NULL); +UA_SimpleTypeDescription_encodeBinary(const UA_SimpleTypeDescription *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SIMPLETYPEDESCRIPTION], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SemanticChangeStructureDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SemanticChangeStructureDataType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SEMANTICCHANGESTRUCTUREDATATYPE], 0, NULL); +UA_SimpleTypeDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SimpleTypeDescription *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SIMPLETYPEDESCRIPTION], NULL); } -/* StatusChangeNotification */ +/* PubSubState */ +static UA_INLINE size_t +UA_PubSubState_calcSizeBinary(const UA_PubSubState *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_PUBSUBSTATE]); +} static UA_INLINE UA_StatusCode -UA_StatusChangeNotification_encodeBinary(const UA_StatusChangeNotification *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION], bufPos, bufEnd, NULL, NULL); +UA_PubSubState_encodeBinary(const UA_PubSubState *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_PUBSUBSTATE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_StatusChangeNotification_decodeBinary(const UA_ByteString *src, size_t *offset, UA_StatusChangeNotification *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION], 0, NULL); +UA_PubSubState_decodeBinary(const UA_ByteString *src, size_t *offset, UA_PubSubState *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_PUBSUBSTATE], NULL); } -/* BrowsePathTarget */ +/* DataSetFieldFlags */ +static UA_INLINE size_t +UA_DataSetFieldFlags_calcSizeBinary(const UA_DataSetFieldFlags *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATASETFIELDFLAGS]); +} static UA_INLINE UA_StatusCode -UA_BrowsePathTarget_encodeBinary(const UA_BrowsePathTarget *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET], bufPos, bufEnd, NULL, NULL); +UA_DataSetFieldFlags_encodeBinary(const UA_DataSetFieldFlags *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATASETFIELDFLAGS], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_BrowsePathTarget_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowsePathTarget *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET], 0, NULL); +UA_DataSetFieldFlags_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataSetFieldFlags *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATASETFIELDFLAGS], NULL); } -/* ViewAttributes */ +/* ConfigurationVersionDataType */ +static UA_INLINE size_t +UA_ConfigurationVersionDataType_calcSizeBinary(const UA_ConfigurationVersionDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CONFIGURATIONVERSIONDATATYPE]); +} static UA_INLINE UA_StatusCode -UA_ViewAttributes_encodeBinary(const UA_ViewAttributes *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES], bufPos, bufEnd, NULL, NULL); +UA_ConfigurationVersionDataType_encodeBinary(const UA_ConfigurationVersionDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CONFIGURATIONVERSIONDATATYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ViewAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ViewAttributes *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES], 0, NULL); +UA_ConfigurationVersionDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ConfigurationVersionDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CONFIGURATIONVERSIONDATATYPE], NULL); } -/* RequestHeader */ +/* PublishedVariableDataType */ +static UA_INLINE size_t +UA_PublishedVariableDataType_calcSizeBinary(const UA_PublishedVariableDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_PUBLISHEDVARIABLEDATATYPE]); +} static UA_INLINE UA_StatusCode -UA_RequestHeader_encodeBinary(const UA_RequestHeader *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REQUESTHEADER], bufPos, bufEnd, NULL, NULL); +UA_PublishedVariableDataType_encodeBinary(const UA_PublishedVariableDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_PUBLISHEDVARIABLEDATATYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RequestHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RequestHeader *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REQUESTHEADER], 0, NULL); +UA_PublishedVariableDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_PublishedVariableDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_PUBLISHEDVARIABLEDATATYPE], NULL); } -/* MonitoredItemModifyResult */ +/* DataSetFieldContentMask */ +static UA_INLINE size_t +UA_DataSetFieldContentMask_calcSizeBinary(const UA_DataSetFieldContentMask *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATASETFIELDCONTENTMASK]); +} static UA_INLINE UA_StatusCode -UA_MonitoredItemModifyResult_encodeBinary(const UA_MonitoredItemModifyResult *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT], bufPos, bufEnd, NULL, NULL); +UA_DataSetFieldContentMask_encodeBinary(const UA_DataSetFieldContentMask *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATASETFIELDCONTENTMASK], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_MonitoredItemModifyResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemModifyResult *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT], 0, NULL); +UA_DataSetFieldContentMask_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataSetFieldContentMask *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATASETFIELDCONTENTMASK], NULL); } -/* ElementOperand */ +/* DataSetWriterDataType */ +static UA_INLINE size_t +UA_DataSetWriterDataType_calcSizeBinary(const UA_DataSetWriterDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATASETWRITERDATATYPE]); +} static UA_INLINE UA_StatusCode -UA_ElementOperand_encodeBinary(const UA_ElementOperand *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ELEMENTOPERAND], bufPos, bufEnd, NULL, NULL); +UA_DataSetWriterDataType_encodeBinary(const UA_DataSetWriterDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATASETWRITERDATATYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ElementOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ElementOperand *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ELEMENTOPERAND], 0, NULL); +UA_DataSetWriterDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataSetWriterDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATASETWRITERDATATYPE], NULL); } -/* CloseSecureChannelRequest */ +/* NetworkAddressUrlDataType */ +static UA_INLINE size_t +UA_NetworkAddressUrlDataType_calcSizeBinary(const UA_NetworkAddressUrlDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]); +} static UA_INLINE UA_StatusCode -UA_CloseSecureChannelRequest_encodeBinary(const UA_CloseSecureChannelRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST], bufPos, bufEnd, NULL, NULL); +UA_NetworkAddressUrlDataType_encodeBinary(const UA_NetworkAddressUrlDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CloseSecureChannelRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CloseSecureChannelRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST], 0, NULL); +UA_NetworkAddressUrlDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NetworkAddressUrlDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE], NULL); } -/* AddNodesResult */ +/* OverrideValueHandling */ +static UA_INLINE size_t +UA_OverrideValueHandling_calcSizeBinary(const UA_OverrideValueHandling *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_OVERRIDEVALUEHANDLING]); +} static UA_INLINE UA_StatusCode -UA_AddNodesResult_encodeBinary(const UA_AddNodesResult *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESRESULT], bufPos, bufEnd, NULL, NULL); +UA_OverrideValueHandling_encodeBinary(const UA_OverrideValueHandling *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_OVERRIDEVALUEHANDLING], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_AddNodesResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddNodesResult *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDNODESRESULT], 0, NULL); +UA_OverrideValueHandling_decodeBinary(const UA_ByteString *src, size_t *offset, UA_OverrideValueHandling *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_OVERRIDEVALUEHANDLING], NULL); } -/* VariableAttributes */ +/* DataSetOrderingType */ +static UA_INLINE size_t +UA_DataSetOrderingType_calcSizeBinary(const UA_DataSetOrderingType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATASETORDERINGTYPE]); +} static UA_INLINE UA_StatusCode -UA_VariableAttributes_encodeBinary(const UA_VariableAttributes *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES], bufPos, bufEnd, NULL, NULL); +UA_DataSetOrderingType_encodeBinary(const UA_DataSetOrderingType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATASETORDERINGTYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_VariableAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_VariableAttributes *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES], 0, NULL); +UA_DataSetOrderingType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataSetOrderingType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATASETORDERINGTYPE], NULL); } -/* NotificationMessage */ +/* UadpNetworkMessageContentMask */ +static UA_INLINE size_t +UA_UadpNetworkMessageContentMask_calcSizeBinary(const UA_UadpNetworkMessageContentMask *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UADPNETWORKMESSAGECONTENTMASK]); +} static UA_INLINE UA_StatusCode -UA_NotificationMessage_encodeBinary(const UA_NotificationMessage *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE], bufPos, bufEnd, NULL, NULL); +UA_UadpNetworkMessageContentMask_encodeBinary(const UA_UadpNetworkMessageContentMask *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UADPNETWORKMESSAGECONTENTMASK], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_NotificationMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NotificationMessage *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE], 0, NULL); +UA_UadpNetworkMessageContentMask_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UadpNetworkMessageContentMask *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UADPNETWORKMESSAGECONTENTMASK], NULL); } -/* FindServersOnNetworkRequest */ +/* UadpWriterGroupMessageDataType */ +static UA_INLINE size_t +UA_UadpWriterGroupMessageDataType_calcSizeBinary(const UA_UadpWriterGroupMessageDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE]); +} static UA_INLINE UA_StatusCode -UA_FindServersOnNetworkRequest_encodeBinary(const UA_FindServersOnNetworkRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST], bufPos, bufEnd, NULL, NULL); +UA_UadpWriterGroupMessageDataType_encodeBinary(const UA_UadpWriterGroupMessageDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_FindServersOnNetworkRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FindServersOnNetworkRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST], 0, NULL); +UA_UadpWriterGroupMessageDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UadpWriterGroupMessageDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE], NULL); } -/* EventFieldList */ +/* UadpDataSetMessageContentMask */ +static UA_INLINE size_t +UA_UadpDataSetMessageContentMask_calcSizeBinary(const UA_UadpDataSetMessageContentMask *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UADPDATASETMESSAGECONTENTMASK]); +} static UA_INLINE UA_StatusCode -UA_EventFieldList_encodeBinary(const UA_EventFieldList *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EVENTFIELDLIST], bufPos, bufEnd, NULL, NULL); +UA_UadpDataSetMessageContentMask_encodeBinary(const UA_UadpDataSetMessageContentMask *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UADPDATASETMESSAGECONTENTMASK], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_EventFieldList_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EventFieldList *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EVENTFIELDLIST], 0, NULL); +UA_UadpDataSetMessageContentMask_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UadpDataSetMessageContentMask *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UADPDATASETMESSAGECONTENTMASK], NULL); } -/* MonitoringMode */ +/* UadpDataSetWriterMessageDataType */ +static UA_INLINE size_t +UA_UadpDataSetWriterMessageDataType_calcSizeBinary(const UA_UadpDataSetWriterMessageDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE]); +} static UA_INLINE UA_StatusCode -UA_MonitoringMode_encodeBinary(const UA_MonitoringMode *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITORINGMODE], bufPos, bufEnd, NULL, NULL); +UA_UadpDataSetWriterMessageDataType_encodeBinary(const UA_UadpDataSetWriterMessageDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_MonitoringMode_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoringMode *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITORINGMODE], 0, NULL); +UA_UadpDataSetWriterMessageDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UadpDataSetWriterMessageDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE], NULL); } -/* MdnsDiscoveryConfiguration */ +/* UadpDataSetReaderMessageDataType */ +static UA_INLINE size_t +UA_UadpDataSetReaderMessageDataType_calcSizeBinary(const UA_UadpDataSetReaderMessageDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UADPDATASETREADERMESSAGEDATATYPE]); +} static UA_INLINE UA_StatusCode -UA_MdnsDiscoveryConfiguration_encodeBinary(const UA_MdnsDiscoveryConfiguration *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION], bufPos, bufEnd, NULL, NULL); +UA_UadpDataSetReaderMessageDataType_encodeBinary(const UA_UadpDataSetReaderMessageDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UADPDATASETREADERMESSAGEDATATYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_MdnsDiscoveryConfiguration_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MdnsDiscoveryConfiguration *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION], 0, NULL); +UA_UadpDataSetReaderMessageDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UadpDataSetReaderMessageDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UADPDATASETREADERMESSAGEDATATYPE], NULL); } -/* CallMethodResult */ +/* JsonNetworkMessageContentMask */ +static UA_INLINE size_t +UA_JsonNetworkMessageContentMask_calcSizeBinary(const UA_JsonNetworkMessageContentMask *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_JSONNETWORKMESSAGECONTENTMASK]); +} static UA_INLINE UA_StatusCode -UA_CallMethodResult_encodeBinary(const UA_CallMethodResult *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CALLMETHODRESULT], bufPos, bufEnd, NULL, NULL); +UA_JsonNetworkMessageContentMask_encodeBinary(const UA_JsonNetworkMessageContentMask *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_JSONNETWORKMESSAGECONTENTMASK], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CallMethodResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CallMethodResult *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CALLMETHODRESULT], 0, NULL); +UA_JsonNetworkMessageContentMask_decodeBinary(const UA_ByteString *src, size_t *offset, UA_JsonNetworkMessageContentMask *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_JSONNETWORKMESSAGECONTENTMASK], NULL); } -/* ParsingResult */ +/* JsonDataSetMessageContentMask */ +static UA_INLINE size_t +UA_JsonDataSetMessageContentMask_calcSizeBinary(const UA_JsonDataSetMessageContentMask *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_JSONDATASETMESSAGECONTENTMASK]); +} static UA_INLINE UA_StatusCode -UA_ParsingResult_encodeBinary(const UA_ParsingResult *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_PARSINGRESULT], bufPos, bufEnd, NULL, NULL); +UA_JsonDataSetMessageContentMask_encodeBinary(const UA_JsonDataSetMessageContentMask *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_JSONDATASETMESSAGECONTENTMASK], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ParsingResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ParsingResult *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_PARSINGRESULT], 0, NULL); +UA_JsonDataSetMessageContentMask_decodeBinary(const UA_ByteString *src, size_t *offset, UA_JsonDataSetMessageContentMask *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_JSONDATASETMESSAGECONTENTMASK], NULL); } -/* RelativePathElement */ +/* JsonDataSetWriterMessageDataType */ +static UA_INLINE size_t +UA_JsonDataSetWriterMessageDataType_calcSizeBinary(const UA_JsonDataSetWriterMessageDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE]); +} static UA_INLINE UA_StatusCode -UA_RelativePathElement_encodeBinary(const UA_RelativePathElement *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT], bufPos, bufEnd, NULL, NULL); +UA_JsonDataSetWriterMessageDataType_encodeBinary(const UA_JsonDataSetWriterMessageDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RelativePathElement_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RelativePathElement *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT], 0, NULL); +UA_JsonDataSetWriterMessageDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_JsonDataSetWriterMessageDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE], NULL); } -/* BrowseDirection */ +/* BrokerConnectionTransportDataType */ +static UA_INLINE size_t +UA_BrokerConnectionTransportDataType_calcSizeBinary(const UA_BrokerConnectionTransportDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROKERCONNECTIONTRANSPORTDATATYPE]); +} static UA_INLINE UA_StatusCode -UA_BrowseDirection_encodeBinary(const UA_BrowseDirection *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEDIRECTION], bufPos, bufEnd, NULL, NULL); +UA_BrokerConnectionTransportDataType_encodeBinary(const UA_BrokerConnectionTransportDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROKERCONNECTIONTRANSPORTDATATYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_BrowseDirection_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseDirection *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEDIRECTION], 0, NULL); +UA_BrokerConnectionTransportDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrokerConnectionTransportDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROKERCONNECTIONTRANSPORTDATATYPE], NULL); } -/* CallMethodRequest */ +/* BrokerTransportQualityOfService */ +static UA_INLINE size_t +UA_BrokerTransportQualityOfService_calcSizeBinary(const UA_BrokerTransportQualityOfService *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROKERTRANSPORTQUALITYOFSERVICE]); +} static UA_INLINE UA_StatusCode -UA_CallMethodRequest_encodeBinary(const UA_CallMethodRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST], bufPos, bufEnd, NULL, NULL); +UA_BrokerTransportQualityOfService_encodeBinary(const UA_BrokerTransportQualityOfService *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROKERTRANSPORTQUALITYOFSERVICE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CallMethodRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CallMethodRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST], 0, NULL); +UA_BrokerTransportQualityOfService_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrokerTransportQualityOfService *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROKERTRANSPORTQUALITYOFSERVICE], NULL); } -/* RedundancySupport */ +/* BrokerWriterGroupTransportDataType */ +static UA_INLINE size_t +UA_BrokerWriterGroupTransportDataType_calcSizeBinary(const UA_BrokerWriterGroupTransportDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROKERWRITERGROUPTRANSPORTDATATYPE]); +} static UA_INLINE UA_StatusCode -UA_RedundancySupport_encodeBinary(const UA_RedundancySupport *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT], bufPos, bufEnd, NULL, NULL); +UA_BrokerWriterGroupTransportDataType_encodeBinary(const UA_BrokerWriterGroupTransportDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROKERWRITERGROUPTRANSPORTDATATYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RedundancySupport_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RedundancySupport *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT], 0, NULL); +UA_BrokerWriterGroupTransportDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrokerWriterGroupTransportDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROKERWRITERGROUPTRANSPORTDATATYPE], NULL); } -/* EventNotificationList */ +/* BrokerDataSetWriterTransportDataType */ +static UA_INLINE size_t +UA_BrokerDataSetWriterTransportDataType_calcSizeBinary(const UA_BrokerDataSetWriterTransportDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROKERDATASETWRITERTRANSPORTDATATYPE]); +} static UA_INLINE UA_StatusCode -UA_EventNotificationList_encodeBinary(const UA_EventNotificationList *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST], bufPos, bufEnd, NULL, NULL); +UA_BrokerDataSetWriterTransportDataType_encodeBinary(const UA_BrokerDataSetWriterTransportDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROKERDATASETWRITERTRANSPORTDATATYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_EventNotificationList_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EventNotificationList *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST], 0, NULL); +UA_BrokerDataSetWriterTransportDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrokerDataSetWriterTransportDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROKERDATASETWRITERTRANSPORTDATATYPE], NULL); } -/* UnregisterNodesRequest */ +/* NodeClass */ +static UA_INLINE size_t +UA_NodeClass_calcSizeBinary(const UA_NodeClass *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_NODECLASS]); +} static UA_INLINE UA_StatusCode -UA_UnregisterNodesRequest_encodeBinary(const UA_UnregisterNodesRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST], bufPos, bufEnd, NULL, NULL); +UA_NodeClass_encodeBinary(const UA_NodeClass *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NODECLASS], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_UnregisterNodesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UnregisterNodesRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST], 0, NULL); +UA_NodeClass_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NodeClass *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NODECLASS], NULL); } -/* ContentFilterElementResult */ +/* StructureType */ +static UA_INLINE size_t +UA_StructureType_calcSizeBinary(const UA_StructureType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_STRUCTURETYPE]); +} static UA_INLINE UA_StatusCode -UA_ContentFilterElementResult_encodeBinary(const UA_ContentFilterElementResult *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT], bufPos, bufEnd, NULL, NULL); +UA_StructureType_encodeBinary(const UA_StructureType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STRUCTURETYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ContentFilterElementResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ContentFilterElementResult *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT], 0, NULL); +UA_StructureType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_StructureType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STRUCTURETYPE], NULL); } -/* SimpleAttributeOperand */ +/* StructureField */ +static UA_INLINE size_t +UA_StructureField_calcSizeBinary(const UA_StructureField *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_STRUCTUREFIELD]); +} static UA_INLINE UA_StatusCode -UA_SimpleAttributeOperand_encodeBinary(const UA_SimpleAttributeOperand *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND], bufPos, bufEnd, NULL, NULL); +UA_StructureField_encodeBinary(const UA_StructureField *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STRUCTUREFIELD], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SimpleAttributeOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SimpleAttributeOperand *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND], 0, NULL); +UA_StructureField_decodeBinary(const UA_ByteString *src, size_t *offset, UA_StructureField *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STRUCTUREFIELD], NULL); } -/* LiteralOperand */ +/* StructureDefinition */ +static UA_INLINE size_t +UA_StructureDefinition_calcSizeBinary(const UA_StructureDefinition *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_STRUCTUREDEFINITION]); +} static UA_INLINE UA_StatusCode -UA_LiteralOperand_encodeBinary(const UA_LiteralOperand *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_LITERALOPERAND], bufPos, bufEnd, NULL, NULL); +UA_StructureDefinition_encodeBinary(const UA_StructureDefinition *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STRUCTUREDEFINITION], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_LiteralOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_LiteralOperand *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_LITERALOPERAND], 0, NULL); +UA_StructureDefinition_decodeBinary(const UA_ByteString *src, size_t *offset, UA_StructureDefinition *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STRUCTUREDEFINITION], NULL); } -/* QueryDataSet */ +/* Argument */ +static UA_INLINE size_t +UA_Argument_calcSizeBinary(const UA_Argument *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ARGUMENT]); +} static UA_INLINE UA_StatusCode -UA_QueryDataSet_encodeBinary(const UA_QueryDataSet *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_QUERYDATASET], bufPos, bufEnd, NULL, NULL); +UA_Argument_encodeBinary(const UA_Argument *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ARGUMENT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_QueryDataSet_decodeBinary(const UA_ByteString *src, size_t *offset, UA_QueryDataSet *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_QUERYDATASET], 0, NULL); +UA_Argument_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Argument *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ARGUMENT], NULL); } -/* AnonymousIdentityToken */ +/* EnumValueType */ +static UA_INLINE size_t +UA_EnumValueType_calcSizeBinary(const UA_EnumValueType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ENUMVALUETYPE]); +} static UA_INLINE UA_StatusCode -UA_AnonymousIdentityToken_encodeBinary(const UA_AnonymousIdentityToken *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN], bufPos, bufEnd, NULL, NULL); +UA_EnumValueType_encodeBinary(const UA_EnumValueType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ENUMVALUETYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_AnonymousIdentityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AnonymousIdentityToken *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN], 0, NULL); +UA_EnumValueType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EnumValueType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ENUMVALUETYPE], NULL); } -/* SetPublishingModeRequest */ +/* EnumField */ +static UA_INLINE size_t +UA_EnumField_calcSizeBinary(const UA_EnumField *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ENUMFIELD]); +} static UA_INLINE UA_StatusCode -UA_SetPublishingModeRequest_encodeBinary(const UA_SetPublishingModeRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST], bufPos, bufEnd, NULL, NULL); +UA_EnumField_encodeBinary(const UA_EnumField *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ENUMFIELD], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SetPublishingModeRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetPublishingModeRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST], 0, NULL); +UA_EnumField_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EnumField *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ENUMFIELD], NULL); } -/* MonitoredItemCreateResult */ +/* Duration */ +static UA_INLINE size_t +UA_Duration_calcSizeBinary(const UA_Duration *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DURATION]); +} static UA_INLINE UA_StatusCode -UA_MonitoredItemCreateResult_encodeBinary(const UA_MonitoredItemCreateResult *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT], bufPos, bufEnd, NULL, NULL); +UA_Duration_encodeBinary(const UA_Duration *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DURATION], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_MonitoredItemCreateResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemCreateResult *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT], 0, NULL); +UA_Duration_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Duration *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DURATION], NULL); } -/* TimestampsToReturn */ +/* UtcTime */ +static UA_INLINE size_t +UA_UtcTime_calcSizeBinary(const UA_UtcTime *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UTCTIME]); +} static UA_INLINE UA_StatusCode -UA_TimestampsToReturn_encodeBinary(const UA_TimestampsToReturn *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_TIMESTAMPSTORETURN], bufPos, bufEnd, NULL, NULL); +UA_UtcTime_encodeBinary(const UA_UtcTime *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UTCTIME], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_TimestampsToReturn_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TimestampsToReturn *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_TIMESTAMPSTORETURN], 0, NULL); +UA_UtcTime_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UtcTime *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UTCTIME], NULL); } -/* CallRequest */ +/* LocaleId */ +static UA_INLINE size_t +UA_LocaleId_calcSizeBinary(const UA_LocaleId *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_LOCALEID]); +} static UA_INLINE UA_StatusCode -UA_CallRequest_encodeBinary(const UA_CallRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CALLREQUEST], bufPos, bufEnd, NULL, NULL); +UA_LocaleId_encodeBinary(const UA_LocaleId *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_LOCALEID], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CallRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CallRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CALLREQUEST], 0, NULL); +UA_LocaleId_decodeBinary(const UA_ByteString *src, size_t *offset, UA_LocaleId *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_LOCALEID], NULL); } -/* MethodAttributes */ +/* ApplicationType */ +static UA_INLINE size_t +UA_ApplicationType_calcSizeBinary(const UA_ApplicationType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_APPLICATIONTYPE]); +} static UA_INLINE UA_StatusCode -UA_MethodAttributes_encodeBinary(const UA_MethodAttributes *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_METHODATTRIBUTES], bufPos, bufEnd, NULL, NULL); +UA_ApplicationType_encodeBinary(const UA_ApplicationType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_APPLICATIONTYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_MethodAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MethodAttributes *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_METHODATTRIBUTES], 0, NULL); +UA_ApplicationType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ApplicationType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_APPLICATIONTYPE], NULL); } -/* DeleteReferencesItem */ +/* ApplicationDescription */ +static UA_INLINE size_t +UA_ApplicationDescription_calcSizeBinary(const UA_ApplicationDescription *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]); +} static UA_INLINE UA_StatusCode -UA_DeleteReferencesItem_encodeBinary(const UA_DeleteReferencesItem *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM], bufPos, bufEnd, NULL, NULL); +UA_ApplicationDescription_encodeBinary(const UA_ApplicationDescription *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DeleteReferencesItem_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteReferencesItem *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM], 0, NULL); +UA_ApplicationDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ApplicationDescription *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION], NULL); } -/* WriteValue */ +/* RequestHeader */ +static UA_INLINE size_t +UA_RequestHeader_calcSizeBinary(const UA_RequestHeader *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REQUESTHEADER]); +} static UA_INLINE UA_StatusCode -UA_WriteValue_encodeBinary(const UA_WriteValue *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_WRITEVALUE], bufPos, bufEnd, NULL, NULL); +UA_RequestHeader_encodeBinary(const UA_RequestHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REQUESTHEADER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_WriteValue_decodeBinary(const UA_ByteString *src, size_t *offset, UA_WriteValue *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_WRITEVALUE], 0, NULL); +UA_RequestHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RequestHeader *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REQUESTHEADER], NULL); } -/* NodeAttributesMask */ +/* ResponseHeader */ +static UA_INLINE size_t +UA_ResponseHeader_calcSizeBinary(const UA_ResponseHeader *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_RESPONSEHEADER]); +} static UA_INLINE UA_StatusCode -UA_NodeAttributesMask_encodeBinary(const UA_NodeAttributesMask *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NODEATTRIBUTESMASK], bufPos, bufEnd, NULL, NULL); +UA_ResponseHeader_encodeBinary(const UA_ResponseHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_RESPONSEHEADER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_NodeAttributesMask_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NodeAttributesMask *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NODEATTRIBUTESMASK], 0, NULL); +UA_ResponseHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ResponseHeader *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_RESPONSEHEADER], NULL); } -/* MessageSecurityMode */ +/* ServiceFault */ +static UA_INLINE size_t +UA_ServiceFault_calcSizeBinary(const UA_ServiceFault *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SERVICEFAULT]); +} static UA_INLINE UA_StatusCode -UA_MessageSecurityMode_encodeBinary(const UA_MessageSecurityMode *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MESSAGESECURITYMODE], bufPos, bufEnd, NULL, NULL); +UA_ServiceFault_encodeBinary(const UA_ServiceFault *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVICEFAULT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_MessageSecurityMode_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MessageSecurityMode *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MESSAGESECURITYMODE], 0, NULL); +UA_ServiceFault_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServiceFault *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVICEFAULT], NULL); } -/* MonitoringParameters */ +/* FindServersRequest */ +static UA_INLINE size_t +UA_FindServersRequest_calcSizeBinary(const UA_FindServersRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST]); +} static UA_INLINE UA_StatusCode -UA_MonitoringParameters_encodeBinary(const UA_MonitoringParameters *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS], bufPos, bufEnd, NULL, NULL); +UA_FindServersRequest_encodeBinary(const UA_FindServersRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_MonitoringParameters_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoringParameters *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS], 0, NULL); +UA_FindServersRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FindServersRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST], NULL); } -/* ReferenceNode */ +/* FindServersResponse */ +static UA_INLINE size_t +UA_FindServersResponse_calcSizeBinary(const UA_FindServersResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_ReferenceNode_encodeBinary(const UA_ReferenceNode *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REFERENCENODE], bufPos, bufEnd, NULL, NULL); +UA_FindServersResponse_encodeBinary(const UA_FindServersResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ReferenceNode_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReferenceNode *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REFERENCENODE], 0, NULL); +UA_FindServersResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FindServersResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE], NULL); } -/* Argument */ +/* ServerOnNetwork */ +static UA_INLINE size_t +UA_ServerOnNetwork_calcSizeBinary(const UA_ServerOnNetwork *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SERVERONNETWORK]); +} static UA_INLINE UA_StatusCode -UA_Argument_encodeBinary(const UA_Argument *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ARGUMENT], bufPos, bufEnd, NULL, NULL); +UA_ServerOnNetwork_encodeBinary(const UA_ServerOnNetwork *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVERONNETWORK], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_Argument_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Argument *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ARGUMENT], 0, NULL); +UA_ServerOnNetwork_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServerOnNetwork *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVERONNETWORK], NULL); } -/* ChannelSecurityToken */ +/* FindServersOnNetworkRequest */ +static UA_INLINE size_t +UA_FindServersOnNetworkRequest_calcSizeBinary(const UA_FindServersOnNetworkRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST]); +} static UA_INLINE UA_StatusCode -UA_ChannelSecurityToken_encodeBinary(const UA_ChannelSecurityToken *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CHANNELSECURITYTOKEN], bufPos, bufEnd, NULL, NULL); +UA_FindServersOnNetworkRequest_encodeBinary(const UA_FindServersOnNetworkRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ChannelSecurityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ChannelSecurityToken *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CHANNELSECURITYTOKEN], 0, NULL); +UA_FindServersOnNetworkRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FindServersOnNetworkRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST], NULL); } -/* UserIdentityToken */ +/* FindServersOnNetworkResponse */ +static UA_INLINE size_t +UA_FindServersOnNetworkResponse_calcSizeBinary(const UA_FindServersOnNetworkResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_UserIdentityToken_encodeBinary(const UA_UserIdentityToken *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN], bufPos, bufEnd, NULL, NULL); +UA_FindServersOnNetworkResponse_encodeBinary(const UA_FindServersOnNetworkResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_UserIdentityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UserIdentityToken *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN], 0, NULL); +UA_FindServersOnNetworkResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FindServersOnNetworkResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE], NULL); } -/* SignatureData */ +/* MessageSecurityMode */ +static UA_INLINE size_t +UA_MessageSecurityMode_calcSizeBinary(const UA_MessageSecurityMode *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MESSAGESECURITYMODE]); +} static UA_INLINE UA_StatusCode -UA_SignatureData_encodeBinary(const UA_SignatureData *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SIGNATUREDATA], bufPos, bufEnd, NULL, NULL); +UA_MessageSecurityMode_encodeBinary(const UA_MessageSecurityMode *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MESSAGESECURITYMODE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SignatureData_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SignatureData *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SIGNATUREDATA], 0, NULL); +UA_MessageSecurityMode_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MessageSecurityMode *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MESSAGESECURITYMODE], NULL); } -/* ObjectTypeAttributes */ +/* UserTokenType */ +static UA_INLINE size_t +UA_UserTokenType_calcSizeBinary(const UA_UserTokenType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_USERTOKENTYPE]); +} static UA_INLINE UA_StatusCode -UA_ObjectTypeAttributes_encodeBinary(const UA_ObjectTypeAttributes *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES], bufPos, bufEnd, NULL, NULL); +UA_UserTokenType_encodeBinary(const UA_UserTokenType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_USERTOKENTYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ObjectTypeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ObjectTypeAttributes *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES], 0, NULL); +UA_UserTokenType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UserTokenType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_USERTOKENTYPE], NULL); } -/* DeadbandType */ +/* UserTokenPolicy */ +static UA_INLINE size_t +UA_UserTokenPolicy_calcSizeBinary(const UA_UserTokenPolicy *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); +} static UA_INLINE UA_StatusCode -UA_DeadbandType_encodeBinary(const UA_DeadbandType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DEADBANDTYPE], bufPos, bufEnd, NULL, NULL); +UA_UserTokenPolicy_encodeBinary(const UA_UserTokenPolicy *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_USERTOKENPOLICY], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DeadbandType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeadbandType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DEADBANDTYPE], 0, NULL); +UA_UserTokenPolicy_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UserTokenPolicy *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_USERTOKENPOLICY], NULL); } -/* SecurityTokenRequestType */ +/* EndpointDescription */ +static UA_INLINE size_t +UA_EndpointDescription_calcSizeBinary(const UA_EndpointDescription *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); +} static UA_INLINE UA_StatusCode -UA_SecurityTokenRequestType_encodeBinary(const UA_SecurityTokenRequestType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SECURITYTOKENREQUESTTYPE], bufPos, bufEnd, NULL, NULL); +UA_EndpointDescription_encodeBinary(const UA_EndpointDescription *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SecurityTokenRequestType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SecurityTokenRequestType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SECURITYTOKENREQUESTTYPE], 0, NULL); +UA_EndpointDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EndpointDescription *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION], NULL); } -/* NodeAttributes */ +/* GetEndpointsRequest */ +static UA_INLINE size_t +UA_GetEndpointsRequest_calcSizeBinary(const UA_GetEndpointsRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST]); +} static UA_INLINE UA_StatusCode -UA_NodeAttributes_encodeBinary(const UA_NodeAttributes *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NODEATTRIBUTES], bufPos, bufEnd, NULL, NULL); +UA_GetEndpointsRequest_encodeBinary(const UA_GetEndpointsRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_NodeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NodeAttributes *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NODEATTRIBUTES], 0, NULL); +UA_GetEndpointsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_GetEndpointsRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST], NULL); } -/* DataChangeTrigger */ +/* GetEndpointsResponse */ +static UA_INLINE size_t +UA_GetEndpointsResponse_calcSizeBinary(const UA_GetEndpointsResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_DataChangeTrigger_encodeBinary(const UA_DataChangeTrigger *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGETRIGGER], bufPos, bufEnd, NULL, NULL); +UA_GetEndpointsResponse_encodeBinary(const UA_GetEndpointsResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DataChangeTrigger_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataChangeTrigger *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATACHANGETRIGGER], 0, NULL); +UA_GetEndpointsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_GetEndpointsResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE], NULL); } -/* BuildInfo */ +/* RegisteredServer */ +static UA_INLINE size_t +UA_RegisteredServer_calcSizeBinary(const UA_RegisteredServer *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTEREDSERVER]); +} static UA_INLINE UA_StatusCode -UA_BuildInfo_encodeBinary(const UA_BuildInfo *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BUILDINFO], bufPos, bufEnd, NULL, NULL); +UA_RegisteredServer_encodeBinary(const UA_RegisteredServer *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTEREDSERVER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_BuildInfo_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BuildInfo *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BUILDINFO], 0, NULL); +UA_RegisteredServer_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisteredServer *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTEREDSERVER], NULL); } -/* NodeClass */ +/* RegisterServerRequest */ +static UA_INLINE size_t +UA_RegisterServerRequest_calcSizeBinary(const UA_RegisterServerRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST]); +} static UA_INLINE UA_StatusCode -UA_NodeClass_encodeBinary(const UA_NodeClass *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NODECLASS], bufPos, bufEnd, NULL, NULL); +UA_RegisterServerRequest_encodeBinary(const UA_RegisterServerRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_NodeClass_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NodeClass *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NODECLASS], 0, NULL); +UA_RegisterServerRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterServerRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST], NULL); } -/* SubscriptionDiagnosticsDataType */ +/* RegisterServerResponse */ +static UA_INLINE size_t +UA_RegisterServerResponse_calcSizeBinary(const UA_RegisterServerResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_SubscriptionDiagnosticsDataType_encodeBinary(const UA_SubscriptionDiagnosticsDataType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SUBSCRIPTIONDIAGNOSTICSDATATYPE], bufPos, bufEnd, NULL, NULL); +UA_RegisterServerResponse_encodeBinary(const UA_RegisterServerResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SubscriptionDiagnosticsDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SubscriptionDiagnosticsDataType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SUBSCRIPTIONDIAGNOSTICSDATATYPE], 0, NULL); +UA_RegisterServerResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterServerResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE], NULL); } -/* FilterOperand */ +/* DiscoveryConfiguration */ +static UA_INLINE size_t +UA_DiscoveryConfiguration_calcSizeBinary(const UA_DiscoveryConfiguration *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DISCOVERYCONFIGURATION]); +} static UA_INLINE UA_StatusCode -UA_FilterOperand_encodeBinary(const UA_FilterOperand *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FILTEROPERAND], bufPos, bufEnd, NULL, NULL); +UA_DiscoveryConfiguration_encodeBinary(const UA_DiscoveryConfiguration *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DISCOVERYCONFIGURATION], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_FilterOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FilterOperand *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FILTEROPERAND], 0, NULL); +UA_DiscoveryConfiguration_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DiscoveryConfiguration *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DISCOVERYCONFIGURATION], NULL); } -/* MonitoredItemNotification */ +/* MdnsDiscoveryConfiguration */ +static UA_INLINE size_t +UA_MdnsDiscoveryConfiguration_calcSizeBinary(const UA_MdnsDiscoveryConfiguration *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION]); +} static UA_INLINE UA_StatusCode -UA_MonitoredItemNotification_encodeBinary(const UA_MonitoredItemNotification *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION], bufPos, bufEnd, NULL, NULL); +UA_MdnsDiscoveryConfiguration_encodeBinary(const UA_MdnsDiscoveryConfiguration *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_MonitoredItemNotification_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemNotification *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION], 0, NULL); +UA_MdnsDiscoveryConfiguration_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MdnsDiscoveryConfiguration *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION], NULL); } -/* DeleteNodesItem */ +/* RegisterServer2Request */ +static UA_INLINE size_t +UA_RegisterServer2Request_calcSizeBinary(const UA_RegisterServer2Request *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST]); +} static UA_INLINE UA_StatusCode -UA_DeleteNodesItem_encodeBinary(const UA_DeleteNodesItem *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESITEM], bufPos, bufEnd, NULL, NULL); +UA_RegisterServer2Request_encodeBinary(const UA_RegisterServer2Request *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DeleteNodesItem_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteNodesItem *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETENODESITEM], 0, NULL); +UA_RegisterServer2Request_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterServer2Request *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST], NULL); } -/* DeleteSubscriptionsRequest */ +/* RegisterServer2Response */ +static UA_INLINE size_t +UA_RegisterServer2Response_calcSizeBinary(const UA_RegisterServer2Response *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]); +} static UA_INLINE UA_StatusCode -UA_DeleteSubscriptionsRequest_encodeBinary(const UA_DeleteSubscriptionsRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST], bufPos, bufEnd, NULL, NULL); +UA_RegisterServer2Response_encodeBinary(const UA_RegisterServer2Response *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DeleteSubscriptionsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteSubscriptionsRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST], 0, NULL); +UA_RegisterServer2Response_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterServer2Response *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE], NULL); } -/* SubscriptionAcknowledgement */ +/* SecurityTokenRequestType */ +static UA_INLINE size_t +UA_SecurityTokenRequestType_calcSizeBinary(const UA_SecurityTokenRequestType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SECURITYTOKENREQUESTTYPE]); +} static UA_INLINE UA_StatusCode -UA_SubscriptionAcknowledgement_encodeBinary(const UA_SubscriptionAcknowledgement *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT], bufPos, bufEnd, NULL, NULL); +UA_SecurityTokenRequestType_encodeBinary(const UA_SecurityTokenRequestType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SECURITYTOKENREQUESTTYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SubscriptionAcknowledgement_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SubscriptionAcknowledgement *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT], 0, NULL); +UA_SecurityTokenRequestType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SecurityTokenRequestType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SECURITYTOKENREQUESTTYPE], NULL); } -/* ReadValueId */ +/* ChannelSecurityToken */ +static UA_INLINE size_t +UA_ChannelSecurityToken_calcSizeBinary(const UA_ChannelSecurityToken *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CHANNELSECURITYTOKEN]); +} static UA_INLINE UA_StatusCode -UA_ReadValueId_encodeBinary(const UA_ReadValueId *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_READVALUEID], bufPos, bufEnd, NULL, NULL); +UA_ChannelSecurityToken_encodeBinary(const UA_ChannelSecurityToken *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CHANNELSECURITYTOKEN], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ReadValueId_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReadValueId *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_READVALUEID], 0, NULL); +UA_ChannelSecurityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ChannelSecurityToken *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CHANNELSECURITYTOKEN], NULL); } -/* DataTypeAttributes */ +/* OpenSecureChannelRequest */ +static UA_INLINE size_t +UA_OpenSecureChannelRequest_calcSizeBinary(const UA_OpenSecureChannelRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); +} static UA_INLINE UA_StatusCode -UA_DataTypeAttributes_encodeBinary(const UA_DataTypeAttributes *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES], bufPos, bufEnd, NULL, NULL); +UA_OpenSecureChannelRequest_encodeBinary(const UA_OpenSecureChannelRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DataTypeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataTypeAttributes *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES], 0, NULL); +UA_OpenSecureChannelRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_OpenSecureChannelRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST], NULL); } -/* ResponseHeader */ +/* OpenSecureChannelResponse */ +static UA_INLINE size_t +UA_OpenSecureChannelResponse_calcSizeBinary(const UA_OpenSecureChannelResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_ResponseHeader_encodeBinary(const UA_ResponseHeader *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_RESPONSEHEADER], bufPos, bufEnd, NULL, NULL); +UA_OpenSecureChannelResponse_encodeBinary(const UA_OpenSecureChannelResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ResponseHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ResponseHeader *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_RESPONSEHEADER], 0, NULL); +UA_OpenSecureChannelResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_OpenSecureChannelResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE], NULL); } -/* DeleteMonitoredItemsRequest */ +/* CloseSecureChannelRequest */ +static UA_INLINE size_t +UA_CloseSecureChannelRequest_calcSizeBinary(const UA_CloseSecureChannelRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); +} static UA_INLINE UA_StatusCode -UA_DeleteMonitoredItemsRequest_encodeBinary(const UA_DeleteMonitoredItemsRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST], bufPos, bufEnd, NULL, NULL); +UA_CloseSecureChannelRequest_encodeBinary(const UA_CloseSecureChannelRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DeleteMonitoredItemsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteMonitoredItemsRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST], 0, NULL); +UA_CloseSecureChannelRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CloseSecureChannelRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST], NULL); } -/* ViewDescription */ +/* CloseSecureChannelResponse */ +static UA_INLINE size_t +UA_CloseSecureChannelResponse_calcSizeBinary(const UA_CloseSecureChannelResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_ViewDescription_encodeBinary(const UA_ViewDescription *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION], bufPos, bufEnd, NULL, NULL); +UA_CloseSecureChannelResponse_encodeBinary(const UA_CloseSecureChannelResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ViewDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ViewDescription *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION], 0, NULL); +UA_CloseSecureChannelResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CloseSecureChannelResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE], NULL); } -/* ServerOnNetwork */ +/* SignedSoftwareCertificate */ +static UA_INLINE size_t +UA_SignedSoftwareCertificate_calcSizeBinary(const UA_SignedSoftwareCertificate *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE]); +} static UA_INLINE UA_StatusCode -UA_ServerOnNetwork_encodeBinary(const UA_ServerOnNetwork *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVERONNETWORK], bufPos, bufEnd, NULL, NULL); +UA_SignedSoftwareCertificate_encodeBinary(const UA_SignedSoftwareCertificate *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ServerOnNetwork_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServerOnNetwork *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVERONNETWORK], 0, NULL); +UA_SignedSoftwareCertificate_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SignedSoftwareCertificate *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE], NULL); } -/* DeleteMonitoredItemsResponse */ +/* SignatureData */ +static UA_INLINE size_t +UA_SignatureData_calcSizeBinary(const UA_SignatureData *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SIGNATUREDATA]); +} static UA_INLINE UA_StatusCode -UA_DeleteMonitoredItemsResponse_encodeBinary(const UA_DeleteMonitoredItemsResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_SignatureData_encodeBinary(const UA_SignatureData *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SIGNATUREDATA], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DeleteMonitoredItemsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteMonitoredItemsResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE], 0, NULL); +UA_SignatureData_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SignatureData *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SIGNATUREDATA], NULL); } -/* FindServersOnNetworkResponse */ +/* CreateSessionRequest */ +static UA_INLINE size_t +UA_CreateSessionRequest_calcSizeBinary(const UA_CreateSessionRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]); +} static UA_INLINE UA_StatusCode -UA_FindServersOnNetworkResponse_encodeBinary(const UA_FindServersOnNetworkResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_CreateSessionRequest_encodeBinary(const UA_CreateSessionRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_FindServersOnNetworkResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FindServersOnNetworkResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE], 0, NULL); +UA_CreateSessionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateSessionRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST], NULL); } -/* RelativePath */ +/* CreateSessionResponse */ +static UA_INLINE size_t +UA_CreateSessionResponse_calcSizeBinary(const UA_CreateSessionResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_RelativePath_encodeBinary(const UA_RelativePath *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_RELATIVEPATH], bufPos, bufEnd, NULL, NULL); +UA_CreateSessionResponse_encodeBinary(const UA_CreateSessionResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RelativePath_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RelativePath *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_RELATIVEPATH], 0, NULL); +UA_CreateSessionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateSessionResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE], NULL); } -/* RegisterNodesRequest */ +/* UserIdentityToken */ +static UA_INLINE size_t +UA_UserIdentityToken_calcSizeBinary(const UA_UserIdentityToken *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN]); +} static UA_INLINE UA_StatusCode -UA_RegisterNodesRequest_encodeBinary(const UA_RegisterNodesRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST], bufPos, bufEnd, NULL, NULL); +UA_UserIdentityToken_encodeBinary(const UA_UserIdentityToken *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RegisterNodesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterNodesRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST], 0, NULL); +UA_UserIdentityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UserIdentityToken *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN], NULL); } -/* AggregateConfiguration */ +/* AnonymousIdentityToken */ +static UA_INLINE size_t +UA_AnonymousIdentityToken_calcSizeBinary(const UA_AnonymousIdentityToken *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]); +} static UA_INLINE UA_StatusCode -UA_AggregateConfiguration_encodeBinary(const UA_AggregateConfiguration *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_AGGREGATECONFIGURATION], bufPos, bufEnd, NULL, NULL); +UA_AnonymousIdentityToken_encodeBinary(const UA_AnonymousIdentityToken *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_AggregateConfiguration_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AggregateConfiguration *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_AGGREGATECONFIGURATION], 0, NULL); +UA_AnonymousIdentityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AnonymousIdentityToken *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN], NULL); } -/* DeleteNodesRequest */ +/* UserNameIdentityToken */ +static UA_INLINE size_t +UA_UserNameIdentityToken_calcSizeBinary(const UA_UserNameIdentityToken *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]); +} static UA_INLINE UA_StatusCode -UA_DeleteNodesRequest_encodeBinary(const UA_DeleteNodesRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESREQUEST], bufPos, bufEnd, NULL, NULL); +UA_UserNameIdentityToken_encodeBinary(const UA_UserNameIdentityToken *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DeleteNodesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteNodesRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETENODESREQUEST], 0, NULL); +UA_UserNameIdentityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UserNameIdentityToken *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN], NULL); } -/* PublishResponse */ +/* X509IdentityToken */ +static UA_INLINE size_t +UA_X509IdentityToken_calcSizeBinary(const UA_X509IdentityToken *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN]); +} static UA_INLINE UA_StatusCode -UA_PublishResponse_encodeBinary(const UA_PublishResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_X509IdentityToken_encodeBinary(const UA_X509IdentityToken *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_PublishResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_PublishResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE], 0, NULL); +UA_X509IdentityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_X509IdentityToken *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN], NULL); } -/* MonitoredItemModifyRequest */ +/* IssuedIdentityToken */ +static UA_INLINE size_t +UA_IssuedIdentityToken_calcSizeBinary(const UA_IssuedIdentityToken *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN]); +} static UA_INLINE UA_StatusCode -UA_MonitoredItemModifyRequest_encodeBinary(const UA_MonitoredItemModifyRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST], bufPos, bufEnd, NULL, NULL); +UA_IssuedIdentityToken_encodeBinary(const UA_IssuedIdentityToken *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_MonitoredItemModifyRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemModifyRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST], 0, NULL); +UA_IssuedIdentityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_IssuedIdentityToken *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN], NULL); } -/* ServiceCounterDataType */ +/* ActivateSessionRequest */ +static UA_INLINE size_t +UA_ActivateSessionRequest_calcSizeBinary(const UA_ActivateSessionRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]); +} static UA_INLINE UA_StatusCode -UA_ServiceCounterDataType_encodeBinary(const UA_ServiceCounterDataType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVICECOUNTERDATATYPE], bufPos, bufEnd, NULL, NULL); +UA_ActivateSessionRequest_encodeBinary(const UA_ActivateSessionRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ServiceCounterDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServiceCounterDataType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVICECOUNTERDATATYPE], 0, NULL); +UA_ActivateSessionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ActivateSessionRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST], NULL); } -/* ModelChangeStructureDataType */ +/* ActivateSessionResponse */ +static UA_INLINE size_t +UA_ActivateSessionResponse_calcSizeBinary(const UA_ActivateSessionResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_ModelChangeStructureDataType_encodeBinary(const UA_ModelChangeStructureDataType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MODELCHANGESTRUCTUREDATATYPE], bufPos, bufEnd, NULL, NULL); +UA_ActivateSessionResponse_encodeBinary(const UA_ActivateSessionResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ModelChangeStructureDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ModelChangeStructureDataType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MODELCHANGESTRUCTUREDATATYPE], 0, NULL); +UA_ActivateSessionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ActivateSessionResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE], NULL); } -/* UserNameIdentityToken */ +/* CloseSessionRequest */ +static UA_INLINE size_t +UA_CloseSessionRequest_calcSizeBinary(const UA_CloseSessionRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]); +} static UA_INLINE UA_StatusCode -UA_UserNameIdentityToken_encodeBinary(const UA_UserNameIdentityToken *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN], bufPos, bufEnd, NULL, NULL); +UA_CloseSessionRequest_encodeBinary(const UA_CloseSessionRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_UserNameIdentityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UserNameIdentityToken *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN], 0, NULL); +UA_CloseSessionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CloseSessionRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST], NULL); } -/* IdType */ -static UA_INLINE UA_StatusCode -UA_IdType_encodeBinary(const UA_IdType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_IDTYPE], bufPos, bufEnd, NULL, NULL); +/* CloseSessionResponse */ +static UA_INLINE size_t +UA_CloseSessionResponse_calcSizeBinary(const UA_CloseSessionResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]); } static UA_INLINE UA_StatusCode -UA_IdType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_IdType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_IDTYPE], 0, NULL); -} - -/* UserTokenType */ -static UA_INLINE UA_StatusCode -UA_UserTokenType_encodeBinary(const UA_UserTokenType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_USERTOKENTYPE], bufPos, bufEnd, NULL, NULL); +UA_CloseSessionResponse_encodeBinary(const UA_CloseSessionResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_UserTokenType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UserTokenType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_USERTOKENTYPE], 0, NULL); +UA_CloseSessionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CloseSessionResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE], NULL); } -/* SetTriggeringResponse */ +/* NodeAttributesMask */ +static UA_INLINE size_t +UA_NodeAttributesMask_calcSizeBinary(const UA_NodeAttributesMask *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_NODEATTRIBUTESMASK]); +} static UA_INLINE UA_StatusCode -UA_SetTriggeringResponse_encodeBinary(const UA_SetTriggeringResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_NodeAttributesMask_encodeBinary(const UA_NodeAttributesMask *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NODEATTRIBUTESMASK], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SetTriggeringResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetTriggeringResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE], 0, NULL); +UA_NodeAttributesMask_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NodeAttributesMask *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NODEATTRIBUTESMASK], NULL); } -/* TimeZoneDataType */ +/* NodeAttributes */ +static UA_INLINE size_t +UA_NodeAttributes_calcSizeBinary(const UA_NodeAttributes *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_NODEATTRIBUTES]); +} static UA_INLINE UA_StatusCode -UA_TimeZoneDataType_encodeBinary(const UA_TimeZoneDataType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_TIMEZONEDATATYPE], bufPos, bufEnd, NULL, NULL); +UA_NodeAttributes_encodeBinary(const UA_NodeAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NODEATTRIBUTES], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_TimeZoneDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TimeZoneDataType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_TIMEZONEDATATYPE], 0, NULL); +UA_NodeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NodeAttributes *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NODEATTRIBUTES], NULL); } -/* ActivateSessionRequest */ +/* ObjectAttributes */ +static UA_INLINE size_t +UA_ObjectAttributes_calcSizeBinary(const UA_ObjectAttributes *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES]); +} static UA_INLINE UA_StatusCode -UA_ActivateSessionRequest_encodeBinary(const UA_ActivateSessionRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST], bufPos, bufEnd, NULL, NULL); +UA_ObjectAttributes_encodeBinary(const UA_ObjectAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ActivateSessionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ActivateSessionRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST], 0, NULL); +UA_ObjectAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ObjectAttributes *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES], NULL); } -/* OpenSecureChannelResponse */ +/* VariableAttributes */ +static UA_INLINE size_t +UA_VariableAttributes_calcSizeBinary(const UA_VariableAttributes *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]); +} static UA_INLINE UA_StatusCode -UA_OpenSecureChannelResponse_encodeBinary(const UA_OpenSecureChannelResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_VariableAttributes_encodeBinary(const UA_VariableAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_OpenSecureChannelResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_OpenSecureChannelResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE], 0, NULL); +UA_VariableAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_VariableAttributes *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES], NULL); } -/* ApplicationType */ +/* MethodAttributes */ +static UA_INLINE size_t +UA_MethodAttributes_calcSizeBinary(const UA_MethodAttributes *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_METHODATTRIBUTES]); +} static UA_INLINE UA_StatusCode -UA_ApplicationType_encodeBinary(const UA_ApplicationType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_APPLICATIONTYPE], bufPos, bufEnd, NULL, NULL); +UA_MethodAttributes_encodeBinary(const UA_MethodAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_METHODATTRIBUTES], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ApplicationType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ApplicationType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_APPLICATIONTYPE], 0, NULL); +UA_MethodAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MethodAttributes *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_METHODATTRIBUTES], NULL); } -/* ServerState */ +/* ObjectTypeAttributes */ +static UA_INLINE size_t +UA_ObjectTypeAttributes_calcSizeBinary(const UA_ObjectTypeAttributes *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); +} static UA_INLINE UA_StatusCode -UA_ServerState_encodeBinary(const UA_ServerState *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVERSTATE], bufPos, bufEnd, NULL, NULL); +UA_ObjectTypeAttributes_encodeBinary(const UA_ObjectTypeAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ServerState_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServerState *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVERSTATE], 0, NULL); +UA_ObjectTypeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ObjectTypeAttributes *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES], NULL); } -/* QueryNextResponse */ +/* VariableTypeAttributes */ +static UA_INLINE size_t +UA_VariableTypeAttributes_calcSizeBinary(const UA_VariableTypeAttributes *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); +} static UA_INLINE UA_StatusCode -UA_QueryNextResponse_encodeBinary(const UA_QueryNextResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_QUERYNEXTRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_VariableTypeAttributes_encodeBinary(const UA_VariableTypeAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_QueryNextResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_QueryNextResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_QUERYNEXTRESPONSE], 0, NULL); +UA_VariableTypeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_VariableTypeAttributes *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES], NULL); } -/* DiscoveryConfiguration */ +/* ReferenceTypeAttributes */ +static UA_INLINE size_t +UA_ReferenceTypeAttributes_calcSizeBinary(const UA_ReferenceTypeAttributes *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); +} static UA_INLINE UA_StatusCode -UA_DiscoveryConfiguration_encodeBinary(const UA_DiscoveryConfiguration *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DISCOVERYCONFIGURATION], bufPos, bufEnd, NULL, NULL); +UA_ReferenceTypeAttributes_encodeBinary(const UA_ReferenceTypeAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DiscoveryConfiguration_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DiscoveryConfiguration *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DISCOVERYCONFIGURATION], 0, NULL); +UA_ReferenceTypeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReferenceTypeAttributes *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES], NULL); } -/* ActivateSessionResponse */ +/* DataTypeAttributes */ +static UA_INLINE size_t +UA_DataTypeAttributes_calcSizeBinary(const UA_DataTypeAttributes *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); +} static UA_INLINE UA_StatusCode -UA_ActivateSessionResponse_encodeBinary(const UA_ActivateSessionResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_DataTypeAttributes_encodeBinary(const UA_DataTypeAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ActivateSessionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ActivateSessionResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE], 0, NULL); +UA_DataTypeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataTypeAttributes *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES], NULL); } -/* EndpointUrlListDataType */ +/* ViewAttributes */ +static UA_INLINE size_t +UA_ViewAttributes_calcSizeBinary(const UA_ViewAttributes *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES]); +} static UA_INLINE UA_StatusCode -UA_EndpointUrlListDataType_encodeBinary(const UA_EndpointUrlListDataType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ENDPOINTURLLISTDATATYPE], bufPos, bufEnd, NULL, NULL); +UA_ViewAttributes_encodeBinary(const UA_ViewAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_EndpointUrlListDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EndpointUrlListDataType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ENDPOINTURLLISTDATATYPE], 0, NULL); +UA_ViewAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ViewAttributes *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES], NULL); } -/* FilterOperator */ +/* AddNodesItem */ +static UA_INLINE size_t +UA_AddNodesItem_calcSizeBinary(const UA_AddNodesItem *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESITEM]); +} static UA_INLINE UA_StatusCode -UA_FilterOperator_encodeBinary(const UA_FilterOperator *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FILTEROPERATOR], bufPos, bufEnd, NULL, NULL); +UA_AddNodesItem_encodeBinary(const UA_AddNodesItem *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESITEM], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_FilterOperator_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FilterOperator *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FILTEROPERATOR], 0, NULL); +UA_AddNodesItem_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddNodesItem *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDNODESITEM], NULL); } -/* QueryNextRequest */ +/* AddNodesResult */ +static UA_INLINE size_t +UA_AddNodesResult_calcSizeBinary(const UA_AddNodesResult *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESRESULT]); +} static UA_INLINE UA_StatusCode -UA_QueryNextRequest_encodeBinary(const UA_QueryNextRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_QUERYNEXTREQUEST], bufPos, bufEnd, NULL, NULL); +UA_AddNodesResult_encodeBinary(const UA_AddNodesResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESRESULT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_QueryNextRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_QueryNextRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_QUERYNEXTREQUEST], 0, NULL); +UA_AddNodesResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddNodesResult *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDNODESRESULT], NULL); } -/* WriteResponse */ +/* AddNodesRequest */ +static UA_INLINE size_t +UA_AddNodesRequest_calcSizeBinary(const UA_AddNodesRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESREQUEST]); +} static UA_INLINE UA_StatusCode -UA_WriteResponse_encodeBinary(const UA_WriteResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_WRITERESPONSE], bufPos, bufEnd, NULL, NULL); +UA_AddNodesRequest_encodeBinary(const UA_AddNodesRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_WriteResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_WriteResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_WRITERESPONSE], 0, NULL); +UA_AddNodesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddNodesRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDNODESREQUEST], NULL); } -/* BrowseNextRequest */ +/* AddNodesResponse */ +static UA_INLINE size_t +UA_AddNodesResponse_calcSizeBinary(const UA_AddNodesResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_BrowseNextRequest_encodeBinary(const UA_BrowseNextRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST], bufPos, bufEnd, NULL, NULL); +UA_AddNodesResponse_encodeBinary(const UA_AddNodesResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_BrowseNextRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseNextRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST], 0, NULL); +UA_AddNodesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddNodesResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE], NULL); } -/* CreateSubscriptionRequest */ +/* AddReferencesItem */ +static UA_INLINE size_t +UA_AddReferencesItem_calcSizeBinary(const UA_AddReferencesItem *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM]); +} static UA_INLINE UA_StatusCode -UA_CreateSubscriptionRequest_encodeBinary(const UA_CreateSubscriptionRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST], bufPos, bufEnd, NULL, NULL); +UA_AddReferencesItem_encodeBinary(const UA_AddReferencesItem *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CreateSubscriptionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateSubscriptionRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST], 0, NULL); +UA_AddReferencesItem_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddReferencesItem *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM], NULL); } -/* VariableTypeAttributes */ +/* AddReferencesRequest */ +static UA_INLINE size_t +UA_AddReferencesRequest_calcSizeBinary(const UA_AddReferencesRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST]); +} static UA_INLINE UA_StatusCode -UA_VariableTypeAttributes_encodeBinary(const UA_VariableTypeAttributes *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES], bufPos, bufEnd, NULL, NULL); +UA_AddReferencesRequest_encodeBinary(const UA_AddReferencesRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_VariableTypeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_VariableTypeAttributes *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES], 0, NULL); +UA_AddReferencesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddReferencesRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST], NULL); } -/* BrowsePathResult */ +/* AddReferencesResponse */ +static UA_INLINE size_t +UA_AddReferencesResponse_calcSizeBinary(const UA_AddReferencesResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_BrowsePathResult_encodeBinary(const UA_BrowsePathResult *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT], bufPos, bufEnd, NULL, NULL); +UA_AddReferencesResponse_encodeBinary(const UA_AddReferencesResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_BrowsePathResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowsePathResult *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT], 0, NULL); +UA_AddReferencesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddReferencesResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE], NULL); } -/* ModifySubscriptionResponse */ +/* DeleteNodesItem */ +static UA_INLINE size_t +UA_DeleteNodesItem_calcSizeBinary(const UA_DeleteNodesItem *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESITEM]); +} static UA_INLINE UA_StatusCode -UA_ModifySubscriptionResponse_encodeBinary(const UA_ModifySubscriptionResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_DeleteNodesItem_encodeBinary(const UA_DeleteNodesItem *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESITEM], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ModifySubscriptionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ModifySubscriptionResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE], 0, NULL); +UA_DeleteNodesItem_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteNodesItem *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETENODESITEM], NULL); } -/* RedundantServerDataType */ +/* DeleteNodesRequest */ +static UA_INLINE size_t +UA_DeleteNodesRequest_calcSizeBinary(const UA_DeleteNodesRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESREQUEST]); +} static UA_INLINE UA_StatusCode -UA_RedundantServerDataType_encodeBinary(const UA_RedundantServerDataType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REDUNDANTSERVERDATATYPE], bufPos, bufEnd, NULL, NULL); +UA_DeleteNodesRequest_encodeBinary(const UA_DeleteNodesRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RedundantServerDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RedundantServerDataType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REDUNDANTSERVERDATATYPE], 0, NULL); +UA_DeleteNodesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteNodesRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETENODESREQUEST], NULL); } -/* RegisterNodesResponse */ +/* DeleteNodesResponse */ +static UA_INLINE size_t +UA_DeleteNodesResponse_calcSizeBinary(const UA_DeleteNodesResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_RegisterNodesResponse_encodeBinary(const UA_RegisterNodesResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_DeleteNodesResponse_encodeBinary(const UA_DeleteNodesResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RegisterNodesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterNodesResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE], 0, NULL); +UA_DeleteNodesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteNodesResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE], NULL); } -/* CloseSessionRequest */ +/* DeleteReferencesItem */ +static UA_INLINE size_t +UA_DeleteReferencesItem_calcSizeBinary(const UA_DeleteReferencesItem *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM]); +} static UA_INLINE UA_StatusCode -UA_CloseSessionRequest_encodeBinary(const UA_CloseSessionRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST], bufPos, bufEnd, NULL, NULL); +UA_DeleteReferencesItem_encodeBinary(const UA_DeleteReferencesItem *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CloseSessionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CloseSessionRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST], 0, NULL); +UA_DeleteReferencesItem_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteReferencesItem *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM], NULL); } -/* ModifyMonitoredItemsResponse */ +/* DeleteReferencesRequest */ +static UA_INLINE size_t +UA_DeleteReferencesRequest_calcSizeBinary(const UA_DeleteReferencesRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST]); +} static UA_INLINE UA_StatusCode -UA_ModifyMonitoredItemsResponse_encodeBinary(const UA_ModifyMonitoredItemsResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_DeleteReferencesRequest_encodeBinary(const UA_DeleteReferencesRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ModifyMonitoredItemsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ModifyMonitoredItemsResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE], 0, NULL); +UA_DeleteReferencesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteReferencesRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST], NULL); } -/* ModifySubscriptionRequest */ +/* DeleteReferencesResponse */ +static UA_INLINE size_t +UA_DeleteReferencesResponse_calcSizeBinary(const UA_DeleteReferencesResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_ModifySubscriptionRequest_encodeBinary(const UA_ModifySubscriptionRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST], bufPos, bufEnd, NULL, NULL); +UA_DeleteReferencesResponse_encodeBinary(const UA_DeleteReferencesResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ModifySubscriptionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ModifySubscriptionRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST], 0, NULL); +UA_DeleteReferencesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteReferencesResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE], NULL); } -/* ServerDiagnosticsSummaryDataType */ +/* BrowseDirection */ +static UA_INLINE size_t +UA_BrowseDirection_calcSizeBinary(const UA_BrowseDirection *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSEDIRECTION]); +} static UA_INLINE UA_StatusCode -UA_ServerDiagnosticsSummaryDataType_encodeBinary(const UA_ServerDiagnosticsSummaryDataType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE], bufPos, bufEnd, NULL, NULL); +UA_BrowseDirection_encodeBinary(const UA_BrowseDirection *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEDIRECTION], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ServerDiagnosticsSummaryDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServerDiagnosticsSummaryDataType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE], 0, NULL); +UA_BrowseDirection_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseDirection *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEDIRECTION], NULL); } -/* UserTokenPolicy */ +/* ViewDescription */ +static UA_INLINE size_t +UA_ViewDescription_calcSizeBinary(const UA_ViewDescription *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); +} static UA_INLINE UA_StatusCode -UA_UserTokenPolicy_encodeBinary(const UA_UserTokenPolicy *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_USERTOKENPOLICY], bufPos, bufEnd, NULL, NULL); +UA_ViewDescription_encodeBinary(const UA_ViewDescription *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_UserTokenPolicy_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UserTokenPolicy *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_USERTOKENPOLICY], 0, NULL); +UA_ViewDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ViewDescription *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION], NULL); } -/* ReferenceTypeAttributes */ +/* BrowseDescription */ +static UA_INLINE size_t +UA_BrowseDescription_calcSizeBinary(const UA_BrowseDescription *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION]); +} static UA_INLINE UA_StatusCode -UA_ReferenceTypeAttributes_encodeBinary(const UA_ReferenceTypeAttributes *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES], bufPos, bufEnd, NULL, NULL); +UA_BrowseDescription_encodeBinary(const UA_BrowseDescription *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ReferenceTypeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReferenceTypeAttributes *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES], 0, NULL); +UA_BrowseDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseDescription *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION], NULL); } -/* BrowsePath */ +/* BrowseResultMask */ +static UA_INLINE size_t +UA_BrowseResultMask_calcSizeBinary(const UA_BrowseResultMask *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESULTMASK]); +} static UA_INLINE UA_StatusCode -UA_BrowsePath_encodeBinary(const UA_BrowsePath *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATH], bufPos, bufEnd, NULL, NULL); +UA_BrowseResultMask_encodeBinary(const UA_BrowseResultMask *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESULTMASK], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_BrowsePath_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowsePath *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEPATH], 0, NULL); +UA_BrowseResultMask_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseResultMask *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSERESULTMASK], NULL); } -/* SetMonitoringModeRequest */ +/* ReferenceDescription */ +static UA_INLINE size_t +UA_ReferenceDescription_calcSizeBinary(const UA_ReferenceDescription *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); +} static UA_INLINE UA_StatusCode -UA_SetMonitoringModeRequest_encodeBinary(const UA_SetMonitoringModeRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST], bufPos, bufEnd, NULL, NULL); +UA_ReferenceDescription_encodeBinary(const UA_ReferenceDescription *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SetMonitoringModeRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetMonitoringModeRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST], 0, NULL); +UA_ReferenceDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReferenceDescription *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION], NULL); } -/* UnregisterNodesResponse */ +/* BrowseResult */ +static UA_INLINE size_t +UA_BrowseResult_calcSizeBinary(const UA_BrowseResult *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESULT]); +} static UA_INLINE UA_StatusCode -UA_UnregisterNodesResponse_encodeBinary(const UA_UnregisterNodesResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_BrowseResult_encodeBinary(const UA_BrowseResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESULT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_UnregisterNodesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UnregisterNodesResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE], 0, NULL); +UA_BrowseResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseResult *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSERESULT], NULL); } -/* WriteRequest */ +/* BrowseRequest */ +static UA_INLINE size_t +UA_BrowseRequest_calcSizeBinary(const UA_BrowseRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSEREQUEST]); +} static UA_INLINE UA_StatusCode -UA_WriteRequest_encodeBinary(const UA_WriteRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_WRITEREQUEST], bufPos, bufEnd, NULL, NULL); +UA_BrowseRequest_encodeBinary(const UA_BrowseRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_WriteRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_WriteRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_WRITEREQUEST], 0, NULL); +UA_BrowseRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEREQUEST], NULL); } -/* ObjectAttributes */ +/* BrowseResponse */ +static UA_INLINE size_t +UA_BrowseResponse_calcSizeBinary(const UA_BrowseResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESPONSE]); +} static UA_INLINE UA_StatusCode -UA_ObjectAttributes_encodeBinary(const UA_ObjectAttributes *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES], bufPos, bufEnd, NULL, NULL); +UA_BrowseResponse_encodeBinary(const UA_BrowseResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ObjectAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ObjectAttributes *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES], 0, NULL); +UA_BrowseResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSERESPONSE], NULL); } -/* BrowseResultMask */ +/* BrowseNextRequest */ +static UA_INLINE size_t +UA_BrowseNextRequest_calcSizeBinary(const UA_BrowseNextRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST]); +} static UA_INLINE UA_StatusCode -UA_BrowseResultMask_encodeBinary(const UA_BrowseResultMask *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESULTMASK], bufPos, bufEnd, NULL, NULL); +UA_BrowseNextRequest_encodeBinary(const UA_BrowseNextRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_BrowseResultMask_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseResultMask *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSERESULTMASK], 0, NULL); +UA_BrowseNextRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseNextRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST], NULL); } -/* BrowseDescription */ +/* BrowseNextResponse */ +static UA_INLINE size_t +UA_BrowseNextResponse_calcSizeBinary(const UA_BrowseNextResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_BrowseDescription_encodeBinary(const UA_BrowseDescription *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION], bufPos, bufEnd, NULL, NULL); +UA_BrowseNextResponse_encodeBinary(const UA_BrowseNextResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_BrowseDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseDescription *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION], 0, NULL); +UA_BrowseNextResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseNextResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE], NULL); } -/* SetTriggeringRequest */ +/* RelativePathElement */ +static UA_INLINE size_t +UA_RelativePathElement_calcSizeBinary(const UA_RelativePathElement *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]); +} static UA_INLINE UA_StatusCode -UA_SetTriggeringRequest_encodeBinary(const UA_SetTriggeringRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST], bufPos, bufEnd, NULL, NULL); +UA_RelativePathElement_encodeBinary(const UA_RelativePathElement *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SetTriggeringRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetTriggeringRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST], 0, NULL); +UA_RelativePathElement_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RelativePathElement *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT], NULL); } -/* SessionSecurityDiagnosticsDataType */ +/* RelativePath */ +static UA_INLINE size_t +UA_RelativePath_calcSizeBinary(const UA_RelativePath *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_RELATIVEPATH]); +} static UA_INLINE UA_StatusCode -UA_SessionSecurityDiagnosticsDataType_encodeBinary(const UA_SessionSecurityDiagnosticsDataType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SESSIONSECURITYDIAGNOSTICSDATATYPE], bufPos, bufEnd, NULL, NULL); +UA_RelativePath_encodeBinary(const UA_RelativePath *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_RELATIVEPATH], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SessionSecurityDiagnosticsDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SessionSecurityDiagnosticsDataType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SESSIONSECURITYDIAGNOSTICSDATATYPE], 0, NULL); +UA_RelativePath_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RelativePath *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_RELATIVEPATH], NULL); } -/* RepublishRequest */ +/* BrowsePath */ +static UA_INLINE size_t +UA_BrowsePath_calcSizeBinary(const UA_BrowsePath *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATH]); +} static UA_INLINE UA_StatusCode -UA_RepublishRequest_encodeBinary(const UA_RepublishRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST], bufPos, bufEnd, NULL, NULL); +UA_BrowsePath_encodeBinary(const UA_BrowsePath *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATH], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RepublishRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RepublishRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST], 0, NULL); +UA_BrowsePath_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowsePath *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEPATH], NULL); } -/* GetEndpointsRequest */ +/* BrowsePathTarget */ +static UA_INLINE size_t +UA_BrowsePathTarget_calcSizeBinary(const UA_BrowsePathTarget *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET]); +} static UA_INLINE UA_StatusCode -UA_GetEndpointsRequest_encodeBinary(const UA_GetEndpointsRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST], bufPos, bufEnd, NULL, NULL); +UA_BrowsePathTarget_encodeBinary(const UA_BrowsePathTarget *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_GetEndpointsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_GetEndpointsRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST], 0, NULL); +UA_BrowsePathTarget_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowsePathTarget *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET], NULL); } -/* PublishRequest */ +/* BrowsePathResult */ +static UA_INLINE size_t +UA_BrowsePathResult_calcSizeBinary(const UA_BrowsePathResult *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT]); +} static UA_INLINE UA_StatusCode -UA_PublishRequest_encodeBinary(const UA_PublishRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_PUBLISHREQUEST], bufPos, bufEnd, NULL, NULL); +UA_BrowsePathResult_encodeBinary(const UA_BrowsePathResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_PublishRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_PublishRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_PUBLISHREQUEST], 0, NULL); +UA_BrowsePathResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowsePathResult *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT], NULL); } -/* DeleteSubscriptionsResponse */ +/* TranslateBrowsePathsToNodeIdsRequest */ +static UA_INLINE size_t +UA_TranslateBrowsePathsToNodeIdsRequest_calcSizeBinary(const UA_TranslateBrowsePathsToNodeIdsRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST]); +} static UA_INLINE UA_StatusCode -UA_DeleteSubscriptionsResponse_encodeBinary(const UA_DeleteSubscriptionsResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_TranslateBrowsePathsToNodeIdsRequest_encodeBinary(const UA_TranslateBrowsePathsToNodeIdsRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DeleteSubscriptionsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteSubscriptionsResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE], 0, NULL); +UA_TranslateBrowsePathsToNodeIdsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TranslateBrowsePathsToNodeIdsRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST], NULL); } -/* AddNodesResponse */ +/* TranslateBrowsePathsToNodeIdsResponse */ +static UA_INLINE size_t +UA_TranslateBrowsePathsToNodeIdsResponse_calcSizeBinary(const UA_TranslateBrowsePathsToNodeIdsResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_AddNodesResponse_encodeBinary(const UA_AddNodesResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_TranslateBrowsePathsToNodeIdsResponse_encodeBinary(const UA_TranslateBrowsePathsToNodeIdsResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_AddNodesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddNodesResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE], 0, NULL); +UA_TranslateBrowsePathsToNodeIdsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TranslateBrowsePathsToNodeIdsResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE], NULL); } -/* DataChangeNotification */ +/* RegisterNodesRequest */ +static UA_INLINE size_t +UA_RegisterNodesRequest_calcSizeBinary(const UA_RegisterNodesRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST]); +} static UA_INLINE UA_StatusCode -UA_DataChangeNotification_encodeBinary(const UA_DataChangeNotification *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION], bufPos, bufEnd, NULL, NULL); +UA_RegisterNodesRequest_encodeBinary(const UA_RegisterNodesRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DataChangeNotification_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataChangeNotification *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION], 0, NULL); +UA_RegisterNodesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterNodesRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST], NULL); } -/* CloseSecureChannelResponse */ +/* RegisterNodesResponse */ +static UA_INLINE size_t +UA_RegisterNodesResponse_calcSizeBinary(const UA_RegisterNodesResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_CloseSecureChannelResponse_encodeBinary(const UA_CloseSecureChannelResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_RegisterNodesResponse_encodeBinary(const UA_RegisterNodesResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CloseSecureChannelResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CloseSecureChannelResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE], 0, NULL); +UA_RegisterNodesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterNodesResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE], NULL); } -/* ModifyMonitoredItemsRequest */ +/* UnregisterNodesRequest */ +static UA_INLINE size_t +UA_UnregisterNodesRequest_calcSizeBinary(const UA_UnregisterNodesRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST]); +} static UA_INLINE UA_StatusCode -UA_ModifyMonitoredItemsRequest_encodeBinary(const UA_ModifyMonitoredItemsRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST], bufPos, bufEnd, NULL, NULL); +UA_UnregisterNodesRequest_encodeBinary(const UA_UnregisterNodesRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ModifyMonitoredItemsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ModifyMonitoredItemsRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST], 0, NULL); +UA_UnregisterNodesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UnregisterNodesRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST], NULL); } -/* SetMonitoringModeResponse */ +/* UnregisterNodesResponse */ +static UA_INLINE size_t +UA_UnregisterNodesResponse_calcSizeBinary(const UA_UnregisterNodesResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_SetMonitoringModeResponse_encodeBinary(const UA_SetMonitoringModeResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE], bufPos, bufEnd, NULL, NULL); +UA_UnregisterNodesResponse_encodeBinary(const UA_UnregisterNodesResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SetMonitoringModeResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetMonitoringModeResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE], 0, NULL); +UA_UnregisterNodesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UnregisterNodesResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE], NULL); } -/* FindServersRequest */ +/* FilterOperator */ +static UA_INLINE size_t +UA_FilterOperator_calcSizeBinary(const UA_FilterOperator *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FILTEROPERATOR]); +} static UA_INLINE UA_StatusCode -UA_FindServersRequest_encodeBinary(const UA_FindServersRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST], bufPos, bufEnd, NULL, NULL); +UA_FilterOperator_encodeBinary(const UA_FilterOperator *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FILTEROPERATOR], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_FindServersRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FindServersRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST], 0, NULL); +UA_FilterOperator_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FilterOperator *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FILTEROPERATOR], NULL); } -/* ReferenceDescription */ +/* ContentFilterElement */ +static UA_INLINE size_t +UA_ContentFilterElement_calcSizeBinary(const UA_ContentFilterElement *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT]); +} static UA_INLINE UA_StatusCode -UA_ReferenceDescription_encodeBinary(const UA_ReferenceDescription *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION], bufPos, bufEnd, NULL, NULL); +UA_ContentFilterElement_encodeBinary(const UA_ContentFilterElement *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ReferenceDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReferenceDescription *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION], 0, NULL); +UA_ContentFilterElement_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ContentFilterElement *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT], NULL); } -/* SetPublishingModeResponse */ +/* ContentFilter */ +static UA_INLINE size_t +UA_ContentFilter_calcSizeBinary(const UA_ContentFilter *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTER]); +} static UA_INLINE UA_StatusCode -UA_SetPublishingModeResponse_encodeBinary(const UA_SetPublishingModeResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE], bufPos, bufEnd, NULL, NULL); +UA_ContentFilter_encodeBinary(const UA_ContentFilter *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SetPublishingModeResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetPublishingModeResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE], 0, NULL); +UA_ContentFilter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ContentFilter *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CONTENTFILTER], NULL); } -/* ContentFilterResult */ +/* FilterOperand */ +static UA_INLINE size_t +UA_FilterOperand_calcSizeBinary(const UA_FilterOperand *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FILTEROPERAND]); +} static UA_INLINE UA_StatusCode -UA_ContentFilterResult_encodeBinary(const UA_ContentFilterResult *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT], bufPos, bufEnd, NULL, NULL); +UA_FilterOperand_encodeBinary(const UA_FilterOperand *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FILTEROPERAND], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ContentFilterResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ContentFilterResult *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT], 0, NULL); +UA_FilterOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FilterOperand *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FILTEROPERAND], NULL); } -/* RegisterServerResponse */ +/* ElementOperand */ +static UA_INLINE size_t +UA_ElementOperand_calcSizeBinary(const UA_ElementOperand *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ELEMENTOPERAND]); +} static UA_INLINE UA_StatusCode -UA_RegisterServerResponse_encodeBinary(const UA_RegisterServerResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_ElementOperand_encodeBinary(const UA_ElementOperand *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ELEMENTOPERAND], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RegisterServerResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterServerResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE], 0, NULL); +UA_ElementOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ElementOperand *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ELEMENTOPERAND], NULL); } -/* AddReferencesItem */ +/* LiteralOperand */ +static UA_INLINE size_t +UA_LiteralOperand_calcSizeBinary(const UA_LiteralOperand *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_LITERALOPERAND]); +} static UA_INLINE UA_StatusCode -UA_AddReferencesItem_encodeBinary(const UA_AddReferencesItem *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM], bufPos, bufEnd, NULL, NULL); +UA_LiteralOperand_encodeBinary(const UA_LiteralOperand *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_LITERALOPERAND], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_AddReferencesItem_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddReferencesItem *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM], 0, NULL); +UA_LiteralOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_LiteralOperand *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_LITERALOPERAND], NULL); } -/* QueryDataDescription */ +/* AttributeOperand */ +static UA_INLINE size_t +UA_AttributeOperand_calcSizeBinary(const UA_AttributeOperand *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND]); +} static UA_INLINE UA_StatusCode -UA_QueryDataDescription_encodeBinary(const UA_QueryDataDescription *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_QUERYDATADESCRIPTION], bufPos, bufEnd, NULL, NULL); +UA_AttributeOperand_encodeBinary(const UA_AttributeOperand *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_QueryDataDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_QueryDataDescription *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_QUERYDATADESCRIPTION], 0, NULL); +UA_AttributeOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AttributeOperand *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND], NULL); } -/* CreateSubscriptionResponse */ +/* SimpleAttributeOperand */ +static UA_INLINE size_t +UA_SimpleAttributeOperand_calcSizeBinary(const UA_SimpleAttributeOperand *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]); +} static UA_INLINE UA_StatusCode -UA_CreateSubscriptionResponse_encodeBinary(const UA_CreateSubscriptionResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_SimpleAttributeOperand_encodeBinary(const UA_SimpleAttributeOperand *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CreateSubscriptionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateSubscriptionResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE], 0, NULL); +UA_SimpleAttributeOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SimpleAttributeOperand *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND], NULL); } -/* NetworkGroupDataType */ +/* ContentFilterElementResult */ +static UA_INLINE size_t +UA_ContentFilterElementResult_calcSizeBinary(const UA_ContentFilterElementResult *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT]); +} static UA_INLINE UA_StatusCode -UA_NetworkGroupDataType_encodeBinary(const UA_NetworkGroupDataType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NETWORKGROUPDATATYPE], bufPos, bufEnd, NULL, NULL); +UA_ContentFilterElementResult_encodeBinary(const UA_ContentFilterElementResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_NetworkGroupDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NetworkGroupDataType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NETWORKGROUPDATATYPE], 0, NULL); +UA_ContentFilterElementResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ContentFilterElementResult *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT], NULL); } -/* DeleteReferencesResponse */ +/* ContentFilterResult */ +static UA_INLINE size_t +UA_ContentFilterResult_calcSizeBinary(const UA_ContentFilterResult *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT]); +} static UA_INLINE UA_StatusCode -UA_DeleteReferencesResponse_encodeBinary(const UA_DeleteReferencesResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_ContentFilterResult_encodeBinary(const UA_ContentFilterResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DeleteReferencesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteReferencesResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE], 0, NULL); +UA_ContentFilterResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ContentFilterResult *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT], NULL); } -/* CreateMonitoredItemsResponse */ +/* TimestampsToReturn */ +static UA_INLINE size_t +UA_TimestampsToReturn_calcSizeBinary(const UA_TimestampsToReturn *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_TIMESTAMPSTORETURN]); +} static UA_INLINE UA_StatusCode -UA_CreateMonitoredItemsResponse_encodeBinary(const UA_CreateMonitoredItemsResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_TimestampsToReturn_encodeBinary(const UA_TimestampsToReturn *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_TIMESTAMPSTORETURN], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CreateMonitoredItemsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateMonitoredItemsResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE], 0, NULL); +UA_TimestampsToReturn_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TimestampsToReturn *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_TIMESTAMPSTORETURN], NULL); } -/* CallResponse */ +/* ReadValueId */ +static UA_INLINE size_t +UA_ReadValueId_calcSizeBinary(const UA_ReadValueId *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_READVALUEID]); +} static UA_INLINE UA_StatusCode -UA_CallResponse_encodeBinary(const UA_CallResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CALLRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_ReadValueId_encodeBinary(const UA_ReadValueId *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_READVALUEID], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CallResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CallResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CALLRESPONSE], 0, NULL); +UA_ReadValueId_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReadValueId *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_READVALUEID], NULL); } -/* DeleteNodesResponse */ +/* ReadRequest */ +static UA_INLINE size_t +UA_ReadRequest_calcSizeBinary(const UA_ReadRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_READREQUEST]); +} static UA_INLINE UA_StatusCode -UA_DeleteNodesResponse_encodeBinary(const UA_DeleteNodesResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_ReadRequest_encodeBinary(const UA_ReadRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_READREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DeleteNodesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteNodesResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE], 0, NULL); +UA_ReadRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReadRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_READREQUEST], NULL); } -/* RepublishResponse */ +/* ReadResponse */ +static UA_INLINE size_t +UA_ReadResponse_calcSizeBinary(const UA_ReadResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_READRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_RepublishResponse_encodeBinary(const UA_RepublishResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_ReadResponse_encodeBinary(const UA_ReadResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_READRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RepublishResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RepublishResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE], 0, NULL); +UA_ReadResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReadResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_READRESPONSE], NULL); } -/* MonitoredItemCreateRequest */ +/* WriteValue */ +static UA_INLINE size_t +UA_WriteValue_calcSizeBinary(const UA_WriteValue *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_WRITEVALUE]); +} static UA_INLINE UA_StatusCode -UA_MonitoredItemCreateRequest_encodeBinary(const UA_MonitoredItemCreateRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST], bufPos, bufEnd, NULL, NULL); +UA_WriteValue_encodeBinary(const UA_WriteValue *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_WRITEVALUE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_MonitoredItemCreateRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemCreateRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST], 0, NULL); +UA_WriteValue_decodeBinary(const UA_ByteString *src, size_t *offset, UA_WriteValue *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_WRITEVALUE], NULL); } -/* DeleteReferencesRequest */ +/* WriteRequest */ +static UA_INLINE size_t +UA_WriteRequest_calcSizeBinary(const UA_WriteRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_WRITEREQUEST]); +} static UA_INLINE UA_StatusCode -UA_DeleteReferencesRequest_encodeBinary(const UA_DeleteReferencesRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST], bufPos, bufEnd, NULL, NULL); +UA_WriteRequest_encodeBinary(const UA_WriteRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_WRITEREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DeleteReferencesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteReferencesRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST], 0, NULL); +UA_WriteRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_WriteRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_WRITEREQUEST], NULL); } -/* ReadResponse */ +/* WriteResponse */ +static UA_INLINE size_t +UA_WriteResponse_calcSizeBinary(const UA_WriteResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_WRITERESPONSE]); +} static UA_INLINE UA_StatusCode -UA_ReadResponse_encodeBinary(const UA_ReadResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_READRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_WriteResponse_encodeBinary(const UA_WriteResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_WRITERESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ReadResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReadResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_READRESPONSE], 0, NULL); +UA_WriteResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_WriteResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_WRITERESPONSE], NULL); } -/* AddReferencesRequest */ +/* CallMethodRequest */ +static UA_INLINE size_t +UA_CallMethodRequest_calcSizeBinary(const UA_CallMethodRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST]); +} static UA_INLINE UA_StatusCode -UA_AddReferencesRequest_encodeBinary(const UA_AddReferencesRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST], bufPos, bufEnd, NULL, NULL); +UA_CallMethodRequest_encodeBinary(const UA_CallMethodRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_AddReferencesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddReferencesRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST], 0, NULL); +UA_CallMethodRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CallMethodRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST], NULL); } -/* ReadRequest */ +/* CallMethodResult */ +static UA_INLINE size_t +UA_CallMethodResult_calcSizeBinary(const UA_CallMethodResult *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CALLMETHODRESULT]); +} static UA_INLINE UA_StatusCode -UA_ReadRequest_encodeBinary(const UA_ReadRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_READREQUEST], bufPos, bufEnd, NULL, NULL); +UA_CallMethodResult_encodeBinary(const UA_CallMethodResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CALLMETHODRESULT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ReadRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReadRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_READREQUEST], 0, NULL); +UA_CallMethodResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CallMethodResult *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CALLMETHODRESULT], NULL); } -/* OpenSecureChannelRequest */ +/* CallRequest */ +static UA_INLINE size_t +UA_CallRequest_calcSizeBinary(const UA_CallRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CALLREQUEST]); +} static UA_INLINE UA_StatusCode -UA_OpenSecureChannelRequest_encodeBinary(const UA_OpenSecureChannelRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST], bufPos, bufEnd, NULL, NULL); +UA_CallRequest_encodeBinary(const UA_CallRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CALLREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_OpenSecureChannelRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_OpenSecureChannelRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST], 0, NULL); +UA_CallRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CallRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CALLREQUEST], NULL); } -/* RegisterServer2Response */ +/* CallResponse */ +static UA_INLINE size_t +UA_CallResponse_calcSizeBinary(const UA_CallResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CALLRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_RegisterServer2Response_encodeBinary(const UA_RegisterServer2Response *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE], bufPos, bufEnd, NULL, NULL); +UA_CallResponse_encodeBinary(const UA_CallResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CALLRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RegisterServer2Response_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterServer2Response *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE], 0, NULL); +UA_CallResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CallResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CALLRESPONSE], NULL); } -/* AddNodesItem */ +/* MonitoringMode */ +static UA_INLINE size_t +UA_MonitoringMode_calcSizeBinary(const UA_MonitoringMode *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITORINGMODE]); +} static UA_INLINE UA_StatusCode -UA_AddNodesItem_encodeBinary(const UA_AddNodesItem *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESITEM], bufPos, bufEnd, NULL, NULL); +UA_MonitoringMode_encodeBinary(const UA_MonitoringMode *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITORINGMODE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_AddNodesItem_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddNodesItem *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDNODESITEM], 0, NULL); +UA_MonitoringMode_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoringMode *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITORINGMODE], NULL); } -/* NodeTypeDescription */ +/* DataChangeTrigger */ +static UA_INLINE size_t +UA_DataChangeTrigger_calcSizeBinary(const UA_DataChangeTrigger *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGETRIGGER]); +} static UA_INLINE UA_StatusCode -UA_NodeTypeDescription_encodeBinary(const UA_NodeTypeDescription *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NODETYPEDESCRIPTION], bufPos, bufEnd, NULL, NULL); +UA_DataChangeTrigger_encodeBinary(const UA_DataChangeTrigger *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGETRIGGER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_NodeTypeDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NodeTypeDescription *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NODETYPEDESCRIPTION], 0, NULL); +UA_DataChangeTrigger_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataChangeTrigger *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATACHANGETRIGGER], NULL); } -/* ServerStatusDataType */ +/* DeadbandType */ +static UA_INLINE size_t +UA_DeadbandType_calcSizeBinary(const UA_DeadbandType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DEADBANDTYPE]); +} static UA_INLINE UA_StatusCode -UA_ServerStatusDataType_encodeBinary(const UA_ServerStatusDataType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE], bufPos, bufEnd, NULL, NULL); +UA_DeadbandType_encodeBinary(const UA_DeadbandType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DEADBANDTYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ServerStatusDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServerStatusDataType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE], 0, NULL); +UA_DeadbandType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeadbandType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DEADBANDTYPE], NULL); } -/* AttributeOperand */ +/* DataChangeFilter */ +static UA_INLINE size_t +UA_DataChangeFilter_calcSizeBinary(const UA_DataChangeFilter *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGEFILTER]); +} static UA_INLINE UA_StatusCode -UA_AttributeOperand_encodeBinary(const UA_AttributeOperand *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND], bufPos, bufEnd, NULL, NULL); +UA_DataChangeFilter_encodeBinary(const UA_DataChangeFilter *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGEFILTER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_AttributeOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AttributeOperand *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND], 0, NULL); +UA_DataChangeFilter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataChangeFilter *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATACHANGEFILTER], NULL); } -/* AddReferencesResponse */ +/* EventFilter */ +static UA_INLINE size_t +UA_EventFilter_calcSizeBinary(const UA_EventFilter *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_EVENTFILTER]); +} static UA_INLINE UA_StatusCode -UA_AddReferencesResponse_encodeBinary(const UA_AddReferencesResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_EventFilter_encodeBinary(const UA_EventFilter *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EVENTFILTER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_AddReferencesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddReferencesResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE], 0, NULL); +UA_EventFilter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EventFilter *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EVENTFILTER], NULL); } -/* EventFilterResult */ +/* AggregateConfiguration */ +static UA_INLINE size_t +UA_AggregateConfiguration_calcSizeBinary(const UA_AggregateConfiguration *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_AGGREGATECONFIGURATION]); +} static UA_INLINE UA_StatusCode -UA_EventFilterResult_encodeBinary(const UA_EventFilterResult *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT], bufPos, bufEnd, NULL, NULL); +UA_AggregateConfiguration_encodeBinary(const UA_AggregateConfiguration *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_AGGREGATECONFIGURATION], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_EventFilterResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EventFilterResult *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT], 0, NULL); +UA_AggregateConfiguration_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AggregateConfiguration *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_AGGREGATECONFIGURATION], NULL); } -/* TranslateBrowsePathsToNodeIdsResponse */ +/* AggregateFilter */ +static UA_INLINE size_t +UA_AggregateFilter_calcSizeBinary(const UA_AggregateFilter *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_AGGREGATEFILTER]); +} static UA_INLINE UA_StatusCode -UA_TranslateBrowsePathsToNodeIdsResponse_encodeBinary(const UA_TranslateBrowsePathsToNodeIdsResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_AggregateFilter_encodeBinary(const UA_AggregateFilter *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_AGGREGATEFILTER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_TranslateBrowsePathsToNodeIdsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TranslateBrowsePathsToNodeIdsResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE], 0, NULL); +UA_AggregateFilter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AggregateFilter *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_AGGREGATEFILTER], NULL); } -/* DataChangeFilter */ +/* EventFilterResult */ +static UA_INLINE size_t +UA_EventFilterResult_calcSizeBinary(const UA_EventFilterResult *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT]); +} static UA_INLINE UA_StatusCode -UA_DataChangeFilter_encodeBinary(const UA_DataChangeFilter *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGEFILTER], bufPos, bufEnd, NULL, NULL); +UA_EventFilterResult_encodeBinary(const UA_EventFilterResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_DataChangeFilter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataChangeFilter *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATACHANGEFILTER], 0, NULL); +UA_EventFilterResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EventFilterResult *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT], NULL); } -/* ContentFilterElement */ +/* MonitoringParameters */ +static UA_INLINE size_t +UA_MonitoringParameters_calcSizeBinary(const UA_MonitoringParameters *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS]); +} static UA_INLINE UA_StatusCode -UA_ContentFilterElement_encodeBinary(const UA_ContentFilterElement *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT], bufPos, bufEnd, NULL, NULL); +UA_MonitoringParameters_encodeBinary(const UA_MonitoringParameters *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ContentFilterElement_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ContentFilterElement *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT], 0, NULL); +UA_MonitoringParameters_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoringParameters *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS], NULL); } -/* TranslateBrowsePathsToNodeIdsRequest */ +/* MonitoredItemCreateRequest */ +static UA_INLINE size_t +UA_MonitoredItemCreateRequest_calcSizeBinary(const UA_MonitoredItemCreateRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST]); +} static UA_INLINE UA_StatusCode -UA_TranslateBrowsePathsToNodeIdsRequest_encodeBinary(const UA_TranslateBrowsePathsToNodeIdsRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST], bufPos, bufEnd, NULL, NULL); +UA_MonitoredItemCreateRequest_encodeBinary(const UA_MonitoredItemCreateRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_TranslateBrowsePathsToNodeIdsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TranslateBrowsePathsToNodeIdsRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST], 0, NULL); +UA_MonitoredItemCreateRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemCreateRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST], NULL); } -/* CloseSessionResponse */ +/* MonitoredItemCreateResult */ +static UA_INLINE size_t +UA_MonitoredItemCreateResult_calcSizeBinary(const UA_MonitoredItemCreateResult *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]); +} static UA_INLINE UA_StatusCode -UA_CloseSessionResponse_encodeBinary(const UA_CloseSessionResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_MonitoredItemCreateResult_encodeBinary(const UA_MonitoredItemCreateResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CloseSessionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CloseSessionResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE], 0, NULL); +UA_MonitoredItemCreateResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemCreateResult *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT], NULL); } -/* ApplicationDescription */ +/* CreateMonitoredItemsRequest */ +static UA_INLINE size_t +UA_CreateMonitoredItemsRequest_calcSizeBinary(const UA_CreateMonitoredItemsRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST]); +} static UA_INLINE UA_StatusCode -UA_ApplicationDescription_encodeBinary(const UA_ApplicationDescription *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION], bufPos, bufEnd, NULL, NULL); +UA_CreateMonitoredItemsRequest_encodeBinary(const UA_CreateMonitoredItemsRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ApplicationDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ApplicationDescription *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION], 0, NULL); +UA_CreateMonitoredItemsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateMonitoredItemsRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST], NULL); } -/* SessionDiagnosticsDataType */ +/* CreateMonitoredItemsResponse */ +static UA_INLINE size_t +UA_CreateMonitoredItemsResponse_calcSizeBinary(const UA_CreateMonitoredItemsResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_SessionDiagnosticsDataType_encodeBinary(const UA_SessionDiagnosticsDataType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SESSIONDIAGNOSTICSDATATYPE], bufPos, bufEnd, NULL, NULL); +UA_CreateMonitoredItemsResponse_encodeBinary(const UA_CreateMonitoredItemsResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SessionDiagnosticsDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SessionDiagnosticsDataType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SESSIONDIAGNOSTICSDATATYPE], 0, NULL); +UA_CreateMonitoredItemsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateMonitoredItemsResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE], NULL); } -/* ServiceFault */ +/* MonitoredItemModifyRequest */ +static UA_INLINE size_t +UA_MonitoredItemModifyRequest_calcSizeBinary(const UA_MonitoredItemModifyRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST]); +} static UA_INLINE UA_StatusCode -UA_ServiceFault_encodeBinary(const UA_ServiceFault *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVICEFAULT], bufPos, bufEnd, NULL, NULL); +UA_MonitoredItemModifyRequest_encodeBinary(const UA_MonitoredItemModifyRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ServiceFault_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServiceFault *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVICEFAULT], 0, NULL); +UA_MonitoredItemModifyRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemModifyRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST], NULL); } -/* RegisteredServer */ +/* MonitoredItemModifyResult */ +static UA_INLINE size_t +UA_MonitoredItemModifyResult_calcSizeBinary(const UA_MonitoredItemModifyResult *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]); +} static UA_INLINE UA_StatusCode -UA_RegisteredServer_encodeBinary(const UA_RegisteredServer *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTEREDSERVER], bufPos, bufEnd, NULL, NULL); +UA_MonitoredItemModifyResult_encodeBinary(const UA_MonitoredItemModifyResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RegisteredServer_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisteredServer *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTEREDSERVER], 0, NULL); +UA_MonitoredItemModifyResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemModifyResult *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT], NULL); } -/* AggregateFilter */ +/* ModifyMonitoredItemsRequest */ +static UA_INLINE size_t +UA_ModifyMonitoredItemsRequest_calcSizeBinary(const UA_ModifyMonitoredItemsRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST]); +} static UA_INLINE UA_StatusCode -UA_AggregateFilter_encodeBinary(const UA_AggregateFilter *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_AGGREGATEFILTER], bufPos, bufEnd, NULL, NULL); +UA_ModifyMonitoredItemsRequest_encodeBinary(const UA_ModifyMonitoredItemsRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_AggregateFilter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AggregateFilter *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_AGGREGATEFILTER], 0, NULL); +UA_ModifyMonitoredItemsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ModifyMonitoredItemsRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST], NULL); } -/* RegisterServerRequest */ +/* ModifyMonitoredItemsResponse */ +static UA_INLINE size_t +UA_ModifyMonitoredItemsResponse_calcSizeBinary(const UA_ModifyMonitoredItemsResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_RegisterServerRequest_encodeBinary(const UA_RegisterServerRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST], bufPos, bufEnd, NULL, NULL); +UA_ModifyMonitoredItemsResponse_encodeBinary(const UA_ModifyMonitoredItemsResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RegisterServerRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterServerRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST], 0, NULL); +UA_ModifyMonitoredItemsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ModifyMonitoredItemsResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE], NULL); } -/* EndpointDescription */ +/* SetMonitoringModeRequest */ +static UA_INLINE size_t +UA_SetMonitoringModeRequest_calcSizeBinary(const UA_SetMonitoringModeRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST]); +} static UA_INLINE UA_StatusCode -UA_EndpointDescription_encodeBinary(const UA_EndpointDescription *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION], bufPos, bufEnd, NULL, NULL); +UA_SetMonitoringModeRequest_encodeBinary(const UA_SetMonitoringModeRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_EndpointDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EndpointDescription *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION], 0, NULL); +UA_SetMonitoringModeRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetMonitoringModeRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST], NULL); } -/* CreateMonitoredItemsRequest */ +/* SetMonitoringModeResponse */ +static UA_INLINE size_t +UA_SetMonitoringModeResponse_calcSizeBinary(const UA_SetMonitoringModeResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]); +} static UA_INLINE UA_StatusCode -UA_CreateMonitoredItemsRequest_encodeBinary(const UA_CreateMonitoredItemsRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST], bufPos, bufEnd, NULL, NULL); +UA_SetMonitoringModeResponse_encodeBinary(const UA_SetMonitoringModeResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CreateMonitoredItemsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateMonitoredItemsRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST], 0, NULL); +UA_SetMonitoringModeResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetMonitoringModeResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE], NULL); } -/* ContentFilter */ +/* SetTriggeringRequest */ +static UA_INLINE size_t +UA_SetTriggeringRequest_calcSizeBinary(const UA_SetTriggeringRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST]); +} static UA_INLINE UA_StatusCode -UA_ContentFilter_encodeBinary(const UA_ContentFilter *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTER], bufPos, bufEnd, NULL, NULL); +UA_SetTriggeringRequest_encodeBinary(const UA_SetTriggeringRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ContentFilter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ContentFilter *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CONTENTFILTER], 0, NULL); +UA_SetTriggeringRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetTriggeringRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST], NULL); } -/* QueryFirstResponse */ +/* SetTriggeringResponse */ +static UA_INLINE size_t +UA_SetTriggeringResponse_calcSizeBinary(const UA_SetTriggeringResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_QueryFirstResponse_encodeBinary(const UA_QueryFirstResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_QUERYFIRSTRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_SetTriggeringResponse_encodeBinary(const UA_SetTriggeringResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_QueryFirstResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_QueryFirstResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_QUERYFIRSTRESPONSE], 0, NULL); +UA_SetTriggeringResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetTriggeringResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE], NULL); } -/* AddNodesRequest */ +/* DeleteMonitoredItemsRequest */ +static UA_INLINE size_t +UA_DeleteMonitoredItemsRequest_calcSizeBinary(const UA_DeleteMonitoredItemsRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST]); +} static UA_INLINE UA_StatusCode -UA_AddNodesRequest_encodeBinary(const UA_AddNodesRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESREQUEST], bufPos, bufEnd, NULL, NULL); +UA_DeleteMonitoredItemsRequest_encodeBinary(const UA_DeleteMonitoredItemsRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_AddNodesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddNodesRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDNODESREQUEST], 0, NULL); +UA_DeleteMonitoredItemsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteMonitoredItemsRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST], NULL); } -/* BrowseRequest */ +/* DeleteMonitoredItemsResponse */ +static UA_INLINE size_t +UA_DeleteMonitoredItemsResponse_calcSizeBinary(const UA_DeleteMonitoredItemsResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_BrowseRequest_encodeBinary(const UA_BrowseRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEREQUEST], bufPos, bufEnd, NULL, NULL); +UA_DeleteMonitoredItemsResponse_encodeBinary(const UA_DeleteMonitoredItemsResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_BrowseRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEREQUEST], 0, NULL); +UA_DeleteMonitoredItemsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteMonitoredItemsResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE], NULL); } -/* BrowseResult */ +/* CreateSubscriptionRequest */ +static UA_INLINE size_t +UA_CreateSubscriptionRequest_calcSizeBinary(const UA_CreateSubscriptionRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST]); +} static UA_INLINE UA_StatusCode -UA_BrowseResult_encodeBinary(const UA_BrowseResult *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESULT], bufPos, bufEnd, NULL, NULL); +UA_CreateSubscriptionRequest_encodeBinary(const UA_CreateSubscriptionRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_BrowseResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseResult *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSERESULT], 0, NULL); +UA_CreateSubscriptionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateSubscriptionRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST], NULL); } -/* RegisterServer2Request */ +/* CreateSubscriptionResponse */ +static UA_INLINE size_t +UA_CreateSubscriptionResponse_calcSizeBinary(const UA_CreateSubscriptionResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_RegisterServer2Request_encodeBinary(const UA_RegisterServer2Request *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST], bufPos, bufEnd, NULL, NULL); +UA_CreateSubscriptionResponse_encodeBinary(const UA_CreateSubscriptionResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_RegisterServer2Request_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterServer2Request *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST], 0, NULL); +UA_CreateSubscriptionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateSubscriptionResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE], NULL); } -/* CreateSessionRequest */ +/* ModifySubscriptionRequest */ +static UA_INLINE size_t +UA_ModifySubscriptionRequest_calcSizeBinary(const UA_ModifySubscriptionRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST]); +} static UA_INLINE UA_StatusCode -UA_CreateSessionRequest_encodeBinary(const UA_CreateSessionRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST], bufPos, bufEnd, NULL, NULL); +UA_ModifySubscriptionRequest_encodeBinary(const UA_ModifySubscriptionRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CreateSessionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateSessionRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST], 0, NULL); +UA_ModifySubscriptionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ModifySubscriptionRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST], NULL); } -/* EventFilter */ +/* ModifySubscriptionResponse */ +static UA_INLINE size_t +UA_ModifySubscriptionResponse_calcSizeBinary(const UA_ModifySubscriptionResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]); +} static UA_INLINE UA_StatusCode -UA_EventFilter_encodeBinary(const UA_EventFilter *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EVENTFILTER], bufPos, bufEnd, NULL, NULL); +UA_ModifySubscriptionResponse_encodeBinary(const UA_ModifySubscriptionResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_EventFilter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EventFilter *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EVENTFILTER], 0, NULL); +UA_ModifySubscriptionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ModifySubscriptionResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE], NULL); } -/* GetEndpointsResponse */ +/* SetPublishingModeRequest */ +static UA_INLINE size_t +UA_SetPublishingModeRequest_calcSizeBinary(const UA_SetPublishingModeRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST]); +} static UA_INLINE UA_StatusCode -UA_GetEndpointsResponse_encodeBinary(const UA_GetEndpointsResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_SetPublishingModeRequest_encodeBinary(const UA_SetPublishingModeRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_GetEndpointsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_GetEndpointsResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE], 0, NULL); +UA_SetPublishingModeRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetPublishingModeRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST], NULL); } -/* FindServersResponse */ +/* SetPublishingModeResponse */ +static UA_INLINE size_t +UA_SetPublishingModeResponse_calcSizeBinary(const UA_SetPublishingModeResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]); +} static UA_INLINE UA_StatusCode -UA_FindServersResponse_encodeBinary(const UA_FindServersResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_SetPublishingModeResponse_encodeBinary(const UA_SetPublishingModeResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_FindServersResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FindServersResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE], 0, NULL); +UA_SetPublishingModeResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetPublishingModeResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE], NULL); } -/* BrowseNextResponse */ +/* NotificationMessage */ +static UA_INLINE size_t +UA_NotificationMessage_calcSizeBinary(const UA_NotificationMessage *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE]); +} static UA_INLINE UA_StatusCode -UA_BrowseNextResponse_encodeBinary(const UA_BrowseNextResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_NotificationMessage_encodeBinary(const UA_NotificationMessage *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_BrowseNextResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseNextResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE], 0, NULL); +UA_NotificationMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NotificationMessage *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE], NULL); } -/* BrowseResponse */ +/* MonitoredItemNotification */ +static UA_INLINE size_t +UA_MonitoredItemNotification_calcSizeBinary(const UA_MonitoredItemNotification *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]); +} static UA_INLINE UA_StatusCode -UA_BrowseResponse_encodeBinary(const UA_BrowseResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESPONSE], bufPos, bufEnd, NULL, NULL); +UA_MonitoredItemNotification_encodeBinary(const UA_MonitoredItemNotification *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_BrowseResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSERESPONSE], 0, NULL); +UA_MonitoredItemNotification_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemNotification *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION], NULL); } -/* CreateSessionResponse */ +/* EventFieldList */ +static UA_INLINE size_t +UA_EventFieldList_calcSizeBinary(const UA_EventFieldList *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_EVENTFIELDLIST]); +} static UA_INLINE UA_StatusCode -UA_CreateSessionResponse_encodeBinary(const UA_CreateSessionResponse *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE], bufPos, bufEnd, NULL, NULL); +UA_EventFieldList_encodeBinary(const UA_EventFieldList *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EVENTFIELDLIST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_CreateSessionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateSessionResponse *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE], 0, NULL); +UA_EventFieldList_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EventFieldList *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EVENTFIELDLIST], NULL); +} + +/* StatusChangeNotification */ +static UA_INLINE size_t +UA_StatusChangeNotification_calcSizeBinary(const UA_StatusChangeNotification *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]); +} +static UA_INLINE UA_StatusCode +UA_StatusChangeNotification_encodeBinary(const UA_StatusChangeNotification *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_StatusChangeNotification_decodeBinary(const UA_ByteString *src, size_t *offset, UA_StatusChangeNotification *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION], NULL); +} + +/* SubscriptionAcknowledgement */ +static UA_INLINE size_t +UA_SubscriptionAcknowledgement_calcSizeBinary(const UA_SubscriptionAcknowledgement *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT]); +} +static UA_INLINE UA_StatusCode +UA_SubscriptionAcknowledgement_encodeBinary(const UA_SubscriptionAcknowledgement *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_SubscriptionAcknowledgement_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SubscriptionAcknowledgement *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT], NULL); +} + +/* PublishRequest */ +static UA_INLINE size_t +UA_PublishRequest_calcSizeBinary(const UA_PublishRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_PUBLISHREQUEST]); +} +static UA_INLINE UA_StatusCode +UA_PublishRequest_encodeBinary(const UA_PublishRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_PUBLISHREQUEST], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_PublishRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_PublishRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_PUBLISHREQUEST], NULL); +} + +/* PublishResponse */ +static UA_INLINE size_t +UA_PublishResponse_calcSizeBinary(const UA_PublishResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); +} +static UA_INLINE UA_StatusCode +UA_PublishResponse_encodeBinary(const UA_PublishResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_PublishResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_PublishResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE], NULL); } -/* QueryFirstRequest */ +/* RepublishRequest */ +static UA_INLINE size_t +UA_RepublishRequest_calcSizeBinary(const UA_RepublishRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST]); +} static UA_INLINE UA_StatusCode -UA_QueryFirstRequest_encodeBinary(const UA_QueryFirstRequest *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_QUERYFIRSTREQUEST], bufPos, bufEnd, NULL, NULL); +UA_RepublishRequest_encodeBinary(const UA_RepublishRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_QueryFirstRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_QueryFirstRequest *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_QUERYFIRSTREQUEST], 0, NULL); +UA_RepublishRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RepublishRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST], NULL); } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/build/src_generated/ua_transport_generated.h" ***********************************/ +/* RepublishResponse */ +static UA_INLINE size_t +UA_RepublishResponse_calcSizeBinary(const UA_RepublishResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]); +} +static UA_INLINE UA_StatusCode +UA_RepublishResponse_encodeBinary(const UA_RepublishResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_RepublishResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RepublishResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE], NULL); +} -/* Generated from Opc.Ua.Types.bsd, Custom.Opc.Ua.Transport.bsd with script /home/travis/build/open62541/open62541/tools/generate_datatypes.py - * on host travis-job-193db498-e14a-4886-911f-7172c9e50b7a by user travis at 2018-12-19 02:29:43 */ +/* DeleteSubscriptionsRequest */ +static UA_INLINE size_t +UA_DeleteSubscriptionsRequest_calcSizeBinary(const UA_DeleteSubscriptionsRequest *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST]); +} +static UA_INLINE UA_StatusCode +UA_DeleteSubscriptionsRequest_encodeBinary(const UA_DeleteSubscriptionsRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_DeleteSubscriptionsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteSubscriptionsRequest *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST], NULL); +} +/* DeleteSubscriptionsResponse */ +static UA_INLINE size_t +UA_DeleteSubscriptionsResponse_calcSizeBinary(const UA_DeleteSubscriptionsResponse *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]); +} +static UA_INLINE UA_StatusCode +UA_DeleteSubscriptionsResponse_encodeBinary(const UA_DeleteSubscriptionsResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_DeleteSubscriptionsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteSubscriptionsResponse *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE], NULL); +} -#ifdef __cplusplus -extern "C" { -#endif +/* BuildInfo */ +static UA_INLINE size_t +UA_BuildInfo_calcSizeBinary(const UA_BuildInfo *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BUILDINFO]); +} +static UA_INLINE UA_StatusCode +UA_BuildInfo_encodeBinary(const UA_BuildInfo *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BUILDINFO], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_BuildInfo_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BuildInfo *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BUILDINFO], NULL); +} + +/* RedundancySupport */ +static UA_INLINE size_t +UA_RedundancySupport_calcSizeBinary(const UA_RedundancySupport *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT]); +} +static UA_INLINE UA_StatusCode +UA_RedundancySupport_encodeBinary(const UA_RedundancySupport *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_RedundancySupport_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RedundancySupport *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT], NULL); +} + +/* ServerState */ +static UA_INLINE size_t +UA_ServerState_calcSizeBinary(const UA_ServerState *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SERVERSTATE]); +} +static UA_INLINE UA_StatusCode +UA_ServerState_encodeBinary(const UA_ServerState *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVERSTATE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_ServerState_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServerState *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVERSTATE], NULL); +} + +/* ServerDiagnosticsSummaryDataType */ +static UA_INLINE size_t +UA_ServerDiagnosticsSummaryDataType_calcSizeBinary(const UA_ServerDiagnosticsSummaryDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE]); +} +static UA_INLINE UA_StatusCode +UA_ServerDiagnosticsSummaryDataType_encodeBinary(const UA_ServerDiagnosticsSummaryDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_ServerDiagnosticsSummaryDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServerDiagnosticsSummaryDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE], NULL); +} + +/* ServerStatusDataType */ +static UA_INLINE size_t +UA_ServerStatusDataType_calcSizeBinary(const UA_ServerStatusDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]); +} +static UA_INLINE UA_StatusCode +UA_ServerStatusDataType_encodeBinary(const UA_ServerStatusDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_ServerStatusDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServerStatusDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE], NULL); +} + +/* Range */ +static UA_INLINE size_t +UA_Range_calcSizeBinary(const UA_Range *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_RANGE]); +} +static UA_INLINE UA_StatusCode +UA_Range_encodeBinary(const UA_Range *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_RANGE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_Range_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Range *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_RANGE], NULL); +} + +/* StructureDescription */ +static UA_INLINE size_t +UA_StructureDescription_calcSizeBinary(const UA_StructureDescription *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_STRUCTUREDESCRIPTION]); +} +static UA_INLINE UA_StatusCode +UA_StructureDescription_encodeBinary(const UA_StructureDescription *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STRUCTUREDESCRIPTION], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_StructureDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_StructureDescription *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STRUCTUREDESCRIPTION], NULL); +} + +/* FieldMetaData */ +static UA_INLINE size_t +UA_FieldMetaData_calcSizeBinary(const UA_FieldMetaData *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FIELDMETADATA]); +} +static UA_INLINE UA_StatusCode +UA_FieldMetaData_encodeBinary(const UA_FieldMetaData *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FIELDMETADATA], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_FieldMetaData_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FieldMetaData *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FIELDMETADATA], NULL); +} + +/* WriterGroupDataType */ +static UA_INLINE size_t +UA_WriterGroupDataType_calcSizeBinary(const UA_WriterGroupDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_WRITERGROUPDATATYPE]); +} +static UA_INLINE UA_StatusCode +UA_WriterGroupDataType_encodeBinary(const UA_WriterGroupDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_WRITERGROUPDATATYPE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_WriterGroupDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_WriterGroupDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_WRITERGROUPDATATYPE], NULL); +} + +/* FieldTargetDataType */ +static UA_INLINE size_t +UA_FieldTargetDataType_calcSizeBinary(const UA_FieldTargetDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FIELDTARGETDATATYPE]); +} +static UA_INLINE UA_StatusCode +UA_FieldTargetDataType_encodeBinary(const UA_FieldTargetDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FIELDTARGETDATATYPE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_FieldTargetDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FieldTargetDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FIELDTARGETDATATYPE], NULL); +} + +/* EnumDefinition */ +static UA_INLINE size_t +UA_EnumDefinition_calcSizeBinary(const UA_EnumDefinition *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ENUMDEFINITION]); +} +static UA_INLINE UA_StatusCode +UA_EnumDefinition_encodeBinary(const UA_EnumDefinition *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ENUMDEFINITION], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_EnumDefinition_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EnumDefinition *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ENUMDEFINITION], NULL); +} + +/* DataChangeNotification */ +static UA_INLINE size_t +UA_DataChangeNotification_calcSizeBinary(const UA_DataChangeNotification *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]); +} +static UA_INLINE UA_StatusCode +UA_DataChangeNotification_encodeBinary(const UA_DataChangeNotification *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_DataChangeNotification_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataChangeNotification *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION], NULL); +} + +/* EventNotificationList */ +static UA_INLINE size_t +UA_EventNotificationList_calcSizeBinary(const UA_EventNotificationList *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]); +} +static UA_INLINE UA_StatusCode +UA_EventNotificationList_encodeBinary(const UA_EventNotificationList *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_EventNotificationList_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EventNotificationList *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST], NULL); +} + +/* EnumDescription */ +static UA_INLINE size_t +UA_EnumDescription_calcSizeBinary(const UA_EnumDescription *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ENUMDESCRIPTION]); +} +static UA_INLINE UA_StatusCode +UA_EnumDescription_encodeBinary(const UA_EnumDescription *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ENUMDESCRIPTION], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_EnumDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EnumDescription *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ENUMDESCRIPTION], NULL); +} + +/* DataSetMetaDataType */ +static UA_INLINE size_t +UA_DataSetMetaDataType_calcSizeBinary(const UA_DataSetMetaDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATASETMETADATATYPE]); +} +static UA_INLINE UA_StatusCode +UA_DataSetMetaDataType_encodeBinary(const UA_DataSetMetaDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATASETMETADATATYPE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_DataSetMetaDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataSetMetaDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATASETMETADATATYPE], NULL); +} + +/* DataSetReaderDataType */ +static UA_INLINE size_t +UA_DataSetReaderDataType_calcSizeBinary(const UA_DataSetReaderDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATASETREADERDATATYPE]); +} +static UA_INLINE UA_StatusCode +UA_DataSetReaderDataType_encodeBinary(const UA_DataSetReaderDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATASETREADERDATATYPE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_DataSetReaderDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataSetReaderDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATASETREADERDATATYPE], NULL); +} + +/* TargetVariablesDataType */ +static UA_INLINE size_t +UA_TargetVariablesDataType_calcSizeBinary(const UA_TargetVariablesDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_TARGETVARIABLESDATATYPE]); +} +static UA_INLINE UA_StatusCode +UA_TargetVariablesDataType_encodeBinary(const UA_TargetVariablesDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_TARGETVARIABLESDATATYPE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_TargetVariablesDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TargetVariablesDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_TARGETVARIABLESDATATYPE], NULL); +} + +/* ReaderGroupDataType */ +static UA_INLINE size_t +UA_ReaderGroupDataType_calcSizeBinary(const UA_ReaderGroupDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_READERGROUPDATATYPE]); +} +static UA_INLINE UA_StatusCode +UA_ReaderGroupDataType_encodeBinary(const UA_ReaderGroupDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_READERGROUPDATATYPE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_ReaderGroupDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReaderGroupDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_READERGROUPDATATYPE], NULL); +} + +/* PubSubConnectionDataType */ +static UA_INLINE size_t +UA_PubSubConnectionDataType_calcSizeBinary(const UA_PubSubConnectionDataType *src) { + return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_PUBSUBCONNECTIONDATATYPE]); +} +static UA_INLINE UA_StatusCode +UA_PubSubConnectionDataType_encodeBinary(const UA_PubSubConnectionDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_PUBSUBCONNECTIONDATATYPE], bufPos, &bufEnd, NULL, NULL); +} +static UA_INLINE UA_StatusCode +UA_PubSubConnectionDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_PubSubConnectionDataType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_PUBSUBCONNECTIONDATATYPE], NULL); +} + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/transport_generated.h" ***********************************/ -#ifdef UA_NO_AMALGAMATION +/* Generated from Opc.Ua.Types.bsd, Custom.Opc.Ua.Transport.bsd with script /Users/jelena/Desktop/open62541/tools/generate_datatypes.py + * on host Jelena-2.local by user jelena at 2025-09-11 03:30:42 */ + +#ifdef UA_ENABLE_AMALGAMATION #else + #endif +_UA_BEGIN_DECLS + /** * Every type is assigned an index in an array containing the type descriptions. @@ -3026,27 +4075,46 @@ extern "C" { extern UA_EXPORT const UA_DataType UA_TRANSPORT[UA_TRANSPORT_COUNT]; /** - * SecureConversationMessageAbortBody - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - * Secure Conversation Message Abort Body */ -typedef struct { - UA_UInt32 error; - UA_String reason; -} UA_SecureConversationMessageAbortBody; + * MessageType + * ^^^^^^^^^^^ + * Message Type and whether the message contains an intermediate chunk */ +typedef enum { + UA_MESSAGETYPE_ACK = 0x4B4341, + UA_MESSAGETYPE_HEL = 0x4C4548, + UA_MESSAGETYPE_MSG = 0x47534D, + UA_MESSAGETYPE_OPN = 0x4E504F, + UA_MESSAGETYPE_CLO = 0x4F4C43, + UA_MESSAGETYPE_ERR = 0x525245, + __UA_MESSAGETYPE_FORCE32BIT = 0x7fffffff +} UA_MessageType; +UA_STATIC_ASSERT(sizeof(UA_MessageType) == sizeof(UA_Int32), enum_must_be_32bit); -#define UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY 0 +#define UA_TRANSPORT_MESSAGETYPE 0 /** - * SecureConversationMessageFooter - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - * Secure Conversation Message Footer */ + * ChunkType + * ^^^^^^^^^ + * Type of the chunk */ +typedef enum { + UA_CHUNKTYPE_FINAL = 0x46000000, + UA_CHUNKTYPE_INTERMEDIATE = 0x43000000, + UA_CHUNKTYPE_ABORT = 0x41000000, + __UA_CHUNKTYPE_FORCE32BIT = 0x7fffffff +} UA_ChunkType; +UA_STATIC_ASSERT(sizeof(UA_ChunkType) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TRANSPORT_CHUNKTYPE 1 + +/** + * TcpMessageHeader + * ^^^^^^^^^^^^^^^^ + * TCP Header */ typedef struct { - size_t paddingSize; - UA_Byte *padding; - UA_Byte signature; -} UA_SecureConversationMessageFooter; + UA_UInt32 messageTypeAndChunkType; + UA_UInt32 messageSize; +} UA_TcpMessageHeader; -#define UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER 1 +#define UA_TRANSPORT_TCPMESSAGEHEADER 2 /** * TcpHelloMessage @@ -3061,7 +4129,21 @@ typedef struct { UA_String endpointUrl; } UA_TcpHelloMessage; -#define UA_TRANSPORT_TCPHELLOMESSAGE 2 +#define UA_TRANSPORT_TCPHELLOMESSAGE 3 + +/** + * TcpAcknowledgeMessage + * ^^^^^^^^^^^^^^^^^^^^^ + * Acknowledge Message */ +typedef struct { + UA_UInt32 protocolVersion; + UA_UInt32 receiveBufferSize; + UA_UInt32 sendBufferSize; + UA_UInt32 maxMessageSize; + UA_UInt32 maxChunkCount; +} UA_TcpAcknowledgeMessage; + +#define UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE 4 /** * TcpErrorMessage @@ -3072,24 +4154,18 @@ typedef struct { UA_String reason; } UA_TcpErrorMessage; -#define UA_TRANSPORT_TCPERRORMESSAGE 3 +#define UA_TRANSPORT_TCPERRORMESSAGE 5 /** - * MessageType - * ^^^^^^^^^^^ - * Message Type and whether the message contains an intermediate chunk */ -typedef enum { - UA_MESSAGETYPE_ACK = 0x4B4341, - UA_MESSAGETYPE_HEL = 0x4C4548, - UA_MESSAGETYPE_MSG = 0x47534D, - UA_MESSAGETYPE_OPN = 0x4E504F, - UA_MESSAGETYPE_CLO = 0x4F4C43, - UA_MESSAGETYPE_ERR = 0x525245, - __UA_MESSAGETYPE_FORCE32BIT = 0x7fffffff -} UA_MessageType; -UA_STATIC_ASSERT(sizeof(UA_MessageType) == sizeof(UA_Int32), enum_must_be_32bit); + * SecureConversationMessageHeader + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * Secure Layer Sequence Header */ +typedef struct { + UA_TcpMessageHeader messageHeader; + UA_UInt32 secureChannelId; +} UA_SecureConversationMessageHeader; -#define UA_TRANSPORT_MESSAGETYPE 4 +#define UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER 6 /** * AsymmetricAlgorithmSecurityHeader @@ -3101,21 +4177,17 @@ typedef struct { UA_ByteString receiverCertificateThumbprint; } UA_AsymmetricAlgorithmSecurityHeader; -#define UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER 5 +#define UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER 7 /** - * TcpAcknowledgeMessage - * ^^^^^^^^^^^^^^^^^^^^^ - * Acknowledge Message */ + * SymmetricAlgorithmSecurityHeader + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * Secure Layer Symmetric Algorithm Header */ typedef struct { - UA_UInt32 protocolVersion; - UA_UInt32 receiveBufferSize; - UA_UInt32 sendBufferSize; - UA_UInt32 maxMessageSize; - UA_UInt32 maxChunkCount; -} UA_TcpAcknowledgeMessage; + UA_UInt32 tokenId; +} UA_SymmetricAlgorithmSecurityHeader; -#define UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE 6 +#define UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER 8 /** * SequenceHeader @@ -3126,69 +4198,43 @@ typedef struct { UA_UInt32 requestId; } UA_SequenceHeader; -#define UA_TRANSPORT_SEQUENCEHEADER 7 +#define UA_TRANSPORT_SEQUENCEHEADER 9 /** - * TcpMessageHeader - * ^^^^^^^^^^^^^^^^ - * TCP Header */ + * SecureConversationMessageFooter + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * Secure Conversation Message Footer */ typedef struct { - UA_UInt32 messageTypeAndChunkType; - UA_UInt32 messageSize; -} UA_TcpMessageHeader; - -#define UA_TRANSPORT_TCPMESSAGEHEADER 8 - -/** - * ChunkType - * ^^^^^^^^^ - * Type of the chunk */ -typedef enum { - UA_CHUNKTYPE_FINAL = 0x46000000, - UA_CHUNKTYPE_INTERMEDIATE = 0x43000000, - UA_CHUNKTYPE_ABORT = 0x41000000, - __UA_CHUNKTYPE_FORCE32BIT = 0x7fffffff -} UA_ChunkType; -UA_STATIC_ASSERT(sizeof(UA_ChunkType) == sizeof(UA_Int32), enum_must_be_32bit); + size_t paddingSize; + UA_Byte *padding; + UA_Byte signature; +} UA_SecureConversationMessageFooter; -#define UA_TRANSPORT_CHUNKTYPE 9 +#define UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER 10 /** - * SymmetricAlgorithmSecurityHeader - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - * Secure Layer Symmetric Algorithm Header */ + * SecureConversationMessageAbortBody + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * Secure Conversation Message Abort Body */ typedef struct { - UA_UInt32 tokenId; -} UA_SymmetricAlgorithmSecurityHeader; - -#define UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER 10 + UA_UInt32 error; + UA_String reason; +} UA_SecureConversationMessageAbortBody; -/** - * SecureConversationMessageHeader - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - * Secure Layer Sequence Header */ -typedef struct { - UA_TcpMessageHeader messageHeader; - UA_UInt32 secureChannelId; -} UA_SecureConversationMessageHeader; +#define UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY 11 -#define UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER 11 -#ifdef __cplusplus -} // extern "C" -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/build/src_generated/ua_transport_generated_handling.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/transport_generated_handling.h" ***********************************/ -/* Generated from Opc.Ua.Types.bsd, Custom.Opc.Ua.Transport.bsd with script /home/travis/build/open62541/open62541/tools/generate_datatypes.py - * on host travis-job-193db498-e14a-4886-911f-7172c9e50b7a by user travis at 2018-12-19 02:29:43 */ +/* Generated from Opc.Ua.Types.bsd, Custom.Opc.Ua.Transport.bsd with script /Users/jelena/Desktop/open62541/tools/generate_datatypes.py + * on host Jelena-2.local by user jelena at 2025-09-11 03:30:42 */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS #if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6 # pragma GCC diagnostic push @@ -3197,56 +4243,100 @@ extern "C" { #endif -/* SecureConversationMessageAbortBody */ +/* MessageType */ static UA_INLINE void -UA_SecureConversationMessageAbortBody_init(UA_SecureConversationMessageAbortBody *p) { - memset(p, 0, sizeof(UA_SecureConversationMessageAbortBody)); +UA_MessageType_init(UA_MessageType *p) { + memset(p, 0, sizeof(UA_MessageType)); } -static UA_INLINE UA_SecureConversationMessageAbortBody * -UA_SecureConversationMessageAbortBody_new(void) { - return (UA_SecureConversationMessageAbortBody*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); +static UA_INLINE UA_MessageType * +UA_MessageType_new(void) { + return (UA_MessageType*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE]); } static UA_INLINE UA_StatusCode -UA_SecureConversationMessageAbortBody_copy(const UA_SecureConversationMessageAbortBody *src, UA_SecureConversationMessageAbortBody *dst) { - return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); +UA_MessageType_copy(const UA_MessageType *src, UA_MessageType *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_SecureConversationMessageAbortBody_deleteMembers(UA_SecureConversationMessageAbortBody *p) { - UA_deleteMembers(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); +UA_MessageType_deleteMembers(UA_MessageType *p) { + memset(p, 0, sizeof(UA_MessageType)); } static UA_INLINE void -UA_SecureConversationMessageAbortBody_delete(UA_SecureConversationMessageAbortBody *p) { - UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); +UA_MessageType_clear(UA_MessageType *p) { + memset(p, 0, sizeof(UA_MessageType)); } -/* SecureConversationMessageFooter */ static UA_INLINE void -UA_SecureConversationMessageFooter_init(UA_SecureConversationMessageFooter *p) { - memset(p, 0, sizeof(UA_SecureConversationMessageFooter)); +UA_MessageType_delete(UA_MessageType *p) { + UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE]); } -static UA_INLINE UA_SecureConversationMessageFooter * -UA_SecureConversationMessageFooter_new(void) { - return (UA_SecureConversationMessageFooter*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); +/* ChunkType */ +static UA_INLINE void +UA_ChunkType_init(UA_ChunkType *p) { + memset(p, 0, sizeof(UA_ChunkType)); +} + +static UA_INLINE UA_ChunkType * +UA_ChunkType_new(void) { + return (UA_ChunkType*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE]); } static UA_INLINE UA_StatusCode -UA_SecureConversationMessageFooter_copy(const UA_SecureConversationMessageFooter *src, UA_SecureConversationMessageFooter *dst) { - return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); +UA_ChunkType_copy(const UA_ChunkType *src, UA_ChunkType *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_SecureConversationMessageFooter_deleteMembers(UA_SecureConversationMessageFooter *p) { - UA_deleteMembers(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); +UA_ChunkType_deleteMembers(UA_ChunkType *p) { + memset(p, 0, sizeof(UA_ChunkType)); } static UA_INLINE void -UA_SecureConversationMessageFooter_delete(UA_SecureConversationMessageFooter *p) { - UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); +UA_ChunkType_clear(UA_ChunkType *p) { + memset(p, 0, sizeof(UA_ChunkType)); +} + +static UA_INLINE void +UA_ChunkType_delete(UA_ChunkType *p) { + UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE]); +} + +/* TcpMessageHeader */ +static UA_INLINE void +UA_TcpMessageHeader_init(UA_TcpMessageHeader *p) { + memset(p, 0, sizeof(UA_TcpMessageHeader)); +} + +static UA_INLINE UA_TcpMessageHeader * +UA_TcpMessageHeader_new(void) { + return (UA_TcpMessageHeader*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER]); +} + +static UA_INLINE UA_StatusCode +UA_TcpMessageHeader_copy(const UA_TcpMessageHeader *src, UA_TcpMessageHeader *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} + +static UA_INLINE void +UA_TcpMessageHeader_deleteMembers(UA_TcpMessageHeader *p) { + memset(p, 0, sizeof(UA_TcpMessageHeader)); +} + +static UA_INLINE void +UA_TcpMessageHeader_clear(UA_TcpMessageHeader *p) { + memset(p, 0, sizeof(UA_TcpMessageHeader)); +} + +static UA_INLINE void +UA_TcpMessageHeader_delete(UA_TcpMessageHeader *p) { + UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER]); } /* TcpHelloMessage */ @@ -3267,7 +4357,12 @@ UA_TcpHelloMessage_copy(const UA_TcpHelloMessage *src, UA_TcpHelloMessage *dst) static UA_INLINE void UA_TcpHelloMessage_deleteMembers(UA_TcpHelloMessage *p) { - UA_deleteMembers(p, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE]); + UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE]); +} + +static UA_INLINE void +UA_TcpHelloMessage_clear(UA_TcpHelloMessage *p) { + UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE]); } static UA_INLINE void @@ -3275,16 +4370,48 @@ UA_TcpHelloMessage_delete(UA_TcpHelloMessage *p) { UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE]); } -/* TcpErrorMessage */ +/* TcpAcknowledgeMessage */ static UA_INLINE void -UA_TcpErrorMessage_init(UA_TcpErrorMessage *p) { - memset(p, 0, sizeof(UA_TcpErrorMessage)); +UA_TcpAcknowledgeMessage_init(UA_TcpAcknowledgeMessage *p) { + memset(p, 0, sizeof(UA_TcpAcknowledgeMessage)); } -static UA_INLINE UA_TcpErrorMessage * -UA_TcpErrorMessage_new(void) { - return (UA_TcpErrorMessage*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE]); -} +static UA_INLINE UA_TcpAcknowledgeMessage * +UA_TcpAcknowledgeMessage_new(void) { + return (UA_TcpAcknowledgeMessage*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE]); +} + +static UA_INLINE UA_StatusCode +UA_TcpAcknowledgeMessage_copy(const UA_TcpAcknowledgeMessage *src, UA_TcpAcknowledgeMessage *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} + +static UA_INLINE void +UA_TcpAcknowledgeMessage_deleteMembers(UA_TcpAcknowledgeMessage *p) { + memset(p, 0, sizeof(UA_TcpAcknowledgeMessage)); +} + +static UA_INLINE void +UA_TcpAcknowledgeMessage_clear(UA_TcpAcknowledgeMessage *p) { + memset(p, 0, sizeof(UA_TcpAcknowledgeMessage)); +} + +static UA_INLINE void +UA_TcpAcknowledgeMessage_delete(UA_TcpAcknowledgeMessage *p) { + UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE]); +} + +/* TcpErrorMessage */ +static UA_INLINE void +UA_TcpErrorMessage_init(UA_TcpErrorMessage *p) { + memset(p, 0, sizeof(UA_TcpErrorMessage)); +} + +static UA_INLINE UA_TcpErrorMessage * +UA_TcpErrorMessage_new(void) { + return (UA_TcpErrorMessage*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE]); +} static UA_INLINE UA_StatusCode UA_TcpErrorMessage_copy(const UA_TcpErrorMessage *src, UA_TcpErrorMessage *dst) { @@ -3293,7 +4420,12 @@ UA_TcpErrorMessage_copy(const UA_TcpErrorMessage *src, UA_TcpErrorMessage *dst) static UA_INLINE void UA_TcpErrorMessage_deleteMembers(UA_TcpErrorMessage *p) { - UA_deleteMembers(p, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE]); + UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE]); +} + +static UA_INLINE void +UA_TcpErrorMessage_clear(UA_TcpErrorMessage *p) { + UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE]); } static UA_INLINE void @@ -3301,29 +4433,36 @@ UA_TcpErrorMessage_delete(UA_TcpErrorMessage *p) { UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE]); } -/* MessageType */ +/* SecureConversationMessageHeader */ static UA_INLINE void -UA_MessageType_init(UA_MessageType *p) { - memset(p, 0, sizeof(UA_MessageType)); +UA_SecureConversationMessageHeader_init(UA_SecureConversationMessageHeader *p) { + memset(p, 0, sizeof(UA_SecureConversationMessageHeader)); } -static UA_INLINE UA_MessageType * -UA_MessageType_new(void) { - return (UA_MessageType*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE]); +static UA_INLINE UA_SecureConversationMessageHeader * +UA_SecureConversationMessageHeader_new(void) { + return (UA_SecureConversationMessageHeader*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER]); } static UA_INLINE UA_StatusCode -UA_MessageType_copy(const UA_MessageType *src, UA_MessageType *dst) { +UA_SecureConversationMessageHeader_copy(const UA_SecureConversationMessageHeader *src, UA_SecureConversationMessageHeader *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_MessageType_deleteMembers(UA_MessageType *p) { } +UA_SecureConversationMessageHeader_deleteMembers(UA_SecureConversationMessageHeader *p) { + memset(p, 0, sizeof(UA_SecureConversationMessageHeader)); +} static UA_INLINE void -UA_MessageType_delete(UA_MessageType *p) { - UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE]); +UA_SecureConversationMessageHeader_clear(UA_SecureConversationMessageHeader *p) { + memset(p, 0, sizeof(UA_SecureConversationMessageHeader)); +} + +static UA_INLINE void +UA_SecureConversationMessageHeader_delete(UA_SecureConversationMessageHeader *p) { + UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER]); } /* AsymmetricAlgorithmSecurityHeader */ @@ -3344,7 +4483,12 @@ UA_AsymmetricAlgorithmSecurityHeader_copy(const UA_AsymmetricAlgorithmSecurityHe static UA_INLINE void UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(UA_AsymmetricAlgorithmSecurityHeader *p) { - UA_deleteMembers(p, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER]); + UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER]); +} + +static UA_INLINE void +UA_AsymmetricAlgorithmSecurityHeader_clear(UA_AsymmetricAlgorithmSecurityHeader *p) { + UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER]); } static UA_INLINE void @@ -3352,29 +4496,36 @@ UA_AsymmetricAlgorithmSecurityHeader_delete(UA_AsymmetricAlgorithmSecurityHeader UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER]); } -/* TcpAcknowledgeMessage */ +/* SymmetricAlgorithmSecurityHeader */ static UA_INLINE void -UA_TcpAcknowledgeMessage_init(UA_TcpAcknowledgeMessage *p) { - memset(p, 0, sizeof(UA_TcpAcknowledgeMessage)); +UA_SymmetricAlgorithmSecurityHeader_init(UA_SymmetricAlgorithmSecurityHeader *p) { + memset(p, 0, sizeof(UA_SymmetricAlgorithmSecurityHeader)); } -static UA_INLINE UA_TcpAcknowledgeMessage * -UA_TcpAcknowledgeMessage_new(void) { - return (UA_TcpAcknowledgeMessage*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE]); +static UA_INLINE UA_SymmetricAlgorithmSecurityHeader * +UA_SymmetricAlgorithmSecurityHeader_new(void) { + return (UA_SymmetricAlgorithmSecurityHeader*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER]); } static UA_INLINE UA_StatusCode -UA_TcpAcknowledgeMessage_copy(const UA_TcpAcknowledgeMessage *src, UA_TcpAcknowledgeMessage *dst) { +UA_SymmetricAlgorithmSecurityHeader_copy(const UA_SymmetricAlgorithmSecurityHeader *src, UA_SymmetricAlgorithmSecurityHeader *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_TcpAcknowledgeMessage_deleteMembers(UA_TcpAcknowledgeMessage *p) { } +UA_SymmetricAlgorithmSecurityHeader_deleteMembers(UA_SymmetricAlgorithmSecurityHeader *p) { + memset(p, 0, sizeof(UA_SymmetricAlgorithmSecurityHeader)); +} + +static UA_INLINE void +UA_SymmetricAlgorithmSecurityHeader_clear(UA_SymmetricAlgorithmSecurityHeader *p) { + memset(p, 0, sizeof(UA_SymmetricAlgorithmSecurityHeader)); +} static UA_INLINE void -UA_TcpAcknowledgeMessage_delete(UA_TcpAcknowledgeMessage *p) { - UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE]); +UA_SymmetricAlgorithmSecurityHeader_delete(UA_SymmetricAlgorithmSecurityHeader *p) { + UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER]); } /* SequenceHeader */ @@ -3395,287 +4546,311 @@ UA_SequenceHeader_copy(const UA_SequenceHeader *src, UA_SequenceHeader *dst) { } static UA_INLINE void -UA_SequenceHeader_deleteMembers(UA_SequenceHeader *p) { } +UA_SequenceHeader_deleteMembers(UA_SequenceHeader *p) { + memset(p, 0, sizeof(UA_SequenceHeader)); +} + +static UA_INLINE void +UA_SequenceHeader_clear(UA_SequenceHeader *p) { + memset(p, 0, sizeof(UA_SequenceHeader)); +} static UA_INLINE void UA_SequenceHeader_delete(UA_SequenceHeader *p) { UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER]); } -/* TcpMessageHeader */ +/* SecureConversationMessageFooter */ static UA_INLINE void -UA_TcpMessageHeader_init(UA_TcpMessageHeader *p) { - memset(p, 0, sizeof(UA_TcpMessageHeader)); +UA_SecureConversationMessageFooter_init(UA_SecureConversationMessageFooter *p) { + memset(p, 0, sizeof(UA_SecureConversationMessageFooter)); } -static UA_INLINE UA_TcpMessageHeader * -UA_TcpMessageHeader_new(void) { - return (UA_TcpMessageHeader*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER]); +static UA_INLINE UA_SecureConversationMessageFooter * +UA_SecureConversationMessageFooter_new(void) { + return (UA_SecureConversationMessageFooter*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); } static UA_INLINE UA_StatusCode -UA_TcpMessageHeader_copy(const UA_TcpMessageHeader *src, UA_TcpMessageHeader *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_SecureConversationMessageFooter_copy(const UA_SecureConversationMessageFooter *src, UA_SecureConversationMessageFooter *dst) { + return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); } static UA_INLINE void -UA_TcpMessageHeader_deleteMembers(UA_TcpMessageHeader *p) { } - -static UA_INLINE void -UA_TcpMessageHeader_delete(UA_TcpMessageHeader *p) { - UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER]); +UA_SecureConversationMessageFooter_deleteMembers(UA_SecureConversationMessageFooter *p) { + UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); } -/* ChunkType */ static UA_INLINE void -UA_ChunkType_init(UA_ChunkType *p) { - memset(p, 0, sizeof(UA_ChunkType)); -} - -static UA_INLINE UA_ChunkType * -UA_ChunkType_new(void) { - return (UA_ChunkType*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE]); -} - -static UA_INLINE UA_StatusCode -UA_ChunkType_copy(const UA_ChunkType *src, UA_ChunkType *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_SecureConversationMessageFooter_clear(UA_SecureConversationMessageFooter *p) { + UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); } static UA_INLINE void -UA_ChunkType_deleteMembers(UA_ChunkType *p) { } - -static UA_INLINE void -UA_ChunkType_delete(UA_ChunkType *p) { - UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE]); +UA_SecureConversationMessageFooter_delete(UA_SecureConversationMessageFooter *p) { + UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); } -/* SymmetricAlgorithmSecurityHeader */ +/* SecureConversationMessageAbortBody */ static UA_INLINE void -UA_SymmetricAlgorithmSecurityHeader_init(UA_SymmetricAlgorithmSecurityHeader *p) { - memset(p, 0, sizeof(UA_SymmetricAlgorithmSecurityHeader)); +UA_SecureConversationMessageAbortBody_init(UA_SecureConversationMessageAbortBody *p) { + memset(p, 0, sizeof(UA_SecureConversationMessageAbortBody)); } -static UA_INLINE UA_SymmetricAlgorithmSecurityHeader * -UA_SymmetricAlgorithmSecurityHeader_new(void) { - return (UA_SymmetricAlgorithmSecurityHeader*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER]); +static UA_INLINE UA_SecureConversationMessageAbortBody * +UA_SecureConversationMessageAbortBody_new(void) { + return (UA_SecureConversationMessageAbortBody*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); } static UA_INLINE UA_StatusCode -UA_SymmetricAlgorithmSecurityHeader_copy(const UA_SymmetricAlgorithmSecurityHeader *src, UA_SymmetricAlgorithmSecurityHeader *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_SecureConversationMessageAbortBody_copy(const UA_SecureConversationMessageAbortBody *src, UA_SecureConversationMessageAbortBody *dst) { + return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); } static UA_INLINE void -UA_SymmetricAlgorithmSecurityHeader_deleteMembers(UA_SymmetricAlgorithmSecurityHeader *p) { } - -static UA_INLINE void -UA_SymmetricAlgorithmSecurityHeader_delete(UA_SymmetricAlgorithmSecurityHeader *p) { - UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER]); +UA_SecureConversationMessageAbortBody_deleteMembers(UA_SecureConversationMessageAbortBody *p) { + UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); } -/* SecureConversationMessageHeader */ static UA_INLINE void -UA_SecureConversationMessageHeader_init(UA_SecureConversationMessageHeader *p) { - memset(p, 0, sizeof(UA_SecureConversationMessageHeader)); -} - -static UA_INLINE UA_SecureConversationMessageHeader * -UA_SecureConversationMessageHeader_new(void) { - return (UA_SecureConversationMessageHeader*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER]); -} - -static UA_INLINE UA_StatusCode -UA_SecureConversationMessageHeader_copy(const UA_SecureConversationMessageHeader *src, UA_SecureConversationMessageHeader *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_SecureConversationMessageAbortBody_clear(UA_SecureConversationMessageAbortBody *p) { + UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); } static UA_INLINE void -UA_SecureConversationMessageHeader_deleteMembers(UA_SecureConversationMessageHeader *p) { } - -static UA_INLINE void -UA_SecureConversationMessageHeader_delete(UA_SecureConversationMessageHeader *p) { - UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER]); +UA_SecureConversationMessageAbortBody_delete(UA_SecureConversationMessageAbortBody *p) { + UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); } #if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6 # pragma GCC diagnostic pop #endif -#ifdef __cplusplus -} // extern "C" -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/build/src_generated/ua_transport_generated_encoding_binary.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/transport_generated_encoding_binary.h" ***********************************/ -/* Generated from Opc.Ua.Types.bsd, Custom.Opc.Ua.Transport.bsd with script /home/travis/build/open62541/open62541/tools/generate_datatypes.py - * on host travis-job-193db498-e14a-4886-911f-7172c9e50b7a by user travis at 2018-12-19 02:29:43 */ +/* Generated from Opc.Ua.Types.bsd, Custom.Opc.Ua.Transport.bsd with script /Users/jelena/Desktop/open62541/tools/generate_datatypes.py + * on host Jelena-2.local by user jelena at 2025-09-11 03:30:42 */ +#ifdef UA_ENABLE_AMALGAMATION +#else +#endif -/* SecureConversationMessageAbortBody */ + + +/* MessageType */ +static UA_INLINE size_t +UA_MessageType_calcSizeBinary(const UA_MessageType *src) { + return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE]); +} static UA_INLINE UA_StatusCode -UA_SecureConversationMessageAbortBody_encodeBinary(const UA_SecureConversationMessageAbortBody *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY], bufPos, bufEnd, NULL, NULL); +UA_MessageType_encodeBinary(const UA_MessageType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SecureConversationMessageAbortBody_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SecureConversationMessageAbortBody *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY], 0, NULL); +UA_MessageType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MessageType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE], NULL); } -/* SecureConversationMessageFooter */ +/* ChunkType */ +static UA_INLINE size_t +UA_ChunkType_calcSizeBinary(const UA_ChunkType *src) { + return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE]); +} static UA_INLINE UA_StatusCode -UA_SecureConversationMessageFooter_encodeBinary(const UA_SecureConversationMessageFooter *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER], bufPos, bufEnd, NULL, NULL); +UA_ChunkType_encodeBinary(const UA_ChunkType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SecureConversationMessageFooter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SecureConversationMessageFooter *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER], 0, NULL); +UA_ChunkType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ChunkType *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE], NULL); } -/* TcpHelloMessage */ +/* TcpMessageHeader */ +static UA_INLINE size_t +UA_TcpMessageHeader_calcSizeBinary(const UA_TcpMessageHeader *src) { + return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER]); +} static UA_INLINE UA_StatusCode -UA_TcpHelloMessage_encodeBinary(const UA_TcpHelloMessage *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE], bufPos, bufEnd, NULL, NULL); +UA_TcpMessageHeader_encodeBinary(const UA_TcpMessageHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_TcpHelloMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TcpHelloMessage *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE], 0, NULL); +UA_TcpMessageHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TcpMessageHeader *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER], NULL); } -/* TcpErrorMessage */ +/* TcpHelloMessage */ +static UA_INLINE size_t +UA_TcpHelloMessage_calcSizeBinary(const UA_TcpHelloMessage *src) { + return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE]); +} static UA_INLINE UA_StatusCode -UA_TcpErrorMessage_encodeBinary(const UA_TcpErrorMessage *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE], bufPos, bufEnd, NULL, NULL); +UA_TcpHelloMessage_encodeBinary(const UA_TcpHelloMessage *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_TcpErrorMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TcpErrorMessage *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE], 0, NULL); +UA_TcpHelloMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TcpHelloMessage *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE], NULL); } -/* MessageType */ +/* TcpAcknowledgeMessage */ +static UA_INLINE size_t +UA_TcpAcknowledgeMessage_calcSizeBinary(const UA_TcpAcknowledgeMessage *src) { + return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE]); +} static UA_INLINE UA_StatusCode -UA_MessageType_encodeBinary(const UA_MessageType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE], bufPos, bufEnd, NULL, NULL); +UA_TcpAcknowledgeMessage_encodeBinary(const UA_TcpAcknowledgeMessage *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_MessageType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MessageType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE], 0, NULL); +UA_TcpAcknowledgeMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TcpAcknowledgeMessage *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE], NULL); } -/* AsymmetricAlgorithmSecurityHeader */ +/* TcpErrorMessage */ +static UA_INLINE size_t +UA_TcpErrorMessage_calcSizeBinary(const UA_TcpErrorMessage *src) { + return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE]); +} static UA_INLINE UA_StatusCode -UA_AsymmetricAlgorithmSecurityHeader_encodeBinary(const UA_AsymmetricAlgorithmSecurityHeader *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER], bufPos, bufEnd, NULL, NULL); +UA_TcpErrorMessage_encodeBinary(const UA_TcpErrorMessage *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AsymmetricAlgorithmSecurityHeader *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER], 0, NULL); +UA_TcpErrorMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TcpErrorMessage *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE], NULL); } -/* TcpAcknowledgeMessage */ +/* SecureConversationMessageHeader */ +static UA_INLINE size_t +UA_SecureConversationMessageHeader_calcSizeBinary(const UA_SecureConversationMessageHeader *src) { + return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER]); +} static UA_INLINE UA_StatusCode -UA_TcpAcknowledgeMessage_encodeBinary(const UA_TcpAcknowledgeMessage *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE], bufPos, bufEnd, NULL, NULL); +UA_SecureConversationMessageHeader_encodeBinary(const UA_SecureConversationMessageHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_TcpAcknowledgeMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TcpAcknowledgeMessage *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE], 0, NULL); +UA_SecureConversationMessageHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SecureConversationMessageHeader *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER], NULL); } -/* SequenceHeader */ +/* AsymmetricAlgorithmSecurityHeader */ +static UA_INLINE size_t +UA_AsymmetricAlgorithmSecurityHeader_calcSizeBinary(const UA_AsymmetricAlgorithmSecurityHeader *src) { + return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER]); +} static UA_INLINE UA_StatusCode -UA_SequenceHeader_encodeBinary(const UA_SequenceHeader *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER], bufPos, bufEnd, NULL, NULL); +UA_AsymmetricAlgorithmSecurityHeader_encodeBinary(const UA_AsymmetricAlgorithmSecurityHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SequenceHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SequenceHeader *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER], 0, NULL); +UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AsymmetricAlgorithmSecurityHeader *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER], NULL); } -/* TcpMessageHeader */ +/* SymmetricAlgorithmSecurityHeader */ +static UA_INLINE size_t +UA_SymmetricAlgorithmSecurityHeader_calcSizeBinary(const UA_SymmetricAlgorithmSecurityHeader *src) { + return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER]); +} static UA_INLINE UA_StatusCode -UA_TcpMessageHeader_encodeBinary(const UA_TcpMessageHeader *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER], bufPos, bufEnd, NULL, NULL); +UA_SymmetricAlgorithmSecurityHeader_encodeBinary(const UA_SymmetricAlgorithmSecurityHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_TcpMessageHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TcpMessageHeader *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER], 0, NULL); +UA_SymmetricAlgorithmSecurityHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SymmetricAlgorithmSecurityHeader *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER], NULL); } -/* ChunkType */ +/* SequenceHeader */ +static UA_INLINE size_t +UA_SequenceHeader_calcSizeBinary(const UA_SequenceHeader *src) { + return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER]); +} static UA_INLINE UA_StatusCode -UA_ChunkType_encodeBinary(const UA_ChunkType *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE], bufPos, bufEnd, NULL, NULL); +UA_SequenceHeader_encodeBinary(const UA_SequenceHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_ChunkType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ChunkType *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE], 0, NULL); +UA_SequenceHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SequenceHeader *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER], NULL); } -/* SymmetricAlgorithmSecurityHeader */ +/* SecureConversationMessageFooter */ +static UA_INLINE size_t +UA_SecureConversationMessageFooter_calcSizeBinary(const UA_SecureConversationMessageFooter *src) { + return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); +} static UA_INLINE UA_StatusCode -UA_SymmetricAlgorithmSecurityHeader_encodeBinary(const UA_SymmetricAlgorithmSecurityHeader *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER], bufPos, bufEnd, NULL, NULL); +UA_SecureConversationMessageFooter_encodeBinary(const UA_SecureConversationMessageFooter *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SymmetricAlgorithmSecurityHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SymmetricAlgorithmSecurityHeader *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER], 0, NULL); +UA_SecureConversationMessageFooter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SecureConversationMessageFooter *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER], NULL); } -/* SecureConversationMessageHeader */ +/* SecureConversationMessageAbortBody */ +static UA_INLINE size_t +UA_SecureConversationMessageAbortBody_calcSizeBinary(const UA_SecureConversationMessageAbortBody *src) { + return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); +} static UA_INLINE UA_StatusCode -UA_SecureConversationMessageHeader_encodeBinary(const UA_SecureConversationMessageHeader *src, UA_Byte **bufPos, const UA_Byte **bufEnd) { - return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER], bufPos, bufEnd, NULL, NULL); +UA_SecureConversationMessageAbortBody_encodeBinary(const UA_SecureConversationMessageAbortBody *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { + return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY], bufPos, &bufEnd, NULL, NULL); } static UA_INLINE UA_StatusCode -UA_SecureConversationMessageHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SecureConversationMessageHeader *dst) { - return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER], 0, NULL); +UA_SecureConversationMessageAbortBody_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SecureConversationMessageAbortBody *dst) { + return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY], NULL); } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/ua_connection_internal.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/ua_connection_internal.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH * Copyright 2017 (c) Florian Palm * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS + +/* Process the remote configuration in the HEL/ACK handshake. The connection + * config is initialized with the local settings. */ +UA_StatusCode +UA_Connection_processHELACK(UA_Connection *connection, + const UA_ConnectionConfig *localConfig, + const UA_ConnectionConfig *remoteConfig); /* The application can be the client or the server */ typedef UA_StatusCode (*UA_Connection_processChunk)(void *application, UA_Connection *connection, UA_ByteString *chunk); -/* The network layer may receive chopped up messages since TCP is a streaming - * protocol. This method calls the processChunk callback on all full chunks that - * were received. Dangling half-complete chunks are buffered in the connection - * and considered for the next received packet. +/* The network layer may receive several chunks in one packet since TCP is a + * streaming protocol. The last chunk in the packet may be only partial. This + * method calls the processChunk callback on all full chunks that were received. + * The last incomplete chunk is buffered in the connection for the next + * iteration. * - * If an entire chunk is received, it is forwarded directly. But the memory - * needs to be freed with the networklayer-specific mechanism. If a half message - * is received, we copy it into a local buffer. Then, the stack-specific free - * needs to be used. + * The packet itself is not edited in this method. But possibly in the callback + * that is executed on complete chunks. * * @param connection The connection * @param application The client or server application * @param processCallback The function pointer for processing each chunk * @param packet The received packet. * @return Returns UA_STATUSCODE_GOOD or an error code. When an error occurs, - * the ingoing message and the current buffer in the connection are + * the current buffer in the connection are * freed. */ UA_StatusCode UA_Connection_processChunks(UA_Connection *connection, void *application, @@ -3696,6 +4871,10 @@ UA_Connection_receiveChunksBlocking(UA_Connection *connection, void *application UA_Connection_processChunk processCallback, UA_UInt32 timeout); +UA_StatusCode +UA_Connection_receiveChunksNonBlocking(UA_Connection *connection, void *application, + UA_Connection_processChunk processCallback); + /* When a fatal error occurs the Server shall send an Error Message to the * Client and close the socket. When a Client encounters one of these errors, it * shall also close the socket but does not send an Error Message. After the @@ -3709,29 +4888,26 @@ void UA_Connection_detachSecureChannel(UA_Connection *connection); void UA_Connection_attachSecureChannel(UA_Connection *connection, UA_SecureChannel *channel); -#ifdef __cplusplus -} // extern "C" -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/ua_securechannel.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/ua_securechannel.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2018 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2017 (c) Florian Palm * Copyright 2017 (c) Stefan Profanter, fortiss GmbH * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS + #define UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH 12 #define UA_SECURE_MESSAGE_HEADER_LENGTH 24 @@ -3754,17 +4930,25 @@ typedef struct UA_SessionHeader { } UA_SessionHeader; /* For chunked requests */ -struct ChunkPayload { - SIMPLEQ_ENTRY(ChunkPayload) pointers; +typedef struct UA_ChunkPayload { + SIMPLEQ_ENTRY(UA_ChunkPayload) pointers; UA_ByteString bytes; -}; - -struct MessageEntry { - LIST_ENTRY(MessageEntry) pointers; + UA_Boolean copied; /* Do the bytes point to a buffer from the network or was + memory allocated for the chunk separately */ +} UA_ChunkPayload; + +/* Receieved messages. Process them only in order. The Chunk payload has all + * headers and the padding stripped out. The payload begins at the + * ExtensionObject prefix.*/ +typedef struct UA_Message { + TAILQ_ENTRY(UA_Message) pointers; UA_UInt32 requestId; - SIMPLEQ_HEAD(chunkpayload_pointerlist, ChunkPayload) chunkPayload; - size_t chunkPayloadSize; -}; + UA_MessageType messageType; + SIMPLEQ_HEAD(pp, UA_ChunkPayload) chunkPayloads; + size_t chunkPayloadsSize; /* No of chunks received so far */ + size_t messageSize; /* Total length of the chunks received so far */ + UA_Boolean final; /* All chunks for the message have been received */ +} UA_Message; typedef enum { UA_SECURECHANNELSTATE_FRESH, @@ -3772,10 +4956,11 @@ typedef enum { UA_SECURECHANNELSTATE_CLOSED } UA_SecureChannelState; +typedef TAILQ_HEAD(UA_MessageQueue, UA_Message) UA_MessageQueue; + struct UA_SecureChannel { UA_SecureChannelState state; UA_MessageSecurityMode securityMode; - UA_ChannelSecurityToken securityToken; /* the channelId is contained in the securityToken */ /* We use three tokens because when switching tokens the client is allowed to accept * messages with the old token for up to 25% of the lifetime after the token would have timed out. * For messages that are sent, the new token is already used, which is contained in the securityToken @@ -3783,6 +4968,7 @@ struct UA_SecureChannel { * revolved into the securityToken variable. This could be done with two variables, but would require * greater changes to the current code. This could be done in the future after the client and networking * structure has been reworked, which would make this easier to implement. */ + UA_ChannelSecurityToken securityToken; /* the channelId is contained in the securityToken */ UA_ChannelSecurityToken nextSecurityToken; UA_ChannelSecurityToken previousSecurityToken; @@ -3802,15 +4988,23 @@ struct UA_SecureChannel { UA_UInt32 receiveSequenceNumber; UA_UInt32 sendSequenceNumber; - LIST_HEAD(session_pointerlist, UA_SessionHeader) sessions; - LIST_HEAD(chunk_pointerlist, MessageEntry) chunks; + LIST_HEAD(, UA_SessionHeader) sessions; + UA_MessageQueue messages; }; +void UA_SecureChannel_init(UA_SecureChannel *channel); + +void UA_SecureChannel_close(UA_SecureChannel *channel); + UA_StatusCode -UA_SecureChannel_init(UA_SecureChannel *channel, - const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *remoteCertificate); -void UA_SecureChannel_deleteMembersCleanup(UA_SecureChannel *channel); +UA_SecureChannel_setSecurityPolicy(UA_SecureChannel *channel, + const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *remoteCertificate); + +/* Remove (partially) received unprocessed messages */ +void UA_SecureChannel_deleteMessages(UA_SecureChannel *channel); + +void UA_SecureChannel_deleteMembers(UA_SecureChannel *channel); /* Generates new keys and sets them in the channel context */ UA_StatusCode @@ -3884,32 +5078,40 @@ void UA_MessageContext_abort(UA_MessageContext *mc); /** - * Process Received Chunks - * ----------------------- */ + * Receive Message + * --------------- */ -typedef UA_StatusCode +/* Decrypt a chunk and add it to the message. Create a new message if necessary. */ +UA_StatusCode +UA_SecureChannel_decryptAddChunk(UA_SecureChannel *channel, const UA_ByteString *chunk, + UA_Boolean allowPreviousToken); + +/* The network buffer is about to be cleared. Copy all chunks that point into + * the network buffer into dedicated memory. */ +UA_StatusCode +UA_SecureChannel_persistIncompleteMessages(UA_SecureChannel *channel); + +typedef void (UA_ProcessMessageCallback)(void *application, UA_SecureChannel *channel, UA_MessageType messageType, UA_UInt32 requestId, const UA_ByteString *message); -/* Process a single chunk. This also decrypts the chunk if required. The - * callback function is called with the complete message body if the message is - * complete. +/* Process received complete messages in-order. The callback function is called + * with the complete message body if the message is complete. The message is + * removed afterwards. * * Symmetric callback is ERR, MSG, CLO only * Asymmetric callback is OPN only * * @param channel the channel the chunks were received on. - * @param chunks the memory region where the chunks are stored. + * @param application data pointer to application specific data that gets passed + * on to the callback function. * @param callback the callback function that gets called with the complete * message body, once a final chunk is processed. - * @param application data pointer to application specific data that gets passed - * on to the callback function. */ + * @return Returns if an irrecoverable error occured. Maybe close the channel. */ UA_StatusCode -UA_SecureChannel_processChunk(UA_SecureChannel *channel, UA_ByteString *chunk, - UA_ProcessMessageCallback callback, - void *application, - UA_Boolean allowPreviousToken); +UA_SecureChannel_processCompleteMessages(UA_SecureChannel *channel, void *application, + UA_ProcessMessageCallback callback); /** * Log Helper @@ -3926,7 +5128,7 @@ UA_SecureChannel_processChunk(UA_SecureChannel *channel, UA_ByteString *chunk, #define UA_LOG_TRACE_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...) \ UA_LOG_TRACE(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, \ "Connection %i | SecureChannel %i | " MSG "%.0s", \ - ((CHANNEL)->connection ? (CHANNEL)->connection->sockfd : 0), \ + ((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \ (CHANNEL)->securityToken.channelId, __VA_ARGS__) #define UA_LOG_TRACE_CHANNEL(LOGGER, CHANNEL, ...) \ @@ -3935,7 +5137,7 @@ UA_SecureChannel_processChunk(UA_SecureChannel *channel, UA_ByteString *chunk, #define UA_LOG_DEBUG_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...) \ UA_LOG_DEBUG(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, \ "Connection %i | SecureChannel %i | " MSG "%.0s", \ - ((CHANNEL)->connection ? (CHANNEL)->connection->sockfd : 0), \ + ((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \ (CHANNEL)->securityToken.channelId, __VA_ARGS__) #define UA_LOG_DEBUG_CHANNEL(LOGGER, CHANNEL, ...) \ @@ -3944,7 +5146,7 @@ UA_SecureChannel_processChunk(UA_SecureChannel *channel, UA_ByteString *chunk, #define UA_LOG_INFO_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...) \ UA_LOG_INFO(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, \ "Connection %i | SecureChannel %i | " MSG "%.0s", \ - ((CHANNEL)->connection ? (CHANNEL)->connection->sockfd : 0), \ + ((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \ (CHANNEL)->securityToken.channelId, __VA_ARGS__) #define UA_LOG_INFO_CHANNEL(LOGGER, CHANNEL, ...) \ @@ -3953,7 +5155,7 @@ UA_SecureChannel_processChunk(UA_SecureChannel *channel, UA_ByteString *chunk, #define UA_LOG_WARNING_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...) \ UA_LOG_WARNING(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, \ "Connection %i | SecureChannel %i | " MSG "%.0s", \ - ((CHANNEL)->connection ? (CHANNEL)->connection->sockfd : 0), \ + ((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \ (CHANNEL)->securityToken.channelId, __VA_ARGS__) #define UA_LOG_WARNING_CHANNEL(LOGGER, CHANNEL, ...) \ @@ -3962,7 +5164,7 @@ UA_SecureChannel_processChunk(UA_SecureChannel *channel, UA_ByteString *chunk, #define UA_LOG_ERROR_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...) \ UA_LOG_ERROR(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, \ "Connection %i | SecureChannel %i | " MSG "%.0s", \ - ((CHANNEL)->connection ? (CHANNEL)->connection->sockfd : 0), \ + ((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \ (CHANNEL)->securityToken.channelId, __VA_ARGS__) #define UA_LOG_ERROR_CHANNEL(LOGGER, CHANNEL, ...) \ @@ -3977,280 +5179,580 @@ UA_SecureChannel_processChunk(UA_SecureChannel *channel, UA_ByteString *chunk, #define UA_LOG_FATAL_CHANNEL(LOGGER, CHANNEL, ...) \ UA_MACRO_EXPAND(UA_LOG_FATAL_CHANNEL_INTERNAL(LOGGER, CHANNEL, __VA_ARGS__, "")) -#ifdef __cplusplus -} // extern "C" -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/ua_timer.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/ua_workqueue.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2014-2016 (c) Sten Grüner + * Copyright 2015 (c) Chris Iatrou + * Copyright 2015 (c) Nick Goossens + * Copyright 2015 (c) Jörg Schüler-Maroldt + * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2016-2017 (c) Florian Palm * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2016 (c) Lorenz Haas + * Copyright 2017 (c) Jonas Green */ -#ifdef __cplusplus -extern "C" { + +#ifdef UA_ENABLE_MULTITHREADING +#include #endif +_UA_BEGIN_DECLS -/* An (event) timer triggers callbacks with a recurring interval. Adding, - * removing and changing repeated callbacks can be done from independent - * threads. Processing the changes and dispatching callbacks must be done by a - * single "mainloop" process. - * Timer callbacks with the same recurring interval are batched into blocks in - * order to reduce linear search for re-entry to the sorted list after processing. - * Callbacks are inserted in reversed order (last callback are put first in the block) - * to allow the monitored items of a subscription (if created in a sequence with the - * same publish/sample interval) to be executed before the subscription publish the - * notifications. When callbacks are entered to the timer list after execution they - * are added in the same order as before execution. */ +/* Callback where the application is either a client or a server */ +typedef void (*UA_ApplicationCallback)(void *application, void *data); -/* Forward declaration */ -struct UA_TimerCallbackEntry; -typedef struct UA_TimerCallbackEntry UA_TimerCallbackEntry; +/* Delayed callbacks are executed when all previously enqueue work is finished. + * This is used to free memory that might used by a parallel worker or where the + * current threat has remaining pointers to until the current operation + * finishes. */ +typedef struct UA_DelayedCallback { + SIMPLEQ_ENTRY(UA_DelayedCallback) next; + UA_ApplicationCallback callback; + void *application; + void *data; +} UA_DelayedCallback; -/* Linked-list definition */ -typedef SLIST_HEAD(UA_TimerCallbackList, UA_TimerCallbackEntry) UA_TimerCallbackList; +struct UA_WorkQueue; +typedef struct UA_WorkQueue UA_WorkQueue; + +#ifdef UA_ENABLE_MULTITHREADING +/* Workers take out callbacks from the work queue and execute them. + * + * Future Plans: Use work-stealing to load-balance between cores. + * Le, Nhat Minh, et al. "Correct and efficient work-stealing for weak memory + * models." ACM SIGPLAN Notices. Vol. 48. No. 8. ACM, 2013. */ typedef struct { - /* The linked list of callbacks is sorted according to the execution timestamp. */ - UA_TimerCallbackList repeatedCallbacks; + pthread_t thread; + volatile UA_Boolean running; + UA_WorkQueue *queue; + UA_UInt32 counter; + UA_UInt32 checkpointCounter; /* Counter when the last checkpoint was made + * for the delayed callbacks */ - /* Changes to the repeated callbacks in a multi-producer single-consumer queue */ - UA_TimerCallbackEntry * volatile changes_head; - UA_TimerCallbackEntry *changes_tail; - UA_TimerCallbackEntry *changes_stub; + /* separate cache lines */ + char padding[64 - sizeof(void*) - sizeof(pthread_t) - + sizeof(UA_UInt32) - sizeof(UA_Boolean)]; +} UA_Worker; - UA_UInt64 idCounter; -} UA_Timer; +#endif -/* Initialize the Timer. Not thread-safe. */ -void UA_Timer_init(UA_Timer *t); +struct UA_WorkQueue { + /* Worker threads and work queue. Without multithreading, work is executed + immediately. */ +#ifdef UA_ENABLE_MULTITHREADING + UA_Worker *workers; + size_t workersSize; -/* Add a repated callback. Thread-safe, can be used in parallel and in parallel - * with UA_Timer_process. */ -typedef void (*UA_TimerCallback)(void *application, void *data); + /* Work queue */ + SIMPLEQ_HEAD(, UA_DelayedCallback) dispatchQueue; /* Dispatch queue for the worker threads */ + pthread_mutex_t dispatchQueue_accessMutex; /* mutex for access to queue */ + pthread_cond_t dispatchQueue_condition; /* so the workers don't spin if the queue is empty */ + pthread_mutex_t dispatchQueue_conditionMutex; /* mutex for access to condition variable */ +#endif -UA_StatusCode -UA_Timer_addRepeatedCallback(UA_Timer *t, UA_TimerCallback callback, void *data, - UA_UInt32 interval, UA_UInt64 *callbackId); + /* Delayed callbacks + * To be executed after all curretly dispatched works has finished */ + SIMPLEQ_HEAD(, UA_DelayedCallback) delayedCallbacks; +#ifdef UA_ENABLE_MULTITHREADING + pthread_mutex_t delayedCallbacks_accessMutex; + UA_DelayedCallback *delayedCallbacks_checkpoint; + size_t delayedCallbacks_sinceDispatch; /* How many have been added since we + * tried to dispatch callbacks? */ +#endif +}; -/* Change the callback interval. If this is called from within the callback. The - * adjustment is made during the next _process call. */ -UA_StatusCode -UA_Timer_changeRepeatedCallbackInterval(UA_Timer *t, UA_UInt64 callbackId, - UA_UInt32 interval); +void UA_WorkQueue_init(UA_WorkQueue *wq); -/* Remove a repated callback. Thread-safe, can be used in parallel and in - * parallel with UA_Timer_process. */ -UA_StatusCode -UA_Timer_removeRepeatedCallback(UA_Timer *t, UA_UInt64 callbackId); +/* Enqueue a delayed callback. It is executed when all previous work in the + * queue has been finished. The ``cb`` pointer is freed afterwards. ``cb`` can + * have a NULL callback that is not executed. + * + * This method checks internally if existing delayed work can be moved from the + * delayed queue to the worker dispatch queue. */ +void UA_WorkQueue_enqueueDelayed(UA_WorkQueue *wq, UA_DelayedCallback *cb); -/* Process (dispatch) the repeated callbacks that have timed out. Returns the - * timestamp of the next scheduled repeated callback. Not thread-safe. - * Application is a pointer to the client / server environment for the callback. - * Dispatched is set to true when at least one callback was run / dispatched. */ -typedef void (*UA_TimerDispatchCallback)(void *application, UA_TimerCallback callback, - void *data); +/* Stop the workers, process all enqueued work in the calling thread, clean up + * mutexes etc. */ +void UA_WorkQueue_cleanup(UA_WorkQueue *wq); -UA_DateTime -UA_Timer_process(UA_Timer *t, UA_DateTime nowMonotonic, - UA_TimerDispatchCallback dispatchCallback, - void *application); +#ifndef UA_ENABLE_MULTITHREADING -/* Remove all repeated callbacks. Not thread-safe. */ -void UA_Timer_deleteMembers(UA_Timer *t); +/* Process all enqueued delayed work. This is not needed when workers are + * running for the multithreading case. (UA_WorkQueue_cleanup still calls this + * method during cleanup when the workers are shut down.) */ +void UA_WorkQueue_manuallyProcessDelayed(UA_WorkQueue *wq); + +#else + +/* Spin up a number of worker threads that listen on the work queue */ +UA_StatusCode UA_WorkQueue_start(UA_WorkQueue *wq, size_t workersCount); + +void UA_WorkQueue_stop(UA_WorkQueue *wq); + +/* Enqueue work for the worker threads */ +void UA_WorkQueue_enqueue(UA_WorkQueue *wq, UA_ApplicationCallback cb, + void *application, void *data); -#ifdef __cplusplus -} // extern "C" #endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_session.h" ***********************************/ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_discovery_manager.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2018 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2014, 2017 (c) Florian Palm + * Copyright 2015-2016 (c) Sten Grüner + * Copyright 2015 (c) Chris Iatrou + * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Julian Grothoff */ -#ifdef __cplusplus -extern "C" { -#endif - - -#define UA_MAXCONTINUATIONPOINTS 5 -typedef struct ContinuationPointEntry { - LIST_ENTRY(ContinuationPointEntry) pointers; - UA_ByteString identifier; - UA_BrowseDescription browseDescription; - UA_UInt32 maxReferences; - /* The last point in the node references? */ - size_t referenceKindIndex; - size_t targetIndex; -} ContinuationPointEntry; +_UA_BEGIN_DECLS -struct UA_Subscription; -typedef struct UA_Subscription UA_Subscription; +#ifdef UA_ENABLE_DISCOVERY -#ifdef UA_ENABLE_SUBSCRIPTIONS -typedef struct UA_PublishResponseEntry { - SIMPLEQ_ENTRY(UA_PublishResponseEntry) listEntry; - UA_UInt32 requestId; - UA_PublishResponse response; -} UA_PublishResponseEntry; +typedef struct registeredServer_list_entry { +#ifdef UA_ENABLE_MULTITHREADING + UA_DelayedCallback delayedCleanup; #endif + LIST_ENTRY(registeredServer_list_entry) pointers; + UA_RegisteredServer registeredServer; + UA_DateTime lastSeen; +} registeredServer_list_entry; -typedef struct { - UA_SessionHeader header; - UA_ApplicationDescription clientDescription; - UA_String sessionName; - UA_Boolean activated; - void *sessionHandle; // pointer assigned in userland-callback - UA_NodeId sessionId; - UA_UInt32 maxRequestMessageSize; - UA_UInt32 maxResponseMessageSize; - UA_Double timeout; // [ms] - UA_DateTime validTill; - UA_ByteString serverNonce; - UA_UInt16 availableContinuationPoints; - LIST_HEAD(ContinuationPointList, ContinuationPointEntry) continuationPoints; -#ifdef UA_ENABLE_SUBSCRIPTIONS - UA_UInt32 lastSubscriptionId; - UA_UInt32 lastSeenSubscriptionId; - LIST_HEAD(UA_ListOfUASubscriptions, UA_Subscription) serverSubscriptions; - SIMPLEQ_HEAD(UA_ListOfQueuedPublishResponses, UA_PublishResponseEntry) responseQueue; - UA_UInt32 numSubscriptions; - UA_UInt32 numPublishReq; - size_t totalRetransmissionQueueSize; /* Retransmissions of all subscriptions */ -#endif -} UA_Session; +struct PeriodicServerRegisterCallback { + UA_UInt64 id; + UA_Double this_interval; + UA_Double default_interval; + UA_Boolean registered; + struct UA_Client* client; + char* discovery_server_url; +}; -/** - * Session Lifecycle - * ----------------- */ +typedef struct periodicServerRegisterCallback_entry { +#ifdef UA_ENABLE_MULTITHREADING + UA_DelayedCallback delayedCleanup; +#endif + LIST_ENTRY(periodicServerRegisterCallback_entry) pointers; + struct PeriodicServerRegisterCallback *callback; +} periodicServerRegisterCallback_entry; -void UA_Session_init(UA_Session *session); -void UA_Session_deleteMembersCleanup(UA_Session *session, UA_Server *server); -void UA_Session_attachToSecureChannel(UA_Session *session, UA_SecureChannel *channel); -void UA_Session_detachFromSecureChannel(UA_Session *session); -UA_StatusCode UA_Session_generateNonce(UA_Session *session); +#ifdef UA_ENABLE_DISCOVERY_MULTICAST -/* If any activity on a session happens, the timeout is extended */ -void UA_Session_updateLifetime(UA_Session *session); /** - * Subscription handling - * --------------------- */ + * TXT record: + * [servername]-[hostname]._opcua-tcp._tcp.local. TXT path=/ caps=NA,DA,... + * + * A/AAAA record for all ip addresses: + * [servername]-[hostname]._opcua-tcp._tcp.local. A [ip]. + * [hostname]. A [ip]. + */ -#ifdef UA_ENABLE_SUBSCRIPTIONS +typedef struct serverOnNetwork_list_entry { +#ifdef UA_ENABLE_MULTITHREADING + UA_DelayedCallback delayedCleanup; +#endif + LIST_ENTRY(serverOnNetwork_list_entry) pointers; + UA_ServerOnNetwork serverOnNetwork; + UA_DateTime created; + UA_DateTime lastSeen; + UA_Boolean txtSet; + UA_Boolean srvSet; + char* pathTmp; +} serverOnNetwork_list_entry; -void UA_Session_addSubscription(UA_Session *session, UA_Subscription *newSubscription); -UA_Subscription * UA_Session_getSubscriptionById(UA_Session *session, UA_UInt32 subscriptionId); -UA_StatusCode UA_Session_deleteSubscription(UA_Server *server, UA_Session *session, UA_UInt32 subscriptionId); -void UA_Session_queuePublishReq(UA_Session *session, UA_PublishResponseEntry* entry, UA_Boolean head); -UA_PublishResponseEntry* UA_Session_dequeuePublishReq(UA_Session *session); +#define SERVER_ON_NETWORK_HASH_PRIME 1009 +typedef struct serverOnNetwork_hash_entry { + serverOnNetwork_list_entry* entry; + struct serverOnNetwork_hash_entry* next; +} serverOnNetwork_hash_entry; #endif -/** - * Log Helper - * ---------- - * We have to jump through some hoops to enable the use of format strings - * without arguments since (pedantic) C99 does not allow variadic macros with - * zero arguments. So we add a dummy argument that is not printed (%.0s is - * string of length zero). */ - -#define UA_LOG_TRACE_SESSION_INTERNAL(LOGGER, SESSION, MSG, ...) \ - UA_LOG_TRACE(LOGGER, UA_LOGCATEGORY_SESSION, \ - "Connection %i | SecureChannel %i | Session " UA_PRINTF_GUID_FORMAT " | " MSG "%.0s", \ - ((SESSION)->header.channel ? ((SESSION)->header.channel->connection ? (SESSION)->header.channel->connection->sockfd : 0) : 0), \ - ((SESSION)->header.channel ? (SESSION)->header.channel->securityToken.channelId : 0), \ - UA_PRINTF_GUID_DATA((SESSION)->sessionId.identifier.guid), __VA_ARGS__) +typedef struct { + LIST_HEAD(, periodicServerRegisterCallback_entry) periodicServerRegisterCallbacks; + LIST_HEAD(, registeredServer_list_entry) registeredServers; + size_t registeredServersSize; + UA_Server_registerServerCallback registerServerCallback; + void* registerServerCallbackData; -#define UA_LOG_TRACE_SESSION(LOGGER, SESSION, ...) \ - UA_MACRO_EXPAND(UA_LOG_TRACE_SESSION_INTERNAL(LOGGER, SESSION, __VA_ARGS__, "")) +# ifdef UA_ENABLE_DISCOVERY_MULTICAST + mdns_daemon_t *mdnsDaemon; + UA_SOCKET mdnsSocket; + UA_Boolean mdnsMainSrvAdded; -#define UA_LOG_DEBUG_SESSION_INTERNAL(LOGGER, SESSION, MSG, ...) \ - UA_LOG_DEBUG(LOGGER, UA_LOGCATEGORY_SESSION, \ - "Connection %i | SecureChannel %i | Session " UA_PRINTF_GUID_FORMAT " | " MSG "%.0s", \ - ((SESSION)->header.channel ? ((SESSION)->header.channel->connection ? (SESSION)->header.channel->connection->sockfd : 0) : 0), \ - ((SESSION)->header.channel ? (SESSION)->header.channel->securityToken.channelId : 0), \ - UA_PRINTF_GUID_DATA((SESSION)->sessionId.identifier.guid), __VA_ARGS__) + LIST_HEAD(, serverOnNetwork_list_entry) serverOnNetwork; + size_t serverOnNetworkSize; -#define UA_LOG_DEBUG_SESSION(LOGGER, SESSION, ...) \ - UA_MACRO_EXPAND(UA_LOG_DEBUG_SESSION_INTERNAL(LOGGER, SESSION, __VA_ARGS__, "")) + UA_UInt32 serverOnNetworkRecordIdCounter; + UA_DateTime serverOnNetworkRecordIdLastReset; -#define UA_LOG_INFO_SESSION_INTERNAL(LOGGER, SESSION, MSG, ...) \ - UA_LOG_INFO(LOGGER, UA_LOGCATEGORY_SESSION, \ - "Connection %i | SecureChannel %i | Session " UA_PRINTF_GUID_FORMAT " | " MSG "%.0s", \ - ((SESSION)->header.channel ? ((SESSION)->header.channel->connection ? (SESSION)->header.channel->connection->sockfd : 0) : 0), \ - ((SESSION)->header.channel ? (SESSION)->header.channel->securityToken.channelId : 0), \ - UA_PRINTF_GUID_DATA((SESSION)->sessionId.identifier.guid), __VA_ARGS__) + /* hash mapping domain name to serverOnNetwork list entry */ + struct serverOnNetwork_hash_entry* serverOnNetworkHash[SERVER_ON_NETWORK_HASH_PRIME]; -#define UA_LOG_INFO_SESSION(LOGGER, SESSION, ...) \ - UA_MACRO_EXPAND(UA_LOG_INFO_SESSION_INTERNAL(LOGGER, SESSION, __VA_ARGS__, "")) + UA_Server_serverOnNetworkCallback serverOnNetworkCallback; + void* serverOnNetworkCallbackData; -#define UA_LOG_WARNING_SESSION_INTERNAL(LOGGER, SESSION, MSG, ...) \ - UA_LOG_WARNING(LOGGER, UA_LOGCATEGORY_SESSION, \ - "Connection %i | SecureChannel %i | Session " UA_PRINTF_GUID_FORMAT " | " MSG "%.0s", \ - ((SESSION)->header.channel ? ((SESSION)->header.channel->connection ? (SESSION)->header.channel->connection->sockfd : 0) : 0), \ - ((SESSION)->header.channel ? (SESSION)->header.channel->securityToken.channelId : 0), \ - UA_PRINTF_GUID_DATA((SESSION)->sessionId.identifier.guid), __VA_ARGS__) +# ifdef UA_ENABLE_MULTITHREADING + pthread_t mdnsThread; + UA_Boolean mdnsRunning; +# endif +# endif /* UA_ENABLE_DISCOVERY_MULTICAST */ +} UA_DiscoveryManager; -#define UA_LOG_WARNING_SESSION(LOGGER, SESSION, ...) \ - UA_MACRO_EXPAND(UA_LOG_WARNING_SESSION_INTERNAL(LOGGER, SESSION, __VA_ARGS__, "")) +void UA_DiscoveryManager_init(UA_DiscoveryManager *dm, UA_Server *server); +void UA_DiscoveryManager_deleteMembers(UA_DiscoveryManager *dm, UA_Server *server); -#define UA_LOG_ERROR_SESSION_INTERNAL(LOGGER, SESSION, MSG, ...) \ - UA_LOG_ERROR(LOGGER, UA_LOGCATEGORY_SESSION, \ - "Connection %i | SecureChannel %i | Session " UA_PRINTF_GUID_FORMAT " | " MSG "%.0s", \ - ((SESSION)->header.channel ? ((SESSION)->header.channel->connection ? (SESSION)->header.channel->connection->sockfd : 0) : 0), \ - ((SESSION)->header.channel ? (SESSION)->header.channel->securityToken.channelId : 0), \ - UA_PRINTF_GUID_DATA((SESSION)->sessionId.identifier.guid), __VA_ARGS__) +/* Checks if a registration timed out and removes that registration. + * Should be called periodically in main loop */ +void UA_Discovery_cleanupTimedOut(UA_Server *server, UA_DateTime nowMonotonic); -#define UA_LOG_ERROR_SESSION(LOGGER, SESSION, ...) \ - UA_MACRO_EXPAND(UA_LOG_ERROR_SESSION_INTERNAL(LOGGER, SESSION, __VA_ARGS__, "")) +#ifdef UA_ENABLE_DISCOVERY_MULTICAST -#define UA_LOG_FATAL_SESSION_INTERNAL(LOGGER, SESSION, MSG, ...) \ - UA_LOG_FATAL(LOGGER, UA_LOGCATEGORY_SESSION, \ - "Connection %i | SecureChannel %i | Session " UA_PRINTF_GUID_FORMAT " | " MSG "%.0s", \ - ((SESSION)->header.channel ? ((SESSION)->header.channel->connection ? (SESSION)->header.channel->connection->sockfd : 0) : 0), \ - ((SESSION)->header.channel ? (SESSION)->header.channel->securityToken.channelId : 0), \ - UA_PRINTF_GUID_DATA((SESSION)->sessionId.identifier.guid), __VA_ARGS__) +void +UA_Server_updateMdnsForDiscoveryUrl(UA_Server *server, const UA_String *serverName, + const UA_MdnsDiscoveryConfiguration *mdnsConfig, + const UA_String *discoveryUrl, + UA_Boolean isOnline, UA_Boolean updateTxt); -#define UA_LOG_FATAL_SESSION(LOGGER, SESSION, ...) \ - UA_MACRO_EXPAND(UA_LOG_FATAL_SESSION_INTERNAL(LOGGER, SESSION, __VA_ARGS__, "")) +void mdns_record_received(const struct resource *r, void *data); -#ifdef __cplusplus -} // extern "C" -#endif +void mdns_create_txt(UA_Server *server, const char *fullServiceDomain, + const char *path, const UA_String *capabilites, + const size_t capabilitiesSize, + void (*conflict)(char *host, int type, void *arg)); +void mdns_set_address_record(UA_Server *server, + const char *fullServiceDomain, + const char *localDomain); -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_subscription.h" ***********************************/ +mdns_record_t * +mdns_find_record(mdns_daemon_t *mdnsDaemon, unsigned short type, + const char *host, const char *rdname); -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2015-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2015 (c) Chris Iatrou - * Copyright 2015-2016 (c) Sten Grüner - * Copyright 2015 (c) Oleksiy Vasylyev - * Copyright 2017 (c) Florian Palm - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) Mattias Bornhager - */ +void startMulticastDiscoveryServer(UA_Server *server); +void stopMulticastDiscoveryServer(UA_Server *server); +UA_StatusCode +iterateMulticastDiscoveryServer(UA_Server* server, UA_DateTime *nextRepeat, + UA_Boolean processIn); + +typedef enum { + UA_DISCOVERY_TCP, /* OPC UA TCP mapping */ + UA_DISCOVERY_TLS /* OPC UA HTTPS mapping */ +} UA_DiscoveryProtocol; + +/* Send a multicast probe to find any other OPC UA server on the network through mDNS. */ +UA_StatusCode +UA_Discovery_multicastQuery(UA_Server* server); + +UA_StatusCode +UA_Discovery_addRecord(UA_Server *server, const UA_String *servername, + const UA_String *hostname, UA_UInt16 port, + const UA_String *path, const UA_DiscoveryProtocol protocol, + UA_Boolean createTxt, const UA_String* capabilites, + const size_t capabilitiesSize); +UA_StatusCode +UA_Discovery_removeRecord(UA_Server *server, const UA_String *servername, + const UA_String *hostname, UA_UInt16 port, + UA_Boolean removeTxt); + +#endif /* UA_ENABLE_DISCOVERY_MULTICAST */ + +#endif /* UA_ENABLE_DISCOVERY */ + +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/ua_timer.h" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2017, 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + */ + + + +_UA_BEGIN_DECLS + +struct UA_TimerEntry; +typedef struct UA_TimerEntry UA_TimerEntry; + +ZIP_HEAD(UA_TimerZip, UA_TimerEntry); +typedef struct UA_TimerZip UA_TimerZip; + +ZIP_HEAD(UA_TimerIdZip, UA_TimerEntry); +typedef struct UA_TimerIdZip UA_TimerIdZip; + +/* Only for a single thread. Protect by a mutex if required. */ +typedef struct { + UA_TimerZip root; /* The root of the time-sorted zip tree */ + UA_TimerIdZip idRoot; /* The root of the id-sorted zip tree */ + UA_UInt64 idCounter; +} UA_Timer; + +void UA_Timer_init(UA_Timer *t); + +UA_StatusCode +UA_Timer_addTimedCallback(UA_Timer *t, UA_ApplicationCallback callback, + void *application, void *data, UA_DateTime date, + UA_UInt64 *callbackId); + +UA_StatusCode +UA_Timer_addRepeatedCallback(UA_Timer *t, UA_ApplicationCallback callback, + void *application, void *data, UA_Double interval_ms, + UA_UInt64 *callbackId); + +/* Change the callback interval. If this is called from within the callback. The + * adjustment is made during the next _process call. */ +UA_StatusCode +UA_Timer_changeRepeatedCallbackInterval(UA_Timer *t, UA_UInt64 callbackId, + UA_Double interval_ms); + +void +UA_Timer_removeCallback(UA_Timer *t, UA_UInt64 callbackId); + +/* Process (dispatch) the repeated callbacks that have timed out. Returns the + * timestamp of the next scheduled repeated callback. Not thread-safe. + * Application is a pointer to the client / server environment for the callback. + * Dispatched is set to true when at least one callback was run / dispatched. */ +typedef void +(*UA_TimerExecutionCallback)(void *executionApplication, UA_ApplicationCallback cb, + void *callbackApplication, void *data); + +UA_DateTime +UA_Timer_process(UA_Timer *t, UA_DateTime nowMonotonic, + UA_TimerExecutionCallback executionCallback, + void *executionApplication); + +void UA_Timer_deleteMembers(UA_Timer *t); + +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_session.h" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + */ + + + + +_UA_BEGIN_DECLS + +#define UA_MAXCONTINUATIONPOINTS 5 + +struct ContinuationPoint; +typedef struct ContinuationPoint ContinuationPoint; + +/* Returns the next entry in the linked list */ +ContinuationPoint * +ContinuationPoint_clear(ContinuationPoint *cp); + +struct UA_Subscription; +typedef struct UA_Subscription UA_Subscription; + +#ifdef UA_ENABLE_SUBSCRIPTIONS +typedef struct UA_PublishResponseEntry { + SIMPLEQ_ENTRY(UA_PublishResponseEntry) listEntry; + UA_UInt32 requestId; + UA_PublishResponse response; +} UA_PublishResponseEntry; +#endif + +typedef struct { + UA_SessionHeader header; + UA_ApplicationDescription clientDescription; + UA_String sessionName; + UA_Boolean activated; + void *sessionHandle; // pointer assigned in userland-callback + UA_NodeId sessionId; + UA_UInt32 maxRequestMessageSize; + UA_UInt32 maxResponseMessageSize; + UA_Double timeout; // [ms] + UA_DateTime validTill; + UA_ByteString serverNonce; + UA_UInt16 availableContinuationPoints; + ContinuationPoint *continuationPoints; +#ifdef UA_ENABLE_SUBSCRIPTIONS + UA_UInt32 lastSeenSubscriptionId; + LIST_HEAD(UA_ListOfUASubscriptions, UA_Subscription) serverSubscriptions; + SIMPLEQ_HEAD(UA_ListOfQueuedPublishResponses, UA_PublishResponseEntry) responseQueue; + UA_UInt32 numSubscriptions; + UA_UInt32 numPublishReq; + size_t totalRetransmissionQueueSize; /* Retransmissions of all subscriptions */ +#endif +} UA_Session; + +/** + * Session Lifecycle + * ----------------- */ + +void UA_Session_init(UA_Session *session); +void UA_Session_deleteMembersCleanup(UA_Session *session, UA_Server *server); +void UA_Session_attachToSecureChannel(UA_Session *session, UA_SecureChannel *channel); +void UA_Session_detachFromSecureChannel(UA_Session *session); +UA_StatusCode UA_Session_generateNonce(UA_Session *session); + +/* If any activity on a session happens, the timeout is extended */ +void UA_Session_updateLifetime(UA_Session *session); + +/** + * Subscription handling + * --------------------- */ + +#ifdef UA_ENABLE_SUBSCRIPTIONS + +void +UA_Session_addSubscription(UA_Server *server, + UA_Session *session, + UA_Subscription *newSubscription); + +UA_Subscription * +UA_Session_getSubscriptionById(UA_Session *session, + UA_UInt32 subscriptionId); + +UA_StatusCode +UA_Session_deleteSubscription(UA_Server *server, UA_Session *session, + UA_UInt32 subscriptionId); + +void +UA_Session_queuePublishReq(UA_Session *session, + UA_PublishResponseEntry* entry, + UA_Boolean head); + +UA_PublishResponseEntry * +UA_Session_dequeuePublishReq(UA_Session *session); + +#endif + +/** + * Log Helper + * ---------- + * We have to jump through some hoops to enable the use of format strings + * without arguments since (pedantic) C99 does not allow variadic macros with + * zero arguments. So we add a dummy argument that is not printed (%.0s is + * string of length zero). */ + +#define UA_LOG_SESSION_INTERNAL(LOGGER, LEVEL, SESSION, MSG, ...) do { \ + UA_String idString = UA_STRING_NULL; \ + UA_NodeId_toString(&(SESSION)->sessionId, &idString); \ + UA_LOG_##LEVEL(LOGGER, UA_LOGCATEGORY_SESSION, \ + "Connection %i | SecureChannel %i | Session %.*s | " MSG "%.0s", \ + ((SESSION)->header.channel ? \ + ((SESSION)->header.channel->connection ? \ + (int)((SESSION)->header.channel->connection->sockfd) : 0) : 0), \ + ((SESSION)->header.channel ? \ + (SESSION)->header.channel->securityToken.channelId : 0), \ + (int)idString.length, idString.data, __VA_ARGS__); \ + UA_String_deleteMembers(&idString); \ + } while(0) + +#if UA_LOGLEVEL <= 100 +#define UA_LOG_TRACE_SESSION(LOGGER, SESSION, ...) \ + UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, TRACE, SESSION, __VA_ARGS__, "")) +#else +#define UA_LOG_TRACE_SESSION(LOGGER, SESSION, ...) do {} while(0) +#endif + +#if UA_LOGLEVEL <= 200 +#define UA_LOG_DEBUG_SESSION(LOGGER, SESSION, ...) \ + UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, DEBUG, SESSION, __VA_ARGS__, "")) +#else +#define UA_LOG_DEBUG_SESSION(LOGGER, SESSION, ...) do {} while(0) +#endif + +#if UA_LOGLEVEL <= 300 +#define UA_LOG_INFO_SESSION(LOGGER, SESSION, ...) \ + UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, INFO, SESSION, __VA_ARGS__, "")) +#else +#define UA_LOG_INFO_SESSION(LOGGER, SESSION, ...) do {} while(0) +#endif + +#if UA_LOGLEVEL <= 400 +#define UA_LOG_WARNING_SESSION(LOGGER, SESSION, ...) \ + UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, WARNING, SESSION, __VA_ARGS__, "")) +#else +#define UA_LOG_WARNING_SESSION(LOGGER, SESSION, ...) do {} while(0) +#endif + +#if UA_LOGLEVEL <= 500 +#define UA_LOG_ERROR_SESSION(LOGGER, SESSION, ...) \ + UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, ERROR, SESSION, __VA_ARGS__, "")) +#else +#define UA_LOG_ERROR_SESSION(LOGGER, SESSION, ...) do {} while(0) +#endif + +#if UA_LOGLEVEL <= 600 +#define UA_LOG_FATAL_SESSION(LOGGER, SESSION, ...) \ + UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, FATAL, SESSION, __VA_ARGS__, "")) +#else +#define UA_LOG_FATAL_SESSION(LOGGER, SESSION, ...) do {} while(0) +#endif + +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_subscription.h" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2015 (c) Chris Iatrou + * Copyright 2015-2016 (c) Sten Grüner + * Copyright 2015 (c) Oleksiy Vasylyev + * Copyright 2017 (c) Florian Palm + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Mattias Bornhager + */ + + + + +_UA_BEGIN_DECLS + +#ifdef UA_ENABLE_SUBSCRIPTIONS + +#define UA_BOUNDEDVALUE_SETWBOUNDS(BOUNDS, SRC, DST) { \ + if(SRC > BOUNDS.max) DST = BOUNDS.max; \ + else if(SRC < BOUNDS.min) DST = BOUNDS.min; \ + else DST = SRC; \ + } + +/* Set to the TAILQ_NEXT pointer of a notification, the sentinel that the + * notification was not added to the global queue */ +#define UA_SUBSCRIPTION_QUEUE_SENTINEL ((UA_Notification*)0x01) /** * MonitoredItems create Notifications. Subscriptions collect Notifications from @@ -4268,54 +5770,71 @@ UA_PublishResponseEntry* UA_Session_dequeuePublishReq(UA_Session *session); /* MonitoredItem */ /*****************/ -typedef enum { - UA_MONITOREDITEMTYPE_CHANGENOTIFY = 1, - UA_MONITOREDITEMTYPE_STATUSNOTIFY = 2, - UA_MONITOREDITEMTYPE_EVENTNOTIFY = 4 -} UA_MonitoredItemType; - -/* Not used yet. Placeholder for a future event implementation. */ -typedef struct UA_Event { - UA_Int32 eventId; -} UA_Event; - struct UA_MonitoredItem; typedef struct UA_MonitoredItem UA_MonitoredItem; +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS +typedef struct UA_EventNotification { + UA_EventFieldList fields; + /* EventFilterResult currently isn't being used + UA_EventFilterResult result; */ +} UA_EventNotification; +#endif + typedef struct UA_Notification { - TAILQ_ENTRY(UA_Notification) listEntry; - TAILQ_ENTRY(UA_Notification) globalEntry; + TAILQ_ENTRY(UA_Notification) listEntry; /* Notification list for the MonitoredItem */ + TAILQ_ENTRY(UA_Notification) globalEntry; /* Notification list for the Subscription */ UA_MonitoredItem *mon; /* See the monitoredItemType of the MonitoredItem */ union { - UA_Event event; +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + UA_EventNotification event; +#endif UA_DataValue value; } data; } UA_Notification; +/* Ensure enough space is available; Add notification to the linked lists; + * Increase the counters */ +void UA_Notification_enqueue(UA_Server *server, UA_Subscription *sub, + UA_MonitoredItem *mon, UA_Notification *n); + +/* Remove the notification from the MonitoredItem's queue and the Subscriptions + * global queue. Reduce the respective counters. */ +void UA_Notification_dequeue(UA_Server *server, UA_Notification *n); + +/* Delete the notification. Must be dequeued first. */ +void UA_Notification_delete(UA_Notification *n); + typedef TAILQ_HEAD(NotificationQueue, UA_Notification) NotificationQueue; struct UA_MonitoredItem { + UA_DelayedCallback delayedFreePointers; LIST_ENTRY(UA_MonitoredItem) listEntry; - UA_Subscription *subscription; + UA_Subscription *subscription; /* Local MonitoredItem if the subscription is NULL */ UA_UInt32 monitoredItemId; UA_UInt32 clientHandle; + UA_Boolean registered; /* Was the MonitoredItem registered in Userland with + the callback? */ /* Settings */ - UA_MonitoredItemType monitoredItemType; UA_TimestampsToReturn timestampsToReturn; UA_MonitoringMode monitoringMode; UA_NodeId monitoredNodeId; UA_UInt32 attributeId; UA_String indexRange; UA_Double samplingInterval; // [ms] - UA_UInt32 maxQueueSize; UA_Boolean discardOldest; - // TODO: dataEncoding is hardcoded to UA binary - UA_DataChangeFilter filter; + union { +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + UA_EventFilter eventFilter; /* If attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER */ +#endif + UA_DataChangeFilter dataChangeFilter; + } filter; UA_Variant lastValue; + // TODO: dataEncoding is hardcoded to UA binary /* Sample Callback */ UA_UInt64 sampleCallbackId; @@ -4324,18 +5843,33 @@ struct UA_MonitoredItem { /* Notification Queue */ NotificationQueue queue; + UA_UInt32 maxQueueSize; /* The max number of enqueued notifications (not + * counting overflow events) */ UA_UInt32 queueSize; + UA_UInt32 eventOverflows; /* Separate counter for the queue. Can at most + * double the queue size */ + +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + UA_MonitoredItem *next; +#endif + +#ifdef UA_ENABLE_DA + UA_StatusCode lastStatus; +#endif }; -UA_MonitoredItem * UA_MonitoredItem_new(UA_MonitoredItemType); -void MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem); -void UA_MonitoredItem_SampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem); -UA_StatusCode MonitoredItem_registerSampleCallback(UA_Server *server, UA_MonitoredItem *mon); -UA_StatusCode MonitoredItem_unregisterSampleCallback(UA_Server *server, UA_MonitoredItem *mon); +void UA_MonitoredItem_init(UA_MonitoredItem *mon, UA_Subscription *sub); +void UA_MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem); +void UA_MonitoredItem_sampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem); +UA_StatusCode UA_MonitoredItem_registerSampleCallback(UA_Server *server, UA_MonitoredItem *mon); +void UA_MonitoredItem_unregisterSampleCallback(UA_Server *server, UA_MonitoredItem *mon); /* Remove entries until mon->maxQueueSize is reached. Sets infobits for lost * data if required. */ -void MonitoredItem_ensureQueueSpace(UA_MonitoredItem *mon); +UA_StatusCode UA_MonitoredItem_ensureQueueSpace(UA_Server *server, UA_MonitoredItem *mon); + +UA_StatusCode UA_MonitoredItem_removeNodeEventCallback(UA_Server *server, UA_Session *session, + UA_Node *node, void *data); /****************/ /* Subscription */ @@ -4358,6 +5892,7 @@ typedef enum { typedef TAILQ_HEAD(ListOfNotificationMessages, UA_NotificationMessageEntry) ListOfNotificationMessages; struct UA_Subscription { + UA_DelayedCallback delayedFreePointers; LIST_ENTRY(UA_Subscription) listEntry; UA_Session *session; UA_UInt32 subscriptionId; @@ -4382,13 +5917,21 @@ struct UA_Subscription { /* MonitoredItems */ UA_UInt32 lastMonitoredItemId; /* increase the identifiers */ - LIST_HEAD(UA_ListOfUAMonitoredItems, UA_MonitoredItem) monitoredItems; + LIST_HEAD(, UA_MonitoredItem) monitoredItems; UA_UInt32 monitoredItemsSize; /* Global list of notifications from the MonitoredItems */ NotificationQueue notificationQueue; - UA_UInt32 notificationQueueSize; - UA_UInt32 readyNotifications; /* Notifications to be sent out now (already late) */ + UA_UInt32 notificationQueueSize; /* Total queue size */ + UA_UInt32 dataChangeNotifications; + UA_UInt32 eventNotifications; + UA_UInt32 statusChangeNotifications; + + /* Notifications to be sent out now (already late). In a regular publish + * callback, all queued notifications are sent out. In a late publish + * response, only the notifications left from the last regular publish + * callback are sent. */ + UA_UInt32 readyNotifications; /* Retransmission Queue */ ListOfNotificationMessages retransmissionQueue; @@ -4398,8 +5941,8 @@ struct UA_Subscription { UA_Subscription * UA_Subscription_new(UA_Session *session, UA_UInt32 subscriptionId); void UA_Subscription_deleteMembers(UA_Server *server, UA_Subscription *sub); UA_StatusCode Subscription_registerPublishCallback(UA_Server *server, UA_Subscription *sub); -UA_StatusCode Subscription_unregisterPublishCallback(UA_Server *server, UA_Subscription *sub); -void UA_Subscription_addMonitoredItem(UA_Subscription *sub, UA_MonitoredItem *newMon); +void Subscription_unregisterPublishCallback(UA_Server *server, UA_Subscription *sub); +void UA_Subscription_addMonitoredItem(UA_Server *server, UA_Subscription *sub, UA_MonitoredItem *newMon); UA_MonitoredItem * UA_Subscription_getMonitoredItem(UA_Subscription *sub, UA_UInt32 monitoredItemId); UA_StatusCode @@ -4407,18 +5950,23 @@ UA_Subscription_deleteMonitoredItem(UA_Server *server, UA_Subscription *sub, UA_UInt32 monitoredItemId); void UA_Subscription_publish(UA_Server *server, UA_Subscription *sub); -UA_StatusCode UA_Subscription_removeRetransmissionMessage(UA_Subscription *sub, UA_UInt32 sequenceNumber); +UA_StatusCode UA_Subscription_removeRetransmissionMessage(UA_Subscription *sub, + UA_UInt32 sequenceNumber); void UA_Subscription_answerPublishRequestsNoSubscription(UA_Server *server, UA_Session *session); UA_Boolean UA_Subscription_reachedPublishReqLimit(UA_Server *server, UA_Session *session); +#endif /* UA_ENABLE_SUBSCRIPTIONS */ + +_UA_END_DECLS + -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_session_manager.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_session_manager.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2014, 2017 (c) Florian Palm * Copyright 2015 (c) Sten Grüner * Copyright 2015 (c) Oleksiy Vasylyev @@ -4426,12 +5974,12 @@ UA_Boolean UA_Subscription_reachedPublishReqLimit(UA_Server *server, UA_Session */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS + typedef struct session_list_entry { + UA_DelayedCallback cleanupCallback; LIST_ENTRY(session_list_entry) pointers; UA_Session session; } session_list_entry; @@ -4467,32 +6015,30 @@ UA_SessionManager_getSessionByToken(UA_SessionManager *sm, const UA_NodeId *toke UA_Session * UA_SessionManager_getSessionById(UA_SessionManager *sm, const UA_NodeId *sessionId); -#ifdef __cplusplus -} // extern "C" -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_securechannel_manager.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_securechannel_manager.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2014, 2017 (c) Florian Palm * Copyright 2015 (c) Oleksiy Vasylyev * Copyright 2017 (c) Stefan Profanter, fortiss GmbH */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS + typedef struct channel_entry { - UA_SecureChannel channel; + UA_DelayedCallback cleanupCallback; TAILQ_ENTRY(channel_entry) pointers; + UA_SecureChannel channel; } channel_entry; typedef struct { @@ -4537,355 +6083,845 @@ UA_SecureChannelManager_get(UA_SecureChannelManager *cm, UA_UInt32 channelId); UA_StatusCode UA_SecureChannelManager_close(UA_SecureChannelManager *cm, UA_UInt32 channelId); -#ifdef __cplusplus -} // extern "C" -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_server_internal.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/pubsub/ua_pubsub_networkmessage.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2014, 2017 (c) Florian Palm - * Copyright 2015-2016 (c) Sten Grüner - * Copyright 2015 (c) Chris Iatrou - * Copyright 2015-2016 (c) Oleksiy Vasylyev - * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) Julian Grothoff + * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Tino Bischoff) */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS -#ifdef UA_ENABLE_MULTITHREADING +/* DataSet Payload Header */ +typedef struct { + UA_Byte count; + UA_UInt16* dataSetWriterIds; +} UA_DataSetPayloadHeader; -#include +/* FieldEncoding Enum */ +typedef enum { + UA_FIELDENCODING_VARIANT = 0, + UA_FIELDENCODING_RAWDATA = 1, + UA_FIELDENCODING_DATAVALUE = 2 +} UA_FieldEncoding; -struct UA_Worker; -typedef struct UA_Worker UA_Worker; +/* DataSetMessage Type */ +typedef enum { + UA_DATASETMESSAGE_DATAKEYFRAME = 0, + UA_DATASETMESSAGE_DATADELTAFRAME = 1, + UA_DATASETMESSAGE_EVENT = 2, + UA_DATASETMESSAGE_KEEPALIVE = 3 +} UA_DataSetMessageType; -struct UA_WorkerCallback; -typedef struct UA_WorkerCallback UA_WorkerCallback; +/* DataSetMessage Header */ +typedef struct { + UA_Boolean dataSetMessageValid; + UA_FieldEncoding fieldEncoding; + UA_Boolean dataSetMessageSequenceNrEnabled; + UA_Boolean timestampEnabled; + UA_Boolean statusEnabled; + UA_Boolean configVersionMajorVersionEnabled; + UA_Boolean configVersionMinorVersionEnabled; + UA_DataSetMessageType dataSetMessageType; + UA_Boolean picoSecondsIncluded; + UA_UInt16 dataSetMessageSequenceNr; + UA_UtcTime timestamp; + UA_UInt16 picoSeconds; + UA_UInt16 status; + UA_UInt32 configVersionMajorVersion; + UA_UInt32 configVersionMinorVersion; +} UA_DataSetMessageHeader; -SIMPLEQ_HEAD(UA_DispatchQueue, UA_WorkerCallback); -typedef struct UA_DispatchQueue UA_DispatchQueue; +UA_StatusCode +UA_DataSetMessageHeader_encodeBinary(const UA_DataSetMessageHeader* src, + UA_Byte **bufPos, const UA_Byte *bufEnd); -#endif /* UA_ENABLE_MULTITHREADING */ +UA_StatusCode +UA_DataSetMessageHeader_decodeBinary(const UA_ByteString *src, size_t *offset, + UA_DataSetMessageHeader* dst); -#ifdef UA_ENABLE_DISCOVERY +size_t +UA_DataSetMessageHeader_calcSizeBinary(const UA_DataSetMessageHeader* p); -typedef struct registeredServer_list_entry { - LIST_ENTRY(registeredServer_list_entry) pointers; - UA_RegisteredServer registeredServer; - UA_DateTime lastSeen; -} registeredServer_list_entry; +/** + * DataSetMessage + * ^^^^^^^^^^^^^^ */ -typedef struct periodicServerRegisterCallback_entry { - LIST_ENTRY(periodicServerRegisterCallback_entry) pointers; - struct PeriodicServerRegisterCallback *callback; -} periodicServerRegisterCallback_entry; +typedef struct { + UA_UInt16 fieldCount; + UA_DataValue* dataSetFields; + /* Json keys for the dataSetFields: TODO: own dataSetMessageType for json? */ + UA_String* fieldNames; +} UA_DataSetMessage_DataKeyFrameData; -#ifdef UA_ENABLE_DISCOVERY_MULTICAST +typedef struct { + UA_UInt16 fieldIndex; + UA_DataValue fieldValue; +} UA_DataSetMessage_DeltaFrameField; +typedef struct { + UA_UInt16 fieldCount; + UA_DataSetMessage_DeltaFrameField* deltaFrameFields; +} UA_DataSetMessage_DataDeltaFrameData; -typedef struct serverOnNetwork_list_entry { - LIST_ENTRY(serverOnNetwork_list_entry) pointers; - UA_ServerOnNetwork serverOnNetwork; - UA_DateTime created; - UA_DateTime lastSeen; - UA_Boolean txtSet; - UA_Boolean srvSet; - char* pathTmp; -} serverOnNetwork_list_entry; +typedef struct { + UA_DataSetMessageHeader header; + union { + UA_DataSetMessage_DataKeyFrameData keyFrameData; + UA_DataSetMessage_DataDeltaFrameData deltaFrameData; + } data; +} UA_DataSetMessage; -#define SERVER_ON_NETWORK_HASH_PRIME 1009 -typedef struct serverOnNetwork_hash_entry { - serverOnNetwork_list_entry* entry; - struct serverOnNetwork_hash_entry* next; -} serverOnNetwork_hash_entry; +UA_StatusCode +UA_DataSetMessage_encodeBinary(const UA_DataSetMessage* src, UA_Byte **bufPos, + const UA_Byte *bufEnd); -#endif /* UA_ENABLE_DISCOVERY_MULTICAST */ -#endif /* UA_ENABLE_DISCOVERY */ +UA_StatusCode +UA_DataSetMessage_decodeBinary(const UA_ByteString *src, size_t *offset, + UA_DataSetMessage* dst); -struct UA_Server { - /* Meta */ - UA_DateTime startTime; +size_t +UA_DataSetMessage_calcSizeBinary(const UA_DataSetMessage* p); - /* Security */ - UA_SecureChannelManager secureChannelManager; - UA_SessionManager sessionManager; +void UA_DataSetMessage_free(const UA_DataSetMessage* p); -#ifdef UA_ENABLE_DISCOVERY - /* Discovery */ - LIST_HEAD(registeredServer_list, registeredServer_list_entry) registeredServers; // doubly-linked list of registered servers - size_t registeredServersSize; - LIST_HEAD(periodicServerRegisterCallback_list, periodicServerRegisterCallback_entry) periodicServerRegisterCallbacks; // doubly-linked list of current register callbacks - UA_Server_registerServerCallback registerServerCallback; - void* registerServerCallbackData; -# ifdef UA_ENABLE_DISCOVERY_MULTICAST - mdns_daemon_t *mdnsDaemon; -#ifdef _WIN32 - SOCKET mdnsSocket; -#else - int mdnsSocket; -#endif - UA_Boolean mdnsMainSrvAdded; -# ifdef UA_ENABLE_MULTITHREADING - pthread_t mdnsThread; - UA_Boolean mdnsRunning; -# endif +typedef struct { + UA_UInt16* sizes; + UA_DataSetMessage* dataSetMessages; +} UA_DataSetPayload; - LIST_HEAD(serverOnNetwork_list, serverOnNetwork_list_entry) serverOnNetwork; // doubly-linked list of servers on the network (from mDNS) - size_t serverOnNetworkSize; - UA_UInt32 serverOnNetworkRecordIdCounter; - UA_DateTime serverOnNetworkRecordIdLastReset; - // hash mapping domain name to serverOnNetwork list entry - struct serverOnNetwork_hash_entry* serverOnNetworkHash[SERVER_ON_NETWORK_HASH_PRIME]; +typedef enum { + UA_PUBLISHERDATATYPE_BYTE = 0, + UA_PUBLISHERDATATYPE_UINT16 = 1, + UA_PUBLISHERDATATYPE_UINT32 = 2, + UA_PUBLISHERDATATYPE_UINT64 = 3, + UA_PUBLISHERDATATYPE_STRING = 4 +} UA_PublisherIdDatatype; - UA_Server_serverOnNetworkCallback serverOnNetworkCallback; - void* serverOnNetworkCallbackData; +typedef enum { + UA_NETWORKMESSAGE_DATASET = 0, + UA_NETWORKMESSAGE_DISCOVERY_REQUEST = 1, + UA_NETWORKMESSAGE_DISCOVERY_RESPONSE = 2 +} UA_NetworkMessageType; -# endif -#endif +/** + * UA_NetworkMessageGroupHeader + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ +typedef struct { + UA_Boolean writerGroupIdEnabled; + UA_Boolean groupVersionEnabled; + UA_Boolean networkMessageNumberEnabled; + UA_Boolean sequenceNumberEnabled; + UA_UInt16 writerGroupId; + UA_UInt32 groupVersion; // spec: type "VersionTime" + UA_UInt16 networkMessageNumber; + UA_UInt16 sequenceNumber; +} UA_NetworkMessageGroupHeader; - /* Namespaces */ - size_t namespacesSize; - UA_String *namespaces; +/** + * UA_NetworkMessageSecurityHeader + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ +typedef struct { + UA_Boolean networkMessageSigned; + UA_Boolean networkMessageEncrypted; + UA_Boolean securityFooterEnabled; + UA_Boolean forceKeyReset; + UA_UInt32 securityTokenId; // spec: IntegerId + UA_Byte nonceLength; + UA_ByteString messageNonce; + UA_UInt16 securityFooterSize; +} UA_NetworkMessageSecurityHeader; - /* Callbacks with a repetition interval */ - UA_Timer timer; +/** + * UA_NetworkMessage + * ^^^^^^^^^^^^^^^^^ */ +typedef struct { + UA_Byte version; + UA_Boolean messageIdEnabled; + UA_String messageId; /* For Json NetworkMessage */ + UA_Boolean publisherIdEnabled; + UA_Boolean groupHeaderEnabled; + UA_Boolean payloadHeaderEnabled; + UA_PublisherIdDatatype publisherIdType; + UA_Boolean dataSetClassIdEnabled; + UA_Boolean securityEnabled; + UA_Boolean timestampEnabled; + UA_Boolean picosecondsEnabled; + UA_Boolean chunkMessage; + UA_Boolean promotedFieldsEnabled; + UA_NetworkMessageType networkMessageType; + union { + UA_Byte publisherIdByte; + UA_UInt16 publisherIdUInt16; + UA_UInt32 publisherIdUInt32; + UA_UInt64 publisherIdUInt64; + UA_Guid publisherIdGuid; + UA_String publisherIdString; + } publisherId; + UA_Guid dataSetClassId; - /* Delayed callbacks */ - SLIST_HEAD(DelayedCallbacksList, UA_DelayedCallback) delayedCallbacks; + UA_NetworkMessageGroupHeader groupHeader; - /* Worker threads */ -#ifdef UA_ENABLE_MULTITHREADING - UA_Worker *workers; /* there are nThread workers in a running server */ - UA_DispatchQueue dispatchQueue; /* Dispatch queue for the worker threads */ - pthread_mutex_t dispatchQueue_accessMutex; /* mutex for access to queue */ - pthread_cond_t dispatchQueue_condition; /* so the workers don't spin if the queue is empty */ - pthread_mutex_t dispatchQueue_conditionMutex; /* mutex for access to condition variable */ + union { + UA_DataSetPayloadHeader dataSetPayloadHeader; + } payloadHeader; + + UA_DateTime timestamp; + UA_UInt16 picoseconds; + UA_UInt16 promotedFieldsSize; + UA_Variant* promotedFields; /* BaseDataType */ + + UA_NetworkMessageSecurityHeader securityHeader; + + union { + UA_DataSetPayload dataSetPayload; + } payload; + + UA_ByteString securityFooter; + UA_ByteString signature; +} UA_NetworkMessage; + +UA_StatusCode +UA_NetworkMessage_encodeBinary(const UA_NetworkMessage* src, + UA_Byte **bufPos, const UA_Byte *bufEnd); + +UA_StatusCode +UA_NetworkMessage_decodeBinary(const UA_ByteString *src, size_t *offset, + UA_NetworkMessage* dst); + +size_t +UA_NetworkMessage_calcSizeBinary(const UA_NetworkMessage* p); + +void +UA_NetworkMessage_deleteMembers(UA_NetworkMessage* p); + +#define UA_NetworkMessage_clear(p) UA_NetworkMessage_deleteMembers(p) + +void +UA_NetworkMessage_delete(UA_NetworkMessage* p); + + +#ifdef UA_ENABLE_JSON_ENCODING +UA_StatusCode +UA_NetworkMessage_encodeJson(const UA_NetworkMessage *src, + UA_Byte **bufPos, const UA_Byte **bufEnd, UA_String *namespaces, + size_t namespaceSize, UA_String *serverUris, + size_t serverUriSize, UA_Boolean useReversible); + +size_t +UA_NetworkMessage_calcSizeJson(const UA_NetworkMessage *src, + UA_String *namespaces, size_t namespaceSize, + UA_String *serverUris, size_t serverUriSize, + UA_Boolean useReversible); + +UA_StatusCode UA_NetworkMessage_decodeJson(UA_NetworkMessage *dst, const UA_ByteString *src); #endif - /* For bootstrapping, omit some consistency checks, creating a reference to - * the parent and member instantiation */ - UA_Boolean bootstrapNS0; +_UA_END_DECLS - /* Config */ - UA_ServerConfig config; - /* Local access to the services (for startup and maintenance) uses this - * Session with all possible access rights (Session Id: 1) */ - UA_Session adminSession; -}; +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/pubsub/ua_pubsub.h" ***********************************/ -/*****************/ -/* Node Handling */ -/*****************/ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner) + * Copyright (c) 2019 Kalycito Infotech Private Limited + */ -#define UA_Nodestore_get(SERVER, NODEID) \ - (SERVER)->config.nodestore.getNode((SERVER)->config.nodestore.context, NODEID) -#define UA_Nodestore_release(SERVER, NODEID) \ - (SERVER)->config.nodestore.releaseNode((SERVER)->config.nodestore.context, NODEID) -#define UA_Nodestore_new(SERVER, NODECLASS) \ - (SERVER)->config.nodestore.newNode((SERVER)->config.nodestore.context, NODECLASS) -#define UA_Nodestore_getCopy(SERVER, NODEID, OUTNODE) \ - (SERVER)->config.nodestore.getNodeCopy((SERVER)->config.nodestore.context, NODEID, OUTNODE) +_UA_BEGIN_DECLS -#define UA_Nodestore_insert(SERVER, NODE, OUTNODEID) \ - (SERVER)->config.nodestore.insertNode((SERVER)->config.nodestore.context, NODE, OUTNODEID) +#ifdef UA_ENABLE_PUBSUB /* conditional compilation */ -#define UA_Nodestore_delete(SERVER, NODE) \ - (SERVER)->config.nodestore.deleteNode((SERVER)->config.nodestore.context, NODE) +/* forward declarations */ +struct UA_WriterGroup; +typedef struct UA_WriterGroup UA_WriterGroup; -#define UA_Nodestore_remove(SERVER, NODEID) \ - (SERVER)->config.nodestore.removeNode((SERVER)->config.nodestore.context, NODEID) +/* Declaration for ReaderGroup */ +struct UA_ReaderGroup; +typedef struct UA_ReaderGroup UA_ReaderGroup; -/* Calls the callback with the node retrieved from the nodestore on top of the - * stack. Either a copy or the original node for in-situ editing. Depends on - * multithreading and the nodestore.*/ -typedef UA_StatusCode (*UA_EditNodeCallback)(UA_Server*, UA_Session*, - UA_Node *node, void*); -UA_StatusCode UA_Server_editNode(UA_Server *server, UA_Session *session, - const UA_NodeId *nodeId, - UA_EditNodeCallback callback, - void *data); +/* The configuration structs (public part of PubSub entities) are defined in include/ua_plugin_pubsub.h */ -/*************/ -/* Callbacks */ -/*************/ +/**********************************************/ +/* PublishedDataSet */ +/**********************************************/ +typedef struct{ + UA_PublishedDataSetConfig config; + UA_DataSetMetaDataType dataSetMetaData; + LIST_HEAD(UA_ListOfDataSetField, UA_DataSetField) fields; + UA_NodeId identifier; + UA_UInt16 fieldSize; + UA_UInt16 promotedFieldsCount; +} UA_PublishedDataSet; -/* Delayed callbacks are executed when all previously dispatched callbacks are - * finished */ UA_StatusCode -UA_Server_delayedCallback(UA_Server *server, UA_ServerCallback callback, void *data); +UA_PublishedDataSetConfig_copy(const UA_PublishedDataSetConfig *src, UA_PublishedDataSetConfig *dst); +UA_PublishedDataSet * +UA_PublishedDataSet_findPDSbyId(UA_Server *server, UA_NodeId identifier); +void +UA_PublishedDataSet_deleteMembers(UA_Server *server, UA_PublishedDataSet *publishedDataSet); + +/**********************************************/ +/* Connection */ +/**********************************************/ +//the connection config (public part of connection) object is defined in include/ua_plugin_pubsub.h +typedef struct{ + UA_PubSubConnectionConfig *config; + //internal fields + UA_PubSubChannel *channel; + UA_NodeId identifier; + LIST_HEAD(UA_ListOfWriterGroup, UA_WriterGroup) writerGroups; + LIST_HEAD(UA_ListOfPubSubReaderGroup, UA_ReaderGroup) readerGroups; + size_t readerGroupsSize; +} UA_PubSubConnection; UA_StatusCode -UA_Server_delayedFree(UA_Server *server, void *data); +UA_PubSubConnectionConfig_copy(const UA_PubSubConnectionConfig *src, UA_PubSubConnectionConfig *dst); +UA_PubSubConnection * +UA_PubSubConnection_findConnectionbyId(UA_Server *server, UA_NodeId connectionIdentifier); +void +UA_PubSubConnectionConfig_deleteMembers(UA_PubSubConnectionConfig *connectionConfig); +void +UA_PubSubConnection_deleteMembers(UA_Server *server, UA_PubSubConnection *connection); -#ifndef UA_ENABLE_MULTITHREADING -/* Execute all delayed callbacks regardless of whether the worker threads have - * finished previous work */ -void UA_Server_cleanupDelayedCallbacks(UA_Server *server); -#else -void UA_Server_cleanupDispatchQueue(UA_Server *server); +/**********************************************/ +/* DataSetWriter */ +/**********************************************/ + +#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES +typedef struct UA_DataSetWriterSample{ + UA_Boolean valueChanged; + UA_DataValue value; +} UA_DataSetWriterSample; #endif -/* Callback is executed in the same thread or, if possible, dispatched to one of - * the worker threads. */ -void -UA_Server_workerCallback(UA_Server *server, UA_ServerCallback callback, void *data); +typedef struct UA_DataSetWriter{ + UA_DataSetWriterConfig config; + //internal fields + LIST_ENTRY(UA_DataSetWriter) listEntry; + UA_NodeId identifier; + UA_NodeId linkedWriterGroup; + UA_NodeId connectedDataSet; + UA_ConfigurationVersionDataType connectedDataSetVersion; +#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES + UA_UInt16 deltaFrameCounter; //actual count of sent deltaFrames + size_t lastSamplesCount; + UA_DataSetWriterSample *lastSamples; +#endif + UA_UInt16 actualDataSetMessageSequenceCount; +} UA_DataSetWriter; -/*********************/ -/* Utility Functions */ -/*********************/ +UA_StatusCode +UA_DataSetWriterConfig_copy(const UA_DataSetWriterConfig *src, UA_DataSetWriterConfig *dst); +UA_DataSetWriter * +UA_DataSetWriter_findDSWbyId(UA_Server *server, UA_NodeId identifier); + +/**********************************************/ +/* WriterGroup */ +/**********************************************/ + +struct UA_WriterGroup{ + UA_WriterGroupConfig config; + //internal fields + LIST_ENTRY(UA_WriterGroup) listEntry; + UA_NodeId identifier; + UA_NodeId linkedConnection; + LIST_HEAD(UA_ListOfDataSetWriter, UA_DataSetWriter) writers; + UA_UInt32 writersCount; + UA_UInt64 publishCallbackId; + UA_Boolean publishCallbackIsRegistered; +}; -/* A few global NodeId definitions */ -extern const UA_NodeId subtypeId; +UA_StatusCode +UA_WriterGroupConfig_copy(const UA_WriterGroupConfig *src, UA_WriterGroupConfig *dst); +UA_WriterGroup * +UA_WriterGroup_findWGbyId(UA_Server *server, UA_NodeId identifier); + +/**********************************************/ +/* DataSetField */ +/**********************************************/ + +typedef struct UA_DataSetField{ + UA_DataSetFieldConfig config; + //internal fields + LIST_ENTRY(UA_DataSetField) listEntry; + UA_NodeId identifier; + UA_NodeId publishedDataSet; //ref to parent pds + UA_FieldMetaData fieldMetaData; + UA_UInt64 sampleCallbackId; + UA_Boolean sampleCallbackIsRegistered; +} UA_DataSetField; UA_StatusCode -UA_NumericRange_parseFromString(UA_NumericRange *range, const UA_String *str); +UA_DataSetFieldConfig_copy(const UA_DataSetFieldConfig *src, UA_DataSetFieldConfig *dst); +UA_DataSetField * +UA_DataSetField_findDSFbyId(UA_Server *server, UA_NodeId identifier); -UA_UInt16 addNamespace(UA_Server *server, const UA_String name); +/**********************************************/ +/* DataSetReader */ +/**********************************************/ -UA_Boolean -UA_Node_hasSubTypeOrInstances(const UA_Node *node); +/* SubscribedDataSetDataType Definition */ +typedef enum { + UA_PUBSUB_SDS_TARGET, + UA_PUBSUB_SDS_MIRROR +}UA_SubscribedDataSetEnumType; + +/* DataSetReader Type definition */ +typedef struct UA_DataSetReader { + UA_DataSetReaderConfig config; + /* implementation defined fields */ + UA_NodeId identifier; + UA_NodeId linkedReaderGroup; + LIST_ENTRY(UA_DataSetReader) listEntry; + UA_SubscribedDataSetEnumType subscribedDataSetType; + UA_TargetVariablesDataType subscribedDataSetTarget; + /* To Do UA_SubscribedDataSetMirrorDataType subscribedDataSetMirror */ +}UA_DataSetReader; + +/* Delete DataSetReader */ +void UA_DataSetReader_delete(UA_Server *server, UA_DataSetReader *dataSetReader); + +/* Process Network Message using DataSetReader */ +void UA_Server_DataSetReader_process(UA_Server *server, UA_DataSetReader *dataSetReader, UA_DataSetMessage* dataSetMsg); + +/* Copy the configuration of DataSetReader */ +UA_StatusCode UA_DataSetReaderConfig_copy(const UA_DataSetReaderConfig *src, UA_DataSetReaderConfig *dst); + +/* Add TargetVariables */ +UA_StatusCode +UA_Server_DataSetReader_addTargetVariables(UA_Server* server, UA_NodeId* parentNode, UA_NodeId dataSetReaderIdentifier, UA_SubscribedDataSetEnumType sdsType); + +/**********************************************/ +/* ReaderGroup */ +/**********************************************/ +/* ReaderGroup Type Definition*/ + +struct UA_ReaderGroup { + UA_ReaderGroupConfig config; + UA_NodeId identifier; + UA_NodeId linkedConnection; + LIST_ENTRY(UA_ReaderGroup) listEntry; + LIST_HEAD(UA_ListOfPubSubDataSetReader, UA_DataSetReader) readers; + /* for simplified information access */ + UA_UInt32 readersCount; + UA_UInt64 subscribeCallbackId; + UA_Boolean subscribeCallbackIsRegistered; +}; -/* Recursively searches "upwards" in the tree following specific reference types */ -UA_Boolean -isNodeInTree(UA_Nodestore *ns, const UA_NodeId *leafNode, - const UA_NodeId *nodeToFind, const UA_NodeId *referenceTypeIds, - size_t referenceTypeIdsSize); +/* Delete ReaderGroup */ +void UA_Server_ReaderGroup_delete(UA_Server *server, UA_ReaderGroup *readerGroup); -/* Returns an array with the hierarchy of type nodes. The returned array starts - * at the leaf and continues "upwards" in the hierarchy based on the - * ``hasSubType`` references. Since multiple-inheritance is possible in general, - * duplicate entries are removed. */ +/* Copy configuration of ReaderGroup */ UA_StatusCode -getTypeHierarchy(UA_Nodestore *ns, const UA_NodeId *leafType, - UA_NodeId **typeHierarchy, size_t *typeHierarchySize); +UA_ReaderGroupConfig_copy(const UA_ReaderGroupConfig *src, UA_ReaderGroupConfig *dst); -/* Returns the type node from the node on the stack top. The type node is pushed - * on the stack and returned. */ -const UA_Node * getNodeType(UA_Server *server, const UA_Node *node); +/* Process Network Message */ +UA_StatusCode +UA_Server_processNetworkMessage(UA_Server *server, UA_NetworkMessage* pMsg, UA_PubSubConnection *pConnection); -/* Many services come as an array of operations. This function generalizes the - * processing of the operations. */ -typedef void (*UA_ServiceOperation)(UA_Server *server, UA_Session *session, - void *context, - const void *requestOperation, - void *responseOperation); +/* Prototypes for internal util functions - some functions maybe removed later + *(currently moved from public to internal)*/ +UA_ReaderGroup *UA_ReaderGroup_findRGbyId(UA_Server *server, UA_NodeId identifier); +UA_DataSetReader *UA_ReaderGroup_findDSRbyId(UA_Server *server, UA_NodeId identifier); + +/*********************************************************/ +/* PublishValues handling */ +/*********************************************************/ UA_StatusCode -UA_Server_processServiceOperations(UA_Server *server, UA_Session *session, - UA_ServiceOperation operationCallback, - void *context, - const size_t *requestOperations, - const UA_DataType *requestOperationsType, - size_t *responseOperations, - const UA_DataType *responseOperationsType) - UA_FUNC_ATTR_WARN_UNUSED_RESULT; +UA_WriterGroup_addPublishCallback(UA_Server *server, UA_WriterGroup *writerGroup); +void +UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup); -/***************************************/ -/* Check Information Model Consistency */ -/***************************************/ +/*********************************************************/ +/* SubscribeValues handling */ +/*********************************************************/ UA_StatusCode -readValueAttribute(UA_Server *server, UA_Session *session, - const UA_VariableNode *vn, UA_DataValue *v); +UA_ReaderGroup_addSubscribeCallback(UA_Server *server, UA_ReaderGroup *readerGroup); +void +UA_ReaderGroup_subscribeCallback(UA_Server *server, UA_ReaderGroup *readerGroup); -/* Test whether the value matches a variable definition given by - * - datatype - * - valueranke - * - array dimensions. - * Sometimes it can be necessary to transform the content of the value, e.g. - * byte array to bytestring or uint32 to some enum. If editableValue is non-NULL, - * we try to create a matching variant that points to the original data. */ -UA_Boolean -compatibleValue(UA_Server *server, UA_Session *session, const UA_NodeId *targetDataTypeId, - UA_Int32 targetValueRank, size_t targetArrayDimensionsSize, - const UA_UInt32 *targetArrayDimensions, const UA_Variant *value, - const UA_NumericRange *range); +#endif /* UA_ENABLE_PUBSUB */ -UA_Boolean -compatibleArrayDimensions(size_t constraintArrayDimensionsSize, - const UA_UInt32 *constraintArrayDimensions, - size_t testArrayDimensionsSize, - const UA_UInt32 *testArrayDimensions); +_UA_END_DECLS -UA_Boolean -compatibleValueArrayDimensions(const UA_Variant *value, size_t targetArrayDimensionsSize, - const UA_UInt32 *targetArrayDimensions); -UA_Boolean -compatibleValueRankArrayDimensions(UA_Server *server, UA_Session *session, - UA_Int32 valueRank, size_t arrayDimensionsSize); +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/pubsub/ua_pubsub_manager.h" ***********************************/ -UA_Boolean -compatibleDataType(UA_Server *server, const UA_NodeId *dataType, - const UA_NodeId *constraintDataType, UA_Boolean isValue); +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner) + */ -UA_Boolean -compatibleValueRanks(UA_Int32 valueRank, UA_Int32 constraintValueRank); -void -Operation_Browse(UA_Server *server, UA_Session *session, UA_UInt32 *maxrefs, - const UA_BrowseDescription *descr, UA_BrowseResult *result); -UA_DataValue -UA_Server_readWithSession(UA_Server *server, UA_Session *session, - const UA_ReadValueId *item, - UA_TimestampsToReturn timestampsToReturn); -/* Checks if a registration timed out and removes that registration. - * Should be called periodically in main loop */ -void UA_Discovery_cleanupTimedOut(UA_Server *server, UA_DateTime nowMonotonic); +_UA_BEGIN_DECLS -# ifdef UA_ENABLE_DISCOVERY_MULTICAST +#ifdef UA_ENABLE_PUBSUB /* conditional compilation */ -UA_StatusCode -initMulticastDiscoveryServer(UA_Server* server); +typedef struct UA_PubSubManager{ + //Connections and PublishedDataSets can exist alone (own lifecycle) -> top level components + size_t connectionsSize; + UA_PubSubConnection *connections; + size_t publishedDataSetsSize; + UA_PublishedDataSet *publishedDataSets; +} UA_PubSubManager; -void startMulticastDiscoveryServer(UA_Server *server); +void +UA_PubSubManager_delete(UA_Server *server, UA_PubSubManager *pubSubManager); -void stopMulticastDiscoveryServer(UA_Server *server); +void +UA_PubSubManager_generateUniqueNodeId(UA_Server *server, UA_NodeId *nodeId); + +UA_UInt32 +UA_PubSubConfigurationVersionTimeDifference(void); +/***********************************/ +/* PubSub Jobs abstraction */ +/***********************************/ UA_StatusCode -iterateMulticastDiscoveryServer(UA_Server* server, UA_DateTime *nextRepeat, - UA_Boolean processIn); +UA_PubSubManager_addRepeatedCallback(UA_Server *server, UA_ServerCallback callback, + void *data, UA_Double interval_ms, UA_UInt64 *callbackId); +UA_StatusCode +UA_PubSubManager_changeRepeatedCallbackInterval(UA_Server *server, UA_UInt64 callbackId, + UA_Double interval_ms); +void +UA_PubSubManager_removeRepeatedPubSubCallback(UA_Server *server, UA_UInt64 callbackId); -void destroyMulticastDiscoveryServer(UA_Server* server); +#endif /* UA_ENABLE_PUBSUB */ -typedef enum { - UA_DISCOVERY_TCP, /* OPC UA TCP mapping */ - UA_DISCOVERY_TLS /* OPC UA HTTPS mapping */ -} UA_DiscoveryProtocol; +_UA_END_DECLS -/* Send a multicast probe to find any other OPC UA server on the network through mDNS. */ -UA_StatusCode -UA_Discovery_multicastQuery(UA_Server* server); + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/pubsub/ua_pubsub_ns0.h" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner) + * Copyright (c) 2019 Kalycito Infotech Private Limited + */ + +#ifndef UA_PUBSUB_NS0_H_ +#define UA_PUBSUB_NS0_H_ + + +_UA_BEGIN_DECLS + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL /* conditional compilation */ UA_StatusCode -UA_Discovery_addRecord(UA_Server *server, const UA_String *servername, - const UA_String *hostname, UA_UInt16 port, - const UA_String *path, const UA_DiscoveryProtocol protocol, - UA_Boolean createTxt, const UA_String* capabilites, - size_t *capabilitiesSize); -UA_StatusCode -UA_Discovery_removeRecord(UA_Server *server, const UA_String *servername, - const UA_String *hostname, UA_UInt16 port, - UA_Boolean removeTxt); +UA_Server_initPubSubNS0(UA_Server *server); -# endif +UA_StatusCode +addPubSubConnectionRepresentation(UA_Server *server, UA_PubSubConnection *connection); + +UA_StatusCode +removePubSubConnectionRepresentation(UA_Server *server, UA_PubSubConnection *connection); + +UA_StatusCode +addWriterGroupRepresentation(UA_Server *server, UA_WriterGroup *writerGroup); + +UA_StatusCode +addReaderGroupRepresentation(UA_Server *server, UA_ReaderGroup *readerGroup); + +UA_StatusCode +removeGroupRepresentation(UA_Server *server, UA_WriterGroup *writerGroup); + +UA_StatusCode +addDataSetWriterRepresentation(UA_Server *server, UA_DataSetWriter *dataSetWriter); + +UA_StatusCode +removeDataSetWriterRepresentation(UA_Server *server, UA_DataSetWriter *dataSetWriter); + +UA_StatusCode +addPublishedDataItemsRepresentation(UA_Server *server, UA_PublishedDataSet *publishedDataSet); + +UA_StatusCode +removePublishedDataSetRepresentation(UA_Server *server, UA_PublishedDataSet *publishedDataSet); + +UA_StatusCode +addDataSetReaderRepresentation(UA_Server *server, UA_DataSetReader *dataSetReader); + +UA_StatusCode +removeDataSetReaderRepresentation(UA_Server *server, UA_DataSetReader *dataSetReader); + +#endif /* UA_ENABLE_PUBSUB_INFORMATIONMODEL */ + +_UA_END_DECLS + +#endif /* UA_PUBSUB_NS0_H_ */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_server_internal.h" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2014, 2017 (c) Florian Palm + * Copyright 2015-2016 (c) Sten Grüner + * Copyright 2015 (c) Chris Iatrou + * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Julian Grothoff + * Copyright 2019 (c) Kalycito Infotech Private Limited + */ + + + + +_UA_BEGIN_DECLS + +#ifdef UA_ENABLE_PUBSUB +#endif + +#ifdef UA_ENABLE_DISCOVERY +#endif + +#ifdef UA_ENABLE_SUBSCRIPTIONS + +typedef struct { + UA_MonitoredItem monitoredItem; + void *context; + union { + UA_Server_DataChangeNotificationCallback dataChangeCallback; + /* UA_Server_EventNotificationCallback eventCallback; */ + } callback; +} UA_LocalMonitoredItem; + +#endif + +typedef enum { + UA_SERVERLIFECYCLE_FRESH, + UA_SERVERLIFECYLE_RUNNING +} UA_ServerLifecycle; + +struct UA_Server { + /* Config */ + UA_ServerConfig config; + UA_DateTime startTime; + UA_DateTime endTime; /* Zeroed out. If a time is set, then the server shuts + * down once the time has been reached */ + + /* Nodestore */ + void *nsCtx; + + UA_ServerLifecycle state; + + /* Security */ + UA_SecureChannelManager secureChannelManager; + UA_SessionManager sessionManager; + UA_Session adminSession; /* Local access to the services (for startup and + * maintenance) uses this Session with all possible + * access rights (Session Id: 1) */ + + /* Namespaces */ + size_t namespacesSize; + UA_String *namespaces; + + /* Callbacks with a repetition interval */ + UA_Timer timer; + + /* WorkQueue and worker threads */ + UA_WorkQueue workQueue; + + /* For bootstrapping, omit some consistency checks, creating a reference to + * the parent and member instantiation */ + UA_Boolean bootstrapNS0; + + /* Discovery */ +#ifdef UA_ENABLE_DISCOVERY + UA_DiscoveryManager discoveryManager; +#endif + + /* DataChange Subscriptions */ +#ifdef UA_ENABLE_SUBSCRIPTIONS + /* Num active subscriptions */ + UA_UInt32 numSubscriptions; + /* Num active monitored items */ + UA_UInt32 numMonitoredItems; + /* To be cast to UA_LocalMonitoredItem to get the callback and context */ + LIST_HEAD(LocalMonitoredItems, UA_MonitoredItem) localMonitoredItems; + UA_UInt32 lastLocalMonitoredItemId; + UA_UInt32 lastSubscriptionId; +#endif + + /* Publish/Subscribe */ +#ifdef UA_ENABLE_PUBSUB + UA_PubSubManager pubSubManager; +#endif +}; + +/*****************/ +/* Node Handling */ +/*****************/ + +/* Deletes references from the node which are not matching any type in the given + * array. Could be used to e.g. delete all the references, except + * 'HASMODELINGRULE' */ +void UA_Node_deleteReferencesSubset(UA_Node *node, size_t referencesSkipSize, + UA_NodeId* referencesSkip); + +/* Calls the callback with the node retrieved from the nodestore on top of the + * stack. Either a copy or the original node for in-situ editing. Depends on + * multithreading and the nodestore.*/ +typedef UA_StatusCode (*UA_EditNodeCallback)(UA_Server*, UA_Session*, + UA_Node *node, void*); +UA_StatusCode UA_Server_editNode(UA_Server *server, UA_Session *session, + const UA_NodeId *nodeId, + UA_EditNodeCallback callback, + void *data); + +/*********************/ +/* Utility Functions */ +/*********************/ + +/* A few global NodeId definitions */ +extern const UA_NodeId subtypeId; +extern const UA_NodeId hierarchicalReferences; + +void setupNs1Uri(UA_Server *server); +UA_UInt16 addNamespace(UA_Server *server, const UA_String name); + +UA_Boolean +UA_Node_hasSubTypeOrInstances(const UA_Node *node); + +/* Recursively searches "upwards" in the tree following specific reference types */ +UA_Boolean +isNodeInTree(void *nsCtx, const UA_NodeId *leafNode, + const UA_NodeId *nodeToFind, const UA_NodeId *referenceTypeIds, + size_t referenceTypeIdsSize); + +/* Returns an array with the hierarchy of nodes. The start nodes can be returned + * as well. The returned array starts at the leaf and continues "upwards" or + * "downwards". Duplicate entries are removed. The parameter `walkDownwards` + * indicates the direction of search. */ +UA_StatusCode +browseRecursive(UA_Server *server, + size_t startNodesSize, const UA_NodeId *startNodes, + size_t refTypesSize, const UA_NodeId *refTypes, + UA_BrowseDirection browseDirection, UA_Boolean includeStartNodes, + size_t *resultsSize, UA_ExpandedNodeId **results); + +/* If refTypes is non-NULL, tries to realloc and increase the length */ +UA_StatusCode +referenceSubtypes(UA_Server *server, const UA_NodeId *refType, + size_t *refTypesSize, UA_NodeId **refTypes); + +/* Returns the recursive type and interface hierarchy of the node */ +UA_StatusCode +getParentTypeAndInterfaceHierarchy(UA_Server *server, const UA_NodeId *typeNode, + UA_NodeId **typeHierarchy, size_t *typeHierarchySize); + +/* Returns the type node from the node on the stack top. The type node is pushed + * on the stack and returned. */ +const UA_Node * getNodeType(UA_Server *server, const UA_Node *node); + +/* Write a node attribute with a defined session */ +UA_StatusCode +UA_Server_writeWithSession(UA_Server *server, UA_Session *session, + const UA_WriteValue *value); + + +/* Many services come as an array of operations. This function generalizes the + * processing of the operations. */ +typedef void (*UA_ServiceOperation)(UA_Server *server, UA_Session *session, + const void *context, + const void *requestOperation, + void *responseOperation); + +UA_StatusCode +UA_Server_processServiceOperations(UA_Server *server, UA_Session *session, + UA_ServiceOperation operationCallback, + const void *context, + const size_t *requestOperations, + const UA_DataType *requestOperationsType, + size_t *responseOperations, + const UA_DataType *responseOperationsType) + UA_FUNC_ATTR_WARN_UNUSED_RESULT; + +/***************************************/ +/* Check Information Model Consistency */ +/***************************************/ + +/* Read a node attribute in the context of a "checked-out" node. So the + * attribute will not be copied when possible. The variant then points into the + * node and has UA_VARIANT_DATA_NODELETE set. */ +void +ReadWithNode(const UA_Node *node, UA_Server *server, UA_Session *session, + UA_TimestampsToReturn timestampsToReturn, + const UA_ReadValueId *id, UA_DataValue *v); + +UA_StatusCode +readValueAttribute(UA_Server *server, UA_Session *session, + const UA_VariableNode *vn, UA_DataValue *v); + +/* Test whether the value matches a variable definition given by + * - datatype + * - valueranke + * - array dimensions. + * Sometimes it can be necessary to transform the content of the value, e.g. + * byte array to bytestring or uint32 to some enum. If editableValue is non-NULL, + * we try to create a matching variant that points to the original data. */ +UA_Boolean +compatibleValue(UA_Server *server, UA_Session *session, const UA_NodeId *targetDataTypeId, + UA_Int32 targetValueRank, size_t targetArrayDimensionsSize, + const UA_UInt32 *targetArrayDimensions, const UA_Variant *value, + const UA_NumericRange *range); + +UA_Boolean +compatibleArrayDimensions(size_t constraintArrayDimensionsSize, + const UA_UInt32 *constraintArrayDimensions, + size_t testArrayDimensionsSize, + const UA_UInt32 *testArrayDimensions); + +UA_Boolean +compatibleValueArrayDimensions(const UA_Variant *value, size_t targetArrayDimensionsSize, + const UA_UInt32 *targetArrayDimensions); + +UA_Boolean +compatibleValueRankArrayDimensions(UA_Server *server, UA_Session *session, + UA_Int32 valueRank, size_t arrayDimensionsSize); + +UA_Boolean +compatibleDataType(UA_Server *server, const UA_NodeId *dataType, + const UA_NodeId *constraintDataType, UA_Boolean isValue); + +UA_Boolean +compatibleValueRanks(UA_Int32 valueRank, UA_Int32 constraintValueRank); + +struct BrowseOpts { + UA_UInt32 maxReferences; + UA_Boolean recursive; +}; + +void +Operation_Browse(UA_Server *server, UA_Session *session, const UA_UInt32 *maxrefs, + const UA_BrowseDescription *descr, UA_BrowseResult *result); + +UA_DataValue +UA_Server_readWithSession(UA_Server *server, UA_Session *session, + const UA_ReadValueId *item, + UA_TimestampsToReturn timestampsToReturn); /*****************************/ /* AddNodes Begin and Finish */ @@ -4893,15 +6929,18 @@ UA_Discovery_removeRecord(UA_Server *server, const UA_String *servername, /* Creates a new node in the nodestore. */ UA_StatusCode -Operation_addNode_begin(UA_Server *server, UA_Session *session, void *nodeContext, - const UA_AddNodesItem *item, const UA_NodeId *parentNodeId, - const UA_NodeId *referenceTypeId, - UA_NodeId *outNewNodeId); +AddNode_raw(UA_Server *server, UA_Session *session, void *nodeContext, + const UA_AddNodesItem *item, UA_NodeId *outNewNodeId); -/* Children, references, type-checking, constructors. */ +/* Check the reference to the parent node; Add references. */ UA_StatusCode -Operation_addNode_finish(UA_Server *server, UA_Session *session, - const UA_NodeId *nodeId); +AddNode_addRefs(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId, + const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId, + const UA_NodeId *typeDefinitionId); + +/* Type-check type-definition; Run the constructors */ +UA_StatusCode +AddNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId); /**********************/ /* Create Namespace 0 */ @@ -4909,18 +6948,19 @@ Operation_addNode_finish(UA_Server *server, UA_Session *session, UA_StatusCode UA_Server_initNS0(UA_Server *server); -#ifdef __cplusplus -} // extern "C" -#endif +UA_StatusCode writeNs0VariableArray(UA_Server *server, UA_UInt32 id, void *v, + size_t length, const UA_DataType *type); + +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_services.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_services.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2014-2017 (c) Florian Palm * Copyright 2015 (c) Sten Grüner * Copyright 2014 (c) LEvertz @@ -4931,11 +6971,10 @@ UA_StatusCode UA_Server_initNS0(UA_Server *server); */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS + /** * .. _services: * @@ -4962,9 +7001,6 @@ extern "C" { typedef void (*UA_Service)(UA_Server*, UA_Session*, const void *request, void *response); -typedef UA_StatusCode (*UA_InSituService)(UA_Server*, UA_Session*, UA_MessageContext *mc, - const void *request, UA_ResponseHeader *rh); - /** * Discovery Service Set * --------------------- @@ -4997,7 +7033,7 @@ void Service_GetEndpoints(UA_Server *server, UA_Session *session, * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Returns the Servers known to a Discovery Server. Unlike FindServer, * this Service is only implemented by Discovery Servers. It additionally - * Returns servery which may have been detected trough Multicast */ + * returns servers which may have been detected through Multicast. */ void Service_FindServersOnNetwork(UA_Server *server, UA_Session *session, const UA_FindServersOnNetworkRequest *request, UA_FindServersOnNetworkResponse *response); @@ -5220,8 +7256,8 @@ void Service_UnregisterNodes(UA_Server *server, UA_Session *session, * elements are indexed, such as an array, this Service allows Clients to read * the entire set of indexed values as a composite, to read individual elements * or to read ranges of elements of the composite. */ -UA_StatusCode Service_Read(UA_Server *server, UA_Session *session, UA_MessageContext *mc, - const UA_ReadRequest *request, UA_ResponseHeader *responseHeader); +void Service_Read(UA_Server *server, UA_Session *session, + const UA_ReadRequest *request, UA_ReadResponse *response); /** * Write Service @@ -5231,8 +7267,7 @@ UA_StatusCode Service_Read(UA_Server *server, UA_Session *session, UA_MessageCon * the entire set of indexed values as a composite, to write individual elements * or to write ranges of elements of the composite. */ void Service_Write(UA_Server *server, UA_Session *session, - const UA_WriteRequest *request, - UA_WriteResponse *response); + const UA_WriteRequest *request, UA_WriteResponse *response); /** * HistoryRead Service @@ -5240,7 +7275,10 @@ void Service_Write(UA_Server *server, UA_Session *session, * Used to read historical values or Events of one or more Nodes. Servers may * make historical values available to Clients using this Service, although the * historical values themselves are not visible in the AddressSpace. */ -/* Not Implemented */ +#ifdef UA_ENABLE_HISTORIZING +void Service_HistoryRead(UA_Server *server, UA_Session *session, + const UA_HistoryReadRequest *request, + UA_HistoryReadResponse *response); /** * HistoryUpdate Service @@ -5248,7 +7286,11 @@ void Service_Write(UA_Server *server, UA_Session *session, * Used to update historical values or Events of one or more Nodes. Several * request parameters indicate how the Server is to update the historical value * or Event. Valid actions are Insert, Replace or Delete. */ -/* Not Implemented */ +void +Service_HistoryUpdate(UA_Server *server, UA_Session *session, + const UA_HistoryUpdateRequest *request, + UA_HistoryUpdateResponse *response); +#endif /** * .. _method-services: @@ -5264,9 +7306,13 @@ void Service_Write(UA_Server *server, UA_Session *session, * Used to call (invoke) a methods. Each method call is invoked within the * context of an existing Session. If the Session is terminated, the results of * the method's execution cannot be returned to the Client and are discarded. */ +#ifdef UA_ENABLE_METHODCALLS void Service_Call(UA_Server *server, UA_Session *session, const UA_CallRequest *request, UA_CallResponse *response); +#endif + +#ifdef UA_ENABLE_SUBSCRIPTIONS /** * MonitoredItem Service Set @@ -5396,74 +7442,19 @@ void Service_DeleteSubscriptions(UA_Server *server, UA_Session *session, * its Session. */ /* Not Implemented */ -#ifdef __cplusplus -} // extern "C" -#endif - - -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/build/src_generated/ua_namespace0.h" ***********************************/ - -/* WARNING: This is a generated file. - * Any manual changes will be overwritten. */ - -#ifndef UA_NAMESPACE0_H_ -#define UA_NAMESPACE0_H_ - - -#ifdef UA_NO_AMALGAMATION -#else - -/* The following declarations are in the open62541.c file so here's needed when compiling nodesets externally */ - -# ifndef UA_Nodestore_remove //this definition is needed to hide this code in the amalgamated .c file - -typedef UA_StatusCode (*UA_exchangeEncodeBuffer)(void *handle, UA_Byte **bufPos, - const UA_Byte **bufEnd); - -UA_StatusCode -UA_encodeBinary(const void *src, const UA_DataType *type, - UA_Byte **bufPos, const UA_Byte **bufEnd, - UA_exchangeEncodeBuffer exchangeCallback, - void *exchangeHandle) UA_FUNC_ATTR_WARN_UNUSED_RESULT; - -UA_StatusCode -UA_decodeBinary(const UA_ByteString *src, size_t *offset, void *dst, - const UA_DataType *type, size_t customTypesSize, - const UA_DataType *customTypes) UA_FUNC_ATTR_WARN_UNUSED_RESULT; - -size_t -UA_calcSizeBinary(void *p, const UA_DataType *type); - -const UA_DataType * -UA_findDataTypeByBinary(const UA_NodeId *typeId); - -# endif // UA_Nodestore_remove - -#endif - - - - -#ifdef __cplusplus -extern "C" { -#endif - -extern UA_StatusCode ua_namespace0(UA_Server *server); +#endif /* UA_ENABLE_SUBSCRIPTIONS */ -#ifdef __cplusplus -} -#endif +_UA_END_DECLS -#endif /* UA_NAMESPACE0_H_ */ -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/client/ua_client_internal.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/client/ua_client_internal.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2015-2016 (c) Sten Grüner - * Copyright 2015-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2015-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2015 (c) Oleksiy Vasylyev * Copyright 2016-2017 (c) Florian Palm * Copyright 2017 (c) Stefan Profanter, fortiss GmbH @@ -5471,6 +7462,10 @@ extern UA_StatusCode ua_namespace0(UA_Server *server); */ +#define UA_INTERNAL + + +_UA_BEGIN_DECLS /**************************/ /* Subscriptions Handling */ @@ -5532,6 +7527,13 @@ UA_Client_Subscriptions_backgroundPublishInactivityCheck(UA_Client *client); #endif /* UA_ENABLE_SUBSCRIPTIONS */ +/**************/ +/* Encryption */ +/**************/ + +UA_StatusCode +signActivateSessionRequest(UA_SecureChannel *channel, + UA_ActivateSessionRequest *request); /**********/ /* Client */ /**********/ @@ -5544,6 +7546,7 @@ typedef struct AsyncServiceCall { void *userdata; UA_DateTime start; UA_UInt32 timeout; + void *responsedata; } AsyncServiceCall; void UA_Client_AsyncService_cancel(UA_Client *client, AsyncServiceCall *ac, @@ -5551,45 +7554,55 @@ void UA_Client_AsyncService_cancel(UA_Client *client, AsyncServiceCall *ac, void UA_Client_AsyncService_removeAll(UA_Client *client, UA_StatusCode statusCode); -typedef enum { - UA_CLIENTAUTHENTICATION_NONE, - UA_CLIENTAUTHENTICATION_USERNAME -} UA_Client_Authentication; +typedef struct CustomCallback { + LIST_ENTRY(CustomCallback) + pointers; + //to find the correct callback + UA_UInt32 callbackId; + + UA_ClientAsyncServiceCallback callback; + + UA_AttributeId attributeId; + const UA_DataType *outDataType; +} CustomCallback; struct UA_Client { /* State */ UA_ClientState state; UA_ClientConfig config; + UA_Timer timer; + UA_StatusCode connectStatus; /* Connection */ UA_Connection connection; - UA_String endpointUrl; /* SecureChannel */ - UA_SecurityPolicy securityPolicy; /* TODO: Move supported policies to the config */ UA_SecureChannel channel; UA_UInt32 requestId; UA_DateTime nextChannelRenewal; - /* Authentication */ - UA_Client_Authentication authenticationMethod; - UA_String username; - UA_String password; - /* Session */ - UA_UserTokenPolicy token; UA_NodeId authenticationToken; UA_UInt32 requestHandle; + UA_Boolean endpointsHandshake; + UA_String endpointUrl; /* Only for the async connect */ + /* Async Service */ + AsyncServiceCall asyncConnectCall; LIST_HEAD(ListOfAsyncServiceCall, AsyncServiceCall) asyncServiceCalls; + /*When using highlevel functions these are the callbacks that can be accessed by the user*/ + LIST_HEAD(ListOfCustomCallback, CustomCallback) customCallbacks; + + /* Work queue */ + UA_WorkQueue workQueue; /* Subscriptions */ #ifdef UA_ENABLE_SUBSCRIPTIONS UA_UInt32 monitoredItemHandles; - LIST_HEAD(ListOfUnacknowledgedNotifications, UA_Client_NotificationsAckNumber) pendingNotificationsAcks; - LIST_HEAD(ListOfClientSubscriptionItems, UA_Client_Subscription) subscriptions; + LIST_HEAD(, UA_Client_NotificationsAckNumber) pendingNotificationsAcks; + LIST_HEAD(, UA_Client_Subscription) subscriptions; UA_UInt16 currentlyOutStandingPublishRequests; #endif @@ -5601,28 +7614,123 @@ struct UA_Client { void setClientState(UA_Client *client, UA_ClientState state); +/* The endpointUrl must be set in the configuration. If the complete + * endpointdescription is not set, a GetEndpoints is performed. */ +UA_StatusCode +UA_Client_connectInternal(UA_Client *client, const UA_String endpointUrl); + UA_StatusCode -UA_Client_connectInternal(UA_Client *client, const char *endpointUrl, - UA_Boolean endpointsHandshake, UA_Boolean createNewSession); +UA_Client_connectTCPSecureChannel(UA_Client *client, const UA_String endpointUrl); UA_StatusCode -UA_Client_getEndpointsInternal(UA_Client *client, size_t* endpointDescriptionsSize, - UA_EndpointDescription** endpointDescriptions); +UA_Client_connectSession(UA_Client *client); + +UA_StatusCode +UA_Client_getEndpointsInternal(UA_Client *client, const UA_String endpointUrl, + size_t *endpointDescriptionsSize, + UA_EndpointDescription **endpointDescriptions); /* Receive and process messages until a synchronous message arrives or the * timout finishes */ UA_StatusCode -receiveServiceResponse(UA_Client *client, void *response, const UA_DataType *responseType, - UA_DateTime maxDate, UA_UInt32 *synchronousRequestId); +receivePacketAsync(UA_Client *client); + +UA_StatusCode +processACKResponseAsync(void *application, UA_Connection *connection, + UA_ByteString *chunk); + +UA_StatusCode +processOPNResponseAsync(void *application, UA_Connection *connection, + UA_ByteString *chunk); + +UA_StatusCode +openSecureChannel(UA_Client *client, UA_Boolean renew); + +UA_StatusCode +receiveServiceResponse(UA_Client *client, void *response, + const UA_DataType *responseType, UA_DateTime maxDate, + const UA_UInt32 *synchronousRequestId); + +UA_StatusCode +receiveServiceResponseAsync(UA_Client *client, void *response, + const UA_DataType *responseType); + +UA_StatusCode +UA_Client_connect_iterate (UA_Client *client); + +void +setUserIdentityPolicyId(const UA_EndpointDescription *endpoint, + const UA_DataType *tokenType, + UA_String *policyId, UA_String *securityPolicyUri); + +UA_SecurityPolicy * +getSecurityPolicy(UA_Client *client, UA_String policyUri); + +UA_StatusCode +encryptUserIdentityToken(UA_Client *client, const UA_String *userTokenSecurityPolicy, + UA_ExtensionObject *userIdentityToken); +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/ua_types.c" ***********************************/ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/namespace0_generated.h" ***********************************/ + +/* WARNING: This is a generated file. + * Any manual changes will be overwritten. */ + +#ifndef NAMESPACE0_GENERATED_H_ +#define NAMESPACE0_GENERATED_H_ + + +#ifdef UA_ENABLE_AMALGAMATION + +/* The following declarations are in the open62541.c file so here's needed when compiling nodesets externally */ + +# ifndef UA_INTERNAL //this definition is needed to hide this code in the amalgamated .c file + +typedef UA_StatusCode (*UA_exchangeEncodeBuffer)(void *handle, UA_Byte **bufPos, + const UA_Byte **bufEnd); + +UA_StatusCode +UA_encodeBinary(const void *src, const UA_DataType *type, + UA_Byte **bufPos, const UA_Byte **bufEnd, + UA_exchangeEncodeBuffer exchangeCallback, + void *exchangeHandle) UA_FUNC_ATTR_WARN_UNUSED_RESULT; + +UA_StatusCode +UA_decodeBinary(const UA_ByteString *src, size_t *offset, void *dst, + const UA_DataType *type, size_t customTypesSize, + const UA_DataType *customTypes) UA_FUNC_ATTR_WARN_UNUSED_RESULT; + +size_t +UA_calcSizeBinary(void *p, const UA_DataType *type); + +const UA_DataType * +UA_findDataTypeByBinary(const UA_NodeId *typeId); + +# endif // UA_INTERNAL + +#else // UA_ENABLE_AMALGAMATION +#endif + + + + +_UA_BEGIN_DECLS + +extern UA_StatusCode namespace0_generated(UA_Server *server); + +_UA_END_DECLS + +#endif /* NAMESPACE0_GENERATED_H_ */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/ua_types.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2014, 2016-2017 (c) Florian Palm * Copyright 2014-2016 (c) Sten Grüner * Copyright 2014 (c) Leon Urbas @@ -5636,6 +7744,7 @@ receiveServiceResponse(UA_Client *client, void *response, const UA_DataType *res + /* Datatype Handling * ----------------- * This file contains handling functions for the builtin types and functions @@ -5651,6 +7760,13 @@ const UA_Guid UA_GUID_NULL = {0, 0, 0, {0,0,0,0,0,0,0,0}}; const UA_NodeId UA_NODEID_NULL = {0, UA_NODEIDTYPE_NUMERIC, {0}}; const UA_ExpandedNodeId UA_EXPANDEDNODEID_NULL = {{0, UA_NODEIDTYPE_NUMERIC, {0}}, {0, NULL}, 0}; +typedef UA_StatusCode (*UA_copySignature)(const void *src, void *dst, + const UA_DataType *type); +typedef void (*UA_clearSignature)(void *p, const UA_DataType *type); + +extern const UA_copySignature copyJumpTable[UA_DATATYPEKINDS]; +extern const UA_clearSignature clearJumpTable[UA_DATATYPEKINDS]; + /* TODO: The standard-defined types are ordered. See if binary search is * more efficient. */ const UA_DataType * @@ -5702,36 +7818,62 @@ UA_UInt32_random(void) { /* Builtin Types */ /*****************/ -static void deleteMembers_noInit(void *p, const UA_DataType *type); -static UA_StatusCode copy_noInit(const void *src, void *dst, const UA_DataType *type); - UA_String -UA_String_fromChars(char const src[]) { - UA_String str; - str.length = strlen(src); - if(str.length > 0) { - str.data = (u8*)UA_malloc(str.length); - if(!str.data) - return UA_STRING_NULL; - memcpy(str.data, src, str.length); +UA_String_fromChars(const char *src) { + UA_String s; s.length = 0; s.data = NULL; + if(!src) + return s; + s.length = strlen(src); + if(s.length > 0) { + s.data = (u8*)UA_malloc(s.length); + if(!s.data) { + s.length = 0; + return s; + } + memcpy(s.data, src, s.length); } else { - str.data = (u8*)UA_EMPTY_ARRAY_SENTINEL; + s.data = (u8*)UA_EMPTY_ARRAY_SENTINEL; } - return str; + return s; } UA_Boolean UA_String_equal(const UA_String *s1, const UA_String *s2) { if(s1->length != s2->length) return false; + if(s1->length == 0) + return true; + if(s2->data == NULL) + return false; i32 is = memcmp((char const*)s1->data, (char const*)s2->data, s1->length); return (is == 0) ? true : false; } +static UA_StatusCode +String_copy(UA_String const *src, UA_String *dst, const UA_DataType *_) { + UA_StatusCode retval = UA_Array_copy(src->data, src->length, (void**)&dst->data, + &UA_TYPES[UA_TYPES_BYTE]); + if(retval == UA_STATUSCODE_GOOD) + dst->length = src->length; + return retval; +} + +static void +String_clear(UA_String *s, const UA_DataType *_) { + UA_Array_delete(s->data, s->length, &UA_TYPES[UA_TYPES_BYTE]); +} + +/* QualifiedName */ +static UA_StatusCode +QualifiedName_copy(const UA_QualifiedName *src, UA_QualifiedName *dst, const UA_DataType *_) { + dst->namespaceIndex = src->namespaceIndex; + return String_copy(&src->name, &dst->name, NULL); +} + static void -String_deleteMembers(UA_String *s, const UA_DataType *_) { - UA_free((void*)((uintptr_t)s->data & ~(uintptr_t)UA_EMPTY_ARRAY_SENTINEL)); +QualifiedName_clear(UA_QualifiedName *p, const UA_DataType *_) { + String_clear(&p->name, NULL); } UA_Boolean @@ -5752,13 +7894,19 @@ UA_DateTimeStruct UA_DateTime_toStruct(UA_DateTime t) { /* Calculating the the milli-, micro- and nanoseconds */ UA_DateTimeStruct dateTimeStruct; - dateTimeStruct.nanoSec = (u16)((t % 10) * 100); - dateTimeStruct.microSec = (u16)((t % 10000) / 10); - dateTimeStruct.milliSec = (u16)((t % 10000000) / 10000); + if(t >= 0) { + dateTimeStruct.nanoSec = (u16)((t % 10) * 100); + dateTimeStruct.microSec = (u16)((t % 10000) / 10); + dateTimeStruct.milliSec = (u16)((t % 10000000) / 10000); + } else { + dateTimeStruct.nanoSec = (u16)(((t % 10 + t) % 10) * 100); + dateTimeStruct.microSec = (u16)(((t % 10000 + t) % 10000) / 10); + dateTimeStruct.milliSec = (u16)(((t % 10000000 + t) % 10000000) / 10000); + } /* Calculating the unix time with #include */ - long long secSinceUnixEpoch = (long long) - ((t - UA_DATETIME_UNIX_EPOCH) / UA_DATETIME_SEC); + long long secSinceUnixEpoch = (long long)(t / UA_DATETIME_SEC) + - (long long)(UA_DATETIME_UNIX_EPOCH / UA_DATETIME_SEC); struct mytm ts; memset(&ts, 0, sizeof(struct mytm)); __secs_to_tm(secSinceUnixEpoch, &ts); @@ -5771,41 +7919,6 @@ UA_DateTime_toStruct(UA_DateTime t) { return dateTimeStruct; } -static void -printNumber(u16 n, u8 *pos, size_t digits) { - for(size_t i = digits; i > 0; --i) { - pos[i-1] = (u8)((n % 10) + '0'); - n = n / 10; - } -} - -UA_String -UA_DateTime_toString(UA_DateTime t) { - /* length of the string is 31 (plus \0 at the end) */ - UA_String str = {31, (u8*)UA_malloc(32)}; - if(!str.data) - return UA_STRING_NULL; - UA_DateTimeStruct tSt = UA_DateTime_toStruct(t); - printNumber(tSt.month, str.data, 2); - str.data[2] = '/'; - printNumber(tSt.day, &str.data[3], 2); - str.data[5] = '/'; - printNumber(tSt.year, &str.data[6], 4); - str.data[10] = ' '; - printNumber(tSt.hour, &str.data[11], 2); - str.data[13] = ':'; - printNumber(tSt.min, &str.data[14], 2); - str.data[16] = ':'; - printNumber(tSt.sec, &str.data[17], 2); - str.data[19] = '.'; - printNumber(tSt.milliSec, &str.data[20], 3); - str.data[23] = '.'; - printNumber(tSt.microSec, &str.data[24], 3); - str.data[27] = '.'; - printNumber(tSt.nanoSec, &str.data[28], 3); - return str; -} - /* Guid */ UA_Boolean UA_Guid_equal(const UA_Guid *g1, const UA_Guid *g2) { @@ -5849,11 +7962,11 @@ UA_ByteString_allocBuffer(UA_ByteString *bs, size_t length) { /* NodeId */ static void -NodeId_deleteMembers(UA_NodeId *p, const UA_DataType *_) { +NodeId_clear(UA_NodeId *p, const UA_DataType *_) { switch(p->identifierType) { case UA_NODEIDTYPE_STRING: case UA_NODEIDTYPE_BYTESTRING: - String_deleteMembers(&p->identifier.string, NULL); + String_clear(&p->identifier.string, NULL); break; default: break; } @@ -5889,7 +8002,7 @@ UA_Boolean UA_NodeId_isNull(const UA_NodeId *p) { if(p->namespaceIndex != 0) return false; - switch(p->identifierType) { + switch (p->identifierType) { case UA_NODEIDTYPE_NUMERIC: return (p->identifier.numeric == 0); case UA_NODEIDTYPE_STRING: @@ -5902,38 +8015,73 @@ UA_NodeId_isNull(const UA_NodeId *p) { return false; } -UA_Boolean -UA_NodeId_equal(const UA_NodeId *n1, const UA_NodeId *n2) { - if(n1 == NULL || n2 == NULL) - return false; - if(n1->namespaceIndex != n2->namespaceIndex || - n1->identifierType!=n2->identifierType) - return false; +/* Absolute ordering for NodeIds */ +UA_Order +UA_NodeId_order(const UA_NodeId *n1, const UA_NodeId *n2) { + /* Compare namespaceIndex */ + if(n1->namespaceIndex < n2->namespaceIndex) + return UA_ORDER_LESS; + if(n1->namespaceIndex > n2->namespaceIndex) + return UA_ORDER_MORE; + + /* Compare identifierType */ + if(n1->identifierType < n2->identifierType) + return UA_ORDER_LESS; + if(n1->identifierType > n2->identifierType) + return UA_ORDER_MORE; + + /* Compare the identifier */ switch(n1->identifierType) { case UA_NODEIDTYPE_NUMERIC: - return (n1->identifier.numeric == n2->identifier.numeric); - case UA_NODEIDTYPE_STRING: - return UA_String_equal(&n1->identifier.string, - &n2->identifier.string); + if(n1->identifier.numeric < n2->identifier.numeric) + return UA_ORDER_LESS; + if(n1->identifier.numeric > n2->identifier.numeric) + return UA_ORDER_MORE; + break; case UA_NODEIDTYPE_GUID: - return UA_Guid_equal(&n1->identifier.guid, - &n2->identifier.guid); - case UA_NODEIDTYPE_BYTESTRING: - return UA_ByteString_equal(&n1->identifier.byteString, - &n2->identifier.byteString); + if(n1->identifier.guid.data1 < n2->identifier.guid.data1) { + return UA_ORDER_LESS; + } else if(n1->identifier.guid.data1 > n2->identifier.guid.data1) { + return UA_ORDER_MORE; + } else if(n1->identifier.guid.data2 < n2->identifier.guid.data2) { + return UA_ORDER_LESS; + } else if(n1->identifier.guid.data2 > n2->identifier.guid.data2) { + return UA_ORDER_MORE; + } else if(n1->identifier.guid.data3 < n2->identifier.guid.data3) { + return UA_ORDER_LESS; + } else if(n1->identifier.guid.data3 > n2->identifier.guid.data3) { + return UA_ORDER_MORE; + } else { + int cmp = memcmp(n1->identifier.guid.data4, n2->identifier.guid.data4, 8); + + if(cmp < 0) return UA_ORDER_LESS; + if(cmp > 0) return UA_ORDER_MORE; + + } + + break; + case UA_NODEIDTYPE_STRING: + case UA_NODEIDTYPE_BYTESTRING: { + size_t minLength = UA_MIN(n1->identifier.string.length, n2->identifier.string.length); + int cmp = strncmp((const char*)n1->identifier.string.data, + (const char*)n2->identifier.string.data, + minLength); + if(cmp < 0) + return UA_ORDER_LESS; + if(cmp > 0) + return UA_ORDER_MORE; + + if(n1->identifier.string.length < n2->identifier.string.length) + return UA_ORDER_LESS; + if(n1->identifier.string.length > n2->identifier.string.length) + return UA_ORDER_MORE; + break; + } + default: + break; } - return false; -} -UA_Boolean -UA_ExpandedNodeId_equal(const UA_ExpandedNodeId *n1, const UA_ExpandedNodeId *n2) { - if(n1 == NULL || n2 == NULL) - return false; - if(n1->serverIndex != n2->serverIndex) - return false; - if(!UA_String_equal(&n1->namespaceUri, &n2->namespaceUri)) - return false; - return UA_NodeId_equal(&n1->nodeId, &n2->nodeId); + return UA_ORDER_EQ; } /* FNV non-cryptographic hash function. See @@ -5965,9 +8113,9 @@ UA_NodeId_hash(const UA_NodeId *n) { /* ExpandedNodeId */ static void -ExpandedNodeId_deleteMembers(UA_ExpandedNodeId *p, const UA_DataType *_) { - NodeId_deleteMembers(&p->nodeId, _); - String_deleteMembers(&p->namespaceUri, NULL); +ExpandedNodeId_clear(UA_ExpandedNodeId *p, const UA_DataType *_) { + NodeId_clear(&p->nodeId, _); + String_clear(&p->namespaceUri, NULL); } static UA_StatusCode @@ -5979,15 +8127,45 @@ ExpandedNodeId_copy(UA_ExpandedNodeId const *src, UA_ExpandedNodeId *dst, return retval; } +UA_Order +UA_ExpandedNodeId_order(const UA_ExpandedNodeId *n1, + const UA_ExpandedNodeId *n2) { + if(n1->serverIndex > n2->serverIndex) + return UA_ORDER_MORE; + if(n1->serverIndex < n2->serverIndex) + return UA_ORDER_LESS; + if(n1->namespaceUri.length > 0) { + if(n1->namespaceUri.length > n2->namespaceUri.length) + return UA_ORDER_MORE; + if(n1->namespaceUri.length < n2->namespaceUri.length) + return UA_ORDER_LESS; + int cmp = strncmp((const char*)n1->namespaceUri.data, + (const char*)n2->namespaceUri.data, + n1->namespaceUri.length); + if(cmp < 0) + return UA_ORDER_LESS; + if(cmp > 0) + return UA_ORDER_MORE; + } + return UA_NodeId_order(&n1->nodeId, &n2->nodeId); +} + +u32 +UA_ExpandedNodeId_hash(const UA_ExpandedNodeId *n) { + u32 h = UA_NodeId_hash(&n->nodeId); + h = fnv32(h, (const UA_Byte*)&n->serverIndex, 4); + return fnv32(h, n->namespaceUri.data, n->namespaceUri.length); +} + /* ExtensionObject */ static void -ExtensionObject_deleteMembers(UA_ExtensionObject *p, const UA_DataType *_) { +ExtensionObject_clear(UA_ExtensionObject *p, const UA_DataType *_) { switch(p->encoding) { case UA_EXTENSIONOBJECT_ENCODED_NOBODY: case UA_EXTENSIONOBJECT_ENCODED_BYTESTRING: case UA_EXTENSIONOBJECT_ENCODED_XML: - NodeId_deleteMembers(&p->content.encoded.typeId, NULL); - String_deleteMembers(&p->content.encoded.body, NULL); + NodeId_clear(&p->content.encoded.typeId, NULL); + String_clear(&p->content.encoded.body, NULL); break; case UA_EXTENSIONOBJECT_DECODED: if(p->content.decoded.data) @@ -6029,7 +8207,7 @@ ExtensionObject_copy(UA_ExtensionObject const *src, UA_ExtensionObject *dst, /* Variant */ static void -Variant_deletemembers(UA_Variant *p, const UA_DataType *_) { +Variant_clear(UA_Variant *p, const UA_DataType *_) { if(p->storageType != UA_VARIANT_DATA) return; if(p->type && p->data > UA_EMPTY_ARRAY_SENTINEL) { @@ -6172,7 +8350,7 @@ computeStrides(const UA_Variant *v, const UA_NumericRange range, *stride = v->arrayLength; /* So it can be copied as a contiguous block. */ *first = 0; size_t running_dimssize = 1; - bool found_contiguous = false; + UA_Boolean found_contiguous = false; for(size_t k = dims_count; k > 0;) { --k; size_t dimrange = 1 + realmax[k] - range.dimensions[k].min; @@ -6189,11 +8367,11 @@ computeStrides(const UA_Variant *v, const UA_NumericRange range, } /* Is the type string-like? */ -static bool +static UA_Boolean isStringLike(const UA_DataType *type) { - if(type->membersSize == 1 && type->members[0].isArray && - type->members[0].namespaceZero && - type->members[0].memberTypeIndex == UA_TYPES_BYTE) + if(type == &UA_TYPES[UA_TYPES_STRING] || + type == &UA_TYPES[UA_TYPES_BYTESTRING] || + type == &UA_TYPES[UA_TYPES_XMLELEMENT]) return true; return false; } @@ -6226,8 +8404,8 @@ UA_Variant_copyRange(const UA_Variant *src, UA_Variant *dst, const UA_NumericRange range) { if(!src->type) return UA_STATUSCODE_BADINVALIDARGUMENT; - bool isScalar = UA_Variant_isScalar(src); - bool stringLike = isStringLike(src->type); + UA_Boolean isScalar = UA_Variant_isScalar(src); + UA_Boolean stringLike = isStringLike(src->type); UA_Variant arraySrc; /* Extract the range for copying at this level. The remaining range is dealt @@ -6340,7 +8518,7 @@ UA_Variant_copyRange(const UA_Variant *src, UA_Variant *dst, dst->arrayDimensions = (u32*)UA_Array_new(thisrange.dimensionsSize, &UA_TYPES[UA_TYPES_UINT32]); if(!dst->arrayDimensions) { - Variant_deletemembers(dst, NULL); + Variant_clear(dst, NULL); return UA_STATUSCODE_BADOUTOFMEMORY; } dst->arrayDimensionsSize = thisrange.dimensionsSize; @@ -6355,7 +8533,7 @@ UA_Variant_copyRange(const UA_Variant *src, UA_Variant *dst, * variant and strings. This is already possible for reading... */ static UA_StatusCode Variant_setRange(UA_Variant *v, void *array, size_t arraySize, - const UA_NumericRange range, bool copy) { + const UA_NumericRange range, UA_Boolean copy) { /* Compute the strides */ size_t count, block, stride, first; UA_StatusCode retval = computeStrides(v, range, &count, @@ -6379,7 +8557,7 @@ Variant_setRange(UA_Variant *v, void *array, size_t arraySize, } else { for(size_t i = 0; i < block_count; ++i) { for(size_t j = 0; j < block; ++j) { - deleteMembers_noInit((void*)nextdst, v->type); + clearJumpTable[v->type->typeKind]((void*)nextdst, v->type); retval |= UA_copy((void*)nextsrc, (void*)nextdst, v->type); nextdst += elem_size; nextsrc += elem_size; @@ -6410,9 +8588,9 @@ UA_Variant_setRangeCopy(UA_Variant *v, const void *array, /* LocalizedText */ static void -LocalizedText_deleteMembers(UA_LocalizedText *p, const UA_DataType *_) { - String_deleteMembers(&p->locale, NULL); - String_deleteMembers(&p->text, NULL); +LocalizedText_clear(UA_LocalizedText *p, const UA_DataType *_) { + String_clear(&p->locale, NULL); + String_clear(&p->text, NULL); } static UA_StatusCode @@ -6425,8 +8603,8 @@ LocalizedText_copy(UA_LocalizedText const *src, UA_LocalizedText *dst, /* DataValue */ static void -DataValue_deleteMembers(UA_DataValue *p, const UA_DataType *_) { - Variant_deletemembers(&p->value, NULL); +DataValue_clear(UA_DataValue *p, const UA_DataType *_) { + Variant_clear(&p->value, NULL); } static UA_StatusCode @@ -6436,16 +8614,16 @@ DataValue_copy(UA_DataValue const *src, UA_DataValue *dst, UA_Variant_init(&dst->value); UA_StatusCode retval = Variant_copy(&src->value, &dst->value, NULL); if(retval != UA_STATUSCODE_GOOD) - DataValue_deleteMembers(dst, NULL); + DataValue_clear(dst, NULL); return retval; } /* DiagnosticInfo */ static void -DiagnosticInfo_deleteMembers(UA_DiagnosticInfo *p, const UA_DataType *_) { - String_deleteMembers(&p->additionalInfo, NULL); +DiagnosticInfo_clear(UA_DiagnosticInfo *p, const UA_DataType *_) { + String_clear(&p->additionalInfo, NULL); if(p->hasInnerDiagnosticInfo && p->innerDiagnosticInfo) { - DiagnosticInfo_deleteMembers(p->innerDiagnosticInfo, NULL); + DiagnosticInfo_clear(p->innerDiagnosticInfo, NULL); UA_free(p->innerDiagnosticInfo); } } @@ -6513,53 +8691,19 @@ copyGuid(const UA_Guid *src, UA_Guid *dst, const UA_DataType *_) { return UA_STATUSCODE_GOOD; } -typedef UA_StatusCode -(*UA_copySignature)(const void *src, void *dst, const UA_DataType *type); - -static const UA_copySignature copyJumpTable[UA_BUILTIN_TYPES_COUNT + 1] = { - (UA_copySignature)copyByte, // Boolean - (UA_copySignature)copyByte, // SByte - (UA_copySignature)copyByte, // Byte - (UA_copySignature)copy2Byte, // Int16 - (UA_copySignature)copy2Byte, // UInt16 - (UA_copySignature)copy4Byte, // Int32 - (UA_copySignature)copy4Byte, // UInt32 - (UA_copySignature)copy8Byte, // Int64 - (UA_copySignature)copy8Byte, // UInt64 - (UA_copySignature)copy4Byte, // Float - (UA_copySignature)copy8Byte, // Double - (UA_copySignature)copy_noInit, // String - (UA_copySignature)copy8Byte, // DateTime - (UA_copySignature)copyGuid, // Guid - (UA_copySignature)copy_noInit, // ByteString - (UA_copySignature)copy_noInit, // XmlElement - (UA_copySignature)NodeId_copy, - (UA_copySignature)ExpandedNodeId_copy, - (UA_copySignature)copy4Byte, // StatusCode - (UA_copySignature)copy_noInit, // QualifiedName - (UA_copySignature)LocalizedText_copy, // LocalizedText - (UA_copySignature)ExtensionObject_copy, - (UA_copySignature)DataValue_copy, - (UA_copySignature)Variant_copy, - (UA_copySignature)DiagnosticInfo_copy, - (UA_copySignature)copy_noInit // all others -}; - static UA_StatusCode -copy_noInit(const void *src, void *dst, const UA_DataType *type) { +copyStructure(const void *src, void *dst, const UA_DataType *type) { UA_StatusCode retval = UA_STATUSCODE_GOOD; uintptr_t ptrs = (uintptr_t)src; uintptr_t ptrd = (uintptr_t)dst; - u8 membersSize = type->membersSize; - for(size_t i = 0; i < membersSize; ++i) { + const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; + for(size_t i = 0; i < type->membersSize; ++i) { const UA_DataTypeMember *m= &type->members[i]; - const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex]; if(!m->isArray) { ptrs += m->padding; ptrd += m->padding; - size_t fi = mt->builtin ? mt->typeIndex : UA_BUILTIN_TYPES_COUNT; - retval |= copyJumpTable[fi]((const void*)ptrs, (void*)ptrd, mt); + retval |= copyJumpTable[mt->typeKind]((const void*)ptrs, (void*)ptrd, mt); ptrs += mt->memSize; ptrd += mt->memSize; } else { @@ -6581,61 +8725,64 @@ copy_noInit(const void *src, void *dst, const UA_DataType *type) { return retval; } +static UA_StatusCode +copyNotImplemented(const void *src, void *dst, const UA_DataType *type) { + return UA_STATUSCODE_BADNOTIMPLEMENTED; +} + +const UA_copySignature copyJumpTable[UA_DATATYPEKINDS] = { + (UA_copySignature)copyByte, /* Boolean */ + (UA_copySignature)copyByte, /* SByte */ + (UA_copySignature)copyByte, /* Byte */ + (UA_copySignature)copy2Byte, /* Int16 */ + (UA_copySignature)copy2Byte, /* UInt16 */ + (UA_copySignature)copy4Byte, /* Int32 */ + (UA_copySignature)copy4Byte, /* UInt32 */ + (UA_copySignature)copy8Byte, /* Int64 */ + (UA_copySignature)copy8Byte, /* UInt64 */ + (UA_copySignature)copy4Byte, /* Float */ + (UA_copySignature)copy8Byte, /* Double */ + (UA_copySignature)String_copy, + (UA_copySignature)copy8Byte, /* DateTime */ + (UA_copySignature)copyGuid, /* Guid */ + (UA_copySignature)String_copy, /* ByteString */ + (UA_copySignature)String_copy, /* XmlElement */ + (UA_copySignature)NodeId_copy, + (UA_copySignature)ExpandedNodeId_copy, + (UA_copySignature)copy4Byte, /* StatusCode */ + (UA_copySignature)QualifiedName_copy, + (UA_copySignature)LocalizedText_copy, + (UA_copySignature)ExtensionObject_copy, + (UA_copySignature)DataValue_copy, + (UA_copySignature)Variant_copy, + (UA_copySignature)DiagnosticInfo_copy, + (UA_copySignature)copyNotImplemented, /* Decimal */ + (UA_copySignature)copy4Byte, /* Enumeration */ + (UA_copySignature)copyStructure, + (UA_copySignature)copyNotImplemented, /* Structure with Optional Fields */ + (UA_copySignature)copyNotImplemented, /* Union */ + (UA_copySignature)copyNotImplemented /* BitfieldCluster*/ +}; + UA_StatusCode UA_copy(const void *src, void *dst, const UA_DataType *type) { memset(dst, 0, type->memSize); /* init */ - UA_StatusCode retval = copy_noInit(src, dst, type); + UA_StatusCode retval = copyJumpTable[type->typeKind](src, dst, type); if(retval != UA_STATUSCODE_GOOD) - UA_deleteMembers(dst, type); + UA_clear(dst, type); return retval; } -static void nopDeleteMembers(void *p, const UA_DataType *type) { } - -typedef void (*UA_deleteMembersSignature)(void *p, const UA_DataType *type); - -static const -UA_deleteMembersSignature deleteMembersJumpTable[UA_BUILTIN_TYPES_COUNT + 1] = { - (UA_deleteMembersSignature)nopDeleteMembers, // Boolean - (UA_deleteMembersSignature)nopDeleteMembers, // SByte - (UA_deleteMembersSignature)nopDeleteMembers, // Byte - (UA_deleteMembersSignature)nopDeleteMembers, // Int16 - (UA_deleteMembersSignature)nopDeleteMembers, // UInt16 - (UA_deleteMembersSignature)nopDeleteMembers, // Int32 - (UA_deleteMembersSignature)nopDeleteMembers, // UInt32 - (UA_deleteMembersSignature)nopDeleteMembers, // Int64 - (UA_deleteMembersSignature)nopDeleteMembers, // UInt64 - (UA_deleteMembersSignature)nopDeleteMembers, // Float - (UA_deleteMembersSignature)nopDeleteMembers, // Double - (UA_deleteMembersSignature)String_deleteMembers, // String - (UA_deleteMembersSignature)nopDeleteMembers, // DateTime - (UA_deleteMembersSignature)nopDeleteMembers, // Guid - (UA_deleteMembersSignature)String_deleteMembers, // ByteString - (UA_deleteMembersSignature)String_deleteMembers, // XmlElement - (UA_deleteMembersSignature)NodeId_deleteMembers, - (UA_deleteMembersSignature)ExpandedNodeId_deleteMembers, // ExpandedNodeId - (UA_deleteMembersSignature)nopDeleteMembers, // StatusCode - (UA_deleteMembersSignature)deleteMembers_noInit, // QualifiedName - (UA_deleteMembersSignature)LocalizedText_deleteMembers, // LocalizedText - (UA_deleteMembersSignature)ExtensionObject_deleteMembers, - (UA_deleteMembersSignature)DataValue_deleteMembers, - (UA_deleteMembersSignature)Variant_deletemembers, - (UA_deleteMembersSignature)DiagnosticInfo_deleteMembers, - (UA_deleteMembersSignature)deleteMembers_noInit, -}; - static void -deleteMembers_noInit(void *p, const UA_DataType *type) { +clearStructure(void *p, const UA_DataType *type) { uintptr_t ptr = (uintptr_t)p; - u8 membersSize = type->membersSize; - for(size_t i = 0; i < membersSize; ++i) { - const UA_DataTypeMember *m= &type->members[i]; - const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; + const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; + for(size_t i = 0; i < type->membersSize; ++i) { + const UA_DataTypeMember *m = &type->members[i]; const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex]; if(!m->isArray) { ptr += m->padding; - size_t fi = mt->builtin ? mt->typeIndex : UA_BUILTIN_TYPES_COUNT; - deleteMembersJumpTable[fi]((void*)ptr, mt); + clearJumpTable[mt->typeKind]((void*)ptr, mt); ptr += mt->memSize; } else { ptr += m->padding; @@ -6647,15 +8794,52 @@ deleteMembers_noInit(void *p, const UA_DataType *type) { } } +static void nopClear(void *p, const UA_DataType *type) { } + +const +UA_clearSignature clearJumpTable[UA_DATATYPEKINDS] = { + (UA_clearSignature)nopClear, /* Boolean */ + (UA_clearSignature)nopClear, /* SByte */ + (UA_clearSignature)nopClear, /* Byte */ + (UA_clearSignature)nopClear, /* Int16 */ + (UA_clearSignature)nopClear, /* UInt16 */ + (UA_clearSignature)nopClear, /* Int32 */ + (UA_clearSignature)nopClear, /* UInt32 */ + (UA_clearSignature)nopClear, /* Int64 */ + (UA_clearSignature)nopClear, /* UInt64 */ + (UA_clearSignature)nopClear, /* Float */ + (UA_clearSignature)nopClear, /* Double */ + (UA_clearSignature)String_clear, /* String */ + (UA_clearSignature)nopClear, /* DateTime */ + (UA_clearSignature)nopClear, /* Guid */ + (UA_clearSignature)String_clear, /* ByteString */ + (UA_clearSignature)String_clear, /* XmlElement */ + (UA_clearSignature)NodeId_clear, + (UA_clearSignature)ExpandedNodeId_clear, + (UA_clearSignature)nopClear, /* StatusCode */ + (UA_clearSignature)QualifiedName_clear, + (UA_clearSignature)LocalizedText_clear, + (UA_clearSignature)ExtensionObject_clear, + (UA_clearSignature)DataValue_clear, + (UA_clearSignature)Variant_clear, + (UA_clearSignature)DiagnosticInfo_clear, + (UA_clearSignature)nopClear, /* Decimal, not implemented */ + (UA_clearSignature)nopClear, /* Enumeration */ + (UA_clearSignature)clearStructure, + (UA_clearSignature)nopClear, /* Struct with Optional Fields, not implemented*/ + (UA_clearSignature)nopClear, /* Union, not implemented*/ + (UA_clearSignature)nopClear /* BitfieldCluster, not implemented*/ +}; + void -UA_deleteMembers(void *p, const UA_DataType *type) { - deleteMembers_noInit(p, type); +UA_clear(void *p, const UA_DataType *type) { + clearJumpTable[type->typeKind](p, type); memset(p, 0, type->memSize); /* init */ } void UA_delete(void *p, const UA_DataType *type) { - deleteMembers_noInit(p, type); + clearJumpTable[type->typeKind](p, type); UA_free(p); } @@ -6716,7 +8900,7 @@ UA_Array_delete(void *p, size_t size, const UA_DataType *type) { if(!type->pointerFree) { uintptr_t ptr = (uintptr_t)p; for(size_t i = 0; i < size; ++i) { - UA_deleteMembers((void*)ptr, type); + UA_clear((void*)ptr, type); ptr += type->memSize; } } @@ -6724,21 +8908,98 @@ UA_Array_delete(void *p, size_t size, const UA_DataType *type) { } UA_Boolean -isDataTypeNumeric(const UA_DataType *type) { - // All data types ids between UA_TYPES_BOOLEAN and UA_TYPES_DOUBLE are numeric - for (int i = UA_TYPES_BOOLEAN; i <= UA_TYPES_DOUBLE; ++i) - if (&UA_TYPES[i] == type) +UA_DataType_isNumeric(const UA_DataType *type) { + /* All data types between UA_TYPES_BOOLEAN and UA_TYPES_DOUBLE are numeric */ + for(size_t i = UA_TYPES_BOOLEAN; i <= UA_TYPES_DOUBLE; ++i) + if(&UA_TYPES[i] == type) return true; return false; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/ua_types_encoding_binary.c" ***********************************/ +/**********************/ +/* Parse NumericRange */ +/**********************/ + +static size_t +readDimension(UA_Byte *buf, size_t buflen, UA_NumericRangeDimension *dim) { + size_t progress = UA_readNumber(buf, buflen, &dim->min); + if(progress == 0) + return 0; + if(buflen <= progress + 1 || buf[progress] != ':') { + dim->max = dim->min; + return progress; + } + + ++progress; + size_t progress2 = UA_readNumber(&buf[progress], buflen - progress, &dim->max); + if(progress2 == 0) + return 0; + + /* invalid range */ + if(dim->min >= dim->max) + return 0; + + return progress + progress2; +} + +UA_StatusCode +UA_NumericRange_parseFromString(UA_NumericRange *range, const UA_String *str) { + size_t idx = 0; + size_t dimensionsMax = 0; + UA_NumericRangeDimension *dimensions = NULL; + UA_StatusCode retval = UA_STATUSCODE_GOOD; + size_t offset = 0; + while(true) { + /* alloc dimensions */ + if(idx >= dimensionsMax) { + UA_NumericRangeDimension *newds; + size_t newdssize = sizeof(UA_NumericRangeDimension) * (dimensionsMax + 2); + newds = (UA_NumericRangeDimension*)UA_realloc(dimensions, newdssize); + if(!newds) { + retval = UA_STATUSCODE_BADOUTOFMEMORY; + break; + } + dimensions = newds; + dimensionsMax = dimensionsMax + 2; + } + + /* read the dimension */ + size_t progress = readDimension(&str->data[offset], str->length - offset, + &dimensions[idx]); + if(progress == 0) { + retval = UA_STATUSCODE_BADINDEXRANGEINVALID; + break; + } + offset += progress; + ++idx; + + /* loop into the next dimension */ + if(offset >= str->length) + break; + + if(str->data[offset] != ',') { + retval = UA_STATUSCODE_BADINDEXRANGEINVALID; + break; + } + ++offset; + } + + if(retval == UA_STATUSCODE_GOOD && idx > 0) { + range->dimensions = dimensions; + range->dimensionsSize = idx; + } else + UA_free(dimensions); + + return retval; +} + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/ua_types_encoding_binary.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2018 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2014-2017 (c) Florian Palm * Copyright 2014-2016 (c) Sten Grüner * Copyright 2014 (c) Leon Urbas @@ -6752,6 +9013,8 @@ isDataTypeNumeric(const UA_DataType *type) { */ + + /** * Type Encoding and Decoding * -------------------------- @@ -6766,96 +9029,83 @@ isDataTypeNumeric(const UA_DataType *type) { * is "looped through" every method call. The ``_``-macro accesses either the * thread-local or the "looped through" context . */ -#define UA_ENCODING_MAX_RECURSION 20 +/* Part 6 §5.1.5: Decoders shall support at least 100 nesting levels */ +#define UA_ENCODING_MAX_RECURSION 100 typedef struct { /* Pointers to the current position and the last position in the buffer */ u8 *pos; const u8 *end; - u16 depth; /* How often did we en-/decoding recurse? */ - - size_t customTypesArraySize; - const UA_DataType *customTypesArray; + u8 **oldpos; /* Sentinel for a lower stacktrace exchanging the buffer */ + u16 depth; /* How often did we en-/decoding recurse? */ + const UA_DataTypeArray *customTypes; UA_exchangeEncodeBuffer exchangeBufferCallback; void *exchangeBufferCallbackHandle; } Ctx; -typedef status (*encodeBinarySignature)(const void *UA_RESTRICT src, const UA_DataType *type, - Ctx *UA_RESTRICT ctx); -typedef status (*decodeBinarySignature)(void *UA_RESTRICT dst, const UA_DataType *type, - Ctx *UA_RESTRICT ctx); -typedef size_t (*calcSizeBinarySignature)(const void *UA_RESTRICT p, const UA_DataType *contenttype); - -#define ENCODE_BINARY(TYPE) static status \ - TYPE##_encodeBinary(const UA_##TYPE *UA_RESTRICT src, const UA_DataType *type, Ctx *UA_RESTRICT ctx) -#define DECODE_BINARY(TYPE) static status \ - TYPE##_decodeBinary(UA_##TYPE *UA_RESTRICT dst, const UA_DataType *type, Ctx *UA_RESTRICT ctx) -#define CALCSIZE_BINARY(TYPE) static size_t \ - TYPE##_calcSizeBinary(const UA_##TYPE *UA_RESTRICT src, const UA_DataType *_) +typedef status +(*encodeBinarySignature)(const void *UA_RESTRICT src, const UA_DataType *type, + Ctx *UA_RESTRICT ctx); +typedef status +(*decodeBinarySignature)(void *UA_RESTRICT dst, const UA_DataType *type, + Ctx *UA_RESTRICT ctx); +typedef size_t +(*calcSizeBinarySignature)(const void *UA_RESTRICT p, const UA_DataType *contenttype); + +#define ENCODE_BINARY(TYPE) static status \ + TYPE##_encodeBinary(const UA_##TYPE *UA_RESTRICT src, \ + const UA_DataType *type, Ctx *UA_RESTRICT ctx) +#define DECODE_BINARY(TYPE) static status \ + TYPE##_decodeBinary(UA_##TYPE *UA_RESTRICT dst, \ + const UA_DataType *type, Ctx *UA_RESTRICT ctx) +#define CALCSIZE_BINARY(TYPE) static size_t \ + TYPE##_calcSizeBinary(const UA_##TYPE *UA_RESTRICT src, \ + const UA_DataType *_) #define ENCODE_DIRECT(SRC, TYPE) TYPE##_encodeBinary((const UA_##TYPE*)SRC, NULL, ctx) #define DECODE_DIRECT(DST, TYPE) TYPE##_decodeBinary((UA_##TYPE*)DST, NULL, ctx) /* Jumptables for de-/encoding and computing the buffer length. The methods in * the decoding jumptable do not all clean up their allocated memory when an - * error occurs. So a final _deleteMembers needs to be called before returning - * to the user. */ -extern const encodeBinarySignature encodeBinaryJumpTable[UA_BUILTIN_TYPES_COUNT + 1]; -extern const decodeBinarySignature decodeBinaryJumpTable[UA_BUILTIN_TYPES_COUNT + 1]; -extern const calcSizeBinarySignature calcSizeBinaryJumpTable[UA_BUILTIN_TYPES_COUNT + 1]; -static status encodeBinaryInternal(const void *src, const UA_DataType *type, Ctx *ctx); -static status decodeBinaryInternal(void *dst, const UA_DataType *type, Ctx *ctx); + * error occurs. So a final _clear needs to be called before returning to the + * user. */ +extern const encodeBinarySignature encodeBinaryJumpTable[UA_DATATYPEKINDS]; +extern const decodeBinarySignature decodeBinaryJumpTable[UA_DATATYPEKINDS]; +extern const calcSizeBinarySignature calcSizeBinaryJumpTable[UA_DATATYPEKINDS]; -/** - * Chunking - * ^^^^^^^^ - * Breaking a message into chunks is integrated with the encoding. When the end - * of a buffer is reached, a callback is executed that sends the current buffer - * as a chunk and exchanges the encoding buffer "underneath" the ongoing - * encoding. This reduces the RAM requirements and unnecessary copying. - * - * In encodeBinaryInternal and Array_encodeBinary, we store a pointer to the - * last "good position" in the buffer. If we reach the end of the buffer, the - * encoding until that point is sent out. Afterwards the "good position" pointer - * is no longer valid. In order to prevent reuse, no method must return - * UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED after having called exchangeBuffer(). - * This needs to be ensured for the following methods: - * - * encodeBinaryInternal - * Array_encodeBinary - * NodeId_encodeBinary - * ExpandedNodeId_encodeBinary - * LocalizedText_encodeBinary - * ExtensionObject_encodeBinary - * Variant_encodeBinary - * DataValue_encodeBinary - * DiagnosticInfo_encodeBinary */ +/* Breaking a message up into chunks is integrated with the encoding. When the + * end of a buffer is reached, a callback is executed that sends the current + * buffer as a chunk and exchanges the encoding buffer "underneath" the ongoing + * encoding. This reduces the RAM requirements and unnecessary copying. */ /* Send the current chunk and replace the buffer */ static status exchangeBuffer(Ctx *ctx) { if(!ctx->exchangeBufferCallback) return UA_STATUSCODE_BADENCODINGERROR; - return ctx->exchangeBufferCallback(ctx->exchangeBufferCallbackHandle, &ctx->pos, &ctx->end); + return ctx->exchangeBufferCallback(ctx->exchangeBufferCallbackHandle, + &ctx->pos, &ctx->end); } -/* If encoding fails, exchange the buffer and try again. It is assumed that the - * following encoding never fails on a fresh buffer. This is true for numerical - * types. */ +/* If encoding fails, exchange the buffer and try again. */ static status -encodeWithExchangeBuffer(const void *ptr, encodeBinarySignature encodeFunc, Ctx *ctx) { - status ret = encodeFunc(ptr, NULL, ctx); - if(ret == UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED) { +encodeWithExchangeBuffer(const void *ptr, const UA_DataType *type, Ctx *ctx) { + u8 *oldpos = ctx->pos; /* Last known good position */ + ctx->oldpos = &oldpos; + status ret = encodeBinaryJumpTable[type->typeKind](ptr, type, ctx); + if(ret == UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED && ctx->oldpos == &oldpos) { + ctx->pos = oldpos; /* Send the position to the last known good position + * and switch */ ret = exchangeBuffer(ctx); if(ret != UA_STATUSCODE_GOOD) return ret; - ret = encodeFunc(ptr, NULL, ctx); + ret = encodeBinaryJumpTable[type->typeKind](ptr, type, ctx); } return ret; } #define ENCODE_WITHEXCHANGE(VAR, TYPE) \ - encodeWithExchangeBuffer((const void*)VAR, (encodeBinarySignature)TYPE##_encodeBinary, ctx) + encodeWithExchangeBuffer((const void*)VAR, &UA_TYPES[TYPE], ctx) /*****************/ /* Integer Types */ @@ -6914,8 +9164,10 @@ UA_decode64(const u8 buf[8], u64 *v) { #endif /* !UA_BINARY_OVERLAYABLE_INTEGER */ /* Boolean */ +/* Note that sizeof(bool) != 1 on some platforms. Overlayable integer encoding + * is disabled in those cases. */ ENCODE_BINARY(Boolean) { - if(ctx->pos + sizeof(bool) > ctx->end) + if(ctx->pos + 1 > ctx->end) return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED; *ctx->pos = *(const u8*)src; ++ctx->pos; @@ -6923,7 +9175,7 @@ ENCODE_BINARY(Boolean) { } DECODE_BINARY(Boolean) { - if(ctx->pos + sizeof(bool) > ctx->end) + if(ctx->pos + 1 > ctx->end) return UA_STATUSCODE_BADDECODINGERROR; *dst = (*ctx->pos > 0) ? true : false; ++ctx->pos; @@ -7026,7 +9278,9 @@ DECODE_BINARY(UInt64) { /* Floating Point Types */ /************************/ -#if UA_BINARY_OVERLAYABLE_FLOAT +/* Can we reuse the integer encoding mechanism by casting floating point + * values? */ +#if (UA_FLOAT_IEEE754 == 1) && (UA_LITTLE_ENDIAN == UA_FLOAT_LITTLE_ENDIAN) # define Float_encodeBinary UInt32_encodeBinary # define Float_decodeBinary UInt32_decodeBinary # define Double_encodeBinary UInt64_encodeBinary @@ -7141,7 +9395,8 @@ DECODE_BINARY(Double) { /******************/ static status -Array_encodeBinaryOverlayable(uintptr_t ptr, size_t length, size_t elementMemSize, Ctx *ctx) { +Array_encodeBinaryOverlayable(uintptr_t ptr, size_t length, + size_t elementMemSize, Ctx *ctx) { /* Store the number of already encoded elements */ size_t finished = 0; @@ -7154,6 +9409,9 @@ Array_encodeBinaryOverlayable(uintptr_t ptr, size_t length, size_t elementMemSiz ptr += possibleMem; finished += possible; status ret = exchangeBuffer(ctx); + ctx->oldpos = NULL; /* Set the sentinel so that no upper stack frame + * with a saved pos attempts to exchange from an + * invalid position in the old buffer. */ if(ret != UA_STATUSCODE_GOOD) return ret; } @@ -7165,35 +9423,23 @@ Array_encodeBinaryOverlayable(uintptr_t ptr, size_t length, size_t elementMemSiz } static status -Array_encodeBinaryComplex(uintptr_t ptr, size_t length, const UA_DataType *type, Ctx *ctx) { - /* Get the encoding function for the data type. The jumptable at - * UA_BUILTIN_TYPES_COUNT points to the generic UA_encodeBinary method */ - size_t encode_index = type->builtin ? type->typeIndex : UA_BUILTIN_TYPES_COUNT; - encodeBinarySignature encodeType = encodeBinaryJumpTable[encode_index]; - +Array_encodeBinaryComplex(uintptr_t ptr, size_t length, + const UA_DataType *type, Ctx *ctx) { /* Encode every element */ for(size_t i = 0; i < length; ++i) { - u8 *oldpos = ctx->pos; - status ret = encodeType((const void*)ptr, type, ctx); + status ret = encodeWithExchangeBuffer((const void*)ptr, type, ctx); ptr += type->memSize; - /* Encoding failed, switch to the next chunk when possible */ - if(ret != UA_STATUSCODE_GOOD) { - if(ret == UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED) { - ctx->pos = oldpos; /* Set buffer position to the end of the last encoded element */ - ret = exchangeBuffer(ctx); - ptr -= type->memSize; /* Undo to retry encoding the ith element */ - --i; - } - UA_assert(ret != UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); - if(ret != UA_STATUSCODE_GOOD) - return ret; /* Unrecoverable fail */ - } + + if(ret != UA_STATUSCODE_GOOD) + return ret; /* Unrecoverable fail */ } + return UA_STATUSCODE_GOOD; } static status -Array_encodeBinary(const void *src, size_t length, const UA_DataType *type, Ctx *ctx) { +Array_encodeBinary(const void *src, size_t length, + const UA_DataType *type, Ctx *ctx) { /* Check and convert the array length to int32 */ i32 signed_length = -1; if(length > UA_INT32_MAX) @@ -7204,7 +9450,7 @@ Array_encodeBinary(const void *src, size_t length, const UA_DataType *type, Ctx signed_length = 0; /* Encode the array length */ - status ret = ENCODE_WITHEXCHANGE(&signed_length, UInt32); + status ret = ENCODE_WITHEXCHANGE(&signed_length, UA_TYPES_INT32); /* Quit early? */ if(ret != UA_STATUSCODE_GOOD || length == 0) @@ -7259,9 +9505,8 @@ Array_decodeBinary(void *UA_RESTRICT *UA_RESTRICT dst, size_t *out_length, } else { /* Decode array members */ uintptr_t ptr = (uintptr_t)*dst; - size_t decode_index = type->builtin ? type->typeIndex : UA_BUILTIN_TYPES_COUNT; for(size_t i = 0; i < length; ++i) { - ret = decodeBinaryJumpTable[decode_index]((void*)ptr, type, ctx); + ret = decodeBinaryJumpTable[type->typeKind]((void*)ptr, type, ctx); if(ret != UA_STATUSCODE_GOOD) { /* +1 because last element is also already initialized */ UA_Array_delete(*dst, i+1, type); @@ -7313,16 +9558,14 @@ DECODE_BINARY(Guid) { } /* NodeId */ -#define UA_NODEIDTYPE_NUMERIC_TWOBYTE 0 -#define UA_NODEIDTYPE_NUMERIC_FOURBYTE 1 -#define UA_NODEIDTYPE_NUMERIC_COMPLETE 2 +#define UA_NODEIDTYPE_NUMERIC_TWOBYTE 0u +#define UA_NODEIDTYPE_NUMERIC_FOURBYTE 1u +#define UA_NODEIDTYPE_NUMERIC_COMPLETE 2u -#define UA_EXPANDEDNODEID_SERVERINDEX_FLAG 0x40 -#define UA_EXPANDEDNODEID_NAMESPACEURI_FLAG 0x80 +#define UA_EXPANDEDNODEID_SERVERINDEX_FLAG 0x40u +#define UA_EXPANDEDNODEID_NAMESPACEURI_FLAG 0x80u -/* For ExpandedNodeId, we prefill the encoding mask. We can return - * UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED before encoding the string, as the - * buffer is not replaced. */ +/* For ExpandedNodeId, we prefill the encoding mask. */ static status NodeId_encodeBinaryWithEncodingMask(UA_NodeId const *src, u8 encoding, Ctx *ctx) { status ret = UA_STATUSCODE_GOOD; @@ -7347,22 +9590,19 @@ NodeId_encodeBinaryWithEncodingMask(UA_NodeId const *src, u8 encoding, Ctx *ctx) ret |= ENCODE_DIRECT(&identifier8, Byte); } break; - case UA_NODEIDTYPE_STRING: - encoding |= UA_NODEIDTYPE_STRING; + case UA_NODEIDTYPE_STRING:encoding |= (u8)UA_NODEIDTYPE_STRING; ret |= ENCODE_DIRECT(&encoding, Byte); ret |= ENCODE_DIRECT(&src->namespaceIndex, UInt16); if(ret != UA_STATUSCODE_GOOD) return ret; ret = ENCODE_DIRECT(&src->identifier.string, String); break; - case UA_NODEIDTYPE_GUID: - encoding |= UA_NODEIDTYPE_GUID; + case UA_NODEIDTYPE_GUID:encoding |= (u8)UA_NODEIDTYPE_GUID; ret |= ENCODE_DIRECT(&encoding, Byte); ret |= ENCODE_DIRECT(&src->namespaceIndex, UInt16); ret |= ENCODE_DIRECT(&src->identifier.guid, Guid); break; - case UA_NODEIDTYPE_BYTESTRING: - encoding |= UA_NODEIDTYPE_BYTESTRING; + case UA_NODEIDTYPE_BYTESTRING:encoding |= (u8)UA_NODEIDTYPE_BYTESTRING; ret |= ENCODE_DIRECT(&encoding, Byte); ret |= ENCODE_DIRECT(&src->namespaceIndex, UInt16); if(ret != UA_STATUSCODE_GOOD) @@ -7389,8 +9629,8 @@ DECODE_BINARY(NodeId) { return ret; /* Filter out the bits used only for ExpandedNodeIds */ - encodingByte &= (u8)~(UA_EXPANDEDNODEID_SERVERINDEX_FLAG | - UA_EXPANDEDNODEID_NAMESPACEURI_FLAG); + encodingByte &= (u8)~(u8)(UA_EXPANDEDNODEID_SERVERINDEX_FLAG | + UA_EXPANDEDNODEID_NAMESPACEURI_FLAG); /* Decode the namespace and identifier */ switch(encodingByte) { @@ -7448,19 +9688,16 @@ ENCODE_BINARY(ExpandedNodeId) { if(ret != UA_STATUSCODE_GOOD) return ret; - /* Encode the namespace. Do not return - * UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED afterwards. */ + /* Encode the namespace. */ if((void*)src->namespaceUri.data > UA_EMPTY_ARRAY_SENTINEL) { ret = ENCODE_DIRECT(&src->namespaceUri, String); - UA_assert(ret != UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); if(ret != UA_STATUSCODE_GOOD) return ret; } /* Encode the serverIndex */ if(src->serverIndex > 0) - ret = ENCODE_WITHEXCHANGE(&src->serverIndex, UInt32); - UA_assert(ret != UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); + ret = ENCODE_WITHEXCHANGE(&src->serverIndex, UA_TYPES_UINT32); return ret; } @@ -7485,9 +9722,22 @@ DECODE_BINARY(ExpandedNodeId) { return ret; } +/* QualifiedName */ +ENCODE_BINARY(QualifiedName) { + status ret = ENCODE_DIRECT(&src->namespaceIndex, UInt16); + ret |= ENCODE_DIRECT(&src->name, String); + return ret; +} + +DECODE_BINARY(QualifiedName) { + status ret = DECODE_DIRECT(&dst->namespaceIndex, UInt16); + ret |= DECODE_DIRECT(&dst->name, String); + return ret; +} + /* LocalizedText */ -#define UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_LOCALE 0x01 -#define UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT 0x02 +#define UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_LOCALE 0x01u +#define UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT 0x02u ENCODE_BINARY(LocalizedText) { /* Set up the encoding mask */ @@ -7507,7 +9757,6 @@ ENCODE_BINARY(LocalizedText) { ret |= ENCODE_DIRECT(&src->locale, String); if(encoding & UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT) ret |= ENCODE_DIRECT(&src->text, String); - UA_assert(ret != UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); return ret; } @@ -7540,13 +9789,14 @@ UA_findDataTypeByBinaryInternal(const UA_NodeId *typeId, Ctx *ctx) { return &UA_TYPES[i]; } - /* When other namespace look in custom types, too */ - if(typeId->namespaceIndex != 0) { - for(size_t i = 0; i < ctx->customTypesArraySize; ++i) { - if(ctx->customTypesArray[i].binaryEncodingId == typeId->identifier.numeric && - ctx->customTypesArray[i].typeId.namespaceIndex == typeId->namespaceIndex) - return &ctx->customTypesArray[i]; + const UA_DataTypeArray *customTypes = ctx->customTypes; + while(customTypes) { + for(size_t i = 0; i < customTypes->typesSize; ++i) { + if(customTypes->types[i].binaryEncodingId == typeId->identifier.numeric && + customTypes->types[i].typeId.namespaceIndex == typeId->namespaceIndex) + return &customTypes->types[i]; } + customTypes = customTypes->next; } return NULL; @@ -7555,8 +9805,7 @@ UA_findDataTypeByBinaryInternal(const UA_NodeId *typeId, Ctx *ctx) { const UA_DataType * UA_findDataTypeByBinary(const UA_NodeId *typeId) { Ctx ctx; - ctx.customTypesArraySize = 0; - ctx.customTypesArray = NULL; + ctx.customTypes = NULL; return UA_findDataTypeByBinaryInternal(typeId, &ctx); } @@ -7564,13 +9813,12 @@ UA_findDataTypeByBinary(const UA_NodeId *typeId) { ENCODE_BINARY(ExtensionObject) { u8 encoding = (u8)src->encoding; - /* No content or already encoded content. Do not return - * UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED after encoding the NodeId. */ + /* No content or already encoded content. */ if(encoding <= UA_EXTENSIONOBJECT_ENCODED_XML) { status ret = ENCODE_DIRECT(&src->content.encoded.typeId, NodeId); if(ret != UA_STATUSCODE_GOOD) return ret; - ret = ENCODE_WITHEXCHANGE(&encoding, Byte); + ret = ENCODE_WITHEXCHANGE(&encoding, UA_TYPES_BYTE); if(ret != UA_STATUSCODE_GOOD) return ret; switch(src->encoding) { @@ -7617,7 +9865,7 @@ ENCODE_BINARY(ExtensionObject) { return ret; /* Encode the content */ - return encodeBinaryInternal(src->content.decoded.data, contentType, ctx); + return encodeWithExchangeBuffer(src->content.decoded.data, contentType, ctx); } static status @@ -7643,8 +9891,7 @@ ExtensionObject_decodeBinaryContent(UA_ExtensionObject *dst, const UA_NodeId *ty /* Decode */ dst->encoding = UA_EXTENSIONOBJECT_DECODED; dst->content.decoded.type = type; - size_t decode_index = type->builtin ? type->typeIndex : UA_BUILTIN_TYPES_COUNT; - return decodeBinaryJumpTable[decode_index](dst->content.decoded.data, type, ctx); + return decodeBinaryJumpTable[type->typeKind](dst->content.decoded.data, type, ctx); } DECODE_BINARY(ExtensionObject) { @@ -7659,26 +9906,31 @@ DECODE_BINARY(ExtensionObject) { ret |= DECODE_DIRECT(&binTypeId, NodeId); ret |= DECODE_DIRECT(&encoding, Byte); if(ret != UA_STATUSCODE_GOOD) { - UA_NodeId_deleteMembers(&binTypeId); + UA_NodeId_clear(&binTypeId); return ret; } - if(encoding == UA_EXTENSIONOBJECT_ENCODED_BYTESTRING) { + switch(encoding) { + case UA_EXTENSIONOBJECT_ENCODED_BYTESTRING: ret = ExtensionObject_decodeBinaryContent(dst, &binTypeId, ctx); UA_NodeId_deleteMembers(&binTypeId); - } else if(encoding == UA_EXTENSIONOBJECT_ENCODED_NOBODY) { + break; + case UA_EXTENSIONOBJECT_ENCODED_NOBODY: dst->encoding = (UA_ExtensionObjectEncoding)encoding; dst->content.encoded.typeId = binTypeId; /* move to dst */ dst->content.encoded.body = UA_BYTESTRING_NULL; - } else if(encoding == UA_EXTENSIONOBJECT_ENCODED_XML) { + break; + case UA_EXTENSIONOBJECT_ENCODED_XML: dst->encoding = (UA_ExtensionObjectEncoding)encoding; dst->content.encoded.typeId = binTypeId; /* move to dst */ ret = DECODE_DIRECT(&dst->content.encoded.body, String); /* ByteString */ if(ret != UA_STATUSCODE_GOOD) - UA_NodeId_deleteMembers(&dst->content.encoded.typeId); - } else { - UA_NodeId_deleteMembers(&binTypeId); + UA_NodeId_clear(&dst->content.encoded.typeId); + break; + default: + UA_NodeId_clear(&binTypeId); ret = UA_STATUSCODE_BADDECODINGERROR; + break; } return ret; @@ -7686,9 +9938,9 @@ DECODE_BINARY(ExtensionObject) { /* Variant */ -/* Never returns UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED */ static status -Variant_encodeBinaryWrapExtensionObject(const UA_Variant *src, const bool isArray, Ctx *ctx) { +Variant_encodeBinaryWrapExtensionObject(const UA_Variant *src, + const UA_Boolean isArray, Ctx *ctx) { /* Default to 1 for a scalar. */ size_t length = 1; @@ -7715,20 +9967,18 @@ Variant_encodeBinaryWrapExtensionObject(const UA_Variant *src, const bool isArra /* Iterate over the array */ for(size_t i = 0; i < length && ret == UA_STATUSCODE_GOOD; ++i) { eo.content.decoded.data = (void*)ptr; - ret = encodeBinaryInternal(&eo, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT], ctx); + ret = encodeWithExchangeBuffer(&eo, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT], ctx); ptr += memSize; } return ret; } enum UA_VARIANT_ENCODINGMASKTYPE { - UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK = 0x3F, /* bits 0:5 */ - UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS = (0x01 << 6), /* bit 6 */ - UA_VARIANT_ENCODINGMASKTYPE_ARRAY = (0x01 << 7) /* bit 7 */ + UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK = 0x3Fu, /* bits 0:5 */ + UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS = (u8)(0x01u << 6u), /* bit 6 */ + UA_VARIANT_ENCODINGMASKTYPE_ARRAY = (u8)(0x01u << 7u) /* bit 7 */ }; - - ENCODE_BINARY(Variant) { /* Quit early for the empty variant */ u8 encoding = 0; @@ -7736,23 +9986,22 @@ ENCODE_BINARY(Variant) { return ENCODE_DIRECT(&encoding, Byte); /* Set the content type in the encoding mask */ - const bool isBuiltin = src->type->builtin; - const bool isAlias = src->type->membersSize == 1 - && UA_TYPES[src->type->members[0].memberTypeIndex].builtin; + const UA_Boolean isBuiltin = (src->type->typeKind <= UA_DATATYPEKIND_DIAGNOSTICINFO); + const UA_Boolean isEnum = (src->type->typeKind == UA_DATATYPEKIND_ENUM); if(isBuiltin) - encoding |= UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (u8)(src->type->typeIndex + 1); - else if(isAlias) - encoding |= UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (u8)(src->type->members[0].memberTypeIndex + 1); + encoding = (u8)(encoding | (u8)((u8)UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (u8)(src->type->typeKind + 1u))); + else if(isEnum) + encoding = (u8)(encoding | (u8)((u8)UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (u8)(UA_TYPES_INT32 + 1u))); else - encoding |= UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (u8)(UA_TYPES_EXTENSIONOBJECT + 1); + encoding = (u8)(encoding | (u8)((u8)UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (u8)(UA_TYPES_EXTENSIONOBJECT + 1u))); /* Set the array type in the encoding mask */ - const bool isArray = src->arrayLength > 0 || src->data <= UA_EMPTY_ARRAY_SENTINEL; - const bool hasDimensions = isArray && src->arrayDimensionsSize > 0; + const UA_Boolean isArray = src->arrayLength > 0 || src->data <= UA_EMPTY_ARRAY_SENTINEL; + const UA_Boolean hasDimensions = isArray && src->arrayDimensionsSize > 0; if(isArray) { - encoding |= UA_VARIANT_ENCODINGMASKTYPE_ARRAY; + encoding |= (u8)UA_VARIANT_ENCODINGMASKTYPE_ARRAY; if(hasDimensions) - encoding |= UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS; + encoding |= (u8)UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS; } /* Encode the encoding byte */ @@ -7761,10 +10010,10 @@ ENCODE_BINARY(Variant) { return ret; /* Encode the content */ - if(!isBuiltin && !isAlias) + if(!isBuiltin && !isEnum) ret = Variant_encodeBinaryWrapExtensionObject(src, isArray, ctx); else if(!isArray) - ret = encodeBinaryInternal(src->data, src->type, ctx); + ret = encodeWithExchangeBuffer(src->data, src->type, ctx); else ret = Array_encodeBinary(src->data, src->arrayLength, src->type, ctx); @@ -7792,7 +10041,7 @@ Variant_decodeBinaryUnwrapExtensionObject(UA_Variant *dst, Ctx *ctx) { u8 encoding; ret = DECODE_DIRECT(&encoding, Byte); if(ret != UA_STATUSCODE_GOOD) { - UA_NodeId_deleteMembers(&typeId); + UA_NodeId_clear(&typeId); return ret; } @@ -7805,7 +10054,7 @@ Variant_decodeBinaryUnwrapExtensionObject(UA_Variant *dst, Ctx *ctx) { /* Reset and decode as ExtensionObject */ dst->type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]; ctx->pos = old_pos; - UA_NodeId_deleteMembers(&typeId); + UA_NodeId_clear(&typeId); } /* Allocate memory */ @@ -7814,8 +10063,7 @@ Variant_decodeBinaryUnwrapExtensionObject(UA_Variant *dst, Ctx *ctx) { return UA_STATUSCODE_BADOUTOFMEMORY; /* Decode the content */ - size_t decode_index = dst->type->builtin ? dst->type->typeIndex : UA_BUILTIN_TYPES_COUNT; - return decodeBinaryJumpTable[decode_index](dst->data, dst->type, ctx); + return decodeBinaryJumpTable[dst->type->typeKind](dst->data, dst->type, ctx); } /* The resulting variant always has the storagetype UA_VARIANT_DATA. */ @@ -7831,17 +10079,19 @@ DECODE_BINARY(Variant) { return UA_STATUSCODE_GOOD; /* Does the variant contain an array? */ - const bool isArray = (encodingByte & UA_VARIANT_ENCODINGMASKTYPE_ARRAY) > 0; + const UA_Boolean isArray = (encodingByte & (u8)UA_VARIANT_ENCODINGMASKTYPE_ARRAY) > 0; /* Get the datatype of the content. The type must be a builtin data type. - * All not-builtin types are wrapped in an ExtensionObject. */ - size_t typeIndex = (size_t)((encodingByte & UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK) - 1); - if(typeIndex > UA_TYPES_DIAGNOSTICINFO) + * All not-builtin types are wrapped in an ExtensionObject. The "type kind" + * for types up to DiagnsticInfo equals to the index in the encoding + * byte. */ + size_t typeKind = (size_t)((encodingByte & (u8)UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK) - 1); + if(typeKind > UA_DATATYPEKIND_DIAGNOSTICINFO) return UA_STATUSCODE_BADDECODINGERROR; /* A variant cannot contain a variant. But it can contain an array of * variants */ - if(typeIndex == UA_TYPES_VARIANT && !isArray) + if(typeKind == UA_DATATYPEKIND_VARIANT && !isArray) return UA_STATUSCODE_BADDECODINGERROR; /* Check the recursion limit */ @@ -7850,20 +10100,20 @@ DECODE_BINARY(Variant) { ctx->depth++; /* Decode the content */ - dst->type = &UA_TYPES[typeIndex]; + dst->type = &UA_TYPES[typeKind]; if(isArray) { ret = Array_decodeBinary(&dst->data, &dst->arrayLength, dst->type, ctx); - } else if(typeIndex != UA_TYPES_EXTENSIONOBJECT) { + } else if(typeKind != UA_DATATYPEKIND_EXTENSIONOBJECT) { dst->data = UA_new(dst->type); if(!dst->data) return UA_STATUSCODE_BADOUTOFMEMORY; - ret = decodeBinaryJumpTable[typeIndex](dst->data, dst->type, ctx); + ret = decodeBinaryJumpTable[typeKind](dst->data, dst->type, ctx); } else { ret = Variant_decodeBinaryUnwrapExtensionObject(dst, ctx); } /* Decode array dimensions */ - if(isArray && (encodingByte & UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS) > 0) + if(isArray && (encodingByte & (u8)UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS) > 0) ret |= Array_decodeBinary((void**)&dst->arrayDimensions, &dst->arrayDimensionsSize, &UA_TYPES[UA_TYPES_INT32], ctx); @@ -7874,22 +10124,19 @@ DECODE_BINARY(Variant) { /* DataValue */ ENCODE_BINARY(DataValue) { /* Set up the encoding mask */ - u8 encodingMask = (u8) - (((u8)src->hasValue) | - ((u8)src->hasStatus << 1) | - ((u8)src->hasSourceTimestamp << 2) | - ((u8)src->hasServerTimestamp << 3) | - ((u8)src->hasSourcePicoseconds << 4) | - ((u8)src->hasServerPicoseconds << 5)); + u8 encodingMask = src->hasValue; + encodingMask |= (u8)(src->hasStatus << 1u); + encodingMask |= (u8)(src->hasSourceTimestamp << 2u); + encodingMask |= (u8)(src->hasServerTimestamp << 3u); + encodingMask |= (u8)(src->hasSourcePicoseconds << 4u); + encodingMask |= (u8)(src->hasServerPicoseconds << 5u); /* Encode the encoding byte */ status ret = ENCODE_DIRECT(&encodingMask, Byte); if(ret != UA_STATUSCODE_GOOD) return ret; - /* Encode the variant. Afterwards, do not return - * UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED, as the buffer might have been - * exchanged during encoding of the variant. */ + /* Encode the variant. */ if(src->hasValue) { ret = ENCODE_DIRECT(&src->value, Variant); if(ret != UA_STATUSCODE_GOOD) @@ -7897,16 +10144,15 @@ ENCODE_BINARY(DataValue) { } if(src->hasStatus) - ret |= ENCODE_WITHEXCHANGE(&src->status, UInt32); + ret |= ENCODE_WITHEXCHANGE(&src->status, UA_TYPES_STATUSCODE); if(src->hasSourceTimestamp) - ret |= ENCODE_WITHEXCHANGE(&src->sourceTimestamp, UInt64); + ret |= ENCODE_WITHEXCHANGE(&src->sourceTimestamp, UA_TYPES_DATETIME); if(src->hasSourcePicoseconds) - ret |= ENCODE_WITHEXCHANGE(&src->sourcePicoseconds, UInt16); + ret |= ENCODE_WITHEXCHANGE(&src->sourcePicoseconds, UA_TYPES_UINT16); if(src->hasServerTimestamp) - ret |= ENCODE_WITHEXCHANGE(&src->serverTimestamp, UInt64); + ret |= ENCODE_WITHEXCHANGE(&src->serverTimestamp, UA_TYPES_DATETIME); if(src->hasServerPicoseconds) - ret |= ENCODE_WITHEXCHANGE(&src->serverPicoseconds, UInt16); - UA_assert(ret != UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); + ret |= ENCODE_WITHEXCHANGE(&src->serverPicoseconds, UA_TYPES_UINT16); return ret; } @@ -7924,31 +10170,30 @@ DECODE_BINARY(DataValue) { return UA_STATUSCODE_BADENCODINGERROR; ctx->depth++; - /* Decode the content */ - if(encodingMask & 0x01) { + if(encodingMask & 0x01u) { dst->hasValue = true; ret |= DECODE_DIRECT(&dst->value, Variant); } - if(encodingMask & 0x02) { + if(encodingMask & 0x02u) { dst->hasStatus = true; ret |= DECODE_DIRECT(&dst->status, UInt32); /* StatusCode */ } - if(encodingMask & 0x04) { + if(encodingMask & 0x04u) { dst->hasSourceTimestamp = true; ret |= DECODE_DIRECT(&dst->sourceTimestamp, UInt64); /* DateTime */ } - if(encodingMask & 0x10) { + if(encodingMask & 0x10u) { dst->hasSourcePicoseconds = true; ret |= DECODE_DIRECT(&dst->sourcePicoseconds, UInt16); if(dst->sourcePicoseconds > MAX_PICO_SECONDS) dst->sourcePicoseconds = MAX_PICO_SECONDS; } - if(encodingMask & 0x08) { + if(encodingMask & 0x08u) { dst->hasServerTimestamp = true; ret |= DECODE_DIRECT(&dst->serverTimestamp, UInt64); /* DateTime */ } - if(encodingMask & 0x20) { + if(encodingMask & 0x20u) { dst->hasServerPicoseconds = true; ret |= DECODE_DIRECT(&dst->serverPicoseconds, UInt16); if(dst->serverPicoseconds > MAX_PICO_SECONDS) @@ -7963,10 +10208,12 @@ DECODE_BINARY(DataValue) { /* DiagnosticInfo */ ENCODE_BINARY(DiagnosticInfo) { /* Set up the encoding mask */ - u8 encodingMask = (u8) - ((u8)src->hasSymbolicId | ((u8)src->hasNamespaceUri << 1) | - ((u8)src->hasLocalizedText << 2) | ((u8)src->hasLocale << 3) | - ((u8)src->hasAdditionalInfo << 4) | ((u8)src->hasInnerDiagnosticInfo << 5)); + u8 encodingMask = src->hasSymbolicId; + encodingMask |= (u8)(src->hasNamespaceUri << 1u); + encodingMask |= (u8)(src->hasLocalizedText << 2u); + encodingMask |= (u8)(src->hasLocale << 3u); + encodingMask |= (u8)(src->hasAdditionalInfo << 4u); + encodingMask |= (u8)(src->hasInnerDiagnosticInfo << 5u); /* Encode the numeric content */ status ret = ENCODE_DIRECT(&encodingMask, Byte); @@ -7988,22 +10235,19 @@ ENCODE_BINARY(DiagnosticInfo) { return ret; } - /* From here on, do not return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED, as - * the buffer might have been exchanged during encoding of the string. */ - /* Encode the inner status code */ if(src->hasInnerStatusCode) { - ret = ENCODE_WITHEXCHANGE(&src->innerStatusCode, UInt32); - UA_assert(ret != UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); + ret = ENCODE_WITHEXCHANGE(&src->innerStatusCode, UA_TYPES_UINT32); if(ret != UA_STATUSCODE_GOOD) return ret; } /* Encode the inner diagnostic info */ if(src->hasInnerDiagnosticInfo) - ret = encodeBinaryInternal(src->innerDiagnosticInfo, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO], ctx); + // innerDiagnosticInfo is already a pointer, so don't use the & reference here + ret = ENCODE_WITHEXCHANGE(src->innerDiagnosticInfo, + UA_TYPES_DIAGNOSTICINFO); - UA_assert(ret != UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); return ret; } @@ -8015,31 +10259,31 @@ DECODE_BINARY(DiagnosticInfo) { return ret; /* Decode the content */ - if(encodingMask & 0x01) { + if(encodingMask & 0x01u) { dst->hasSymbolicId = true; ret |= DECODE_DIRECT(&dst->symbolicId, UInt32); /* Int32 */ } - if(encodingMask & 0x02) { + if(encodingMask & 0x02u) { dst->hasNamespaceUri = true; ret |= DECODE_DIRECT(&dst->namespaceUri, UInt32); /* Int32 */ } - if(encodingMask & 0x04) { + if(encodingMask & 0x04u) { dst->hasLocalizedText = true; ret |= DECODE_DIRECT(&dst->localizedText, UInt32); /* Int32 */ } - if(encodingMask & 0x08) { + if(encodingMask & 0x08u) { dst->hasLocale = true; ret |= DECODE_DIRECT(&dst->locale, UInt32); /* Int32 */ } - if(encodingMask & 0x10) { + if(encodingMask & 0x10u) { dst->hasAdditionalInfo = true; ret |= DECODE_DIRECT(&dst->additionalInfo, String); } - if(encodingMask & 0x20) { + if(encodingMask & 0x20u) { dst->hasInnerStatusCode = true; ret |= DECODE_DIRECT(&dst->innerStatusCode, UInt32); /* StatusCode */ } - if(encodingMask & 0x40) { + if(encodingMask & 0x40u) { /* innerDiagnosticInfo is allocated on the heap */ dst->innerDiagnosticInfo = (UA_DiagnosticInfo*) UA_calloc(1, sizeof(UA_DiagnosticInfo)); @@ -8058,11 +10302,53 @@ DECODE_BINARY(DiagnosticInfo) { return ret; } +static status +encodeBinaryStruct(const void *src, const UA_DataType *type, Ctx *ctx) { + /* Check the recursion limit */ + if(ctx->depth > UA_ENCODING_MAX_RECURSION) + return UA_STATUSCODE_BADENCODINGERROR; + ctx->depth++; + + uintptr_t ptr = (uintptr_t)src; + status ret = UA_STATUSCODE_GOOD; + u8 membersSize = type->membersSize; + const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; + + /* Loop over members */ + for(size_t i = 0; i < membersSize; ++i) { + const UA_DataTypeMember *m = &type->members[i]; + const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex]; + ptr += m->padding; + + /* Array. Buffer-exchange is done inside Array_encodeBinary if required. */ + if(m->isArray) { + const size_t length = *((const size_t*)ptr); + ptr += sizeof(size_t); + ret = Array_encodeBinary(*(void *UA_RESTRICT const *)ptr, length, mt, ctx); + ptr += sizeof(void*); + continue; + } + + /* Scalar */ + ret = encodeWithExchangeBuffer((const void*)ptr, mt, ctx); + ptr += mt->memSize; + } + + ctx->depth--; + return ret; +} + +static status +encodeBinaryNotImplemented(const void *src, const UA_DataType *type, Ctx *ctx) { + (void)src, (void)type, (void)ctx; + return UA_STATUSCODE_BADNOTIMPLEMENTED; +} + /********************/ /* Structured Types */ /********************/ -const encodeBinarySignature encodeBinaryJumpTable[UA_BUILTIN_TYPES_COUNT + 1] = { +const encodeBinarySignature encodeBinaryJumpTable[UA_DATATYPEKINDS] = { (encodeBinarySignature)Boolean_encodeBinary, (encodeBinarySignature)Byte_encodeBinary, /* SByte */ (encodeBinarySignature)Byte_encodeBinary, @@ -8082,61 +10368,20 @@ const encodeBinarySignature encodeBinaryJumpTable[UA_BUILTIN_TYPES_COUNT + 1] = (encodeBinarySignature)NodeId_encodeBinary, (encodeBinarySignature)ExpandedNodeId_encodeBinary, (encodeBinarySignature)UInt32_encodeBinary, /* StatusCode */ - (encodeBinarySignature)encodeBinaryInternal, /* QualifiedName */ + (encodeBinarySignature)QualifiedName_encodeBinary, (encodeBinarySignature)LocalizedText_encodeBinary, (encodeBinarySignature)ExtensionObject_encodeBinary, (encodeBinarySignature)DataValue_encodeBinary, (encodeBinarySignature)Variant_encodeBinary, (encodeBinarySignature)DiagnosticInfo_encodeBinary, - (encodeBinarySignature)encodeBinaryInternal, + (encodeBinarySignature)encodeBinaryNotImplemented, /* Decimal */ + (encodeBinarySignature)UInt32_encodeBinary, /* Enumeration */ + (encodeBinarySignature)encodeBinaryStruct, + (encodeBinarySignature)encodeBinaryNotImplemented, /* Structure with Optional Fields */ + (encodeBinarySignature)encodeBinaryStruct, /* Union */ + (encodeBinarySignature)encodeBinaryStruct /* BitfieldCluster */ }; -static status -encodeBinaryInternal(const void *src, const UA_DataType *type, Ctx *ctx) { - /* Check the recursion limit */ - if(ctx->depth > UA_ENCODING_MAX_RECURSION) - return UA_STATUSCODE_BADENCODINGERROR; - ctx->depth++; - - uintptr_t ptr = (uintptr_t)src; - status ret = UA_STATUSCODE_GOOD; - u8 membersSize = type->membersSize; - const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; - for(size_t i = 0; i < membersSize && ret == UA_STATUSCODE_GOOD; ++i) { - const UA_DataTypeMember *member = &type->members[i]; - const UA_DataType *membertype = &typelists[!member->namespaceZero][member->memberTypeIndex]; - if(!member->isArray) { - ptr += member->padding; - size_t encode_index = membertype->builtin ? membertype->typeIndex : UA_BUILTIN_TYPES_COUNT; - size_t memSize = membertype->memSize; - u8 *oldpos = ctx->pos; - ret = encodeBinaryJumpTable[encode_index]((const void*)ptr, membertype, ctx); - ptr += memSize; - if(ret == UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED) { - ctx->pos = oldpos; /* exchange/send the buffer */ - ret = exchangeBuffer(ctx); - ptr -= member->padding + memSize; /* encode the same member in the next iteration */ - if(ret == UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED || ctx->pos + memSize > ctx->end) { - /* the send buffer is too small to encode the member, even after exchangeBuffer */ - ret = UA_STATUSCODE_BADRESPONSETOOLARGE; - break; - } - --i; - } - } else { - ptr += member->padding; - const size_t length = *((const size_t*)ptr); - ptr += sizeof(size_t); - ret = Array_encodeBinary(*(void *UA_RESTRICT const *)ptr, length, membertype, ctx); - ptr += sizeof(void*); - } - } - - UA_assert(ret != UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); - ctx->depth--; - return ret; -} - status UA_encodeBinary(const void *src, const UA_DataType *type, u8 **bufPos, const u8 **bufEnd, @@ -8149,11 +10394,11 @@ UA_encodeBinary(const void *src, const UA_DataType *type, ctx.exchangeBufferCallback = exchangeCallback; ctx.exchangeBufferCallbackHandle = exchangeHandle; - if (!ctx.pos) + if(!ctx.pos) return UA_STATUSCODE_BADINVALIDARGUMENT; /* Encode */ - status ret = encodeBinaryInternal(src, type, &ctx); + status ret = encodeWithExchangeBuffer(src, type, &ctx); /* Set the new buffer position for the output. Beware that the buffer might * have been exchanged internally. */ @@ -8162,7 +10407,49 @@ UA_encodeBinary(const void *src, const UA_DataType *type, return ret; } -const decodeBinarySignature decodeBinaryJumpTable[UA_BUILTIN_TYPES_COUNT + 1] = { +static status +decodeBinaryNotImplemented(void *dst, const UA_DataType *type, Ctx *ctx) { + (void)dst, (void)type, (void)ctx; + return UA_STATUSCODE_BADNOTIMPLEMENTED; +} + +static status +decodeBinaryStructure(void *dst, const UA_DataType *type, Ctx *ctx) { + /* Check the recursion limit */ + if(ctx->depth > UA_ENCODING_MAX_RECURSION) + return UA_STATUSCODE_BADENCODINGERROR; + ctx->depth++; + + uintptr_t ptr = (uintptr_t)dst; + status ret = UA_STATUSCODE_GOOD; + u8 membersSize = type->membersSize; + const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; + + /* Loop over members */ + for(size_t i = 0; i < membersSize && ret == UA_STATUSCODE_GOOD; ++i) { + const UA_DataTypeMember *m = &type->members[i]; + const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex]; + ptr += m->padding; + + /* Array */ + if(m->isArray) { + size_t *length = (size_t*)ptr; + ptr += sizeof(size_t); + ret = Array_decodeBinary((void *UA_RESTRICT *UA_RESTRICT)ptr, length, mt , ctx); + ptr += sizeof(void*); + continue; + } + + /* Scalar */ + ret = decodeBinaryJumpTable[mt->typeKind]((void *UA_RESTRICT)ptr, mt, ctx); + ptr += mt->memSize; + } + + ctx->depth--; + return ret; +} + +const decodeBinarySignature decodeBinaryJumpTable[UA_DATATYPEKINDS] = { (decodeBinarySignature)Boolean_decodeBinary, (decodeBinarySignature)Byte_decodeBinary, /* SByte */ (decodeBinarySignature)Byte_decodeBinary, @@ -8182,70 +10469,40 @@ const decodeBinarySignature decodeBinaryJumpTable[UA_BUILTIN_TYPES_COUNT + 1] = (decodeBinarySignature)NodeId_decodeBinary, (decodeBinarySignature)ExpandedNodeId_decodeBinary, (decodeBinarySignature)UInt32_decodeBinary, /* StatusCode */ - (decodeBinarySignature)decodeBinaryInternal, /* QualifiedName */ + (decodeBinarySignature)QualifiedName_decodeBinary, (decodeBinarySignature)LocalizedText_decodeBinary, (decodeBinarySignature)ExtensionObject_decodeBinary, (decodeBinarySignature)DataValue_decodeBinary, (decodeBinarySignature)Variant_decodeBinary, (decodeBinarySignature)DiagnosticInfo_decodeBinary, - (decodeBinarySignature)decodeBinaryInternal + (decodeBinarySignature)decodeBinaryNotImplemented, /* Decimal */ + (decodeBinarySignature)UInt32_decodeBinary, /* Enumeration */ + (decodeBinarySignature)decodeBinaryStructure, + (decodeBinarySignature)decodeBinaryNotImplemented, /* Structure with optional fields */ + (decodeBinarySignature)decodeBinaryNotImplemented, /* Union */ + (decodeBinarySignature)decodeBinaryNotImplemented /* BitfieldCluster */ }; -static status -decodeBinaryInternal(void *dst, const UA_DataType *type, Ctx *ctx) { - /* Check the recursion limit */ - if(ctx->depth > UA_ENCODING_MAX_RECURSION) - return UA_STATUSCODE_BADENCODINGERROR; - ctx->depth++; - - uintptr_t ptr = (uintptr_t)dst; - status ret = UA_STATUSCODE_GOOD; - u8 membersSize = type->membersSize; - const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; - for(size_t i = 0; i < membersSize && ret == UA_STATUSCODE_GOOD; ++i) { - const UA_DataTypeMember *member = &type->members[i]; - const UA_DataType *membertype = &typelists[!member->namespaceZero][member->memberTypeIndex]; - if(!member->isArray) { - ptr += member->padding; - size_t fi = membertype->builtin ? membertype->typeIndex : UA_BUILTIN_TYPES_COUNT; - size_t memSize = membertype->memSize; - ret |= decodeBinaryJumpTable[fi]((void *UA_RESTRICT)ptr, membertype, ctx); - ptr += memSize; - } else { - ptr += member->padding; - size_t *length = (size_t*)ptr; - ptr += sizeof(size_t); - ret |= Array_decodeBinary((void *UA_RESTRICT *UA_RESTRICT)ptr, length, membertype, ctx); - ptr += sizeof(void*); - } - } - - ctx->depth--; - return ret; -} - status UA_decodeBinary(const UA_ByteString *src, size_t *offset, void *dst, - const UA_DataType *type, size_t customTypesSize, - const UA_DataType *customTypes) { + const UA_DataType *type, const UA_DataTypeArray *customTypes) { /* Set up the context */ Ctx ctx; ctx.pos = &src->data[*offset]; ctx.end = &src->data[src->length]; ctx.depth = 0; - ctx.customTypesArraySize = customTypesSize; - ctx.customTypesArray = customTypes; + ctx.customTypes = customTypes; /* Decode */ memset(dst, 0, type->memSize); /* Initialize the value */ - status ret = decodeBinaryInternal(dst, type, &ctx); + status ret = decodeBinaryJumpTable[type->typeKind](dst, type, &ctx); if(ret == UA_STATUSCODE_GOOD) { /* Set the new offset */ *offset = (size_t)(ctx.pos - src->data) / sizeof(u8); } else { /* Clean up */ - UA_deleteMembers(dst, type); + UA_clear(dst, type); memset(dst, 0, type->memSize); } return ret; @@ -8265,29 +10522,24 @@ Array_calcSizeBinary(const void *src, size_t length, const UA_DataType *type) { return s; } uintptr_t ptr = (uintptr_t)src; - size_t encode_index = type->builtin ? type->typeIndex : UA_BUILTIN_TYPES_COUNT; for(size_t i = 0; i < length; ++i) { - s += calcSizeBinaryJumpTable[encode_index]((const void*)ptr, type); + s += calcSizeBinaryJumpTable[type->typeKind]((const void*)ptr, type); ptr += type->memSize; } return s; } -static size_t -calcSizeBinaryMemSize(const void *UA_RESTRICT p, const UA_DataType *type) { - return type->memSize; -} +static size_t calcSizeBinary1(const void *_, const UA_DataType *__) { (void)_, (void)__; return 1; } +static size_t calcSizeBinary2(const void *_, const UA_DataType *__) { (void)_, (void)__; return 2; } +static size_t calcSizeBinary4(const void *_, const UA_DataType *__) { (void)_, (void)__; return 4; } +static size_t calcSizeBinary8(const void *_, const UA_DataType *__) { (void)_, (void)__; return 8; } -CALCSIZE_BINARY(String) { - return 4 + src->length; -} +CALCSIZE_BINARY(String) { return 4 + src->length; } -CALCSIZE_BINARY(Guid) { - return 16; -} +CALCSIZE_BINARY(Guid) { return 16; } CALCSIZE_BINARY(NodeId) { - size_t s = 1; /* encoding byte */ + size_t s = 1; /* Encoding byte */ switch(src->identifierType) { case UA_NODEIDTYPE_NUMERIC: if(src->identifier.numeric > UA_UINT16_MAX || src->namespaceIndex > UA_BYTE_MAX) { @@ -8321,8 +10573,12 @@ CALCSIZE_BINARY(ExpandedNodeId) { return s; } +CALCSIZE_BINARY(QualifiedName) { + return 2 + String_calcSizeBinary(&src->name, NULL); +} + CALCSIZE_BINARY(LocalizedText) { - size_t s = 1; /* encoding byte */ + size_t s = 1; /* Encoding byte */ if(src->locale.data) s += String_calcSizeBinary(&src->locale, NULL); if(src->text.data) @@ -8331,18 +10587,10 @@ CALCSIZE_BINARY(LocalizedText) { } CALCSIZE_BINARY(ExtensionObject) { - size_t s = 1; /* encoding byte */ - if(src->encoding > UA_EXTENSIONOBJECT_ENCODED_XML) { - if(!src->content.decoded.type || !src->content.decoded.data) - return 0; - if(src->content.decoded.type->typeId.identifierType != UA_NODEIDTYPE_NUMERIC) - return 0; - s += NodeId_calcSizeBinary(&src->content.decoded.type->typeId, NULL); - s += 4; /* length */ - const UA_DataType *type = src->content.decoded.type; - size_t encode_index = type->builtin ? type->typeIndex : UA_BUILTIN_TYPES_COUNT; - s += calcSizeBinaryJumpTable[encode_index](src->content.decoded.data, type); - } else { + size_t s = 1; /* Encoding byte */ + + /* Encoded content */ + if(src->encoding <= UA_EXTENSIONOBJECT_ENCODED_XML) { s += NodeId_calcSizeBinary(&src->content.encoded.typeId, NULL); switch(src->encoding) { case UA_EXTENSIONOBJECT_ENCODED_NOBODY: @@ -8354,40 +10602,43 @@ CALCSIZE_BINARY(ExtensionObject) { default: return 0; } + return s; } + + /* Decoded content */ + if(!src->content.decoded.type || !src->content.decoded.data) + return 0; + if(src->content.decoded.type->typeId.identifierType != UA_NODEIDTYPE_NUMERIC) + return 0; + + s += NodeId_calcSizeBinary(&src->content.decoded.type->typeId, NULL); /* Type encoding length */ + s += 4; /* Encoding length field */ + const UA_DataType *type = src->content.decoded.type; + s += calcSizeBinaryJumpTable[type->typeKind](src->content.decoded.data, type); /* Encoding length */ return s; } CALCSIZE_BINARY(Variant) { - size_t s = 1; /* encoding byte */ + size_t s = 1; /* Encoding byte */ if(!src->type) return s; - bool isArray = src->arrayLength > 0 || src->data <= UA_EMPTY_ARRAY_SENTINEL; - bool hasDimensions = isArray && src->arrayDimensionsSize > 0; - bool isBuiltin = src->type->builtin; - - - size_t encode_index = src->type->typeIndex; - if(!isBuiltin) { - encode_index = UA_BUILTIN_TYPES_COUNT; - if(src->type->typeId.identifierType != UA_NODEIDTYPE_NUMERIC) - return 0; - } - - uintptr_t ptr = (uintptr_t)src->data; - size_t length = isArray ? src->arrayLength : 1; - if (isArray) - s += Array_calcSizeBinary((const void*)ptr, length, src->type); + const UA_Boolean isArray = src->arrayLength > 0 || src->data <= UA_EMPTY_ARRAY_SENTINEL; + if(isArray) + s += Array_calcSizeBinary(src->data, src->arrayLength, src->type); else - s += calcSizeBinaryJumpTable[encode_index]((const void*)ptr, src->type); + s += calcSizeBinaryJumpTable[src->type->typeKind](src->data, src->type); - if (!isBuiltin) { + const UA_Boolean isBuiltin = (src->type->typeKind <= UA_DATATYPEKIND_DIAGNOSTICINFO); + const UA_Boolean isEnum = (src->type->typeKind == UA_DATATYPEKIND_ENUM); + if(!isBuiltin && !isEnum) { /* The type is wrapped inside an extensionobject */ /* (NodeId + encoding byte + extension object length) * array length */ + size_t length = isArray ? src->arrayLength : 1; s += (NodeId_calcSizeBinary(&src->type->typeId, NULL) + 1 + 4) * length; } + const UA_Boolean hasDimensions = isArray && src->arrayDimensionsSize > 0; if(hasDimensions) s += Array_calcSizeBinary(src->arrayDimensions, src->arrayDimensionsSize, &UA_TYPES[UA_TYPES_INT32]); @@ -8395,7 +10646,7 @@ CALCSIZE_BINARY(Variant) { } CALCSIZE_BINARY(DataValue) { - size_t s = 1; /* encoding byte */ + size_t s = 1; /* Encoding byte */ if(src->hasValue) s += Variant_calcSizeBinary(&src->value, NULL); if(src->hasStatus) @@ -8412,7 +10663,7 @@ CALCSIZE_BINARY(DataValue) { } CALCSIZE_BINARY(DiagnosticInfo) { - size_t s = 1; /* encoding byte */ + size_t s = 1; /* Encoding byte */ if(src->hasSymbolicId) s += 4; if(src->hasNamespaceUri) @@ -8430,5471 +10681,5546 @@ CALCSIZE_BINARY(DiagnosticInfo) { return s; } -const calcSizeBinarySignature calcSizeBinaryJumpTable[UA_BUILTIN_TYPES_COUNT + 1] = { - (calcSizeBinarySignature)calcSizeBinaryMemSize, /* Boolean */ - (calcSizeBinarySignature)calcSizeBinaryMemSize, /* Byte */ - (calcSizeBinarySignature)calcSizeBinaryMemSize, - (calcSizeBinarySignature)calcSizeBinaryMemSize, /* Int16 */ - (calcSizeBinarySignature)calcSizeBinaryMemSize, - (calcSizeBinarySignature)calcSizeBinaryMemSize, /* Int32 */ - (calcSizeBinarySignature)calcSizeBinaryMemSize, - (calcSizeBinarySignature)calcSizeBinaryMemSize, /* Int64 */ - (calcSizeBinarySignature)calcSizeBinaryMemSize, - (calcSizeBinarySignature)calcSizeBinaryMemSize, /* Float */ - (calcSizeBinarySignature)calcSizeBinaryMemSize, /* Double */ - (calcSizeBinarySignature)String_calcSizeBinary, - (calcSizeBinarySignature)calcSizeBinaryMemSize, /* DateTime */ - (calcSizeBinarySignature)Guid_calcSizeBinary, - (calcSizeBinarySignature)String_calcSizeBinary, /* ByteString */ - (calcSizeBinarySignature)String_calcSizeBinary, /* XmlElement */ - (calcSizeBinarySignature)NodeId_calcSizeBinary, - (calcSizeBinarySignature)ExpandedNodeId_calcSizeBinary, - (calcSizeBinarySignature)calcSizeBinaryMemSize, /* StatusCode */ - (calcSizeBinarySignature)UA_calcSizeBinary, /* QualifiedName */ - (calcSizeBinarySignature)LocalizedText_calcSizeBinary, - (calcSizeBinarySignature)ExtensionObject_calcSizeBinary, - (calcSizeBinarySignature)DataValue_calcSizeBinary, - (calcSizeBinarySignature)Variant_calcSizeBinary, - (calcSizeBinarySignature)DiagnosticInfo_calcSizeBinary, - (calcSizeBinarySignature)UA_calcSizeBinary -}; - -size_t -UA_calcSizeBinary(void *p, const UA_DataType *type) { +static size_t +calcSizeBinaryStructure(const void *p, const UA_DataType *type) { size_t s = 0; uintptr_t ptr = (uintptr_t)p; u8 membersSize = type->membersSize; const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; + + /* Loop over members */ for(size_t i = 0; i < membersSize; ++i) { const UA_DataTypeMember *member = &type->members[i]; const UA_DataType *membertype = &typelists[!member->namespaceZero][member->memberTypeIndex]; - if(!member->isArray) { - ptr += member->padding; - size_t encode_index = membertype->builtin ? membertype->typeIndex : UA_BUILTIN_TYPES_COUNT; - s += calcSizeBinaryJumpTable[encode_index]((const void*)ptr, membertype); - ptr += membertype->memSize; - } else { - ptr += member->padding; + ptr += member->padding; + + /* Array */ + if(member->isArray) { const size_t length = *((const size_t*)ptr); ptr += sizeof(size_t); s += Array_calcSizeBinary(*(void *UA_RESTRICT const *)ptr, length, membertype); ptr += sizeof(void*); + continue; } + + /* Scalar */ + s += calcSizeBinaryJumpTable[membertype->typeKind]((const void*)ptr, membertype); + ptr += membertype->memSize; } + return s; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/build/src_generated/ua_types_generated.c" ***********************************/ +static size_t +calcSizeBinaryNotImplemented(const void *p, const UA_DataType *type) { + (void)p, (void)type; + return 0; +} + +const calcSizeBinarySignature calcSizeBinaryJumpTable[UA_DATATYPEKINDS] = { + (calcSizeBinarySignature)calcSizeBinary1, /* Boolean */ + (calcSizeBinarySignature)calcSizeBinary1, /* SByte */ + (calcSizeBinarySignature)calcSizeBinary1, /* Byte */ + (calcSizeBinarySignature)calcSizeBinary2, /* Int16 */ + (calcSizeBinarySignature)calcSizeBinary2, /* UInt16 */ + (calcSizeBinarySignature)calcSizeBinary4, /* Int32 */ + (calcSizeBinarySignature)calcSizeBinary4, /* UInt32 */ + (calcSizeBinarySignature)calcSizeBinary8, /* Int64 */ + (calcSizeBinarySignature)calcSizeBinary8, /* UInt64 */ + (calcSizeBinarySignature)calcSizeBinary4, /* Float */ + (calcSizeBinarySignature)calcSizeBinary8, /* Double */ + (calcSizeBinarySignature)String_calcSizeBinary, + (calcSizeBinarySignature)calcSizeBinary8, /* DateTime */ + (calcSizeBinarySignature)Guid_calcSizeBinary, + (calcSizeBinarySignature)String_calcSizeBinary, /* ByteString */ + (calcSizeBinarySignature)String_calcSizeBinary, /* XmlElement */ + (calcSizeBinarySignature)NodeId_calcSizeBinary, + (calcSizeBinarySignature)ExpandedNodeId_calcSizeBinary, + (calcSizeBinarySignature)calcSizeBinary4, /* StatusCode */ + (calcSizeBinarySignature)QualifiedName_calcSizeBinary, + (calcSizeBinarySignature)LocalizedText_calcSizeBinary, + (calcSizeBinarySignature)ExtensionObject_calcSizeBinary, + (calcSizeBinarySignature)DataValue_calcSizeBinary, + (calcSizeBinarySignature)Variant_calcSizeBinary, + (calcSizeBinarySignature)DiagnosticInfo_calcSizeBinary, + (calcSizeBinarySignature)calcSizeBinaryNotImplemented, /* Decimal */ + (calcSizeBinarySignature)calcSizeBinary4, /* Enumeration */ + (calcSizeBinarySignature)calcSizeBinaryStructure, + (calcSizeBinarySignature)calcSizeBinaryNotImplemented, /* Structure with Optional Fields */ + (calcSizeBinarySignature)calcSizeBinaryNotImplemented, /* Union */ + (calcSizeBinarySignature)calcSizeBinaryNotImplemented /* BitfieldCluster */ +}; + +size_t +UA_calcSizeBinary(const void *p, const UA_DataType *type) { + return calcSizeBinaryJumpTable[type->typeKind](p, type); +} + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/types_generated.c" ***********************************/ -/* Generated from Opc.Ua.Types.bsd with script /home/travis/build/open62541/open62541/tools/generate_datatypes.py - * on host travis-job-193db498-e14a-4886-911f-7172c9e50b7a by user travis at 2018-12-19 02:29:43 */ +/* Generated from Opc.Ua.Types.bsd with script /Users/jelena/Desktop/open62541/tools/generate_datatypes.py + * on host Jelena-2.local by user jelena at 2025-09-11 03:30:41 */ /* Boolean */ -static UA_DataTypeMember Boolean_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define Boolean_members NULL /* SByte */ -static UA_DataTypeMember SByte_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_SBYTE, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define SByte_members NULL /* Byte */ -static UA_DataTypeMember Byte_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define Byte_members NULL /* Int16 */ -static UA_DataTypeMember Int16_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT16, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define Int16_members NULL /* UInt16 */ -static UA_DataTypeMember UInt16_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_UINT16, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define UInt16_members NULL /* Int32 */ -static UA_DataTypeMember Int32_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define Int32_members NULL /* UInt32 */ -static UA_DataTypeMember UInt32_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define UInt32_members NULL /* Int64 */ -static UA_DataTypeMember Int64_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT64, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define Int64_members NULL /* UInt64 */ -static UA_DataTypeMember UInt64_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_UINT64, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define UInt64_members NULL /* Float */ -static UA_DataTypeMember Float_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_FLOAT, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define Float_members NULL /* Double */ -static UA_DataTypeMember Double_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_DOUBLE, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define Double_members NULL /* String */ -static UA_DataTypeMember String_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; +#define String_members NULL /* DateTime */ -static UA_DataTypeMember DateTime_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_DATETIME, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define DateTime_members NULL /* Guid */ -static UA_DataTypeMember Guid_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_GUID, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define Guid_members NULL /* ByteString */ -static UA_DataTypeMember ByteString_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; +#define ByteString_members NULL /* XmlElement */ -static UA_DataTypeMember XmlElement_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; +#define XmlElement_members NULL /* NodeId */ -static UA_DataTypeMember NodeId_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define NodeId_members NULL /* ExpandedNodeId */ -static UA_DataTypeMember ExpandedNodeId_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define ExpandedNodeId_members NULL /* StatusCode */ -static UA_DataTypeMember StatusCode_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define StatusCode_members NULL /* QualifiedName */ -static UA_DataTypeMember QualifiedName_members[2] = { -{ - UA_TYPENAME("namespaceIndex") /* .memberName */ - UA_TYPES_INT16, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}, -{ - UA_TYPENAME("name") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_QualifiedName, name) - offsetof(UA_QualifiedName, namespaceIndex) - sizeof(UA_Int16), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define QualifiedName_members NULL /* LocalizedText */ -static UA_DataTypeMember LocalizedText_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define LocalizedText_members NULL /* ExtensionObject */ -static UA_DataTypeMember ExtensionObject_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define ExtensionObject_members NULL /* DataValue */ -static UA_DataTypeMember DataValue_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_DATAVALUE, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define DataValue_members NULL /* Variant */ -static UA_DataTypeMember Variant_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_VARIANT, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define Variant_members NULL /* DiagnosticInfo */ -static UA_DataTypeMember DiagnosticInfo_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +#define DiagnosticInfo_members NULL -/* SignedSoftwareCertificate */ -static UA_DataTypeMember SignedSoftwareCertificate_members[2] = { +/* KeyValuePair */ +static UA_DataTypeMember KeyValuePair_members[2] = { { - UA_TYPENAME("certificateData") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + UA_TYPENAME("Key") /* .memberName */ + UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("signature") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_SignedSoftwareCertificate, signature) - offsetof(UA_SignedSoftwareCertificate, certificateData) - sizeof(UA_ByteString), /* .padding */ + UA_TYPENAME("Value") /* .memberName */ + UA_TYPES_VARIANT, /* .memberTypeIndex */ + offsetof(UA_KeyValuePair, value) - offsetof(UA_KeyValuePair, key) - sizeof(UA_QualifiedName), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* SemanticChangeStructureDataType */ -static UA_DataTypeMember SemanticChangeStructureDataType_members[2] = { +/* SimpleTypeDescription */ +static UA_DataTypeMember SimpleTypeDescription_members[4] = { { - UA_TYPENAME("affected") /* .memberName */ + UA_TYPENAME("DataTypeId") /* .memberName */ UA_TYPES_NODEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("affectedType") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_SemanticChangeStructureDataType, affectedType) - offsetof(UA_SemanticChangeStructureDataType, affected) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("Name") /* .memberName */ + UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ + offsetof(UA_SimpleTypeDescription, name) - offsetof(UA_SimpleTypeDescription, dataTypeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* StatusChangeNotification */ -static UA_DataTypeMember StatusChangeNotification_members[2] = { +}, { - UA_TYPENAME("status") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("BaseDataType") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_SimpleTypeDescription, baseDataType) - offsetof(UA_SimpleTypeDescription, name) - sizeof(UA_QualifiedName), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("diagnosticInfo") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_StatusChangeNotification, diagnosticInfo) - offsetof(UA_StatusChangeNotification, status) - sizeof(UA_StatusCode), /* .padding */ + UA_TYPENAME("BuiltInType") /* .memberName */ + UA_TYPES_BYTE, /* .memberTypeIndex */ + offsetof(UA_SimpleTypeDescription, builtInType) - offsetof(UA_SimpleTypeDescription, baseDataType) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* BrowsePathTarget */ -static UA_DataTypeMember BrowsePathTarget_members[2] = { +/* PubSubState */ +#define PubSubState_members NULL + +/* DataSetFieldFlags */ +#define DataSetFieldFlags_members NULL + +/* ConfigurationVersionDataType */ +static UA_DataTypeMember ConfigurationVersionDataType_members[2] = { { - UA_TYPENAME("targetId") /* .memberName */ - UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ + UA_TYPENAME("MajorVersion") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("remainingPathIndex") /* .memberName */ + UA_TYPENAME("MinorVersion") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_BrowsePathTarget, remainingPathIndex) - offsetof(UA_BrowsePathTarget, targetId) - sizeof(UA_ExpandedNodeId), /* .padding */ + offsetof(UA_ConfigurationVersionDataType, minorVersion) - offsetof(UA_ConfigurationVersionDataType, majorVersion) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* ViewAttributes */ -static UA_DataTypeMember ViewAttributes_members[7] = { +/* PublishedVariableDataType */ +static UA_DataTypeMember PublishedVariableDataType_members[8] = { { - UA_TYPENAME("specifiedAttributes") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ + UA_TYPENAME("PublishedVariable") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("displayName") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_ViewAttributes, displayName) - offsetof(UA_ViewAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("AttributeId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_PublishedVariableDataType, attributeId) - offsetof(UA_PublishedVariableDataType, publishedVariable) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("description") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_ViewAttributes, description) - offsetof(UA_ViewAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("SamplingIntervalHint") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_PublishedVariableDataType, samplingIntervalHint) - offsetof(UA_PublishedVariableDataType, attributeId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("writeMask") /* .memberName */ + UA_TYPENAME("DeadbandType") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ViewAttributes, writeMask) - offsetof(UA_ViewAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ + offsetof(UA_PublishedVariableDataType, deadbandType) - offsetof(UA_PublishedVariableDataType, samplingIntervalHint) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("userWriteMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ViewAttributes, userWriteMask) - offsetof(UA_ViewAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("DeadbandValue") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_PublishedVariableDataType, deadbandValue) - offsetof(UA_PublishedVariableDataType, deadbandType) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("containsNoLoops") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_ViewAttributes, containsNoLoops) - offsetof(UA_ViewAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("IndexRange") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_PublishedVariableDataType, indexRange) - offsetof(UA_PublishedVariableDataType, deadbandValue) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("eventNotifier") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - offsetof(UA_ViewAttributes, eventNotifier) - offsetof(UA_ViewAttributes, containsNoLoops) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("SubstituteValue") /* .memberName */ + UA_TYPES_VARIANT, /* .memberTypeIndex */ + offsetof(UA_PublishedVariableDataType, substituteValue) - offsetof(UA_PublishedVariableDataType, indexRange) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +}, +{ + UA_TYPENAME("MetaDataProperties") /* .memberName */ + UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ + offsetof(UA_PublishedVariableDataType, metaDataPropertiesSize) - offsetof(UA_PublishedVariableDataType, substituteValue) - sizeof(UA_Variant), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; -/* RequestHeader */ -static UA_DataTypeMember RequestHeader_members[7] = { +/* DataSetFieldContentMask */ +#define DataSetFieldContentMask_members NULL + +/* DataSetWriterDataType */ +static UA_DataTypeMember DataSetWriterDataType_members[9] = { { - UA_TYPENAME("authenticationToken") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ + UA_TYPENAME("Name") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("timestamp") /* .memberName */ - UA_TYPES_DATETIME, /* .memberTypeIndex */ - offsetof(UA_RequestHeader, timestamp) - offsetof(UA_RequestHeader, authenticationToken) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("Enabled") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_DataSetWriterDataType, enabled) - offsetof(UA_DataSetWriterDataType, name) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("requestHandle") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_RequestHeader, requestHandle) - offsetof(UA_RequestHeader, timestamp) - sizeof(UA_DateTime), /* .padding */ + UA_TYPENAME("DataSetWriterId") /* .memberName */ + UA_TYPES_UINT16, /* .memberTypeIndex */ + offsetof(UA_DataSetWriterDataType, dataSetWriterId) - offsetof(UA_DataSetWriterDataType, enabled) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("returnDiagnostics") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_RequestHeader, returnDiagnostics) - offsetof(UA_RequestHeader, requestHandle) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("DataSetFieldContentMask") /* .memberName */ + UA_TYPES_DATASETFIELDCONTENTMASK, /* .memberTypeIndex */ + offsetof(UA_DataSetWriterDataType, dataSetFieldContentMask) - offsetof(UA_DataSetWriterDataType, dataSetWriterId) - sizeof(UA_UInt16), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("auditEntryId") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_RequestHeader, auditEntryId) - offsetof(UA_RequestHeader, returnDiagnostics) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("KeyFrameCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_DataSetWriterDataType, keyFrameCount) - offsetof(UA_DataSetWriterDataType, dataSetFieldContentMask) - sizeof(UA_DataSetFieldContentMask), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("timeoutHint") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_RequestHeader, timeoutHint) - offsetof(UA_RequestHeader, auditEntryId) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("DataSetName") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_DataSetWriterDataType, dataSetName) - offsetof(UA_DataSetWriterDataType, keyFrameCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("additionalHeader") /* .memberName */ - UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ - offsetof(UA_RequestHeader, additionalHeader) - offsetof(UA_RequestHeader, timeoutHint) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("DataSetWriterProperties") /* .memberName */ + UA_TYPES_KEYVALUEPAIR, /* .memberTypeIndex */ + offsetof(UA_DataSetWriterDataType, dataSetWriterPropertiesSize) - offsetof(UA_DataSetWriterDataType, dataSetName) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; - -/* MonitoredItemModifyResult */ -static UA_DataTypeMember MonitoredItemModifyResult_members[4] = { + true /* .isArray */ +}, { - UA_TYPENAME("statusCode") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("TransportSettings") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_DataSetWriterDataType, transportSettings) - offsetof(UA_DataSetWriterDataType, dataSetWriterProperties) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("revisedSamplingInterval") /* .memberName */ - UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_MonitoredItemModifyResult, revisedSamplingInterval) - offsetof(UA_MonitoredItemModifyResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ + UA_TYPENAME("MessageSettings") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_DataSetWriterDataType, messageSettings) - offsetof(UA_DataSetWriterDataType, transportSettings) - sizeof(UA_ExtensionObject), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* NetworkAddressUrlDataType */ +static UA_DataTypeMember NetworkAddressUrlDataType_members[2] = { { - UA_TYPENAME("revisedQueueSize") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_MonitoredItemModifyResult, revisedQueueSize) - offsetof(UA_MonitoredItemModifyResult, revisedSamplingInterval) - sizeof(UA_Double), /* .padding */ + UA_TYPENAME("NetworkInterface") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("filterResult") /* .memberName */ - UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ - offsetof(UA_MonitoredItemModifyResult, filterResult) - offsetof(UA_MonitoredItemModifyResult, revisedQueueSize) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("Url") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_NetworkAddressUrlDataType, url) - offsetof(UA_NetworkAddressUrlDataType, networkInterface) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* ElementOperand */ -static UA_DataTypeMember ElementOperand_members[1] = { +/* OverrideValueHandling */ +#define OverrideValueHandling_members NULL + +/* DataSetOrderingType */ +#define DataSetOrderingType_members NULL + +/* UadpNetworkMessageContentMask */ +#define UadpNetworkMessageContentMask_members NULL + +/* UadpWriterGroupMessageDataType */ +static UA_DataTypeMember UadpWriterGroupMessageDataType_members[5] = { { - UA_TYPENAME("index") /* .memberName */ + UA_TYPENAME("GroupVersion") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* CloseSecureChannelRequest */ -static UA_DataTypeMember CloseSecureChannelRequest_members[1] = { +}, { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("DataSetOrdering") /* .memberName */ + UA_TYPES_DATASETORDERINGTYPE, /* .memberTypeIndex */ + offsetof(UA_UadpWriterGroupMessageDataType, dataSetOrdering) - offsetof(UA_UadpWriterGroupMessageDataType, groupVersion) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* AddNodesResult */ -static UA_DataTypeMember AddNodesResult_members[2] = { +}, { - UA_TYPENAME("statusCode") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("NetworkMessageContentMask") /* .memberName */ + UA_TYPES_UADPNETWORKMESSAGECONTENTMASK, /* .memberTypeIndex */ + offsetof(UA_UadpWriterGroupMessageDataType, networkMessageContentMask) - offsetof(UA_UadpWriterGroupMessageDataType, dataSetOrdering) - sizeof(UA_DataSetOrderingType), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("addedNodeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_AddNodesResult, addedNodeId) - offsetof(UA_AddNodesResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ + UA_TYPENAME("SamplingOffset") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_UadpWriterGroupMessageDataType, samplingOffset) - offsetof(UA_UadpWriterGroupMessageDataType, networkMessageContentMask) - sizeof(UA_UadpNetworkMessageContentMask), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +}, +{ + UA_TYPENAME("PublishingOffset") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_UadpWriterGroupMessageDataType, publishingOffsetSize) - offsetof(UA_UadpWriterGroupMessageDataType, samplingOffset) - sizeof(UA_Double), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; -/* VariableAttributes */ -static UA_DataTypeMember VariableAttributes_members[13] = { +/* UadpDataSetMessageContentMask */ +#define UadpDataSetMessageContentMask_members NULL + +/* UadpDataSetWriterMessageDataType */ +static UA_DataTypeMember UadpDataSetWriterMessageDataType_members[4] = { { - UA_TYPENAME("specifiedAttributes") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ + UA_TYPENAME("DataSetMessageContentMask") /* .memberName */ + UA_TYPES_UADPDATASETMESSAGECONTENTMASK, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("displayName") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_VariableAttributes, displayName) - offsetof(UA_VariableAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ConfiguredSize") /* .memberName */ + UA_TYPES_UINT16, /* .memberTypeIndex */ + offsetof(UA_UadpDataSetWriterMessageDataType, configuredSize) - offsetof(UA_UadpDataSetWriterMessageDataType, dataSetMessageContentMask) - sizeof(UA_UadpDataSetMessageContentMask), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("description") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_VariableAttributes, description) - offsetof(UA_VariableAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("NetworkMessageNumber") /* .memberName */ + UA_TYPES_UINT16, /* .memberTypeIndex */ + offsetof(UA_UadpDataSetWriterMessageDataType, networkMessageNumber) - offsetof(UA_UadpDataSetWriterMessageDataType, configuredSize) - sizeof(UA_UInt16), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("writeMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_VariableAttributes, writeMask) - offsetof(UA_VariableAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("DataSetOffset") /* .memberName */ + UA_TYPES_UINT16, /* .memberTypeIndex */ + offsetof(UA_UadpDataSetWriterMessageDataType, dataSetOffset) - offsetof(UA_UadpDataSetWriterMessageDataType, networkMessageNumber) - sizeof(UA_UInt16), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* UadpDataSetReaderMessageDataType */ +static UA_DataTypeMember UadpDataSetReaderMessageDataType_members[9] = { { - UA_TYPENAME("userWriteMask") /* .memberName */ + UA_TYPENAME("GroupVersion") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_VariableAttributes, userWriteMask) - offsetof(UA_VariableAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("value") /* .memberName */ - UA_TYPES_VARIANT, /* .memberTypeIndex */ - offsetof(UA_VariableAttributes, value) - offsetof(UA_VariableAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("NetworkMessageNumber") /* .memberName */ + UA_TYPES_UINT16, /* .memberTypeIndex */ + offsetof(UA_UadpDataSetReaderMessageDataType, networkMessageNumber) - offsetof(UA_UadpDataSetReaderMessageDataType, groupVersion) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("dataType") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_VariableAttributes, dataType) - offsetof(UA_VariableAttributes, value) - sizeof(UA_Variant), /* .padding */ + UA_TYPENAME("DataSetOffset") /* .memberName */ + UA_TYPES_UINT16, /* .memberTypeIndex */ + offsetof(UA_UadpDataSetReaderMessageDataType, dataSetOffset) - offsetof(UA_UadpDataSetReaderMessageDataType, networkMessageNumber) - sizeof(UA_UInt16), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("valueRank") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - offsetof(UA_VariableAttributes, valueRank) - offsetof(UA_VariableAttributes, dataType) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("DataSetClassId") /* .memberName */ + UA_TYPES_GUID, /* .memberTypeIndex */ + offsetof(UA_UadpDataSetReaderMessageDataType, dataSetClassId) - offsetof(UA_UadpDataSetReaderMessageDataType, dataSetOffset) - sizeof(UA_UInt16), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("arrayDimensions") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_VariableAttributes, arrayDimensionsSize) - offsetof(UA_VariableAttributes, valueRank) - sizeof(UA_Int32), /* .padding */ + UA_TYPENAME("NetworkMessageContentMask") /* .memberName */ + UA_TYPES_UADPNETWORKMESSAGECONTENTMASK, /* .memberTypeIndex */ + offsetof(UA_UadpDataSetReaderMessageDataType, networkMessageContentMask) - offsetof(UA_UadpDataSetReaderMessageDataType, dataSetClassId) - sizeof(UA_Guid), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("accessLevel") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - offsetof(UA_VariableAttributes, accessLevel) - offsetof(UA_VariableAttributes, arrayDimensions) - sizeof(void*), /* .padding */ + UA_TYPENAME("DataSetMessageContentMask") /* .memberName */ + UA_TYPES_UADPDATASETMESSAGECONTENTMASK, /* .memberTypeIndex */ + offsetof(UA_UadpDataSetReaderMessageDataType, dataSetMessageContentMask) - offsetof(UA_UadpDataSetReaderMessageDataType, networkMessageContentMask) - sizeof(UA_UadpNetworkMessageContentMask), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("userAccessLevel") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - offsetof(UA_VariableAttributes, userAccessLevel) - offsetof(UA_VariableAttributes, accessLevel) - sizeof(UA_Byte), /* .padding */ + UA_TYPENAME("PublishingInterval") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_UadpDataSetReaderMessageDataType, publishingInterval) - offsetof(UA_UadpDataSetReaderMessageDataType, dataSetMessageContentMask) - sizeof(UA_UadpDataSetMessageContentMask), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("minimumSamplingInterval") /* .memberName */ + UA_TYPENAME("ReceiveOffset") /* .memberName */ UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_VariableAttributes, minimumSamplingInterval) - offsetof(UA_VariableAttributes, userAccessLevel) - sizeof(UA_Byte), /* .padding */ + offsetof(UA_UadpDataSetReaderMessageDataType, receiveOffset) - offsetof(UA_UadpDataSetReaderMessageDataType, publishingInterval) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("historizing") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_VariableAttributes, historizing) - offsetof(UA_VariableAttributes, minimumSamplingInterval) - sizeof(UA_Double), /* .padding */ + UA_TYPENAME("ProcessingOffset") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_UadpDataSetReaderMessageDataType, processingOffset) - offsetof(UA_UadpDataSetReaderMessageDataType, receiveOffset) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* NotificationMessage */ -static UA_DataTypeMember NotificationMessage_members[3] = { +/* JsonNetworkMessageContentMask */ +#define JsonNetworkMessageContentMask_members NULL + +/* JsonDataSetMessageContentMask */ +#define JsonDataSetMessageContentMask_members NULL + +/* JsonDataSetWriterMessageDataType */ +static UA_DataTypeMember JsonDataSetWriterMessageDataType_members[1] = { { - UA_TYPENAME("sequenceNumber") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ + UA_TYPENAME("DataSetMessageContentMask") /* .memberName */ + UA_TYPES_JSONDATASETMESSAGECONTENTMASK, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* BrokerConnectionTransportDataType */ +static UA_DataTypeMember BrokerConnectionTransportDataType_members[2] = { { - UA_TYPENAME("publishTime") /* .memberName */ - UA_TYPES_DATETIME, /* .memberTypeIndex */ - offsetof(UA_NotificationMessage, publishTime) - offsetof(UA_NotificationMessage, sequenceNumber) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ResourceUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("notificationData") /* .memberName */ - UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ - offsetof(UA_NotificationMessage, notificationDataSize) - offsetof(UA_NotificationMessage, publishTime) - sizeof(UA_DateTime), /* .padding */ + UA_TYPENAME("AuthenticationProfileUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_BrokerConnectionTransportDataType, authenticationProfileUri) - offsetof(UA_BrokerConnectionTransportDataType, resourceUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* FindServersOnNetworkRequest */ -static UA_DataTypeMember FindServersOnNetworkRequest_members[4] = { +/* BrokerTransportQualityOfService */ +#define BrokerTransportQualityOfService_members NULL + +/* BrokerWriterGroupTransportDataType */ +static UA_DataTypeMember BrokerWriterGroupTransportDataType_members[4] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("QueueName") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("startingRecordId") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_FindServersOnNetworkRequest, startingRecordId) - offsetof(UA_FindServersOnNetworkRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("ResourceUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_BrokerWriterGroupTransportDataType, resourceUri) - offsetof(UA_BrokerWriterGroupTransportDataType, queueName) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxRecordsToReturn") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_FindServersOnNetworkRequest, maxRecordsToReturn) - offsetof(UA_FindServersOnNetworkRequest, startingRecordId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("AuthenticationProfileUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_BrokerWriterGroupTransportDataType, authenticationProfileUri) - offsetof(UA_BrokerWriterGroupTransportDataType, resourceUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serverCapabilityFilter") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_FindServersOnNetworkRequest, serverCapabilityFilterSize) - offsetof(UA_FindServersOnNetworkRequest, maxRecordsToReturn) - sizeof(UA_UInt32), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* EventFieldList */ -static UA_DataTypeMember EventFieldList_members[2] = { -{ - UA_TYPENAME("clientHandle") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("RequestedDeliveryGuarantee") /* .memberName */ + UA_TYPES_BROKERTRANSPORTQUALITYOFSERVICE, /* .memberTypeIndex */ + offsetof(UA_BrokerWriterGroupTransportDataType, requestedDeliveryGuarantee) - offsetof(UA_BrokerWriterGroupTransportDataType, authenticationProfileUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, -{ - UA_TYPENAME("eventFields") /* .memberName */ - UA_TYPES_VARIANT, /* .memberTypeIndex */ - offsetof(UA_EventFieldList, eventFieldsSize) - offsetof(UA_EventFieldList, clientHandle) - sizeof(UA_UInt32), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; +},}; -/* MonitoringMode */ -static UA_DataTypeMember MonitoringMode_members[1] = { +/* BrokerDataSetWriterTransportDataType */ +static UA_DataTypeMember BrokerDataSetWriterTransportDataType_members[6] = { { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ + UA_TYPENAME("QueueName") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* MdnsDiscoveryConfiguration */ -static UA_DataTypeMember MdnsDiscoveryConfiguration_members[2] = { +}, { - UA_TYPENAME("mdnsServerName") /* .memberName */ + UA_TYPENAME("ResourceUri") /* .memberName */ UA_TYPES_STRING, /* .memberTypeIndex */ - 0, /* .padding */ + offsetof(UA_BrokerDataSetWriterTransportDataType, resourceUri) - offsetof(UA_BrokerDataSetWriterTransportDataType, queueName) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serverCapabilities") /* .memberName */ + UA_TYPENAME("AuthenticationProfileUri") /* .memberName */ UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_MdnsDiscoveryConfiguration, serverCapabilitiesSize) - offsetof(UA_MdnsDiscoveryConfiguration, mdnsServerName) - sizeof(UA_String), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* CallMethodResult */ -static UA_DataTypeMember CallMethodResult_members[4] = { -{ - UA_TYPENAME("statusCode") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - 0, /* .padding */ + offsetof(UA_BrokerDataSetWriterTransportDataType, authenticationProfileUri) - offsetof(UA_BrokerDataSetWriterTransportDataType, resourceUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("inputArgumentResults") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_CallMethodResult, inputArgumentResultsSize) - offsetof(UA_CallMethodResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ + UA_TYPENAME("RequestedDeliveryGuarantee") /* .memberName */ + UA_TYPES_BROKERTRANSPORTQUALITYOFSERVICE, /* .memberTypeIndex */ + offsetof(UA_BrokerDataSetWriterTransportDataType, requestedDeliveryGuarantee) - offsetof(UA_BrokerDataSetWriterTransportDataType, authenticationProfileUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("inputArgumentDiagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_CallMethodResult, inputArgumentDiagnosticInfosSize) - offsetof(UA_CallMethodResult, inputArgumentResults) - sizeof(void*), /* .padding */ + UA_TYPENAME("MetaDataQueueName") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_BrokerDataSetWriterTransportDataType, metaDataQueueName) - offsetof(UA_BrokerDataSetWriterTransportDataType, requestedDeliveryGuarantee) - sizeof(UA_BrokerTransportQualityOfService), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("outputArguments") /* .memberName */ - UA_TYPES_VARIANT, /* .memberTypeIndex */ - offsetof(UA_CallMethodResult, outputArgumentsSize) - offsetof(UA_CallMethodResult, inputArgumentDiagnosticInfos) - sizeof(void*), /* .padding */ + UA_TYPENAME("MetaDataUpdateTime") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_BrokerDataSetWriterTransportDataType, metaDataUpdateTime) - offsetof(UA_BrokerDataSetWriterTransportDataType, metaDataQueueName) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; + +/* NodeClass */ +#define NodeClass_members NULL + +/* StructureType */ +#define StructureType_members NULL -/* ParsingResult */ -static UA_DataTypeMember ParsingResult_members[3] = { +/* StructureField */ +static UA_DataTypeMember StructureField_members[7] = { { - UA_TYPENAME("statusCode") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + UA_TYPENAME("Name") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("dataStatusCodes") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_ParsingResult, dataStatusCodesSize) - offsetof(UA_ParsingResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_StructureField, description) - offsetof(UA_StructureField, name) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("dataDiagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_ParsingResult, dataDiagnosticInfosSize) - offsetof(UA_ParsingResult, dataStatusCodes) - sizeof(void*), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* RelativePathElement */ -static UA_DataTypeMember RelativePathElement_members[4] = { -{ - UA_TYPENAME("referenceTypeId") /* .memberName */ + UA_TYPENAME("DataType") /* .memberName */ UA_TYPES_NODEID, /* .memberTypeIndex */ - 0, /* .padding */ + offsetof(UA_StructureField, dataType) - offsetof(UA_StructureField, description) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("isInverse") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_RelativePathElement, isInverse) - offsetof(UA_RelativePathElement, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("ValueRank") /* .memberName */ + UA_TYPES_INT32, /* .memberTypeIndex */ + offsetof(UA_StructureField, valueRank) - offsetof(UA_StructureField, dataType) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("includeSubtypes") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_RelativePathElement, includeSubtypes) - offsetof(UA_RelativePathElement, isInverse) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("ArrayDimensions") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_StructureField, arrayDimensionsSize) - offsetof(UA_StructureField, valueRank) - sizeof(UA_Int32), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("targetName") /* .memberName */ - UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ - offsetof(UA_RelativePathElement, targetName) - offsetof(UA_RelativePathElement, includeSubtypes) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("MaxStringLength") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_StructureField, maxStringLength) - offsetof(UA_StructureField, arrayDimensions) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* BrowseDirection */ -static UA_DataTypeMember BrowseDirection_members[1] = { +}, { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("IsOptional") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_StructureField, isOptional) - offsetof(UA_StructureField, maxStringLength) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* CallMethodRequest */ -static UA_DataTypeMember CallMethodRequest_members[3] = { +/* StructureDefinition */ +static UA_DataTypeMember StructureDefinition_members[4] = { { - UA_TYPENAME("objectId") /* .memberName */ + UA_TYPENAME("DefaultEncodingId") /* .memberName */ UA_TYPES_NODEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("methodId") /* .memberName */ + UA_TYPENAME("BaseDataType") /* .memberName */ UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_CallMethodRequest, methodId) - offsetof(UA_CallMethodRequest, objectId) - sizeof(UA_NodeId), /* .padding */ + offsetof(UA_StructureDefinition, baseDataType) - offsetof(UA_StructureDefinition, defaultEncodingId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("inputArguments") /* .memberName */ - UA_TYPES_VARIANT, /* .memberTypeIndex */ - offsetof(UA_CallMethodRequest, inputArgumentsSize) - offsetof(UA_CallMethodRequest, methodId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("StructureType") /* .memberName */ + UA_TYPES_STRUCTURETYPE, /* .memberTypeIndex */ + offsetof(UA_StructureDefinition, structureType) - offsetof(UA_StructureDefinition, baseDataType) - sizeof(UA_NodeId), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +}, +{ + UA_TYPENAME("Fields") /* .memberName */ + UA_TYPES_STRUCTUREFIELD, /* .memberTypeIndex */ + offsetof(UA_StructureDefinition, fieldsSize) - offsetof(UA_StructureDefinition, structureType) - sizeof(UA_StructureType), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* RedundancySupport */ -static UA_DataTypeMember RedundancySupport_members[1] = { +/* Argument */ +static UA_DataTypeMember Argument_members[5] = { { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ + UA_TYPENAME("Name") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* EventNotificationList */ -static UA_DataTypeMember EventNotificationList_members[1] = { +}, { - UA_TYPENAME("events") /* .memberName */ - UA_TYPES_EVENTFIELDLIST, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("DataType") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_Argument, dataType) - offsetof(UA_Argument, name) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* UnregisterNodesRequest */ -static UA_DataTypeMember UnregisterNodesRequest_members[2] = { + false /* .isArray */ +}, { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("ValueRank") /* .memberName */ + UA_TYPES_INT32, /* .memberTypeIndex */ + offsetof(UA_Argument, valueRank) - offsetof(UA_Argument, dataType) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("nodesToUnregister") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_UnregisterNodesRequest, nodesToUnregisterSize) - offsetof(UA_UnregisterNodesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("ArrayDimensions") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_Argument, arrayDimensionsSize) - offsetof(UA_Argument, valueRank) - sizeof(UA_Int32), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +}, +{ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_Argument, description) - offsetof(UA_Argument, arrayDimensions) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +},}; -/* ContentFilterElementResult */ -static UA_DataTypeMember ContentFilterElementResult_members[3] = { +/* EnumValueType */ +static UA_DataTypeMember EnumValueType_members[3] = { { - UA_TYPENAME("statusCode") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + UA_TYPENAME("Value") /* .memberName */ + UA_TYPES_INT64, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("operandStatusCodes") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_ContentFilterElementResult, operandStatusCodesSize) - offsetof(UA_ContentFilterElementResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ + UA_TYPENAME("DisplayName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_EnumValueType, displayName) - offsetof(UA_EnumValueType, value) - sizeof(UA_Int64), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("operandDiagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_ContentFilterElementResult, operandDiagnosticInfosSize) - offsetof(UA_ContentFilterElementResult, operandStatusCodes) - sizeof(void*), /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_EnumValueType, description) - offsetof(UA_EnumValueType, displayName) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* SimpleAttributeOperand */ -static UA_DataTypeMember SimpleAttributeOperand_members[4] = { +/* EnumField */ +static UA_DataTypeMember EnumField_members[4] = { { - UA_TYPENAME("typeDefinitionId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ + UA_TYPENAME("Value") /* .memberName */ + UA_TYPES_INT64, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("browsePath") /* .memberName */ - UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ - offsetof(UA_SimpleAttributeOperand, browsePathSize) - offsetof(UA_SimpleAttributeOperand, typeDefinitionId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("DisplayName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_EnumField, displayName) - offsetof(UA_EnumField, value) - sizeof(UA_Int64), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("attributeId") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SimpleAttributeOperand, attributeId) - offsetof(UA_SimpleAttributeOperand, browsePath) - sizeof(void*), /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_EnumField, description) - offsetof(UA_EnumField, displayName) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("indexRange") /* .memberName */ + UA_TYPENAME("Name") /* .memberName */ UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_SimpleAttributeOperand, indexRange) - offsetof(UA_SimpleAttributeOperand, attributeId) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_EnumField, name) - offsetof(UA_EnumField, description) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* LiteralOperand */ -static UA_DataTypeMember LiteralOperand_members[1] = { +/* Duration */ +#define Duration_members NULL + +/* UtcTime */ +#define UtcTime_members NULL + +/* LocaleId */ +#define LocaleId_members NULL + +/* ApplicationType */ +#define ApplicationType_members NULL + +/* ApplicationDescription */ +static UA_DataTypeMember ApplicationDescription_members[7] = { { - UA_TYPENAME("value") /* .memberName */ - UA_TYPES_VARIANT, /* .memberTypeIndex */ + UA_TYPENAME("ApplicationUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* QueryDataSet */ -static UA_DataTypeMember QueryDataSet_members[3] = { +}, { - UA_TYPENAME("nodeId") /* .memberName */ - UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("ProductUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_ApplicationDescription, productUri) - offsetof(UA_ApplicationDescription, applicationUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("typeDefinitionNode") /* .memberName */ - UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ - offsetof(UA_QueryDataSet, typeDefinitionNode) - offsetof(UA_QueryDataSet, nodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ + UA_TYPENAME("ApplicationName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_ApplicationDescription, applicationName) - offsetof(UA_ApplicationDescription, productUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("values") /* .memberName */ - UA_TYPES_VARIANT, /* .memberTypeIndex */ - offsetof(UA_QueryDataSet, valuesSize) - offsetof(UA_QueryDataSet, typeDefinitionNode) - sizeof(UA_ExpandedNodeId), /* .padding */ + UA_TYPENAME("ApplicationType") /* .memberName */ + UA_TYPES_APPLICATIONTYPE, /* .memberTypeIndex */ + offsetof(UA_ApplicationDescription, applicationType) - offsetof(UA_ApplicationDescription, applicationName) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* AnonymousIdentityToken */ -static UA_DataTypeMember AnonymousIdentityToken_members[1] = { + false /* .isArray */ +}, { - UA_TYPENAME("policyId") /* .memberName */ + UA_TYPENAME("GatewayServerUri") /* .memberName */ UA_TYPES_STRING, /* .memberTypeIndex */ - 0, /* .padding */ + offsetof(UA_ApplicationDescription, gatewayServerUri) - offsetof(UA_ApplicationDescription, applicationType) - sizeof(UA_ApplicationType), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +}, +{ + UA_TYPENAME("DiscoveryProfileUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_ApplicationDescription, discoveryProfileUri) - offsetof(UA_ApplicationDescription, gatewayServerUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +}, +{ + UA_TYPENAME("DiscoveryUrls") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_ApplicationDescription, discoveryUrlsSize) - offsetof(UA_ApplicationDescription, discoveryProfileUri) - sizeof(UA_String), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; -/* SetPublishingModeRequest */ -static UA_DataTypeMember SetPublishingModeRequest_members[3] = { +/* RequestHeader */ +static UA_DataTypeMember RequestHeader_members[7] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("AuthenticationToken") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("publishingEnabled") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_SetPublishingModeRequest, publishingEnabled) - offsetof(UA_SetPublishingModeRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("Timestamp") /* .memberName */ + UA_TYPES_DATETIME, /* .memberTypeIndex */ + offsetof(UA_RequestHeader, timestamp) - offsetof(UA_RequestHeader, authenticationToken) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("subscriptionIds") /* .memberName */ + UA_TYPENAME("RequestHandle") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SetPublishingModeRequest, subscriptionIdsSize) - offsetof(UA_SetPublishingModeRequest, publishingEnabled) - sizeof(UA_Boolean), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* MonitoredItemCreateResult */ -static UA_DataTypeMember MonitoredItemCreateResult_members[5] = { -{ - UA_TYPENAME("statusCode") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - 0, /* .padding */ + offsetof(UA_RequestHeader, requestHandle) - offsetof(UA_RequestHeader, timestamp) - sizeof(UA_DateTime), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("monitoredItemId") /* .memberName */ + UA_TYPENAME("ReturnDiagnostics") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_MonitoredItemCreateResult, monitoredItemId) - offsetof(UA_MonitoredItemCreateResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ + offsetof(UA_RequestHeader, returnDiagnostics) - offsetof(UA_RequestHeader, requestHandle) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("revisedSamplingInterval") /* .memberName */ - UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_MonitoredItemCreateResult, revisedSamplingInterval) - offsetof(UA_MonitoredItemCreateResult, monitoredItemId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("AuditEntryId") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_RequestHeader, auditEntryId) - offsetof(UA_RequestHeader, returnDiagnostics) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("revisedQueueSize") /* .memberName */ + UA_TYPENAME("TimeoutHint") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_MonitoredItemCreateResult, revisedQueueSize) - offsetof(UA_MonitoredItemCreateResult, revisedSamplingInterval) - sizeof(UA_Double), /* .padding */ + offsetof(UA_RequestHeader, timeoutHint) - offsetof(UA_RequestHeader, auditEntryId) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("filterResult") /* .memberName */ + UA_TYPENAME("AdditionalHeader") /* .memberName */ UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ - offsetof(UA_MonitoredItemCreateResult, filterResult) - offsetof(UA_MonitoredItemCreateResult, revisedQueueSize) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_RequestHeader, additionalHeader) - offsetof(UA_RequestHeader, timeoutHint) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* TimestampsToReturn */ -static UA_DataTypeMember TimestampsToReturn_members[1] = { +/* ResponseHeader */ +static UA_DataTypeMember ResponseHeader_members[6] = { { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ + UA_TYPENAME("Timestamp") /* .memberName */ + UA_TYPES_DATETIME, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* CallRequest */ -static UA_DataTypeMember CallRequest_members[2] = { +}, { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("RequestHandle") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ResponseHeader, requestHandle) - offsetof(UA_ResponseHeader, timestamp) - sizeof(UA_DateTime), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("methodsToCall") /* .memberName */ - UA_TYPES_CALLMETHODREQUEST, /* .memberTypeIndex */ - offsetof(UA_CallRequest, methodsToCallSize) - offsetof(UA_CallRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("ServiceResult") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + offsetof(UA_ResponseHeader, serviceResult) - offsetof(UA_ResponseHeader, requestHandle) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* MethodAttributes */ -static UA_DataTypeMember MethodAttributes_members[7] = { + false /* .isArray */ +}, { - UA_TYPENAME("specifiedAttributes") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("ServiceDiagnostics") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_ResponseHeader, serviceDiagnostics) - offsetof(UA_ResponseHeader, serviceResult) - sizeof(UA_StatusCode), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("displayName") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_MethodAttributes, displayName) - offsetof(UA_MethodAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("StringTable") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_ResponseHeader, stringTableSize) - offsetof(UA_ResponseHeader, serviceDiagnostics) - sizeof(UA_DiagnosticInfo), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("description") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_MethodAttributes, description) - offsetof(UA_MethodAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("AdditionalHeader") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_ResponseHeader, additionalHeader) - offsetof(UA_ResponseHeader, stringTable) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* ServiceFault */ +static UA_DataTypeMember ServiceFault_members[1] = { { - UA_TYPENAME("writeMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_MethodAttributes, writeMask) - offsetof(UA_MethodAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* FindServersRequest */ +static UA_DataTypeMember FindServersRequest_members[4] = { { - UA_TYPENAME("userWriteMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_MethodAttributes, userWriteMask) - offsetof(UA_MethodAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("executable") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_MethodAttributes, executable) - offsetof(UA_MethodAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("EndpointUrl") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_FindServersRequest, endpointUrl) - offsetof(UA_FindServersRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("userExecutable") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_MethodAttributes, userExecutable) - offsetof(UA_MethodAttributes, executable) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("LocaleIds") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_FindServersRequest, localeIdsSize) - offsetof(UA_FindServersRequest, endpointUrl) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +}, +{ + UA_TYPENAME("ServerUris") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_FindServersRequest, serverUrisSize) - offsetof(UA_FindServersRequest, localeIds) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; -/* DeleteReferencesItem */ -static UA_DataTypeMember DeleteReferencesItem_members[5] = { +/* FindServersResponse */ +static UA_DataTypeMember FindServersResponse_members[2] = { { - UA_TYPENAME("sourceNodeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("referenceTypeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_DeleteReferencesItem, referenceTypeId) - offsetof(UA_DeleteReferencesItem, sourceNodeId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("Servers") /* .memberName */ + UA_TYPES_APPLICATIONDESCRIPTION, /* .memberTypeIndex */ + offsetof(UA_FindServersResponse, serversSize) - offsetof(UA_FindServersResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* ServerOnNetwork */ +static UA_DataTypeMember ServerOnNetwork_members[4] = { +{ + UA_TYPENAME("RecordId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("isForward") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_DeleteReferencesItem, isForward) - offsetof(UA_DeleteReferencesItem, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("ServerName") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_ServerOnNetwork, serverName) - offsetof(UA_ServerOnNetwork, recordId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("targetNodeId") /* .memberName */ - UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ - offsetof(UA_DeleteReferencesItem, targetNodeId) - offsetof(UA_DeleteReferencesItem, isForward) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("DiscoveryUrl") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_ServerOnNetwork, discoveryUrl) - offsetof(UA_ServerOnNetwork, serverName) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("deleteBidirectional") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_DeleteReferencesItem, deleteBidirectional) - offsetof(UA_DeleteReferencesItem, targetNodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ + UA_TYPENAME("ServerCapabilities") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_ServerOnNetwork, serverCapabilitiesSize) - offsetof(UA_ServerOnNetwork, discoveryUrl) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* WriteValue */ -static UA_DataTypeMember WriteValue_members[4] = { +/* FindServersOnNetworkRequest */ +static UA_DataTypeMember FindServersOnNetworkRequest_members[4] = { { - UA_TYPENAME("nodeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("attributeId") /* .memberName */ + UA_TYPENAME("StartingRecordId") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_WriteValue, attributeId) - offsetof(UA_WriteValue, nodeId) - sizeof(UA_NodeId), /* .padding */ + offsetof(UA_FindServersOnNetworkRequest, startingRecordId) - offsetof(UA_FindServersOnNetworkRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("indexRange") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_WriteValue, indexRange) - offsetof(UA_WriteValue, attributeId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("MaxRecordsToReturn") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_FindServersOnNetworkRequest, maxRecordsToReturn) - offsetof(UA_FindServersOnNetworkRequest, startingRecordId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("value") /* .memberName */ - UA_TYPES_DATAVALUE, /* .memberTypeIndex */ - offsetof(UA_WriteValue, value) - offsetof(UA_WriteValue, indexRange) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("ServerCapabilityFilter") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_FindServersOnNetworkRequest, serverCapabilityFilterSize) - offsetof(UA_FindServersOnNetworkRequest, maxRecordsToReturn) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* NodeAttributesMask */ -static UA_DataTypeMember NodeAttributesMask_members[1] = { +/* FindServersOnNetworkResponse */ +static UA_DataTypeMember FindServersOnNetworkResponse_members[3] = { { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* MessageSecurityMode */ -static UA_DataTypeMember MessageSecurityMode_members[1] = { +}, { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("LastCounterResetTime") /* .memberName */ + UA_TYPES_DATETIME, /* .memberTypeIndex */ + offsetof(UA_FindServersOnNetworkResponse, lastCounterResetTime) - offsetof(UA_FindServersOnNetworkResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +}, +{ + UA_TYPENAME("Servers") /* .memberName */ + UA_TYPES_SERVERONNETWORK, /* .memberTypeIndex */ + offsetof(UA_FindServersOnNetworkResponse, serversSize) - offsetof(UA_FindServersOnNetworkResponse, lastCounterResetTime) - sizeof(UA_DateTime), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; -/* MonitoringParameters */ -static UA_DataTypeMember MonitoringParameters_members[5] = { +/* MessageSecurityMode */ +#define MessageSecurityMode_members NULL + +/* UserTokenType */ +#define UserTokenType_members NULL + +/* UserTokenPolicy */ +static UA_DataTypeMember UserTokenPolicy_members[5] = { { - UA_TYPENAME("clientHandle") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ + UA_TYPENAME("PolicyId") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("samplingInterval") /* .memberName */ - UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_MonitoringParameters, samplingInterval) - offsetof(UA_MonitoringParameters, clientHandle) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("TokenType") /* .memberName */ + UA_TYPES_USERTOKENTYPE, /* .memberTypeIndex */ + offsetof(UA_UserTokenPolicy, tokenType) - offsetof(UA_UserTokenPolicy, policyId) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("filter") /* .memberName */ - UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ - offsetof(UA_MonitoringParameters, filter) - offsetof(UA_MonitoringParameters, samplingInterval) - sizeof(UA_Double), /* .padding */ + UA_TYPENAME("IssuedTokenType") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_UserTokenPolicy, issuedTokenType) - offsetof(UA_UserTokenPolicy, tokenType) - sizeof(UA_UserTokenType), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("queueSize") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_MonitoringParameters, queueSize) - offsetof(UA_MonitoringParameters, filter) - sizeof(UA_ExtensionObject), /* .padding */ + UA_TYPENAME("IssuerEndpointUrl") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_UserTokenPolicy, issuerEndpointUrl) - offsetof(UA_UserTokenPolicy, issuedTokenType) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("discardOldest") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_MonitoringParameters, discardOldest) - offsetof(UA_MonitoringParameters, queueSize) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("SecurityPolicyUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_UserTokenPolicy, securityPolicyUri) - offsetof(UA_UserTokenPolicy, issuerEndpointUrl) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* ReferenceNode */ -static UA_DataTypeMember ReferenceNode_members[3] = { +/* EndpointDescription */ +static UA_DataTypeMember EndpointDescription_members[8] = { { - UA_TYPENAME("referenceTypeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ + UA_TYPENAME("EndpointUrl") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("isInverse") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_ReferenceNode, isInverse) - offsetof(UA_ReferenceNode, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("Server") /* .memberName */ + UA_TYPES_APPLICATIONDESCRIPTION, /* .memberTypeIndex */ + offsetof(UA_EndpointDescription, server) - offsetof(UA_EndpointDescription, endpointUrl) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("targetId") /* .memberName */ - UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ - offsetof(UA_ReferenceNode, targetId) - offsetof(UA_ReferenceNode, isInverse) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("ServerCertificate") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_EndpointDescription, serverCertificate) - offsetof(UA_EndpointDescription, server) - sizeof(UA_ApplicationDescription), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* Argument */ -static UA_DataTypeMember Argument_members[5] = { +}, { - UA_TYPENAME("name") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("SecurityMode") /* .memberName */ + UA_TYPES_MESSAGESECURITYMODE, /* .memberTypeIndex */ + offsetof(UA_EndpointDescription, securityMode) - offsetof(UA_EndpointDescription, serverCertificate) - sizeof(UA_ByteString), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("dataType") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_Argument, dataType) - offsetof(UA_Argument, name) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("SecurityPolicyUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_EndpointDescription, securityPolicyUri) - offsetof(UA_EndpointDescription, securityMode) - sizeof(UA_MessageSecurityMode), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("valueRank") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - offsetof(UA_Argument, valueRank) - offsetof(UA_Argument, dataType) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("UserIdentityTokens") /* .memberName */ + UA_TYPES_USERTOKENPOLICY, /* .memberTypeIndex */ + offsetof(UA_EndpointDescription, userIdentityTokensSize) - offsetof(UA_EndpointDescription, securityPolicyUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("arrayDimensions") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_Argument, arrayDimensionsSize) - offsetof(UA_Argument, valueRank) - sizeof(UA_Int32), /* .padding */ + UA_TYPENAME("TransportProfileUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_EndpointDescription, transportProfileUri) - offsetof(UA_EndpointDescription, userIdentityTokens) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("description") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_Argument, description) - offsetof(UA_Argument, arrayDimensions) - sizeof(void*), /* .padding */ + UA_TYPENAME("SecurityLevel") /* .memberName */ + UA_TYPES_BYTE, /* .memberTypeIndex */ + offsetof(UA_EndpointDescription, securityLevel) - offsetof(UA_EndpointDescription, transportProfileUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* ChannelSecurityToken */ -static UA_DataTypeMember ChannelSecurityToken_members[4] = { +/* GetEndpointsRequest */ +static UA_DataTypeMember GetEndpointsRequest_members[4] = { { - UA_TYPENAME("channelId") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("tokenId") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ChannelSecurityToken, tokenId) - offsetof(UA_ChannelSecurityToken, channelId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("EndpointUrl") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_GetEndpointsRequest, endpointUrl) - offsetof(UA_GetEndpointsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("createdAt") /* .memberName */ - UA_TYPES_DATETIME, /* .memberTypeIndex */ - offsetof(UA_ChannelSecurityToken, createdAt) - offsetof(UA_ChannelSecurityToken, tokenId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("LocaleIds") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_GetEndpointsRequest, localeIdsSize) - offsetof(UA_GetEndpointsRequest, endpointUrl) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("revisedLifetime") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ChannelSecurityToken, revisedLifetime) - offsetof(UA_ChannelSecurityToken, createdAt) - sizeof(UA_DateTime), /* .padding */ + UA_TYPENAME("ProfileUris") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_GetEndpointsRequest, profileUrisSize) - offsetof(UA_GetEndpointsRequest, localeIds) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* UserIdentityToken */ -static UA_DataTypeMember UserIdentityToken_members[1] = { +/* GetEndpointsResponse */ +static UA_DataTypeMember GetEndpointsResponse_members[2] = { { - UA_TYPENAME("policyId") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +}, +{ + UA_TYPENAME("Endpoints") /* .memberName */ + UA_TYPES_ENDPOINTDESCRIPTION, /* .memberTypeIndex */ + offsetof(UA_GetEndpointsResponse, endpointsSize) - offsetof(UA_GetEndpointsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; -/* SignatureData */ -static UA_DataTypeMember SignatureData_members[2] = { +/* RegisteredServer */ +static UA_DataTypeMember RegisteredServer_members[8] = { { - UA_TYPENAME("algorithm") /* .memberName */ + UA_TYPENAME("ServerUri") /* .memberName */ UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("signature") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_SignatureData, signature) - offsetof(UA_SignatureData, algorithm) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("ProductUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_RegisteredServer, productUri) - offsetof(UA_RegisteredServer, serverUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* ObjectTypeAttributes */ -static UA_DataTypeMember ObjectTypeAttributes_members[6] = { +}, { - UA_TYPENAME("specifiedAttributes") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("ServerNames") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_RegisteredServer, serverNamesSize) - offsetof(UA_RegisteredServer, productUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("displayName") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_ObjectTypeAttributes, displayName) - offsetof(UA_ObjectTypeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ServerType") /* .memberName */ + UA_TYPES_APPLICATIONTYPE, /* .memberTypeIndex */ + offsetof(UA_RegisteredServer, serverType) - offsetof(UA_RegisteredServer, serverNames) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("description") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_ObjectTypeAttributes, description) - offsetof(UA_ObjectTypeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("GatewayServerUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_RegisteredServer, gatewayServerUri) - offsetof(UA_RegisteredServer, serverType) - sizeof(UA_ApplicationType), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("writeMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ObjectTypeAttributes, writeMask) - offsetof(UA_ObjectTypeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("DiscoveryUrls") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_RegisteredServer, discoveryUrlsSize) - offsetof(UA_RegisteredServer, gatewayServerUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("userWriteMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ObjectTypeAttributes, userWriteMask) - offsetof(UA_ObjectTypeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("SemaphoreFilePath") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_RegisteredServer, semaphoreFilePath) - offsetof(UA_RegisteredServer, discoveryUrls) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("isAbstract") /* .memberName */ + UA_TYPENAME("IsOnline") /* .memberName */ UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_ObjectTypeAttributes, isAbstract) - offsetof(UA_ObjectTypeAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_RegisteredServer, isOnline) - offsetof(UA_RegisteredServer, semaphoreFilePath) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* DeadbandType */ -static UA_DataTypeMember DeadbandType_members[1] = { +/* RegisterServerRequest */ +static UA_DataTypeMember RegisterServerRequest_members[2] = { { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* SecurityTokenRequestType */ -static UA_DataTypeMember SecurityTokenRequestType_members[1] = { +}, { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("Server") /* .memberName */ + UA_TYPES_REGISTEREDSERVER, /* .memberTypeIndex */ + offsetof(UA_RegisterServerRequest, server) - offsetof(UA_RegisterServerRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* NodeAttributes */ -static UA_DataTypeMember NodeAttributes_members[5] = { +/* RegisterServerResponse */ +static UA_DataTypeMember RegisterServerResponse_members[1] = { { - UA_TYPENAME("specifiedAttributes") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* DiscoveryConfiguration */ +#define DiscoveryConfiguration_members NULL + +/* MdnsDiscoveryConfiguration */ +static UA_DataTypeMember MdnsDiscoveryConfiguration_members[2] = { { - UA_TYPENAME("displayName") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_NodeAttributes, displayName) - offsetof(UA_NodeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("MdnsServerName") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("description") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_NodeAttributes, description) - offsetof(UA_NodeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("ServerCapabilities") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_MdnsDiscoveryConfiguration, serverCapabilitiesSize) - offsetof(UA_MdnsDiscoveryConfiguration, mdnsServerName) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}, + true /* .isArray */ +},}; + +/* RegisterServer2Request */ +static UA_DataTypeMember RegisterServer2Request_members[3] = { { - UA_TYPENAME("writeMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_NodeAttributes, writeMask) - offsetof(UA_NodeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("userWriteMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_NodeAttributes, userWriteMask) - offsetof(UA_NodeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("Server") /* .memberName */ + UA_TYPES_REGISTEREDSERVER, /* .memberTypeIndex */ + offsetof(UA_RegisterServer2Request, server) - offsetof(UA_RegisterServer2Request, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* DataChangeTrigger */ -static UA_DataTypeMember DataChangeTrigger_members[1] = { +}, { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("DiscoveryConfiguration") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_RegisterServer2Request, discoveryConfigurationSize) - offsetof(UA_RegisterServer2Request, server) - sizeof(UA_RegisteredServer), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* BuildInfo */ -static UA_DataTypeMember BuildInfo_members[6] = { +/* RegisterServer2Response */ +static UA_DataTypeMember RegisterServer2Response_members[3] = { { - UA_TYPENAME("productUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("manufacturerName") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_BuildInfo, manufacturerName) - offsetof(UA_BuildInfo, productUri) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("ConfigurationResults") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + offsetof(UA_RegisterServer2Response, configurationResultsSize) - offsetof(UA_RegisterServer2Response, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("productName") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_BuildInfo, productName) - offsetof(UA_BuildInfo, manufacturerName) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_RegisterServer2Response, diagnosticInfosSize) - offsetof(UA_RegisterServer2Response, configurationResults) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}, + true /* .isArray */ +},}; + +/* SecurityTokenRequestType */ +#define SecurityTokenRequestType_members NULL + +/* ChannelSecurityToken */ +static UA_DataTypeMember ChannelSecurityToken_members[4] = { { - UA_TYPENAME("softwareVersion") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_BuildInfo, softwareVersion) - offsetof(UA_BuildInfo, productName) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("ChannelId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("buildNumber") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_BuildInfo, buildNumber) - offsetof(UA_BuildInfo, softwareVersion) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("TokenId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ChannelSecurityToken, tokenId) - offsetof(UA_ChannelSecurityToken, channelId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("buildDate") /* .memberName */ + UA_TYPENAME("CreatedAt") /* .memberName */ UA_TYPES_DATETIME, /* .memberTypeIndex */ - offsetof(UA_BuildInfo, buildDate) - offsetof(UA_BuildInfo, buildNumber) - sizeof(UA_String), /* .padding */ + offsetof(UA_ChannelSecurityToken, createdAt) - offsetof(UA_ChannelSecurityToken, tokenId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* NodeClass */ -static UA_DataTypeMember NodeClass_members[1] = { +}, { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("RevisedLifetime") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ChannelSecurityToken, revisedLifetime) - offsetof(UA_ChannelSecurityToken, createdAt) - sizeof(UA_DateTime), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* SubscriptionDiagnosticsDataType */ -static UA_DataTypeMember SubscriptionDiagnosticsDataType_members[31] = { +/* OpenSecureChannelRequest */ +static UA_DataTypeMember OpenSecureChannelRequest_members[6] = { { - UA_TYPENAME("sessionId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("subscriptionId") /* .memberName */ + UA_TYPENAME("ClientProtocolVersion") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, subscriptionId) - offsetof(UA_SubscriptionDiagnosticsDataType, sessionId) - sizeof(UA_NodeId), /* .padding */ + offsetof(UA_OpenSecureChannelRequest, clientProtocolVersion) - offsetof(UA_OpenSecureChannelRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("priority") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, priority) - offsetof(UA_SubscriptionDiagnosticsDataType, subscriptionId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("RequestType") /* .memberName */ + UA_TYPES_SECURITYTOKENREQUESTTYPE, /* .memberTypeIndex */ + offsetof(UA_OpenSecureChannelRequest, requestType) - offsetof(UA_OpenSecureChannelRequest, clientProtocolVersion) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("publishingInterval") /* .memberName */ - UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, publishingInterval) - offsetof(UA_SubscriptionDiagnosticsDataType, priority) - sizeof(UA_Byte), /* .padding */ + UA_TYPENAME("SecurityMode") /* .memberName */ + UA_TYPES_MESSAGESECURITYMODE, /* .memberTypeIndex */ + offsetof(UA_OpenSecureChannelRequest, securityMode) - offsetof(UA_OpenSecureChannelRequest, requestType) - sizeof(UA_SecurityTokenRequestType), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxKeepAliveCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, maxKeepAliveCount) - offsetof(UA_SubscriptionDiagnosticsDataType, publishingInterval) - sizeof(UA_Double), /* .padding */ + UA_TYPENAME("ClientNonce") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_OpenSecureChannelRequest, clientNonce) - offsetof(UA_OpenSecureChannelRequest, securityMode) - sizeof(UA_MessageSecurityMode), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxLifetimeCount") /* .memberName */ + UA_TYPENAME("RequestedLifetime") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, maxLifetimeCount) - offsetof(UA_SubscriptionDiagnosticsDataType, maxKeepAliveCount) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_OpenSecureChannelRequest, requestedLifetime) - offsetof(UA_OpenSecureChannelRequest, clientNonce) - sizeof(UA_ByteString), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +},}; + +/* OpenSecureChannelResponse */ +static UA_DataTypeMember OpenSecureChannelResponse_members[4] = { +{ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxNotificationsPerPublish") /* .memberName */ + UA_TYPENAME("ServerProtocolVersion") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, maxNotificationsPerPublish) - offsetof(UA_SubscriptionDiagnosticsDataType, maxLifetimeCount) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_OpenSecureChannelResponse, serverProtocolVersion) - offsetof(UA_OpenSecureChannelResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("publishingEnabled") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, publishingEnabled) - offsetof(UA_SubscriptionDiagnosticsDataType, maxNotificationsPerPublish) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("SecurityToken") /* .memberName */ + UA_TYPES_CHANNELSECURITYTOKEN, /* .memberTypeIndex */ + offsetof(UA_OpenSecureChannelResponse, securityToken) - offsetof(UA_OpenSecureChannelResponse, serverProtocolVersion) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("modifyCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, modifyCount) - offsetof(UA_SubscriptionDiagnosticsDataType, publishingEnabled) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("ServerNonce") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_OpenSecureChannelResponse, serverNonce) - offsetof(UA_OpenSecureChannelResponse, securityToken) - sizeof(UA_ChannelSecurityToken), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* CloseSecureChannelRequest */ +static UA_DataTypeMember CloseSecureChannelRequest_members[1] = { { - UA_TYPENAME("enableCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, enableCount) - offsetof(UA_SubscriptionDiagnosticsDataType, modifyCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* CloseSecureChannelResponse */ +static UA_DataTypeMember CloseSecureChannelResponse_members[1] = { { - UA_TYPENAME("disableCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, disableCount) - offsetof(UA_SubscriptionDiagnosticsDataType, enableCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* SignedSoftwareCertificate */ +static UA_DataTypeMember SignedSoftwareCertificate_members[2] = { { - UA_TYPENAME("republishRequestCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, republishRequestCount) - offsetof(UA_SubscriptionDiagnosticsDataType, disableCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("CertificateData") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("republishMessageRequestCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, republishMessageRequestCount) - offsetof(UA_SubscriptionDiagnosticsDataType, republishRequestCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("Signature") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_SignedSoftwareCertificate, signature) - offsetof(UA_SignedSoftwareCertificate, certificateData) - sizeof(UA_ByteString), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* SignatureData */ +static UA_DataTypeMember SignatureData_members[2] = { { - UA_TYPENAME("republishMessageCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, republishMessageCount) - offsetof(UA_SubscriptionDiagnosticsDataType, republishMessageRequestCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("Algorithm") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("transferRequestCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, transferRequestCount) - offsetof(UA_SubscriptionDiagnosticsDataType, republishMessageCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("Signature") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_SignatureData, signature) - offsetof(UA_SignatureData, algorithm) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* CreateSessionRequest */ +static UA_DataTypeMember CreateSessionRequest_members[9] = { { - UA_TYPENAME("transferredToAltClientCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, transferredToAltClientCount) - offsetof(UA_SubscriptionDiagnosticsDataType, transferRequestCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("transferredToSameClientCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, transferredToSameClientCount) - offsetof(UA_SubscriptionDiagnosticsDataType, transferredToAltClientCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ClientDescription") /* .memberName */ + UA_TYPES_APPLICATIONDESCRIPTION, /* .memberTypeIndex */ + offsetof(UA_CreateSessionRequest, clientDescription) - offsetof(UA_CreateSessionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("publishRequestCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, publishRequestCount) - offsetof(UA_SubscriptionDiagnosticsDataType, transferredToSameClientCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ServerUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_CreateSessionRequest, serverUri) - offsetof(UA_CreateSessionRequest, clientDescription) - sizeof(UA_ApplicationDescription), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("dataChangeNotificationsCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, dataChangeNotificationsCount) - offsetof(UA_SubscriptionDiagnosticsDataType, publishRequestCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("EndpointUrl") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_CreateSessionRequest, endpointUrl) - offsetof(UA_CreateSessionRequest, serverUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("eventNotificationsCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, eventNotificationsCount) - offsetof(UA_SubscriptionDiagnosticsDataType, dataChangeNotificationsCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("SessionName") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_CreateSessionRequest, sessionName) - offsetof(UA_CreateSessionRequest, endpointUrl) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("notificationsCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, notificationsCount) - offsetof(UA_SubscriptionDiagnosticsDataType, eventNotificationsCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ClientNonce") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_CreateSessionRequest, clientNonce) - offsetof(UA_CreateSessionRequest, sessionName) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("latePublishRequestCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, latePublishRequestCount) - offsetof(UA_SubscriptionDiagnosticsDataType, notificationsCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ClientCertificate") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_CreateSessionRequest, clientCertificate) - offsetof(UA_CreateSessionRequest, clientNonce) - sizeof(UA_ByteString), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("currentKeepAliveCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, currentKeepAliveCount) - offsetof(UA_SubscriptionDiagnosticsDataType, latePublishRequestCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("RequestedSessionTimeout") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_CreateSessionRequest, requestedSessionTimeout) - offsetof(UA_CreateSessionRequest, clientCertificate) - sizeof(UA_ByteString), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("currentLifetimeCount") /* .memberName */ + UA_TYPENAME("MaxResponseMessageSize") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, currentLifetimeCount) - offsetof(UA_SubscriptionDiagnosticsDataType, currentKeepAliveCount) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_CreateSessionRequest, maxResponseMessageSize) - offsetof(UA_CreateSessionRequest, requestedSessionTimeout) - sizeof(UA_Double), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +},}; + +/* CreateSessionResponse */ +static UA_DataTypeMember CreateSessionResponse_members[10] = { +{ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("unacknowledgedMessageCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, unacknowledgedMessageCount) - offsetof(UA_SubscriptionDiagnosticsDataType, currentLifetimeCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("SessionId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_CreateSessionResponse, sessionId) - offsetof(UA_CreateSessionResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("discardedMessageCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, discardedMessageCount) - offsetof(UA_SubscriptionDiagnosticsDataType, unacknowledgedMessageCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("AuthenticationToken") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_CreateSessionResponse, authenticationToken) - offsetof(UA_CreateSessionResponse, sessionId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("monitoredItemCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, monitoredItemCount) - offsetof(UA_SubscriptionDiagnosticsDataType, discardedMessageCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("RevisedSessionTimeout") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_CreateSessionResponse, revisedSessionTimeout) - offsetof(UA_CreateSessionResponse, authenticationToken) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("disabledMonitoredItemCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, disabledMonitoredItemCount) - offsetof(UA_SubscriptionDiagnosticsDataType, monitoredItemCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ServerNonce") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_CreateSessionResponse, serverNonce) - offsetof(UA_CreateSessionResponse, revisedSessionTimeout) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("monitoringQueueOverflowCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, monitoringQueueOverflowCount) - offsetof(UA_SubscriptionDiagnosticsDataType, disabledMonitoredItemCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ServerCertificate") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_CreateSessionResponse, serverCertificate) - offsetof(UA_CreateSessionResponse, serverNonce) - sizeof(UA_ByteString), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("nextSequenceNumber") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, nextSequenceNumber) - offsetof(UA_SubscriptionDiagnosticsDataType, monitoringQueueOverflowCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ServerEndpoints") /* .memberName */ + UA_TYPES_ENDPOINTDESCRIPTION, /* .memberTypeIndex */ + offsetof(UA_CreateSessionResponse, serverEndpointsSize) - offsetof(UA_CreateSessionResponse, serverCertificate) - sizeof(UA_ByteString), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +}, +{ + UA_TYPENAME("ServerSoftwareCertificates") /* .memberName */ + UA_TYPES_SIGNEDSOFTWARECERTIFICATE, /* .memberTypeIndex */ + offsetof(UA_CreateSessionResponse, serverSoftwareCertificatesSize) - offsetof(UA_CreateSessionResponse, serverEndpoints) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +}, +{ + UA_TYPENAME("ServerSignature") /* .memberName */ + UA_TYPES_SIGNATUREDATA, /* .memberTypeIndex */ + offsetof(UA_CreateSessionResponse, serverSignature) - offsetof(UA_CreateSessionResponse, serverSoftwareCertificates) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("eventQueueOverFlowCount") /* .memberName */ + UA_TYPENAME("MaxRequestMessageSize") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionDiagnosticsDataType, eventQueueOverFlowCount) - offsetof(UA_SubscriptionDiagnosticsDataType, nextSequenceNumber) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_CreateSessionResponse, maxRequestMessageSize) - offsetof(UA_CreateSessionResponse, serverSignature) - sizeof(UA_SignatureData), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* FilterOperand */ -#define FilterOperand_members NULL +},}; -/* MonitoredItemNotification */ -static UA_DataTypeMember MonitoredItemNotification_members[2] = { +/* UserIdentityToken */ +static UA_DataTypeMember UserIdentityToken_members[1] = { { - UA_TYPENAME("clientHandle") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ + UA_TYPENAME("PolicyId") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* AnonymousIdentityToken */ +static UA_DataTypeMember AnonymousIdentityToken_members[1] = { { - UA_TYPENAME("value") /* .memberName */ - UA_TYPES_DATAVALUE, /* .memberTypeIndex */ - offsetof(UA_MonitoredItemNotification, value) - offsetof(UA_MonitoredItemNotification, clientHandle) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("PolicyId") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* DeleteNodesItem */ -static UA_DataTypeMember DeleteNodesItem_members[2] = { +/* UserNameIdentityToken */ +static UA_DataTypeMember UserNameIdentityToken_members[4] = { { - UA_TYPENAME("nodeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ + UA_TYPENAME("PolicyId") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("deleteTargetReferences") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_DeleteNodesItem, deleteTargetReferences) - offsetof(UA_DeleteNodesItem, nodeId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("UserName") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_UserNameIdentityToken, userName) - offsetof(UA_UserNameIdentityToken, policyId) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* DeleteSubscriptionsRequest */ -static UA_DataTypeMember DeleteSubscriptionsRequest_members[2] = { +}, { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("Password") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_UserNameIdentityToken, password) - offsetof(UA_UserNameIdentityToken, userName) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("subscriptionIds") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_DeleteSubscriptionsRequest, subscriptionIdsSize) - offsetof(UA_DeleteSubscriptionsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("EncryptionAlgorithm") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_UserNameIdentityToken, encryptionAlgorithm) - offsetof(UA_UserNameIdentityToken, password) - sizeof(UA_ByteString), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* SubscriptionAcknowledgement */ -static UA_DataTypeMember SubscriptionAcknowledgement_members[2] = { +/* X509IdentityToken */ +static UA_DataTypeMember X509IdentityToken_members[2] = { { - UA_TYPENAME("subscriptionId") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ + UA_TYPENAME("PolicyId") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("sequenceNumber") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SubscriptionAcknowledgement, sequenceNumber) - offsetof(UA_SubscriptionAcknowledgement, subscriptionId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("CertificateData") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_X509IdentityToken, certificateData) - offsetof(UA_X509IdentityToken, policyId) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* ReadValueId */ -static UA_DataTypeMember ReadValueId_members[4] = { +/* IssuedIdentityToken */ +static UA_DataTypeMember IssuedIdentityToken_members[3] = { { - UA_TYPENAME("nodeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ + UA_TYPENAME("PolicyId") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("attributeId") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ReadValueId, attributeId) - offsetof(UA_ReadValueId, nodeId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("TokenData") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_IssuedIdentityToken, tokenData) - offsetof(UA_IssuedIdentityToken, policyId) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("indexRange") /* .memberName */ + UA_TYPENAME("EncryptionAlgorithm") /* .memberName */ UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_ReadValueId, indexRange) - offsetof(UA_ReadValueId, attributeId) - sizeof(UA_UInt32), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}, -{ - UA_TYPENAME("dataEncoding") /* .memberName */ - UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ - offsetof(UA_ReadValueId, dataEncoding) - offsetof(UA_ReadValueId, indexRange) - sizeof(UA_String), /* .padding */ + offsetof(UA_IssuedIdentityToken, encryptionAlgorithm) - offsetof(UA_IssuedIdentityToken, tokenData) - sizeof(UA_ByteString), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* DataTypeAttributes */ -static UA_DataTypeMember DataTypeAttributes_members[6] = { +/* ActivateSessionRequest */ +static UA_DataTypeMember ActivateSessionRequest_members[6] = { { - UA_TYPENAME("specifiedAttributes") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("displayName") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_DataTypeAttributes, displayName) - offsetof(UA_DataTypeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ClientSignature") /* .memberName */ + UA_TYPES_SIGNATUREDATA, /* .memberTypeIndex */ + offsetof(UA_ActivateSessionRequest, clientSignature) - offsetof(UA_ActivateSessionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("description") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_DataTypeAttributes, description) - offsetof(UA_DataTypeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("ClientSoftwareCertificates") /* .memberName */ + UA_TYPES_SIGNEDSOFTWARECERTIFICATE, /* .memberTypeIndex */ + offsetof(UA_ActivateSessionRequest, clientSoftwareCertificatesSize) - offsetof(UA_ActivateSessionRequest, clientSignature) - sizeof(UA_SignatureData), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("writeMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_DataTypeAttributes, writeMask) - offsetof(UA_DataTypeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("LocaleIds") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_ActivateSessionRequest, localeIdsSize) - offsetof(UA_ActivateSessionRequest, clientSoftwareCertificates) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("userWriteMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_DataTypeAttributes, userWriteMask) - offsetof(UA_DataTypeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("UserIdentityToken") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_ActivateSessionRequest, userIdentityToken) - offsetof(UA_ActivateSessionRequest, localeIds) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("isAbstract") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_DataTypeAttributes, isAbstract) - offsetof(UA_DataTypeAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("UserTokenSignature") /* .memberName */ + UA_TYPES_SIGNATUREDATA, /* .memberTypeIndex */ + offsetof(UA_ActivateSessionRequest, userTokenSignature) - offsetof(UA_ActivateSessionRequest, userIdentityToken) - sizeof(UA_ExtensionObject), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* ResponseHeader */ -static UA_DataTypeMember ResponseHeader_members[6] = { +/* ActivateSessionResponse */ +static UA_DataTypeMember ActivateSessionResponse_members[4] = { { - UA_TYPENAME("timestamp") /* .memberName */ - UA_TYPES_DATETIME, /* .memberTypeIndex */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("requestHandle") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ResponseHeader, requestHandle) - offsetof(UA_ResponseHeader, timestamp) - sizeof(UA_DateTime), /* .padding */ + UA_TYPENAME("ServerNonce") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_ActivateSessionResponse, serverNonce) - offsetof(UA_ActivateSessionResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serviceResult") /* .memberName */ + UA_TYPENAME("Results") /* .memberName */ UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_ResponseHeader, serviceResult) - offsetof(UA_ResponseHeader, requestHandle) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_ActivateSessionResponse, resultsSize) - offsetof(UA_ActivateSessionResponse, serverNonce) - sizeof(UA_ByteString), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("serviceDiagnostics") /* .memberName */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_ResponseHeader, serviceDiagnostics) - offsetof(UA_ResponseHeader, serviceResult) - sizeof(UA_StatusCode), /* .padding */ + offsetof(UA_ActivateSessionResponse, diagnosticInfosSize) - offsetof(UA_ActivateSessionResponse, results) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}, + true /* .isArray */ +},}; + +/* CloseSessionRequest */ +static UA_DataTypeMember CloseSessionRequest_members[2] = { { - UA_TYPENAME("stringTable") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_ResponseHeader, stringTableSize) - offsetof(UA_ResponseHeader, serviceDiagnostics) - sizeof(UA_DiagnosticInfo), /* .padding */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("additionalHeader") /* .memberName */ - UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ - offsetof(UA_ResponseHeader, additionalHeader) - offsetof(UA_ResponseHeader, stringTable) - sizeof(void*), /* .padding */ + UA_TYPENAME("DeleteSubscriptions") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_CloseSessionRequest, deleteSubscriptions) - offsetof(UA_CloseSessionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* DeleteMonitoredItemsRequest */ -static UA_DataTypeMember DeleteMonitoredItemsRequest_members[3] = { +/* CloseSessionResponse */ +static UA_DataTypeMember CloseSessionResponse_members[1] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* NodeAttributesMask */ +#define NodeAttributesMask_members NULL + +/* NodeAttributes */ +static UA_DataTypeMember NodeAttributes_members[5] = { { - UA_TYPENAME("subscriptionId") /* .memberName */ + UA_TYPENAME("SpecifiedAttributes") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_DeleteMonitoredItemsRequest, subscriptionId) - offsetof(UA_DeleteMonitoredItemsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("monitoredItemIds") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_DeleteMonitoredItemsRequest, monitoredItemIdsSize) - offsetof(UA_DeleteMonitoredItemsRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("DisplayName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_NodeAttributes, displayName) - offsetof(UA_NodeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* ViewDescription */ -static UA_DataTypeMember ViewDescription_members[3] = { + false /* .isArray */ +}, { - UA_TYPENAME("viewId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_NodeAttributes, description) - offsetof(UA_NodeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("timestamp") /* .memberName */ - UA_TYPES_DATETIME, /* .memberTypeIndex */ - offsetof(UA_ViewDescription, timestamp) - offsetof(UA_ViewDescription, viewId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("WriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_NodeAttributes, writeMask) - offsetof(UA_NodeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("viewVersion") /* .memberName */ + UA_TYPENAME("UserWriteMask") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ViewDescription, viewVersion) - offsetof(UA_ViewDescription, timestamp) - sizeof(UA_DateTime), /* .padding */ + offsetof(UA_NodeAttributes, userWriteMask) - offsetof(UA_NodeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* ServerOnNetwork */ -static UA_DataTypeMember ServerOnNetwork_members[4] = { +/* ObjectAttributes */ +static UA_DataTypeMember ObjectAttributes_members[6] = { { - UA_TYPENAME("recordId") /* .memberName */ + UA_TYPENAME("SpecifiedAttributes") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serverName") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_ServerOnNetwork, serverName) - offsetof(UA_ServerOnNetwork, recordId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("DisplayName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_ObjectAttributes, displayName) - offsetof(UA_ObjectAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("discoveryUrl") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_ServerOnNetwork, discoveryUrl) - offsetof(UA_ServerOnNetwork, serverName) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_ObjectAttributes, description) - offsetof(UA_ObjectAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serverCapabilities") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_ServerOnNetwork, serverCapabilitiesSize) - offsetof(UA_ServerOnNetwork, discoveryUrl) - sizeof(UA_String), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* DeleteMonitoredItemsResponse */ -static UA_DataTypeMember DeleteMonitoredItemsResponse_members[3] = { -{ - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("WriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ObjectAttributes, writeMask) - offsetof(UA_ObjectAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_DeleteMonitoredItemsResponse, resultsSize) - offsetof(UA_DeleteMonitoredItemsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("UserWriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ObjectAttributes, userWriteMask) - offsetof(UA_ObjectAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_DeleteMonitoredItemsResponse, diagnosticInfosSize) - offsetof(UA_DeleteMonitoredItemsResponse, results) - sizeof(void*), /* .padding */ + UA_TYPENAME("EventNotifier") /* .memberName */ + UA_TYPES_BYTE, /* .memberTypeIndex */ + offsetof(UA_ObjectAttributes, eventNotifier) - offsetof(UA_ObjectAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* FindServersOnNetworkResponse */ -static UA_DataTypeMember FindServersOnNetworkResponse_members[3] = { +/* VariableAttributes */ +static UA_DataTypeMember VariableAttributes_members[13] = { { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + UA_TYPENAME("SpecifiedAttributes") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("lastCounterResetTime") /* .memberName */ - UA_TYPES_DATETIME, /* .memberTypeIndex */ - offsetof(UA_FindServersOnNetworkResponse, lastCounterResetTime) - offsetof(UA_FindServersOnNetworkResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("DisplayName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_VariableAttributes, displayName) - offsetof(UA_VariableAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("servers") /* .memberName */ - UA_TYPES_SERVERONNETWORK, /* .memberTypeIndex */ - offsetof(UA_FindServersOnNetworkResponse, serversSize) - offsetof(UA_FindServersOnNetworkResponse, lastCounterResetTime) - sizeof(UA_DateTime), /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_VariableAttributes, description) - offsetof(UA_VariableAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* RelativePath */ -static UA_DataTypeMember RelativePath_members[1] = { + false /* .isArray */ +}, { - UA_TYPENAME("elements") /* .memberName */ - UA_TYPES_RELATIVEPATHELEMENT, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("WriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_VariableAttributes, writeMask) - offsetof(UA_VariableAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* RegisterNodesRequest */ -static UA_DataTypeMember RegisterNodesRequest_members[2] = { + false /* .isArray */ +}, { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("UserWriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_VariableAttributes, userWriteMask) - offsetof(UA_VariableAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("nodesToRegister") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_RegisterNodesRequest, nodesToRegisterSize) - offsetof(UA_RegisterNodesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("Value") /* .memberName */ + UA_TYPES_VARIANT, /* .memberTypeIndex */ + offsetof(UA_VariableAttributes, value) - offsetof(UA_VariableAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* AggregateConfiguration */ -static UA_DataTypeMember AggregateConfiguration_members[5] = { + false /* .isArray */ +}, { - UA_TYPENAME("useServerCapabilitiesDefaults") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("DataType") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_VariableAttributes, dataType) - offsetof(UA_VariableAttributes, value) - sizeof(UA_Variant), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("treatUncertainAsBad") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_AggregateConfiguration, treatUncertainAsBad) - offsetof(UA_AggregateConfiguration, useServerCapabilitiesDefaults) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("ValueRank") /* .memberName */ + UA_TYPES_INT32, /* .memberTypeIndex */ + offsetof(UA_VariableAttributes, valueRank) - offsetof(UA_VariableAttributes, dataType) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("percentDataBad") /* .memberName */ + UA_TYPENAME("ArrayDimensions") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_VariableAttributes, arrayDimensionsSize) - offsetof(UA_VariableAttributes, valueRank) - sizeof(UA_Int32), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +}, +{ + UA_TYPENAME("AccessLevel") /* .memberName */ UA_TYPES_BYTE, /* .memberTypeIndex */ - offsetof(UA_AggregateConfiguration, percentDataBad) - offsetof(UA_AggregateConfiguration, treatUncertainAsBad) - sizeof(UA_Boolean), /* .padding */ + offsetof(UA_VariableAttributes, accessLevel) - offsetof(UA_VariableAttributes, arrayDimensions) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("percentDataGood") /* .memberName */ + UA_TYPENAME("UserAccessLevel") /* .memberName */ UA_TYPES_BYTE, /* .memberTypeIndex */ - offsetof(UA_AggregateConfiguration, percentDataGood) - offsetof(UA_AggregateConfiguration, percentDataBad) - sizeof(UA_Byte), /* .padding */ + offsetof(UA_VariableAttributes, userAccessLevel) - offsetof(UA_VariableAttributes, accessLevel) - sizeof(UA_Byte), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +}, +{ + UA_TYPENAME("MinimumSamplingInterval") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_VariableAttributes, minimumSamplingInterval) - offsetof(UA_VariableAttributes, userAccessLevel) - sizeof(UA_Byte), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("useSlopedExtrapolation") /* .memberName */ + UA_TYPENAME("Historizing") /* .memberName */ UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_AggregateConfiguration, useSlopedExtrapolation) - offsetof(UA_AggregateConfiguration, percentDataGood) - sizeof(UA_Byte), /* .padding */ + offsetof(UA_VariableAttributes, historizing) - offsetof(UA_VariableAttributes, minimumSamplingInterval) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* DeleteNodesRequest */ -static UA_DataTypeMember DeleteNodesRequest_members[2] = { +/* MethodAttributes */ +static UA_DataTypeMember MethodAttributes_members[7] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("SpecifiedAttributes") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("nodesToDelete") /* .memberName */ - UA_TYPES_DELETENODESITEM, /* .memberTypeIndex */ - offsetof(UA_DeleteNodesRequest, nodesToDeleteSize) - offsetof(UA_DeleteNodesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("DisplayName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_MethodAttributes, displayName) - offsetof(UA_MethodAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* PublishResponse */ -static UA_DataTypeMember PublishResponse_members[7] = { + false /* .isArray */ +}, { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_MethodAttributes, description) - offsetof(UA_MethodAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("subscriptionId") /* .memberName */ + UA_TYPENAME("WriteMask") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_PublishResponse, subscriptionId) - offsetof(UA_PublishResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + offsetof(UA_MethodAttributes, writeMask) - offsetof(UA_MethodAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("availableSequenceNumbers") /* .memberName */ + UA_TYPENAME("UserWriteMask") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_PublishResponse, availableSequenceNumbersSize) - offsetof(UA_PublishResponse, subscriptionId) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_MethodAttributes, userWriteMask) - offsetof(UA_MethodAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("moreNotifications") /* .memberName */ + UA_TYPENAME("Executable") /* .memberName */ UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_PublishResponse, moreNotifications) - offsetof(UA_PublishResponse, availableSequenceNumbers) - sizeof(void*), /* .padding */ + offsetof(UA_MethodAttributes, executable) - offsetof(UA_MethodAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("notificationMessage") /* .memberName */ - UA_TYPES_NOTIFICATIONMESSAGE, /* .memberTypeIndex */ - offsetof(UA_PublishResponse, notificationMessage) - offsetof(UA_PublishResponse, moreNotifications) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("UserExecutable") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_MethodAttributes, userExecutable) - offsetof(UA_MethodAttributes, executable) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* ObjectTypeAttributes */ +static UA_DataTypeMember ObjectTypeAttributes_members[6] = { { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_PublishResponse, resultsSize) - offsetof(UA_PublishResponse, notificationMessage) - sizeof(UA_NotificationMessage), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}, -{ - UA_TYPENAME("diagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_PublishResponse, diagnosticInfosSize) - offsetof(UA_PublishResponse, results) - sizeof(void*), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* MonitoredItemModifyRequest */ -static UA_DataTypeMember MonitoredItemModifyRequest_members[2] = { -{ - UA_TYPENAME("monitoredItemId") /* .memberName */ + UA_TYPENAME("SpecifiedAttributes") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("requestedParameters") /* .memberName */ - UA_TYPES_MONITORINGPARAMETERS, /* .memberTypeIndex */ - offsetof(UA_MonitoredItemModifyRequest, requestedParameters) - offsetof(UA_MonitoredItemModifyRequest, monitoredItemId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("DisplayName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_ObjectTypeAttributes, displayName) - offsetof(UA_ObjectTypeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* ServiceCounterDataType */ -static UA_DataTypeMember ServiceCounterDataType_members[2] = { +}, { - UA_TYPENAME("totalCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_ObjectTypeAttributes, description) - offsetof(UA_ObjectTypeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("errorCount") /* .memberName */ + UA_TYPENAME("WriteMask") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ServiceCounterDataType, errorCount) - offsetof(UA_ServiceCounterDataType, totalCount) - sizeof(UA_UInt32), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; - -/* ModelChangeStructureDataType */ -static UA_DataTypeMember ModelChangeStructureDataType_members[3] = { -{ - UA_TYPENAME("affected") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - 0, /* .padding */ + offsetof(UA_ObjectTypeAttributes, writeMask) - offsetof(UA_ObjectTypeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("affectedType") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_ModelChangeStructureDataType, affectedType) - offsetof(UA_ModelChangeStructureDataType, affected) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("UserWriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ObjectTypeAttributes, userWriteMask) - offsetof(UA_ObjectTypeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("verb") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - offsetof(UA_ModelChangeStructureDataType, verb) - offsetof(UA_ModelChangeStructureDataType, affectedType) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("IsAbstract") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_ObjectTypeAttributes, isAbstract) - offsetof(UA_ObjectTypeAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* UserNameIdentityToken */ -static UA_DataTypeMember UserNameIdentityToken_members[4] = { +/* VariableTypeAttributes */ +static UA_DataTypeMember VariableTypeAttributes_members[10] = { { - UA_TYPENAME("policyId") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ + UA_TYPENAME("SpecifiedAttributes") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("userName") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_UserNameIdentityToken, userName) - offsetof(UA_UserNameIdentityToken, policyId) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("DisplayName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_VariableTypeAttributes, displayName) - offsetof(UA_VariableTypeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("password") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_UserNameIdentityToken, password) - offsetof(UA_UserNameIdentityToken, userName) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_VariableTypeAttributes, description) - offsetof(UA_VariableTypeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("encryptionAlgorithm") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_UserNameIdentityToken, encryptionAlgorithm) - offsetof(UA_UserNameIdentityToken, password) - sizeof(UA_ByteString), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; - -/* IdType */ -static UA_DataTypeMember IdType_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("WriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_VariableTypeAttributes, writeMask) - offsetof(UA_VariableTypeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* UserTokenType */ -static UA_DataTypeMember UserTokenType_members[1] = { +}, { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("UserWriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_VariableTypeAttributes, userWriteMask) - offsetof(UA_VariableTypeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* SetTriggeringResponse */ -static UA_DataTypeMember SetTriggeringResponse_members[5] = { +}, { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("Value") /* .memberName */ + UA_TYPES_VARIANT, /* .memberTypeIndex */ + offsetof(UA_VariableTypeAttributes, value) - offsetof(UA_VariableTypeAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("addResults") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_SetTriggeringResponse, addResultsSize) - offsetof(UA_SetTriggeringResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("DataType") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_VariableTypeAttributes, dataType) - offsetof(UA_VariableTypeAttributes, value) - sizeof(UA_Variant), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("addDiagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_SetTriggeringResponse, addDiagnosticInfosSize) - offsetof(UA_SetTriggeringResponse, addResults) - sizeof(void*), /* .padding */ + UA_TYPENAME("ValueRank") /* .memberName */ + UA_TYPES_INT32, /* .memberTypeIndex */ + offsetof(UA_VariableTypeAttributes, valueRank) - offsetof(UA_VariableTypeAttributes, dataType) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("removeResults") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_SetTriggeringResponse, removeResultsSize) - offsetof(UA_SetTriggeringResponse, addDiagnosticInfos) - sizeof(void*), /* .padding */ + UA_TYPENAME("ArrayDimensions") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_VariableTypeAttributes, arrayDimensionsSize) - offsetof(UA_VariableTypeAttributes, valueRank) - sizeof(UA_Int32), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("removeDiagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_SetTriggeringResponse, removeDiagnosticInfosSize) - offsetof(UA_SetTriggeringResponse, removeResults) - sizeof(void*), /* .padding */ + UA_TYPENAME("IsAbstract") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_VariableTypeAttributes, isAbstract) - offsetof(UA_VariableTypeAttributes, arrayDimensions) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* TimeZoneDataType */ -static UA_DataTypeMember TimeZoneDataType_members[2] = { +/* ReferenceTypeAttributes */ +static UA_DataTypeMember ReferenceTypeAttributes_members[8] = { { - UA_TYPENAME("offset") /* .memberName */ - UA_TYPES_INT16, /* .memberTypeIndex */ + UA_TYPENAME("SpecifiedAttributes") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("daylightSavingInOffset") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_TimeZoneDataType, daylightSavingInOffset) - offsetof(UA_TimeZoneDataType, offset) - sizeof(UA_Int16), /* .padding */ + UA_TYPENAME("DisplayName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_ReferenceTypeAttributes, displayName) - offsetof(UA_ReferenceTypeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* ActivateSessionRequest */ -static UA_DataTypeMember ActivateSessionRequest_members[6] = { +}, { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_ReferenceTypeAttributes, description) - offsetof(UA_ReferenceTypeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("clientSignature") /* .memberName */ - UA_TYPES_SIGNATUREDATA, /* .memberTypeIndex */ - offsetof(UA_ActivateSessionRequest, clientSignature) - offsetof(UA_ActivateSessionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("WriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ReferenceTypeAttributes, writeMask) - offsetof(UA_ReferenceTypeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("clientSoftwareCertificates") /* .memberName */ - UA_TYPES_SIGNEDSOFTWARECERTIFICATE, /* .memberTypeIndex */ - offsetof(UA_ActivateSessionRequest, clientSoftwareCertificatesSize) - offsetof(UA_ActivateSessionRequest, clientSignature) - sizeof(UA_SignatureData), /* .padding */ + UA_TYPENAME("UserWriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ReferenceTypeAttributes, userWriteMask) - offsetof(UA_ReferenceTypeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("localeIds") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_ActivateSessionRequest, localeIdsSize) - offsetof(UA_ActivateSessionRequest, clientSoftwareCertificates) - sizeof(void*), /* .padding */ + UA_TYPENAME("IsAbstract") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_ReferenceTypeAttributes, isAbstract) - offsetof(UA_ReferenceTypeAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("userIdentityToken") /* .memberName */ - UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ - offsetof(UA_ActivateSessionRequest, userIdentityToken) - offsetof(UA_ActivateSessionRequest, localeIds) - sizeof(void*), /* .padding */ + UA_TYPENAME("Symmetric") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_ReferenceTypeAttributes, symmetric) - offsetof(UA_ReferenceTypeAttributes, isAbstract) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("userTokenSignature") /* .memberName */ - UA_TYPES_SIGNATUREDATA, /* .memberTypeIndex */ - offsetof(UA_ActivateSessionRequest, userTokenSignature) - offsetof(UA_ActivateSessionRequest, userIdentityToken) - sizeof(UA_ExtensionObject), /* .padding */ + UA_TYPENAME("InverseName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_ReferenceTypeAttributes, inverseName) - offsetof(UA_ReferenceTypeAttributes, symmetric) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* OpenSecureChannelResponse */ -static UA_DataTypeMember OpenSecureChannelResponse_members[4] = { +/* DataTypeAttributes */ +static UA_DataTypeMember DataTypeAttributes_members[6] = { { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + UA_TYPENAME("SpecifiedAttributes") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serverProtocolVersion") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_OpenSecureChannelResponse, serverProtocolVersion) - offsetof(UA_OpenSecureChannelResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("DisplayName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_DataTypeAttributes, displayName) - offsetof(UA_DataTypeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("securityToken") /* .memberName */ - UA_TYPES_CHANNELSECURITYTOKEN, /* .memberTypeIndex */ - offsetof(UA_OpenSecureChannelResponse, securityToken) - offsetof(UA_OpenSecureChannelResponse, serverProtocolVersion) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_DataTypeAttributes, description) - offsetof(UA_DataTypeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serverNonce") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_OpenSecureChannelResponse, serverNonce) - offsetof(UA_OpenSecureChannelResponse, securityToken) - sizeof(UA_ChannelSecurityToken), /* .padding */ + UA_TYPENAME("WriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_DataTypeAttributes, writeMask) - offsetof(UA_DataTypeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* ApplicationType */ -static UA_DataTypeMember ApplicationType_members[1] = { +}, { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("UserWriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_DataTypeAttributes, userWriteMask) - offsetof(UA_DataTypeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* ServerState */ -static UA_DataTypeMember ServerState_members[1] = { +}, { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("IsAbstract") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_DataTypeAttributes, isAbstract) - offsetof(UA_DataTypeAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* QueryNextResponse */ -static UA_DataTypeMember QueryNextResponse_members[3] = { +/* ViewAttributes */ +static UA_DataTypeMember ViewAttributes_members[7] = { { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + UA_TYPENAME("SpecifiedAttributes") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("queryDataSets") /* .memberName */ - UA_TYPES_QUERYDATASET, /* .memberTypeIndex */ - offsetof(UA_QueryNextResponse, queryDataSetsSize) - offsetof(UA_QueryNextResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("DisplayName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_ViewAttributes, displayName) - offsetof(UA_ViewAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("revisedContinuationPoint") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_QueryNextResponse, revisedContinuationPoint) - offsetof(UA_QueryNextResponse, queryDataSets) - sizeof(void*), /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_ViewAttributes, description) - offsetof(UA_ViewAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* DiscoveryConfiguration */ -#define DiscoveryConfiguration_members NULL - -/* ActivateSessionResponse */ -static UA_DataTypeMember ActivateSessionResponse_members[4] = { +}, { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("WriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ViewAttributes, writeMask) - offsetof(UA_ViewAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serverNonce") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_ActivateSessionResponse, serverNonce) - offsetof(UA_ActivateSessionResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("UserWriteMask") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ViewAttributes, userWriteMask) - offsetof(UA_ViewAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_ActivateSessionResponse, resultsSize) - offsetof(UA_ActivateSessionResponse, serverNonce) - sizeof(UA_ByteString), /* .padding */ + UA_TYPENAME("ContainsNoLoops") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_ViewAttributes, containsNoLoops) - offsetof(UA_ViewAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_ActivateSessionResponse, diagnosticInfosSize) - offsetof(UA_ActivateSessionResponse, results) - sizeof(void*), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* EndpointUrlListDataType */ -static UA_DataTypeMember EndpointUrlListDataType_members[1] = { -{ - UA_TYPENAME("endpointUrlList") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("EventNotifier") /* .memberName */ + UA_TYPES_BYTE, /* .memberTypeIndex */ + offsetof(UA_ViewAttributes, eventNotifier) - offsetof(UA_ViewAttributes, containsNoLoops) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* FilterOperator */ -static UA_DataTypeMember FilterOperator_members[1] = { +/* AddNodesItem */ +static UA_DataTypeMember AddNodesItem_members[7] = { { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ + UA_TYPENAME("ParentNodeId") /* .memberName */ + UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* QueryNextRequest */ -static UA_DataTypeMember QueryNextRequest_members[3] = { +}, { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("ReferenceTypeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_AddNodesItem, referenceTypeId) - offsetof(UA_AddNodesItem, parentNodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("releaseContinuationPoint") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_QueryNextRequest, releaseContinuationPoint) - offsetof(UA_QueryNextRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("RequestedNewNodeId") /* .memberName */ + UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ + offsetof(UA_AddNodesItem, requestedNewNodeId) - offsetof(UA_AddNodesItem, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("continuationPoint") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_QueryNextRequest, continuationPoint) - offsetof(UA_QueryNextRequest, releaseContinuationPoint) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("BrowseName") /* .memberName */ + UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ + offsetof(UA_AddNodesItem, browseName) - offsetof(UA_AddNodesItem, requestedNewNodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* WriteResponse */ -static UA_DataTypeMember WriteResponse_members[3] = { +}, { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("NodeClass") /* .memberName */ + UA_TYPES_NODECLASS, /* .memberTypeIndex */ + offsetof(UA_AddNodesItem, nodeClass) - offsetof(UA_AddNodesItem, browseName) - sizeof(UA_QualifiedName), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_WriteResponse, resultsSize) - offsetof(UA_WriteResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("NodeAttributes") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_AddNodesItem, nodeAttributes) - offsetof(UA_AddNodesItem, nodeClass) - sizeof(UA_NodeClass), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_WriteResponse, diagnosticInfosSize) - offsetof(UA_WriteResponse, results) - sizeof(void*), /* .padding */ + UA_TYPENAME("TypeDefinition") /* .memberName */ + UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ + offsetof(UA_AddNodesItem, typeDefinition) - offsetof(UA_AddNodesItem, nodeAttributes) - sizeof(UA_ExtensionObject), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* BrowseNextRequest */ -static UA_DataTypeMember BrowseNextRequest_members[3] = { +/* AddNodesResult */ +static UA_DataTypeMember AddNodesResult_members[2] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("StatusCode") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("releaseContinuationPoints") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_BrowseNextRequest, releaseContinuationPoints) - offsetof(UA_BrowseNextRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("AddedNodeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_AddNodesResult, addedNodeId) - offsetof(UA_AddNodesResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, -{ - UA_TYPENAME("continuationPoints") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_BrowseNextRequest, continuationPointsSize) - offsetof(UA_BrowseNextRequest, releaseContinuationPoints) - sizeof(UA_Boolean), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; +},}; -/* CreateSubscriptionRequest */ -static UA_DataTypeMember CreateSubscriptionRequest_members[7] = { +/* AddNodesRequest */ +static UA_DataTypeMember AddNodesRequest_members[2] = { { - UA_TYPENAME("requestHeader") /* .memberName */ + UA_TYPENAME("RequestHeader") /* .memberName */ UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("requestedPublishingInterval") /* .memberName */ - UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_CreateSubscriptionRequest, requestedPublishingInterval) - offsetof(UA_CreateSubscriptionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("NodesToAdd") /* .memberName */ + UA_TYPES_ADDNODESITEM, /* .memberTypeIndex */ + offsetof(UA_AddNodesRequest, nodesToAddSize) - offsetof(UA_AddNodesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}, + true /* .isArray */ +},}; + +/* AddNodesResponse */ +static UA_DataTypeMember AddNodesResponse_members[3] = { { - UA_TYPENAME("requestedLifetimeCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_CreateSubscriptionRequest, requestedLifetimeCount) - offsetof(UA_CreateSubscriptionRequest, requestedPublishingInterval) - sizeof(UA_Double), /* .padding */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("requestedMaxKeepAliveCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_CreateSubscriptionRequest, requestedMaxKeepAliveCount) - offsetof(UA_CreateSubscriptionRequest, requestedLifetimeCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_ADDNODESRESULT, /* .memberTypeIndex */ + offsetof(UA_AddNodesResponse, resultsSize) - offsetof(UA_AddNodesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("maxNotificationsPerPublish") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_CreateSubscriptionRequest, maxNotificationsPerPublish) - offsetof(UA_CreateSubscriptionRequest, requestedMaxKeepAliveCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_AddNodesResponse, diagnosticInfosSize) - offsetof(UA_AddNodesResponse, results) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}, + true /* .isArray */ +},}; + +/* AddReferencesItem */ +static UA_DataTypeMember AddReferencesItem_members[6] = { { - UA_TYPENAME("publishingEnabled") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_CreateSubscriptionRequest, publishingEnabled) - offsetof(UA_CreateSubscriptionRequest, maxNotificationsPerPublish) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("SourceNodeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("priority") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - offsetof(UA_CreateSubscriptionRequest, priority) - offsetof(UA_CreateSubscriptionRequest, publishingEnabled) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("ReferenceTypeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_AddReferencesItem, referenceTypeId) - offsetof(UA_AddReferencesItem, sourceNodeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* VariableTypeAttributes */ -static UA_DataTypeMember VariableTypeAttributes_members[10] = { +}, { - UA_TYPENAME("specifiedAttributes") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("IsForward") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_AddReferencesItem, isForward) - offsetof(UA_AddReferencesItem, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("displayName") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_VariableTypeAttributes, displayName) - offsetof(UA_VariableTypeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("TargetServerUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_AddReferencesItem, targetServerUri) - offsetof(UA_AddReferencesItem, isForward) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("description") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_VariableTypeAttributes, description) - offsetof(UA_VariableTypeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("TargetNodeId") /* .memberName */ + UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ + offsetof(UA_AddReferencesItem, targetNodeId) - offsetof(UA_AddReferencesItem, targetServerUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("writeMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_VariableTypeAttributes, writeMask) - offsetof(UA_VariableTypeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("TargetNodeClass") /* .memberName */ + UA_TYPES_NODECLASS, /* .memberTypeIndex */ + offsetof(UA_AddReferencesItem, targetNodeClass) - offsetof(UA_AddReferencesItem, targetNodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* AddReferencesRequest */ +static UA_DataTypeMember AddReferencesRequest_members[2] = { { - UA_TYPENAME("userWriteMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_VariableTypeAttributes, userWriteMask) - offsetof(UA_VariableTypeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("value") /* .memberName */ - UA_TYPES_VARIANT, /* .memberTypeIndex */ - offsetof(UA_VariableTypeAttributes, value) - offsetof(UA_VariableTypeAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ReferencesToAdd") /* .memberName */ + UA_TYPES_ADDREFERENCESITEM, /* .memberTypeIndex */ + offsetof(UA_AddReferencesRequest, referencesToAddSize) - offsetof(UA_AddReferencesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}, + true /* .isArray */ +},}; + +/* AddReferencesResponse */ +static UA_DataTypeMember AddReferencesResponse_members[3] = { { - UA_TYPENAME("dataType") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_VariableTypeAttributes, dataType) - offsetof(UA_VariableTypeAttributes, value) - sizeof(UA_Variant), /* .padding */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("valueRank") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - offsetof(UA_VariableTypeAttributes, valueRank) - offsetof(UA_VariableTypeAttributes, dataType) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + offsetof(UA_AddReferencesResponse, resultsSize) - offsetof(UA_AddReferencesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("arrayDimensions") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_VariableTypeAttributes, arrayDimensionsSize) - offsetof(UA_VariableTypeAttributes, valueRank) - sizeof(UA_Int32), /* .padding */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_AddReferencesResponse, diagnosticInfosSize) - offsetof(UA_AddReferencesResponse, results) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ +},}; + +/* DeleteNodesItem */ +static UA_DataTypeMember DeleteNodesItem_members[2] = { +{ + UA_TYPENAME("NodeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + 0, /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ }, { - UA_TYPENAME("isAbstract") /* .memberName */ + UA_TYPENAME("DeleteTargetReferences") /* .memberName */ UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_VariableTypeAttributes, isAbstract) - offsetof(UA_VariableTypeAttributes, arrayDimensions) - sizeof(void*), /* .padding */ + offsetof(UA_DeleteNodesItem, deleteTargetReferences) - offsetof(UA_DeleteNodesItem, nodeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* BrowsePathResult */ -static UA_DataTypeMember BrowsePathResult_members[2] = { +/* DeleteNodesRequest */ +static UA_DataTypeMember DeleteNodesRequest_members[2] = { { - UA_TYPENAME("statusCode") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("targets") /* .memberName */ - UA_TYPES_BROWSEPATHTARGET, /* .memberTypeIndex */ - offsetof(UA_BrowsePathResult, targetsSize) - offsetof(UA_BrowsePathResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ + UA_TYPENAME("NodesToDelete") /* .memberName */ + UA_TYPES_DELETENODESITEM, /* .memberTypeIndex */ + offsetof(UA_DeleteNodesRequest, nodesToDeleteSize) - offsetof(UA_DeleteNodesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* ModifySubscriptionResponse */ -static UA_DataTypeMember ModifySubscriptionResponse_members[4] = { +/* DeleteNodesResponse */ +static UA_DataTypeMember DeleteNodesResponse_members[3] = { { - UA_TYPENAME("responseHeader") /* .memberName */ + UA_TYPENAME("ResponseHeader") /* .memberName */ UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("revisedPublishingInterval") /* .memberName */ - UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_ModifySubscriptionResponse, revisedPublishingInterval) - offsetof(UA_ModifySubscriptionResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}, -{ - UA_TYPENAME("revisedLifetimeCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ModifySubscriptionResponse, revisedLifetimeCount) - offsetof(UA_ModifySubscriptionResponse, revisedPublishingInterval) - sizeof(UA_Double), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + offsetof(UA_DeleteNodesResponse, resultsSize) - offsetof(UA_DeleteNodesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("revisedMaxKeepAliveCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ModifySubscriptionResponse, revisedMaxKeepAliveCount) - offsetof(UA_ModifySubscriptionResponse, revisedLifetimeCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_DeleteNodesResponse, diagnosticInfosSize) - offsetof(UA_DeleteNodesResponse, results) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* RedundantServerDataType */ -static UA_DataTypeMember RedundantServerDataType_members[3] = { +/* DeleteReferencesItem */ +static UA_DataTypeMember DeleteReferencesItem_members[5] = { { - UA_TYPENAME("serverId") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ + UA_TYPENAME("SourceNodeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serviceLevel") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - offsetof(UA_RedundantServerDataType, serviceLevel) - offsetof(UA_RedundantServerDataType, serverId) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("ReferenceTypeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_DeleteReferencesItem, referenceTypeId) - offsetof(UA_DeleteReferencesItem, sourceNodeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serverState") /* .memberName */ - UA_TYPES_SERVERSTATE, /* .memberTypeIndex */ - offsetof(UA_RedundantServerDataType, serverState) - offsetof(UA_RedundantServerDataType, serviceLevel) - sizeof(UA_Byte), /* .padding */ + UA_TYPENAME("IsForward") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_DeleteReferencesItem, isForward) - offsetof(UA_DeleteReferencesItem, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* RegisterNodesResponse */ -static UA_DataTypeMember RegisterNodesResponse_members[2] = { +}, { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("TargetNodeId") /* .memberName */ + UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ + offsetof(UA_DeleteReferencesItem, targetNodeId) - offsetof(UA_DeleteReferencesItem, isForward) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("registeredNodeIds") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_RegisterNodesResponse, registeredNodeIdsSize) - offsetof(UA_RegisterNodesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("DeleteBidirectional") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_DeleteReferencesItem, deleteBidirectional) - offsetof(UA_DeleteReferencesItem, targetNodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* CloseSessionRequest */ -static UA_DataTypeMember CloseSessionRequest_members[2] = { +/* DeleteReferencesRequest */ +static UA_DataTypeMember DeleteReferencesRequest_members[2] = { { - UA_TYPENAME("requestHeader") /* .memberName */ + UA_TYPENAME("RequestHeader") /* .memberName */ UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("deleteSubscriptions") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_CloseSessionRequest, deleteSubscriptions) - offsetof(UA_CloseSessionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("ReferencesToDelete") /* .memberName */ + UA_TYPES_DELETEREFERENCESITEM, /* .memberTypeIndex */ + offsetof(UA_DeleteReferencesRequest, referencesToDeleteSize) - offsetof(UA_DeleteReferencesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* ModifyMonitoredItemsResponse */ -static UA_DataTypeMember ModifyMonitoredItemsResponse_members[3] = { +/* DeleteReferencesResponse */ +static UA_DataTypeMember DeleteReferencesResponse_members[3] = { { - UA_TYPENAME("responseHeader") /* .memberName */ + UA_TYPENAME("ResponseHeader") /* .memberName */ UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_MONITOREDITEMMODIFYRESULT, /* .memberTypeIndex */ - offsetof(UA_ModifyMonitoredItemsResponse, resultsSize) - offsetof(UA_ModifyMonitoredItemsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + offsetof(UA_DeleteReferencesResponse, resultsSize) - offsetof(UA_DeleteReferencesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_ModifyMonitoredItemsResponse, diagnosticInfosSize) - offsetof(UA_ModifyMonitoredItemsResponse, results) - sizeof(void*), /* .padding */ + offsetof(UA_DeleteReferencesResponse, diagnosticInfosSize) - offsetof(UA_DeleteReferencesResponse, results) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* ModifySubscriptionRequest */ -static UA_DataTypeMember ModifySubscriptionRequest_members[7] = { +/* BrowseDirection */ +#define BrowseDirection_members NULL + +/* ViewDescription */ +static UA_DataTypeMember ViewDescription_members[3] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("ViewId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("subscriptionId") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ModifySubscriptionRequest, subscriptionId) - offsetof(UA_ModifySubscriptionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("Timestamp") /* .memberName */ + UA_TYPES_DATETIME, /* .memberTypeIndex */ + offsetof(UA_ViewDescription, timestamp) - offsetof(UA_ViewDescription, viewId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("requestedPublishingInterval") /* .memberName */ - UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_ModifySubscriptionRequest, requestedPublishingInterval) - offsetof(UA_ModifySubscriptionRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ViewVersion") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ViewDescription, viewVersion) - offsetof(UA_ViewDescription, timestamp) - sizeof(UA_DateTime), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* BrowseDescription */ +static UA_DataTypeMember BrowseDescription_members[6] = { { - UA_TYPENAME("requestedLifetimeCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ModifySubscriptionRequest, requestedLifetimeCount) - offsetof(UA_ModifySubscriptionRequest, requestedPublishingInterval) - sizeof(UA_Double), /* .padding */ + UA_TYPENAME("NodeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("requestedMaxKeepAliveCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ModifySubscriptionRequest, requestedMaxKeepAliveCount) - offsetof(UA_ModifySubscriptionRequest, requestedLifetimeCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("BrowseDirection") /* .memberName */ + UA_TYPES_BROWSEDIRECTION, /* .memberTypeIndex */ + offsetof(UA_BrowseDescription, browseDirection) - offsetof(UA_BrowseDescription, nodeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxNotificationsPerPublish") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ModifySubscriptionRequest, maxNotificationsPerPublish) - offsetof(UA_ModifySubscriptionRequest, requestedMaxKeepAliveCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ReferenceTypeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_BrowseDescription, referenceTypeId) - offsetof(UA_BrowseDescription, browseDirection) - sizeof(UA_BrowseDirection), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("priority") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - offsetof(UA_ModifySubscriptionRequest, priority) - offsetof(UA_ModifySubscriptionRequest, maxNotificationsPerPublish) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("IncludeSubtypes") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_BrowseDescription, includeSubtypes) - offsetof(UA_BrowseDescription, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* ServerDiagnosticsSummaryDataType */ -static UA_DataTypeMember ServerDiagnosticsSummaryDataType_members[12] = { +}, { - UA_TYPENAME("serverViewCount") /* .memberName */ + UA_TYPENAME("NodeClassMask") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - 0, /* .padding */ + offsetof(UA_BrowseDescription, nodeClassMask) - offsetof(UA_BrowseDescription, includeSubtypes) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("currentSessionCount") /* .memberName */ + UA_TYPENAME("ResultMask") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ServerDiagnosticsSummaryDataType, currentSessionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, serverViewCount) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_BrowseDescription, resultMask) - offsetof(UA_BrowseDescription, nodeClassMask) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* BrowseResultMask */ +#define BrowseResultMask_members NULL + +/* ReferenceDescription */ +static UA_DataTypeMember ReferenceDescription_members[7] = { { - UA_TYPENAME("cumulatedSessionCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSessionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, currentSessionCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ReferenceTypeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("securityRejectedSessionCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedSessionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSessionCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("IsForward") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_ReferenceDescription, isForward) - offsetof(UA_ReferenceDescription, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("rejectedSessionCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedSessionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedSessionCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("NodeId") /* .memberName */ + UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ + offsetof(UA_ReferenceDescription, nodeId) - offsetof(UA_ReferenceDescription, isForward) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("sessionTimeoutCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ServerDiagnosticsSummaryDataType, sessionTimeoutCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedSessionCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("BrowseName") /* .memberName */ + UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ + offsetof(UA_ReferenceDescription, browseName) - offsetof(UA_ReferenceDescription, nodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("sessionAbortCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ServerDiagnosticsSummaryDataType, sessionAbortCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, sessionTimeoutCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("DisplayName") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_ReferenceDescription, displayName) - offsetof(UA_ReferenceDescription, browseName) - sizeof(UA_QualifiedName), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("currentSubscriptionCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ServerDiagnosticsSummaryDataType, currentSubscriptionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, sessionAbortCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("NodeClass") /* .memberName */ + UA_TYPES_NODECLASS, /* .memberTypeIndex */ + offsetof(UA_ReferenceDescription, nodeClass) - offsetof(UA_ReferenceDescription, displayName) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("cumulatedSubscriptionCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSubscriptionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, currentSubscriptionCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("TypeDefinition") /* .memberName */ + UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ + offsetof(UA_ReferenceDescription, typeDefinition) - offsetof(UA_ReferenceDescription, nodeClass) - sizeof(UA_NodeClass), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* BrowseResult */ +static UA_DataTypeMember BrowseResult_members[3] = { { - UA_TYPENAME("publishingIntervalCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ServerDiagnosticsSummaryDataType, publishingIntervalCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSubscriptionCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("StatusCode") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("securityRejectedRequestsCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedRequestsCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, publishingIntervalCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ContinuationPoint") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_BrowseResult, continuationPoint) - offsetof(UA_BrowseResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("rejectedRequestsCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedRequestsCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedRequestsCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("References") /* .memberName */ + UA_TYPES_REFERENCEDESCRIPTION, /* .memberTypeIndex */ + offsetof(UA_BrowseResult, referencesSize) - offsetof(UA_BrowseResult, continuationPoint) - sizeof(UA_ByteString), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* UserTokenPolicy */ -static UA_DataTypeMember UserTokenPolicy_members[5] = { +/* BrowseRequest */ +static UA_DataTypeMember BrowseRequest_members[4] = { { - UA_TYPENAME("policyId") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("tokenType") /* .memberName */ - UA_TYPES_USERTOKENTYPE, /* .memberTypeIndex */ - offsetof(UA_UserTokenPolicy, tokenType) - offsetof(UA_UserTokenPolicy, policyId) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("View") /* .memberName */ + UA_TYPES_VIEWDESCRIPTION, /* .memberTypeIndex */ + offsetof(UA_BrowseRequest, view) - offsetof(UA_BrowseRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("issuedTokenType") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_UserTokenPolicy, issuedTokenType) - offsetof(UA_UserTokenPolicy, tokenType) - sizeof(UA_UserTokenType), /* .padding */ + UA_TYPENAME("RequestedMaxReferencesPerNode") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_BrowseRequest, requestedMaxReferencesPerNode) - offsetof(UA_BrowseRequest, view) - sizeof(UA_ViewDescription), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("issuerEndpointUrl") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_UserTokenPolicy, issuerEndpointUrl) - offsetof(UA_UserTokenPolicy, issuedTokenType) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("NodesToBrowse") /* .memberName */ + UA_TYPES_BROWSEDESCRIPTION, /* .memberTypeIndex */ + offsetof(UA_BrowseRequest, nodesToBrowseSize) - offsetof(UA_BrowseRequest, requestedMaxReferencesPerNode) - sizeof(UA_UInt32), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* BrowseResponse */ +static UA_DataTypeMember BrowseResponse_members[3] = { +{ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("securityPolicyUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_UserTokenPolicy, securityPolicyUri) - offsetof(UA_UserTokenPolicy, issuerEndpointUrl) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_BROWSERESULT, /* .memberTypeIndex */ + offsetof(UA_BrowseResponse, resultsSize) - offsetof(UA_BrowseResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +}, +{ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_BrowseResponse, diagnosticInfosSize) - offsetof(UA_BrowseResponse, results) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; -/* ReferenceTypeAttributes */ -static UA_DataTypeMember ReferenceTypeAttributes_members[8] = { +/* BrowseNextRequest */ +static UA_DataTypeMember BrowseNextRequest_members[3] = { { - UA_TYPENAME("specifiedAttributes") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("displayName") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_ReferenceTypeAttributes, displayName) - offsetof(UA_ReferenceTypeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ReleaseContinuationPoints") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_BrowseNextRequest, releaseContinuationPoints) - offsetof(UA_BrowseNextRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("description") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_ReferenceTypeAttributes, description) - offsetof(UA_ReferenceTypeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("ContinuationPoints") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_BrowseNextRequest, continuationPointsSize) - offsetof(UA_BrowseNextRequest, releaseContinuationPoints) - sizeof(UA_Boolean), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* BrowseNextResponse */ +static UA_DataTypeMember BrowseNextResponse_members[3] = { +{ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("writeMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ReferenceTypeAttributes, writeMask) - offsetof(UA_ReferenceTypeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_BROWSERESULT, /* .memberTypeIndex */ + offsetof(UA_BrowseNextResponse, resultsSize) - offsetof(UA_BrowseNextResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("userWriteMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ReferenceTypeAttributes, userWriteMask) - offsetof(UA_ReferenceTypeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_BrowseNextResponse, diagnosticInfosSize) - offsetof(UA_BrowseNextResponse, results) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* RelativePathElement */ +static UA_DataTypeMember RelativePathElement_members[4] = { +{ + UA_TYPENAME("ReferenceTypeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("isAbstract") /* .memberName */ + UA_TYPENAME("IsInverse") /* .memberName */ UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_ReferenceTypeAttributes, isAbstract) - offsetof(UA_ReferenceTypeAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_RelativePathElement, isInverse) - offsetof(UA_RelativePathElement, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("symmetric") /* .memberName */ + UA_TYPENAME("IncludeSubtypes") /* .memberName */ UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_ReferenceTypeAttributes, symmetric) - offsetof(UA_ReferenceTypeAttributes, isAbstract) - sizeof(UA_Boolean), /* .padding */ + offsetof(UA_RelativePathElement, includeSubtypes) - offsetof(UA_RelativePathElement, isInverse) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("inverseName") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_ReferenceTypeAttributes, inverseName) - offsetof(UA_ReferenceTypeAttributes, symmetric) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("TargetName") /* .memberName */ + UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ + offsetof(UA_RelativePathElement, targetName) - offsetof(UA_RelativePathElement, includeSubtypes) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; + +/* RelativePath */ +static UA_DataTypeMember RelativePath_members[1] = { +{ + UA_TYPENAME("Elements") /* .memberName */ + UA_TYPES_RELATIVEPATHELEMENT, /* .memberTypeIndex */ + 0, /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; /* BrowsePath */ static UA_DataTypeMember BrowsePath_members[2] = { { - UA_TYPENAME("startingNode") /* .memberName */ + UA_TYPENAME("StartingNode") /* .memberName */ UA_TYPES_NODEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("relativePath") /* .memberName */ + UA_TYPENAME("RelativePath") /* .memberName */ UA_TYPES_RELATIVEPATH, /* .memberTypeIndex */ offsetof(UA_BrowsePath, relativePath) - offsetof(UA_BrowsePath, startingNode) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* SetMonitoringModeRequest */ -static UA_DataTypeMember SetMonitoringModeRequest_members[4] = { +/* BrowsePathTarget */ +static UA_DataTypeMember BrowsePathTarget_members[2] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("TargetId") /* .memberName */ + UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("subscriptionId") /* .memberName */ + UA_TYPENAME("RemainingPathIndex") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SetMonitoringModeRequest, subscriptionId) - offsetof(UA_SetMonitoringModeRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + offsetof(UA_BrowsePathTarget, remainingPathIndex) - offsetof(UA_BrowsePathTarget, targetId) - sizeof(UA_ExpandedNodeId), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +},}; + +/* BrowsePathResult */ +static UA_DataTypeMember BrowsePathResult_members[2] = { +{ + UA_TYPENAME("StatusCode") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("monitoringMode") /* .memberName */ - UA_TYPES_MONITORINGMODE, /* .memberTypeIndex */ - offsetof(UA_SetMonitoringModeRequest, monitoringMode) - offsetof(UA_SetMonitoringModeRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("Targets") /* .memberName */ + UA_TYPES_BROWSEPATHTARGET, /* .memberTypeIndex */ + offsetof(UA_BrowsePathResult, targetsSize) - offsetof(UA_BrowsePathResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* TranslateBrowsePathsToNodeIdsRequest */ +static UA_DataTypeMember TranslateBrowsePathsToNodeIdsRequest_members[2] = { +{ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("monitoredItemIds") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SetMonitoringModeRequest, monitoredItemIdsSize) - offsetof(UA_SetMonitoringModeRequest, monitoringMode) - sizeof(UA_MonitoringMode), /* .padding */ + UA_TYPENAME("BrowsePaths") /* .memberName */ + UA_TYPES_BROWSEPATH, /* .memberTypeIndex */ + offsetof(UA_TranslateBrowsePathsToNodeIdsRequest, browsePathsSize) - offsetof(UA_TranslateBrowsePathsToNodeIdsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* UnregisterNodesResponse */ -static UA_DataTypeMember UnregisterNodesResponse_members[1] = { +/* TranslateBrowsePathsToNodeIdsResponse */ +static UA_DataTypeMember TranslateBrowsePathsToNodeIdsResponse_members[3] = { { - UA_TYPENAME("responseHeader") /* .memberName */ + UA_TYPENAME("ResponseHeader") /* .memberName */ UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +}, +{ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_BROWSEPATHRESULT, /* .memberTypeIndex */ + offsetof(UA_TranslateBrowsePathsToNodeIdsResponse, resultsSize) - offsetof(UA_TranslateBrowsePathsToNodeIdsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +}, +{ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_TranslateBrowsePathsToNodeIdsResponse, diagnosticInfosSize) - offsetof(UA_TranslateBrowsePathsToNodeIdsResponse, results) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; -/* WriteRequest */ -static UA_DataTypeMember WriteRequest_members[2] = { +/* RegisterNodesRequest */ +static UA_DataTypeMember RegisterNodesRequest_members[2] = { { - UA_TYPENAME("requestHeader") /* .memberName */ + UA_TYPENAME("RequestHeader") /* .memberName */ UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("nodesToWrite") /* .memberName */ - UA_TYPES_WRITEVALUE, /* .memberTypeIndex */ - offsetof(UA_WriteRequest, nodesToWriteSize) - offsetof(UA_WriteRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("NodesToRegister") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_RegisterNodesRequest, nodesToRegisterSize) - offsetof(UA_RegisterNodesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* ObjectAttributes */ -static UA_DataTypeMember ObjectAttributes_members[6] = { +/* RegisterNodesResponse */ +static UA_DataTypeMember RegisterNodesResponse_members[2] = { { - UA_TYPENAME("specifiedAttributes") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("displayName") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_ObjectAttributes, displayName) - offsetof(UA_ObjectAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("RegisteredNodeIds") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_RegisterNodesResponse, registeredNodeIdsSize) - offsetof(UA_RegisterNodesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}, + true /* .isArray */ +},}; + +/* UnregisterNodesRequest */ +static UA_DataTypeMember UnregisterNodesRequest_members[2] = { { - UA_TYPENAME("description") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_ObjectAttributes, description) - offsetof(UA_ObjectAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("writeMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ObjectAttributes, writeMask) - offsetof(UA_ObjectAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("NodesToUnregister") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_UnregisterNodesRequest, nodesToUnregisterSize) - offsetof(UA_UnregisterNodesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* UnregisterNodesResponse */ +static UA_DataTypeMember UnregisterNodesResponse_members[1] = { +{ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* FilterOperator */ +#define FilterOperator_members NULL + +/* ContentFilterElement */ +static UA_DataTypeMember ContentFilterElement_members[2] = { { - UA_TYPENAME("userWriteMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ObjectAttributes, userWriteMask) - offsetof(UA_ObjectAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("FilterOperator") /* .memberName */ + UA_TYPES_FILTEROPERATOR, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("eventNotifier") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - offsetof(UA_ObjectAttributes, eventNotifier) - offsetof(UA_ObjectAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("FilterOperands") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_ContentFilterElement, filterOperandsSize) - offsetof(UA_ContentFilterElement, filterOperator) - sizeof(UA_FilterOperator), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* BrowseResultMask */ -static UA_DataTypeMember BrowseResultMask_members[1] = { +/* ContentFilter */ +static UA_DataTypeMember ContentFilter_members[1] = { { - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ + UA_TYPENAME("Elements") /* .memberName */ + UA_TYPES_CONTENTFILTERELEMENT, /* .memberTypeIndex */ + 0, /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* FilterOperand */ +#define FilterOperand_members NULL + +/* ElementOperand */ +static UA_DataTypeMember ElementOperand_members[1] = { +{ + UA_TYPENAME("Index") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* BrowseDescription */ -static UA_DataTypeMember BrowseDescription_members[6] = { +/* LiteralOperand */ +static UA_DataTypeMember LiteralOperand_members[1] = { { - UA_TYPENAME("nodeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ + UA_TYPENAME("Value") /* .memberName */ + UA_TYPES_VARIANT, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* AttributeOperand */ +static UA_DataTypeMember AttributeOperand_members[5] = { { - UA_TYPENAME("browseDirection") /* .memberName */ - UA_TYPES_BROWSEDIRECTION, /* .memberTypeIndex */ - offsetof(UA_BrowseDescription, browseDirection) - offsetof(UA_BrowseDescription, nodeId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("NodeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("referenceTypeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_BrowseDescription, referenceTypeId) - offsetof(UA_BrowseDescription, browseDirection) - sizeof(UA_BrowseDirection), /* .padding */ + UA_TYPENAME("Alias") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_AttributeOperand, alias) - offsetof(UA_AttributeOperand, nodeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("includeSubtypes") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_BrowseDescription, includeSubtypes) - offsetof(UA_BrowseDescription, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("BrowsePath") /* .memberName */ + UA_TYPES_RELATIVEPATH, /* .memberTypeIndex */ + offsetof(UA_AttributeOperand, browsePath) - offsetof(UA_AttributeOperand, alias) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("nodeClassMask") /* .memberName */ + UA_TYPENAME("AttributeId") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_BrowseDescription, nodeClassMask) - offsetof(UA_BrowseDescription, includeSubtypes) - sizeof(UA_Boolean), /* .padding */ + offsetof(UA_AttributeOperand, attributeId) - offsetof(UA_AttributeOperand, browsePath) - sizeof(UA_RelativePath), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("resultMask") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_BrowseDescription, resultMask) - offsetof(UA_BrowseDescription, nodeClassMask) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("IndexRange") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_AttributeOperand, indexRange) - offsetof(UA_AttributeOperand, attributeId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* SetTriggeringRequest */ -static UA_DataTypeMember SetTriggeringRequest_members[5] = { +/* SimpleAttributeOperand */ +static UA_DataTypeMember SimpleAttributeOperand_members[4] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("TypeDefinitionId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("subscriptionId") /* .memberName */ + UA_TYPENAME("BrowsePath") /* .memberName */ + UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ + offsetof(UA_SimpleAttributeOperand, browsePathSize) - offsetof(UA_SimpleAttributeOperand, typeDefinitionId) - sizeof(UA_NodeId), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +}, +{ + UA_TYPENAME("AttributeId") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SetTriggeringRequest, subscriptionId) - offsetof(UA_SetTriggeringRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + offsetof(UA_SimpleAttributeOperand, attributeId) - offsetof(UA_SimpleAttributeOperand, browsePath) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("triggeringItemId") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SetTriggeringRequest, triggeringItemId) - offsetof(UA_SetTriggeringRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("IndexRange") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_SimpleAttributeOperand, indexRange) - offsetof(UA_SimpleAttributeOperand, attributeId) - sizeof(UA_UInt32), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +},}; + +/* ContentFilterElementResult */ +static UA_DataTypeMember ContentFilterElementResult_members[3] = { +{ + UA_TYPENAME("StatusCode") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("linksToAdd") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SetTriggeringRequest, linksToAddSize) - offsetof(UA_SetTriggeringRequest, triggeringItemId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("OperandStatusCodes") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + offsetof(UA_ContentFilterElementResult, operandStatusCodesSize) - offsetof(UA_ContentFilterElementResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("linksToRemove") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SetTriggeringRequest, linksToRemoveSize) - offsetof(UA_SetTriggeringRequest, linksToAdd) - sizeof(void*), /* .padding */ + UA_TYPENAME("OperandDiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_ContentFilterElementResult, operandDiagnosticInfosSize) - offsetof(UA_ContentFilterElementResult, operandStatusCodes) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* SessionSecurityDiagnosticsDataType */ -static UA_DataTypeMember SessionSecurityDiagnosticsDataType_members[9] = { +/* ContentFilterResult */ +static UA_DataTypeMember ContentFilterResult_members[2] = { { - UA_TYPENAME("sessionId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ + UA_TYPENAME("ElementResults") /* .memberName */ + UA_TYPES_CONTENTFILTERELEMENTRESULT, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("clientUserIdOfSession") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_SessionSecurityDiagnosticsDataType, clientUserIdOfSession) - offsetof(UA_SessionSecurityDiagnosticsDataType, sessionId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("ElementDiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_ContentFilterResult, elementDiagnosticInfosSize) - offsetof(UA_ContentFilterResult, elementResults) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* TimestampsToReturn */ +#define TimestampsToReturn_members NULL + +/* ReadValueId */ +static UA_DataTypeMember ReadValueId_members[4] = { +{ + UA_TYPENAME("NodeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("clientUserIdHistory") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_SessionSecurityDiagnosticsDataType, clientUserIdHistorySize) - offsetof(UA_SessionSecurityDiagnosticsDataType, clientUserIdOfSession) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("AttributeId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ReadValueId, attributeId) - offsetof(UA_ReadValueId, nodeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("authenticationMechanism") /* .memberName */ + UA_TYPENAME("IndexRange") /* .memberName */ UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_SessionSecurityDiagnosticsDataType, authenticationMechanism) - offsetof(UA_SessionSecurityDiagnosticsDataType, clientUserIdHistory) - sizeof(void*), /* .padding */ + offsetof(UA_ReadValueId, indexRange) - offsetof(UA_ReadValueId, attributeId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("encoding") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_SessionSecurityDiagnosticsDataType, encoding) - offsetof(UA_SessionSecurityDiagnosticsDataType, authenticationMechanism) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("DataEncoding") /* .memberName */ + UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ + offsetof(UA_ReadValueId, dataEncoding) - offsetof(UA_ReadValueId, indexRange) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* ReadRequest */ +static UA_DataTypeMember ReadRequest_members[4] = { { - UA_TYPENAME("transportProtocol") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_SessionSecurityDiagnosticsDataType, transportProtocol) - offsetof(UA_SessionSecurityDiagnosticsDataType, encoding) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("securityMode") /* .memberName */ - UA_TYPES_MESSAGESECURITYMODE, /* .memberTypeIndex */ - offsetof(UA_SessionSecurityDiagnosticsDataType, securityMode) - offsetof(UA_SessionSecurityDiagnosticsDataType, transportProtocol) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("MaxAge") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_ReadRequest, maxAge) - offsetof(UA_ReadRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("securityPolicyUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_SessionSecurityDiagnosticsDataType, securityPolicyUri) - offsetof(UA_SessionSecurityDiagnosticsDataType, securityMode) - sizeof(UA_MessageSecurityMode), /* .padding */ + UA_TYPENAME("TimestampsToReturn") /* .memberName */ + UA_TYPES_TIMESTAMPSTORETURN, /* .memberTypeIndex */ + offsetof(UA_ReadRequest, timestampsToReturn) - offsetof(UA_ReadRequest, maxAge) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("clientCertificate") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_SessionSecurityDiagnosticsDataType, clientCertificate) - offsetof(UA_SessionSecurityDiagnosticsDataType, securityPolicyUri) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("NodesToRead") /* .memberName */ + UA_TYPES_READVALUEID, /* .memberTypeIndex */ + offsetof(UA_ReadRequest, nodesToReadSize) - offsetof(UA_ReadRequest, timestampsToReturn) - sizeof(UA_TimestampsToReturn), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* RepublishRequest */ -static UA_DataTypeMember RepublishRequest_members[3] = { +/* ReadResponse */ +static UA_DataTypeMember ReadResponse_members[3] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("subscriptionId") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_RepublishRequest, subscriptionId) - offsetof(UA_RepublishRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_DATAVALUE, /* .memberTypeIndex */ + offsetof(UA_ReadResponse, resultsSize) - offsetof(UA_ReadResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("retransmitSequenceNumber") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_RepublishRequest, retransmitSequenceNumber) - offsetof(UA_RepublishRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_ReadResponse, diagnosticInfosSize) - offsetof(UA_ReadResponse, results) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* GetEndpointsRequest */ -static UA_DataTypeMember GetEndpointsRequest_members[4] = { +/* WriteValue */ +static UA_DataTypeMember WriteValue_members[4] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("NodeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("endpointUrl") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_GetEndpointsRequest, endpointUrl) - offsetof(UA_GetEndpointsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("AttributeId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_WriteValue, attributeId) - offsetof(UA_WriteValue, nodeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("localeIds") /* .memberName */ + UA_TYPENAME("IndexRange") /* .memberName */ UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_GetEndpointsRequest, localeIdsSize) - offsetof(UA_GetEndpointsRequest, endpointUrl) - sizeof(UA_String), /* .padding */ + offsetof(UA_WriteValue, indexRange) - offsetof(UA_WriteValue, attributeId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("profileUris") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_GetEndpointsRequest, profileUrisSize) - offsetof(UA_GetEndpointsRequest, localeIds) - sizeof(void*), /* .padding */ + UA_TYPENAME("Value") /* .memberName */ + UA_TYPES_DATAVALUE, /* .memberTypeIndex */ + offsetof(UA_WriteValue, value) - offsetof(UA_WriteValue, indexRange) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* PublishRequest */ -static UA_DataTypeMember PublishRequest_members[2] = { +/* WriteRequest */ +static UA_DataTypeMember WriteRequest_members[2] = { { - UA_TYPENAME("requestHeader") /* .memberName */ + UA_TYPENAME("RequestHeader") /* .memberName */ UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("subscriptionAcknowledgements") /* .memberName */ - UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT, /* .memberTypeIndex */ - offsetof(UA_PublishRequest, subscriptionAcknowledgementsSize) - offsetof(UA_PublishRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("NodesToWrite") /* .memberName */ + UA_TYPES_WRITEVALUE, /* .memberTypeIndex */ + offsetof(UA_WriteRequest, nodesToWriteSize) - offsetof(UA_WriteRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* DeleteSubscriptionsResponse */ -static UA_DataTypeMember DeleteSubscriptionsResponse_members[3] = { +/* WriteResponse */ +static UA_DataTypeMember WriteResponse_members[3] = { { - UA_TYPENAME("responseHeader") /* .memberName */ + UA_TYPENAME("ResponseHeader") /* .memberName */ UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ + UA_TYPENAME("Results") /* .memberName */ UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_DeleteSubscriptionsResponse, resultsSize) - offsetof(UA_DeleteSubscriptionsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + offsetof(UA_WriteResponse, resultsSize) - offsetof(UA_WriteResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_DeleteSubscriptionsResponse, diagnosticInfosSize) - offsetof(UA_DeleteSubscriptionsResponse, results) - sizeof(void*), /* .padding */ + offsetof(UA_WriteResponse, diagnosticInfosSize) - offsetof(UA_WriteResponse, results) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* AddNodesResponse */ -static UA_DataTypeMember AddNodesResponse_members[3] = { +/* CallMethodRequest */ +static UA_DataTypeMember CallMethodRequest_members[3] = { { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + UA_TYPENAME("ObjectId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_ADDNODESRESULT, /* .memberTypeIndex */ - offsetof(UA_AddNodesResponse, resultsSize) - offsetof(UA_AddNodesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("MethodId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_CallMethodRequest, methodId) - offsetof(UA_CallMethodRequest, objectId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_AddNodesResponse, diagnosticInfosSize) - offsetof(UA_AddNodesResponse, results) - sizeof(void*), /* .padding */ + UA_TYPENAME("InputArguments") /* .memberName */ + UA_TYPES_VARIANT, /* .memberTypeIndex */ + offsetof(UA_CallMethodRequest, inputArgumentsSize) - offsetof(UA_CallMethodRequest, methodId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* DataChangeNotification */ -static UA_DataTypeMember DataChangeNotification_members[2] = { +/* CallMethodResult */ +static UA_DataTypeMember CallMethodResult_members[4] = { { - UA_TYPENAME("monitoredItems") /* .memberName */ - UA_TYPES_MONITOREDITEMNOTIFICATION, /* .memberTypeIndex */ + UA_TYPENAME("StatusCode") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ + false /* .isArray */ +}, +{ + UA_TYPENAME("InputArgumentResults") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + offsetof(UA_CallMethodResult, inputArgumentResultsSize) - offsetof(UA_CallMethodResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ + true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ + UA_TYPENAME("InputArgumentDiagnosticInfos") /* .memberName */ UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_DataChangeNotification, diagnosticInfosSize) - offsetof(UA_DataChangeNotification, monitoredItems) - sizeof(void*), /* .padding */ + offsetof(UA_CallMethodResult, inputArgumentDiagnosticInfosSize) - offsetof(UA_CallMethodResult, inputArgumentResults) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; - -/* CloseSecureChannelResponse */ -static UA_DataTypeMember CloseSecureChannelResponse_members[1] = { +}, { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("OutputArguments") /* .memberName */ + UA_TYPES_VARIANT, /* .memberTypeIndex */ + offsetof(UA_CallMethodResult, outputArgumentsSize) - offsetof(UA_CallMethodResult, inputArgumentDiagnosticInfos) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* ModifyMonitoredItemsRequest */ -static UA_DataTypeMember ModifyMonitoredItemsRequest_members[4] = { +/* CallRequest */ +static UA_DataTypeMember CallRequest_members[2] = { { - UA_TYPENAME("requestHeader") /* .memberName */ + UA_TYPENAME("RequestHeader") /* .memberName */ UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("subscriptionId") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ModifyMonitoredItemsRequest, subscriptionId) - offsetof(UA_ModifyMonitoredItemsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}, -{ - UA_TYPENAME("timestampsToReturn") /* .memberName */ - UA_TYPES_TIMESTAMPSTORETURN, /* .memberTypeIndex */ - offsetof(UA_ModifyMonitoredItemsRequest, timestampsToReturn) - offsetof(UA_ModifyMonitoredItemsRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}, -{ - UA_TYPENAME("itemsToModify") /* .memberName */ - UA_TYPES_MONITOREDITEMMODIFYREQUEST, /* .memberTypeIndex */ - offsetof(UA_ModifyMonitoredItemsRequest, itemsToModifySize) - offsetof(UA_ModifyMonitoredItemsRequest, timestampsToReturn) - sizeof(UA_TimestampsToReturn), /* .padding */ + UA_TYPENAME("MethodsToCall") /* .memberName */ + UA_TYPES_CALLMETHODREQUEST, /* .memberTypeIndex */ + offsetof(UA_CallRequest, methodsToCallSize) - offsetof(UA_CallRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* SetMonitoringModeResponse */ -static UA_DataTypeMember SetMonitoringModeResponse_members[3] = { +/* CallResponse */ +static UA_DataTypeMember CallResponse_members[3] = { { - UA_TYPENAME("responseHeader") /* .memberName */ + UA_TYPENAME("ResponseHeader") /* .memberName */ UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_SetMonitoringModeResponse, resultsSize) - offsetof(UA_SetMonitoringModeResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_CALLMETHODRESULT, /* .memberTypeIndex */ + offsetof(UA_CallResponse, resultsSize) - offsetof(UA_CallResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_SetMonitoringModeResponse, diagnosticInfosSize) - offsetof(UA_SetMonitoringModeResponse, results) - sizeof(void*), /* .padding */ + offsetof(UA_CallResponse, diagnosticInfosSize) - offsetof(UA_CallResponse, results) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* FindServersRequest */ -static UA_DataTypeMember FindServersRequest_members[4] = { +/* MonitoringMode */ +#define MonitoringMode_members NULL + +/* DataChangeTrigger */ +#define DataChangeTrigger_members NULL + +/* DeadbandType */ +#define DeadbandType_members NULL + +/* DataChangeFilter */ +static UA_DataTypeMember DataChangeFilter_members[3] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("Trigger") /* .memberName */ + UA_TYPES_DATACHANGETRIGGER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("endpointUrl") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_FindServersRequest, endpointUrl) - offsetof(UA_FindServersRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("DeadbandType") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_DataChangeFilter, deadbandType) - offsetof(UA_DataChangeFilter, trigger) - sizeof(UA_DataChangeTrigger), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("localeIds") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_FindServersRequest, localeIdsSize) - offsetof(UA_FindServersRequest, endpointUrl) - sizeof(UA_String), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}, -{ - UA_TYPENAME("serverUris") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_FindServersRequest, serverUrisSize) - offsetof(UA_FindServersRequest, localeIds) - sizeof(void*), /* .padding */ + UA_TYPENAME("DeadbandValue") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_DataChangeFilter, deadbandValue) - offsetof(UA_DataChangeFilter, deadbandType) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* ReferenceDescription */ -static UA_DataTypeMember ReferenceDescription_members[7] = { +/* EventFilter */ +static UA_DataTypeMember EventFilter_members[2] = { { - UA_TYPENAME("referenceTypeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ + UA_TYPENAME("SelectClauses") /* .memberName */ + UA_TYPES_SIMPLEATTRIBUTEOPERAND, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("isForward") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_ReferenceDescription, isForward) - offsetof(UA_ReferenceDescription, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("WhereClause") /* .memberName */ + UA_TYPES_CONTENTFILTER, /* .memberTypeIndex */ + offsetof(UA_EventFilter, whereClause) - offsetof(UA_EventFilter, selectClauses) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* AggregateConfiguration */ +static UA_DataTypeMember AggregateConfiguration_members[5] = { { - UA_TYPENAME("nodeId") /* .memberName */ - UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ - offsetof(UA_ReferenceDescription, nodeId) - offsetof(UA_ReferenceDescription, isForward) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("UseServerCapabilitiesDefaults") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("browseName") /* .memberName */ - UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ - offsetof(UA_ReferenceDescription, browseName) - offsetof(UA_ReferenceDescription, nodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ + UA_TYPENAME("TreatUncertainAsBad") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_AggregateConfiguration, treatUncertainAsBad) - offsetof(UA_AggregateConfiguration, useServerCapabilitiesDefaults) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("displayName") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_ReferenceDescription, displayName) - offsetof(UA_ReferenceDescription, browseName) - sizeof(UA_QualifiedName), /* .padding */ + UA_TYPENAME("PercentDataBad") /* .memberName */ + UA_TYPES_BYTE, /* .memberTypeIndex */ + offsetof(UA_AggregateConfiguration, percentDataBad) - offsetof(UA_AggregateConfiguration, treatUncertainAsBad) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("nodeClass") /* .memberName */ - UA_TYPES_NODECLASS, /* .memberTypeIndex */ - offsetof(UA_ReferenceDescription, nodeClass) - offsetof(UA_ReferenceDescription, displayName) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("PercentDataGood") /* .memberName */ + UA_TYPES_BYTE, /* .memberTypeIndex */ + offsetof(UA_AggregateConfiguration, percentDataGood) - offsetof(UA_AggregateConfiguration, percentDataBad) - sizeof(UA_Byte), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("typeDefinition") /* .memberName */ - UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ - offsetof(UA_ReferenceDescription, typeDefinition) - offsetof(UA_ReferenceDescription, nodeClass) - sizeof(UA_NodeClass), /* .padding */ + UA_TYPENAME("UseSlopedExtrapolation") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_AggregateConfiguration, useSlopedExtrapolation) - offsetof(UA_AggregateConfiguration, percentDataGood) - sizeof(UA_Byte), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* SetPublishingModeResponse */ -static UA_DataTypeMember SetPublishingModeResponse_members[3] = { +/* AggregateFilter */ +static UA_DataTypeMember AggregateFilter_members[4] = { { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + UA_TYPENAME("StartTime") /* .memberName */ + UA_TYPES_DATETIME, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_SetPublishingModeResponse, resultsSize) - offsetof(UA_SetPublishingModeResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("AggregateType") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_AggregateFilter, aggregateType) - offsetof(UA_AggregateFilter, startTime) - sizeof(UA_DateTime), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_SetPublishingModeResponse, diagnosticInfosSize) - offsetof(UA_SetPublishingModeResponse, results) - sizeof(void*), /* .padding */ + UA_TYPENAME("ProcessingInterval") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_AggregateFilter, processingInterval) - offsetof(UA_AggregateFilter, aggregateType) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +}, +{ + UA_TYPENAME("AggregateConfiguration") /* .memberName */ + UA_TYPES_AGGREGATECONFIGURATION, /* .memberTypeIndex */ + offsetof(UA_AggregateFilter, aggregateConfiguration) - offsetof(UA_AggregateFilter, processingInterval) - sizeof(UA_Double), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +},}; -/* ContentFilterResult */ -static UA_DataTypeMember ContentFilterResult_members[2] = { +/* EventFilterResult */ +static UA_DataTypeMember EventFilterResult_members[3] = { { - UA_TYPENAME("elementResults") /* .memberName */ - UA_TYPES_CONTENTFILTERELEMENTRESULT, /* .memberTypeIndex */ + UA_TYPENAME("SelectClauseResults") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("elementDiagnosticInfos") /* .memberName */ + UA_TYPENAME("SelectClauseDiagnosticInfos") /* .memberName */ UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_ContentFilterResult, elementDiagnosticInfosSize) - offsetof(UA_ContentFilterResult, elementResults) - sizeof(void*), /* .padding */ + offsetof(UA_EventFilterResult, selectClauseDiagnosticInfosSize) - offsetof(UA_EventFilterResult, selectClauseResults) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; - -/* RegisterServerResponse */ -static UA_DataTypeMember RegisterServerResponse_members[1] = { +}, { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("WhereClauseResult") /* .memberName */ + UA_TYPES_CONTENTFILTERRESULT, /* .memberTypeIndex */ + offsetof(UA_EventFilterResult, whereClauseResult) - offsetof(UA_EventFilterResult, selectClauseDiagnosticInfos) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* AddReferencesItem */ -static UA_DataTypeMember AddReferencesItem_members[6] = { +/* MonitoringParameters */ +static UA_DataTypeMember MonitoringParameters_members[5] = { { - UA_TYPENAME("sourceNodeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ + UA_TYPENAME("ClientHandle") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("referenceTypeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_AddReferencesItem, referenceTypeId) - offsetof(UA_AddReferencesItem, sourceNodeId) - sizeof(UA_NodeId), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}, -{ - UA_TYPENAME("isForward") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_AddReferencesItem, isForward) - offsetof(UA_AddReferencesItem, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("SamplingInterval") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_MonitoringParameters, samplingInterval) - offsetof(UA_MonitoringParameters, clientHandle) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("targetServerUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_AddReferencesItem, targetServerUri) - offsetof(UA_AddReferencesItem, isForward) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("Filter") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_MonitoringParameters, filter) - offsetof(UA_MonitoringParameters, samplingInterval) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("targetNodeId") /* .memberName */ - UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ - offsetof(UA_AddReferencesItem, targetNodeId) - offsetof(UA_AddReferencesItem, targetServerUri) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("QueueSize") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_MonitoringParameters, queueSize) - offsetof(UA_MonitoringParameters, filter) - sizeof(UA_ExtensionObject), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("targetNodeClass") /* .memberName */ - UA_TYPES_NODECLASS, /* .memberTypeIndex */ - offsetof(UA_AddReferencesItem, targetNodeClass) - offsetof(UA_AddReferencesItem, targetNodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ + UA_TYPENAME("DiscardOldest") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_MonitoringParameters, discardOldest) - offsetof(UA_MonitoringParameters, queueSize) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* QueryDataDescription */ -static UA_DataTypeMember QueryDataDescription_members[3] = { +/* MonitoredItemCreateRequest */ +static UA_DataTypeMember MonitoredItemCreateRequest_members[3] = { { - UA_TYPENAME("relativePath") /* .memberName */ - UA_TYPES_RELATIVEPATH, /* .memberTypeIndex */ + UA_TYPENAME("ItemToMonitor") /* .memberName */ + UA_TYPES_READVALUEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("attributeId") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_QueryDataDescription, attributeId) - offsetof(UA_QueryDataDescription, relativePath) - sizeof(UA_RelativePath), /* .padding */ + UA_TYPENAME("MonitoringMode") /* .memberName */ + UA_TYPES_MONITORINGMODE, /* .memberTypeIndex */ + offsetof(UA_MonitoredItemCreateRequest, monitoringMode) - offsetof(UA_MonitoredItemCreateRequest, itemToMonitor) - sizeof(UA_ReadValueId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("indexRange") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_QueryDataDescription, indexRange) - offsetof(UA_QueryDataDescription, attributeId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("RequestedParameters") /* .memberName */ + UA_TYPES_MONITORINGPARAMETERS, /* .memberTypeIndex */ + offsetof(UA_MonitoredItemCreateRequest, requestedParameters) - offsetof(UA_MonitoredItemCreateRequest, monitoringMode) - sizeof(UA_MonitoringMode), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* CreateSubscriptionResponse */ -static UA_DataTypeMember CreateSubscriptionResponse_members[5] = { +/* MonitoredItemCreateResult */ +static UA_DataTypeMember MonitoredItemCreateResult_members[5] = { { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + UA_TYPENAME("StatusCode") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("subscriptionId") /* .memberName */ + UA_TYPENAME("MonitoredItemId") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_CreateSubscriptionResponse, subscriptionId) - offsetof(UA_CreateSubscriptionResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + offsetof(UA_MonitoredItemCreateResult, monitoredItemId) - offsetof(UA_MonitoredItemCreateResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("revisedPublishingInterval") /* .memberName */ + UA_TYPENAME("RevisedSamplingInterval") /* .memberName */ UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_CreateSubscriptionResponse, revisedPublishingInterval) - offsetof(UA_CreateSubscriptionResponse, subscriptionId) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_MonitoredItemCreateResult, revisedSamplingInterval) - offsetof(UA_MonitoredItemCreateResult, monitoredItemId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("revisedLifetimeCount") /* .memberName */ + UA_TYPENAME("RevisedQueueSize") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_CreateSubscriptionResponse, revisedLifetimeCount) - offsetof(UA_CreateSubscriptionResponse, revisedPublishingInterval) - sizeof(UA_Double), /* .padding */ + offsetof(UA_MonitoredItemCreateResult, revisedQueueSize) - offsetof(UA_MonitoredItemCreateResult, revisedSamplingInterval) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("revisedMaxKeepAliveCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_CreateSubscriptionResponse, revisedMaxKeepAliveCount) - offsetof(UA_CreateSubscriptionResponse, revisedLifetimeCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("FilterResult") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_MonitoredItemCreateResult, filterResult) - offsetof(UA_MonitoredItemCreateResult, revisedQueueSize) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* NetworkGroupDataType */ -static UA_DataTypeMember NetworkGroupDataType_members[2] = { +/* CreateMonitoredItemsRequest */ +static UA_DataTypeMember CreateMonitoredItemsRequest_members[4] = { { - UA_TYPENAME("serverUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("networkPaths") /* .memberName */ - UA_TYPES_ENDPOINTURLLISTDATATYPE, /* .memberTypeIndex */ - offsetof(UA_NetworkGroupDataType, networkPathsSize) - offsetof(UA_NetworkGroupDataType, serverUri) - sizeof(UA_String), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* DeleteReferencesResponse */ -static UA_DataTypeMember DeleteReferencesResponse_members[3] = { -{ - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("SubscriptionId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_CreateMonitoredItemsRequest, subscriptionId) - offsetof(UA_CreateMonitoredItemsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_DeleteReferencesResponse, resultsSize) - offsetof(UA_DeleteReferencesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("TimestampsToReturn") /* .memberName */ + UA_TYPES_TIMESTAMPSTORETURN, /* .memberTypeIndex */ + offsetof(UA_CreateMonitoredItemsRequest, timestampsToReturn) - offsetof(UA_CreateMonitoredItemsRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_DeleteReferencesResponse, diagnosticInfosSize) - offsetof(UA_DeleteReferencesResponse, results) - sizeof(void*), /* .padding */ + UA_TYPENAME("ItemsToCreate") /* .memberName */ + UA_TYPES_MONITOREDITEMCREATEREQUEST, /* .memberTypeIndex */ + offsetof(UA_CreateMonitoredItemsRequest, itemsToCreateSize) - offsetof(UA_CreateMonitoredItemsRequest, timestampsToReturn) - sizeof(UA_TimestampsToReturn), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; /* CreateMonitoredItemsResponse */ static UA_DataTypeMember CreateMonitoredItemsResponse_members[3] = { { - UA_TYPENAME("responseHeader") /* .memberName */ + UA_TYPENAME("ResponseHeader") /* .memberName */ UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ + UA_TYPENAME("Results") /* .memberName */ UA_TYPES_MONITOREDITEMCREATERESULT, /* .memberTypeIndex */ offsetof(UA_CreateMonitoredItemsResponse, resultsSize) - offsetof(UA_CreateMonitoredItemsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ offsetof(UA_CreateMonitoredItemsResponse, diagnosticInfosSize) - offsetof(UA_CreateMonitoredItemsResponse, results) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* CallResponse */ -static UA_DataTypeMember CallResponse_members[3] = { +/* MonitoredItemModifyRequest */ +static UA_DataTypeMember MonitoredItemModifyRequest_members[2] = { { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + UA_TYPENAME("MonitoredItemId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_CALLMETHODRESULT, /* .memberTypeIndex */ - offsetof(UA_CallResponse, resultsSize) - offsetof(UA_CallResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}, -{ - UA_TYPENAME("diagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_CallResponse, diagnosticInfosSize) - offsetof(UA_CallResponse, results) - sizeof(void*), /* .padding */ + UA_TYPENAME("RequestedParameters") /* .memberName */ + UA_TYPES_MONITORINGPARAMETERS, /* .memberTypeIndex */ + offsetof(UA_MonitoredItemModifyRequest, requestedParameters) - offsetof(UA_MonitoredItemModifyRequest, monitoredItemId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* DeleteNodesResponse */ -static UA_DataTypeMember DeleteNodesResponse_members[3] = { +/* MonitoredItemModifyResult */ +static UA_DataTypeMember MonitoredItemModifyResult_members[4] = { { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + UA_TYPENAME("StatusCode") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_DeleteNodesResponse, resultsSize) - offsetof(UA_DeleteNodesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("RevisedSamplingInterval") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_MonitoredItemModifyResult, revisedSamplingInterval) - offsetof(UA_MonitoredItemModifyResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_DeleteNodesResponse, diagnosticInfosSize) - offsetof(UA_DeleteNodesResponse, results) - sizeof(void*), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* RepublishResponse */ -static UA_DataTypeMember RepublishResponse_members[2] = { -{ - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("RevisedQueueSize") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_MonitoredItemModifyResult, revisedQueueSize) - offsetof(UA_MonitoredItemModifyResult, revisedSamplingInterval) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("notificationMessage") /* .memberName */ - UA_TYPES_NOTIFICATIONMESSAGE, /* .memberTypeIndex */ - offsetof(UA_RepublishResponse, notificationMessage) - offsetof(UA_RepublishResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("FilterResult") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_MonitoredItemModifyResult, filterResult) - offsetof(UA_MonitoredItemModifyResult, revisedQueueSize) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* MonitoredItemCreateRequest */ -static UA_DataTypeMember MonitoredItemCreateRequest_members[3] = { +/* ModifyMonitoredItemsRequest */ +static UA_DataTypeMember ModifyMonitoredItemsRequest_members[4] = { { - UA_TYPENAME("itemToMonitor") /* .memberName */ - UA_TYPES_READVALUEID, /* .memberTypeIndex */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("monitoringMode") /* .memberName */ - UA_TYPES_MONITORINGMODE, /* .memberTypeIndex */ - offsetof(UA_MonitoredItemCreateRequest, monitoringMode) - offsetof(UA_MonitoredItemCreateRequest, itemToMonitor) - sizeof(UA_ReadValueId), /* .padding */ + UA_TYPENAME("SubscriptionId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ModifyMonitoredItemsRequest, subscriptionId) - offsetof(UA_ModifyMonitoredItemsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("requestedParameters") /* .memberName */ - UA_TYPES_MONITORINGPARAMETERS, /* .memberTypeIndex */ - offsetof(UA_MonitoredItemCreateRequest, requestedParameters) - offsetof(UA_MonitoredItemCreateRequest, monitoringMode) - sizeof(UA_MonitoringMode), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; - -/* DeleteReferencesRequest */ -static UA_DataTypeMember DeleteReferencesRequest_members[2] = { -{ - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("TimestampsToReturn") /* .memberName */ + UA_TYPES_TIMESTAMPSTORETURN, /* .memberTypeIndex */ + offsetof(UA_ModifyMonitoredItemsRequest, timestampsToReturn) - offsetof(UA_ModifyMonitoredItemsRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("referencesToDelete") /* .memberName */ - UA_TYPES_DELETEREFERENCESITEM, /* .memberTypeIndex */ - offsetof(UA_DeleteReferencesRequest, referencesToDeleteSize) - offsetof(UA_DeleteReferencesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("ItemsToModify") /* .memberName */ + UA_TYPES_MONITOREDITEMMODIFYREQUEST, /* .memberTypeIndex */ + offsetof(UA_ModifyMonitoredItemsRequest, itemsToModifySize) - offsetof(UA_ModifyMonitoredItemsRequest, timestampsToReturn) - sizeof(UA_TimestampsToReturn), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* ReadResponse */ -static UA_DataTypeMember ReadResponse_members[3] = { +/* ModifyMonitoredItemsResponse */ +static UA_DataTypeMember ModifyMonitoredItemsResponse_members[3] = { { - UA_TYPENAME("responseHeader") /* .memberName */ + UA_TYPENAME("ResponseHeader") /* .memberName */ UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_DATAVALUE, /* .memberTypeIndex */ - offsetof(UA_ReadResponse, resultsSize) - offsetof(UA_ReadResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_MONITOREDITEMMODIFYRESULT, /* .memberTypeIndex */ + offsetof(UA_ModifyMonitoredItemsResponse, resultsSize) - offsetof(UA_ModifyMonitoredItemsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_ReadResponse, diagnosticInfosSize) - offsetof(UA_ReadResponse, results) - sizeof(void*), /* .padding */ + offsetof(UA_ModifyMonitoredItemsResponse, diagnosticInfosSize) - offsetof(UA_ModifyMonitoredItemsResponse, results) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* AddReferencesRequest */ -static UA_DataTypeMember AddReferencesRequest_members[2] = { +/* SetMonitoringModeRequest */ +static UA_DataTypeMember SetMonitoringModeRequest_members[4] = { { - UA_TYPENAME("requestHeader") /* .memberName */ + UA_TYPENAME("RequestHeader") /* .memberName */ UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("referencesToAdd") /* .memberName */ - UA_TYPES_ADDREFERENCESITEM, /* .memberTypeIndex */ - offsetof(UA_AddReferencesRequest, referencesToAddSize) - offsetof(UA_AddReferencesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("SubscriptionId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_SetMonitoringModeRequest, subscriptionId) - offsetof(UA_SetMonitoringModeRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* ReadRequest */ -static UA_DataTypeMember ReadRequest_members[4] = { + false /* .isArray */ +}, { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("MonitoringMode") /* .memberName */ + UA_TYPES_MONITORINGMODE, /* .memberTypeIndex */ + offsetof(UA_SetMonitoringModeRequest, monitoringMode) - offsetof(UA_SetMonitoringModeRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxAge") /* .memberName */ - UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_ReadRequest, maxAge) - offsetof(UA_ReadRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("MonitoredItemIds") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_SetMonitoringModeRequest, monitoredItemIdsSize) - offsetof(UA_SetMonitoringModeRequest, monitoringMode) - sizeof(UA_MonitoringMode), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* SetMonitoringModeResponse */ +static UA_DataTypeMember SetMonitoringModeResponse_members[3] = { +{ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("timestampsToReturn") /* .memberName */ - UA_TYPES_TIMESTAMPSTORETURN, /* .memberTypeIndex */ - offsetof(UA_ReadRequest, timestampsToReturn) - offsetof(UA_ReadRequest, maxAge) - sizeof(UA_Double), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + offsetof(UA_SetMonitoringModeResponse, resultsSize) - offsetof(UA_SetMonitoringModeResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("nodesToRead") /* .memberName */ - UA_TYPES_READVALUEID, /* .memberTypeIndex */ - offsetof(UA_ReadRequest, nodesToReadSize) - offsetof(UA_ReadRequest, timestampsToReturn) - sizeof(UA_TimestampsToReturn), /* .padding */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_SetMonitoringModeResponse, diagnosticInfosSize) - offsetof(UA_SetMonitoringModeResponse, results) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* OpenSecureChannelRequest */ -static UA_DataTypeMember OpenSecureChannelRequest_members[6] = { +/* SetTriggeringRequest */ +static UA_DataTypeMember SetTriggeringRequest_members[5] = { { - UA_TYPENAME("requestHeader") /* .memberName */ + UA_TYPENAME("RequestHeader") /* .memberName */ UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("clientProtocolVersion") /* .memberName */ + UA_TYPENAME("SubscriptionId") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_OpenSecureChannelRequest, clientProtocolVersion) - offsetof(UA_OpenSecureChannelRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}, -{ - UA_TYPENAME("requestType") /* .memberName */ - UA_TYPES_SECURITYTOKENREQUESTTYPE, /* .memberTypeIndex */ - offsetof(UA_OpenSecureChannelRequest, requestType) - offsetof(UA_OpenSecureChannelRequest, clientProtocolVersion) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_SetTriggeringRequest, subscriptionId) - offsetof(UA_SetTriggeringRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("securityMode") /* .memberName */ - UA_TYPES_MESSAGESECURITYMODE, /* .memberTypeIndex */ - offsetof(UA_OpenSecureChannelRequest, securityMode) - offsetof(UA_OpenSecureChannelRequest, requestType) - sizeof(UA_SecurityTokenRequestType), /* .padding */ + UA_TYPENAME("TriggeringItemId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_SetTriggeringRequest, triggeringItemId) - offsetof(UA_SetTriggeringRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("clientNonce") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_OpenSecureChannelRequest, clientNonce) - offsetof(UA_OpenSecureChannelRequest, securityMode) - sizeof(UA_MessageSecurityMode), /* .padding */ + UA_TYPENAME("LinksToAdd") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_SetTriggeringRequest, linksToAddSize) - offsetof(UA_SetTriggeringRequest, triggeringItemId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("requestedLifetime") /* .memberName */ + UA_TYPENAME("LinksToRemove") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_OpenSecureChannelRequest, requestedLifetime) - offsetof(UA_OpenSecureChannelRequest, clientNonce) - sizeof(UA_ByteString), /* .padding */ + offsetof(UA_SetTriggeringRequest, linksToRemoveSize) - offsetof(UA_SetTriggeringRequest, linksToAdd) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* RegisterServer2Response */ -static UA_DataTypeMember RegisterServer2Response_members[3] = { +/* SetTriggeringResponse */ +static UA_DataTypeMember SetTriggeringResponse_members[5] = { { - UA_TYPENAME("responseHeader") /* .memberName */ + UA_TYPENAME("ResponseHeader") /* .memberName */ UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("configurationResults") /* .memberName */ + UA_TYPENAME("AddResults") /* .memberName */ UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_RegisterServer2Response, configurationResultsSize) - offsetof(UA_RegisterServer2Response, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + offsetof(UA_SetTriggeringResponse, addResultsSize) - offsetof(UA_SetTriggeringResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ + UA_TYPENAME("AddDiagnosticInfos") /* .memberName */ UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_RegisterServer2Response, diagnosticInfosSize) - offsetof(UA_RegisterServer2Response, configurationResults) - sizeof(void*), /* .padding */ + offsetof(UA_SetTriggeringResponse, addDiagnosticInfosSize) - offsetof(UA_SetTriggeringResponse, addResults) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +}, +{ + UA_TYPENAME("RemoveResults") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + offsetof(UA_SetTriggeringResponse, removeResultsSize) - offsetof(UA_SetTriggeringResponse, addDiagnosticInfos) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +}, +{ + UA_TYPENAME("RemoveDiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_SetTriggeringResponse, removeDiagnosticInfosSize) - offsetof(UA_SetTriggeringResponse, removeResults) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* AddNodesItem */ -static UA_DataTypeMember AddNodesItem_members[7] = { +/* DeleteMonitoredItemsRequest */ +static UA_DataTypeMember DeleteMonitoredItemsRequest_members[3] = { { - UA_TYPENAME("parentNodeId") /* .memberName */ - UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("referenceTypeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_AddNodesItem, referenceTypeId) - offsetof(UA_AddNodesItem, parentNodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ + UA_TYPENAME("SubscriptionId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_DeleteMonitoredItemsRequest, subscriptionId) - offsetof(UA_DeleteMonitoredItemsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("requestedNewNodeId") /* .memberName */ - UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ - offsetof(UA_AddNodesItem, requestedNewNodeId) - offsetof(UA_AddNodesItem, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("MonitoredItemIds") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_DeleteMonitoredItemsRequest, monitoredItemIdsSize) - offsetof(UA_DeleteMonitoredItemsRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* DeleteMonitoredItemsResponse */ +static UA_DataTypeMember DeleteMonitoredItemsResponse_members[3] = { +{ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("browseName") /* .memberName */ - UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ - offsetof(UA_AddNodesItem, browseName) - offsetof(UA_AddNodesItem, requestedNewNodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + offsetof(UA_DeleteMonitoredItemsResponse, resultsSize) - offsetof(UA_DeleteMonitoredItemsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +}, +{ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_DeleteMonitoredItemsResponse, diagnosticInfosSize) - offsetof(UA_DeleteMonitoredItemsResponse, results) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* CreateSubscriptionRequest */ +static UA_DataTypeMember CreateSubscriptionRequest_members[7] = { +{ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("nodeClass") /* .memberName */ - UA_TYPES_NODECLASS, /* .memberTypeIndex */ - offsetof(UA_AddNodesItem, nodeClass) - offsetof(UA_AddNodesItem, browseName) - sizeof(UA_QualifiedName), /* .padding */ + UA_TYPENAME("RequestedPublishingInterval") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_CreateSubscriptionRequest, requestedPublishingInterval) - offsetof(UA_CreateSubscriptionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("nodeAttributes") /* .memberName */ - UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ - offsetof(UA_AddNodesItem, nodeAttributes) - offsetof(UA_AddNodesItem, nodeClass) - sizeof(UA_NodeClass), /* .padding */ + UA_TYPENAME("RequestedLifetimeCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_CreateSubscriptionRequest, requestedLifetimeCount) - offsetof(UA_CreateSubscriptionRequest, requestedPublishingInterval) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("typeDefinition") /* .memberName */ - UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ - offsetof(UA_AddNodesItem, typeDefinition) - offsetof(UA_AddNodesItem, nodeAttributes) - sizeof(UA_ExtensionObject), /* .padding */ + UA_TYPENAME("RequestedMaxKeepAliveCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_CreateSubscriptionRequest, requestedMaxKeepAliveCount) - offsetof(UA_CreateSubscriptionRequest, requestedLifetimeCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* NodeTypeDescription */ -static UA_DataTypeMember NodeTypeDescription_members[3] = { +}, { - UA_TYPENAME("typeDefinitionNode") /* .memberName */ - UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("MaxNotificationsPerPublish") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_CreateSubscriptionRequest, maxNotificationsPerPublish) - offsetof(UA_CreateSubscriptionRequest, requestedMaxKeepAliveCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("includeSubTypes") /* .memberName */ + UA_TYPENAME("PublishingEnabled") /* .memberName */ UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_NodeTypeDescription, includeSubTypes) - offsetof(UA_NodeTypeDescription, typeDefinitionNode) - sizeof(UA_ExpandedNodeId), /* .padding */ + offsetof(UA_CreateSubscriptionRequest, publishingEnabled) - offsetof(UA_CreateSubscriptionRequest, maxNotificationsPerPublish) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("dataToReturn") /* .memberName */ - UA_TYPES_QUERYDATADESCRIPTION, /* .memberTypeIndex */ - offsetof(UA_NodeTypeDescription, dataToReturnSize) - offsetof(UA_NodeTypeDescription, includeSubTypes) - sizeof(UA_Boolean), /* .padding */ + UA_TYPENAME("Priority") /* .memberName */ + UA_TYPES_BYTE, /* .memberTypeIndex */ + offsetof(UA_CreateSubscriptionRequest, priority) - offsetof(UA_CreateSubscriptionRequest, publishingEnabled) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* ServerStatusDataType */ -static UA_DataTypeMember ServerStatusDataType_members[6] = { +/* CreateSubscriptionResponse */ +static UA_DataTypeMember CreateSubscriptionResponse_members[5] = { { - UA_TYPENAME("startTime") /* .memberName */ - UA_TYPES_DATETIME, /* .memberTypeIndex */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("currentTime") /* .memberName */ - UA_TYPES_DATETIME, /* .memberTypeIndex */ - offsetof(UA_ServerStatusDataType, currentTime) - offsetof(UA_ServerStatusDataType, startTime) - sizeof(UA_DateTime), /* .padding */ + UA_TYPENAME("SubscriptionId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_CreateSubscriptionResponse, subscriptionId) - offsetof(UA_CreateSubscriptionResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("state") /* .memberName */ - UA_TYPES_SERVERSTATE, /* .memberTypeIndex */ - offsetof(UA_ServerStatusDataType, state) - offsetof(UA_ServerStatusDataType, currentTime) - sizeof(UA_DateTime), /* .padding */ + UA_TYPENAME("RevisedPublishingInterval") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_CreateSubscriptionResponse, revisedPublishingInterval) - offsetof(UA_CreateSubscriptionResponse, subscriptionId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("buildInfo") /* .memberName */ - UA_TYPES_BUILDINFO, /* .memberTypeIndex */ - offsetof(UA_ServerStatusDataType, buildInfo) - offsetof(UA_ServerStatusDataType, state) - sizeof(UA_ServerState), /* .padding */ + UA_TYPENAME("RevisedLifetimeCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_CreateSubscriptionResponse, revisedLifetimeCount) - offsetof(UA_CreateSubscriptionResponse, revisedPublishingInterval) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("secondsTillShutdown") /* .memberName */ + UA_TYPENAME("RevisedMaxKeepAliveCount") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_ServerStatusDataType, secondsTillShutdown) - offsetof(UA_ServerStatusDataType, buildInfo) - sizeof(UA_BuildInfo), /* .padding */ + offsetof(UA_CreateSubscriptionResponse, revisedMaxKeepAliveCount) - offsetof(UA_CreateSubscriptionResponse, revisedLifetimeCount) - sizeof(UA_UInt32), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +},}; + +/* ModifySubscriptionRequest */ +static UA_DataTypeMember ModifySubscriptionRequest_members[7] = { +{ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("shutdownReason") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_ServerStatusDataType, shutdownReason) - offsetof(UA_ServerStatusDataType, secondsTillShutdown) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("SubscriptionId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ModifySubscriptionRequest, subscriptionId) - offsetof(UA_ModifySubscriptionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* AttributeOperand */ -static UA_DataTypeMember AttributeOperand_members[5] = { +}, { - UA_TYPENAME("nodeId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("RequestedPublishingInterval") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_ModifySubscriptionRequest, requestedPublishingInterval) - offsetof(UA_ModifySubscriptionRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("alias") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_AttributeOperand, alias) - offsetof(UA_AttributeOperand, nodeId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("RequestedLifetimeCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ModifySubscriptionRequest, requestedLifetimeCount) - offsetof(UA_ModifySubscriptionRequest, requestedPublishingInterval) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("browsePath") /* .memberName */ - UA_TYPES_RELATIVEPATH, /* .memberTypeIndex */ - offsetof(UA_AttributeOperand, browsePath) - offsetof(UA_AttributeOperand, alias) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("RequestedMaxKeepAliveCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ModifySubscriptionRequest, requestedMaxKeepAliveCount) - offsetof(UA_ModifySubscriptionRequest, requestedLifetimeCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("attributeId") /* .memberName */ + UA_TYPENAME("MaxNotificationsPerPublish") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_AttributeOperand, attributeId) - offsetof(UA_AttributeOperand, browsePath) - sizeof(UA_RelativePath), /* .padding */ + offsetof(UA_ModifySubscriptionRequest, maxNotificationsPerPublish) - offsetof(UA_ModifySubscriptionRequest, requestedMaxKeepAliveCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("indexRange") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_AttributeOperand, indexRange) - offsetof(UA_AttributeOperand, attributeId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("Priority") /* .memberName */ + UA_TYPES_BYTE, /* .memberTypeIndex */ + offsetof(UA_ModifySubscriptionRequest, priority) - offsetof(UA_ModifySubscriptionRequest, maxNotificationsPerPublish) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* AddReferencesResponse */ -static UA_DataTypeMember AddReferencesResponse_members[3] = { +/* ModifySubscriptionResponse */ +static UA_DataTypeMember ModifySubscriptionResponse_members[4] = { { - UA_TYPENAME("responseHeader") /* .memberName */ + UA_TYPENAME("ResponseHeader") /* .memberName */ UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ - offsetof(UA_AddReferencesResponse, resultsSize) - offsetof(UA_AddReferencesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("RevisedPublishingInterval") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_ModifySubscriptionResponse, revisedPublishingInterval) - offsetof(UA_ModifySubscriptionResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_AddReferencesResponse, diagnosticInfosSize) - offsetof(UA_AddReferencesResponse, results) - sizeof(void*), /* .padding */ + UA_TYPENAME("RevisedLifetimeCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ModifySubscriptionResponse, revisedLifetimeCount) - offsetof(UA_ModifySubscriptionResponse, revisedPublishingInterval) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +}, +{ + UA_TYPENAME("RevisedMaxKeepAliveCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ModifySubscriptionResponse, revisedMaxKeepAliveCount) - offsetof(UA_ModifySubscriptionResponse, revisedLifetimeCount) - sizeof(UA_UInt32), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +},}; -/* EventFilterResult */ -static UA_DataTypeMember EventFilterResult_members[3] = { +/* SetPublishingModeRequest */ +static UA_DataTypeMember SetPublishingModeRequest_members[3] = { { - UA_TYPENAME("selectClauseResults") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("selectClauseDiagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_EventFilterResult, selectClauseDiagnosticInfosSize) - offsetof(UA_EventFilterResult, selectClauseResults) - sizeof(void*), /* .padding */ + UA_TYPENAME("PublishingEnabled") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_SetPublishingModeRequest, publishingEnabled) - offsetof(UA_SetPublishingModeRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("whereClauseResult") /* .memberName */ - UA_TYPES_CONTENTFILTERRESULT, /* .memberTypeIndex */ - offsetof(UA_EventFilterResult, whereClauseResult) - offsetof(UA_EventFilterResult, selectClauseDiagnosticInfos) - sizeof(void*), /* .padding */ + UA_TYPENAME("SubscriptionIds") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_SetPublishingModeRequest, subscriptionIdsSize) - offsetof(UA_SetPublishingModeRequest, publishingEnabled) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* TranslateBrowsePathsToNodeIdsResponse */ -static UA_DataTypeMember TranslateBrowsePathsToNodeIdsResponse_members[3] = { +/* SetPublishingModeResponse */ +static UA_DataTypeMember SetPublishingModeResponse_members[3] = { { - UA_TYPENAME("responseHeader") /* .memberName */ + UA_TYPENAME("ResponseHeader") /* .memberName */ UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_BROWSEPATHRESULT, /* .memberTypeIndex */ - offsetof(UA_TranslateBrowsePathsToNodeIdsResponse, resultsSize) - offsetof(UA_TranslateBrowsePathsToNodeIdsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + offsetof(UA_SetPublishingModeResponse, resultsSize) - offsetof(UA_SetPublishingModeResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_TranslateBrowsePathsToNodeIdsResponse, diagnosticInfosSize) - offsetof(UA_TranslateBrowsePathsToNodeIdsResponse, results) - sizeof(void*), /* .padding */ + offsetof(UA_SetPublishingModeResponse, diagnosticInfosSize) - offsetof(UA_SetPublishingModeResponse, results) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* DataChangeFilter */ -static UA_DataTypeMember DataChangeFilter_members[3] = { +/* NotificationMessage */ +static UA_DataTypeMember NotificationMessage_members[3] = { { - UA_TYPENAME("trigger") /* .memberName */ - UA_TYPES_DATACHANGETRIGGER, /* .memberTypeIndex */ + UA_TYPENAME("SequenceNumber") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("deadbandType") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_DataChangeFilter, deadbandType) - offsetof(UA_DataChangeFilter, trigger) - sizeof(UA_DataChangeTrigger), /* .padding */ + UA_TYPENAME("PublishTime") /* .memberName */ + UA_TYPES_DATETIME, /* .memberTypeIndex */ + offsetof(UA_NotificationMessage, publishTime) - offsetof(UA_NotificationMessage, sequenceNumber) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("deadbandValue") /* .memberName */ - UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_DataChangeFilter, deadbandValue) - offsetof(UA_DataChangeFilter, deadbandType) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("NotificationData") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_NotificationMessage, notificationDataSize) - offsetof(UA_NotificationMessage, publishTime) - sizeof(UA_DateTime), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* ContentFilterElement */ -static UA_DataTypeMember ContentFilterElement_members[2] = { +/* MonitoredItemNotification */ +static UA_DataTypeMember MonitoredItemNotification_members[2] = { { - UA_TYPENAME("filterOperator") /* .memberName */ - UA_TYPES_FILTEROPERATOR, /* .memberTypeIndex */ + UA_TYPENAME("ClientHandle") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("filterOperands") /* .memberName */ - UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ - offsetof(UA_ContentFilterElement, filterOperandsSize) - offsetof(UA_ContentFilterElement, filterOperator) - sizeof(UA_FilterOperator), /* .padding */ + UA_TYPENAME("Value") /* .memberName */ + UA_TYPES_DATAVALUE, /* .memberTypeIndex */ + offsetof(UA_MonitoredItemNotification, value) - offsetof(UA_MonitoredItemNotification, clientHandle) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* TranslateBrowsePathsToNodeIdsRequest */ -static UA_DataTypeMember TranslateBrowsePathsToNodeIdsRequest_members[2] = { -{ - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ +/* EventFieldList */ +static UA_DataTypeMember EventFieldList_members[2] = { +{ + UA_TYPENAME("ClientHandle") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("browsePaths") /* .memberName */ - UA_TYPES_BROWSEPATH, /* .memberTypeIndex */ - offsetof(UA_TranslateBrowsePathsToNodeIdsRequest, browsePathsSize) - offsetof(UA_TranslateBrowsePathsToNodeIdsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("EventFields") /* .memberName */ + UA_TYPES_VARIANT, /* .memberTypeIndex */ + offsetof(UA_EventFieldList, eventFieldsSize) - offsetof(UA_EventFieldList, clientHandle) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; - -/* CloseSessionResponse */ -static UA_DataTypeMember CloseSessionResponse_members[1] = { -{ - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; +},}; -/* ApplicationDescription */ -static UA_DataTypeMember ApplicationDescription_members[7] = { +/* StatusChangeNotification */ +static UA_DataTypeMember StatusChangeNotification_members[2] = { { - UA_TYPENAME("applicationUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ + UA_TYPENAME("Status") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("productUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_ApplicationDescription, productUri) - offsetof(UA_ApplicationDescription, applicationUri) - sizeof(UA_String), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}, -{ - UA_TYPENAME("applicationName") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_ApplicationDescription, applicationName) - offsetof(UA_ApplicationDescription, productUri) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("DiagnosticInfo") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_StatusChangeNotification, diagnosticInfo) - offsetof(UA_StatusChangeNotification, status) - sizeof(UA_StatusCode), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* SubscriptionAcknowledgement */ +static UA_DataTypeMember SubscriptionAcknowledgement_members[2] = { { - UA_TYPENAME("applicationType") /* .memberName */ - UA_TYPES_APPLICATIONTYPE, /* .memberTypeIndex */ - offsetof(UA_ApplicationDescription, applicationType) - offsetof(UA_ApplicationDescription, applicationName) - sizeof(UA_LocalizedText), /* .padding */ + UA_TYPENAME("SubscriptionId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("gatewayServerUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_ApplicationDescription, gatewayServerUri) - offsetof(UA_ApplicationDescription, applicationType) - sizeof(UA_ApplicationType), /* .padding */ + UA_TYPENAME("SequenceNumber") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_SubscriptionAcknowledgement, sequenceNumber) - offsetof(UA_SubscriptionAcknowledgement, subscriptionId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* PublishRequest */ +static UA_DataTypeMember PublishRequest_members[2] = { { - UA_TYPENAME("discoveryProfileUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_ApplicationDescription, discoveryProfileUri) - offsetof(UA_ApplicationDescription, gatewayServerUri) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("discoveryUrls") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_ApplicationDescription, discoveryUrlsSize) - offsetof(UA_ApplicationDescription, discoveryProfileUri) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("SubscriptionAcknowledgements") /* .memberName */ + UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT, /* .memberTypeIndex */ + offsetof(UA_PublishRequest, subscriptionAcknowledgementsSize) - offsetof(UA_PublishRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* SessionDiagnosticsDataType */ -static UA_DataTypeMember SessionDiagnosticsDataType_members[43] = { +/* PublishResponse */ +static UA_DataTypeMember PublishResponse_members[7] = { { - UA_TYPENAME("sessionId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("sessionName") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, sessionName) - offsetof(UA_SessionDiagnosticsDataType, sessionId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("SubscriptionId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_PublishResponse, subscriptionId) - offsetof(UA_PublishResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("clientDescription") /* .memberName */ - UA_TYPES_APPLICATIONDESCRIPTION, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, clientDescription) - offsetof(UA_SessionDiagnosticsDataType, sessionName) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("AvailableSequenceNumbers") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_PublishResponse, availableSequenceNumbersSize) - offsetof(UA_PublishResponse, subscriptionId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("serverUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, serverUri) - offsetof(UA_SessionDiagnosticsDataType, clientDescription) - sizeof(UA_ApplicationDescription), /* .padding */ + UA_TYPENAME("MoreNotifications") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_PublishResponse, moreNotifications) - offsetof(UA_PublishResponse, availableSequenceNumbers) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("endpointUrl") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, endpointUrl) - offsetof(UA_SessionDiagnosticsDataType, serverUri) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("NotificationMessage") /* .memberName */ + UA_TYPES_NOTIFICATIONMESSAGE, /* .memberTypeIndex */ + offsetof(UA_PublishResponse, notificationMessage) - offsetof(UA_PublishResponse, moreNotifications) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("localeIds") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, localeIdsSize) - offsetof(UA_SessionDiagnosticsDataType, endpointUrl) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + offsetof(UA_PublishResponse, resultsSize) - offsetof(UA_PublishResponse, notificationMessage) - sizeof(UA_NotificationMessage), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("actualSessionTimeout") /* .memberName */ - UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, actualSessionTimeout) - offsetof(UA_SessionDiagnosticsDataType, localeIds) - sizeof(void*), /* .padding */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_PublishResponse, diagnosticInfosSize) - offsetof(UA_PublishResponse, results) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* RepublishRequest */ +static UA_DataTypeMember RepublishRequest_members[3] = { +{ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxResponseMessageSize") /* .memberName */ + UA_TYPENAME("SubscriptionId") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, maxResponseMessageSize) - offsetof(UA_SessionDiagnosticsDataType, actualSessionTimeout) - sizeof(UA_Double), /* .padding */ + offsetof(UA_RepublishRequest, subscriptionId) - offsetof(UA_RepublishRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("clientConnectionTime") /* .memberName */ - UA_TYPES_DATETIME, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, clientConnectionTime) - offsetof(UA_SessionDiagnosticsDataType, maxResponseMessageSize) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("RetransmitSequenceNumber") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_RepublishRequest, retransmitSequenceNumber) - offsetof(UA_RepublishRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* RepublishResponse */ +static UA_DataTypeMember RepublishResponse_members[2] = { { - UA_TYPENAME("clientLastContactTime") /* .memberName */ - UA_TYPES_DATETIME, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, clientLastContactTime) - offsetof(UA_SessionDiagnosticsDataType, clientConnectionTime) - sizeof(UA_DateTime), /* .padding */ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("currentSubscriptionsCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, currentSubscriptionsCount) - offsetof(UA_SessionDiagnosticsDataType, clientLastContactTime) - sizeof(UA_DateTime), /* .padding */ + UA_TYPENAME("NotificationMessage") /* .memberName */ + UA_TYPES_NOTIFICATIONMESSAGE, /* .memberTypeIndex */ + offsetof(UA_RepublishResponse, notificationMessage) - offsetof(UA_RepublishResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* DeleteSubscriptionsRequest */ +static UA_DataTypeMember DeleteSubscriptionsRequest_members[2] = { { - UA_TYPENAME("currentMonitoredItemsCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, currentMonitoredItemsCount) - offsetof(UA_SessionDiagnosticsDataType, currentSubscriptionsCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("RequestHeader") /* .memberName */ + UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("currentPublishRequestsInQueue") /* .memberName */ + UA_TYPENAME("SubscriptionIds") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, currentPublishRequestsInQueue) - offsetof(UA_SessionDiagnosticsDataType, currentMonitoredItemsCount) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_DeleteSubscriptionsRequest, subscriptionIdsSize) - offsetof(UA_DeleteSubscriptionsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* DeleteSubscriptionsResponse */ +static UA_DataTypeMember DeleteSubscriptionsResponse_members[3] = { +{ + UA_TYPENAME("ResponseHeader") /* .memberName */ + UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("totalRequestCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, totalRequestCount) - offsetof(UA_SessionDiagnosticsDataType, currentPublishRequestsInQueue) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("Results") /* .memberName */ + UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + offsetof(UA_DeleteSubscriptionsResponse, resultsSize) - offsetof(UA_DeleteSubscriptionsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("unauthorizedRequestCount") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, unauthorizedRequestCount) - offsetof(UA_SessionDiagnosticsDataType, totalRequestCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_DeleteSubscriptionsResponse, diagnosticInfosSize) - offsetof(UA_DeleteSubscriptionsResponse, results) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* BuildInfo */ +static UA_DataTypeMember BuildInfo_members[6] = { +{ + UA_TYPENAME("ProductUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("readCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, readCount) - offsetof(UA_SessionDiagnosticsDataType, unauthorizedRequestCount) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ManufacturerName") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_BuildInfo, manufacturerName) - offsetof(UA_BuildInfo, productUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("historyReadCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, historyReadCount) - offsetof(UA_SessionDiagnosticsDataType, readCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("ProductName") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_BuildInfo, productName) - offsetof(UA_BuildInfo, manufacturerName) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("writeCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, writeCount) - offsetof(UA_SessionDiagnosticsDataType, historyReadCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("SoftwareVersion") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_BuildInfo, softwareVersion) - offsetof(UA_BuildInfo, productName) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("historyUpdateCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, historyUpdateCount) - offsetof(UA_SessionDiagnosticsDataType, writeCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("BuildNumber") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_BuildInfo, buildNumber) - offsetof(UA_BuildInfo, softwareVersion) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("callCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, callCount) - offsetof(UA_SessionDiagnosticsDataType, historyUpdateCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("BuildDate") /* .memberName */ + UA_TYPES_DATETIME, /* .memberTypeIndex */ + offsetof(UA_BuildInfo, buildDate) - offsetof(UA_BuildInfo, buildNumber) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* RedundancySupport */ +#define RedundancySupport_members NULL + +/* ServerState */ +#define ServerState_members NULL + +/* ServerDiagnosticsSummaryDataType */ +static UA_DataTypeMember ServerDiagnosticsSummaryDataType_members[12] = { { - UA_TYPENAME("createMonitoredItemsCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, createMonitoredItemsCount) - offsetof(UA_SessionDiagnosticsDataType, callCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("ServerViewCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("modifyMonitoredItemsCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, modifyMonitoredItemsCount) - offsetof(UA_SessionDiagnosticsDataType, createMonitoredItemsCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("CurrentSessionCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ServerDiagnosticsSummaryDataType, currentSessionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, serverViewCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("setMonitoringModeCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, setMonitoringModeCount) - offsetof(UA_SessionDiagnosticsDataType, modifyMonitoredItemsCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("CumulatedSessionCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSessionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, currentSessionCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("setTriggeringCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, setTriggeringCount) - offsetof(UA_SessionDiagnosticsDataType, setMonitoringModeCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("SecurityRejectedSessionCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedSessionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSessionCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("deleteMonitoredItemsCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, deleteMonitoredItemsCount) - offsetof(UA_SessionDiagnosticsDataType, setTriggeringCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("RejectedSessionCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedSessionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedSessionCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("createSubscriptionCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, createSubscriptionCount) - offsetof(UA_SessionDiagnosticsDataType, deleteMonitoredItemsCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("SessionTimeoutCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ServerDiagnosticsSummaryDataType, sessionTimeoutCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedSessionCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("modifySubscriptionCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, modifySubscriptionCount) - offsetof(UA_SessionDiagnosticsDataType, createSubscriptionCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("SessionAbortCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ServerDiagnosticsSummaryDataType, sessionAbortCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, sessionTimeoutCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("setPublishingModeCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, setPublishingModeCount) - offsetof(UA_SessionDiagnosticsDataType, modifySubscriptionCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("CurrentSubscriptionCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ServerDiagnosticsSummaryDataType, currentSubscriptionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, sessionAbortCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("publishCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, publishCount) - offsetof(UA_SessionDiagnosticsDataType, setPublishingModeCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("CumulatedSubscriptionCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSubscriptionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, currentSubscriptionCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("republishCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, republishCount) - offsetof(UA_SessionDiagnosticsDataType, publishCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("PublishingIntervalCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ServerDiagnosticsSummaryDataType, publishingIntervalCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSubscriptionCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("transferSubscriptionsCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, transferSubscriptionsCount) - offsetof(UA_SessionDiagnosticsDataType, republishCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("SecurityRejectedRequestsCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedRequestsCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, publishingIntervalCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("deleteSubscriptionsCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, deleteSubscriptionsCount) - offsetof(UA_SessionDiagnosticsDataType, transferSubscriptionsCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("RejectedRequestsCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedRequestsCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedRequestsCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* ServerStatusDataType */ +static UA_DataTypeMember ServerStatusDataType_members[6] = { { - UA_TYPENAME("addNodesCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, addNodesCount) - offsetof(UA_SessionDiagnosticsDataType, deleteSubscriptionsCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("StartTime") /* .memberName */ + UA_TYPES_DATETIME, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("addReferencesCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, addReferencesCount) - offsetof(UA_SessionDiagnosticsDataType, addNodesCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("CurrentTime") /* .memberName */ + UA_TYPES_DATETIME, /* .memberTypeIndex */ + offsetof(UA_ServerStatusDataType, currentTime) - offsetof(UA_ServerStatusDataType, startTime) - sizeof(UA_DateTime), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("deleteNodesCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, deleteNodesCount) - offsetof(UA_SessionDiagnosticsDataType, addReferencesCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("State") /* .memberName */ + UA_TYPES_SERVERSTATE, /* .memberTypeIndex */ + offsetof(UA_ServerStatusDataType, state) - offsetof(UA_ServerStatusDataType, currentTime) - sizeof(UA_DateTime), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("deleteReferencesCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, deleteReferencesCount) - offsetof(UA_SessionDiagnosticsDataType, deleteNodesCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("BuildInfo") /* .memberName */ + UA_TYPES_BUILDINFO, /* .memberTypeIndex */ + offsetof(UA_ServerStatusDataType, buildInfo) - offsetof(UA_ServerStatusDataType, state) - sizeof(UA_ServerState), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("browseCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, browseCount) - offsetof(UA_SessionDiagnosticsDataType, deleteReferencesCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("SecondsTillShutdown") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ServerStatusDataType, secondsTillShutdown) - offsetof(UA_ServerStatusDataType, buildInfo) - sizeof(UA_BuildInfo), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("browseNextCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, browseNextCount) - offsetof(UA_SessionDiagnosticsDataType, browseCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("ShutdownReason") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_ServerStatusDataType, shutdownReason) - offsetof(UA_ServerStatusDataType, secondsTillShutdown) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* Range */ +static UA_DataTypeMember Range_members[2] = { { - UA_TYPENAME("translateBrowsePathsToNodeIdsCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, translateBrowsePathsToNodeIdsCount) - offsetof(UA_SessionDiagnosticsDataType, browseNextCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("Low") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("queryFirstCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, queryFirstCount) - offsetof(UA_SessionDiagnosticsDataType, translateBrowsePathsToNodeIdsCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("High") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_Range, high) - offsetof(UA_Range, low) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}, +},}; + +/* StructureDescription */ +static UA_DataTypeMember StructureDescription_members[3] = { { - UA_TYPENAME("queryNextCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, queryNextCount) - offsetof(UA_SessionDiagnosticsDataType, queryFirstCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("DataTypeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("registerNodesCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, registerNodesCount) - offsetof(UA_SessionDiagnosticsDataType, queryNextCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("Name") /* .memberName */ + UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ + offsetof(UA_StructureDescription, name) - offsetof(UA_StructureDescription, dataTypeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("unregisterNodesCount") /* .memberName */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .memberTypeIndex */ - offsetof(UA_SessionDiagnosticsDataType, unregisterNodesCount) - offsetof(UA_SessionDiagnosticsDataType, registerNodesCount) - sizeof(UA_ServiceCounterDataType), /* .padding */ + UA_TYPENAME("StructureDefinition") /* .memberName */ + UA_TYPES_STRUCTUREDEFINITION, /* .memberTypeIndex */ + offsetof(UA_StructureDescription, structureDefinition) - offsetof(UA_StructureDescription, name) - sizeof(UA_QualifiedName), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* ServiceFault */ -static UA_DataTypeMember ServiceFault_members[1] = { +/* FieldMetaData */ +static UA_DataTypeMember FieldMetaData_members[10] = { { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + UA_TYPENAME("Name") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* RegisteredServer */ -static UA_DataTypeMember RegisteredServer_members[8] = { +}, { - UA_TYPENAME("serverUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_FieldMetaData, description) - offsetof(UA_FieldMetaData, name) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("productUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_RegisteredServer, productUri) - offsetof(UA_RegisteredServer, serverUri) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("FieldFlags") /* .memberName */ + UA_TYPES_DATASETFIELDFLAGS, /* .memberTypeIndex */ + offsetof(UA_FieldMetaData, fieldFlags) - offsetof(UA_FieldMetaData, description) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serverNames") /* .memberName */ - UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ - offsetof(UA_RegisteredServer, serverNamesSize) - offsetof(UA_RegisteredServer, productUri) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("BuiltInType") /* .memberName */ + UA_TYPES_BYTE, /* .memberTypeIndex */ + offsetof(UA_FieldMetaData, builtInType) - offsetof(UA_FieldMetaData, fieldFlags) - sizeof(UA_DataSetFieldFlags), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("serverType") /* .memberName */ - UA_TYPES_APPLICATIONTYPE, /* .memberTypeIndex */ - offsetof(UA_RegisteredServer, serverType) - offsetof(UA_RegisteredServer, serverNames) - sizeof(void*), /* .padding */ + UA_TYPENAME("DataType") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_FieldMetaData, dataType) - offsetof(UA_FieldMetaData, builtInType) - sizeof(UA_Byte), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("gatewayServerUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_RegisteredServer, gatewayServerUri) - offsetof(UA_RegisteredServer, serverType) - sizeof(UA_ApplicationType), /* .padding */ + UA_TYPENAME("ValueRank") /* .memberName */ + UA_TYPES_INT32, /* .memberTypeIndex */ + offsetof(UA_FieldMetaData, valueRank) - offsetof(UA_FieldMetaData, dataType) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("discoveryUrls") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_RegisteredServer, discoveryUrlsSize) - offsetof(UA_RegisteredServer, gatewayServerUri) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("ArrayDimensions") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_FieldMetaData, arrayDimensionsSize) - offsetof(UA_FieldMetaData, valueRank) - sizeof(UA_Int32), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("semaphoreFilePath") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_RegisteredServer, semaphoreFilePath) - offsetof(UA_RegisteredServer, discoveryUrls) - sizeof(void*), /* .padding */ + UA_TYPENAME("MaxStringLength") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_FieldMetaData, maxStringLength) - offsetof(UA_FieldMetaData, arrayDimensions) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("isOnline") /* .memberName */ - UA_TYPES_BOOLEAN, /* .memberTypeIndex */ - offsetof(UA_RegisteredServer, isOnline) - offsetof(UA_RegisteredServer, semaphoreFilePath) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("DataSetFieldId") /* .memberName */ + UA_TYPES_GUID, /* .memberTypeIndex */ + offsetof(UA_FieldMetaData, dataSetFieldId) - offsetof(UA_FieldMetaData, maxStringLength) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +}, +{ + UA_TYPENAME("Properties") /* .memberName */ + UA_TYPES_KEYVALUEPAIR, /* .memberTypeIndex */ + offsetof(UA_FieldMetaData, propertiesSize) - offsetof(UA_FieldMetaData, dataSetFieldId) - sizeof(UA_Guid), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; -/* AggregateFilter */ -static UA_DataTypeMember AggregateFilter_members[4] = { +/* WriterGroupDataType */ +static UA_DataTypeMember WriterGroupDataType_members[16] = { { - UA_TYPENAME("startTime") /* .memberName */ - UA_TYPES_DATETIME, /* .memberTypeIndex */ + UA_TYPENAME("Name") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("aggregateType") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_AggregateFilter, aggregateType) - offsetof(UA_AggregateFilter, startTime) - sizeof(UA_DateTime), /* .padding */ + UA_TYPENAME("Enabled") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, enabled) - offsetof(UA_WriterGroupDataType, name) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("processingInterval") /* .memberName */ - UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_AggregateFilter, processingInterval) - offsetof(UA_AggregateFilter, aggregateType) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("SecurityMode") /* .memberName */ + UA_TYPES_MESSAGESECURITYMODE, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, securityMode) - offsetof(UA_WriterGroupDataType, enabled) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("aggregateConfiguration") /* .memberName */ - UA_TYPES_AGGREGATECONFIGURATION, /* .memberTypeIndex */ - offsetof(UA_AggregateFilter, aggregateConfiguration) - offsetof(UA_AggregateFilter, processingInterval) - sizeof(UA_Double), /* .padding */ + UA_TYPENAME("SecurityGroupId") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, securityGroupId) - offsetof(UA_WriterGroupDataType, securityMode) - sizeof(UA_MessageSecurityMode), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* RegisterServerRequest */ -static UA_DataTypeMember RegisterServerRequest_members[2] = { +}, { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("SecurityKeyServices") /* .memberName */ + UA_TYPES_ENDPOINTDESCRIPTION, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, securityKeyServicesSize) - offsetof(UA_WriterGroupDataType, securityGroupId) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("server") /* .memberName */ - UA_TYPES_REGISTEREDSERVER, /* .memberTypeIndex */ - offsetof(UA_RegisterServerRequest, server) - offsetof(UA_RegisterServerRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("MaxNetworkMessageSize") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, maxNetworkMessageSize) - offsetof(UA_WriterGroupDataType, securityKeyServices) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* EndpointDescription */ -static UA_DataTypeMember EndpointDescription_members[8] = { +}, { - UA_TYPENAME("endpointUrl") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("GroupProperties") /* .memberName */ + UA_TYPES_KEYVALUEPAIR, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, groupPropertiesSize) - offsetof(UA_WriterGroupDataType, maxNetworkMessageSize) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("server") /* .memberName */ - UA_TYPES_APPLICATIONDESCRIPTION, /* .memberTypeIndex */ - offsetof(UA_EndpointDescription, server) - offsetof(UA_EndpointDescription, endpointUrl) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("WriterGroupId") /* .memberName */ + UA_TYPES_UINT16, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, writerGroupId) - offsetof(UA_WriterGroupDataType, groupProperties) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serverCertificate") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_EndpointDescription, serverCertificate) - offsetof(UA_EndpointDescription, server) - sizeof(UA_ApplicationDescription), /* .padding */ + UA_TYPENAME("PublishingInterval") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, publishingInterval) - offsetof(UA_WriterGroupDataType, writerGroupId) - sizeof(UA_UInt16), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("securityMode") /* .memberName */ - UA_TYPES_MESSAGESECURITYMODE, /* .memberTypeIndex */ - offsetof(UA_EndpointDescription, securityMode) - offsetof(UA_EndpointDescription, serverCertificate) - sizeof(UA_ByteString), /* .padding */ + UA_TYPENAME("KeepAliveTime") /* .memberName */ + UA_TYPES_DOUBLE, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, keepAliveTime) - offsetof(UA_WriterGroupDataType, publishingInterval) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("securityPolicyUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_EndpointDescription, securityPolicyUri) - offsetof(UA_EndpointDescription, securityMode) - sizeof(UA_MessageSecurityMode), /* .padding */ + UA_TYPENAME("Priority") /* .memberName */ + UA_TYPES_BYTE, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, priority) - offsetof(UA_WriterGroupDataType, keepAliveTime) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("userIdentityTokens") /* .memberName */ - UA_TYPES_USERTOKENPOLICY, /* .memberTypeIndex */ - offsetof(UA_EndpointDescription, userIdentityTokensSize) - offsetof(UA_EndpointDescription, securityPolicyUri) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("LocaleIds") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, localeIdsSize) - offsetof(UA_WriterGroupDataType, priority) - sizeof(UA_Byte), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("transportProfileUri") /* .memberName */ + UA_TYPENAME("HeaderLayoutUri") /* .memberName */ UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_EndpointDescription, transportProfileUri) - offsetof(UA_EndpointDescription, userIdentityTokens) - sizeof(void*), /* .padding */ + offsetof(UA_WriterGroupDataType, headerLayoutUri) - offsetof(UA_WriterGroupDataType, localeIds) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("securityLevel") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - offsetof(UA_EndpointDescription, securityLevel) - offsetof(UA_EndpointDescription, transportProfileUri) - sizeof(UA_String), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; - -/* CreateMonitoredItemsRequest */ -static UA_DataTypeMember CreateMonitoredItemsRequest_members[4] = { -{ - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}, -{ - UA_TYPENAME("subscriptionId") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_CreateMonitoredItemsRequest, subscriptionId) - offsetof(UA_CreateMonitoredItemsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("TransportSettings") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, transportSettings) - offsetof(UA_WriterGroupDataType, headerLayoutUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("timestampsToReturn") /* .memberName */ - UA_TYPES_TIMESTAMPSTORETURN, /* .memberTypeIndex */ - offsetof(UA_CreateMonitoredItemsRequest, timestampsToReturn) - offsetof(UA_CreateMonitoredItemsRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("MessageSettings") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, messageSettings) - offsetof(UA_WriterGroupDataType, transportSettings) - sizeof(UA_ExtensionObject), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("itemsToCreate") /* .memberName */ - UA_TYPES_MONITOREDITEMCREATEREQUEST, /* .memberTypeIndex */ - offsetof(UA_CreateMonitoredItemsRequest, itemsToCreateSize) - offsetof(UA_CreateMonitoredItemsRequest, timestampsToReturn) - sizeof(UA_TimestampsToReturn), /* .padding */ + UA_TYPENAME("DataSetWriters") /* .memberName */ + UA_TYPES_DATASETWRITERDATATYPE, /* .memberTypeIndex */ + offsetof(UA_WriterGroupDataType, dataSetWritersSize) - offsetof(UA_WriterGroupDataType, messageSettings) - sizeof(UA_ExtensionObject), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* ContentFilter */ -static UA_DataTypeMember ContentFilter_members[1] = { +/* FieldTargetDataType */ +static UA_DataTypeMember FieldTargetDataType_members[7] = { { - UA_TYPENAME("elements") /* .memberName */ - UA_TYPES_CONTENTFILTERELEMENT, /* .memberTypeIndex */ + UA_TYPENAME("DataSetFieldId") /* .memberName */ + UA_TYPES_GUID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; - -/* QueryFirstResponse */ -static UA_DataTypeMember QueryFirstResponse_members[6] = { + false /* .isArray */ +}, { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("ReceiverIndexRange") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_FieldTargetDataType, receiverIndexRange) - offsetof(UA_FieldTargetDataType, dataSetFieldId) - sizeof(UA_Guid), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("queryDataSets") /* .memberName */ - UA_TYPES_QUERYDATASET, /* .memberTypeIndex */ - offsetof(UA_QueryFirstResponse, queryDataSetsSize) - offsetof(UA_QueryFirstResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("TargetNodeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ + offsetof(UA_FieldTargetDataType, targetNodeId) - offsetof(UA_FieldTargetDataType, receiverIndexRange) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("continuationPoint") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_QueryFirstResponse, continuationPoint) - offsetof(UA_QueryFirstResponse, queryDataSets) - sizeof(void*), /* .padding */ + UA_TYPENAME("AttributeId") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_FieldTargetDataType, attributeId) - offsetof(UA_FieldTargetDataType, targetNodeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("parsingResults") /* .memberName */ - UA_TYPES_PARSINGRESULT, /* .memberTypeIndex */ - offsetof(UA_QueryFirstResponse, parsingResultsSize) - offsetof(UA_QueryFirstResponse, continuationPoint) - sizeof(UA_ByteString), /* .padding */ + UA_TYPENAME("WriteIndexRange") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_FieldTargetDataType, writeIndexRange) - offsetof(UA_FieldTargetDataType, attributeId) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_QueryFirstResponse, diagnosticInfosSize) - offsetof(UA_QueryFirstResponse, parsingResults) - sizeof(void*), /* .padding */ + UA_TYPENAME("OverrideValueHandling") /* .memberName */ + UA_TYPES_OVERRIDEVALUEHANDLING, /* .memberTypeIndex */ + offsetof(UA_FieldTargetDataType, overrideValueHandling) - offsetof(UA_FieldTargetDataType, writeIndexRange) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("filterResult") /* .memberName */ - UA_TYPES_CONTENTFILTERRESULT, /* .memberTypeIndex */ - offsetof(UA_QueryFirstResponse, filterResult) - offsetof(UA_QueryFirstResponse, diagnosticInfos) - sizeof(void*), /* .padding */ + UA_TYPENAME("OverrideValue") /* .memberName */ + UA_TYPES_VARIANT, /* .memberTypeIndex */ + offsetof(UA_FieldTargetDataType, overrideValue) - offsetof(UA_FieldTargetDataType, overrideValueHandling) - sizeof(UA_OverrideValueHandling), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* AddNodesRequest */ -static UA_DataTypeMember AddNodesRequest_members[2] = { +/* EnumDefinition */ +static UA_DataTypeMember EnumDefinition_members[1] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("Fields") /* .memberName */ + UA_TYPES_ENUMFIELD, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ +},}; + +/* DataChangeNotification */ +static UA_DataTypeMember DataChangeNotification_members[2] = { +{ + UA_TYPENAME("MonitoredItems") /* .memberName */ + UA_TYPES_MONITOREDITEMNOTIFICATION, /* .memberTypeIndex */ + 0, /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ }, { - UA_TYPENAME("nodesToAdd") /* .memberName */ - UA_TYPES_ADDNODESITEM, /* .memberTypeIndex */ - offsetof(UA_AddNodesRequest, nodesToAddSize) - offsetof(UA_AddNodesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("DiagnosticInfos") /* .memberName */ + UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ + offsetof(UA_DataChangeNotification, diagnosticInfosSize) - offsetof(UA_DataChangeNotification, monitoredItems) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +},}; -/* BrowseRequest */ -static UA_DataTypeMember BrowseRequest_members[4] = { +/* EventNotificationList */ +static UA_DataTypeMember EventNotificationList_members[1] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("Events") /* .memberName */ + UA_TYPES_EVENTFIELDLIST, /* .memberTypeIndex */ + 0, /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; + +/* EnumDescription */ +static UA_DataTypeMember EnumDescription_members[4] = { +{ + UA_TYPENAME("DataTypeId") /* .memberName */ + UA_TYPES_NODEID, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("view") /* .memberName */ - UA_TYPES_VIEWDESCRIPTION, /* .memberTypeIndex */ - offsetof(UA_BrowseRequest, view) - offsetof(UA_BrowseRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("Name") /* .memberName */ + UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ + offsetof(UA_EnumDescription, name) - offsetof(UA_EnumDescription, dataTypeId) - sizeof(UA_NodeId), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("requestedMaxReferencesPerNode") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_BrowseRequest, requestedMaxReferencesPerNode) - offsetof(UA_BrowseRequest, view) - sizeof(UA_ViewDescription), /* .padding */ + UA_TYPENAME("EnumDefinition") /* .memberName */ + UA_TYPES_ENUMDEFINITION, /* .memberTypeIndex */ + offsetof(UA_EnumDescription, enumDefinition) - offsetof(UA_EnumDescription, name) - sizeof(UA_QualifiedName), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("nodesToBrowse") /* .memberName */ - UA_TYPES_BROWSEDESCRIPTION, /* .memberTypeIndex */ - offsetof(UA_BrowseRequest, nodesToBrowseSize) - offsetof(UA_BrowseRequest, requestedMaxReferencesPerNode) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("BuiltInType") /* .memberName */ + UA_TYPES_BYTE, /* .memberTypeIndex */ + offsetof(UA_EnumDescription, builtInType) - offsetof(UA_EnumDescription, enumDefinition) - sizeof(UA_EnumDefinition), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* BrowseResult */ -static UA_DataTypeMember BrowseResult_members[3] = { +/* DataSetMetaDataType */ +static UA_DataTypeMember DataSetMetaDataType_members[9] = { { - UA_TYPENAME("statusCode") /* .memberName */ - UA_TYPES_STATUSCODE, /* .memberTypeIndex */ + UA_TYPENAME("Namespaces") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("continuationPoint") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_BrowseResult, continuationPoint) - offsetof(UA_BrowseResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ + UA_TYPENAME("StructureDataTypes") /* .memberName */ + UA_TYPES_STRUCTUREDESCRIPTION, /* .memberTypeIndex */ + offsetof(UA_DataSetMetaDataType, structureDataTypesSize) - offsetof(UA_DataSetMetaDataType, namespaces) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("references") /* .memberName */ - UA_TYPES_REFERENCEDESCRIPTION, /* .memberTypeIndex */ - offsetof(UA_BrowseResult, referencesSize) - offsetof(UA_BrowseResult, continuationPoint) - sizeof(UA_ByteString), /* .padding */ + UA_TYPENAME("EnumDataTypes") /* .memberName */ + UA_TYPES_ENUMDESCRIPTION, /* .memberTypeIndex */ + offsetof(UA_DataSetMetaDataType, enumDataTypesSize) - offsetof(UA_DataSetMetaDataType, structureDataTypes) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; - -/* RegisterServer2Request */ -static UA_DataTypeMember RegisterServer2Request_members[3] = { +}, { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("SimpleDataTypes") /* .memberName */ + UA_TYPES_SIMPLETYPEDESCRIPTION, /* .memberTypeIndex */ + offsetof(UA_DataSetMetaDataType, simpleDataTypesSize) - offsetof(UA_DataSetMetaDataType, enumDataTypes) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +}, +{ + UA_TYPENAME("Name") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_DataSetMetaDataType, name) - offsetof(UA_DataSetMetaDataType, simpleDataTypes) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("server") /* .memberName */ - UA_TYPES_REGISTEREDSERVER, /* .memberTypeIndex */ - offsetof(UA_RegisterServer2Request, server) - offsetof(UA_RegisterServer2Request, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("Description") /* .memberName */ + UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ + offsetof(UA_DataSetMetaDataType, description) - offsetof(UA_DataSetMetaDataType, name) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("discoveryConfiguration") /* .memberName */ - UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ - offsetof(UA_RegisterServer2Request, discoveryConfigurationSize) - offsetof(UA_RegisterServer2Request, server) - sizeof(UA_RegisteredServer), /* .padding */ + UA_TYPENAME("Fields") /* .memberName */ + UA_TYPES_FIELDMETADATA, /* .memberTypeIndex */ + offsetof(UA_DataSetMetaDataType, fieldsSize) - offsetof(UA_DataSetMetaDataType, description) - sizeof(UA_LocalizedText), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; +}, +{ + UA_TYPENAME("DataSetClassId") /* .memberName */ + UA_TYPES_GUID, /* .memberTypeIndex */ + offsetof(UA_DataSetMetaDataType, dataSetClassId) - offsetof(UA_DataSetMetaDataType, fields) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +}, +{ + UA_TYPENAME("ConfigurationVersion") /* .memberName */ + UA_TYPES_CONFIGURATIONVERSIONDATATYPE, /* .memberTypeIndex */ + offsetof(UA_DataSetMetaDataType, configurationVersion) - offsetof(UA_DataSetMetaDataType, dataSetClassId) - sizeof(UA_Guid), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +},}; -/* CreateSessionRequest */ -static UA_DataTypeMember CreateSessionRequest_members[9] = { +/* DataSetReaderDataType */ +static UA_DataTypeMember DataSetReaderDataType_members[17] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("Name") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("clientDescription") /* .memberName */ - UA_TYPES_APPLICATIONDESCRIPTION, /* .memberTypeIndex */ - offsetof(UA_CreateSessionRequest, clientDescription) - offsetof(UA_CreateSessionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("Enabled") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_DataSetReaderDataType, enabled) - offsetof(UA_DataSetReaderDataType, name) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serverUri") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_CreateSessionRequest, serverUri) - offsetof(UA_CreateSessionRequest, clientDescription) - sizeof(UA_ApplicationDescription), /* .padding */ + UA_TYPENAME("PublisherId") /* .memberName */ + UA_TYPES_VARIANT, /* .memberTypeIndex */ + offsetof(UA_DataSetReaderDataType, publisherId) - offsetof(UA_DataSetReaderDataType, enabled) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("endpointUrl") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_CreateSessionRequest, endpointUrl) - offsetof(UA_CreateSessionRequest, serverUri) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("WriterGroupId") /* .memberName */ + UA_TYPES_UINT16, /* .memberTypeIndex */ + offsetof(UA_DataSetReaderDataType, writerGroupId) - offsetof(UA_DataSetReaderDataType, publisherId) - sizeof(UA_Variant), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("sessionName") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_CreateSessionRequest, sessionName) - offsetof(UA_CreateSessionRequest, endpointUrl) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("DataSetWriterId") /* .memberName */ + UA_TYPES_UINT16, /* .memberTypeIndex */ + offsetof(UA_DataSetReaderDataType, dataSetWriterId) - offsetof(UA_DataSetReaderDataType, writerGroupId) - sizeof(UA_UInt16), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("clientNonce") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_CreateSessionRequest, clientNonce) - offsetof(UA_CreateSessionRequest, sessionName) - sizeof(UA_String), /* .padding */ + UA_TYPENAME("DataSetMetaData") /* .memberName */ + UA_TYPES_DATASETMETADATATYPE, /* .memberTypeIndex */ + offsetof(UA_DataSetReaderDataType, dataSetMetaData) - offsetof(UA_DataSetReaderDataType, dataSetWriterId) - sizeof(UA_UInt16), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("clientCertificate") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_CreateSessionRequest, clientCertificate) - offsetof(UA_CreateSessionRequest, clientNonce) - sizeof(UA_ByteString), /* .padding */ + UA_TYPENAME("DataSetFieldContentMask") /* .memberName */ + UA_TYPES_DATASETFIELDCONTENTMASK, /* .memberTypeIndex */ + offsetof(UA_DataSetReaderDataType, dataSetFieldContentMask) - offsetof(UA_DataSetReaderDataType, dataSetMetaData) - sizeof(UA_DataSetMetaDataType), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("requestedSessionTimeout") /* .memberName */ + UA_TYPENAME("MessageReceiveTimeout") /* .memberName */ UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_CreateSessionRequest, requestedSessionTimeout) - offsetof(UA_CreateSessionRequest, clientCertificate) - sizeof(UA_ByteString), /* .padding */ + offsetof(UA_DataSetReaderDataType, messageReceiveTimeout) - offsetof(UA_DataSetReaderDataType, dataSetFieldContentMask) - sizeof(UA_DataSetFieldContentMask), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxResponseMessageSize") /* .memberName */ + UA_TYPENAME("KeyFrameCount") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_CreateSessionRequest, maxResponseMessageSize) - offsetof(UA_CreateSessionRequest, requestedSessionTimeout) - sizeof(UA_Double), /* .padding */ + offsetof(UA_DataSetReaderDataType, keyFrameCount) - offsetof(UA_DataSetReaderDataType, messageReceiveTimeout) - sizeof(UA_Double), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* EventFilter */ -static UA_DataTypeMember EventFilter_members[2] = { +}, { - UA_TYPENAME("selectClauses") /* .memberName */ - UA_TYPES_SIMPLEATTRIBUTEOPERAND, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("HeaderLayoutUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_DataSetReaderDataType, headerLayoutUri) - offsetof(UA_DataSetReaderDataType, keyFrameCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("whereClause") /* .memberName */ - UA_TYPES_CONTENTFILTER, /* .memberTypeIndex */ - offsetof(UA_EventFilter, whereClause) - offsetof(UA_EventFilter, selectClauses) - sizeof(void*), /* .padding */ + UA_TYPENAME("SecurityMode") /* .memberName */ + UA_TYPES_MESSAGESECURITYMODE, /* .memberTypeIndex */ + offsetof(UA_DataSetReaderDataType, securityMode) - offsetof(UA_DataSetReaderDataType, headerLayoutUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* GetEndpointsResponse */ -static UA_DataTypeMember GetEndpointsResponse_members[2] = { +}, { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("SecurityGroupId") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_DataSetReaderDataType, securityGroupId) - offsetof(UA_DataSetReaderDataType, securityMode) - sizeof(UA_MessageSecurityMode), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("endpoints") /* .memberName */ + UA_TYPENAME("SecurityKeyServices") /* .memberName */ UA_TYPES_ENDPOINTDESCRIPTION, /* .memberTypeIndex */ - offsetof(UA_GetEndpointsResponse, endpointsSize) - offsetof(UA_GetEndpointsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + offsetof(UA_DataSetReaderDataType, securityKeyServicesSize) - offsetof(UA_DataSetReaderDataType, securityGroupId) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; - -/* FindServersResponse */ -static UA_DataTypeMember FindServersResponse_members[2] = { -{ - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ }, { - UA_TYPENAME("servers") /* .memberName */ - UA_TYPES_APPLICATIONDESCRIPTION, /* .memberTypeIndex */ - offsetof(UA_FindServersResponse, serversSize) - offsetof(UA_FindServersResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("DataSetReaderProperties") /* .memberName */ + UA_TYPES_KEYVALUEPAIR, /* .memberTypeIndex */ + offsetof(UA_DataSetReaderDataType, dataSetReaderPropertiesSize) - offsetof(UA_DataSetReaderDataType, securityKeyServices) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ -}}; - -/* BrowseNextResponse */ -static UA_DataTypeMember BrowseNextResponse_members[3] = { +}, { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("TransportSettings") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_DataSetReaderDataType, transportSettings) - offsetof(UA_DataSetReaderDataType, dataSetReaderProperties) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_BROWSERESULT, /* .memberTypeIndex */ - offsetof(UA_BrowseNextResponse, resultsSize) - offsetof(UA_BrowseNextResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("MessageSettings") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_DataSetReaderDataType, messageSettings) - offsetof(UA_DataSetReaderDataType, transportSettings) - sizeof(UA_ExtensionObject), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("diagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_BrowseNextResponse, diagnosticInfosSize) - offsetof(UA_BrowseNextResponse, results) - sizeof(void*), /* .padding */ + UA_TYPENAME("SubscribedDataSet") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_DataSetReaderDataType, subscribedDataSet) - offsetof(UA_DataSetReaderDataType, messageSettings) - sizeof(UA_ExtensionObject), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ -}}; + false /* .isArray */ +},}; -/* BrowseResponse */ -static UA_DataTypeMember BrowseResponse_members[3] = { +/* TargetVariablesDataType */ +static UA_DataTypeMember TargetVariablesDataType_members[1] = { { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + UA_TYPENAME("TargetVariables") /* .memberName */ + UA_TYPES_FIELDTARGETDATATYPE, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}, -{ - UA_TYPENAME("results") /* .memberName */ - UA_TYPES_BROWSERESULT, /* .memberTypeIndex */ - offsetof(UA_BrowseResponse, resultsSize) - offsetof(UA_BrowseResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ - true, /* .namespaceZero */ true /* .isArray */ -}, -{ - UA_TYPENAME("diagnosticInfos") /* .memberName */ - UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ - offsetof(UA_BrowseResponse, diagnosticInfosSize) - offsetof(UA_BrowseResponse, results) - sizeof(void*), /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}}; +},}; -/* CreateSessionResponse */ -static UA_DataTypeMember CreateSessionResponse_members[10] = { +/* ReaderGroupDataType */ +static UA_DataTypeMember ReaderGroupDataType_members[10] = { { - UA_TYPENAME("responseHeader") /* .memberName */ - UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ + UA_TYPENAME("Name") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("sessionId") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_CreateSessionResponse, sessionId) - offsetof(UA_CreateSessionResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ + UA_TYPENAME("Enabled") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_ReaderGroupDataType, enabled) - offsetof(UA_ReaderGroupDataType, name) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("authenticationToken") /* .memberName */ - UA_TYPES_NODEID, /* .memberTypeIndex */ - offsetof(UA_CreateSessionResponse, authenticationToken) - offsetof(UA_CreateSessionResponse, sessionId) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("SecurityMode") /* .memberName */ + UA_TYPES_MESSAGESECURITYMODE, /* .memberTypeIndex */ + offsetof(UA_ReaderGroupDataType, securityMode) - offsetof(UA_ReaderGroupDataType, enabled) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("revisedSessionTimeout") /* .memberName */ - UA_TYPES_DOUBLE, /* .memberTypeIndex */ - offsetof(UA_CreateSessionResponse, revisedSessionTimeout) - offsetof(UA_CreateSessionResponse, authenticationToken) - sizeof(UA_NodeId), /* .padding */ + UA_TYPENAME("SecurityGroupId") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_ReaderGroupDataType, securityGroupId) - offsetof(UA_ReaderGroupDataType, securityMode) - sizeof(UA_MessageSecurityMode), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serverNonce") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_CreateSessionResponse, serverNonce) - offsetof(UA_CreateSessionResponse, revisedSessionTimeout) - sizeof(UA_Double), /* .padding */ + UA_TYPENAME("SecurityKeyServices") /* .memberName */ + UA_TYPES_ENDPOINTDESCRIPTION, /* .memberTypeIndex */ + offsetof(UA_ReaderGroupDataType, securityKeyServicesSize) - offsetof(UA_ReaderGroupDataType, securityGroupId) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("serverCertificate") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_CreateSessionResponse, serverCertificate) - offsetof(UA_CreateSessionResponse, serverNonce) - sizeof(UA_ByteString), /* .padding */ + UA_TYPENAME("MaxNetworkMessageSize") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_ReaderGroupDataType, maxNetworkMessageSize) - offsetof(UA_ReaderGroupDataType, securityKeyServices) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("serverEndpoints") /* .memberName */ - UA_TYPES_ENDPOINTDESCRIPTION, /* .memberTypeIndex */ - offsetof(UA_CreateSessionResponse, serverEndpointsSize) - offsetof(UA_CreateSessionResponse, serverCertificate) - sizeof(UA_ByteString), /* .padding */ + UA_TYPENAME("GroupProperties") /* .memberName */ + UA_TYPES_KEYVALUEPAIR, /* .memberTypeIndex */ + offsetof(UA_ReaderGroupDataType, groupPropertiesSize) - offsetof(UA_ReaderGroupDataType, maxNetworkMessageSize) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ true /* .isArray */ }, { - UA_TYPENAME("serverSoftwareCertificates") /* .memberName */ - UA_TYPES_SIGNEDSOFTWARECERTIFICATE, /* .memberTypeIndex */ - offsetof(UA_CreateSessionResponse, serverSoftwareCertificatesSize) - offsetof(UA_CreateSessionResponse, serverEndpoints) - sizeof(void*), /* .padding */ + UA_TYPENAME("TransportSettings") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_ReaderGroupDataType, transportSettings) - offsetof(UA_ReaderGroupDataType, groupProperties) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("serverSignature") /* .memberName */ - UA_TYPES_SIGNATUREDATA, /* .memberTypeIndex */ - offsetof(UA_CreateSessionResponse, serverSignature) - offsetof(UA_CreateSessionResponse, serverSoftwareCertificates) - sizeof(void*), /* .padding */ + UA_TYPENAME("MessageSettings") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_ReaderGroupDataType, messageSettings) - offsetof(UA_ReaderGroupDataType, transportSettings) - sizeof(UA_ExtensionObject), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxRequestMessageSize") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_CreateSessionResponse, maxRequestMessageSize) - offsetof(UA_CreateSessionResponse, serverSignature) - sizeof(UA_SignatureData), /* .padding */ + UA_TYPENAME("DataSetReaders") /* .memberName */ + UA_TYPES_DATASETREADERDATATYPE, /* .memberTypeIndex */ + offsetof(UA_ReaderGroupDataType, dataSetReadersSize) - offsetof(UA_ReaderGroupDataType, messageSettings) - sizeof(UA_ExtensionObject), /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ -}}; + true /* .isArray */ +},}; -/* QueryFirstRequest */ -static UA_DataTypeMember QueryFirstRequest_members[6] = { +/* PubSubConnectionDataType */ +static UA_DataTypeMember PubSubConnectionDataType_members[9] = { { - UA_TYPENAME("requestHeader") /* .memberName */ - UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ + UA_TYPENAME("Name") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("view") /* .memberName */ - UA_TYPES_VIEWDESCRIPTION, /* .memberTypeIndex */ - offsetof(UA_QueryFirstRequest, view) - offsetof(UA_QueryFirstRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ + UA_TYPENAME("Enabled") /* .memberName */ + UA_TYPES_BOOLEAN, /* .memberTypeIndex */ + offsetof(UA_PubSubConnectionDataType, enabled) - offsetof(UA_PubSubConnectionDataType, name) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("nodeTypes") /* .memberName */ - UA_TYPES_NODETYPEDESCRIPTION, /* .memberTypeIndex */ - offsetof(UA_QueryFirstRequest, nodeTypesSize) - offsetof(UA_QueryFirstRequest, view) - sizeof(UA_ViewDescription), /* .padding */ + UA_TYPENAME("PublisherId") /* .memberName */ + UA_TYPES_VARIANT, /* .memberTypeIndex */ + offsetof(UA_PubSubConnectionDataType, publisherId) - offsetof(UA_PubSubConnectionDataType, enabled) - sizeof(UA_Boolean), /* .padding */ true, /* .namespaceZero */ - true /* .isArray */ + false /* .isArray */ }, { - UA_TYPENAME("filter") /* .memberName */ - UA_TYPES_CONTENTFILTER, /* .memberTypeIndex */ - offsetof(UA_QueryFirstRequest, filter) - offsetof(UA_QueryFirstRequest, nodeTypes) - sizeof(void*), /* .padding */ + UA_TYPENAME("TransportProfileUri") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_PubSubConnectionDataType, transportProfileUri) - offsetof(UA_PubSubConnectionDataType, publisherId) - sizeof(UA_Variant), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxDataSetsToReturn") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_QueryFirstRequest, maxDataSetsToReturn) - offsetof(UA_QueryFirstRequest, filter) - sizeof(UA_ContentFilter), /* .padding */ + UA_TYPENAME("Address") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_PubSubConnectionDataType, address) - offsetof(UA_PubSubConnectionDataType, transportProfileUri) - sizeof(UA_String), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxReferencesToReturn") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_QueryFirstRequest, maxReferencesToReturn) - offsetof(UA_QueryFirstRequest, maxDataSetsToReturn) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("ConnectionProperties") /* .memberName */ + UA_TYPES_KEYVALUEPAIR, /* .memberTypeIndex */ + offsetof(UA_PubSubConnectionDataType, connectionPropertiesSize) - offsetof(UA_PubSubConnectionDataType, address) - sizeof(UA_ExtensionObject), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +}, +{ + UA_TYPENAME("TransportSettings") /* .memberName */ + UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ + offsetof(UA_PubSubConnectionDataType, transportSettings) - offsetof(UA_PubSubConnectionDataType, connectionProperties) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +}, +{ + UA_TYPENAME("WriterGroups") /* .memberName */ + UA_TYPES_WRITERGROUPDATATYPE, /* .memberTypeIndex */ + offsetof(UA_PubSubConnectionDataType, writerGroupsSize) - offsetof(UA_PubSubConnectionDataType, transportSettings) - sizeof(UA_ExtensionObject), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +}, +{ + UA_TYPENAME("ReaderGroups") /* .memberName */ + UA_TYPES_READERGROUPDATATYPE, /* .memberTypeIndex */ + offsetof(UA_PubSubConnectionDataType, readerGroupsSize) - offsetof(UA_PubSubConnectionDataType, writerGroups) - sizeof(void*), /* .padding */ + true, /* .namespaceZero */ + true /* .isArray */ +},}; const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { /* Boolean */ { @@ -13902,10 +16228,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {1}}, /* .typeId */ sizeof(UA_Boolean), /* .memSize */ UA_TYPES_BOOLEAN, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_BOOLEAN, /* .typeKind */ true, /* .pointerFree */ true, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ Boolean_members /* .members */ }, @@ -13915,10 +16241,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {2}}, /* .typeId */ sizeof(UA_SByte), /* .memSize */ UA_TYPES_SBYTE, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_SBYTE, /* .typeKind */ true, /* .pointerFree */ true, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ SByte_members /* .members */ }, @@ -13928,10 +16254,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {3}}, /* .typeId */ sizeof(UA_Byte), /* .memSize */ UA_TYPES_BYTE, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_BYTE, /* .typeKind */ true, /* .pointerFree */ true, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ Byte_members /* .members */ }, @@ -13941,10 +16267,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {4}}, /* .typeId */ sizeof(UA_Int16), /* .memSize */ UA_TYPES_INT16, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_INT16, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ Int16_members /* .members */ }, @@ -13954,10 +16280,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {5}}, /* .typeId */ sizeof(UA_UInt16), /* .memSize */ UA_TYPES_UINT16, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_UINT16, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ UInt16_members /* .members */ }, @@ -13967,10 +16293,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {6}}, /* .typeId */ sizeof(UA_Int32), /* .memSize */ UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_INT32, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ Int32_members /* .members */ }, @@ -13980,10 +16306,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {7}}, /* .typeId */ sizeof(UA_UInt32), /* .memSize */ UA_TYPES_UINT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_UINT32, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ UInt32_members /* .members */ }, @@ -13993,10 +16319,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {8}}, /* .typeId */ sizeof(UA_Int64), /* .memSize */ UA_TYPES_INT64, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_INT64, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ Int64_members /* .members */ }, @@ -14006,10 +16332,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {9}}, /* .typeId */ sizeof(UA_UInt64), /* .memSize */ UA_TYPES_UINT64, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_UINT64, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ UInt64_members /* .members */ }, @@ -14019,10 +16345,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {10}}, /* .typeId */ sizeof(UA_Float), /* .memSize */ UA_TYPES_FLOAT, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_FLOAT, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_FLOAT, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ Float_members /* .members */ }, @@ -14032,10 +16358,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {11}}, /* .typeId */ sizeof(UA_Double), /* .memSize */ UA_TYPES_DOUBLE, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_DOUBLE, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_FLOAT, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ Double_members /* .members */ }, @@ -14045,10 +16371,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {12}}, /* .typeId */ sizeof(UA_String), /* .memSize */ UA_TYPES_STRING, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_STRING, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ String_members /* .members */ }, @@ -14058,10 +16384,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {13}}, /* .typeId */ sizeof(UA_DateTime), /* .memSize */ UA_TYPES_DATETIME, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_DATETIME, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ DateTime_members /* .members */ }, @@ -14071,10 +16397,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {14}}, /* .typeId */ sizeof(UA_Guid), /* .memSize */ UA_TYPES_GUID, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_GUID, /* .typeKind */ true, /* .pointerFree */ (UA_BINARY_OVERLAYABLE_INTEGER && offsetof(UA_Guid, data2) == sizeof(UA_UInt32) && offsetof(UA_Guid, data3) == (sizeof(UA_UInt16) + sizeof(UA_UInt32)) && offsetof(UA_Guid, data4) == (2*sizeof(UA_UInt32))), /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ Guid_members /* .members */ }, @@ -14084,10 +16410,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {15}}, /* .typeId */ sizeof(UA_ByteString), /* .memSize */ UA_TYPES_BYTESTRING, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_BYTESTRING, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ ByteString_members /* .members */ }, @@ -14097,10 +16423,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {16}}, /* .typeId */ sizeof(UA_XmlElement), /* .memSize */ UA_TYPES_XMLELEMENT, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_XMLELEMENT, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ XmlElement_members /* .members */ }, @@ -14110,10 +16436,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {17}}, /* .typeId */ sizeof(UA_NodeId), /* .memSize */ UA_TYPES_NODEID, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_NODEID, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ NodeId_members /* .members */ }, @@ -14123,10 +16449,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {18}}, /* .typeId */ sizeof(UA_ExpandedNodeId), /* .memSize */ UA_TYPES_EXPANDEDNODEID, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_EXPANDEDNODEID, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ ExpandedNodeId_members /* .members */ }, @@ -14136,10 +16462,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {19}}, /* .typeId */ sizeof(UA_StatusCode), /* .memSize */ UA_TYPES_STATUSCODE, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_STATUSCODE, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ StatusCode_members /* .members */ }, @@ -14149,10 +16475,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {20}}, /* .typeId */ sizeof(UA_QualifiedName), /* .memSize */ UA_TYPES_QUALIFIEDNAME, /* .typeIndex */ - 2, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_QUALIFIEDNAME, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ QualifiedName_members /* .members */ }, @@ -14162,10 +16488,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {21}}, /* .typeId */ sizeof(UA_LocalizedText), /* .memSize */ UA_TYPES_LOCALIZEDTEXT, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_LOCALIZEDTEXT, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ LocalizedText_members /* .members */ }, @@ -14175,10 +16501,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {22}}, /* .typeId */ sizeof(UA_ExtensionObject), /* .memSize */ UA_TYPES_EXTENSIONOBJECT, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_EXTENSIONOBJECT, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ ExtensionObject_members /* .members */ }, @@ -14188,10 +16514,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {23}}, /* .typeId */ sizeof(UA_DataValue), /* .memSize */ UA_TYPES_DATAVALUE, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_DATAVALUE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ DataValue_members /* .members */ }, @@ -14201,10 +16527,10 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {24}}, /* .typeId */ sizeof(UA_Variant), /* .memSize */ UA_TYPES_VARIANT, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_VARIANT, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ Variant_members /* .members */ }, @@ -14214,984 +16540,931 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {25}}, /* .typeId */ sizeof(UA_DiagnosticInfo), /* .memSize */ UA_TYPES_DIAGNOSTICINFO, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_DIAGNOSTICINFO, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ DiagnosticInfo_members /* .members */ }, -/* SignedSoftwareCertificate */ +/* KeyValuePair */ { - UA_TYPENAME("SignedSoftwareCertificate") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {344}}, /* .typeId */ - sizeof(UA_SignedSoftwareCertificate), /* .memSize */ - UA_TYPES_SIGNEDSOFTWARECERTIFICATE, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("KeyValuePair") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {14533}}, /* .typeId */ + sizeof(UA_KeyValuePair), /* .memSize */ + UA_TYPES_KEYVALUEPAIR, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 346, /* .binaryEncodingId */ - SignedSoftwareCertificate_members /* .members */ + 2, /* .membersSize */ + 14846, /* .binaryEncodingId */ + KeyValuePair_members /* .members */ }, -/* SemanticChangeStructureDataType */ +/* SimpleTypeDescription */ { - UA_TYPENAME("SemanticChangeStructureDataType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {897}}, /* .typeId */ - sizeof(UA_SemanticChangeStructureDataType), /* .memSize */ - UA_TYPES_SEMANTICCHANGESTRUCTUREDATATYPE, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("SimpleTypeDescription") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15005}}, /* .typeId */ + sizeof(UA_SimpleTypeDescription), /* .memSize */ + UA_TYPES_SIMPLETYPEDESCRIPTION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 899, /* .binaryEncodingId */ - SemanticChangeStructureDataType_members /* .members */ + 4, /* .membersSize */ + 15421, /* .binaryEncodingId */ + SimpleTypeDescription_members /* .members */ }, -/* StatusChangeNotification */ +/* PubSubState */ { - UA_TYPENAME("StatusChangeNotification") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {818}}, /* .typeId */ - sizeof(UA_StatusChangeNotification), /* .memSize */ - UA_TYPES_STATUSCHANGENOTIFICATION, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 820, /* .binaryEncodingId */ - StatusChangeNotification_members /* .members */ + UA_TYPENAME("PubSubState") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {14647}}, /* .typeId */ + sizeof(UA_PubSubState), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + PubSubState_members /* .members */ }, -/* BrowsePathTarget */ +/* DataSetFieldFlags */ { - UA_TYPENAME("BrowsePathTarget") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {546}}, /* .typeId */ - sizeof(UA_BrowsePathTarget), /* .memSize */ - UA_TYPES_BROWSEPATHTARGET, /* .typeIndex */ + UA_TYPENAME("DataSetFieldFlags") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15904}}, /* .typeId */ + sizeof(UA_DataSetFieldFlags), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + DataSetFieldFlags_members /* .members */ +}, +/* ConfigurationVersionDataType */ +{ + UA_TYPENAME("ConfigurationVersionDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {14593}}, /* .typeId */ + sizeof(UA_ConfigurationVersionDataType), /* .memSize */ + UA_TYPES_CONFIGURATIONVERSIONDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + true, /* .pointerFree */ + true + && UA_BINARY_OVERLAYABLE_INTEGER + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ConfigurationVersionDataType, minorVersion) == (offsetof(UA_ConfigurationVersionDataType, majorVersion) + sizeof(UA_UInt32)), /* .overlayable */ 2, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 548, /* .binaryEncodingId */ - BrowsePathTarget_members /* .members */ + 14847, /* .binaryEncodingId */ + ConfigurationVersionDataType_members /* .members */ }, -/* ViewAttributes */ +/* PublishedVariableDataType */ { - UA_TYPENAME("ViewAttributes") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {373}}, /* .typeId */ - sizeof(UA_ViewAttributes), /* .memSize */ - UA_TYPES_VIEWATTRIBUTES, /* .typeIndex */ - 7, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("PublishedVariableDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {14273}}, /* .typeId */ + sizeof(UA_PublishedVariableDataType), /* .memSize */ + UA_TYPES_PUBLISHEDVARIABLEDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 375, /* .binaryEncodingId */ - ViewAttributes_members /* .members */ + 8, /* .membersSize */ + 14323, /* .binaryEncodingId */ + PublishedVariableDataType_members /* .members */ }, -/* RequestHeader */ +/* DataSetFieldContentMask */ { - UA_TYPENAME("RequestHeader") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {389}}, /* .typeId */ - sizeof(UA_RequestHeader), /* .memSize */ - UA_TYPES_REQUESTHEADER, /* .typeIndex */ - 7, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("DataSetFieldContentMask") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15583}}, /* .typeId */ + sizeof(UA_DataSetFieldContentMask), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + DataSetFieldContentMask_members /* .members */ +}, +/* DataSetWriterDataType */ +{ + UA_TYPENAME("DataSetWriterDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15597}}, /* .typeId */ + sizeof(UA_DataSetWriterDataType), /* .memSize */ + UA_TYPES_DATASETWRITERDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 391, /* .binaryEncodingId */ - RequestHeader_members /* .members */ + 9, /* .membersSize */ + 15682, /* .binaryEncodingId */ + DataSetWriterDataType_members /* .members */ }, -/* MonitoredItemModifyResult */ +/* NetworkAddressUrlDataType */ { - UA_TYPENAME("MonitoredItemModifyResult") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {758}}, /* .typeId */ - sizeof(UA_MonitoredItemModifyResult), /* .memSize */ - UA_TYPES_MONITOREDITEMMODIFYRESULT, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("NetworkAddressUrlDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15510}}, /* .typeId */ + sizeof(UA_NetworkAddressUrlDataType), /* .memSize */ + UA_TYPES_NETWORKADDRESSURLDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 760, /* .binaryEncodingId */ - MonitoredItemModifyResult_members /* .members */ + 2, /* .membersSize */ + 21152, /* .binaryEncodingId */ + NetworkAddressUrlDataType_members /* .members */ }, -/* ElementOperand */ +/* OverrideValueHandling */ { - UA_TYPENAME("ElementOperand") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {592}}, /* .typeId */ - sizeof(UA_ElementOperand), /* .memSize */ - UA_TYPES_ELEMENTOPERAND, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("OverrideValueHandling") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15874}}, /* .typeId */ + sizeof(UA_OverrideValueHandling), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ true, /* .pointerFree */ - true - && UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ - 594, /* .binaryEncodingId */ - ElementOperand_members /* .members */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + OverrideValueHandling_members /* .members */ }, -/* CloseSecureChannelRequest */ +/* DataSetOrderingType */ { - UA_TYPENAME("CloseSecureChannelRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {450}}, /* .typeId */ - sizeof(UA_CloseSecureChannelRequest), /* .memSize */ - UA_TYPES_CLOSESECURECHANNELREQUEST, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 452, /* .binaryEncodingId */ - CloseSecureChannelRequest_members /* .members */ + UA_TYPENAME("DataSetOrderingType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {20408}}, /* .typeId */ + sizeof(UA_DataSetOrderingType), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + DataSetOrderingType_members /* .members */ }, -/* AddNodesResult */ +/* UadpNetworkMessageContentMask */ { - UA_TYPENAME("AddNodesResult") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {483}}, /* .typeId */ - sizeof(UA_AddNodesResult), /* .memSize */ - UA_TYPES_ADDNODESRESULT, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 485, /* .binaryEncodingId */ - AddNodesResult_members /* .members */ + UA_TYPENAME("UadpNetworkMessageContentMask") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15642}}, /* .typeId */ + sizeof(UA_UadpNetworkMessageContentMask), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + UadpNetworkMessageContentMask_members /* .members */ }, -/* VariableAttributes */ +/* UadpWriterGroupMessageDataType */ { - UA_TYPENAME("VariableAttributes") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {355}}, /* .typeId */ - sizeof(UA_VariableAttributes), /* .memSize */ - UA_TYPES_VARIABLEATTRIBUTES, /* .typeIndex */ - 13, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("UadpWriterGroupMessageDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15645}}, /* .typeId */ + sizeof(UA_UadpWriterGroupMessageDataType), /* .memSize */ + UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 357, /* .binaryEncodingId */ - VariableAttributes_members /* .members */ + 5, /* .membersSize */ + 15715, /* .binaryEncodingId */ + UadpWriterGroupMessageDataType_members /* .members */ }, -/* NotificationMessage */ +/* UadpDataSetMessageContentMask */ { - UA_TYPENAME("NotificationMessage") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {803}}, /* .typeId */ - sizeof(UA_NotificationMessage), /* .memSize */ - UA_TYPES_NOTIFICATIONMESSAGE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 805, /* .binaryEncodingId */ - NotificationMessage_members /* .members */ + UA_TYPENAME("UadpDataSetMessageContentMask") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15646}}, /* .typeId */ + sizeof(UA_UadpDataSetMessageContentMask), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + UadpDataSetMessageContentMask_members /* .members */ }, -/* FindServersOnNetworkRequest */ +/* UadpDataSetWriterMessageDataType */ { - UA_TYPENAME("FindServersOnNetworkRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {12190}}, /* .typeId */ - sizeof(UA_FindServersOnNetworkRequest), /* .memSize */ - UA_TYPES_FINDSERVERSONNETWORKREQUEST, /* .typeIndex */ + UA_TYPENAME("UadpDataSetWriterMessageDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15652}}, /* .typeId */ + sizeof(UA_UadpDataSetWriterMessageDataType), /* .memSize */ + UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + true, /* .pointerFree */ + true + && UA_BINARY_OVERLAYABLE_INTEGER + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_UadpDataSetWriterMessageDataType, configuredSize) == (offsetof(UA_UadpDataSetWriterMessageDataType, dataSetMessageContentMask) + sizeof(UA_UadpDataSetMessageContentMask)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_UadpDataSetWriterMessageDataType, networkMessageNumber) == (offsetof(UA_UadpDataSetWriterMessageDataType, configuredSize) + sizeof(UA_UInt16)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_UadpDataSetWriterMessageDataType, dataSetOffset) == (offsetof(UA_UadpDataSetWriterMessageDataType, networkMessageNumber) + sizeof(UA_UInt16)), /* .overlayable */ 4, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 12208, /* .binaryEncodingId */ - FindServersOnNetworkRequest_members /* .members */ + 15717, /* .binaryEncodingId */ + UadpDataSetWriterMessageDataType_members /* .members */ }, -/* EventFieldList */ +/* UadpDataSetReaderMessageDataType */ { - UA_TYPENAME("EventFieldList") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {917}}, /* .typeId */ - sizeof(UA_EventFieldList), /* .memSize */ - UA_TYPES_EVENTFIELDLIST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 919, /* .binaryEncodingId */ - EventFieldList_members /* .members */ + UA_TYPENAME("UadpDataSetReaderMessageDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15653}}, /* .typeId */ + sizeof(UA_UadpDataSetReaderMessageDataType), /* .memSize */ + UA_TYPES_UADPDATASETREADERMESSAGEDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + true, /* .pointerFree */ + true + && UA_BINARY_OVERLAYABLE_INTEGER + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_UadpDataSetReaderMessageDataType, networkMessageNumber) == (offsetof(UA_UadpDataSetReaderMessageDataType, groupVersion) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_UadpDataSetReaderMessageDataType, dataSetOffset) == (offsetof(UA_UadpDataSetReaderMessageDataType, networkMessageNumber) + sizeof(UA_UInt16)) + && (UA_BINARY_OVERLAYABLE_INTEGER && offsetof(UA_Guid, data2) == sizeof(UA_UInt32) && offsetof(UA_Guid, data3) == (sizeof(UA_UInt16) + sizeof(UA_UInt32)) && offsetof(UA_Guid, data4) == (2*sizeof(UA_UInt32))) + && offsetof(UA_UadpDataSetReaderMessageDataType, dataSetClassId) == (offsetof(UA_UadpDataSetReaderMessageDataType, dataSetOffset) + sizeof(UA_UInt16)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_UadpDataSetReaderMessageDataType, networkMessageContentMask) == (offsetof(UA_UadpDataSetReaderMessageDataType, dataSetClassId) + sizeof(UA_Guid)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_UadpDataSetReaderMessageDataType, dataSetMessageContentMask) == (offsetof(UA_UadpDataSetReaderMessageDataType, networkMessageContentMask) + sizeof(UA_UadpNetworkMessageContentMask)) + && UA_BINARY_OVERLAYABLE_FLOAT + && offsetof(UA_UadpDataSetReaderMessageDataType, publishingInterval) == (offsetof(UA_UadpDataSetReaderMessageDataType, dataSetMessageContentMask) + sizeof(UA_UadpDataSetMessageContentMask)) + && UA_BINARY_OVERLAYABLE_FLOAT + && offsetof(UA_UadpDataSetReaderMessageDataType, receiveOffset) == (offsetof(UA_UadpDataSetReaderMessageDataType, publishingInterval) + sizeof(UA_Double)) + && UA_BINARY_OVERLAYABLE_FLOAT + && offsetof(UA_UadpDataSetReaderMessageDataType, processingOffset) == (offsetof(UA_UadpDataSetReaderMessageDataType, receiveOffset) + sizeof(UA_Double)), /* .overlayable */ + 9, /* .membersSize */ + 15718, /* .binaryEncodingId */ + UadpDataSetReaderMessageDataType_members /* .members */ }, -/* MonitoringMode */ +/* JsonNetworkMessageContentMask */ { - UA_TYPENAME("MonitoringMode") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {716}}, /* .typeId */ - sizeof(UA_MonitoringMode), /* .memSize */ + UA_TYPENAME("JsonNetworkMessageContentMask") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15654}}, /* .typeId */ + sizeof(UA_JsonNetworkMessageContentMask), /* .memSize */ UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ - MonitoringMode_members /* .members */ -}, -/* MdnsDiscoveryConfiguration */ -{ - UA_TYPENAME("MdnsDiscoveryConfiguration") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {12891}}, /* .typeId */ - sizeof(UA_MdnsDiscoveryConfiguration), /* .memSize */ - UA_TYPES_MDNSDISCOVERYCONFIGURATION, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 12901, /* .binaryEncodingId */ - MdnsDiscoveryConfiguration_members /* .members */ + JsonNetworkMessageContentMask_members /* .members */ }, -/* CallMethodResult */ +/* JsonDataSetMessageContentMask */ { - UA_TYPENAME("CallMethodResult") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {707}}, /* .typeId */ - sizeof(UA_CallMethodResult), /* .memSize */ - UA_TYPES_CALLMETHODRESULT, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 709, /* .binaryEncodingId */ - CallMethodResult_members /* .members */ + UA_TYPENAME("JsonDataSetMessageContentMask") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15658}}, /* .typeId */ + sizeof(UA_JsonDataSetMessageContentMask), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + JsonDataSetMessageContentMask_members /* .members */ }, -/* ParsingResult */ +/* JsonDataSetWriterMessageDataType */ { - UA_TYPENAME("ParsingResult") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {610}}, /* .typeId */ - sizeof(UA_ParsingResult), /* .memSize */ - UA_TYPES_PARSINGRESULT, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 612, /* .binaryEncodingId */ - ParsingResult_members /* .members */ + UA_TYPENAME("JsonDataSetWriterMessageDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15664}}, /* .typeId */ + sizeof(UA_JsonDataSetWriterMessageDataType), /* .memSize */ + UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + true, /* .pointerFree */ + true + && UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 1, /* .membersSize */ + 15724, /* .binaryEncodingId */ + JsonDataSetWriterMessageDataType_members /* .members */ }, -/* RelativePathElement */ +/* BrokerConnectionTransportDataType */ { - UA_TYPENAME("RelativePathElement") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {537}}, /* .typeId */ - sizeof(UA_RelativePathElement), /* .memSize */ - UA_TYPES_RELATIVEPATHELEMENT, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("BrokerConnectionTransportDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15007}}, /* .typeId */ + sizeof(UA_BrokerConnectionTransportDataType), /* .memSize */ + UA_TYPES_BROKERCONNECTIONTRANSPORTDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 539, /* .binaryEncodingId */ - RelativePathElement_members /* .members */ + 2, /* .membersSize */ + 15479, /* .binaryEncodingId */ + BrokerConnectionTransportDataType_members /* .members */ }, -/* BrowseDirection */ +/* BrokerTransportQualityOfService */ { - UA_TYPENAME("BrowseDirection") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {510}}, /* .typeId */ - sizeof(UA_BrowseDirection), /* .memSize */ + UA_TYPENAME("BrokerTransportQualityOfService") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15008}}, /* .typeId */ + sizeof(UA_BrokerTransportQualityOfService), /* .memSize */ UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ - BrowseDirection_members /* .members */ + BrokerTransportQualityOfService_members /* .members */ }, -/* CallMethodRequest */ +/* BrokerWriterGroupTransportDataType */ { - UA_TYPENAME("CallMethodRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {704}}, /* .typeId */ - sizeof(UA_CallMethodRequest), /* .memSize */ - UA_TYPES_CALLMETHODREQUEST, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("BrokerWriterGroupTransportDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15667}}, /* .typeId */ + sizeof(UA_BrokerWriterGroupTransportDataType), /* .memSize */ + UA_TYPES_BROKERWRITERGROUPTRANSPORTDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 706, /* .binaryEncodingId */ - CallMethodRequest_members /* .members */ + 4, /* .membersSize */ + 15727, /* .binaryEncodingId */ + BrokerWriterGroupTransportDataType_members /* .members */ }, -/* RedundancySupport */ +/* BrokerDataSetWriterTransportDataType */ { - UA_TYPENAME("RedundancySupport") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {851}}, /* .typeId */ - sizeof(UA_RedundancySupport), /* .memSize */ + UA_TYPENAME("BrokerDataSetWriterTransportDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15669}}, /* .typeId */ + sizeof(UA_BrokerDataSetWriterTransportDataType), /* .memSize */ + UA_TYPES_BROKERDATASETWRITERTRANSPORTDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 6, /* .membersSize */ + 15729, /* .binaryEncodingId */ + BrokerDataSetWriterTransportDataType_members /* .members */ +}, +/* NodeClass */ +{ + UA_TYPENAME("NodeClass") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {257}}, /* .typeId */ + sizeof(UA_NodeClass), /* .memSize */ UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ - RedundancySupport_members /* .members */ + NodeClass_members /* .members */ }, -/* EventNotificationList */ +/* StructureType */ { - UA_TYPENAME("EventNotificationList") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {914}}, /* .typeId */ - sizeof(UA_EventNotificationList), /* .memSize */ - UA_TYPES_EVENTNOTIFICATIONLIST, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 916, /* .binaryEncodingId */ - EventNotificationList_members /* .members */ + UA_TYPENAME("StructureType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {98}}, /* .typeId */ + sizeof(UA_StructureType), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + StructureType_members /* .members */ }, -/* UnregisterNodesRequest */ +/* StructureField */ { - UA_TYPENAME("UnregisterNodesRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {564}}, /* .typeId */ - sizeof(UA_UnregisterNodesRequest), /* .memSize */ - UA_TYPES_UNREGISTERNODESREQUEST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("StructureField") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {101}}, /* .typeId */ + sizeof(UA_StructureField), /* .memSize */ + UA_TYPES_STRUCTUREFIELD, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 566, /* .binaryEncodingId */ - UnregisterNodesRequest_members /* .members */ + 7, /* .membersSize */ + 14844, /* .binaryEncodingId */ + StructureField_members /* .members */ }, -/* ContentFilterElementResult */ +/* StructureDefinition */ { - UA_TYPENAME("ContentFilterElementResult") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {604}}, /* .typeId */ - sizeof(UA_ContentFilterElementResult), /* .memSize */ - UA_TYPES_CONTENTFILTERELEMENTRESULT, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("StructureDefinition") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {99}}, /* .typeId */ + sizeof(UA_StructureDefinition), /* .memSize */ + UA_TYPES_STRUCTUREDEFINITION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 606, /* .binaryEncodingId */ - ContentFilterElementResult_members /* .members */ + 4, /* .membersSize */ + 122, /* .binaryEncodingId */ + StructureDefinition_members /* .members */ }, -/* SimpleAttributeOperand */ +/* Argument */ { - UA_TYPENAME("SimpleAttributeOperand") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {601}}, /* .typeId */ - sizeof(UA_SimpleAttributeOperand), /* .memSize */ - UA_TYPES_SIMPLEATTRIBUTEOPERAND, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("Argument") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {296}}, /* .typeId */ + sizeof(UA_Argument), /* .memSize */ + UA_TYPES_ARGUMENT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 603, /* .binaryEncodingId */ - SimpleAttributeOperand_members /* .members */ + 5, /* .membersSize */ + 298, /* .binaryEncodingId */ + Argument_members /* .members */ }, -/* LiteralOperand */ +/* EnumValueType */ { - UA_TYPENAME("LiteralOperand") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {595}}, /* .typeId */ - sizeof(UA_LiteralOperand), /* .memSize */ - UA_TYPES_LITERALOPERAND, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("EnumValueType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {7594}}, /* .typeId */ + sizeof(UA_EnumValueType), /* .memSize */ + UA_TYPES_ENUMVALUETYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 597, /* .binaryEncodingId */ - LiteralOperand_members /* .members */ + 3, /* .membersSize */ + 8251, /* .binaryEncodingId */ + EnumValueType_members /* .members */ }, -/* QueryDataSet */ +/* EnumField */ { - UA_TYPENAME("QueryDataSet") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {577}}, /* .typeId */ - sizeof(UA_QueryDataSet), /* .memSize */ - UA_TYPES_QUERYDATASET, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("EnumField") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {102}}, /* .typeId */ + sizeof(UA_EnumField), /* .memSize */ + UA_TYPES_ENUMFIELD, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 579, /* .binaryEncodingId */ - QueryDataSet_members /* .members */ + 4, /* .membersSize */ + 14845, /* .binaryEncodingId */ + EnumField_members /* .members */ }, -/* AnonymousIdentityToken */ +/* Duration */ { - UA_TYPENAME("AnonymousIdentityToken") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {319}}, /* .typeId */ - sizeof(UA_AnonymousIdentityToken), /* .memSize */ - UA_TYPES_ANONYMOUSIDENTITYTOKEN, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("Duration") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {290}}, /* .typeId */ + sizeof(UA_Duration), /* .memSize */ + UA_TYPES_DURATION, /* .typeIndex */ + UA_DATATYPEKIND_DOUBLE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 321, /* .binaryEncodingId */ - AnonymousIdentityToken_members /* .members */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + Duration_members /* .members */ }, -/* SetPublishingModeRequest */ +/* UtcTime */ { - UA_TYPENAME("SetPublishingModeRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {797}}, /* .typeId */ - sizeof(UA_SetPublishingModeRequest), /* .memSize */ - UA_TYPES_SETPUBLISHINGMODEREQUEST, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("UtcTime") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {294}}, /* .typeId */ + sizeof(UA_UtcTime), /* .memSize */ + UA_TYPES_UTCTIME, /* .typeIndex */ + UA_DATATYPEKIND_DATETIME, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 799, /* .binaryEncodingId */ - SetPublishingModeRequest_members /* .members */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + UtcTime_members /* .members */ }, -/* MonitoredItemCreateResult */ +/* LocaleId */ { - UA_TYPENAME("MonitoredItemCreateResult") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {746}}, /* .typeId */ - sizeof(UA_MonitoredItemCreateResult), /* .memSize */ - UA_TYPES_MONITOREDITEMCREATERESULT, /* .typeIndex */ - 5, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("LocaleId") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {295}}, /* .typeId */ + sizeof(UA_LocaleId), /* .memSize */ + UA_TYPES_LOCALEID, /* .typeIndex */ + UA_DATATYPEKIND_STRING, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 748, /* .binaryEncodingId */ - MonitoredItemCreateResult_members /* .members */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + LocaleId_members /* .members */ }, -/* TimestampsToReturn */ +/* ApplicationType */ { - UA_TYPENAME("TimestampsToReturn") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {625}}, /* .typeId */ - sizeof(UA_TimestampsToReturn), /* .memSize */ + UA_TYPENAME("ApplicationType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {307}}, /* .typeId */ + sizeof(UA_ApplicationType), /* .memSize */ UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ - TimestampsToReturn_members /* .members */ + ApplicationType_members /* .members */ }, -/* CallRequest */ +/* ApplicationDescription */ { - UA_TYPENAME("CallRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {710}}, /* .typeId */ - sizeof(UA_CallRequest), /* .memSize */ - UA_TYPES_CALLREQUEST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ApplicationDescription") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {308}}, /* .typeId */ + sizeof(UA_ApplicationDescription), /* .memSize */ + UA_TYPES_APPLICATIONDESCRIPTION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 712, /* .binaryEncodingId */ - CallRequest_members /* .members */ + 7, /* .membersSize */ + 310, /* .binaryEncodingId */ + ApplicationDescription_members /* .members */ }, -/* MethodAttributes */ +/* RequestHeader */ { - UA_TYPENAME("MethodAttributes") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {358}}, /* .typeId */ - sizeof(UA_MethodAttributes), /* .memSize */ - UA_TYPES_METHODATTRIBUTES, /* .typeIndex */ - 7, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("RequestHeader") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {389}}, /* .typeId */ + sizeof(UA_RequestHeader), /* .memSize */ + UA_TYPES_REQUESTHEADER, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 360, /* .binaryEncodingId */ - MethodAttributes_members /* .members */ + 7, /* .membersSize */ + 391, /* .binaryEncodingId */ + RequestHeader_members /* .members */ }, -/* DeleteReferencesItem */ +/* ResponseHeader */ { - UA_TYPENAME("DeleteReferencesItem") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {385}}, /* .typeId */ - sizeof(UA_DeleteReferencesItem), /* .memSize */ - UA_TYPES_DELETEREFERENCESITEM, /* .typeIndex */ - 5, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ResponseHeader") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {392}}, /* .typeId */ + sizeof(UA_ResponseHeader), /* .memSize */ + UA_TYPES_RESPONSEHEADER, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 387, /* .binaryEncodingId */ - DeleteReferencesItem_members /* .members */ + 6, /* .membersSize */ + 394, /* .binaryEncodingId */ + ResponseHeader_members /* .members */ }, -/* WriteValue */ +/* ServiceFault */ { - UA_TYPENAME("WriteValue") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {668}}, /* .typeId */ - sizeof(UA_WriteValue), /* .memSize */ - UA_TYPES_WRITEVALUE, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ServiceFault") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {395}}, /* .typeId */ + sizeof(UA_ServiceFault), /* .memSize */ + UA_TYPES_SERVICEFAULT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 670, /* .binaryEncodingId */ - WriteValue_members /* .members */ -}, -/* NodeAttributesMask */ -{ - UA_TYPENAME("NodeAttributesMask") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {348}}, /* .typeId */ - sizeof(UA_NodeAttributesMask), /* .memSize */ - UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ - true, /* .pointerFree */ - UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ - 0, /* .binaryEncodingId */ - NodeAttributesMask_members /* .members */ -}, -/* MessageSecurityMode */ -{ - UA_TYPENAME("MessageSecurityMode") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {302}}, /* .typeId */ - sizeof(UA_MessageSecurityMode), /* .memSize */ - UA_TYPES_INT32, /* .typeIndex */ 1, /* .membersSize */ - true, /* .builtin */ - true, /* .pointerFree */ - UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ - 0, /* .binaryEncodingId */ - MessageSecurityMode_members /* .members */ + 397, /* .binaryEncodingId */ + ServiceFault_members /* .members */ }, -/* MonitoringParameters */ +/* FindServersRequest */ { - UA_TYPENAME("MonitoringParameters") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {740}}, /* .typeId */ - sizeof(UA_MonitoringParameters), /* .memSize */ - UA_TYPES_MONITORINGPARAMETERS, /* .typeIndex */ - 5, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("FindServersRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {420}}, /* .typeId */ + sizeof(UA_FindServersRequest), /* .memSize */ + UA_TYPES_FINDSERVERSREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 742, /* .binaryEncodingId */ - MonitoringParameters_members /* .members */ + 4, /* .membersSize */ + 422, /* .binaryEncodingId */ + FindServersRequest_members /* .members */ }, -/* ReferenceNode */ +/* FindServersResponse */ { - UA_TYPENAME("ReferenceNode") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {285}}, /* .typeId */ - sizeof(UA_ReferenceNode), /* .memSize */ - UA_TYPES_REFERENCENODE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("FindServersResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {423}}, /* .typeId */ + sizeof(UA_FindServersResponse), /* .memSize */ + UA_TYPES_FINDSERVERSRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 287, /* .binaryEncodingId */ - ReferenceNode_members /* .members */ + 2, /* .membersSize */ + 425, /* .binaryEncodingId */ + FindServersResponse_members /* .members */ }, -/* Argument */ +/* ServerOnNetwork */ { - UA_TYPENAME("Argument") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {296}}, /* .typeId */ - sizeof(UA_Argument), /* .memSize */ - UA_TYPES_ARGUMENT, /* .typeIndex */ - 5, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ServerOnNetwork") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {12189}}, /* .typeId */ + sizeof(UA_ServerOnNetwork), /* .memSize */ + UA_TYPES_SERVERONNETWORK, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 298, /* .binaryEncodingId */ - Argument_members /* .members */ -}, -/* ChannelSecurityToken */ -{ - UA_TYPENAME("ChannelSecurityToken") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {441}}, /* .typeId */ - sizeof(UA_ChannelSecurityToken), /* .memSize */ - UA_TYPES_CHANNELSECURITYTOKEN, /* .typeIndex */ 4, /* .membersSize */ - false, /* .builtin */ - true, /* .pointerFree */ - true - && UA_BINARY_OVERLAYABLE_INTEGER - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ChannelSecurityToken, tokenId) == (offsetof(UA_ChannelSecurityToken, channelId) + sizeof(UA_UInt32)) - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ChannelSecurityToken, createdAt) == (offsetof(UA_ChannelSecurityToken, tokenId) + sizeof(UA_UInt32)) - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ChannelSecurityToken, revisedLifetime) == (offsetof(UA_ChannelSecurityToken, createdAt) + sizeof(UA_DateTime)), /* .overlayable */ - 443, /* .binaryEncodingId */ - ChannelSecurityToken_members /* .members */ -}, -/* UserIdentityToken */ -{ - UA_TYPENAME("UserIdentityToken") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {316}}, /* .typeId */ - sizeof(UA_UserIdentityToken), /* .memSize */ - UA_TYPES_USERIDENTITYTOKEN, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 318, /* .binaryEncodingId */ - UserIdentityToken_members /* .members */ + 12207, /* .binaryEncodingId */ + ServerOnNetwork_members /* .members */ }, -/* SignatureData */ +/* FindServersOnNetworkRequest */ { - UA_TYPENAME("SignatureData") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {456}}, /* .typeId */ - sizeof(UA_SignatureData), /* .memSize */ - UA_TYPES_SIGNATUREDATA, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("FindServersOnNetworkRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {12190}}, /* .typeId */ + sizeof(UA_FindServersOnNetworkRequest), /* .memSize */ + UA_TYPES_FINDSERVERSONNETWORKREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 458, /* .binaryEncodingId */ - SignatureData_members /* .members */ + 4, /* .membersSize */ + 12208, /* .binaryEncodingId */ + FindServersOnNetworkRequest_members /* .members */ }, -/* ObjectTypeAttributes */ +/* FindServersOnNetworkResponse */ { - UA_TYPENAME("ObjectTypeAttributes") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {361}}, /* .typeId */ - sizeof(UA_ObjectTypeAttributes), /* .memSize */ - UA_TYPES_OBJECTTYPEATTRIBUTES, /* .typeIndex */ - 6, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("FindServersOnNetworkResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {12191}}, /* .typeId */ + sizeof(UA_FindServersOnNetworkResponse), /* .memSize */ + UA_TYPES_FINDSERVERSONNETWORKRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 363, /* .binaryEncodingId */ - ObjectTypeAttributes_members /* .members */ + 3, /* .membersSize */ + 12209, /* .binaryEncodingId */ + FindServersOnNetworkResponse_members /* .members */ }, -/* DeadbandType */ +/* MessageSecurityMode */ { - UA_TYPENAME("DeadbandType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {718}}, /* .typeId */ - sizeof(UA_DeadbandType), /* .memSize */ + UA_TYPENAME("MessageSecurityMode") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {302}}, /* .typeId */ + sizeof(UA_MessageSecurityMode), /* .memSize */ UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ - DeadbandType_members /* .members */ + MessageSecurityMode_members /* .members */ }, -/* SecurityTokenRequestType */ +/* UserTokenType */ { - UA_TYPENAME("SecurityTokenRequestType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {315}}, /* .typeId */ - sizeof(UA_SecurityTokenRequestType), /* .memSize */ + UA_TYPENAME("UserTokenType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {303}}, /* .typeId */ + sizeof(UA_UserTokenType), /* .memSize */ UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ - SecurityTokenRequestType_members /* .members */ + UserTokenType_members /* .members */ }, -/* NodeAttributes */ +/* UserTokenPolicy */ { - UA_TYPENAME("NodeAttributes") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {349}}, /* .typeId */ - sizeof(UA_NodeAttributes), /* .memSize */ - UA_TYPES_NODEATTRIBUTES, /* .typeIndex */ + UA_TYPENAME("UserTokenPolicy") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {304}}, /* .typeId */ + sizeof(UA_UserTokenPolicy), /* .memSize */ + UA_TYPES_USERTOKENPOLICY, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ 5, /* .membersSize */ - false, /* .builtin */ + 306, /* .binaryEncodingId */ + UserTokenPolicy_members /* .members */ +}, +/* EndpointDescription */ +{ + UA_TYPENAME("EndpointDescription") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {312}}, /* .typeId */ + sizeof(UA_EndpointDescription), /* .memSize */ + UA_TYPES_ENDPOINTDESCRIPTION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 351, /* .binaryEncodingId */ - NodeAttributes_members /* .members */ + 8, /* .membersSize */ + 314, /* .binaryEncodingId */ + EndpointDescription_members /* .members */ }, -/* DataChangeTrigger */ +/* GetEndpointsRequest */ { - UA_TYPENAME("DataChangeTrigger") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {717}}, /* .typeId */ - sizeof(UA_DataChangeTrigger), /* .memSize */ - UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ - true, /* .pointerFree */ - UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ - 0, /* .binaryEncodingId */ - DataChangeTrigger_members /* .members */ + UA_TYPENAME("GetEndpointsRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {426}}, /* .typeId */ + sizeof(UA_GetEndpointsRequest), /* .memSize */ + UA_TYPES_GETENDPOINTSREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 4, /* .membersSize */ + 428, /* .binaryEncodingId */ + GetEndpointsRequest_members /* .members */ }, -/* BuildInfo */ +/* GetEndpointsResponse */ { - UA_TYPENAME("BuildInfo") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {338}}, /* .typeId */ - sizeof(UA_BuildInfo), /* .memSize */ - UA_TYPES_BUILDINFO, /* .typeIndex */ - 6, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("GetEndpointsResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {429}}, /* .typeId */ + sizeof(UA_GetEndpointsResponse), /* .memSize */ + UA_TYPES_GETENDPOINTSRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 340, /* .binaryEncodingId */ - BuildInfo_members /* .members */ + 2, /* .membersSize */ + 431, /* .binaryEncodingId */ + GetEndpointsResponse_members /* .members */ }, -/* NodeClass */ +/* RegisteredServer */ { - UA_TYPENAME("NodeClass") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {257}}, /* .typeId */ - sizeof(UA_NodeClass), /* .memSize */ - UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ - true, /* .pointerFree */ - UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ - 0, /* .binaryEncodingId */ - NodeClass_members /* .members */ + UA_TYPENAME("RegisteredServer") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {432}}, /* .typeId */ + sizeof(UA_RegisteredServer), /* .memSize */ + UA_TYPES_REGISTEREDSERVER, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 8, /* .membersSize */ + 434, /* .binaryEncodingId */ + RegisteredServer_members /* .members */ }, -/* SubscriptionDiagnosticsDataType */ +/* RegisterServerRequest */ { - UA_TYPENAME("SubscriptionDiagnosticsDataType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {874}}, /* .typeId */ - sizeof(UA_SubscriptionDiagnosticsDataType), /* .memSize */ - UA_TYPES_SUBSCRIPTIONDIAGNOSTICSDATATYPE, /* .typeIndex */ - 31, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("RegisterServerRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {435}}, /* .typeId */ + sizeof(UA_RegisterServerRequest), /* .memSize */ + UA_TYPES_REGISTERSERVERREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 876, /* .binaryEncodingId */ - SubscriptionDiagnosticsDataType_members /* .members */ + 2, /* .membersSize */ + 437, /* .binaryEncodingId */ + RegisterServerRequest_members /* .members */ }, -/* FilterOperand */ +/* RegisterServerResponse */ { - UA_TYPENAME("FilterOperand") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {589}}, /* .typeId */ - sizeof(UA_FilterOperand), /* .memSize */ - UA_TYPES_FILTEROPERAND, /* .typeIndex */ - 0, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("RegisterServerResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {438}}, /* .typeId */ + sizeof(UA_RegisterServerResponse), /* .memSize */ + UA_TYPES_REGISTERSERVERRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 1, /* .membersSize */ + 440, /* .binaryEncodingId */ + RegisterServerResponse_members /* .members */ +}, +/* DiscoveryConfiguration */ +{ + UA_TYPENAME("DiscoveryConfiguration") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {12890}}, /* .typeId */ + sizeof(UA_DiscoveryConfiguration), /* .memSize */ + UA_TYPES_DISCOVERYCONFIGURATION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ true, /* .pointerFree */ true, /* .overlayable */ - 591, /* .binaryEncodingId */ - FilterOperand_members /* .members */ + 0, /* .membersSize */ + 12900, /* .binaryEncodingId */ + DiscoveryConfiguration_members /* .members */ }, -/* MonitoredItemNotification */ +/* MdnsDiscoveryConfiguration */ { - UA_TYPENAME("MonitoredItemNotification") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {806}}, /* .typeId */ - sizeof(UA_MonitoredItemNotification), /* .memSize */ - UA_TYPES_MONITOREDITEMNOTIFICATION, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("MdnsDiscoveryConfiguration") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {12891}}, /* .typeId */ + sizeof(UA_MdnsDiscoveryConfiguration), /* .memSize */ + UA_TYPES_MDNSDISCOVERYCONFIGURATION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 808, /* .binaryEncodingId */ - MonitoredItemNotification_members /* .members */ + 2, /* .membersSize */ + 12901, /* .binaryEncodingId */ + MdnsDiscoveryConfiguration_members /* .members */ }, -/* DeleteNodesItem */ +/* RegisterServer2Request */ { - UA_TYPENAME("DeleteNodesItem") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {382}}, /* .typeId */ - sizeof(UA_DeleteNodesItem), /* .memSize */ - UA_TYPES_DELETENODESITEM, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("RegisterServer2Request") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {12193}}, /* .typeId */ + sizeof(UA_RegisterServer2Request), /* .memSize */ + UA_TYPES_REGISTERSERVER2REQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 384, /* .binaryEncodingId */ - DeleteNodesItem_members /* .members */ + 3, /* .membersSize */ + 12211, /* .binaryEncodingId */ + RegisterServer2Request_members /* .members */ }, -/* DeleteSubscriptionsRequest */ +/* RegisterServer2Response */ { - UA_TYPENAME("DeleteSubscriptionsRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {845}}, /* .typeId */ - sizeof(UA_DeleteSubscriptionsRequest), /* .memSize */ - UA_TYPES_DELETESUBSCRIPTIONSREQUEST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("RegisterServer2Response") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {12194}}, /* .typeId */ + sizeof(UA_RegisterServer2Response), /* .memSize */ + UA_TYPES_REGISTERSERVER2RESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 847, /* .binaryEncodingId */ - DeleteSubscriptionsRequest_members /* .members */ + 3, /* .membersSize */ + 12212, /* .binaryEncodingId */ + RegisterServer2Response_members /* .members */ }, -/* SubscriptionAcknowledgement */ +/* SecurityTokenRequestType */ { - UA_TYPENAME("SubscriptionAcknowledgement") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {821}}, /* .typeId */ - sizeof(UA_SubscriptionAcknowledgement), /* .memSize */ - UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("SecurityTokenRequestType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {315}}, /* .typeId */ + sizeof(UA_SecurityTokenRequestType), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + SecurityTokenRequestType_members /* .members */ +}, +/* ChannelSecurityToken */ +{ + UA_TYPENAME("ChannelSecurityToken") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {441}}, /* .typeId */ + sizeof(UA_ChannelSecurityToken), /* .memSize */ + UA_TYPES_CHANNELSECURITYTOKEN, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ true, /* .pointerFree */ true && UA_BINARY_OVERLAYABLE_INTEGER && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_SubscriptionAcknowledgement, sequenceNumber) == (offsetof(UA_SubscriptionAcknowledgement, subscriptionId) + sizeof(UA_UInt32)), /* .overlayable */ - 823, /* .binaryEncodingId */ - SubscriptionAcknowledgement_members /* .members */ + && offsetof(UA_ChannelSecurityToken, tokenId) == (offsetof(UA_ChannelSecurityToken, channelId) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ChannelSecurityToken, createdAt) == (offsetof(UA_ChannelSecurityToken, tokenId) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ChannelSecurityToken, revisedLifetime) == (offsetof(UA_ChannelSecurityToken, createdAt) + sizeof(UA_DateTime)), /* .overlayable */ + 4, /* .membersSize */ + 443, /* .binaryEncodingId */ + ChannelSecurityToken_members /* .members */ }, -/* ReadValueId */ +/* OpenSecureChannelRequest */ { - UA_TYPENAME("ReadValueId") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {626}}, /* .typeId */ - sizeof(UA_ReadValueId), /* .memSize */ - UA_TYPES_READVALUEID, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("OpenSecureChannelRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {444}}, /* .typeId */ + sizeof(UA_OpenSecureChannelRequest), /* .memSize */ + UA_TYPES_OPENSECURECHANNELREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 628, /* .binaryEncodingId */ - ReadValueId_members /* .members */ + 6, /* .membersSize */ + 446, /* .binaryEncodingId */ + OpenSecureChannelRequest_members /* .members */ }, -/* DataTypeAttributes */ +/* OpenSecureChannelResponse */ { - UA_TYPENAME("DataTypeAttributes") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {370}}, /* .typeId */ - sizeof(UA_DataTypeAttributes), /* .memSize */ - UA_TYPES_DATATYPEATTRIBUTES, /* .typeIndex */ - 6, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("OpenSecureChannelResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {447}}, /* .typeId */ + sizeof(UA_OpenSecureChannelResponse), /* .memSize */ + UA_TYPES_OPENSECURECHANNELRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 372, /* .binaryEncodingId */ - DataTypeAttributes_members /* .members */ + 4, /* .membersSize */ + 449, /* .binaryEncodingId */ + OpenSecureChannelResponse_members /* .members */ }, -/* ResponseHeader */ +/* CloseSecureChannelRequest */ { - UA_TYPENAME("ResponseHeader") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {392}}, /* .typeId */ - sizeof(UA_ResponseHeader), /* .memSize */ - UA_TYPES_RESPONSEHEADER, /* .typeIndex */ - 6, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("CloseSecureChannelRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {450}}, /* .typeId */ + sizeof(UA_CloseSecureChannelRequest), /* .memSize */ + UA_TYPES_CLOSESECURECHANNELREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 394, /* .binaryEncodingId */ - ResponseHeader_members /* .members */ + 1, /* .membersSize */ + 452, /* .binaryEncodingId */ + CloseSecureChannelRequest_members /* .members */ }, -/* DeleteMonitoredItemsRequest */ +/* CloseSecureChannelResponse */ { - UA_TYPENAME("DeleteMonitoredItemsRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {779}}, /* .typeId */ - sizeof(UA_DeleteMonitoredItemsRequest), /* .memSize */ - UA_TYPES_DELETEMONITOREDITEMSREQUEST, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("CloseSecureChannelResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {453}}, /* .typeId */ + sizeof(UA_CloseSecureChannelResponse), /* .memSize */ + UA_TYPES_CLOSESECURECHANNELRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 781, /* .binaryEncodingId */ - DeleteMonitoredItemsRequest_members /* .members */ + 1, /* .membersSize */ + 455, /* .binaryEncodingId */ + CloseSecureChannelResponse_members /* .members */ }, -/* ViewDescription */ +/* SignedSoftwareCertificate */ { - UA_TYPENAME("ViewDescription") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {511}}, /* .typeId */ - sizeof(UA_ViewDescription), /* .memSize */ - UA_TYPES_VIEWDESCRIPTION, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("SignedSoftwareCertificate") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {344}}, /* .typeId */ + sizeof(UA_SignedSoftwareCertificate), /* .memSize */ + UA_TYPES_SIGNEDSOFTWARECERTIFICATE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 513, /* .binaryEncodingId */ - ViewDescription_members /* .members */ + 2, /* .membersSize */ + 346, /* .binaryEncodingId */ + SignedSoftwareCertificate_members /* .members */ }, -/* ServerOnNetwork */ +/* SignatureData */ { - UA_TYPENAME("ServerOnNetwork") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {12189}}, /* .typeId */ - sizeof(UA_ServerOnNetwork), /* .memSize */ - UA_TYPES_SERVERONNETWORK, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("SignatureData") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {456}}, /* .typeId */ + sizeof(UA_SignatureData), /* .memSize */ + UA_TYPES_SIGNATUREDATA, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 12207, /* .binaryEncodingId */ - ServerOnNetwork_members /* .members */ + 2, /* .membersSize */ + 458, /* .binaryEncodingId */ + SignatureData_members /* .members */ }, -/* DeleteMonitoredItemsResponse */ +/* CreateSessionRequest */ { - UA_TYPENAME("DeleteMonitoredItemsResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {782}}, /* .typeId */ - sizeof(UA_DeleteMonitoredItemsResponse), /* .memSize */ - UA_TYPES_DELETEMONITOREDITEMSRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("CreateSessionRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {459}}, /* .typeId */ + sizeof(UA_CreateSessionRequest), /* .memSize */ + UA_TYPES_CREATESESSIONREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 784, /* .binaryEncodingId */ - DeleteMonitoredItemsResponse_members /* .members */ + 9, /* .membersSize */ + 461, /* .binaryEncodingId */ + CreateSessionRequest_members /* .members */ }, -/* FindServersOnNetworkResponse */ +/* CreateSessionResponse */ { - UA_TYPENAME("FindServersOnNetworkResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {12191}}, /* .typeId */ - sizeof(UA_FindServersOnNetworkResponse), /* .memSize */ - UA_TYPES_FINDSERVERSONNETWORKRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("CreateSessionResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {462}}, /* .typeId */ + sizeof(UA_CreateSessionResponse), /* .memSize */ + UA_TYPES_CREATESESSIONRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 12209, /* .binaryEncodingId */ - FindServersOnNetworkResponse_members /* .members */ + 10, /* .membersSize */ + 464, /* .binaryEncodingId */ + CreateSessionResponse_members /* .members */ }, -/* RelativePath */ +/* UserIdentityToken */ { - UA_TYPENAME("RelativePath") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {540}}, /* .typeId */ - sizeof(UA_RelativePath), /* .memSize */ - UA_TYPES_RELATIVEPATH, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("UserIdentityToken") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {316}}, /* .typeId */ + sizeof(UA_UserIdentityToken), /* .memSize */ + UA_TYPES_USERIDENTITYTOKEN, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 542, /* .binaryEncodingId */ - RelativePath_members /* .members */ + 1, /* .membersSize */ + 318, /* .binaryEncodingId */ + UserIdentityToken_members /* .members */ }, -/* RegisterNodesRequest */ +/* AnonymousIdentityToken */ { - UA_TYPENAME("RegisterNodesRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {558}}, /* .typeId */ - sizeof(UA_RegisterNodesRequest), /* .memSize */ - UA_TYPES_REGISTERNODESREQUEST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 560, /* .binaryEncodingId */ - RegisterNodesRequest_members /* .members */ -}, -/* AggregateConfiguration */ -{ - UA_TYPENAME("AggregateConfiguration") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {948}}, /* .typeId */ - sizeof(UA_AggregateConfiguration), /* .memSize */ - UA_TYPES_AGGREGATECONFIGURATION, /* .typeIndex */ - 5, /* .membersSize */ - false, /* .builtin */ - true, /* .pointerFree */ - true - && true - && true - && offsetof(UA_AggregateConfiguration, treatUncertainAsBad) == (offsetof(UA_AggregateConfiguration, useServerCapabilitiesDefaults) + sizeof(UA_Boolean)) - && true - && offsetof(UA_AggregateConfiguration, percentDataBad) == (offsetof(UA_AggregateConfiguration, treatUncertainAsBad) + sizeof(UA_Boolean)) - && true - && offsetof(UA_AggregateConfiguration, percentDataGood) == (offsetof(UA_AggregateConfiguration, percentDataBad) + sizeof(UA_Byte)) - && true - && offsetof(UA_AggregateConfiguration, useSlopedExtrapolation) == (offsetof(UA_AggregateConfiguration, percentDataGood) + sizeof(UA_Byte)), /* .overlayable */ - 950, /* .binaryEncodingId */ - AggregateConfiguration_members /* .members */ -}, -/* DeleteNodesRequest */ -{ - UA_TYPENAME("DeleteNodesRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {498}}, /* .typeId */ - sizeof(UA_DeleteNodesRequest), /* .memSize */ - UA_TYPES_DELETENODESREQUEST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 500, /* .binaryEncodingId */ - DeleteNodesRequest_members /* .members */ -}, -/* PublishResponse */ -{ - UA_TYPENAME("PublishResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {827}}, /* .typeId */ - sizeof(UA_PublishResponse), /* .memSize */ - UA_TYPES_PUBLISHRESPONSE, /* .typeIndex */ - 7, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 829, /* .binaryEncodingId */ - PublishResponse_members /* .members */ -}, -/* MonitoredItemModifyRequest */ -{ - UA_TYPENAME("MonitoredItemModifyRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {755}}, /* .typeId */ - sizeof(UA_MonitoredItemModifyRequest), /* .memSize */ - UA_TYPES_MONITOREDITEMMODIFYREQUEST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 757, /* .binaryEncodingId */ - MonitoredItemModifyRequest_members /* .members */ -}, -/* ServiceCounterDataType */ -{ - UA_TYPENAME("ServiceCounterDataType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {871}}, /* .typeId */ - sizeof(UA_ServiceCounterDataType), /* .memSize */ - UA_TYPES_SERVICECOUNTERDATATYPE, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ - true, /* .pointerFree */ - true - && UA_BINARY_OVERLAYABLE_INTEGER - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ServiceCounterDataType, errorCount) == (offsetof(UA_ServiceCounterDataType, totalCount) + sizeof(UA_UInt32)), /* .overlayable */ - 873, /* .binaryEncodingId */ - ServiceCounterDataType_members /* .members */ -}, -/* ModelChangeStructureDataType */ -{ - UA_TYPENAME("ModelChangeStructureDataType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {877}}, /* .typeId */ - sizeof(UA_ModelChangeStructureDataType), /* .memSize */ - UA_TYPES_MODELCHANGESTRUCTUREDATATYPE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("AnonymousIdentityToken") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {319}}, /* .typeId */ + sizeof(UA_AnonymousIdentityToken), /* .memSize */ + UA_TYPES_ANONYMOUSIDENTITYTOKEN, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 879, /* .binaryEncodingId */ - ModelChangeStructureDataType_members /* .members */ + 1, /* .membersSize */ + 321, /* .binaryEncodingId */ + AnonymousIdentityToken_members /* .members */ }, /* UserNameIdentityToken */ { @@ -15199,67 +17472,38 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {322}}, /* .typeId */ sizeof(UA_UserNameIdentityToken), /* .memSize */ UA_TYPES_USERNAMEIDENTITYTOKEN, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 4, /* .membersSize */ 324, /* .binaryEncodingId */ UserNameIdentityToken_members /* .members */ }, -/* IdType */ -{ - UA_TYPENAME("IdType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {256}}, /* .typeId */ - sizeof(UA_IdType), /* .memSize */ - UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ - true, /* .pointerFree */ - UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ - 0, /* .binaryEncodingId */ - IdType_members /* .members */ -}, -/* UserTokenType */ -{ - UA_TYPENAME("UserTokenType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {303}}, /* .typeId */ - sizeof(UA_UserTokenType), /* .memSize */ - UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ - true, /* .pointerFree */ - UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ - 0, /* .binaryEncodingId */ - UserTokenType_members /* .members */ -}, -/* SetTriggeringResponse */ +/* X509IdentityToken */ { - UA_TYPENAME("SetTriggeringResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {776}}, /* .typeId */ - sizeof(UA_SetTriggeringResponse), /* .memSize */ - UA_TYPES_SETTRIGGERINGRESPONSE, /* .typeIndex */ - 5, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("X509IdentityToken") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {325}}, /* .typeId */ + sizeof(UA_X509IdentityToken), /* .memSize */ + UA_TYPES_X509IDENTITYTOKEN, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 778, /* .binaryEncodingId */ - SetTriggeringResponse_members /* .members */ + 2, /* .membersSize */ + 327, /* .binaryEncodingId */ + X509IdentityToken_members /* .members */ }, -/* TimeZoneDataType */ +/* IssuedIdentityToken */ { - UA_TYPENAME("TimeZoneDataType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {8912}}, /* .typeId */ - sizeof(UA_TimeZoneDataType), /* .memSize */ - UA_TYPES_TIMEZONEDATATYPE, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ - true, /* .pointerFree */ - true - && UA_BINARY_OVERLAYABLE_INTEGER - && true - && offsetof(UA_TimeZoneDataType, daylightSavingInOffset) == (offsetof(UA_TimeZoneDataType, offset) + sizeof(UA_Int16)), /* .overlayable */ - 8917, /* .binaryEncodingId */ - TimeZoneDataType_members /* .members */ + UA_TYPENAME("IssuedIdentityToken") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {938}}, /* .typeId */ + sizeof(UA_IssuedIdentityToken), /* .memSize */ + UA_TYPES_ISSUEDIDENTITYTOKEN, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 3, /* .membersSize */ + 940, /* .binaryEncodingId */ + IssuedIdentityToken_members /* .members */ }, /* ActivateSessionRequest */ { @@ -15267,168 +17511,129 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {465}}, /* .typeId */ sizeof(UA_ActivateSessionRequest), /* .memSize */ UA_TYPES_ACTIVATESESSIONREQUEST, /* .typeIndex */ - 6, /* .membersSize */ - false, /* .builtin */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 6, /* .membersSize */ 467, /* .binaryEncodingId */ ActivateSessionRequest_members /* .members */ }, -/* OpenSecureChannelResponse */ -{ - UA_TYPENAME("OpenSecureChannelResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {447}}, /* .typeId */ - sizeof(UA_OpenSecureChannelResponse), /* .memSize */ - UA_TYPES_OPENSECURECHANNELRESPONSE, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 449, /* .binaryEncodingId */ - OpenSecureChannelResponse_members /* .members */ -}, -/* ApplicationType */ -{ - UA_TYPENAME("ApplicationType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {307}}, /* .typeId */ - sizeof(UA_ApplicationType), /* .memSize */ - UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ - true, /* .pointerFree */ - UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ - 0, /* .binaryEncodingId */ - ApplicationType_members /* .members */ -}, -/* ServerState */ -{ - UA_TYPENAME("ServerState") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {852}}, /* .typeId */ - sizeof(UA_ServerState), /* .memSize */ - UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ - true, /* .pointerFree */ - UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ - 0, /* .binaryEncodingId */ - ServerState_members /* .members */ -}, -/* QueryNextResponse */ -{ - UA_TYPENAME("QueryNextResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {622}}, /* .typeId */ - sizeof(UA_QueryNextResponse), /* .memSize */ - UA_TYPES_QUERYNEXTRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 624, /* .binaryEncodingId */ - QueryNextResponse_members /* .members */ -}, -/* DiscoveryConfiguration */ -{ - UA_TYPENAME("DiscoveryConfiguration") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {12890}}, /* .typeId */ - sizeof(UA_DiscoveryConfiguration), /* .memSize */ - UA_TYPES_DISCOVERYCONFIGURATION, /* .typeIndex */ - 0, /* .membersSize */ - false, /* .builtin */ - true, /* .pointerFree */ - true, /* .overlayable */ - 12900, /* .binaryEncodingId */ - DiscoveryConfiguration_members /* .members */ -}, /* ActivateSessionResponse */ { UA_TYPENAME("ActivateSessionResponse") /* .typeName */ {0, UA_NODEIDTYPE_NUMERIC, {468}}, /* .typeId */ sizeof(UA_ActivateSessionResponse), /* .memSize */ UA_TYPES_ACTIVATESESSIONRESPONSE, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 4, /* .membersSize */ 470, /* .binaryEncodingId */ ActivateSessionResponse_members /* .members */ }, -/* EndpointUrlListDataType */ +/* CloseSessionRequest */ { - UA_TYPENAME("EndpointUrlListDataType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {11943}}, /* .typeId */ - sizeof(UA_EndpointUrlListDataType), /* .memSize */ - UA_TYPES_ENDPOINTURLLISTDATATYPE, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("CloseSessionRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {471}}, /* .typeId */ + sizeof(UA_CloseSessionRequest), /* .memSize */ + UA_TYPES_CLOSESESSIONREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 11957, /* .binaryEncodingId */ - EndpointUrlListDataType_members /* .members */ + 2, /* .membersSize */ + 473, /* .binaryEncodingId */ + CloseSessionRequest_members /* .members */ }, -/* FilterOperator */ +/* CloseSessionResponse */ { - UA_TYPENAME("FilterOperator") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {576}}, /* .typeId */ - sizeof(UA_FilterOperator), /* .memSize */ - UA_TYPES_INT32, /* .typeIndex */ + UA_TYPENAME("CloseSessionResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {474}}, /* .typeId */ + sizeof(UA_CloseSessionResponse), /* .memSize */ + UA_TYPES_CLOSESESSIONRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ 1, /* .membersSize */ - true, /* .builtin */ + 476, /* .binaryEncodingId */ + CloseSessionResponse_members /* .members */ +}, +/* NodeAttributesMask */ +{ + UA_TYPENAME("NodeAttributesMask") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {348}}, /* .typeId */ + sizeof(UA_NodeAttributesMask), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ - FilterOperator_members /* .members */ + NodeAttributesMask_members /* .members */ }, -/* QueryNextRequest */ +/* NodeAttributes */ { - UA_TYPENAME("QueryNextRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {619}}, /* .typeId */ - sizeof(UA_QueryNextRequest), /* .memSize */ - UA_TYPES_QUERYNEXTREQUEST, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("NodeAttributes") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {349}}, /* .typeId */ + sizeof(UA_NodeAttributes), /* .memSize */ + UA_TYPES_NODEATTRIBUTES, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 621, /* .binaryEncodingId */ - QueryNextRequest_members /* .members */ + 5, /* .membersSize */ + 351, /* .binaryEncodingId */ + NodeAttributes_members /* .members */ }, -/* WriteResponse */ +/* ObjectAttributes */ { - UA_TYPENAME("WriteResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {674}}, /* .typeId */ - sizeof(UA_WriteResponse), /* .memSize */ - UA_TYPES_WRITERESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ObjectAttributes") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {352}}, /* .typeId */ + sizeof(UA_ObjectAttributes), /* .memSize */ + UA_TYPES_OBJECTATTRIBUTES, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 676, /* .binaryEncodingId */ - WriteResponse_members /* .members */ + 6, /* .membersSize */ + 354, /* .binaryEncodingId */ + ObjectAttributes_members /* .members */ }, -/* BrowseNextRequest */ +/* VariableAttributes */ { - UA_TYPENAME("BrowseNextRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {531}}, /* .typeId */ - sizeof(UA_BrowseNextRequest), /* .memSize */ - UA_TYPES_BROWSENEXTREQUEST, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("VariableAttributes") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {355}}, /* .typeId */ + sizeof(UA_VariableAttributes), /* .memSize */ + UA_TYPES_VARIABLEATTRIBUTES, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 533, /* .binaryEncodingId */ - BrowseNextRequest_members /* .members */ + 13, /* .membersSize */ + 357, /* .binaryEncodingId */ + VariableAttributes_members /* .members */ }, -/* CreateSubscriptionRequest */ +/* MethodAttributes */ { - UA_TYPENAME("CreateSubscriptionRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {785}}, /* .typeId */ - sizeof(UA_CreateSubscriptionRequest), /* .memSize */ - UA_TYPES_CREATESUBSCRIPTIONREQUEST, /* .typeIndex */ + UA_TYPENAME("MethodAttributes") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {358}}, /* .typeId */ + sizeof(UA_MethodAttributes), /* .memSize */ + UA_TYPES_METHODATTRIBUTES, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ 7, /* .membersSize */ - false, /* .builtin */ + 360, /* .binaryEncodingId */ + MethodAttributes_members /* .members */ +}, +/* ObjectTypeAttributes */ +{ + UA_TYPENAME("ObjectTypeAttributes") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {361}}, /* .typeId */ + sizeof(UA_ObjectTypeAttributes), /* .memSize */ + UA_TYPES_OBJECTTYPEATTRIBUTES, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 787, /* .binaryEncodingId */ - CreateSubscriptionRequest_members /* .members */ + 6, /* .membersSize */ + 363, /* .binaryEncodingId */ + ObjectTypeAttributes_members /* .members */ }, /* VariableTypeAttributes */ { @@ -15436,243 +17641,246 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {364}}, /* .typeId */ sizeof(UA_VariableTypeAttributes), /* .memSize */ UA_TYPES_VARIABLETYPEATTRIBUTES, /* .typeIndex */ - 10, /* .membersSize */ - false, /* .builtin */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 10, /* .membersSize */ 366, /* .binaryEncodingId */ VariableTypeAttributes_members /* .members */ }, -/* BrowsePathResult */ +/* ReferenceTypeAttributes */ { - UA_TYPENAME("BrowsePathResult") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {549}}, /* .typeId */ - sizeof(UA_BrowsePathResult), /* .memSize */ - UA_TYPES_BROWSEPATHRESULT, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ReferenceTypeAttributes") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {367}}, /* .typeId */ + sizeof(UA_ReferenceTypeAttributes), /* .memSize */ + UA_TYPES_REFERENCETYPEATTRIBUTES, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 551, /* .binaryEncodingId */ - BrowsePathResult_members /* .members */ + 8, /* .membersSize */ + 369, /* .binaryEncodingId */ + ReferenceTypeAttributes_members /* .members */ }, -/* ModifySubscriptionResponse */ +/* DataTypeAttributes */ { - UA_TYPENAME("ModifySubscriptionResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {794}}, /* .typeId */ - sizeof(UA_ModifySubscriptionResponse), /* .memSize */ - UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("DataTypeAttributes") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {370}}, /* .typeId */ + sizeof(UA_DataTypeAttributes), /* .memSize */ + UA_TYPES_DATATYPEATTRIBUTES, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 796, /* .binaryEncodingId */ - ModifySubscriptionResponse_members /* .members */ + 6, /* .membersSize */ + 372, /* .binaryEncodingId */ + DataTypeAttributes_members /* .members */ }, -/* RedundantServerDataType */ +/* ViewAttributes */ { - UA_TYPENAME("RedundantServerDataType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {853}}, /* .typeId */ - sizeof(UA_RedundantServerDataType), /* .memSize */ - UA_TYPES_REDUNDANTSERVERDATATYPE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ViewAttributes") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {373}}, /* .typeId */ + sizeof(UA_ViewAttributes), /* .memSize */ + UA_TYPES_VIEWATTRIBUTES, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 855, /* .binaryEncodingId */ - RedundantServerDataType_members /* .members */ + 7, /* .membersSize */ + 375, /* .binaryEncodingId */ + ViewAttributes_members /* .members */ }, -/* RegisterNodesResponse */ +/* AddNodesItem */ { - UA_TYPENAME("RegisterNodesResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {561}}, /* .typeId */ - sizeof(UA_RegisterNodesResponse), /* .memSize */ - UA_TYPES_REGISTERNODESRESPONSE, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("AddNodesItem") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {376}}, /* .typeId */ + sizeof(UA_AddNodesItem), /* .memSize */ + UA_TYPES_ADDNODESITEM, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 563, /* .binaryEncodingId */ - RegisterNodesResponse_members /* .members */ + 7, /* .membersSize */ + 378, /* .binaryEncodingId */ + AddNodesItem_members /* .members */ }, -/* CloseSessionRequest */ +/* AddNodesResult */ { - UA_TYPENAME("CloseSessionRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {471}}, /* .typeId */ - sizeof(UA_CloseSessionRequest), /* .memSize */ - UA_TYPES_CLOSESESSIONREQUEST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("AddNodesResult") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {483}}, /* .typeId */ + sizeof(UA_AddNodesResult), /* .memSize */ + UA_TYPES_ADDNODESRESULT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 473, /* .binaryEncodingId */ - CloseSessionRequest_members /* .members */ + 2, /* .membersSize */ + 485, /* .binaryEncodingId */ + AddNodesResult_members /* .members */ }, -/* ModifyMonitoredItemsResponse */ +/* AddNodesRequest */ { - UA_TYPENAME("ModifyMonitoredItemsResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {764}}, /* .typeId */ - sizeof(UA_ModifyMonitoredItemsResponse), /* .memSize */ - UA_TYPES_MODIFYMONITOREDITEMSRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("AddNodesRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {486}}, /* .typeId */ + sizeof(UA_AddNodesRequest), /* .memSize */ + UA_TYPES_ADDNODESREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 766, /* .binaryEncodingId */ - ModifyMonitoredItemsResponse_members /* .members */ + 2, /* .membersSize */ + 488, /* .binaryEncodingId */ + AddNodesRequest_members /* .members */ }, -/* ModifySubscriptionRequest */ +/* AddNodesResponse */ { - UA_TYPENAME("ModifySubscriptionRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {791}}, /* .typeId */ - sizeof(UA_ModifySubscriptionRequest), /* .memSize */ - UA_TYPES_MODIFYSUBSCRIPTIONREQUEST, /* .typeIndex */ - 7, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("AddNodesResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {489}}, /* .typeId */ + sizeof(UA_AddNodesResponse), /* .memSize */ + UA_TYPES_ADDNODESRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 793, /* .binaryEncodingId */ - ModifySubscriptionRequest_members /* .members */ -}, -/* ServerDiagnosticsSummaryDataType */ -{ - UA_TYPENAME("ServerDiagnosticsSummaryDataType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {859}}, /* .typeId */ - sizeof(UA_ServerDiagnosticsSummaryDataType), /* .memSize */ - UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE, /* .typeIndex */ - 12, /* .membersSize */ - false, /* .builtin */ - true, /* .pointerFree */ - true - && UA_BINARY_OVERLAYABLE_INTEGER - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ServerDiagnosticsSummaryDataType, currentSessionCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, serverViewCount) + sizeof(UA_UInt32)) - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSessionCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, currentSessionCount) + sizeof(UA_UInt32)) - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedSessionCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSessionCount) + sizeof(UA_UInt32)) - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedSessionCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedSessionCount) + sizeof(UA_UInt32)) - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ServerDiagnosticsSummaryDataType, sessionTimeoutCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedSessionCount) + sizeof(UA_UInt32)) - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ServerDiagnosticsSummaryDataType, sessionAbortCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, sessionTimeoutCount) + sizeof(UA_UInt32)) - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ServerDiagnosticsSummaryDataType, currentSubscriptionCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, sessionAbortCount) + sizeof(UA_UInt32)) - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSubscriptionCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, currentSubscriptionCount) + sizeof(UA_UInt32)) - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ServerDiagnosticsSummaryDataType, publishingIntervalCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSubscriptionCount) + sizeof(UA_UInt32)) - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedRequestsCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, publishingIntervalCount) + sizeof(UA_UInt32)) - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedRequestsCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedRequestsCount) + sizeof(UA_UInt32)), /* .overlayable */ - 861, /* .binaryEncodingId */ - ServerDiagnosticsSummaryDataType_members /* .members */ + 3, /* .membersSize */ + 491, /* .binaryEncodingId */ + AddNodesResponse_members /* .members */ }, -/* UserTokenPolicy */ +/* AddReferencesItem */ { - UA_TYPENAME("UserTokenPolicy") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {304}}, /* .typeId */ - sizeof(UA_UserTokenPolicy), /* .memSize */ - UA_TYPES_USERTOKENPOLICY, /* .typeIndex */ - 5, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("AddReferencesItem") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {379}}, /* .typeId */ + sizeof(UA_AddReferencesItem), /* .memSize */ + UA_TYPES_ADDREFERENCESITEM, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 306, /* .binaryEncodingId */ - UserTokenPolicy_members /* .members */ + 6, /* .membersSize */ + 381, /* .binaryEncodingId */ + AddReferencesItem_members /* .members */ }, -/* ReferenceTypeAttributes */ +/* AddReferencesRequest */ { - UA_TYPENAME("ReferenceTypeAttributes") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {367}}, /* .typeId */ - sizeof(UA_ReferenceTypeAttributes), /* .memSize */ - UA_TYPES_REFERENCETYPEATTRIBUTES, /* .typeIndex */ - 8, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("AddReferencesRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {492}}, /* .typeId */ + sizeof(UA_AddReferencesRequest), /* .memSize */ + UA_TYPES_ADDREFERENCESREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 369, /* .binaryEncodingId */ - ReferenceTypeAttributes_members /* .members */ + 2, /* .membersSize */ + 494, /* .binaryEncodingId */ + AddReferencesRequest_members /* .members */ }, -/* BrowsePath */ +/* AddReferencesResponse */ { - UA_TYPENAME("BrowsePath") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {543}}, /* .typeId */ - sizeof(UA_BrowsePath), /* .memSize */ - UA_TYPES_BROWSEPATH, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("AddReferencesResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {495}}, /* .typeId */ + sizeof(UA_AddReferencesResponse), /* .memSize */ + UA_TYPES_ADDREFERENCESRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 545, /* .binaryEncodingId */ - BrowsePath_members /* .members */ + 3, /* .membersSize */ + 497, /* .binaryEncodingId */ + AddReferencesResponse_members /* .members */ }, -/* SetMonitoringModeRequest */ +/* DeleteNodesItem */ { - UA_TYPENAME("SetMonitoringModeRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {767}}, /* .typeId */ - sizeof(UA_SetMonitoringModeRequest), /* .memSize */ - UA_TYPES_SETMONITORINGMODEREQUEST, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("DeleteNodesItem") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {382}}, /* .typeId */ + sizeof(UA_DeleteNodesItem), /* .memSize */ + UA_TYPES_DELETENODESITEM, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 769, /* .binaryEncodingId */ - SetMonitoringModeRequest_members /* .members */ + 2, /* .membersSize */ + 384, /* .binaryEncodingId */ + DeleteNodesItem_members /* .members */ }, -/* UnregisterNodesResponse */ +/* DeleteNodesRequest */ { - UA_TYPENAME("UnregisterNodesResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {567}}, /* .typeId */ - sizeof(UA_UnregisterNodesResponse), /* .memSize */ - UA_TYPES_UNREGISTERNODESRESPONSE, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("DeleteNodesRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {498}}, /* .typeId */ + sizeof(UA_DeleteNodesRequest), /* .memSize */ + UA_TYPES_DELETENODESREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 569, /* .binaryEncodingId */ - UnregisterNodesResponse_members /* .members */ + 2, /* .membersSize */ + 500, /* .binaryEncodingId */ + DeleteNodesRequest_members /* .members */ }, -/* WriteRequest */ +/* DeleteNodesResponse */ { - UA_TYPENAME("WriteRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {671}}, /* .typeId */ - sizeof(UA_WriteRequest), /* .memSize */ - UA_TYPES_WRITEREQUEST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("DeleteNodesResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {501}}, /* .typeId */ + sizeof(UA_DeleteNodesResponse), /* .memSize */ + UA_TYPES_DELETENODESRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 673, /* .binaryEncodingId */ - WriteRequest_members /* .members */ + 3, /* .membersSize */ + 503, /* .binaryEncodingId */ + DeleteNodesResponse_members /* .members */ }, -/* ObjectAttributes */ +/* DeleteReferencesItem */ { - UA_TYPENAME("ObjectAttributes") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {352}}, /* .typeId */ - sizeof(UA_ObjectAttributes), /* .memSize */ - UA_TYPES_OBJECTATTRIBUTES, /* .typeIndex */ - 6, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("DeleteReferencesItem") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {385}}, /* .typeId */ + sizeof(UA_DeleteReferencesItem), /* .memSize */ + UA_TYPES_DELETEREFERENCESITEM, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 354, /* .binaryEncodingId */ - ObjectAttributes_members /* .members */ + 5, /* .membersSize */ + 387, /* .binaryEncodingId */ + DeleteReferencesItem_members /* .members */ }, -/* BrowseResultMask */ +/* DeleteReferencesRequest */ { - UA_TYPENAME("BrowseResultMask") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {517}}, /* .typeId */ - sizeof(UA_BrowseResultMask), /* .memSize */ + UA_TYPENAME("DeleteReferencesRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {504}}, /* .typeId */ + sizeof(UA_DeleteReferencesRequest), /* .memSize */ + UA_TYPES_DELETEREFERENCESREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 2, /* .membersSize */ + 506, /* .binaryEncodingId */ + DeleteReferencesRequest_members /* .members */ +}, +/* DeleteReferencesResponse */ +{ + UA_TYPENAME("DeleteReferencesResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {507}}, /* .typeId */ + sizeof(UA_DeleteReferencesResponse), /* .memSize */ + UA_TYPES_DELETEREFERENCESRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 3, /* .membersSize */ + 509, /* .binaryEncodingId */ + DeleteReferencesResponse_members /* .members */ +}, +/* BrowseDirection */ +{ + UA_TYPENAME("BrowseDirection") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {510}}, /* .typeId */ + sizeof(UA_BrowseDirection), /* .memSize */ UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ true, /* .pointerFree */ UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ - BrowseResultMask_members /* .members */ + BrowseDirection_members /* .members */ +}, +/* ViewDescription */ +{ + UA_TYPENAME("ViewDescription") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {511}}, /* .typeId */ + sizeof(UA_ViewDescription), /* .memSize */ + UA_TYPES_VIEWDESCRIPTION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 3, /* .membersSize */ + 513, /* .binaryEncodingId */ + ViewDescription_members /* .members */ }, /* BrowseDescription */ { @@ -15680,389 +17888,403 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {514}}, /* .typeId */ sizeof(UA_BrowseDescription), /* .memSize */ UA_TYPES_BROWSEDESCRIPTION, /* .typeIndex */ - 6, /* .membersSize */ - false, /* .builtin */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 6, /* .membersSize */ 516, /* .binaryEncodingId */ BrowseDescription_members /* .members */ }, -/* SetTriggeringRequest */ +/* BrowseResultMask */ { - UA_TYPENAME("SetTriggeringRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {773}}, /* .typeId */ - sizeof(UA_SetTriggeringRequest), /* .memSize */ - UA_TYPES_SETTRIGGERINGREQUEST, /* .typeIndex */ - 5, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 775, /* .binaryEncodingId */ - SetTriggeringRequest_members /* .members */ + UA_TYPENAME("BrowseResultMask") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {517}}, /* .typeId */ + sizeof(UA_BrowseResultMask), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + BrowseResultMask_members /* .members */ }, -/* SessionSecurityDiagnosticsDataType */ +/* ReferenceDescription */ { - UA_TYPENAME("SessionSecurityDiagnosticsDataType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {868}}, /* .typeId */ - sizeof(UA_SessionSecurityDiagnosticsDataType), /* .memSize */ - UA_TYPES_SESSIONSECURITYDIAGNOSTICSDATATYPE, /* .typeIndex */ - 9, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ReferenceDescription") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {518}}, /* .typeId */ + sizeof(UA_ReferenceDescription), /* .memSize */ + UA_TYPES_REFERENCEDESCRIPTION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 870, /* .binaryEncodingId */ - SessionSecurityDiagnosticsDataType_members /* .members */ + 7, /* .membersSize */ + 520, /* .binaryEncodingId */ + ReferenceDescription_members /* .members */ }, -/* RepublishRequest */ +/* BrowseResult */ { - UA_TYPENAME("RepublishRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {830}}, /* .typeId */ - sizeof(UA_RepublishRequest), /* .memSize */ - UA_TYPES_REPUBLISHREQUEST, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("BrowseResult") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {522}}, /* .typeId */ + sizeof(UA_BrowseResult), /* .memSize */ + UA_TYPES_BROWSERESULT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 832, /* .binaryEncodingId */ - RepublishRequest_members /* .members */ + 3, /* .membersSize */ + 524, /* .binaryEncodingId */ + BrowseResult_members /* .members */ }, -/* GetEndpointsRequest */ +/* BrowseRequest */ { - UA_TYPENAME("GetEndpointsRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {426}}, /* .typeId */ - sizeof(UA_GetEndpointsRequest), /* .memSize */ - UA_TYPES_GETENDPOINTSREQUEST, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("BrowseRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {525}}, /* .typeId */ + sizeof(UA_BrowseRequest), /* .memSize */ + UA_TYPES_BROWSEREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 428, /* .binaryEncodingId */ - GetEndpointsRequest_members /* .members */ + 4, /* .membersSize */ + 527, /* .binaryEncodingId */ + BrowseRequest_members /* .members */ }, -/* PublishRequest */ +/* BrowseResponse */ { - UA_TYPENAME("PublishRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {824}}, /* .typeId */ - sizeof(UA_PublishRequest), /* .memSize */ - UA_TYPES_PUBLISHREQUEST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("BrowseResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {528}}, /* .typeId */ + sizeof(UA_BrowseResponse), /* .memSize */ + UA_TYPES_BROWSERESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 826, /* .binaryEncodingId */ - PublishRequest_members /* .members */ + 3, /* .membersSize */ + 530, /* .binaryEncodingId */ + BrowseResponse_members /* .members */ }, -/* DeleteSubscriptionsResponse */ +/* BrowseNextRequest */ { - UA_TYPENAME("DeleteSubscriptionsResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {848}}, /* .typeId */ - sizeof(UA_DeleteSubscriptionsResponse), /* .memSize */ - UA_TYPES_DELETESUBSCRIPTIONSRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("BrowseNextRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {531}}, /* .typeId */ + sizeof(UA_BrowseNextRequest), /* .memSize */ + UA_TYPES_BROWSENEXTREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 850, /* .binaryEncodingId */ - DeleteSubscriptionsResponse_members /* .members */ + 3, /* .membersSize */ + 533, /* .binaryEncodingId */ + BrowseNextRequest_members /* .members */ }, -/* AddNodesResponse */ +/* BrowseNextResponse */ { - UA_TYPENAME("AddNodesResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {489}}, /* .typeId */ - sizeof(UA_AddNodesResponse), /* .memSize */ - UA_TYPES_ADDNODESRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("BrowseNextResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {534}}, /* .typeId */ + sizeof(UA_BrowseNextResponse), /* .memSize */ + UA_TYPES_BROWSENEXTRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 491, /* .binaryEncodingId */ - AddNodesResponse_members /* .members */ + 3, /* .membersSize */ + 536, /* .binaryEncodingId */ + BrowseNextResponse_members /* .members */ }, -/* DataChangeNotification */ +/* RelativePathElement */ { - UA_TYPENAME("DataChangeNotification") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {809}}, /* .typeId */ - sizeof(UA_DataChangeNotification), /* .memSize */ - UA_TYPES_DATACHANGENOTIFICATION, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("RelativePathElement") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {537}}, /* .typeId */ + sizeof(UA_RelativePathElement), /* .memSize */ + UA_TYPES_RELATIVEPATHELEMENT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 811, /* .binaryEncodingId */ - DataChangeNotification_members /* .members */ + 4, /* .membersSize */ + 539, /* .binaryEncodingId */ + RelativePathElement_members /* .members */ }, -/* CloseSecureChannelResponse */ +/* RelativePath */ { - UA_TYPENAME("CloseSecureChannelResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {453}}, /* .typeId */ - sizeof(UA_CloseSecureChannelResponse), /* .memSize */ - UA_TYPES_CLOSESECURECHANNELRESPONSE, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("RelativePath") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {540}}, /* .typeId */ + sizeof(UA_RelativePath), /* .memSize */ + UA_TYPES_RELATIVEPATH, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 455, /* .binaryEncodingId */ - CloseSecureChannelResponse_members /* .members */ + 1, /* .membersSize */ + 542, /* .binaryEncodingId */ + RelativePath_members /* .members */ }, -/* ModifyMonitoredItemsRequest */ +/* BrowsePath */ { - UA_TYPENAME("ModifyMonitoredItemsRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {761}}, /* .typeId */ - sizeof(UA_ModifyMonitoredItemsRequest), /* .memSize */ - UA_TYPES_MODIFYMONITOREDITEMSREQUEST, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("BrowsePath") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {543}}, /* .typeId */ + sizeof(UA_BrowsePath), /* .memSize */ + UA_TYPES_BROWSEPATH, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 763, /* .binaryEncodingId */ - ModifyMonitoredItemsRequest_members /* .members */ + 2, /* .membersSize */ + 545, /* .binaryEncodingId */ + BrowsePath_members /* .members */ }, -/* SetMonitoringModeResponse */ +/* BrowsePathTarget */ { - UA_TYPENAME("SetMonitoringModeResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {770}}, /* .typeId */ - sizeof(UA_SetMonitoringModeResponse), /* .memSize */ - UA_TYPES_SETMONITORINGMODERESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("BrowsePathTarget") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {546}}, /* .typeId */ + sizeof(UA_BrowsePathTarget), /* .memSize */ + UA_TYPES_BROWSEPATHTARGET, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 772, /* .binaryEncodingId */ - SetMonitoringModeResponse_members /* .members */ + 2, /* .membersSize */ + 548, /* .binaryEncodingId */ + BrowsePathTarget_members /* .members */ }, -/* FindServersRequest */ +/* BrowsePathResult */ { - UA_TYPENAME("FindServersRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {420}}, /* .typeId */ - sizeof(UA_FindServersRequest), /* .memSize */ - UA_TYPES_FINDSERVERSREQUEST, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("BrowsePathResult") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {549}}, /* .typeId */ + sizeof(UA_BrowsePathResult), /* .memSize */ + UA_TYPES_BROWSEPATHRESULT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 422, /* .binaryEncodingId */ - FindServersRequest_members /* .members */ + 2, /* .membersSize */ + 551, /* .binaryEncodingId */ + BrowsePathResult_members /* .members */ }, -/* ReferenceDescription */ +/* TranslateBrowsePathsToNodeIdsRequest */ { - UA_TYPENAME("ReferenceDescription") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {518}}, /* .typeId */ - sizeof(UA_ReferenceDescription), /* .memSize */ - UA_TYPES_REFERENCEDESCRIPTION, /* .typeIndex */ - 7, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("TranslateBrowsePathsToNodeIdsRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {552}}, /* .typeId */ + sizeof(UA_TranslateBrowsePathsToNodeIdsRequest), /* .memSize */ + UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 520, /* .binaryEncodingId */ - ReferenceDescription_members /* .members */ + 2, /* .membersSize */ + 554, /* .binaryEncodingId */ + TranslateBrowsePathsToNodeIdsRequest_members /* .members */ }, -/* SetPublishingModeResponse */ +/* TranslateBrowsePathsToNodeIdsResponse */ { - UA_TYPENAME("SetPublishingModeResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {800}}, /* .typeId */ - sizeof(UA_SetPublishingModeResponse), /* .memSize */ - UA_TYPES_SETPUBLISHINGMODERESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("TranslateBrowsePathsToNodeIdsResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {555}}, /* .typeId */ + sizeof(UA_TranslateBrowsePathsToNodeIdsResponse), /* .memSize */ + UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 802, /* .binaryEncodingId */ - SetPublishingModeResponse_members /* .members */ + 3, /* .membersSize */ + 557, /* .binaryEncodingId */ + TranslateBrowsePathsToNodeIdsResponse_members /* .members */ }, -/* ContentFilterResult */ +/* RegisterNodesRequest */ { - UA_TYPENAME("ContentFilterResult") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {607}}, /* .typeId */ - sizeof(UA_ContentFilterResult), /* .memSize */ - UA_TYPES_CONTENTFILTERRESULT, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("RegisterNodesRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {558}}, /* .typeId */ + sizeof(UA_RegisterNodesRequest), /* .memSize */ + UA_TYPES_REGISTERNODESREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 609, /* .binaryEncodingId */ - ContentFilterResult_members /* .members */ + 2, /* .membersSize */ + 560, /* .binaryEncodingId */ + RegisterNodesRequest_members /* .members */ }, -/* RegisterServerResponse */ +/* RegisterNodesResponse */ { - UA_TYPENAME("RegisterServerResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {438}}, /* .typeId */ - sizeof(UA_RegisterServerResponse), /* .memSize */ - UA_TYPES_REGISTERSERVERRESPONSE, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("RegisterNodesResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {561}}, /* .typeId */ + sizeof(UA_RegisterNodesResponse), /* .memSize */ + UA_TYPES_REGISTERNODESRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 440, /* .binaryEncodingId */ - RegisterServerResponse_members /* .members */ + 2, /* .membersSize */ + 563, /* .binaryEncodingId */ + RegisterNodesResponse_members /* .members */ }, -/* AddReferencesItem */ +/* UnregisterNodesRequest */ { - UA_TYPENAME("AddReferencesItem") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {379}}, /* .typeId */ - sizeof(UA_AddReferencesItem), /* .memSize */ - UA_TYPES_ADDREFERENCESITEM, /* .typeIndex */ - 6, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("UnregisterNodesRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {564}}, /* .typeId */ + sizeof(UA_UnregisterNodesRequest), /* .memSize */ + UA_TYPES_UNREGISTERNODESREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 381, /* .binaryEncodingId */ - AddReferencesItem_members /* .members */ + 2, /* .membersSize */ + 566, /* .binaryEncodingId */ + UnregisterNodesRequest_members /* .members */ }, -/* QueryDataDescription */ +/* UnregisterNodesResponse */ { - UA_TYPENAME("QueryDataDescription") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {570}}, /* .typeId */ - sizeof(UA_QueryDataDescription), /* .memSize */ - UA_TYPES_QUERYDATADESCRIPTION, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("UnregisterNodesResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {567}}, /* .typeId */ + sizeof(UA_UnregisterNodesResponse), /* .memSize */ + UA_TYPES_UNREGISTERNODESRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 572, /* .binaryEncodingId */ - QueryDataDescription_members /* .members */ + 1, /* .membersSize */ + 569, /* .binaryEncodingId */ + UnregisterNodesResponse_members /* .members */ }, -/* CreateSubscriptionResponse */ +/* FilterOperator */ { - UA_TYPENAME("CreateSubscriptionResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {788}}, /* .typeId */ - sizeof(UA_CreateSubscriptionResponse), /* .memSize */ - UA_TYPES_CREATESUBSCRIPTIONRESPONSE, /* .typeIndex */ - 5, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 790, /* .binaryEncodingId */ - CreateSubscriptionResponse_members /* .members */ + UA_TYPENAME("FilterOperator") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {576}}, /* .typeId */ + sizeof(UA_FilterOperator), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + FilterOperator_members /* .members */ }, -/* NetworkGroupDataType */ +/* ContentFilterElement */ { - UA_TYPENAME("NetworkGroupDataType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {11944}}, /* .typeId */ - sizeof(UA_NetworkGroupDataType), /* .memSize */ - UA_TYPES_NETWORKGROUPDATATYPE, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ContentFilterElement") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {583}}, /* .typeId */ + sizeof(UA_ContentFilterElement), /* .memSize */ + UA_TYPES_CONTENTFILTERELEMENT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 11958, /* .binaryEncodingId */ - NetworkGroupDataType_members /* .members */ + 2, /* .membersSize */ + 585, /* .binaryEncodingId */ + ContentFilterElement_members /* .members */ }, -/* DeleteReferencesResponse */ +/* ContentFilter */ { - UA_TYPENAME("DeleteReferencesResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {507}}, /* .typeId */ - sizeof(UA_DeleteReferencesResponse), /* .memSize */ - UA_TYPES_DELETEREFERENCESRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ContentFilter") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {586}}, /* .typeId */ + sizeof(UA_ContentFilter), /* .memSize */ + UA_TYPES_CONTENTFILTER, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 509, /* .binaryEncodingId */ - DeleteReferencesResponse_members /* .members */ + 1, /* .membersSize */ + 588, /* .binaryEncodingId */ + ContentFilter_members /* .members */ }, -/* CreateMonitoredItemsResponse */ +/* FilterOperand */ { - UA_TYPENAME("CreateMonitoredItemsResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {752}}, /* .typeId */ - sizeof(UA_CreateMonitoredItemsResponse), /* .memSize */ - UA_TYPES_CREATEMONITOREDITEMSRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 754, /* .binaryEncodingId */ - CreateMonitoredItemsResponse_members /* .members */ + UA_TYPENAME("FilterOperand") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {589}}, /* .typeId */ + sizeof(UA_FilterOperand), /* .memSize */ + UA_TYPES_FILTEROPERAND, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + true, /* .pointerFree */ + true, /* .overlayable */ + 0, /* .membersSize */ + 591, /* .binaryEncodingId */ + FilterOperand_members /* .members */ }, -/* CallResponse */ +/* ElementOperand */ { - UA_TYPENAME("CallResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {713}}, /* .typeId */ - sizeof(UA_CallResponse), /* .memSize */ - UA_TYPES_CALLRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 715, /* .binaryEncodingId */ - CallResponse_members /* .members */ + UA_TYPENAME("ElementOperand") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {592}}, /* .typeId */ + sizeof(UA_ElementOperand), /* .memSize */ + UA_TYPES_ELEMENTOPERAND, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + true, /* .pointerFree */ + true + && UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 1, /* .membersSize */ + 594, /* .binaryEncodingId */ + ElementOperand_members /* .members */ }, -/* DeleteNodesResponse */ +/* LiteralOperand */ { - UA_TYPENAME("DeleteNodesResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {501}}, /* .typeId */ - sizeof(UA_DeleteNodesResponse), /* .memSize */ - UA_TYPES_DELETENODESRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("LiteralOperand") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {595}}, /* .typeId */ + sizeof(UA_LiteralOperand), /* .memSize */ + UA_TYPES_LITERALOPERAND, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 503, /* .binaryEncodingId */ - DeleteNodesResponse_members /* .members */ + 1, /* .membersSize */ + 597, /* .binaryEncodingId */ + LiteralOperand_members /* .members */ }, -/* RepublishResponse */ +/* AttributeOperand */ { - UA_TYPENAME("RepublishResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {833}}, /* .typeId */ - sizeof(UA_RepublishResponse), /* .memSize */ - UA_TYPES_REPUBLISHRESPONSE, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("AttributeOperand") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {598}}, /* .typeId */ + sizeof(UA_AttributeOperand), /* .memSize */ + UA_TYPES_ATTRIBUTEOPERAND, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 835, /* .binaryEncodingId */ - RepublishResponse_members /* .members */ + 5, /* .membersSize */ + 600, /* .binaryEncodingId */ + AttributeOperand_members /* .members */ }, -/* MonitoredItemCreateRequest */ +/* SimpleAttributeOperand */ { - UA_TYPENAME("MonitoredItemCreateRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {743}}, /* .typeId */ - sizeof(UA_MonitoredItemCreateRequest), /* .memSize */ - UA_TYPES_MONITOREDITEMCREATEREQUEST, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("SimpleAttributeOperand") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {601}}, /* .typeId */ + sizeof(UA_SimpleAttributeOperand), /* .memSize */ + UA_TYPES_SIMPLEATTRIBUTEOPERAND, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 745, /* .binaryEncodingId */ - MonitoredItemCreateRequest_members /* .members */ + 4, /* .membersSize */ + 603, /* .binaryEncodingId */ + SimpleAttributeOperand_members /* .members */ }, -/* DeleteReferencesRequest */ +/* ContentFilterElementResult */ { - UA_TYPENAME("DeleteReferencesRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {504}}, /* .typeId */ - sizeof(UA_DeleteReferencesRequest), /* .memSize */ - UA_TYPES_DELETEREFERENCESREQUEST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ContentFilterElementResult") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {604}}, /* .typeId */ + sizeof(UA_ContentFilterElementResult), /* .memSize */ + UA_TYPES_CONTENTFILTERELEMENTRESULT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 506, /* .binaryEncodingId */ - DeleteReferencesRequest_members /* .members */ + 3, /* .membersSize */ + 606, /* .binaryEncodingId */ + ContentFilterElementResult_members /* .members */ }, -/* ReadResponse */ +/* ContentFilterResult */ { - UA_TYPENAME("ReadResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {632}}, /* .typeId */ - sizeof(UA_ReadResponse), /* .memSize */ - UA_TYPES_READRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ContentFilterResult") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {607}}, /* .typeId */ + sizeof(UA_ContentFilterResult), /* .memSize */ + UA_TYPES_CONTENTFILTERRESULT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 634, /* .binaryEncodingId */ - ReadResponse_members /* .members */ + 2, /* .membersSize */ + 609, /* .binaryEncodingId */ + ContentFilterResult_members /* .members */ }, -/* AddReferencesRequest */ +/* TimestampsToReturn */ { - UA_TYPENAME("AddReferencesRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {492}}, /* .typeId */ - sizeof(UA_AddReferencesRequest), /* .memSize */ - UA_TYPES_ADDREFERENCESREQUEST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("TimestampsToReturn") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {625}}, /* .typeId */ + sizeof(UA_TimestampsToReturn), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + TimestampsToReturn_members /* .members */ +}, +/* ReadValueId */ +{ + UA_TYPENAME("ReadValueId") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {626}}, /* .typeId */ + sizeof(UA_ReadValueId), /* .memSize */ + UA_TYPES_READVALUEID, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 494, /* .binaryEncodingId */ - AddReferencesRequest_members /* .members */ + 4, /* .membersSize */ + 628, /* .binaryEncodingId */ + ReadValueId_members /* .members */ }, /* ReadRequest */ { @@ -16070,129 +18292,155 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {629}}, /* .typeId */ sizeof(UA_ReadRequest), /* .memSize */ UA_TYPES_READREQUEST, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 4, /* .membersSize */ 631, /* .binaryEncodingId */ ReadRequest_members /* .members */ }, -/* OpenSecureChannelRequest */ +/* ReadResponse */ { - UA_TYPENAME("OpenSecureChannelRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {444}}, /* .typeId */ - sizeof(UA_OpenSecureChannelRequest), /* .memSize */ - UA_TYPES_OPENSECURECHANNELREQUEST, /* .typeIndex */ - 6, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ReadResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {632}}, /* .typeId */ + sizeof(UA_ReadResponse), /* .memSize */ + UA_TYPES_READRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 446, /* .binaryEncodingId */ - OpenSecureChannelRequest_members /* .members */ + 3, /* .membersSize */ + 634, /* .binaryEncodingId */ + ReadResponse_members /* .members */ }, -/* RegisterServer2Response */ +/* WriteValue */ { - UA_TYPENAME("RegisterServer2Response") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {12194}}, /* .typeId */ - sizeof(UA_RegisterServer2Response), /* .memSize */ - UA_TYPES_REGISTERSERVER2RESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("WriteValue") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {668}}, /* .typeId */ + sizeof(UA_WriteValue), /* .memSize */ + UA_TYPES_WRITEVALUE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 12212, /* .binaryEncodingId */ - RegisterServer2Response_members /* .members */ + 4, /* .membersSize */ + 670, /* .binaryEncodingId */ + WriteValue_members /* .members */ }, -/* AddNodesItem */ +/* WriteRequest */ { - UA_TYPENAME("AddNodesItem") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {376}}, /* .typeId */ - sizeof(UA_AddNodesItem), /* .memSize */ - UA_TYPES_ADDNODESITEM, /* .typeIndex */ - 7, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("WriteRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {671}}, /* .typeId */ + sizeof(UA_WriteRequest), /* .memSize */ + UA_TYPES_WRITEREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 378, /* .binaryEncodingId */ - AddNodesItem_members /* .members */ + 2, /* .membersSize */ + 673, /* .binaryEncodingId */ + WriteRequest_members /* .members */ }, -/* NodeTypeDescription */ +/* WriteResponse */ { - UA_TYPENAME("NodeTypeDescription") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {573}}, /* .typeId */ - sizeof(UA_NodeTypeDescription), /* .memSize */ - UA_TYPES_NODETYPEDESCRIPTION, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("WriteResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {674}}, /* .typeId */ + sizeof(UA_WriteResponse), /* .memSize */ + UA_TYPES_WRITERESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 575, /* .binaryEncodingId */ - NodeTypeDescription_members /* .members */ + 3, /* .membersSize */ + 676, /* .binaryEncodingId */ + WriteResponse_members /* .members */ }, -/* ServerStatusDataType */ +/* CallMethodRequest */ { - UA_TYPENAME("ServerStatusDataType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {862}}, /* .typeId */ - sizeof(UA_ServerStatusDataType), /* .memSize */ - UA_TYPES_SERVERSTATUSDATATYPE, /* .typeIndex */ - 6, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("CallMethodRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {704}}, /* .typeId */ + sizeof(UA_CallMethodRequest), /* .memSize */ + UA_TYPES_CALLMETHODREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 864, /* .binaryEncodingId */ - ServerStatusDataType_members /* .members */ + 3, /* .membersSize */ + 706, /* .binaryEncodingId */ + CallMethodRequest_members /* .members */ }, -/* AttributeOperand */ +/* CallMethodResult */ { - UA_TYPENAME("AttributeOperand") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {598}}, /* .typeId */ - sizeof(UA_AttributeOperand), /* .memSize */ - UA_TYPES_ATTRIBUTEOPERAND, /* .typeIndex */ - 5, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("CallMethodResult") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {707}}, /* .typeId */ + sizeof(UA_CallMethodResult), /* .memSize */ + UA_TYPES_CALLMETHODRESULT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 600, /* .binaryEncodingId */ - AttributeOperand_members /* .members */ + 4, /* .membersSize */ + 709, /* .binaryEncodingId */ + CallMethodResult_members /* .members */ }, -/* AddReferencesResponse */ +/* CallRequest */ { - UA_TYPENAME("AddReferencesResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {495}}, /* .typeId */ - sizeof(UA_AddReferencesResponse), /* .memSize */ - UA_TYPES_ADDREFERENCESRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("CallRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {710}}, /* .typeId */ + sizeof(UA_CallRequest), /* .memSize */ + UA_TYPES_CALLREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 497, /* .binaryEncodingId */ - AddReferencesResponse_members /* .members */ + 2, /* .membersSize */ + 712, /* .binaryEncodingId */ + CallRequest_members /* .members */ }, -/* EventFilterResult */ +/* CallResponse */ { - UA_TYPENAME("EventFilterResult") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {734}}, /* .typeId */ - sizeof(UA_EventFilterResult), /* .memSize */ - UA_TYPES_EVENTFILTERRESULT, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("CallResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {713}}, /* .typeId */ + sizeof(UA_CallResponse), /* .memSize */ + UA_TYPES_CALLRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 736, /* .binaryEncodingId */ - EventFilterResult_members /* .members */ + 3, /* .membersSize */ + 715, /* .binaryEncodingId */ + CallResponse_members /* .members */ }, -/* TranslateBrowsePathsToNodeIdsResponse */ +/* MonitoringMode */ { - UA_TYPENAME("TranslateBrowsePathsToNodeIdsResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {555}}, /* .typeId */ - sizeof(UA_TranslateBrowsePathsToNodeIdsResponse), /* .memSize */ - UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 557, /* .binaryEncodingId */ - TranslateBrowsePathsToNodeIdsResponse_members /* .members */ + UA_TYPENAME("MonitoringMode") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {716}}, /* .typeId */ + sizeof(UA_MonitoringMode), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + MonitoringMode_members /* .members */ +}, +/* DataChangeTrigger */ +{ + UA_TYPENAME("DataChangeTrigger") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {717}}, /* .typeId */ + sizeof(UA_DataChangeTrigger), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + DataChangeTrigger_members /* .members */ +}, +/* DeadbandType */ +{ + UA_TYPENAME("DeadbandType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {718}}, /* .typeId */ + sizeof(UA_DeadbandType), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + DeadbandType_members /* .members */ }, /* DataChangeFilter */ { @@ -16200,8 +18448,7 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {722}}, /* .typeId */ sizeof(UA_DataChangeFilter), /* .memSize */ UA_TYPES_DATACHANGEFILTER, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ true, /* .pointerFree */ true && UA_BINARY_OVERLAYABLE_INTEGER @@ -16209,138 +18456,109 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { && offsetof(UA_DataChangeFilter, deadbandType) == (offsetof(UA_DataChangeFilter, trigger) + sizeof(UA_DataChangeTrigger)) && UA_BINARY_OVERLAYABLE_FLOAT && offsetof(UA_DataChangeFilter, deadbandValue) == (offsetof(UA_DataChangeFilter, deadbandType) + sizeof(UA_UInt32)), /* .overlayable */ + 3, /* .membersSize */ 724, /* .binaryEncodingId */ DataChangeFilter_members /* .members */ }, -/* ContentFilterElement */ +/* EventFilter */ { - UA_TYPENAME("ContentFilterElement") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {583}}, /* .typeId */ - sizeof(UA_ContentFilterElement), /* .memSize */ - UA_TYPES_CONTENTFILTERELEMENT, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("EventFilter") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {725}}, /* .typeId */ + sizeof(UA_EventFilter), /* .memSize */ + UA_TYPES_EVENTFILTER, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 585, /* .binaryEncodingId */ - ContentFilterElement_members /* .members */ -}, -/* TranslateBrowsePathsToNodeIdsRequest */ -{ - UA_TYPENAME("TranslateBrowsePathsToNodeIdsRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {552}}, /* .typeId */ - sizeof(UA_TranslateBrowsePathsToNodeIdsRequest), /* .memSize */ - UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST, /* .typeIndex */ 2, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 554, /* .binaryEncodingId */ - TranslateBrowsePathsToNodeIdsRequest_members /* .members */ -}, -/* CloseSessionResponse */ -{ - UA_TYPENAME("CloseSessionResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {474}}, /* .typeId */ - sizeof(UA_CloseSessionResponse), /* .memSize */ - UA_TYPES_CLOSESESSIONRESPONSE, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 476, /* .binaryEncodingId */ - CloseSessionResponse_members /* .members */ -}, -/* ApplicationDescription */ -{ - UA_TYPENAME("ApplicationDescription") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {308}}, /* .typeId */ - sizeof(UA_ApplicationDescription), /* .memSize */ - UA_TYPES_APPLICATIONDESCRIPTION, /* .typeIndex */ - 7, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 310, /* .binaryEncodingId */ - ApplicationDescription_members /* .members */ + 727, /* .binaryEncodingId */ + EventFilter_members /* .members */ }, -/* SessionDiagnosticsDataType */ +/* AggregateConfiguration */ { - UA_TYPENAME("SessionDiagnosticsDataType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {865}}, /* .typeId */ - sizeof(UA_SessionDiagnosticsDataType), /* .memSize */ - UA_TYPES_SESSIONDIAGNOSTICSDATATYPE, /* .typeIndex */ - 43, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 867, /* .binaryEncodingId */ - SessionDiagnosticsDataType_members /* .members */ + UA_TYPENAME("AggregateConfiguration") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {948}}, /* .typeId */ + sizeof(UA_AggregateConfiguration), /* .memSize */ + UA_TYPES_AGGREGATECONFIGURATION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + true, /* .pointerFree */ + true + && true + && true + && offsetof(UA_AggregateConfiguration, treatUncertainAsBad) == (offsetof(UA_AggregateConfiguration, useServerCapabilitiesDefaults) + sizeof(UA_Boolean)) + && true + && offsetof(UA_AggregateConfiguration, percentDataBad) == (offsetof(UA_AggregateConfiguration, treatUncertainAsBad) + sizeof(UA_Boolean)) + && true + && offsetof(UA_AggregateConfiguration, percentDataGood) == (offsetof(UA_AggregateConfiguration, percentDataBad) + sizeof(UA_Byte)) + && true + && offsetof(UA_AggregateConfiguration, useSlopedExtrapolation) == (offsetof(UA_AggregateConfiguration, percentDataGood) + sizeof(UA_Byte)), /* .overlayable */ + 5, /* .membersSize */ + 950, /* .binaryEncodingId */ + AggregateConfiguration_members /* .members */ }, -/* ServiceFault */ +/* AggregateFilter */ { - UA_TYPENAME("ServiceFault") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {395}}, /* .typeId */ - sizeof(UA_ServiceFault), /* .memSize */ - UA_TYPES_SERVICEFAULT, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("AggregateFilter") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {728}}, /* .typeId */ + sizeof(UA_AggregateFilter), /* .memSize */ + UA_TYPES_AGGREGATEFILTER, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 397, /* .binaryEncodingId */ - ServiceFault_members /* .members */ + 4, /* .membersSize */ + 730, /* .binaryEncodingId */ + AggregateFilter_members /* .members */ }, -/* RegisteredServer */ +/* EventFilterResult */ { - UA_TYPENAME("RegisteredServer") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {432}}, /* .typeId */ - sizeof(UA_RegisteredServer), /* .memSize */ - UA_TYPES_REGISTEREDSERVER, /* .typeIndex */ - 8, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("EventFilterResult") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {734}}, /* .typeId */ + sizeof(UA_EventFilterResult), /* .memSize */ + UA_TYPES_EVENTFILTERRESULT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 434, /* .binaryEncodingId */ - RegisteredServer_members /* .members */ + 3, /* .membersSize */ + 736, /* .binaryEncodingId */ + EventFilterResult_members /* .members */ }, -/* AggregateFilter */ +/* MonitoringParameters */ { - UA_TYPENAME("AggregateFilter") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {728}}, /* .typeId */ - sizeof(UA_AggregateFilter), /* .memSize */ - UA_TYPES_AGGREGATEFILTER, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("MonitoringParameters") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {740}}, /* .typeId */ + sizeof(UA_MonitoringParameters), /* .memSize */ + UA_TYPES_MONITORINGPARAMETERS, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 730, /* .binaryEncodingId */ - AggregateFilter_members /* .members */ + 5, /* .membersSize */ + 742, /* .binaryEncodingId */ + MonitoringParameters_members /* .members */ }, -/* RegisterServerRequest */ +/* MonitoredItemCreateRequest */ { - UA_TYPENAME("RegisterServerRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {435}}, /* .typeId */ - sizeof(UA_RegisterServerRequest), /* .memSize */ - UA_TYPES_REGISTERSERVERREQUEST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("MonitoredItemCreateRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {743}}, /* .typeId */ + sizeof(UA_MonitoredItemCreateRequest), /* .memSize */ + UA_TYPES_MONITOREDITEMCREATEREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 437, /* .binaryEncodingId */ - RegisterServerRequest_members /* .members */ + 3, /* .membersSize */ + 745, /* .binaryEncodingId */ + MonitoredItemCreateRequest_members /* .members */ }, -/* EndpointDescription */ +/* MonitoredItemCreateResult */ { - UA_TYPENAME("EndpointDescription") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {312}}, /* .typeId */ - sizeof(UA_EndpointDescription), /* .memSize */ - UA_TYPES_ENDPOINTDESCRIPTION, /* .typeIndex */ - 8, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("MonitoredItemCreateResult") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {746}}, /* .typeId */ + sizeof(UA_MonitoredItemCreateResult), /* .memSize */ + UA_TYPES_MONITOREDITEMCREATERESULT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 314, /* .binaryEncodingId */ - EndpointDescription_members /* .members */ + 5, /* .membersSize */ + 748, /* .binaryEncodingId */ + MonitoredItemCreateResult_members /* .members */ }, /* CreateMonitoredItemsRequest */ { @@ -16348,468 +18566,928 @@ const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {749}}, /* .typeId */ sizeof(UA_CreateMonitoredItemsRequest), /* .memSize */ UA_TYPES_CREATEMONITOREDITEMSREQUEST, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 4, /* .membersSize */ 751, /* .binaryEncodingId */ CreateMonitoredItemsRequest_members /* .members */ }, -/* ContentFilter */ +/* CreateMonitoredItemsResponse */ { - UA_TYPENAME("ContentFilter") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {586}}, /* .typeId */ - sizeof(UA_ContentFilter), /* .memSize */ - UA_TYPES_CONTENTFILTER, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("CreateMonitoredItemsResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {752}}, /* .typeId */ + sizeof(UA_CreateMonitoredItemsResponse), /* .memSize */ + UA_TYPES_CREATEMONITOREDITEMSRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 588, /* .binaryEncodingId */ - ContentFilter_members /* .members */ + 3, /* .membersSize */ + 754, /* .binaryEncodingId */ + CreateMonitoredItemsResponse_members /* .members */ }, -/* QueryFirstResponse */ +/* MonitoredItemModifyRequest */ { - UA_TYPENAME("QueryFirstResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {616}}, /* .typeId */ - sizeof(UA_QueryFirstResponse), /* .memSize */ - UA_TYPES_QUERYFIRSTRESPONSE, /* .typeIndex */ - 6, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("MonitoredItemModifyRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {755}}, /* .typeId */ + sizeof(UA_MonitoredItemModifyRequest), /* .memSize */ + UA_TYPES_MONITOREDITEMMODIFYREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 618, /* .binaryEncodingId */ - QueryFirstResponse_members /* .members */ + 2, /* .membersSize */ + 757, /* .binaryEncodingId */ + MonitoredItemModifyRequest_members /* .members */ }, -/* AddNodesRequest */ +/* MonitoredItemModifyResult */ { - UA_TYPENAME("AddNodesRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {486}}, /* .typeId */ - sizeof(UA_AddNodesRequest), /* .memSize */ - UA_TYPES_ADDNODESREQUEST, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("MonitoredItemModifyResult") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {758}}, /* .typeId */ + sizeof(UA_MonitoredItemModifyResult), /* .memSize */ + UA_TYPES_MONITOREDITEMMODIFYRESULT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 488, /* .binaryEncodingId */ - AddNodesRequest_members /* .members */ + 4, /* .membersSize */ + 760, /* .binaryEncodingId */ + MonitoredItemModifyResult_members /* .members */ }, -/* BrowseRequest */ +/* ModifyMonitoredItemsRequest */ { - UA_TYPENAME("BrowseRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {525}}, /* .typeId */ - sizeof(UA_BrowseRequest), /* .memSize */ - UA_TYPES_BROWSEREQUEST, /* .typeIndex */ - 4, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ModifyMonitoredItemsRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {761}}, /* .typeId */ + sizeof(UA_ModifyMonitoredItemsRequest), /* .memSize */ + UA_TYPES_MODIFYMONITOREDITEMSREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 527, /* .binaryEncodingId */ - BrowseRequest_members /* .members */ + 4, /* .membersSize */ + 763, /* .binaryEncodingId */ + ModifyMonitoredItemsRequest_members /* .members */ }, -/* BrowseResult */ +/* ModifyMonitoredItemsResponse */ { - UA_TYPENAME("BrowseResult") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {522}}, /* .typeId */ - sizeof(UA_BrowseResult), /* .memSize */ - UA_TYPES_BROWSERESULT, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("ModifyMonitoredItemsResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {764}}, /* .typeId */ + sizeof(UA_ModifyMonitoredItemsResponse), /* .memSize */ + UA_TYPES_MODIFYMONITOREDITEMSRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 524, /* .binaryEncodingId */ - BrowseResult_members /* .members */ + 3, /* .membersSize */ + 766, /* .binaryEncodingId */ + ModifyMonitoredItemsResponse_members /* .members */ }, -/* RegisterServer2Request */ +/* SetMonitoringModeRequest */ { - UA_TYPENAME("RegisterServer2Request") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {12193}}, /* .typeId */ - sizeof(UA_RegisterServer2Request), /* .memSize */ - UA_TYPES_REGISTERSERVER2REQUEST, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("SetMonitoringModeRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {767}}, /* .typeId */ + sizeof(UA_SetMonitoringModeRequest), /* .memSize */ + UA_TYPES_SETMONITORINGMODEREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 12211, /* .binaryEncodingId */ - RegisterServer2Request_members /* .members */ + 4, /* .membersSize */ + 769, /* .binaryEncodingId */ + SetMonitoringModeRequest_members /* .members */ }, -/* CreateSessionRequest */ +/* SetMonitoringModeResponse */ { - UA_TYPENAME("CreateSessionRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {459}}, /* .typeId */ - sizeof(UA_CreateSessionRequest), /* .memSize */ - UA_TYPES_CREATESESSIONREQUEST, /* .typeIndex */ - 9, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("SetMonitoringModeResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {770}}, /* .typeId */ + sizeof(UA_SetMonitoringModeResponse), /* .memSize */ + UA_TYPES_SETMONITORINGMODERESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 461, /* .binaryEncodingId */ - CreateSessionRequest_members /* .members */ + 3, /* .membersSize */ + 772, /* .binaryEncodingId */ + SetMonitoringModeResponse_members /* .members */ }, -/* EventFilter */ +/* SetTriggeringRequest */ { - UA_TYPENAME("EventFilter") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {725}}, /* .typeId */ - sizeof(UA_EventFilter), /* .memSize */ - UA_TYPES_EVENTFILTER, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("SetTriggeringRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {773}}, /* .typeId */ + sizeof(UA_SetTriggeringRequest), /* .memSize */ + UA_TYPES_SETTRIGGERINGREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 727, /* .binaryEncodingId */ - EventFilter_members /* .members */ + 5, /* .membersSize */ + 775, /* .binaryEncodingId */ + SetTriggeringRequest_members /* .members */ }, -/* GetEndpointsResponse */ +/* SetTriggeringResponse */ { - UA_TYPENAME("GetEndpointsResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {429}}, /* .typeId */ - sizeof(UA_GetEndpointsResponse), /* .memSize */ - UA_TYPES_GETENDPOINTSRESPONSE, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("SetTriggeringResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {776}}, /* .typeId */ + sizeof(UA_SetTriggeringResponse), /* .memSize */ + UA_TYPES_SETTRIGGERINGRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 431, /* .binaryEncodingId */ - GetEndpointsResponse_members /* .members */ + 5, /* .membersSize */ + 778, /* .binaryEncodingId */ + SetTriggeringResponse_members /* .members */ }, -/* FindServersResponse */ +/* DeleteMonitoredItemsRequest */ { - UA_TYPENAME("FindServersResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {423}}, /* .typeId */ - sizeof(UA_FindServersResponse), /* .memSize */ - UA_TYPES_FINDSERVERSRESPONSE, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("DeleteMonitoredItemsRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {779}}, /* .typeId */ + sizeof(UA_DeleteMonitoredItemsRequest), /* .memSize */ + UA_TYPES_DELETEMONITOREDITEMSREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 425, /* .binaryEncodingId */ - FindServersResponse_members /* .members */ + 3, /* .membersSize */ + 781, /* .binaryEncodingId */ + DeleteMonitoredItemsRequest_members /* .members */ }, -/* BrowseNextResponse */ +/* DeleteMonitoredItemsResponse */ { - UA_TYPENAME("BrowseNextResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {534}}, /* .typeId */ - sizeof(UA_BrowseNextResponse), /* .memSize */ - UA_TYPES_BROWSENEXTRESPONSE, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("DeleteMonitoredItemsResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {782}}, /* .typeId */ + sizeof(UA_DeleteMonitoredItemsResponse), /* .memSize */ + UA_TYPES_DELETEMONITOREDITEMSRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 536, /* .binaryEncodingId */ - BrowseNextResponse_members /* .members */ + 3, /* .membersSize */ + 784, /* .binaryEncodingId */ + DeleteMonitoredItemsResponse_members /* .members */ }, -/* BrowseResponse */ +/* CreateSubscriptionRequest */ { - UA_TYPENAME("BrowseResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {528}}, /* .typeId */ - sizeof(UA_BrowseResponse), /* .memSize */ - UA_TYPES_BROWSERESPONSE, /* .typeIndex */ + UA_TYPENAME("CreateSubscriptionRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {785}}, /* .typeId */ + sizeof(UA_CreateSubscriptionRequest), /* .memSize */ + UA_TYPES_CREATESUBSCRIPTIONREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 7, /* .membersSize */ + 787, /* .binaryEncodingId */ + CreateSubscriptionRequest_members /* .members */ +}, +/* CreateSubscriptionResponse */ +{ + UA_TYPENAME("CreateSubscriptionResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {788}}, /* .typeId */ + sizeof(UA_CreateSubscriptionResponse), /* .memSize */ + UA_TYPES_CREATESUBSCRIPTIONRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 5, /* .membersSize */ + 790, /* .binaryEncodingId */ + CreateSubscriptionResponse_members /* .members */ +}, +/* ModifySubscriptionRequest */ +{ + UA_TYPENAME("ModifySubscriptionRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {791}}, /* .typeId */ + sizeof(UA_ModifySubscriptionRequest), /* .memSize */ + UA_TYPES_MODIFYSUBSCRIPTIONREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 7, /* .membersSize */ + 793, /* .binaryEncodingId */ + ModifySubscriptionRequest_members /* .members */ +}, +/* ModifySubscriptionResponse */ +{ + UA_TYPENAME("ModifySubscriptionResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {794}}, /* .typeId */ + sizeof(UA_ModifySubscriptionResponse), /* .memSize */ + UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 4, /* .membersSize */ + 796, /* .binaryEncodingId */ + ModifySubscriptionResponse_members /* .members */ +}, +/* SetPublishingModeRequest */ +{ + UA_TYPENAME("SetPublishingModeRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {797}}, /* .typeId */ + sizeof(UA_SetPublishingModeRequest), /* .memSize */ + UA_TYPES_SETPUBLISHINGMODEREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ 3, /* .membersSize */ - false, /* .builtin */ + 799, /* .binaryEncodingId */ + SetPublishingModeRequest_members /* .members */ +}, +/* SetPublishingModeResponse */ +{ + UA_TYPENAME("SetPublishingModeResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {800}}, /* .typeId */ + sizeof(UA_SetPublishingModeResponse), /* .memSize */ + UA_TYPES_SETPUBLISHINGMODERESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 530, /* .binaryEncodingId */ - BrowseResponse_members /* .members */ + 3, /* .membersSize */ + 802, /* .binaryEncodingId */ + SetPublishingModeResponse_members /* .members */ }, -/* CreateSessionResponse */ +/* NotificationMessage */ { - UA_TYPENAME("CreateSessionResponse") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {462}}, /* .typeId */ - sizeof(UA_CreateSessionResponse), /* .memSize */ - UA_TYPES_CREATESESSIONRESPONSE, /* .typeIndex */ - 10, /* .membersSize */ - false, /* .builtin */ + UA_TYPENAME("NotificationMessage") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {803}}, /* .typeId */ + sizeof(UA_NotificationMessage), /* .memSize */ + UA_TYPES_NOTIFICATIONMESSAGE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 464, /* .binaryEncodingId */ - CreateSessionResponse_members /* .members */ + 3, /* .membersSize */ + 805, /* .binaryEncodingId */ + NotificationMessage_members /* .members */ +}, +/* MonitoredItemNotification */ +{ + UA_TYPENAME("MonitoredItemNotification") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {806}}, /* .typeId */ + sizeof(UA_MonitoredItemNotification), /* .memSize */ + UA_TYPES_MONITOREDITEMNOTIFICATION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 2, /* .membersSize */ + 808, /* .binaryEncodingId */ + MonitoredItemNotification_members /* .members */ +}, +/* EventFieldList */ +{ + UA_TYPENAME("EventFieldList") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {917}}, /* .typeId */ + sizeof(UA_EventFieldList), /* .memSize */ + UA_TYPES_EVENTFIELDLIST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 2, /* .membersSize */ + 919, /* .binaryEncodingId */ + EventFieldList_members /* .members */ +}, +/* StatusChangeNotification */ +{ + UA_TYPENAME("StatusChangeNotification") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {818}}, /* .typeId */ + sizeof(UA_StatusChangeNotification), /* .memSize */ + UA_TYPES_STATUSCHANGENOTIFICATION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 2, /* .membersSize */ + 820, /* .binaryEncodingId */ + StatusChangeNotification_members /* .members */ +}, +/* SubscriptionAcknowledgement */ +{ + UA_TYPENAME("SubscriptionAcknowledgement") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {821}}, /* .typeId */ + sizeof(UA_SubscriptionAcknowledgement), /* .memSize */ + UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + true, /* .pointerFree */ + true + && UA_BINARY_OVERLAYABLE_INTEGER + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_SubscriptionAcknowledgement, sequenceNumber) == (offsetof(UA_SubscriptionAcknowledgement, subscriptionId) + sizeof(UA_UInt32)), /* .overlayable */ + 2, /* .membersSize */ + 823, /* .binaryEncodingId */ + SubscriptionAcknowledgement_members /* .members */ +}, +/* PublishRequest */ +{ + UA_TYPENAME("PublishRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {824}}, /* .typeId */ + sizeof(UA_PublishRequest), /* .memSize */ + UA_TYPES_PUBLISHREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 2, /* .membersSize */ + 826, /* .binaryEncodingId */ + PublishRequest_members /* .members */ +}, +/* PublishResponse */ +{ + UA_TYPENAME("PublishResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {827}}, /* .typeId */ + sizeof(UA_PublishResponse), /* .memSize */ + UA_TYPES_PUBLISHRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 7, /* .membersSize */ + 829, /* .binaryEncodingId */ + PublishResponse_members /* .members */ +}, +/* RepublishRequest */ +{ + UA_TYPENAME("RepublishRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {830}}, /* .typeId */ + sizeof(UA_RepublishRequest), /* .memSize */ + UA_TYPES_REPUBLISHREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 3, /* .membersSize */ + 832, /* .binaryEncodingId */ + RepublishRequest_members /* .members */ +}, +/* RepublishResponse */ +{ + UA_TYPENAME("RepublishResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {833}}, /* .typeId */ + sizeof(UA_RepublishResponse), /* .memSize */ + UA_TYPES_REPUBLISHRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 2, /* .membersSize */ + 835, /* .binaryEncodingId */ + RepublishResponse_members /* .members */ +}, +/* DeleteSubscriptionsRequest */ +{ + UA_TYPENAME("DeleteSubscriptionsRequest") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {845}}, /* .typeId */ + sizeof(UA_DeleteSubscriptionsRequest), /* .memSize */ + UA_TYPES_DELETESUBSCRIPTIONSREQUEST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 2, /* .membersSize */ + 847, /* .binaryEncodingId */ + DeleteSubscriptionsRequest_members /* .members */ +}, +/* DeleteSubscriptionsResponse */ +{ + UA_TYPENAME("DeleteSubscriptionsResponse") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {848}}, /* .typeId */ + sizeof(UA_DeleteSubscriptionsResponse), /* .memSize */ + UA_TYPES_DELETESUBSCRIPTIONSRESPONSE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 3, /* .membersSize */ + 850, /* .binaryEncodingId */ + DeleteSubscriptionsResponse_members /* .members */ +}, +/* BuildInfo */ +{ + UA_TYPENAME("BuildInfo") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {338}}, /* .typeId */ + sizeof(UA_BuildInfo), /* .memSize */ + UA_TYPES_BUILDINFO, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 6, /* .membersSize */ + 340, /* .binaryEncodingId */ + BuildInfo_members /* .members */ +}, +/* RedundancySupport */ +{ + UA_TYPENAME("RedundancySupport") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {851}}, /* .typeId */ + sizeof(UA_RedundancySupport), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + RedundancySupport_members /* .members */ +}, +/* ServerState */ +{ + UA_TYPENAME("ServerState") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {852}}, /* .typeId */ + sizeof(UA_ServerState), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + ServerState_members /* .members */ +}, +/* ServerDiagnosticsSummaryDataType */ +{ + UA_TYPENAME("ServerDiagnosticsSummaryDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {859}}, /* .typeId */ + sizeof(UA_ServerDiagnosticsSummaryDataType), /* .memSize */ + UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + true, /* .pointerFree */ + true + && UA_BINARY_OVERLAYABLE_INTEGER + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ServerDiagnosticsSummaryDataType, currentSessionCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, serverViewCount) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSessionCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, currentSessionCount) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedSessionCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSessionCount) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedSessionCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedSessionCount) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ServerDiagnosticsSummaryDataType, sessionTimeoutCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedSessionCount) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ServerDiagnosticsSummaryDataType, sessionAbortCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, sessionTimeoutCount) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ServerDiagnosticsSummaryDataType, currentSubscriptionCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, sessionAbortCount) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSubscriptionCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, currentSubscriptionCount) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ServerDiagnosticsSummaryDataType, publishingIntervalCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSubscriptionCount) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedRequestsCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, publishingIntervalCount) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedRequestsCount) == (offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedRequestsCount) + sizeof(UA_UInt32)), /* .overlayable */ + 12, /* .membersSize */ + 861, /* .binaryEncodingId */ + ServerDiagnosticsSummaryDataType_members /* .members */ }, -/* QueryFirstRequest */ +/* ServerStatusDataType */ { - UA_TYPENAME("QueryFirstRequest") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {613}}, /* .typeId */ - sizeof(UA_QueryFirstRequest), /* .memSize */ - UA_TYPES_QUERYFIRSTREQUEST, /* .typeIndex */ + UA_TYPENAME("ServerStatusDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {862}}, /* .typeId */ + sizeof(UA_ServerStatusDataType), /* .memSize */ + UA_TYPES_SERVERSTATUSDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ 6, /* .membersSize */ - false, /* .builtin */ + 864, /* .binaryEncodingId */ + ServerStatusDataType_members /* .members */ +}, +/* Range */ +{ + UA_TYPENAME("Range") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {884}}, /* .typeId */ + sizeof(UA_Range), /* .memSize */ + UA_TYPES_RANGE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + true, /* .pointerFree */ + true + && UA_BINARY_OVERLAYABLE_FLOAT + && UA_BINARY_OVERLAYABLE_FLOAT + && offsetof(UA_Range, high) == (offsetof(UA_Range, low) + sizeof(UA_Double)), /* .overlayable */ + 2, /* .membersSize */ + 886, /* .binaryEncodingId */ + Range_members /* .members */ +}, +/* StructureDescription */ +{ + UA_TYPENAME("StructureDescription") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15487}}, /* .typeId */ + sizeof(UA_StructureDescription), /* .memSize */ + UA_TYPES_STRUCTUREDESCRIPTION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 3, /* .membersSize */ + 126, /* .binaryEncodingId */ + StructureDescription_members /* .members */ +}, +/* FieldMetaData */ +{ + UA_TYPENAME("FieldMetaData") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {14524}}, /* .typeId */ + sizeof(UA_FieldMetaData), /* .memSize */ + UA_TYPES_FIELDMETADATA, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 10, /* .membersSize */ + 14839, /* .binaryEncodingId */ + FieldMetaData_members /* .members */ +}, +/* WriterGroupDataType */ +{ + UA_TYPENAME("WriterGroupDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15480}}, /* .typeId */ + sizeof(UA_WriterGroupDataType), /* .memSize */ + UA_TYPES_WRITERGROUPDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 16, /* .membersSize */ + 21150, /* .binaryEncodingId */ + WriterGroupDataType_members /* .members */ +}, +/* FieldTargetDataType */ +{ + UA_TYPENAME("FieldTargetDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {14744}}, /* .typeId */ + sizeof(UA_FieldTargetDataType), /* .memSize */ + UA_TYPES_FIELDTARGETDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ - 615, /* .binaryEncodingId */ - QueryFirstRequest_members /* .members */ + 7, /* .membersSize */ + 14848, /* .binaryEncodingId */ + FieldTargetDataType_members /* .members */ +}, +/* EnumDefinition */ +{ + UA_TYPENAME("EnumDefinition") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {100}}, /* .typeId */ + sizeof(UA_EnumDefinition), /* .memSize */ + UA_TYPES_ENUMDEFINITION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 1, /* .membersSize */ + 123, /* .binaryEncodingId */ + EnumDefinition_members /* .members */ +}, +/* DataChangeNotification */ +{ + UA_TYPENAME("DataChangeNotification") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {809}}, /* .typeId */ + sizeof(UA_DataChangeNotification), /* .memSize */ + UA_TYPES_DATACHANGENOTIFICATION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 2, /* .membersSize */ + 811, /* .binaryEncodingId */ + DataChangeNotification_members /* .members */ +}, +/* EventNotificationList */ +{ + UA_TYPENAME("EventNotificationList") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {914}}, /* .typeId */ + sizeof(UA_EventNotificationList), /* .memSize */ + UA_TYPES_EVENTNOTIFICATIONLIST, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 1, /* .membersSize */ + 916, /* .binaryEncodingId */ + EventNotificationList_members /* .members */ +}, +/* EnumDescription */ +{ + UA_TYPENAME("EnumDescription") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15488}}, /* .typeId */ + sizeof(UA_EnumDescription), /* .memSize */ + UA_TYPES_ENUMDESCRIPTION, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 4, /* .membersSize */ + 127, /* .binaryEncodingId */ + EnumDescription_members /* .members */ +}, +/* DataSetMetaDataType */ +{ + UA_TYPENAME("DataSetMetaDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {14523}}, /* .typeId */ + sizeof(UA_DataSetMetaDataType), /* .memSize */ + UA_TYPES_DATASETMETADATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 9, /* .membersSize */ + 124, /* .binaryEncodingId */ + DataSetMetaDataType_members /* .members */ +}, +/* DataSetReaderDataType */ +{ + UA_TYPENAME("DataSetReaderDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15623}}, /* .typeId */ + sizeof(UA_DataSetReaderDataType), /* .memSize */ + UA_TYPES_DATASETREADERDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 17, /* .membersSize */ + 15703, /* .binaryEncodingId */ + DataSetReaderDataType_members /* .members */ +}, +/* TargetVariablesDataType */ +{ + UA_TYPENAME("TargetVariablesDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15631}}, /* .typeId */ + sizeof(UA_TargetVariablesDataType), /* .memSize */ + UA_TYPES_TARGETVARIABLESDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 1, /* .membersSize */ + 15712, /* .binaryEncodingId */ + TargetVariablesDataType_members /* .members */ +}, +/* ReaderGroupDataType */ +{ + UA_TYPENAME("ReaderGroupDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15520}}, /* .typeId */ + sizeof(UA_ReaderGroupDataType), /* .memSize */ + UA_TYPES_READERGROUPDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 10, /* .membersSize */ + 21153, /* .binaryEncodingId */ + ReaderGroupDataType_members /* .members */ +}, +/* PubSubConnectionDataType */ +{ + UA_TYPENAME("PubSubConnectionDataType") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {15617}}, /* .typeId */ + sizeof(UA_PubSubConnectionDataType), /* .memSize */ + UA_TYPES_PUBSUBCONNECTIONDATATYPE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 9, /* .membersSize */ + 15694, /* .binaryEncodingId */ + PubSubConnectionDataType_members /* .members */ }, }; -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/build/src_generated/ua_transport_generated.c" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/transport_generated.c" ***********************************/ -/* Generated from Opc.Ua.Types.bsd, Custom.Opc.Ua.Transport.bsd with script /home/travis/build/open62541/open62541/tools/generate_datatypes.py - * on host travis-job-193db498-e14a-4886-911f-7172c9e50b7a by user travis at 2018-12-19 02:29:43 */ +/* Generated from Opc.Ua.Types.bsd, Custom.Opc.Ua.Transport.bsd with script /Users/jelena/Desktop/open62541/tools/generate_datatypes.py + * on host Jelena-2.local by user jelena at 2025-09-11 03:30:42 */ -/* SecureConversationMessageAbortBody */ -static UA_DataTypeMember SecureConversationMessageAbortBody_members[2] = { +/* MessageType */ +#define MessageType_members NULL + +/* ChunkType */ +#define ChunkType_members NULL + +/* TcpMessageHeader */ +static UA_DataTypeMember TcpMessageHeader_members[2] = { { - UA_TYPENAME("error") /* .memberName */ + UA_TYPENAME("MessageTypeAndChunkType") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("reason") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_SecureConversationMessageAbortBody, reason) - offsetof(UA_SecureConversationMessageAbortBody, error) - sizeof(UA_UInt32), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; - -/* SecureConversationMessageFooter */ -static UA_DataTypeMember SecureConversationMessageFooter_members[2] = { -{ - UA_TYPENAME("padding") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - 0, /* .padding */ - true, /* .namespaceZero */ - true /* .isArray */ -}, -{ - UA_TYPENAME("signature") /* .memberName */ - UA_TYPES_BYTE, /* .memberTypeIndex */ - offsetof(UA_SecureConversationMessageFooter, signature) - offsetof(UA_SecureConversationMessageFooter, padding) - sizeof(void*), /* .padding */ + UA_TYPENAME("MessageSize") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_TcpMessageHeader, messageSize) - offsetof(UA_TcpMessageHeader, messageTypeAndChunkType) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; /* TcpHelloMessage */ static UA_DataTypeMember TcpHelloMessage_members[6] = { { - UA_TYPENAME("protocolVersion") /* .memberName */ + UA_TYPENAME("ProtocolVersion") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("receiveBufferSize") /* .memberName */ + UA_TYPENAME("ReceiveBufferSize") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ offsetof(UA_TcpHelloMessage, receiveBufferSize) - offsetof(UA_TcpHelloMessage, protocolVersion) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("sendBufferSize") /* .memberName */ + UA_TYPENAME("SendBufferSize") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ offsetof(UA_TcpHelloMessage, sendBufferSize) - offsetof(UA_TcpHelloMessage, receiveBufferSize) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxMessageSize") /* .memberName */ + UA_TYPENAME("MaxMessageSize") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ offsetof(UA_TcpHelloMessage, maxMessageSize) - offsetof(UA_TcpHelloMessage, sendBufferSize) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxChunkCount") /* .memberName */ + UA_TYPENAME("MaxChunkCount") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ offsetof(UA_TcpHelloMessage, maxChunkCount) - offsetof(UA_TcpHelloMessage, maxMessageSize) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("endpointUrl") /* .memberName */ + UA_TYPENAME("EndpointUrl") /* .memberName */ UA_TYPES_STRING, /* .memberTypeIndex */ offsetof(UA_TcpHelloMessage, endpointUrl) - offsetof(UA_TcpHelloMessage, maxChunkCount) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* TcpErrorMessage */ -static UA_DataTypeMember TcpErrorMessage_members[2] = { +/* TcpAcknowledgeMessage */ +static UA_DataTypeMember TcpAcknowledgeMessage_members[5] = { { - UA_TYPENAME("error") /* .memberName */ + UA_TYPENAME("ProtocolVersion") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("reason") /* .memberName */ - UA_TYPES_STRING, /* .memberTypeIndex */ - offsetof(UA_TcpErrorMessage, reason) - offsetof(UA_TcpErrorMessage, error) - sizeof(UA_UInt32), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; - -/* MessageType */ -static UA_DataTypeMember MessageType_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("ReceiveBufferSize") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_TcpAcknowledgeMessage, receiveBufferSize) - offsetof(UA_TcpAcknowledgeMessage, protocolVersion) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* AsymmetricAlgorithmSecurityHeader */ -static UA_DataTypeMember AsymmetricAlgorithmSecurityHeader_members[3] = { +}, { - UA_TYPENAME("securityPolicyUri") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("SendBufferSize") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_TcpAcknowledgeMessage, sendBufferSize) - offsetof(UA_TcpAcknowledgeMessage, receiveBufferSize) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("senderCertificate") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_AsymmetricAlgorithmSecurityHeader, senderCertificate) - offsetof(UA_AsymmetricAlgorithmSecurityHeader, securityPolicyUri) - sizeof(UA_ByteString), /* .padding */ + UA_TYPENAME("MaxMessageSize") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_TcpAcknowledgeMessage, maxMessageSize) - offsetof(UA_TcpAcknowledgeMessage, sendBufferSize) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("receiverCertificateThumbprint") /* .memberName */ - UA_TYPES_BYTESTRING, /* .memberTypeIndex */ - offsetof(UA_AsymmetricAlgorithmSecurityHeader, receiverCertificateThumbprint) - offsetof(UA_AsymmetricAlgorithmSecurityHeader, senderCertificate) - sizeof(UA_ByteString), /* .padding */ + UA_TYPENAME("MaxChunkCount") /* .memberName */ + UA_TYPES_UINT32, /* .memberTypeIndex */ + offsetof(UA_TcpAcknowledgeMessage, maxChunkCount) - offsetof(UA_TcpAcknowledgeMessage, maxMessageSize) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* TcpAcknowledgeMessage */ -static UA_DataTypeMember TcpAcknowledgeMessage_members[5] = { +/* TcpErrorMessage */ +static UA_DataTypeMember TcpErrorMessage_members[2] = { { - UA_TYPENAME("protocolVersion") /* .memberName */ + UA_TYPENAME("Error") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("receiveBufferSize") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_TcpAcknowledgeMessage, receiveBufferSize) - offsetof(UA_TcpAcknowledgeMessage, protocolVersion) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("Reason") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_TcpErrorMessage, reason) - offsetof(UA_TcpErrorMessage, error) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ +},}; + +/* SecureConversationMessageHeader */ +static UA_DataTypeMember SecureConversationMessageHeader_members[2] = { +{ + UA_TYPENAME("MessageHeader") /* .memberName */ + UA_TRANSPORT_TCPMESSAGEHEADER, /* .memberTypeIndex */ + 0, /* .padding */ + false, /* .namespaceZero */ + false /* .isArray */ }, { - UA_TYPENAME("sendBufferSize") /* .memberName */ + UA_TYPENAME("SecureChannelId") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_TcpAcknowledgeMessage, sendBufferSize) - offsetof(UA_TcpAcknowledgeMessage, receiveBufferSize) - sizeof(UA_UInt32), /* .padding */ + offsetof(UA_SecureConversationMessageHeader, secureChannelId) - offsetof(UA_SecureConversationMessageHeader, messageHeader) - sizeof(UA_TcpMessageHeader), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +},}; + +/* AsymmetricAlgorithmSecurityHeader */ +static UA_DataTypeMember AsymmetricAlgorithmSecurityHeader_members[3] = { +{ + UA_TYPENAME("SecurityPolicyUri") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxMessageSize") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_TcpAcknowledgeMessage, maxMessageSize) - offsetof(UA_TcpAcknowledgeMessage, sendBufferSize) - sizeof(UA_UInt32), /* .padding */ + UA_TYPENAME("SenderCertificate") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_AsymmetricAlgorithmSecurityHeader, senderCertificate) - offsetof(UA_AsymmetricAlgorithmSecurityHeader, securityPolicyUri) - sizeof(UA_ByteString), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("maxChunkCount") /* .memberName */ + UA_TYPENAME("ReceiverCertificateThumbprint") /* .memberName */ + UA_TYPES_BYTESTRING, /* .memberTypeIndex */ + offsetof(UA_AsymmetricAlgorithmSecurityHeader, receiverCertificateThumbprint) - offsetof(UA_AsymmetricAlgorithmSecurityHeader, senderCertificate) - sizeof(UA_ByteString), /* .padding */ + true, /* .namespaceZero */ + false /* .isArray */ +},}; + +/* SymmetricAlgorithmSecurityHeader */ +static UA_DataTypeMember SymmetricAlgorithmSecurityHeader_members[1] = { +{ + UA_TYPENAME("TokenId") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_TcpAcknowledgeMessage, maxChunkCount) - offsetof(UA_TcpAcknowledgeMessage, maxMessageSize) - sizeof(UA_UInt32), /* .padding */ + 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; /* SequenceHeader */ static UA_DataTypeMember SequenceHeader_members[2] = { { - UA_TYPENAME("sequenceNumber") /* .memberName */ + UA_TYPENAME("SequenceNumber") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ }, { - UA_TYPENAME("requestId") /* .memberName */ + UA_TYPENAME("RequestId") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ offsetof(UA_SequenceHeader, requestId) - offsetof(UA_SequenceHeader, sequenceNumber) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* TcpMessageHeader */ -static UA_DataTypeMember TcpMessageHeader_members[2] = { +/* SecureConversationMessageFooter */ +static UA_DataTypeMember SecureConversationMessageFooter_members[2] = { { - UA_TYPENAME("messageTypeAndChunkType") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ + UA_TYPENAME("Padding") /* .memberName */ + UA_TYPES_BYTE, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ - false /* .isArray */ + true /* .isArray */ }, { - UA_TYPENAME("messageSize") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_TcpMessageHeader, messageSize) - offsetof(UA_TcpMessageHeader, messageTypeAndChunkType) - sizeof(UA_UInt32), /* .padding */ - true, /* .namespaceZero */ - false /* .isArray */ -}}; - -/* ChunkType */ -static UA_DataTypeMember ChunkType_members[1] = { -{ - UA_TYPENAME("") /* .memberName */ - UA_TYPES_INT32, /* .memberTypeIndex */ - 0, /* .padding */ + UA_TYPENAME("Signature") /* .memberName */ + UA_TYPES_BYTE, /* .memberTypeIndex */ + offsetof(UA_SecureConversationMessageFooter, signature) - offsetof(UA_SecureConversationMessageFooter, padding) - sizeof(void*), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; -/* SymmetricAlgorithmSecurityHeader */ -static UA_DataTypeMember SymmetricAlgorithmSecurityHeader_members[1] = { +/* SecureConversationMessageAbortBody */ +static UA_DataTypeMember SecureConversationMessageAbortBody_members[2] = { { - UA_TYPENAME("tokenId") /* .memberName */ + UA_TYPENAME("Error") /* .memberName */ UA_TYPES_UINT32, /* .memberTypeIndex */ 0, /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; - -/* SecureConversationMessageHeader */ -static UA_DataTypeMember SecureConversationMessageHeader_members[2] = { -{ - UA_TYPENAME("messageHeader") /* .memberName */ - UA_TRANSPORT_TCPMESSAGEHEADER, /* .memberTypeIndex */ - 0, /* .padding */ - false, /* .namespaceZero */ - false /* .isArray */ }, { - UA_TYPENAME("secureChannelId") /* .memberName */ - UA_TYPES_UINT32, /* .memberTypeIndex */ - offsetof(UA_SecureConversationMessageHeader, secureChannelId) - offsetof(UA_SecureConversationMessageHeader, messageHeader) - sizeof(UA_TcpMessageHeader), /* .padding */ + UA_TYPENAME("Reason") /* .memberName */ + UA_TYPES_STRING, /* .memberTypeIndex */ + offsetof(UA_SecureConversationMessageAbortBody, reason) - offsetof(UA_SecureConversationMessageAbortBody, error) - sizeof(UA_UInt32), /* .padding */ true, /* .namespaceZero */ false /* .isArray */ -}}; +},}; const UA_DataType UA_TRANSPORT[UA_TRANSPORT_COUNT] = { -/* SecureConversationMessageAbortBody */ +/* MessageType */ { - UA_TYPENAME("SecureConversationMessageAbortBody") /* .typeName */ + UA_TYPENAME("MessageType") /* .typeName */ {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ - sizeof(UA_SecureConversationMessageAbortBody), /* .memSize */ - UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ + sizeof(UA_MessageType), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ 0, /* .binaryEncodingId */ - SecureConversationMessageAbortBody_members /* .members */ + MessageType_members /* .members */ }, -/* SecureConversationMessageFooter */ +/* ChunkType */ { - UA_TYPENAME("SecureConversationMessageFooter") /* .typeName */ + UA_TYPENAME("ChunkType") /* .typeName */ {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ - sizeof(UA_SecureConversationMessageFooter), /* .memSize */ - UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER, /* .typeIndex */ + sizeof(UA_ChunkType), /* .memSize */ + UA_TYPES_INT32, /* .typeIndex */ + UA_DATATYPEKIND_ENUM, /* .typeKind */ + true, /* .pointerFree */ + UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 0, /* .membersSize */ + 0, /* .binaryEncodingId */ + ChunkType_members /* .members */ +}, +/* TcpMessageHeader */ +{ + UA_TYPENAME("TcpMessageHeader") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ + sizeof(UA_TcpMessageHeader), /* .memSize */ + UA_TRANSPORT_TCPMESSAGEHEADER, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + true, /* .pointerFree */ + true + && UA_BINARY_OVERLAYABLE_INTEGER + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_TcpMessageHeader, messageSize) == (offsetof(UA_TcpMessageHeader, messageTypeAndChunkType) + sizeof(UA_UInt32)), /* .overlayable */ 2, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ 0, /* .binaryEncodingId */ - SecureConversationMessageFooter_members /* .members */ + TcpMessageHeader_members /* .members */ }, /* TcpHelloMessage */ { @@ -16817,60 +19495,20 @@ const UA_DataType UA_TRANSPORT[UA_TRANSPORT_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ sizeof(UA_TcpHelloMessage), /* .memSize */ UA_TRANSPORT_TCPHELLOMESSAGE, /* .typeIndex */ - 6, /* .membersSize */ - false, /* .builtin */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ false, /* .pointerFree */ false, /* .overlayable */ + 6, /* .membersSize */ 0, /* .binaryEncodingId */ TcpHelloMessage_members /* .members */ }, -/* TcpErrorMessage */ -{ - UA_TYPENAME("TcpErrorMessage") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ - sizeof(UA_TcpErrorMessage), /* .memSize */ - UA_TRANSPORT_TCPERRORMESSAGE, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 0, /* .binaryEncodingId */ - TcpErrorMessage_members /* .members */ -}, -/* MessageType */ -{ - UA_TYPENAME("MessageType") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ - sizeof(UA_MessageType), /* .memSize */ - UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ - true, /* .pointerFree */ - UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ - 0, /* .binaryEncodingId */ - MessageType_members /* .members */ -}, -/* AsymmetricAlgorithmSecurityHeader */ -{ - UA_TYPENAME("AsymmetricAlgorithmSecurityHeader") /* .typeName */ - {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ - sizeof(UA_AsymmetricAlgorithmSecurityHeader), /* .memSize */ - UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER, /* .typeIndex */ - 3, /* .membersSize */ - false, /* .builtin */ - false, /* .pointerFree */ - false, /* .overlayable */ - 0, /* .binaryEncodingId */ - AsymmetricAlgorithmSecurityHeader_members /* .members */ -}, /* TcpAcknowledgeMessage */ { UA_TYPENAME("TcpAcknowledgeMessage") /* .typeName */ {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ sizeof(UA_TcpAcknowledgeMessage), /* .memSize */ UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE, /* .typeIndex */ - 5, /* .membersSize */ - false, /* .builtin */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ true, /* .pointerFree */ true && UA_BINARY_OVERLAYABLE_INTEGER @@ -16882,53 +19520,54 @@ const UA_DataType UA_TRANSPORT[UA_TRANSPORT_COUNT] = { && offsetof(UA_TcpAcknowledgeMessage, maxMessageSize) == (offsetof(UA_TcpAcknowledgeMessage, sendBufferSize) + sizeof(UA_UInt32)) && UA_BINARY_OVERLAYABLE_INTEGER && offsetof(UA_TcpAcknowledgeMessage, maxChunkCount) == (offsetof(UA_TcpAcknowledgeMessage, maxMessageSize) + sizeof(UA_UInt32)), /* .overlayable */ + 5, /* .membersSize */ 0, /* .binaryEncodingId */ TcpAcknowledgeMessage_members /* .members */ }, -/* SequenceHeader */ +/* TcpErrorMessage */ { - UA_TYPENAME("SequenceHeader") /* .typeName */ + UA_TYPENAME("TcpErrorMessage") /* .typeName */ {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ - sizeof(UA_SequenceHeader), /* .memSize */ - UA_TRANSPORT_SEQUENCEHEADER, /* .typeIndex */ + sizeof(UA_TcpErrorMessage), /* .memSize */ + UA_TRANSPORT_TCPERRORMESSAGE, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ 2, /* .membersSize */ - false, /* .builtin */ - true, /* .pointerFree */ - true - && UA_BINARY_OVERLAYABLE_INTEGER - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_SequenceHeader, requestId) == (offsetof(UA_SequenceHeader, sequenceNumber) + sizeof(UA_UInt32)), /* .overlayable */ 0, /* .binaryEncodingId */ - SequenceHeader_members /* .members */ + TcpErrorMessage_members /* .members */ }, -/* TcpMessageHeader */ +/* SecureConversationMessageHeader */ { - UA_TYPENAME("TcpMessageHeader") /* .typeName */ + UA_TYPENAME("SecureConversationMessageHeader") /* .typeName */ {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ - sizeof(UA_TcpMessageHeader), /* .memSize */ - UA_TRANSPORT_TCPMESSAGEHEADER, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + sizeof(UA_SecureConversationMessageHeader), /* .memSize */ + UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ true, /* .pointerFree */ true + && true && UA_BINARY_OVERLAYABLE_INTEGER && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_TcpMessageHeader, messageSize) == (offsetof(UA_TcpMessageHeader, messageTypeAndChunkType) + sizeof(UA_UInt32)), /* .overlayable */ + && offsetof(UA_TcpMessageHeader, messageSize) == (offsetof(UA_TcpMessageHeader, messageTypeAndChunkType) + sizeof(UA_UInt32)) + && UA_BINARY_OVERLAYABLE_INTEGER + && offsetof(UA_SecureConversationMessageHeader, secureChannelId) == (offsetof(UA_SecureConversationMessageHeader, messageHeader) + sizeof(UA_TcpMessageHeader)), /* .overlayable */ + 2, /* .membersSize */ 0, /* .binaryEncodingId */ - TcpMessageHeader_members /* .members */ + SecureConversationMessageHeader_members /* .members */ }, -/* ChunkType */ +/* AsymmetricAlgorithmSecurityHeader */ { - UA_TYPENAME("ChunkType") /* .typeName */ + UA_TYPENAME("AsymmetricAlgorithmSecurityHeader") /* .typeName */ {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ - sizeof(UA_ChunkType), /* .memSize */ - UA_TYPES_INT32, /* .typeIndex */ - 1, /* .membersSize */ - true, /* .builtin */ - true, /* .pointerFree */ - UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + sizeof(UA_AsymmetricAlgorithmSecurityHeader), /* .memSize */ + UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 3, /* .membersSize */ 0, /* .binaryEncodingId */ - ChunkType_members /* .members */ + AsymmetricAlgorithmSecurityHeader_members /* .members */ }, /* SymmetricAlgorithmSecurityHeader */ { @@ -16936,48 +19575,67 @@ const UA_DataType UA_TRANSPORT[UA_TRANSPORT_COUNT] = { {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ sizeof(UA_SymmetricAlgorithmSecurityHeader), /* .memSize */ UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER, /* .typeIndex */ - 1, /* .membersSize */ - false, /* .builtin */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ true, /* .pointerFree */ true && UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ + 1, /* .membersSize */ 0, /* .binaryEncodingId */ SymmetricAlgorithmSecurityHeader_members /* .members */ }, -/* SecureConversationMessageHeader */ +/* SequenceHeader */ { - UA_TYPENAME("SecureConversationMessageHeader") /* .typeName */ + UA_TYPENAME("SequenceHeader") /* .typeName */ {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ - sizeof(UA_SecureConversationMessageHeader), /* .memSize */ - UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER, /* .typeIndex */ - 2, /* .membersSize */ - false, /* .builtin */ + sizeof(UA_SequenceHeader), /* .memSize */ + UA_TRANSPORT_SEQUENCEHEADER, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ true, /* .pointerFree */ true - && true && UA_BINARY_OVERLAYABLE_INTEGER && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_TcpMessageHeader, messageSize) == (offsetof(UA_TcpMessageHeader, messageTypeAndChunkType) + sizeof(UA_UInt32)) - && UA_BINARY_OVERLAYABLE_INTEGER - && offsetof(UA_SecureConversationMessageHeader, secureChannelId) == (offsetof(UA_SecureConversationMessageHeader, messageHeader) + sizeof(UA_TcpMessageHeader)), /* .overlayable */ + && offsetof(UA_SequenceHeader, requestId) == (offsetof(UA_SequenceHeader, sequenceNumber) + sizeof(UA_UInt32)), /* .overlayable */ + 2, /* .membersSize */ 0, /* .binaryEncodingId */ - SecureConversationMessageHeader_members /* .members */ + SequenceHeader_members /* .members */ +}, +/* SecureConversationMessageFooter */ +{ + UA_TYPENAME("SecureConversationMessageFooter") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ + sizeof(UA_SecureConversationMessageFooter), /* .memSize */ + UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 2, /* .membersSize */ + 0, /* .binaryEncodingId */ + SecureConversationMessageFooter_members /* .members */ +}, +/* SecureConversationMessageAbortBody */ +{ + UA_TYPENAME("SecureConversationMessageAbortBody") /* .typeName */ + {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ + sizeof(UA_SecureConversationMessageAbortBody), /* .memSize */ + UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY, /* .typeIndex */ + UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ + false, /* .pointerFree */ + false, /* .overlayable */ + 2, /* .membersSize */ + 0, /* .binaryEncodingId */ + SecureConversationMessageAbortBody_members /* .members */ }, }; -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/build/src_generated/ua_statuscode_descriptions.c" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/statuscodes.c" ***********************************/ /********************************************************** * Autogenerated -- do not modify - * Generated from /home/travis/build/open62541/open62541/tools/schema/Opc.Ua.StatusCodes.csv with script /home/travis/build/open62541/open62541/tools/generate_statuscode_descriptions.py + * Generated from /Users/jelena/Desktop/open62541/tools/schema/StatusCode.csv with script /Users/jelena/Desktop/open62541/tools/generate_statuscode_descriptions.py *********************************************************/ - -/* Definition for the deprecated StatusCode description API */ -const UA_StatusCodeDescription statusCodeExplanation_default = {0xffffffff, "", ""}; - typedef struct { UA_StatusCode code; const char *name; @@ -16989,10 +19647,9 @@ const char * UA_StatusCode_name(UA_StatusCode code) { return emptyStatusCodeName; } #else -static const size_t statusCodeDescriptionsSize = 229; -static const UA_StatusCodeName statusCodeDescriptions[229] = { +static const size_t statusCodeDescriptionsSize = 237; +static const UA_StatusCodeName statusCodeDescriptions[237] = { {UA_STATUSCODE_GOOD, "Good"}, - {UA_STATUSCODE_BADUNEXPECTEDERROR, "BadUnexpectedError"}, {UA_STATUSCODE_BADINTERNALERROR, "BadInternalError"}, {UA_STATUSCODE_BADOUTOFMEMORY, "BadOutOfMemory"}, @@ -17015,6 +19672,7 @@ static const UA_StatusCodeName statusCodeDescriptions[229] = { {UA_STATUSCODE_BADDATATYPEIDUNKNOWN, "BadDataTypeIdUnknown"}, {UA_STATUSCODE_BADCERTIFICATEINVALID, "BadCertificateInvalid"}, {UA_STATUSCODE_BADSECURITYCHECKSFAILED, "BadSecurityChecksFailed"}, + {UA_STATUSCODE_BADCERTIFICATEPOLICYCHECKFAILED, "BadCertificatePolicyCheckFailed"}, {UA_STATUSCODE_BADCERTIFICATETIMEINVALID, "BadCertificateTimeInvalid"}, {UA_STATUSCODE_BADCERTIFICATEISSUERTIMEINVALID, "BadCertificateIssuerTimeInvalid"}, {UA_STATUSCODE_BADCERTIFICATEHOSTNAMEINVALID, "BadCertificateHostNameInvalid"}, @@ -17041,6 +19699,9 @@ static const UA_StatusCodeName statusCodeDescriptions[229] = { {UA_STATUSCODE_BADTIMESTAMPSTORETURNINVALID, "BadTimestampsToReturnInvalid"}, {UA_STATUSCODE_BADREQUESTCANCELLEDBYCLIENT, "BadRequestCancelledByClient"}, {UA_STATUSCODE_BADTOOMANYARGUMENTS, "BadTooManyArguments"}, + {UA_STATUSCODE_BADLICENSEEXPIRED, "BadLicenseExpired"}, + {UA_STATUSCODE_BADLICENSELIMITSEXCEEDED, "BadLicenseLimitsExceeded"}, + {UA_STATUSCODE_BADLICENSENOTAVAILABLE, "BadLicenseNotAvailable"}, {UA_STATUSCODE_GOODSUBSCRIPTIONTRANSFERRED, "GoodSubscriptionTransferred"}, {UA_STATUSCODE_GOODCOMPLETESASYNCHRONOUSLY, "GoodCompletesAsynchronously"}, {UA_STATUSCODE_GOODOVERLOAD, "GoodOverload"}, @@ -17080,6 +19741,7 @@ static const UA_StatusCodeName statusCodeDescriptions[229] = { {UA_STATUSCODE_BADREFERENCETYPEIDINVALID, "BadReferenceTypeIdInvalid"}, {UA_STATUSCODE_BADBROWSEDIRECTIONINVALID, "BadBrowseDirectionInvalid"}, {UA_STATUSCODE_BADNODENOTINVIEW, "BadNodeNotInView"}, + {UA_STATUSCODE_BADNUMERICOVERFLOW, "BadNumericOverflow"}, {UA_STATUSCODE_BADSERVERURIINVALID, "BadServerUriInvalid"}, {UA_STATUSCODE_BADSERVERNAMEMISSING, "BadServerNameMissing"}, {UA_STATUSCODE_BADDISCOVERYURLMISSING, "BadDiscoveryUrlMissing"}, @@ -17130,6 +19792,7 @@ static const UA_StatusCodeName statusCodeDescriptions[229] = { {UA_STATUSCODE_BADTYPEMISMATCH, "BadTypeMismatch"}, {UA_STATUSCODE_BADMETHODINVALID, "BadMethodInvalid"}, {UA_STATUSCODE_BADARGUMENTSMISSING, "BadArgumentsMissing"}, + {UA_STATUSCODE_BADNOTEXECUTABLE, "BadNotExecutable"}, {UA_STATUSCODE_BADTOOMANYSUBSCRIPTIONS, "BadTooManySubscriptions"}, {UA_STATUSCODE_BADTOOMANYPUBLISHREQUESTS, "BadTooManyPublishRequests"}, {UA_STATUSCODE_BADNOSUBSCRIPTION, "BadNoSubscription"}, @@ -17137,6 +19800,7 @@ static const UA_StatusCodeName statusCodeDescriptions[229] = { {UA_STATUSCODE_BADMESSAGENOTAVAILABLE, "BadMessageNotAvailable"}, {UA_STATUSCODE_BADINSUFFICIENTCLIENTPROFILE, "BadInsufficientClientProfile"}, {UA_STATUSCODE_BADSTATENOTACTIVE, "BadStateNotActive"}, + {UA_STATUSCODE_BADALREADYEXISTS, "BadAlreadyExists"}, {UA_STATUSCODE_BADTCPSERVERTOOBUSY, "BadTcpServerTooBusy"}, {UA_STATUSCODE_BADTCPMESSAGETYPEINVALID, "BadTcpMessageTypeInvalid"}, {UA_STATUSCODE_BADTCPSECURECHANNELUNKNOWN, "BadTcpSecureChannelUnknown"}, @@ -17196,6 +19860,7 @@ static const UA_StatusCodeName statusCodeDescriptions[229] = { {UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED, "BadAggregateConfigurationRejected"}, {UA_STATUSCODE_GOODDATAIGNORED, "GoodDataIgnored"}, {UA_STATUSCODE_BADREQUESTNOTALLOWED, "BadRequestNotAllowed"}, + {UA_STATUSCODE_BADREQUESTNOTCOMPLETE, "BadRequestNotComplete"}, {UA_STATUSCODE_GOODEDITED, "GoodEdited"}, {UA_STATUSCODE_GOODPOSTACTIONFAILED, "GoodPostActionFailed"}, {UA_STATUSCODE_UNCERTAINDOMINANTVALUECHANGED, "UncertainDominantValueChanged"}, @@ -17233,20 +19898,22 @@ const char * UA_StatusCode_name(UA_StatusCode code) { #endif -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/ua_util.c" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/ua_util.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014, 2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014, 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2014 (c) Florian Palm * Copyright 2017 (c) Stefan Profanter, fortiss GmbH */ + + size_t -UA_readNumber(u8 *buf, size_t buflen, u32 *number) { +UA_readNumberWithBase(const UA_Byte *buf, size_t buflen, UA_UInt32 *number, UA_Byte base) { UA_assert(buf); UA_assert(number); u32 n = 0; @@ -17254,24 +19921,37 @@ UA_readNumber(u8 *buf, size_t buflen, u32 *number) { /* read numbers until the end or a non-number character appears */ while(progress < buflen) { u8 c = buf[progress]; - if(c < '0' || c > '9') - break; - n = (n*10) + (u32)(c-'0'); + if(c >= '0' && c <= '9' && c <= '0' + (base-1)) + n = (n * base) + c - '0'; + else if(base > 9 && c >= 'a' && c <= 'z' && c <= 'a' + (base-11)) + n = (n * base) + c-'a' + 10; + else if(base > 9 && c >= 'A' && c <= 'Z' && c <= 'A' + (base-11)) + n = (n * base) + c-'A' + 10; + else + break; ++progress; } *number = n; return progress; } +size_t +UA_readNumber(UA_Byte *buf, size_t buflen, UA_UInt32 *number) +{ + return UA_readNumberWithBase(buf, buflen, number, 10); +} + UA_StatusCode UA_parseEndpointUrl(const UA_String *endpointUrl, UA_String *outHostname, u16 *outPort, UA_String *outPath) { /* Url must begin with "opc.tcp://" or opc.udp:// (if pubsub enabled) */ if(endpointUrl->length < 11) { return UA_STATUSCODE_BADTCPENDPOINTURLINVALID; - } else if (strncmp((char*)endpointUrl->data, "opc.tcp://", 10) != 0) { + } + if (strncmp((char*)endpointUrl->data, "opc.tcp://", 10) != 0) { #ifdef UA_ENABLE_PUBSUB - if (strncmp((char*)endpointUrl->data, "opc.udp://", 10) != 0) { + if (strncmp((char*)endpointUrl->data, "opc.udp://", 10) != 0 && + strncmp((char*)endpointUrl->data, "opc.mqtt://", 11) != 0) { return UA_STATUSCODE_BADTCPENDPOINTURLINVALID; } #else @@ -17336,404 +20016,700 @@ UA_parseEndpointUrl(const UA_String *endpointUrl, UA_String *outHostname, return UA_STATUSCODE_GOOD; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/ua_timer.c" ***********************************/ +UA_StatusCode +UA_parseEndpointUrlEthernet(const UA_String *endpointUrl, UA_String *target, + UA_UInt16 *vid, UA_Byte *pcp) { + /* Url must begin with "opc.eth://" */ + if(endpointUrl->length < 11) { + return UA_STATUSCODE_BADINTERNALERROR; + } + if(strncmp((char*) endpointUrl->data, "opc.eth://", 10) != 0) { + return UA_STATUSCODE_BADINTERNALERROR; + } + + /* Where does the host address end? */ + size_t curr = 10; + for(; curr < endpointUrl->length; ++curr) { + if(endpointUrl->data[curr] == ':') { + break; + } + } -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - */ + /* set host address */ + target->data = &endpointUrl->data[10]; + target->length = curr - 10; + if(curr == endpointUrl->length) { + return UA_STATUSCODE_GOOD; + } + /* Set VLAN */ + u32 value = 0; + curr++; /* skip ':' */ + size_t progress = UA_readNumber(&endpointUrl->data[curr], + endpointUrl->length - curr, &value); + if(progress == 0 || value > 4096) { + return UA_STATUSCODE_BADINTERNALERROR; + } + curr += progress; + if(curr == endpointUrl->length || endpointUrl->data[curr] == '.') { + *vid = (UA_UInt16) value; + } + if(curr == endpointUrl->length) { + return UA_STATUSCODE_GOOD; + } -/* Only one thread operates on the repeated jobs. This is usually the "main" - * thread with the event loop. All other threads introduce changes via a - * multi-producer single-consumer (MPSC) queue. The queue is based on a design - * by Dmitry Vyukov. - * http://www.1024cores.net/home/lock-free-algorithms/queues/intrusive-mpsc-node-based-queue - * - * The RepeatedCallback structure is used both in the sorted list of callbacks - * and in the MPSC changes queue. For the changes queue, we differentiate - * between three cases encoded in the callback pointer. - * - * callback > 0x01: add the new repeated callback to the sorted list - * callback == 0x00: remove the callback with the same id - * callback == 0x01: change the interval of the existing callback */ + /* Set priority */ + if(endpointUrl->data[curr] != '.') { + return UA_STATUSCODE_BADINTERNALERROR; + } + curr++; /* skip '.' */ + progress = UA_readNumber(&endpointUrl->data[curr], + endpointUrl->length - curr, &value); + if(progress == 0 || value > 7) { + return UA_STATUSCODE_BADINTERNALERROR; + } + curr += progress; + if(curr != endpointUrl->length) { + return UA_STATUSCODE_BADINTERNALERROR; + } + *pcp = (UA_Byte) value; -#define REMOVE_SENTINEL 0x00 -#define CHANGE_SENTINEL 0x01 + return UA_STATUSCODE_GOOD; +} -struct UA_TimerCallbackEntry { - SLIST_ENTRY(UA_TimerCallbackEntry) next; /* Next element in the list */ - UA_DateTime nextTime; /* The next time when the callbacks - * are to be executed */ - UA_UInt64 interval; /* Interval in 100ns resolution */ - UA_UInt64 id; /* Id of the repeated callback */ +UA_StatusCode UA_ByteString_toBase64String(const UA_ByteString *byteString, UA_String *str) { + if (str->length != 0) { + UA_free(str->data); + str->data = NULL; + str->length = 0; + } + if (byteString == NULL || byteString->data == NULL) + return UA_STATUSCODE_GOOD; + if (byteString == str) + return UA_STATUSCODE_BADINVALIDARGUMENT; - UA_TimerCallback callback; - void *data; -}; + str->data = (UA_Byte*)UA_base64(byteString->data, + byteString->length, &str->length); + if(str->data == NULL) + return UA_STATUSCODE_BADOUTOFMEMORY; -void -UA_Timer_init(UA_Timer *t) { - SLIST_INIT(&t->repeatedCallbacks); - t->changes_head = (UA_TimerCallbackEntry*)&t->changes_stub; - t->changes_tail = (UA_TimerCallbackEntry*)&t->changes_stub; - t->changes_stub = NULL; - t->idCounter = 0; + return UA_STATUSCODE_GOOD; } -static void -enqueueChange(UA_Timer *t, UA_TimerCallbackEntry *tc) { - tc->next.sle_next = NULL; - UA_TimerCallbackEntry *prev = (UA_TimerCallbackEntry*) - UA_atomic_xchg((void * volatile *)&t->changes_head, tc); - /* Nothing can be dequeued while the producer is blocked here */ - prev->next.sle_next = tc; /* Once this change is visible in the consumer, - * the node is dequeued in the following - * iteration */ -} - -static UA_TimerCallbackEntry * -dequeueChange(UA_Timer *t) { - UA_TimerCallbackEntry *tail = t->changes_tail; - UA_TimerCallbackEntry *next = tail->next.sle_next; - if(tail == (UA_TimerCallbackEntry*)&t->changes_stub) { - if(!next) - return NULL; - t->changes_tail = next; - tail = next; - next = next->next.sle_next; +UA_StatusCode +UA_NodeId_toString(const UA_NodeId *nodeId, UA_String *nodeIdStr) { + if (nodeIdStr->length != 0) { + UA_free(nodeIdStr->data); + nodeIdStr->data = NULL; + nodeIdStr->length = 0; } - if(next) { - t->changes_tail = next; - return tail; + if (nodeId == NULL) + return UA_STATUSCODE_GOOD; + + char *nsStr = NULL; + long snprintfLen = 0; + size_t nsLen = 0; + if (nodeId->namespaceIndex != 0) { + nsStr = (char*)UA_malloc(9+1); // strlen("ns=XXXXX;") = 9 + Nullbyte + snprintfLen = UA_snprintf(nsStr, 10, "ns=%d;", nodeId->namespaceIndex); + if (snprintfLen < 0 || snprintfLen >= 10) { + UA_free(nsStr); + return UA_STATUSCODE_BADINTERNALERROR; + } + nsLen = (size_t)(snprintfLen); } - UA_TimerCallbackEntry* head = t->changes_head; - if(tail != head) - return NULL; - enqueueChange(t, (UA_TimerCallbackEntry*)&t->changes_stub); - next = tail->next.sle_next; - if(next) { - t->changes_tail = next; - return tail; + + + UA_ByteString byteStr = UA_BYTESTRING_NULL; + switch (nodeId->identifierType) { + case UA_NODEIDTYPE_NUMERIC: + /* ns (2 byte, 65535) = 5 chars, numeric (4 byte, 4294967295) = 10 chars, delim = 1 , nullbyte = 1-> 17 chars */ + nodeIdStr->length = nsLen + 2 + 10 + 1; + nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length); + if (nodeIdStr->data == NULL) { + nodeIdStr->length = 0; + UA_free(nsStr); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + snprintfLen =UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%si=%lu", + nsLen > 0 ? nsStr : "", + (unsigned long )nodeId->identifier.numeric); + break; + case UA_NODEIDTYPE_STRING: + /* ns (16bit) = 5 chars, strlen + nullbyte */ + nodeIdStr->length = nsLen + 2 + nodeId->identifier.string.length + 1; + nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length); + if (nodeIdStr->data == NULL) { + nodeIdStr->length = 0; + UA_free(nsStr); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + snprintfLen =UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%ss=%.*s", + nsLen > 0 ? nsStr : "", + (int)nodeId->identifier.string.length, nodeId->identifier.string.data); + break; + case UA_NODEIDTYPE_GUID: + /* ns (16bit) = 5 chars + strlen(A123456C-0ABC-1A2B-815F-687212AAEE1B)=36 + nullbyte */ + nodeIdStr->length = nsLen + 2 + 36 + 1; + nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length); + if (nodeIdStr->data == NULL) { + nodeIdStr->length = 0; + UA_free(nsStr); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + snprintfLen = UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%sg=" UA_PRINTF_GUID_FORMAT, + nsLen > 0 ? nsStr : "", + UA_PRINTF_GUID_DATA(nodeId->identifier.guid)); + break; + case UA_NODEIDTYPE_BYTESTRING: + UA_ByteString_toBase64String(&nodeId->identifier.byteString, &byteStr); + /* ns (16bit) = 5 chars + LEN + nullbyte */ + nodeIdStr->length = nsLen + 2 + byteStr.length + 1; + nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length); + if (nodeIdStr->data == NULL) { + nodeIdStr->length = 0; + UA_String_deleteMembers(&byteStr); + UA_free(nsStr); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + snprintfLen = UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%sb=%.*s", + nsLen > 0 ? nsStr : "", + (int)byteStr.length, byteStr.data); + UA_String_deleteMembers(&byteStr); + break; } - return NULL; -} + UA_free(nsStr); -/* Adding repeated callbacks: Add an entry with the "nextTime" timestamp in the - * future. This will be picked up in the next iteration and inserted at the - * correct place. So that the next execution takes place ät "nextTime". */ -UA_StatusCode -UA_Timer_addRepeatedCallback(UA_Timer *t, UA_TimerCallback callback, - void *data, UA_UInt32 interval, - UA_UInt64 *callbackId) { - /* A callback method needs to be present */ - if(!callback) + if (snprintfLen < 0 || snprintfLen >= (long) nodeIdStr->length) { + UA_free(nodeIdStr->data); + nodeIdStr->data = NULL; + nodeIdStr->length = 0; return UA_STATUSCODE_BADINTERNALERROR; + } + nodeIdStr->length = (size_t)snprintfLen; - /* The interval needs to be at least 5ms */ - if(interval < 5) - return UA_STATUSCODE_BADINTERNALERROR; + return UA_STATUSCODE_GOOD; +} - /* Allocate the repeated callback structure */ - UA_TimerCallbackEntry *tc = - (UA_TimerCallbackEntry*)UA_malloc(sizeof(UA_TimerCallbackEntry)); - if(!tc) - return UA_STATUSCODE_BADOUTOFMEMORY; - /* Set the repeated callback */ - tc->interval = (UA_UInt64)interval * UA_DATETIME_MSEC; - tc->id = ++t->idCounter; - tc->callback = callback; - tc->data = data; - tc->nextTime = UA_DateTime_nowMonotonic() + (UA_DateTime)tc->interval; +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/ua_workqueue.c" ***********************************/ - /* Set the output identifier */ - if(callbackId) - *callbackId = tc->id; +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2014-2016 (c) Sten Grüner + * Copyright 2015 (c) Chris Iatrou + * Copyright 2015 (c) Nick Goossens + * Copyright 2015 (c) Jörg Schüler-Maroldt + * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2016-2017 (c) Florian Palm + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2016 (c) Lorenz Haas + * Copyright 2017 (c) Jonas Green + */ - /* Enqueue the changes in the MPSC queue */ - enqueueChange(t, tc); - return UA_STATUSCODE_GOOD; + +void UA_WorkQueue_init(UA_WorkQueue *wq) { + /* Initialized the linked list for delayed callbacks */ + SIMPLEQ_INIT(&wq->delayedCallbacks); + +#ifdef UA_ENABLE_MULTITHREADING + wq->delayedCallbacks_checkpoint = NULL; + pthread_mutex_init(&wq->delayedCallbacks_accessMutex, NULL); + + /* Initialize the dispatch queue for worker threads */ + SIMPLEQ_INIT(&wq->dispatchQueue); + pthread_mutex_init(&wq->dispatchQueue_accessMutex, NULL); + pthread_cond_init(&wq->dispatchQueue_condition, NULL); + pthread_mutex_init(&wq->dispatchQueue_conditionMutex, NULL); +#endif } -static void -addTimerCallbackEntry(UA_Timer *t, UA_TimerCallbackEntry * UA_RESTRICT tc) { - /* Find the last entry before this callback */ - UA_TimerCallbackEntry *tmpTc, *afterTc = NULL; - SLIST_FOREACH(tmpTc, &t->repeatedCallbacks, next) { - if(tmpTc->nextTime >= tc->nextTime) - break; +#ifdef UA_ENABLE_MULTITHREADING +/* Forward declaration */ +static void UA_WorkQueue_manuallyProcessDelayed(UA_WorkQueue *wq); +#endif + +void UA_WorkQueue_cleanup(UA_WorkQueue *wq) { +#ifdef UA_ENABLE_MULTITHREADING + /* Shut down workers */ + UA_WorkQueue_stop(wq); - /* The goal is to have many repeated callbacks with the same repetition - * interval in a "block" in order to reduce linear search for re-entry - * to the sorted list after processing. Allow the first execution to lie - * between "nextTime - 1s" and "nextTime" if this adjustment groups - * callbacks with the same repetition interval. - * Callbacks of a block are added in reversed order. This design allows - * the monitored items of a subscription (if created in a sequence with the - * same publish/sample interval) to be executed before the subscription - * publish the notifications */ - if(tmpTc->interval == tc->interval && - tmpTc->nextTime > (tc->nextTime - UA_DATETIME_SEC)) { - tc->nextTime = tmpTc->nextTime; + /* Execute remaining work in the dispatch queue */ + while(true) { + pthread_mutex_lock(&wq->dispatchQueue_accessMutex); + UA_DelayedCallback *dc = SIMPLEQ_FIRST(&wq->dispatchQueue); + if(!dc) { + pthread_mutex_unlock(&wq->dispatchQueue_accessMutex); break; } + SIMPLEQ_REMOVE_HEAD(&wq->dispatchQueue, next); + pthread_mutex_unlock(&wq->dispatchQueue_accessMutex); + dc->callback(dc->application, dc->data); + UA_free(dc); + } +#endif + + /* All workers are shut down. Execute remaining delayed work here. */ + UA_WorkQueue_manuallyProcessDelayed(wq); + +#ifdef UA_ENABLE_MULTITHREADING + wq->delayedCallbacks_checkpoint = NULL; + pthread_mutex_destroy(&wq->dispatchQueue_accessMutex); + pthread_cond_destroy(&wq->dispatchQueue_condition); + pthread_mutex_destroy(&wq->dispatchQueue_conditionMutex); + pthread_mutex_destroy(&wq->delayedCallbacks_accessMutex); +#endif +} + +/***********/ +/* Workers */ +/***********/ + +#ifdef UA_ENABLE_MULTITHREADING + +static void * +workerLoop(UA_Worker *worker) { + UA_WorkQueue *wq = worker->queue; + UA_UInt32 *counter = &worker->counter; + volatile UA_Boolean *running = &worker->running; + + /* Initialize the (thread local) random seed with the ram address + * of the worker. Not for security-critical entropy! */ + UA_random_seed((uintptr_t)worker); + + while(*running) { + UA_atomic_addUInt32(counter, 1); + + /* Remove a callback from the queue */ + pthread_mutex_lock(&wq->dispatchQueue_accessMutex); + UA_DelayedCallback *dc = SIMPLEQ_FIRST(&wq->dispatchQueue); + if(dc) + SIMPLEQ_REMOVE_HEAD(&wq->dispatchQueue, next); + pthread_mutex_unlock(&wq->dispatchQueue_accessMutex); + + /* Nothing to do. Sleep until a callback is dispatched */ + if(!dc) { + pthread_mutex_lock(&wq->dispatchQueue_conditionMutex); + pthread_cond_wait(&wq->dispatchQueue_condition, + &wq->dispatchQueue_conditionMutex); + pthread_mutex_unlock(&wq->dispatchQueue_conditionMutex); + continue; + } - /* tc is neither in the same interval nor supposed to be executed sooner - * than tmpTc. Update afterTc to push tc further back in the timer list. */ - afterTc = tmpTc; + /* Execute */ + if(dc->callback) + dc->callback(dc->application, dc->data); + UA_free(dc); } - /* Add the repeated callback */ - if(afterTc) - SLIST_INSERT_AFTER(afterTc, tc, next); - else - SLIST_INSERT_HEAD(&t->repeatedCallbacks, tc, next); + return NULL; } +/* Can be called repeatedly and starts additional workers */ UA_StatusCode -UA_Timer_changeRepeatedCallbackInterval(UA_Timer *t, UA_UInt64 callbackId, - UA_UInt32 interval) { - /* The interval needs to be at least 5ms */ - if(interval < 5) +UA_WorkQueue_start(UA_WorkQueue *wq, size_t workersCount) { + if(wq->workersSize > 0 || workersCount == 0) return UA_STATUSCODE_BADINTERNALERROR; - - /* Allocate the repeated callback structure */ - UA_TimerCallbackEntry *tc = - (UA_TimerCallbackEntry*)UA_malloc(sizeof(UA_TimerCallbackEntry)); - if(!tc) + + /* Create the worker array */ + wq->workers = (UA_Worker*)UA_calloc(workersCount, sizeof(UA_Worker)); + if(!wq->workers) return UA_STATUSCODE_BADOUTOFMEMORY; + wq->workersSize = workersCount; - /* Set the repeated callback */ - tc->interval = (UA_UInt64)interval * UA_DATETIME_MSEC; - tc->id = callbackId; - tc->nextTime = UA_DateTime_nowMonotonic() + (UA_DateTime)tc->interval; - tc->callback = (UA_TimerCallback)CHANGE_SENTINEL; - - /* Enqueue the changes in the MPSC queue */ - enqueueChange(t, tc); + /* Spin up the workers */ + for(size_t i = 0; i < workersCount; ++i) { + UA_Worker *w = &wq->workers[i]; + w->queue = wq; + w->counter = 0; + w->running = true; + pthread_create(&w->thread, NULL, (void* (*)(void*))workerLoop, w); + } return UA_STATUSCODE_GOOD; } -static void -changeTimerCallbackEntryInterval(UA_Timer *t, UA_UInt64 callbackId, - UA_UInt64 interval, UA_DateTime nextTime) { - /* Remove from the sorted list */ - UA_TimerCallbackEntry *tc, *prev = NULL; - SLIST_FOREACH(tc, &t->repeatedCallbacks, next) { - if(callbackId == tc->id) { - if(prev) - SLIST_REMOVE_AFTER(prev, next); - else - SLIST_REMOVE_HEAD(&t->repeatedCallbacks, next); - break; - } - prev = tc; - } - if(!tc) +void UA_WorkQueue_stop(UA_WorkQueue *wq) { + if(wq->workersSize == 0) return; - /* Adjust settings */ - tc->interval = interval; - tc->nextTime = nextTime; + /* Signal the workers to stop */ + for(size_t i = 0; i < wq->workersSize; ++i) + wq->workers[i].running = false; + + /* Wake up all workers */ + pthread_cond_broadcast(&wq->dispatchQueue_condition); - /* Reinsert at the new position */ - addTimerCallbackEntry(t, tc); + /* Wait for the workers to finish, then clean up */ + for(size_t i = 0; i < wq->workersSize; ++i) + pthread_join(wq->workers[i].thread, NULL); + + UA_free(wq->workers); + wq->workers = NULL; + wq->workersSize = 0; } -/* Removing a repeated callback: Add an entry with the "nextTime" timestamp set - * to UA_INT64_MAX. The next iteration picks this up and removes the repated - * callback from the linked list. */ -UA_StatusCode -UA_Timer_removeRepeatedCallback(UA_Timer *t, UA_UInt64 callbackId) { - /* Allocate the repeated callback structure */ - UA_TimerCallbackEntry *tc = - (UA_TimerCallbackEntry*)UA_malloc(sizeof(UA_TimerCallbackEntry)); - if(!tc) - return UA_STATUSCODE_BADOUTOFMEMORY; +void UA_WorkQueue_enqueue(UA_WorkQueue *wq, UA_ApplicationCallback cb, + void *application, void *data) { + UA_DelayedCallback *dc = (UA_DelayedCallback*)UA_malloc(sizeof(UA_DelayedCallback)); + if(!dc) { + cb(application, data); /* Execute immediately if the memory could not be allocated */ + return; + } - /* Set the repeated callback with the sentinel nextTime */ - tc->id = callbackId; - tc->callback = (UA_TimerCallback)REMOVE_SENTINEL; + dc->callback = cb; + dc->application = application; + dc->data = data; - /* Enqueue the changes in the MPSC queue */ - enqueueChange(t, tc); - return UA_STATUSCODE_GOOD; + /* Enqueue for the worker threads */ + pthread_mutex_lock(&wq->dispatchQueue_accessMutex); + SIMPLEQ_INSERT_TAIL(&wq->dispatchQueue, dc, next); + pthread_mutex_unlock(&wq->dispatchQueue_accessMutex); + + /* Wake up sleeping workers */ + pthread_cond_broadcast(&wq->dispatchQueue_condition); } +#endif + +/*********************/ +/* Delayed Callbacks */ +/*********************/ + +#ifdef UA_ENABLE_MULTITHREADING + +/* Delayed Callbacks are called only when all callbacks that were dispatched + * prior are finished. After every UA_MAX_DELAYED_SAMPLE delayed Callbacks that + * were added to the queue, we sample the counters from the workers. The + * counters are compared to the last counters that were sampled. If every worker + * has proceeded the counter, then we know that all delayed callbacks prior to + * the last sample-point are safe to execute. */ + +/* Sample the worker counter for every nth delayed callback. This is used to + * test that all workers have **finished** their current job before the delayed + * callback is processed. */ +#define UA_MAX_DELAYED_SAMPLE 100 + +/* Call only with a held mutex for the delayed callbacks */ static void -removeRepeatedCallback(UA_Timer *t, UA_UInt64 callbackId) { - UA_TimerCallbackEntry *tc, *prev = NULL; - SLIST_FOREACH(tc, &t->repeatedCallbacks, next) { - if(callbackId == tc->id) { - if(prev) - SLIST_REMOVE_AFTER(prev, next); - else - SLIST_REMOVE_HEAD(&t->repeatedCallbacks, next); - UA_free(tc); - break; - } - prev = tc; +dispatchDelayedCallbacks(UA_WorkQueue *wq, UA_DelayedCallback *cb) { + /* Are callbacks before the last checkpoint ready? */ + for(size_t i = 0; i < wq->workersSize; ++i) { + if(wq->workers[i].counter == wq->workers[i].checkpointCounter) + return; } -} -/* Process the changes that were added to the MPSC queue (by other threads) */ -static void -processChanges(UA_Timer *t) { - UA_TimerCallbackEntry *change; - while((change = dequeueChange(t))) { - switch((uintptr_t)change->callback) { - case REMOVE_SENTINEL: - removeRepeatedCallback(t, change->id); - UA_free(change); - break; - case CHANGE_SENTINEL: - changeTimerCallbackEntryInterval(t, change->id, change->interval, - change->nextTime); - UA_free(change); - break; - default: - addTimerCallbackEntry(t, change); + /* Dispatch all delayed callbacks up to the checkpoint. + * TODO: Move over the entire queue up to the checkpoint in one step. */ + if(wq->delayedCallbacks_checkpoint != NULL) { + UA_DelayedCallback *iter, *tmp_iter; + SIMPLEQ_FOREACH_SAFE(iter, &wq->delayedCallbacks, next, tmp_iter) { + pthread_mutex_lock(&wq->dispatchQueue_accessMutex); + SIMPLEQ_INSERT_TAIL(&wq->dispatchQueue, iter, next); + pthread_mutex_unlock(&wq->dispatchQueue_accessMutex); + if(iter == wq->delayedCallbacks_checkpoint) + break; } } + + /* Create the new sample point */ + for(size_t i = 0; i < wq->workersSize; ++i) + wq->workers[i].checkpointCounter = wq->workers[i].counter; + wq->delayedCallbacks_checkpoint = cb; } -UA_DateTime -UA_Timer_process(UA_Timer *t, UA_DateTime nowMonotonic, - UA_TimerDispatchCallback dispatchCallback, - void *application) { - /* Insert and remove callbacks */ - processChanges(t); - - /* Find the last callback to be executed now */ - UA_TimerCallbackEntry *firstAfter, *lastNow = NULL; - SLIST_FOREACH(firstAfter, &t->repeatedCallbacks, next) { - if(firstAfter->nextTime > nowMonotonic) - break; - lastNow = firstAfter; +#endif + +void +UA_WorkQueue_enqueueDelayed(UA_WorkQueue *wq, UA_DelayedCallback *cb) { +#ifdef UA_ENABLE_MULTITHREADING + pthread_mutex_lock(&wq->dispatchQueue_accessMutex); +#endif + + SIMPLEQ_INSERT_HEAD(&wq->delayedCallbacks, cb, next); + +#ifdef UA_ENABLE_MULTITHREADING + wq->delayedCallbacks_sinceDispatch++; + if(wq->delayedCallbacks_sinceDispatch > UA_MAX_DELAYED_SAMPLE) { + dispatchDelayedCallbacks(wq, cb); + wq->delayedCallbacks_sinceDispatch = 0; } + pthread_mutex_unlock(&wq->dispatchQueue_accessMutex); +#endif +} - /* Nothing to do */ - if(!lastNow) { - if(firstAfter) - return firstAfter->nextTime; - return UA_INT64_MAX; +/* Assumes all workers are shut down */ +void UA_WorkQueue_manuallyProcessDelayed(UA_WorkQueue *wq) { + UA_DelayedCallback *dc, *dc_tmp; + SIMPLEQ_FOREACH_SAFE(dc, &wq->delayedCallbacks, next, dc_tmp) { + SIMPLEQ_REMOVE_HEAD(&wq->delayedCallbacks, next); + if(dc->callback) + dc->callback(dc->application, dc->data); + UA_free(dc); } +#ifdef UA_ENABLE_MULTITHREADING + wq->delayedCallbacks_checkpoint = NULL; +#endif +} + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/ua_timer.c" ***********************************/ - /* Put the callbacks that are executed now in a separate list */ - UA_TimerCallbackList executedNowList; - executedNowList.slh_first = SLIST_FIRST(&t->repeatedCallbacks); - lastNow->next.sle_next = NULL; +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2017, 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + */ - /* Fake entry to represent the first element in the newly-sorted list */ - UA_TimerCallbackEntry tmp_first; - tmp_first.nextTime = nowMonotonic - 1; /* never matches for last_dispatched */ - tmp_first.next.sle_next = firstAfter; - UA_TimerCallbackEntry *last_dispatched = &tmp_first; - /* Iterate over the list of callbacks to process now */ - UA_TimerCallbackEntry *tc; - while((tc = SLIST_FIRST(&executedNowList))) { - /* Remove from the list */ - SLIST_REMOVE_HEAD(&executedNowList, next); +struct UA_TimerEntry { + ZIP_ENTRY(UA_TimerEntry) zipfields; + UA_DateTime nextTime; /* The next time when the callback + * is to be executed */ + UA_UInt64 interval; /* Interval in 100ns resolution */ + UA_Boolean repeated; /* Repeated callback? */ - /* Dispatch/process callback */ - dispatchCallback(application, tc->callback, tc->data); + UA_ApplicationCallback callback; + void *application; + void *data; - /* Set the time for the next execution. Prevent an infinite loop by - * forcing the next processing into the next iteration. */ - tc->nextTime += (UA_Int64)tc->interval; - if(tc->nextTime < nowMonotonic) - tc->nextTime = nowMonotonic + 1; - - /* Find the new position for tc to keep the list sorted */ - UA_TimerCallbackEntry *prev_tc; - if(last_dispatched->nextTime == tc->nextTime) { - /* We try to "batch" repeatedCallbacks with the same interval. This - * saves a linear search when the last dispatched entry has the same - * nextTime timestamp as this entry. */ - UA_assert(last_dispatched != &tmp_first); - prev_tc = last_dispatched; - } else { - /* Find the position for the next execution by a linear search - * starting at last_dispatched or the first element */ - if(last_dispatched->nextTime < tc->nextTime) - prev_tc = last_dispatched; - else - prev_tc = &tmp_first; + ZIP_ENTRY(UA_TimerEntry) idZipfields; + UA_UInt64 id; /* Id of the entry */ +}; - while(true) { - UA_TimerCallbackEntry *n = SLIST_NEXT(prev_tc, next); - if(!n || n->nextTime >= tc->nextTime) - break; - prev_tc = n; - } - } +/* There may be several entries with the same nextTime in the tree. We give them + * an absolute order by considering the memory address to break ties. Because of + * this, the nextTime property cannot be used to lookup specific entries. */ +static enum ZIP_CMP +cmpDateTime(const UA_DateTime *a, const UA_DateTime *b) { + if(*a < *b) + return ZIP_CMP_LESS; + if(*a > *b) + return ZIP_CMP_MORE; + if(a == b) + return ZIP_CMP_EQ; + if(a < b) + return ZIP_CMP_LESS; + return ZIP_CMP_MORE; +} + +ZIP_PROTTYPE(UA_TimerZip, UA_TimerEntry, UA_DateTime) +ZIP_IMPL(UA_TimerZip, UA_TimerEntry, zipfields, UA_DateTime, nextTime, cmpDateTime) + +/* The identifiers of entries are unique */ +static enum ZIP_CMP +cmpId(const UA_UInt64 *a, const UA_UInt64 *b) { + if(*a < *b) + return ZIP_CMP_LESS; + if(*a == *b) + return ZIP_CMP_EQ; + return ZIP_CMP_MORE; +} + +ZIP_PROTTYPE(UA_TimerIdZip, UA_TimerEntry, UA_UInt64) +ZIP_IMPL(UA_TimerIdZip, UA_TimerEntry, idZipfields, UA_UInt64, id, cmpId) - /* Update last_dispatched to make sure batched callbacks are added in the - * same sequence as before they were executed and to save some iterations - * of the linear search for callbacks to be added further back in the list. */ - last_dispatched = tc; +void +UA_Timer_init(UA_Timer *t) { + memset(t, 0, sizeof(UA_Timer)); +} - /* Add entry to the new position in the sorted list */ - SLIST_INSERT_AFTER(prev_tc, tc, next); - } +static UA_StatusCode +addCallback(UA_Timer *t, UA_ApplicationCallback callback, void *application, void *data, + UA_DateTime nextTime, UA_UInt64 interval, UA_Boolean repeated, + UA_UInt64 *callbackId) { + /* A callback method needs to be present */ + if(!callback) + return UA_STATUSCODE_BADINTERNALERROR; + + /* Allocate the repeated callback structure */ + UA_TimerEntry *te = (UA_TimerEntry*)UA_malloc(sizeof(UA_TimerEntry)); + if(!te) + return UA_STATUSCODE_BADOUTOFMEMORY; + + /* Set the repeated callback */ + te->interval = (UA_UInt64)interval; + te->id = ++t->idCounter; + te->callback = callback; + te->application = application; + te->data = data; + te->repeated = repeated; + te->nextTime = nextTime; + + /* Set the output identifier */ + if(callbackId) + *callbackId = te->id; + + ZIP_INSERT(UA_TimerZip, &t->root, te, ZIP_FFS32(UA_UInt32_random())); + ZIP_INSERT(UA_TimerIdZip, &t->idRoot, te, ZIP_RANK(te, zipfields)); + return UA_STATUSCODE_GOOD; +} + +UA_StatusCode +UA_Timer_addTimedCallback(UA_Timer *t, UA_ApplicationCallback callback, + void *application, void *data, UA_DateTime date, + UA_UInt64 *callbackId) { + return addCallback(t, callback, application, data, date, 0, false, callbackId); +} + +/* Adding repeated callbacks: Add an entry with the "nextTime" timestamp in the + * future. This will be picked up in the next iteration and inserted at the + * correct place. So that the next execution takes place ät "nextTime". */ +UA_StatusCode +UA_Timer_addRepeatedCallback(UA_Timer *t, UA_ApplicationCallback callback, + void *application, void *data, UA_Double interval_ms, + UA_UInt64 *callbackId) { + /* The interval needs to be positive */ + if(interval_ms <= 0.0) + return UA_STATUSCODE_BADINTERNALERROR; - /* Set the entry-point for the newly sorted list */ - t->repeatedCallbacks.slh_first = tmp_first.next.sle_next; + UA_UInt64 interval = (UA_UInt64)(interval_ms * UA_DATETIME_MSEC); + UA_DateTime nextTime = UA_DateTime_nowMonotonic() + (UA_DateTime)interval; + return addCallback(t, callback, application, data, nextTime, + interval, true, callbackId); +} + +UA_StatusCode +UA_Timer_changeRepeatedCallbackInterval(UA_Timer *t, UA_UInt64 callbackId, + UA_Double interval_ms) { + /* The interval needs to be positive */ + if(interval_ms <= 0.0) + return UA_STATUSCODE_BADINTERNALERROR; - /* Re-repeat processAddRemoved since one of the callbacks might have removed - * or added a callback. So we return a correct timeout. */ - processChanges(t); + /* Remove from the sorted list */ + UA_TimerEntry *te = ZIP_FIND(UA_TimerIdZip, &t->idRoot, &callbackId); + if(!te) + return UA_STATUSCODE_BADNOTFOUND; - /* Return timestamp of next repetition */ - tc = SLIST_FIRST(&t->repeatedCallbacks); - if(!tc) - return UA_INT64_MAX; /* Main-loop has a max timeout / will continue earlier */ - return tc->nextTime; + /* Set the repeated callback */ + ZIP_REMOVE(UA_TimerZip, &t->root, te); + te->interval = (UA_UInt64)(interval_ms * UA_DATETIME_MSEC); /* in 100ns resolution */ + te->nextTime = UA_DateTime_nowMonotonic() + (UA_DateTime)te->interval; + ZIP_INSERT(UA_TimerZip, &t->root, te, ZIP_RANK(te, zipfields)); + return UA_STATUSCODE_GOOD; } void -UA_Timer_deleteMembers(UA_Timer *t) { - /* Process changes to empty the MPSC queue */ - processChanges(t); +UA_Timer_removeCallback(UA_Timer *t, UA_UInt64 callbackId) { + UA_TimerEntry *te = ZIP_FIND(UA_TimerIdZip, &t->idRoot, &callbackId); + if(!te) + return; - /* Remove repeated callbacks */ - UA_TimerCallbackEntry *current; - while((current = SLIST_FIRST(&t->repeatedCallbacks))) { - SLIST_REMOVE_HEAD(&t->repeatedCallbacks, next); - UA_free(current); + ZIP_REMOVE(UA_TimerZip, &t->root, te); + ZIP_REMOVE(UA_TimerIdZip, &t->idRoot, te); + UA_free(te); +} + +UA_DateTime +UA_Timer_process(UA_Timer *t, UA_DateTime nowMonotonic, + UA_TimerExecutionCallback executionCallback, + void *executionApplication) { + UA_TimerEntry *first; + while((first = ZIP_MIN(UA_TimerZip, &t->root)) && + first->nextTime <= nowMonotonic) { + ZIP_REMOVE(UA_TimerZip, &t->root, first); + + /* Reinsert / remove to their new position first. Because the callback + * can interact with the zip tree and expects the same entries in the + * root and idRoot trees. */ + + if(!first->repeated) { + ZIP_REMOVE(UA_TimerIdZip, &t->idRoot, first); + executionCallback(executionApplication, first->callback, + first->application, first->data); + UA_free(first); + continue; + } + + /* Set the time for the next execution. Prevent an infinite loop by + * forcing the next processing into the next iteration. */ + first->nextTime += (UA_Int64)first->interval; + if(first->nextTime < nowMonotonic) + first->nextTime = nowMonotonic + 1; + ZIP_INSERT(UA_TimerZip, &t->root, first, ZIP_RANK(first, zipfields)); + executionCallback(executionApplication, first->callback, + first->application, first->data); } + + /* Return the timestamp of the earliest next callback */ + first = ZIP_MIN(UA_TimerZip, &t->root); + return (first) ? first->nextTime : UA_INT64_MAX; +} + +static void +freeEntry(UA_TimerEntry *te, void *data) { + UA_free(te); } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/ua_connection.c" ***********************************/ +void +UA_Timer_deleteMembers(UA_Timer *t) { + /* Free all nodes and reset the root */ + ZIP_ITER(UA_TimerZip, &t->root, freeEntry, NULL); + ZIP_INIT(&t->root); +} + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/ua_connection.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2014, 2016-2017 (c) Florian Palm * Copyright 2015-2016 (c) Sten Grüner * Copyright 2015 (c) Oleksiy Vasylyev * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2019 (c) Kalycito Infotech Private Limited */ + void UA_Connection_deleteMembers(UA_Connection *connection) { - UA_ByteString_deleteMembers(&connection->incompleteMessage); + UA_ByteString_deleteMembers(&connection->incompleteChunk); +} + +UA_StatusCode +UA_Connection_processHELACK(UA_Connection *connection, + const UA_ConnectionConfig *localConfig, + const UA_ConnectionConfig *remoteConfig) { + connection->config = *remoteConfig; + + /* The lowest common version is used by both sides */ + if(connection->config.protocolVersion > localConfig->protocolVersion) + connection->config.protocolVersion = localConfig->protocolVersion; + + /* Can we receive the max send size? */ + if(connection->config.sendBufferSize > localConfig->recvBufferSize) + connection->config.sendBufferSize = localConfig->recvBufferSize; + + /* Can we send the max receive size? */ + if(connection->config.recvBufferSize > localConfig->sendBufferSize) + connection->config.recvBufferSize = localConfig->sendBufferSize; + + /* Chunks of at least 8192 bytes must be permissible. + * See Part 6, Clause 6.7.1 */ + if(connection->config.recvBufferSize < 8192 || + connection->config.sendBufferSize < 8192 || + (connection->config.maxMessageSize != 0 && + connection->config.maxMessageSize < 8192)) + return UA_STATUSCODE_BADINTERNALERROR; + + connection->state = UA_CONNECTION_ESTABLISHED; + + return UA_STATUSCODE_GOOD; } -/* Hides somme errors before sending them to a client according to the +/* Hides some errors before sending them to a client according to the * standard. */ static void hideErrors(UA_TcpErrorMessage *const error) { switch(error->error) { case UA_STATUSCODE_BADCERTIFICATEUNTRUSTED: + case UA_STATUSCODE_BADCERTIFICATEREVOKED: error->error = UA_STATUSCODE_BADSECURITYCHECKSFAILED; error->reason = UA_STRING_NULL; break; @@ -17761,37 +20737,22 @@ UA_Connection_sendError(UA_Connection *connection, UA_TcpErrorMessage *error) { /* Encode and send the response */ UA_Byte *bufPos = msg.data; const UA_Byte *bufEnd = &msg.data[msg.length]; - UA_TcpMessageHeader_encodeBinary(&header, &bufPos, &bufEnd); - UA_TcpErrorMessage_encodeBinary(error, &bufPos, &bufEnd); + UA_TcpMessageHeader_encodeBinary(&header, &bufPos, bufEnd); + UA_TcpErrorMessage_encodeBinary(error, &bufPos, bufEnd); msg.length = header.messageSize; connection->send(connection, &msg); } static UA_StatusCode -prependIncompleteChunk(UA_Connection *connection, UA_ByteString *message) { - /* Allocate the new message buffer */ - size_t length = connection->incompleteMessage.length + message->length; - UA_Byte *data = (UA_Byte*)UA_realloc(connection->incompleteMessage.data, length); - if(!data) { - UA_ByteString_deleteMembers(&connection->incompleteMessage); - return UA_STATUSCODE_BADOUTOFMEMORY; - } - - /* Copy / release the current message buffer */ - memcpy(&data[connection->incompleteMessage.length], message->data, message->length); - message->length = length; - message->data = data; - connection->incompleteMessage = UA_BYTESTRING_NULL; - return UA_STATUSCODE_GOOD; -} - -static UA_StatusCode -bufferIncompleteChunk(UA_Connection *connection, const UA_Byte *pos, const UA_Byte *end) { +bufferIncompleteChunk(UA_Connection *connection, const UA_Byte *pos, + const UA_Byte *end) { + UA_assert(connection->incompleteChunk.length == 0); + UA_assert(pos < end); size_t length = (uintptr_t)end - (uintptr_t)pos; - UA_StatusCode retval = UA_ByteString_allocBuffer(&connection->incompleteMessage, length); + UA_StatusCode retval = UA_ByteString_allocBuffer(&connection->incompleteChunk, length); if(retval != UA_STATUSCODE_GOOD) return retval; - memcpy(connection->incompleteMessage.data, pos, length); + memcpy(connection->incompleteChunk.data, pos, length); return UA_STATUSCODE_GOOD; } @@ -17800,18 +20761,17 @@ processChunk(UA_Connection *connection, void *application, UA_Connection_processChunk processCallback, const UA_Byte **posp, const UA_Byte *end, UA_Boolean *done) { const UA_Byte *pos = *posp; - size_t length = (uintptr_t)end - (uintptr_t)pos; + const size_t remaining = (uintptr_t)end - (uintptr_t)pos; /* At least 8 byte needed for the header. Wait for the next chunk. */ - if(length < 8) { - bufferIncompleteChunk(connection, pos, end); + if(remaining < 8) { *done = true; return UA_STATUSCODE_GOOD; } /* Check the message type */ - UA_MessageType msgtype = (UA_MessageType)((UA_UInt32)pos[0] + ((UA_UInt32)pos[1] << 8) + - ((UA_UInt32)pos[2] << 16)); + UA_MessageType msgtype = (UA_MessageType) + ((UA_UInt32)pos[0] + ((UA_UInt32)pos[1] << 8) + ((UA_UInt32)pos[2] << 16)); if(msgtype != UA_MESSAGETYPE_MSG && msgtype != UA_MESSAGETYPE_ERR && msgtype != UA_MESSAGETYPE_OPN && msgtype != UA_MESSAGETYPE_HEL && msgtype != UA_MESSAGETYPE_ACK && msgtype != UA_MESSAGETYPE_CLO) { @@ -17832,20 +20792,15 @@ processChunk(UA_Connection *connection, void *application, UA_UInt32_decodeBinary(&temp, &temp_offset, &chunk_length); /* The message size is not allowed */ - if(chunk_length < 16 || chunk_length > connection->localConf.recvBufferSize) + if(chunk_length < 16 || chunk_length > connection->config.recvBufferSize) return UA_STATUSCODE_BADTCPMESSAGETOOLARGE; - /* Wait for the next packet to process the complete chunk */ - if(chunk_length > length) { - bufferIncompleteChunk(connection, pos, end); + /* Have an the complete chunk */ + if(chunk_length > remaining) { *done = true; return UA_STATUSCODE_GOOD; } - /* Set pendingMessage if there is a message after this message */ - if(length > chunk_length) - connection->pendingMessage = true; - /* Process the chunk; forward the position pointer */ temp.length = chunk_length; *posp += chunk_length; @@ -17857,35 +20812,48 @@ UA_StatusCode UA_Connection_processChunks(UA_Connection *connection, void *application, UA_Connection_processChunk processCallback, const UA_ByteString *packet) { - /* If we have stored an incomplete chunk, prefix to the received message. - * After this block, connection->incompleteMessage is always empty. The - * message and the buffer is released if allocating the memory fails. */ - UA_Boolean realloced = false; - UA_ByteString message = *packet; - UA_StatusCode retval; - if(connection->incompleteMessage.length > 0) { - retval = prependIncompleteChunk(connection, &message); - if(retval != UA_STATUSCODE_GOOD) - return retval; - realloced = true; + const UA_Byte *pos = packet->data; + const UA_Byte *end = &packet->data[packet->length]; + UA_ByteString appended = connection->incompleteChunk; + + /* Prepend the incomplete last chunk. This is usually done in the + * networklayer. But we test for a buffered incomplete chunk here again to + * work around "lazy" network layers. */ + if(appended.length > 0) { + connection->incompleteChunk = UA_BYTESTRING_NULL; + UA_Byte *t = (UA_Byte*)UA_realloc(appended.data, appended.length + packet->length); + if(!t) { + UA_ByteString_deleteMembers(&appended); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + memcpy(&t[appended.length], pos, packet->length); + appended.data = t; + appended.length += packet->length; + pos = t; + end = &t[appended.length]; } + UA_assert(connection->incompleteChunk.length == 0); + /* Loop over the received chunks. pos is increased with each chunk. */ - const UA_Byte *pos = message.data; - const UA_Byte *end = &message.data[message.length]; - UA_Boolean done = true; - do { - retval = processChunk(connection, application, processCallback, - &pos, end, &done); - connection->pendingMessage = false; - } while(!done && retval == UA_STATUSCODE_GOOD); + UA_Boolean done = false; + UA_StatusCode retval = UA_STATUSCODE_GOOD; + while(!done) { + retval = processChunk(connection, application, processCallback, &pos, end, &done); + /* If an irrecoverable error happens: do not buffer incomplete chunk */ + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; + } + + if(end > pos) + retval = bufferIncompleteChunk(connection, pos, end); - if(realloced) - UA_ByteString_deleteMembers(&message); + cleanup: + UA_ByteString_deleteMembers(&appended); return retval; } -/* In order to know whether a chunk was processed, we insert an indirection into +/* In order to know whether a chunk was processed, we insert an redirection into * the callback. */ struct completeChunkTrampolineData { UA_Boolean called; @@ -17944,28 +20912,50 @@ UA_Connection_receiveChunksBlocking(UA_Connection *connection, void *application return retval; } -void UA_Connection_detachSecureChannel(UA_Connection *connection) { - UA_SecureChannel *channel = connection->channel; - if(channel) - /* only replace when the channel points to this connection */ - UA_atomic_cmpxchg((void**)&channel->connection, connection, NULL); - UA_atomic_xchg((void**)&connection->channel, NULL); -} - -// TODO: Return an error code -void -UA_Connection_attachSecureChannel(UA_Connection *connection, UA_SecureChannel *channel) { +UA_StatusCode +UA_Connection_receiveChunksNonBlocking(UA_Connection *connection, void *application, + UA_Connection_processChunk processCallback) { + struct completeChunkTrampolineData data; + data.called = false; + data.application = application; + data.processCallback = processCallback; + + /* Listen for messages to arrive */ + UA_ByteString packet = UA_BYTESTRING_NULL; + UA_StatusCode retval = connection->recv(connection, &packet, 1); + + if((retval != UA_STATUSCODE_GOOD) && (retval != UA_STATUSCODE_GOODNONCRITICALTIMEOUT)) + return retval; + + /* Try to process one complete chunk */ + retval = UA_Connection_processChunks(connection, &data, completeChunkTrampoline, &packet); + connection->releaseRecvBuffer(connection, &packet); + + return retval; +} + +void UA_Connection_detachSecureChannel(UA_Connection *connection) { + UA_SecureChannel *channel = connection->channel; + if(channel) + /* only replace when the channel points to this connection */ + UA_atomic_cmpxchg((void**)&channel->connection, connection, NULL); + UA_atomic_xchg((void**)&connection->channel, NULL); +} + +// TODO: Return an error code +void +UA_Connection_attachSecureChannel(UA_Connection *connection, UA_SecureChannel *channel) { if(UA_atomic_cmpxchg((void**)&channel->connection, NULL, connection) == NULL) UA_atomic_xchg((void**)&connection->channel, (void*)channel); } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/ua_securechannel.c" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/ua_securechannel.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2018 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2014, 2016-2017 (c) Florian Palm * Copyright 2015-2016 (c) Sten Grüner * Copyright 2015 (c) Oleksiy Vasylyev @@ -17975,8 +20965,10 @@ UA_Connection_attachSecureChannel(UA_Connection *connection, UA_SecureChannel *c */ -#define UA_BITMASK_MESSAGETYPE 0x00ffffff -#define UA_BITMASK_CHUNKTYPE 0xff000000 + + +#define UA_BITMASK_MESSAGETYPE 0x00ffffffu +#define UA_BITMASK_CHUNKTYPE 0xff000000u #define UA_ASYMMETRIC_ALG_SECURITY_HEADER_FIXED_LENGTH 12 #define UA_SYMMETRIC_ALG_SECURITY_HEADER_LENGTH 4 #define UA_SEQUENCE_HEADER_LENGTH 8 @@ -17984,8 +20976,8 @@ UA_Connection_attachSecureChannel(UA_Connection *connection, UA_SecureChannel *c (UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + \ UA_SYMMETRIC_ALG_SECURITY_HEADER_LENGTH) -const UA_ByteString - UA_SECURITY_POLICY_NONE_URI = {47, (UA_Byte *)"http://opcfoundation.org/UA/SecurityPolicy#None"}; +const UA_ByteString UA_SECURITY_POLICY_NONE_URI = + {47, (UA_Byte *)"http://opcfoundation.org/UA/SecurityPolicy#None"}; #ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS UA_StatusCode decrypt_verifySignatureFailure; @@ -17993,28 +20985,36 @@ UA_StatusCode sendAsym_sendFailure; UA_StatusCode processSym_seqNumberFailure; #endif -UA_StatusCode -UA_SecureChannel_init(UA_SecureChannel *channel, - const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *remoteCertificate) { - if(channel == NULL || securityPolicy == NULL || remoteCertificate == NULL) - return UA_STATUSCODE_BADINTERNALERROR; - +void +UA_SecureChannel_init(UA_SecureChannel *channel) { /* Linked lists are also initialized by zeroing out */ memset(channel, 0, sizeof(UA_SecureChannel)); channel->state = UA_SECURECHANNELSTATE_FRESH; - channel->securityPolicy = securityPolicy; + TAILQ_INIT(&channel->messages); +} + +UA_StatusCode +UA_SecureChannel_setSecurityPolicy(UA_SecureChannel *channel, + const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *remoteCertificate) { + /* Is a policy already configured? */ + if(channel->securityPolicy) { + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Security policy already configured"); + return UA_STATUSCODE_BADINTERNALERROR; + } UA_StatusCode retval; - if(channel->securityPolicy->certificateVerification != NULL) { - retval = channel->securityPolicy->certificateVerification-> - verifyCertificate(channel->securityPolicy->certificateVerification->context, remoteCertificate); + if(securityPolicy->certificateVerification != NULL) { + retval = securityPolicy->certificateVerification-> + verifyCertificate(securityPolicy->certificateVerification->context, + remoteCertificate); if(retval != UA_STATUSCODE_GOOD) return retval; } else { - UA_LOG_WARNING(channel->securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, "No PKI plugin set. " - "Accepting all certificates"); + UA_LOG_WARNING(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Security policy None is used to create SecureChannel. Accepting all certificates"); } retval = securityPolicy->channelModule. @@ -18031,11 +21031,47 @@ UA_SecureChannel_init(UA_SecureChannel *channel, makeCertificateThumbprint(securityPolicy, &channel->remoteCertificate, &remoteCertificateThumbprint); + if(retval == UA_STATUSCODE_GOOD) + channel->securityPolicy = securityPolicy; + return retval; } +static void +deleteMessage(UA_Message *me) { + UA_ChunkPayload *cp; + while((cp = SIMPLEQ_FIRST(&me->chunkPayloads))) { + if(cp->copied) + UA_ByteString_deleteMembers(&cp->bytes); + SIMPLEQ_REMOVE_HEAD(&me->chunkPayloads, pointers); + UA_free(cp); + } + UA_free(me); +} + +static void +deleteLatestMessage(UA_SecureChannel *channel, UA_UInt32 requestId) { + UA_Message *me = TAILQ_LAST(&channel->messages, UA_MessageQueue); + if(!me) + return; + if(me->requestId != requestId) + return; + + TAILQ_REMOVE(&channel->messages, me, pointers); + deleteMessage(me); +} + +void +UA_SecureChannel_deleteMessages(UA_SecureChannel *channel) { + UA_Message *me, *me_tmp; + TAILQ_FOREACH_SAFE(me, &channel->messages, pointers, me_tmp) { + TAILQ_REMOVE(&channel->messages, me, pointers); + deleteMessage(me); + } +} + void -UA_SecureChannel_deleteMembersCleanup(UA_SecureChannel *channel) { +UA_SecureChannel_deleteMembers(UA_SecureChannel *channel) { /* Delete members */ UA_ByteString_deleteMembers(&channel->remoteCertificate); UA_ByteString_deleteMembers(&channel->localNonce); @@ -18044,8 +21080,21 @@ UA_SecureChannel_deleteMembersCleanup(UA_SecureChannel *channel) { UA_ChannelSecurityToken_deleteMembers(&channel->nextSecurityToken); /* Delete the channel context for the security policy */ - if(channel->securityPolicy) + if(channel->securityPolicy) { channel->securityPolicy->channelModule.deleteContext(channel->channelContext); + channel->securityPolicy = NULL; + } + + /* Remove the buffered messages */ + UA_SecureChannel_deleteMessages(channel); + + UA_SecureChannel_init(channel); +} + +void +UA_SecureChannel_close(UA_SecureChannel *channel) { + /* Set the status to closed */ + channel->state = UA_SECURECHANNELSTATE_CLOSED; /* Detach from the connection and close the connection */ if(channel->connection) { @@ -18061,18 +21110,6 @@ UA_SecureChannel_deleteMembersCleanup(UA_SecureChannel *channel) { sh->channel = NULL; LIST_REMOVE(sh, pointers); } - - /* Remove the buffered chunks */ - struct MessageEntry *me, *temp_me; - LIST_FOREACH_SAFE(me, &channel->chunks, pointers, temp_me) { - struct ChunkPayload *cp, *temp_cp; - SIMPLEQ_FOREACH_SAFE(cp, &me->chunkPayload, pointers, temp_cp) { - UA_ByteString_deleteMembers(&cp->bytes); - UA_free(cp); - } - LIST_REMOVE(me, pointers); - UA_free(me); - } } UA_StatusCode @@ -18096,9 +21133,12 @@ UA_SecureChannel_generateLocalNonce(UA_SecureChannel *channel) { static UA_StatusCode UA_SecureChannel_generateLocalKeys(const UA_SecureChannel *const channel, const UA_SecurityPolicy *const securityPolicy) { + UA_LOG_TRACE_CHANNEL(securityPolicy->logger, channel, "Generating new local keys"); const UA_SecurityPolicyChannelModule *channelModule = &securityPolicy->channelModule; const UA_SecurityPolicySymmetricModule *symmetricModule = &securityPolicy->symmetricModule; - const UA_SecurityPolicyCryptoModule *const cryptoModule = &securityPolicy->symmetricModule.cryptoModule; + const UA_SecurityPolicyCryptoModule *const cryptoModule = + &securityPolicy->symmetricModule.cryptoModule; + /* Symmetric key length */ size_t encryptionKeyLength = cryptoModule->encryptionAlgorithm.getLocalKeyLength(securityPolicy, channel->channelContext); @@ -18121,18 +21161,31 @@ UA_SecureChannel_generateLocalKeys(const UA_SecureChannel *const channel, const UA_ByteString localIv = {encryptionBlockSize, buffer.data + signingKeyLength + encryptionKeyLength}; + retval = channelModule->setLocalSymSigningKey(channel->channelContext, &localSigningKey); - retval |= channelModule->setLocalSymEncryptingKey(channel->channelContext, &localEncryptingKey); - retval |= channelModule->setLocalSymIv(channel->channelContext, &localIv); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + retval = channelModule->setLocalSymEncryptingKey(channel->channelContext, &localEncryptingKey); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + retval = channelModule->setLocalSymIv(channel->channelContext, &localIv); + if(retval != UA_STATUSCODE_GOOD) + return retval; + return retval; } static UA_StatusCode UA_SecureChannel_generateRemoteKeys(const UA_SecureChannel *const channel, const UA_SecurityPolicy *const securityPolicy) { + UA_LOG_TRACE_CHANNEL(securityPolicy->logger, channel, "Generating new remote keys"); const UA_SecurityPolicyChannelModule *channelModule = &securityPolicy->channelModule; const UA_SecurityPolicySymmetricModule *symmetricModule = &securityPolicy->symmetricModule; - const UA_SecurityPolicyCryptoModule *const cryptoModule = &securityPolicy->symmetricModule.cryptoModule; + const UA_SecurityPolicyCryptoModule *const cryptoModule = + &securityPolicy->symmetricModule.cryptoModule; + /* Symmetric key length */ size_t encryptionKeyLength = cryptoModule->encryptionAlgorithm.getRemoteKeyLength(securityPolicy, channel->channelContext); @@ -18149,15 +21202,23 @@ UA_SecureChannel_generateRemoteKeys(const UA_SecureChannel *const channel, &channel->remoteNonce, &buffer); if(retval != UA_STATUSCODE_GOOD) return retval; + const UA_ByteString remoteSigningKey = {signingKeyLength, buffer.data}; const UA_ByteString remoteEncryptingKey = {encryptionKeyLength, buffer.data + signingKeyLength}; const UA_ByteString remoteIv = {encryptionBlockSize, buffer.data + signingKeyLength + encryptionKeyLength}; + retval = channelModule->setRemoteSymSigningKey(channel->channelContext, &remoteSigningKey); - retval |= channelModule->setRemoteSymEncryptingKey(channel->channelContext, &remoteEncryptingKey); - retval |= channelModule->setRemoteSymIv(channel->channelContext, &remoteIv); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + retval = channelModule->setRemoteSymEncryptingKey(channel->channelContext, &remoteEncryptingKey); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + retval = channelModule->setRemoteSymIv(channel->channelContext, &remoteIv); if(retval != UA_STATUSCODE_GOOD) return retval; @@ -18166,13 +21227,20 @@ UA_SecureChannel_generateRemoteKeys(const UA_SecureChannel *const channel, UA_StatusCode UA_SecureChannel_generateNewKeys(UA_SecureChannel *channel) { - UA_StatusCode retval = UA_SecureChannel_generateLocalKeys(channel, channel->securityPolicy); - if(retval != UA_STATUSCODE_GOOD) + UA_StatusCode retval = + UA_SecureChannel_generateLocalKeys(channel, channel->securityPolicy); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(channel->securityPolicy->logger, UA_LOGCATEGORY_SECURECHANNEL, + "Could not generate a local key"); return retval; + } retval = UA_SecureChannel_generateRemoteKeys(channel, channel->securityPolicy); - if(retval != UA_STATUSCODE_GOOD) + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(channel->securityPolicy->logger, UA_LOGCATEGORY_SECURECHANNEL, + "Could not generate a remote key"); return retval; + } return retval; } @@ -18180,7 +21248,7 @@ UA_SecureChannel_generateNewKeys(UA_SecureChannel *channel) { UA_SessionHeader * UA_SecureChannel_getSession(UA_SecureChannel *channel, const UA_NodeId *authenticationToken) { - struct UA_SessionHeader *sh; + UA_SessionHeader *sh; LIST_FOREACH(sh, &channel->sessions, pointers) { if(UA_NodeId_equal(&sh->authenticationToken, authenticationToken)) break; @@ -18193,7 +21261,6 @@ UA_SecureChannel_revolveTokens(UA_SecureChannel *channel) { if(channel->nextSecurityToken.tokenId == 0) // no security token issued return UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN; - //FIXME: not thread-safe ???? Why is this not thread safe? UA_ChannelSecurityToken_deleteMembers(&channel->previousSecurityToken); UA_ChannelSecurityToken_copy(&channel->securityToken, &channel->previousSecurityToken); @@ -18203,70 +21270,189 @@ UA_SecureChannel_revolveTokens(UA_SecureChannel *channel) { UA_ChannelSecurityToken_deleteMembers(&channel->nextSecurityToken); UA_ChannelSecurityToken_init(&channel->nextSecurityToken); - return UA_SecureChannel_generateNewKeys(channel); + + /* remote keys are generated later on */ + return UA_SecureChannel_generateLocalKeys(channel, channel->securityPolicy); } /***************************/ /* Send Asymmetric Message */ /***************************/ -static UA_UInt16 -calculatePaddingAsym(const UA_SecurityPolicy *securityPolicy, const void *channelContext, - size_t bytesToWrite, UA_Byte *paddingSize, UA_Byte *extraPaddingSize) { - size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. - getRemotePlainTextBlockSize(securityPolicy, channelContext); - size_t signatureSize = securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. - getLocalSignatureSize(securityPolicy, channelContext); - size_t paddingBytes = 1; - if(securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. - getRemoteKeyLength(securityPolicy, channelContext) > 2048) - ++paddingBytes; - size_t padding = (plainTextBlockSize - ((bytesToWrite + signatureSize + paddingBytes) % - plainTextBlockSize)); - *paddingSize = (UA_Byte)(padding & 0xff); - *extraPaddingSize = (UA_Byte)(padding >> 8); - return (UA_UInt16)padding; -} - static size_t calculateAsymAlgSecurityHeaderLength(const UA_SecureChannel *channel) { size_t asymHeaderLength = UA_ASYMMETRIC_ALG_SECURITY_HEADER_FIXED_LENGTH + channel->securityPolicy->policyUri.length; + if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && + channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) + return asymHeaderLength; + + /* OPN is always encrypted even if the mode is sign only */ + asymHeaderLength += 20; /* Thumbprints are always 20 byte long */ + asymHeaderLength += channel->securityPolicy->localCertificate.length; + return asymHeaderLength; +} + +static UA_StatusCode +prependHeadersAsym(UA_SecureChannel *const channel, UA_Byte *header_pos, + const UA_Byte *buf_end, size_t totalLength, + size_t securityHeaderLength, UA_UInt32 requestId, + size_t *const finalLength) { + UA_StatusCode retval; + size_t dataToEncryptLength = + totalLength - (UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + securityHeaderLength); + + UA_SecureConversationMessageHeader respHeader; + respHeader.messageHeader.messageTypeAndChunkType = UA_MESSAGETYPE_OPN + UA_CHUNKTYPE_FINAL; + respHeader.messageHeader.messageSize = (UA_UInt32) + (totalLength + + UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(channel->securityPolicy, + channel->channelContext, + dataToEncryptLength)); + respHeader.secureChannelId = channel->securityToken.channelId; + retval = UA_encodeBinary(&respHeader, + &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER], + &header_pos, &buf_end, NULL, NULL); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + UA_AsymmetricAlgorithmSecurityHeader asymHeader; + UA_AsymmetricAlgorithmSecurityHeader_init(&asymHeader); + asymHeader.securityPolicyUri = channel->securityPolicy->policyUri; if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { - /* OPN is always encrypted even if mode sign only */ - asymHeaderLength += 20; /* Thumbprints are always 20 byte long */ - asymHeaderLength += channel->securityPolicy->localCertificate.length; + asymHeader.senderCertificate = channel->securityPolicy->localCertificate; + asymHeader.receiverCertificateThumbprint.length = 20; + asymHeader.receiverCertificateThumbprint.data = channel->remoteCertificateThumbprint; } - return asymHeaderLength; + retval = UA_encodeBinary(&asymHeader, + &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER], + &header_pos, &buf_end, NULL, NULL); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + UA_SequenceHeader seqHeader; + seqHeader.requestId = requestId; + seqHeader.sequenceNumber = UA_atomic_addUInt32(&channel->sendSequenceNumber, 1); + retval = UA_encodeBinary(&seqHeader, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER], + &header_pos, &buf_end, NULL, NULL); + + *finalLength = respHeader.messageHeader.messageSize; + + return retval; } static void -hideBytesAsym(const UA_SecureChannel *channel, UA_Byte **buf_start, const UA_Byte **buf_end) { - const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; - *buf_start += UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + UA_SEQUENCE_HEADER_LENGTH; - - /* Add the SecurityHeaderLength */ +hideBytesAsym(const UA_SecureChannel *channel, UA_Byte **buf_start, + const UA_Byte **buf_end) { + *buf_start += UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH; *buf_start += calculateAsymAlgSecurityHeaderLength(channel); - size_t potentialEncryptionMaxSize = (size_t)(*buf_end - *buf_start) + UA_SEQUENCE_HEADER_LENGTH; + *buf_start += UA_SEQUENCE_HEADER_LENGTH; + +#ifdef UA_ENABLE_ENCRYPTION + if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && + channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) + return; + + const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; /* Hide bytes for signature and padding */ - if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || - channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { - *buf_end -= securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. - getLocalSignatureSize(securityPolicy, channel->channelContext); - *buf_end -= 2; /* padding byte and extraPadding byte */ + size_t potentialEncryptMaxSize = (size_t)(*buf_end - *buf_start) + UA_SEQUENCE_HEADER_LENGTH; + *buf_end -= securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. + getLocalSignatureSize(securityPolicy, channel->channelContext); + *buf_end -= 2; /* padding byte and extraPadding byte */ + + /* Add some overhead length due to RSA implementations adding a signature themselves */ + *buf_end -= UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(securityPolicy, + channel->channelContext, + potentialEncryptMaxSize); +#endif +} + +#ifdef UA_ENABLE_ENCRYPTION + +static void +padChunkAsym(UA_SecureChannel *channel, const UA_ByteString *const buf, + size_t securityHeaderLength, UA_Byte **buf_pos) { + const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy; + + /* Also pad if the securityMode is SIGN_ONLY, since we are using + * asymmetric communication to exchange keys and thus need to encrypt. */ + if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && + channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) + return; + + const UA_Byte *buf_body_start = + &buf->data[UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + + UA_SEQUENCE_HEADER_LENGTH + securityHeaderLength]; + const size_t bytesToWrite = + (uintptr_t)*buf_pos - (uintptr_t)buf_body_start + UA_SEQUENCE_HEADER_LENGTH; + + /* Compute the padding length */ + size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. + getRemotePlainTextBlockSize(securityPolicy, channel->channelContext); + size_t signatureSize = securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. + getLocalSignatureSize(securityPolicy, channel->channelContext); + size_t paddingBytes = 1; + if(securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. + getRemoteKeyLength(securityPolicy, channel->channelContext) > 2048) + ++paddingBytes; /* extra padding */ + size_t totalPaddingSize = + (plainTextBlockSize - ((bytesToWrite + signatureSize + paddingBytes) % plainTextBlockSize)); + + /* Write the padding. This is <= because the paddingSize byte also has to be written */ + UA_Byte paddingSize = (UA_Byte)(totalPaddingSize & 0xffu); + for(UA_UInt16 i = 0; i <= totalPaddingSize; ++i) { + **buf_pos = paddingSize; + ++*buf_pos; + } - /* Add some overhead length due to RSA implementations adding a signature themselves */ - *buf_end -= UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(securityPolicy, - channel->channelContext, - potentialEncryptionMaxSize); + /* Write the extra padding byte if required */ + if(securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. + getRemoteKeyLength(securityPolicy, channel->channelContext) > 2048) { + UA_Byte extraPaddingSize = (UA_Byte)(totalPaddingSize >> 8u); + **buf_pos = extraPaddingSize; + ++*buf_pos; } } +static UA_StatusCode +signAndEncryptAsym(UA_SecureChannel *const channel, size_t preSignLength, + UA_ByteString *buf, size_t securityHeaderLength, + size_t totalLength) { + if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && + channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) + return UA_STATUSCODE_GOOD; + + const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy; + + /* Sign message */ + const UA_ByteString dataToSign = {preSignLength, buf->data}; + size_t sigsize = securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. + getLocalSignatureSize(securityPolicy, channel->channelContext); + UA_ByteString signature = {sigsize, buf->data + preSignLength}; + UA_StatusCode retval = securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. + sign(securityPolicy, channel->channelContext, &dataToSign, &signature); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + /* Specification part 6, 6.7.4: The OpenSecureChannel Messages are + * signed and encrypted if the SecurityMode is not None (even if the + * SecurityMode is SignOnly). */ + size_t unencrypted_length = + UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + securityHeaderLength; + UA_ByteString dataToEncrypt = {totalLength - unencrypted_length, + &buf->data[unencrypted_length]}; + return securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. + encrypt(securityPolicy, channel->channelContext, &dataToEncrypt); +} + +#endif /* UA_ENABLE_ENCRYPTION */ + /* Sends an OPN message using asymmetric encryption if defined */ UA_StatusCode -UA_SecureChannel_sendAsymmetricOPNMessage(UA_SecureChannel *channel, UA_UInt32 requestId, - const void *content, const UA_DataType *contentType) { +UA_SecureChannel_sendAsymmetricOPNMessage(UA_SecureChannel *channel, + UA_UInt32 requestId, const void *content, + const UA_DataType *contentType) { if(channel->securityMode == UA_MESSAGESECURITYMODE_INVALID) return UA_STATUSCODE_BADSECURITYMODEREJECTED; @@ -18278,7 +21464,7 @@ UA_SecureChannel_sendAsymmetricOPNMessage(UA_SecureChannel *channel, UA_UInt32 r /* Allocate the message buffer */ UA_ByteString buf = UA_BYTESTRING_NULL; UA_StatusCode retval = - connection->getSendBuffer(connection, connection->localConf.sendBufferSize, &buf); + connection->getSendBuffer(connection, connection->config.sendBufferSize, &buf); if(retval != UA_STATUSCODE_GOOD) return retval; @@ -18289,42 +21475,21 @@ UA_SecureChannel_sendAsymmetricOPNMessage(UA_SecureChannel *channel, UA_UInt32 r /* Encode the message type and content */ UA_NodeId typeId = UA_NODEID_NUMERIC(0, contentType->binaryEncodingId); - retval = UA_encodeBinary(&typeId, &UA_TYPES[UA_TYPES_NODEID], &buf_pos, &buf_end, NULL, NULL); - retval |= UA_encodeBinary(content, contentType, &buf_pos, &buf_end, NULL, NULL); + retval |= UA_encodeBinary(&typeId, &UA_TYPES[UA_TYPES_NODEID], + &buf_pos, &buf_end, NULL, NULL); + retval |= UA_encodeBinary(content, contentType, + &buf_pos, &buf_end, NULL, NULL); if(retval != UA_STATUSCODE_GOOD) { connection->releaseSendBuffer(connection, &buf); return retval; } - /* Compute the length of the asym header */ const size_t securityHeaderLength = calculateAsymAlgSecurityHeaderLength(channel); - /* Pad the message. Also if securitymode is only sign, since we are using - * asymmetric communication to exchange keys and thus need to encrypt. */ - if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || - channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { - const UA_Byte *buf_body_start = - &buf.data[UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + - UA_SEQUENCE_HEADER_LENGTH + securityHeaderLength]; - const size_t bytesToWrite = - (uintptr_t)buf_pos - (uintptr_t)buf_body_start + UA_SEQUENCE_HEADER_LENGTH; - UA_Byte paddingSize = 0; - UA_Byte extraPaddingSize = 0; - UA_UInt16 totalPaddingSize = - calculatePaddingAsym(securityPolicy, channel->channelContext, - bytesToWrite, &paddingSize, &extraPaddingSize); - - // This is <= because the paddingSize byte also has to be written. - for(UA_UInt16 i = 0; i <= totalPaddingSize; ++i) { - *buf_pos = paddingSize; - ++buf_pos; - } - if(securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. - getRemoteKeyLength(securityPolicy, channel->channelContext) > 2048) { - *buf_pos = extraPaddingSize; - ++buf_pos; - } - } + /* Add padding to the chunk */ +#ifdef UA_ENABLE_ENCRYPTION + padChunkAsym(channel, &buf, securityHeaderLength, &buf_pos); +#endif /* The total message length */ size_t pre_sig_length = (uintptr_t)buf_pos - (uintptr_t)buf.data; @@ -18334,115 +21499,133 @@ UA_SecureChannel_sendAsymmetricOPNMessage(UA_SecureChannel *channel, UA_UInt32 r total_length += securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. getLocalSignatureSize(securityPolicy, channel->channelContext); - /* Encode the headers at the beginning of the message */ - UA_Byte *header_pos = buf.data; - size_t dataToEncryptLength = - total_length - (UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + securityHeaderLength); - UA_SecureConversationMessageHeader respHeader; - respHeader.messageHeader.messageTypeAndChunkType = UA_MESSAGETYPE_OPN + UA_CHUNKTYPE_FINAL; - respHeader.messageHeader.messageSize = (UA_UInt32) - (total_length + UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(securityPolicy, - channel->channelContext, - dataToEncryptLength)); - respHeader.secureChannelId = channel->securityToken.channelId; - retval = UA_encodeBinary(&respHeader, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER], - &header_pos, &buf_end, NULL, NULL); - - UA_AsymmetricAlgorithmSecurityHeader asymHeader; - UA_AsymmetricAlgorithmSecurityHeader_init(&asymHeader); - asymHeader.securityPolicyUri = channel->securityPolicy->policyUri; - if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || - channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { - asymHeader.senderCertificate = channel->securityPolicy->localCertificate; - asymHeader.receiverCertificateThumbprint.length = 20; - asymHeader.receiverCertificateThumbprint.data = channel->remoteCertificateThumbprint; - } - retval |= UA_encodeBinary(&asymHeader, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER], - &header_pos, &buf_end, NULL, NULL); - - UA_SequenceHeader seqHeader; - seqHeader.requestId = requestId; - seqHeader.sequenceNumber = UA_atomic_addUInt32(&channel->sendSequenceNumber, 1); - retval |= UA_encodeBinary(&seqHeader, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER], - &header_pos, &buf_end, NULL, NULL); - - /* Did encoding the header succeed? */ - if(retval != UA_STATUSCODE_GOOD) { - connection->releaseSendBuffer(connection, &buf); - return retval; - } - - if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || - channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { - /* Sign message */ - const UA_ByteString dataToSign = {pre_sig_length, buf.data}; - size_t sigsize = securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. - getLocalSignatureSize(securityPolicy, channel->channelContext); - UA_ByteString signature = {sigsize, buf.data + pre_sig_length}; - retval = securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. - sign(securityPolicy, channel->channelContext, &dataToSign, &signature); - if(retval != UA_STATUSCODE_GOOD) { - connection->releaseSendBuffer(connection, &buf); - return retval; - } + /* The total message length is known here which is why we encode the headers + * at this step and not earlier. */ + size_t finalLength = 0; + retval = prependHeadersAsym(channel, buf.data, buf_end, total_length, + securityHeaderLength, requestId, &finalLength); + if(retval != UA_STATUSCODE_GOOD) + goto error; - /* Specification part 6, 6.7.4: The OpenSecureChannel Messages are - * signed and encrypted if the SecurityMode is not None (even if the - * SecurityMode is SignOnly). */ - size_t unencrypted_length = - UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + securityHeaderLength; - UA_ByteString dataToEncrypt = {total_length - unencrypted_length, - &buf.data[unencrypted_length]}; - retval = securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. - encrypt(securityPolicy, channel->channelContext, &dataToEncrypt); - if(retval != UA_STATUSCODE_GOOD) { - connection->releaseSendBuffer(connection, &buf); - return retval; - } - } +#ifdef UA_ENABLE_ENCRYPTION + retval = signAndEncryptAsym(channel, pre_sig_length, &buf, securityHeaderLength, total_length); + if(retval != UA_STATUSCODE_GOOD) + goto error; +#endif /* Send the message, the buffer is freed in the network layer */ - buf.length = respHeader.messageHeader.messageSize; + buf.length = finalLength; retval = connection->send(connection, &buf); #ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS - retval |= sendAsym_sendFailure + retval |= sendAsym_sendFailure; #endif return retval; + +error: + connection->releaseSendBuffer(connection, &buf); + return retval; } /**************************/ /* Send Symmetric Message */ /**************************/ +#ifdef UA_ENABLE_ENCRYPTION + static UA_UInt16 calculatePaddingSym(const UA_SecurityPolicy *securityPolicy, const void *channelContext, size_t bytesToWrite, UA_Byte *paddingSize, UA_Byte *extraPaddingSize) { - - size_t encryptionBlockSize = securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm. - getLocalBlockSize(securityPolicy, channelContext); + size_t encryptionBlockSize = securityPolicy->symmetricModule.cryptoModule. + encryptionAlgorithm.getLocalBlockSize(securityPolicy, channelContext); size_t signatureSize = securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm. getLocalSignatureSize(securityPolicy, channelContext); - UA_UInt16 padding = (UA_UInt16)(encryptionBlockSize - ((bytesToWrite + signatureSize + 1) % encryptionBlockSize)); + size_t padding = (encryptionBlockSize - + ((bytesToWrite + signatureSize + 1) % encryptionBlockSize)); *paddingSize = (UA_Byte)padding; - *extraPaddingSize = (UA_Byte)(padding >> 8); - return padding; + *extraPaddingSize = (UA_Byte)(padding >> 8u); + return (UA_UInt16)padding; } static void -setBufPos(UA_MessageContext *mc) { - const UA_SecureChannel *channel = mc->channel; +padChunkSym(UA_MessageContext *messageContext, size_t bodyLength) { + if(messageContext->channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) + return; + + /* The bytes for the padding and signature were removed from buf_end before + * encoding the payload. So we don't have to check if there is enough + * space. */ + + size_t bytesToWrite = bodyLength + UA_SEQUENCE_HEADER_LENGTH; + UA_Byte paddingSize = 0; + UA_Byte extraPaddingSize = 0; + UA_UInt16 totalPaddingSize = + calculatePaddingSym(messageContext->channel->securityPolicy, + messageContext->channel->channelContext, + bytesToWrite, &paddingSize, &extraPaddingSize); + + /* This is <= because the paddingSize byte also has to be written. */ + for(UA_UInt16 i = 0; i <= totalPaddingSize; ++i) { + *messageContext->buf_pos = paddingSize; + ++(messageContext->buf_pos); + } + if(extraPaddingSize > 0) { + *messageContext->buf_pos = extraPaddingSize; + ++(messageContext->buf_pos); + } +} + +static UA_StatusCode +signChunkSym(UA_MessageContext *const messageContext, size_t preSigLength) { + const UA_SecureChannel *channel = messageContext->channel; + if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && + channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) + return UA_STATUSCODE_GOOD; + + const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; + UA_ByteString dataToSign = messageContext->messageBuffer; + dataToSign.length = preSigLength; + UA_ByteString signature; + signature.length = securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm. + getLocalSignatureSize(securityPolicy, channel->channelContext); + signature.data = messageContext->buf_pos; + + return securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm. + sign(securityPolicy, channel->channelContext, &dataToSign, &signature); +} + +static UA_StatusCode +encryptChunkSym(UA_MessageContext *const messageContext, size_t totalLength) { + const UA_SecureChannel *channel = messageContext->channel; + if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) + return UA_STATUSCODE_GOOD; + + UA_ByteString dataToEncrypt; + dataToEncrypt.data = messageContext->messageBuffer.data + UA_SECUREMH_AND_SYMALGH_LENGTH; + dataToEncrypt.length = totalLength - UA_SECUREMH_AND_SYMALGH_LENGTH; + const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; + return securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm. + encrypt(securityPolicy, channel->channelContext, &dataToEncrypt); +} + +#endif /* UA_ENABLE_ENCRYPTION */ +static void +setBufPos(UA_MessageContext *mc) { /* Forward the data pointer so that the payload is encoded after the * message header */ mc->buf_pos = &mc->messageBuffer.data[UA_SECURE_MESSAGE_HEADER_LENGTH]; mc->buf_end = &mc->messageBuffer.data[mc->messageBuffer.length]; - /* Reserve space for the message footer at the end of the chunk if the chunk - * is signed and/or encrypted. The footer includes the fields PaddingSize, - * Padding, ExtraPadding and Signature. The padding fields are only present - * if the chunk is encrypted. */ +#ifdef UA_ENABLE_ENCRYPTION + const UA_SecureChannel *channel = mc->channel; + const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; + + /* Reserve space for the message footer at the end of the chunk if the chunk + * is signed and/or encrypted. The footer includes the fields PaddingSize, + * Padding, ExtraPadding and Signature. The padding fields are only present + * if the chunk is encrypted. */ if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) mc->buf_end -= securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm. @@ -18457,132 +21640,132 @@ setBufPos(UA_MessageContext *mc) { * calculatePaddingSym(). */ if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { /* PaddingSize and ExtraPaddingSize fields */ - size_t encryptionBlockSize = securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm. - getLocalBlockSize(securityPolicy, channel->channelContext ); - mc->buf_end -= 1 + ((encryptionBlockSize >> 8) ? 1 : 0); + size_t encryptionBlockSize = securityPolicy->symmetricModule.cryptoModule. + encryptionAlgorithm.getLocalBlockSize(securityPolicy, channel->channelContext); + mc->buf_end -= 1 + ((encryptionBlockSize >> 8u) ? 1 : 0); + /* Reduce the message body size with the remainder of the operation * maxEncryptedDataSize modulo EncryptionBlockSize to get a whole * number of blocks to encrypt later. Also reserve one byte for - * padding (1 <= paddingSize <= encryptionBlockSize). - */ - size_t maxEncryptDataSize = mc->messageBuffer.length-UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH-UA_SYMMETRIC_ALG_SECURITY_HEADER_LENGTH; + * padding (1 <= paddingSize <= encryptionBlockSize). */ + size_t maxEncryptDataSize = mc->messageBuffer.length - + UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH - + UA_SYMMETRIC_ALG_SECURITY_HEADER_LENGTH; mc->buf_end -= (maxEncryptDataSize % encryptionBlockSize) + 1; } +#endif } static UA_StatusCode -sendSymmetricChunk(UA_MessageContext *mc) { - UA_StatusCode res = UA_STATUSCODE_GOOD; - UA_SecureChannel *const channel = mc->channel; - const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; - UA_Connection *const connection = channel->connection; +checkLimitsSym(UA_MessageContext *const messageContext, size_t *const bodyLength) { + /* Will this chunk surpass the capacity of the SecureChannel for the message? */ + UA_Connection *const connection = messageContext->channel->connection; if(!connection) return UA_STATUSCODE_BADINTERNALERROR; - /* Will this chunk surpass the capacity of the SecureChannel for the message? */ - UA_Byte *buf_body_start = mc->messageBuffer.data + UA_SECURE_MESSAGE_HEADER_LENGTH; - const UA_Byte *buf_body_end = mc->buf_pos; - size_t bodyLength = (uintptr_t)buf_body_end - (uintptr_t)buf_body_start; - mc->messageSizeSoFar += bodyLength; - mc->chunksSoFar++; - if(mc->messageSizeSoFar > connection->remoteConf.maxMessageSize && - connection->remoteConf.maxMessageSize != 0) - res = UA_STATUSCODE_BADRESPONSETOOLARGE; - if(mc->chunksSoFar > connection->remoteConf.maxChunkCount && - connection->remoteConf.maxChunkCount != 0) - res = UA_STATUSCODE_BADRESPONSETOOLARGE; - if(res != UA_STATUSCODE_GOOD) { - connection->releaseSendBuffer(channel->connection, &mc->messageBuffer); - return res; - } - - /* Pad the message. The bytes for the padding and signature were removed - * from buf_end before encoding the payload. So we don't check here. */ - if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { - size_t bytesToWrite = bodyLength + UA_SEQUENCE_HEADER_LENGTH; - UA_Byte paddingSize = 0; - UA_Byte extraPaddingSize = 0; - UA_UInt16 totalPaddingSize = - calculatePaddingSym(securityPolicy, channel->channelContext, - bytesToWrite, &paddingSize, &extraPaddingSize); + UA_Byte *buf_body_start = messageContext->messageBuffer.data + UA_SECURE_MESSAGE_HEADER_LENGTH; + const UA_Byte *buf_body_end = messageContext->buf_pos; + *bodyLength = (uintptr_t)buf_body_end - (uintptr_t)buf_body_start; + messageContext->messageSizeSoFar += *bodyLength; + messageContext->chunksSoFar++; - // This is <= because the paddingSize byte also has to be written. - for(UA_UInt16 i = 0; i <= totalPaddingSize; ++i) { - *mc->buf_pos = paddingSize; - ++(mc->buf_pos); - } - if(extraPaddingSize > 0) { - *mc->buf_pos = extraPaddingSize; - ++(mc->buf_pos); - } - } + if(messageContext->messageSizeSoFar > connection->config.maxMessageSize && + connection->config.maxMessageSize != 0) + return UA_STATUSCODE_BADRESPONSETOOLARGE; - /* The total message length */ - size_t pre_sig_length = (uintptr_t)(mc->buf_pos) - (uintptr_t)mc->messageBuffer.data; - size_t total_length = pre_sig_length; - if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || - channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) - total_length += securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm. - getLocalSignatureSize(securityPolicy, channel->channelContext); - /* Space for the padding and the signature have been reserved in setBufPos() */ - UA_assert(total_length <= connection->localConf.sendBufferSize); - mc->messageBuffer.length = total_length; /* For giving the buffer to the network layer */ + if(messageContext->chunksSoFar > connection->config.maxChunkCount && + connection->config.maxChunkCount != 0) + return UA_STATUSCODE_BADRESPONSETOOLARGE; + + return UA_STATUSCODE_GOOD; +} + +static UA_StatusCode +encodeHeadersSym(UA_MessageContext *const messageContext, size_t totalLength) { + UA_SecureChannel *channel = messageContext->channel; + UA_Byte *header_pos = messageContext->messageBuffer.data; - /* Encode the chunk headers at the beginning of the buffer */ - UA_assert(res == UA_STATUSCODE_GOOD); - UA_Byte *header_pos = mc->messageBuffer.data; UA_SecureConversationMessageHeader respHeader; respHeader.secureChannelId = channel->securityToken.channelId; - respHeader.messageHeader.messageTypeAndChunkType = mc->messageType; - respHeader.messageHeader.messageSize = (UA_UInt32)total_length; - if(mc->final) + respHeader.messageHeader.messageTypeAndChunkType = messageContext->messageType; + respHeader.messageHeader.messageSize = (UA_UInt32)totalLength; + if(messageContext->final) respHeader.messageHeader.messageTypeAndChunkType += UA_CHUNKTYPE_FINAL; else respHeader.messageHeader.messageTypeAndChunkType += UA_CHUNKTYPE_INTERMEDIATE; - res = UA_encodeBinary(&respHeader, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER], - &header_pos, &mc->buf_end, NULL, NULL); + + UA_StatusCode res = + UA_encodeBinary(&respHeader, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER], + &header_pos, &messageContext->buf_end, NULL, NULL); UA_SymmetricAlgorithmSecurityHeader symSecHeader; symSecHeader.tokenId = channel->securityToken.tokenId; res |= UA_encodeBinary(&symSecHeader.tokenId, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER], - &header_pos, &mc->buf_end, NULL, NULL); + &header_pos, &messageContext->buf_end, NULL, NULL); UA_SequenceHeader seqHeader; - seqHeader.requestId = mc->requestId; + seqHeader.requestId = messageContext->requestId; seqHeader.sequenceNumber = UA_atomic_addUInt32(&channel->sendSequenceNumber, 1); res |= UA_encodeBinary(&seqHeader, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER], - &header_pos, &mc->buf_end, NULL, NULL); + &header_pos, &messageContext->buf_end, NULL, NULL); - /* Sign message */ + return res; +} + +static UA_StatusCode +sendSymmetricChunk(UA_MessageContext *messageContext) { + UA_SecureChannel *const channel = messageContext->channel; + const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; + UA_Connection *const connection = channel->connection; + if(!connection) + return UA_STATUSCODE_BADINTERNALERROR; + + size_t bodyLength = 0; + UA_StatusCode res = checkLimitsSym(messageContext, &bodyLength); + if(res != UA_STATUSCODE_GOOD) + goto error; + + /* Add padding */ +#ifdef UA_ENABLE_ENCRYPTION + padChunkSym(messageContext, bodyLength); +#endif + + /* The total message length */ + size_t pre_sig_length = (uintptr_t)(messageContext->buf_pos) - + (uintptr_t)messageContext->messageBuffer.data; + size_t total_length = pre_sig_length; if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || - channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { - UA_ByteString dataToSign = mc->messageBuffer; - dataToSign.length = pre_sig_length; - UA_ByteString signature; - signature.length = securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm. + channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) + total_length += securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm. getLocalSignatureSize(securityPolicy, channel->channelContext); - signature.data = mc->buf_pos; - res |= securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm. - sign(securityPolicy, channel->channelContext, &dataToSign, &signature); - } + /* Space for the padding and the signature have been reserved in setBufPos() */ + UA_assert(total_length <= connection->config.sendBufferSize); - /* Encrypt message */ - if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { - UA_ByteString dataToEncrypt; - dataToEncrypt.data = mc->messageBuffer.data + UA_SECUREMH_AND_SYMALGH_LENGTH; - dataToEncrypt.length = total_length - UA_SECUREMH_AND_SYMALGH_LENGTH; - res |= securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm. - encrypt(securityPolicy, channel->channelContext, &dataToEncrypt); - } + /* For giving the buffer to the network layer */ + messageContext->messageBuffer.length = total_length; - if(res != UA_STATUSCODE_GOOD) { - connection->releaseSendBuffer(channel->connection, &mc->messageBuffer); - return res; - } + UA_assert(res == UA_STATUSCODE_GOOD); + res = encodeHeadersSym(messageContext, total_length); + if(res != UA_STATUSCODE_GOOD) + goto error; + +#ifdef UA_ENABLE_ENCRYPTION + res = signChunkSym(messageContext, pre_sig_length); + if(res != UA_STATUSCODE_GOOD) + goto error; + + res = encryptChunkSym(messageContext, total_length); + if(res != UA_STATUSCODE_GOOD) + goto error; +#endif /* Send the chunk, the buffer is freed in the network layer */ - return connection->send(channel->connection, &mc->messageBuffer); + return connection->send(channel->connection, &messageContext->messageBuffer); + +error: + connection->releaseSendBuffer(channel->connection, &messageContext->messageBuffer); + return res; } /* Callback from the encoding layer. Send the chunk and replace the buffer. */ @@ -18600,7 +21783,10 @@ sendSymmetricEncodingCallback(void *data, UA_Byte **buf_pos, const UA_Byte **buf /* Set a new buffer for the next chunk */ UA_Connection *connection = mc->channel->connection; - retval = connection->getSendBuffer(connection, connection->localConf.sendBufferSize, + if(!connection) + return UA_STATUSCODE_BADINTERNALERROR; + + retval = connection->getSendBuffer(connection, connection->config.sendBufferSize, &mc->messageBuffer); if(retval != UA_STATUSCODE_GOOD) return retval; @@ -18631,13 +21817,9 @@ UA_MessageContext_begin(UA_MessageContext *mc, UA_SecureChannel *channel, mc->messageBuffer = UA_BYTESTRING_NULL; mc->messageType = messageType; - /* Minimum required size */ - if(connection->localConf.sendBufferSize <= UA_SECURE_MESSAGE_HEADER_LENGTH) - return UA_STATUSCODE_BADRESPONSETOOLARGE; - /* Allocate the message buffer */ UA_StatusCode retval = - connection->getSendBuffer(connection, connection->localConf.sendBufferSize, + connection->getSendBuffer(connection, connection->config.sendBufferSize, &mc->messageBuffer); if(retval != UA_STATUSCODE_GOOD) return retval; @@ -18652,13 +21834,8 @@ UA_MessageContext_encode(UA_MessageContext *mc, const void *content, const UA_DataType *contentType) { UA_StatusCode retval = UA_encodeBinary(content, contentType, &mc->buf_pos, &mc->buf_end, sendSymmetricEncodingCallback, mc); - if(retval != UA_STATUSCODE_GOOD) { - /* TODO: Send the abort message */ - if(mc->messageBuffer.length > 0) { - UA_Connection *connection = mc->channel->connection; - connection->releaseSendBuffer(connection, &mc->messageBuffer); - } - } + if(retval != UA_STATUSCODE_GOOD && mc->messageBuffer.length > 0) + UA_MessageContext_abort(mc); return retval; } @@ -18678,13 +21855,11 @@ UA_StatusCode UA_SecureChannel_sendSymmetricMessage(UA_SecureChannel *channel, UA_UInt32 requestId, UA_MessageType messageType, void *payload, const UA_DataType *payloadType) { - if(!channel || !payload || !payloadType) + if(!channel || !channel->connection || !payload || !payloadType) return UA_STATUSCODE_BADINTERNALERROR; - if(channel->connection) { - if(channel->connection->state == UA_CONNECTION_CLOSED) - return UA_STATUSCODE_BADCONNECTIONCLOSED; - } + if(channel->connection->state == UA_CONNECTION_CLOSED) + return UA_STATUSCODE_BADCONNECTIONCLOSED; UA_MessageContext mc; UA_StatusCode retval = UA_MessageContext_begin(&mc, channel, requestId, messageType); @@ -18711,101 +21886,130 @@ UA_SecureChannel_sendSymmetricMessage(UA_SecureChannel *channel, UA_UInt32 reque /* Assemble Complete Message */ /*****************************/ -static void -UA_SecureChannel_removeChunks(UA_SecureChannel *channel, UA_UInt32 requestId) { - struct MessageEntry *me; - LIST_FOREACH(me, &channel->chunks, pointers) { - if(me->requestId == requestId) { - struct ChunkPayload *cp, *temp_cp; - SIMPLEQ_FOREACH_SAFE(cp, &me->chunkPayload, pointers, temp_cp) { - UA_ByteString_deleteMembers(&cp->bytes); - UA_free(cp); - } - LIST_REMOVE(me, pointers); - UA_free(me); - return; - } - } -} - -static UA_StatusCode -appendChunk(struct MessageEntry *messageEntry, const UA_ByteString *chunkBody) { - - struct ChunkPayload* cp = (struct ChunkPayload*)UA_malloc(sizeof(struct ChunkPayload)); - UA_StatusCode retval = UA_ByteString_copy(chunkBody, &cp->bytes); - if (retval != UA_STATUSCODE_GOOD) - return retval; - - SIMPLEQ_INSERT_TAIL(&messageEntry->chunkPayload, cp, pointers); - messageEntry->chunkPayloadSize += chunkBody->length; - return UA_STATUSCODE_GOOD; -} - static UA_StatusCode -UA_SecureChannel_appendChunk(UA_SecureChannel *channel, UA_UInt32 requestId, - const UA_ByteString *chunkBody) { - struct MessageEntry *me; - LIST_FOREACH(me, &channel->chunks, pointers) { - if(me->requestId == requestId) - break; +addChunkPayload(UA_SecureChannel *channel, UA_UInt32 requestId, + UA_MessageType messageType, UA_ByteString *chunkPayload, + UA_Boolean final) { + UA_Message *latest = TAILQ_LAST(&channel->messages, UA_MessageQueue); + if(latest) { + if(latest->requestId != requestId) { + /* Start of a new message */ + if(!latest->final) + return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; + latest = NULL; + } else { + if(latest->messageType != messageType) /* MessageType mismatch */ + return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; + if(latest->final) /* Correct message, but already finalized */ + return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; + } } - /* No chunkentry on the channel, create one */ - if(!me) { - me = (struct MessageEntry *)UA_malloc(sizeof(struct MessageEntry)); - if(!me) + /* Create a new message entry */ + if(!latest) { + latest = (UA_Message *)UA_malloc(sizeof(UA_Message)); + if(!latest) return UA_STATUSCODE_BADOUTOFMEMORY; - memset(me, 0, sizeof(struct MessageEntry)); - me->requestId = requestId; - SIMPLEQ_INIT(&me->chunkPayload); - LIST_INSERT_HEAD(&channel->chunks, me, pointers); + memset(latest, 0, sizeof(UA_Message)); + latest->requestId = requestId; + latest->messageType = messageType; + SIMPLEQ_INIT(&latest->chunkPayloads); + TAILQ_INSERT_TAIL(&channel->messages, latest, pointers); } - return appendChunk(me, chunkBody); + /* Test against the connection settings */ + const UA_ConnectionConfig *config = &channel->connection->config; + UA_assert(config != NULL); /* clang-analyzer false positive */ + + if(config->maxChunkCount > 0 && + config->maxChunkCount <= latest->chunkPayloadsSize) + return UA_STATUSCODE_BADRESPONSETOOLARGE; + + if(config->maxMessageSize > 0 && + config->maxMessageSize < latest->messageSize + chunkPayload->length) + return UA_STATUSCODE_BADRESPONSETOOLARGE; + + /* Create a new chunk entry */ + UA_ChunkPayload *cp = (UA_ChunkPayload *)UA_malloc(sizeof(UA_ChunkPayload)); + if(!cp) + return UA_STATUSCODE_BADOUTOFMEMORY; + cp->bytes = *chunkPayload; + cp->copied = false; + + /* Add the chunk */ + SIMPLEQ_INSERT_TAIL(&latest->chunkPayloads, cp, pointers); + latest->chunkPayloadsSize += 1; + latest->messageSize += chunkPayload->length; + latest->final = final; + + return UA_STATUSCODE_GOOD; } static UA_StatusCode -UA_SecureChannel_finalizeChunk(UA_SecureChannel *channel, UA_UInt32 requestId, - const UA_ByteString *chunkBody, UA_MessageType messageType, - UA_ProcessMessageCallback callback, void *application) { - struct MessageEntry *messageEntry; - LIST_FOREACH(messageEntry, &channel->chunks, pointers) { - if(messageEntry->requestId == requestId) - break; - } - - UA_ByteString bytes; - if(!messageEntry) { - bytes = *chunkBody; +processMessage(UA_SecureChannel *channel, const UA_Message *message, + void *application, UA_ProcessMessageCallback callback) { + if(message->chunkPayloadsSize == 1) { + /* No need to combine chunks */ + UA_ChunkPayload *cp = SIMPLEQ_FIRST(&message->chunkPayloads); + callback(application, channel, message->messageType, message->requestId, &cp->bytes); } else { - UA_StatusCode retval = appendChunk(messageEntry, chunkBody); - if(retval != UA_STATUSCODE_GOOD) - return retval; - - UA_ByteString_init(&bytes); - - bytes.data = (UA_Byte*) UA_malloc(messageEntry->chunkPayloadSize); - if (!bytes.data) + /* Allocate memory */ + UA_ByteString bytes; + bytes.data = (UA_Byte *)UA_malloc(message->messageSize); + if(!bytes.data) { + UA_LOG_ERROR(channel->securityPolicy->logger, UA_LOGCATEGORY_SECURECHANNEL, + "Could not allocate the memory to assemble the message"); return UA_STATUSCODE_BADOUTOFMEMORY; + } + bytes.length = message->messageSize; - struct ChunkPayload *cp, *temp_cp; + /* Assemble the full message */ size_t curPos = 0; - SIMPLEQ_FOREACH_SAFE(cp, &messageEntry->chunkPayload, pointers, temp_cp) { + UA_ChunkPayload *cp; + SIMPLEQ_FOREACH(cp, &message->chunkPayloads, pointers) { memcpy(&bytes.data[curPos], cp->bytes.data, cp->bytes.length); curPos += cp->bytes.length; - UA_ByteString_deleteMembers(&cp->bytes); - UA_free(cp); } - bytes.length = messageEntry->chunkPayloadSize; - - LIST_REMOVE(messageEntry, pointers); - UA_free(messageEntry); + /* Process the message */ + callback(application, channel, message->messageType, message->requestId, &bytes); + UA_ByteString_deleteMembers(&bytes); } + return UA_STATUSCODE_GOOD; +} - UA_StatusCode retval = callback(application, channel, messageType, requestId, &bytes); - if(messageEntry) - UA_ByteString_deleteMembers(&bytes); +UA_StatusCode +UA_SecureChannel_processCompleteMessages(UA_SecureChannel *channel, void *application, + UA_ProcessMessageCallback callback) { + UA_Message *message, *tmp_message; + UA_StatusCode retval = UA_STATUSCODE_GOOD; + TAILQ_FOREACH_SAFE(message, &channel->messages, pointers, tmp_message) { + /* Stop at the first incomplete message */ + if(!message->final) + break; + + /* Has the channel been closed (during the last message)? */ + if(channel->state == UA_SECURECHANNELSTATE_CLOSED) + break; + + /* Remove the current message before processing */ + TAILQ_REMOVE(&channel->messages, message, pointers); + + /* Process */ + retval = processMessage(channel, message, application, callback); + if(retval != UA_STATUSCODE_GOOD) + break; + + /* Clean up the message */ + UA_ChunkPayload *payload; + while((payload = SIMPLEQ_FIRST(&message->chunkPayloads))) { + if(payload->copied) + UA_ByteString_deleteMembers(&payload->bytes); + SIMPLEQ_REMOVE_HEAD(&message->chunkPayloads, pointers); + UA_free(payload); + } + UA_free(message); + } return retval; } @@ -18814,62 +22018,119 @@ UA_SecureChannel_finalizeChunk(UA_SecureChannel *channel, UA_UInt32 requestId, /****************************/ static UA_StatusCode -decryptChunk(UA_SecureChannel *channel, const UA_SecurityPolicyCryptoModule *cryptoModule, - UA_ByteString *chunk, size_t offset, UA_UInt32 *requestId, UA_UInt32 *sequenceNumber, - UA_ByteString *payload, UA_MessageType messageType) { - UA_StatusCode retval = UA_STATUSCODE_GOOD; - const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; - size_t chunkSizeAfterDecryption = chunk->length; +decryptChunk(const UA_SecureChannel *const channel, + const UA_SecurityPolicyCryptoModule *const cryptoModule, + UA_MessageType const messageType, const UA_ByteString *const chunk, + size_t const offset, size_t *const chunkSizeAfterDecryption) { + UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, "Decrypting chunk"); - /* Decrypt the chunk. Always decrypt opn messages if mode not none */ + UA_ByteString cipherText = {chunk->length - offset, chunk->data + offset}; + size_t sizeBeforeDecryption = cipherText.length; + size_t chunkSizeBeforeDecryption = *chunkSizeAfterDecryption; + + /* Always decrypt opn messages if mode not none */ if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT || messageType == UA_MESSAGETYPE_OPN) { - UA_ByteString cipherText = {chunk->length - offset, chunk->data + offset}; - size_t sizeBeforeDecryption = cipherText.length; - retval = cryptoModule->encryptionAlgorithm.decrypt(securityPolicy, channel->channelContext, &cipherText); - chunkSizeAfterDecryption -= (sizeBeforeDecryption - cipherText.length); - if(retval != UA_STATUSCODE_GOOD) + UA_StatusCode retval = cryptoModule->encryptionAlgorithm. + decrypt(channel->securityPolicy, channel->channelContext, &cipherText); + *chunkSizeAfterDecryption -= (sizeBeforeDecryption - cipherText.length); + if(retval != UA_STATUSCODE_GOOD) { return retval; + } + } + + UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, + "Chunk size before and after decryption: %lu, %lu", + (long unsigned int)chunkSizeBeforeDecryption, + (long unsigned int)*chunkSizeAfterDecryption); + + return UA_STATUSCODE_GOOD; +} + +static UA_UInt16 +decodeChunkPaddingSize(const UA_SecureChannel *const channel, + const UA_SecurityPolicyCryptoModule *const cryptoModule, + UA_MessageType const messageType, const UA_ByteString *const chunk, + size_t const chunkSizeAfterDecryption, size_t sigsize) { + /* Is padding used? */ + if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT && + !(messageType == UA_MESSAGETYPE_OPN && + !UA_String_equal(&cryptoModule->encryptionAlgorithm.uri, &UA_STRING_NULL))) + return 0; + + size_t paddingSize = chunk->data[chunkSizeAfterDecryption - sigsize - 1]; + + /* Extra padding size */ + size_t keyLength = cryptoModule->encryptionAlgorithm. + getLocalKeyLength(channel->securityPolicy, channel->channelContext); + if(keyLength > 2048) { + paddingSize <<= 8u; + paddingSize += 1; + paddingSize += chunk->data[chunkSizeAfterDecryption - sigsize - 2]; } + /* We need to add one to the padding size since the paddingSize byte itself + * need to be removed as well. */ + paddingSize += 1; + + UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, + "Calculated padding size to be %lu", + (long unsigned int)paddingSize); + return (UA_UInt16)paddingSize; +} + +static UA_StatusCode +verifyChunk(const UA_SecureChannel *const channel, + const UA_SecurityPolicyCryptoModule *const cryptoModule, + const UA_ByteString *const chunk, + size_t const chunkSizeAfterDecryption, size_t sigsize) { + UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, + "Verifying chunk signature"); + + /* Verify the signature */ + const UA_ByteString chunkDataToVerify = {chunkSizeAfterDecryption - sigsize, chunk->data}; + const UA_ByteString signature = {sigsize, chunk->data + chunkSizeAfterDecryption - sigsize}; + UA_StatusCode retval = cryptoModule->signatureAlgorithm. + verify(channel->securityPolicy, channel->channelContext, &chunkDataToVerify, &signature); +#ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS + retval |= decrypt_verifySignatureFailure; +#endif + + return retval; +} + +/* Sets the payload to a pointer inside the chunk buffer. Returns the requestId + * and the sequenceNumber */ +static UA_StatusCode +decryptAndVerifyChunk(const UA_SecureChannel *channel, + const UA_SecurityPolicyCryptoModule *cryptoModule, + UA_MessageType messageType, const UA_ByteString *chunk, + size_t offset, UA_UInt32 *requestId, + UA_UInt32 *sequenceNumber, UA_ByteString *payload) { + size_t chunkSizeAfterDecryption = chunk->length; + UA_StatusCode retval = decryptChunk(channel, cryptoModule, messageType, + chunk, offset, &chunkSizeAfterDecryption); + if(retval != UA_STATUSCODE_GOOD) + return retval; + /* Verify the chunk signature */ size_t sigsize = 0; size_t paddingSize = 0; + const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT || messageType == UA_MESSAGETYPE_OPN) { - /* Compute the padding size */ - sigsize = cryptoModule->signatureAlgorithm.getRemoteSignatureSize(securityPolicy, channel->channelContext); - - if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT || - (messageType == UA_MESSAGETYPE_OPN && - channel->securityMode > UA_MESSAGESECURITYMODE_NONE)) { - paddingSize = (size_t)chunk->data[chunkSizeAfterDecryption - sigsize - 1]; - - size_t keyLength = - cryptoModule->encryptionAlgorithm.getRemoteKeyLength(securityPolicy, channel->channelContext); - if(keyLength > 2048) { - paddingSize <<= 8; /* Extra padding size */ - paddingSize += chunk->data[chunkSizeAfterDecryption - sigsize - 2]; - // see comment below but for extraPaddingSize - paddingSize += 1; - } + sigsize = cryptoModule->signatureAlgorithm. + getRemoteSignatureSize(securityPolicy, channel->channelContext); + paddingSize = decodeChunkPaddingSize(channel, cryptoModule, messageType, chunk, + chunkSizeAfterDecryption, sigsize); + if(retval != UA_STATUSCODE_GOOD) + return retval; - // we need to add one to the padding size since the paddingSize byte itself need to be removed as well. - // TODO: write unit test for correct padding calculation - paddingSize += 1; - } if(offset + paddingSize + sigsize >= chunkSizeAfterDecryption) return UA_STATUSCODE_BADSECURITYCHECKSFAILED; - /* Verify the signature */ - const UA_ByteString chunkDataToVerify = {chunkSizeAfterDecryption - sigsize, chunk->data}; - const UA_ByteString signature = {sigsize, chunk->data + chunkSizeAfterDecryption - sigsize}; - retval = cryptoModule->signatureAlgorithm.verify(securityPolicy, channel->channelContext, - &chunkDataToVerify, &signature); -#ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS - retval |= decrypt_verifySignatureFailure; -#endif + retval = verifyChunk(channel, cryptoModule, chunk, chunkSizeAfterDecryption, sigsize); if(retval != UA_STATUSCODE_GOOD) return retval; } @@ -18887,27 +22148,33 @@ decryptChunk(UA_SecureChannel *channel, const UA_SecurityPolicyCryptoModule *cry *sequenceNumber = sequenceHeader.sequenceNumber; payload->data = chunk->data + offset; payload->length = chunkSizeAfterDecryption - offset - sigsize - paddingSize; + UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, + "Decrypted and verified chunk with request id %u and " + "sequence number %u", *requestId, *sequenceNumber); return UA_STATUSCODE_GOOD; } -typedef UA_StatusCode(*UA_SequenceNumberCallback)(UA_SecureChannel *channel, - UA_UInt32 sequenceNumber); +typedef UA_StatusCode +(*UA_SequenceNumberCallback)(UA_SecureChannel *channel, UA_UInt32 sequenceNumber); static UA_StatusCode -processSequenceNumberAsym(UA_SecureChannel *const channel, UA_UInt32 sequenceNumber) { +processSequenceNumberAsym(UA_SecureChannel *channel, UA_UInt32 sequenceNumber) { + UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, + "Sequence Number processed: %i", sequenceNumber); channel->receiveSequenceNumber = sequenceNumber; - return UA_STATUSCODE_GOOD; } static UA_StatusCode -processSequenceNumberSym(UA_SecureChannel *const channel, UA_UInt32 sequenceNumber) { +processSequenceNumberSym(UA_SecureChannel *channel, UA_UInt32 sequenceNumber) { /* Failure mode hook for unit tests */ #ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS if(processSym_seqNumberFailure != UA_STATUSCODE_GOOD) return processSym_seqNumberFailure; #endif + UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, + "Sequence Number processed: %i", sequenceNumber); /* Does the sequence number match? */ if(sequenceNumber != channel->receiveSequenceNumber + 1) { /* FIXME: Remove magic numbers :( */ @@ -18923,10 +22190,10 @@ processSequenceNumberSym(UA_SecureChannel *const channel, UA_UInt32 sequenceNumb static UA_StatusCode checkAsymHeader(UA_SecureChannel *const channel, UA_AsymmetricAlgorithmSecurityHeader *const asymHeader) { - UA_StatusCode retval = UA_STATUSCODE_GOOD; const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy; - if(!UA_ByteString_equal(&securityPolicy->policyUri, &asymHeader->securityPolicyUri)) { + if(!UA_ByteString_equal(&securityPolicy->policyUri, + &asymHeader->securityPolicyUri)) { return UA_STATUSCODE_BADSECURITYPOLICYREJECTED; } @@ -18936,8 +22203,9 @@ checkAsymHeader(UA_SecureChannel *const channel, if(retval != UA_STATUSCODE_GOOD) return retval; */ - retval = securityPolicy->asymmetricModule. - compareCertificateThumbprint(securityPolicy, &asymHeader->receiverCertificateThumbprint); + UA_StatusCode retval = securityPolicy->asymmetricModule. + compareCertificateThumbprint(securityPolicy, + &asymHeader->receiverCertificateThumbprint); if(retval != UA_STATUSCODE_GOOD) { return retval; } @@ -18951,13 +22219,11 @@ checkPreviousToken(UA_SecureChannel *const channel, const UA_UInt32 tokenId) { return UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN; UA_DateTime timeout = channel->previousSecurityToken.createdAt + - (UA_DateTime)((UA_Double)channel->previousSecurityToken.revisedLifetime * - (UA_Double)UA_DATETIME_MSEC * - 1.25); + (UA_DateTime)((UA_Double)channel->previousSecurityToken.revisedLifetime * + (UA_Double)UA_DATETIME_MSEC * 1.25); - if(timeout < UA_DateTime_nowMonotonic()) { + if(timeout < UA_DateTime_nowMonotonic()) return UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN; - } return UA_STATUSCODE_GOOD; } @@ -18966,39 +22232,79 @@ static UA_StatusCode checkSymHeader(UA_SecureChannel *const channel, const UA_UInt32 tokenId, UA_Boolean allowPreviousToken) { + /* If the message uses the currently active token, check if it is still valid */ if(tokenId == channel->securityToken.tokenId) { if(channel->state == UA_SECURECHANNELSTATE_OPEN && (channel->securityToken.createdAt + - (channel->securityToken.revisedLifetime * UA_DATETIME_MSEC)) < UA_DateTime_nowMonotonic()) { - UA_SecureChannel_deleteMembersCleanup(channel); + (channel->securityToken.revisedLifetime * UA_DATETIME_MSEC)) + < UA_DateTime_nowMonotonic()) { + UA_SecureChannel_close(channel); return UA_STATUSCODE_BADSECURECHANNELCLOSED; } } + /* If the message uses a different token, check if it is the next token. */ if(tokenId != channel->securityToken.tokenId) { + /* If it isn't the next token, we might be dealing with a message, that + * still uses the old token, so check if the old one is still valid.*/ if(tokenId != channel->nextSecurityToken.tokenId) { if(allowPreviousToken) return checkPreviousToken(channel, tokenId); - else - return UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN; + + return UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN; + } + /* If the token is indeed the next token, revolve the tokens */ + UA_StatusCode retval = UA_SecureChannel_revolveTokens(channel); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + /* If the message now uses the currently active token also generate + * new remote keys to correctly decrypt. */ + if(channel->securityToken.tokenId == tokenId) { + retval = UA_SecureChannel_generateRemoteKeys(channel, channel->securityPolicy); + UA_ChannelSecurityToken_deleteMembers(&channel->previousSecurityToken); + UA_ChannelSecurityToken_init(&channel->previousSecurityToken); + return retval; } - return UA_SecureChannel_revolveTokens(channel); } + /* It is possible that the sent messages already use the new token, but + * the received messages still use the old token. If we receive a message + * with the new token, we will need to generate the keys and discard the + * old token now*/ if(channel->previousSecurityToken.tokenId != 0) { - UA_StatusCode retval = UA_SecureChannel_generateRemoteKeys(channel, channel->securityPolicy); + UA_StatusCode retval = + UA_SecureChannel_generateRemoteKeys(channel, channel->securityPolicy); UA_ChannelSecurityToken_deleteMembers(&channel->previousSecurityToken); + UA_ChannelSecurityToken_init(&channel->previousSecurityToken); return retval; } return UA_STATUSCODE_GOOD; } -UA_StatusCode -UA_SecureChannel_processChunk(UA_SecureChannel *channel, UA_ByteString *chunk, - UA_ProcessMessageCallback callback, - void *application, UA_Boolean allowPreviousToken) { - /* Decode message header */ +static UA_StatusCode +putPayload(UA_SecureChannel *const channel, UA_UInt32 const requestId, + UA_MessageType const messageType, UA_ChunkType const chunkType, + UA_ByteString *chunkPayload) { + switch(chunkType) { + case UA_CHUNKTYPE_INTERMEDIATE: + case UA_CHUNKTYPE_FINAL: + return addChunkPayload(channel, requestId, messageType, + chunkPayload, chunkType == UA_CHUNKTYPE_FINAL); + case UA_CHUNKTYPE_ABORT: + deleteLatestMessage(channel, requestId); + return UA_STATUSCODE_GOOD; + default: + return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; + } +} + +/* The chunk body begins after the SecureConversationMessageHeader */ +static UA_StatusCode +decryptAddChunk(UA_SecureChannel *channel, const UA_ByteString *chunk, + UA_Boolean allowPreviousToken) { + /* Decode the MessageHeader */ size_t offset = 0; UA_SecureConversationMessageHeader messageHeader; UA_StatusCode retval = @@ -19017,8 +22323,6 @@ UA_SecureChannel_processChunk(UA_SecureChannel *channel, UA_ByteString *chunk, (messageHeader.messageHeader.messageTypeAndChunkType & UA_BITMASK_MESSAGETYPE); UA_ChunkType chunkType = (UA_ChunkType) (messageHeader.messageHeader.messageTypeAndChunkType & UA_BITMASK_CHUNKTYPE); - - /* ERR message (not encrypted) */ UA_UInt32 requestId = 0; UA_UInt32 sequenceNumber = 0; UA_ByteString chunkPayload; @@ -19026,14 +22330,15 @@ UA_SecureChannel_processChunk(UA_SecureChannel *channel, UA_ByteString *chunk, UA_SequenceNumberCallback sequenceNumberCallback = NULL; switch(messageType) { - case UA_MESSAGETYPE_ERR: { + /* ERR message (not encrypted) */ + case UA_MESSAGETYPE_ERR: if(chunkType != UA_CHUNKTYPE_FINAL) return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; chunkPayload.length = chunk->length - offset; chunkPayload.data = chunk->data + offset; - return callback(application, channel, messageType, requestId, &chunkPayload); - } + return putPayload(channel, requestId, messageType, chunkType, &chunkPayload); + /* MSG and CLO: Symmetric encryption */ case UA_MESSAGETYPE_MSG: case UA_MESSAGETYPE_CLO: { /* Decode and check the symmetric security header (tokenId) */ @@ -19057,6 +22362,8 @@ UA_SecureChannel_processChunk(UA_SecureChannel *channel, UA_ByteString *chunk, sequenceNumberCallback = processSequenceNumberSym; break; } + + /* OPN: Asymmetric encryption */ case UA_MESSAGETYPE_OPN: { /* Chunking not allowed for OPN */ if(chunkType != UA_CHUNKTYPE_FINAL) @@ -19080,44 +22387,71 @@ UA_SecureChannel_processChunk(UA_SecureChannel *channel, UA_ByteString *chunk, sequenceNumberCallback = processSequenceNumberAsym; break; } + + /* Invalid message type */ default:return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; } - /* Decrypt message */ UA_assert(cryptoModule != NULL); - retval = decryptChunk(channel, cryptoModule, chunk, offset, &requestId, - &sequenceNumber, &chunkPayload, messageType); + retval = decryptAndVerifyChunk(channel, cryptoModule, messageType, chunk, offset, + &requestId, &sequenceNumber, &chunkPayload); if(retval != UA_STATUSCODE_GOOD) return retval; - /* Check the sequence number */ + /* Check the sequence number. Skip sequence number checking for fuzzer to + * improve coverage */ if(sequenceNumberCallback == NULL) return UA_STATUSCODE_BADINTERNALERROR; - retval = sequenceNumberCallback(channel, sequenceNumber); - - /* Skip sequence number checking for fuzzer to improve coverage */ - if(retval != UA_STATUSCODE_GOOD) { -#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) - return retval; +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) + retval = UA_STATUSCODE_GOOD; #else - retval = UA_STATUSCODE_GOOD; + retval = sequenceNumberCallback(channel, sequenceNumber); #endif - } + if(retval != UA_STATUSCODE_GOOD) + return retval; + + return putPayload(channel, requestId, messageType, chunkType, &chunkPayload); +} + +UA_StatusCode +UA_SecureChannel_decryptAddChunk(UA_SecureChannel *channel, const UA_ByteString *chunk, + UA_Boolean allowPreviousToken) { + /* Has the SecureChannel timed out? */ + if(channel->state == UA_SECURECHANNELSTATE_CLOSED) + return UA_STATUSCODE_BADSECURECHANNELCLOSED; + + /* Is the SecureChannel configured? */ + if(!channel->connection) + return UA_STATUSCODE_BADINTERNALERROR; + + UA_StatusCode retval = decryptAddChunk(channel, chunk, allowPreviousToken); + if(retval != UA_STATUSCODE_GOOD) + UA_SecureChannel_close(channel); - /* Process the payload */ - if(chunkType == UA_CHUNKTYPE_FINAL) { - retval = UA_SecureChannel_finalizeChunk(channel, requestId, &chunkPayload, - messageType, callback, application); - } else if(chunkType == UA_CHUNKTYPE_INTERMEDIATE) { - retval = UA_SecureChannel_appendChunk(channel, requestId, &chunkPayload); - } else if(chunkType == UA_CHUNKTYPE_ABORT) { - UA_SecureChannel_removeChunks(channel, requestId); - } else { - retval = UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; - } return retval; } +UA_StatusCode +UA_SecureChannel_persistIncompleteMessages(UA_SecureChannel *channel) { + UA_Message *me; + TAILQ_FOREACH(me, &channel->messages, pointers) { + UA_ChunkPayload *cp; + SIMPLEQ_FOREACH(cp, &me->chunkPayloads, pointers) { + if(cp->copied) + continue; + UA_ByteString copy; + UA_StatusCode retval = UA_ByteString_copy(&cp->bytes, ©); + if(retval != UA_STATUSCODE_GOOD) { + UA_SecureChannel_close(channel); + return retval; + } + cp->bytes = copy; + cp->copied = true; + } + } + return UA_STATUSCODE_GOOD; +} + /* Functionality used by both the SecureChannel and the SecurityPolicy */ size_t @@ -19127,10 +22461,10 @@ UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(const UA_SecurityP if(maxEncryptionLength == 0) return 0; - size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. - getRemotePlainTextBlockSize(securityPolicy, channelContext); - size_t encryptedBlockSize = securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. - getRemoteBlockSize(securityPolicy, channelContext); + size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule. + encryptionAlgorithm.getRemotePlainTextBlockSize(securityPolicy, channelContext); + size_t encryptedBlockSize = securityPolicy->asymmetricModule.cryptoModule. + encryptionAlgorithm.getRemoteBlockSize(securityPolicy, channelContext); if(plainTextBlockSize == 0) return 0; @@ -19138,13 +22472,13 @@ UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(const UA_SecurityP return maxNumberOfBlocks * (encryptedBlockSize - plainTextBlockSize); } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_session.c" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_session.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2018 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA */ @@ -19161,49 +22495,20 @@ void UA_Session_init(UA_Session *session) { #endif } -#ifdef UA_ENABLE_SUBSCRIPTIONS -static void -deleteSubscription(UA_Server *server, UA_Session *session, - UA_Subscription *sub) { - UA_Subscription_deleteMembers(server, sub); - - /* Add a delayed callback to remove the subscription when the currently - * scheduled jobs have completed */ - UA_StatusCode retval = UA_Server_delayedFree(server, sub); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_WARNING_SESSION(server->config.logger, session, - "Could not remove subscription with error code %s", - UA_StatusCode_name(retval)); - } - - /* Remove from the session */ - LIST_REMOVE(sub, listEntry); - UA_assert(session->numSubscriptions > 0); - session->numSubscriptions--; -} -#endif - -void UA_Session_deleteMembersCleanup(UA_Session *session, UA_Server *server) { +void UA_Session_deleteMembersCleanup(UA_Session *session, UA_Server* server) { UA_Session_detachFromSecureChannel(session); UA_ApplicationDescription_deleteMembers(&session->clientDescription); UA_NodeId_deleteMembers(&session->header.authenticationToken); UA_NodeId_deleteMembers(&session->sessionId); UA_String_deleteMembers(&session->sessionName); UA_ByteString_deleteMembers(&session->serverNonce); - struct ContinuationPointEntry *cp, *temp; - LIST_FOREACH_SAFE(cp, &session->continuationPoints, pointers, temp) { - LIST_REMOVE(cp, pointers); - UA_ByteString_deleteMembers(&cp->identifier); - UA_BrowseDescription_deleteMembers(&cp->browseDescription); + struct ContinuationPoint *cp, *next = session->continuationPoints; + while((cp = next)) { + next = ContinuationPoint_clear(cp); UA_free(cp); } - -#ifdef UA_ENABLE_SUBSCRIPTIONS - UA_Subscription *sub, *sub_tmp; - LIST_FOREACH_SAFE(sub, &session->serverSubscriptions, listEntry, sub_tmp) { - deleteSubscription(server, session, sub); - } -#endif + session->continuationPoints = NULL; + session->availableContinuationPoints = UA_MAXCONTINUATIONPOINTS; } void UA_Session_attachToSecureChannel(UA_Session *session, UA_SecureChannel *channel) { @@ -19244,11 +22549,12 @@ void UA_Session_updateLifetime(UA_Session *session) { #ifdef UA_ENABLE_SUBSCRIPTIONS -void UA_Session_addSubscription(UA_Session *session, UA_Subscription *newSubscription) { - newSubscription->subscriptionId = ++session->lastSubscriptionId; +void UA_Session_addSubscription(UA_Server *server, UA_Session *session, UA_Subscription *newSubscription) { + newSubscription->subscriptionId = ++server->lastSubscriptionId; LIST_INSERT_HEAD(&session->serverSubscriptions, newSubscription, listEntry); session->numSubscriptions++; + server->numSubscriptions++; } UA_StatusCode @@ -19258,7 +22564,20 @@ UA_Session_deleteSubscription(UA_Server *server, UA_Session *session, if(!sub) return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; - deleteSubscription(server, session, sub); + UA_Subscription_deleteMembers(server, sub); + + /* Add a delayed callback to remove the subscription when the currently + * scheduled jobs have completed. There is no actual delayed callback. Just + * free the structure. */ + sub->delayedFreePointers.callback = NULL; + UA_WorkQueue_enqueueDelayed(&server->workQueue, &sub->delayedFreePointers); + + /* Remove from the session */ + LIST_REMOVE(sub, listEntry); + UA_assert(session->numSubscriptions > 0); + UA_assert(server->numSubscriptions > 0); + session->numSubscriptions--; + server->numSubscriptions--; return UA_STATUSCODE_GOOD; } @@ -19293,13 +22612,13 @@ UA_Session_queuePublishReq(UA_Session *session, UA_PublishResponseEntry* entry, #endif -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_nodes.c" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_nodes.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2015-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2015-2016 (c) Sten Grüner * Copyright 2015 (c) Chris Iatrou * Copyright 2015, 2017 (c) Florian Palm @@ -19312,6 +22631,20 @@ UA_Session_queuePublishReq(UA_Session *session, UA_PublishResponseEntry* entry, /* There is no UA_Node_new() method here. Creating nodes is part of the * NodeStore layer */ +static enum ZIP_CMP +cmpRefTarget(const void *a, const void *b) { + const UA_ReferenceTarget *aa = (const UA_ReferenceTarget*)a; + const UA_ReferenceTarget *bb = (const UA_ReferenceTarget*)b; + if(aa->targetHash < bb->targetHash) + return ZIP_CMP_LESS; + if(aa->targetHash > bb->targetHash) + return ZIP_CMP_MORE; + return (enum ZIP_CMP)UA_ExpandedNodeId_order(&aa->target, &bb->target); +} + +ZIP_IMPL(UA_ReferenceTargetHead, UA_ReferenceTarget, zipfields, + UA_ReferenceTarget, zipfields, cmpRefTarget) + void UA_Node_deleteMembers(UA_Node *node) { /* Delete standard content */ UA_NodeId_deleteMembers(&node->nodeId); @@ -19389,6 +22722,7 @@ UA_VariableNode_copy(const UA_VariableNode *src, UA_VariableNode *dst) { dst->accessLevel = src->accessLevel; dst->minimumSamplingInterval = src->minimumSamplingInterval; dst->historizing = src->historizing; + dst->isDynamic = src->isDynamic; return retval; } @@ -19450,6 +22784,7 @@ UA_Node_copy(const UA_Node *src, UA_Node *dst) { retval |= UA_LocalizedText_copy(&src->description, &dst->description); dst->writeMask = src->writeMask; dst->context = src->context; + dst->constructed = src->constructed; if(retval != UA_STATUSCODE_GOOD) { UA_Node_deleteMembers(dst); return retval; @@ -19470,16 +22805,40 @@ UA_Node_copy(const UA_Node *src, UA_Node *dst) { UA_NodeReferenceKind *srefs = &src->references[i]; UA_NodeReferenceKind *drefs = &dst->references[i]; drefs->isInverse = srefs->isInverse; + ZIP_INIT(&drefs->refTargetsTree); retval = UA_NodeId_copy(&srefs->referenceTypeId, &drefs->referenceTypeId); if(retval != UA_STATUSCODE_GOOD) break; - retval = UA_Array_copy(srefs->targetIds, srefs->targetIdsSize, - (void**)&drefs->targetIds, - &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); + drefs->refTargets = (UA_ReferenceTarget*) + UA_malloc(srefs->refTargetsSize* sizeof(UA_ReferenceTarget)); + if(!drefs->refTargets) { + UA_NodeId_deleteMembers(&drefs->referenceTypeId); + break; + } + uintptr_t arraydiff = (uintptr_t)drefs->refTargets - (uintptr_t)srefs->refTargets; + for(size_t j = 0; j < srefs->refTargetsSize; j++) { + retval |= UA_ExpandedNodeId_copy(&srefs->refTargets[j].target, + &drefs->refTargets[j].target); + drefs->refTargets[j].targetHash = srefs->refTargets[j].targetHash; + drefs->refTargets[j].zipfields.zip_right = NULL; + if(srefs->refTargets[j].zipfields.zip_right) + *(uintptr_t*)&drefs->refTargets[j].zipfields.zip_right = + (uintptr_t)srefs->refTargets[j].zipfields.zip_right + arraydiff; + drefs->refTargets[j].zipfields.zip_left = NULL; + if(srefs->refTargets[j].zipfields.zip_left) + *(uintptr_t*)&drefs->refTargets[j].zipfields.zip_left = + (uintptr_t)srefs->refTargets[j].zipfields.zip_left + arraydiff; + drefs->refTargets[j].zipfields.rank = srefs->refTargets[j].zipfields.rank; + } + drefs->refTargetsTree.zip_root = NULL; + if(srefs->refTargetsTree.zip_root) + *(uintptr_t*)&drefs->refTargetsTree.zip_root = + (uintptr_t)srefs->refTargetsTree.zip_root + arraydiff; + drefs->refTargetsSize= srefs->refTargetsSize; if(retval != UA_STATUSCODE_GOOD) break; - drefs->targetIdsSize = srefs->targetIdsSize; } + if(retval != UA_STATUSCODE_GOOD) { UA_Node_deleteMembers(dst); return retval; @@ -19524,37 +22883,41 @@ UA_Node_copy(const UA_Node *src, UA_Node *dst) { UA_Node * UA_Node_copy_alloc(const UA_Node *src) { - // use dstPtr to trick static code analysis in accepting dirty cast - void *dstPtr; + /* use dstPtr to trick static code analysis in accepting dirty cast */ + size_t nodesize = 0; switch(src->nodeClass) { case UA_NODECLASS_OBJECT: - dstPtr = UA_malloc(sizeof(UA_ObjectNode)); + nodesize = sizeof(UA_ObjectNode); break; case UA_NODECLASS_VARIABLE: - dstPtr =UA_malloc(sizeof(UA_VariableNode)); + nodesize = sizeof(UA_VariableNode); break; case UA_NODECLASS_METHOD: - dstPtr = UA_malloc(sizeof(UA_MethodNode)); + nodesize = sizeof(UA_MethodNode); break; case UA_NODECLASS_OBJECTTYPE: - dstPtr = UA_malloc(sizeof(UA_ObjectTypeNode)); + nodesize = sizeof(UA_ObjectTypeNode); break; case UA_NODECLASS_VARIABLETYPE: - dstPtr = UA_malloc(sizeof(UA_VariableTypeNode)); + nodesize = sizeof(UA_VariableTypeNode); break; case UA_NODECLASS_REFERENCETYPE: - dstPtr = UA_malloc(sizeof(UA_ReferenceTypeNode)); + nodesize = sizeof(UA_ReferenceTypeNode); break; case UA_NODECLASS_DATATYPE: - dstPtr = UA_malloc(sizeof(UA_DataTypeNode)); + nodesize = sizeof(UA_DataTypeNode); break; case UA_NODECLASS_VIEW: - dstPtr = UA_malloc(sizeof(UA_ViewNode)); + nodesize = sizeof(UA_ViewNode); break; default: return NULL; } - UA_Node *dst = (UA_Node*)dstPtr; + + UA_Node *dst = (UA_Node*)UA_calloc(1,nodesize); + if(!dst) + return NULL; + dst->nodeClass = src->nodeClass; UA_StatusCode retval = UA_Node_copy(src, dst); @@ -19572,9 +22935,20 @@ static UA_StatusCode copyStandardAttributes(UA_Node *node, const UA_NodeAttributes *attr) { /* retval = UA_NodeId_copy(&item->requestedNewNodeId.nodeId, &node->nodeId); */ /* retval |= UA_QualifiedName_copy(&item->browseName, &node->browseName); */ - UA_StatusCode retval = UA_LocalizedText_copy(&attr->displayName, - &node->displayName); - retval |= UA_LocalizedText_copy(&attr->description, &node->description); + + UA_StatusCode retval; + /* The new nodeset format has optional display name. + * See https://github.com/open62541/open62541/issues/2627 + * If display name is NULL, then we take the name part of the browse name */ + if (attr->displayName.text.length == 0) { + retval = UA_String_copy(&node->browseName.name, + &node->displayName.text); + } else { + retval = UA_LocalizedText_copy(&attr->displayName, + &node->displayName); + retval |= UA_LocalizedText_copy(&attr->description, &node->description); + } + node->writeMask = attr->writeMask; return retval; } @@ -19591,57 +22965,15 @@ copyCommonVariableAttributes(UA_VariableNode *node, node->arrayDimensionsSize = attr->arrayDimensionsSize; /* Data type and value rank */ - retval |= UA_NodeId_copy(&attr->dataType, &node->dataType); + retval = UA_NodeId_copy(&attr->dataType, &node->dataType); + if(retval != UA_STATUSCODE_GOOD) + return retval; node->valueRank = attr->valueRank; /* Copy the value */ + retval = UA_Variant_copy(&attr->value, &node->value.data.value.value); node->valueSource = UA_VALUESOURCE_DATA; - UA_NodeId extensionObject = UA_NODEID_NUMERIC(0, UA_NS0ID_STRUCTURE); - /* if we have an extension object which is still encoded (e.g. from the nodeset compiler) - * we need to decode it and set the decoded value instead of the encoded object */ - UA_Boolean valueSet = false; - if(attr->value.type != NULL && UA_NodeId_equal(&attr->value.type->typeId, &extensionObject)) { - - if (attr->value.data == UA_EMPTY_ARRAY_SENTINEL) { - /* do nothing since we got an empty array of extension objects */ - return UA_STATUSCODE_GOOD; - } - - const UA_ExtensionObject *obj = (const UA_ExtensionObject *)attr->value.data; - if(obj && obj->encoding == UA_EXTENSIONOBJECT_ENCODED_BYTESTRING) { - - /* TODO: Once we generate type description in the nodeset compiler, - * UA_findDatatypeByBinary can be made internal to the decoding - * layer. */ - const UA_DataType *type = UA_findDataTypeByBinary(&obj->content.encoded.typeId); - - if(type) { - void *dst = UA_Array_new(attr->value.arrayLength, type); - if (!dst) { - return UA_STATUSCODE_BADOUTOFMEMORY; - } - uint8_t *tmpPos = (uint8_t *)dst; - - for(size_t i=0; ivalue.arrayLength; i++) { - size_t offset =0; - const UA_ExtensionObject *curr = &((const UA_ExtensionObject *)attr->value.data)[i]; - UA_StatusCode ret = UA_decodeBinary(&curr->content.encoded.body, &offset, tmpPos, type, 0, NULL); - if(ret != UA_STATUSCODE_GOOD) { - return ret; - } - tmpPos += type->memSize; - } - - UA_Variant_setArray(&node->value.data.value.value, dst, attr->value.arrayLength, type); - valueSet = true; - } - } - } - - if(!valueSet) - retval |= UA_Variant_copy(&attr->value, &node->value.data.value.value); - - node->value.data.value.hasValue = true; + node->value.data.value.hasValue = (node->value.data.value.value.type != NULL); return retval; } @@ -19714,7 +23046,6 @@ copyMethodNodeAttributes(UA_MethodNode *mnode, UA_StatusCode UA_Node_setAttributes(UA_Node *node, const void *attributes, const UA_DataType *attributeType) { - /* Copy the attributes into the node */ UA_StatusCode retval = UA_STATUSCODE_GOOD; switch(node->nodeClass) { @@ -19775,75 +23106,100 @@ UA_Node_setAttributes(UA_Node *node, const void *attributes, /*********************/ static UA_StatusCode -addReferenceTarget(UA_NodeReferenceKind *refs, const UA_ExpandedNodeId *target) { - UA_ExpandedNodeId *targets = - (UA_ExpandedNodeId*) UA_realloc(refs->targetIds, - sizeof(UA_ExpandedNodeId) * (refs->targetIdsSize+1)); +addReferenceTarget(UA_NodeReferenceKind *refs, const UA_ExpandedNodeId *target, + UA_UInt32 targetHash) { + UA_ReferenceTarget *targets = (UA_ReferenceTarget*) + UA_realloc(refs->refTargets, (refs->refTargetsSize + 1) * sizeof(UA_ReferenceTarget)); if(!targets) return UA_STATUSCODE_BADOUTOFMEMORY; - refs->targetIds = targets; - UA_StatusCode retval = - UA_ExpandedNodeId_copy(target, &refs->targetIds[refs->targetIdsSize]); + /* Repair the pointers in the tree for the realloced array */ + uintptr_t arraydiff = (uintptr_t)targets - (uintptr_t)refs->refTargets; + if(arraydiff != 0) { + for(size_t i = 0; i < refs->refTargetsSize; i++) { + if(targets[i].zipfields.zip_left) + *(uintptr_t*)&targets[i].zipfields.zip_left += arraydiff; + if(targets[i].zipfields.zip_right) + *(uintptr_t*)&targets[i].zipfields.zip_right += arraydiff; + } + } - if(retval == UA_STATUSCODE_GOOD) { - refs->targetIdsSize++; - } else if(refs->targetIdsSize == 0) { - /* We had zero references before (realloc was a malloc) */ - UA_free(refs->targetIds); - refs->targetIds = NULL; + if(refs->refTargetsTree.zip_root) + *(uintptr_t*)&refs->refTargetsTree.zip_root += arraydiff; + refs->refTargets = targets; + + UA_ReferenceTarget *entry = &refs->refTargets[refs->refTargetsSize]; + UA_StatusCode retval = UA_ExpandedNodeId_copy(target, &entry->target); + if(retval != UA_STATUSCODE_GOOD) { + if(refs->refTargetsSize== 0) { + /* We had zero references before (realloc was a malloc) */ + UA_free(refs->refTargets); + refs->refTargets = NULL; + } + return retval; } - return retval; + + entry->targetHash = targetHash; + ZIP_INSERT(UA_ReferenceTargetHead, &refs->refTargetsTree, + entry, ZIP_FFS32(UA_UInt32_random())); + refs->refTargetsSize++; + return UA_STATUSCODE_GOOD; } static UA_StatusCode addReferenceKind(UA_Node *node, const UA_AddReferencesItem *item) { - UA_NodeReferenceKind *refs = - (UA_NodeReferenceKind*)UA_realloc(node->references, - sizeof(UA_NodeReferenceKind) * (node->referencesSize+1)); + UA_NodeReferenceKind *refs = (UA_NodeReferenceKind*) + UA_realloc(node->references, sizeof(UA_NodeReferenceKind) * (node->referencesSize+1)); if(!refs) return UA_STATUSCODE_BADOUTOFMEMORY; node->references = refs; UA_NodeReferenceKind *newRef = &refs[node->referencesSize]; memset(newRef, 0, sizeof(UA_NodeReferenceKind)); + ZIP_INIT(&newRef->refTargetsTree); newRef->isInverse = !item->isForward; UA_StatusCode retval = UA_NodeId_copy(&item->referenceTypeId, &newRef->referenceTypeId); - retval |= addReferenceTarget(newRef, &item->targetNodeId); + UA_UInt32 targetHash = UA_ExpandedNodeId_hash(&item->targetNodeId); + retval |= addReferenceTarget(newRef, &item->targetNodeId, targetHash); - if(retval == UA_STATUSCODE_GOOD) { - node->referencesSize++; - } else { + if(retval != UA_STATUSCODE_GOOD) { UA_NodeId_deleteMembers(&newRef->referenceTypeId); if(node->referencesSize == 0) { UA_free(node->references); node->references = NULL; } + return retval; } - return retval; + + node->referencesSize++; + return UA_STATUSCODE_GOOD; } UA_StatusCode UA_Node_addReference(UA_Node *node, const UA_AddReferencesItem *item) { + /* Find the matching refkind */ UA_NodeReferenceKind *existingRefs = NULL; for(size_t i = 0; i < node->referencesSize; ++i) { UA_NodeReferenceKind *refs = &node->references[i]; - if(refs->isInverse != item->isForward - && UA_NodeId_equal(&refs->referenceTypeId, &item->referenceTypeId)) { + if(refs->isInverse != item->isForward && + UA_NodeId_equal(&refs->referenceTypeId, &item->referenceTypeId)) { existingRefs = refs; break; } } - if(existingRefs != NULL) { - for(size_t i = 0; i < existingRefs->targetIdsSize; i++) { - if(UA_ExpandedNodeId_equal(&existingRefs->targetIds[i], - &item->targetNodeId)) { - return UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED; - } - } - return addReferenceTarget(existingRefs, &item->targetNodeId); - } - return addReferenceKind(node, item); + + if(!existingRefs) + return addReferenceKind(node, item); + + UA_ReferenceTarget tmpTarget; + tmpTarget.target = item->targetNodeId; + tmpTarget.targetHash = UA_ExpandedNodeId_hash(&item->targetNodeId); + + UA_ReferenceTarget *found = + ZIP_FIND(UA_ReferenceTargetHead, &existingRefs->refTargetsTree, &tmpTarget); + if(found) + return UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED; + return addReferenceTarget(existingRefs, &item->targetNodeId, tmpTarget.targetHash); } UA_StatusCode @@ -19855,36 +23211,44 @@ UA_Node_deleteReference(UA_Node *node, const UA_DeleteReferencesItem *item) { if(!UA_NodeId_equal(&item->referenceTypeId, &refs->referenceTypeId)) continue; - for(size_t j = refs->targetIdsSize; j > 0; --j) { - if(!UA_NodeId_equal(&item->targetNodeId.nodeId, &refs->targetIds[j-1].nodeId)) + for(size_t j = refs->refTargetsSize; j > 0; --j) { + UA_ReferenceTarget *target = &refs->refTargets[j-1]; + if(!UA_NodeId_equal(&item->targetNodeId.nodeId, &target->target.nodeId)) continue; /* Ok, delete the reference */ - UA_ExpandedNodeId_deleteMembers(&refs->targetIds[j-1]); - refs->targetIdsSize--; + ZIP_REMOVE(UA_ReferenceTargetHead, &refs->refTargetsTree, target); + UA_ExpandedNodeId_deleteMembers(&target->target); + refs->refTargetsSize--; /* One matching target remaining */ - if(refs->targetIdsSize > 0) { - if(j-1 != refs->targetIdsSize) // avoid valgrind error: Source - // and destination overlap in - // memcpy - refs->targetIds[j-1] = refs->targetIds[refs->targetIdsSize]; + if(refs->refTargetsSize > 0) { + if(j-1 != refs->refTargetsSize) { + /* avoid valgrind error: Source and destination overlap in + * memcpy */ + ZIP_REMOVE(UA_ReferenceTargetHead, &refs->refTargetsTree, + &refs->refTargets[refs->refTargetsSize]); + *target = refs->refTargets[refs->refTargetsSize]; + ZIP_INSERT(UA_ReferenceTargetHead, &refs->refTargetsTree, + target, ZIP_RANK(target, zipfields)); + } return UA_STATUSCODE_GOOD; } - /* Remove refs */ - UA_free(refs->targetIds); + /* No target for the ReferenceType remaining. Remove entry. */ + UA_free(refs->refTargets); UA_NodeId_deleteMembers(&refs->referenceTypeId); node->referencesSize--; if(node->referencesSize > 0) { - if(i-1 != node->referencesSize) // avoid valgrind error: Source - // and destination overlap in - // memcpy + if(i-1 != node->referencesSize) { + /* avoid valgrind error: Source and destination overlap in + * memcpy */ node->references[i-1] = node->references[node->referencesSize]; + } return UA_STATUSCODE_GOOD; } - /* Remove the node references */ + /* No remaining references of any ReferenceType */ UA_free(node->references); node->references = NULL; return UA_STATUSCODE_GOOD; @@ -19893,25 +23257,65 @@ UA_Node_deleteReference(UA_Node *node, const UA_DeleteReferencesItem *item) { return UA_STATUSCODE_UNCERTAINREFERENCENOTDELETED; } -void UA_Node_deleteReferences(UA_Node *node) { - for(size_t i = 0; i < node->referencesSize; ++i) { - UA_NodeReferenceKind *refs = &node->references[i]; - UA_Array_delete(refs->targetIds, refs->targetIdsSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); +void +UA_Node_deleteReferencesSubset(UA_Node *node, size_t referencesSkipSize, + UA_NodeId* referencesSkip) { + /* Nothing to do */ + if(node->referencesSize == 0 || node->references == NULL) + return; + + for(size_t i = node->referencesSize; i > 0; --i) { + UA_NodeReferenceKind *refs = &node->references[i-1]; + + /* Shall we keep the references of this type? */ + UA_Boolean skip = false; + for(size_t j = 0; j < referencesSkipSize; j++) { + if(UA_NodeId_equal(&refs->referenceTypeId, &referencesSkip[j])) { + skip = true; + break; + } + } + if(skip) + continue; + + /* Remove references */ + for(size_t j = 0; j < refs->refTargetsSize; j++) + UA_ExpandedNodeId_deleteMembers(&refs->refTargets[j].target); + UA_free(refs->refTargets); UA_NodeId_deleteMembers(&refs->referenceTypeId); + node->referencesSize--; + + /* Move last references-kind entry to this position */ + if(i-1 == node->referencesSize) /* Don't memcpy over the same position */ + continue; + node->references[i-1] = node->references[node->referencesSize]; + } + + if(node->referencesSize > 0) { + /* Realloc to save memory */ + UA_NodeReferenceKind *refs = (UA_NodeReferenceKind*) + UA_realloc(node->references, sizeof(UA_NodeReferenceKind) * node->referencesSize); + if(refs) /* Do nothing if realloc fails */ + node->references = refs; + return; } - if(node->references) - UA_free(node->references); + + /* The array is empty. Remove. */ + UA_free(node->references); node->references = NULL; - node->referencesSize = 0; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_server.c" ***********************************/ +void UA_Node_deleteReferences(UA_Node *node) { + UA_Node_deleteReferencesSubset(node, 0, NULL); +} + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_server.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2018 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2014-2017 (c) Florian Palm * Copyright 2015-2016 (c) Sten Grüner * Copyright 2015-2016 (c) Chris Iatrou @@ -19922,14 +23326,44 @@ void UA_Node_deleteReferences(UA_Node *node) { * Copyright 2016 (c) Lorenz Haas * Copyright 2017 (c) frax2222 * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2018 (c) Hilscher Gesellschaft für Systemautomation mbH (Author: Martin Lang) + * Copyright 2019 (c) Kalycito Infotech Private Limited */ +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL +#endif + +#ifdef UA_ENABLE_SUBSCRIPTIONS +#endif + +#ifdef UA_ENABLE_VALGRIND_INTERACTIVE +#include +#endif + /**********************/ /* Namespace Handling */ /**********************/ +/* + * The NS1 Uri can be changed by the user to some custom string. + * This method is called to initialize the NS1 Uri if it is not set before to the default Application URI. + * + * This is done as soon as the Namespace Array is read or written via node value read / write services, + * or UA_Server_addNamespace, UA_Server_getNamespaceByName or UA_Server_run_startup is called. + * + * Therefore one has to set the custom NS1 URI before one of the previously mentioned steps. + */ +void setupNs1Uri(UA_Server *server) { + if (!server->namespaces[1].data) { + UA_String_copy(&server->config.applicationDescription.applicationUri, &server->namespaces[1]); + } +} + UA_UInt16 addNamespace(UA_Server *server, const UA_String name) { + /* ensure that the uri for ns1 is set up from the app description */ + setupNs1Uri(server); + /* Check if the namespace already exists in the server's namespace array */ for(UA_UInt16 i = 0; i < server->namespacesSize; ++i) { if(UA_String_equal(&name, &server->namespaces[i])) @@ -19961,12 +23395,34 @@ UA_UInt16 UA_Server_addNamespace(UA_Server *server, const char* name) { return addNamespace(server, nameString); } +UA_ServerConfig* +UA_Server_getConfig(UA_Server *server) +{ + if(!server) + return NULL; + + return &server->config; +} + +UA_StatusCode +UA_Server_getNamespaceByName(UA_Server *server, const UA_String namespaceUri, + size_t* foundIndex) { + /* ensure that the uri for ns1 is set up from the app description */ + setupNs1Uri(server); + + for(size_t idx = 0; idx < server->namespacesSize; idx++) { + if(!UA_String_equal(&server->namespaces[idx], &namespaceUri)) + continue; + (*foundIndex) = idx; + return UA_STATUSCODE_GOOD; + } + return UA_STATUSCODE_BADNOTFOUND; +} + UA_StatusCode UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId, UA_NodeIteratorCallback callback, void *handle) { - const UA_Node *parent = - server->config.nodestore.getNode(server->config.nodestore.context, - &parentNodeId); + const UA_Node *parent = UA_Nodestore_getNode(server->nsCtx, &parentNodeId); if(!parent) return UA_STATUSCODE_BADNODEIDINVALID; @@ -19979,21 +23435,26 @@ UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId, * */ UA_Node *parentCopy = UA_Node_copy_alloc(parent); if(!parentCopy) { - server->config.nodestore.releaseNode(server->config.nodestore.context, parent); + UA_Nodestore_releaseNode(server->nsCtx, parent); return UA_STATUSCODE_BADUNEXPECTEDERROR; } UA_StatusCode retval = UA_STATUSCODE_GOOD; for(size_t i = parentCopy->referencesSize; i > 0; --i) { UA_NodeReferenceKind *ref = &parentCopy->references[i - 1]; - for(size_t j = 0; jtargetIdsSize; j++) - retval |= callback(ref->targetIds[j].nodeId, ref->isInverse, - ref->referenceTypeId, handle); + for(size_t j = 0; jrefTargetsSize; j++) { + retval = callback(ref->refTargets[j].target.nodeId, ref->isInverse, + ref->referenceTypeId, handle); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; + } } + +cleanup: UA_Node_deleteMembers(parentCopy); UA_free(parentCopy); - server->config.nodestore.releaseNode(server->config.nodestore.context, parent); + UA_Nodestore_releaseNode(server->nsCtx, parent); return retval; } @@ -20008,62 +23469,37 @@ void UA_Server_delete(UA_Server *server) { UA_SessionManager_deleteMembers(&server->sessionManager); UA_Array_delete(server->namespaces, server->namespacesSize, &UA_TYPES[UA_TYPES_STRING]); -#ifdef UA_ENABLE_DISCOVERY - registeredServer_list_entry *rs, *rs_tmp; - LIST_FOREACH_SAFE(rs, &server->registeredServers, pointers, rs_tmp) { - LIST_REMOVE(rs, pointers); - UA_RegisteredServer_deleteMembers(&rs->registeredServer); - UA_free(rs); - } - periodicServerRegisterCallback_entry *ps, *ps_tmp; - LIST_FOREACH_SAFE(ps, &server->periodicServerRegisterCallbacks, pointers, ps_tmp) { - LIST_REMOVE(ps, pointers); - UA_free(ps->callback); - UA_free(ps); - } - -# ifdef UA_ENABLE_DISCOVERY_MULTICAST - if(server->config.applicationDescription.applicationType == UA_APPLICATIONTYPE_DISCOVERYSERVER) - destroyMulticastDiscoveryServer(server); - - serverOnNetwork_list_entry *son, *son_tmp; - LIST_FOREACH_SAFE(son, &server->serverOnNetwork, pointers, son_tmp) { - LIST_REMOVE(son, pointers); - UA_ServerOnNetwork_deleteMembers(&son->serverOnNetwork); - if(son->pathTmp) - UA_free(son->pathTmp); - UA_free(son); +#ifdef UA_ENABLE_SUBSCRIPTIONS + UA_MonitoredItem *mon, *mon_tmp; + LIST_FOREACH_SAFE(mon, &server->localMonitoredItems, listEntry, mon_tmp) { + LIST_REMOVE(mon, listEntry); + UA_MonitoredItem_delete(server, mon); } +#endif - for(size_t i = 0; i < SERVER_ON_NETWORK_HASH_PRIME; i++) { - serverOnNetwork_hash_entry* currHash = server->serverOnNetworkHash[i]; - while(currHash) { - serverOnNetwork_hash_entry* nextHash = currHash->next; - UA_free(currHash); - currHash = nextHash; - } - } -# endif +#ifdef UA_ENABLE_PUBSUB + UA_PubSubManager_delete(server, &server->pubSubManager); +#endif +#ifdef UA_ENABLE_DISCOVERY + UA_DiscoveryManager_deleteMembers(&server->discoveryManager, server); #endif - /* Clean up the admin session */ + /* Clean up the Admin Session */ UA_Session_deleteMembersCleanup(&server->adminSession, server); -#ifdef UA_ENABLE_MULTITHREADING - /* Process new delayed callbacks from the cleanup */ - UA_Server_cleanupDispatchQueue(server); - pthread_mutex_destroy(&server->dispatchQueue_accessMutex); - pthread_cond_destroy(&server->dispatchQueue_condition); - pthread_mutex_destroy(&server->dispatchQueue_conditionMutex); -#else - /* Process new delayed callbacks from the cleanup */ - UA_Server_cleanupDelayedCallbacks(server); -#endif + /* Clean up the work queue */ + UA_WorkQueue_cleanup(&server->workQueue); /* Delete the timed work */ UA_Timer_deleteMembers(&server->timer); + /* Clean up the nodestore */ + UA_Nodestore_delete(server->nsCtx); + + /* Clean up the config */ + UA_ServerConfig_clean(&server->config); + /* Delete the server itself */ UA_free(server); } @@ -20083,36 +23519,8 @@ UA_Server_cleanup(UA_Server *server, void *_) { /* Server Lifecycle */ /********************/ -UA_Server * -UA_Server_new(const UA_ServerConfig *config) { - /* A config is required */ - if(!config) - return NULL; - - /* At least one endpoint has to be configured */ - if(config->endpointsSize == 0) { - UA_LOG_FATAL(config->logger, UA_LOGCATEGORY_SERVER, - "There has to be at least one endpoint."); - return NULL; - } - - /* Allocate the server */ - UA_Server *server = (UA_Server *)UA_calloc(1, sizeof(UA_Server)); - if(!server) - return NULL; - - /* Set the config */ - server->config = *config; - - /* Initialize the admin session */ - UA_Session_init(&server->adminSession); - server->adminSession.header.authenticationToken = UA_NODEID_NUMERIC(0, 1); - server->adminSession.sessionId.identifierType = UA_NODEIDTYPE_GUID; - server->adminSession.sessionId.identifier.guid.data1 = 1; - server->adminSession.sessionName = UA_STRING_ALLOC("Administrator Session"); - server->adminSession.validTill = UA_INT64_MAX; - server->adminSession.availableContinuationPoints = UA_MAXCONTINUATIONPOINTS; - +static UA_Server * +UA_Server_init(UA_Server *server) { /* Init start time to zero, the actual start time will be sampled in * UA_Server_run_startup() */ server->startTime = 0; @@ -20125,121 +23533,483 @@ UA_Server_new(const UA_ServerConfig *config) { /* Initialize the handling of repeated callbacks */ UA_Timer_init(&server->timer); - /* Initialized the linked list for delayed callbacks */ -#ifndef UA_ENABLE_MULTITHREADING - SLIST_INIT(&server->delayedCallbacks); -#endif + UA_WorkQueue_init(&server->workQueue); - /* Initialized the dispatch queue for worker threads */ -#ifdef UA_ENABLE_MULTITHREADING - SIMPLEQ_INIT(&server->dispatchQueue); -#endif + /* Initialize the adminSession */ + UA_Session_init(&server->adminSession); + server->adminSession.sessionId.identifierType = UA_NODEIDTYPE_GUID; + server->adminSession.sessionId.identifier.guid.data1 = 1; + server->adminSession.validTill = UA_INT64_MAX; - /* Create Namespaces 0 and 1 */ + /* Create Namespaces 0 and 1 + * Ns1 will be filled later with the uri from the app description */ server->namespaces = (UA_String *)UA_Array_new(2, &UA_TYPES[UA_TYPES_STRING]); + if(!server->namespaces) { + UA_Server_delete(server); + return NULL; + } server->namespaces[0] = UA_STRING_ALLOC("http://opcfoundation.org/UA/"); - UA_String_copy(&server->config.applicationDescription.applicationUri, &server->namespaces[1]); + server->namespaces[1] = UA_STRING_NULL; server->namespacesSize = 2; /* Initialized SecureChannel and Session managers */ UA_SecureChannelManager_init(&server->secureChannelManager, server); UA_SessionManager_init(&server->sessionManager, server); - /* Add a regular callback for cleanup and maintenance */ + /* Add a regular callback for cleanup and maintenance. With a 10s interval. */ UA_Server_addRepeatedCallback(server, (UA_ServerCallback)UA_Server_cleanup, NULL, - 10000, NULL); + 10000.0, NULL); - /* Initialized discovery database */ -#ifdef UA_ENABLE_DISCOVERY - LIST_INIT(&server->registeredServers); - server->registeredServersSize = 0; - LIST_INIT(&server->periodicServerRegisterCallbacks); - server->registerServerCallback = NULL; - server->registerServerCallbackData = NULL; -#endif + /* Initialize namespace 0*/ + UA_StatusCode retVal = UA_Nodestore_new(&server->nsCtx); + if(retVal != UA_STATUSCODE_GOOD) + goto cleanup; - /* Initialize multicast discovery */ -#if defined(UA_ENABLE_DISCOVERY) && defined(UA_ENABLE_DISCOVERY_MULTICAST) - server->mdnsDaemon = NULL; -#ifdef _WIN32 - server->mdnsSocket = INVALID_SOCKET; -#else - server->mdnsSocket = -1; + retVal = UA_Server_initNS0(server); + if(retVal != UA_STATUSCODE_GOOD) + goto cleanup; + + /* Build PubSub information model */ +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL + UA_Server_initPubSubNS0(server); #endif - server->mdnsMainSrvAdded = UA_FALSE; - if(server->config.applicationDescription.applicationType == UA_APPLICATIONTYPE_DISCOVERYSERVER) - initMulticastDiscoveryServer(server); - LIST_INIT(&server->serverOnNetwork); - server->serverOnNetworkSize = 0; - server->serverOnNetworkRecordIdCounter = 0; - server->serverOnNetworkRecordIdLastReset = UA_DateTime_now(); - memset(server->serverOnNetworkHash, 0, - sizeof(struct serverOnNetwork_hash_entry*) * SERVER_ON_NETWORK_HASH_PRIME); + return server; - server->serverOnNetworkCallback = NULL; - server->serverOnNetworkCallbackData = NULL; -#endif + cleanup: + UA_Server_delete(server); + return NULL; +} - /* Initialize namespace 0*/ - UA_StatusCode retVal = UA_Server_initNS0(server); - if(retVal != UA_STATUSCODE_GOOD) { - UA_LOG_ERROR(config->logger, UA_LOGCATEGORY_SERVER, - "Initialization of Namespace 0 failed with %s. " - "See previous outputs for any error messages.", - UA_StatusCode_name(retVal)); - UA_Server_delete(server); +UA_Server * +UA_Server_new() { + /* Allocate the server */ + UA_Server *server = (UA_Server *)UA_calloc(1, sizeof(UA_Server)); + if(!server) return NULL; - } + return UA_Server_init(server); +} - return server; + +UA_Server * +UA_Server_newWithConfig(const UA_ServerConfig *config) { + UA_Server *server = (UA_Server *)UA_calloc(1, sizeof(UA_Server)); + if(!server) + return NULL; + if(config) + server->config = *config; + return UA_Server_init(server); } -/*****************/ -/* Repeated Jobs */ -/*****************/ +/* Returns if the server should be shut down immediately */ +static UA_Boolean +setServerShutdown(UA_Server *server) { + if(server->endTime != 0) + return false; + if(server->config.shutdownDelay == 0) + return true; + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Shutting down the server with a delay of %i ms", (int)server->config.shutdownDelay); + server->endTime = UA_DateTime_now() + (UA_DateTime)(server->config.shutdownDelay * UA_DATETIME_MSEC); + return false; +} + +/*******************/ +/* Timed Callbacks */ +/*******************/ + +UA_StatusCode +UA_Server_addTimedCallback(UA_Server *server, UA_ServerCallback callback, + void *data, UA_DateTime date, UA_UInt64 *callbackId) { + return UA_Timer_addTimedCallback(&server->timer, + (UA_ApplicationCallback)callback, + server, data, date, callbackId); +} UA_StatusCode UA_Server_addRepeatedCallback(UA_Server *server, UA_ServerCallback callback, - void *data, UA_UInt32 interval, + void *data, UA_Double interval_ms, UA_UInt64 *callbackId) { - return UA_Timer_addRepeatedCallback(&server->timer, (UA_TimerCallback)callback, - data, interval, callbackId); + return UA_Timer_addRepeatedCallback(&server->timer, + (UA_ApplicationCallback)callback, + server, data, interval_ms, callbackId); } UA_StatusCode UA_Server_changeRepeatedCallbackInterval(UA_Server *server, UA_UInt64 callbackId, - UA_UInt32 interval) { - return UA_Timer_changeRepeatedCallbackInterval(&server->timer, callbackId, interval); + UA_Double interval_ms) { + return UA_Timer_changeRepeatedCallbackInterval(&server->timer, callbackId, + interval_ms); +} + +void +UA_Server_removeCallback(UA_Server *server, UA_UInt64 callbackId) { + UA_Timer_removeCallback(&server->timer, callbackId); } +UA_StatusCode UA_EXPORT +UA_Server_updateCertificate(UA_Server *server, + const UA_ByteString *oldCertificate, + const UA_ByteString *newCertificate, + const UA_ByteString *newPrivateKey, + UA_Boolean closeSessions, + UA_Boolean closeSecureChannels) { + + if (server == NULL || oldCertificate == NULL + || newCertificate == NULL || newPrivateKey == NULL) { + return UA_STATUSCODE_BADINTERNALERROR; + } + + if (closeSessions) { + UA_SessionManager *sm = &server->sessionManager; + session_list_entry *current; + LIST_FOREACH(current, &sm->sessions, pointers) { + if (UA_ByteString_equal(oldCertificate, + ¤t->session.header.channel->securityPolicy->localCertificate)) { + UA_SessionManager_removeSession(sm, ¤t->session.header.authenticationToken); + } + } + + } + + if (closeSecureChannels) { + UA_SecureChannelManager *cm = &server->secureChannelManager; + channel_entry *entry; + TAILQ_FOREACH(entry, &cm->channels, pointers) { + if(UA_ByteString_equal(&entry->channel.securityPolicy->localCertificate, oldCertificate)){ + UA_SecureChannelManager_close(cm, entry->channel.securityToken.channelId); + } + } + } + + size_t i = 0; + while (i < server->config.endpointsSize) { + UA_EndpointDescription *ed = &server->config.endpoints[i]; + if (UA_ByteString_equal(&ed->serverCertificate, oldCertificate)) { + UA_String_deleteMembers(&ed->serverCertificate); + UA_String_copy(newCertificate, &ed->serverCertificate); + UA_SecurityPolicy *sp = UA_SecurityPolicy_getSecurityPolicyByUri(server, &server->config.endpoints[i].securityPolicyUri); + if(!sp) + return UA_STATUSCODE_BADINTERNALERROR; + sp->updateCertificateAndPrivateKey(sp, *newCertificate, *newPrivateKey); + } + i++; + } + + return UA_STATUSCODE_GOOD; +} + +/***************************/ +/* Server lookup functions */ +/***************************/ + +UA_SecurityPolicy * +UA_SecurityPolicy_getSecurityPolicyByUri(const UA_Server *server, + const UA_ByteString *securityPolicyUri) { + for(size_t i = 0; i < server->config.securityPoliciesSize; i++) { + UA_SecurityPolicy *securityPolicyCandidate = &server->config.securityPolicies[i]; + if(UA_ByteString_equal(securityPolicyUri, &securityPolicyCandidate->policyUri)) + return securityPolicyCandidate; + } + return NULL; +} + +#ifdef UA_ENABLE_ENCRYPTION +/* The local ApplicationURI has to match the certificates of the + * SecurityPolicies */ +static void +verifyServerApplicationURI(const UA_Server *server) { +#if UA_LOGLEVEL <= 400 + for(size_t i = 0; i < server->config.securityPoliciesSize; i++) { + UA_SecurityPolicy *sp = &server->config.securityPolicies[i]; + if(!sp->certificateVerification) + continue; + UA_StatusCode retval = + sp->certificateVerification-> + verifyApplicationURI(sp->certificateVerification->context, + &sp->localCertificate, + &server->config.applicationDescription.applicationUri); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "The configured ApplicationURI does not match the URI " + "specified in the certificate for the SecurityPolicy %.*s", + (int)sp->policyUri.length, sp->policyUri.data); + } + } +#endif +} +#endif + +/********************/ +/* Main Server Loop */ +/********************/ + +#define UA_MAXTIMEOUT 50 /* Max timeout in ms between main-loop iterations */ + +/* Start: Spin up the workers and the network layer and sample the server's + * start time. + * Iterate: Process repeated callbacks and events in the network layer. This + * part can be driven from an external main-loop in an event-driven + * single-threaded architecture. + * Stop: Stop workers, finish all callbacks, stop the network layer, clean up */ + UA_StatusCode -UA_Server_removeRepeatedCallback(UA_Server *server, UA_UInt64 callbackId) { - return UA_Timer_removeRepeatedCallback(&server->timer, callbackId); +UA_Server_run_startup(UA_Server *server) { + /* ensure that the uri for ns1 is set up from the app description */ + setupNs1Uri(server); + + /* write ServerArray with same ApplicationURI value as NamespaceArray */ + UA_StatusCode retVal = writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERARRAY, + &server->config.applicationDescription.applicationUri, + 1, &UA_TYPES[UA_TYPES_STRING]); + if(retVal != UA_STATUSCODE_GOOD) + return retVal; + + if(server->state > UA_SERVERLIFECYCLE_FRESH) + return UA_STATUSCODE_GOOD; + + /* At least one endpoint has to be configured */ + if(server->config.endpointsSize == 0) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "There has to be at least one endpoint."); + } + + /* Initialized discovery */ +#ifdef UA_ENABLE_DISCOVERY + UA_DiscoveryManager_init(&server->discoveryManager, server); +#endif + + /* Does the ApplicationURI match the local certificates? */ +#ifdef UA_ENABLE_ENCRYPTION + verifyServerApplicationURI(server); +#endif + + /* Sample the start time and set it to the Server object */ + server->startTime = UA_DateTime_now(); + UA_Variant var; + UA_Variant_init(&var); + UA_Variant_setScalar(&var, &server->startTime, &UA_TYPES[UA_TYPES_DATETIME]); + UA_Server_writeValue(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STARTTIME), + var); + + /* Start the networklayers */ + UA_StatusCode result = UA_STATUSCODE_GOOD; + for(size_t i = 0; i < server->config.networkLayersSize; ++i) { + UA_ServerNetworkLayer *nl = &server->config.networkLayers[i]; + result |= nl->start(nl, &server->config.customHostname); + } + + /* Update the application description to match the previously added discovery urls. + * We can only do this after the network layer is started since it inits the discovery url */ + if (server->config.applicationDescription.discoveryUrlsSize != 0) { + UA_Array_delete(server->config.applicationDescription.discoveryUrls, server->config.applicationDescription.discoveryUrlsSize, &UA_TYPES[UA_TYPES_STRING]); + server->config.applicationDescription.discoveryUrlsSize = 0; + } + server->config.applicationDescription.discoveryUrls = (UA_String *) UA_Array_new(server->config.networkLayersSize, &UA_TYPES[UA_TYPES_STRING]); + if (!server->config.applicationDescription.discoveryUrls) { + return UA_STATUSCODE_BADOUTOFMEMORY; + } + server->config.applicationDescription.discoveryUrlsSize = server->config.networkLayersSize; + for (size_t i=0; i< server->config.applicationDescription.discoveryUrlsSize; i++) { + UA_ServerNetworkLayer *nl = &server->config.networkLayers[i]; + UA_String_copy(&nl->discoveryUrl, &server->config.applicationDescription.discoveryUrls[i]); + } + + /* Spin up the worker threads */ +#ifdef UA_ENABLE_MULTITHREADING + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Spinning up %u worker thread(s)", server->config.nThreads); + UA_WorkQueue_start(&server->workQueue, server->config.nThreads); +#endif + + /* Start the multicast discovery server */ +#ifdef UA_ENABLE_DISCOVERY_MULTICAST + if(server->config.discovery.mdnsEnable) + startMulticastDiscoveryServer(server); +#endif + + server->state = UA_SERVERLIFECYCLE_FRESH; + + return result; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_server_ns0.c" ***********************************/ +static void +serverExecuteRepeatedCallback(UA_Server *server, UA_ApplicationCallback cb, + void *callbackApplication, void *data) { +#ifndef UA_ENABLE_MULTITHREADING + cb(callbackApplication, data); +#else + UA_WorkQueue_enqueue(&server->workQueue, cb, callbackApplication, data); +#endif +} + +UA_UInt16 +UA_Server_run_iterate(UA_Server *server, UA_Boolean waitInternal) { + /* Process repeated work */ + UA_DateTime now = UA_DateTime_nowMonotonic(); + UA_DateTime nextRepeated = UA_Timer_process(&server->timer, now, + (UA_TimerExecutionCallback)serverExecuteRepeatedCallback, server); + UA_DateTime latest = now + (UA_MAXTIMEOUT * UA_DATETIME_MSEC); + if(nextRepeated > latest) + nextRepeated = latest; + + UA_UInt16 timeout = 0; + + /* round always to upper value to avoid timeout to be set to 0 + * if(nextRepeated - now) < (UA_DATETIME_MSEC/2) */ + if(waitInternal) + timeout = (UA_UInt16)(((nextRepeated - now) + (UA_DATETIME_MSEC - 1)) / UA_DATETIME_MSEC); + + /* Listen on the networklayer */ + for(size_t i = 0; i < server->config.networkLayersSize; ++i) { + UA_ServerNetworkLayer *nl = &server->config.networkLayers[i]; + nl->listen(nl, server, timeout); + } + +#if defined(UA_ENABLE_DISCOVERY_MULTICAST) && !defined(UA_ENABLE_MULTITHREADING) + if(server->config.discovery.mdnsEnable) { + // TODO multicastNextRepeat does not consider new input data (requests) + // on the socket. It will be handled on the next call. if needed, we + // need to use select with timeout on the multicast socket + // server->mdnsSocket (see example in mdnsd library) on higher level. + UA_DateTime multicastNextRepeat = 0; + UA_StatusCode hasNext = + iterateMulticastDiscoveryServer(server, &multicastNextRepeat, true); + if(hasNext == UA_STATUSCODE_GOOD && multicastNextRepeat < nextRepeated) + nextRepeated = multicastNextRepeat; + } +#endif + +#ifndef UA_ENABLE_MULTITHREADING + UA_WorkQueue_manuallyProcessDelayed(&server->workQueue); +#endif + + now = UA_DateTime_nowMonotonic(); + timeout = 0; + if(nextRepeated > now) + timeout = (UA_UInt16)((nextRepeated - now) / UA_DATETIME_MSEC); + return timeout; +} + +UA_StatusCode +UA_Server_run_shutdown(UA_Server *server) { + /* Stop the netowrk layer */ + for(size_t i = 0; i < server->config.networkLayersSize; ++i) { + UA_ServerNetworkLayer *nl = &server->config.networkLayers[i]; + nl->stop(nl, server); + } + +#ifdef UA_ENABLE_MULTITHREADING + /* Shut down the workers */ + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Shutting down %u worker thread(s)", + (UA_UInt32)server->workQueue.workersSize); + UA_WorkQueue_stop(&server->workQueue); +#endif + +#ifdef UA_ENABLE_DISCOVERY_MULTICAST + /* Stop multicast discovery */ + if(server->config.discovery.mdnsEnable) + stopMulticastDiscoveryServer(server); +#endif + + /* Execute all delayed callbacks */ + UA_WorkQueue_cleanup(&server->workQueue); + + return UA_STATUSCODE_GOOD; +} + +static UA_Boolean +testShutdownCondition(UA_Server *server) { + if(server->endTime == 0) + return false; + return (UA_DateTime_now() > server->endTime); +} + +UA_StatusCode +UA_Server_run(UA_Server *server, const volatile UA_Boolean *running) { + UA_StatusCode retval = UA_Server_run_startup(server); + if(retval != UA_STATUSCODE_GOOD) + return retval; +#ifdef UA_ENABLE_VALGRIND_INTERACTIVE + size_t loopCount = 0; +#endif + while(!testShutdownCondition(server)) { +#ifdef UA_ENABLE_VALGRIND_INTERACTIVE + if(loopCount == 0) { + VALGRIND_DO_LEAK_CHECK; + } + ++loopCount; + loopCount %= UA_VALGRIND_INTERACTIVE_INTERVAL; +#endif + UA_Server_run_iterate(server, true); + if(!*running) { + if(setServerShutdown(server)) + break; + } + } + return UA_Server_run_shutdown(server); +} + +#ifdef UA_ENABLE_HISTORIZING +/* Allow insert of historical data */ +UA_Boolean +UA_Server_AccessControl_allowHistoryUpdateUpdateData(UA_Server *server, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeId, + UA_PerformUpdateType performInsertReplace, + const UA_DataValue *value) { + if(server->config.accessControl.allowHistoryUpdateUpdateData && + !server->config.accessControl.allowHistoryUpdateUpdateData(server, &server->config.accessControl, + sessionId, sessionContext, nodeId, + performInsertReplace, value)) { + return false; + } + return true; +} + +/* Allow delete of historical data */ +UA_Boolean +UA_Server_AccessControl_allowHistoryUpdateDeleteRawModified(UA_Server *server, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeId, + UA_DateTime startTimestamp, + UA_DateTime endTimestamp, + bool isDeleteModified) { + if(server->config.accessControl.allowHistoryUpdateDeleteRawModified && + !server->config.accessControl.allowHistoryUpdateDeleteRawModified(server, &server->config.accessControl, + sessionId, sessionContext, nodeId, + startTimestamp, endTimestamp, + isDeleteModified)) { + return false; + } + return true; + +} +#endif /* UA_ENABLE_HISTORIZING */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_server_ns0.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2017 (c) Stefan Profanter, fortiss GmbH * Copyright 2017 (c) Thomas Bender * Copyright 2017 (c) Julian Grothoff * Copyright 2017 (c) Henrik Norrman + * Copyright 2018 (c) Fabian Arndt, Root-Core + * Copyright 2019 (c) Kalycito Infotech Private Limited */ -/*****************/ -/* Node Creation */ -/*****************/ static UA_StatusCode -addNode_begin(UA_Server *server, UA_NodeClass nodeClass, - UA_UInt32 nodeId, char *name, void *attributes, - const UA_DataType *attributesType) { +addNode_raw(UA_Server *server, UA_NodeClass nodeClass, + UA_UInt32 nodeId, char *name, void *attributes, + const UA_DataType *attributesType) { UA_AddNodesItem item; UA_AddNodesItem_init(&item); item.nodeClass = nodeClass; @@ -20248,47 +24018,19 @@ addNode_begin(UA_Server *server, UA_NodeClass nodeClass, item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; item.nodeAttributes.content.decoded.data = attributes; item.nodeAttributes.content.decoded.type = attributesType; - UA_NodeId parentNode = UA_NODEID_NULL; - UA_NodeId referenceType = UA_NODEID_NULL; - return Operation_addNode_begin(server, &server->adminSession, NULL, &item, - &parentNode, &referenceType, NULL); + return AddNode_raw(server, &server->adminSession, NULL, &item, NULL); } static UA_StatusCode addNode_finish(UA_Server *server, UA_UInt32 nodeId, UA_UInt32 parentNodeId, UA_UInt32 referenceTypeId) { - UA_NodeId sourceId = UA_NODEID_NUMERIC(0, nodeId); - UA_NodeId refTypeId = UA_NODEID_NUMERIC(0, referenceTypeId); - UA_ExpandedNodeId targetId = UA_EXPANDEDNODEID_NUMERIC(0, parentNodeId); - UA_StatusCode retval = UA_Server_addReference(server, sourceId, refTypeId, targetId, UA_FALSE); + const UA_NodeId sourceId = UA_NODEID_NUMERIC(0, nodeId); + const UA_NodeId refTypeId = UA_NODEID_NUMERIC(0, referenceTypeId); + const UA_ExpandedNodeId targetId = UA_EXPANDEDNODEID_NUMERIC(0, parentNodeId); + UA_StatusCode retval = UA_Server_addReference(server, sourceId, refTypeId, targetId, false); if (retval != UA_STATUSCODE_GOOD) return retval; - - - UA_NodeId node = UA_NODEID_NUMERIC(0, nodeId); - return Operation_addNode_finish(server, &server->adminSession, &node); -} - -static UA_StatusCode -addDataTypeNode(UA_Server *server, char* name, UA_UInt32 datatypeid, - UA_Boolean isAbstract, UA_UInt32 parentid) { - UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; - attr.displayName = UA_LOCALIZEDTEXT("", name); - attr.isAbstract = isAbstract; - return UA_Server_addDataTypeNode(server, UA_NODEID_NUMERIC(0, datatypeid), - UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NULL, - UA_QUALIFIEDNAME(0, name), attr, NULL, NULL); -} - -static UA_StatusCode -addObjectTypeNode(UA_Server *server, char* name, UA_UInt32 objecttypeid, - UA_Boolean isAbstract, UA_UInt32 parentid) { - UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; - attr.displayName = UA_LOCALIZEDTEXT("", name); - attr.isAbstract = isAbstract; - return UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(0, objecttypeid), - UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NULL, - UA_QUALIFIEDNAME(0, name), attr, NULL, NULL); + return AddNode_finish(server, &server->adminSession, &sourceId); } static UA_StatusCode @@ -20297,11 +24039,11 @@ addObjectNode(UA_Server *server, char* name, UA_UInt32 objectid, UA_ObjectAttributes object_attr = UA_ObjectAttributes_default; object_attr.displayName = UA_LOCALIZEDTEXT("", name); return UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(0, objectid), - UA_NODEID_NUMERIC(0, parentid), - UA_NODEID_NUMERIC(0, referenceid), - UA_QUALIFIEDNAME(0, name), - UA_NODEID_NUMERIC(0, type_id), - object_attr, NULL, NULL); + UA_NODEID_NUMERIC(0, parentid), + UA_NODEID_NUMERIC(0, referenceid), + UA_QUALIFIEDNAME(0, name), + UA_NODEID_NUMERIC(0, type_id), + object_attr, NULL, NULL); } static UA_StatusCode @@ -20318,68 +24060,46 @@ addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 UA_QUALIFIEDNAME(0, name), reference_attr, NULL, NULL); } -static UA_StatusCode -addVariableTypeNode(UA_Server *server, char* name, UA_UInt32 variabletypeid, - UA_Boolean isAbstract, UA_Int32 valueRank, UA_UInt32 dataType, - const UA_DataType *type, UA_UInt32 parentid) { - UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default; - attr.displayName = UA_LOCALIZEDTEXT("", name); - attr.dataType = UA_NODEID_NUMERIC(0, dataType); - attr.isAbstract = isAbstract; - attr.valueRank = valueRank; - - if(type) { - UA_STACKARRAY(UA_Byte, tempVal, type->memSize); - UA_init(tempVal, type); - UA_Variant_setScalar(&attr.value, tempVal, type); - return UA_Server_addVariableTypeNode(server, UA_NODEID_NUMERIC(0, variabletypeid), - UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NULL, - UA_QUALIFIEDNAME(0, name), UA_NODEID_NULL, attr, NULL, NULL); - } - return UA_Server_addVariableTypeNode(server, UA_NODEID_NUMERIC(0, variabletypeid), - UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NULL, - UA_QUALIFIEDNAME(0, name), UA_NODEID_NULL, attr, NULL, NULL); -} - -/**********************/ -/* Create Namespace 0 */ -/**********************/ +/***************************/ +/* Bootstrap NS0 hierarchy */ +/***************************/ /* Creates the basic nodes which are expected by the nodeset compiler to be * already created. This is necessary to reduce the dependencies for the nodeset * compiler. */ static UA_StatusCode UA_Server_createNS0_base(UA_Server *server) { - - UA_StatusCode ret = UA_STATUSCODE_GOOD; - /*********************************/ - /* Bootstrap reference hierarchy */ - /*********************************/ - /* Bootstrap References and HasSubtype */ + UA_StatusCode ret = UA_STATUSCODE_GOOD; UA_ReferenceTypeAttributes references_attr = UA_ReferenceTypeAttributes_default; references_attr.displayName = UA_LOCALIZEDTEXT("", "References"); references_attr.isAbstract = true; references_attr.symmetric = true; references_attr.inverseName = UA_LOCALIZEDTEXT("", "References"); - ret |= addNode_begin(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_REFERENCES, "References", - &references_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); + ret |= addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_REFERENCES, "References", + &references_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); UA_ReferenceTypeAttributes hassubtype_attr = UA_ReferenceTypeAttributes_default; hassubtype_attr.displayName = UA_LOCALIZEDTEXT("", "HasSubtype"); hassubtype_attr.isAbstract = false; hassubtype_attr.symmetric = false; hassubtype_attr.inverseName = UA_LOCALIZEDTEXT("", "HasSupertype"); - ret |= addNode_begin(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_HASSUBTYPE, "HasSubtype", - &hassubtype_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); + ret |= addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_HASSUBTYPE, "HasSubtype", + &hassubtype_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); + + UA_ReferenceTypeAttributes aggregates_attr = UA_ReferenceTypeAttributes_default; + aggregates_attr.displayName = UA_LOCALIZEDTEXT("", "Aggregates"); + aggregates_attr.isAbstract = false; + aggregates_attr.symmetric = false; + aggregates_attr.inverseName = UA_LOCALIZEDTEXT("", "AggregatedBy"); + ret |= addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_AGGREGATES, "Aggregates", + &aggregates_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); ret |= addReferenceTypeNode(server, "HierarchicalReferences", NULL, - UA_NS0ID_HIERARCHICALREFERENCES, - true, false, UA_NS0ID_REFERENCES); + UA_NS0ID_HIERARCHICALREFERENCES, true, false, UA_NS0ID_REFERENCES); ret |= addReferenceTypeNode(server, "NonHierarchicalReferences", NULL, - UA_NS0ID_NONHIERARCHICALREFERENCES, - true, false, UA_NS0ID_REFERENCES); + UA_NS0ID_NONHIERARCHICALREFERENCES, true, false, UA_NS0ID_REFERENCES); ret |= addReferenceTypeNode(server, "HasChild", NULL, UA_NS0ID_HASCHILD, true, false, UA_NS0ID_HIERARCHICALREFERENCES); @@ -20405,8 +24125,8 @@ UA_Server_createNS0_base(UA_Server *server) { ret |= addReferenceTypeNode(server, "GeneratesEvent", "GeneratedBy", UA_NS0ID_GENERATESEVENT, false, false, UA_NS0ID_NONHIERARCHICALREFERENCES); - ret |= addReferenceTypeNode(server, "Aggregates", "AggregatedBy", UA_NS0ID_AGGREGATES, - false, false, UA_NS0ID_HASCHILD); + /* Complete bootstrap of Aggregates */ + ret |= addNode_finish(server, UA_NS0ID_AGGREGATES, UA_NS0ID_HASCHILD, UA_NS0ID_HASSUBTYPE); /* Complete bootstrap of HasSubtype */ ret |= addNode_finish(server, UA_NS0ID_HASSUBTYPE, UA_NS0ID_HASCHILD, UA_NS0ID_HASSUBTYPE); @@ -20431,68 +24151,54 @@ UA_Server_createNS0_base(UA_Server *server) { UA_DataTypeAttributes basedatatype_attr = UA_DataTypeAttributes_default; basedatatype_attr.displayName = UA_LOCALIZEDTEXT("", "BaseDataType"); basedatatype_attr.isAbstract = true; - ret |= addNode_begin(server, UA_NODECLASS_DATATYPE, UA_NS0ID_BASEDATATYPE, "BaseDataType", - &basedatatype_attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); - - ret |= addDataTypeNode(server, "Number", UA_NS0ID_NUMBER, true, UA_NS0ID_BASEDATATYPE); - ret |= addDataTypeNode(server, "Integer", UA_NS0ID_INTEGER, true, UA_NS0ID_NUMBER); - ret |= addDataTypeNode(server, "UInteger", UA_NS0ID_UINTEGER, true, UA_NS0ID_NUMBER); - ret |= addDataTypeNode(server, "Boolean", UA_NS0ID_BOOLEAN, false, UA_NS0ID_BASEDATATYPE); - ret |= addDataTypeNode(server, "SByte", UA_NS0ID_SBYTE, false, UA_NS0ID_INTEGER); - ret |= addDataTypeNode(server, "Byte", UA_NS0ID_BYTE, false, UA_NS0ID_UINTEGER); - ret |= addDataTypeNode(server, "Int16", UA_NS0ID_INT16, false, UA_NS0ID_INTEGER); - ret |= addDataTypeNode(server, "UInt16", UA_NS0ID_UINT16, false, UA_NS0ID_UINTEGER); - ret |= addDataTypeNode(server, "Int32", UA_NS0ID_INT32, false, UA_NS0ID_INTEGER); - ret |= addDataTypeNode(server, "UInt32", UA_NS0ID_UINT32, false, UA_NS0ID_UINTEGER); - ret |= addDataTypeNode(server, "Int64", UA_NS0ID_INT64, false, UA_NS0ID_INTEGER); - ret |= addDataTypeNode(server, "UInt64", UA_NS0ID_UINT64, false, UA_NS0ID_UINTEGER); - ret |= addDataTypeNode(server, "Float", UA_NS0ID_FLOAT, false, UA_NS0ID_NUMBER); - ret |= addDataTypeNode(server, "Double", UA_NS0ID_DOUBLE, false, UA_NS0ID_NUMBER); - ret |= addDataTypeNode(server, "DateTime", UA_NS0ID_DATETIME, false, UA_NS0ID_BASEDATATYPE); - ret |= addDataTypeNode(server, "String", UA_NS0ID_STRING, false, UA_NS0ID_BASEDATATYPE); - ret |= addDataTypeNode(server, "ByteString", UA_NS0ID_BYTESTRING, false, UA_NS0ID_BASEDATATYPE); - ret |= addDataTypeNode(server, "Guid", UA_NS0ID_GUID, false, UA_NS0ID_BASEDATATYPE); - ret |= addDataTypeNode(server, "XmlElement", UA_NS0ID_XMLELEMENT, false, UA_NS0ID_BASEDATATYPE); - ret |= addDataTypeNode(server, "NodeId", UA_NS0ID_NODEID, false, UA_NS0ID_BASEDATATYPE); - ret |= addDataTypeNode(server, "ExpandedNodeId", UA_NS0ID_EXPANDEDNODEID, false, UA_NS0ID_BASEDATATYPE); - ret |= addDataTypeNode(server, "QualifiedName", UA_NS0ID_QUALIFIEDNAME, false, UA_NS0ID_BASEDATATYPE); - ret |= addDataTypeNode(server, "LocalizedText", UA_NS0ID_LOCALIZEDTEXT, false, UA_NS0ID_BASEDATATYPE); - ret |= addDataTypeNode(server, "StatusCode", UA_NS0ID_STATUSCODE, false, UA_NS0ID_BASEDATATYPE); - ret |= addDataTypeNode(server, "Structure", UA_NS0ID_STRUCTURE, true, UA_NS0ID_BASEDATATYPE); - ret |= addDataTypeNode(server, "Decimal128", UA_NS0ID_DECIMAL128, false, UA_NS0ID_NUMBER); - - ret |= addDataTypeNode(server, "Duration", UA_NS0ID_DURATION, false, UA_NS0ID_DOUBLE); - ret |= addDataTypeNode(server, "UtcTime", UA_NS0ID_UTCTIME, false, UA_NS0ID_DATETIME); - ret |= addDataTypeNode(server, "LocaleId", UA_NS0ID_LOCALEID, false, UA_NS0ID_STRING); + ret |= addNode_raw(server, UA_NODECLASS_DATATYPE, UA_NS0ID_BASEDATATYPE, "BaseDataType", + &basedatatype_attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); /*****************/ /* VariableTypes */ /*****************/ - /* Bootstrap BaseVariableType */ UA_VariableTypeAttributes basevar_attr = UA_VariableTypeAttributes_default; basevar_attr.displayName = UA_LOCALIZEDTEXT("", "BaseVariableType"); basevar_attr.isAbstract = true; basevar_attr.valueRank = UA_VALUERANK_ANY; basevar_attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE); - ret |= addNode_begin(server, UA_NODECLASS_VARIABLETYPE, UA_NS0ID_BASEVARIABLETYPE, "BaseVariableType", - &basevar_attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); - - ret |= addVariableTypeNode(server, "BaseDataVariableType", UA_NS0ID_BASEDATAVARIABLETYPE, - false, -2, UA_NS0ID_BASEDATATYPE, NULL, UA_NS0ID_BASEVARIABLETYPE); + ret |= addNode_raw(server, UA_NODECLASS_VARIABLETYPE, UA_NS0ID_BASEVARIABLETYPE, "BaseVariableType", + &basevar_attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); + + UA_VariableTypeAttributes bdv_attr = UA_VariableTypeAttributes_default; + bdv_attr.displayName = UA_LOCALIZEDTEXT("", "BaseDataVariableType"); + bdv_attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE); + bdv_attr.valueRank = UA_VALUERANK_ANY; + ret |= UA_Server_addVariableTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEVARIABLETYPE), + UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "BaseDataVariableType"), + UA_NODEID_NULL, bdv_attr, NULL, NULL); + + UA_VariableTypeAttributes prop_attr = UA_VariableTypeAttributes_default; + prop_attr.displayName = UA_LOCALIZEDTEXT("", "PropertyType"); + prop_attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE); + prop_attr.valueRank = UA_VALUERANK_ANY; + ret |= UA_Server_addVariableTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE), + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEVARIABLETYPE), + UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "PropertyType"), + UA_NODEID_NULL, prop_attr, NULL, NULL); /***************/ /* ObjectTypes */ /***************/ - /* Bootstrap BaseObjectType */ UA_ObjectTypeAttributes baseobj_attr = UA_ObjectTypeAttributes_default; baseobj_attr.displayName = UA_LOCALIZEDTEXT("", "BaseObjectType"); - ret |= addNode_begin(server, UA_NODECLASS_OBJECTTYPE, UA_NS0ID_BASEOBJECTTYPE, "BaseObjectType", - &baseobj_attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); + ret |= addNode_raw(server, UA_NODECLASS_OBJECTTYPE, UA_NS0ID_BASEOBJECTTYPE, "BaseObjectType", + &baseobj_attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); - ret |= addObjectTypeNode(server, "FolderType", UA_NS0ID_FOLDERTYPE, - false, UA_NS0ID_BASEOBJECTTYPE); + UA_ObjectTypeAttributes folder_attr = UA_ObjectTypeAttributes_default; + folder_attr.displayName = UA_LOCALIZEDTEXT("", "FolderType"); + ret |= UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), + UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "FolderType"), + folder_attr, NULL, NULL); /******************/ /* Root and below */ @@ -20513,13 +24219,11 @@ UA_Server_createNS0_base(UA_Server *server) { ret |= addObjectNode(server, "DataTypes", UA_NS0ID_DATATYPESFOLDER, UA_NS0ID_TYPESFOLDER, UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE); - ret |= addNode_finish(server, UA_NS0ID_BASEDATATYPE, UA_NS0ID_DATATYPESFOLDER, UA_NS0ID_ORGANIZES); ret |= addObjectNode(server, "VariableTypes", UA_NS0ID_VARIABLETYPESFOLDER, UA_NS0ID_TYPESFOLDER, UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE); - ret |= addNode_finish(server, UA_NS0ID_BASEVARIABLETYPE, UA_NS0ID_VARIABLETYPESFOLDER, UA_NS0ID_ORGANIZES); @@ -20535,8 +24239,9 @@ UA_Server_createNS0_base(UA_Server *server) { UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE); if(ret != UA_STATUSCODE_GOOD) - return UA_STATUSCODE_BADINTERNALERROR; - return UA_STATUSCODE_GOOD; + ret = UA_STATUSCODE_BADINTERNALERROR; + + return ret; } /****************/ @@ -20553,26 +24258,112 @@ readStatus(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, return UA_STATUSCODE_GOOD; } - UA_ServerStatusDataType *statustype = UA_ServerStatusDataType_new(); - statustype->startTime = server->startTime; - statustype->currentTime = UA_DateTime_now(); - statustype->state = UA_SERVERSTATE_RUNNING; - statustype->secondsTillShutdown = 0; - UA_BuildInfo_copy(&server->config.buildInfo, &statustype->buildInfo); - - value->value.type = &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]; - value->value.arrayLength = 0; - value->value.data = statustype; - value->value.arrayDimensionsSize = 0; - value->value.arrayDimensions = NULL; - value->hasValue = true; if(sourceTimestamp) { value->hasSourceTimestamp = true; value->sourceTimestamp = UA_DateTime_now(); } - return UA_STATUSCODE_GOOD; + + void *data = NULL; + + UA_assert(nodeId->identifierType == UA_NODEIDTYPE_NUMERIC); + + switch(nodeId->identifier.numeric) { + case UA_NS0ID_SERVER_SERVERSTATUS_SECONDSTILLSHUTDOWN: { + UA_UInt32 *shutdown = UA_UInt32_new(); + if(!shutdown) + return UA_STATUSCODE_BADOUTOFMEMORY; + if(server->endTime != 0) + *shutdown = (UA_UInt32)((server->endTime - UA_DateTime_now()) / UA_DATETIME_SEC); + value->value.data = shutdown; + value->value.type = &UA_TYPES[UA_TYPES_UINT32]; + value->hasValue = true; + return UA_STATUSCODE_GOOD; + } + + case UA_NS0ID_SERVER_SERVERSTATUS_STATE: { + UA_ServerState *state = UA_ServerState_new(); + if(!state) + return UA_STATUSCODE_BADOUTOFMEMORY; + if(server->endTime != 0) + *state = UA_SERVERSTATE_SHUTDOWN; + value->value.data = state; + value->value.type = &UA_TYPES[UA_TYPES_SERVERSTATE]; + value->hasValue = true; + return UA_STATUSCODE_GOOD; + } + + case UA_NS0ID_SERVER_SERVERSTATUS: { + UA_ServerStatusDataType *statustype = UA_ServerStatusDataType_new(); + if(!statustype) + return UA_STATUSCODE_BADOUTOFMEMORY; + statustype->startTime = server->startTime; + statustype->currentTime = UA_DateTime_now(); + + statustype->state = UA_SERVERSTATE_RUNNING; + statustype->secondsTillShutdown = 0; + if(server->endTime != 0) { + statustype->state = UA_SERVERSTATE_SHUTDOWN; + statustype->secondsTillShutdown = (UA_UInt32)((server->endTime - UA_DateTime_now()) / UA_DATETIME_SEC); + } + + value->value.data = statustype; + value->value.type = &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]; + value->hasValue = true; + return UA_BuildInfo_copy(&server->config.buildInfo, &statustype->buildInfo); + } + + case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO: + value->value.type = &UA_TYPES[UA_TYPES_BUILDINFO]; + data = &server->config.buildInfo; + break; + + case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI: + value->value.type = &UA_TYPES[UA_TYPES_STRING]; + data = &server->config.buildInfo.productUri; + break; + + case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME: + value->value.type = &UA_TYPES[UA_TYPES_STRING]; + data = &server->config.buildInfo.manufacturerName; + break; + + case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME: + value->value.type = &UA_TYPES[UA_TYPES_STRING]; + data = &server->config.buildInfo.productName; + break; + + case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION: + value->value.type = &UA_TYPES[UA_TYPES_STRING]; + data = &server->config.buildInfo.softwareVersion; + break; + + case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER: + value->value.type = &UA_TYPES[UA_TYPES_STRING]; + data = &server->config.buildInfo.buildNumber; + break; + + case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE: + value->value.type = &UA_TYPES[UA_TYPES_DATETIME]; + data = &server->config.buildInfo.buildDate; + break; + + default: + value->hasStatus = true; + value->status = UA_STATUSCODE_BADINTERNALERROR; + return UA_STATUSCODE_GOOD; + } + + value->value.data = UA_new(value->value.type); + if(!value->value.data) { + value->value.type = NULL; + return UA_STATUSCODE_BADOUTOFMEMORY; + } + + value->hasValue = true; + return UA_copy(data, value->value.data, value->value.type); } +#ifdef UA_GENERATED_NAMESPACE_ZERO static UA_StatusCode readServiceLevel(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, const UA_NodeId *nodeId, void *nodeContext, UA_Boolean includeSourceTimeStamp, @@ -20622,12 +24413,16 @@ readAuditing(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext } return UA_STATUSCODE_GOOD; } +#endif static UA_StatusCode readNamespaces(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, const UA_NodeId *nodeid, void *nodeContext, UA_Boolean includeSourceTimeStamp, const UA_NumericRange *range, UA_DataValue *value) { + /* ensure that the uri for ns1 is set up from the app description */ + setupNs1Uri(server); + if(range) { value->hasStatus = true; value->status = UA_STATUSCODE_BADINDEXRANGEINVALID; @@ -20670,6 +24465,9 @@ writeNamespaces(UA_Server *server, const UA_NodeId *sessionId, void *sessionCont if(newNamespacesSize <= server->namespacesSize) return UA_STATUSCODE_BADTYPEMISMATCH; + /* ensure that the uri for ns1 is set up from the app description */ + setupNs1Uri(server); + /* Test if the existing namespaces are unchanged */ for(size_t i = 0; i < server->namespacesSize; ++i) { if(!UA_String_equal(&server->namespaces[i], &newNamespaces[i])) @@ -20704,45 +24502,81 @@ readCurrentTime(UA_Server *server, const UA_NodeId *sessionId, void *sessionCont return UA_STATUSCODE_GOOD; } -#if defined(UA_ENABLE_METHODCALLS) && defined(UA_ENABLE_SUBSCRIPTIONS) +#ifdef UA_GENERATED_NAMESPACE_ZERO +static UA_StatusCode +readMinSamplingInterval(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeid, void *nodeContext, UA_Boolean includeSourceTimeStamp, + const UA_NumericRange *range, + UA_DataValue *value) { + if(range) { + value->hasStatus = true; + value->status = UA_STATUSCODE_BADINDEXRANGEINVALID; + return UA_STATUSCODE_GOOD; + } + + UA_StatusCode retval; + retval = UA_Variant_setScalarCopy(&value->value, + &server->config.samplingIntervalLimits.min, + &UA_TYPES[UA_TYPES_DURATION]); + if(retval != UA_STATUSCODE_GOOD) + return retval; + value->hasValue = true; + if(includeSourceTimeStamp) { + value->hasSourceTimestamp = true; + value->sourceTimestamp = UA_DateTime_now(); + } + return UA_STATUSCODE_GOOD; +} +#endif + +#if defined(UA_GENERATED_NAMESPACE_ZERO) && defined(UA_ENABLE_METHODCALLS) && defined(UA_ENABLE_SUBSCRIPTIONS) static UA_StatusCode readMonitoredItems(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, const UA_NodeId *methodId, void *methodContext, const UA_NodeId *objectId, - void *objectContext, size_t inputSize, - const UA_Variant *input, size_t outputSize, - UA_Variant *output) { + void *objectContext, size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output) { + /* Return two empty arrays by default */ + UA_Variant_setArray(&output[0], UA_Array_new(0, &UA_TYPES[UA_TYPES_UINT32]), + 0, &UA_TYPES[UA_TYPES_UINT32]); + UA_Variant_setArray(&output[1], UA_Array_new(0, &UA_TYPES[UA_TYPES_UINT32]), + 0, &UA_TYPES[UA_TYPES_UINT32]); + + /* Get the Session */ UA_Session *session = UA_SessionManager_getSessionById(&server->sessionManager, sessionId); if(!session) return UA_STATUSCODE_BADINTERNALERROR; - if (inputSize == 0 || !input[0].data) + if(inputSize == 0 || !input[0].data) return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; + + /* Get the Subscription */ UA_UInt32 subscriptionId = *((UA_UInt32*)(input[0].data)); - UA_Subscription* subscription = UA_Session_getSubscriptionById(session, subscriptionId); + UA_Subscription *subscription = UA_Session_getSubscriptionById(session, subscriptionId); if(!subscription) - { - if(LIST_EMPTY(&session->serverSubscriptions)) - { - UA_Variant_setArray(&output[0], UA_Array_new(0, &UA_TYPES[UA_TYPES_UINT32]), - 0, &UA_TYPES[UA_TYPES_UINT32]); - UA_Variant_setArray(&output[1], UA_Array_new(0, &UA_TYPES[UA_TYPES_UINT32]), - 0, &UA_TYPES[UA_TYPES_UINT32]); - - return UA_STATUSCODE_BADNOMATCH; - } - else - return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; - } + return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; + /* Count the MonitoredItems */ UA_UInt32 sizeOfOutput = 0; UA_MonitoredItem* monitoredItem; LIST_FOREACH(monitoredItem, &subscription->monitoredItems, listEntry) { ++sizeOfOutput; } - if(sizeOfOutput==0) + if(sizeOfOutput == 0) return UA_STATUSCODE_GOOD; - UA_UInt32* clientHandles = (UA_UInt32 *)UA_Array_new(sizeOfOutput, &UA_TYPES[UA_TYPES_UINT32]); - UA_UInt32* serverHandles = (UA_UInt32 *)UA_Array_new(sizeOfOutput, &UA_TYPES[UA_TYPES_UINT32]); + /* Allocate the output arrays */ + UA_UInt32 *clientHandles = (UA_UInt32*) + UA_Array_new(sizeOfOutput, &UA_TYPES[UA_TYPES_UINT32]); + if(!clientHandles) + return UA_STATUSCODE_BADOUTOFMEMORY; + + UA_UInt32 *serverHandles = (UA_UInt32*) + UA_Array_new(sizeOfOutput, &UA_TYPES[UA_TYPES_UINT32]); + if(!serverHandles) { + UA_free(clientHandles); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + + /* Fill the array */ UA_UInt32 i = 0; LIST_FOREACH(monitoredItem, &subscription->monitoredItems, listEntry) { clientHandles[i] = monitoredItem->clientHandle; @@ -20755,23 +24589,155 @@ readMonitoredItems(UA_Server *server, const UA_NodeId *sessionId, void *sessionC } #endif /* defined(UA_ENABLE_METHODCALLS) && defined(UA_ENABLE_SUBSCRIPTIONS) */ -static UA_StatusCode -writeNs0Variable(UA_Server *server, UA_UInt32 id, void *v, const UA_DataType *type) { +UA_StatusCode +writeNs0VariableArray(UA_Server *server, UA_UInt32 id, void *v, + size_t length, const UA_DataType *type) { UA_Variant var; UA_Variant_init(&var); - UA_Variant_setScalar(&var, v, type); + UA_Variant_setArray(&var, v, length, type); return UA_Server_writeValue(server, UA_NODEID_NUMERIC(0, id), var); } +#ifndef UA_GENERATED_NAMESPACE_ZERO static UA_StatusCode -writeNs0VariableArray(UA_Server *server, UA_UInt32 id, void *v, - size_t length, const UA_DataType *type) { +addVariableNode(UA_Server *server, char* name, UA_UInt32 variableid, + UA_UInt32 parentid, UA_UInt32 referenceid, + UA_Int32 valueRank, UA_UInt32 dataType) { + UA_VariableAttributes attr = UA_VariableAttributes_default; + attr.displayName = UA_LOCALIZEDTEXT("", name); + attr.dataType = UA_NODEID_NUMERIC(0, dataType); + attr.valueRank = valueRank; + attr.accessLevel = UA_ACCESSLEVELMASK_READ; + return UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(0, variableid), + UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NUMERIC(0, referenceid), + UA_QUALIFIEDNAME(0, name), + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), + attr, NULL, NULL); +} + +/* A minimal server object that is not complete and does not use the mandated + * references to a server type. To be used on very constrained devices. */ +static UA_StatusCode +UA_Server_minimalServerObject(UA_Server *server) { + /* Server */ + UA_StatusCode retval = addObjectNode(server, "Server", UA_NS0ID_SERVER, UA_NS0ID_OBJECTSFOLDER, + UA_NS0ID_ORGANIZES, UA_NS0ID_BASEOBJECTTYPE); + + /* Use a valuerank of -2 for now. The array is added later on and the valuerank set to 1. */ + retval |= addVariableNode(server, "ServerArray", UA_NS0ID_SERVER_SERVERARRAY, + UA_NS0ID_SERVER, UA_NS0ID_HASPROPERTY, + UA_VALUERANK_ANY, UA_NS0ID_BASEDATATYPE); + retval |= addVariableNode(server, "NamespaceArray", UA_NS0ID_SERVER_NAMESPACEARRAY, + UA_NS0ID_SERVER, UA_NS0ID_HASPROPERTY, + UA_VALUERANK_ANY, UA_NS0ID_BASEDATATYPE); + + retval |= addVariableNode(server, "ServerStatus", UA_NS0ID_SERVER_SERVERSTATUS, + UA_NS0ID_SERVER, UA_NS0ID_HASCOMPONENT, + UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); + + retval |= addVariableNode(server, "CurrentTime", UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME, + UA_NS0ID_SERVER_SERVERSTATUS, UA_NS0ID_HASCOMPONENT, + UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); + + retval |= addVariableNode(server, "State", UA_NS0ID_SERVER_SERVERSTATUS_STATE, + UA_NS0ID_SERVER_SERVERSTATUS, UA_NS0ID_HASCOMPONENT, + UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); + + retval |= addVariableNode(server, "BuildInfo", UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, + UA_NS0ID_SERVER_SERVERSTATUS, UA_NS0ID_HASCOMPONENT, + UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); + + retval |= addVariableNode(server, "ProductUri", UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI, + UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, + UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); + + retval |= addVariableNode(server, "ManufacturerName", + UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME, + UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, + UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); + + retval |= addVariableNode(server, "ProductName", + UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME, + UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, + UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); + + retval |= addVariableNode(server, "SoftwareVersion", + UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION, + UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, + UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); + + retval |= addVariableNode(server, "BuildNumber", + UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER, + UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, + UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); + + retval |= addVariableNode(server, "BuildDate", + UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE, + UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, + UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); + + return retval; +} + +#else + +static UA_StatusCode +writeNs0Variable(UA_Server *server, UA_UInt32 id, void *v, const UA_DataType *type) { UA_Variant var; UA_Variant_init(&var); - UA_Variant_setArray(&var, v, length, type); + UA_Variant_setScalar(&var, v, type); return UA_Server_writeValue(server, UA_NODEID_NUMERIC(0, id), var); } +static void +addModellingRules(UA_Server *server) { + /* Test if the ModellingRules folder was added. (Only for the full ns0.) */ + UA_NodeClass mrnc = UA_NODECLASS_UNSPECIFIED; + UA_StatusCode retval = UA_Server_readNodeClass(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES), + &mrnc); + if(retval != UA_STATUSCODE_GOOD) + return; + + /* Add ExposesItsArray */ + UA_Server_addReference(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_EXPOSESITSARRAY), + true); + + /* Add Mandatory */ + UA_Server_addReference(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY), + true); + + + /* Add MandatoryPlaceholder */ + UA_Server_addReference(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORYPLACEHOLDER), + true); + + /* Add Optional */ + UA_Server_addReference(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_OPTIONAL), + true); + + /* Add OptionalPlaceholder */ + UA_Server_addReference(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_OPTIONALPLACEHOLDER), + true); +} + +#endif + /* Initialize the nodeset 0 by using the generated code of the nodeset compiler. * This also initialized the data sources for various variables, such as for * example server time. */ @@ -20786,80 +24752,34 @@ UA_Server_initNS0(UA_Server *server) { if(retVal != UA_STATUSCODE_GOOD) return retVal; +#ifdef UA_GENERATED_NAMESPACE_ZERO /* Load nodes and references generated from the XML ns0 definition */ - server->bootstrapNS0 = true; - retVal = ua_namespace0(server); - server->bootstrapNS0 = false; - if(retVal != UA_STATUSCODE_GOOD) - return retVal; + retVal = namespace0_generated(server); +#else + /* Create a minimal server object */ + retVal = UA_Server_minimalServerObject(server); +#endif + + if(retVal != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Initialization of Namespace 0 (before bootstrapping) " + "failed with %s. See previous outputs for any error messages.", + UA_StatusCode_name(retVal)); + return UA_STATUSCODE_BADINTERNALERROR; + } /* NamespaceArray */ - UA_DataSource namespaceDataSource = {readNamespaces, NULL}; + UA_DataSource namespaceDataSource = {readNamespaces, writeNamespaces}; retVal |= UA_Server_setVariableNode_dataSource(server, - UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY), + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY), namespaceDataSource); + retVal |= UA_Server_writeValueRank(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY), 1); /* ServerArray */ retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERARRAY, &server->config.applicationDescription.applicationUri, 1, &UA_TYPES[UA_TYPES_STRING]); - - /* LocaleIdArray */ - UA_LocaleId locale_en = UA_STRING("en"); - retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_LOCALEIDARRAY, - &locale_en, 1, &UA_TYPES[UA_TYPES_LOCALEID]); - - /* MaxBrowseContinuationPoints */ - UA_UInt16 maxBrowseContinuationPoints = UA_MAXCONTINUATIONPOINTS; - retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBROWSECONTINUATIONPOINTS, - &maxBrowseContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]); - - /* ServerProfileArray */ - UA_String profileArray[4]; - UA_UInt16 profileArraySize = 0; -#define ADDPROFILEARRAY(x) profileArray[profileArraySize++] = UA_STRING_ALLOC(x) - ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/NanoEmbeddedDevice"); -#ifdef UA_ENABLE_NODEMANAGEMENT - ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/NodeManagement"); -#endif -#ifdef UA_ENABLE_METHODCALLS - ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/Methods"); -#endif -#ifdef UA_ENABLE_SUBSCRIPTIONS - ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/EmbeddedDataChangeSubscription"); -#endif - - retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_SERVERPROFILEARRAY, - profileArray, profileArraySize, &UA_TYPES[UA_TYPES_STRING]); - for(int i=0; iconfig.samplingIntervalLimits.min, &UA_TYPES[UA_TYPES_DURATION]); - - /* ServerDiagnostics - ServerDiagnosticsSummary */ - UA_ServerDiagnosticsSummaryDataType serverDiagnosticsSummary; - UA_ServerDiagnosticsSummaryDataType_init(&serverDiagnosticsSummary); - retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY, - &serverDiagnosticsSummary, - &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE]); - - /* ServerDiagnostics - EnabledFlag */ - UA_Boolean enabledFlag = false; - retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_ENABLEDFLAG, - &enabledFlag, &UA_TYPES[UA_TYPES_BOOLEAN]); + retVal |= UA_Server_writeValueRank(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERARRAY), 1); /* ServerStatus */ UA_DataSource serverStatus = {readStatus, NULL}; @@ -20871,45 +24791,53 @@ UA_Server_initNS0(UA_Server *server) { /* CurrentTime */ UA_DataSource currentTime = {readCurrentTime, NULL}; retVal |= UA_Server_setVariableNode_dataSource(server, - UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME), currentTime); + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME), currentTime); /* State */ - UA_ServerState state = UA_SERVERSTATE_RUNNING; - retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_STATE, - &state, &UA_TYPES[UA_TYPES_SERVERSTATE]); + retVal |= UA_Server_setVariableNode_dataSource(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE), + serverStatus); /* BuildInfo */ - retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, - &server->config.buildInfo, &UA_TYPES[UA_TYPES_BUILDINFO]); + retVal |= UA_Server_setVariableNode_dataSource(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), serverStatus); /* BuildInfo - ProductUri */ - retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI, - &server->config.buildInfo.productUri, &UA_TYPES[UA_TYPES_STRING]); + retVal |= UA_Server_setVariableNode_dataSource(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI), + serverStatus); /* BuildInfo - ManufacturerName */ - retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME, - &server->config.buildInfo.manufacturerName, &UA_TYPES[UA_TYPES_STRING]); + retVal |= UA_Server_setVariableNode_dataSource(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME), + serverStatus); /* BuildInfo - ProductName */ - retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME, - &server->config.buildInfo.productName, &UA_TYPES[UA_TYPES_STRING]); + retVal |= UA_Server_setVariableNode_dataSource(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME), + serverStatus); /* BuildInfo - SoftwareVersion */ - retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION, - &server->config.buildInfo.softwareVersion, &UA_TYPES[UA_TYPES_STRING]); + retVal |= UA_Server_setVariableNode_dataSource(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION), + serverStatus); /* BuildInfo - BuildNumber */ - retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER, - &server->config.buildInfo.buildNumber, &UA_TYPES[UA_TYPES_STRING]); + retVal |= UA_Server_setVariableNode_dataSource(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER), + serverStatus); /* BuildInfo - BuildDate */ - retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE, - &server->config.buildInfo.buildDate, &UA_TYPES[UA_TYPES_DATETIME]); + retVal |= UA_Server_setVariableNode_dataSource(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE), + serverStatus); + +#ifdef UA_GENERATED_NAMESPACE_ZERO /* SecondsTillShutdown */ - UA_UInt32 secondsTillShutdown = 0; - retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_SECONDSTILLSHUTDOWN, - &secondsTillShutdown, &UA_TYPES[UA_TYPES_UINT32]); + retVal |= UA_Server_setVariableNode_dataSource(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_SECONDSTILLSHUTDOWN), + serverStatus); /* ShutDownReason */ UA_LocalizedText shutdownReason; @@ -20922,21 +24850,82 @@ UA_Server_initNS0(UA_Server *server) { retVal |= UA_Server_setVariableNode_dataSource(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVICELEVEL), serviceLevel); + /* ServerDiagnostics - ServerDiagnosticsSummary */ + UA_ServerDiagnosticsSummaryDataType serverDiagnosticsSummary; + UA_ServerDiagnosticsSummaryDataType_init(&serverDiagnosticsSummary); + retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY, + &serverDiagnosticsSummary, + &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE]); + + /* ServerDiagnostics - EnabledFlag */ + UA_Boolean enabledFlag = false; + retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_ENABLEDFLAG, + &enabledFlag, &UA_TYPES[UA_TYPES_BOOLEAN]); + + /* According to Specification part-5 - pg.no-11(PDF pg.no-29), when the ServerDiagnostics is disabled the client + * may modify the value of enabledFlag=true in the server. By default, this node have CurrentRead/Write access. + * In CTT, Subscription_Minimum_1/002.js test will modify the above flag. This will not be a problem when build + * configuration is set at UA_NAMESPACE_ZERO="REDUCED" as NodeIds will not be present. When UA_NAMESPACE_ZERO="FULL", + * the test will fail. Hence made the NodeId as read only */ + retVal |= UA_Server_writeAccessLevel(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_ENABLEDFLAG), + UA_ACCESSLEVELMASK_READ); + /* Auditing */ UA_DataSource auditing = {readAuditing, NULL}; retVal |= UA_Server_setVariableNode_dataSource(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_AUDITING), auditing); - /* NamespaceArray */ - UA_DataSource nsarray_datasource = {readNamespaces, writeNamespaces}; - retVal |= UA_Server_setVariableNode_dataSource(server, - UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY), nsarray_datasource); - /* Redundancy Support */ UA_RedundancySupport redundancySupport = UA_REDUNDANCYSUPPORT_NONE; retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERREDUNDANCY_REDUNDANCYSUPPORT, &redundancySupport, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT]); + /* Remove unused subtypes of ServerRedundancy */ + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERREDUNDANCY_CURRENTSERVERID), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERREDUNDANCY_REDUNDANTSERVERARRAY), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERREDUNDANCY_SERVERURIARRAY), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERREDUNDANCY_SERVERNETWORKGROUPS), true); + + /* ServerCapabilities - LocaleIdArray */ + UA_LocaleId locale_en = UA_STRING("en"); + retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_LOCALEIDARRAY, + &locale_en, 1, &UA_TYPES[UA_TYPES_LOCALEID]); + + /* ServerCapabilities - MaxBrowseContinuationPoints */ + UA_UInt16 maxBrowseContinuationPoints = UA_MAXCONTINUATIONPOINTS; + retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBROWSECONTINUATIONPOINTS, + &maxBrowseContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]); + + /* ServerProfileArray */ + UA_String profileArray[3]; + UA_UInt16 profileArraySize = 0; +#define ADDPROFILEARRAY(x) profileArray[profileArraySize++] = UA_STRING(x) + ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/MicroEmbeddedDevice"); +#ifdef UA_ENABLE_NODEMANAGEMENT + ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/NodeManagement"); +#endif +#ifdef UA_ENABLE_METHODCALLS + ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/Methods"); +#endif + retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_SERVERPROFILEARRAY, + profileArray, profileArraySize, &UA_TYPES[UA_TYPES_STRING]); + + /* ServerCapabilities - MaxQueryContinuationPoints */ + UA_UInt16 maxQueryContinuationPoints = 0; + retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXQUERYCONTINUATIONPOINTS, + &maxQueryContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]); + + /* ServerCapabilities - MaxHistoryContinuationPoints */ + UA_UInt16 maxHistoryContinuationPoints = 0; + retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXHISTORYCONTINUATIONPOINTS, + &maxHistoryContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]); + + /* ServerCapabilities - MinSupportedSampleRate */ + UA_DataSource samplingInterval = {readMinSamplingInterval, NULL}; + retVal |= UA_Server_setVariableNode_dataSource(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MINSUPPORTEDSAMPLERATE), + samplingInterval); + /* ServerCapabilities - OperationLimits - MaxNodesPerRead */ retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERREAD, &server->config.maxNodesPerRead, &UA_TYPES[UA_TYPES_UINT32]); @@ -20969,14677 +24958,24566 @@ UA_Server_initNS0(UA_Server *server) { retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXMONITOREDITEMSPERCALL, &server->config.maxMonitoredItemsPerCall, &UA_TYPES[UA_TYPES_UINT32]); -#if defined(UA_ENABLE_METHODCALLS) && defined(UA_ENABLE_SUBSCRIPTIONS) - retVal |= UA_Server_setMethodNode_callback(server, - UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS), readMonitoredItems); +#ifdef UA_ENABLE_MICRO_EMB_DEV_PROFILE + /* Remove unused operation limit components */ + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYREADDATA), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYREADEVENTS), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEDATA), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEEVENTS), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_ROLESET), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXSTRINGLENGTH), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXARRAYLENGTH), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBYTESTRINGLENGTH), true); + + /* Remove not supported Server Instance */ + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_DICTIONARIES), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_ESTIMATEDRETURNTIME), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_LOCALTIME), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACES), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_REQUESTSERVERSTATECHANGE), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_RESENDDATA), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVERCONFIGURATION), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SETSUBSCRIPTIONDURABLE), true); + + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SAMPLINGINTERVALDIAGNOSTICSARRAY), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SESSIONSDIAGNOSTICSSUMMARY), true); + + /* Removing these NodeIds make Server Object to be non-complaint with UA 1.03 in CTT (Base Inforamtion/Base Info Core Structure/ 001.js) + * In the 1.04 specification this has been resolved by allowing to remove these static nodes as well */ + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY), true); + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SUBSCRIPTIONDIAGNOSTICSARRAY), true); #endif - return retVal; -} - -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/build/src_generated/ua_namespace0.c" ***********************************/ - -/* WARNING: This is a generated file. - * Any manual changes will be overwritten. */ +#ifndef UA_ENABLE_HISTORIZING + UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_HISTORYSERVERCAPABILITIES), true); +#else + /* ServerCapabilities - HistoryServerCapabilities - AccessHistoryDataCapability */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_ACCESSHISTORYDATACAPABILITY, + &server->config.accessHistoryDataCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); + /* ServerCapabilities - HistoryServerCapabilities - MaxReturnDataValues */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_MAXRETURNDATAVALUES, + &server->config.maxReturnDataValues, &UA_TYPES[UA_TYPES_UINT32]); -/* HasHistoricalConfiguration - ns=0;i=56 */ + /* ServerCapabilities - HistoryServerCapabilities - AccessHistoryEventsCapability */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_ACCESSHISTORYEVENTSCAPABILITY, + &server->config.accessHistoryEventsCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); -static UA_StatusCode function_ua_namespace0_0_begin(UA_Server *server, UA_UInt16* ns) { + /* ServerCapabilities - HistoryServerCapabilities - MaxReturnEventValues */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_MAXRETURNEVENTVALUES, + &server->config.maxReturnEventValues, &UA_TYPES[UA_TYPES_UINT32]); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default; -attr.inverseName = UA_LOCALIZEDTEXT("", "HistoricalConfigurationOf"); -attr.displayName = UA_LOCALIZEDTEXT("", "HasHistoricalConfiguration"); -attr.description = UA_LOCALIZEDTEXT("", "The type for a reference to the historical configuration for a data variable."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE, -UA_NODEID_NUMERIC(ns[0], 56), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "HasHistoricalConfiguration"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 56), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 44), false); -return retVal; -} + /* ServerCapabilities - HistoryServerCapabilities - InsertDataCapability */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTDATACAPABILITY, + &server->config.insertDataCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); -static UA_StatusCode function_ua_namespace0_0_finish(UA_Server *server, UA_UInt16* ns) { + /* ServerCapabilities - HistoryServerCapabilities - InsertEventCapability */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTEVENTCAPABILITY, + &server->config.insertEventCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 56) -); -} + /* ServerCapabilities - HistoryServerCapabilities - InsertAnnotationsCapability */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTANNOTATIONCAPABILITY, + &server->config.insertAnnotationsCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); -/* HasEffect - ns=0;i=54 */ + /* ServerCapabilities - HistoryServerCapabilities - ReplaceDataCapability */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_REPLACEDATACAPABILITY, + &server->config.replaceDataCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); -static UA_StatusCode function_ua_namespace0_1_begin(UA_Server *server, UA_UInt16* ns) { + /* ServerCapabilities - HistoryServerCapabilities - ReplaceEventCapability */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_REPLACEEVENTCAPABILITY, + &server->config.replaceEventCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default; -attr.inverseName = UA_LOCALIZEDTEXT("", "MayBeEffectedBy"); -attr.displayName = UA_LOCALIZEDTEXT("", "HasEffect"); -attr.description = UA_LOCALIZEDTEXT("", "The type for a reference to an event that may be raised when a transition occurs."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE, -UA_NODEID_NUMERIC(ns[0], 54), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "HasEffect"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 54), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 32), false); -return retVal; -} + /* ServerCapabilities - HistoryServerCapabilities - UpdateDataCapability */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_UPDATEDATACAPABILITY, + &server->config.updateDataCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); -static UA_StatusCode function_ua_namespace0_1_finish(UA_Server *server, UA_UInt16* ns) { + /* ServerCapabilities - HistoryServerCapabilities - UpdateEventCapability */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_UPDATEEVENTCAPABILITY, + &server->config.updateEventCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 54) -); -} + /* ServerCapabilities - HistoryServerCapabilities - DeleteRawCapability */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_DELETERAWCAPABILITY, + &server->config.deleteRawCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); -/* ToState - ns=0;i=52 */ + /* ServerCapabilities - HistoryServerCapabilities - DeleteEventCapability */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_DELETEEVENTCAPABILITY, + &server->config.deleteEventCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); -static UA_StatusCode function_ua_namespace0_2_begin(UA_Server *server, UA_UInt16* ns) { + /* ServerCapabilities - HistoryServerCapabilities - DeleteAtTimeDataCapability */ + retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_DELETEATTIMECAPABILITY, + &server->config.deleteAtTimeDataCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); +#endif -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default; -attr.inverseName = UA_LOCALIZEDTEXT("", "FromTransition"); -attr.displayName = UA_LOCALIZEDTEXT("", "ToState"); -attr.description = UA_LOCALIZEDTEXT("", "The type for a reference to the state after a transition."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE, -UA_NODEID_NUMERIC(ns[0], 52), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ToState"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 52), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 32), false); -return retVal; -} +#if defined(UA_ENABLE_METHODCALLS) && defined(UA_ENABLE_SUBSCRIPTIONS) + retVal |= UA_Server_setMethodNode_callback(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS), readMonitoredItems); +#endif -static UA_StatusCode function_ua_namespace0_2_finish(UA_Server *server, UA_UInt16* ns) { + /* The HasComponent references to the ModellingRules are not part of the + * Nodeset2.xml. So we add the references manually. */ + addModellingRules(server); + +#endif /* UA_GENERATED_NAMESPACE_ZERO */ + + /* create the OverFlowEventType + * The EventQueueOverflowEventType is defined as abstract, therefore we can not create an instance of that type + * directly, but need to create a subtype. This is already posted on the OPC Foundation bug tracker under the + * following link for clarification: https://opcfoundation-onlineapplications.org/mantis/view.php?id=4206 */ +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + UA_ObjectTypeAttributes overflowAttr = UA_ObjectTypeAttributes_default; + overflowAttr.description = UA_LOCALIZEDTEXT("en-US", "A simple event for indicating a queue overflow."); + overflowAttr.displayName = UA_LOCALIZEDTEXT("en-US", "SimpleOverflowEventType"); + retVal |= UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SIMPLEOVERFLOWEVENTTYPE), + UA_NODEID_NUMERIC(0, UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE), + UA_QUALIFIEDNAME(0, "SimpleOverflowEventType"), + overflowAttr, NULL, NULL); +#endif -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 52) -); + if(retVal != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Initialization of Namespace 0 (after bootstrapping) " + "failed with %s. See previous outputs for any error messages.", + UA_StatusCode_name(retVal)); + return UA_STATUSCODE_BADINTERNALERROR; + } + return UA_STATUSCODE_GOOD; } -/* HasCause - ns=0;i=53 */ - -static UA_StatusCode function_ua_namespace0_3_begin(UA_Server *server, UA_UInt16* ns) { +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_server_config.c" ***********************************/ -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default; -attr.inverseName = UA_LOCALIZEDTEXT("", "MayBeCausedBy"); -attr.displayName = UA_LOCALIZEDTEXT("", "HasCause"); -attr.description = UA_LOCALIZEDTEXT("", "The type for a reference to a method that can cause a transition to occur."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE, -UA_NODEID_NUMERIC(ns[0], 53), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "HasCause"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 53), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 32), false); -return retVal; -} +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2019 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + */ -static UA_StatusCode function_ua_namespace0_3_finish(UA_Server *server, UA_UInt16* ns) { -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 53) -); -} +void +UA_ServerConfig_clean(UA_ServerConfig *config) { + if(!config) + return; -/* FromState - ns=0;i=51 */ + /* Server Description */ + UA_BuildInfo_deleteMembers(&config->buildInfo); + UA_ApplicationDescription_deleteMembers(&config->applicationDescription); +#ifdef UA_ENABLE_DISCOVERY_MULTICAST + UA_MdnsDiscoveryConfiguration_clear(&config->discovery.mdns); + UA_String_clear(&config->discovery.mdnsInterfaceIP); +#endif -static UA_StatusCode function_ua_namespace0_4_begin(UA_Server *server, UA_UInt16* ns) { + /* Custom DataTypes */ + /* nothing to do */ -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default; -attr.inverseName = UA_LOCALIZEDTEXT("", "ToTransition"); -attr.displayName = UA_LOCALIZEDTEXT("", "FromState"); -attr.description = UA_LOCALIZEDTEXT("", "The type for a reference to the state before a transition."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE, -UA_NODEID_NUMERIC(ns[0], 51), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "FromState"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 51), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 32), false); -return retVal; -} + /* Networking */ + for(size_t i = 0; i < config->networkLayersSize; ++i) + config->networkLayers[i].deleteMembers(&config->networkLayers[i]); + UA_free(config->networkLayers); + config->networkLayers = NULL; + config->networkLayersSize = 0; + UA_String_deleteMembers(&config->customHostname); + config->customHostname = UA_STRING_NULL; -static UA_StatusCode function_ua_namespace0_4_finish(UA_Server *server, UA_UInt16* ns) { + for(size_t i = 0; i < config->securityPoliciesSize; ++i) { + UA_SecurityPolicy *policy = &config->securityPolicies[i]; + policy->deleteMembers(policy); + } + UA_free(config->securityPolicies); + config->securityPolicies = NULL; + config->securityPoliciesSize = 0; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 51) -); -} + for(size_t i = 0; i < config->endpointsSize; ++i) + UA_EndpointDescription_deleteMembers(&config->endpoints[i]); -/* EnumValueType - ns=0;i=7594 */ + UA_free(config->endpoints); + config->endpoints = NULL; + config->endpointsSize = 0; -static UA_StatusCode function_ua_namespace0_5_begin(UA_Server *server, UA_UInt16* ns) { + /* Certificate Validation */ + if(config->certificateVerification.deleteMembers) + config->certificateVerification.deleteMembers(&config->certificateVerification); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "EnumValueType"); -attr.description = UA_LOCALIZEDTEXT("", "A mapping between a value of an enumerated type and a name and description."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 7594), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "EnumValueType"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 7594), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 22), false); -return retVal; -} + /* Access Control */ + if(config->accessControl.deleteMembers) + config->accessControl.deleteMembers(&config->accessControl); -static UA_StatusCode function_ua_namespace0_5_finish(UA_Server *server, UA_UInt16* ns) { + /* Historical data */ +#ifdef UA_ENABLE_HISTORIZING + if(config->historyDatabase.deleteMembers) + config->historyDatabase.deleteMembers(&config->historyDatabase); +#endif -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 7594) -); + /* Logger */ + if(config->logger.clear) + config->logger.clear(config->logger.context); } -/* ServerCapabilitiesType - ns=0;i=2013 */ - -static UA_StatusCode function_ua_namespace0_6_begin(UA_Server *server, UA_UInt16* ns) { - -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "ServerCapabilitiesType"); -attr.description = UA_LOCALIZEDTEXT("", "Describes the capabilities supported by the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, -UA_NODEID_NUMERIC(ns[0], 2013), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerCapabilitiesType"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2013), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 58), false); -return retVal; +void +UA_ServerConfig_setCustomHostname(UA_ServerConfig *config, + const UA_String customHostname) { + if(!config) + return; + UA_String_deleteMembers(&config->customHostname); + UA_String_copy(&customHostname, &config->customHostname); } -static UA_StatusCode function_ua_namespace0_6_finish(UA_Server *server, UA_UInt16* ns) { +#ifdef UA_ENABLE_PUBSUB +/* Add a pubsubTransportLayer to the configuration. Memory is reallocated on + * demand. */ +UA_StatusCode +UA_ServerConfig_addPubSubTransportLayer(UA_ServerConfig *config, + UA_PubSubTransportLayer *pubsubTransportLayer) { -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2013) -); -} + if(config->pubsubTransportLayersSize == 0) { + config->pubsubTransportLayers = (UA_PubSubTransportLayer *) + UA_malloc(sizeof(UA_PubSubTransportLayer)); + } else { + config->pubsubTransportLayers = (UA_PubSubTransportLayer*) + UA_realloc(config->pubsubTransportLayers, + sizeof(UA_PubSubTransportLayer) * (config->pubsubTransportLayersSize + 1)); + } -/* OperationLimitsType - ns=0;i=11564 */ + if(config->pubsubTransportLayers == NULL) + return UA_STATUSCODE_BADOUTOFMEMORY; -static UA_StatusCode function_ua_namespace0_7_begin(UA_Server *server, UA_UInt16* ns) { + memcpy(&config->pubsubTransportLayers[config->pubsubTransportLayersSize], + pubsubTransportLayer, sizeof(UA_PubSubTransportLayer)); + config->pubsubTransportLayersSize++; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "OperationLimitsType"); -attr.description = UA_LOCALIZEDTEXT("", "Identifies the operation limits imposed by the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, -UA_NODEID_NUMERIC(ns[0], 11564), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "OperationLimitsType"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11564), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 61), false); -return retVal; + return UA_STATUSCODE_GOOD; } +#endif /* UA_ENABLE_PUBSUB */ -static UA_StatusCode function_ua_namespace0_7_finish(UA_Server *server, UA_UInt16* ns) { +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_server_binary.c" ***********************************/ -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11564) -); -} +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2014-2016 (c) Sten Grüner + * Copyright 2014-2015, 2017 (c) Florian Palm + * Copyright 2015-2016 (c) Chris Iatrou + * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2016 (c) Joakim L. Gilje + * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2016 (c) TorbenD + * Copyright 2017 (c) frax2222 + * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2019 (c) Kalycito Infotech Private Limited + */ -/* OperationLimits - ns=0;i=11551 */ -static UA_StatusCode function_ua_namespace0_8_begin(UA_Server *server, UA_UInt16* ns) { -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "OperationLimits"); -attr.description = UA_LOCALIZEDTEXT("", "Defines the limits supported by the server for different operations."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 11551), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "OperationLimits"), -UA_NODEID_NUMERIC(ns[0], 11564), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11551), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2013), false); -return retVal; -} +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +// store the authentication token and session ID so we can help fuzzing by setting +// these values in the next request automatically +UA_NodeId unsafe_fuzz_authenticationToken = {0, UA_NODEIDTYPE_NUMERIC, {0}}; +#endif -static UA_StatusCode function_ua_namespace0_8_finish(UA_Server *server, UA_UInt16* ns) { +#ifdef UA_DEBUG_DUMP_PKGS_FILE +void UA_debug_dumpCompleteChunk(UA_Server *const server, UA_Connection *const connection, + UA_ByteString *messageBuffer); +#endif -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11551) -); -} +/********************/ +/* Helper Functions */ +/********************/ -/* BuildInfo - ns=0;i=338 */ +static UA_StatusCode +sendServiceFaultWithRequest(UA_SecureChannel *channel, + const UA_RequestHeader *requestHeader, + const UA_DataType *responseType, + UA_UInt32 requestId, UA_StatusCode error) { + UA_STACKARRAY(UA_Byte, response, responseType->memSize); + UA_init(response, responseType); + UA_ResponseHeader *responseHeader = (UA_ResponseHeader*)response; + responseHeader->requestHandle = requestHeader->requestHandle; + responseHeader->timestamp = UA_DateTime_now(); + responseHeader->serviceResult = error; -static UA_StatusCode function_ua_namespace0_9_begin(UA_Server *server, UA_UInt16* ns) { + /* Send error message. Message type is MSG and not ERR, since we are on a + * SecureChannel! */ + UA_StatusCode retval = + UA_SecureChannel_sendSymmetricMessage(channel, requestId, UA_MESSAGETYPE_MSG, + response, responseType); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "BuildInfo"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 338), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "BuildInfo"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 338), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 22), false); -return retVal; + UA_LOG_DEBUG(channel->securityPolicy->logger, UA_LOGCATEGORY_SERVER, + "Sent ServiceFault with error code %s", UA_StatusCode_name(error)); + return retval; } -static UA_StatusCode function_ua_namespace0_9_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 338) -); + /* This is not an ERR message, the connection is not closed afterwards */ +static UA_StatusCode +sendServiceFault(UA_SecureChannel *channel, const UA_ByteString *msg, + size_t offset, const UA_DataType *responseType, + UA_UInt32 requestId, UA_StatusCode error) { + UA_RequestHeader requestHeader; + UA_StatusCode retval = UA_RequestHeader_decodeBinary(msg, &offset, &requestHeader); + if(retval != UA_STATUSCODE_GOOD) + return retval; + retval = sendServiceFaultWithRequest(channel, &requestHeader, responseType, + requestId, error); + UA_RequestHeader_deleteMembers(&requestHeader); + return retval; } -/* ServerType - ns=0;i=2004 */ - -static UA_StatusCode function_ua_namespace0_10_begin(UA_Server *server, UA_UInt16* ns) { - -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "ServerType"); -attr.description = UA_LOCALIZEDTEXT("", "Specifies the current status and capabilities of the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, -UA_NODEID_NUMERIC(ns[0], 2004), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerType"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2004), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 58), false); -return retVal; -} - -static UA_StatusCode function_ua_namespace0_10_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2004) -); -} - -/* Server - ns=0;i=2253 */ +static void +getServicePointers(UA_UInt32 requestTypeId, const UA_DataType **requestType, + const UA_DataType **responseType, UA_Service *service, + UA_Boolean *requiresSession) { + switch(requestTypeId) { + case UA_NS0ID_GETENDPOINTSREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_GetEndpoints; + *requestType = &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]; + *requiresSession = false; + break; + case UA_NS0ID_FINDSERVERSREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_FindServers; + *requestType = &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]; + *requiresSession = false; + break; +#ifdef UA_ENABLE_DISCOVERY +# ifdef UA_ENABLE_DISCOVERY_MULTICAST + case UA_NS0ID_FINDSERVERSONNETWORKREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_FindServersOnNetwork; + *requestType = &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]; + *requiresSession = false; + break; +# endif + case UA_NS0ID_REGISTERSERVERREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_RegisterServer; + *requestType = &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]; + *requiresSession = false; + break; + case UA_NS0ID_REGISTERSERVER2REQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_RegisterServer2; + *requestType = &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST]; + *responseType = &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]; + *requiresSession = false; + break; +#endif + case UA_NS0ID_CREATESESSIONREQUEST_ENCODING_DEFAULTBINARY: + *service = NULL; //(UA_Service)Service_CreateSession; + *requestType = &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]; + *requiresSession = false; + break; + case UA_NS0ID_ACTIVATESESSIONREQUEST_ENCODING_DEFAULTBINARY: + *service = NULL; //(UA_Service)Service_ActivateSession; + *requestType = &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]; + break; + case UA_NS0ID_CLOSESESSIONREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_CloseSession; + *requestType = &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]; + break; + case UA_NS0ID_READREQUEST_ENCODING_DEFAULTBINARY: + *service = NULL; + *service = (UA_Service)Service_Read; + *requestType = &UA_TYPES[UA_TYPES_READREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_READRESPONSE]; + break; + case UA_NS0ID_WRITEREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_Write; + *requestType = &UA_TYPES[UA_TYPES_WRITEREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_WRITERESPONSE]; + break; + case UA_NS0ID_BROWSEREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_Browse; + *requestType = &UA_TYPES[UA_TYPES_BROWSEREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_BROWSERESPONSE]; + break; + case UA_NS0ID_BROWSENEXTREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_BrowseNext; + *requestType = &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]; + break; + case UA_NS0ID_REGISTERNODESREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_RegisterNodes; + *requestType = &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]; + break; + case UA_NS0ID_UNREGISTERNODESREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_UnregisterNodes; + *requestType = &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]; + break; + case UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_TranslateBrowsePathsToNodeIds; + *requestType = &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]; + break; -static UA_StatusCode function_ua_namespace0_11_begin(UA_Server *server, UA_UInt16* ns) { +#ifdef UA_ENABLE_SUBSCRIPTIONS + case UA_NS0ID_CREATESUBSCRIPTIONREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_CreateSubscription; + *requestType = &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]; + break; + case UA_NS0ID_PUBLISHREQUEST_ENCODING_DEFAULTBINARY: + *requestType = &UA_TYPES[UA_TYPES_PUBLISHREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]; + break; + case UA_NS0ID_REPUBLISHREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_Republish; + *requestType = &UA_TYPES[UA_TYPES_REPUBLISHREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]; + break; + case UA_NS0ID_MODIFYSUBSCRIPTIONREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_ModifySubscription; + *requestType = &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]; + break; + case UA_NS0ID_SETPUBLISHINGMODEREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_SetPublishingMode; + *requestType = &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]; + break; + case UA_NS0ID_DELETESUBSCRIPTIONSREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_DeleteSubscriptions; + *requestType = &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]; + break; + case UA_NS0ID_CREATEMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_CreateMonitoredItems; + *requestType = &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]; + break; + case UA_NS0ID_DELETEMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_DeleteMonitoredItems; + *requestType = &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]; + break; + case UA_NS0ID_MODIFYMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_ModifyMonitoredItems; + *requestType = &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]; + break; + case UA_NS0ID_SETMONITORINGMODEREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_SetMonitoringMode; + *requestType = &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]; + break; +#endif +#ifdef UA_ENABLE_HISTORIZING + /* For History read */ + case UA_NS0ID_HISTORYREADREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_HistoryRead; + *requestType = &UA_TYPES[UA_TYPES_HISTORYREADREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_HISTORYREADRESPONSE]; + break; + /* For History update */ + case UA_NS0ID_HISTORYUPDATEREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_HistoryUpdate; + *requestType = &UA_TYPES[UA_TYPES_HISTORYUPDATEREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_HISTORYUPDATERESPONSE]; + break; +#endif -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.eventNotifier = true; -attr.displayName = UA_LOCALIZEDTEXT("", "Server"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 2253), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Server"), -UA_NODEID_NUMERIC(ns[0], 2004), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2253), UA_NODEID_NUMERIC(ns[0], 35), UA_EXPANDEDNODEID_NUMERIC(ns[0], 85), false); -return retVal; -} +#ifdef UA_ENABLE_METHODCALLS + case UA_NS0ID_CALLREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_Call; + *requestType = &UA_TYPES[UA_TYPES_CALLREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_CALLRESPONSE]; + break; +#endif -static UA_StatusCode function_ua_namespace0_11_finish(UA_Server *server, UA_UInt16* ns) { +#ifdef UA_ENABLE_NODEMANAGEMENT + case UA_NS0ID_ADDNODESREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_AddNodes; + *requestType = &UA_TYPES[UA_TYPES_ADDNODESREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_ADDNODESRESPONSE]; + break; + case UA_NS0ID_ADDREFERENCESREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_AddReferences; + *requestType = &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]; + break; + case UA_NS0ID_DELETENODESREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_DeleteNodes; + *requestType = &UA_TYPES[UA_TYPES_DELETENODESREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_DELETENODESRESPONSE]; + break; + case UA_NS0ID_DELETEREFERENCESREQUEST_ENCODING_DEFAULTBINARY: + *service = (UA_Service)Service_DeleteReferences; + *requestType = &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST]; + *responseType = &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]; + break; +#endif -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2253) -); + default: + break; + } } -/* GetMonitoredItems - ns=0;i=11492 */ +/*************************/ +/* Process Message Types */ +/*************************/ -static UA_StatusCode function_ua_namespace0_12_begin(UA_Server *server, UA_UInt16* ns) { +/* HEL -> Open up the connection */ +static UA_StatusCode +processHEL(UA_Server *server, UA_Connection *connection, + const UA_ByteString *msg, size_t *offset) { + UA_TcpHelloMessage helloMessage; + UA_StatusCode retval = UA_TcpHelloMessage_decodeBinary(msg, offset, &helloMessage); + if(retval != UA_STATUSCODE_GOOD) + return retval; -#ifdef UA_ENABLE_METHODCALLS -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_MethodAttributes attr = UA_MethodAttributes_default; -attr.executable = true; -attr.userExecutable = true; -attr.displayName = UA_LOCALIZEDTEXT("", "GetMonitoredItems"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_METHOD, -UA_NODEID_NUMERIC(ns[0], 11492), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "GetMonitoredItems"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_METHODATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11492), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2253), false); -return retVal; -#else -return UA_STATUSCODE_GOOD; -#endif /* UA_ENABLE_METHODCALLS */ -} + /* Currently not checked */ + UA_String_deleteMembers(&helloMessage.endpointUrl); -static UA_StatusCode function_ua_namespace0_12_finish(UA_Server *server, UA_UInt16* ns) { + /* TODO: Use the config of the exact NetworkLayer */ + if(server->config.networkLayersSize == 0) + return UA_STATUSCODE_BADOUTOFMEMORY; + const UA_ConnectionConfig *localConfig = &server->config.networkLayers[0].localConnectionConfig; -#ifdef UA_ENABLE_METHODCALLS -return UA_Server_addMethodNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11492) -, NULL, 0, NULL, 0, NULL); -#else -return UA_STATUSCODE_GOOD; -#endif /* UA_ENABLE_METHODCALLS */ -} + /* Parameterize the connection */ + UA_ConnectionConfig remoteConfig; + remoteConfig.protocolVersion = helloMessage.protocolVersion; + remoteConfig.sendBufferSize = helloMessage.sendBufferSize; + remoteConfig.recvBufferSize = helloMessage.receiveBufferSize; + remoteConfig.maxMessageSize = helloMessage.maxMessageSize; + remoteConfig.maxChunkCount = helloMessage.maxChunkCount; + retval = UA_Connection_processHELACK(connection, localConfig, &remoteConfig); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_NETWORK, + "Connection %i | Error during the HEL/ACK handshake", + (int)(connection->sockfd)); + return retval; + } -/* ServerCapabilities - ns=0;i=2268 */ + /* Build acknowledge response */ + UA_TcpAcknowledgeMessage ackMessage; + memcpy(&ackMessage, &connection->config, sizeof(UA_TcpAcknowledgeMessage)); /* Same struct layout.. */ + UA_TcpMessageHeader ackHeader; + ackHeader.messageTypeAndChunkType = UA_MESSAGETYPE_ACK + UA_CHUNKTYPE_FINAL; + ackHeader.messageSize = 8 + 20; /* ackHeader + ackMessage */ -static UA_StatusCode function_ua_namespace0_13_begin(UA_Server *server, UA_UInt16* ns) { + /* Get the send buffer from the network layer */ + UA_ByteString ack_msg; + UA_ByteString_init(&ack_msg); + retval = connection->getSendBuffer(connection, connection->config.sendBufferSize, &ack_msg); + if(retval != UA_STATUSCODE_GOOD) + return retval; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "ServerCapabilities"); -attr.description = UA_LOCALIZEDTEXT("", "Describes capabilities supported by the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 2268), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerCapabilities"), -UA_NODEID_NUMERIC(ns[0], 2013), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2268), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2253), false); -return retVal; -} + /* Encode and send the response */ + UA_Byte *bufPos = ack_msg.data; + const UA_Byte *bufEnd = &ack_msg.data[ack_msg.length]; -static UA_StatusCode function_ua_namespace0_13_finish(UA_Server *server, UA_UInt16* ns) { + retval = UA_TcpMessageHeader_encodeBinary(&ackHeader, &bufPos, bufEnd); + if(retval != UA_STATUSCODE_GOOD) { + connection->releaseSendBuffer(connection, &ack_msg); + return retval; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2268) -); + retval = UA_TcpAcknowledgeMessage_encodeBinary(&ackMessage, &bufPos, bufEnd); + if(retval != UA_STATUSCODE_GOOD) { + connection->releaseSendBuffer(connection, &ack_msg); + return retval; + } + ack_msg.length = ackHeader.messageSize; + return connection->send(connection, &ack_msg); } -/* AggregateFunctions - ns=0;i=2997 */ - -static UA_StatusCode function_ua_namespace0_14_begin(UA_Server *server, UA_UInt16* ns) { - -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "AggregateFunctions"); -attr.description = UA_LOCALIZEDTEXT("", "A folder for the real time aggregates supported by the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 2997), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "AggregateFunctions"), -UA_NODEID_NUMERIC(ns[0], 61), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2997), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2268), false); -return retVal; -} +/* OPN -> Open up/renew the securechannel */ +static UA_StatusCode +processOPN(UA_Server *server, UA_SecureChannel *channel, + const UA_UInt32 requestId, const UA_ByteString *msg) { + /* Decode the request */ + size_t offset = 0; + UA_NodeId requestType; + UA_OpenSecureChannelRequest openSecureChannelRequest; + UA_StatusCode retval = UA_NodeId_decodeBinary(msg, &offset, &requestType); -static UA_StatusCode function_ua_namespace0_14_finish(UA_Server *server, UA_UInt16* ns) { + if(retval != UA_STATUSCODE_GOOD) { + UA_NodeId_deleteMembers(&requestType); + UA_LOG_INFO_CHANNEL(&server->config.logger, channel, + "Could not decode the NodeId. Closing the connection"); + UA_SecureChannelManager_close(&server->secureChannelManager, channel->securityToken.channelId); + return retval; + } + retval = UA_OpenSecureChannelRequest_decodeBinary(msg, &offset, &openSecureChannelRequest); -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2997) -); -} + /* Error occurred */ + if(retval != UA_STATUSCODE_GOOD || + requestType.identifier.numeric != UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST].binaryEncodingId) { + UA_NodeId_deleteMembers(&requestType); + UA_OpenSecureChannelRequest_deleteMembers(&openSecureChannelRequest); + UA_LOG_INFO_CHANNEL(&server->config.logger, channel, + "Could not decode the OPN message. Closing the connection."); + UA_SecureChannelManager_close(&server->secureChannelManager, channel->securityToken.channelId); + return retval; + } + UA_NodeId_deleteMembers(&requestType); -/* ModellingRules - ns=0;i=2996 */ + /* Call the service */ + UA_OpenSecureChannelResponse openScResponse; + UA_OpenSecureChannelResponse_init(&openScResponse); + Service_OpenSecureChannel(server, channel, &openSecureChannelRequest, &openScResponse); + UA_OpenSecureChannelRequest_deleteMembers(&openSecureChannelRequest); + if(openScResponse.responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_LOG_INFO_CHANNEL(&server->config.logger, channel, "Could not open a SecureChannel. " + "Closing the connection."); + UA_SecureChannelManager_close(&server->secureChannelManager, + channel->securityToken.channelId); + return openScResponse.responseHeader.serviceResult; + } -static UA_StatusCode function_ua_namespace0_15_begin(UA_Server *server, UA_UInt16* ns) { + /* Send the response */ + retval = UA_SecureChannel_sendAsymmetricOPNMessage(channel, requestId, &openScResponse, + &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]); + UA_OpenSecureChannelResponse_deleteMembers(&openScResponse); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_INFO_CHANNEL(&server->config.logger, channel, + "Could not send the OPN answer with error code %s", + UA_StatusCode_name(retval)); + UA_SecureChannelManager_close(&server->secureChannelManager, + channel->securityToken.channelId); + return retval; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "ModellingRules"); -attr.description = UA_LOCALIZEDTEXT("", "A folder for the modelling rules supported by the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 2996), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ModellingRules"), -UA_NODEID_NUMERIC(ns[0], 61), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2996), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2268), false); -return retVal; + return retval; } -static UA_StatusCode function_ua_namespace0_15_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2996) -); -} +static UA_StatusCode +sendResponse(UA_SecureChannel *channel, UA_UInt32 requestId, UA_UInt32 requestHandle, + UA_ResponseHeader *responseHeader, const UA_DataType *responseType) { + /* Prepare the ResponseHeader */ + responseHeader->requestHandle = requestHandle; + responseHeader->timestamp = UA_DateTime_now(); -/* OperationLimits - ns=0;i=11704 */ + /* Start the message context */ + UA_MessageContext mc; + UA_StatusCode retval = UA_MessageContext_begin(&mc, channel, requestId, UA_MESSAGETYPE_MSG); + if(retval != UA_STATUSCODE_GOOD) + return retval; -static UA_StatusCode function_ua_namespace0_16_begin(UA_Server *server, UA_UInt16* ns) { + /* Assert's required for clang-analyzer */ + UA_assert(mc.buf_pos == &mc.messageBuffer.data[UA_SECURE_MESSAGE_HEADER_LENGTH]); + UA_assert(mc.buf_end <= &mc.messageBuffer.data[mc.messageBuffer.length]); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "OperationLimits"); -attr.description = UA_LOCALIZEDTEXT("", "Defines the limits supported by the server for different operations."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 11704), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "OperationLimits"), -UA_NODEID_NUMERIC(ns[0], 11564), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11704), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2268), false); -return retVal; -} + /* Encode the response type */ + UA_NodeId typeId = UA_NODEID_NUMERIC(0, responseType->binaryEncodingId); + retval = UA_MessageContext_encode(&mc, &typeId, &UA_TYPES[UA_TYPES_NODEID]); + if(retval != UA_STATUSCODE_GOOD) + return retval; -static UA_StatusCode function_ua_namespace0_16_finish(UA_Server *server, UA_UInt16* ns) { + /* Encode the response */ + retval = UA_MessageContext_encode(&mc, responseHeader, responseType); + if(retval != UA_STATUSCODE_GOOD) + return retval; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11704) -); + /* Finish / send out */ + return UA_MessageContext_finish(&mc); } -/* ServerDiagnosticsSummaryType - ns=0;i=2150 */ +static UA_StatusCode +processMSGDecoded(UA_Server *server, UA_SecureChannel *channel, UA_UInt32 requestId, + UA_Service service, const UA_RequestHeader *requestHeader, + const UA_DataType *requestType, UA_ResponseHeader *responseHeader, + const UA_DataType *responseType, UA_Boolean sessionRequired) { + /* CreateSession doesn't need a session */ + if(requestType == &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]) { + Service_CreateSession(server, channel, + (const UA_CreateSessionRequest *)requestHeader, + (UA_CreateSessionResponse *)responseHeader); +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + /* Store the authentication token and session ID so we can help fuzzing + * by setting these values in the next request automatically */ + UA_CreateSessionResponse *res = (UA_CreateSessionResponse *)responseHeader; + UA_NodeId_copy(&res->authenticationToken, &unsafe_fuzz_authenticationToken); +#endif + return sendResponse(channel, requestId, requestHeader->requestHandle, + responseHeader, responseType); + } -static UA_StatusCode function_ua_namespace0_17_begin(UA_Server *server, UA_UInt16* ns) { + /* Find the matching session */ + UA_Session *session = (UA_Session*) + UA_SecureChannel_getSession(channel, &requestHeader->authenticationToken); + if(!session && !UA_NodeId_isNull(&requestHeader->authenticationToken)) + session = UA_SessionManager_getSessionByToken(&server->sessionManager, + &requestHeader->authenticationToken); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default; -attr.valueRank = (UA_Int32)-2; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 24); -attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummaryType"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE, -UA_NODEID_NUMERIC(ns[0], 2150), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerDiagnosticsSummaryType"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2150), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 63), false); -return retVal; -} + if(requestType == &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]) { + if(!session) { + UA_LOG_DEBUG_CHANNEL(&server->config.logger, channel, + "Trying to activate a session that is " \ + "not known in the server"); + return sendServiceFaultWithRequest(channel, requestHeader, responseType, + requestId, UA_STATUSCODE_BADSESSIONIDINVALID); + } + Service_ActivateSession(server, channel, session, + (const UA_ActivateSessionRequest*)requestHeader, + (UA_ActivateSessionResponse*)responseHeader); + return sendResponse(channel, requestId, requestHeader->requestHandle, + responseHeader, responseType); + } -static UA_StatusCode function_ua_namespace0_17_finish(UA_Server *server, UA_UInt16* ns) { + /* Set an anonymous, inactive session for services that need no session */ + UA_Session anonymousSession; + if(!session) { + if(sessionRequired) { +#ifdef UA_ENABLE_TYPENAMES + UA_LOG_WARNING_CHANNEL(&server->config.logger, channel, + "%s refused without a valid session", + requestType->typeName); +#else + UA_LOG_WARNING_CHANNEL(&server->config.logger, channel, + "Service %i refused without a valid session", + requestType->binaryEncodingId); +#endif + return sendServiceFaultWithRequest(channel, requestHeader, responseType, + requestId, UA_STATUSCODE_BADSESSIONIDINVALID); + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2150) -); -} + UA_Session_init(&anonymousSession); + anonymousSession.sessionId = UA_NODEID_GUID(0, UA_GUID_NULL); + anonymousSession.header.channel = channel; + session = &anonymousSession; + } -/* PublishingIntervalCount - ns=0;i=2159 */ + /* Trying to use a non-activated session? Do not allow if request is of type + * CloseSessionRequest */ + if(sessionRequired && !session->activated && + requestType != &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]) { +#ifdef UA_ENABLE_TYPENAMES + UA_LOG_WARNING_SESSION(&server->config.logger, session, + "%s refused on a non-activated session", + requestType->typeName); +#else + UA_LOG_WARNING_SESSION(&server->config.logger, session, + "Service %i refused on a non-activated session", + requestType->binaryEncodingId); +#endif + UA_SessionManager_removeSession(&server->sessionManager, + &session->header.authenticationToken); + return sendServiceFaultWithRequest(channel, requestHeader, responseType, + requestId, UA_STATUSCODE_BADSESSIONNOTACTIVATED); + } -static UA_StatusCode function_ua_namespace0_18_begin(UA_Server *server, UA_UInt16* ns) { + /* The session is bound to another channel */ + if(session != &anonymousSession && session->header.channel != channel) { + UA_LOG_WARNING_CHANNEL(&server->config.logger, channel, + "Client tries to use a Session that is not " + "bound to this SecureChannel"); + return sendServiceFaultWithRequest(channel, requestHeader, responseType, + requestId, UA_STATUSCODE_BADSECURECHANNELIDINVALID); + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "PublishingIntervalCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2159), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "PublishingIntervalCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2159), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2150), false); -return retVal; -} + /* Update the session lifetime */ + UA_Session_updateLifetime(session); -static UA_StatusCode function_ua_namespace0_18_finish(UA_Server *server, UA_UInt16* ns) { +#ifdef UA_ENABLE_SUBSCRIPTIONS + /* The publish request is not answered immediately */ + if(requestType == &UA_TYPES[UA_TYPES_PUBLISHREQUEST]) { + Service_Publish(server, session, (const UA_PublishRequest*)requestHeader, requestId); + return UA_STATUSCODE_GOOD; + } +#endif -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2159) -); + /* Dispatch the synchronous service call and send the response */ + service(server, session, requestHeader, responseHeader); + return sendResponse(channel, requestId, requestHeader->requestHandle, + responseHeader, responseType); } -/* SecurityRejectedSessionCount - ns=0;i=2154 */ +static UA_StatusCode +processMSG(UA_Server *server, UA_SecureChannel *channel, + UA_UInt32 requestId, const UA_ByteString *msg) { + /* Decode the nodeid */ + size_t offset = 0; + UA_NodeId requestTypeId; + UA_StatusCode retval = UA_NodeId_decodeBinary(msg, &offset, &requestTypeId); + if(retval != UA_STATUSCODE_GOOD) + return retval; + if(requestTypeId.namespaceIndex != 0 || + requestTypeId.identifierType != UA_NODEIDTYPE_NUMERIC) + UA_NodeId_deleteMembers(&requestTypeId); /* leads to badserviceunsupported */ -static UA_StatusCode function_ua_namespace0_19_begin(UA_Server *server, UA_UInt16* ns) { + size_t requestPos = offset; /* Store the offset (for sendServiceFault) */ -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedSessionCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2154), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "SecurityRejectedSessionCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2154), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2150), false); -return retVal; -} + /* Get the service pointers */ + UA_Service service = NULL; + UA_Boolean sessionRequired = true; + const UA_DataType *requestType = NULL; + const UA_DataType *responseType = NULL; + getServicePointers(requestTypeId.identifier.numeric, &requestType, + &responseType, &service, &sessionRequired); + if(!requestType) { + if(requestTypeId.identifier.numeric == 787) { + UA_LOG_INFO_CHANNEL(&server->config.logger, channel, + "Client requested a subscription, " \ + "but those are not enabled in the build"); + } else { + UA_LOG_INFO_CHANNEL(&server->config.logger, channel, + "Unknown request with type identifier %i", + requestTypeId.identifier.numeric); + } + return sendServiceFault(channel, msg, requestPos, &UA_TYPES[UA_TYPES_SERVICEFAULT], + requestId, UA_STATUSCODE_BADSERVICEUNSUPPORTED); + } + UA_assert(responseType); -static UA_StatusCode function_ua_namespace0_19_finish(UA_Server *server, UA_UInt16* ns) { + /* Decode the request */ + UA_STACKARRAY(UA_Byte, request, requestType->memSize); + retval = UA_decodeBinary(msg, &offset, request, requestType, server->config.customDataTypes); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_DEBUG_CHANNEL(&server->config.logger, channel, + "Could not decode the request"); + return sendServiceFault(channel, msg, requestPos, responseType, requestId, retval); + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2154) -); -} + /* Check timestamp in the request header */ + UA_RequestHeader *requestHeader = (UA_RequestHeader*)request; + if(requestHeader->timestamp == 0) { + if(server->config.verifyRequestTimestamp <= UA_RULEHANDLING_WARN) { + UA_LOG_WARNING_CHANNEL(&server->config.logger, channel, + "The server sends no timestamp in the request header. " + "See the 'verifyRequestTimestamp' setting."); + if(server->config.verifyRequestTimestamp <= UA_RULEHANDLING_ABORT) { + retval = sendServiceFaultWithRequest(channel, requestHeader, responseType, + requestId, UA_STATUSCODE_BADINVALIDTIMESTAMP); + UA_deleteMembers(request, requestType); + return retval; + } + } + } -/* SecurityRejectedRequestsCount - ns=0;i=2162 */ +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + /* Set the authenticationToken from the create session request to help + * fuzzing cover more lines */ + UA_NodeId_deleteMembers(&requestHeader->authenticationToken); + if(!UA_NodeId_isNull(&unsafe_fuzz_authenticationToken)) + UA_NodeId_copy(&unsafe_fuzz_authenticationToken, &requestHeader->authenticationToken); +#endif -static UA_StatusCode function_ua_namespace0_20_begin(UA_Server *server, UA_UInt16* ns) { + /* Prepare the respone */ + UA_STACKARRAY(UA_Byte, response, responseType->memSize); + UA_ResponseHeader *responseHeader = (UA_ResponseHeader*)response; + UA_init(response, responseType); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedRequestsCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2162), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "SecurityRejectedRequestsCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2162), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2150), false); -return retVal; -} + /* Continue with the decoded Request */ + retval = processMSGDecoded(server, channel, requestId, service, requestHeader, requestType, + responseHeader, responseType, sessionRequired); -static UA_StatusCode function_ua_namespace0_20_finish(UA_Server *server, UA_UInt16* ns) { + /* Clean up */ + UA_deleteMembers(request, requestType); + UA_deleteMembers(responseHeader, responseType); + return retval; +} -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2162) -); +/* Takes decoded messages starting at the nodeid of the content type. */ +static void +processSecureChannelMessage(void *application, UA_SecureChannel *channel, + UA_MessageType messagetype, UA_UInt32 requestId, + const UA_ByteString *message) { + UA_Server *server = (UA_Server*)application; + UA_StatusCode retval = UA_STATUSCODE_GOOD; + switch(messagetype) { + case UA_MESSAGETYPE_OPN: + UA_LOG_TRACE_CHANNEL(&server->config.logger, channel, + "Process an OPN on an open channel"); + retval = processOPN(server, channel, requestId, message); + break; + case UA_MESSAGETYPE_MSG: + UA_LOG_TRACE_CHANNEL(&server->config.logger, channel, "Process a MSG"); + retval = processMSG(server, channel, requestId, message); + break; + case UA_MESSAGETYPE_CLO: + UA_LOG_TRACE_CHANNEL(&server->config.logger, channel, "Process a CLO"); + Service_CloseSecureChannel(server, channel); + break; + default: + UA_LOG_TRACE_CHANNEL(&server->config.logger, channel, "Invalid message type"); + retval = UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; + break; + } + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_INFO_CHANNEL(&server->config.logger, channel, + "Processing the message failed with StatusCode %s. " + "Closing the channel.", UA_StatusCode_name(retval)); + Service_CloseSecureChannel(server, channel); + } } -/* RejectedRequestsCount - ns=0;i=2163 */ +static UA_StatusCode +createSecureChannel(void *application, UA_Connection *connection, + UA_AsymmetricAlgorithmSecurityHeader *asymHeader) { + UA_Server *server = (UA_Server*)application; -static UA_StatusCode function_ua_namespace0_21_begin(UA_Server *server, UA_UInt16* ns) { + /* Iterate over available endpoints and choose the correct one */ + UA_SecurityPolicy *securityPolicy = NULL; + for(size_t i = 0; i < server->config.securityPoliciesSize; ++i) { + UA_SecurityPolicy *policy = &server->config.securityPolicies[i]; + if(!UA_ByteString_equal(&asymHeader->securityPolicyUri, &policy->policyUri)) + continue; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "RejectedRequestsCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2163), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "RejectedRequestsCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2163), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2150), false); -return retVal; -} + UA_StatusCode retval = policy->asymmetricModule. + compareCertificateThumbprint(policy, &asymHeader->receiverCertificateThumbprint); + if(retval != UA_STATUSCODE_GOOD) + continue; -static UA_StatusCode function_ua_namespace0_21_finish(UA_Server *server, UA_UInt16* ns) { + /* We found the correct policy (except for security mode). The endpoint + * needs to be selected by the client / server to match the security + * mode in the endpoint for the session. */ + securityPolicy = policy; + break; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2163) -); + if(!securityPolicy) + return UA_STATUSCODE_BADSECURITYPOLICYREJECTED; + + /* Create a new channel */ + return UA_SecureChannelManager_create(&server->secureChannelManager, connection, + securityPolicy, asymHeader); } -/* RejectedSessionCount - ns=0;i=2155 */ +static UA_StatusCode +processCompleteChunkWithoutChannel(UA_Server *server, UA_Connection *connection, + UA_ByteString *message) { + /* Process chunk without a channel; must be OPN */ + UA_LOG_TRACE(&server->config.logger, UA_LOGCATEGORY_NETWORK, + "Connection %i | No channel attached to the connection. " + "Process the chunk directly", (int)(connection->sockfd)); + size_t offset = 0; + UA_TcpMessageHeader tcpMessageHeader; + UA_StatusCode retval = + UA_TcpMessageHeader_decodeBinary(message, &offset, &tcpMessageHeader); + if(retval != UA_STATUSCODE_GOOD) + return retval; -static UA_StatusCode function_ua_namespace0_22_begin(UA_Server *server, UA_UInt16* ns) { + // Only HEL and OPN messages possible without a channel (on the server side) + switch(tcpMessageHeader.messageTypeAndChunkType & 0x00ffffffu) { + case UA_MESSAGETYPE_HEL: + retval = processHEL(server, connection, message, &offset); + break; + case UA_MESSAGETYPE_OPN: + { + UA_LOG_TRACE(&server->config.logger, UA_LOGCATEGORY_NETWORK, + "Connection %i | Process OPN message", (int)(connection->sockfd)); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "RejectedSessionCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2155), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "RejectedSessionCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2155), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2150), false); -return retVal; -} + /* Called before HEL */ + if(connection->state != UA_CONNECTION_ESTABLISHED) { + retval = UA_STATUSCODE_BADCOMMUNICATIONERROR; + break; + } -static UA_StatusCode function_ua_namespace0_22_finish(UA_Server *server, UA_UInt16* ns) { + // Decode the asymmetric algorithm security header since it is not encrypted and + // needed to decide what security policy to use. + UA_AsymmetricAlgorithmSecurityHeader asymHeader; + UA_AsymmetricAlgorithmSecurityHeader_init(&asymHeader); + size_t messageHeaderOffset = UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH; + retval = UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(message, + &messageHeaderOffset, + &asymHeader); + if(retval != UA_STATUSCODE_GOOD) + break; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2155) -); -} + retval = createSecureChannel(server, connection, &asymHeader); + UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymHeader); + if(retval != UA_STATUSCODE_GOOD) + break; -/* CumulatedSubscriptionCount - ns=0;i=2161 */ + retval = UA_SecureChannel_decryptAddChunk(connection->channel, message, false); + if(retval != UA_STATUSCODE_GOOD) + break; -static UA_StatusCode function_ua_namespace0_23_begin(UA_Server *server, UA_UInt16* ns) { + UA_SecureChannel_processCompleteMessages(connection->channel, server, + processSecureChannelMessage); + break; + } + default: + UA_LOG_TRACE(&server->config.logger, UA_LOGCATEGORY_NETWORK, + "Connection %i | Expected OPN or HEL message on a connection " + "without a SecureChannel", (int)(connection->sockfd)); + retval = UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; + break; + } + return retval; +} -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSubscriptionCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2161), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "CumulatedSubscriptionCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2161), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2150), false); -return retVal; +static UA_StatusCode +processCompleteChunk(void *const application, UA_Connection *connection, + UA_ByteString *chunk) { + UA_Server *server = (UA_Server*)application; +#ifdef UA_DEBUG_DUMP_PKGS_FILE + UA_debug_dumpCompleteChunk(server, connection, chunk); +#endif + if(!connection->channel) + return processCompleteChunkWithoutChannel(server, connection, chunk); + return UA_SecureChannel_decryptAddChunk(connection->channel, chunk, false); } -static UA_StatusCode function_ua_namespace0_23_finish(UA_Server *server, UA_UInt16* ns) { +void +UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection, + UA_ByteString *message) { + UA_LOG_TRACE(&server->config.logger, UA_LOGCATEGORY_NETWORK, + "Connection %i | Received a packet.", (int)(connection->sockfd)); +#ifdef UA_DEBUG_DUMP_PKGS + UA_dump_hex_pkg(message->data, message->length); +#endif -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2161) -); -} + UA_StatusCode retval = UA_Connection_processChunks(connection, server, + processCompleteChunk, message); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_NETWORK, + "Connection %i | Processing the message failed with " + "error %s", (int)(connection->sockfd), UA_StatusCode_name(retval)); + /* Send an ERR message and close the connection */ + UA_TcpErrorMessage error; + error.error = retval; + error.reason = UA_STRING_NULL; + UA_Connection_sendError(connection, &error); + connection->close(connection); + return; + } -/* CumulatedSessionCount - ns=0;i=2153 */ + UA_SecureChannel *channel = connection->channel; + if(!channel) + return; -static UA_StatusCode function_ua_namespace0_24_begin(UA_Server *server, UA_UInt16* ns) { + /* Process complete messages */ + UA_SecureChannel_processCompleteMessages(channel, server, processSecureChannelMessage); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSessionCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2153), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "CumulatedSessionCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2153), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2150), false); -return retVal; + /* Is the channel still open? */ + if(channel->state == UA_SECURECHANNELSTATE_CLOSED) + return; + + /* Store unused decoded chunks internally in the SecureChannel */ + UA_SecureChannel_persistIncompleteMessages(connection->channel); } -static UA_StatusCode function_ua_namespace0_24_finish(UA_Server *server, UA_UInt16* ns) { +#ifdef UA_ENABLE_MULTITHREADING +static void +deleteConnection(UA_Server *server, UA_Connection *connection) { + connection->free(connection); +} +#endif -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2153) -); +void +UA_Server_removeConnection(UA_Server *server, UA_Connection *connection) { + UA_Connection_detachSecureChannel(connection); +#ifndef UA_ENABLE_MULTITHREADING + connection->free(connection); +#else + UA_DelayedCallback *dc = (UA_DelayedCallback*)UA_malloc(sizeof(UA_DelayedCallback)); + if(!dc) + return; /* Malloc cannot fail on OS's that support multithreading. They + * rather kill the process. */ + dc->callback = (UA_ApplicationCallback)deleteConnection; + dc->application = server; + dc->data = connection; + UA_WorkQueue_enqueueDelayed(&server->workQueue, dc); +#endif } -/* CurrentSessionCount - ns=0;i=2152 */ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_server_utils.c" ***********************************/ -static UA_StatusCode function_ua_namespace0_25_begin(UA_Server *server, UA_UInt16* ns) { +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2016 (c) Lorenz Haas + * Copyright 2017 (c) frax2222 + * Copyright 2017 (c) Florian Palm + * Copyright 2017-2018 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Julian Grothoff + */ -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSessionCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2152), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "CurrentSessionCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2152), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2150), false); -return retVal; -} -static UA_StatusCode function_ua_namespace0_25_finish(UA_Server *server, UA_UInt16* ns) { +#define UA_MAX_TREE_RECURSE 50 /* How deep up/down the tree do we recurse at most? */ -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2152) -); -} +/********************************/ +/* Information Model Operations */ +/********************************/ -/* ServerViewCount - ns=0;i=2151 */ +/* Keeps track of already visited nodes to detect circular references */ +struct ref_history { + struct ref_history *parent; /* the previous element */ + const UA_NodeId *id; /* the id of the node at this depth */ + UA_UInt16 depth; +}; -static UA_StatusCode function_ua_namespace0_26_begin(UA_Server *server, UA_UInt16* ns) { +static UA_Boolean +isNodeInTreeNoCircular(void *nsCtx, const UA_NodeId *leafNode, const UA_NodeId *nodeToFind, + struct ref_history *visitedRefs, const UA_NodeId *referenceTypeIds, + size_t referenceTypeIdsSize) { + if(UA_NodeId_equal(nodeToFind, leafNode)) + return true; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "ServerViewCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2151), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerViewCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2151), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2150), false); -return retVal; -} + if(visitedRefs->depth >= UA_MAX_TREE_RECURSE) + return false; -static UA_StatusCode function_ua_namespace0_26_finish(UA_Server *server, UA_UInt16* ns) { + const UA_Node *node = UA_Nodestore_getNode(nsCtx, leafNode); + if(!node) + return false; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2151) -); -} + for(size_t i = 0; i < node->referencesSize; ++i) { + UA_NodeReferenceKind *refs = &node->references[i]; + /* Search upwards in the tree */ + if(!refs->isInverse) + continue; -/* SessionAbortCount - ns=0;i=2157 */ + /* Consider only the indicated reference types */ + UA_Boolean match = false; + for(size_t j = 0; j < referenceTypeIdsSize; ++j) { + if(UA_NodeId_equal(&refs->referenceTypeId, &referenceTypeIds[j])) { + match = true; + break; + } + } + if(!match) + continue; + + /* Match the targets or recurse */ + for(size_t j = 0; j < refs->refTargetsSize; ++j) { + /* Check if we already have seen the referenced node and skip to + * avoid endless recursion. Do this only at every 5th depth to save + * effort. Circular dependencies are rare and forbidden for most + * reference types. */ + if(visitedRefs->depth % 5 == 4) { + struct ref_history *last = visitedRefs; + UA_Boolean skip = false; + while(!skip && last) { + if(UA_NodeId_equal(last->id, &refs->refTargets[j].target.nodeId)) + skip = true; + last = last->parent; + } + if(skip) + continue; + } -static UA_StatusCode function_ua_namespace0_27_begin(UA_Server *server, UA_UInt16* ns) { + /* Stack-allocate the visitedRefs structure for the next depth */ + struct ref_history nextVisitedRefs = {visitedRefs, &refs->refTargets[j].target.nodeId, + (UA_UInt16)(visitedRefs->depth+1)}; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "SessionAbortCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2157), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "SessionAbortCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2157), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2150), false); -return retVal; -} + /* Recurse */ + UA_Boolean foundRecursive = + isNodeInTreeNoCircular(nsCtx, &refs->refTargets[j].target.nodeId, nodeToFind, + &nextVisitedRefs, referenceTypeIds, referenceTypeIdsSize); + if(foundRecursive) { + UA_Nodestore_releaseNode(nsCtx, node); + return true; + } + } + } -static UA_StatusCode function_ua_namespace0_27_finish(UA_Server *server, UA_UInt16* ns) { + UA_Nodestore_releaseNode(nsCtx, node); + return false; +} -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2157) -); +UA_Boolean +isNodeInTree(void *nsCtx, const UA_NodeId *leafNode, const UA_NodeId *nodeToFind, + const UA_NodeId *referenceTypeIds, size_t referenceTypeIdsSize) { + struct ref_history visitedRefs = {NULL, leafNode, 0}; + return isNodeInTreeNoCircular(nsCtx, leafNode, nodeToFind, &visitedRefs, + referenceTypeIds, referenceTypeIdsSize); } -/* SessionTimeoutCount - ns=0;i=2156 */ +const UA_Node * +getNodeType(UA_Server *server, const UA_Node *node) { + /* The reference to the parent is different for variable and variabletype */ + UA_NodeId parentRef; + UA_Boolean inverse; + UA_NodeClass typeNodeClass; + switch(node->nodeClass) { + case UA_NODECLASS_OBJECT: + parentRef = UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION); + inverse = false; + typeNodeClass = UA_NODECLASS_OBJECTTYPE; + break; + case UA_NODECLASS_VARIABLE: + parentRef = UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION); + inverse = false; + typeNodeClass = UA_NODECLASS_VARIABLETYPE; + break; + case UA_NODECLASS_OBJECTTYPE: + case UA_NODECLASS_VARIABLETYPE: + case UA_NODECLASS_REFERENCETYPE: + case UA_NODECLASS_DATATYPE: + parentRef = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE); + inverse = true; + typeNodeClass = node->nodeClass; + break; + default: + return NULL; + } -static UA_StatusCode function_ua_namespace0_28_begin(UA_Server *server, UA_UInt16* ns) { + /* Return the first matching candidate */ + for(size_t i = 0; i < node->referencesSize; ++i) { + if(node->references[i].isInverse != inverse) + continue; + if(!UA_NodeId_equal(&node->references[i].referenceTypeId, &parentRef)) + continue; + UA_assert(node->references[i].refTargetsSize> 0); + const UA_NodeId *targetId = &node->references[i].refTargets[0].target.nodeId; + const UA_Node *type = UA_Nodestore_getNode(server->nsCtx, targetId); + if(!type) + continue; + if(type->nodeClass == typeNodeClass) + return type; + UA_Nodestore_releaseNode(server->nsCtx, type); + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "SessionTimeoutCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2156), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "SessionTimeoutCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2156), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2150), false); -return retVal; + return NULL; } -static UA_StatusCode function_ua_namespace0_28_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2156) -); +UA_Boolean +UA_Node_hasSubTypeOrInstances(const UA_Node *node) { + const UA_NodeId hasSubType = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE); + const UA_NodeId hasTypeDefinition = UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION); + for(size_t i = 0; i < node->referencesSize; ++i) { + if(node->references[i].isInverse == false && + UA_NodeId_equal(&node->references[i].referenceTypeId, &hasSubType)) + return true; + if(node->references[i].isInverse == true && + UA_NodeId_equal(&node->references[i].referenceTypeId, &hasTypeDefinition)) + return true; + } + return false; } -/* CurrentSubscriptionCount - ns=0;i=2160 */ +static const UA_NodeId hasInterfaceNodeId = + {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASINTERFACE}}; -static UA_StatusCode function_ua_namespace0_29_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode +getParentTypeAndInterfaceHierarchy(UA_Server *server, const UA_NodeId *typeNode, + UA_NodeId **typeHierarchy, size_t *typeHierarchySize) { + UA_ExpandedNodeId *subTypes = NULL; + size_t subTypesSize = 0; + UA_StatusCode retval = browseRecursive(server, 1, typeNode, 1, &subtypeId, + UA_BROWSEDIRECTION_INVERSE, false, + &subTypesSize, &subTypes); + if(retval != UA_STATUSCODE_GOOD) + return retval; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2160), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "CurrentSubscriptionCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2160), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2150), false); -return retVal; -} - -static UA_StatusCode function_ua_namespace0_29_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2160) -); -} + UA_assert(subTypesSize < 1000); -/* BuildInfoType - ns=0;i=3051 */ + UA_ExpandedNodeId *interfaces = NULL; + size_t interfacesSize = 0; + retval = browseRecursive(server, 1, typeNode, 1, &hasInterfaceNodeId, + UA_BROWSEDIRECTION_FORWARD, false, + &interfacesSize, &interfaces); + if(retval != UA_STATUSCODE_GOOD) { + UA_Array_delete(subTypes, subTypesSize, &UA_TYPES[UA_TYPES_NODEID]); + return retval; + } -static UA_StatusCode function_ua_namespace0_30_begin(UA_Server *server, UA_UInt16* ns) { + UA_assert(interfacesSize < 1000); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default; -attr.valueRank = (UA_Int32)-2; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 24); -attr.displayName = UA_LOCALIZEDTEXT("", "BuildInfoType"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE, -UA_NODEID_NUMERIC(ns[0], 3051), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "BuildInfoType"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 3051), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 63), false); -return retVal; -} + UA_NodeId *hierarchy = (UA_NodeId*) + UA_malloc(sizeof(UA_NodeId) * (1 + subTypesSize + interfacesSize)); + if(!hierarchy) { + UA_Array_delete(subTypes, subTypesSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); + UA_Array_delete(interfaces, interfacesSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); + return UA_STATUSCODE_BADOUTOFMEMORY; + } -static UA_StatusCode function_ua_namespace0_30_finish(UA_Server *server, UA_UInt16* ns) { + retval = UA_NodeId_copy(typeNode, hierarchy); + if(retval != UA_STATUSCODE_GOOD) { + UA_free(hierarchy); + UA_Array_delete(subTypes, subTypesSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); + UA_Array_delete(interfaces, interfacesSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); + return UA_STATUSCODE_BADOUTOFMEMORY; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 3051) -); -} + for(size_t i = 0; i < subTypesSize; i++) { + hierarchy[i+1] = subTypes[i].nodeId; + UA_NodeId_init(&subTypes[i].nodeId); + } + for(size_t i = 0; i < interfacesSize; i++) { + hierarchy[i+1+subTypesSize] = interfaces[i].nodeId; + UA_NodeId_init(&interfaces[i].nodeId); + } -/* Image - ns=0;i=30 */ + *typeHierarchy = hierarchy; + *typeHierarchySize = subTypesSize + interfacesSize + 1; -static UA_StatusCode function_ua_namespace0_31_begin(UA_Server *server, UA_UInt16* ns) { + UA_assert(*typeHierarchySize < 1000); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.isAbstract = true; -attr.displayName = UA_LOCALIZEDTEXT("", "Image"); -attr.description = UA_LOCALIZEDTEXT("", "Describes a value that is an image encoded as a string of bytes."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 30), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Image"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 30), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 15), false); -return retVal; + UA_Array_delete(subTypes, subTypesSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); + UA_Array_delete(interfaces, interfacesSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_31_finish(UA_Server *server, UA_UInt16* ns) { +/* For mulithreading: make a copy of the node, edit and replace. + * For singlethreading: edit the original */ +UA_StatusCode +UA_Server_editNode(UA_Server *server, UA_Session *session, + const UA_NodeId *nodeId, UA_EditNodeCallback callback, + void *data) { +#ifndef UA_ENABLE_IMMUTABLE_NODES + /* Get the node and process it in-situ */ + const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, nodeId); + if(!node) + return UA_STATUSCODE_BADNODEIDUNKNOWN; + UA_StatusCode retval = callback(server, session, (UA_Node*)(uintptr_t)node, data); + UA_Nodestore_releaseNode(server->nsCtx, node); + return retval; +#else + UA_StatusCode retval; + do { + /* Get an editable copy of the node */ + UA_Node *node; + retval = UA_Nodestore_getNodeCopy(server->nsCtx, nodeId, &node); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + /* Run the operation on the copy */ + retval = callback(server, session, node, data); + if(retval != UA_STATUSCODE_GOOD) { + UA_Nodestore_deleteNode(server->nsCtx, node); + return retval; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 30) -); + /* Replace the node */ + retval = UA_Nodestore_replaceNode(server->nsCtx, node); + } while(retval != UA_STATUSCODE_GOOD); + return retval; +#endif } -/* Decimal - ns=0;i=50 */ +UA_StatusCode +UA_Server_processServiceOperations(UA_Server *server, UA_Session *session, + UA_ServiceOperation operationCallback, + const void *context, const size_t *requestOperations, + const UA_DataType *requestOperationsType, + size_t *responseOperations, + const UA_DataType *responseOperationsType) { + size_t ops = *requestOperations; + if(ops == 0) + return UA_STATUSCODE_BADNOTHINGTODO; -static UA_StatusCode function_ua_namespace0_32_begin(UA_Server *server, UA_UInt16* ns) { + /* No padding after size_t */ + void **respPos = (void**)((uintptr_t)responseOperations + sizeof(size_t)); + *respPos = UA_Array_new(ops, responseOperationsType); + if(!(*respPos)) + return UA_STATUSCODE_BADOUTOFMEMORY; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "Decimal"); -attr.description = UA_LOCALIZEDTEXT("", "Describes an arbitrary precision decimal value."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 50), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Decimal"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 50), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 26), false); -return retVal; + *responseOperations = ops; + uintptr_t respOp = (uintptr_t)*respPos; + /* No padding after size_t */ + uintptr_t reqOp = *(uintptr_t*)((uintptr_t)requestOperations + sizeof(size_t)); + for(size_t i = 0; i < ops; i++) { + operationCallback(server, session, context, (void*)reqOp, (void*)respOp); + reqOp += requestOperationsType->memSize; + respOp += responseOperationsType->memSize; + } + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_32_finish(UA_Server *server, UA_UInt16* ns) { +/* A few global NodeId definitions */ +const UA_NodeId subtypeId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASSUBTYPE}}; +const UA_NodeId hierarchicalReferences = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HIERARCHICALREFERENCES}}; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 50) -); -} +/*********************************/ +/* Default attribute definitions */ +/*********************************/ -/* Enumeration - ns=0;i=29 */ +const UA_ObjectAttributes UA_ObjectAttributes_default = { + 0, /* specifiedAttributes */ + {{0, NULL}, {0, NULL}}, /* displayName */ + {{0, NULL}, {0, NULL}}, /* description */ + 0, 0, /* writeMask (userWriteMask) */ + 0 /* eventNotifier */ +}; -static UA_StatusCode function_ua_namespace0_33_begin(UA_Server *server, UA_UInt16* ns) { +const UA_VariableAttributes UA_VariableAttributes_default = { + 0, /* specifiedAttributes */ + {{0, NULL}, {0, NULL}}, /* displayName */ + {{0, NULL}, {0, NULL}}, /* description */ + 0, 0, /* writeMask (userWriteMask) */ + {NULL, UA_VARIANT_DATA, + 0, NULL, 0, NULL}, /* value */ + {0, UA_NODEIDTYPE_NUMERIC, + {UA_NS0ID_BASEDATATYPE}}, /* dataType */ + UA_VALUERANK_ANY, /* valueRank */ + 0, NULL, /* arrayDimensions */ + UA_ACCESSLEVELMASK_READ, 0, /* accessLevel (userAccessLevel) */ + 0.0, /* minimumSamplingInterval */ + false /* historizing */ +}; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.isAbstract = true; -attr.displayName = UA_LOCALIZEDTEXT("", "Enumeration"); -attr.description = UA_LOCALIZEDTEXT("", "Describes a value that is an enumerated DataType."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 29), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Enumeration"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 29), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 24), false); -return retVal; -} +const UA_MethodAttributes UA_MethodAttributes_default = { + 0, /* specifiedAttributes */ + {{0, NULL}, {0, NULL}}, /* displayName */ + {{0, NULL}, {0, NULL}}, /* description */ + 0, 0, /* writeMask (userWriteMask) */ + true, true /* executable (userExecutable) */ +}; -static UA_StatusCode function_ua_namespace0_33_finish(UA_Server *server, UA_UInt16* ns) { +const UA_ObjectTypeAttributes UA_ObjectTypeAttributes_default = { + 0, /* specifiedAttributes */ + {{0, NULL}, {0, NULL}}, /* displayName */ + {{0, NULL}, {0, NULL}}, /* description */ + 0, 0, /* writeMask (userWriteMask) */ + false /* isAbstract */ +}; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 29) -); -} +const UA_VariableTypeAttributes UA_VariableTypeAttributes_default = { + 0, /* specifiedAttributes */ + {{0, NULL}, {0, NULL}}, /* displayName */ + {{0, NULL}, {0, NULL}}, /* description */ + 0, 0, /* writeMask (userWriteMask) */ + {NULL, UA_VARIANT_DATA, + 0, NULL, 0, NULL}, /* value */ + {0, UA_NODEIDTYPE_NUMERIC, + {UA_NS0ID_BASEDATATYPE}}, /* dataType */ + UA_VALUERANK_ANY, /* valueRank */ + 0, NULL, /* arrayDimensions */ + false /* isAbstract */ +}; -/* NamingRuleType - ns=0;i=120 */ +const UA_ReferenceTypeAttributes UA_ReferenceTypeAttributes_default = { + 0, /* specifiedAttributes */ + {{0, NULL}, {0, NULL}}, /* displayName */ + {{0, NULL}, {0, NULL}}, /* description */ + 0, 0, /* writeMask (userWriteMask) */ + false, /* isAbstract */ + false, /* symmetric */ + {{0, NULL}, {0, NULL}} /* inverseName */ +}; -static UA_StatusCode function_ua_namespace0_34_begin(UA_Server *server, UA_UInt16* ns) { +const UA_DataTypeAttributes UA_DataTypeAttributes_default = { + 0, /* specifiedAttributes */ + {{0, NULL}, {0, NULL}}, /* displayName */ + {{0, NULL}, {0, NULL}}, /* description */ + 0, 0, /* writeMask (userWriteMask) */ + false /* isAbstract */ +}; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "NamingRuleType"); -attr.description = UA_LOCALIZEDTEXT("", "Describes a value that specifies the significance of the BrowseName for an instance declaration."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 120), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "NamingRuleType"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 120), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 29), false); -return retVal; -} +const UA_ViewAttributes UA_ViewAttributes_default = { + 0, /* specifiedAttributes */ + {{0, NULL}, {0, NULL}}, /* displayName */ + {{0, NULL}, {0, NULL}}, /* description */ + 0, 0, /* writeMask (userWriteMask) */ + false, /* containsNoLoops */ + 0 /* eventNotifier */ +}; -static UA_StatusCode function_ua_namespace0_34_finish(UA_Server *server, UA_UInt16* ns) { -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 120) -); -} +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_server_discovery.c" ***********************************/ -/* RedundancySupport - ns=0;i=851 */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + */ -static UA_StatusCode function_ua_namespace0_35_begin(UA_Server *server, UA_UInt16* ns) { -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "RedundancySupport"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 851), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "RedundancySupport"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 851), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 29), false); -return retVal; -} -static UA_StatusCode function_ua_namespace0_35_finish(UA_Server *server, UA_UInt16* ns) { +#ifdef UA_ENABLE_DISCOVERY -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 851) -); -} +static UA_StatusCode +register_server_with_discovery_server(UA_Server *server, + UA_Client *client, + const UA_Boolean isUnregister, + const char* semaphoreFilePath) { + /* Prepare the request. Do not cleanup the request after the service call, + * as the members are stack-allocated or point into the server config. */ + UA_RegisterServer2Request request; + UA_RegisterServer2Request_init(&request); + request.requestHeader.timestamp = UA_DateTime_now(); + request.requestHeader.timeoutHint = 10000; -/* ServerState - ns=0;i=852 */ + request.server.isOnline = !isUnregister; + request.server.serverUri = server->config.applicationDescription.applicationUri; + request.server.productUri = server->config.applicationDescription.productUri; + request.server.serverType = server->config.applicationDescription.applicationType; + request.server.gatewayServerUri = server->config.applicationDescription.gatewayServerUri; -static UA_StatusCode function_ua_namespace0_36_begin(UA_Server *server, UA_UInt16* ns) { + if(semaphoreFilePath) { +#ifdef UA_ENABLE_DISCOVERY_SEMAPHORE + request.server.semaphoreFilePath = + UA_STRING((char*)(uintptr_t)semaphoreFilePath); /* dirty cast */ +#else + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_CLIENT, + "Ignoring semaphore file path. open62541 not compiled " + "with UA_ENABLE_DISCOVERY_SEMAPHORE=ON"); +#endif + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "ServerState"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 852), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerState"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 852), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 29), false); -return retVal; -} + request.server.serverNames = &server->config.applicationDescription.applicationName; + request.server.serverNamesSize = 1; -static UA_StatusCode function_ua_namespace0_36_finish(UA_Server *server, UA_UInt16* ns) { + /* Copy the discovery urls from the server config and the network layers*/ + size_t config_discurls = server->config.applicationDescription.discoveryUrlsSize; + size_t nl_discurls = server->config.networkLayersSize; + size_t total_discurls = config_discurls + nl_discurls; + UA_STACKARRAY(UA_String, urlsBuf, total_discurls); + request.server.discoveryUrls = urlsBuf; + request.server.discoveryUrlsSize = total_discurls; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 852) -); -} + for(size_t i = 0; i < config_discurls; ++i) + request.server.discoveryUrls[i] = server->config.applicationDescription.discoveryUrls[i]; -/* DiagnosticInfo - ns=0;i=25 */ + /* TODO: Add nl only if discoveryUrl not already present */ + for(size_t i = 0; i < nl_discurls; ++i) { + UA_ServerNetworkLayer *nl = &server->config.networkLayers[i]; + request.server.discoveryUrls[config_discurls + i] = nl->discoveryUrl; + } -static UA_StatusCode function_ua_namespace0_37_begin(UA_Server *server, UA_UInt16* ns) { +#ifdef UA_ENABLE_DISCOVERY_MULTICAST + request.discoveryConfigurationSize = 1; + request.discoveryConfiguration = UA_ExtensionObject_new(); + UA_ExtensionObject_init(&request.discoveryConfiguration[0]); + // Set to NODELETE so that we can just use a pointer to the mdns config + request.discoveryConfiguration[0].encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; + request.discoveryConfiguration[0].content.decoded.type = &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION]; + request.discoveryConfiguration[0].content.decoded.data = &server->config.discovery.mdns; +#endif -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "DiagnosticInfo"); -attr.description = UA_LOCALIZEDTEXT("", "Describes a value that is a structure containing diagnostics associated with a StatusCode."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 25), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "DiagnosticInfo"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 25), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 24), false); -return retVal; -} + // First try with RegisterServer2, if that isn't implemented, use RegisterServer + UA_RegisterServer2Response response; + __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST], + &response, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]); -static UA_StatusCode function_ua_namespace0_37_finish(UA_Server *server, UA_UInt16* ns) { + UA_StatusCode serviceResult = response.responseHeader.serviceResult; + UA_RegisterServer2Response_deleteMembers(&response); + UA_Array_delete(request.discoveryConfiguration, + request.discoveryConfigurationSize, + &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); + request.discoveryConfiguration = NULL; + request.discoveryConfigurationSize = 0; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 25) -); -} + if(serviceResult == UA_STATUSCODE_BADNOTIMPLEMENTED || + serviceResult == UA_STATUSCODE_BADSERVICEUNSUPPORTED) { + /* Try RegisterServer */ + UA_RegisterServerRequest request_fallback; + UA_RegisterServerRequest_init(&request_fallback); + /* Copy from RegisterServer2 request */ + request_fallback.requestHeader = request.requestHeader; + request_fallback.server = request.server; -/* DataValue - ns=0;i=23 */ + UA_RegisterServerResponse response_fallback; -static UA_StatusCode function_ua_namespace0_38_begin(UA_Server *server, UA_UInt16* ns) { + __UA_Client_Service(client, &request_fallback, + &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST], + &response_fallback, + &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "DataValue"); -attr.description = UA_LOCALIZEDTEXT("", "Describes a value that is a structure containing a value, a status code and timestamps."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 23), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "DataValue"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 23), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 24), false); -return retVal; -} + serviceResult = response_fallback.responseHeader.serviceResult; + UA_RegisterServerResponse_deleteMembers(&response_fallback); + } -static UA_StatusCode function_ua_namespace0_38_finish(UA_Server *server, UA_UInt16* ns) { + if(serviceResult != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_CLIENT, + "RegisterServer/RegisterServer2 failed with statuscode %s", + UA_StatusCode_name(serviceResult)); + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 23) -); + return serviceResult; } -/* ServerRedundancyType - ns=0;i=2034 */ - -static UA_StatusCode function_ua_namespace0_39_begin(UA_Server *server, UA_UInt16* ns) { - -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "ServerRedundancyType"); -attr.description = UA_LOCALIZEDTEXT("", "A base type for an object that describe how a server supports redundancy."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, -UA_NODEID_NUMERIC(ns[0], 2034), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerRedundancyType"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2034), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 58), false); -return retVal; +UA_StatusCode +UA_Server_register_discovery(UA_Server *server, UA_Client *client, + const char* semaphoreFilePath) { + return register_server_with_discovery_server(server, client, + false, semaphoreFilePath); } -static UA_StatusCode function_ua_namespace0_39_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2034) -); +UA_StatusCode +UA_Server_unregister_discovery(UA_Server *server, UA_Client *client) { + return register_server_with_discovery_server(server, client, + true, NULL); } -/* ServerRedundancy - ns=0;i=2296 */ +#endif /* UA_ENABLE_DISCOVERY */ -static UA_StatusCode function_ua_namespace0_40_begin(UA_Server *server, UA_UInt16* ns) { +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_securechannel_manager.c" ***********************************/ -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "ServerRedundancy"); -attr.description = UA_LOCALIZEDTEXT("", "Describes the redundancy capabilities of the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 2296), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerRedundancy"), -UA_NODEID_NUMERIC(ns[0], 2034), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2296), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2253), false); -return retVal; -} +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2014-2017 (c) Florian Palm + * Copyright 2015-2016 (c) Sten Grüner + * Copyright 2015 (c) Oleksiy Vasylyev + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB + */ -static UA_StatusCode function_ua_namespace0_40_finish(UA_Server *server, UA_UInt16* ns) { -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2296) -); -} -/* PropertyType - ns=0;i=68 */ -static UA_StatusCode function_ua_namespace0_41_begin(UA_Server *server, UA_UInt16* ns) { +#define STARTCHANNELID 1 +#define STARTTOKENID 1 -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default; -attr.valueRank = (UA_Int32)-2; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 24); -attr.displayName = UA_LOCALIZEDTEXT("", "PropertyType"); -attr.description = UA_LOCALIZEDTEXT("", "The type for variable that represents a property of another node."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE, -UA_NODEID_NUMERIC(ns[0], 68), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "PropertyType"), -UA_NODEID_NUMERIC(ns[0], 62), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 68), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 62), false); -return retVal; +UA_StatusCode +UA_SecureChannelManager_init(UA_SecureChannelManager *cm, UA_Server *server) { + TAILQ_INIT(&cm->channels); + // TODO: use an ID that is likely to be unique after a restart + cm->lastChannelId = STARTCHANNELID; + cm->lastTokenId = STARTTOKENID; + cm->currentChannelCount = 0; + cm->server = server; + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_41_finish(UA_Server *server, UA_UInt16* ns) { +void +UA_SecureChannelManager_deleteMembers(UA_SecureChannelManager *cm) { + channel_entry *entry, *temp; + TAILQ_FOREACH_SAFE(entry, &cm->channels, pointers, temp) { + TAILQ_REMOVE(&cm->channels, entry, pointers); + UA_SecureChannel_close(&entry->channel); + UA_SecureChannel_deleteMembers(&entry->channel); + UA_free(entry); + } +} -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 68) -); +static void +removeSecureChannelCallback(void *_, channel_entry *entry) { + UA_SecureChannel_deleteMembers(&entry->channel); } -/* MaxBrowseContinuationPoints - ns=0;i=2735 */ +static void +removeSecureChannel(UA_SecureChannelManager *cm, channel_entry *entry) { + /* Close the SecureChannel */ + UA_SecureChannel_close(&entry->channel); -static UA_StatusCode function_ua_namespace0_42_begin(UA_Server *server, UA_UInt16* ns) { + /* Detach the channel and make the capacity available */ + TAILQ_REMOVE(&cm->channels, entry, pointers); + UA_atomic_subUInt32(&cm->currentChannelCount, 1); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 5); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT16]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxBrowseContinuationPoints"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of continuation points for Browse operations per session."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2735), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxBrowseContinuationPoints"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2735), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2268), false); -return retVal; + /* Add a delayed callback to remove the channel when the currently + * scheduled jobs have completed */ + entry->cleanupCallback.callback = (UA_ApplicationCallback)removeSecureChannelCallback; + entry->cleanupCallback.application = NULL; + entry->cleanupCallback.data = entry; + UA_WorkQueue_enqueueDelayed(&cm->server->workQueue, &entry->cleanupCallback); } -static UA_StatusCode function_ua_namespace0_42_finish(UA_Server *server, UA_UInt16* ns) { +/* remove channels that were not renewed or who have no connection attached */ +void +UA_SecureChannelManager_cleanupTimedOut(UA_SecureChannelManager *cm, + UA_DateTime nowMonotonic) { + channel_entry *entry, *temp; + TAILQ_FOREACH_SAFE(entry, &cm->channels, pointers, temp) { + /* The channel was closed internally */ + if(entry->channel.state == UA_SECURECHANNELSTATE_CLOSED || + !entry->channel.connection) { + removeSecureChannel(cm, entry); + continue; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2735) -); + /* The channel has timed out */ + UA_DateTime timeout = + entry->channel.securityToken.createdAt + + (UA_DateTime)(entry->channel.securityToken.revisedLifetime * UA_DATETIME_MSEC); + if(timeout < nowMonotonic) { + UA_LOG_INFO_CHANNEL(&cm->server->config.logger, &entry->channel, + "SecureChannel has timed out"); + removeSecureChannel(cm, entry); + continue; + } + } } -/* MaxNodesPerBrowse - ns=0;i=11710 */ - -static UA_StatusCode function_ua_namespace0_43_begin(UA_Server *server, UA_UInt16* ns) { +/* remove the first channel that has no session attached */ +static UA_Boolean +purgeFirstChannelWithoutSession(UA_SecureChannelManager *cm) { + channel_entry *entry; + TAILQ_FOREACH(entry, &cm->channels, pointers) { + if(LIST_EMPTY(&entry->channel.sessions)) { + UA_LOG_INFO_CHANNEL(&cm->server->config.logger, &entry->channel, + "Channel was purged since maxSecureChannels was " + "reached and channel had no session attached"); + removeSecureChannel(cm, entry); + return true; + } + } + return false; +} -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerBrowse"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single Browse request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11710), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerBrowse"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11710), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11704), false); -return retVal; -} +UA_StatusCode +UA_SecureChannelManager_create(UA_SecureChannelManager *const cm, UA_Connection *const connection, + const UA_SecurityPolicy *const securityPolicy, + const UA_AsymmetricAlgorithmSecurityHeader *const asymHeader) { + /* connection already has a channel attached. */ + if(connection->channel != NULL) + return UA_STATUSCODE_BADINTERNALERROR; -static UA_StatusCode function_ua_namespace0_43_finish(UA_Server *server, UA_UInt16* ns) { + /* Check if there exists a free SC, otherwise try to purge one SC without a + * session the purge has been introduced to pass CTT, it is not clear what + * strategy is expected here */ + if(cm->currentChannelCount >= cm->server->config.maxSecureChannels && + !purgeFirstChannelWithoutSession(cm)) + return UA_STATUSCODE_BADOUTOFMEMORY; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11710) -); -} + UA_LOG_INFO(&cm->server->config.logger, UA_LOGCATEGORY_SECURECHANNEL, + "Creating a new SecureChannel"); -/* MaxNodesPerWrite - ns=0;i=11707 */ + channel_entry *entry = (channel_entry *)UA_malloc(sizeof(channel_entry)); + if(!entry) + return UA_STATUSCODE_BADOUTOFMEMORY; -static UA_StatusCode function_ua_namespace0_44_begin(UA_Server *server, UA_UInt16* ns) { + /* Create the channel context and parse the sender (remote) certificate used for the + * secureChannel. */ + UA_SecureChannel_init(&entry->channel); + UA_StatusCode retval = + UA_SecureChannel_setSecurityPolicy(&entry->channel, securityPolicy, + &asymHeader->senderCertificate); + if(retval != UA_STATUSCODE_GOOD) { + UA_free(entry); + return retval; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerWrite"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single Write request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11707), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerWrite"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11707), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11704), false); -return retVal; + /* Channel state is fresh (0) */ + entry->channel.securityToken.channelId = 0; + entry->channel.securityToken.tokenId = cm->lastTokenId++; + entry->channel.securityToken.createdAt = UA_DateTime_now(); + entry->channel.securityToken.revisedLifetime = cm->server->config.maxSecurityTokenLifetime; + + TAILQ_INSERT_TAIL(&cm->channels, entry, pointers); + UA_atomic_addUInt32(&cm->currentChannelCount, 1); + UA_Connection_attachSecureChannel(connection, &entry->channel); + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_44_finish(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode +UA_SecureChannelManager_open(UA_SecureChannelManager *cm, UA_SecureChannel *channel, + const UA_OpenSecureChannelRequest *request, + UA_OpenSecureChannelResponse *response) { + if(channel->state != UA_SECURECHANNELSTATE_FRESH) { + UA_LOG_ERROR_CHANNEL(&cm->server->config.logger, channel, + "Called open on already open or closed channel"); + return UA_STATUSCODE_BADINTERNALERROR; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11707) -); -} + if(request->securityMode != UA_MESSAGESECURITYMODE_NONE && + UA_ByteString_equal(&channel->securityPolicy->policyUri, &UA_SECURITY_POLICY_NONE_URI)) { + return UA_STATUSCODE_BADSECURITYMODEREJECTED; + } -/* Auditing - ns=0;i=2994 */ + channel->securityMode = request->securityMode; + channel->securityToken.createdAt = UA_DateTime_nowMonotonic(); + channel->securityToken.channelId = cm->lastChannelId++; + channel->securityToken.createdAt = UA_DateTime_now(); -static UA_StatusCode function_ua_namespace0_45_begin(UA_Server *server, UA_UInt16* ns) { + /* Set the lifetime. Lifetime 0 -> set the maximum possible */ + channel->securityToken.revisedLifetime = + (request->requestedLifetime > cm->server->config.maxSecurityTokenLifetime) ? + cm->server->config.maxSecurityTokenLifetime : request->requestedLifetime; + if(channel->securityToken.revisedLifetime == 0) + channel->securityToken.revisedLifetime = cm->server->config.maxSecurityTokenLifetime; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 1000.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 1); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_BOOLEAN]); -attr.displayName = UA_LOCALIZEDTEXT("", "Auditing"); -attr.description = UA_LOCALIZEDTEXT("", "A flag indicating whether the server is currently generating audit events."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2994), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Auditing"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2994), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2253), false); -return retVal; -} + /* Set the nonces and generate the keys */ + UA_StatusCode retval = UA_ByteString_copy(&request->clientNonce, &channel->remoteNonce); + if(retval != UA_STATUSCODE_GOOD) + return retval; -static UA_StatusCode function_ua_namespace0_45_finish(UA_Server *server, UA_UInt16* ns) { + retval = UA_SecureChannel_generateLocalNonce(channel); + if(retval != UA_STATUSCODE_GOOD) + return retval; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2994) -); -} + retval = UA_SecureChannel_generateNewKeys(channel); + if(retval != UA_STATUSCODE_GOOD) + return retval; -/* MaxNodesPerRead - ns=0;i=11565 */ + /* Set the response */ + retval = UA_ByteString_copy(&channel->localNonce, &response->serverNonce); + if(retval != UA_STATUSCODE_GOOD) + return retval; -static UA_StatusCode function_ua_namespace0_46_begin(UA_Server *server, UA_UInt16* ns) { + retval = UA_ChannelSecurityToken_copy(&channel->securityToken, &response->securityToken); + if(retval != UA_STATUSCODE_GOOD) + return retval; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRead"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single Read request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11565), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerRead"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11565), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11564), false); -return retVal; -} + response->responseHeader.timestamp = UA_DateTime_now(); + response->responseHeader.requestHandle = request->requestHeader.requestHandle; -static UA_StatusCode function_ua_namespace0_46_finish(UA_Server *server, UA_UInt16* ns) { + /* The channel is open */ + channel->state = UA_SECURECHANNELSTATE_OPEN; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11565) -); + return UA_STATUSCODE_GOOD; } -/* MaxNodesPerWrite - ns=0;i=11567 */ +UA_StatusCode +UA_SecureChannelManager_renew(UA_SecureChannelManager *cm, UA_SecureChannel *channel, + const UA_OpenSecureChannelRequest *request, + UA_OpenSecureChannelResponse *response) { + if(channel->state != UA_SECURECHANNELSTATE_OPEN) { + UA_LOG_ERROR_CHANNEL(&cm->server->config.logger, channel, + "Called renew on channel which is not open"); + return UA_STATUSCODE_BADINTERNALERROR; + } -static UA_StatusCode function_ua_namespace0_47_begin(UA_Server *server, UA_UInt16* ns) { + /* If no security token is already issued */ + if(channel->nextSecurityToken.tokenId == 0) { + channel->nextSecurityToken.channelId = channel->securityToken.channelId; + channel->nextSecurityToken.tokenId = cm->lastTokenId++; + channel->nextSecurityToken.createdAt = UA_DateTime_now(); + channel->nextSecurityToken.revisedLifetime = + (request->requestedLifetime > cm->server->config.maxSecurityTokenLifetime) ? + cm->server->config.maxSecurityTokenLifetime : request->requestedLifetime; + if(channel->nextSecurityToken.revisedLifetime == 0) /* lifetime 0 -> return the max lifetime */ + channel->nextSecurityToken.revisedLifetime = cm->server->config.maxSecurityTokenLifetime; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerWrite"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single Write request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11567), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerWrite"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11567), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11564), false); -return retVal; -} + /* Replace the nonces */ + UA_ByteString_deleteMembers(&channel->remoteNonce); + UA_StatusCode retval = UA_ByteString_copy(&request->clientNonce, &channel->remoteNonce); + if(retval != UA_STATUSCODE_GOOD) + return retval; -static UA_StatusCode function_ua_namespace0_47_finish(UA_Server *server, UA_UInt16* ns) { + retval = UA_SecureChannel_generateLocalNonce(channel); + if(retval != UA_STATUSCODE_GOOD) + return retval; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11567) -); -} + /* Set the response */ + response->responseHeader.requestHandle = request->requestHeader.requestHandle; + retval = UA_ByteString_copy(&channel->localNonce, &response->serverNonce); + if(retval != UA_STATUSCODE_GOOD) + return retval; -/* RedundancySupport - ns=0;i=2035 */ + retval = UA_ChannelSecurityToken_copy(&channel->nextSecurityToken, &response->securityToken); + if(retval != UA_STATUSCODE_GOOD) + return retval; -static UA_StatusCode function_ua_namespace0_48_begin(UA_Server *server, UA_UInt16* ns) { + /* Reset the internal creation date to the monotonic clock */ + channel->nextSecurityToken.createdAt = UA_DateTime_nowMonotonic(); + return UA_STATUSCODE_GOOD; +} -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 851); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT]); -attr.displayName = UA_LOCALIZEDTEXT("", "RedundancySupport"); -attr.description = UA_LOCALIZEDTEXT("", "Indicates what style of redundancy is supported by the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2035), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "RedundancySupport"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2035), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2034), false); -return retVal; +UA_SecureChannel * +UA_SecureChannelManager_get(UA_SecureChannelManager *cm, UA_UInt32 channelId) { + channel_entry *entry; + TAILQ_FOREACH(entry, &cm->channels, pointers) { + if(entry->channel.securityToken.channelId == channelId) + return &entry->channel; + } + return NULL; } -static UA_StatusCode function_ua_namespace0_48_finish(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode +UA_SecureChannelManager_close(UA_SecureChannelManager *cm, UA_UInt32 channelId) { + channel_entry *entry; + TAILQ_FOREACH(entry, &cm->channels, pointers) { + if(entry->channel.securityToken.channelId == channelId) + break; + } + if(!entry) + return UA_STATUSCODE_BADINTERNALERROR; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2035) -); + removeSecureChannel(cm, entry); + return UA_STATUSCODE_GOOD; } -/* MaxNodesPerMethodCall - ns=0;i=11569 */ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_session_manager.c" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2019 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2014, 2017 (c) Florian Palm + * Copyright 2015 (c) Sten Grüner + * Copyright 2015 (c) Oleksiy Vasylyev + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + */ -static UA_StatusCode function_ua_namespace0_49_begin(UA_Server *server, UA_UInt16* ns) { -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerMethodCall"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single Call request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11569), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerMethodCall"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11569), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11564), false); -return retVal; +UA_StatusCode +UA_SessionManager_init(UA_SessionManager *sm, UA_Server *server) { + LIST_INIT(&sm->sessions); + sm->currentSessionCount = 0; + sm->server = server; + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_49_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11569) -); +/* Delayed callback to free the session memory */ +static void +removeSessionCallback(UA_Server *server, session_list_entry *entry) { + UA_Session_deleteMembersCleanup(&entry->session, server); } -/* MaxNodesPerMethodCall - ns=0;i=11709 */ +static void +removeSession(UA_SessionManager *sm, session_list_entry *sentry) { + UA_Server *server = sm->server; + UA_Session *session = &sentry->session; -static UA_StatusCode function_ua_namespace0_50_begin(UA_Server *server, UA_UInt16* ns) { + /* Remove the Subscriptions */ +#ifdef UA_ENABLE_SUBSCRIPTIONS + UA_Subscription *sub, *tempsub; + LIST_FOREACH_SAFE(sub, &session->serverSubscriptions, listEntry, tempsub) { + UA_Session_deleteSubscription(server, session, sub->subscriptionId); + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerMethodCall"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single Call request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11709), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerMethodCall"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11709), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11704), false); -return retVal; -} + UA_PublishResponseEntry *entry; + while((entry = UA_Session_dequeuePublishReq(session))) { + UA_PublishResponse_deleteMembers(&entry->response); + UA_free(entry); + } +#endif -static UA_StatusCode function_ua_namespace0_50_finish(UA_Server *server, UA_UInt16* ns) { + /* Callback into userland access control */ + if(server->config.accessControl.closeSession) + server->config.accessControl.closeSession(server, &server->config.accessControl, + &session->sessionId, session->sessionHandle); -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11709) -); -} + /* Detach the Session from the SecureChannel */ + UA_Session_detachFromSecureChannel(session); -/* NamespaceArray - ns=0;i=2255 */ + /* Deactivate the session */ + sentry->session.activated = false; -static UA_StatusCode function_ua_namespace0_51_begin(UA_Server *server, UA_UInt16* ns) { + /* Detach the session from the session manager and make the capacity + * available */ + LIST_REMOVE(sentry, pointers); + UA_atomic_subUInt32(&sm->currentSessionCount, 1); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 1000.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = 1; -attr.arrayDimensionsSize = 1; -attr.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]); -if (!attr.arrayDimensions) return UA_STATUSCODE_BADOUTOFMEMORY; -attr.arrayDimensions[0] = 0; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); -UA_Variant_setArray(&attr.value, NULL, (UA_Int32) 0, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "NamespaceArray"); -attr.description = UA_LOCALIZEDTEXT("", "The list of namespace URIs used by the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2255), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "NamespaceArray"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_Array_delete(attr.arrayDimensions, 1, &UA_TYPES[UA_TYPES_UINT32]); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2255), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2253), false); -return retVal; + /* Add a delayed callback to remove the session when the currently + * scheduled jobs have completed */ + sentry->cleanupCallback.callback = (UA_ApplicationCallback)removeSessionCallback; + sentry->cleanupCallback.application = sm->server; + sentry->cleanupCallback.data = sentry; + UA_WorkQueue_enqueueDelayed(&server->workQueue, &sentry->cleanupCallback); } -static UA_StatusCode function_ua_namespace0_51_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2255) -); +void UA_SessionManager_deleteMembers(UA_SessionManager *sm) { + session_list_entry *current, *temp; + LIST_FOREACH_SAFE(current, &sm->sessions, pointers, temp) { + removeSession(sm, current); + } } -/* ServerArray - ns=0;i=2254 */ +void +UA_SessionManager_cleanupTimedOut(UA_SessionManager *sm, + UA_DateTime nowMonotonic) { + session_list_entry *sentry, *temp; + LIST_FOREACH_SAFE(sentry, &sm->sessions, pointers, temp) { + /* Session has timed out? */ + if(sentry->session.validTill >= nowMonotonic) + continue; + UA_LOG_INFO_SESSION(&sm->server->config.logger, &sentry->session, + "Session has timed out"); + removeSession(sm, sentry); + } +} -static UA_StatusCode function_ua_namespace0_52_begin(UA_Server *server, UA_UInt16* ns) { +UA_Session * +UA_SessionManager_getSessionByToken(UA_SessionManager *sm, const UA_NodeId *token) { + session_list_entry *current = NULL; + LIST_FOREACH(current, &sm->sessions, pointers) { + /* Token does not match */ + if(!UA_NodeId_equal(¤t->session.header.authenticationToken, token)) + continue; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 1000.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = 1; -attr.arrayDimensionsSize = 1; -attr.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]); -if (!attr.arrayDimensions) return UA_STATUSCODE_BADOUTOFMEMORY; -attr.arrayDimensions[0] = 0; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); -UA_Variant_setArray(&attr.value, NULL, (UA_Int32) 0, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "ServerArray"); -attr.description = UA_LOCALIZEDTEXT("", "The list of server URIs used by the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2254), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerArray"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_Array_delete(attr.arrayDimensions, 1, &UA_TYPES[UA_TYPES_UINT32]); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2254), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2253), false); -return retVal; -} + /* Session has timed out */ + if(UA_DateTime_nowMonotonic() > current->session.validTill) { + UA_LOG_INFO_SESSION(&sm->server->config.logger, ¤t->session, + "Client tries to use a session that has timed out"); + return NULL; + } -static UA_StatusCode function_ua_namespace0_52_finish(UA_Server *server, UA_UInt16* ns) { + /* Ok, return */ + return ¤t->session; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2254) -); + /* Session not found */ +#if UA_LOGLEVEL <= 300 + UA_String nodeIdStr = UA_STRING_NULL; + UA_NodeId_toString(token, &nodeIdStr); + UA_LOG_INFO(&sm->server->config.logger, UA_LOGCATEGORY_SESSION, + "Try to use Session with token %.*s but is not found", + (int)nodeIdStr.length, nodeIdStr.data); + UA_String_deleteMembers(&nodeIdStr); +#endif + return NULL; } -/* MinSupportedSampleRate - ns=0;i=2272 */ +UA_Session * +UA_SessionManager_getSessionById(UA_SessionManager *sm, const UA_NodeId *sessionId) { + session_list_entry *current = NULL; + LIST_FOREACH(current, &sm->sessions, pointers) { + /* Token does not match */ + if(!UA_NodeId_equal(¤t->session.sessionId, sessionId)) + continue; -static UA_StatusCode function_ua_namespace0_53_begin(UA_Server *server, UA_UInt16* ns) { + /* Session has timed out */ + if(UA_DateTime_nowMonotonic() > current->session.validTill) { + UA_LOG_INFO_SESSION(&sm->server->config.logger, ¤t->session, + "Client tries to use a session that has timed out"); + return NULL; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 290); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_DOUBLE]); -attr.displayName = UA_LOCALIZEDTEXT("", "MinSupportedSampleRate"); -attr.description = UA_LOCALIZEDTEXT("", "The minimum sampling interval supported by the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2272), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MinSupportedSampleRate"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2272), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2268), false); -return retVal; + /* Ok, return */ + return ¤t->session; + } + + /* Session not found */ + UA_String sessionIdStr = UA_STRING_NULL; + UA_NodeId_toString(sessionId, &sessionIdStr); + UA_LOG_INFO(&sm->server->config.logger, UA_LOGCATEGORY_SESSION, + "Try to use Session with identifier %.*s but is not found", + (int)sessionIdStr.length, sessionIdStr.data); + UA_String_deleteMembers(&sessionIdStr); + return NULL; } -static UA_StatusCode function_ua_namespace0_53_finish(UA_Server *server, UA_UInt16* ns) { +/* Creates and adds a session. But it is not yet attached to a secure channel. */ +UA_StatusCode +UA_SessionManager_createSession(UA_SessionManager *sm, UA_SecureChannel *channel, + const UA_CreateSessionRequest *request, UA_Session **session) { + if(sm->currentSessionCount >= sm->server->config.maxSessions) + return UA_STATUSCODE_BADTOOMANYSESSIONS; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2272) -); -} + session_list_entry *newentry = (session_list_entry *)UA_malloc(sizeof(session_list_entry)); + if(!newentry) + return UA_STATUSCODE_BADOUTOFMEMORY; -/* LocaleIdArray - ns=0;i=2271 */ + UA_atomic_addUInt32(&sm->currentSessionCount, 1); + UA_Session_init(&newentry->session); + newentry->session.sessionId = UA_NODEID_GUID(1, UA_Guid_random()); + newentry->session.header.authenticationToken = UA_NODEID_GUID(1, UA_Guid_random()); -static UA_StatusCode function_ua_namespace0_54_begin(UA_Server *server, UA_UInt16* ns) { + if(request->requestedSessionTimeout <= sm->server->config.maxSessionTimeout && + request->requestedSessionTimeout > 0) + newentry->session.timeout = request->requestedSessionTimeout; + else + newentry->session.timeout = sm->server->config.maxSessionTimeout; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = 1; -attr.arrayDimensionsSize = 1; -attr.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]); -if (!attr.arrayDimensions) return UA_STATUSCODE_BADOUTOFMEMORY; -attr.arrayDimensions[0] = 0; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 295); -UA_Variant_setArray(&attr.value, NULL, (UA_Int32) 0, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIdArray"); -attr.description = UA_LOCALIZEDTEXT("", "A list of locales supported by the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2271), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "LocaleIdArray"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_Array_delete(attr.arrayDimensions, 1, &UA_TYPES[UA_TYPES_UINT32]); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2271), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2268), false); -return retVal; + UA_Session_updateLifetime(&newentry->session); + LIST_INSERT_HEAD(&sm->sessions, newentry, pointers); + *session = &newentry->session; + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_54_finish(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode +UA_SessionManager_removeSession(UA_SessionManager *sm, const UA_NodeId *token) { + session_list_entry *current; + LIST_FOREACH(current, &sm->sessions, pointers) { + if(UA_NodeId_equal(¤t->session.header.authenticationToken, token)) + break; + } + if(!current) + return UA_STATUSCODE_BADSESSIONIDINVALID; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2271) -); + removeSession(sm, current); + return UA_STATUSCODE_GOOD; } -/* EnumValues - ns=0;i=12169 */ - -static UA_StatusCode function_ua_namespace0_55_begin(UA_Server *server, UA_UInt16* ns) { +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/pubsub/ua_pubsub_networkmessage.c" ***********************************/ -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = 1; -attr.arrayDimensionsSize = 1; -attr.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]); -if (!attr.arrayDimensions) return UA_STATUSCODE_BADOUTOFMEMORY; -attr.arrayDimensions[0] = 0; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7594); +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Tino Bischoff) + */ -struct { - UA_Int64 Value; - UA_LocalizedText DisplayName; - UA_LocalizedText Description; -} variablenode_ns_0_i_12169_EnumValueType_0_0_struct; -UA_ExtensionObject *variablenode_ns_0_i_12169_EnumValueType_0_0 = UA_ExtensionObject_new(); -if (!variablenode_ns_0_i_12169_EnumValueType_0_0) return UA_STATUSCODE_BADOUTOFMEMORY; -variablenode_ns_0_i_12169_EnumValueType_0_0_struct.Value = (UA_Int64) 1; -variablenode_ns_0_i_12169_EnumValueType_0_0_struct.DisplayName = UA_LOCALIZEDTEXT("", "Mandatory"); -variablenode_ns_0_i_12169_EnumValueType_0_0_struct.Description = UA_LOCALIZEDTEXT("", "The BrowseName must appear in all instances of the type."); -variablenode_ns_0_i_12169_EnumValueType_0_0->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING; -variablenode_ns_0_i_12169_EnumValueType_0_0->content.encoded.typeId = UA_NODEID_NUMERIC(0, 8251); -retVal |= UA_ByteString_allocBuffer(&variablenode_ns_0_i_12169_EnumValueType_0_0->content.encoded.body, 65000); -UA_Byte *posvariablenode_ns_0_i_12169_EnumValueType_0_0 = variablenode_ns_0_i_12169_EnumValueType_0_0->content.encoded.body.data; -const UA_Byte *endvariablenode_ns_0_i_12169_EnumValueType_0_0 = &variablenode_ns_0_i_12169_EnumValueType_0_0->content.encoded.body.data[65000]; -{ -retVal |= UA_encodeBinary(&variablenode_ns_0_i_12169_EnumValueType_0_0_struct.Value, &UA_TYPES[UA_TYPES_INT64], &posvariablenode_ns_0_i_12169_EnumValueType_0_0, &endvariablenode_ns_0_i_12169_EnumValueType_0_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_12169_EnumValueType_0_0_struct.DisplayName, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &posvariablenode_ns_0_i_12169_EnumValueType_0_0, &endvariablenode_ns_0_i_12169_EnumValueType_0_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_12169_EnumValueType_0_0_struct.Description, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &posvariablenode_ns_0_i_12169_EnumValueType_0_0, &endvariablenode_ns_0_i_12169_EnumValueType_0_0, NULL, NULL); -} -size_t variablenode_ns_0_i_12169_EnumValueType_0_0_encOffset = (uintptr_t)(posvariablenode_ns_0_i_12169_EnumValueType_0_0-variablenode_ns_0_i_12169_EnumValueType_0_0->content.encoded.body.data); -variablenode_ns_0_i_12169_EnumValueType_0_0->content.encoded.body.length = variablenode_ns_0_i_12169_EnumValueType_0_0_encOffset; -UA_Byte *variablenode_ns_0_i_12169_EnumValueType_0_0_newBody = (UA_Byte *) UA_malloc(variablenode_ns_0_i_12169_EnumValueType_0_0_encOffset); -if (!variablenode_ns_0_i_12169_EnumValueType_0_0_newBody) return UA_STATUSCODE_BADOUTOFMEMORY; -memcpy(variablenode_ns_0_i_12169_EnumValueType_0_0_newBody, variablenode_ns_0_i_12169_EnumValueType_0_0->content.encoded.body.data, variablenode_ns_0_i_12169_EnumValueType_0_0_encOffset); -UA_Byte *variablenode_ns_0_i_12169_EnumValueType_0_0_oldBody = variablenode_ns_0_i_12169_EnumValueType_0_0->content.encoded.body.data; -variablenode_ns_0_i_12169_EnumValueType_0_0->content.encoded.body.data = variablenode_ns_0_i_12169_EnumValueType_0_0_newBody; -UA_free(variablenode_ns_0_i_12169_EnumValueType_0_0_oldBody); - - -struct { - UA_Int64 Value; - UA_LocalizedText DisplayName; - UA_LocalizedText Description; -} variablenode_ns_0_i_12169_EnumValueType_1_0_struct; -UA_ExtensionObject *variablenode_ns_0_i_12169_EnumValueType_1_0 = UA_ExtensionObject_new(); -if (!variablenode_ns_0_i_12169_EnumValueType_1_0) return UA_STATUSCODE_BADOUTOFMEMORY; -variablenode_ns_0_i_12169_EnumValueType_1_0_struct.Value = (UA_Int64) 2; -variablenode_ns_0_i_12169_EnumValueType_1_0_struct.DisplayName = UA_LOCALIZEDTEXT("", "Optional"); -variablenode_ns_0_i_12169_EnumValueType_1_0_struct.Description = UA_LOCALIZEDTEXT("", "The BrowseName may appear in an instance of the type."); -variablenode_ns_0_i_12169_EnumValueType_1_0->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING; -variablenode_ns_0_i_12169_EnumValueType_1_0->content.encoded.typeId = UA_NODEID_NUMERIC(0, 8251); -retVal |= UA_ByteString_allocBuffer(&variablenode_ns_0_i_12169_EnumValueType_1_0->content.encoded.body, 65000); -UA_Byte *posvariablenode_ns_0_i_12169_EnumValueType_1_0 = variablenode_ns_0_i_12169_EnumValueType_1_0->content.encoded.body.data; -const UA_Byte *endvariablenode_ns_0_i_12169_EnumValueType_1_0 = &variablenode_ns_0_i_12169_EnumValueType_1_0->content.encoded.body.data[65000]; -{ -retVal |= UA_encodeBinary(&variablenode_ns_0_i_12169_EnumValueType_1_0_struct.Value, &UA_TYPES[UA_TYPES_INT64], &posvariablenode_ns_0_i_12169_EnumValueType_1_0, &endvariablenode_ns_0_i_12169_EnumValueType_1_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_12169_EnumValueType_1_0_struct.DisplayName, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &posvariablenode_ns_0_i_12169_EnumValueType_1_0, &endvariablenode_ns_0_i_12169_EnumValueType_1_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_12169_EnumValueType_1_0_struct.Description, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &posvariablenode_ns_0_i_12169_EnumValueType_1_0, &endvariablenode_ns_0_i_12169_EnumValueType_1_0, NULL, NULL); -} -size_t variablenode_ns_0_i_12169_EnumValueType_1_0_encOffset = (uintptr_t)(posvariablenode_ns_0_i_12169_EnumValueType_1_0-variablenode_ns_0_i_12169_EnumValueType_1_0->content.encoded.body.data); -variablenode_ns_0_i_12169_EnumValueType_1_0->content.encoded.body.length = variablenode_ns_0_i_12169_EnumValueType_1_0_encOffset; -UA_Byte *variablenode_ns_0_i_12169_EnumValueType_1_0_newBody = (UA_Byte *) UA_malloc(variablenode_ns_0_i_12169_EnumValueType_1_0_encOffset); -if (!variablenode_ns_0_i_12169_EnumValueType_1_0_newBody) return UA_STATUSCODE_BADOUTOFMEMORY; -memcpy(variablenode_ns_0_i_12169_EnumValueType_1_0_newBody, variablenode_ns_0_i_12169_EnumValueType_1_0->content.encoded.body.data, variablenode_ns_0_i_12169_EnumValueType_1_0_encOffset); -UA_Byte *variablenode_ns_0_i_12169_EnumValueType_1_0_oldBody = variablenode_ns_0_i_12169_EnumValueType_1_0->content.encoded.body.data; -variablenode_ns_0_i_12169_EnumValueType_1_0->content.encoded.body.data = variablenode_ns_0_i_12169_EnumValueType_1_0_newBody; -UA_free(variablenode_ns_0_i_12169_EnumValueType_1_0_oldBody); - - -struct { - UA_Int64 Value; - UA_LocalizedText DisplayName; - UA_LocalizedText Description; -} variablenode_ns_0_i_12169_EnumValueType_2_0_struct; -UA_ExtensionObject *variablenode_ns_0_i_12169_EnumValueType_2_0 = UA_ExtensionObject_new(); -if (!variablenode_ns_0_i_12169_EnumValueType_2_0) return UA_STATUSCODE_BADOUTOFMEMORY; -variablenode_ns_0_i_12169_EnumValueType_2_0_struct.Value = (UA_Int64) 3; -variablenode_ns_0_i_12169_EnumValueType_2_0_struct.DisplayName = UA_LOCALIZEDTEXT("", "Constraint"); -variablenode_ns_0_i_12169_EnumValueType_2_0_struct.Description = UA_LOCALIZEDTEXT("", "The modelling rule defines a constraint and the BrowseName is not used in an instance of the type."); -variablenode_ns_0_i_12169_EnumValueType_2_0->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING; -variablenode_ns_0_i_12169_EnumValueType_2_0->content.encoded.typeId = UA_NODEID_NUMERIC(0, 8251); -retVal |= UA_ByteString_allocBuffer(&variablenode_ns_0_i_12169_EnumValueType_2_0->content.encoded.body, 65000); -UA_Byte *posvariablenode_ns_0_i_12169_EnumValueType_2_0 = variablenode_ns_0_i_12169_EnumValueType_2_0->content.encoded.body.data; -const UA_Byte *endvariablenode_ns_0_i_12169_EnumValueType_2_0 = &variablenode_ns_0_i_12169_EnumValueType_2_0->content.encoded.body.data[65000]; -{ -retVal |= UA_encodeBinary(&variablenode_ns_0_i_12169_EnumValueType_2_0_struct.Value, &UA_TYPES[UA_TYPES_INT64], &posvariablenode_ns_0_i_12169_EnumValueType_2_0, &endvariablenode_ns_0_i_12169_EnumValueType_2_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_12169_EnumValueType_2_0_struct.DisplayName, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &posvariablenode_ns_0_i_12169_EnumValueType_2_0, &endvariablenode_ns_0_i_12169_EnumValueType_2_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_12169_EnumValueType_2_0_struct.Description, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &posvariablenode_ns_0_i_12169_EnumValueType_2_0, &endvariablenode_ns_0_i_12169_EnumValueType_2_0, NULL, NULL); -} -size_t variablenode_ns_0_i_12169_EnumValueType_2_0_encOffset = (uintptr_t)(posvariablenode_ns_0_i_12169_EnumValueType_2_0-variablenode_ns_0_i_12169_EnumValueType_2_0->content.encoded.body.data); -variablenode_ns_0_i_12169_EnumValueType_2_0->content.encoded.body.length = variablenode_ns_0_i_12169_EnumValueType_2_0_encOffset; -UA_Byte *variablenode_ns_0_i_12169_EnumValueType_2_0_newBody = (UA_Byte *) UA_malloc(variablenode_ns_0_i_12169_EnumValueType_2_0_encOffset); -if (!variablenode_ns_0_i_12169_EnumValueType_2_0_newBody) return UA_STATUSCODE_BADOUTOFMEMORY; -memcpy(variablenode_ns_0_i_12169_EnumValueType_2_0_newBody, variablenode_ns_0_i_12169_EnumValueType_2_0->content.encoded.body.data, variablenode_ns_0_i_12169_EnumValueType_2_0_encOffset); -UA_Byte *variablenode_ns_0_i_12169_EnumValueType_2_0_oldBody = variablenode_ns_0_i_12169_EnumValueType_2_0->content.encoded.body.data; -variablenode_ns_0_i_12169_EnumValueType_2_0->content.encoded.body.data = variablenode_ns_0_i_12169_EnumValueType_2_0_newBody; -UA_free(variablenode_ns_0_i_12169_EnumValueType_2_0_oldBody); - -UA_ExtensionObject variablenode_ns_0_i_12169_variant_DataContents[3]; -variablenode_ns_0_i_12169_variant_DataContents[0] = *variablenode_ns_0_i_12169_EnumValueType_0_0; -variablenode_ns_0_i_12169_variant_DataContents[1] = *variablenode_ns_0_i_12169_EnumValueType_1_0; -variablenode_ns_0_i_12169_variant_DataContents[2] = *variablenode_ns_0_i_12169_EnumValueType_2_0; -UA_Variant_setArray(&attr.value, &variablenode_ns_0_i_12169_variant_DataContents, (UA_Int32) 3, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); -attr.displayName = UA_LOCALIZEDTEXT("", "EnumValues"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 12169), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "EnumValues"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_Array_delete(attr.arrayDimensions, 1, &UA_TYPES[UA_TYPES_UINT32]); -UA_ExtensionObject_delete(variablenode_ns_0_i_12169_EnumValueType_0_0); +#ifdef UA_ENABLE_PUBSUB /* conditional compilation */ + + +const UA_Byte NM_VERSION_MASK = 15; +const UA_Byte NM_PUBLISHER_ID_ENABLED_MASK = 16; +const UA_Byte NM_GROUP_HEADER_ENABLED_MASK = 32; +const UA_Byte NM_PAYLOAD_HEADER_ENABLED_MASK = 64; +const UA_Byte NM_EXTENDEDFLAGS1_ENABLED_MASK = 128; +const UA_Byte NM_PUBLISHER_ID_MASK = 7; +const UA_Byte NM_DATASET_CLASSID_ENABLED_MASK = 8; +const UA_Byte NM_SECURITY_ENABLED_MASK = 16; +const UA_Byte NM_TIMESTAMP_ENABLED_MASK = 32; +const UA_Byte NM_PICOSECONDS_ENABLED_MASK = 64; +const UA_Byte NM_EXTENDEDFLAGS2_ENABLED_MASK = 128; +const UA_Byte NM_NETWORK_MSG_TYPE_MASK = 28; +const UA_Byte NM_CHUNK_MESSAGE_MASK = 1; +const UA_Byte NM_PROMOTEDFIELDS_ENABLED_MASK = 2; +const UA_Byte GROUP_HEADER_WRITER_GROUPID_ENABLED = 1; +const UA_Byte GROUP_HEADER_GROUP_VERSION_ENABLED = 2; +const UA_Byte GROUP_HEADER_NM_NUMBER_ENABLED = 4; +const UA_Byte GROUP_HEADER_SEQUENCE_NUMBER_ENABLED = 8; +const UA_Byte SECURITY_HEADER_NM_SIGNED = 1; +const UA_Byte SECURITY_HEADER_NM_ENCRYPTED = 2; +const UA_Byte SECURITY_HEADER_SEC_FOOTER_ENABLED = 4; +const UA_Byte SECURITY_HEADER_FORCE_KEY_RESET = 8; +const UA_Byte DS_MESSAGEHEADER_DS_MSG_VALID = 1; +const UA_Byte DS_MESSAGEHEADER_FIELD_ENCODING_MASK = 6; +const UA_Byte DS_MESSAGEHEADER_SEQ_NR_ENABLED_MASK = 8; +const UA_Byte DS_MESSAGEHEADER_STATUS_ENABLED_MASK = 16; +const UA_Byte DS_MESSAGEHEADER_CONFIGMAJORVERSION_ENABLED_MASK = 32; +const UA_Byte DS_MESSAGEHEADER_CONFIGMINORVERSION_ENABLED_MASK = 64; +const UA_Byte DS_MESSAGEHEADER_FLAGS2_ENABLED_MASK = 128; +const UA_Byte DS_MESSAGEHEADER_DS_MESSAGE_TYPE_MASK = 15; +const UA_Byte DS_MESSAGEHEADER_TIMESTAMP_ENABLED_MASK = 16; +const UA_Byte DS_MESSAGEHEADER_PICOSECONDS_INCLUDED_MASK = 32; +const UA_Byte NM_SHIFT_LEN = 2; +const UA_Byte DS_MH_SHIFT_LEN = 1; + +static UA_Boolean UA_NetworkMessage_ExtendedFlags1Enabled(const UA_NetworkMessage* src); +static UA_Boolean UA_NetworkMessage_ExtendedFlags2Enabled(const UA_NetworkMessage* src); +static UA_Boolean UA_DataSetMessageHeader_DataSetFlags2Enabled(const UA_DataSetMessageHeader* src); -UA_ExtensionObject_delete(variablenode_ns_0_i_12169_EnumValueType_1_0); +UA_StatusCode +UA_NetworkMessage_encodeBinary(const UA_NetworkMessage* src, UA_Byte **bufPos, + const UA_Byte *bufEnd) { + /* UADPVersion + UADP Flags */ + UA_Byte v = src->version; + if(src->publisherIdEnabled) + v |= NM_PUBLISHER_ID_ENABLED_MASK; -UA_ExtensionObject_delete(variablenode_ns_0_i_12169_EnumValueType_2_0); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 12169), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 120), false); -return retVal; -} + if(src->groupHeaderEnabled) + v |= NM_GROUP_HEADER_ENABLED_MASK; -static UA_StatusCode function_ua_namespace0_55_finish(UA_Server *server, UA_UInt16* ns) { + if(src->payloadHeaderEnabled) + v |= NM_PAYLOAD_HEADER_ENABLED_MASK; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 12169) -); -} + if(UA_NetworkMessage_ExtendedFlags1Enabled(src)) + v |= NM_EXTENDEDFLAGS1_ENABLED_MASK; -/* MaxNodesPerTranslateBrowsePathsToNodeIds - ns=0;i=11712 */ + UA_StatusCode rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; -static UA_StatusCode function_ua_namespace0_56_begin(UA_Server *server, UA_UInt16* ns) { + // ExtendedFlags1 + if(UA_NetworkMessage_ExtendedFlags1Enabled(src)) { + v = (UA_Byte)src->publisherIdType; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerTranslateBrowsePathsToNodeIds"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single TranslateBrowsePathsToNodeIds request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11712), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerTranslateBrowsePathsToNodeIds"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11712), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11704), false); -return retVal; -} + if(src->dataSetClassIdEnabled) + v |= NM_DATASET_CLASSID_ENABLED_MASK; -static UA_StatusCode function_ua_namespace0_56_finish(UA_Server *server, UA_UInt16* ns) { + if(src->securityEnabled) + v |= NM_SECURITY_ENABLED_MASK; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11712) -); -} + if(src->timestampEnabled) + v |= NM_TIMESTAMP_ENABLED_MASK; -/* MaxMonitoredItemsPerCall - ns=0;i=11574 */ + if(src->picosecondsEnabled) + v |= NM_PICOSECONDS_ENABLED_MASK; -static UA_StatusCode function_ua_namespace0_57_begin(UA_Server *server, UA_UInt16* ns) { + if(UA_NetworkMessage_ExtendedFlags2Enabled(src)) + v |= NM_EXTENDEDFLAGS2_ENABLED_MASK; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxMonitoredItemsPerCall"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single MonitoredItem related request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11574), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxMonitoredItemsPerCall"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11574), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11564), false); -return retVal; -} + rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; -static UA_StatusCode function_ua_namespace0_57_finish(UA_Server *server, UA_UInt16* ns) { + // ExtendedFlags2 + if(UA_NetworkMessage_ExtendedFlags2Enabled(src)) { + v = (UA_Byte)src->networkMessageType; + // shift left 2 bit + v = (UA_Byte) (v << NM_SHIFT_LEN); -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11574) -); -} + if(src->chunkMessage) + v |= NM_CHUNK_MESSAGE_MASK; -/* MaxNodesPerNodeManagement - ns=0;i=11573 */ + if(src->promotedFieldsEnabled) + v |= NM_PROMOTEDFIELDS_ENABLED_MASK; -static UA_StatusCode function_ua_namespace0_58_begin(UA_Server *server, UA_UInt16* ns) { + rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerNodeManagement"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single AddNodes, AddReferences, DeleteNodes or DeleteReferences request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11573), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerNodeManagement"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11573), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11564), false); -return retVal; -} + // PublisherId + if(src->publisherIdEnabled) { + switch (src->publisherIdType) { + case UA_PUBLISHERDATATYPE_BYTE: + rv = UA_Byte_encodeBinary(&(src->publisherId.publisherIdByte), bufPos, bufEnd); + break; -static UA_StatusCode function_ua_namespace0_58_finish(UA_Server *server, UA_UInt16* ns) { + case UA_PUBLISHERDATATYPE_UINT16: + rv = UA_UInt16_encodeBinary(&(src->publisherId.publisherIdUInt16), bufPos, bufEnd); + break; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11573) -); -} + case UA_PUBLISHERDATATYPE_UINT32: + rv = UA_UInt32_encodeBinary(&(src->publisherId.publisherIdUInt32), bufPos, bufEnd); + break; -/* MaxNodesPerTranslateBrowsePathsToNodeIds - ns=0;i=11572 */ + case UA_PUBLISHERDATATYPE_UINT64: + rv = UA_UInt64_encodeBinary(&(src->publisherId.publisherIdUInt64), bufPos, bufEnd); + break; -static UA_StatusCode function_ua_namespace0_59_begin(UA_Server *server, UA_UInt16* ns) { + case UA_PUBLISHERDATATYPE_STRING: + rv = UA_String_encodeBinary(&(src->publisherId.publisherIdString), bufPos, bufEnd); + break; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerTranslateBrowsePathsToNodeIds"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single TranslateBrowsePathsToNodeIds request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11572), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerTranslateBrowsePathsToNodeIds"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11572), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11564), false); -return retVal; -} + default: + rv = UA_STATUSCODE_BADINTERNALERROR; + break; + } + + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -static UA_StatusCode function_ua_namespace0_59_finish(UA_Server *server, UA_UInt16* ns) { + // DataSetClassId + if(src->dataSetClassIdEnabled) { + rv = UA_Guid_encodeBinary(&(src->dataSetClassId), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11572) -); -} + // Group Header + if(src->groupHeaderEnabled) { + v = 0; -/* MaxNodesPerRegisterNodes - ns=0;i=11571 */ + if(src->groupHeader.writerGroupIdEnabled) + v |= GROUP_HEADER_WRITER_GROUPID_ENABLED; -static UA_StatusCode function_ua_namespace0_60_begin(UA_Server *server, UA_UInt16* ns) { + if(src->groupHeader.groupVersionEnabled) + v |= GROUP_HEADER_GROUP_VERSION_ENABLED; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRegisterNodes"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single RegisterNodes request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11571), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerRegisterNodes"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11571), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11564), false); -return retVal; -} + if(src->groupHeader.networkMessageNumberEnabled) + v |= GROUP_HEADER_NM_NUMBER_ENABLED; -static UA_StatusCode function_ua_namespace0_60_finish(UA_Server *server, UA_UInt16* ns) { + if(src->groupHeader.sequenceNumberEnabled) + v |= GROUP_HEADER_SEQUENCE_NUMBER_ENABLED; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11571) -); -} + rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; -/* MaxNodesPerBrowse - ns=0;i=11570 */ + if(src->groupHeader.writerGroupIdEnabled) { + rv = UA_UInt16_encodeBinary(&(src->groupHeader.writerGroupId), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -static UA_StatusCode function_ua_namespace0_61_begin(UA_Server *server, UA_UInt16* ns) { + if(src->groupHeader.groupVersionEnabled) { + rv = UA_UInt32_encodeBinary(&(src->groupHeader.groupVersion), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerBrowse"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single Browse request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11570), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerBrowse"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11570), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11564), false); -return retVal; -} + if(src->groupHeader.networkMessageNumberEnabled) { + rv = UA_UInt16_encodeBinary(&(src->groupHeader.networkMessageNumber), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -static UA_StatusCode function_ua_namespace0_61_finish(UA_Server *server, UA_UInt16* ns) { + if(src->groupHeader.sequenceNumberEnabled) { + rv = UA_UInt16_encodeBinary(&(src->groupHeader.sequenceNumber), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11570) -); -} + // Payload-Header + if(src->payloadHeaderEnabled) { + if(src->networkMessageType != UA_NETWORKMESSAGE_DATASET) + return UA_STATUSCODE_BADNOTIMPLEMENTED; + + rv = UA_Byte_encodeBinary(&(src->payloadHeader.dataSetPayloadHeader.count), bufPos, bufEnd); -/* MaxNodesPerRead - ns=0;i=11705 */ + if(src->payloadHeader.dataSetPayloadHeader.dataSetWriterIds == NULL) + return UA_STATUSCODE_BADENCODINGERROR; + + for(UA_Byte i = 0; i < src->payloadHeader.dataSetPayloadHeader.count; i++) { + rv = UA_UInt16_encodeBinary(&(src->payloadHeader.dataSetPayloadHeader.dataSetWriterIds[i]), + bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } -static UA_StatusCode function_ua_namespace0_62_begin(UA_Server *server, UA_UInt16* ns) { + // Timestamp + if(src->timestampEnabled) + rv = UA_DateTime_encodeBinary(&(src->timestamp), bufPos, bufEnd); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRead"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single Read request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11705), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerRead"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11705), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11704), false); -return retVal; -} + // Picoseconds + if(src->picosecondsEnabled) + rv = UA_UInt16_encodeBinary(&(src->picoseconds), bufPos, bufEnd); -static UA_StatusCode function_ua_namespace0_62_finish(UA_Server *server, UA_UInt16* ns) { + // PromotedFields + if(src->promotedFieldsEnabled) { + /* Size (calculate & encode) */ + UA_UInt16 pfSize = 0; + for(UA_UInt16 i = 0; i < src->promotedFieldsSize; i++) + pfSize = (UA_UInt16) (pfSize + UA_Variant_calcSizeBinary(&src->promotedFields[i])); + rv |= UA_UInt16_encodeBinary(&pfSize, bufPos, bufEnd); -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11705) -); -} + for (UA_UInt16 i = 0; i < src->promotedFieldsSize; i++) + rv |= UA_Variant_encodeBinary(&(src->promotedFields[i]), bufPos, bufEnd); + } -/* EnumStrings - ns=0;i=7611 */ + // SecurityHeader + if(src->securityEnabled) { + // SecurityFlags + v = 0; + if(src->securityHeader.networkMessageSigned) + v |= SECURITY_HEADER_NM_SIGNED; -static UA_StatusCode function_ua_namespace0_63_begin(UA_Server *server, UA_UInt16* ns) { + if(src->securityHeader.networkMessageEncrypted) + v |= SECURITY_HEADER_NM_ENCRYPTED; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = 1; -attr.arrayDimensionsSize = 1; -attr.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]); -if (!attr.arrayDimensions) return UA_STATUSCODE_BADOUTOFMEMORY; -attr.arrayDimensions[0] = 0; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 21); -UA_LocalizedText variablenode_ns_0_i_7611_variant_DataContents[6]; -variablenode_ns_0_i_7611_variant_DataContents[0] = UA_LOCALIZEDTEXT("", "None"); -variablenode_ns_0_i_7611_variant_DataContents[1] = UA_LOCALIZEDTEXT("", "Cold"); -variablenode_ns_0_i_7611_variant_DataContents[2] = UA_LOCALIZEDTEXT("", "Warm"); -variablenode_ns_0_i_7611_variant_DataContents[3] = UA_LOCALIZEDTEXT("", "Hot"); -variablenode_ns_0_i_7611_variant_DataContents[4] = UA_LOCALIZEDTEXT("", "Transparent"); -variablenode_ns_0_i_7611_variant_DataContents[5] = UA_LOCALIZEDTEXT("", "HotAndMirrored"); -UA_Variant_setArray(&attr.value, &variablenode_ns_0_i_7611_variant_DataContents, (UA_Int32) 6, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); -attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 7611), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "EnumStrings"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_Array_delete(attr.arrayDimensions, 1, &UA_TYPES[UA_TYPES_UINT32]); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 7611), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 851), false); -return retVal; -} + if(src->securityHeader.securityFooterEnabled) + v |= SECURITY_HEADER_SEC_FOOTER_ENABLED; -static UA_StatusCode function_ua_namespace0_63_finish(UA_Server *server, UA_UInt16* ns) { + if(src->securityHeader.forceKeyReset) + v |= SECURITY_HEADER_FORCE_KEY_RESET; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 7611) -); -} + rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; -/* ServerProfileArray - ns=0;i=2269 */ + // SecurityTokenId + rv = UA_UInt32_encodeBinary(&src->securityHeader.securityTokenId, bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; -static UA_StatusCode function_ua_namespace0_64_begin(UA_Server *server, UA_UInt16* ns) { + // NonceLength + rv = UA_Byte_encodeBinary(&src->securityHeader.nonceLength, bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = 1; -attr.arrayDimensionsSize = 1; -attr.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]); -if (!attr.arrayDimensions) return UA_STATUSCODE_BADOUTOFMEMORY; -attr.arrayDimensions[0] = 0; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); -UA_Variant_setArray(&attr.value, NULL, (UA_Int32) 0, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "ServerProfileArray"); -attr.description = UA_LOCALIZEDTEXT("", "A list of profiles supported by the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2269), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerProfileArray"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_Array_delete(attr.arrayDimensions, 1, &UA_TYPES[UA_TYPES_UINT32]); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2269), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2268), false); -return retVal; -} + // MessageNonce + for (UA_Byte i = 0; i < src->securityHeader.nonceLength; i++) { + rv = UA_Byte_encodeBinary(&(src->securityHeader.messageNonce.data[i]), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -static UA_StatusCode function_ua_namespace0_64_finish(UA_Server *server, UA_UInt16* ns) { + // SecurityFooterSize + if(src->securityHeader.securityFooterEnabled) { + rv = UA_UInt16_encodeBinary(&src->securityHeader.securityFooterSize, bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2269) -); -} + // Payload + if(src->networkMessageType != UA_NETWORKMESSAGE_DATASET) + return UA_STATUSCODE_BADNOTIMPLEMENTED; + + UA_Byte count = 1; + + if(src->payloadHeaderEnabled) { + count = src->payloadHeader.dataSetPayloadHeader.count; + if(count > 1) { + for (UA_Byte i = 0; i < count; i++) { + // initially calculate the size, if not specified + UA_UInt16 sz = 0; + if((src->payload.dataSetPayload.sizes != NULL) && + (src->payload.dataSetPayload.sizes[i] != 0)) { + sz = src->payload.dataSetPayload.sizes[i]; + } else { + sz = (UA_UInt16)UA_DataSetMessage_calcSizeBinary(&src->payload.dataSetPayload.dataSetMessages[i]); + } -/* MaxQueryContinuationPoints - ns=0;i=2736 */ + rv = UA_UInt16_encodeBinary(&sz, bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } + } -static UA_StatusCode function_ua_namespace0_65_begin(UA_Server *server, UA_UInt16* ns) { + for(UA_Byte i = 0; i < count; i++) { + rv = UA_DataSetMessage_encodeBinary(&(src->payload.dataSetPayload.dataSetMessages[i]), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 5); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT16]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxQueryContinuationPoints"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of continuation points for Query operations per session."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2736), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxQueryContinuationPoints"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2736), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2268), false); -return retVal; -} + if(src->securityEnabled) { + // SecurityFooter + if(src->securityHeader.securityFooterEnabled) { + for(UA_Byte i = 0; i < src->securityHeader.securityFooterSize; i++) { + rv = UA_Byte_encodeBinary(&(src->securityFooter.data[i]), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } -static UA_StatusCode function_ua_namespace0_65_finish(UA_Server *server, UA_UInt16* ns) { + // Signature + if(src->securityHeader.networkMessageSigned) { + rv = UA_ByteString_encodeBinary(&(src->signature), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2736) -); + return UA_STATUSCODE_GOOD; } -/* MaxHistoryContinuationPoints - ns=0;i=2737 */ +static UA_StatusCode +UA_NetworkMessage_decodeBinaryInternal(const UA_ByteString *src, size_t *offset, + UA_NetworkMessage* dst) { + memset(dst, 0, sizeof(UA_NetworkMessage)); + UA_Byte v = 0; + UA_StatusCode rv = UA_Byte_decodeBinary(src, offset, &v); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + dst->version = v & NM_VERSION_MASK; + + if((v & NM_PUBLISHER_ID_ENABLED_MASK) != 0) + dst->publisherIdEnabled = true; -static UA_StatusCode function_ua_namespace0_66_begin(UA_Server *server, UA_UInt16* ns) { + if((v & NM_GROUP_HEADER_ENABLED_MASK) != 0) + dst->groupHeaderEnabled = true; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 5); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT16]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxHistoryContinuationPoints"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of continuation points for ReadHistory operations per session."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2737), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxHistoryContinuationPoints"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2737), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2268), false); -return retVal; -} + if((v & NM_PAYLOAD_HEADER_ENABLED_MASK) != 0) + dst->payloadHeaderEnabled = true; + + if((v & NM_EXTENDEDFLAGS1_ENABLED_MASK) != 0) { + v = 0; + rv = UA_Byte_decodeBinary(src, offset, &v); + if(rv != UA_STATUSCODE_GOOD) + return rv; -static UA_StatusCode function_ua_namespace0_66_finish(UA_Server *server, UA_UInt16* ns) { + dst->publisherIdType = (UA_PublisherIdDatatype)(v & NM_PUBLISHER_ID_MASK); + if((v & NM_DATASET_CLASSID_ENABLED_MASK) != 0) + dst->dataSetClassIdEnabled = true; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2737) -); -} + if((v & NM_SECURITY_ENABLED_MASK) != 0) + dst->securityEnabled = true; -/* MaxNodesPerRegisterNodes - ns=0;i=11711 */ + if((v & NM_TIMESTAMP_ENABLED_MASK) != 0) + dst->timestampEnabled = true; -static UA_StatusCode function_ua_namespace0_67_begin(UA_Server *server, UA_UInt16* ns) { + if((v & NM_PICOSECONDS_ENABLED_MASK) != 0) + dst->picosecondsEnabled = true; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRegisterNodes"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single RegisterNodes request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11711), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerRegisterNodes"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11711), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11704), false); -return retVal; -} + if((v & NM_EXTENDEDFLAGS2_ENABLED_MASK) != 0) { + v = 0; + rv = UA_Byte_decodeBinary(src, offset, &v); + if(rv != UA_STATUSCODE_GOOD) + return rv; -static UA_StatusCode function_ua_namespace0_67_finish(UA_Server *server, UA_UInt16* ns) { + if((v & NM_CHUNK_MESSAGE_MASK) != 0) + dst->chunkMessage = true; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11711) -); -} + if((v & NM_PROMOTEDFIELDS_ENABLED_MASK) != 0) + dst->promotedFieldsEnabled = true; -/* ServiceLevel - ns=0;i=2267 */ + v = v & NM_NETWORK_MSG_TYPE_MASK; + v = (UA_Byte) (v >> NM_SHIFT_LEN); + dst->networkMessageType = (UA_NetworkMessageType)v; + } + } -static UA_StatusCode function_ua_namespace0_68_begin(UA_Server *server, UA_UInt16* ns) { + if(dst->publisherIdEnabled) { + switch (dst->publisherIdType) { + case UA_PUBLISHERDATATYPE_BYTE: + rv = UA_Byte_decodeBinary(src, offset, &(dst->publisherId.publisherIdByte)); + break; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 1000.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 3); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_BYTE]); -attr.displayName = UA_LOCALIZEDTEXT("", "ServiceLevel"); -attr.description = UA_LOCALIZEDTEXT("", "A value indicating the level of service the server can provide. 255 indicates the best."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2267), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServiceLevel"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2267), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2253), false); -return retVal; -} + case UA_PUBLISHERDATATYPE_UINT16: + rv = UA_UInt16_decodeBinary(src, offset, &(dst->publisherId.publisherIdUInt16)); + break; -static UA_StatusCode function_ua_namespace0_68_finish(UA_Server *server, UA_UInt16* ns) { + case UA_PUBLISHERDATATYPE_UINT32: + rv = UA_UInt32_decodeBinary(src, offset, &(dst->publisherId.publisherIdUInt32)); + break; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2267) -); -} + case UA_PUBLISHERDATATYPE_UINT64: + rv = UA_UInt64_decodeBinary(src, offset, &(dst->publisherId.publisherIdUInt64)); + break; -/* RedundancySupport - ns=0;i=3709 */ + case UA_PUBLISHERDATATYPE_STRING: + rv = UA_String_decodeBinary(src, offset, &(dst->publisherId.publisherIdString)); + break; -static UA_StatusCode function_ua_namespace0_69_begin(UA_Server *server, UA_UInt16* ns) { + default: + rv = UA_STATUSCODE_BADINTERNALERROR; + break; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 851); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT]); -attr.displayName = UA_LOCALIZEDTEXT("", "RedundancySupport"); -attr.description = UA_LOCALIZEDTEXT("", "Indicates what style of redundancy is supported by the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 3709), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "RedundancySupport"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 3709), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2296), false); -return retVal; -} + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -static UA_StatusCode function_ua_namespace0_69_finish(UA_Server *server, UA_UInt16* ns) { + if(dst->dataSetClassIdEnabled) { + rv = UA_Guid_decodeBinary(src, offset, &(dst->dataSetClassId)); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 3709) -); -} + // GroupHeader + if(dst->groupHeaderEnabled) { + v = 0; + rv = UA_Byte_decodeBinary(src, offset, &v); + if(rv != UA_STATUSCODE_GOOD) + return rv; -/* MaxMonitoredItemsPerCall - ns=0;i=11714 */ + if((v & GROUP_HEADER_WRITER_GROUPID_ENABLED) != 0) + dst->groupHeader.writerGroupIdEnabled = true; -static UA_StatusCode function_ua_namespace0_70_begin(UA_Server *server, UA_UInt16* ns) { + if((v & GROUP_HEADER_GROUP_VERSION_ENABLED) != 0) + dst->groupHeader.groupVersionEnabled = true; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxMonitoredItemsPerCall"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single MonitoredItem related request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11714), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxMonitoredItemsPerCall"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11714), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11704), false); -return retVal; -} + if((v & GROUP_HEADER_NM_NUMBER_ENABLED) != 0) + dst->groupHeader.networkMessageNumberEnabled = true; -static UA_StatusCode function_ua_namespace0_70_finish(UA_Server *server, UA_UInt16* ns) { + if((v & GROUP_HEADER_SEQUENCE_NUMBER_ENABLED) != 0) + dst->groupHeader.sequenceNumberEnabled = true; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11714) -); -} + if(dst->groupHeader.writerGroupIdEnabled) { + rv = UA_UInt16_decodeBinary(src, offset, &dst->groupHeader.writerGroupId); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -/* MaxNodesPerNodeManagement - ns=0;i=11713 */ + if(dst->groupHeader.groupVersionEnabled) { + rv = UA_UInt32_decodeBinary(src, offset, &dst->groupHeader.groupVersion); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -static UA_StatusCode function_ua_namespace0_71_begin(UA_Server *server, UA_UInt16* ns) { + if(dst->groupHeader.networkMessageNumberEnabled) { + rv = UA_UInt16_decodeBinary(src, offset, &dst->groupHeader.networkMessageNumber); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerNodeManagement"); -attr.description = UA_LOCALIZEDTEXT("", "The maximum number of operations in a single AddNodes, AddReferences, DeleteNodes or DeleteReferences request."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11713), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "MaxNodesPerNodeManagement"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11713), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11704), false); -return retVal; -} + if(dst->groupHeader.sequenceNumberEnabled) { + rv = UA_UInt16_decodeBinary(src, offset, &dst->groupHeader.sequenceNumber); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } -static UA_StatusCode function_ua_namespace0_71_finish(UA_Server *server, UA_UInt16* ns) { + // Payload-Header + if(dst->payloadHeaderEnabled) { + if(dst->networkMessageType != UA_NETWORKMESSAGE_DATASET) + return UA_STATUSCODE_BADNOTIMPLEMENTED; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11713) -); -} + rv = UA_Byte_decodeBinary(src, offset, &dst->payloadHeader.dataSetPayloadHeader.count); + if(rv != UA_STATUSCODE_GOOD) + return rv; -/* ModellingRuleType - ns=0;i=77 */ + dst->payloadHeader.dataSetPayloadHeader.dataSetWriterIds = + (UA_UInt16 *)UA_Array_new(dst->payloadHeader.dataSetPayloadHeader.count, + &UA_TYPES[UA_TYPES_UINT16]); + for (UA_Byte i = 0; i < dst->payloadHeader.dataSetPayloadHeader.count; i++) { + rv = UA_UInt16_decodeBinary(src, offset, + &dst->payloadHeader.dataSetPayloadHeader.dataSetWriterIds[i]); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } -static UA_StatusCode function_ua_namespace0_72_begin(UA_Server *server, UA_UInt16* ns) { + // Timestamp + if(dst->timestampEnabled) { + rv = UA_DateTime_decodeBinary(src, offset, &(dst->timestamp)); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "ModellingRuleType"); -attr.description = UA_LOCALIZEDTEXT("", "The type for an object that describes how an instance declaration is used when a type is instantiated."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, -UA_NODEID_NUMERIC(ns[0], 77), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ModellingRuleType"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 77), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 58), false); -return retVal; -} + // Picoseconds + if(dst->picosecondsEnabled) { + rv = UA_UInt16_decodeBinary(src, offset, &(dst->picoseconds)); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -static UA_StatusCode function_ua_namespace0_72_finish(UA_Server *server, UA_UInt16* ns) { + // PromotedFields + if(dst->promotedFieldsEnabled) { + // Size + UA_UInt16 promotedFieldsSize = 0; + rv = UA_UInt16_decodeBinary(src, offset, &promotedFieldsSize); + if(rv != UA_STATUSCODE_GOOD) + return rv; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 77) -); -} + // promotedFieldsSize: here size in Byte, not the number of objects! + if(promotedFieldsSize > 0) { + // store offset, later compared with promotedFieldsSize + size_t offsetEnd = (*offset) + promotedFieldsSize; -/* NamingRule - ns=0;i=111 */ + unsigned int counter = 0; + do { + if(counter == 0) { + dst->promotedFields = (UA_Variant*)UA_malloc(UA_TYPES[UA_TYPES_VARIANT].memSize); + // set promotedFieldsSize to the number of objects + dst->promotedFieldsSize = (UA_UInt16) (counter + 1); + } else { + dst->promotedFields = (UA_Variant*) + UA_realloc(dst->promotedFields, + UA_TYPES[UA_TYPES_VARIANT].memSize * (counter + 1)); + // set promotedFieldsSize to the number of objects + dst->promotedFieldsSize = (UA_UInt16) (counter + 1); + } -static UA_StatusCode function_ua_namespace0_73_begin(UA_Server *server, UA_UInt16* ns) { + UA_Variant_init(&dst->promotedFields[counter]); + rv = UA_Variant_decodeBinary(src, offset, &dst->promotedFields[counter]); + if(rv != UA_STATUSCODE_GOOD) + return rv; + counter++; + } while ((*offset) < offsetEnd); + } + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 120); -UA_Int32 *variablenode_ns_0_i_111_variant_DataContents = UA_Int32_new(); -if (!variablenode_ns_0_i_111_variant_DataContents) return UA_STATUSCODE_BADOUTOFMEMORY; -*variablenode_ns_0_i_111_variant_DataContents = (UA_Int32) 1; -UA_Variant_setScalar(&attr.value, variablenode_ns_0_i_111_variant_DataContents, &UA_TYPES[UA_TYPES_INT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); -attr.description = UA_LOCALIZEDTEXT("", "Specified the significances of the BrowseName when a type is instantiated."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 111), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "NamingRule"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_Int32_delete(variablenode_ns_0_i_111_variant_DataContents); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 111), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 77), false); -return retVal; -} + // SecurityHeader + if(dst->securityEnabled) { + // SecurityFlags + v = 0; + rv = UA_Byte_decodeBinary(src, offset, &v); + if(rv != UA_STATUSCODE_GOOD) + return rv; -static UA_StatusCode function_ua_namespace0_73_finish(UA_Server *server, UA_UInt16* ns) { + if((v & SECURITY_HEADER_NM_SIGNED) != 0) + dst->securityHeader.networkMessageSigned = true; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 111) -); -} + if((v & SECURITY_HEADER_NM_ENCRYPTED) != 0) + dst->securityHeader.networkMessageEncrypted = true; -/* Mandatory - ns=0;i=78 */ + if((v & SECURITY_HEADER_SEC_FOOTER_ENABLED) != 0) + dst->securityHeader.securityFooterEnabled = true; -static UA_StatusCode function_ua_namespace0_74_begin(UA_Server *server, UA_UInt16* ns) { + if((v & SECURITY_HEADER_FORCE_KEY_RESET) != 0) + dst->securityHeader.forceKeyReset = true; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "Mandatory"); -attr.description = UA_LOCALIZEDTEXT("", "Specifies that an instance with the attributes and references of the instance declaration must appear when a type is instantiated."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 78), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Mandatory"), -UA_NODEID_NUMERIC(ns[0], 77), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2035), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2161), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2160), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 7611), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 35), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2996), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2152), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2153), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 12169), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2151), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2156), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2157), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2154), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2155), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2163), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2159), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 111), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2162), false); -return retVal; -} + // SecurityTokenId + rv = UA_UInt32_decodeBinary(src, offset, &dst->securityHeader.securityTokenId); + if(rv != UA_STATUSCODE_GOOD) + return rv; -static UA_StatusCode function_ua_namespace0_74_finish(UA_Server *server, UA_UInt16* ns) { + // NonceLength + rv = UA_Byte_decodeBinary(src, offset, &dst->securityHeader.nonceLength); + if(rv != UA_STATUSCODE_GOOD) + return rv; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 78) -); -} + // MessageNonce + if(dst->securityHeader.nonceLength > 0) { + rv = UA_ByteString_allocBuffer(&dst->securityHeader.messageNonce, + dst->securityHeader.nonceLength); + if(rv != UA_STATUSCODE_GOOD) + return rv; -/* NamingRule - ns=0;i=112 */ + for (UA_Byte i = 0; i < dst->securityHeader.nonceLength; i++) { + rv = UA_Byte_decodeBinary(src, offset, &(dst->securityHeader.messageNonce.data[i])); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } -static UA_StatusCode function_ua_namespace0_75_begin(UA_Server *server, UA_UInt16* ns) { + // SecurityFooterSize + if(dst->securityHeader.securityFooterEnabled) { + rv = UA_UInt16_decodeBinary(src, offset, &dst->securityHeader.securityFooterSize); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 120); -UA_Int32 *variablenode_ns_0_i_112_variant_DataContents = UA_Int32_new(); -if (!variablenode_ns_0_i_112_variant_DataContents) return UA_STATUSCODE_BADOUTOFMEMORY; -*variablenode_ns_0_i_112_variant_DataContents = (UA_Int32) 1; -UA_Variant_setScalar(&attr.value, variablenode_ns_0_i_112_variant_DataContents, &UA_TYPES[UA_TYPES_INT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); -attr.description = UA_LOCALIZEDTEXT("", "Specified the significances of the BrowseName when a type is instantiated."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 112), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "NamingRule"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_Int32_delete(variablenode_ns_0_i_112_variant_DataContents); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 112), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 78), false); -return retVal; -} + // Payload + if(dst->networkMessageType != UA_NETWORKMESSAGE_DATASET) + return UA_STATUSCODE_BADNOTIMPLEMENTED; -static UA_StatusCode function_ua_namespace0_75_finish(UA_Server *server, UA_UInt16* ns) { + UA_Byte count = 1; + if(dst->payloadHeaderEnabled) { + count = dst->payloadHeader.dataSetPayloadHeader.count; + if(count > 1) { + dst->payload.dataSetPayload.sizes = (UA_UInt16 *)UA_Array_new(count, &UA_TYPES[UA_TYPES_UINT16]); + for (UA_Byte i = 0; i < count; i++) { + rv = UA_UInt16_decodeBinary(src, offset, &(dst->payload.dataSetPayload.sizes[i])); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 112) -); -} + dst->payload.dataSetPayload.dataSetMessages = (UA_DataSetMessage*) + UA_calloc(count, sizeof(UA_DataSetMessage)); + for(UA_Byte i = 0; i < count; i++) { + rv = UA_DataSetMessage_decodeBinary(src, offset, &(dst->payload.dataSetPayload.dataSetMessages[i])); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -/* Optional - ns=0;i=80 */ + if(rv != UA_STATUSCODE_GOOD) + return rv; -static UA_StatusCode function_ua_namespace0_76_begin(UA_Server *server, UA_UInt16* ns) { + if(dst->securityEnabled) { + // SecurityFooter + if(dst->securityHeader.securityFooterEnabled && (dst->securityHeader.securityFooterSize > 0)) { + rv = UA_ByteString_allocBuffer(&dst->securityFooter, dst->securityHeader.securityFooterSize); + if (rv != UA_STATUSCODE_GOOD) + return rv; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "Optional"); -attr.description = UA_LOCALIZEDTEXT("", "Specifies that an instance with the attributes and references of the instance declaration may appear when a type is instantiated."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 80), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Optional"), -UA_NODEID_NUMERIC(ns[0], 77), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 35), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2996), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11567), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11565), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11551), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11574), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11569), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11570), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11571), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11572), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11573), false); -return retVal; -} + for (UA_Byte i = 0; i < dst->securityHeader.securityFooterSize; i++) { + rv = UA_Byte_decodeBinary(src, offset, &(dst->securityFooter.data[i])); + if (rv != UA_STATUSCODE_GOOD) + return rv; + } + } -static UA_StatusCode function_ua_namespace0_76_finish(UA_Server *server, UA_UInt16* ns) { + // Signature + if(dst->securityHeader.networkMessageSigned) { + rv = UA_ByteString_decodeBinary(src, offset, &(dst->signature)); + if (rv != UA_STATUSCODE_GOOD) + return rv; + } + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 80) -); + return UA_STATUSCODE_GOOD; } -/* NamingRule - ns=0;i=113 */ +UA_StatusCode +UA_NetworkMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NetworkMessage* dst) { + UA_StatusCode retval = UA_NetworkMessage_decodeBinaryInternal(src, offset, dst); -static UA_StatusCode function_ua_namespace0_77_begin(UA_Server *server, UA_UInt16* ns) { + if(retval != UA_STATUSCODE_GOOD) + UA_NetworkMessage_deleteMembers(dst); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 120); -UA_Int32 *variablenode_ns_0_i_113_variant_DataContents = UA_Int32_new(); -if (!variablenode_ns_0_i_113_variant_DataContents) return UA_STATUSCODE_BADOUTOFMEMORY; -*variablenode_ns_0_i_113_variant_DataContents = (UA_Int32) 2; -UA_Variant_setScalar(&attr.value, variablenode_ns_0_i_113_variant_DataContents, &UA_TYPES[UA_TYPES_INT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); -attr.description = UA_LOCALIZEDTEXT("", "Specified the significances of the BrowseName when a type is instantiated."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 113), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "NamingRule"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_Int32_delete(variablenode_ns_0_i_113_variant_DataContents); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 113), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 80), false); -return retVal; + return retval; } -static UA_StatusCode function_ua_namespace0_77_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 113) -); -} +size_t UA_NetworkMessage_calcSizeBinary(const UA_NetworkMessage* p) { + size_t retval = 0; + UA_Byte byte; + size_t size = UA_Byte_calcSizeBinary(&byte); // UADPVersion + UADPFlags + if(UA_NetworkMessage_ExtendedFlags1Enabled(p)) { + size += UA_Byte_calcSizeBinary(&byte); + if(UA_NetworkMessage_ExtendedFlags2Enabled(p)) + size += UA_Byte_calcSizeBinary(&byte); + } -/* DataTypeEncodingType - ns=0;i=76 */ + if(p->publisherIdEnabled) { + switch (p->publisherIdType) { + case UA_PUBLISHERDATATYPE_BYTE: + size += UA_Byte_calcSizeBinary(&p->publisherId.publisherIdByte); + break; -static UA_StatusCode function_ua_namespace0_78_begin(UA_Server *server, UA_UInt16* ns) { + case UA_PUBLISHERDATATYPE_UINT16: + size += UA_UInt16_calcSizeBinary(&p->publisherId.publisherIdUInt16); + break; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeEncodingType"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, -UA_NODEID_NUMERIC(ns[0], 76), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "DataTypeEncodingType"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 76), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 58), false); -return retVal; -} + case UA_PUBLISHERDATATYPE_UINT32: + size += UA_UInt32_calcSizeBinary(&p->publisherId.publisherIdUInt32); + break; -static UA_StatusCode function_ua_namespace0_78_finish(UA_Server *server, UA_UInt16* ns) { + case UA_PUBLISHERDATATYPE_UINT64: + size += UA_UInt64_calcSizeBinary(&p->publisherId.publisherIdUInt64); + break; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 76) -); -} + case UA_PUBLISHERDATATYPE_STRING: + size += UA_String_calcSizeBinary(&p->publisherId.publisherIdString); + break; + } + } -/* Default Binary - ns=0;i=8251 */ + if(p->dataSetClassIdEnabled) + size += UA_Guid_calcSizeBinary(&p->dataSetClassId); -static UA_StatusCode function_ua_namespace0_79_begin(UA_Server *server, UA_UInt16* ns) { + // Group Header + if(p->groupHeaderEnabled) { + size += UA_Byte_calcSizeBinary(&byte); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "Default Binary"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 8251), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Default Binary"), -UA_NODEID_NUMERIC(ns[0], 76), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 8251), UA_NODEID_NUMERIC(ns[0], 38), UA_EXPANDEDNODEID_NUMERIC(ns[0], 7594), false); -return retVal; -} + if(p->groupHeader.writerGroupIdEnabled) + size += UA_UInt16_calcSizeBinary(&p->groupHeader.writerGroupId); -static UA_StatusCode function_ua_namespace0_79_finish(UA_Server *server, UA_UInt16* ns) { + if(p->groupHeader.groupVersionEnabled) + size += UA_UInt32_calcSizeBinary(&p->groupHeader.groupVersion); -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 8251) -); -} + if(p->groupHeader.networkMessageNumberEnabled) + size += UA_UInt16_calcSizeBinary(&p->groupHeader.networkMessageNumber); -/* DataTypeSystemType - ns=0;i=75 */ + if(p->groupHeader.sequenceNumberEnabled) + size += UA_UInt16_calcSizeBinary(&p->groupHeader.sequenceNumber); + } -static UA_StatusCode function_ua_namespace0_80_begin(UA_Server *server, UA_UInt16* ns) { + // Payload Header + if(p->payloadHeaderEnabled) { + if(p->networkMessageType == UA_NETWORKMESSAGE_DATASET) { + size += UA_Byte_calcSizeBinary(&p->payloadHeader.dataSetPayloadHeader.count); + if(p->payloadHeader.dataSetPayloadHeader.dataSetWriterIds != NULL) { + size += UA_UInt16_calcSizeBinary(&p->payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0]) * + p->payloadHeader.dataSetPayloadHeader.count; + } else { + return 0; /* no dataSetWriterIds given! */ + } + } else { + // not implemented + } + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeSystemType"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, -UA_NODEID_NUMERIC(ns[0], 75), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "DataTypeSystemType"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 75), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 58), false); -return retVal; -} + if(p->timestampEnabled) + size += UA_DateTime_calcSizeBinary(&p->timestamp); -static UA_StatusCode function_ua_namespace0_80_finish(UA_Server *server, UA_UInt16* ns) { + if(p->picosecondsEnabled) + size += UA_UInt16_calcSizeBinary(&p->picoseconds); -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 75) -); -} + if(p->promotedFieldsEnabled) { + size += UA_UInt16_calcSizeBinary(&p->promotedFieldsSize); + for (UA_UInt16 i = 0; i < p->promotedFieldsSize; i++) + size += UA_Variant_calcSizeBinary(&p->promotedFields[i]); + } -/* OPC Binary - ns=0;i=93 */ + if(p->securityEnabled) { + size += UA_Byte_calcSizeBinary(&byte); + size += UA_UInt32_calcSizeBinary(&p->securityHeader.securityTokenId); + size += UA_Byte_calcSizeBinary(&p->securityHeader.nonceLength); + if(p->securityHeader.nonceLength > 0) + size += (UA_Byte_calcSizeBinary(&p->securityHeader.messageNonce.data[0]) * p->securityHeader.nonceLength); + if(p->securityHeader.securityFooterEnabled) + size += UA_UInt16_calcSizeBinary(&p->securityHeader.securityFooterSize); + } + + if(p->networkMessageType == UA_NETWORKMESSAGE_DATASET) { + UA_Byte count = 1; + if(p->payloadHeaderEnabled) { + count = p->payloadHeader.dataSetPayloadHeader.count; + if(count > 1) + size += UA_UInt16_calcSizeBinary(&(p->payload.dataSetPayload.sizes[0])) * count; + } -static UA_StatusCode function_ua_namespace0_81_begin(UA_Server *server, UA_UInt16* ns) { + for (size_t i = 0; i < count; i++) + size += UA_DataSetMessage_calcSizeBinary(&(p->payload.dataSetPayload.dataSetMessages[i])); + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "OPC Binary"); -attr.description = UA_LOCALIZEDTEXT("", "A type system which uses OPC binary schema to describe the encoding of data types."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 93), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "OPC Binary"), -UA_NODEID_NUMERIC(ns[0], 75), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 93), UA_NODEID_NUMERIC(ns[0], 35), UA_EXPANDEDNODEID_NUMERIC(ns[0], 90), false); -return retVal; -} + if (p->securityEnabled) { + if (p->securityHeader.securityFooterEnabled) + size += p->securityHeader.securityFooterSize; -static UA_StatusCode function_ua_namespace0_81_finish(UA_Server *server, UA_UInt16* ns) { + if (p->securityHeader.networkMessageSigned) + size += UA_ByteString_calcSizeBinary(&p->signature); + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 93) -); + retval = size; + return retval; } -/* DataTypeDictionaryType - ns=0;i=72 */ +void +UA_NetworkMessage_deleteMembers(UA_NetworkMessage* p) { + if(p->promotedFieldsEnabled) + UA_Array_delete(p->promotedFields, p->promotedFieldsSize, &UA_TYPES[UA_TYPES_VARIANT]); + + if(p->securityEnabled && (p->securityHeader.nonceLength > 0)) + UA_ByteString_deleteMembers(&p->securityHeader.messageNonce); + + if(p->networkMessageType == UA_NETWORKMESSAGE_DATASET) { + if(p->payloadHeaderEnabled) { + if(p->payloadHeader.dataSetPayloadHeader.dataSetWriterIds != NULL) { + UA_Array_delete(p->payloadHeader.dataSetPayloadHeader.dataSetWriterIds, + p->payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]); + } -static UA_StatusCode function_ua_namespace0_82_begin(UA_Server *server, UA_UInt16* ns) { + if(p->payload.dataSetPayload.sizes != NULL) { + UA_Array_delete(p->payload.dataSetPayload.sizes, + p->payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]); + } + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default; -attr.valueRank = (UA_Int32)-2; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 24); -attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeDictionaryType"); -attr.description = UA_LOCALIZEDTEXT("", "The type for variable that represents the collection of data type decriptions."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE, -UA_NODEID_NUMERIC(ns[0], 72), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "DataTypeDictionaryType"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 72), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 63), false); -return retVal; -} + if(p->payload.dataSetPayload.dataSetMessages != NULL) { + UA_Byte count = 1; + if(p->payloadHeaderEnabled) + count = p->payloadHeader.dataSetPayloadHeader.count; + + for (size_t i = 0; i < count; i++) + UA_DataSetMessage_free(&(p->payload.dataSetPayload.dataSetMessages[i])); -static UA_StatusCode function_ua_namespace0_82_finish(UA_Server *server, UA_UInt16* ns) { + UA_free(p->payload.dataSetPayload.dataSetMessages); + } + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 72) -); -} + if(p->securityHeader.securityFooterEnabled && (p->securityHeader.securityFooterSize > 0)) + UA_ByteString_deleteMembers(&p->securityFooter); -/* NamespaceUri - ns=0;i=107 */ + if(p->messageIdEnabled){ + UA_String_deleteMembers(&p->messageId); + } -static UA_StatusCode function_ua_namespace0_83_begin(UA_Server *server, UA_UInt16* ns) { + if(p->publisherIdEnabled && p->publisherIdType == UA_PUBLISHERDATATYPE_STRING){ + UA_String_deleteMembers(&p->publisherId.publisherIdString); + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "NamespaceUri"); -attr.description = UA_LOCALIZEDTEXT("", "A URI that uniquely identifies the dictionary."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 107), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "NamespaceUri"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 107), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 80), true); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 107), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 72), false); -return retVal; + memset(p, 0, sizeof(UA_NetworkMessage)); } -static UA_StatusCode function_ua_namespace0_83_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 107) -); +void UA_NetworkMessage_delete(UA_NetworkMessage* p) { + UA_NetworkMessage_deleteMembers(p); } -/* DataTypeVersion - ns=0;i=106 */ - -static UA_StatusCode function_ua_namespace0_84_begin(UA_Server *server, UA_UInt16* ns) { +UA_Boolean +UA_NetworkMessage_ExtendedFlags1Enabled(const UA_NetworkMessage* src) { + UA_Boolean retval = false; + + if((src->publisherIdType != UA_PUBLISHERDATATYPE_BYTE) + || src->dataSetClassIdEnabled + || src->securityEnabled + || src->timestampEnabled + || src->picosecondsEnabled + || UA_NetworkMessage_ExtendedFlags2Enabled(src)) + { + retval = true; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeVersion"); -attr.description = UA_LOCALIZEDTEXT("", "The version number for the data type dictionary."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 106), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "DataTypeVersion"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 106), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 80), true); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 106), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 72), false); -return retVal; + return retval; } -static UA_StatusCode function_ua_namespace0_84_finish(UA_Server *server, UA_UInt16* ns) { +UA_Boolean +UA_NetworkMessage_ExtendedFlags2Enabled(const UA_NetworkMessage* src) { + if(src->chunkMessage || src->promotedFieldsEnabled || + src->networkMessageType != UA_NETWORKMESSAGE_DATASET) + return true; + return false; +} -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 106) -); +UA_Boolean +UA_DataSetMessageHeader_DataSetFlags2Enabled(const UA_DataSetMessageHeader* src) { + if(src->dataSetMessageType != UA_DATASETMESSAGE_DATAKEYFRAME || + src->timestampEnabled || src->picoSecondsIncluded) + return true; + return false; } -/* Opc.Ua - ns=0;i=7617 */ +UA_StatusCode +UA_DataSetMessageHeader_encodeBinary(const UA_DataSetMessageHeader* src, UA_Byte **bufPos, + const UA_Byte *bufEnd) { + UA_Byte v; + // DataSetFlags1 + v = (UA_Byte)src->fieldEncoding; + // shift left 1 bit + v = (UA_Byte)(v << DS_MH_SHIFT_LEN); -static UA_StatusCode function_ua_namespace0_85_begin(UA_Server *server, UA_UInt16* ns) { + if(src->dataSetMessageValid) + v |= DS_MESSAGEHEADER_DS_MSG_VALID; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 15); -UA_ByteString *variablenode_ns_0_i_7617_variant_DataContents = UA_ByteString_new(); -if (!variablenode_ns_0_i_7617_variant_DataContents) return UA_STATUSCODE_BADOUTOFMEMORY; -*variablenode_ns_0_i_7617_variant_DataContents = UA_BYTESTRING_NULL; -UA_Variant_setScalar(&attr.value, variablenode_ns_0_i_7617_variant_DataContents, &UA_TYPES[UA_TYPES_BYTESTRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "Opc.Ua"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 7617), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Opc.Ua"), -UA_NODEID_NUMERIC(ns[0], 72), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_ByteString_delete(variablenode_ns_0_i_7617_variant_DataContents); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 7617), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 93), false); -return retVal; -} + if(src->dataSetMessageSequenceNrEnabled) + v |= DS_MESSAGEHEADER_SEQ_NR_ENABLED_MASK; -static UA_StatusCode function_ua_namespace0_85_finish(UA_Server *server, UA_UInt16* ns) { + if(src->statusEnabled) + v |= DS_MESSAGEHEADER_STATUS_ENABLED_MASK; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 7617) -); -} + if(src->configVersionMajorVersionEnabled) + v |= DS_MESSAGEHEADER_CONFIGMAJORVERSION_ENABLED_MASK; -/* ServerStatusDataType - ns=0;i=862 */ + if(src->configVersionMinorVersionEnabled) + v |= DS_MESSAGEHEADER_CONFIGMINORVERSION_ENABLED_MASK; -static UA_StatusCode function_ua_namespace0_86_begin(UA_Server *server, UA_UInt16* ns) { + if(UA_DataSetMessageHeader_DataSetFlags2Enabled(src)) + v |= DS_MESSAGEHEADER_FLAGS2_ENABLED_MASK; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "ServerStatusDataType"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 862), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerStatusDataType"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 862), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 22), false); -return retVal; -} + UA_StatusCode rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + // DataSetFlags2 + if(UA_DataSetMessageHeader_DataSetFlags2Enabled(src)) { + v = (UA_Byte)src->dataSetMessageType; -static UA_StatusCode function_ua_namespace0_86_finish(UA_Server *server, UA_UInt16* ns) { + if(src->timestampEnabled) + v |= DS_MESSAGEHEADER_TIMESTAMP_ENABLED_MASK; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 862) -); -} + if(src->picoSecondsIncluded) + v |= DS_MESSAGEHEADER_PICOSECONDS_INCLUDED_MASK; -/* DataTypeDescriptionType - ns=0;i=69 */ + rv = UA_Byte_encodeBinary(&v, bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -static UA_StatusCode function_ua_namespace0_87_begin(UA_Server *server, UA_UInt16* ns) { + // DataSetMessageSequenceNr + if(src->dataSetMessageSequenceNrEnabled) { + rv = UA_UInt16_encodeBinary(&src->dataSetMessageSequenceNr, bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default; -attr.valueRank = (UA_Int32)-2; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 24); -attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeDescriptionType"); -attr.description = UA_LOCALIZEDTEXT("", "The type for variable that represents the description of a data type encoding."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE, -UA_NODEID_NUMERIC(ns[0], 69), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "DataTypeDescriptionType"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 69), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 63), false); -return retVal; -} + // Timestamp + if(src->timestampEnabled) { + rv = UA_DateTime_encodeBinary(&(src->timestamp), bufPos, bufEnd); /* UtcTime */ + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -static UA_StatusCode function_ua_namespace0_87_finish(UA_Server *server, UA_UInt16* ns) { + // PicoSeconds + if(src->picoSecondsIncluded) { + rv = UA_UInt16_encodeBinary(&(src->picoSeconds), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 69) -); -} + // Status + if(src->statusEnabled) { + rv = UA_UInt16_encodeBinary(&(src->status), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -/* DictionaryFragment - ns=0;i=105 */ + // ConfigVersionMajorVersion + if(src->configVersionMajorVersionEnabled) { + rv = UA_UInt32_encodeBinary(&(src->configVersionMajorVersion), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -static UA_StatusCode function_ua_namespace0_88_begin(UA_Server *server, UA_UInt16* ns) { + // ConfigVersionMinorVersion + if(src->configVersionMinorVersionEnabled) { + rv = UA_UInt32_encodeBinary(&(src->configVersionMinorVersion), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 15); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_BYTESTRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "DictionaryFragment"); -attr.description = UA_LOCALIZEDTEXT("", "A fragment of a data type dictionary that defines the data type."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 105), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "DictionaryFragment"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 105), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 80), true); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 105), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 69), false); -return retVal; + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_88_finish(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode +UA_DataSetMessageHeader_decodeBinary(const UA_ByteString *src, size_t *offset, + UA_DataSetMessageHeader* dst) { + memset(dst, 0, sizeof(UA_DataSetMessageHeader)); + UA_Byte v = 0; + UA_StatusCode rv = UA_Byte_decodeBinary(src, offset, &v); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + UA_Byte v2 = v & DS_MESSAGEHEADER_FIELD_ENCODING_MASK; + v2 = (UA_Byte)(v2 >> DS_MH_SHIFT_LEN); + dst->fieldEncoding = (UA_FieldEncoding)v2; + + if((v & DS_MESSAGEHEADER_DS_MSG_VALID) != 0) + dst->dataSetMessageValid = true; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 105) -); -} + if((v & DS_MESSAGEHEADER_SEQ_NR_ENABLED_MASK) != 0) + dst->dataSetMessageSequenceNrEnabled = true; -/* DataTypeVersion - ns=0;i=104 */ + if((v & DS_MESSAGEHEADER_STATUS_ENABLED_MASK) != 0) + dst->statusEnabled = true; -static UA_StatusCode function_ua_namespace0_89_begin(UA_Server *server, UA_UInt16* ns) { + if((v & DS_MESSAGEHEADER_CONFIGMAJORVERSION_ENABLED_MASK) != 0) + dst->configVersionMajorVersionEnabled = true; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeVersion"); -attr.description = UA_LOCALIZEDTEXT("", "The version number for the data type description."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 104), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "DataTypeVersion"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 104), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 80), true); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 104), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 69), false); -return retVal; -} + if((v & DS_MESSAGEHEADER_CONFIGMINORVERSION_ENABLED_MASK) != 0) + dst->configVersionMinorVersionEnabled = true; -static UA_StatusCode function_ua_namespace0_89_finish(UA_Server *server, UA_UInt16* ns) { + if((v & DS_MESSAGEHEADER_FLAGS2_ENABLED_MASK) != 0) { + v = 0; + rv = UA_Byte_decodeBinary(src, offset, &v); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + dst->dataSetMessageType = (UA_DataSetMessageType)(v & DS_MESSAGEHEADER_DS_MESSAGE_TYPE_MASK); -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 104) -); -} + if((v & DS_MESSAGEHEADER_TIMESTAMP_ENABLED_MASK) != 0) + dst->timestampEnabled = true; -/* Argument - ns=0;i=7650 */ + if((v & DS_MESSAGEHEADER_PICOSECONDS_INCLUDED_MASK) != 0) + dst->picoSecondsIncluded = true; + } else { + dst->dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME; + dst->picoSecondsIncluded = false; + } -static UA_StatusCode function_ua_namespace0_90_begin(UA_Server *server, UA_UInt16* ns) { + if(dst->dataSetMessageSequenceNrEnabled) { + rv = UA_UInt16_decodeBinary(src, offset, &dst->dataSetMessageSequenceNr); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } else { + dst->dataSetMessageSequenceNr = 0; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); -UA_String *variablenode_ns_0_i_7650_variant_DataContents = UA_String_new(); -if (!variablenode_ns_0_i_7650_variant_DataContents) return UA_STATUSCODE_BADOUTOFMEMORY; -*variablenode_ns_0_i_7650_variant_DataContents = UA_STRING_ALLOC("Argument"); -UA_Variant_setScalar(&attr.value, variablenode_ns_0_i_7650_variant_DataContents, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "Argument"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 7650), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Argument"), -UA_NODEID_NUMERIC(ns[0], 69), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_String_delete(variablenode_ns_0_i_7650_variant_DataContents); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 7650), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 7617), false); -return retVal; -} + if(dst->timestampEnabled) { + rv = UA_DateTime_decodeBinary(src, offset, &dst->timestamp); /* UtcTime */ + if(rv != UA_STATUSCODE_GOOD) + return rv; + } else { + dst->timestamp = 0; + } -static UA_StatusCode function_ua_namespace0_90_finish(UA_Server *server, UA_UInt16* ns) { + if(dst->picoSecondsIncluded) { + rv = UA_UInt16_decodeBinary(src, offset, &dst->picoSeconds); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } else { + dst->picoSeconds = 0; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 7650) -); -} + if(dst->statusEnabled) { + rv = UA_UInt16_decodeBinary(src, offset, &dst->status); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } else { + dst->status = 0; + } -/* EnumValueType - ns=0;i=7656 */ + if(dst->configVersionMajorVersionEnabled) { + rv = UA_UInt32_decodeBinary(src, offset, &dst->configVersionMajorVersion); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } else { + dst->configVersionMajorVersion = 0; + } -static UA_StatusCode function_ua_namespace0_91_begin(UA_Server *server, UA_UInt16* ns) { + if(dst->configVersionMinorVersionEnabled) { + rv = UA_UInt32_decodeBinary(src, offset, &dst->configVersionMinorVersion); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } else { + dst->configVersionMinorVersion = 0; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); -UA_String *variablenode_ns_0_i_7656_variant_DataContents = UA_String_new(); -if (!variablenode_ns_0_i_7656_variant_DataContents) return UA_STATUSCODE_BADOUTOFMEMORY; -*variablenode_ns_0_i_7656_variant_DataContents = UA_STRING_ALLOC("EnumValueType"); -UA_Variant_setScalar(&attr.value, variablenode_ns_0_i_7656_variant_DataContents, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "EnumValueType"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 7656), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "EnumValueType"), -UA_NODEID_NUMERIC(ns[0], 69), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_String_delete(variablenode_ns_0_i_7656_variant_DataContents); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 7656), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 7617), false); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 7656), UA_NODEID_NUMERIC(ns[0], 39), UA_EXPANDEDNODEID_NUMERIC(ns[0], 8251), false); -return retVal; + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_91_finish(UA_Server *server, UA_UInt16* ns) { +size_t +UA_DataSetMessageHeader_calcSizeBinary(const UA_DataSetMessageHeader* p) { + UA_Byte byte; + size_t size = UA_Byte_calcSizeBinary(&byte); // DataSetMessage Type + Flags + if(UA_DataSetMessageHeader_DataSetFlags2Enabled(p)) + size += UA_Byte_calcSizeBinary(&byte); -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 7656) -); -} + if(p->dataSetMessageSequenceNrEnabled) + size += UA_UInt16_calcSizeBinary(&p->dataSetMessageSequenceNr); -/* ServerDiagnosticsSummaryDataType - ns=0;i=859 */ + if(p->timestampEnabled) + size += UA_DateTime_calcSizeBinary(&p->timestamp); /* UtcTime */ -static UA_StatusCode function_ua_namespace0_92_begin(UA_Server *server, UA_UInt16* ns) { + if(p->picoSecondsIncluded) + size += UA_UInt16_calcSizeBinary(&p->picoSeconds); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummaryDataType"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 859), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerDiagnosticsSummaryDataType"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 859), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 22), false); -return retVal; -} + if(p->statusEnabled) + size += UA_UInt16_calcSizeBinary(&p->status); -static UA_StatusCode function_ua_namespace0_92_finish(UA_Server *server, UA_UInt16* ns) { + if(p->configVersionMajorVersionEnabled) + size += UA_UInt32_calcSizeBinary(&p->configVersionMajorVersion); -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 859) -); + if(p->configVersionMinorVersionEnabled) + size += UA_UInt32_calcSizeBinary(&p->configVersionMinorVersion); + + return size; } -/* SignedSoftwareCertificate - ns=0;i=344 */ +UA_StatusCode +UA_DataSetMessage_encodeBinary(const UA_DataSetMessage* src, UA_Byte **bufPos, + const UA_Byte *bufEnd) { + UA_StatusCode rv = UA_DataSetMessageHeader_encodeBinary(&src->header, bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + if(src->header.dataSetMessageType == UA_DATASETMESSAGE_DATAKEYFRAME) { + if(src->header.fieldEncoding != UA_FIELDENCODING_RAWDATA) { + rv = UA_UInt16_encodeBinary(&(src->data.keyFrameData.fieldCount), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } -static UA_StatusCode function_ua_namespace0_93_begin(UA_Server *server, UA_UInt16* ns) { + if(src->header.fieldEncoding == UA_FIELDENCODING_VARIANT) { + for (UA_UInt16 i = 0; i < src->data.keyFrameData.fieldCount; i++) { + rv = UA_Variant_encodeBinary(&(src->data.keyFrameData.dataSetFields[i].value), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } else if(src->header.fieldEncoding == UA_FIELDENCODING_RAWDATA) { + return UA_STATUSCODE_BADNOTIMPLEMENTED; + } else if(src->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) { + for (UA_UInt16 i = 0; i < src->data.keyFrameData.fieldCount; i++) { + rv = UA_DataValue_encodeBinary(&(src->data.keyFrameData.dataSetFields[i]), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } + } else if(src->header.dataSetMessageType == UA_DATASETMESSAGE_DATADELTAFRAME) { + // Encode Delta Frame + // Here the FieldCount is always present + rv = UA_UInt16_encodeBinary(&(src->data.keyFrameData.fieldCount), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + if(src->header.fieldEncoding == UA_FIELDENCODING_VARIANT) { + for (UA_UInt16 i = 0; i < src->data.deltaFrameData.fieldCount; i++) { + rv = UA_UInt16_encodeBinary(&(src->data.deltaFrameData.deltaFrameFields[i].fieldIndex), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + rv = UA_Variant_encodeBinary(&(src->data.deltaFrameData.deltaFrameFields[i].fieldValue.value), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } else if(src->header.fieldEncoding == UA_FIELDENCODING_RAWDATA) { + return UA_STATUSCODE_BADNOTIMPLEMENTED; + } else if(src->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) { + for (UA_UInt16 i = 0; i < src->data.deltaFrameData.fieldCount; i++) { + rv = UA_UInt16_encodeBinary(&(src->data.deltaFrameData.deltaFrameFields[i].fieldIndex), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + rv = UA_DataValue_encodeBinary(&(src->data.deltaFrameData.deltaFrameFields[i].fieldValue), bufPos, bufEnd); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } + } else if(src->header.dataSetMessageType != UA_DATASETMESSAGE_KEEPALIVE) { + return UA_STATUSCODE_BADNOTIMPLEMENTED; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "SignedSoftwareCertificate"); -attr.description = UA_LOCALIZEDTEXT("", "A software certificate with a digital signature."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 344), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "SignedSoftwareCertificate"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 344), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 22), false); -return retVal; + /* Keep-Alive Message contains no Payload Data */ + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_93_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 344) -); -} +UA_StatusCode +UA_DataSetMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataSetMessage* dst) { + memset(dst, 0, sizeof(UA_DataSetMessage)); + UA_StatusCode rv = UA_DataSetMessageHeader_decodeBinary(src, offset, &dst->header); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + if(dst->header.dataSetMessageType == UA_DATASETMESSAGE_DATAKEYFRAME) { + if(dst->header.fieldEncoding != UA_FIELDENCODING_RAWDATA) { + rv = UA_UInt16_decodeBinary(src, offset, &dst->data.keyFrameData.fieldCount); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + if(dst->header.fieldEncoding == UA_FIELDENCODING_VARIANT) { + dst->data.keyFrameData.dataSetFields = + (UA_DataValue *)UA_Array_new(dst->data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); + for (UA_UInt16 i = 0; i < dst->data.keyFrameData.fieldCount; i++) { + UA_DataValue_init(&dst->data.keyFrameData.dataSetFields[i]); + rv = UA_Variant_decodeBinary(src, offset, &dst->data.keyFrameData.dataSetFields[i].value); + if(rv != UA_STATUSCODE_GOOD) + return rv; + dst->data.keyFrameData.dataSetFields[i].hasValue = true; + } + } else if(dst->header.fieldEncoding == UA_FIELDENCODING_RAWDATA) { + return UA_STATUSCODE_BADNOTIMPLEMENTED; + } else if(dst->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) { + dst->data.keyFrameData.dataSetFields = + (UA_DataValue *)UA_Array_new(dst->data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); + for (UA_UInt16 i = 0; i < dst->data.keyFrameData.fieldCount; i++) { + rv = UA_DataValue_decodeBinary(src, offset, &(dst->data.keyFrameData.dataSetFields[i])); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } + } + } else if(dst->header.dataSetMessageType == UA_DATASETMESSAGE_DATADELTAFRAME) { + if(dst->header.fieldEncoding != UA_FIELDENCODING_RAWDATA) { + rv = UA_UInt16_decodeBinary(src, offset, &dst->data.deltaFrameData.fieldCount); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + if(dst->header.fieldEncoding == UA_FIELDENCODING_VARIANT) { + size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dst->data.deltaFrameData.fieldCount; + dst->data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize); + for (UA_UInt16 i = 0; i < dst->data.deltaFrameData.fieldCount; i++) { + rv = UA_UInt16_decodeBinary(src, offset, &dst->data.deltaFrameData.deltaFrameFields[i].fieldIndex); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + UA_DataValue_init(&dst->data.deltaFrameData.deltaFrameFields[i].fieldValue); + rv = UA_Variant_decodeBinary(src, offset, &dst->data.deltaFrameData.deltaFrameFields[i].fieldValue.value); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + dst->data.deltaFrameData.deltaFrameFields[i].fieldValue.hasValue = true; + } + } else if(dst->header.fieldEncoding == UA_FIELDENCODING_RAWDATA) { + return UA_STATUSCODE_BADNOTIMPLEMENTED; + } else if(dst->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) { + size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dst->data.deltaFrameData.fieldCount; + dst->data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize); + for (UA_UInt16 i = 0; i < dst->data.deltaFrameData.fieldCount; i++) { + rv = UA_UInt16_decodeBinary(src, offset, &dst->data.deltaFrameData.deltaFrameFields[i].fieldIndex); + if(rv != UA_STATUSCODE_GOOD) + return rv; + + rv = UA_DataValue_decodeBinary(src, offset, &(dst->data.deltaFrameData.deltaFrameFields[i].fieldValue)); + if(rv != UA_STATUSCODE_GOOD) + return rv; + } + } + } + } else if(dst->header.dataSetMessageType != UA_DATASETMESSAGE_KEEPALIVE) { + return UA_STATUSCODE_BADNOTIMPLEMENTED; + } -/* SoftwareCertificates - ns=0;i=3704 */ + /* Keep-Alive Message contains no Payload Data */ + return UA_STATUSCODE_GOOD; +} -static UA_StatusCode function_ua_namespace0_94_begin(UA_Server *server, UA_UInt16* ns) { +size_t +UA_DataSetMessage_calcSizeBinary(const UA_DataSetMessage* p) { + size_t size = UA_DataSetMessageHeader_calcSizeBinary(&p->header); + + if(p->header.dataSetMessageType == UA_DATASETMESSAGE_DATAKEYFRAME) { + if(p->header.fieldEncoding != UA_FIELDENCODING_RAWDATA) + size += UA_calcSizeBinary(&p->data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_UINT16]); + + if(p->header.fieldEncoding == UA_FIELDENCODING_VARIANT) { + for (UA_UInt16 i = 0; i < p->data.keyFrameData.fieldCount; i++) + size += UA_calcSizeBinary(&p->data.keyFrameData.dataSetFields[i].value, &UA_TYPES[UA_TYPES_VARIANT]); + } else if(p->header.fieldEncoding == UA_FIELDENCODING_RAWDATA) { + // not implemented + } else if(p->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) { + for (UA_UInt16 i = 0; i < p->data.keyFrameData.fieldCount; i++) + size += UA_calcSizeBinary(&p->data.keyFrameData.dataSetFields[i], &UA_TYPES[UA_TYPES_DATAVALUE]); + } + } else if(p->header.dataSetMessageType == UA_DATASETMESSAGE_DATADELTAFRAME) { + if(p->header.fieldEncoding != UA_FIELDENCODING_RAWDATA) + size += UA_calcSizeBinary(&p->data.deltaFrameData.fieldCount, &UA_TYPES[UA_TYPES_UINT16]); + + if(p->header.fieldEncoding == UA_FIELDENCODING_VARIANT) { + for (UA_UInt16 i = 0; i < p->data.deltaFrameData.fieldCount; i++) { + size += UA_calcSizeBinary(&p->data.deltaFrameData.deltaFrameFields[i].fieldIndex, &UA_TYPES[UA_TYPES_UINT16]); + size += UA_calcSizeBinary(&p->data.deltaFrameData.deltaFrameFields[i].fieldValue.value, &UA_TYPES[UA_TYPES_VARIANT]); + } + } else if(p->header.fieldEncoding == UA_FIELDENCODING_RAWDATA) { + // not implemented + } else if(p->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) { + for (UA_UInt16 i = 0; i < p->data.deltaFrameData.fieldCount; i++) { + size += UA_calcSizeBinary(&p->data.deltaFrameData.deltaFrameFields[i].fieldIndex, &UA_TYPES[UA_TYPES_UINT16]); + size += UA_calcSizeBinary(&p->data.deltaFrameData.deltaFrameFields[i].fieldValue, &UA_TYPES[UA_TYPES_DATAVALUE]); + } + } + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = 1; -attr.arrayDimensionsSize = 1; -attr.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]); -if (!attr.arrayDimensions) return UA_STATUSCODE_BADOUTOFMEMORY; -attr.arrayDimensions[0] = 0; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 344); -UA_Variant_setArray(&attr.value, NULL, (UA_Int32) 0, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE]); -attr.displayName = UA_LOCALIZEDTEXT("", "SoftwareCertificates"); -attr.description = UA_LOCALIZEDTEXT("", "The software certificates owned by the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 3704), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "SoftwareCertificates"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_Array_delete(attr.arrayDimensions, 1, &UA_TYPES[UA_TYPES_UINT32]); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 3704), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2268), false); -return retVal; + /* KeepAlive-Message contains no Payload Data */ + return size; } -static UA_StatusCode function_ua_namespace0_94_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 3704) -); +void UA_DataSetMessage_free(const UA_DataSetMessage* p) { + if(p->header.dataSetMessageType == UA_DATASETMESSAGE_DATAKEYFRAME) { + if(p->data.keyFrameData.dataSetFields != NULL) + UA_Array_delete(p->data.keyFrameData.dataSetFields, p->data.keyFrameData.fieldCount, + &UA_TYPES[UA_TYPES_DATAVALUE]); + /* Json keys */ + if(p->data.keyFrameData.fieldNames != NULL){ + UA_Array_delete(p->data.keyFrameData.fieldNames, p->data.keyFrameData.fieldCount, + &UA_TYPES[UA_TYPES_STRING]); + } + } else if(p->header.dataSetMessageType == UA_DATASETMESSAGE_DATADELTAFRAME) { + if(p->data.deltaFrameData.deltaFrameFields != NULL) { + for(UA_UInt16 i = 0; i < p->data.deltaFrameData.fieldCount; i++) { + if(p->header.fieldEncoding == UA_FIELDENCODING_DATAVALUE) { + UA_DataValue_deleteMembers(&p->data.deltaFrameData.deltaFrameFields[i].fieldValue); + } else if(p->header.fieldEncoding == UA_FIELDENCODING_VARIANT) { + UA_Variant_deleteMembers(&p->data.deltaFrameData.deltaFrameFields[i].fieldValue.value); + } + } + UA_free(p->data.deltaFrameData.deltaFrameFields); + } + } } +#endif /* UA_ENABLE_PUBSUB */ -/* VendorServerInfoType - ns=0;i=2033 */ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/pubsub/ua_pubsub.c" ***********************************/ -static UA_StatusCode function_ua_namespace0_95_begin(UA_Server *server, UA_UInt16* ns) { +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner) + * Copyright (c) 2019 Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright (c) 2019 Kalycito Infotech Private Limited + */ -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "VendorServerInfoType"); -attr.description = UA_LOCALIZEDTEXT("", "A base type for vendor specific server information."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, -UA_NODEID_NUMERIC(ns[0], 2033), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "VendorServerInfoType"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2033), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 58), false); -return retVal; -} -static UA_StatusCode function_ua_namespace0_95_finish(UA_Server *server, UA_UInt16* ns) { +#ifdef UA_ENABLE_PUBSUB /* conditional compilation */ -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2033) -); -} -/* VendorServerInfo - ns=0;i=2295 */ +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL +#endif -static UA_StatusCode function_ua_namespace0_96_begin(UA_Server *server, UA_UInt16* ns) { +#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES +#endif -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "VendorServerInfo"); -attr.description = UA_LOCALIZEDTEXT("", "Server information provided by the vendor."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 2295), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "VendorServerInfo"), -UA_NODEID_NUMERIC(ns[0], 2033), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2295), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2253), false); -return retVal; -} +#define UA_MAX_STACKBUF 512 /* Max size of network messages on the stack */ +#define UA_MAX_SIZENAME 64 /* Max size of Qualified Name of Subscribed Variable */ + +/* Forward declaration */ +static void +UA_WriterGroup_deleteMembers(UA_Server *server, UA_WriterGroup *writerGroup); +static void +UA_DataSetField_deleteMembers(UA_DataSetField *field); -static UA_StatusCode function_ua_namespace0_96_finish(UA_Server *server, UA_UInt16* ns) { +/**********************************************/ +/* Connection */ +/**********************************************/ -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2295) -); +UA_StatusCode +UA_PubSubConnectionConfig_copy(const UA_PubSubConnectionConfig *src, + UA_PubSubConnectionConfig *dst) { + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + memcpy(dst, src, sizeof(UA_PubSubConnectionConfig)); + retVal |= UA_String_copy(&src->name, &dst->name); + retVal |= UA_Variant_copy(&src->address, &dst->address); + retVal |= UA_String_copy(&src->transportProfileUri, &dst->transportProfileUri); + retVal |= UA_Variant_copy(&src->connectionTransportSettings, &dst->connectionTransportSettings); + if(src->connectionPropertiesSize > 0){ + dst->connectionProperties = (UA_KeyValuePair *) + UA_calloc(src->connectionPropertiesSize, sizeof(UA_KeyValuePair)); + if(!dst->connectionProperties){ + return UA_STATUSCODE_BADOUTOFMEMORY; + } + for(size_t i = 0; i < src->connectionPropertiesSize; i++){ + retVal |= UA_QualifiedName_copy(&src->connectionProperties[i].key, + &dst->connectionProperties[i].key); + retVal |= UA_Variant_copy(&src->connectionProperties[i].value, + &dst->connectionProperties[i].value); + } + } + return retVal; } -/* VendorServerInfo - ns=0;i=2011 */ +UA_StatusCode +UA_Server_getPubSubConnectionConfig(UA_Server *server, const UA_NodeId connection, + UA_PubSubConnectionConfig *config) { + if(!config) + return UA_STATUSCODE_BADINVALIDARGUMENT; -static UA_StatusCode function_ua_namespace0_97_begin(UA_Server *server, UA_UInt16* ns) { + UA_PubSubConnection *currentPubSubConnection = + UA_PubSubConnection_findConnectionbyId(server, connection); + if(!currentPubSubConnection) + return UA_STATUSCODE_BADNOTFOUND; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "VendorServerInfo"); -attr.description = UA_LOCALIZEDTEXT("", "Server information provided by the vendor."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 2011), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "VendorServerInfo"), -UA_NODEID_NUMERIC(ns[0], 2033), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2011), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 78), true); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2011), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2004), false); -return retVal; + UA_PubSubConnectionConfig tmpPubSubConnectionConfig; + //deep copy of the actual config + UA_PubSubConnectionConfig_copy(currentPubSubConnection->config, &tmpPubSubConnectionConfig); + *config = tmpPubSubConnectionConfig; + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_97_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2011) -); +UA_PubSubConnection * +UA_PubSubConnection_findConnectionbyId(UA_Server *server, UA_NodeId connectionIdentifier) { + for(size_t i = 0; i < server->pubSubManager.connectionsSize; i++){ + if(UA_NodeId_equal(&connectionIdentifier, &server->pubSubManager.connections[i].identifier)){ + return &server->pubSubManager.connections[i]; + } + } + return NULL; } -/* ServerStatusType - ns=0;i=2138 */ +void +UA_PubSubConnectionConfig_deleteMembers(UA_PubSubConnectionConfig *connectionConfig) { + UA_String_deleteMembers(&connectionConfig->name); + UA_String_deleteMembers(&connectionConfig->transportProfileUri); + UA_Variant_deleteMembers(&connectionConfig->connectionTransportSettings); + UA_Variant_deleteMembers(&connectionConfig->address); + for(size_t i = 0; i < connectionConfig->connectionPropertiesSize; i++){ + UA_QualifiedName_deleteMembers(&connectionConfig->connectionProperties[i].key); + UA_Variant_deleteMembers(&connectionConfig->connectionProperties[i].value); + } + UA_free(connectionConfig->connectionProperties); +} -static UA_StatusCode function_ua_namespace0_98_begin(UA_Server *server, UA_UInt16* ns) { +void +UA_PubSubConnection_deleteMembers(UA_Server *server, UA_PubSubConnection *connection) { + //delete connection config + UA_PubSubConnectionConfig_deleteMembers(connection->config); + //remove contained WriterGroups + UA_WriterGroup *writerGroup, *tmpWriterGroup; + LIST_FOREACH_SAFE(writerGroup, &connection->writerGroups, listEntry, tmpWriterGroup){ + UA_Server_removeWriterGroup(server, writerGroup->identifier); + } + /* remove contained ReaderGroups */ + UA_ReaderGroup *readerGroups, *tmpReaderGroup; + LIST_FOREACH_SAFE(readerGroups, &connection->readerGroups, listEntry, tmpReaderGroup){ + UA_Server_removeReaderGroup(server, readerGroups->identifier); + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default; -attr.valueRank = (UA_Int32)-2; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 24); -attr.displayName = UA_LOCALIZEDTEXT("", "ServerStatusType"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE, -UA_NODEID_NUMERIC(ns[0], 2138), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerStatusType"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2138), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 63), false); -return retVal; + UA_NodeId_deleteMembers(&connection->identifier); + if(connection->channel){ + connection->channel->close(connection->channel); + } + UA_free(connection->config); } -static UA_StatusCode function_ua_namespace0_98_finish(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode +UA_Server_addWriterGroup(UA_Server *server, const UA_NodeId connection, + const UA_WriterGroupConfig *writerGroupConfig, + UA_NodeId *writerGroupIdentifier) { + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + if(!writerGroupConfig) + return UA_STATUSCODE_BADINVALIDARGUMENT; + //search the connection by the given connectionIdentifier + UA_PubSubConnection *currentConnectionContext = + UA_PubSubConnection_findConnectionbyId(server, connection); + if(!currentConnectionContext) + return UA_STATUSCODE_BADNOTFOUND; + + //allocate memory for new WriterGroup + UA_WriterGroup *newWriterGroup = (UA_WriterGroup *) UA_calloc(1, sizeof(UA_WriterGroup)); + if(!newWriterGroup) + return UA_STATUSCODE_BADOUTOFMEMORY; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2138) -); -} + newWriterGroup->linkedConnection = currentConnectionContext->identifier; + UA_PubSubManager_generateUniqueNodeId(server, &newWriterGroup->identifier); + if(writerGroupIdentifier){ + UA_NodeId_copy(&newWriterGroup->identifier, writerGroupIdentifier); + } -/* ServerStatus - ns=0;i=2256 */ + //deep copy of the config + UA_WriterGroupConfig tmpWriterGroupConfig; + retVal |= UA_WriterGroupConfig_copy(writerGroupConfig, &tmpWriterGroupConfig); -static UA_StatusCode function_ua_namespace0_99_begin(UA_Server *server, UA_UInt16* ns) { + if(!tmpWriterGroupConfig.messageSettings.content.decoded.type) { + UA_UadpWriterGroupMessageDataType *wgm = UA_UadpWriterGroupMessageDataType_new(); + tmpWriterGroupConfig.messageSettings.content.decoded.data = wgm; + tmpWriterGroupConfig.messageSettings.content.decoded.type = + &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE]; + tmpWriterGroupConfig.messageSettings.encoding = UA_EXTENSIONOBJECT_DECODED; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 1000.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 862); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]); -attr.displayName = UA_LOCALIZEDTEXT("", "ServerStatus"); -attr.description = UA_LOCALIZEDTEXT("", "The current status of the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2256), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerStatus"), -UA_NODEID_NUMERIC(ns[0], 2138), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2256), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2253), false); -return retVal; + newWriterGroup->config = tmpWriterGroupConfig; + retVal |= UA_WriterGroup_addPublishCallback(server, newWriterGroup); + LIST_INSERT_HEAD(¤tConnectionContext->writerGroups, newWriterGroup, listEntry); +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL + addWriterGroupRepresentation(server, newWriterGroup); +#endif + return retVal; } -static UA_StatusCode function_ua_namespace0_99_finish(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode +UA_Server_removeWriterGroup(UA_Server *server, const UA_NodeId writerGroup){ + UA_WriterGroup *wg = UA_WriterGroup_findWGbyId(server, writerGroup); + if(!wg) + return UA_STATUSCODE_BADNOTFOUND; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2256) -); + UA_PubSubConnection *connection = + UA_PubSubConnection_findConnectionbyId(server, wg->linkedConnection); + if(!connection) + return UA_STATUSCODE_BADNOTFOUND; + + //unregister the publish callback + UA_PubSubManager_removeRepeatedPubSubCallback(server, wg->publishCallbackId); +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL + removeGroupRepresentation(server, wg); +#endif + + UA_WriterGroup_deleteMembers(server, wg); + LIST_REMOVE(wg, listEntry); + UA_free(wg); + return UA_STATUSCODE_GOOD; } -/* State - ns=0;i=2259 */ +/**********************************************/ +/* ReaderGroup */ +/**********************************************/ -static UA_StatusCode function_ua_namespace0_100_begin(UA_Server *server, UA_UInt16* ns) { +/** + * Add ReaderGroup to connection. + * + * @param server + * @param connectionIdentifier + * @param readerGroupConfiguration + * @param readerGroupIdentifier + * @return UA_STATUSCODE_GOOD on success + */ +UA_StatusCode +UA_Server_addReaderGroup(UA_Server *server, UA_NodeId connectionIdentifier, + const UA_ReaderGroupConfig *readerGroupConfig, + UA_NodeId *readerGroupIdentifier) { + UA_StatusCode retval = UA_STATUSCODE_GOOD; + UA_ReaderGroupConfig tmpReaderGroupConfig; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 852); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_SERVERSTATE]); -attr.displayName = UA_LOCALIZEDTEXT("", "State"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2259), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "State"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2259), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2256), false); -return retVal; -} + /* Search the connection by the given connectionIdentifier */ + if(!readerGroupConfig) { + return UA_STATUSCODE_BADINVALIDARGUMENT; + } -static UA_StatusCode function_ua_namespace0_100_finish(UA_Server *server, UA_UInt16* ns) { + /* Search the connection by the given connectionIdentifier */ + UA_PubSubConnection *currentConnectionContext = UA_PubSubConnection_findConnectionbyId(server, connectionIdentifier); + if(!currentConnectionContext) { + return UA_STATUSCODE_BADNOTFOUND; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2259) -); -} + /* Allocate memory for new reader group */ + UA_ReaderGroup *newGroup = (UA_ReaderGroup *)UA_calloc(1, sizeof(UA_ReaderGroup)); + if(!newGroup) { + return UA_STATUSCODE_BADOUTOFMEMORY; + } -/* CurrentTime - ns=0;i=2258 */ + /* Generate nodeid for the readergroup identifier */ + newGroup->linkedConnection = currentConnectionContext->identifier; + UA_PubSubManager_generateUniqueNodeId(server, &newGroup->identifier); + if(readerGroupIdentifier) { + UA_NodeId_copy(&newGroup->identifier, readerGroupIdentifier); + } -static UA_StatusCode function_ua_namespace0_101_begin(UA_Server *server, UA_UInt16* ns) { + /* Deep copy of the config */ + retval |= UA_ReaderGroupConfig_copy(readerGroupConfig, &tmpReaderGroupConfig); + newGroup->config = tmpReaderGroupConfig; + retval |= UA_ReaderGroup_addSubscribeCallback(server, newGroup); + LIST_INSERT_HEAD(¤tConnectionContext->readerGroups, newGroup, listEntry); + currentConnectionContext->readerGroupsSize++; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 294); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_DATETIME]); -attr.displayName = UA_LOCALIZEDTEXT("", "CurrentTime"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2258), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "CurrentTime"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2258), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2256), false); -return retVal; +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL + addReaderGroupRepresentation(server, newGroup); +#endif + + return retval; } -static UA_StatusCode function_ua_namespace0_101_finish(UA_Server *server, UA_UInt16* ns) { +/** + * Remove ReaderGroup from connection and delete contained readers. + * + * @param server + * @param groupIdentifier + * @return UA_STATUSCODE_GOOD on success + */ +UA_StatusCode +UA_Server_removeReaderGroup(UA_Server *server, UA_NodeId groupIdentifier) { + UA_ReaderGroup* readerGroup = UA_ReaderGroup_findRGbyId(server, groupIdentifier); + if(readerGroup == NULL) { + return UA_STATUSCODE_BADNOTFOUND; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2258) -); -} + /* Search the connection to which the given readergroup is connected to */ + UA_PubSubConnection *connection = UA_PubSubConnection_findConnectionbyId(server, readerGroup->linkedConnection); + if(connection == NULL) { + return UA_STATUSCODE_BADNOTFOUND; + } -/* StartTime - ns=0;i=2257 */ + /* Unregister subscribe callback */ + UA_PubSubManager_removeRepeatedPubSubCallback(server, readerGroup->subscribeCallbackId); +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL + /* To Do:RemoveGroupRepresentation(server, &readerGroup->identifier) */ +#endif -static UA_StatusCode function_ua_namespace0_102_begin(UA_Server *server, UA_UInt16* ns) { + /* UA_Server_ReaderGroup_delete also removes itself from the list */ + UA_Server_ReaderGroup_delete(server, readerGroup); + /* Remove readerGroup from Connection */ + LIST_REMOVE(readerGroup, listEntry); + UA_free(readerGroup); + return UA_STATUSCODE_GOOD; +} -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 294); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_DATETIME]); -attr.displayName = UA_LOCALIZEDTEXT("", "StartTime"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2257), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "StartTime"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2257), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2256), false); -return retVal; +/** + * To Do: + * Update ReaderGroup configuration. + * + * @param server + * @param readerGroupIdentifier + * @param readerGroupConfiguration + * @return UA_STATUSCODE_GOOD on success + */ +UA_StatusCode +UA_Server_ReaderGroup_updateConfig(UA_Server *server, UA_NodeId readerGroupIdentifier, + const UA_ReaderGroupConfig *config) { + return UA_STATUSCODE_BADNOTIMPLEMENTED; } -static UA_StatusCode function_ua_namespace0_102_finish(UA_Server *server, UA_UInt16* ns) { +/** + * Get ReaderGroup configuration. + * + * @param server + * @param groupIdentifier + * @param readerGroupConfiguration + * @return UA_STATUSCODE_GOOD on success + */ +UA_StatusCode +UA_Server_ReaderGroup_getConfig(UA_Server *server, UA_NodeId readerGroupIdentifier, + UA_ReaderGroupConfig *config) { + if(!config) { + return UA_STATUSCODE_BADINVALIDARGUMENT; + } + + /* Identify the readergroup through the readerGroupIdentifier */ + UA_ReaderGroup *currentReaderGroup = UA_ReaderGroup_findRGbyId(server, readerGroupIdentifier); + if(!currentReaderGroup) { + return UA_STATUSCODE_BADNOTFOUND; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2257) -); + UA_ReaderGroupConfig tmpReaderGroupConfig; + /* deep copy of the actual config */ + UA_ReaderGroupConfig_copy(¤tReaderGroup->config, &tmpReaderGroupConfig); + *config = tmpReaderGroupConfig; + return UA_STATUSCODE_GOOD; } -/* BuildInfo - ns=0;i=2260 */ +/* To Do UA_ReaderGroupConfig delete */ -static UA_StatusCode function_ua_namespace0_103_begin(UA_Server *server, UA_UInt16* ns) { +/** + * Delete ReaderGroup. + * + * @param server + * @param groupIdentifier + */ +void UA_Server_ReaderGroup_delete(UA_Server* server, UA_ReaderGroup *readerGroup) { + /* To Do Call UA_ReaderGroupConfig_delete */ + UA_DataSetReader *dataSetReader, *tmpDataSetReader; + LIST_FOREACH_SAFE(dataSetReader, &readerGroup->readers, listEntry, tmpDataSetReader) { + UA_DataSetReader_delete(server, dataSetReader); + } + UA_PubSubConnection* pConn = UA_PubSubConnection_findConnectionbyId(server, readerGroup->linkedConnection); + if(pConn != NULL) { + pConn->readerGroupsSize--; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 338); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_BUILDINFO]); -attr.displayName = UA_LOCALIZEDTEXT("", "BuildInfo"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2260), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "BuildInfo"), -UA_NODEID_NUMERIC(ns[0], 3051), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2260), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2256), false); -return retVal; + /* Delete ReaderGroup and its members */ + UA_String_deleteMembers(&readerGroup->config.name); + UA_NodeId_deleteMembers(&readerGroup->linkedConnection); + UA_NodeId_deleteMembers(&readerGroup->identifier); } -static UA_StatusCode function_ua_namespace0_103_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2260) -); +/** + * Copy ReaderGroup configuration. + * + * @param source + * @param destination + * @return UA_STATUSCODE_GOOD on success + */ +UA_StatusCode +UA_ReaderGroupConfig_copy(const UA_ReaderGroupConfig *src, + UA_ReaderGroupConfig *dst) { + UA_String_copy(&src->name, &dst->name); + /* Currently simple memcpy only */ + memcpy(&dst->securityParameters, &src->securityParameters, sizeof(UA_PubSubSecurityParameters)); + return UA_STATUSCODE_GOOD; } -/* BuildDate - ns=0;i=2266 */ -static UA_StatusCode function_ua_namespace0_104_begin(UA_Server *server, UA_UInt16* ns) { +static UA_DataSetReader * +getReaderFromIdentifier(UA_Server *server, UA_NetworkMessage *pMsg, UA_PubSubConnection *pConnection) { + if(pConnection->readerGroupsSize == 1) { + if(LIST_FIRST(&pConnection->readerGroups)->readersCount == 1) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "only 1 DataSetReader available. This one will be used."); + return LIST_FIRST(&LIST_FIRST(&pConnection->readerGroups)->readers); + } + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 1000.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 294); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_DATETIME]); -attr.displayName = UA_LOCALIZEDTEXT("", "BuildDate"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2266), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "BuildDate"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2266), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2260), false); -return retVal; -} + if(!pMsg->publisherIdEnabled) + return NULL; -static UA_StatusCode function_ua_namespace0_104_finish(UA_Server *server, UA_UInt16* ns) { + UA_ReaderGroup* readerGroup; + LIST_FOREACH(readerGroup, &pConnection->readerGroups, listEntry) { + UA_DataSetReader *tmpReader; + LIST_FOREACH(tmpReader, &readerGroup->readers, listEntry) { + switch (pMsg->publisherIdType) { + case UA_PUBLISHERDATATYPE_BYTE: + if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_BYTE] && + pMsg->publisherIdType == UA_PUBLISHERDATATYPE_BYTE && + pMsg->publisherId.publisherIdByte == *(UA_Byte*)tmpReader->config.publisherId.data) { + return tmpReader; + } + break; + case UA_PUBLISHERDATATYPE_UINT16: + if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_UINT16] && + pMsg->publisherIdType == UA_PUBLISHERDATATYPE_UINT16 && + pMsg->publisherId.publisherIdUInt16 == *(UA_UInt16*)tmpReader->config.publisherId.data) { + return tmpReader; + } + break; + case UA_PUBLISHERDATATYPE_UINT32: + if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_UINT32] && + pMsg->publisherIdType == UA_PUBLISHERDATATYPE_UINT32 && + pMsg->publisherId.publisherIdUInt32 == *(UA_UInt32*)tmpReader->config.publisherId.data) { + return tmpReader; + } + break; + case UA_PUBLISHERDATATYPE_UINT64: + if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_UINT64] && + pMsg->publisherIdType == UA_PUBLISHERDATATYPE_UINT64 && + pMsg->publisherId.publisherIdUInt64 == *(UA_UInt64*)tmpReader->config.publisherId.data) { + return tmpReader; + } + break; + case UA_PUBLISHERDATATYPE_STRING: + if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_STRING] && + pMsg->publisherIdType == UA_PUBLISHERDATATYPE_STRING && + UA_String_equal(&pMsg->publisherId.publisherIdString, (UA_String*)tmpReader->config.publisherId.data)) { + return tmpReader; + } + break; + default: + return NULL; + } + } + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2266) -); + return NULL; } -/* BuildNumber - ns=0;i=2265 */ +/** + * Process NetworkMessage. + * + * @param server + * @param networkmessage + * @return UA_STATUSCODE_GOOD on success + */ +UA_StatusCode +UA_Server_processNetworkMessage(UA_Server *server, UA_NetworkMessage *pMsg, + UA_PubSubConnection *pConnection) { + if(!pMsg || !pConnection) + return UA_STATUSCODE_BADINVALIDARGUMENT; -static UA_StatusCode function_ua_namespace0_105_begin(UA_Server *server, UA_UInt16* ns) { + /* To Do The condition with dataSetWriterIdAvailable and WriterGroupIdAvailable to be handled + * when pMsg->groupHeaderEnabled, pMsg->dataSetClassIdEnabled, pMsg->payloadHeaderEnabled + * Here some filtering is possible */ -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 1000.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "BuildNumber"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2265), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "BuildNumber"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2265), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2260), false); -return retVal; -} + UA_DataSetReader* dataSetReaderErg = getReaderFromIdentifier(server, pMsg, pConnection); -static UA_StatusCode function_ua_namespace0_105_finish(UA_Server *server, UA_UInt16* ns) { + /* No Reader with the specified id found */ + if(!dataSetReaderErg) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "No DataSetReader found with PublisherId"); + return UA_STATUSCODE_BADNOTFOUND; /* TODO: Check the return code */ + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2265) -); -} + UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, "DataSetReader found with PublisherId"); -/* SoftwareVersion - ns=0;i=2264 */ + UA_Byte anzDataSets = 1; + if(pMsg->payloadHeaderEnabled) + anzDataSets = pMsg->payloadHeader.dataSetPayloadHeader.count; + for(UA_Byte iterator = 0; iterator < anzDataSets; iterator++) { + UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, "Process Msg with DataSetReader!"); + UA_Server_DataSetReader_process(server, dataSetReaderErg, &pMsg->payload.dataSetPayload.dataSetMessages[iterator]); + } -static UA_StatusCode function_ua_namespace0_106_begin(UA_Server *server, UA_UInt16* ns) { + /* To Do the condition with dataSetWriterId and WriterGroupId + * else condition for dataSetWriterIdAvailable and writerGroupIdAvailable) */ -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 1000.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "SoftwareVersion"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2264), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "SoftwareVersion"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2264), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2260), false); -return retVal; + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_106_finish(UA_Server *server, UA_UInt16* ns) { +/** + * Find ReaderGroup with its identifier. + * + * @param server + * @param groupIdentifier + * @return the ReaderGroup or NULL if not found + */ +UA_ReaderGroup * UA_ReaderGroup_findRGbyId(UA_Server *server, UA_NodeId identifier) { + for (size_t iteratorConn = 0; iteratorConn < server->pubSubManager.connectionsSize; iteratorConn++) { + UA_ReaderGroup* readerGroup = NULL; + LIST_FOREACH(readerGroup, &server->pubSubManager.connections[iteratorConn].readerGroups, listEntry) { + if(UA_NodeId_equal(&identifier, &readerGroup->identifier)) { + return readerGroup; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2264) -); + } + } + return NULL; } -/* ManufacturerName - ns=0;i=2263 */ - -static UA_StatusCode function_ua_namespace0_107_begin(UA_Server *server, UA_UInt16* ns) { +/** + * Find a DataSetReader with its identifier + * + * @param server + * @param identifier + * @return the DataSetReader or NULL if not found + */ +UA_DataSetReader *UA_ReaderGroup_findDSRbyId(UA_Server *server, UA_NodeId identifier) { + for (size_t iteratorConn = 0; iteratorConn < server->pubSubManager.connectionsSize; iteratorConn++) { + UA_ReaderGroup* readerGroup = NULL; + LIST_FOREACH(readerGroup, &server->pubSubManager.connections[iteratorConn].readerGroups, listEntry) { + UA_DataSetReader *tmpReader; + LIST_FOREACH(tmpReader, &readerGroup->readers, listEntry) { + if(UA_NodeId_equal(&tmpReader->identifier, &identifier)) { + return tmpReader; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 1000.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "ManufacturerName"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2263), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ManufacturerName"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2263), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2260), false); -return retVal; + } + } + } + return NULL; } -static UA_StatusCode function_ua_namespace0_107_finish(UA_Server *server, UA_UInt16* ns) { +/**********************************************/ +/* DataSetReader */ +/**********************************************/ -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2263) -); -} +/** + * Add a DataSetReader to ReaderGroup + * + * @param server + * @param readerGroupIdentifier + * @param dataSetReaderConfig + * @param readerIdentifier + * @return UA_STATUSCODE_GOOD on success + */ +UA_StatusCode +UA_Server_addDataSetReader(UA_Server *server, UA_NodeId readerGroupIdentifier, + const UA_DataSetReaderConfig *dataSetReaderConfig, + UA_NodeId *readerIdentifier) { + /* Search the reader group by the given readerGroupIdentifier */ + UA_ReaderGroup *readerGroup = UA_ReaderGroup_findRGbyId(server, readerGroupIdentifier); -/* ProductUri - ns=0;i=2262 */ + if(!dataSetReaderConfig) { + return UA_STATUSCODE_BADNOTFOUND; + } -static UA_StatusCode function_ua_namespace0_108_begin(UA_Server *server, UA_UInt16* ns) { + if(readerGroup == NULL) { + return UA_STATUSCODE_BADNOTFOUND; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 1000.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "ProductUri"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2262), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ProductUri"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2262), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2260), false); -return retVal; -} + /* Allocate memory for new DataSetReader */ + UA_DataSetReader *newDataSetReader = (UA_DataSetReader *)UA_calloc(1, sizeof(UA_DataSetReader)); + /* Copy the config into the new dataSetReader */ + UA_DataSetReaderConfig_copy(dataSetReaderConfig, &newDataSetReader->config); + newDataSetReader->linkedReaderGroup = readerGroup->identifier; + UA_PubSubManager_generateUniqueNodeId(server, &newDataSetReader->identifier); + if(readerIdentifier != NULL) { + UA_NodeId_copy(&newDataSetReader->identifier, readerIdentifier); + } -static UA_StatusCode function_ua_namespace0_108_finish(UA_Server *server, UA_UInt16* ns) { + /* Add the new reader to the group */ + LIST_INSERT_HEAD(&readerGroup->readers, newDataSetReader, listEntry); + readerGroup->readersCount++; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2262) -); +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL + addDataSetReaderRepresentation(server, newDataSetReader); +#endif + + return UA_STATUSCODE_GOOD; } -/* ProductName - ns=0;i=2261 */ +/** + * Remove a DataSetReader from ReaderGroup + * + * @param server + * @param readerGroupIdentifier + * @return UA_STATUSCODE_GOOD on success + */ +UA_StatusCode +UA_Server_removeDataSetReader(UA_Server *server, UA_NodeId readerIdentifier) { + /* Remove datasetreader given by the identifier */ + UA_DataSetReader *dataSetReader = UA_ReaderGroup_findDSRbyId(server, readerIdentifier); + if(!dataSetReader) { + return UA_STATUSCODE_BADNOTFOUND; + } -static UA_StatusCode function_ua_namespace0_109_begin(UA_Server *server, UA_UInt16* ns) { +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL + removeDataSetReaderRepresentation(server, dataSetReader); +#endif -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 1000.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_STRING]); -attr.displayName = UA_LOCALIZEDTEXT("", "ProductName"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2261), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ProductName"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2261), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2260), false); -return retVal; + UA_DataSetReader_delete(server, dataSetReader); + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_109_finish(UA_Server *server, UA_UInt16* ns) { +/** + * Update the config of the DataSetReader. + * + * @param server + * @param dataSetReaderIdentifier + * @param readerGroupIdentifier + * @param config + * @return UA_STATUSCODE_GOOD on success + */ +UA_StatusCode +UA_Server_DataSetReader_updateConfig(UA_Server *server, UA_NodeId dataSetReaderIdentifier, UA_NodeId readerGroupIdentifier, + const UA_DataSetReaderConfig *config) { + if(config == NULL) { + return UA_STATUSCODE_BADINVALIDARGUMENT; + } + + UA_DataSetReader *currentDataSetReader = UA_ReaderGroup_findDSRbyId(server, dataSetReaderIdentifier); + UA_ReaderGroup *currentReaderGroup = UA_ReaderGroup_findRGbyId(server, readerGroupIdentifier); + if(!currentDataSetReader) { + return UA_STATUSCODE_BADNOTFOUND; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2261) -); + /* The update functionality will be extended during the next PubSub batches. + * Currently is only a change of the publishing interval possible. */ + if(currentDataSetReader->config.writerGroupId != config->writerGroupId) { + UA_PubSubManager_removeRepeatedPubSubCallback(server, currentReaderGroup->subscribeCallbackId); + currentDataSetReader->config.writerGroupId = config->writerGroupId; + UA_ReaderGroup_subscribeCallback(server, currentReaderGroup); + } + else { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "No or unsupported ReaderGroup update."); + } + + return UA_STATUSCODE_GOOD; } -/* SecondsTillShutdown - ns=0;i=2992 */ +/** + * Get the current config of the UA_DataSetReader. + * + * @param server + * @param dataSetReaderIdentifier + * @param config + * @return UA_STATUSCODE_GOOD on success + */ +UA_StatusCode +UA_Server_DataSetReader_getConfig(UA_Server *server, UA_NodeId dataSetReaderIdentifier, + UA_DataSetReaderConfig *config) { + if(!config) { + return UA_STATUSCODE_BADINVALIDARGUMENT; + } -static UA_StatusCode function_ua_namespace0_110_begin(UA_Server *server, UA_UInt16* ns) { + UA_DataSetReader *currentDataSetReader = UA_ReaderGroup_findDSRbyId(server, dataSetReaderIdentifier); + if(!currentDataSetReader) { + return UA_STATUSCODE_BADNOTFOUND; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "SecondsTillShutdown"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2992), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "SecondsTillShutdown"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2992), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2256), false); -return retVal; + UA_DataSetReaderConfig tmpReaderConfig; + /* Deep copy of the actual config */ + UA_DataSetReaderConfig_copy(¤tDataSetReader->config, &tmpReaderConfig); + *config = tmpReaderConfig; + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_110_finish(UA_Server *server, UA_UInt16* ns) { +/** + * This Method is used to initially set the SubscribedDataSet to TargetVariablesType and to create the list of target Variables of a SubscribedDataSetType. + * + * @param server + * @param dataSetReaderIdentifier + * @param targetVariables + * @return UA_STATUSCODE_GOOD on success + */ +UA_StatusCode +UA_Server_DataSetReader_createTargetVariables(UA_Server *server, UA_NodeId dataSetReaderIdentifier, UA_TargetVariablesDataType *targetVariables) { + UA_StatusCode retval = UA_STATUSCODE_BADUNEXPECTEDERROR; + UA_DataSetReader* pDS = UA_ReaderGroup_findDSRbyId(server, dataSetReaderIdentifier); + if(pDS == NULL) { + return UA_STATUSCODE_BADINVALIDARGUMENT; + } + + if(pDS->subscribedDataSetTarget.targetVariablesSize > 0) { + UA_TargetVariablesDataType_deleteMembers(&pDS->subscribedDataSetTarget); + pDS->subscribedDataSetTarget.targetVariablesSize = 0; + pDS->subscribedDataSetTarget.targetVariables = NULL; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2992) -); + /* Set subscribed dataset to TargetVariableType */ + pDS->subscribedDataSetType = UA_PUBSUB_SDS_TARGET; + retval = UA_TargetVariablesDataType_copy(targetVariables, &pDS->subscribedDataSetTarget); + return retval; } -/* ShutdownReason - ns=0;i=2993 */ +/** + * Adds Subscribed Variables from the DataSetMetaData for the given DataSet into the given parent node + * and creates the corresponding data in the targetVariables of the DataSetReader + * + * @param server + * @param parentNode + * @param dataSetReaderIdentifier + * @return UA_STATUSCODE_GOOD on success + */ +UA_StatusCode UA_Server_DataSetReader_addTargetVariables(UA_Server *server, UA_NodeId *parentNode, UA_NodeId dataSetReaderIdentifier, UA_SubscribedDataSetEnumType sdsType) { + if((server == NULL) || (parentNode == NULL)) { + return UA_STATUSCODE_BADINVALIDARGUMENT; + } -static UA_StatusCode function_ua_namespace0_111_begin(UA_Server *server, UA_UInt16* ns) { + UA_StatusCode retval = UA_STATUSCODE_GOOD; + UA_DataSetReader* pDataSetReader = UA_ReaderGroup_findDSRbyId(server, dataSetReaderIdentifier); + if(pDataSetReader == NULL) { + return UA_STATUSCODE_BADINVALIDARGUMENT; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 21); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); -attr.displayName = UA_LOCALIZEDTEXT("", "ShutdownReason"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2993), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ShutdownReason"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2993), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2256), false); -return retVal; -} + UA_TargetVariablesDataType targetVars; + targetVars.targetVariablesSize = pDataSetReader->config.dataSetMetaData.fieldsSize; + targetVars.targetVariables = (UA_FieldTargetDataType *)UA_calloc(targetVars.targetVariablesSize, sizeof(UA_FieldTargetDataType)); + for (size_t iteratorField = 0; iteratorField < pDataSetReader->config.dataSetMetaData.fieldsSize; iteratorField++) { + UA_VariableAttributes vAttr = UA_VariableAttributes_default; + vAttr.valueRank = pDataSetReader->config.dataSetMetaData.fields[iteratorField].valueRank; + if(pDataSetReader->config.dataSetMetaData.fields[iteratorField].arrayDimensionsSize > 0) { + retval = UA_Array_copy(pDataSetReader->config.dataSetMetaData.fields[iteratorField].arrayDimensions, pDataSetReader->config.dataSetMetaData.fields[iteratorField].arrayDimensionsSize, (void**)&vAttr.arrayDimensions, &UA_TYPES[UA_TYPES_UINT32]); + if(retval == UA_STATUSCODE_GOOD) { + vAttr.arrayDimensionsSize = pDataSetReader->config.dataSetMetaData.fields[iteratorField].arrayDimensionsSize; + } -static UA_StatusCode function_ua_namespace0_111_finish(UA_Server *server, UA_UInt16* ns) { + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2993) -); -} + vAttr.dataType = pDataSetReader->config.dataSetMetaData.fields[iteratorField].dataType; + + vAttr.accessLevel = UA_ACCESSLEVELMASK_READ; + UA_LocalizedText_copy(&pDataSetReader->config.dataSetMetaData.fields[iteratorField].description, &vAttr.description); + UA_QualifiedName qn; + UA_QualifiedName_init(&qn); + char szTmpName[UA_MAX_SIZENAME]; + if(pDataSetReader->config.dataSetMetaData.fields[iteratorField].name.length > 0) { + UA_UInt16 slen = UA_MAX_SIZENAME -1; + vAttr.displayName.locale = UA_STRING("en-US"); + vAttr.displayName.text = pDataSetReader->config.dataSetMetaData.fields[iteratorField].name; + if(pDataSetReader->config.dataSetMetaData.fields[iteratorField].name.length < slen) { + slen = (UA_UInt16)pDataSetReader->config.dataSetMetaData.fields[iteratorField].name.length; + UA_snprintf(szTmpName, sizeof(szTmpName), "%.*s", (int)slen, (const char*)pDataSetReader->config.dataSetMetaData.fields[iteratorField].name.data); + } -/* Argument - ns=0;i=296 */ + szTmpName[slen] = '\0'; + qn = UA_QUALIFIEDNAME(1, szTmpName); + } + else { + strcpy(szTmpName, "SubscribedVariable"); + vAttr.displayName = UA_LOCALIZEDTEXT("en-US", szTmpName); + qn = UA_QUALIFIEDNAME(1, "SubscribedVariable"); + } -static UA_StatusCode function_ua_namespace0_112_begin(UA_Server *server, UA_UInt16* ns) { + /* Add variable to the given parent node */ + UA_NodeId newNode; + retval = UA_Server_addVariableNode(server, UA_NODEID_NULL, *parentNode, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), qn, + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), vAttr, NULL, &newNode); + if(retval == UA_STATUSCODE_GOOD) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "addVariableNode %s succeeded", szTmpName); + } + else { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_USERLAND, "addVariableNode: error 0x%x", retval); + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "Argument"); -attr.description = UA_LOCALIZEDTEXT("", "An argument for a method."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, -UA_NODEID_NUMERIC(ns[0], 296), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Argument"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 296), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 22), false); -return retVal; -} + UA_FieldTargetDataType_init(&targetVars.targetVariables[iteratorField]); + targetVars.targetVariables[iteratorField].attributeId = UA_ATTRIBUTEID_VALUE; + UA_NodeId_copy(&newNode, &targetVars.targetVariables[iteratorField].targetNodeId); + UA_NodeId_deleteMembers(&newNode); + if(vAttr.arrayDimensionsSize > 0) { + UA_Array_delete(vAttr.arrayDimensions, vAttr.arrayDimensionsSize, &UA_TYPES[UA_TYPES_UINT32]); + } + } -static UA_StatusCode function_ua_namespace0_112_finish(UA_Server *server, UA_UInt16* ns) { + if(sdsType == UA_PUBSUB_SDS_TARGET) { + retval = UA_Server_DataSetReader_createTargetVariables(server, pDataSetReader->identifier, &targetVars); + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 296) -); + UA_TargetVariablesDataType_deleteMembers(&targetVars); + return retval; } -/* Default Binary - ns=0;i=298 */ +/** + * Process a NetworkMessage with a DataSetReader. + * + * @param server + * @param dataSetReader + * @param dataSetMsg + */ +void UA_Server_DataSetReader_process(UA_Server *server, UA_DataSetReader *dataSetReader, UA_DataSetMessage* dataSetMsg) { + if((dataSetReader == NULL) || (dataSetMsg == NULL) || (server == NULL)) { + return; + } -static UA_StatusCode function_ua_namespace0_113_begin(UA_Server *server, UA_UInt16* ns) { + if(!dataSetMsg->header.dataSetMessageValid) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "DataSetMessage is discarded: message is not valid"); + /* To Do check ConfigurationVersion*/ + /*if(dataSetMsg->header.configVersionMajorVersionEnabled) + * { + * if(dataSetMsg->header.configVersionMajorVersion != dataSetReader->config.dataSetMetaData.configurationVersion.majorVersion) + * { + * UA_LOG_WARNING(server->config.logger, UA_LOGCATEGORY_SERVER, "DataSetMessage is discarded: ConfigurationVersion MajorVersion does not match"); + * return; + * } + } */ + } + else { + if(dataSetMsg->header.dataSetMessageType == UA_DATASETMESSAGE_DATAKEYFRAME) { + if(dataSetMsg->header.fieldEncoding != UA_FIELDENCODING_RAWDATA) { + size_t anzFields = dataSetMsg->data.keyFrameData.fieldCount; + if(dataSetReader->config.dataSetMetaData.fieldsSize < anzFields) { + anzFields = dataSetReader->config.dataSetMetaData.fieldsSize; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "Default Binary"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 298), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Default Binary"), -UA_NODEID_NUMERIC(ns[0], 76), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 298), UA_NODEID_NUMERIC(ns[0], 39), UA_EXPANDEDNODEID_NUMERIC(ns[0], 7650), true); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 298), UA_NODEID_NUMERIC(ns[0], 38), UA_EXPANDEDNODEID_NUMERIC(ns[0], 296), false); -return retVal; -} + if(dataSetReader->subscribedDataSetTarget.targetVariablesSize < anzFields) { + anzFields = dataSetReader->subscribedDataSetTarget.targetVariablesSize; + } -static UA_StatusCode function_ua_namespace0_113_finish(UA_Server *server, UA_UInt16* ns) { + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + for (UA_UInt16 iteratorField = 0; iteratorField < anzFields; iteratorField++) { + if(dataSetMsg->data.keyFrameData.dataSetFields[iteratorField].hasValue) { + if(dataSetReader->subscribedDataSetTarget.targetVariables[iteratorField].attributeId == UA_ATTRIBUTEID_VALUE) { + retVal = UA_Server_writeValue(server, dataSetReader->subscribedDataSetTarget.targetVariables[iteratorField].targetNodeId, dataSetMsg->data.keyFrameData.dataSetFields[iteratorField].value); + if(retVal != UA_STATUSCODE_GOOD) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "Error Write Value KF %u: 0x%x", iteratorField, retVal); + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 298) -); -} + } + else { + UA_WriteValue writeVal; + UA_WriteValue_init(&writeVal); + writeVal.attributeId = dataSetReader->subscribedDataSetTarget.targetVariables[iteratorField].attributeId; + writeVal.indexRange = dataSetReader->subscribedDataSetTarget.targetVariables[iteratorField].receiverIndexRange; + writeVal.nodeId = dataSetReader->subscribedDataSetTarget.targetVariables[iteratorField].targetNodeId; + UA_DataValue_copy(&dataSetMsg->data.keyFrameData.dataSetFields[iteratorField], &writeVal.value); + retVal = UA_Server_write(server, &writeVal); + if(retVal != UA_STATUSCODE_GOOD) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "Error Write KF %u: 0x%x", iteratorField, retVal); + } -/* OutputArguments - ns=0;i=11494 */ + } -static UA_StatusCode function_ua_namespace0_114_begin(UA_Server *server, UA_UInt16* ns) { + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = 1; -attr.arrayDimensionsSize = 1; -attr.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]); -if (!attr.arrayDimensions) return UA_STATUSCODE_BADOUTOFMEMORY; -attr.arrayDimensions[0] = 0; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 296); + } -struct { - UA_String Name; - UA_NodeId DataType; - UA_Int32 ValueRank; - UA_Int32 ArrayDimensionsSize; - UA_UInt32 *ArrayDimensions; - UA_LocalizedText Description; -} variablenode_ns_0_i_11494_Argument_0_0_struct; -UA_ExtensionObject *variablenode_ns_0_i_11494_Argument_0_0 = UA_ExtensionObject_new(); -if (!variablenode_ns_0_i_11494_Argument_0_0) return UA_STATUSCODE_BADOUTOFMEMORY; -variablenode_ns_0_i_11494_Argument_0_0_struct.Name = UA_STRING("ServerHandles"); -variablenode_ns_0_i_11494_Argument_0_0_struct.DataType = UA_NODEID_NUMERIC(ns[0], 7); -variablenode_ns_0_i_11494_Argument_0_0_struct.ValueRank = (UA_Int32) 1; -variablenode_ns_0_i_11494_Argument_0_0_struct.ArrayDimensionsSize = 1; -variablenode_ns_0_i_11494_Argument_0_0_struct.ArrayDimensions = (UA_UInt32*) UA_malloc(sizeof(UA_UInt32)); -if (!variablenode_ns_0_i_11494_Argument_0_0_struct.ArrayDimensions) return UA_STATUSCODE_BADOUTOFMEMORY; -variablenode_ns_0_i_11494_Argument_0_0_struct.ArrayDimensions[0] = (UA_UInt32) 0; -variablenode_ns_0_i_11494_Argument_0_0_struct.Description = UA_LOCALIZEDTEXT("", ""); -variablenode_ns_0_i_11494_Argument_0_0->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING; -variablenode_ns_0_i_11494_Argument_0_0->content.encoded.typeId = UA_NODEID_NUMERIC(0, 298); -retVal |= UA_ByteString_allocBuffer(&variablenode_ns_0_i_11494_Argument_0_0->content.encoded.body, 65000); -UA_Byte *posvariablenode_ns_0_i_11494_Argument_0_0 = variablenode_ns_0_i_11494_Argument_0_0->content.encoded.body.data; -const UA_Byte *endvariablenode_ns_0_i_11494_Argument_0_0 = &variablenode_ns_0_i_11494_Argument_0_0->content.encoded.body.data[65000]; -{ -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11494_Argument_0_0_struct.Name, &UA_TYPES[UA_TYPES_STRING], &posvariablenode_ns_0_i_11494_Argument_0_0, &endvariablenode_ns_0_i_11494_Argument_0_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11494_Argument_0_0_struct.DataType, &UA_TYPES[UA_TYPES_NODEID], &posvariablenode_ns_0_i_11494_Argument_0_0, &endvariablenode_ns_0_i_11494_Argument_0_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11494_Argument_0_0_struct.ValueRank, &UA_TYPES[UA_TYPES_INT32], &posvariablenode_ns_0_i_11494_Argument_0_0, &endvariablenode_ns_0_i_11494_Argument_0_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11494_Argument_0_0_struct.ArrayDimensions[0], &UA_TYPES[UA_TYPES_UINT32], &posvariablenode_ns_0_i_11494_Argument_0_0, &endvariablenode_ns_0_i_11494_Argument_0_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11494_Argument_0_0_struct.Description, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &posvariablenode_ns_0_i_11494_Argument_0_0, &endvariablenode_ns_0_i_11494_Argument_0_0, NULL, NULL); -} -size_t variablenode_ns_0_i_11494_Argument_0_0_encOffset = (uintptr_t)(posvariablenode_ns_0_i_11494_Argument_0_0-variablenode_ns_0_i_11494_Argument_0_0->content.encoded.body.data); -variablenode_ns_0_i_11494_Argument_0_0->content.encoded.body.length = variablenode_ns_0_i_11494_Argument_0_0_encOffset; -UA_Byte *variablenode_ns_0_i_11494_Argument_0_0_newBody = (UA_Byte *) UA_malloc(variablenode_ns_0_i_11494_Argument_0_0_encOffset); -if (!variablenode_ns_0_i_11494_Argument_0_0_newBody) return UA_STATUSCODE_BADOUTOFMEMORY; -memcpy(variablenode_ns_0_i_11494_Argument_0_0_newBody, variablenode_ns_0_i_11494_Argument_0_0->content.encoded.body.data, variablenode_ns_0_i_11494_Argument_0_0_encOffset); -UA_Byte *variablenode_ns_0_i_11494_Argument_0_0_oldBody = variablenode_ns_0_i_11494_Argument_0_0->content.encoded.body.data; -variablenode_ns_0_i_11494_Argument_0_0->content.encoded.body.data = variablenode_ns_0_i_11494_Argument_0_0_newBody; -UA_free(variablenode_ns_0_i_11494_Argument_0_0_oldBody); - - -struct { - UA_String Name; - UA_NodeId DataType; - UA_Int32 ValueRank; - UA_Int32 ArrayDimensionsSize; - UA_UInt32 *ArrayDimensions; - UA_LocalizedText Description; -} variablenode_ns_0_i_11494_Argument_1_0_struct; -UA_ExtensionObject *variablenode_ns_0_i_11494_Argument_1_0 = UA_ExtensionObject_new(); -if (!variablenode_ns_0_i_11494_Argument_1_0) return UA_STATUSCODE_BADOUTOFMEMORY; -variablenode_ns_0_i_11494_Argument_1_0_struct.Name = UA_STRING("ClientHandles"); -variablenode_ns_0_i_11494_Argument_1_0_struct.DataType = UA_NODEID_NUMERIC(ns[0], 7); -variablenode_ns_0_i_11494_Argument_1_0_struct.ValueRank = (UA_Int32) 1; -variablenode_ns_0_i_11494_Argument_1_0_struct.ArrayDimensionsSize = 1; -variablenode_ns_0_i_11494_Argument_1_0_struct.ArrayDimensions = (UA_UInt32*) UA_malloc(sizeof(UA_UInt32)); -if (!variablenode_ns_0_i_11494_Argument_1_0_struct.ArrayDimensions) return UA_STATUSCODE_BADOUTOFMEMORY; -variablenode_ns_0_i_11494_Argument_1_0_struct.ArrayDimensions[0] = (UA_UInt32) 0; -variablenode_ns_0_i_11494_Argument_1_0_struct.Description = UA_LOCALIZEDTEXT("", ""); -variablenode_ns_0_i_11494_Argument_1_0->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING; -variablenode_ns_0_i_11494_Argument_1_0->content.encoded.typeId = UA_NODEID_NUMERIC(0, 298); -retVal |= UA_ByteString_allocBuffer(&variablenode_ns_0_i_11494_Argument_1_0->content.encoded.body, 65000); -UA_Byte *posvariablenode_ns_0_i_11494_Argument_1_0 = variablenode_ns_0_i_11494_Argument_1_0->content.encoded.body.data; -const UA_Byte *endvariablenode_ns_0_i_11494_Argument_1_0 = &variablenode_ns_0_i_11494_Argument_1_0->content.encoded.body.data[65000]; -{ -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11494_Argument_1_0_struct.Name, &UA_TYPES[UA_TYPES_STRING], &posvariablenode_ns_0_i_11494_Argument_1_0, &endvariablenode_ns_0_i_11494_Argument_1_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11494_Argument_1_0_struct.DataType, &UA_TYPES[UA_TYPES_NODEID], &posvariablenode_ns_0_i_11494_Argument_1_0, &endvariablenode_ns_0_i_11494_Argument_1_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11494_Argument_1_0_struct.ValueRank, &UA_TYPES[UA_TYPES_INT32], &posvariablenode_ns_0_i_11494_Argument_1_0, &endvariablenode_ns_0_i_11494_Argument_1_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11494_Argument_1_0_struct.ArrayDimensions[0], &UA_TYPES[UA_TYPES_UINT32], &posvariablenode_ns_0_i_11494_Argument_1_0, &endvariablenode_ns_0_i_11494_Argument_1_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11494_Argument_1_0_struct.Description, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &posvariablenode_ns_0_i_11494_Argument_1_0, &endvariablenode_ns_0_i_11494_Argument_1_0, NULL, NULL); -} -size_t variablenode_ns_0_i_11494_Argument_1_0_encOffset = (uintptr_t)(posvariablenode_ns_0_i_11494_Argument_1_0-variablenode_ns_0_i_11494_Argument_1_0->content.encoded.body.data); -variablenode_ns_0_i_11494_Argument_1_0->content.encoded.body.length = variablenode_ns_0_i_11494_Argument_1_0_encOffset; -UA_Byte *variablenode_ns_0_i_11494_Argument_1_0_newBody = (UA_Byte *) UA_malloc(variablenode_ns_0_i_11494_Argument_1_0_encOffset); -if (!variablenode_ns_0_i_11494_Argument_1_0_newBody) return UA_STATUSCODE_BADOUTOFMEMORY; -memcpy(variablenode_ns_0_i_11494_Argument_1_0_newBody, variablenode_ns_0_i_11494_Argument_1_0->content.encoded.body.data, variablenode_ns_0_i_11494_Argument_1_0_encOffset); -UA_Byte *variablenode_ns_0_i_11494_Argument_1_0_oldBody = variablenode_ns_0_i_11494_Argument_1_0->content.encoded.body.data; -variablenode_ns_0_i_11494_Argument_1_0->content.encoded.body.data = variablenode_ns_0_i_11494_Argument_1_0_newBody; -UA_free(variablenode_ns_0_i_11494_Argument_1_0_oldBody); - -UA_ExtensionObject variablenode_ns_0_i_11494_variant_DataContents[2]; -variablenode_ns_0_i_11494_variant_DataContents[0] = *variablenode_ns_0_i_11494_Argument_0_0; -variablenode_ns_0_i_11494_variant_DataContents[1] = *variablenode_ns_0_i_11494_Argument_1_0; -UA_Variant_setArray(&attr.value, &variablenode_ns_0_i_11494_variant_DataContents, (UA_Int32) 2, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); -attr.displayName = UA_LOCALIZEDTEXT("", "OutputArguments"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11494), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "OutputArguments"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_Array_delete(attr.arrayDimensions, 1, &UA_TYPES[UA_TYPES_UINT32]); + } -UA_ExtensionObject_delete(variablenode_ns_0_i_11494_Argument_0_0); -UA_free(variablenode_ns_0_i_11494_Argument_0_0_struct.ArrayDimensions); + } -UA_ExtensionObject_delete(variablenode_ns_0_i_11494_Argument_1_0); -UA_free(variablenode_ns_0_i_11494_Argument_1_0_struct.ArrayDimensions); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11494), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11492), false); -return retVal; + } } -static UA_StatusCode function_ua_namespace0_114_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11494) -); -} +/** + * Copy the config of the DataSetReader. + * + * @param src + * @param dst + * @return UA_STATUSCODE_GOOD on success + */ +UA_StatusCode +UA_DataSetReaderConfig_copy(const UA_DataSetReaderConfig *src, + UA_DataSetReaderConfig *dst) { + memset(dst, 0, sizeof(UA_DataSetReaderConfig)); + UA_StatusCode retVal = UA_String_copy(&src->name, &dst->name); + if(retVal != UA_STATUSCODE_GOOD) { + return retVal; + } -/* InputArguments - ns=0;i=11493 */ + retVal = UA_Variant_copy(&src->publisherId, &dst->publisherId); + if(retVal != UA_STATUSCODE_GOOD) { + return retVal; + } -static UA_StatusCode function_ua_namespace0_115_begin(UA_Server *server, UA_UInt16* ns) { + dst->writerGroupId = src->writerGroupId; + dst->dataSetWriterId = src->dataSetWriterId; + retVal = UA_DataSetMetaDataType_copy(&src->dataSetMetaData, &dst->dataSetMetaData); + if(retVal != UA_STATUSCODE_GOOD) { + return retVal; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = 1; -attr.arrayDimensionsSize = 1; -attr.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]); -if (!attr.arrayDimensions) return UA_STATUSCODE_BADOUTOFMEMORY; -attr.arrayDimensions[0] = 0; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 296); + dst->dataSetFieldContentMask = src->dataSetFieldContentMask; + dst->messageReceiveTimeout = src->messageReceiveTimeout; -struct { - UA_String Name; - UA_NodeId DataType; - UA_Int32 ValueRank; - UA_Int32 ArrayDimensionsSize; - UA_UInt32 *ArrayDimensions; - UA_LocalizedText Description; -} variablenode_ns_0_i_11493_Argument_0_0_struct; -UA_ExtensionObject *variablenode_ns_0_i_11493_Argument_0_0 = UA_ExtensionObject_new(); -if (!variablenode_ns_0_i_11493_Argument_0_0) return UA_STATUSCODE_BADOUTOFMEMORY; -variablenode_ns_0_i_11493_Argument_0_0_struct.Name = UA_STRING("SubscriptionId"); -variablenode_ns_0_i_11493_Argument_0_0_struct.DataType = UA_NODEID_NUMERIC(ns[0], 7); -variablenode_ns_0_i_11493_Argument_0_0_struct.ValueRank = (UA_Int32) -1; -variablenode_ns_0_i_11493_Argument_0_0_struct.ArrayDimensionsSize = 1; -variablenode_ns_0_i_11493_Argument_0_0_struct.ArrayDimensions = (UA_UInt32*) UA_malloc(sizeof(UA_UInt32)); -if (!variablenode_ns_0_i_11493_Argument_0_0_struct.ArrayDimensions) return UA_STATUSCODE_BADOUTOFMEMORY; -variablenode_ns_0_i_11493_Argument_0_0_struct.ArrayDimensions[0] = (UA_UInt32) 0; -variablenode_ns_0_i_11493_Argument_0_0_struct.Description = UA_LOCALIZEDTEXT("", ""); -variablenode_ns_0_i_11493_Argument_0_0->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING; -variablenode_ns_0_i_11493_Argument_0_0->content.encoded.typeId = UA_NODEID_NUMERIC(0, 298); -retVal |= UA_ByteString_allocBuffer(&variablenode_ns_0_i_11493_Argument_0_0->content.encoded.body, 65000); -UA_Byte *posvariablenode_ns_0_i_11493_Argument_0_0 = variablenode_ns_0_i_11493_Argument_0_0->content.encoded.body.data; -const UA_Byte *endvariablenode_ns_0_i_11493_Argument_0_0 = &variablenode_ns_0_i_11493_Argument_0_0->content.encoded.body.data[65000]; -{ -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11493_Argument_0_0_struct.Name, &UA_TYPES[UA_TYPES_STRING], &posvariablenode_ns_0_i_11493_Argument_0_0, &endvariablenode_ns_0_i_11493_Argument_0_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11493_Argument_0_0_struct.DataType, &UA_TYPES[UA_TYPES_NODEID], &posvariablenode_ns_0_i_11493_Argument_0_0, &endvariablenode_ns_0_i_11493_Argument_0_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11493_Argument_0_0_struct.ValueRank, &UA_TYPES[UA_TYPES_INT32], &posvariablenode_ns_0_i_11493_Argument_0_0, &endvariablenode_ns_0_i_11493_Argument_0_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11493_Argument_0_0_struct.ArrayDimensions[0], &UA_TYPES[UA_TYPES_UINT32], &posvariablenode_ns_0_i_11493_Argument_0_0, &endvariablenode_ns_0_i_11493_Argument_0_0, NULL, NULL); -retVal |= UA_encodeBinary(&variablenode_ns_0_i_11493_Argument_0_0_struct.Description, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &posvariablenode_ns_0_i_11493_Argument_0_0, &endvariablenode_ns_0_i_11493_Argument_0_0, NULL, NULL); -} -size_t variablenode_ns_0_i_11493_Argument_0_0_encOffset = (uintptr_t)(posvariablenode_ns_0_i_11493_Argument_0_0-variablenode_ns_0_i_11493_Argument_0_0->content.encoded.body.data); -variablenode_ns_0_i_11493_Argument_0_0->content.encoded.body.length = variablenode_ns_0_i_11493_Argument_0_0_encOffset; -UA_Byte *variablenode_ns_0_i_11493_Argument_0_0_newBody = (UA_Byte *) UA_malloc(variablenode_ns_0_i_11493_Argument_0_0_encOffset); -if (!variablenode_ns_0_i_11493_Argument_0_0_newBody) return UA_STATUSCODE_BADOUTOFMEMORY; -memcpy(variablenode_ns_0_i_11493_Argument_0_0_newBody, variablenode_ns_0_i_11493_Argument_0_0->content.encoded.body.data, variablenode_ns_0_i_11493_Argument_0_0_encOffset); -UA_Byte *variablenode_ns_0_i_11493_Argument_0_0_oldBody = variablenode_ns_0_i_11493_Argument_0_0->content.encoded.body.data; -variablenode_ns_0_i_11493_Argument_0_0->content.encoded.body.data = variablenode_ns_0_i_11493_Argument_0_0_newBody; -UA_free(variablenode_ns_0_i_11493_Argument_0_0_oldBody); - -UA_ExtensionObject variablenode_ns_0_i_11493_variant_DataContents[1]; -variablenode_ns_0_i_11493_variant_DataContents[0] = *variablenode_ns_0_i_11493_Argument_0_0; -UA_Variant_setArray(&attr.value, &variablenode_ns_0_i_11493_variant_DataContents, (UA_Int32) 1, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); -attr.displayName = UA_LOCALIZEDTEXT("", "InputArguments"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 11493), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "InputArguments"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -UA_Array_delete(attr.arrayDimensions, 1, &UA_TYPES[UA_TYPES_UINT32]); + /* Currently memcpy is used to copy the securityParameters */ + memcpy(&dst->securityParameters, &src->securityParameters, sizeof(UA_PubSubSecurityParameters)); + retVal = UA_UadpDataSetReaderMessageDataType_copy(&src->messageSettings, &dst->messageSettings); + if(retVal != UA_STATUSCODE_GOOD) { + return retVal; + } -UA_ExtensionObject_delete(variablenode_ns_0_i_11493_Argument_0_0); -UA_free(variablenode_ns_0_i_11493_Argument_0_0_struct.ArrayDimensions); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 11493), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11492), false); -return retVal; + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_115_finish(UA_Server *server, UA_UInt16* ns) { +/** + * Delete the DataSetReader. + * + * @param server + * @param dataSetReader + */ +void UA_DataSetReader_delete(UA_Server *server, UA_DataSetReader *dataSetReader) { + /* Delete DataSetReader config */ + UA_String_deleteMembers(&dataSetReader->config.name); + UA_Variant_deleteMembers(&dataSetReader->config.publisherId); + UA_DataSetMetaDataType_deleteMembers(&dataSetReader->config.dataSetMetaData); + UA_UadpDataSetReaderMessageDataType_deleteMembers(&dataSetReader->config.messageSettings); + UA_TargetVariablesDataType_deleteMembers(&dataSetReader->subscribedDataSetTarget); + + /* Delete DataSetReader */ + UA_ReaderGroup* pGroup = UA_ReaderGroup_findRGbyId(server, dataSetReader->linkedReaderGroup); + if(pGroup != NULL) { + pGroup->readersCount--; + } + + UA_NodeId_deleteMembers(&dataSetReader->identifier); + UA_NodeId_deleteMembers(&dataSetReader->linkedReaderGroup); + /* Remove DataSetReader from group */ + LIST_REMOVE(dataSetReader, listEntry); + /* Free memory allocated for DataSetReader */ + UA_free(dataSetReader); +} + +/**********************************************/ +/* PublishedDataSet */ +/**********************************************/ +UA_StatusCode +UA_PublishedDataSetConfig_copy(const UA_PublishedDataSetConfig *src, + UA_PublishedDataSetConfig *dst) { + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + memcpy(dst, src, sizeof(UA_PublishedDataSetConfig)); + retVal |= UA_String_copy(&src->name, &dst->name); + switch(src->publishedDataSetType){ + case UA_PUBSUB_DATASET_PUBLISHEDITEMS: + //no additional items + break; + case UA_PUBSUB_DATASET_PUBLISHEDITEMS_TEMPLATE: + if(src->config.itemsTemplate.variablesToAddSize > 0){ + dst->config.itemsTemplate.variablesToAdd = (UA_PublishedVariableDataType *) UA_calloc( + src->config.itemsTemplate.variablesToAddSize, sizeof(UA_PublishedVariableDataType)); + } + + for(size_t i = 0; i < src->config.itemsTemplate.variablesToAddSize; i++){ + retVal |= UA_PublishedVariableDataType_copy(&src->config.itemsTemplate.variablesToAdd[i], + &dst->config.itemsTemplate.variablesToAdd[i]); + } + retVal |= UA_DataSetMetaDataType_copy(&src->config.itemsTemplate.metaData, + &dst->config.itemsTemplate.metaData); + break; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 11493) -); + default: + return UA_STATUSCODE_BADINVALIDARGUMENT; + } + return retVal; } -/* Default XML - ns=0;i=3063 */ +UA_StatusCode +UA_Server_getPublishedDataSetConfig(UA_Server *server, const UA_NodeId pds, + UA_PublishedDataSetConfig *config){ + if(!config) + return UA_STATUSCODE_BADINVALIDARGUMENT; -static UA_StatusCode function_ua_namespace0_116_begin(UA_Server *server, UA_UInt16* ns) { + UA_PublishedDataSet *currentPublishedDataSet = UA_PublishedDataSet_findPDSbyId(server, pds); + if(!currentPublishedDataSet) + return UA_STATUSCODE_BADNOTFOUND; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "Default XML"); -attr.description = UA_LOCALIZEDTEXT("", "The default XML encoding for a data type."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 3063), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Default XML"), -UA_NODEID_NUMERIC(ns[0], 58), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -return retVal; + UA_PublishedDataSetConfig tmpPublishedDataSetConfig; + //deep copy of the actual config + UA_PublishedDataSetConfig_copy(¤tPublishedDataSet->config, &tmpPublishedDataSetConfig); + *config = tmpPublishedDataSetConfig; + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_116_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 3063) -); +UA_PublishedDataSet * +UA_PublishedDataSet_findPDSbyId(UA_Server *server, UA_NodeId identifier){ + for(size_t i = 0; i < server->pubSubManager.publishedDataSetsSize; i++){ + if(UA_NodeId_equal(&server->pubSubManager.publishedDataSets[i].identifier, &identifier)){ + return &server->pubSubManager.publishedDataSets[i]; + } + } + return NULL; } -/* Default Binary - ns=0;i=3062 */ - -static UA_StatusCode function_ua_namespace0_117_begin(UA_Server *server, UA_UInt16* ns) { - -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "Default Binary"); -attr.description = UA_LOCALIZEDTEXT("", "The default binary encoding for a data type."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 3062), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "Default Binary"), -UA_NODEID_NUMERIC(ns[0], 58), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -return retVal; +void +UA_PublishedDataSetConfig_deleteMembers(UA_PublishedDataSetConfig *pdsConfig){ + //delete pds config + UA_String_deleteMembers(&pdsConfig->name); + switch (pdsConfig->publishedDataSetType){ + case UA_PUBSUB_DATASET_PUBLISHEDITEMS: + //no additional items + break; + case UA_PUBSUB_DATASET_PUBLISHEDITEMS_TEMPLATE: + if(pdsConfig->config.itemsTemplate.variablesToAddSize > 0){ + for(size_t i = 0; i < pdsConfig->config.itemsTemplate.variablesToAddSize; i++){ + UA_PublishedVariableDataType_deleteMembers(&pdsConfig->config.itemsTemplate.variablesToAdd[i]); + } + UA_free(pdsConfig->config.itemsTemplate.variablesToAdd); + } + UA_DataSetMetaDataType_deleteMembers(&pdsConfig->config.itemsTemplate.metaData); + break; + default: + break; + } } -static UA_StatusCode function_ua_namespace0_117_finish(UA_Server *server, UA_UInt16* ns) { +void +UA_PublishedDataSet_deleteMembers(UA_Server *server, UA_PublishedDataSet *publishedDataSet){ + UA_PublishedDataSetConfig_deleteMembers(&publishedDataSet->config); + //delete PDS + UA_DataSetMetaDataType_deleteMembers(&publishedDataSet->dataSetMetaData); + UA_DataSetField *field, *tmpField; + LIST_FOREACH_SAFE(field, &publishedDataSet->fields, listEntry, tmpField) { + UA_Server_removeDataSetField(server, field->identifier); + } + UA_NodeId_deleteMembers(&publishedDataSet->identifier); +} + +UA_DataSetFieldResult +UA_Server_addDataSetField(UA_Server *server, const UA_NodeId publishedDataSet, + const UA_DataSetFieldConfig *fieldConfig, + UA_NodeId *fieldIdentifier) { + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + UA_DataSetFieldResult result = {UA_STATUSCODE_BADINVALIDARGUMENT, {0, 0}}; + if(!fieldConfig) + return result; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 3062) -); -} + UA_PublishedDataSet *currentDataSet = UA_PublishedDataSet_findPDSbyId(server, publishedDataSet); + if(currentDataSet == NULL){ + result.result = UA_STATUSCODE_BADNOTFOUND; + return result; + } -/* ServerDiagnosticsType - ns=0;i=2020 */ + if(currentDataSet->config.publishedDataSetType != UA_PUBSUB_DATASET_PUBLISHEDITEMS){ + result.result = UA_STATUSCODE_BADNOTIMPLEMENTED; + return result; + } -static UA_StatusCode function_ua_namespace0_118_begin(UA_Server *server, UA_UInt16* ns) { + UA_DataSetField *newField = (UA_DataSetField *) UA_calloc(1, sizeof(UA_DataSetField)); + if(!newField){ + result.result = UA_STATUSCODE_BADINTERNALERROR; + return result; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsType"); -attr.description = UA_LOCALIZEDTEXT("", "The diagnostics information for a server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, -UA_NODEID_NUMERIC(ns[0], 2020), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerDiagnosticsType"), -UA_NODEID_NULL, -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2020), UA_NODEID_NUMERIC(ns[0], 45), UA_EXPANDEDNODEID_NUMERIC(ns[0], 58), false); -return retVal; + UA_DataSetFieldConfig tmpFieldConfig; + retVal |= UA_DataSetFieldConfig_copy(fieldConfig, &tmpFieldConfig); + newField->config = tmpFieldConfig; + UA_PubSubManager_generateUniqueNodeId(server, &newField->identifier); + if(fieldIdentifier != NULL){ + UA_NodeId_copy(&newField->identifier, fieldIdentifier); + } + newField->publishedDataSet = currentDataSet->identifier; + //update major version of parent published data set + currentDataSet->dataSetMetaData.configurationVersion.majorVersion = UA_PubSubConfigurationVersionTimeDifference(); + LIST_INSERT_HEAD(¤tDataSet->fields, newField, listEntry); + if(newField->config.field.variable.promotedField) + currentDataSet->promotedFieldsCount++; + currentDataSet->fieldSize++; + result.result = retVal; + result.configurationVersion.majorVersion = currentDataSet->dataSetMetaData.configurationVersion.majorVersion; + result.configurationVersion.minorVersion = currentDataSet->dataSetMetaData.configurationVersion.minorVersion; + return result; } -static UA_StatusCode function_ua_namespace0_118_finish(UA_Server *server, UA_UInt16* ns) { +UA_DataSetFieldResult +UA_Server_removeDataSetField(UA_Server *server, const UA_NodeId dsf) { + UA_DataSetField *currentField = UA_DataSetField_findDSFbyId(server, dsf); + UA_DataSetFieldResult result = {UA_STATUSCODE_BADNOTFOUND, {0, 0}}; + if(!currentField) + return result; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2020) -); -} + UA_PublishedDataSet *parentPublishedDataSet = + UA_PublishedDataSet_findPDSbyId(server, currentField->publishedDataSet); + if(!parentPublishedDataSet) + return result; -/* ServerDiagnostics - ns=0;i=2274 */ + parentPublishedDataSet->fieldSize--; + if(currentField->config.field.variable.promotedField) + parentPublishedDataSet->promotedFieldsCount--; + /* update major version of PublishedDataSet */ + parentPublishedDataSet->dataSetMetaData.configurationVersion.majorVersion = + UA_PubSubConfigurationVersionTimeDifference(); -static UA_StatusCode function_ua_namespace0_119_begin(UA_Server *server, UA_UInt16* ns) { + UA_DataSetField_deleteMembers(currentField); + LIST_REMOVE(currentField, listEntry); + UA_free(currentField); -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_ObjectAttributes attr = UA_ObjectAttributes_default; -attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnostics"); -attr.description = UA_LOCALIZEDTEXT("", "Reports diagnostics about the server."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, -UA_NODEID_NUMERIC(ns[0], 2274), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerDiagnostics"), -UA_NODEID_NUMERIC(ns[0], 2020), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2274), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2253), false); -return retVal; + result.result = UA_STATUSCODE_GOOD; + result.configurationVersion.majorVersion = parentPublishedDataSet->dataSetMetaData.configurationVersion.majorVersion; + result.configurationVersion.minorVersion = parentPublishedDataSet->dataSetMetaData.configurationVersion.minorVersion; + return result; } -static UA_StatusCode function_ua_namespace0_119_finish(UA_Server *server, UA_UInt16* ns) { +/**********************************************/ +/* DataSetWriter */ +/**********************************************/ -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2274) -); +UA_StatusCode +UA_DataSetWriterConfig_copy(const UA_DataSetWriterConfig *src, + UA_DataSetWriterConfig *dst){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + memcpy(dst, src, sizeof(UA_DataSetWriterConfig)); + retVal |= UA_String_copy(&src->name, &dst->name); + retVal |= UA_String_copy(&src->dataSetName, &dst->dataSetName); + retVal |= UA_ExtensionObject_copy(&src->messageSettings, &dst->messageSettings); + dst->dataSetWriterProperties = (UA_KeyValuePair *) + UA_calloc(src->dataSetWriterPropertiesSize, sizeof(UA_KeyValuePair)); + if(!dst->dataSetWriterProperties) + return UA_STATUSCODE_BADOUTOFMEMORY; + for(size_t i = 0; i < src->dataSetWriterPropertiesSize; i++){ + retVal |= UA_KeyValuePair_copy(&src->dataSetWriterProperties[i], &dst->dataSetWriterProperties[i]); + } + return retVal; } -/* ServerDiagnosticsSummary - ns=0;i=2275 */ +UA_StatusCode +UA_Server_getDataSetWriterConfig(UA_Server *server, const UA_NodeId dsw, + UA_DataSetWriterConfig *config){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + if(!config) + return UA_STATUSCODE_BADINVALIDARGUMENT; -static UA_StatusCode function_ua_namespace0_120_begin(UA_Server *server, UA_UInt16* ns) { + UA_DataSetWriter *currentDataSetWriter = UA_DataSetWriter_findDSWbyId(server, dsw); + if(!currentDataSetWriter) + return UA_STATUSCODE_BADNOTFOUND; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 859); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE]); -attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummary"); -attr.description = UA_LOCALIZEDTEXT("", "A summary of server level diagnostics."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2275), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerDiagnosticsSummary"), -UA_NODEID_NUMERIC(ns[0], 2150), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2275), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2274), false); -return retVal; + UA_DataSetWriterConfig tmpWriterConfig; + //deep copy of the actual config + retVal |= UA_DataSetWriterConfig_copy(¤tDataSetWriter->config, &tmpWriterConfig); + *config = tmpWriterConfig; + return retVal; } -static UA_StatusCode function_ua_namespace0_120_finish(UA_Server *server, UA_UInt16* ns) { +UA_DataSetWriter * +UA_DataSetWriter_findDSWbyId(UA_Server *server, UA_NodeId identifier) { + for(size_t i = 0; i < server->pubSubManager.connectionsSize; i++){ + UA_WriterGroup *tmpWriterGroup; + LIST_FOREACH(tmpWriterGroup, &server->pubSubManager.connections[i].writerGroups, listEntry){ + UA_DataSetWriter *tmpWriter; + LIST_FOREACH(tmpWriter, &tmpWriterGroup->writers, listEntry){ + if(UA_NodeId_equal(&tmpWriter->identifier, &identifier)){ + return tmpWriter; + } + } + } + } + return NULL; +} -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2275) -); +void +UA_DataSetWriterConfig_deleteMembers(UA_DataSetWriterConfig *pdsConfig) { + UA_String_deleteMembers(&pdsConfig->name); + UA_String_deleteMembers(&pdsConfig->dataSetName); + for(size_t i = 0; i < pdsConfig->dataSetWriterPropertiesSize; i++){ + UA_KeyValuePair_deleteMembers(&pdsConfig->dataSetWriterProperties[i]); + } + UA_free(pdsConfig->dataSetWriterProperties); + UA_ExtensionObject_deleteMembers(&pdsConfig->messageSettings); } -/* SecurityRejectedRequestsCount - ns=0;i=2287 */ +static void +UA_DataSetWriter_deleteMembers(UA_Server *server, UA_DataSetWriter *dataSetWriter) { + UA_DataSetWriterConfig_deleteMembers(&dataSetWriter->config); + //delete DataSetWriter + UA_NodeId_deleteMembers(&dataSetWriter->identifier); + UA_NodeId_deleteMembers(&dataSetWriter->linkedWriterGroup); + UA_NodeId_deleteMembers(&dataSetWriter->connectedDataSet); +#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES + //delete lastSamples store + for(size_t i = 0; i < dataSetWriter->lastSamplesCount; i++) { + UA_DataValue_deleteMembers(&dataSetWriter->lastSamples[i].value); + } + UA_free(dataSetWriter->lastSamples); + dataSetWriter->lastSamples = NULL; + dataSetWriter->lastSamplesCount = 0; +#endif +} -static UA_StatusCode function_ua_namespace0_121_begin(UA_Server *server, UA_UInt16* ns) { +/**********************************************/ +/* WriterGroup */ +/**********************************************/ -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedRequestsCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2287), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "SecurityRejectedRequestsCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2287), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2275), false); -return retVal; +UA_StatusCode +UA_WriterGroupConfig_copy(const UA_WriterGroupConfig *src, + UA_WriterGroupConfig *dst){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + memcpy(dst, src, sizeof(UA_WriterGroupConfig)); + retVal |= UA_String_copy(&src->name, &dst->name); + retVal |= UA_ExtensionObject_copy(&src->transportSettings, &dst->transportSettings); + retVal |= UA_ExtensionObject_copy(&src->messageSettings, &dst->messageSettings); + dst->groupProperties = (UA_KeyValuePair *) UA_calloc(src->groupPropertiesSize, sizeof(UA_KeyValuePair)); + if(!dst->groupProperties) + return UA_STATUSCODE_BADOUTOFMEMORY; + for(size_t i = 0; i < src->groupPropertiesSize; i++){ + retVal |= UA_KeyValuePair_copy(&src->groupProperties[i], &dst->groupProperties[i]); + } + return retVal; } -static UA_StatusCode function_ua_namespace0_121_finish(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode +UA_Server_getWriterGroupConfig(UA_Server *server, const UA_NodeId writerGroup, + UA_WriterGroupConfig *config){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + if(!config) + return UA_STATUSCODE_BADINVALIDARGUMENT; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2287) -); + UA_WriterGroup *currentWriterGroup = UA_WriterGroup_findWGbyId(server, writerGroup); + if(!currentWriterGroup){ + return UA_STATUSCODE_BADNOTFOUND; + } + UA_WriterGroupConfig tmpWriterGroupConfig; + //deep copy of the actual config + retVal |= UA_WriterGroupConfig_copy(¤tWriterGroup->config, &tmpWriterGroupConfig); + *config = tmpWriterGroupConfig; + return retVal; } -/* CumulatedSubscriptionCount - ns=0;i=2286 */ +UA_StatusCode +UA_Server_updateWriterGroupConfig(UA_Server *server, UA_NodeId writerGroupIdentifier, + const UA_WriterGroupConfig *config){ + if(!config) + return UA_STATUSCODE_BADINVALIDARGUMENT; -static UA_StatusCode function_ua_namespace0_122_begin(UA_Server *server, UA_UInt16* ns) { + UA_WriterGroup *currentWriterGroup = UA_WriterGroup_findWGbyId(server, writerGroupIdentifier); + if(!currentWriterGroup) + return UA_STATUSCODE_BADNOTFOUND; + //The update functionality will be extended during the next PubSub batches. + //Currently is only a change of the publishing interval possible. + if(currentWriterGroup->config.maxEncapsulatedDataSetMessageCount != config->maxEncapsulatedDataSetMessageCount){ + currentWriterGroup->config.maxEncapsulatedDataSetMessageCount = config->maxEncapsulatedDataSetMessageCount; + if(currentWriterGroup->config.messageSettings.encoding == UA_EXTENSIONOBJECT_ENCODED_NOBODY) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "MaxEncapsulatedDataSetMessag need enabled 'PayloadHeader' within the message settings."); + } + } + if(currentWriterGroup->config.publishingInterval != config->publishingInterval) { + UA_PubSubManager_removeRepeatedPubSubCallback(server, currentWriterGroup->publishCallbackId); + currentWriterGroup->config.publishingInterval = config->publishingInterval; + UA_WriterGroup_addPublishCallback(server, currentWriterGroup); + } + if(currentWriterGroup->config.priority != config->priority) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "No or unsupported WriterGroup update."); + } + return UA_STATUSCODE_GOOD; +} -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSubscriptionCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2286), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "CumulatedSubscriptionCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2286), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2275), false); -return retVal; +UA_WriterGroup * +UA_WriterGroup_findWGbyId(UA_Server *server, UA_NodeId identifier){ + for(size_t i = 0; i < server->pubSubManager.connectionsSize; i++){ + UA_WriterGroup *tmpWriterGroup; + LIST_FOREACH(tmpWriterGroup, &server->pubSubManager.connections[i].writerGroups, listEntry) { + if(UA_NodeId_equal(&identifier, &tmpWriterGroup->identifier)){ + return tmpWriterGroup; + } + } + } + return NULL; } -static UA_StatusCode function_ua_namespace0_122_finish(UA_Server *server, UA_UInt16* ns) { +void +UA_WriterGroupConfig_deleteMembers(UA_WriterGroupConfig *writerGroupConfig){ + //delete writerGroup config + UA_String_deleteMembers(&writerGroupConfig->name); + UA_ExtensionObject_deleteMembers(&writerGroupConfig->transportSettings); + UA_ExtensionObject_deleteMembers(&writerGroupConfig->messageSettings); + for(size_t i = 0; i < writerGroupConfig->groupPropertiesSize; i++){ + UA_KeyValuePair_deleteMembers(&writerGroupConfig->groupProperties[i]); + } + UA_free(writerGroupConfig->groupProperties); +} -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2286) -); +static void +UA_WriterGroup_deleteMembers(UA_Server *server, UA_WriterGroup *writerGroup) { + UA_WriterGroupConfig_deleteMembers(&writerGroup->config); + //delete WriterGroup + //delete all writers. Therefore removeDataSetWriter is called from PublishedDataSet + UA_DataSetWriter *dataSetWriter, *tmpDataSetWriter; + LIST_FOREACH_SAFE(dataSetWriter, &writerGroup->writers, listEntry, tmpDataSetWriter){ + UA_Server_removeDataSetWriter(server, dataSetWriter->identifier); + } + UA_NodeId_deleteMembers(&writerGroup->linkedConnection); + UA_NodeId_deleteMembers(&writerGroup->identifier); } -/* CurrentSubscriptionCount - ns=0;i=2285 */ +UA_StatusCode +UA_Server_addDataSetWriter(UA_Server *server, + const UA_NodeId writerGroup, const UA_NodeId dataSet, + const UA_DataSetWriterConfig *dataSetWriterConfig, + UA_NodeId *writerIdentifier) { + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + if(!dataSetWriterConfig) + return UA_STATUSCODE_BADINVALIDARGUMENT; -static UA_StatusCode function_ua_namespace0_123_begin(UA_Server *server, UA_UInt16* ns) { + UA_PublishedDataSet *currentDataSetContext = UA_PublishedDataSet_findPDSbyId(server, dataSet); + if(!currentDataSetContext) + return UA_STATUSCODE_BADNOTFOUND; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2285), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "CurrentSubscriptionCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2285), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2275), false); -return retVal; + UA_WriterGroup *wg = UA_WriterGroup_findWGbyId(server, writerGroup); + if(!wg) + return UA_STATUSCODE_BADNOTFOUND; + + UA_DataSetWriter *newDataSetWriter = (UA_DataSetWriter *) UA_calloc(1, sizeof(UA_DataSetWriter)); + if(!newDataSetWriter) + return UA_STATUSCODE_BADOUTOFMEMORY; + + //copy the config into the new dataSetWriter + UA_DataSetWriterConfig tmpDataSetWriterConfig; + retVal |= UA_DataSetWriterConfig_copy(dataSetWriterConfig, &tmpDataSetWriterConfig); + newDataSetWriter->config = tmpDataSetWriterConfig; + //save the current version of the connected PublishedDataSet + newDataSetWriter->connectedDataSetVersion = currentDataSetContext->dataSetMetaData.configurationVersion; + +#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES + //initialize the queue for the last values + newDataSetWriter->lastSamples = (UA_DataSetWriterSample * ) + UA_calloc(currentDataSetContext->fieldSize, sizeof(UA_DataSetWriterSample)); + if(!newDataSetWriter->lastSamples) { + UA_DataSetWriterConfig_deleteMembers(&newDataSetWriter->config); + UA_free(newDataSetWriter); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + newDataSetWriter->lastSamplesCount = currentDataSetContext->fieldSize; + for(size_t i = 0; i < newDataSetWriter->lastSamplesCount; i++) { + UA_DataValue_init(&newDataSetWriter->lastSamples[i].value); + newDataSetWriter->lastSamples[i].valueChanged = false; + } +#endif + + //connect PublishedDataSet with DataSetWriter + newDataSetWriter->connectedDataSet = currentDataSetContext->identifier; + newDataSetWriter->linkedWriterGroup = wg->identifier; + UA_PubSubManager_generateUniqueNodeId(server, &newDataSetWriter->identifier); + if(writerIdentifier != NULL) + UA_NodeId_copy(&newDataSetWriter->identifier, writerIdentifier); + //add the new writer to the group + LIST_INSERT_HEAD(&wg->writers, newDataSetWriter, listEntry); + wg->writersCount++; +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL + addDataSetWriterRepresentation(server, newDataSetWriter); +#endif + return retVal; } -static UA_StatusCode function_ua_namespace0_123_finish(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode +UA_Server_removeDataSetWriter(UA_Server *server, const UA_NodeId dsw){ + UA_DataSetWriter *dataSetWriter = UA_DataSetWriter_findDSWbyId(server, dsw); + if(!dataSetWriter) + return UA_STATUSCODE_BADNOTFOUND; + + UA_WriterGroup *linkedWriterGroup = UA_WriterGroup_findWGbyId(server, dataSetWriter->linkedWriterGroup); + if(!linkedWriterGroup) + return UA_STATUSCODE_BADNOTFOUND; + + linkedWriterGroup->writersCount--; +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL + removeDataSetWriterRepresentation(server, dataSetWriter); +#endif -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2285) -); + //remove DataSetWriter from group + UA_DataSetWriter_deleteMembers(server, dataSetWriter); + LIST_REMOVE(dataSetWriter, listEntry); + UA_free(dataSetWriter); + return UA_STATUSCODE_GOOD; } -/* PublishingIntervalCount - ns=0;i=2284 */ +/**********************************************/ +/* DataSetField */ +/**********************************************/ -static UA_StatusCode function_ua_namespace0_124_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode +UA_DataSetFieldConfig_copy(const UA_DataSetFieldConfig *src, UA_DataSetFieldConfig *dst){ + memcpy(dst, src, sizeof(UA_DataSetFieldConfig)); + if(src->dataSetFieldType == UA_PUBSUB_DATASETFIELD_VARIABLE) { + UA_String_copy(&src->field.variable.fieldNameAlias, &dst->field.variable.fieldNameAlias); + UA_PublishedVariableDataType_copy(&src->field.variable.publishParameters, + &dst->field.variable.publishParameters); + } else { + return UA_STATUSCODE_BADNOTSUPPORTED; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "PublishingIntervalCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2284), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "PublishingIntervalCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2284), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2275), false); -return retVal; + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_124_finish(UA_Server *server, UA_UInt16* ns) { - -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2284) -); +UA_StatusCode +UA_Server_getDataSetFieldConfig(UA_Server *server, const UA_NodeId dsf, + UA_DataSetFieldConfig *config) { + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + if(!config) + return UA_STATUSCODE_BADINVALIDARGUMENT; + UA_DataSetField *currentDataSetField = UA_DataSetField_findDSFbyId(server, dsf); + if(!currentDataSetField) + return UA_STATUSCODE_BADNOTFOUND; + UA_DataSetFieldConfig tmpFieldConfig; + //deep copy of the actual config + retVal |= UA_DataSetFieldConfig_copy(¤tDataSetField->config, &tmpFieldConfig); + *config = tmpFieldConfig; + return retVal; } -/* SessionAbortCount - ns=0;i=2282 */ +UA_DataSetField * +UA_DataSetField_findDSFbyId(UA_Server *server, UA_NodeId identifier) { + for(size_t i = 0; i < server->pubSubManager.publishedDataSetsSize; i++){ + UA_DataSetField *tmpField; + LIST_FOREACH(tmpField, &server->pubSubManager.publishedDataSets[i].fields, listEntry){ + if(UA_NodeId_equal(&tmpField->identifier, &identifier)){ + return tmpField; + } + } + } + return NULL; +} -static UA_StatusCode function_ua_namespace0_125_begin(UA_Server *server, UA_UInt16* ns) { +void +UA_DataSetFieldConfig_deleteMembers(UA_DataSetFieldConfig *dataSetFieldConfig){ + if(dataSetFieldConfig->dataSetFieldType == UA_PUBSUB_DATASETFIELD_VARIABLE){ + UA_String_deleteMembers(&dataSetFieldConfig->field.variable.fieldNameAlias); + UA_PublishedVariableDataType_deleteMembers(&dataSetFieldConfig->field.variable.publishParameters); + } +} -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "SessionAbortCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2282), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "SessionAbortCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2282), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2275), false); -return retVal; +static void +UA_DataSetField_deleteMembers(UA_DataSetField *field) { + UA_DataSetFieldConfig_deleteMembers(&field->config); + //delete DataSetField + UA_NodeId_deleteMembers(&field->identifier); + UA_NodeId_deleteMembers(&field->publishedDataSet); + UA_FieldMetaData_deleteMembers(&field->fieldMetaData); } -static UA_StatusCode function_ua_namespace0_125_finish(UA_Server *server, UA_UInt16* ns) { +/*********************************************************/ +/* PublishValues handling */ +/*********************************************************/ -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2282) -); -} +/** + * Compare two variants. Internally used for value change detection. + * + * @return true if the value has changed + */ +#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES +static UA_Boolean +valueChangedVariant(UA_Variant *oldValue, UA_Variant *newValue){ + if(! (oldValue && newValue)) + return false; -/* SessionTimeoutCount - ns=0;i=2281 */ + UA_ByteString *oldValueEncoding = UA_ByteString_new(), *newValueEncoding = UA_ByteString_new(); + size_t oldValueEncodingSize, newValueEncodingSize; + oldValueEncodingSize = UA_calcSizeBinary(oldValue, &UA_TYPES[UA_TYPES_VARIANT]); + newValueEncodingSize = UA_calcSizeBinary(newValue, &UA_TYPES[UA_TYPES_VARIANT]); + if((oldValueEncodingSize == 0) || (newValueEncodingSize == 0)) + return false; -static UA_StatusCode function_ua_namespace0_126_begin(UA_Server *server, UA_UInt16* ns) { + if(oldValueEncodingSize != newValueEncodingSize) + return true; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "SessionTimeoutCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2281), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "SessionTimeoutCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2281), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2275), false); -return retVal; -} + if(UA_ByteString_allocBuffer(oldValueEncoding, oldValueEncodingSize) != UA_STATUSCODE_GOOD) + return false; -static UA_StatusCode function_ua_namespace0_126_finish(UA_Server *server, UA_UInt16* ns) { + if(UA_ByteString_allocBuffer(newValueEncoding, newValueEncodingSize) != UA_STATUSCODE_GOOD) + return false; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2281) -); + UA_Byte *bufPosOldValue = oldValueEncoding->data; + const UA_Byte *bufEndOldValue = &oldValueEncoding->data[oldValueEncoding->length]; + UA_Byte *bufPosNewValue = newValueEncoding->data; + const UA_Byte *bufEndNewValue = &newValueEncoding->data[newValueEncoding->length]; + if(UA_encodeBinary(oldValue, &UA_TYPES[UA_TYPES_VARIANT], + &bufPosOldValue, &bufEndOldValue, NULL, NULL) != UA_STATUSCODE_GOOD){ + return false; + } + if(UA_encodeBinary(newValue, &UA_TYPES[UA_TYPES_VARIANT], + &bufPosNewValue, &bufEndNewValue, NULL, NULL) != UA_STATUSCODE_GOOD){ + return false; + } + oldValueEncoding->length = (uintptr_t)bufPosOldValue - (uintptr_t)oldValueEncoding->data; + newValueEncoding->length = (uintptr_t)bufPosNewValue - (uintptr_t)newValueEncoding->data; + UA_Boolean compareResult = !UA_ByteString_equal(oldValueEncoding, newValueEncoding); + UA_ByteString_delete(oldValueEncoding); + UA_ByteString_delete(newValueEncoding); + return compareResult; } +#endif -/* RejectedSessionCount - ns=0;i=3705 */ +/** + * Obtain the latest value for a specific DataSetField. This method is currently + * called inside the DataSetMessage generation process. + */ +static void +UA_PubSubDataSetField_sampleValue(UA_Server *server, UA_DataSetField *field, + UA_DataValue *value) { + /* Read the value */ + UA_ReadValueId rvid; + UA_ReadValueId_init(&rvid); + rvid.nodeId = field->config.field.variable.publishParameters.publishedVariable; + rvid.attributeId = field->config.field.variable.publishParameters.attributeId; + rvid.indexRange = field->config.field.variable.publishParameters.indexRange; + *value = UA_Server_read(server, &rvid, UA_TIMESTAMPSTORETURN_BOTH); +} -static UA_StatusCode function_ua_namespace0_127_begin(UA_Server *server, UA_UInt16* ns) { +static UA_StatusCode +UA_PubSubDataSetWriter_generateKeyFrameMessage(UA_Server *server, UA_DataSetMessage *dataSetMessage, + UA_DataSetWriter *dataSetWriter) { + UA_PublishedDataSet *currentDataSet = + UA_PublishedDataSet_findPDSbyId(server, dataSetWriter->connectedDataSet); + if(!currentDataSet) + return UA_STATUSCODE_BADNOTFOUND; + + /* Prepare DataSetMessageContent */ + dataSetMessage->header.dataSetMessageValid = true; + dataSetMessage->header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME; + dataSetMessage->data.keyFrameData.fieldCount = currentDataSet->fieldSize; + dataSetMessage->data.keyFrameData.dataSetFields = (UA_DataValue *) + UA_Array_new(currentDataSet->fieldSize, &UA_TYPES[UA_TYPES_DATAVALUE]); + if(!dataSetMessage->data.keyFrameData.dataSetFields) + return UA_STATUSCODE_BADOUTOFMEMORY; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "RejectedSessionCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 3705), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "RejectedSessionCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 3705), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2275), false); -return retVal; -} +#ifdef UA_ENABLE_JSON_ENCODING + /* json: insert fieldnames used as json keys */ + dataSetMessage->data.keyFrameData.fieldNames = + (UA_String *)UA_Array_new(currentDataSet->fieldSize, &UA_TYPES[UA_TYPES_STRING]); + if(!dataSetMessage->data.keyFrameData.fieldNames) + return UA_STATUSCODE_BADOUTOFMEMORY; +#endif -static UA_StatusCode function_ua_namespace0_127_finish(UA_Server *server, UA_UInt16* ns) { + /* Loop over the fields */ + size_t counter = 0; + UA_DataSetField *dsf; + LIST_FOREACH(dsf, ¤tDataSet->fields, listEntry) { -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 3705) -); +#ifdef UA_ENABLE_JSON_ENCODING + /* json: store the fieldNameAlias*/ + UA_String_copy(&dsf->config.field.variable.fieldNameAlias, + &dataSetMessage->data.keyFrameData.fieldNames[counter]); +#endif + + /* Sample the value */ + UA_DataValue *dfv = &dataSetMessage->data.keyFrameData.dataSetFields[counter]; + UA_PubSubDataSetField_sampleValue(server, dsf, dfv); + + /* Deactivate statuscode? */ + if(((u64)dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_STATUSCODE) == 0) + dfv->hasStatus = false; + + /* Deactivate timestamps */ + if(((u64)dataSetWriter->config.dataSetFieldContentMask & + (u64)UA_DATASETFIELDCONTENTMASK_SOURCETIMESTAMP) == 0) + dfv->hasSourceTimestamp = false; + if(((u64)dataSetWriter->config.dataSetFieldContentMask & + (u64)UA_DATASETFIELDCONTENTMASK_SOURCEPICOSECONDS) == 0) + dfv->hasSourcePicoseconds = false; + if(((u64)dataSetWriter->config.dataSetFieldContentMask & + (u64)UA_DATASETFIELDCONTENTMASK_SERVERTIMESTAMP) == 0) + dfv->hasServerTimestamp = false; + if(((u64)dataSetWriter->config.dataSetFieldContentMask & + (u64)UA_DATASETFIELDCONTENTMASK_SERVERPICOSECONDS) == 0) + dfv->hasServerPicoseconds = false; + +#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES + /* Update lastValue store */ + UA_DataValue_deleteMembers(&dataSetWriter->lastSamples[counter].value); + UA_DataValue_copy(dfv, &dataSetWriter->lastSamples[counter].value); +#endif + + counter++; + } + return UA_STATUSCODE_GOOD; } -/* RejectedRequestsCount - ns=0;i=2288 */ +#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES +static UA_StatusCode +UA_PubSubDataSetWriter_generateDeltaFrameMessage(UA_Server *server, + UA_DataSetMessage *dataSetMessage, + UA_DataSetWriter *dataSetWriter) { + UA_PublishedDataSet *currentDataSet = + UA_PublishedDataSet_findPDSbyId(server, dataSetWriter->connectedDataSet); + if(!currentDataSet) + return UA_STATUSCODE_BADNOTFOUND; + + /* Prepare DataSetMessageContent */ + memset(dataSetMessage, 0, sizeof(UA_DataSetMessage)); + dataSetMessage->header.dataSetMessageValid = true; + dataSetMessage->header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME; + + UA_DataSetField *dsf; + size_t counter = 0; + LIST_FOREACH(dsf, ¤tDataSet->fields, listEntry) { + /* Sample the value */ + UA_DataValue value; + UA_DataValue_init(&value); + UA_PubSubDataSetField_sampleValue(server, dsf, &value); -static UA_StatusCode function_ua_namespace0_128_begin(UA_Server *server, UA_UInt16* ns) { + /* Check if the value has changed */ + if(valueChangedVariant(&dataSetWriter->lastSamples[counter].value.value, &value.value)) { + /* increase fieldCount for current delta message */ + dataSetMessage->data.deltaFrameData.fieldCount++; + dataSetWriter->lastSamples[counter].valueChanged = true; -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "RejectedRequestsCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2288), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "RejectedRequestsCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2288), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2275), false); -return retVal; + /* Update last stored sample */ + UA_DataValue_deleteMembers(&dataSetWriter->lastSamples[counter].value); + dataSetWriter->lastSamples[counter].value = value; + } else { + UA_DataValue_deleteMembers(&value); + dataSetWriter->lastSamples[counter].valueChanged = false; + } + + counter++; + } + + /* Allocate DeltaFrameFields */ + UA_DataSetMessage_DeltaFrameField *deltaFields = (UA_DataSetMessage_DeltaFrameField *) + UA_calloc(dataSetMessage->data.deltaFrameData.fieldCount, sizeof(UA_DataSetMessage_DeltaFrameField)); + if(!deltaFields) + return UA_STATUSCODE_BADOUTOFMEMORY; + + dataSetMessage->data.deltaFrameData.deltaFrameFields = deltaFields; + size_t currentDeltaField = 0; + for(size_t i = 0; i < currentDataSet->fieldSize; i++) { + if(!dataSetWriter->lastSamples[i].valueChanged) + continue; + + UA_DataSetMessage_DeltaFrameField *dff = &deltaFields[currentDeltaField]; + + dff->fieldIndex = (UA_UInt16) i; + UA_DataValue_copy(&dataSetWriter->lastSamples[i].value, &dff->fieldValue); + dataSetWriter->lastSamples[i].valueChanged = false; + + /* Deactivate statuscode? */ + if(((u64)dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_STATUSCODE) == 0) + dff->fieldValue.hasStatus = false; + + /* Deactivate timestamps? */ + if(((u64)dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_SOURCETIMESTAMP) == 0) + dff->fieldValue.hasSourceTimestamp = false; + if(((u64)dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_SOURCEPICOSECONDS) == 0) + dff->fieldValue.hasServerPicoseconds = false; + if(((u64)dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_SERVERTIMESTAMP) == 0) + dff->fieldValue.hasServerTimestamp = false; + if(((u64)dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_SERVERPICOSECONDS) == 0) + dff->fieldValue.hasServerPicoseconds = false; + + currentDeltaField++; + } + return UA_STATUSCODE_GOOD; } +#endif + +/** + * Generate a DataSetMessage for the given writer. + * + * @param dataSetWriter ptr to corresponding writer + * @return ptr to generated DataSetMessage + */ +static UA_StatusCode +UA_DataSetWriter_generateDataSetMessage(UA_Server *server, UA_DataSetMessage *dataSetMessage, + UA_DataSetWriter *dataSetWriter) { + UA_PublishedDataSet *currentDataSet = + UA_PublishedDataSet_findPDSbyId(server, dataSetWriter->connectedDataSet); + if(!currentDataSet) + return UA_STATUSCODE_BADNOTFOUND; + + /* Reset the message */ + memset(dataSetMessage, 0, sizeof(UA_DataSetMessage)); + + /* store messageType to switch between json or uadp (default) */ + UA_UInt16 messageType = UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE; + UA_JsonDataSetWriterMessageDataType *jsonDataSetWriterMessageDataType = NULL; + + /* The configuration Flags are included + * inside the std. defined UA_UadpDataSetWriterMessageDataType */ + UA_UadpDataSetWriterMessageDataType defaultUadpConfiguration; + UA_UadpDataSetWriterMessageDataType *dataSetWriterMessageDataType = NULL; + if((dataSetWriter->config.messageSettings.encoding == UA_EXTENSIONOBJECT_DECODED || + dataSetWriter->config.messageSettings.encoding == UA_EXTENSIONOBJECT_DECODED_NODELETE) && + (dataSetWriter->config.messageSettings.content.decoded.type == + &UA_TYPES[UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE])) { + dataSetWriterMessageDataType = (UA_UadpDataSetWriterMessageDataType *) + dataSetWriter->config.messageSettings.content.decoded.data; + + /* type is UADP */ + messageType = UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE; + } else if((dataSetWriter->config.messageSettings.encoding == UA_EXTENSIONOBJECT_DECODED || + dataSetWriter->config.messageSettings.encoding == UA_EXTENSIONOBJECT_DECODED_NODELETE) && + (dataSetWriter->config.messageSettings.content.decoded.type == + &UA_TYPES[UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE])) { + jsonDataSetWriterMessageDataType = (UA_JsonDataSetWriterMessageDataType *) + dataSetWriter->config.messageSettings.content.decoded.data; + + /* type is JSON */ + messageType = UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE; + } else { + /* create default flag configuration if no + * UadpDataSetWriterMessageDataType was passed in */ + memset(&defaultUadpConfiguration, 0, sizeof(UA_UadpDataSetWriterMessageDataType)); + defaultUadpConfiguration.dataSetMessageContentMask = (UA_UadpDataSetMessageContentMask) + ((u64)UA_UADPDATASETMESSAGECONTENTMASK_TIMESTAMP | (u64)UA_UADPDATASETMESSAGECONTENTMASK_MAJORVERSION | + (u64)UA_UADPDATASETMESSAGECONTENTMASK_MINORVERSION); + dataSetWriterMessageDataType = &defaultUadpConfiguration; + } + + /* Sanity-test the configuration */ + if(dataSetWriterMessageDataType && + (dataSetWriterMessageDataType->networkMessageNumber != 0 || + dataSetWriterMessageDataType->dataSetOffset != 0 || + dataSetWriterMessageDataType->configuredSize != 0)) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Static DSM configuration not supported. Using defaults"); + dataSetWriterMessageDataType->networkMessageNumber = 0; + dataSetWriterMessageDataType->dataSetOffset = 0; + dataSetWriterMessageDataType->configuredSize = 0; + } + + /* The field encoding depends on the flags inside the writer config. + * TODO: This can be moved to the encoding layer. */ + if(dataSetWriter->config.dataSetFieldContentMask & (u64)UA_DATASETFIELDCONTENTMASK_RAWDATA +) { + dataSetMessage->header.fieldEncoding = UA_FIELDENCODING_RAWDATA; + } else if((u64)dataSetWriter->config.dataSetFieldContentMask & + ((u64)UA_DATASETFIELDCONTENTMASK_SOURCETIMESTAMP | (u64)UA_DATASETFIELDCONTENTMASK_SERVERPICOSECONDS | + (u64)UA_DATASETFIELDCONTENTMASK_SOURCEPICOSECONDS | (u64)UA_DATASETFIELDCONTENTMASK_STATUSCODE)) { + dataSetMessage->header.fieldEncoding = UA_FIELDENCODING_DATAVALUE; + } else { + dataSetMessage->header.fieldEncoding = UA_FIELDENCODING_VARIANT; + } -static UA_StatusCode function_ua_namespace0_128_finish(UA_Server *server, UA_UInt16* ns) { + if(messageType == UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE) { + /* Std: 'The DataSetMessageContentMask defines the flags for the content of the DataSetMessage header.' */ + if((u64)dataSetWriterMessageDataType->dataSetMessageContentMask & + (u64)UA_UADPDATASETMESSAGECONTENTMASK_MAJORVERSION) { + dataSetMessage->header.configVersionMajorVersionEnabled = true; + dataSetMessage->header.configVersionMajorVersion = + currentDataSet->dataSetMetaData.configurationVersion.majorVersion; + } + if((u64)dataSetWriterMessageDataType->dataSetMessageContentMask & + (u64)UA_UADPDATASETMESSAGECONTENTMASK_MINORVERSION) { + dataSetMessage->header.configVersionMinorVersionEnabled = true; + dataSetMessage->header.configVersionMinorVersion = + currentDataSet->dataSetMetaData.configurationVersion.minorVersion; + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2288) -); + if((u64)dataSetWriterMessageDataType->dataSetMessageContentMask & + (u64)UA_UADPDATASETMESSAGECONTENTMASK_SEQUENCENUMBER) { + dataSetMessage->header.dataSetMessageSequenceNrEnabled = true; + dataSetMessage->header.dataSetMessageSequenceNr = + dataSetWriter->actualDataSetMessageSequenceCount; + } + + if((u64)dataSetWriterMessageDataType->dataSetMessageContentMask & + (u64)UA_UADPDATASETMESSAGECONTENTMASK_TIMESTAMP) { + dataSetMessage->header.timestampEnabled = true; + dataSetMessage->header.timestamp = UA_DateTime_now(); + } + /* TODO: Picoseconds resolution not supported atm */ + if((u64)dataSetWriterMessageDataType->dataSetMessageContentMask & + (u64)UA_UADPDATASETMESSAGECONTENTMASK_PICOSECONDS) { + dataSetMessage->header.picoSecondsIncluded = false; + } + + /* TODO: Statuscode not supported yet */ + if((u64)dataSetWriterMessageDataType->dataSetMessageContentMask & + (u64)UA_UADPDATASETMESSAGECONTENTMASK_STATUS) { + dataSetMessage->header.statusEnabled = false; + } + } else if(messageType == UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE) { + if((u64)jsonDataSetWriterMessageDataType->dataSetMessageContentMask & + (u64)UA_JSONDATASETMESSAGECONTENTMASK_METADATAVERSION) { + dataSetMessage->header.configVersionMajorVersionEnabled = true; + dataSetMessage->header.configVersionMajorVersion = + currentDataSet->dataSetMetaData.configurationVersion.majorVersion; + } + if((u64)jsonDataSetWriterMessageDataType->dataSetMessageContentMask & + (u64)UA_JSONDATASETMESSAGECONTENTMASK_METADATAVERSION) { + dataSetMessage->header.configVersionMinorVersionEnabled = true; + dataSetMessage->header.configVersionMinorVersion = + currentDataSet->dataSetMetaData.configurationVersion.minorVersion; + } + + if((u64)jsonDataSetWriterMessageDataType->dataSetMessageContentMask & + (u64)UA_JSONDATASETMESSAGECONTENTMASK_SEQUENCENUMBER) { + dataSetMessage->header.dataSetMessageSequenceNrEnabled = true; + dataSetMessage->header.dataSetMessageSequenceNr = + dataSetWriter->actualDataSetMessageSequenceCount; + } + + if((u64)jsonDataSetWriterMessageDataType->dataSetMessageContentMask & + (u64)UA_JSONDATASETMESSAGECONTENTMASK_TIMESTAMP) { + dataSetMessage->header.timestampEnabled = true; + dataSetMessage->header.timestamp = UA_DateTime_now(); + } + + /* TODO: Statuscode not supported yet */ + if((u64)jsonDataSetWriterMessageDataType->dataSetMessageContentMask & + (u64)UA_JSONDATASETMESSAGECONTENTMASK_STATUS) { + dataSetMessage->header.statusEnabled = false; + } + } + + /* Set the sequence count. Automatically rolls over to zero */ + dataSetWriter->actualDataSetMessageSequenceCount++; + + /* JSON does not differ between deltaframes and keyframes, only keyframes are currently used. */ + if(messageType != UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE){ +#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES + /* Check if the PublishedDataSet version has changed -> if yes flush the lastValue store and send a KeyFrame */ + if(dataSetWriter->connectedDataSetVersion.majorVersion != currentDataSet->dataSetMetaData.configurationVersion.majorVersion || + dataSetWriter->connectedDataSetVersion.minorVersion != currentDataSet->dataSetMetaData.configurationVersion.minorVersion) { + /* Remove old samples */ + for(size_t i = 0; i < dataSetWriter->lastSamplesCount; i++) + UA_DataValue_deleteMembers(&dataSetWriter->lastSamples[i].value); + + /* Realloc pds dependent memory */ + dataSetWriter->lastSamplesCount = currentDataSet->fieldSize; + UA_DataSetWriterSample *newSamplesArray = (UA_DataSetWriterSample * ) + UA_realloc(dataSetWriter->lastSamples, sizeof(UA_DataSetWriterSample) * dataSetWriter->lastSamplesCount); + if(!newSamplesArray) + return UA_STATUSCODE_BADOUTOFMEMORY; + dataSetWriter->lastSamples = newSamplesArray; + memset(dataSetWriter->lastSamples, 0, sizeof(UA_DataSetWriterSample) * dataSetWriter->lastSamplesCount); + + dataSetWriter->connectedDataSetVersion = currentDataSet->dataSetMetaData.configurationVersion; + UA_PubSubDataSetWriter_generateKeyFrameMessage(server, dataSetMessage, dataSetWriter); + dataSetWriter->deltaFrameCounter = 0; + return UA_STATUSCODE_GOOD; + } + + /* The standard defines: if a PDS contains only one fields no delta messages + * should be generated because they need more memory than a keyframe with 1 + * field. */ + if(currentDataSet->fieldSize > 1 && dataSetWriter->deltaFrameCounter > 0 && + dataSetWriter->deltaFrameCounter <= dataSetWriter->config.keyFrameCount) { + UA_PubSubDataSetWriter_generateDeltaFrameMessage(server, dataSetMessage, dataSetWriter); + dataSetWriter->deltaFrameCounter++; + return UA_STATUSCODE_GOOD; + } + + dataSetWriter->deltaFrameCounter = 1; +#endif + } + + UA_PubSubDataSetWriter_generateKeyFrameMessage(server, dataSetMessage, dataSetWriter); + return UA_STATUSCODE_GOOD; } -/* ServerViewCount - ns=0;i=2276 */ +static UA_StatusCode +sendNetworkMessageJson(UA_PubSubConnection *connection, UA_DataSetMessage *dsm, + UA_UInt16 *writerIds, UA_Byte dsmCount, UA_ExtensionObject *transportSettings) { + UA_StatusCode retval = UA_STATUSCODE_BADNOTSUPPORTED; +#ifdef UA_ENABLE_JSON_ENCODING + UA_NetworkMessage nm; + memset(&nm, 0, sizeof(UA_NetworkMessage)); + nm.version = 1; + nm.networkMessageType = UA_NETWORKMESSAGE_DATASET; + nm.payloadHeaderEnabled = true; + + nm.payloadHeader.dataSetPayloadHeader.count = dsmCount; + nm.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = writerIds; + nm.payload.dataSetPayload.dataSetMessages = dsm; + + /* Allocate the buffer. Allocate on the stack if the buffer is small. */ + UA_ByteString buf; + size_t msgSize = UA_NetworkMessage_calcSizeJson(&nm, NULL, 0, NULL, 0, true); + size_t stackSize = 1; + if(msgSize <= UA_MAX_STACKBUF) + stackSize = msgSize; + UA_STACKARRAY(UA_Byte, stackBuf, stackSize); + buf.data = stackBuf; + buf.length = msgSize; + if(msgSize > UA_MAX_STACKBUF) { + retval = UA_ByteString_allocBuffer(&buf, msgSize); + if(retval != UA_STATUSCODE_GOOD) + return retval; + } -static UA_StatusCode function_ua_namespace0_129_begin(UA_Server *server, UA_UInt16* ns) { + /* Encode the message */ + UA_Byte *bufPos = buf.data; + memset(bufPos, 0, msgSize); + const UA_Byte *bufEnd = &buf.data[buf.length]; + retval = UA_NetworkMessage_encodeJson(&nm, &bufPos, &bufEnd, NULL, 0, NULL, 0, true); + if(retval != UA_STATUSCODE_GOOD) { + if(msgSize > UA_MAX_STACKBUF) + UA_ByteString_deleteMembers(&buf); + return retval; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "ServerViewCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2276), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "ServerViewCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2276), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2275), false); -return retVal; + /* Send the prepared messages */ + retval = connection->channel->send(connection->channel, transportSettings, &buf); + if(msgSize > UA_MAX_STACKBUF) + UA_ByteString_deleteMembers(&buf); +#endif + return retval; } -static UA_StatusCode function_ua_namespace0_129_finish(UA_Server *server, UA_UInt16* ns) { +static UA_StatusCode +sendNetworkMessage(UA_PubSubConnection *connection, UA_WriterGroup *wg, + UA_DataSetMessage *dsm, UA_UInt16 *writerIds, UA_Byte dsmCount, + UA_ExtensionObject *messageSettings, + UA_ExtensionObject *transportSettings) { -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2276) -); + if(messageSettings->content.decoded.type != + &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE]) + return UA_STATUSCODE_BADINTERNALERROR; + UA_UadpWriterGroupMessageDataType *wgm = (UA_UadpWriterGroupMessageDataType*) + messageSettings->content.decoded.data; + + UA_NetworkMessage nm; + memset(&nm, 0, sizeof(UA_NetworkMessage)); + + nm.publisherIdEnabled = + ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_PUBLISHERID) != 0; + nm.groupHeaderEnabled = + ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPHEADER) != 0; + nm.groupHeader.writerGroupIdEnabled = + ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_WRITERGROUPID) != 0; + nm.groupHeader.groupVersionEnabled = + ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPVERSION) != 0; + nm.groupHeader.networkMessageNumberEnabled = + ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_NETWORKMESSAGENUMBER) != 0; + nm.groupHeader.sequenceNumberEnabled = + ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_SEQUENCENUMBER) != 0; + nm.payloadHeaderEnabled = + ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER) != 0; + nm.timestampEnabled = + ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_TIMESTAMP) != 0; + nm.picosecondsEnabled = + ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_PICOSECONDS) != 0; + nm.dataSetClassIdEnabled = + ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_DATASETCLASSID) != 0; + nm.promotedFieldsEnabled = + ((u64)wgm->networkMessageContentMask & (u64)UA_UADPNETWORKMESSAGECONTENTMASK_PROMOTEDFIELDS) != 0; + + nm.version = 1; + nm.networkMessageType = UA_NETWORKMESSAGE_DATASET; + if(connection->config->publisherIdType == UA_PUBSUB_PUBLISHERID_NUMERIC) { + nm.publisherIdType = UA_PUBLISHERDATATYPE_UINT16; + nm.publisherId.publisherIdUInt32 = connection->config->publisherId.numeric; + } else if(connection->config->publisherIdType == UA_PUBSUB_PUBLISHERID_STRING){ + nm.publisherIdType = UA_PUBLISHERDATATYPE_STRING; + nm.publisherId.publisherIdString = connection->config->publisherId.string; + } + + /* Compute the length of the dsm separately for the header */ + UA_STACKARRAY(UA_UInt16, dsmLengths, dsmCount); + for(UA_Byte i = 0; i < dsmCount; i++) + dsmLengths[i] = (UA_UInt16)UA_DataSetMessage_calcSizeBinary(&dsm[i]); + + nm.payloadHeader.dataSetPayloadHeader.count = dsmCount; + nm.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = writerIds; + nm.groupHeader.writerGroupId = wg->config.writerGroupId; + nm.groupHeader.networkMessageNumber = 1; + nm.payload.dataSetPayload.sizes = dsmLengths; + nm.payload.dataSetPayload.dataSetMessages = dsm; + + /* Allocate the buffer. Allocate on the stack if the buffer is small. */ + UA_ByteString buf; + size_t msgSize = UA_NetworkMessage_calcSizeBinary(&nm); + size_t stackSize = 1; + if(msgSize <= UA_MAX_STACKBUF) + stackSize = msgSize; + UA_STACKARRAY(UA_Byte, stackBuf, stackSize); + buf.data = stackBuf; + buf.length = msgSize; + UA_StatusCode retval; + if(msgSize > UA_MAX_STACKBUF) { + retval = UA_ByteString_allocBuffer(&buf, msgSize); + if(retval != UA_STATUSCODE_GOOD) + return retval; + } + + /* Encode the message */ + UA_Byte *bufPos = buf.data; + memset(bufPos, 0, msgSize); + const UA_Byte *bufEnd = &buf.data[buf.length]; + retval = UA_NetworkMessage_encodeBinary(&nm, &bufPos, bufEnd); + if(retval != UA_STATUSCODE_GOOD) { + if(msgSize > UA_MAX_STACKBUF) + UA_ByteString_deleteMembers(&buf); + return retval; + } + + /* Send the prepared messages */ + retval = connection->channel->send(connection->channel, transportSettings, &buf); + if(msgSize > UA_MAX_STACKBUF) + UA_ByteString_deleteMembers(&buf); + return retval; } -/* CurrentSessionCount - ns=0;i=2277 */ +/* This callback triggers the collection and publish of NetworkMessages and the + * contained DataSetMessages. */ +void +UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup) { + UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, "Publish Callback"); -static UA_StatusCode function_ua_namespace0_130_begin(UA_Server *server, UA_UInt16* ns) { + if(!writerGroup) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Publish failed. WriterGroup not found"); + return; + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSessionCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2277), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "CurrentSessionCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2277), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2275), false); -return retVal; + /* Nothing to do? */ + if(writerGroup->writersCount <= 0) + return; + + /* Binary or Json encoding? */ + if(writerGroup->config.encodingMimeType != UA_PUBSUB_ENCODING_UADP && + writerGroup->config.encodingMimeType != UA_PUBSUB_ENCODING_JSON) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Publish failed: Unknown encoding type."); + return; + } + + /* Find the connection associated with the writer */ + UA_PubSubConnection *connection = + UA_PubSubConnection_findConnectionbyId(server, writerGroup->linkedConnection); + if(!connection) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Publish failed. PubSubConnection invalid."); + return; + } + + /* How many DSM can be sent in one NM? */ + UA_Byte maxDSM = (UA_Byte)writerGroup->config.maxEncapsulatedDataSetMessageCount; + if(writerGroup->config.maxEncapsulatedDataSetMessageCount > UA_BYTE_MAX) + maxDSM = UA_BYTE_MAX; + /* If the maxEncapsulatedDataSetMessageCount is set to 0->1 */ + if(maxDSM == 0) + maxDSM = 1; + + /* It is possible to put several DataSetMessages into one NetworkMessage. + * But only if they do not contain promoted fields. NM with only DSM are + * sent out right away. The others are kept in a buffer for "batching". */ + size_t dsmCount = 0; + UA_DataSetWriter *dsw; + UA_STACKARRAY(UA_UInt16, dsWriterIds, writerGroup->writersCount); + UA_STACKARRAY(UA_DataSetMessage, dsmStore, writerGroup->writersCount); + LIST_FOREACH(dsw, &writerGroup->writers, listEntry) { + /* Find the dataset */ + UA_PublishedDataSet *pds = + UA_PublishedDataSet_findPDSbyId(server, dsw->connectedDataSet); + if(!pds) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "PubSub Publish: PublishedDataSet not found"); + continue; + } + + /* Generate the DSM */ + UA_StatusCode res = + UA_DataSetWriter_generateDataSetMessage(server, &dsmStore[dsmCount], dsw); + if(res != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "PubSub Publish: DataSetMessage creation failed"); + continue; + } + + /* Send right away if there is only this DSM in a NM. If promoted fields + * are contained in the PublishedDataSet, then this DSM must go into a + * dedicated NM as well. */ + if(pds->promotedFieldsCount > 0 || maxDSM == 1) { + if(writerGroup->config.encodingMimeType == UA_PUBSUB_ENCODING_UADP){ + res = sendNetworkMessage(connection, writerGroup, &dsmStore[dsmCount], + &dsw->config.dataSetWriterId, 1, + &writerGroup->config.messageSettings, + &writerGroup->config.transportSettings); + }else if(writerGroup->config.encodingMimeType == UA_PUBSUB_ENCODING_JSON){ + res = sendNetworkMessageJson(connection, &dsmStore[dsmCount], + &dsw->config.dataSetWriterId, 1, &writerGroup->config.transportSettings); + } + if(res != UA_STATUSCODE_GOOD) + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "PubSub Publish: Could not send a NetworkMessage"); + UA_DataSetMessage_free(&dsmStore[dsmCount]); + continue; + } + + dsWriterIds[dsmCount] = dsw->config.dataSetWriterId; + dsmCount++; + } + + /* Send the NetworkMessages with batched DataSetMessages */ + size_t nmCount = (dsmCount / maxDSM) + ((dsmCount % maxDSM) == 0 ? 0 : 1); + for(UA_UInt32 i = 0; i < nmCount; i++) { + UA_Byte nmDsmCount = maxDSM; + if(i == nmCount - 1 && (dsmCount % maxDSM)) + nmDsmCount = (UA_Byte)dsmCount % maxDSM; + + UA_StatusCode res3 = UA_STATUSCODE_GOOD; + if(writerGroup->config.encodingMimeType == UA_PUBSUB_ENCODING_UADP){ + res3 = sendNetworkMessage(connection, writerGroup, &dsmStore[i * maxDSM], + &dsWriterIds[i * maxDSM], nmDsmCount, + &writerGroup->config.messageSettings, + &writerGroup->config.transportSettings); + }else if(writerGroup->config.encodingMimeType == UA_PUBSUB_ENCODING_JSON){ + res3 = sendNetworkMessageJson(connection, &dsmStore[i * maxDSM], + &dsWriterIds[i * maxDSM], nmDsmCount, &writerGroup->config.transportSettings); + } + if(res3 != UA_STATUSCODE_GOOD) + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "PubSub Publish: Sending a NetworkMessage failed"); + } + + /* Clean up DSM */ + for(size_t i = 0; i < dsmCount; i++) + UA_DataSetMessage_free(&dsmStore[i]); } -static UA_StatusCode function_ua_namespace0_130_finish(UA_Server *server, UA_UInt16* ns) { +/* Add new publishCallback. The first execution is triggered directly after + * creation. */ +UA_StatusCode +UA_WriterGroup_addPublishCallback(UA_Server *server, UA_WriterGroup *writerGroup) { + UA_StatusCode retval = + UA_PubSubManager_addRepeatedCallback(server, + (UA_ServerCallback) UA_WriterGroup_publishCallback, + writerGroup, writerGroup->config.publishingInterval, + &writerGroup->publishCallbackId); + if(retval == UA_STATUSCODE_GOOD) + writerGroup->publishCallbackIsRegistered = true; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2277) -); + /* Run once after creation */ + UA_WriterGroup_publishCallback(server, writerGroup); + return retval; } -/* CumulatedSessionCount - ns=0;i=2278 */ +/* This callback triggers the collection and reception of NetworkMessages and the + * contained DataSetMessages. */ +void UA_ReaderGroup_subscribeCallback(UA_Server *server, UA_ReaderGroup *readerGroup) { + UA_PubSubConnection *connection = UA_PubSubConnection_findConnectionbyId(server, readerGroup->linkedConnection); + UA_ByteString buffer; + if(UA_ByteString_allocBuffer(&buffer, 512) != UA_STATUSCODE_GOOD) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "Message buffer alloc failed!"); + return; + } -static UA_StatusCode function_ua_namespace0_131_begin(UA_Server *server, UA_UInt16* ns) { + connection->channel->receive(connection->channel, &buffer, NULL, 300000); + if(buffer.length > 0) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "Message received:"); + UA_NetworkMessage currentNetworkMessage; + memset(¤tNetworkMessage, 0, sizeof(UA_NetworkMessage)); + size_t currentPosition = 0; + UA_NetworkMessage_decodeBinary(&buffer, ¤tPosition, ¤tNetworkMessage); + UA_Server_processNetworkMessage(server, ¤tNetworkMessage, connection); + UA_NetworkMessage_deleteMembers(¤tNetworkMessage); + } -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSessionCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2278), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "CumulatedSessionCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2278), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2275), false); -return retVal; + UA_ByteString_deleteMembers(&buffer); } -static UA_StatusCode function_ua_namespace0_131_finish(UA_Server *server, UA_UInt16* ns) { +/* Add new subscribeCallback. The first execution is triggered directly after + * creation. */ +UA_StatusCode +UA_ReaderGroup_addSubscribeCallback(UA_Server *server, UA_ReaderGroup *readerGroup) { + UA_StatusCode retval = UA_STATUSCODE_GOOD; + UA_PubSubConnection *connection = UA_PubSubConnection_findConnectionbyId(server, readerGroup->linkedConnection); + if(connection != NULL) { + retval = connection->channel->regist(connection->channel, NULL, NULL); + if(retval == UA_STATUSCODE_GOOD) { + retval = UA_PubSubManager_addRepeatedCallback(server, + (UA_ServerCallback) UA_ReaderGroup_subscribeCallback, + readerGroup, 5, + &readerGroup->subscribeCallbackId); + } + else { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, "register channel failed: 0x%x!", retval); + } + + } -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2278) -); + if(retval == UA_STATUSCODE_GOOD) { + readerGroup->subscribeCallbackIsRegistered = true; + } + + /* Run once after creation */ + UA_ReaderGroup_subscribeCallback(server, readerGroup); + return retval; } -/* SecurityRejectedSessionCount - ns=0;i=2279 */ +#endif /* UA_ENABLE_PUBSUB */ -static UA_StatusCode function_ua_namespace0_132_begin(UA_Server *server, UA_UInt16* ns) { +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/pubsub/ua_pubsub_manager.c" ***********************************/ -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 1; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_UINT32]); -attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedSessionCount"); -attr.description = UA_LOCALIZEDTEXT("", ""); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2279), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "SecurityRejectedSessionCount"), -UA_NODEID_NUMERIC(ns[0], 63), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2279), UA_NODEID_NUMERIC(ns[0], 47), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2275), false); -return retVal; +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner) + * Copyright (c) 2018 Fraunhofer IOSB (Author: Julius Pfrommer) + */ + + +#ifdef UA_ENABLE_PUBSUB /* conditional compilation */ + +#define UA_DATETIMESTAMP_2000 125911584000000000 + +UA_StatusCode +UA_Server_addPubSubConnection(UA_Server *server, + const UA_PubSubConnectionConfig *connectionConfig, + UA_NodeId *connectionIdentifier) { + /* Find the matching UA_PubSubTransportLayers */ + UA_PubSubTransportLayer *tl = NULL; + for(size_t i = 0; i < server->config.pubsubTransportLayersSize; i++) { + if(connectionConfig && + UA_String_equal(&server->config.pubsubTransportLayers[i].transportProfileUri, + &connectionConfig->transportProfileUri)) { + tl = &server->config.pubsubTransportLayers[i]; + } + } + if(!tl) { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation failed. Requested transport layer not found."); + return UA_STATUSCODE_BADNOTFOUND; + } + + /* Create a copy of the connection config */ + UA_PubSubConnectionConfig *tmpConnectionConfig = (UA_PubSubConnectionConfig *) + UA_calloc(1, sizeof(UA_PubSubConnectionConfig)); + if(!tmpConnectionConfig){ + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation failed. Out of Memory."); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + + UA_StatusCode retval = UA_PubSubConnectionConfig_copy(connectionConfig, tmpConnectionConfig); + if(retval != UA_STATUSCODE_GOOD){ + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation failed. Could not copy the config."); + return retval; + } + + /* Create new connection and add to UA_PubSubManager */ + UA_PubSubConnection *newConnectionsField = (UA_PubSubConnection *) + UA_realloc(server->pubSubManager.connections, + sizeof(UA_PubSubConnection) * (server->pubSubManager.connectionsSize + 1)); + if(!newConnectionsField) { + UA_PubSubConnectionConfig_deleteMembers(tmpConnectionConfig); + UA_free(tmpConnectionConfig); + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation failed. Out of Memory."); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + server->pubSubManager.connections = newConnectionsField; + server->pubSubManager.connectionsSize++; + + UA_PubSubConnection *newConnection = + &server->pubSubManager.connections[server->pubSubManager.connectionsSize-1]; + + /* Initialize the new connection */ + memset(newConnection, 0, sizeof(UA_PubSubConnection)); + LIST_INIT(&newConnection->writerGroups); + //workaround - fixing issue with queue.h and realloc. + for(size_t n = 0; n < server->pubSubManager.connectionsSize; n++){ + if(server->pubSubManager.connections[n].writerGroups.lh_first){ + server->pubSubManager.connections[n].writerGroups.lh_first->listEntry.le_prev = &server->pubSubManager.connections[n].writerGroups.lh_first; + } + } + newConnection->config = tmpConnectionConfig; + + /* Open the channel */ + newConnection->channel = tl->createPubSubChannel(newConnection->config); + if(!newConnection->channel) { + UA_PubSubConnection_deleteMembers(server, newConnection); + server->pubSubManager.connectionsSize--; + /* Keep the realloced (longer) array if entries remain */ + if(server->pubSubManager.connectionsSize == 0) { + UA_free(server->pubSubManager.connections); + server->pubSubManager.connections = NULL; + } + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation failed. Transport layer creation problem."); + return UA_STATUSCODE_BADINTERNALERROR; + } + + UA_PubSubManager_generateUniqueNodeId(server, &newConnection->identifier); + + if(connectionIdentifier) + UA_NodeId_copy(&newConnection->identifier, connectionIdentifier); + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL + addPubSubConnectionRepresentation(server, newConnection); +#endif + return UA_STATUSCODE_GOOD; } -static UA_StatusCode function_ua_namespace0_132_finish(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode +UA_Server_removePubSubConnection(UA_Server *server, const UA_NodeId connection) { + //search the identified Connection and store the Connection index + size_t connectionIndex; + UA_PubSubConnection *currentConnection = NULL; + for(connectionIndex = 0; connectionIndex < server->pubSubManager.connectionsSize; connectionIndex++){ + if(UA_NodeId_equal(&connection, &server->pubSubManager.connections[connectionIndex].identifier)){ + currentConnection = &server->pubSubManager.connections[connectionIndex]; + break; + } + } + if(!currentConnection) + return UA_STATUSCODE_BADNOTFOUND; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2279) -); +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL + removePubSubConnectionRepresentation(server, currentConnection); +#endif + UA_PubSubConnection_deleteMembers(server, currentConnection); + server->pubSubManager.connectionsSize--; + //remove the connection from the pubSubManager, move the last connection + //into the allocated memory of the deleted connection + if(server->pubSubManager.connectionsSize != connectionIndex){ + memcpy(&server->pubSubManager.connections[connectionIndex], + &server->pubSubManager.connections[server->pubSubManager.connectionsSize], + sizeof(UA_PubSubConnection)); + } + + if(server->pubSubManager.connectionsSize <= 0){ + UA_free(server->pubSubManager.connections); + server->pubSubManager.connections = NULL; + } else { + server->pubSubManager.connections = (UA_PubSubConnection *) + UA_realloc(server->pubSubManager.connections, sizeof(UA_PubSubConnection) * server->pubSubManager.connectionsSize); + if(!server->pubSubManager.connections){ + return UA_STATUSCODE_BADINTERNALERROR; + } + //workaround - fixing issue with queue.h and realloc. + for(size_t n = 0; n < server->pubSubManager.connectionsSize; n++){ + if(server->pubSubManager.connections[n].writerGroups.lh_first){ + server->pubSubManager.connections[n].writerGroups.lh_first->listEntry.le_prev = &server->pubSubManager.connections[n].writerGroups.lh_first; + } + } + } + return UA_STATUSCODE_GOOD; } -/* EnabledFlag - ns=0;i=2294 */ +UA_AddPublishedDataSetResult +UA_Server_addPublishedDataSet(UA_Server *server, const UA_PublishedDataSetConfig *publishedDataSetConfig, + UA_NodeId *pdsIdentifier) { + UA_AddPublishedDataSetResult result = {UA_STATUSCODE_BADINVALIDARGUMENT, 0, NULL, {0, 0}}; + if(!publishedDataSetConfig){ + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "PublishedDataSet creation failed. No config passed in."); + return result; + } + if(publishedDataSetConfig->publishedDataSetType != UA_PUBSUB_DATASET_PUBLISHEDITEMS){ + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "PublishedDataSet creation failed. Unsupported PublishedDataSet type."); + return result; + } + //deep copy the given connection config + UA_PublishedDataSetConfig tmpPublishedDataSetConfig; + memset(&tmpPublishedDataSetConfig, 0, sizeof(UA_PublishedDataSetConfig)); + if(UA_PublishedDataSetConfig_copy(publishedDataSetConfig, &tmpPublishedDataSetConfig) != UA_STATUSCODE_GOOD){ + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "PublishedDataSet creation failed. Configuration copy failed."); + result.addResult = UA_STATUSCODE_BADINTERNALERROR; + return result; + } + //create new PDS and add to UA_PubSubManager + UA_PublishedDataSet *newPubSubDataSetField = (UA_PublishedDataSet *) + UA_realloc(server->pubSubManager.publishedDataSets, + sizeof(UA_PublishedDataSet) * (server->pubSubManager.publishedDataSetsSize + 1)); + if(!newPubSubDataSetField) { + UA_PublishedDataSetConfig_deleteMembers(&tmpPublishedDataSetConfig); + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "PublishedDataSet creation failed. Out of Memory."); + result.addResult = UA_STATUSCODE_BADOUTOFMEMORY; + return result; + } + server->pubSubManager.publishedDataSets = newPubSubDataSetField; + UA_PublishedDataSet *newPubSubDataSet = &server->pubSubManager.publishedDataSets[(server->pubSubManager.publishedDataSetsSize)]; + memset(newPubSubDataSet, 0, sizeof(UA_PublishedDataSet)); + LIST_INIT(&newPubSubDataSet->fields); + //workaround - fixing issue with queue.h and realloc. + for(size_t n = 0; n < server->pubSubManager.publishedDataSetsSize; n++){ + if(server->pubSubManager.publishedDataSets[n].fields.lh_first){ + server->pubSubManager.publishedDataSets[n].fields.lh_first->listEntry.le_prev = &server->pubSubManager.publishedDataSets[n].fields.lh_first; + } + } + newPubSubDataSet->config = tmpPublishedDataSetConfig; + if(tmpPublishedDataSetConfig.publishedDataSetType == UA_PUBSUB_DATASET_PUBLISHEDITEMS_TEMPLATE){ + //parse template config and add fields (later PubSub batch) + } + //generate unique nodeId + UA_PubSubManager_generateUniqueNodeId(server, &newPubSubDataSet->identifier); + if(pdsIdentifier != NULL){ + UA_NodeId_copy(&newPubSubDataSet->identifier, pdsIdentifier); + } + server->pubSubManager.publishedDataSetsSize++; + result.addResult = UA_STATUSCODE_GOOD; + result.fieldAddResults = NULL; + result.fieldAddResultsSize = 0; + result.configurationVersion.majorVersion = UA_PubSubConfigurationVersionTimeDifference(); + result.configurationVersion.minorVersion = UA_PubSubConfigurationVersionTimeDifference(); +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL + addPublishedDataItemsRepresentation(server, newPubSubDataSet); +#endif + return result; +} + +UA_StatusCode +UA_Server_removePublishedDataSet(UA_Server *server, const UA_NodeId pds) { + //search the identified PublishedDataSet and store the PDS index + UA_PublishedDataSet *publishedDataSet = NULL; + size_t publishedDataSetIndex; + for(publishedDataSetIndex = 0; publishedDataSetIndex < server->pubSubManager.publishedDataSetsSize; publishedDataSetIndex++){ + if(UA_NodeId_equal(&server->pubSubManager.publishedDataSets[publishedDataSetIndex].identifier, &pds)){ + publishedDataSet = &server->pubSubManager.publishedDataSets[publishedDataSetIndex]; + break; + } + } + if(!publishedDataSet){ + return UA_STATUSCODE_BADNOTFOUND; + } + //search for referenced writers -> delete this writers. (Standard: writer must be connected with PDS) + for(size_t i = 0; i < server->pubSubManager.connectionsSize; i++){ + UA_WriterGroup *writerGroup; + LIST_FOREACH(writerGroup, &server->pubSubManager.connections[i].writerGroups, listEntry){ + UA_DataSetWriter *currentWriter, *tmpWriterGroup; + LIST_FOREACH_SAFE(currentWriter, &writerGroup->writers, listEntry, tmpWriterGroup){ + if(UA_NodeId_equal(¤tWriter->connectedDataSet, &publishedDataSet->identifier)){ + UA_Server_removeDataSetWriter(server, currentWriter->identifier); + } + } + } + } +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL + removePublishedDataSetRepresentation(server, publishedDataSet); +#endif + UA_PublishedDataSet_deleteMembers(server, publishedDataSet); + server->pubSubManager.publishedDataSetsSize--; + //copy the last PDS to the removed PDS inside the allocated memory block + if(server->pubSubManager.publishedDataSetsSize != publishedDataSetIndex){ + memcpy(&server->pubSubManager.publishedDataSets[publishedDataSetIndex], + &server->pubSubManager.publishedDataSets[server->pubSubManager.publishedDataSetsSize], + sizeof(UA_PublishedDataSet)); + } + if(server->pubSubManager.publishedDataSetsSize <= 0){ + UA_free(server->pubSubManager.publishedDataSets); + server->pubSubManager.publishedDataSets = NULL; + } else { + server->pubSubManager.publishedDataSets = (UA_PublishedDataSet *) + UA_realloc(server->pubSubManager.publishedDataSets, sizeof(UA_PublishedDataSet) * server->pubSubManager.publishedDataSetsSize); + if(!server->pubSubManager.publishedDataSets){ + return UA_STATUSCODE_BADINTERNALERROR; + } + //workaround - fixing issue with queue.h and realloc. + for(size_t n = 0; n < server->pubSubManager.publishedDataSetsSize; n++){ + if(server->pubSubManager.publishedDataSets[n].fields.lh_first){ + server->pubSubManager.publishedDataSets[n].fields.lh_first->listEntry.le_prev = &server->pubSubManager.publishedDataSets[n].fields.lh_first; + } + } + } + return UA_STATUSCODE_GOOD; +} -static UA_StatusCode function_ua_namespace0_133_begin(UA_Server *server, UA_UInt16* ns) { +/* Calculate the time difference between current time and UTC (00:00) on January + * 1, 2000. */ +UA_UInt32 +UA_PubSubConfigurationVersionTimeDifference() { + UA_UInt32 timeDiffSince2000 = (UA_UInt32) (UA_DateTime_now() - UA_DATETIMESTAMP_2000); + return timeDiffSince2000; +} -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -UA_VariableAttributes attr = UA_VariableAttributes_default; -attr.minimumSamplingInterval = 0.000000; -attr.userAccessLevel = 1; -attr.accessLevel = 3; -attr.valueRank = -1; -attr.dataType = UA_NODEID_NUMERIC(ns[0], 1); -UA_Variant_setScalar(&attr.value, NULL, &UA_TYPES[UA_TYPES_BOOLEAN]); -attr.displayName = UA_LOCALIZEDTEXT("", "EnabledFlag"); -attr.description = UA_LOCALIZEDTEXT("", "If TRUE the diagnostics collection is enabled."); -attr.writeMask = 0; -attr.userWriteMask = 0; -retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, -UA_NODEID_NUMERIC(ns[0], 2294), -UA_NODEID_NUMERIC(ns[0], 0), -UA_NODEID_NUMERIC(ns[0], 0), -UA_QUALIFIEDNAME(ns[0], "EnabledFlag"), -UA_NODEID_NUMERIC(ns[0], 68), -(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); -retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 2294), UA_NODEID_NUMERIC(ns[0], 46), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2274), false); -return retVal; +/* Generate a new unique NodeId. This NodeId will be used for the information + * model representation of PubSub entities. */ +void +UA_PubSubManager_generateUniqueNodeId(UA_Server *server, UA_NodeId *nodeId) { + UA_NodeId newNodeId = UA_NODEID_NUMERIC(0, 0); + UA_Node *newNode = UA_Nodestore_newNode(server->nsCtx, UA_NODECLASS_OBJECT); + UA_Nodestore_insertNode(server->nsCtx, newNode, &newNodeId); + UA_NodeId_copy(&newNodeId, nodeId); } -static UA_StatusCode function_ua_namespace0_133_finish(UA_Server *server, UA_UInt16* ns) { +/* Delete the current PubSub configuration including all nested members. This + * action also delete the configured PubSub transport Layers. */ +void +UA_PubSubManager_delete(UA_Server *server, UA_PubSubManager *pubSubManager) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "PubSub cleanup was called."); + //free the currently configured transport layers + UA_free(server->config.pubsubTransportLayers); + server->config.pubsubTransportLayersSize = 0; -return UA_Server_addNode_finish(server, -UA_NODEID_NUMERIC(ns[0], 2294) -); + //remove Connections and WriterGroups + while(pubSubManager->connectionsSize > 0){ + UA_Server_removePubSubConnection(server, pubSubManager->connections[pubSubManager->connectionsSize-1].identifier); + } + while(pubSubManager->publishedDataSetsSize > 0){ + UA_Server_removePublishedDataSet(server, pubSubManager->publishedDataSets[pubSubManager->publishedDataSetsSize-1].identifier); + } } -UA_StatusCode ua_namespace0(UA_Server *server) { -UA_StatusCode retVal = UA_STATUSCODE_GOOD; -/* Use namespace ids generated by the server */ -UA_UInt16 ns[1]; -ns[0] = UA_Server_addNamespace(server, "http://opcfoundation.org/UA/"); -retVal |= function_ua_namespace0_0_begin(server, ns); -retVal |= function_ua_namespace0_1_begin(server, ns); -retVal |= function_ua_namespace0_2_begin(server, ns); -retVal |= function_ua_namespace0_3_begin(server, ns); -retVal |= function_ua_namespace0_4_begin(server, ns); -retVal |= function_ua_namespace0_5_begin(server, ns); -retVal |= function_ua_namespace0_6_begin(server, ns); -retVal |= function_ua_namespace0_7_begin(server, ns); -retVal |= function_ua_namespace0_8_begin(server, ns); -retVal |= function_ua_namespace0_9_begin(server, ns); -retVal |= function_ua_namespace0_10_begin(server, ns); -retVal |= function_ua_namespace0_11_begin(server, ns); -retVal |= function_ua_namespace0_12_begin(server, ns); -retVal |= function_ua_namespace0_13_begin(server, ns); -retVal |= function_ua_namespace0_14_begin(server, ns); -retVal |= function_ua_namespace0_15_begin(server, ns); -retVal |= function_ua_namespace0_16_begin(server, ns); -retVal |= function_ua_namespace0_17_begin(server, ns); -retVal |= function_ua_namespace0_18_begin(server, ns); -retVal |= function_ua_namespace0_19_begin(server, ns); -retVal |= function_ua_namespace0_20_begin(server, ns); -retVal |= function_ua_namespace0_21_begin(server, ns); -retVal |= function_ua_namespace0_22_begin(server, ns); -retVal |= function_ua_namespace0_23_begin(server, ns); -retVal |= function_ua_namespace0_24_begin(server, ns); -retVal |= function_ua_namespace0_25_begin(server, ns); -retVal |= function_ua_namespace0_26_begin(server, ns); -retVal |= function_ua_namespace0_27_begin(server, ns); -retVal |= function_ua_namespace0_28_begin(server, ns); -retVal |= function_ua_namespace0_29_begin(server, ns); -retVal |= function_ua_namespace0_30_begin(server, ns); -retVal |= function_ua_namespace0_31_begin(server, ns); -retVal |= function_ua_namespace0_32_begin(server, ns); -retVal |= function_ua_namespace0_33_begin(server, ns); -retVal |= function_ua_namespace0_34_begin(server, ns); -retVal |= function_ua_namespace0_35_begin(server, ns); -retVal |= function_ua_namespace0_36_begin(server, ns); -retVal |= function_ua_namespace0_37_begin(server, ns); -retVal |= function_ua_namespace0_38_begin(server, ns); -retVal |= function_ua_namespace0_39_begin(server, ns); -retVal |= function_ua_namespace0_40_begin(server, ns); -retVal |= function_ua_namespace0_41_begin(server, ns); -retVal |= function_ua_namespace0_42_begin(server, ns); -retVal |= function_ua_namespace0_43_begin(server, ns); -retVal |= function_ua_namespace0_44_begin(server, ns); -retVal |= function_ua_namespace0_45_begin(server, ns); -retVal |= function_ua_namespace0_46_begin(server, ns); -retVal |= function_ua_namespace0_47_begin(server, ns); -retVal |= function_ua_namespace0_48_begin(server, ns); -retVal |= function_ua_namespace0_49_begin(server, ns); -retVal |= function_ua_namespace0_50_begin(server, ns); -retVal |= function_ua_namespace0_51_begin(server, ns); -retVal |= function_ua_namespace0_52_begin(server, ns); -retVal |= function_ua_namespace0_53_begin(server, ns); -retVal |= function_ua_namespace0_54_begin(server, ns); -retVal |= function_ua_namespace0_55_begin(server, ns); -retVal |= function_ua_namespace0_56_begin(server, ns); -retVal |= function_ua_namespace0_57_begin(server, ns); -retVal |= function_ua_namespace0_58_begin(server, ns); -retVal |= function_ua_namespace0_59_begin(server, ns); -retVal |= function_ua_namespace0_60_begin(server, ns); -retVal |= function_ua_namespace0_61_begin(server, ns); -retVal |= function_ua_namespace0_62_begin(server, ns); -retVal |= function_ua_namespace0_63_begin(server, ns); -retVal |= function_ua_namespace0_64_begin(server, ns); -retVal |= function_ua_namespace0_65_begin(server, ns); -retVal |= function_ua_namespace0_66_begin(server, ns); -retVal |= function_ua_namespace0_67_begin(server, ns); -retVal |= function_ua_namespace0_68_begin(server, ns); -retVal |= function_ua_namespace0_69_begin(server, ns); -retVal |= function_ua_namespace0_70_begin(server, ns); -retVal |= function_ua_namespace0_71_begin(server, ns); -retVal |= function_ua_namespace0_72_begin(server, ns); -retVal |= function_ua_namespace0_73_begin(server, ns); -retVal |= function_ua_namespace0_74_begin(server, ns); -retVal |= function_ua_namespace0_75_begin(server, ns); -retVal |= function_ua_namespace0_76_begin(server, ns); -retVal |= function_ua_namespace0_77_begin(server, ns); -retVal |= function_ua_namespace0_78_begin(server, ns); -retVal |= function_ua_namespace0_79_begin(server, ns); -retVal |= function_ua_namespace0_80_begin(server, ns); -retVal |= function_ua_namespace0_81_begin(server, ns); -retVal |= function_ua_namespace0_82_begin(server, ns); -retVal |= function_ua_namespace0_83_begin(server, ns); -retVal |= function_ua_namespace0_84_begin(server, ns); -retVal |= function_ua_namespace0_85_begin(server, ns); -retVal |= function_ua_namespace0_86_begin(server, ns); -retVal |= function_ua_namespace0_87_begin(server, ns); -retVal |= function_ua_namespace0_88_begin(server, ns); -retVal |= function_ua_namespace0_89_begin(server, ns); -retVal |= function_ua_namespace0_90_begin(server, ns); -retVal |= function_ua_namespace0_91_begin(server, ns); -retVal |= function_ua_namespace0_92_begin(server, ns); -retVal |= function_ua_namespace0_93_begin(server, ns); -retVal |= function_ua_namespace0_94_begin(server, ns); -retVal |= function_ua_namespace0_95_begin(server, ns); -retVal |= function_ua_namespace0_96_begin(server, ns); -retVal |= function_ua_namespace0_97_begin(server, ns); -retVal |= function_ua_namespace0_98_begin(server, ns); -retVal |= function_ua_namespace0_99_begin(server, ns); -retVal |= function_ua_namespace0_100_begin(server, ns); -retVal |= function_ua_namespace0_101_begin(server, ns); -retVal |= function_ua_namespace0_102_begin(server, ns); -retVal |= function_ua_namespace0_103_begin(server, ns); -retVal |= function_ua_namespace0_104_begin(server, ns); -retVal |= function_ua_namespace0_105_begin(server, ns); -retVal |= function_ua_namespace0_106_begin(server, ns); -retVal |= function_ua_namespace0_107_begin(server, ns); -retVal |= function_ua_namespace0_108_begin(server, ns); -retVal |= function_ua_namespace0_109_begin(server, ns); -retVal |= function_ua_namespace0_110_begin(server, ns); -retVal |= function_ua_namespace0_111_begin(server, ns); -retVal |= function_ua_namespace0_112_begin(server, ns); -retVal |= function_ua_namespace0_113_begin(server, ns); -retVal |= function_ua_namespace0_114_begin(server, ns); -retVal |= function_ua_namespace0_115_begin(server, ns); -retVal |= function_ua_namespace0_116_begin(server, ns); -retVal |= function_ua_namespace0_117_begin(server, ns); -retVal |= function_ua_namespace0_118_begin(server, ns); -retVal |= function_ua_namespace0_119_begin(server, ns); -retVal |= function_ua_namespace0_120_begin(server, ns); -retVal |= function_ua_namespace0_121_begin(server, ns); -retVal |= function_ua_namespace0_122_begin(server, ns); -retVal |= function_ua_namespace0_123_begin(server, ns); -retVal |= function_ua_namespace0_124_begin(server, ns); -retVal |= function_ua_namespace0_125_begin(server, ns); -retVal |= function_ua_namespace0_126_begin(server, ns); -retVal |= function_ua_namespace0_127_begin(server, ns); -retVal |= function_ua_namespace0_128_begin(server, ns); -retVal |= function_ua_namespace0_129_begin(server, ns); -retVal |= function_ua_namespace0_130_begin(server, ns); -retVal |= function_ua_namespace0_131_begin(server, ns); -retVal |= function_ua_namespace0_132_begin(server, ns); -retVal |= function_ua_namespace0_133_begin(server, ns); -retVal |= function_ua_namespace0_133_finish(server, ns); -retVal |= function_ua_namespace0_132_finish(server, ns); -retVal |= function_ua_namespace0_131_finish(server, ns); -retVal |= function_ua_namespace0_130_finish(server, ns); -retVal |= function_ua_namespace0_129_finish(server, ns); -retVal |= function_ua_namespace0_128_finish(server, ns); -retVal |= function_ua_namespace0_127_finish(server, ns); -retVal |= function_ua_namespace0_126_finish(server, ns); -retVal |= function_ua_namespace0_125_finish(server, ns); -retVal |= function_ua_namespace0_124_finish(server, ns); -retVal |= function_ua_namespace0_123_finish(server, ns); -retVal |= function_ua_namespace0_122_finish(server, ns); -retVal |= function_ua_namespace0_121_finish(server, ns); -retVal |= function_ua_namespace0_120_finish(server, ns); -retVal |= function_ua_namespace0_119_finish(server, ns); -retVal |= function_ua_namespace0_118_finish(server, ns); -retVal |= function_ua_namespace0_117_finish(server, ns); -retVal |= function_ua_namespace0_116_finish(server, ns); -retVal |= function_ua_namespace0_115_finish(server, ns); -retVal |= function_ua_namespace0_114_finish(server, ns); -retVal |= function_ua_namespace0_113_finish(server, ns); -retVal |= function_ua_namespace0_112_finish(server, ns); -retVal |= function_ua_namespace0_111_finish(server, ns); -retVal |= function_ua_namespace0_110_finish(server, ns); -retVal |= function_ua_namespace0_109_finish(server, ns); -retVal |= function_ua_namespace0_108_finish(server, ns); -retVal |= function_ua_namespace0_107_finish(server, ns); -retVal |= function_ua_namespace0_106_finish(server, ns); -retVal |= function_ua_namespace0_105_finish(server, ns); -retVal |= function_ua_namespace0_104_finish(server, ns); -retVal |= function_ua_namespace0_103_finish(server, ns); -retVal |= function_ua_namespace0_102_finish(server, ns); -retVal |= function_ua_namespace0_101_finish(server, ns); -retVal |= function_ua_namespace0_100_finish(server, ns); -retVal |= function_ua_namespace0_99_finish(server, ns); -retVal |= function_ua_namespace0_98_finish(server, ns); -retVal |= function_ua_namespace0_97_finish(server, ns); -retVal |= function_ua_namespace0_96_finish(server, ns); -retVal |= function_ua_namespace0_95_finish(server, ns); -retVal |= function_ua_namespace0_94_finish(server, ns); -retVal |= function_ua_namespace0_93_finish(server, ns); -retVal |= function_ua_namespace0_92_finish(server, ns); -retVal |= function_ua_namespace0_91_finish(server, ns); -retVal |= function_ua_namespace0_90_finish(server, ns); -retVal |= function_ua_namespace0_89_finish(server, ns); -retVal |= function_ua_namespace0_88_finish(server, ns); -retVal |= function_ua_namespace0_87_finish(server, ns); -retVal |= function_ua_namespace0_86_finish(server, ns); -retVal |= function_ua_namespace0_85_finish(server, ns); -retVal |= function_ua_namespace0_84_finish(server, ns); -retVal |= function_ua_namespace0_83_finish(server, ns); -retVal |= function_ua_namespace0_82_finish(server, ns); -retVal |= function_ua_namespace0_81_finish(server, ns); -retVal |= function_ua_namespace0_80_finish(server, ns); -retVal |= function_ua_namespace0_79_finish(server, ns); -retVal |= function_ua_namespace0_78_finish(server, ns); -retVal |= function_ua_namespace0_77_finish(server, ns); -retVal |= function_ua_namespace0_76_finish(server, ns); -retVal |= function_ua_namespace0_75_finish(server, ns); -retVal |= function_ua_namespace0_74_finish(server, ns); -retVal |= function_ua_namespace0_73_finish(server, ns); -retVal |= function_ua_namespace0_72_finish(server, ns); -retVal |= function_ua_namespace0_71_finish(server, ns); -retVal |= function_ua_namespace0_70_finish(server, ns); -retVal |= function_ua_namespace0_69_finish(server, ns); -retVal |= function_ua_namespace0_68_finish(server, ns); -retVal |= function_ua_namespace0_67_finish(server, ns); -retVal |= function_ua_namespace0_66_finish(server, ns); -retVal |= function_ua_namespace0_65_finish(server, ns); -retVal |= function_ua_namespace0_64_finish(server, ns); -retVal |= function_ua_namespace0_63_finish(server, ns); -retVal |= function_ua_namespace0_62_finish(server, ns); -retVal |= function_ua_namespace0_61_finish(server, ns); -retVal |= function_ua_namespace0_60_finish(server, ns); -retVal |= function_ua_namespace0_59_finish(server, ns); -retVal |= function_ua_namespace0_58_finish(server, ns); -retVal |= function_ua_namespace0_57_finish(server, ns); -retVal |= function_ua_namespace0_56_finish(server, ns); -retVal |= function_ua_namespace0_55_finish(server, ns); -retVal |= function_ua_namespace0_54_finish(server, ns); -retVal |= function_ua_namespace0_53_finish(server, ns); -retVal |= function_ua_namespace0_52_finish(server, ns); -retVal |= function_ua_namespace0_51_finish(server, ns); -retVal |= function_ua_namespace0_50_finish(server, ns); -retVal |= function_ua_namespace0_49_finish(server, ns); -retVal |= function_ua_namespace0_48_finish(server, ns); -retVal |= function_ua_namespace0_47_finish(server, ns); -retVal |= function_ua_namespace0_46_finish(server, ns); -retVal |= function_ua_namespace0_45_finish(server, ns); -retVal |= function_ua_namespace0_44_finish(server, ns); -retVal |= function_ua_namespace0_43_finish(server, ns); -retVal |= function_ua_namespace0_42_finish(server, ns); -retVal |= function_ua_namespace0_41_finish(server, ns); -retVal |= function_ua_namespace0_40_finish(server, ns); -retVal |= function_ua_namespace0_39_finish(server, ns); -retVal |= function_ua_namespace0_38_finish(server, ns); -retVal |= function_ua_namespace0_37_finish(server, ns); -retVal |= function_ua_namespace0_36_finish(server, ns); -retVal |= function_ua_namespace0_35_finish(server, ns); -retVal |= function_ua_namespace0_34_finish(server, ns); -retVal |= function_ua_namespace0_33_finish(server, ns); -retVal |= function_ua_namespace0_32_finish(server, ns); -retVal |= function_ua_namespace0_31_finish(server, ns); -retVal |= function_ua_namespace0_30_finish(server, ns); -retVal |= function_ua_namespace0_29_finish(server, ns); -retVal |= function_ua_namespace0_28_finish(server, ns); -retVal |= function_ua_namespace0_27_finish(server, ns); -retVal |= function_ua_namespace0_26_finish(server, ns); -retVal |= function_ua_namespace0_25_finish(server, ns); -retVal |= function_ua_namespace0_24_finish(server, ns); -retVal |= function_ua_namespace0_23_finish(server, ns); -retVal |= function_ua_namespace0_22_finish(server, ns); -retVal |= function_ua_namespace0_21_finish(server, ns); -retVal |= function_ua_namespace0_20_finish(server, ns); -retVal |= function_ua_namespace0_19_finish(server, ns); -retVal |= function_ua_namespace0_18_finish(server, ns); -retVal |= function_ua_namespace0_17_finish(server, ns); -retVal |= function_ua_namespace0_16_finish(server, ns); -retVal |= function_ua_namespace0_15_finish(server, ns); -retVal |= function_ua_namespace0_14_finish(server, ns); -retVal |= function_ua_namespace0_13_finish(server, ns); -retVal |= function_ua_namespace0_12_finish(server, ns); -retVal |= function_ua_namespace0_11_finish(server, ns); -retVal |= function_ua_namespace0_10_finish(server, ns); -retVal |= function_ua_namespace0_9_finish(server, ns); -retVal |= function_ua_namespace0_8_finish(server, ns); -retVal |= function_ua_namespace0_7_finish(server, ns); -retVal |= function_ua_namespace0_6_finish(server, ns); -retVal |= function_ua_namespace0_5_finish(server, ns); -retVal |= function_ua_namespace0_4_finish(server, ns); -retVal |= function_ua_namespace0_3_finish(server, ns); -retVal |= function_ua_namespace0_2_finish(server, ns); -retVal |= function_ua_namespace0_1_finish(server, ns); -retVal |= function_ua_namespace0_0_finish(server, ns); -return retVal; +/***********************************/ +/* PubSub Jobs abstraction */ +/***********************************/ + +#ifndef UA_ENABLE_PUBSUB_CUSTOM_PUBLISH_HANDLING + +/* If UA_ENABLE_PUBSUB_CUSTOM_PUBLISH_INTERRUPT is enabled, a custom callback + * management must be linked to the application */ + +UA_StatusCode +UA_PubSubManager_addRepeatedCallback(UA_Server *server, UA_ServerCallback callback, + void *data, UA_Double interval_ms, UA_UInt64 *callbackId) { + return UA_Timer_addRepeatedCallback(&server->timer, (UA_ApplicationCallback)callback, + server, data, interval_ms, callbackId); +} + +UA_StatusCode +UA_PubSubManager_changeRepeatedCallbackInterval(UA_Server *server, UA_UInt64 callbackId, + UA_Double interval_ms) { + return UA_Timer_changeRepeatedCallbackInterval(&server->timer, callbackId, interval_ms); +} + +void +UA_PubSubManager_removeRepeatedPubSubCallback(UA_Server *server, UA_UInt64 callbackId) { + UA_Timer_removeCallback(&server->timer, callbackId); } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_server_binary.c" ***********************************/ +#endif /* UA_ENABLE_PUBSUB_CUSTOM_PUBLISH_HANDLING */ + +#endif /* UA_ENABLE_PUBSUB */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/pubsub/ua_pubsub_ns0.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2014-2016 (c) Sten Grüner - * Copyright 2014-2015, 2017 (c) Florian Palm - * Copyright 2015-2016 (c) Chris Iatrou - * Copyright 2015-2016 (c) Oleksiy Vasylyev - * Copyright 2016 (c) Joakim L. Gilje - * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2016 (c) TorbenD - * Copyright 2017 (c) frax2222 - * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB + * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner) + * Copyright (c) 2019 Kalycito Infotech Private Limited */ -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -// store the authentication token and session ID so we can help fuzzing by setting -// these values in the next request automatically -UA_NodeId unsafe_fuzz_authenticationToken = { - 0, UA_NODEIDTYPE_NUMERIC, {0} -}; -#endif +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL /* conditional compilation */ + +typedef struct{ + UA_NodeId parentNodeId; + UA_UInt32 parentClassifier; + UA_UInt32 elementClassiefier; +} UA_NodePropertyContext; + +//Prototypes +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode addWriterGroupAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output); +static UA_StatusCode removeGroupAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output); +static UA_StatusCode addDataSetWriterAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output); -#ifdef UA_DEBUG_DUMP_PKGS_FILE -void UA_debug_dumpCompleteChunk(UA_Server *const server, UA_Connection *const connection, UA_ByteString *messageBuffer); #endif -/********************/ -/* Helper Functions */ -/********************/ - - /* This is not an ERR message, the connection is not closed afterwards */ static UA_StatusCode -sendServiceFault(UA_SecureChannel *channel, const UA_ByteString *msg, - size_t offset, const UA_DataType *responseType, - UA_UInt32 requestId, UA_StatusCode error) { - UA_RequestHeader requestHeader; - UA_StatusCode retval = UA_RequestHeader_decodeBinary(msg, &offset, &requestHeader); - if(retval != UA_STATUSCODE_GOOD) - return retval; - UA_STACKARRAY(UA_Byte, response, responseType->memSize); - UA_init(response, responseType); - UA_ResponseHeader *responseHeader = (UA_ResponseHeader*)response; - responseHeader->requestHandle = requestHeader.requestHandle; - responseHeader->timestamp = UA_DateTime_now(); - responseHeader->serviceResult = error; - - // Send error message. Message type is MSG and not ERR, since we are on a securechannel! - retval = UA_SecureChannel_sendSymmetricMessage(channel, requestId, UA_MESSAGETYPE_MSG, - response, responseType); +addPubSubObjectNode(UA_Server *server, char* name, UA_UInt32 objectid, + UA_UInt32 parentid, UA_UInt32 referenceid, UA_UInt32 type_id) { + UA_ObjectAttributes object_attr = UA_ObjectAttributes_default; + object_attr.displayName = UA_LOCALIZEDTEXT("", name); + return UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(0, objectid), + UA_NODEID_NUMERIC(0, parentid), + UA_NODEID_NUMERIC(0, referenceid), + UA_QUALIFIEDNAME(0, name), + UA_NODEID_NUMERIC(0, type_id), + object_attr, NULL, NULL); +} - UA_RequestHeader_deleteMembers(&requestHeader); - UA_LOG_DEBUG(channel->securityPolicy->logger, UA_LOGCATEGORY_SERVER, - "Sent ServiceFault with error code %s", UA_StatusCode_name(error)); - return retval; +static UA_StatusCode +writePubSubNs0VariableArray(UA_Server *server, UA_UInt32 id, void *v, + size_t length, const UA_DataType *type) { + UA_Variant var; + UA_Variant_init(&var); + UA_Variant_setArray(&var, v, length, type); + return UA_Server_writeValue(server, UA_NODEID_NUMERIC(0, id), var); } -typedef enum { - UA_SERVICETYPE_NORMAL, - UA_SERVICETYPE_INSITU, - UA_SERVICETYPE_CUSTOM -} UA_ServiceType; +static UA_NodeId +findSingleChildNode(UA_Server *server, UA_QualifiedName targetName, + UA_NodeId referenceTypeId, UA_NodeId startingNode){ + UA_NodeId resultNodeId; + UA_RelativePathElement rpe; + UA_RelativePathElement_init(&rpe); + rpe.referenceTypeId = referenceTypeId; + rpe.isInverse = false; + rpe.includeSubtypes = false; + rpe.targetName = targetName; + UA_BrowsePath bp; + UA_BrowsePath_init(&bp); + bp.startingNode = startingNode; + bp.relativePath.elementsSize = 1; + bp.relativePath.elements = &rpe; + UA_BrowsePathResult bpr = + UA_Server_translateBrowsePathToNodeIds(server, &bp); + if(bpr.statusCode != UA_STATUSCODE_GOOD || + bpr.targetsSize < 1) + return UA_NODEID_NULL; + if(UA_NodeId_copy(&bpr.targets[0].targetId.nodeId, &resultNodeId) != UA_STATUSCODE_GOOD){ + UA_BrowsePathResult_deleteMembers(&bpr); + return UA_NODEID_NULL; + } + UA_BrowsePathResult_deleteMembers(&bpr); + return resultNodeId; +} static void -getServicePointers(UA_UInt32 requestTypeId, const UA_DataType **requestType, - const UA_DataType **responseType, UA_Service *service, - UA_InSituService *serviceInsitu, - UA_Boolean *requiresSession, UA_ServiceType *serviceType) { - switch(requestTypeId) { - case UA_NS0ID_GETENDPOINTSREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_GetEndpoints; - *requestType = &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]; - *requiresSession = false; - break; - case UA_NS0ID_FINDSERVERSREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_FindServers; - *requestType = &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]; - *requiresSession = false; - break; -#ifdef UA_ENABLE_DISCOVERY -# ifdef UA_ENABLE_DISCOVERY_MULTICAST - case UA_NS0ID_FINDSERVERSONNETWORKREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_FindServersOnNetwork; - *requestType = &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]; - *requiresSession = false; +onRead(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeid, void *context, + const UA_NumericRange *range, const UA_DataValue *data) { + UA_Variant value; + UA_Variant_init(&value); + const UA_NodePropertyContext *nodeContext = (const UA_NodePropertyContext*)context; + const UA_NodeId *myNodeId = &nodeContext->parentNodeId; + + switch(nodeContext->parentClassifier){ + case UA_NS0ID_PUBSUBCONNECTIONTYPE: { + UA_PubSubConnection *pubSubConnection = + UA_PubSubConnection_findConnectionbyId(server, *myNodeId); + switch(nodeContext->elementClassiefier) { + case UA_NS0ID_PUBSUBCONNECTIONTYPE_PUBLISHERID: + if(pubSubConnection->config->publisherIdType == UA_PUBSUB_PUBLISHERID_STRING) { + UA_Variant_setScalar(&value, &pubSubConnection->config->publisherId.numeric, + &UA_TYPES[UA_TYPES_STRING]); + } else { + UA_Variant_setScalar(&value, &pubSubConnection->config->publisherId.numeric, + &UA_TYPES[UA_TYPES_UINT32]); + } + break; + default: + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Read error! Unknown property."); + } break; -# endif - case UA_NS0ID_REGISTERSERVERREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_RegisterServer; - *requestType = &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]; - *requiresSession = false; + } + case UA_NS0ID_WRITERGROUPTYPE: { + UA_WriterGroup *writerGroup = UA_WriterGroup_findWGbyId(server, *myNodeId); + if(!writerGroup) + return; + switch(nodeContext->elementClassiefier){ + case UA_NS0ID_WRITERGROUPTYPE_PUBLISHINGINTERVAL: + UA_Variant_setScalar(&value, &writerGroup->config.publishingInterval, + &UA_TYPES[UA_TYPES_DURATION]); + break; + default: + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Read error! Unknown property."); + } break; - case UA_NS0ID_REGISTERSERVER2REQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_RegisterServer2; - *requestType = &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST]; - *responseType = &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]; - *requiresSession = false; + } + case UA_NS0ID_PUBLISHEDDATAITEMSTYPE: { + UA_PublishedDataSet *publishedDataSet = UA_PublishedDataSet_findPDSbyId(server, *myNodeId); + if(!publishedDataSet) + return; + switch(nodeContext->elementClassiefier) { + case UA_NS0ID_PUBLISHEDDATAITEMSTYPE_PUBLISHEDDATA: { + UA_PublishedVariableDataType *pvd = (UA_PublishedVariableDataType *) + UA_calloc(publishedDataSet->fieldSize, sizeof(UA_PublishedVariableDataType)); + size_t counter = 0; + UA_DataSetField *field; + LIST_FOREACH(field, &publishedDataSet->fields, listEntry) { + pvd[counter].attributeId = UA_ATTRIBUTEID_VALUE; + pvd[counter].publishedVariable = field->config.field.variable.publishParameters.publishedVariable; + //UA_NodeId_copy(&field->config.field.variable.publishParameters.publishedVariable, &pvd[counter].publishedVariable); + counter++; + } + UA_Variant_setArray(&value, pvd, publishedDataSet->fieldSize, + &UA_TYPES[UA_TYPES_PUBLISHEDVARIABLEDATATYPE]); + break; + } + case UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETMETADATA: { + UA_Variant_setScalarCopy(&value, &publishedDataSet->dataSetMetaData, &UA_TYPES[UA_TYPES_DATASETMETADATATYPE]); + break; + } + case UA_NS0ID_PUBLISHEDDATAITEMSTYPE_CONFIGURATIONVERSION: { + UA_Variant_setScalarCopy(&value, &publishedDataSet->dataSetMetaData.configurationVersion, + &UA_TYPES[UA_TYPES_CONFIGURATIONVERSIONDATATYPE]); + break; + } + default: + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Read error! Unknown property."); + } break; + } + default: + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Read error! Unknown parent element."); + } + UA_Server_writeValue(server, *nodeid, value); +} + +static void +onWrite(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeId, void *nodeContext, + const UA_NumericRange *range, const UA_DataValue *data){ + UA_Variant value; + UA_NodeId myNodeId; + UA_WriterGroup *writerGroup = NULL; + switch(((UA_NodePropertyContext *) nodeContext)->parentClassifier){ + case UA_NS0ID_PUBSUBCONNECTIONTYPE: + //no runtime writable attributes + break; + case UA_NS0ID_WRITERGROUPTYPE: + myNodeId = ((UA_NodePropertyContext *) nodeContext)->parentNodeId; + writerGroup = UA_WriterGroup_findWGbyId(server, myNodeId); + UA_WriterGroupConfig writerGroupConfig; + memset(&writerGroupConfig, 0, sizeof(writerGroupConfig)); + if(!writerGroup) + return; + switch(((UA_NodePropertyContext *) nodeContext)->elementClassiefier){ + case UA_NS0ID_WRITERGROUPTYPE_PUBLISHINGINTERVAL: + UA_Server_getWriterGroupConfig(server, writerGroup->identifier, &writerGroupConfig); + writerGroupConfig.publishingInterval = *((UA_Duration *) data->value.data); + UA_Server_updateWriterGroupConfig(server, writerGroup->identifier, &writerGroupConfig); + UA_Variant_setScalar(&value, data->value.data, &UA_TYPES[UA_TYPES_DURATION]); + UA_WriterGroupConfig_deleteMembers(&writerGroupConfig); + break; + default: + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Write error! Unknown property element."); + } + break; + default: + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Read error! Unknown parent element."); + } +} + +static UA_StatusCode +addVariableValueSource(UA_Server *server, UA_ValueCallback valueCallback, + UA_NodeId node, UA_NodePropertyContext *context){ + UA_Server_setNodeContext(server, node, context); + return UA_Server_setVariableNode_valueCallback(server, node, valueCallback); +} + +/*************************************************/ +/* PubSubConnection */ +/*************************************************/ +UA_StatusCode +addPubSubConnectionRepresentation(UA_Server *server, UA_PubSubConnection *connection){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + if(connection->config->name.length > 512) + return UA_STATUSCODE_BADOUTOFMEMORY; + UA_STACKARRAY(char, connectionName, sizeof(char) * connection->config->name.length +1); + memcpy(connectionName, connection->config->name.data, connection->config->name.length); + connectionName[connection->config->name.length] = '\0'; + //This code block must use a lock + UA_Nodestore_removeNode(server->nsCtx, &connection->identifier); + UA_NodeId pubSubConnectionNodeId; + UA_ObjectAttributes attr = UA_ObjectAttributes_default; + attr.displayName = UA_LOCALIZEDTEXT("de-DE", connectionName); + retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, + UA_NODEID_NUMERIC(0, connection->identifier.identifier.numeric), + UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPUBSUBCONNECTION), + UA_QUALIFIEDNAME(0, connectionName), + UA_NODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE), + (const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES], + NULL, &pubSubConnectionNodeId); + addPubSubObjectNode(server, "Address", connection->identifier.identifier.numeric+1, + pubSubConnectionNodeId.identifier.numeric, UA_NS0ID_HASCOMPONENT, + UA_NS0ID_NETWORKADDRESSURLTYPE); + UA_Server_addNode_finish(server, pubSubConnectionNodeId); + //End lock zone + + UA_NodeId addressNode, urlNode, interfaceNode, publisherIdNode, connectionPropertieNode, transportProfileUri; + addressNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Address"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_NODEID_NUMERIC(0, connection->identifier.identifier.numeric)); + urlNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Url"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), addressNode); + interfaceNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "NetworkInterface"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), addressNode); + publisherIdNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublisherId"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), + UA_NODEID_NUMERIC(0, connection->identifier.identifier.numeric)); + connectionPropertieNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "ConnectionProperties"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), + UA_NODEID_NUMERIC(0, connection->identifier.identifier.numeric)); + transportProfileUri = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "TransportProfileUri"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_NODEID_NUMERIC(0, connection->identifier.identifier.numeric)); + + if(UA_NodeId_equal(&addressNode, &UA_NODEID_NULL) || + UA_NodeId_equal(&urlNode, &UA_NODEID_NULL) || + UA_NodeId_equal(&interfaceNode, &UA_NODEID_NULL) || + UA_NodeId_equal(&publisherIdNode, &UA_NODEID_NULL) || + UA_NodeId_equal(&connectionPropertieNode, &UA_NODEID_NULL) || + UA_NodeId_equal(&transportProfileUri, &UA_NODEID_NULL)) { + return UA_STATUSCODE_BADNOTFOUND; + } + + retVal |= writePubSubNs0VariableArray(server, connectionPropertieNode.identifier.numeric, + connection->config->connectionProperties, + connection->config->connectionPropertiesSize, + &UA_TYPES[UA_TYPES_KEYVALUEPAIR]); + + UA_NetworkAddressUrlDataType *networkAddressUrlDataType = ((UA_NetworkAddressUrlDataType *) connection->config->address.data); + UA_Variant value; + UA_Variant_init(&value); + UA_Variant_setScalar(&value, &networkAddressUrlDataType->url, &UA_TYPES[UA_TYPES_STRING]); + UA_Server_writeValue(server, urlNode, value); + UA_Variant_setScalar(&value, &networkAddressUrlDataType->networkInterface, &UA_TYPES[UA_TYPES_STRING]); + UA_Server_writeValue(server, interfaceNode, value); + UA_Variant_setScalar(&value, &connection->config->transportProfileUri, &UA_TYPES[UA_TYPES_STRING]); + UA_Server_writeValue(server, transportProfileUri, value); + + UA_NodePropertyContext *connectionPublisherIdContext = (UA_NodePropertyContext *) UA_malloc(sizeof(UA_NodePropertyContext)); + connectionPublisherIdContext->parentNodeId = connection->identifier; + connectionPublisherIdContext->parentClassifier = UA_NS0ID_PUBSUBCONNECTIONTYPE; + connectionPublisherIdContext->elementClassiefier = UA_NS0ID_PUBSUBCONNECTIONTYPE_PUBLISHERID; + UA_ValueCallback valueCallback; + valueCallback.onRead = onRead; + valueCallback.onWrite = NULL; + retVal |= addVariableValueSource(server, valueCallback, publisherIdNode, connectionPublisherIdContext); + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS + retVal |= UA_Server_addReference(server, connection->identifier, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDWRITERGROUP), true); + retVal |= UA_Server_addReference(server, connection->identifier, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDREADERGROUP), true); + retVal |= UA_Server_addReference(server, connection->identifier, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_REMOVEGROUP), true); #endif - case UA_NS0ID_CREATESESSIONREQUEST_ENCODING_DEFAULTBINARY: - *service = NULL; //(UA_Service)Service_CreateSession; - *requestType = &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]; - *requiresSession = false; - *serviceType = UA_SERVICETYPE_CUSTOM; - break; - case UA_NS0ID_ACTIVATESESSIONREQUEST_ENCODING_DEFAULTBINARY: - *service = NULL; //(UA_Service)Service_ActivateSession; - *requestType = &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]; - *serviceType = UA_SERVICETYPE_CUSTOM; - break; - case UA_NS0ID_CLOSESESSIONREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_CloseSession; - *requestType = &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]; - break; - case UA_NS0ID_READREQUEST_ENCODING_DEFAULTBINARY: - *service = NULL; - *serviceInsitu = (UA_InSituService)Service_Read; - *requestType = &UA_TYPES[UA_TYPES_READREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_READRESPONSE]; - *serviceType = UA_SERVICETYPE_INSITU; - break; - case UA_NS0ID_WRITEREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_Write; - *requestType = &UA_TYPES[UA_TYPES_WRITEREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_WRITERESPONSE]; - break; - case UA_NS0ID_BROWSEREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_Browse; - *requestType = &UA_TYPES[UA_TYPES_BROWSEREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_BROWSERESPONSE]; - break; - case UA_NS0ID_BROWSENEXTREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_BrowseNext; - *requestType = &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]; - break; - case UA_NS0ID_REGISTERNODESREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_RegisterNodes; - *requestType = &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]; - break; - case UA_NS0ID_UNREGISTERNODESREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_UnregisterNodes; - *requestType = &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]; - break; - case UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_TranslateBrowsePathsToNodeIds; - *requestType = &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]; - break; + return retVal; +} -#ifdef UA_ENABLE_SUBSCRIPTIONS - case UA_NS0ID_CREATESUBSCRIPTIONREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_CreateSubscription; - *requestType = &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]; - break; - case UA_NS0ID_PUBLISHREQUEST_ENCODING_DEFAULTBINARY: - *requestType = &UA_TYPES[UA_TYPES_PUBLISHREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]; - break; - case UA_NS0ID_REPUBLISHREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_Republish; - *requestType = &UA_TYPES[UA_TYPES_REPUBLISHREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]; - break; - case UA_NS0ID_MODIFYSUBSCRIPTIONREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_ModifySubscription; - *requestType = &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]; - break; - case UA_NS0ID_SETPUBLISHINGMODEREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_SetPublishingMode; - *requestType = &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]; - break; - case UA_NS0ID_DELETESUBSCRIPTIONSREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_DeleteSubscriptions; - *requestType = &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]; - break; - case UA_NS0ID_CREATEMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_CreateMonitoredItems; - *requestType = &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]; - break; - case UA_NS0ID_DELETEMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_DeleteMonitoredItems; - *requestType = &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]; - break; - case UA_NS0ID_MODIFYMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_ModifyMonitoredItems; - *requestType = &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]; - break; - case UA_NS0ID_SETMONITORINGMODEREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_SetMonitoringMode; - *requestType = &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]; - break; +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +addPubSubConnectionAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + UA_PubSubConnectionDataType pubSubConnectionDataType = *((UA_PubSubConnectionDataType *) input[0].data); + UA_NetworkAddressUrlDataType networkAddressUrlDataType; + memset(&networkAddressUrlDataType, 0, sizeof(networkAddressUrlDataType)); + UA_ExtensionObject eo = pubSubConnectionDataType.address; + if(eo.encoding == UA_EXTENSIONOBJECT_DECODED){ + if(eo.content.decoded.type == &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]){ + if(UA_NetworkAddressUrlDataType_copy((UA_NetworkAddressUrlDataType *) eo.content.decoded.data, + &networkAddressUrlDataType) != UA_STATUSCODE_GOOD){ + return UA_STATUSCODE_BADOUTOFMEMORY; + } + } + } + UA_PubSubConnectionConfig connectionConfig; + memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig)); + connectionConfig.transportProfileUri = pubSubConnectionDataType.transportProfileUri; + connectionConfig.name = pubSubConnectionDataType.name; + //TODO set real connection state + connectionConfig.enabled = pubSubConnectionDataType.enabled; + //connectionConfig.enabled = pubSubConnectionDataType.enabled; + UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrlDataType, + &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]); + if(pubSubConnectionDataType.publisherId.type == &UA_TYPES[UA_TYPES_UINT32]){ + connectionConfig.publisherId.numeric = * ((UA_UInt32 *) pubSubConnectionDataType.publisherId.data); + } else if(pubSubConnectionDataType.publisherId.type == &UA_TYPES[UA_TYPES_STRING]){ + connectionConfig.publisherIdType = UA_PUBSUB_PUBLISHERID_STRING; + UA_String_copy((UA_String *) pubSubConnectionDataType.publisherId.data, &connectionConfig.publisherId.string); + } else { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, "Unsupported PublisherId Type used."); + //TODO what's the best default behaviour here? + connectionConfig.publisherId.numeric = 0; + } + //call API function and create the connection + UA_NodeId connectionId; + + retVal |= UA_Server_addPubSubConnection(server, &connectionConfig, &connectionId); + + if(retVal != UA_STATUSCODE_GOOD){ + return retVal; + } + for(size_t i = 0; i < pubSubConnectionDataType.writerGroupsSize; i++){ + //UA_PubSubConnection_addWriterGroup(server, UA_NODEID_NULL, NULL, NULL); + } + for(size_t i = 0; i < pubSubConnectionDataType.readerGroupsSize; i++){ + //UA_Server_addReaderGroup(server, NULL, NULL, NULL); + } + UA_NetworkAddressUrlDataType_deleteMembers(&networkAddressUrlDataType); + //set ouput value + UA_Variant_setScalarCopy(output, &connectionId, &UA_TYPES[UA_TYPES_NODEID]); + return UA_STATUSCODE_GOOD; +} #endif -#ifdef UA_ENABLE_METHODCALLS - case UA_NS0ID_CALLREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_Call; - *requestType = &UA_TYPES[UA_TYPES_CALLREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_CALLRESPONSE]; - break; +UA_StatusCode +removePubSubConnectionRepresentation(UA_Server *server, UA_PubSubConnection *connection){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS + retVal |= UA_Server_deleteReference(server, connection->identifier, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true, + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDWRITERGROUP), + false); + retVal |= UA_Server_deleteReference(server, connection->identifier, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true, + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDREADERGROUP), + false); + retVal |= UA_Server_deleteReference(server, connection->identifier, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true, + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_REMOVEGROUP), + false); #endif + retVal |= UA_Server_deleteNode(server, connection->identifier, true); + return retVal; +} -#ifdef UA_ENABLE_NODEMANAGEMENT - case UA_NS0ID_ADDNODESREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_AddNodes; - *requestType = &UA_TYPES[UA_TYPES_ADDNODESREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_ADDNODESRESPONSE]; - break; - case UA_NS0ID_ADDREFERENCESREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_AddReferences; - *requestType = &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]; - break; - case UA_NS0ID_DELETENODESREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_DeleteNodes; - *requestType = &UA_TYPES[UA_TYPES_DELETENODESREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_DELETENODESRESPONSE]; - break; - case UA_NS0ID_DELETEREFERENCESREQUEST_ENCODING_DEFAULTBINARY: - *service = (UA_Service)Service_DeleteReferences; - *requestType = &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST]; - *responseType = &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]; - break; +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +removeConnectionAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + UA_NodeId nodeToRemove = *((UA_NodeId *) input[0].data); + retVal |= UA_Server_removePubSubConnection(server, nodeToRemove); + if(retVal == UA_STATUSCODE_BADNOTFOUND) + retVal = UA_STATUSCODE_BADNODEIDUNKNOWN; + return retVal; +} #endif - default: - break; +/**********************************************/ +/* DataSetReader */ +/**********************************************/ +UA_StatusCode +addDataSetReaderRepresentation(UA_Server *server, UA_DataSetReader *dataSetReader){ + //TODO implement reader part + return UA_STATUSCODE_BADNOTIMPLEMENTED; +} + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +addDataSetReaderAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_StatusCode retVal = UA_STATUSCODE_BADNOTIMPLEMENTED; + //TODO implement reader part + return retVal; +} +#endif + +UA_StatusCode +removeDataSetReaderRepresentation(UA_Server *server, UA_DataSetReader* dataSetReader){ + //TODO implement reader part + return UA_STATUSCODE_BADNOTIMPLEMENTED; +} + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +removeDataSetReaderAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_StatusCode retVal = UA_STATUSCODE_BADNOTIMPLEMENTED; + //TODO implement reader part + return retVal; +} +#endif + +/*************************************************/ +/* PublishedDataSet */ +/*************************************************/ +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +addDataSetFolderAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + /* defined in R 1.04 9.1.4.5.7 */ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + UA_String newFolderName = *((UA_String *) input[0].data); + UA_NodeId generatedId; + UA_ObjectAttributes objectAttributes = UA_ObjectAttributes_default; + UA_LocalizedText name = {UA_STRING("en-US"), newFolderName}; + objectAttributes.displayName = name; + retVal |= UA_Server_addObjectNode(server, UA_NODEID_NULL, *objectId, UA_NODEID_NUMERIC(0,UA_NS0ID_ORGANIZES), + UA_QUALIFIEDNAME(0, "DataSetFolder"), UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE), + objectAttributes, NULL, &generatedId); + UA_Variant_setScalarCopy(output, &generatedId, &UA_TYPES[UA_TYPES_NODEID]); +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS + retVal |= UA_Server_addReference(server, generatedId, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMS), true); + retVal |= UA_Server_addReference(server, generatedId, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEPUBLISHEDDATASET), true); + retVal |= UA_Server_addReference(server, generatedId, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDDATASETFOLDER), true); + retVal |= UA_Server_addReference(server, generatedId, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEDATASETFOLDER), true); +#endif + return retVal; +} +#endif + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +removeDataSetFolderAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + UA_NodeId nodeToRemove = *((UA_NodeId *) input[0].data); +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS + retVal |= UA_Server_deleteReference(server, nodeToRemove, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true, + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMS), + false); + retVal |= UA_Server_deleteReference(server, nodeToRemove, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true, + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEPUBLISHEDDATASET), + false); + retVal |= UA_Server_deleteReference(server, nodeToRemove, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true, + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDDATASETFOLDER), + false); + retVal |= UA_Server_deleteReference(server, nodeToRemove, UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true, + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEDATASETFOLDER), + false); +#endif + retVal |= UA_Server_deleteNode(server, nodeToRemove, false); + return retVal; +} +#endif + +UA_StatusCode +addPublishedDataItemsRepresentation(UA_Server *server, UA_PublishedDataSet *publishedDataSet) { + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + if(publishedDataSet->config.name.length > 512) + return UA_STATUSCODE_BADOUTOFMEMORY; + UA_STACKARRAY(char, pdsName, sizeof(char) * publishedDataSet->config.name.length +1); + memcpy(pdsName, publishedDataSet->config.name.data, publishedDataSet->config.name.length); + pdsName[publishedDataSet->config.name.length] = '\0'; + //This code block must use a lock + UA_Nodestore_removeNode(server->nsCtx, &publishedDataSet->identifier); + retVal |= addPubSubObjectNode(server, pdsName, publishedDataSet->identifier.identifier.numeric, + UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS, + UA_NS0ID_HASPROPERTY, UA_NS0ID_PUBLISHEDDATAITEMSTYPE); + //End lock zone + + UA_ValueCallback valueCallback; + valueCallback.onRead = onRead; + valueCallback.onWrite = NULL; + + UA_NodeId configurationVersionNode = + findSingleChildNode(server, UA_QUALIFIEDNAME(0, "ConfigurationVersion"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), + UA_NODEID_NUMERIC(0, publishedDataSet->identifier.identifier.numeric)); + if(UA_NodeId_equal(&configurationVersionNode, &UA_NODEID_NULL)) + return UA_STATUSCODE_BADNOTFOUND; + + UA_NodePropertyContext * configurationVersionContext = (UA_NodePropertyContext *) + UA_malloc(sizeof(UA_NodePropertyContext)); + configurationVersionContext->parentNodeId = publishedDataSet->identifier; + configurationVersionContext->parentClassifier = UA_NS0ID_PUBLISHEDDATAITEMSTYPE; + configurationVersionContext->elementClassiefier = + UA_NS0ID_PUBLISHEDDATAITEMSTYPE_CONFIGURATIONVERSION; + retVal |= addVariableValueSource(server, valueCallback, configurationVersionNode, + configurationVersionContext); + + UA_NodeId publishedDataNode = + findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishedData"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), + UA_NODEID_NUMERIC(0, publishedDataSet->identifier.identifier.numeric)); + if(UA_NodeId_equal(&publishedDataNode, &UA_NODEID_NULL)) + return UA_STATUSCODE_BADNOTFOUND; + + UA_NodePropertyContext * publishingIntervalContext = (UA_NodePropertyContext *) + UA_malloc(sizeof(UA_NodePropertyContext)); + publishingIntervalContext->parentNodeId = publishedDataSet->identifier; + publishingIntervalContext->parentClassifier = UA_NS0ID_PUBLISHEDDATAITEMSTYPE; + publishingIntervalContext->elementClassiefier = UA_NS0ID_PUBLISHEDDATAITEMSTYPE_PUBLISHEDDATA; + retVal |= addVariableValueSource(server, valueCallback, publishedDataNode, + publishingIntervalContext); + + UA_NodeId dataSetMetaDataNode = + findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetMetaData"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), + UA_NODEID_NUMERIC(0, publishedDataSet->identifier.identifier.numeric)); + if(UA_NodeId_equal(&dataSetMetaDataNode, &UA_NODEID_NULL)) + return UA_STATUSCODE_BADNOTFOUND; + + UA_NodePropertyContext *metaDataContext = (UA_NodePropertyContext *) + UA_malloc(sizeof(UA_NodePropertyContext)); + metaDataContext->parentNodeId = publishedDataSet->identifier; + metaDataContext->parentClassifier = UA_NS0ID_PUBLISHEDDATAITEMSTYPE; + metaDataContext->elementClassiefier = UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETMETADATA; + retVal |= addVariableValueSource(server, valueCallback, dataSetMetaDataNode, metaDataContext); + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS + retVal |= UA_Server_addReference(server, publishedDataSet->identifier, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBLISHEDDATAITEMSTYPE_ADDVARIABLES), true); + retVal |= UA_Server_addReference(server, publishedDataSet->identifier, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBLISHEDDATAITEMSTYPE_REMOVEVARIABLES), true); +#endif + return retVal; +} + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +addPublishedDataItemsAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + size_t fieldNameAliasesSize = input[1].arrayLength; + UA_String * fieldNameAliases = (UA_String *) input[1].data; + size_t fieldFlagsSize = input[2].arrayLength; + UA_DataSetFieldFlags * fieldFlags = (UA_DataSetFieldFlags *) input[2].data; + size_t variablesToAddSize = input[3].arrayLength; + UA_PublishedVariableDataType *variablesToAddField = (UA_PublishedVariableDataType *) input[3].data; + + if(!(fieldNameAliasesSize == fieldFlagsSize || fieldFlagsSize == variablesToAddSize)) + return UA_STATUSCODE_BADINVALIDARGUMENT; + + UA_PublishedDataSetConfig publishedDataSetConfig; + memset(&publishedDataSetConfig, 0, sizeof(publishedDataSetConfig)); + publishedDataSetConfig.name = *((UA_String *) input[0].data); + publishedDataSetConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS; + + UA_NodeId dataSetItemsNodeId; + retVal |= UA_Server_addPublishedDataSet(server, &publishedDataSetConfig, &dataSetItemsNodeId).addResult; + + UA_DataSetFieldConfig dataSetFieldConfig; + for(size_t j = 0; j < variablesToAddSize; ++j) { + memset(&dataSetFieldConfig, 0, sizeof(dataSetFieldConfig)); + dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE; + dataSetFieldConfig.field.variable.fieldNameAlias = fieldNameAliases[j]; + if(fieldFlags[j] == UA_DATASETFIELDFLAGS_PROMOTEDFIELD){ + dataSetFieldConfig.field.variable.promotedField = UA_TRUE; + } + dataSetFieldConfig.field.variable.publishParameters = variablesToAddField[j]; + UA_Server_addDataSetField(server, dataSetItemsNodeId, &dataSetFieldConfig, NULL); } + UA_PublishedVariableDataType_clear(variablesToAddField); + return retVal; } +#endif -/*************************/ -/* Process Message Types */ -/*************************/ +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +addVariablesAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + + return retVal; +} -/* HEL -> Open up the connection */ static UA_StatusCode -processHEL(UA_Server *server, UA_Connection *connection, - const UA_ByteString *msg, size_t *offset) { - UA_TcpHelloMessage helloMessage; - UA_StatusCode retval = UA_TcpHelloMessage_decodeBinary(msg, offset, &helloMessage); +removeVariablesAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + + return retVal; +} +#endif + + +UA_StatusCode +removePublishedDataSetRepresentation(UA_Server *server, UA_PublishedDataSet *publishedDataSet){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + retVal |= UA_Server_deleteNode(server, publishedDataSet->identifier, false); + + return retVal; +} + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +removePublishedDataSetAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + UA_NodeId nodeToRemove = *((UA_NodeId *) input[0].data); + retVal |= UA_Server_removePublishedDataSet(server, nodeToRemove); + return retVal; +} +#endif + +/**********************************************/ +/* WriterGroup */ +/**********************************************/ + +static UA_StatusCode +readContentMask(UA_Server *server, const UA_NodeId *sessionId, + void *sessionContext, const UA_NodeId *nodeId, + void *nodeContext, UA_Boolean includeSourceTimeStamp, + const UA_NumericRange *range, UA_DataValue *value) { + UA_WriterGroup *writerGroup = (UA_WriterGroup*)nodeContext; + if((writerGroup->config.messageSettings.encoding != UA_EXTENSIONOBJECT_DECODED && + writerGroup->config.messageSettings.encoding != UA_EXTENSIONOBJECT_DECODED_NODELETE) || + writerGroup->config.messageSettings.content.decoded.type != + &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE]) + return UA_STATUSCODE_BADINTERNALERROR; + UA_UadpWriterGroupMessageDataType *wgm = (UA_UadpWriterGroupMessageDataType*) + writerGroup->config.messageSettings.content.decoded.data; + + UA_Variant_setScalarCopy(&value->value, &wgm->networkMessageContentMask, + &UA_TYPES[UA_TYPES_UADPNETWORKMESSAGECONTENTMASK]); + value->hasValue = true; + return UA_STATUSCODE_GOOD; +} + +static UA_StatusCode +writeContentMask(UA_Server *server, const UA_NodeId *sessionId, + void *sessionContext, const UA_NodeId *nodeId, + void *nodeContext, const UA_NumericRange *range, + const UA_DataValue *value) { + UA_WriterGroup *writerGroup = (UA_WriterGroup*)nodeContext; + if((writerGroup->config.messageSettings.encoding != UA_EXTENSIONOBJECT_DECODED && + writerGroup->config.messageSettings.encoding != UA_EXTENSIONOBJECT_DECODED_NODELETE) || + writerGroup->config.messageSettings.content.decoded.type != + &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE]) + return UA_STATUSCODE_BADINTERNALERROR; + UA_UadpWriterGroupMessageDataType *wgm = (UA_UadpWriterGroupMessageDataType*) + writerGroup->config.messageSettings.content.decoded.data; + + if(!value->value.type) + return UA_STATUSCODE_BADTYPEMISMATCH; + if(value->value.type->typeKind != UA_DATATYPEKIND_ENUM && + value->value.type->typeKind != UA_DATATYPEKIND_INT32) + return UA_STATUSCODE_BADTYPEMISMATCH; + + wgm->networkMessageContentMask = *(UA_UadpNetworkMessageContentMask*)value->value.data; + return UA_STATUSCODE_GOOD; +} + +UA_StatusCode +addWriterGroupRepresentation(UA_Server *server, UA_WriterGroup *writerGroup){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + if(writerGroup->config.name.length > 512) + return UA_STATUSCODE_BADOUTOFMEMORY; + UA_STACKARRAY(char, wgName, sizeof(char) * writerGroup->config.name.length + 1); + memcpy(wgName, writerGroup->config.name.data, writerGroup->config.name.length); + wgName[writerGroup->config.name.length] = '\0'; + //This code block must use a lock + UA_Nodestore_removeNode(server->nsCtx, &writerGroup->identifier); + retVal |= addPubSubObjectNode(server, wgName, writerGroup->identifier.identifier.numeric, + writerGroup->linkedConnection.identifier.numeric, + UA_NS0ID_HASCOMPONENT, UA_NS0ID_WRITERGROUPTYPE); + //End lock zone + UA_NodeId keepAliveNode = + findSingleChildNode(server, UA_QUALIFIEDNAME(0, "KeepAliveTime"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), + UA_NODEID_NUMERIC(0, writerGroup->identifier.identifier.numeric)); + UA_NodeId publishingIntervalNode = + findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishingInterval"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), + UA_NODEID_NUMERIC(0, writerGroup->identifier.identifier.numeric)); + if(UA_NodeId_equal(&keepAliveNode, &UA_NODEID_NULL) || + UA_NodeId_equal(&publishingIntervalNode, &UA_NODEID_NULL)) + return UA_STATUSCODE_BADNOTFOUND; + + UA_NodePropertyContext * publishingIntervalContext = (UA_NodePropertyContext *) + UA_malloc(sizeof(UA_NodePropertyContext)); + publishingIntervalContext->parentNodeId = writerGroup->identifier; + publishingIntervalContext->parentClassifier = UA_NS0ID_WRITERGROUPTYPE; + publishingIntervalContext->elementClassiefier = UA_NS0ID_WRITERGROUPTYPE_PUBLISHINGINTERVAL; + UA_ValueCallback valueCallback; + valueCallback.onRead = onRead; + valueCallback.onWrite = onWrite; + retVal |= addVariableValueSource(server, valueCallback, + publishingIntervalNode, publishingIntervalContext); + UA_Server_writeAccessLevel(server, publishingIntervalNode, + UA_ACCESSLEVELMASK_READ ^ UA_ACCESSLEVELMASK_WRITE); + + UA_NodeId priorityNode = + findSingleChildNode(server, UA_QUALIFIEDNAME(0, "Priority"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), + UA_NODEID_NUMERIC(0, writerGroup->identifier.identifier.numeric)); + UA_NodeId writerGroupIdNode = + findSingleChildNode(server, UA_QUALIFIEDNAME(0, "WriterGroupId"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), + UA_NODEID_NUMERIC(0, writerGroup->identifier.identifier.numeric)); + UA_Variant value; + UA_Variant_init(&value); + UA_Variant_setScalar(&value, &writerGroup->config.publishingInterval, &UA_TYPES[UA_TYPES_DURATION]); + UA_Server_writeValue(server, publishingIntervalNode, value); + UA_Variant_setScalar(&value, &writerGroup->config.keepAliveTime, &UA_TYPES[UA_TYPES_DURATION]); + UA_Server_writeValue(server, keepAliveNode, value); + UA_Variant_setScalar(&value, &writerGroup->config.priority, &UA_TYPES[UA_TYPES_BYTE]); + UA_Server_writeValue(server, priorityNode, value); + UA_Variant_setScalar(&value, &writerGroup->config.writerGroupId, &UA_TYPES[UA_TYPES_UINT16]); + UA_Server_writeValue(server, writerGroupIdNode, value); + + retVal |= addPubSubObjectNode(server, "MessageSettings", 0, + writerGroup->identifier.identifier.numeric, + UA_NS0ID_HASCOMPONENT, UA_NS0ID_UADPWRITERGROUPMESSAGETYPE); + + /* Find the variable with the content mask */ + + UA_NodeId messageSettingsId = + findSingleChildNode(server, UA_QUALIFIEDNAME(0, "MessageSettings"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_NODEID_NUMERIC(0, writerGroup->identifier.identifier.numeric)); + UA_NodeId contentMaskId = + findSingleChildNode(server, UA_QUALIFIEDNAME(0, "NetworkMessageContentMask"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), messageSettingsId); + if(UA_NodeId_equal(&messageSettingsId, &UA_NODEID_NULL) || + UA_NodeId_equal(&contentMaskId, &UA_NODEID_NULL)) { + return UA_STATUSCODE_BADNOTFOUND; + } + + /* Set the callback */ + UA_DataSource ds; + ds.read = readContentMask; + ds.write = writeContentMask; + UA_Server_setVariableNode_dataSource(server, contentMaskId, ds); + UA_Server_setNodeContext(server, contentMaskId, writerGroup); + + /* Make writable */ + UA_Server_writeAccessLevel(server, contentMaskId, + UA_ACCESSLEVELMASK_WRITE | UA_ACCESSLEVELMASK_READ); + + return retVal; +} + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +addWriterGroupAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + UA_WriterGroupDataType *writerGroupDataType = ((UA_WriterGroupDataType *) input[0].data); + UA_NodeId generatedId; + UA_WriterGroupConfig writerGroupConfig; + memset(&writerGroupConfig, 0, sizeof(UA_WriterGroupConfig)); + writerGroupConfig.name = writerGroupDataType->name; + writerGroupConfig.publishingInterval = writerGroupDataType->publishingInterval; + writerGroupConfig.writerGroupId = writerGroupDataType->writerGroupId; + writerGroupConfig.enabled = writerGroupDataType->enabled; + writerGroupConfig.priority = writerGroupDataType->priority; + //TODO remove hard coded UADP + writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP; + //ToDo transfer all arguments to internal WGConfiguration + retVal |= UA_Server_addWriterGroup(server, *objectId, &writerGroupConfig, &generatedId); + UA_Variant_setScalarCopy(output, &generatedId, &UA_TYPES[UA_TYPES_NODEID]); + return retVal; +} +#endif + +UA_StatusCode +removeGroupRepresentation(UA_Server *server, UA_WriterGroup *writerGroup) { + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + retVal |= UA_Server_deleteNode(server, writerGroup->identifier, false); + return retVal; +} + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +removeGroupAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + UA_NodeId nodeToRemove = *((UA_NodeId *) input[0].data); + if(UA_WriterGroup_findWGbyId(server, nodeToRemove) != NULL) + retVal |= UA_Server_removeWriterGroup(server, nodeToRemove); + //else + //retVal |= UA_Server_removeReaderGroup(server, nodeToRemve); + return retVal; +} +#endif + +/**********************************************/ +/* ReaderGroup */ +/**********************************************/ +UA_StatusCode +addReaderGroupRepresentation(UA_Server *server, UA_ReaderGroup *readerGroup){ + //TODO implement reader part + return UA_STATUSCODE_BADNOTIMPLEMENTED; +} + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +addReaderGroupAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + //TODO implement reader part + return retVal; +} +#endif + +/**********************************************/ +/* DataSetWriter */ +/**********************************************/ +UA_StatusCode +addDataSetWriterRepresentation(UA_Server *server, UA_DataSetWriter *dataSetWriter){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + if(dataSetWriter->config.name.length > 512) + return UA_STATUSCODE_BADOUTOFMEMORY; + UA_STACKARRAY(char, dswName, sizeof(char) * dataSetWriter->config.name.length + 1); + memcpy(dswName, dataSetWriter->config.name.data, dataSetWriter->config.name.length); + dswName[dataSetWriter->config.name.length] = '\0'; + //This code block must use a lock + UA_Nodestore_removeNode(server->nsCtx, &dataSetWriter->identifier); + retVal |= addPubSubObjectNode(server, dswName, dataSetWriter->identifier.identifier.numeric, + dataSetWriter->linkedWriterGroup.identifier.numeric, + UA_NS0ID_HASDATASETWRITER, UA_NS0ID_DATASETWRITERTYPE); + //End lock zone + retVal |= UA_Server_addReference(server, dataSetWriter->connectedDataSet, + UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETTOWRITER), + UA_EXPANDEDNODEID_NUMERIC(0, dataSetWriter->identifier.identifier.numeric), true); + + + retVal |= addPubSubObjectNode(server, "MessageSettings", 0, + dataSetWriter->identifier.identifier.numeric, + UA_NS0ID_HASCOMPONENT, UA_NS0ID_UADPDATASETWRITERMESSAGETYPE); + return retVal; +} + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +addDataSetWriterAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_DataSetWriterDataType *dataSetWriterDataType = (UA_DataSetWriterDataType *) input[0].data; + + UA_NodeId targetPDS = UA_NODEID_NULL; + for(size_t i = 0; i < server->pubSubManager.publishedDataSetsSize; ++i) { + if(UA_String_equal(&dataSetWriterDataType->dataSetName, + &server->pubSubManager.publishedDataSets[i].config.name)){ + targetPDS = server->pubSubManager.publishedDataSets[i].identifier; + } + } + if(UA_NodeId_isNull(&targetPDS)) + return UA_STATUSCODE_BADPARENTNODEIDINVALID; + + UA_NodeId generatedId; + UA_DataSetWriterConfig dataSetWriterConfig; + memset(&dataSetWriterConfig, 0, sizeof(UA_DataSetWriterConfig)); + dataSetWriterConfig.name = dataSetWriterDataType->name; + dataSetWriterConfig.dataSetName = dataSetWriterDataType->dataSetName; + dataSetWriterConfig.keyFrameCount = dataSetWriterDataType->keyFrameCount; + dataSetWriterConfig.dataSetWriterId = dataSetWriterDataType->dataSetWriterId; + + UA_Server_addDataSetWriter(server, *objectId, targetPDS, &dataSetWriterConfig, &generatedId); + UA_Variant_setScalarCopy(output, &generatedId, &UA_TYPES[UA_TYPES_NODEID]); + return UA_STATUSCODE_GOOD; +} +#endif + + +UA_StatusCode +removeDataSetWriterRepresentation(UA_Server *server, UA_DataSetWriter *dataSetWriter) { + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + retVal |= UA_Server_deleteNode(server, dataSetWriter->identifier, false); + return retVal; +} + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS +static UA_StatusCode +removeDataSetWriterAction(UA_Server *server, + const UA_NodeId *sessionId, void *sessionHandle, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext, + size_t inputSize, const UA_Variant *input, + size_t outputSize, UA_Variant *output){ + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + UA_NodeId nodeToRemove = *((UA_NodeId *) input[0].data); + retVal |= UA_Server_removeDataSetWriter(server, nodeToRemove); + return retVal; +} +#endif + +/**********************************************/ +/* Destructors */ +/**********************************************/ + +static void +connectionTypeDestructor(UA_Server *server, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *typeId, void *typeContext, + const UA_NodeId *nodeId, void **nodeContext) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "Connection destructor called!"); + UA_NodeId publisherIdNode; + publisherIdNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublisherId"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), *nodeId); + UA_NodePropertyContext *internalConnectionContext; + UA_Server_getNodeContext(server, publisherIdNode, (void **) &internalConnectionContext); + if(!UA_NodeId_equal(&UA_NODEID_NULL , &publisherIdNode)){ + UA_free(internalConnectionContext); + } + +} + +static void +writerGroupTypeDestructor(UA_Server *server, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *typeId, void *typeContext, + const UA_NodeId *nodeId, void **nodeContext) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "WriterGroup destructor called!"); + UA_NodeId intervalNode; + intervalNode = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishingInterval"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), *nodeId); + UA_NodePropertyContext *internalConnectionContext; + UA_Server_getNodeContext(server, intervalNode, (void **) &internalConnectionContext); + if(!UA_NodeId_equal(&UA_NODEID_NULL , &intervalNode)){ + UA_free(internalConnectionContext); + } +} + +static void +readerGroupTypeDestructor(UA_Server *server, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *typeId, void *typeContext, + const UA_NodeId *nodeId, void **nodeContext) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "ReaderGroup destructor called!"); +} + +static void +dataSetWriterTypeDestructor(UA_Server *server, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *typeId, void *typeContext, + const UA_NodeId *nodeId, void **nodeContext) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "DataSetWriter destructor called!"); +} + +static void +dataSetReaderTypeDestructor(UA_Server *server, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *typeId, void *typeContext, + const UA_NodeId *nodeId, void **nodeContext) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, "DataSetReader destructor called!"); +} + +static void +publishedDataItemsTypeDestructor(UA_Server *server, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *typeId, void *typeContext, + const UA_NodeId *nodeId, void **nodeContext) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_USERLAND, + "PublishedDataItems destructor called!"); + void *childContext; + UA_NodeId node = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "PublishedData"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), *nodeId); + UA_Server_getNodeContext(server, node, (void**)&childContext); + if(!UA_NodeId_equal(&UA_NODEID_NULL , &node)) + UA_free(childContext); + + node = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "ConfigurationVersion"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), + *nodeId); + UA_Server_getNodeContext(server, node, (void**)&childContext); + if(!UA_NodeId_equal(&UA_NODEID_NULL , &node)) + UA_free(childContext); + + node = findSingleChildNode(server, UA_QUALIFIEDNAME(0, "DataSetMetaData"), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), *nodeId); + UA_Server_getNodeContext(server, node, (void**)&childContext); + if(!UA_NodeId_equal(&node, &UA_NODEID_NULL)) + UA_free(childContext); +} + +UA_StatusCode +UA_Server_initPubSubNS0(UA_Server *server) { + UA_StatusCode retVal = UA_STATUSCODE_GOOD; + UA_String profileArray[1]; + profileArray[0] = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp"); + + retVal |= writePubSubNs0VariableArray(server, UA_NS0ID_PUBLISHSUBSCRIBE_SUPPORTEDTRANSPORTPROFILES, + profileArray, + 1, &UA_TYPES[UA_TYPES_STRING]); + +#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS + retVal |= UA_Server_setMethodNode_callback(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_ADDCONNECTION), addPubSubConnectionAction); + retVal |= UA_Server_setMethodNode_callback(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_REMOVECONNECTION), removeConnectionAction); + retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDDATASETFOLDER), true); + retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMS), true); + retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEPUBLISHEDDATASET), true); + retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS), + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEDATASETFOLDER), true); + retVal |= UA_Server_setMethodNode_callback(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDDATASETFOLDER), addDataSetFolderAction); + retVal |= UA_Server_setMethodNode_callback(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEDATASETFOLDER), removeDataSetFolderAction); + retVal |= UA_Server_setMethodNode_callback(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMS), addPublishedDataItemsAction); + retVal |= UA_Server_setMethodNode_callback(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETFOLDERTYPE_REMOVEPUBLISHEDDATASET), removePublishedDataSetAction); + retVal |= UA_Server_setMethodNode_callback(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHEDDATAITEMSTYPE_ADDVARIABLES), addVariablesAction); + retVal |= UA_Server_setMethodNode_callback(server, + UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHEDDATAITEMSTYPE_REMOVEVARIABLES), removeVariablesAction); + retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDWRITERGROUP), addWriterGroupAction); + retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDREADERGROUP), addReaderGroupAction); + retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE_REMOVEGROUP), removeGroupAction); + retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_WRITERGROUPTYPE_ADDDATASETWRITER), addDataSetWriterAction); + retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_WRITERGROUPTYPE_REMOVEDATASETWRITER), removeDataSetWriterAction); + retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_READERGROUPTYPE_ADDDATASETREADER), addDataSetReaderAction); + retVal |= UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(0, UA_NS0ID_READERGROUPTYPE_REMOVEDATASETREADER), removeDataSetReaderAction); + +#else + retVal |= UA_Server_deleteReference(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true, + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_ADDCONNECTION), + false); + retVal |= UA_Server_deleteReference(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), true, + UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE_REMOVECONNECTION), + false); +#endif + UA_NodeTypeLifecycle liveCycle; + liveCycle.constructor = NULL; + liveCycle.destructor = connectionTypeDestructor; + UA_Server_setNodeTypeLifecycle(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBSUBCONNECTIONTYPE), liveCycle); + liveCycle.destructor = writerGroupTypeDestructor; + UA_Server_setNodeTypeLifecycle(server, UA_NODEID_NUMERIC(0, UA_NS0ID_WRITERGROUPTYPE), liveCycle); + liveCycle.destructor = readerGroupTypeDestructor; + UA_Server_setNodeTypeLifecycle(server, UA_NODEID_NUMERIC(0, UA_NS0ID_READERGROUPTYPE), liveCycle); + liveCycle.destructor = dataSetWriterTypeDestructor; + UA_Server_setNodeTypeLifecycle(server, UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETWRITERDATATYPE), liveCycle); + liveCycle.destructor = publishedDataItemsTypeDestructor; + UA_Server_setNodeTypeLifecycle(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHEDDATAITEMSTYPE), liveCycle); + liveCycle.destructor = dataSetReaderTypeDestructor; + UA_Server_setNodeTypeLifecycle(server, UA_NODEID_NUMERIC(0, UA_NS0ID_DATASETREADERDATATYPE), liveCycle); + + return retVal; +} + +#endif /* UA_ENABLE_PUBSUB_INFORMATIONMODEL */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_services_view.c" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2019 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2014-2017 (c) Florian Palm + * Copyright 2015-2016 (c) Sten Grüner + * Copyright 2015 (c) LEvertz + * Copyright 2015 (c) Chris Iatrou + * Copyright 2015 (c) Ecosmos + * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2016 (c) Lorenz Haas + * Copyright 2017 (c) pschoppe + * Copyright 2017 (c) Julian Grothoff + * Copyright 2017 (c) Henrik Norrman + */ + + +/********************/ +/* Browse Recursive */ +/********************/ + +/* A RefTree holds a single array for both the NodeIds encountered during + * recursive browsing and the entries for a tree-structure to check for + * duplicates. Once the (recursive) browse has finished, the tree-structure part + * can be simply cut away. A single realloc operation (with some pointer + * repairing) can be used to increase the capacity of the RefTree. + * + * If an ExpandedNodeId is encountered, it has to be processed right away. + * Remote ExpandedNodeId are not put into the tree, since it is not possible to + * recurse into them anyway. + * + * The layout of the results array is as follows: + * + * | Targets [ExpandedNodeId] | Tree [RefEntry] | */ + +#define UA_BROWSE_INITIAL_SIZE 16 + +typedef struct RefEntry { + ZIP_ENTRY(RefEntry) zipfields; + const UA_ExpandedNodeId *target; + UA_UInt32 targetHash; /* Hash of the target nodeid */ +} RefEntry; + +static enum ZIP_CMP +cmpTarget(const void *a, const void *b) { + const RefEntry *aa = (const RefEntry*)a; + const RefEntry *bb = (const RefEntry*)b; + if(aa->targetHash < bb->targetHash) + return ZIP_CMP_LESS; + if(aa->targetHash > bb->targetHash) + return ZIP_CMP_MORE; + return (enum ZIP_CMP)UA_ExpandedNodeId_order(aa->target, bb->target); +} + +ZIP_HEAD(RefHead, RefEntry); +typedef struct RefHead RefHead; +ZIP_PROTTYPE(RefHead, RefEntry, RefEntry) +ZIP_IMPL(RefHead, RefEntry, zipfields, RefEntry, zipfields, cmpTarget) + +typedef struct { + UA_ExpandedNodeId *targets; + RefHead head; + size_t capacity; /* available space */ + size_t size; /* used space */ +} RefTree; + +static UA_StatusCode UA_FUNC_ATTR_WARN_UNUSED_RESULT +RefTree_init(RefTree *rt) { + size_t space = (sizeof(UA_ExpandedNodeId) + sizeof(RefEntry)) * UA_BROWSE_INITIAL_SIZE; + rt->targets = (UA_ExpandedNodeId*)UA_malloc(space); + if(!rt->targets) + return UA_STATUSCODE_BADOUTOFMEMORY; + rt->capacity = UA_BROWSE_INITIAL_SIZE; + rt->size = 0; + ZIP_INIT(&rt->head); + return UA_STATUSCODE_GOOD; +} + +static void +RefTree_clear(RefTree *rt) { + for(size_t i = 0; i < rt->size; i++) + UA_ExpandedNodeId_deleteMembers(&rt->targets[i]); + UA_free(rt->targets); +} + +/* Double the capacity of the reftree */ +static UA_StatusCode UA_FUNC_ATTR_WARN_UNUSED_RESULT +RefTree_double(RefTree *rt) { + size_t capacity = rt->capacity * 2; + UA_assert(capacity > 0); + size_t space = (sizeof(UA_ExpandedNodeId) + sizeof(RefEntry)) * capacity; + UA_ExpandedNodeId *newTargets = (UA_ExpandedNodeId*)UA_realloc(rt->targets, space); + if(!newTargets) + return UA_STATUSCODE_BADOUTOFMEMORY; + + /* Repair the pointers for the realloced array+tree */ + uintptr_t arraydiff = (uintptr_t)newTargets - (uintptr_t)rt->targets; + RefEntry *reArray = (RefEntry*) + ((uintptr_t)newTargets + (capacity * sizeof(UA_ExpandedNodeId))); + uintptr_t entrydiff = (uintptr_t)reArray - + ((uintptr_t)rt->targets + (rt->capacity * sizeof(UA_ExpandedNodeId))); + RefEntry *oldReArray = (RefEntry*) + ((uintptr_t)newTargets + (rt->capacity * sizeof(UA_ExpandedNodeId))); + memmove(reArray, oldReArray, rt->size * sizeof(RefEntry)); + for(size_t i = 0; i < rt->size; i++) { + if(reArray[i].zipfields.zip_left) + *(uintptr_t*)&reArray[i].zipfields.zip_left += entrydiff; + if(reArray[i].zipfields.zip_right) + *(uintptr_t*)&reArray[i].zipfields.zip_right += entrydiff; + *(uintptr_t*)&reArray[i].target += arraydiff; + } + + rt->head.zip_root = (RefEntry*)((uintptr_t)rt->head.zip_root + entrydiff); + rt->capacity = capacity; + rt->targets = newTargets; + return UA_STATUSCODE_GOOD; +} + +static UA_StatusCode UA_FUNC_ATTR_WARN_UNUSED_RESULT +RefTree_add(RefTree *rt, const UA_ExpandedNodeId *target) { + /* Is the target already in the tree? */ + RefEntry dummy; + dummy.target = target; + dummy.targetHash = UA_ExpandedNodeId_hash(target); + if(ZIP_FIND(RefHead, &rt->head, &dummy)) + return UA_STATUSCODE_GOOD; + + UA_StatusCode s = UA_STATUSCODE_GOOD; + if(rt->capacity <= rt->size) { + s = RefTree_double(rt); + if(s != UA_STATUSCODE_GOOD) + return s; + } + s = UA_ExpandedNodeId_copy(target, &rt->targets[rt->size]); + if(s != UA_STATUSCODE_GOOD) + return s; + RefEntry *re = (RefEntry*)((uintptr_t)rt->targets + + (sizeof(UA_ExpandedNodeId) * rt->capacity) + + (sizeof(RefEntry) * rt->size)); + re->target = &rt->targets[rt->size]; + re->targetHash = dummy.targetHash; + ZIP_INSERT(RefHead, &rt->head, re, ZIP_FFS32(UA_UInt32_random())); + rt->size++; + return UA_STATUSCODE_GOOD; +} + +static UA_Boolean +relevantReference(const UA_NodeId *refType, size_t relevantRefsSize, + const UA_NodeId *relevantRefs) { + if(!relevantRefs) + return true; + for(size_t i = 0; i < relevantRefsSize; i++) { + if(UA_NodeId_equal(refType, &relevantRefs[i])) + return true; + } + return false; +} + +static UA_StatusCode +addRelevantReferences(UA_Server *server, RefTree *rt, const UA_NodeId *nodeId, + size_t refTypesSize, const UA_NodeId *refTypes, + UA_BrowseDirection browseDirection) { + const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, nodeId); + if(!node) + return UA_STATUSCODE_BADNODEIDUNKNOWN; + + UA_StatusCode retval = UA_STATUSCODE_GOOD; + for(size_t i = 0; i < node->referencesSize; i++) { + UA_NodeReferenceKind *rk = &node->references[i]; + + /* Reference in the right direction? */ + if(rk->isInverse && browseDirection == UA_BROWSEDIRECTION_FORWARD) + continue; + if(!rk->isInverse && browseDirection == UA_BROWSEDIRECTION_INVERSE) + continue; + + /* Is the reference part of the hierarchy of references we look for? */ + if(!relevantReference(&rk->referenceTypeId, refTypesSize, refTypes)) + continue; + + for(size_t k = 0; k < rk->refTargetsSize; k++) { + retval = RefTree_add(rt, &rk->refTargets[k].target); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; + } + } + + cleanup: + UA_Nodestore_releaseNode(server->nsCtx, node); + return retval; +} + +UA_StatusCode +browseRecursive(UA_Server *server, + size_t startNodesSize, const UA_NodeId *startNodes, + size_t refTypesSize, const UA_NodeId *refTypes, + UA_BrowseDirection browseDirection, UA_Boolean includeStartNodes, + size_t *resultsSize, UA_ExpandedNodeId **results) { + RefTree rt; + UA_StatusCode retval = RefTree_init(&rt); if(retval != UA_STATUSCODE_GOOD) return retval; - /* Parameterize the connection */ - connection->remoteConf.maxChunkCount = helloMessage.maxChunkCount; /* zero -> unlimited */ - connection->remoteConf.maxMessageSize = helloMessage.maxMessageSize; /* zero -> unlimited */ - connection->remoteConf.protocolVersion = helloMessage.protocolVersion; - connection->remoteConf.recvBufferSize = helloMessage.receiveBufferSize; - if(connection->localConf.sendBufferSize > helloMessage.receiveBufferSize) - connection->localConf.sendBufferSize = helloMessage.receiveBufferSize; - connection->remoteConf.sendBufferSize = helloMessage.sendBufferSize; - if(connection->localConf.recvBufferSize > helloMessage.sendBufferSize) - connection->localConf.recvBufferSize = helloMessage.sendBufferSize; - UA_String_deleteMembers(&helloMessage.endpointUrl); + /* Add the start nodes? */ + UA_ExpandedNodeId en = UA_EXPANDEDNODEID_NULL; + for(size_t i = 0; i < startNodesSize && retval == UA_STATUSCODE_GOOD; i++) { + if(includeStartNodes) { + en.nodeId = startNodes[i]; + retval = RefTree_add(&rt, &en); + } else { + retval = addRelevantReferences(server, &rt, &startNodes[i], + refTypesSize, refTypes, browseDirection); + } + } + if(retval != UA_STATUSCODE_GOOD) { + RefTree_clear(&rt); + return retval; + } - if(connection->remoteConf.recvBufferSize == 0) { - UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_NETWORK, - "Connection %i | Remote end indicated a receive buffer size of 0. " - "Not able to send any messages.", - connection->sockfd); - return UA_STATUSCODE_BADINTERNALERROR; + /* Loop over the targets we have so far. This recurses, as new targets are + * added to rt. */ + for(size_t i = 0; i < rt.size; i++) { + /* Dont recurse into remote nodes */ + if(rt.targets[i].serverIndex > 0) + continue; + if(rt.targets[i].namespaceUri.data != NULL) + continue; + + retval = addRelevantReferences(server, &rt, &rt.targets[i].nodeId, + refTypesSize, refTypes, browseDirection); + if(retval != UA_STATUSCODE_GOOD) { + RefTree_clear(&rt); + return retval; + } + } + + if(rt.size > 0) { + *results = rt.targets; + *resultsSize = rt.size; + } else { + RefTree_clear(&rt); + } + + return UA_STATUSCODE_GOOD; +} + +/* Only if IncludeSubtypes is selected */ +UA_StatusCode +referenceSubtypes(UA_Server *server, const UA_NodeId *refType, + size_t *refTypesSize, UA_NodeId **refTypes) { + /* Leave refTypes == NULL */ + if(UA_NodeId_isNull(refType)) + return UA_STATUSCODE_GOOD; + + /* Browse recursive for the hierarchy of sub-references */ + UA_ExpandedNodeId *rt = NULL; + size_t rtSize = 0; + UA_NodeId hasSubtype = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE); + UA_StatusCode retval = browseRecursive(server, 1, refType, 1, &hasSubtype, + UA_BROWSEDIRECTION_FORWARD, true, &rtSize, &rt); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + UA_assert(rtSize > 0); + + /* Allocate space (realloc if non-NULL) */ + UA_NodeId *newRt = NULL; + if(!*refTypes) { + newRt = (UA_NodeId*)UA_malloc(rtSize * UA_TYPES[UA_TYPES_NODEID].memSize); + } else { + newRt = (UA_NodeId*)UA_realloc(*refTypes, (*refTypesSize + rtSize) * + UA_TYPES[UA_TYPES_NODEID].memSize); + } + if(!newRt) { + UA_Array_delete(rt, rtSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + *refTypes = newRt; + + /* Move NodeIds */ + for(size_t i = 0; i < rtSize; i++) { + (*refTypes)[*refTypesSize + i] = rt[i].nodeId; + UA_NodeId_init(&rt[i].nodeId); + } + *refTypesSize += rtSize; + UA_Array_delete(rt, rtSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); + return UA_STATUSCODE_GOOD; +} + +UA_StatusCode +UA_Server_browseRecursive(UA_Server *server, const UA_BrowseDescription *bd, + size_t *resultsSize, UA_ExpandedNodeId **results) { + /* Set the list of relevant reference types */ + UA_NodeId *refTypes = NULL; + size_t refTypesSize = 0; + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(!UA_NodeId_isNull(&bd->referenceTypeId)) { + if(!bd->includeSubtypes) { + refTypes = (UA_NodeId*)(uintptr_t)&bd->referenceTypeId; + refTypesSize = 1; + } else { + retval = referenceSubtypes(server, &bd->referenceTypeId, + &refTypesSize, &refTypes); + if(retval != UA_STATUSCODE_GOOD) + return retval; + } + } + + /* Browse */ + retval = browseRecursive(server, 1, &bd->nodeId, refTypesSize, refTypes, + bd->browseDirection, false, resultsSize, results); + + /* Clean up */ + if(refTypes && bd->includeSubtypes) + UA_Array_delete(refTypes, refTypesSize, &UA_TYPES[UA_TYPES_NODEID]); + return retval; +} + +/**********/ +/* Browse */ +/**********/ + +typedef struct { + size_t size; + size_t capacity; + UA_ReferenceDescription *descr; +} RefResult; + +static UA_StatusCode UA_FUNC_ATTR_WARN_UNUSED_RESULT +RefResult_init(RefResult *rr) { + memset(rr, 0, sizeof(RefResult)); + rr->descr = (UA_ReferenceDescription*) + UA_Array_new(UA_BROWSE_INITIAL_SIZE, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); + if(!rr->descr) + return UA_STATUSCODE_BADOUTOFMEMORY; + rr->capacity = UA_BROWSE_INITIAL_SIZE; + rr->size = 0; + return UA_STATUSCODE_GOOD; +} + +static UA_StatusCode UA_FUNC_ATTR_WARN_UNUSED_RESULT +RefResult_double(RefResult *rr) { + size_t newSize = rr->capacity * 2; + UA_ReferenceDescription *rd = (UA_ReferenceDescription*) + UA_realloc(rr->descr, newSize * sizeof(UA_ReferenceDescription)); + if(!rd) + return UA_STATUSCODE_BADOUTOFMEMORY; + memset(&rd[rr->size], 0, sizeof(UA_ReferenceDescription) * (newSize - rr->size)); + rr->descr = rd; + rr->capacity = newSize; + return UA_STATUSCODE_GOOD; +} + +static void +RefResult_clear(RefResult *rr) { + UA_assert(rr->descr != NULL); + for(size_t i = 0; i < rr->size; i++) + UA_ReferenceDescription_clear(&rr->descr[i]); + UA_free(rr->descr); +} + +struct ContinuationPoint { + ContinuationPoint *next; + UA_ByteString identifier; + UA_BrowseDescription browseDescription; + UA_UInt32 maxReferences; + + size_t relevantReferencesSize; + UA_NodeId *relevantReferences; + + /* The last point in the node references? */ + size_t referenceKindIndex; + size_t targetIndex; +}; + +ContinuationPoint * +ContinuationPoint_clear(ContinuationPoint *cp) { + UA_ByteString_deleteMembers(&cp->identifier); + UA_BrowseDescription_deleteMembers(&cp->browseDescription); + UA_Array_delete(cp->relevantReferences, cp->relevantReferencesSize, + &UA_TYPES[UA_TYPES_NODEID]); + return cp->next; +} + +/* Target node on top of the stack */ +static UA_StatusCode UA_FUNC_ATTR_WARN_UNUSED_RESULT +addReferenceDescription(UA_Server *server, RefResult *rr, const UA_NodeReferenceKind *ref, + UA_UInt32 mask, const UA_ExpandedNodeId *nodeId, const UA_Node *curr) { + /* Ensure capacity is left */ + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(rr->size >= rr->capacity) { + retval = RefResult_double(rr); + if(retval != UA_STATUSCODE_GOOD) + return retval; + } + + UA_ReferenceDescription *descr = &rr->descr[rr->size]; + + /* Fields without access to the actual node */ + retval = UA_ExpandedNodeId_copy(nodeId, &descr->nodeId); + if(mask & UA_BROWSERESULTMASK_REFERENCETYPEID) + retval |= UA_NodeId_copy(&ref->referenceTypeId, &descr->referenceTypeId); + if(mask & UA_BROWSERESULTMASK_ISFORWARD) + descr->isForward = !ref->isInverse; + + /* Remote references (ExpandedNodeId) are not further looked up here */ + if(!curr) { + UA_ReferenceDescription_deleteMembers(descr); + return retval; + } + + /* Fields that require the actual node */ + if(mask & UA_BROWSERESULTMASK_NODECLASS) + retval |= UA_NodeClass_copy(&curr->nodeClass, &descr->nodeClass); + if(mask & UA_BROWSERESULTMASK_BROWSENAME) + retval |= UA_QualifiedName_copy(&curr->browseName, &descr->browseName); + if(mask & UA_BROWSERESULTMASK_DISPLAYNAME) + retval |= UA_LocalizedText_copy(&curr->displayName, &descr->displayName); + if(mask & UA_BROWSERESULTMASK_TYPEDEFINITION) { + if(curr->nodeClass == UA_NODECLASS_OBJECT || + curr->nodeClass == UA_NODECLASS_VARIABLE) { + const UA_Node *type = getNodeType(server, curr); + if(type) { + retval |= UA_NodeId_copy(&type->nodeId, &descr->typeDefinition.nodeId); + UA_Nodestore_releaseNode(server->nsCtx, type); + } + } + } + + if(retval == UA_STATUSCODE_GOOD) + rr->size++; /* Increase the counter */ + else + UA_ReferenceDescription_deleteMembers(descr); + return retval; +} + +static UA_Boolean +matchClassMask(const UA_Node *node, UA_UInt32 nodeClassMask) { + if(nodeClassMask != UA_NODECLASS_UNSPECIFIED && + (node->nodeClass & nodeClassMask) == 0) + return false; + return true; +} + +/* Returns whether the node / continuationpoint is done */ +static UA_StatusCode +browseReferences(UA_Server *server, const UA_Node *node, + ContinuationPoint *cp, RefResult *rr, UA_Boolean *done) { + UA_assert(cp != NULL); + const UA_BrowseDescription *bd= &cp->browseDescription; + + size_t referenceKindIndex = cp->referenceKindIndex; + size_t targetIndex = cp->targetIndex; + + /* Loop over the node's references */ + const UA_Node *target = NULL; + UA_StatusCode retval = UA_STATUSCODE_GOOD; + for(; referenceKindIndex < node->referencesSize; ++referenceKindIndex) { + UA_NodeReferenceKind *rk = &node->references[referenceKindIndex]; + + /* Reference in the right direction? */ + if(rk->isInverse && bd->browseDirection == UA_BROWSEDIRECTION_FORWARD) + continue; + if(!rk->isInverse && bd->browseDirection == UA_BROWSEDIRECTION_INVERSE) + continue; + + /* Is the reference part of the hierarchy of references we look for? */ + if(!relevantReference(&rk->referenceTypeId, cp->relevantReferencesSize, + cp->relevantReferences)) + continue; + + /* Loop over the targets */ + for(; targetIndex < rk->refTargetsSize; ++targetIndex) { + target = NULL; + + /* Get the node if it is not a remote reference */ + if(rk->refTargets[targetIndex].target.serverIndex == 0 && + rk->refTargets[targetIndex].target.namespaceUri.data == NULL) { + target = UA_Nodestore_getNode(server->nsCtx, + &rk->refTargets[targetIndex].target.nodeId); + + /* Test if the node class matches */ + if(target && !matchClassMask(target, bd->nodeClassMask)) { + if(target) + UA_Nodestore_releaseNode(server->nsCtx, target); + continue; + } + } + + /* A match! Did we reach maxrefs? */ + if(rr->size >= cp->maxReferences) { + cp->referenceKindIndex = referenceKindIndex; + cp->targetIndex = targetIndex; + if(target) + UA_Nodestore_releaseNode(server->nsCtx, target); + return UA_STATUSCODE_GOOD; + } + + /* Copy the node description. Target is on top of the stack */ + retval = addReferenceDescription(server, rr, rk, bd->resultMask, + &rk->refTargets[targetIndex].target, target); + UA_Nodestore_releaseNode(server->nsCtx, target); + if(retval != UA_STATUSCODE_GOOD) + return retval; + } + + targetIndex = 0; /* Start at index 0 for the next reference kind */ + } + + /* The node is done */ + *done = true; + return UA_STATUSCODE_GOOD; +} + +/* Results for a single browsedescription. This is the inner loop for both + * Browse and BrowseNext. The ContinuationPoint contains all the data used. + * Including the BrowseDescription. Returns whether there are remaining + * references. */ +static UA_Boolean +browseWithContinuation(UA_Server *server, UA_Session *session, + ContinuationPoint *cp, UA_BrowseResult *result) { + const UA_BrowseDescription *descr = &cp->browseDescription; + + /* Is the browsedirection valid? */ + if(descr->browseDirection != UA_BROWSEDIRECTION_BOTH && + descr->browseDirection != UA_BROWSEDIRECTION_FORWARD && + descr->browseDirection != UA_BROWSEDIRECTION_INVERSE) { + result->statusCode = UA_STATUSCODE_BADBROWSEDIRECTIONINVALID; + return true; + } + + /* Is the reference type valid? */ + if(!UA_NodeId_isNull(&descr->referenceTypeId)) { + const UA_Node *reftype = UA_Nodestore_getNode(server->nsCtx, &descr->referenceTypeId); + if(!reftype) { + result->statusCode = UA_STATUSCODE_BADREFERENCETYPEIDINVALID; + return true; + } + + UA_Boolean isRef = (reftype->nodeClass == UA_NODECLASS_REFERENCETYPE); + UA_Nodestore_releaseNode(server->nsCtx, reftype); + + if(!isRef) { + result->statusCode = UA_STATUSCODE_BADREFERENCETYPEIDINVALID; + return true; + } + } + + const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &descr->nodeId); + if(!node) { + result->statusCode = UA_STATUSCODE_BADNODEIDUNKNOWN; + return true; + } + + RefResult rr; + result->statusCode = RefResult_init(&rr); + if(result->statusCode != UA_STATUSCODE_GOOD) { + UA_Nodestore_releaseNode(server->nsCtx, node); + return true; + } + + /* Browse the references */ + UA_Boolean done = false; + result->statusCode = browseReferences(server, node, cp, &rr, &done); + UA_Nodestore_releaseNode(server->nsCtx, node); + if(result->statusCode != UA_STATUSCODE_GOOD) { + RefResult_clear(&rr); + return true; + } + + /* Move results */ + if(rr.size > 0) { + result->references = rr.descr; + result->referencesSize = rr.size; + } else { + /* No relevant references, return array of length zero */ + RefResult_clear(&rr); + result->references = (UA_ReferenceDescription*)UA_EMPTY_ARRAY_SENTINEL; + } + + return done; +} + +/* Start to browse with no previous cp */ +void +Operation_Browse(UA_Server *server, UA_Session *session, const UA_UInt32 *maxrefs, + const UA_BrowseDescription *descr, UA_BrowseResult *result) { + /* Stack-allocate a temporary cp */ + UA_STACKARRAY(ContinuationPoint, cp, 1); + memset(cp, 0, sizeof(ContinuationPoint)); + cp->maxReferences = *maxrefs; + cp->browseDescription = *descr; /* Shallow copy. Deep-copy later if we persist the cp. */ + + /* How many references can we return at most? */ + if(cp->maxReferences == 0) { + if(server->config.maxReferencesPerNode != 0) { + cp->maxReferences = server->config.maxReferencesPerNode; + } else { + cp->maxReferences = UA_INT32_MAX; + } + } else { + if(server->config.maxReferencesPerNode != 0 && + cp->maxReferences > server->config.maxReferencesPerNode) { + cp->maxReferences= server->config.maxReferencesPerNode; + } + } + + /* Get the list of relevant reference types */ + if(!UA_NodeId_isNull(&descr->referenceTypeId)) { + if(!descr->includeSubtypes) { + cp->relevantReferences = (UA_NodeId*)(uintptr_t)&descr->referenceTypeId; + cp->relevantReferencesSize = 1; + } else { + result->statusCode = + referenceSubtypes(server, &descr->referenceTypeId, + &cp->relevantReferencesSize, &cp->relevantReferences); + if(result->statusCode != UA_STATUSCODE_GOOD) + return; + } + } + + UA_Boolean done = browseWithContinuation(server, session, cp, result); + + /* Exit early if done or an error occurred */ + if(done || result->statusCode != UA_STATUSCODE_GOOD) { + if(descr->includeSubtypes) + UA_Array_delete(cp->relevantReferences, cp->relevantReferencesSize, + &UA_TYPES[UA_TYPES_NODEID]); + return; + } + + /* Persist the new continuation point */ + + ContinuationPoint *cp2 = NULL; + UA_Guid *ident = NULL; + UA_StatusCode retval = UA_STATUSCODE_GOOD; + + /* Enough space for the continuation point? */ + if(session->availableContinuationPoints <= 0) { + retval = UA_STATUSCODE_BADNOCONTINUATIONPOINTS; + goto cleanup; + } + + /* Allocate and fill the data structure */ + cp2 = (ContinuationPoint*)UA_malloc(sizeof(ContinuationPoint)); + if(!cp2) { + retval = UA_STATUSCODE_BADOUTOFMEMORY; + goto cleanup; + } + memset(cp2, 0, sizeof(ContinuationPoint)); + cp2->referenceKindIndex = cp->referenceKindIndex; + cp2->targetIndex = cp->targetIndex; + cp2->maxReferences = cp->maxReferences; + + if(descr->includeSubtypes) { + cp2->relevantReferences = cp->relevantReferences; + cp2->relevantReferencesSize = cp->relevantReferencesSize; + } else { + retval = UA_Array_copy(cp->relevantReferences, cp->relevantReferencesSize, + (void**)&cp2->relevantReferences, &UA_TYPES[UA_TYPES_NODEID]); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; + cp2->relevantReferencesSize = cp->relevantReferencesSize; + } + + /* Copy the description */ + retval = UA_BrowseDescription_copy(descr, &cp2->browseDescription); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; + + /* Create a random bytestring via a Guid */ + ident = UA_Guid_new(); + if(!ident) { + retval = UA_STATUSCODE_BADOUTOFMEMORY; + goto cleanup; + } + *ident = UA_Guid_random(); + cp2->identifier.data = (UA_Byte*)ident; + cp2->identifier.length = sizeof(UA_Guid); + + /* Return the cp identifier */ + retval = UA_ByteString_copy(&cp2->identifier, &result->continuationPoint); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; + + /* Attach the cp to the session */ + cp2->next = session->continuationPoints; + session->continuationPoints = cp2; + --session->availableContinuationPoints; + return; + + cleanup: + if(cp2) { + ContinuationPoint_clear(cp2); + UA_free(cp2); + } + UA_BrowseResult_deleteMembers(result); + result->statusCode = retval; +} + +void Service_Browse(UA_Server *server, UA_Session *session, + const UA_BrowseRequest *request, UA_BrowseResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing BrowseRequest"); + + /* Test the number of operations in the request */ + if(server->config.maxNodesPerBrowse != 0 && + request->nodesToBrowseSize > server->config.maxNodesPerBrowse) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + /* No views supported at the moment */ + if(!UA_NodeId_isNull(&request->view.viewId)) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADVIEWIDUNKNOWN; + return; + } + + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_Browse, + &request->requestedMaxReferencesPerNode, + &request->nodesToBrowseSize, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION], + &response->resultsSize, &UA_TYPES[UA_TYPES_BROWSERESULT]); +} + +UA_BrowseResult +UA_Server_browse(UA_Server *server, UA_UInt32 maxReferences, + const UA_BrowseDescription *bd) { + UA_BrowseResult result; + UA_BrowseResult_init(&result); + Operation_Browse(server, &server->adminSession, &maxReferences, bd, &result); + return result; +} + +static void +Operation_BrowseNext(UA_Server *server, UA_Session *session, + const UA_Boolean *releaseContinuationPoints, + const UA_ByteString *continuationPoint, UA_BrowseResult *result) { + /* Find the continuation point */ + ContinuationPoint **prev = &session->continuationPoints, *cp; + while((cp = *prev)) { + if(UA_ByteString_equal(&cp->identifier, continuationPoint)) + break; + prev = &cp->next; + } + if(!cp) { + result->statusCode = UA_STATUSCODE_BADCONTINUATIONPOINTINVALID; + return; + } + + /* Remove the cp */ + if(*releaseContinuationPoints) { + *prev = ContinuationPoint_clear(cp); + UA_free(cp); + ++session->availableContinuationPoints; + return; + } + + /* Continue browsing */ + UA_Boolean done = browseWithContinuation(server, session, cp, result); + + if(done) { + /* Remove the cp if there are no references left */ + *prev = ContinuationPoint_clear(cp); + UA_free(cp); + ++session->availableContinuationPoints; + } else { + /* Return the cp identifier */ + UA_StatusCode retval = UA_ByteString_copy(&cp->identifier, &result->continuationPoint); + if(retval != UA_STATUSCODE_GOOD) { + UA_BrowseResult_deleteMembers(result); + result->statusCode = retval; + } + } +} + +void +Service_BrowseNext(UA_Server *server, UA_Session *session, + const UA_BrowseNextRequest *request, + UA_BrowseNextResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing BrowseNextRequest"); + UA_Boolean releaseContinuationPoints = request->releaseContinuationPoints; /* request is const */ + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_BrowseNext, + &releaseContinuationPoints, + &request->continuationPointsSize, &UA_TYPES[UA_TYPES_BYTESTRING], + &response->resultsSize, &UA_TYPES[UA_TYPES_BROWSERESULT]); +} + +UA_BrowseResult +UA_Server_browseNext(UA_Server *server, UA_Boolean releaseContinuationPoint, + const UA_ByteString *continuationPoint) { + UA_BrowseResult result; + UA_BrowseResult_init(&result); + Operation_BrowseNext(server, &server->adminSession, &releaseContinuationPoint, + continuationPoint, &result); + return result; +} + +/***********************/ +/* TranslateBrowsePath */ +/***********************/ + +static void +walkBrowsePathElementReferenceTargets(UA_BrowsePathResult *result, size_t *targetsSize, + UA_NodeId **next, size_t *nextSize, size_t *nextCount, + UA_UInt32 elemDepth, const UA_NodeReferenceKind *rk) { + /* Loop over the targets */ + for(size_t i = 0; i < rk->refTargetsSize; i++) { + UA_ExpandedNodeId *targetId = &rk->refTargets[i].target; + + /* Does the reference point to an external server? Then add to the + * targets with the right path depth. */ + if(targetId->serverIndex != 0) { + UA_BrowsePathTarget *tempTargets = + (UA_BrowsePathTarget*)UA_realloc(result->targets, + sizeof(UA_BrowsePathTarget) * (*targetsSize) * 2); + if(!tempTargets) { + result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + result->targets = tempTargets; + (*targetsSize) *= 2; + result->statusCode = UA_ExpandedNodeId_copy(targetId, + &result->targets[result->targetsSize].targetId); + result->targets[result->targetsSize].remainingPathIndex = elemDepth; + continue; + } + + /* Can we store the node in the array of candidates for deep-search? */ + if(*nextSize <= *nextCount) { + UA_NodeId *tempNext = + (UA_NodeId*)UA_realloc(*next, sizeof(UA_NodeId) * (*nextSize) * 2); + if(!tempNext) { + result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + *next = tempNext; + (*nextSize) *= 2; + } + + /* Add the node to the next array for the following path element */ + result->statusCode = UA_NodeId_copy(&targetId->nodeId, + &(*next)[*nextCount]); + if(result->statusCode != UA_STATUSCODE_GOOD) + return; + ++(*nextCount); + } +} + +static void +walkBrowsePathElement(UA_Server *server, UA_Session *session, UA_UInt32 nodeClassMask, + UA_BrowsePathResult *result, size_t *targetsSize, + const UA_RelativePathElement *elem, UA_UInt32 elemDepth, + const UA_QualifiedName *targetName, + const UA_NodeId *current, const size_t currentCount, + UA_NodeId **next, size_t *nextSize, size_t *nextCount) { + /* Return all references? */ + UA_Boolean all_refs = UA_NodeId_isNull(&elem->referenceTypeId); + if(!all_refs) { + const UA_Node *rootRef = UA_Nodestore_getNode(server->nsCtx, &elem->referenceTypeId); + if(!rootRef) + return; + UA_Boolean match = (rootRef->nodeClass == UA_NODECLASS_REFERENCETYPE); + UA_Nodestore_releaseNode(server->nsCtx, rootRef); + if(!match) + return; + } + + /* Iterate over all nodes at the current depth-level */ + for(size_t i = 0; i < currentCount; ++i) { + /* Get the node */ + const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, ¤t[i]); + if(!node) { + /* If we cannot find the node at depth 0, the starting node does not exist */ + if(elemDepth == 0) + result->statusCode = UA_STATUSCODE_BADNODEIDUNKNOWN; + continue; + } + + /* Test whether the node fits the class mask */ + if(!matchClassMask(node, nodeClassMask)) { + UA_Nodestore_releaseNode(server->nsCtx, node); + continue; + } + + /* Test whether the node has the target name required in the previous + * path element */ + if(targetName && (targetName->namespaceIndex != node->browseName.namespaceIndex || + !UA_String_equal(&targetName->name, &node->browseName.name))) { + UA_Nodestore_releaseNode(server->nsCtx, node); + continue; + } + + /* Loop over the nodes references */ + for(size_t r = 0; r < node->referencesSize && + result->statusCode == UA_STATUSCODE_GOOD; ++r) { + UA_NodeReferenceKind *rk = &node->references[r]; + + /* Does the direction of the reference match? */ + if(rk->isInverse != elem->isInverse) + continue; + + /* Is the node relevant? */ + if(!all_refs) { + if(!elem->includeSubtypes && !UA_NodeId_equal(&rk->referenceTypeId, &elem->referenceTypeId)) + continue; + if(!isNodeInTree(server->nsCtx, &rk->referenceTypeId, &elem->referenceTypeId, &subtypeId, 1)) + continue; + } + + /* Walk over the reference targets */ + walkBrowsePathElementReferenceTargets(result, targetsSize, next, nextSize, + nextCount, elemDepth, rk); + } + + UA_Nodestore_releaseNode(server->nsCtx, node); + } +} + +/* This assumes that result->targets has enough room for all currentCount elements */ +static void +addBrowsePathTargets(UA_Server *server, UA_Session *session, UA_UInt32 nodeClassMask, + UA_BrowsePathResult *result, const UA_QualifiedName *targetName, + UA_NodeId *current, size_t currentCount) { + for(size_t i = 0; i < currentCount; i++) { + const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, ¤t[i]); + if(!node) { + UA_NodeId_deleteMembers(¤t[i]); + continue; + } + + /* Test whether the node fits the class mask */ + UA_Boolean skip = !matchClassMask(node, nodeClassMask); + + /* Test whether the node has the target name required in the + * previous path element */ + if(targetName->namespaceIndex != node->browseName.namespaceIndex || + !UA_String_equal(&targetName->name, &node->browseName.name)) + skip = true; + + UA_Nodestore_releaseNode(server->nsCtx, node); + + if(skip) { + UA_NodeId_deleteMembers(¤t[i]); + continue; + } + + /* Move the nodeid to the target array */ + UA_BrowsePathTarget_init(&result->targets[result->targetsSize]); + result->targets[result->targetsSize].targetId.nodeId = current[i]; + result->targets[result->targetsSize].remainingPathIndex = UA_UINT32_MAX; + ++result->targetsSize; + } +} + +static void +walkBrowsePath(UA_Server *server, UA_Session *session, const UA_BrowsePath *path, + UA_UInt32 nodeClassMask, UA_BrowsePathResult *result, size_t targetsSize, + UA_NodeId **current, size_t *currentSize, size_t *currentCount, + UA_NodeId **next, size_t *nextSize, size_t *nextCount) { + UA_assert(*currentCount == 1); + UA_assert(*nextCount == 0); + + /* Points to the targetName of the _previous_ path element */ + const UA_QualifiedName *targetName = NULL; + + /* Iterate over path elements */ + UA_assert(path->relativePath.elementsSize > 0); + for(UA_UInt32 i = 0; i < path->relativePath.elementsSize; ++i) { + walkBrowsePathElement(server, session, nodeClassMask, result, &targetsSize, + &path->relativePath.elements[i], i, targetName, + *current, *currentCount, next, nextSize, nextCount); + + /* Clean members of current */ + for(size_t j = 0; j < *currentCount; j++) + UA_NodeId_deleteMembers(&(*current)[j]); + *currentCount = 0; + + /* When no targets are left or an error occurred. None of next's + * elements will be copied to result->targets */ + if(*nextCount == 0 || result->statusCode != UA_STATUSCODE_GOOD) { + UA_assert(*currentCount == 0); + UA_assert(*nextCount == 0); + return; + } + + /* Exchange current and next for the next depth */ + size_t tSize = *currentSize; size_t tCount = *currentCount; UA_NodeId *tT = *current; + *currentSize = *nextSize; *currentCount = *nextCount; *current = *next; + *nextSize = tSize; *nextCount = tCount; *next = tT; + + /* Store the target name of the previous path element */ + targetName = &path->relativePath.elements[i].targetName; + } + + UA_assert(targetName != NULL); + UA_assert(*nextCount == 0); + + /* After the last BrowsePathElement, move members from current to the + * result targets */ + + /* Realloc if more space is needed */ + if(targetsSize < result->targetsSize + (*currentCount)) { + UA_BrowsePathTarget *newTargets = + (UA_BrowsePathTarget*)UA_realloc(result->targets, sizeof(UA_BrowsePathTarget) * + (result->targetsSize + (*currentCount))); + if(!newTargets) { + result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; + for(size_t i = 0; i < *currentCount; ++i) + UA_NodeId_deleteMembers(&(*current)[i]); + *currentCount = 0; + return; + } + result->targets = newTargets; + } + + /* Move the elements of current to the targets */ + addBrowsePathTargets(server, session, nodeClassMask, result, targetName, *current, *currentCount); + *currentCount = 0; +} + +static void +Operation_TranslateBrowsePathToNodeIds(UA_Server *server, UA_Session *session, + const UA_UInt32 *nodeClassMask, const UA_BrowsePath *path, + UA_BrowsePathResult *result) { + if(path->relativePath.elementsSize <= 0) { + result->statusCode = UA_STATUSCODE_BADNOTHINGTODO; + return; + } + + /* RelativePath elements must not have an empty targetName */ + for(size_t i = 0; i < path->relativePath.elementsSize; ++i) { + if(UA_QualifiedName_isNull(&path->relativePath.elements[i].targetName)) { + result->statusCode = UA_STATUSCODE_BADBROWSENAMEINVALID; + return; + } + } + + /* Allocate memory for the targets */ + size_t targetsSize = 10; /* When to realloc; the member count is stored in + * result->targetsSize */ + result->targets = + (UA_BrowsePathTarget*)UA_malloc(sizeof(UA_BrowsePathTarget) * targetsSize); + if(!result->targets) { + result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + + /* Allocate memory for two temporary arrays. One with the results for the + * previous depth of the path. The other for the new results at the current + * depth. The two arrays alternate as we descend down the tree. */ + size_t currentSize = 10; /* When to realloc */ + size_t currentCount = 0; /* Current elements */ + UA_NodeId *current = (UA_NodeId*)UA_malloc(sizeof(UA_NodeId) * currentSize); + if(!current) { + result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; + UA_free(result->targets); + return; + } + size_t nextSize = 10; /* When to realloc */ + size_t nextCount = 0; /* Current elements */ + UA_NodeId *next = (UA_NodeId*)UA_malloc(sizeof(UA_NodeId) * nextSize); + if(!next) { + result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; + UA_free(result->targets); + UA_free(current); + return; + } + + /* Copy the starting node into current */ + result->statusCode = UA_NodeId_copy(&path->startingNode, ¤t[0]); + if(result->statusCode != UA_STATUSCODE_GOOD) { + UA_free(result->targets); + UA_free(current); + UA_free(next); + return; + } + currentCount = 1; + + /* Walk the path elements */ + walkBrowsePath(server, session, path, *nodeClassMask, result, targetsSize, + ¤t, ¤tSize, ¤tCount, + &next, &nextSize, &nextCount); + + UA_assert(currentCount == 0); + UA_assert(nextCount == 0); + + /* No results => BadNoMatch status code */ + if(result->targetsSize == 0 && result->statusCode == UA_STATUSCODE_GOOD) + result->statusCode = UA_STATUSCODE_BADNOMATCH; + + /* Clean up the temporary arrays and the targets */ + UA_free(current); + UA_free(next); + if(result->statusCode != UA_STATUSCODE_GOOD) { + for(size_t i = 0; i < result->targetsSize; ++i) + UA_BrowsePathTarget_deleteMembers(&result->targets[i]); + UA_free(result->targets); + result->targets = NULL; + result->targetsSize = 0; + } +} + +UA_BrowsePathResult +UA_Server_translateBrowsePathToNodeIds(UA_Server *server, + const UA_BrowsePath *browsePath) { + UA_BrowsePathResult result; + UA_BrowsePathResult_init(&result); + UA_UInt32 nodeClassMask = 0; /* All node classes */ + Operation_TranslateBrowsePathToNodeIds(server, &server->adminSession, &nodeClassMask, + browsePath, &result); + return result; +} + +void +Service_TranslateBrowsePathsToNodeIds(UA_Server *server, UA_Session *session, + const UA_TranslateBrowsePathsToNodeIdsRequest *request, + UA_TranslateBrowsePathsToNodeIdsResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing TranslateBrowsePathsToNodeIdsRequest"); + + /* Test the number of operations in the request */ + if(server->config.maxNodesPerTranslateBrowsePathsToNodeIds != 0 && + request->browsePathsSize > server->config.maxNodesPerTranslateBrowsePathsToNodeIds) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + UA_UInt32 nodeClassMask = 0; /* All node classes */ + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, + (UA_ServiceOperation)Operation_TranslateBrowsePathToNodeIds, + &nodeClassMask, + &request->browsePathsSize, &UA_TYPES[UA_TYPES_BROWSEPATH], + &response->resultsSize, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT]); +} + +UA_BrowsePathResult +UA_Server_browseSimplifiedBrowsePath(UA_Server *server, const UA_NodeId origin, + size_t browsePathSize, const UA_QualifiedName *browsePath) { + /* Construct the BrowsePath */ + UA_BrowsePath bp; + UA_BrowsePath_init(&bp); + bp.startingNode = origin; + UA_STACKARRAY(UA_RelativePathElement, rpe, browsePathSize); + memset(rpe, 0, sizeof(UA_RelativePathElement) * browsePathSize); + for(size_t j = 0; j < browsePathSize; j++) { + rpe[j].referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES); + rpe[j].includeSubtypes = true; + rpe[j].targetName = browsePath[j]; + } + bp.relativePath.elements = rpe; + bp.relativePath.elementsSize = browsePathSize; + + /* Browse */ + UA_BrowsePathResult bpr; + UA_BrowsePathResult_init(&bpr); + UA_UInt32 nodeClassMask = UA_NODECLASS_OBJECT | UA_NODECLASS_VARIABLE; + Operation_TranslateBrowsePathToNodeIds(server, &server->adminSession, &nodeClassMask, &bp, &bpr); + return bpr; +} + +/************/ +/* Register */ +/************/ + +void Service_RegisterNodes(UA_Server *server, UA_Session *session, + const UA_RegisterNodesRequest *request, + UA_RegisterNodesResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing RegisterNodesRequest"); + + //TODO: hang the nodeids to the session if really needed + if(request->nodesToRegisterSize == 0) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO; + return; + } + + /* Test the number of operations in the request */ + if(server->config.maxNodesPerRegisterNodes != 0 && + request->nodesToRegisterSize > server->config.maxNodesPerRegisterNodes) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + response->responseHeader.serviceResult = + UA_Array_copy(request->nodesToRegister, request->nodesToRegisterSize, + (void**)&response->registeredNodeIds, &UA_TYPES[UA_TYPES_NODEID]); + if(response->responseHeader.serviceResult == UA_STATUSCODE_GOOD) + response->registeredNodeIdsSize = request->nodesToRegisterSize; +} + +void Service_UnregisterNodes(UA_Server *server, UA_Session *session, + const UA_UnregisterNodesRequest *request, + UA_UnregisterNodesResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing UnRegisterNodesRequest"); + + //TODO: remove the nodeids from the session if really needed + if(request->nodesToUnregisterSize == 0) + response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO; + + /* Test the number of operations in the request */ + if(server->config.maxNodesPerRegisterNodes != 0 && + request->nodesToUnregisterSize > server->config.maxNodesPerRegisterNodes) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } +} + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_services_method.c" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2015 (c) Chris Iatrou + * Copyright 2015-2017 (c) Florian Palm + * Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2015-2016 (c) Sten Grüner + * Copyright 2015 (c) Oleksiy Vasylyev + * Copyright 2016 (c) LEvertz + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Julian Grothoff + */ + + +#ifdef UA_ENABLE_METHODCALLS /* conditional compilation */ + +static const UA_VariableNode * +getArgumentsVariableNode(UA_Server *server, const UA_MethodNode *ofMethod, + UA_String withBrowseName) { + UA_NodeId hasProperty = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY); + for(size_t i = 0; i < ofMethod->referencesSize; ++i) { + UA_NodeReferenceKind *rk = &ofMethod->references[i]; + + if(rk->isInverse != false) + continue; + + if(!UA_NodeId_equal(&hasProperty, &rk->referenceTypeId)) + continue; + + for(size_t j = 0; j < rk->refTargetsSize; ++j) { + const UA_Node *refTarget = + UA_Nodestore_getNode(server->nsCtx, &rk->refTargets[j].target.nodeId); + if(!refTarget) + continue; + if(refTarget->nodeClass == UA_NODECLASS_VARIABLE && + refTarget->browseName.namespaceIndex == 0 && + UA_String_equal(&withBrowseName, &refTarget->browseName.name)) { + return (const UA_VariableNode*)refTarget; + } + UA_Nodestore_releaseNode(server->nsCtx, refTarget); + } + } + return NULL; +} + +/* inputArgumentResults has the length request->inputArgumentsSize */ +static UA_StatusCode +typeCheckArguments(UA_Server *server, UA_Session *session, + const UA_VariableNode *argRequirements, size_t argsSize, + UA_Variant *args, UA_StatusCode *inputArgumentResults) { + /* Verify that we have a Variant containing UA_Argument (scalar or array) in + * the "InputArguments" node */ + if(argRequirements->valueSource != UA_VALUESOURCE_DATA) + return UA_STATUSCODE_BADINTERNALERROR; + if(!argRequirements->value.data.value.hasValue) + return UA_STATUSCODE_BADINTERNALERROR; + if(argRequirements->value.data.value.value.type != &UA_TYPES[UA_TYPES_ARGUMENT]) + return UA_STATUSCODE_BADINTERNALERROR; + + /* Verify the number of arguments. A scalar argument value is interpreted as + * an array of length 1. */ + size_t argReqsSize = argRequirements->value.data.value.value.arrayLength; + if(UA_Variant_isScalar(&argRequirements->value.data.value.value)) + argReqsSize = 1; + if(argReqsSize > argsSize) + return UA_STATUSCODE_BADARGUMENTSMISSING; + if(argReqsSize < argsSize) + return UA_STATUSCODE_BADTOOMANYARGUMENTS; + + /* Type-check every argument against the definition */ + UA_StatusCode retval = UA_STATUSCODE_GOOD; + UA_Argument *argReqs = (UA_Argument*)argRequirements->value.data.value.value.data; + for(size_t i = 0; i < argReqsSize; ++i) { + if(!compatibleValue(server, session, &argReqs[i].dataType, argReqs[i].valueRank, + argReqs[i].arrayDimensionsSize, argReqs[i].arrayDimensions, + &args[i], NULL)) { + inputArgumentResults[i] = UA_STATUSCODE_BADTYPEMISMATCH; + retval = UA_STATUSCODE_BADINVALIDARGUMENT; + } + } + return retval; +} + +/* inputArgumentResults has the length request->inputArgumentsSize */ +static UA_StatusCode +validMethodArguments(UA_Server *server, UA_Session *session, const UA_MethodNode *method, + const UA_CallMethodRequest *request, + UA_StatusCode *inputArgumentResults) { + /* Get the input arguments node */ + const UA_VariableNode *inputArguments = + getArgumentsVariableNode(server, method, UA_STRING("InputArguments")); + if(!inputArguments) { + if(request->inputArgumentsSize > 0) + return UA_STATUSCODE_BADTOOMANYARGUMENTS; + return UA_STATUSCODE_GOOD; + } + + /* Verify the request */ + UA_StatusCode retval = typeCheckArguments(server, session, inputArguments, + request->inputArgumentsSize, + request->inputArguments, + inputArgumentResults); + + /* Release the input arguments node */ + UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)inputArguments); + return retval; +} + +static const UA_NodeId hasComponentNodeId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASCOMPONENT}}; +static const UA_NodeId hasSubTypeNodeId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASSUBTYPE}}; + +static void +callWithMethodAndObject(UA_Server *server, UA_Session *session, + const UA_CallMethodRequest *request, UA_CallMethodResult *result, + const UA_MethodNode *method, const UA_ObjectNode *object) { + /* Verify the object's NodeClass */ + if(object->nodeClass != UA_NODECLASS_OBJECT && + object->nodeClass != UA_NODECLASS_OBJECTTYPE) { + result->statusCode = UA_STATUSCODE_BADNODECLASSINVALID; + return; + } + + /* Verify the method's NodeClass */ + if(method->nodeClass != UA_NODECLASS_METHOD) { + result->statusCode = UA_STATUSCODE_BADNODECLASSINVALID; + return; + } + + /* Is there a method to execute? */ + if(!method->method) { + result->statusCode = UA_STATUSCODE_BADINTERNALERROR; + return; + } + + /* Verify method/object relations. Object must have a hasComponent or a + * subtype of hasComponent reference to the method node. Therefore, check + * every reference between the parent object and the method node if there is + * a hasComponent (or subtype) reference */ + UA_Boolean found = false; + for(size_t i = 0; i < object->referencesSize && !found; ++i) { + UA_NodeReferenceKind *rk = &object->references[i]; + if(rk->isInverse) + continue; + if(!isNodeInTree(server->nsCtx, &rk->referenceTypeId, + &hasComponentNodeId, &hasSubTypeNodeId, 1)) + continue; + for(size_t j = 0; j < rk->refTargetsSize; ++j) { + if(UA_NodeId_equal(&rk->refTargets[j].target.nodeId, &request->methodId)) { + found = true; + break; + } + } + } + if(!found) { + result->statusCode = UA_STATUSCODE_BADMETHODINVALID; + return; + } + + /* Verify access rights */ + UA_Boolean executable = method->executable; + if(session != &server->adminSession) + executable = executable && + server->config.accessControl.getUserExecutableOnObject(server, + &server->config.accessControl, &session->sessionId, + session->sessionHandle, &request->methodId, method->context, + &request->objectId, object->context); + if(!executable) { + result->statusCode = UA_STATUSCODE_BADNOTEXECUTABLE; + return; + } + + /* Allocate the inputArgumentResults array */ + result->inputArgumentResults = (UA_StatusCode*) + UA_Array_new(request->inputArgumentsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); + if(!result->inputArgumentResults) { + result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + result->inputArgumentResultsSize = request->inputArgumentsSize; + + /* Verify Input Arguments */ + result->statusCode = validMethodArguments(server, session, method, request, result->inputArgumentResults); + + /* Return inputArgumentResults only for BADINVALIDARGUMENT */ + if(result->statusCode != UA_STATUSCODE_BADINVALIDARGUMENT) { + UA_Array_delete(result->inputArgumentResults, result->inputArgumentResultsSize, + &UA_TYPES[UA_TYPES_STATUSCODE]); + result->inputArgumentResults = NULL; + result->inputArgumentResultsSize = 0; + } + + /* Error during type-checking? */ + if(result->statusCode != UA_STATUSCODE_GOOD) + return; + + /* Get the output arguments node */ + const UA_VariableNode *outputArguments = + getArgumentsVariableNode(server, method, UA_STRING("OutputArguments")); + + /* Allocate the output arguments array */ + size_t outputArgsSize = 0; + if(outputArguments) + outputArgsSize = outputArguments->value.data.value.value.arrayLength; + result->outputArguments = (UA_Variant*) + UA_Array_new(outputArgsSize, &UA_TYPES[UA_TYPES_VARIANT]); + if(!result->outputArguments) { + result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + result->outputArgumentsSize = outputArgsSize; + + /* Release the output arguments node */ + UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)outputArguments); + + /* Call the method */ + result->statusCode = method->method(server, &session->sessionId, session->sessionHandle, + &method->nodeId, method->context, + &object->nodeId, object->context, + request->inputArgumentsSize, request->inputArguments, + result->outputArgumentsSize, result->outputArguments); + /* TODO: Verify Output matches the argument definition */ +} + +static void +Operation_CallMethod(UA_Server *server, UA_Session *session, void *context, + const UA_CallMethodRequest *request, UA_CallMethodResult *result) { + /* Get the method node */ + const UA_MethodNode *method = (const UA_MethodNode*) + UA_Nodestore_getNode(server->nsCtx, &request->methodId); + if(!method) { + result->statusCode = UA_STATUSCODE_BADNODEIDUNKNOWN; + return; + } + + /* Get the object node */ + const UA_ObjectNode *object = (const UA_ObjectNode*) + UA_Nodestore_getNode(server->nsCtx, &request->objectId); + if(!object) { + result->statusCode = UA_STATUSCODE_BADNODEIDUNKNOWN; + UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)method); + return; + } + + /* Continue with method and object as context */ + callWithMethodAndObject(server, session, request, result, method, object); + + /* Release the method and object node */ + UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)method); + UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)object); +} + +void Service_Call(UA_Server *server, UA_Session *session, + const UA_CallRequest *request, + UA_CallResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing CallRequest"); + + if(server->config.maxNodesPerMethodCall != 0 && + request->methodsToCallSize > server->config.maxNodesPerMethodCall) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_CallMethod, NULL, + &request->methodsToCallSize, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST], + &response->resultsSize, &UA_TYPES[UA_TYPES_CALLMETHODRESULT]); +} + +UA_CallMethodResult UA_EXPORT +UA_Server_call(UA_Server *server, const UA_CallMethodRequest *request) { + UA_CallMethodResult result; + UA_CallMethodResult_init(&result); + Operation_CallMethod(server, &server->adminSession, NULL, request, &result); + return result; +} + +#endif /* UA_ENABLE_METHODCALLS */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_services_session.c" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2014-2017 (c) Florian Palm + * Copyright 2014-2016 (c) Sten Grüner + * Copyright 2015 (c) Chris Iatrou + * Copyright 2015 (c) Oleksiy Vasylyev + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2019 (c) Kalycito Infotech Private Limited + */ + + +static UA_StatusCode +signCreateSessionResponse(UA_Server *server, UA_SecureChannel *channel, + const UA_CreateSessionRequest *request, + UA_CreateSessionResponse *response) { + if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && + channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) + return UA_STATUSCODE_GOOD; + + const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy; + UA_SignatureData *signatureData = &response->serverSignature; + + /* Prepare the signature */ + size_t signatureSize = securityPolicy->certificateSigningAlgorithm. + getLocalSignatureSize(securityPolicy, channel->channelContext); + UA_StatusCode retval = UA_String_copy(&securityPolicy->certificateSigningAlgorithm.uri, + &signatureData->algorithm); + retval |= UA_ByteString_allocBuffer(&signatureData->signature, signatureSize); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + /* Allocate a temp buffer */ + size_t dataToSignSize = request->clientCertificate.length + request->clientNonce.length; + UA_ByteString dataToSign; + retval = UA_ByteString_allocBuffer(&dataToSign, dataToSignSize); + if(retval != UA_STATUSCODE_GOOD) + return retval; /* signatureData->signature is cleaned up with the response */ + + /* Sign the signature */ + memcpy(dataToSign.data, request->clientCertificate.data, request->clientCertificate.length); + memcpy(dataToSign.data + request->clientCertificate.length, + request->clientNonce.data, request->clientNonce.length); + retval = securityPolicy->certificateSigningAlgorithm. + sign(securityPolicy, channel->channelContext, &dataToSign, &signatureData->signature); + + /* Clean up */ + UA_ByteString_deleteMembers(&dataToSign); + return retval; +} + +void +Service_CreateSession(UA_Server *server, UA_SecureChannel *channel, + const UA_CreateSessionRequest *request, + UA_CreateSessionResponse *response) { + if(!channel) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; + return; + } + + if(!channel->connection) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; + return; + } + + UA_LOG_DEBUG_CHANNEL(&server->config.logger, channel, "Trying to create session"); + + if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || + channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { + /* Compare the clientCertificate with the remoteCertificate of the channel. + * Both the clientCertificate of this request and the remoteCertificate + * of the channel may contain a partial or a complete certificate chain. + * The compareCertificate function of the channelModule will compare the + * first certificate of each chain. The end certificate shall be located + * first in the chain according to the OPC UA specification Part 6 (1.04), + * chapter 6.2.3.*/ + UA_StatusCode retval = channel->securityPolicy->channelModule. + compareCertificate(channel->channelContext, &request->clientCertificate); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING_CHANNEL(&server->config.logger, channel, + "The client certificate did not validate"); + response->responseHeader.serviceResult = UA_STATUSCODE_BADCERTIFICATEINVALID; + return; + } + } + + if(channel->securityToken.channelId == 0) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADSECURECHANNELIDINVALID; + return; + } + + if(!UA_ByteString_equal(&channel->securityPolicy->policyUri, + &UA_SECURITY_POLICY_NONE_URI) && + request->clientNonce.length < 32) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADNONCEINVALID; + return; + } + + /* TODO: Compare application URI with certificate uri (decode certificate) */ + UA_CertificateVerification *cv = channel->securityPolicy->certificateVerification; + if(cv && cv->verifyApplicationURI) { + response->responseHeader.serviceResult = + cv->verifyApplicationURI(cv->context, &request->clientCertificate, + &request->clientDescription.applicationUri); + if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING_CHANNEL(&server->config.logger, channel, + "The client's ApplicationURI did not match the certificate"); + return; + } + } + + UA_Session *newSession = NULL; + response->responseHeader.serviceResult = + UA_SessionManager_createSession(&server->sessionManager, channel, request, &newSession); + if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING_CHANNEL(&server->config.logger, channel, + "Processing CreateSessionRequest failed"); + return; + } + + UA_assert(newSession != NULL); + + /* Allocate the response */ + response->serverEndpoints = (UA_EndpointDescription *) + UA_Array_new(server->config.endpointsSize, + &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); + if(!response->serverEndpoints) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + UA_SessionManager_removeSession(&server->sessionManager, + &newSession->header.authenticationToken); + return; + } + response->serverEndpointsSize = server->config.endpointsSize; + + /* Copy the server's endpointdescriptions into the response */ + for(size_t i = 0; i < server->config.endpointsSize; ++i) + response->responseHeader.serviceResult |= + UA_EndpointDescription_copy(&server->config.endpoints[i], + &response->serverEndpoints[i]); + if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_SessionManager_removeSession(&server->sessionManager, + &newSession->header.authenticationToken); + return; + } + + /* Mirror back the endpointUrl */ + for(size_t i = 0; i < response->serverEndpointsSize; ++i) { + UA_String_deleteMembers(&response->serverEndpoints[i].endpointUrl); + response->responseHeader.serviceResult |= + UA_String_copy(&request->endpointUrl, + &response->serverEndpoints[i].endpointUrl); + } + + /* Attach the session to the channel. But don't activate for now. */ + UA_Session_attachToSecureChannel(newSession, channel); + + /* Fill the session information */ + newSession->maxResponseMessageSize = request->maxResponseMessageSize; + newSession->maxRequestMessageSize = + channel->connection->config.maxMessageSize; + response->responseHeader.serviceResult |= + UA_ApplicationDescription_copy(&request->clientDescription, + &newSession->clientDescription); + + /* Prepare the response */ + response->sessionId = newSession->sessionId; + response->revisedSessionTimeout = (UA_Double)newSession->timeout; + response->authenticationToken = newSession->header.authenticationToken; + response->responseHeader.serviceResult |= + UA_String_copy(&request->sessionName, &newSession->sessionName); + + UA_ByteString_init(&response->serverCertificate); + + if(server->config.endpointsSize > 0) + for(size_t i = 0; i < response->serverEndpointsSize; ++i) { + if(response->serverEndpoints[i].securityMode==channel->securityMode && + UA_ByteString_equal(&response->serverEndpoints[i].securityPolicyUri, + &channel->securityPolicy->policyUri) && + UA_String_equal(&response->serverEndpoints[i].endpointUrl, + &request->endpointUrl)) + { + response->responseHeader.serviceResult |= + UA_ByteString_copy(&response->serverEndpoints[i].serverCertificate, + &response->serverCertificate); + } + } + + /* Create a session nonce */ + response->responseHeader.serviceResult |= UA_Session_generateNonce(newSession); + response->responseHeader.serviceResult |= + UA_ByteString_copy(&newSession->serverNonce, &response->serverNonce); + + /* Sign the signature */ + response->responseHeader.serviceResult |= + signCreateSessionResponse(server, channel, request, response); + + /* Failure -> remove the session */ + if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_SessionManager_removeSession(&server->sessionManager, + &newSession->header.authenticationToken); + return; + } + + UA_LOG_INFO_CHANNEL(&server->config.logger, channel, + "Session " UA_PRINTF_GUID_FORMAT " created", + UA_PRINTF_GUID_DATA(newSession->sessionId.identifier.guid)); +} + +static UA_StatusCode +checkSignature(const UA_Server *server, const UA_SecureChannel *channel, + UA_Session *session, const UA_ActivateSessionRequest *request) { + if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && + channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) + return UA_STATUSCODE_GOOD; + + /* Check for zero signature length in client signature */ + if(request->clientSignature.signature.length == 0) { + return UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID; + } + + if(!channel->securityPolicy) + return UA_STATUSCODE_BADINTERNALERROR; + const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; + const UA_ByteString *localCertificate = &securityPolicy->localCertificate; + + size_t dataToVerifySize = localCertificate->length + session->serverNonce.length; + + UA_ByteString dataToVerify; + UA_StatusCode retval = UA_ByteString_allocBuffer(&dataToVerify, dataToVerifySize); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + memcpy(dataToVerify.data, localCertificate->data, localCertificate->length); + memcpy(dataToVerify.data + localCertificate->length, + session->serverNonce.data, session->serverNonce.length); + + retval = securityPolicy->certificateSigningAlgorithm.verify(securityPolicy, channel->channelContext, &dataToVerify, + &request->clientSignature.signature); + UA_ByteString_deleteMembers(&dataToVerify); + return retval; +} + +#ifdef UA_ENABLE_ENCRYPTION +static UA_StatusCode +decryptPassword(UA_SecurityPolicy *securityPolicy, void *tempChannelContext, + const UA_ByteString *serverNonce, UA_UserNameIdentityToken *userToken) { + UA_SecurityPolicyEncryptionAlgorithm *asymEnc = + &securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm; + if(!UA_String_equal(&userToken->encryptionAlgorithm, &asymEnc->uri)) + return UA_STATUSCODE_BADIDENTITYTOKENINVALID; + + UA_UInt32 tokenSecretLength; + UA_ByteString decryptedTokenSecret, tokenServerNonce; + if(UA_ByteString_copy(&userToken->password, &decryptedTokenSecret) != UA_STATUSCODE_GOOD) + return UA_STATUSCODE_BADIDENTITYTOKENINVALID; + + UA_StatusCode retval = UA_STATUSCODE_BADIDENTITYTOKENINVALID; + if(asymEnc->decrypt(securityPolicy, tempChannelContext, + &decryptedTokenSecret) != UA_STATUSCODE_GOOD) + goto cleanup; + + memcpy(&tokenSecretLength, decryptedTokenSecret.data, sizeof(UA_UInt32)); + + /* The decrypted data must be large enough to include the Encrypted Token + * Secret Format and the length field must indicate enough data to include + * the server nonce. */ + if(decryptedTokenSecret.length < sizeof(UA_UInt32) + serverNonce->length || + decryptedTokenSecret.length < sizeof(UA_UInt32) + tokenSecretLength || + tokenSecretLength < serverNonce->length) + goto cleanup; + + /* If the Encrypted Token Secret contains padding, the padding must be + * zeroes according to the 1.04.1 specification errata, chapter 3. */ + for(size_t i = sizeof(UA_UInt32) + tokenSecretLength; i < decryptedTokenSecret.length; i++) { + if(decryptedTokenSecret.data[i] != 0) + goto cleanup; + } + + /* The server nonce must match according to the 1.04.1 specification errata, + * chapter 3. */ + tokenServerNonce.length = serverNonce->length; + tokenServerNonce.data = &decryptedTokenSecret.data[sizeof(UA_UInt32) + tokenSecretLength - serverNonce->length]; + if(!UA_ByteString_equal(serverNonce, &tokenServerNonce)) + goto cleanup; + + /* The password was decrypted successfully. Replace usertoken with the + * decrypted password. The encryptionAlgorithm and policyId fields are left + * in the UserToken as an indication for the AccessControl plugin that + * evaluates the decrypted content. */ + memcpy(userToken->password.data, &decryptedTokenSecret.data[sizeof(UA_UInt32)], + tokenSecretLength - serverNonce->length); + userToken->password.length = tokenSecretLength - serverNonce->length; + retval = UA_STATUSCODE_GOOD; + + cleanup: + UA_ByteString_deleteMembers(&decryptedTokenSecret); + return retval; +} +#endif + +/* TODO: Check all of the following: + * + * Part 4, §5.6.3: When the ActivateSession Service is called for the first time + * then the Server shall reject the request if the SecureChannel is not same as + * the one associated with the CreateSession request. Subsequent calls to + * ActivateSession may be associated with different SecureChannels. If this is + * the case then the Server shall verify that the Certificate the Client used to + * create the new SecureChannel is the same as the Certificate used to create + * the original SecureChannel. In addition, the Server shall verify that the + * Client supplied a UserIdentityToken that is identical to the token currently + * associated with the Session. Once the Server accepts the new SecureChannel it + * shall reject requests sent via the old SecureChannel. */ + +void +Service_ActivateSession(UA_Server *server, UA_SecureChannel *channel, + UA_Session *session, const UA_ActivateSessionRequest *request, + UA_ActivateSessionResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Execute ActivateSession"); + + if(session->validTill < UA_DateTime_nowMonotonic()) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "ActivateSession: SecureChannel %i wants " + "to activate, but the session has timed out", + channel->securityToken.channelId); + response->responseHeader.serviceResult = + UA_STATUSCODE_BADSESSIONIDINVALID; + return; + } + + /* Check if the signature corresponds to the ServerNonce that was last sent + * to the client */ + response->responseHeader.serviceResult = checkSignature(server, channel, session, request); + if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "Signature check failed with status code %s", + UA_StatusCode_name(response->responseHeader.serviceResult)); + return; + } + + /* Find the matching endpoint */ + const UA_EndpointDescription *ed = NULL; + for(size_t i = 0; ed == NULL && i < server->config.endpointsSize; ++i) { + const UA_EndpointDescription *e = &server->config.endpoints[i]; + + /* Match the Security Mode */ + if(e->securityMode != channel->securityMode) + continue; + + /* Match the SecurityPolicy */ + if(!UA_String_equal(&e->securityPolicyUri, &channel->securityPolicy->policyUri)) + continue; + + /* Match the UserTokenType */ + for(size_t j = 0; j < e->userIdentityTokensSize; j++) { + const UA_UserTokenPolicy *u = &e->userIdentityTokens[j]; + if(u->tokenType == UA_USERTOKENTYPE_ANONYMOUS) { + /* Part 4, Section 5.6.3.2, Table 17: A NULL or empty + * UserIdentityToken should be treated as Anonymous */ + if(request->userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN] && + request->userIdentityToken.encoding != UA_EXTENSIONOBJECT_ENCODED_NOBODY) + continue; + } else if(u->tokenType == UA_USERTOKENTYPE_USERNAME) { + if(request->userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]) + continue; + } else if(u->tokenType == UA_USERTOKENTYPE_CERTIFICATE) { + if(request->userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN]) + continue; + } else if(u->tokenType == UA_USERTOKENTYPE_ISSUEDTOKEN) { + if(request->userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN]) + continue; + } else { + response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID; + return; + } + + /* Match found */ + ed = e; + break; + } + + } + + /* No matching endpoint found */ + if(!ed) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID; + return; + } + +#ifdef UA_ENABLE_ENCRYPTION + /* If it is a UserNameIdentityToken, decrypt the password if encrypted */ + if((request->userIdentityToken.encoding == UA_EXTENSIONOBJECT_DECODED) && + (request->userIdentityToken.content.decoded.type == &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN])) { + UA_UserNameIdentityToken *userToken = (UA_UserNameIdentityToken *) + request->userIdentityToken.content.decoded.data; + + /* Find the UserTokenPolicy */ + UA_Byte tokenIndex = 0; + for(; tokenIndex < ed->userIdentityTokensSize; tokenIndex++) { + if(ed->userIdentityTokens[tokenIndex].tokenType != UA_USERTOKENTYPE_USERNAME) + continue; + if(UA_String_equal(&userToken->policyId, &ed->userIdentityTokens[tokenIndex].policyId)) + break; + } + if(tokenIndex == ed->userIdentityTokensSize) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID; + return; + } + + /* Get the SecurityPolicy. If the userTokenPolicy doesn't specify a + * security policy the security policy of the secure channel is used. */ + UA_SecurityPolicy* securityPolicy; + if(ed->userIdentityTokens[tokenIndex].securityPolicyUri.data == NULL) + securityPolicy = UA_SecurityPolicy_getSecurityPolicyByUri(server, &ed->securityPolicyUri); + else + securityPolicy = UA_SecurityPolicy_getSecurityPolicyByUri(server, &ed->userIdentityTokens[tokenIndex].securityPolicyUri); + if(!securityPolicy) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; + return; + } + + /* Encrypted password? */ + if(!UA_String_equal(&securityPolicy->policyUri, &UA_SECURITY_POLICY_NONE_URI)) { + /* Test if the encryption algorithm is correctly specified */ + if(!UA_String_equal(&userToken->encryptionAlgorithm, + &securityPolicy->asymmetricModule.cryptoModule. + encryptionAlgorithm.uri)) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADIDENTITYTOKENINVALID; + return; + } + + /* Create a temporary channel context if a different SecurityPolicy is + * used for the password from the SecureChannel */ + void *tempChannelContext = channel->channelContext; + if(securityPolicy != channel->securityPolicy) { + /* TODO: This is a hack. We use our own certificate to create a + * channel context. Because the client does not provide one in a + * #None SecureChannel. We should not need a ChannelContext at all + * for asymmetric decryption where the remote certificate is not + * used. */ + response->responseHeader.serviceResult = + securityPolicy->channelModule.newContext(securityPolicy, + &securityPolicy->localCertificate, + &tempChannelContext); + if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING_SESSION(&server->config.logger, session, "ActivateSession: " + "Failed to create a context for the SecurityPolicy %.*s", + (int)securityPolicy->policyUri.length, + securityPolicy->policyUri.data); + return; + } + } + + /* Decrypt */ + response->responseHeader.serviceResult = + decryptPassword(securityPolicy, tempChannelContext, &session->serverNonce, userToken); + + /* Remove the temporary channel context */ + if(securityPolicy != channel->securityPolicy) + securityPolicy->channelModule.deleteContext(tempChannelContext); + } + + if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_LOG_INFO_SESSION(&server->config.logger, session, "ActivateSession: " + "Failed to decrypt the password with the status code %s", + UA_StatusCode_name(response->responseHeader.serviceResult)); + } + + } +#endif + + /* Callback into userland access control */ + response->responseHeader.serviceResult = + server->config.accessControl.activateSession(server, &server->config.accessControl, + ed, &channel->remoteCertificate, + &session->sessionId, + &request->userIdentityToken, + &session->sessionHandle); + if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "ActivateSession: The AccessControl plugin " + "denied the access with the status code %s", + UA_StatusCode_name(response->responseHeader.serviceResult)); + return; + } + + if(session->header.channel && session->header.channel != channel) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "ActivateSession: Detach from old channel"); + /* Detach the old SecureChannel and attach the new */ + UA_Session_detachFromSecureChannel(session); + UA_Session_attachToSecureChannel(session, channel); + } + + /* Activate the session */ + session->activated = true; + UA_Session_updateLifetime(session); + + /* Generate a new session nonce for the next time ActivateSession is called */ + response->responseHeader.serviceResult = UA_Session_generateNonce(session); + response->responseHeader.serviceResult |= + UA_ByteString_copy(&session->serverNonce, &response->serverNonce); + if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_Session_detachFromSecureChannel(session); + session->activated = false; + UA_LOG_INFO_SESSION(&server->config.logger, session, + "ActivateSession: Could not generate a server nonce"); + return; + } + + UA_LOG_INFO_SESSION(&server->config.logger, session, + "ActivateSession: Session activated"); +} + +void +Service_CloseSession(UA_Server *server, UA_Session *session, + const UA_CloseSessionRequest *request, + UA_CloseSessionResponse *response) { + UA_LOG_INFO_SESSION(&server->config.logger, session, "CloseSession"); + + response->responseHeader.serviceResult = + UA_SessionManager_removeSession(&server->sessionManager, + &session->header.authenticationToken); +} + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_services_attribute.c" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2015-2016 (c) Sten Grüner + * Copyright 2014-2017 (c) Florian Palm + * Copyright 2015 (c) Christian Fimmers + * Copyright 2015-2016 (c) Chris Iatrou + * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2015 (c) wuyangtang + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2016 (c) Lorenz Haas + * Copyright 2017 (c) frax2222 + * Copyright 2017 (c) Thomas Bender + * Copyright 2017 (c) Julian Grothoff + * Copyright 2017 (c) Jonas Green + * Copyright 2017 (c) Henrik Norrman + */ + + +#ifdef UA_ENABLE_HISTORIZING +#endif + +/******************/ +/* Access Control */ +/******************/ + +static UA_UInt32 +getUserWriteMask(UA_Server *server, const UA_Session *session, + const UA_Node *node) { + if(session == &server->adminSession) + return 0xFFFFFFFF; /* the local admin user has all rights */ + return node->writeMask & + server->config.accessControl.getUserRightsMask(server, &server->config.accessControl, + &session->sessionId, session->sessionHandle, + &node->nodeId, node->context); +} + +static UA_Byte +getAccessLevel(UA_Server *server, const UA_Session *session, + const UA_VariableNode *node) { + if(session == &server->adminSession) + return 0xFF; /* the local admin user has all rights */ + return node->accessLevel; +} + +static UA_Byte +getUserAccessLevel(UA_Server *server, const UA_Session *session, + const UA_VariableNode *node) { + if(session == &server->adminSession) + return 0xFF; /* the local admin user has all rights */ + return node->accessLevel & + server->config.accessControl.getUserAccessLevel(server, &server->config.accessControl, + &session->sessionId, session->sessionHandle, + &node->nodeId, node->context); +} + +static UA_Boolean +getUserExecutable(UA_Server *server, const UA_Session *session, + const UA_MethodNode *node) { + if(session == &server->adminSession) + return true; /* the local admin user has all rights */ + return node->executable & + server->config.accessControl.getUserExecutable(server, &server->config.accessControl, + &session->sessionId, session->sessionHandle, + &node->nodeId, node->context); +} + +/****************/ +/* Read Service */ +/****************/ + +static UA_StatusCode +readIsAbstractAttribute(const UA_Node *node, UA_Variant *v) { + const UA_Boolean *isAbstract; + switch(node->nodeClass) { + case UA_NODECLASS_REFERENCETYPE: + isAbstract = &((const UA_ReferenceTypeNode*)node)->isAbstract; + break; + case UA_NODECLASS_OBJECTTYPE: + isAbstract = &((const UA_ObjectTypeNode*)node)->isAbstract; + break; + case UA_NODECLASS_VARIABLETYPE: + isAbstract = &((const UA_VariableTypeNode*)node)->isAbstract; + break; + case UA_NODECLASS_DATATYPE: + isAbstract = &((const UA_DataTypeNode*)node)->isAbstract; + break; + default: + return UA_STATUSCODE_BADATTRIBUTEIDINVALID; + } + + return UA_Variant_setScalarCopy(v, isAbstract, &UA_TYPES[UA_TYPES_BOOLEAN]); +} + +static UA_StatusCode +readValueAttributeFromNode(UA_Server *server, UA_Session *session, + const UA_VariableNode *vn, UA_DataValue *v, + UA_NumericRange *rangeptr) { + /* Update the value by the user callback */ + if(vn->value.data.callback.onRead) { + vn->value.data.callback.onRead(server, &session->sessionId, + session->sessionHandle, &vn->nodeId, + vn->context, rangeptr, &vn->value.data.value); + vn = (const UA_VariableNode*)UA_Nodestore_getNode(server->nsCtx, &vn->nodeId); + if(!vn) + return UA_STATUSCODE_BADNODEIDUNKNOWN; + } + + /* Set the result */ + if(rangeptr) + return UA_Variant_copyRange(&vn->value.data.value.value, &v->value, *rangeptr); + UA_StatusCode retval = UA_DataValue_copy(&vn->value.data.value, v); + + /* Clean up */ + if(vn->value.data.callback.onRead) + UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node *)vn); + return retval; +} + +static UA_StatusCode +readValueAttributeFromDataSource(UA_Server *server, UA_Session *session, + const UA_VariableNode *vn, UA_DataValue *v, + UA_TimestampsToReturn timestamps, + UA_NumericRange *rangeptr) { + if(!vn->value.dataSource.read) + return UA_STATUSCODE_BADINTERNALERROR; + UA_Boolean sourceTimeStamp = (timestamps == UA_TIMESTAMPSTORETURN_SOURCE || + timestamps == UA_TIMESTAMPSTORETURN_BOTH); + UA_DataValue v2; + UA_DataValue_init(&v2); + UA_StatusCode retval = vn->value.dataSource. + read(server, &session->sessionId, session->sessionHandle, + &vn->nodeId, vn->context, sourceTimeStamp, rangeptr, &v2); + if(v2.hasValue && v2.value.storageType == UA_VARIANT_DATA_NODELETE) { + retval = UA_DataValue_copy(&v2, v); + UA_DataValue_deleteMembers(&v2); + } else { + *v = v2; + } + return retval; +} + +static UA_StatusCode +readValueAttributeComplete(UA_Server *server, UA_Session *session, + const UA_VariableNode *vn, UA_TimestampsToReturn timestamps, + const UA_String *indexRange, UA_DataValue *v) { + /* Compute the index range */ + UA_NumericRange range; + UA_NumericRange *rangeptr = NULL; + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(indexRange && indexRange->length > 0) { + retval = UA_NumericRange_parseFromString(&range, indexRange); + if(retval != UA_STATUSCODE_GOOD) + return retval; + rangeptr = ⦥ + } + + /* Read the value */ + if(vn->valueSource == UA_VALUESOURCE_DATA) + retval = readValueAttributeFromNode(server, session, vn, v, rangeptr); + else + retval = readValueAttributeFromDataSource(server, session, vn, v, timestamps, rangeptr); + + /* Static Variables and VariableTypes have timestamps of "now". Will be set + * below in the absence of predefined timestamps. */ + if(vn->nodeClass == UA_NODECLASS_VARIABLE) { + if(!vn->isDynamic) { + v->hasServerTimestamp = false; + v->hasSourceTimestamp = false; + } + } else { + v->hasServerTimestamp = false; + v->hasSourceTimestamp = false; + } + + /* Clean up */ + if(rangeptr) + UA_free(range.dimensions); + return retval; +} + +UA_StatusCode +readValueAttribute(UA_Server *server, UA_Session *session, + const UA_VariableNode *vn, UA_DataValue *v) { + return readValueAttributeComplete(server, session, vn, UA_TIMESTAMPSTORETURN_NEITHER, NULL, v); +} + +static const UA_String binEncoding = {sizeof("Default Binary")-1, (UA_Byte*)"Default Binary"}; +static const UA_String xmlEncoding = {sizeof("Default XML")-1, (UA_Byte*)"Default XML"}; +static const UA_String jsonEncoding = {sizeof("Default JSON")-1, (UA_Byte*)"Default JSON"}; + +#define CHECK_NODECLASS(CLASS) \ + if(!(node->nodeClass & (CLASS))) { \ + retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID; \ + break; \ + } + +/* Returns a datavalue that may point into the node via the + * UA_VARIANT_DATA_NODELETE tag. Don't access the returned DataValue once the + * node has been released! */ +void +ReadWithNode(const UA_Node *node, UA_Server *server, UA_Session *session, + UA_TimestampsToReturn timestampsToReturn, + const UA_ReadValueId *id, UA_DataValue *v) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Read the attribute %i", id->attributeId); + + /* Only Binary Encoding is supported */ + if(id->dataEncoding.name.length > 0 && + !UA_String_equal(&binEncoding, &id->dataEncoding.name)) { + if(UA_String_equal(&xmlEncoding, &id->dataEncoding.name) || + UA_String_equal(&jsonEncoding, &id->dataEncoding.name)) + v->status = UA_STATUSCODE_BADDATAENCODINGUNSUPPORTED; + else + v->status = UA_STATUSCODE_BADDATAENCODINGINVALID; + v->hasStatus = true; + return; + } + + /* Index range for an attribute other than value */ + if(id->indexRange.length > 0 && id->attributeId != UA_ATTRIBUTEID_VALUE) { + v->hasStatus = true; + v->status = UA_STATUSCODE_BADINDEXRANGENODATA; + return; + } + + /* Read the attribute */ + UA_StatusCode retval = UA_STATUSCODE_GOOD; + switch(id->attributeId) { + case UA_ATTRIBUTEID_NODEID: + retval = UA_Variant_setScalarCopy(&v->value, &node->nodeId, &UA_TYPES[UA_TYPES_NODEID]); + break; + case UA_ATTRIBUTEID_NODECLASS: + retval = UA_Variant_setScalarCopy(&v->value, &node->nodeClass, &UA_TYPES[UA_TYPES_NODECLASS]); + break; + case UA_ATTRIBUTEID_BROWSENAME: + retval = UA_Variant_setScalarCopy(&v->value, &node->browseName, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]); + break; + case UA_ATTRIBUTEID_DISPLAYNAME: + retval = UA_Variant_setScalarCopy(&v->value, &node->displayName, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); + break; + case UA_ATTRIBUTEID_DESCRIPTION: + retval = UA_Variant_setScalarCopy(&v->value, &node->description, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); + break; + case UA_ATTRIBUTEID_WRITEMASK: + retval = UA_Variant_setScalarCopy(&v->value, &node->writeMask, &UA_TYPES[UA_TYPES_UINT32]); + break; + case UA_ATTRIBUTEID_USERWRITEMASK: { + UA_UInt32 userWriteMask = getUserWriteMask(server, session, node); + retval = UA_Variant_setScalarCopy(&v->value, &userWriteMask, &UA_TYPES[UA_TYPES_UINT32]); + break; } + case UA_ATTRIBUTEID_ISABSTRACT: + retval = readIsAbstractAttribute(node, &v->value); + break; + case UA_ATTRIBUTEID_SYMMETRIC: + CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE); + retval = UA_Variant_setScalarCopy(&v->value, &((const UA_ReferenceTypeNode*)node)->symmetric, + &UA_TYPES[UA_TYPES_BOOLEAN]); + break; + case UA_ATTRIBUTEID_INVERSENAME: + CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE); + retval = UA_Variant_setScalarCopy(&v->value, &((const UA_ReferenceTypeNode*)node)->inverseName, + &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); + break; + case UA_ATTRIBUTEID_CONTAINSNOLOOPS: + CHECK_NODECLASS(UA_NODECLASS_VIEW); + retval = UA_Variant_setScalarCopy(&v->value, &((const UA_ViewNode*)node)->containsNoLoops, + &UA_TYPES[UA_TYPES_BOOLEAN]); + break; + case UA_ATTRIBUTEID_EVENTNOTIFIER: + CHECK_NODECLASS(UA_NODECLASS_VIEW | UA_NODECLASS_OBJECT); + if(node->nodeClass == UA_NODECLASS_VIEW) { + retval = UA_Variant_setScalarCopy(&v->value, &((const UA_ViewNode*)node)->eventNotifier, + &UA_TYPES[UA_TYPES_BYTE]); + } + else{ + retval = UA_Variant_setScalarCopy(&v->value, &((const UA_ObjectNode*)node)->eventNotifier, + &UA_TYPES[UA_TYPES_BYTE]); + } + break; + case UA_ATTRIBUTEID_VALUE: { + CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); + /* VariableTypes don't have the AccessLevel concept. Always allow reading the value. */ + if(node->nodeClass == UA_NODECLASS_VARIABLE) { + /* The access to a value variable is granted via the AccessLevel + * and UserAccessLevel attributes */ + UA_Byte accessLevel = getAccessLevel(server, session, (const UA_VariableNode*)node); + if(!(accessLevel & (UA_ACCESSLEVELMASK_READ))) { + retval = UA_STATUSCODE_BADNOTREADABLE; + break; + } + accessLevel = getUserAccessLevel(server, session, + (const UA_VariableNode*)node); + if(!(accessLevel & (UA_ACCESSLEVELMASK_READ))) { + retval = UA_STATUSCODE_BADUSERACCESSDENIED; + break; + } + } + retval = readValueAttributeComplete(server, session, (const UA_VariableNode*)node, + timestampsToReturn, &id->indexRange, v); + break; + } + case UA_ATTRIBUTEID_DATATYPE: + CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); + retval = UA_Variant_setScalarCopy(&v->value, &((const UA_VariableTypeNode*)node)->dataType, + &UA_TYPES[UA_TYPES_NODEID]); + break; + case UA_ATTRIBUTEID_VALUERANK: + CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); + retval = UA_Variant_setScalarCopy(&v->value, &((const UA_VariableTypeNode*)node)->valueRank, + &UA_TYPES[UA_TYPES_INT32]); + break; + case UA_ATTRIBUTEID_ARRAYDIMENSIONS: + CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); + retval = UA_Variant_setArrayCopy(&v->value, ((const UA_VariableTypeNode*)node)->arrayDimensions, + ((const UA_VariableTypeNode*)node)->arrayDimensionsSize, + &UA_TYPES[UA_TYPES_UINT32]); + break; + case UA_ATTRIBUTEID_ACCESSLEVEL: + CHECK_NODECLASS(UA_NODECLASS_VARIABLE); + retval = UA_Variant_setScalarCopy(&v->value, &((const UA_VariableNode*)node)->accessLevel, + &UA_TYPES[UA_TYPES_BYTE]); + break; + case UA_ATTRIBUTEID_USERACCESSLEVEL: { + CHECK_NODECLASS(UA_NODECLASS_VARIABLE); + UA_Byte userAccessLevel = getUserAccessLevel(server, session, (const UA_VariableNode*)node); + retval = UA_Variant_setScalarCopy(&v->value, &userAccessLevel, &UA_TYPES[UA_TYPES_BYTE]); + break; } + case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL: + CHECK_NODECLASS(UA_NODECLASS_VARIABLE); + retval = UA_Variant_setScalarCopy(&v->value, &((const UA_VariableNode*)node)->minimumSamplingInterval, + &UA_TYPES[UA_TYPES_DOUBLE]); + break; + case UA_ATTRIBUTEID_HISTORIZING: + CHECK_NODECLASS(UA_NODECLASS_VARIABLE); + retval = UA_Variant_setScalarCopy(&v->value, &((const UA_VariableNode*)node)->historizing, + &UA_TYPES[UA_TYPES_BOOLEAN]); + break; + case UA_ATTRIBUTEID_EXECUTABLE: + CHECK_NODECLASS(UA_NODECLASS_METHOD); + retval = UA_Variant_setScalarCopy(&v->value, &((const UA_MethodNode*)node)->executable, + &UA_TYPES[UA_TYPES_BOOLEAN]); + break; + case UA_ATTRIBUTEID_USEREXECUTABLE: { + CHECK_NODECLASS(UA_NODECLASS_METHOD); + UA_Boolean userExecutable = getUserExecutable(server, session, (const UA_MethodNode*)node); + retval = UA_Variant_setScalarCopy(&v->value, &userExecutable, &UA_TYPES[UA_TYPES_BOOLEAN]); + break; } + default: + retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID; + } + + /* Return error code when reading has failed */ + if(retval != UA_STATUSCODE_GOOD) { + v->hasStatus = true; + v->status = retval; + return; + } + + v->hasValue = true; + + /* Create server timestamp */ + if(timestampsToReturn == UA_TIMESTAMPSTORETURN_SERVER || + timestampsToReturn == UA_TIMESTAMPSTORETURN_BOTH) { + if (!v->hasServerTimestamp) { + v->serverTimestamp = UA_DateTime_now(); + v->hasServerTimestamp = true; + } + } else { + /* In case the ServerTimestamp has been set manually */ + v->hasServerTimestamp = false; + } + + /* Handle source time stamp */ + if(id->attributeId == UA_ATTRIBUTEID_VALUE) { + if(timestampsToReturn == UA_TIMESTAMPSTORETURN_SERVER || + timestampsToReturn == UA_TIMESTAMPSTORETURN_NEITHER) { + v->hasSourceTimestamp = false; + v->hasSourcePicoseconds = false; + } else if(!v->hasSourceTimestamp) { + v->sourceTimestamp = UA_DateTime_now(); + v->hasSourceTimestamp = true; + } + } +} + +static void +Operation_Read(UA_Server *server, UA_Session *session, UA_ReadRequest *request, + UA_ReadValueId *rvi, UA_DataValue *result) { + /* Get the node */ + const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &rvi->nodeId); + + /* Perform the read operation */ + if(node) { + ReadWithNode(node, server, session, request->timestampsToReturn, rvi, result); + UA_Nodestore_releaseNode(server->nsCtx, node); + } else { + result->hasStatus = true; + result->status = UA_STATUSCODE_BADNODEIDUNKNOWN; + } +} + +void +Service_Read(UA_Server *server, UA_Session *session, + const UA_ReadRequest *request, UA_ReadResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing ReadRequest"); + + /* Check if the timestampstoreturn is valid */ + if(request->timestampsToReturn > UA_TIMESTAMPSTORETURN_NEITHER) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTIMESTAMPSTORETURNINVALID; + return; + } + + /* Check if maxAge is valid */ + if(request->maxAge < 0) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADMAXAGEINVALID; + return; + } + + /* Check if there are too many operations */ + if(server->config.maxNodesPerRead != 0 && + request->nodesToReadSize > server->config.maxNodesPerRead) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_Read, + request, + &request->nodesToReadSize, &UA_TYPES[UA_TYPES_READVALUEID], + &response->resultsSize, &UA_TYPES[UA_TYPES_DATAVALUE]); +} + +UA_DataValue +UA_Server_readWithSession(UA_Server *server, UA_Session *session, + const UA_ReadValueId *item, + UA_TimestampsToReturn timestampsToReturn) { + UA_DataValue dv; + UA_DataValue_init(&dv); + + /* Get the node */ + const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &item->nodeId); + if(!node) { + dv.hasStatus = true; + dv.status = UA_STATUSCODE_BADNODEIDUNKNOWN; + return dv; + } + + /* Perform the read operation */ + ReadWithNode(node, server, session, timestampsToReturn, item, &dv); + + /* Release the node and return */ + UA_Nodestore_releaseNode(server->nsCtx, node); + return dv; +} + +/* Exposes the Read service to local users */ +UA_DataValue +UA_Server_read(UA_Server *server, const UA_ReadValueId *item, + UA_TimestampsToReturn timestamps) { + return UA_Server_readWithSession(server, &server->adminSession, item, timestamps); +} + +/* Used in inline functions exposing the Read service with more syntactic sugar + * for individual attributes */ +UA_StatusCode +__UA_Server_read(UA_Server *server, const UA_NodeId *nodeId, + const UA_AttributeId attributeId, void *v) { + /* Call the read service */ + UA_ReadValueId item; + UA_ReadValueId_init(&item); + item.nodeId = *nodeId; + item.attributeId = attributeId; + UA_DataValue dv = UA_Server_read(server, &item, UA_TIMESTAMPSTORETURN_NEITHER); + + /* Check the return value */ + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(dv.hasStatus) + retval = dv.status; + else if(!dv.hasValue) + retval = UA_STATUSCODE_BADUNEXPECTEDERROR; + if(retval != UA_STATUSCODE_GOOD) { + UA_DataValue_deleteMembers(&dv); + return retval; + } + + if(attributeId == UA_ATTRIBUTEID_VALUE || + attributeId == UA_ATTRIBUTEID_ARRAYDIMENSIONS) { + /* Return the entire variant */ + memcpy(v, &dv.value, sizeof(UA_Variant)); + } else { + /* Return the variant content only */ + memcpy(v, dv.value.data, dv.value.type->memSize); + UA_free(dv.value.data); + } + return retval; +} + +UA_StatusCode +UA_Server_readObjectProperty(UA_Server *server, const UA_NodeId objectId, + const UA_QualifiedName propertyName, + UA_Variant *value) { + UA_RelativePathElement rpe; + UA_RelativePathElement_init(&rpe); + rpe.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY); + rpe.isInverse = false; + rpe.includeSubtypes = false; + rpe.targetName = propertyName; + + UA_BrowsePath bp; + UA_BrowsePath_init(&bp); + bp.startingNode = objectId; + bp.relativePath.elementsSize = 1; + bp.relativePath.elements = &rpe; + + UA_StatusCode retval; + UA_BrowsePathResult bpr = UA_Server_translateBrowsePathToNodeIds(server, &bp); + if(bpr.statusCode != UA_STATUSCODE_GOOD || bpr.targetsSize < 1) { + retval = bpr.statusCode; + UA_BrowsePathResult_deleteMembers(&bpr); + return retval; + } + + retval = UA_Server_readValue(server, bpr.targets[0].targetId.nodeId, value); + + UA_BrowsePathResult_deleteMembers(&bpr); + return retval; +} + +/*****************/ +/* Type Checking */ +/*****************/ + +static UA_DataTypeKind +typeEquivalence(const UA_DataType *t) { + UA_DataTypeKind k = (UA_DataTypeKind)t->typeKind; + if(k == UA_DATATYPEKIND_ENUM) + return UA_DATATYPEKIND_INT32; + return k; +} + +static const UA_NodeId enumNodeId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_ENUMERATION}}; + +UA_Boolean +compatibleDataType(UA_Server *server, const UA_NodeId *dataType, + const UA_NodeId *constraintDataType, UA_Boolean isValue) { + /* Do not allow empty datatypes */ + if(UA_NodeId_isNull(dataType)) + return false; + + /* No constraint (TODO: use variant instead) */ + if(UA_NodeId_isNull(constraintDataType)) + return true; + + /* Same datatypes */ + if (UA_NodeId_equal(dataType, constraintDataType)) + return true; + + /* Variant allows any subtype */ + if(UA_NodeId_equal(constraintDataType, &UA_TYPES[UA_TYPES_VARIANT].typeId)) + return true; + + /* Is the value-type a subtype of the required type? */ + if(isNodeInTree(server->nsCtx, dataType, constraintDataType, &subtypeId, 1)) + return true; + + /* Enum allows Int32 (only) */ + if(UA_NodeId_equal(dataType, &UA_TYPES[UA_TYPES_INT32].typeId) && + isNodeInTree(server->nsCtx, constraintDataType, &enumNodeId, &subtypeId, 1)) + return true; + + /* More checks for the data type of real values (variants) */ + if(isValue) { + /* If value is a built-in type: The target data type may be a sub type of + * the built-in type. (e.g. UtcTime is sub-type of DateTime and has a + * DateTime value). A type is builtin if its NodeId is in Namespace 0 and + * has a numeric identifier <= 25 (DiagnosticInfo) */ + if(dataType->namespaceIndex == 0 && + dataType->identifierType == UA_NODEIDTYPE_NUMERIC && + dataType->identifier.numeric <= 25 && + isNodeInTree(server->nsCtx, constraintDataType, + dataType, &subtypeId, 1)) + return true; + } + + return false; +} + +/* Test whether a ValueRank and the given arraydimensions are compatible. + * + * 5.6.2 Variable NodeClass: If the maximum is unknown the value shall be 0. The + * number of elements shall be equal to the value of the ValueRank Attribute. + * This Attribute shall be null if ValueRank <= 0. */ +UA_Boolean +compatibleValueRankArrayDimensions(UA_Server *server, UA_Session *session, + UA_Int32 valueRank, size_t arrayDimensionsSize) { + /* ValueRank invalid */ + if(valueRank < UA_VALUERANK_SCALAR_OR_ONE_DIMENSION) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "The ValueRank is invalid (< -3)"); + return false; + } + + /* case -3, UA_VALUERANK_SCALAR_OR_ONE_DIMENSION: the value can be a scalar or a one dimensional array */ + /* case -2, UA_VALUERANK_ANY: the value can be a scalar or an array with any number of dimensions */ + /* case -1, UA_VALUERANK_SCALAR: the value is a scalar */ + /* case 0, UA_VALUERANK_ONE_OR_MORE_DIMENSIONS: the value is an array with one or more dimensions */ + if(valueRank <= UA_VALUERANK_ONE_OR_MORE_DIMENSIONS) { + if(arrayDimensionsSize > 0) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "No ArrayDimensions can be defined for a ValueRank <= 0"); + return false; + } + return true; + } + + /* case >= 1, UA_VALUERANK_ONE_DIMENSION: the value is an array with the specified number of dimensions */ + if(arrayDimensionsSize != (size_t)valueRank) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "The number of ArrayDimensions is not equal to the (positive) ValueRank"); + return false; + } + return true; +} + +UA_Boolean +compatibleValueRanks(UA_Int32 valueRank, UA_Int32 constraintValueRank) { + /* Check if the valuerank of the variabletype allows the change. */ + switch(constraintValueRank) { + case UA_VALUERANK_SCALAR_OR_ONE_DIMENSION: /* the value can be a scalar or a one dimensional array */ + if(valueRank != UA_VALUERANK_SCALAR && valueRank != UA_VALUERANK_ONE_DIMENSION) + return false; + break; + case UA_VALUERANK_ANY: /* the value can be a scalar or an array with any number of dimensions */ + break; + case UA_VALUERANK_SCALAR: /* the value is a scalar */ + if(valueRank != UA_VALUERANK_SCALAR) + return false; + break; + case UA_VALUERANK_ONE_OR_MORE_DIMENSIONS: /* the value is an array with one or more dimensions */ + if(valueRank < (UA_Int32) UA_VALUERANK_ONE_OR_MORE_DIMENSIONS) + return false; + break; + default: /* >= 1: the value is an array with the specified number of dimensions */ + if(valueRank != constraintValueRank) + return false; + break; + } + return true; +} + +/* Check if the ValueRank allows for the value dimension. This is more + * permissive than checking for the ArrayDimensions attribute. Because the value + * can have dimensions if the ValueRank < 0 */ +static UA_Boolean +compatibleValueRankValue(UA_Int32 valueRank, const UA_Variant *value) { + /* Invalid ValueRank */ + if(valueRank < UA_VALUERANK_SCALAR_OR_ONE_DIMENSION) + return false; + + /* Empty arrays (-1) always match */ + if(!value->data) + return true; + + size_t arrayDims = value->arrayDimensionsSize; + if(arrayDims == 0 && !UA_Variant_isScalar(value)) + arrayDims = 1; /* array but no arraydimensions -> implicit array dimension 1 */ + + /* We cannot simply use compatibleValueRankArrayDimensions since we can have + * defined ArrayDimensions for the value if the ValueRank is -2 */ + switch(valueRank) { + case UA_VALUERANK_SCALAR_OR_ONE_DIMENSION: /* The value can be a scalar or a one dimensional array */ + return (arrayDims <= 1); + case UA_VALUERANK_ANY: /* The value can be a scalar or an array with any number of dimensions */ + return true; + case UA_VALUERANK_SCALAR: /* The value is a scalar */ + return (arrayDims == 0); + default: + break; + } + + UA_assert(valueRank >= UA_VALUERANK_ONE_OR_MORE_DIMENSIONS); + + /* case 0: the value is an array with one or more dimensions */ + return (arrayDims == (UA_UInt32)valueRank); +} + +UA_Boolean +compatibleArrayDimensions(size_t constraintArrayDimensionsSize, + const UA_UInt32 *constraintArrayDimensions, + size_t testArrayDimensionsSize, + const UA_UInt32 *testArrayDimensions) { + /* No array dimensions defined -> everything is permitted if the value rank fits */ + if(constraintArrayDimensionsSize == 0) + return true; + + /* Dimension count must match */ + if(testArrayDimensionsSize != constraintArrayDimensionsSize) + return false; + + /* Dimension lengths must not be larger than the constraint. Zero in the + * constraint indicates a wildcard. */ + for(size_t i = 0; i < constraintArrayDimensionsSize; ++i) { + if(constraintArrayDimensions[i] < testArrayDimensions[i] && + constraintArrayDimensions[i] != 0) + return false; + } + return true; +} + +UA_Boolean +compatibleValueArrayDimensions(const UA_Variant *value, size_t targetArrayDimensionsSize, + const UA_UInt32 *targetArrayDimensions) { + size_t valueArrayDimensionsSize = value->arrayDimensionsSize; + UA_UInt32 *valueArrayDimensions = value->arrayDimensions; + UA_UInt32 tempArrayDimensions; + if(!valueArrayDimensions && !UA_Variant_isScalar(value)) { + valueArrayDimensionsSize = 1; + tempArrayDimensions = (UA_UInt32)value->arrayLength; + valueArrayDimensions = &tempArrayDimensions; + } + UA_assert(valueArrayDimensionsSize == 0 || valueArrayDimensions != NULL); + return compatibleArrayDimensions(targetArrayDimensionsSize, targetArrayDimensions, + valueArrayDimensionsSize, valueArrayDimensions); +} + +UA_Boolean +compatibleValue(UA_Server *server, UA_Session *session, const UA_NodeId *targetDataTypeId, + UA_Int32 targetValueRank, size_t targetArrayDimensionsSize, + const UA_UInt32 *targetArrayDimensions, const UA_Variant *value, + const UA_NumericRange *range) { + /* Empty value */ + if(!value->type) { + /* Empty value is allowed for BaseDataType */ + if(UA_NodeId_equal(targetDataTypeId, &UA_TYPES[UA_TYPES_VARIANT].typeId) || + UA_NodeId_equal(targetDataTypeId, &UA_NODEID_NULL)) + return true; + + /* Allow empty node values since existing information models may have + * variables with no value, e.g. OldValues - ns=0;i=3024. See also + * #1889, https://github.com/open62541/open62541/pull/1889#issuecomment-403506538 */ + if(server->config.relaxEmptyValueConstraint) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Only Variables with data type BaseDataType can contain an " + "empty value. Allow via explicit constraint relaxation."); + return true; + } + + UA_LOG_INFO_SESSION(&server->config.logger, session, + "Only Variables with data type BaseDataType can contain an empty value"); + return false; + } + + /* Has the value a subtype of the required type? BaseDataType (Variant) can + * be anything... */ + if(!compatibleDataType(server, &value->type->typeId, targetDataTypeId, true)) + return false; + + /* Array dimensions are checked later when writing the range */ + if(range) + return true; + + /* See if the array dimensions match. */ + if(!compatibleValueArrayDimensions(value, targetArrayDimensionsSize, targetArrayDimensions)) + return false; + + /* Check if the valuerank allows for the value dimension */ + return compatibleValueRankValue(targetValueRank, value); +} + +/*****************/ +/* Write Service */ +/*****************/ + +static void +adjustValue(UA_Server *server, UA_Variant *value, + const UA_NodeId *targetDataTypeId) { + const UA_DataType *targetDataType = UA_findDataType(targetDataTypeId); + if(!targetDataType) + return; + + /* A string is written to a byte array. the valuerank and array dimensions + * are checked later */ + if(targetDataType == &UA_TYPES[UA_TYPES_BYTE] && + value->type == &UA_TYPES[UA_TYPES_BYTESTRING] && + UA_Variant_isScalar(value)) { + UA_ByteString *str = (UA_ByteString*)value->data; + value->type = &UA_TYPES[UA_TYPES_BYTE]; + value->arrayLength = str->length; + value->data = str->data; + return; + } + + /* An enum was sent as an int32, or an opaque type as a bytestring. This + * is detected with the typeIndex indicating the "true" datatype. */ + UA_DataTypeKind te1 = typeEquivalence(targetDataType); + UA_DataTypeKind te2 = typeEquivalence(value->type); + if(te1 == te2 && te1 <= UA_DATATYPEKIND_ENUM) { + value->type = targetDataType; + return; + } + + /* No more possible equivalencies */ +} + +static UA_StatusCode +writeArrayDimensionsAttribute(UA_Server *server, UA_Session *session, + UA_VariableNode *node, const UA_VariableTypeNode *type, + size_t arrayDimensionsSize, UA_UInt32 *arrayDimensions) { + UA_assert(node != NULL); + UA_assert(type != NULL); + + /* If this is a variabletype, there must be no instances or subtypes of it + * when we do the change */ + if(node->nodeClass == UA_NODECLASS_VARIABLETYPE && + UA_Node_hasSubTypeOrInstances((UA_Node*)node)) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Cannot change a variable type with existing instances"); + return UA_STATUSCODE_BADINTERNALERROR; + } + + /* Check that the array dimensions match with the valuerank */ + if(!compatibleValueRankArrayDimensions(server, session, node->valueRank, arrayDimensionsSize)) { + UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Cannot write the ArrayDimensions. The ValueRank does not match."); + return UA_STATUSCODE_BADTYPEMISMATCH; + } + + /* Check if the array dimensions match with the wildcards in the + * variabletype (dimension length 0) */ + if(type->arrayDimensions && + !compatibleArrayDimensions(type->arrayDimensionsSize, type->arrayDimensions, + arrayDimensionsSize, arrayDimensions)) { + UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Array dimensions in the variable type do not match"); + return UA_STATUSCODE_BADTYPEMISMATCH; + } + + /* Check if the current value is compatible with the array dimensions */ + UA_DataValue value; + UA_DataValue_init(&value); + UA_StatusCode retval = readValueAttribute(server, session, node, &value); + if(retval != UA_STATUSCODE_GOOD) + return retval; + if(value.hasValue) { + if(!compatibleValueArrayDimensions(&value.value, arrayDimensionsSize, arrayDimensions)) + retval = UA_STATUSCODE_BADTYPEMISMATCH; + UA_DataValue_deleteMembers(&value); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Array dimensions in the current value do not match"); + return retval; + } + } + + /* Ok, apply */ + UA_UInt32 *oldArrayDimensions = node->arrayDimensions; + size_t oldArrayDimensionsSize = node->arrayDimensionsSize; + retval = UA_Array_copy(arrayDimensions, arrayDimensionsSize, + (void**)&node->arrayDimensions, + &UA_TYPES[UA_TYPES_UINT32]); + if(retval != UA_STATUSCODE_GOOD) + return retval; + UA_Array_delete(oldArrayDimensions, oldArrayDimensionsSize, &UA_TYPES[UA_TYPES_UINT32]); + node->arrayDimensionsSize = arrayDimensionsSize; + return UA_STATUSCODE_GOOD; +} + +/* Stack layout: ... | node | type */ +static UA_StatusCode +writeValueRankAttribute(UA_Server *server, UA_Session *session, + UA_VariableNode *node, const UA_VariableTypeNode *type, + UA_Int32 valueRank) { + UA_assert(node != NULL); + UA_assert(type != NULL); + + UA_Int32 constraintValueRank = type->valueRank; + + /* If this is a variabletype, there must be no instances or subtypes of it + * when we do the change */ + if(node->nodeClass == UA_NODECLASS_VARIABLETYPE && + UA_Node_hasSubTypeOrInstances((const UA_Node*)node)) + return UA_STATUSCODE_BADINTERNALERROR; + + /* Check if the valuerank of the variabletype allows the change. */ + if(!compatibleValueRanks(valueRank, constraintValueRank)) + return UA_STATUSCODE_BADTYPEMISMATCH; + + /* Check if the new valuerank is compatible with the array dimensions. Use + * the read service to handle data sources. */ + size_t arrayDims = node->arrayDimensionsSize; + if(arrayDims == 0) { + /* the value could be an array with no arrayDimensions defined. + dimensions zero indicate a scalar for compatibleValueRankArrayDimensions. */ + UA_DataValue value; + UA_DataValue_init(&value); + UA_StatusCode retval = readValueAttribute(server, session, node, &value); + if(retval != UA_STATUSCODE_GOOD) + return retval; + if(!value.hasValue || !value.value.type) { + /* no value -> apply */ + node->valueRank = valueRank; + return UA_STATUSCODE_GOOD; + } + if(!UA_Variant_isScalar(&value.value)) + arrayDims = 1; + UA_DataValue_deleteMembers(&value); + } + if(!compatibleValueRankArrayDimensions(server, session, valueRank, arrayDims)) + return UA_STATUSCODE_BADTYPEMISMATCH; + + /* All good, apply the change */ + node->valueRank = valueRank; + return UA_STATUSCODE_GOOD; +} + +static UA_StatusCode +writeDataTypeAttribute(UA_Server *server, UA_Session *session, + UA_VariableNode *node, const UA_VariableTypeNode *type, + const UA_NodeId *dataType) { + UA_assert(node != NULL); + UA_assert(type != NULL); + + /* If this is a variabletype, there must be no instances or subtypes of it + when we do the change */ + if(node->nodeClass == UA_NODECLASS_VARIABLETYPE && + UA_Node_hasSubTypeOrInstances((const UA_Node*)node)) + return UA_STATUSCODE_BADINTERNALERROR; + + /* Does the new type match the constraints of the variabletype? */ + if(!compatibleDataType(server, dataType, &type->dataType, false)) + return UA_STATUSCODE_BADTYPEMISMATCH; + + /* Check if the current value would match the new type */ + UA_DataValue value; + UA_DataValue_init(&value); + UA_StatusCode retval = readValueAttribute(server, session, node, &value); + if(retval != UA_STATUSCODE_GOOD) + return retval; + if(value.hasValue) { + if(!compatibleValue(server, session, dataType, node->valueRank, + node->arrayDimensionsSize, node->arrayDimensions, + &value.value, NULL)) + retval = UA_STATUSCODE_BADTYPEMISMATCH; + UA_DataValue_deleteMembers(&value); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, + "The current value does not match the new data type"); + return retval; + } + } + + /* Replace the datatype nodeid */ + UA_NodeId dtCopy = node->dataType; + retval = UA_NodeId_copy(dataType, &node->dataType); + if(retval != UA_STATUSCODE_GOOD) { + node->dataType = dtCopy; + return retval; + } + UA_NodeId_deleteMembers(&dtCopy); + return UA_STATUSCODE_GOOD; +} + +static UA_StatusCode +writeValueAttributeWithoutRange(UA_VariableNode *node, const UA_DataValue *value) { + UA_DataValue new_value; + UA_StatusCode retval = UA_DataValue_copy(value, &new_value); + if(retval != UA_STATUSCODE_GOOD) + return retval; + UA_DataValue_deleteMembers(&node->value.data.value); + node->value.data.value = new_value; + return UA_STATUSCODE_GOOD; +} + +static UA_StatusCode +writeValueAttributeWithRange(UA_VariableNode *node, const UA_DataValue *value, + const UA_NumericRange *rangeptr) { + /* Value on both sides? */ + if(value->status != node->value.data.value.status || + !value->hasValue || !node->value.data.value.hasValue) + return UA_STATUSCODE_BADINDEXRANGEINVALID; + + /* Make scalar a one-entry array for range matching */ + UA_Variant editableValue; + const UA_Variant *v = &value->value; + if(UA_Variant_isScalar(&value->value)) { + editableValue = value->value; + editableValue.arrayLength = 1; + v = &editableValue; + } + + /* Check that the type is an exact match and not only "compatible" */ + if(!node->value.data.value.value.type || !v->type || + !UA_NodeId_equal(&node->value.data.value.value.type->typeId, + &v->type->typeId)) + return UA_STATUSCODE_BADTYPEMISMATCH; + + /* Write the value */ + UA_StatusCode retval = UA_Variant_setRangeCopy(&node->value.data.value.value, + v->data, v->arrayLength, *rangeptr); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + /* Write the status and timestamps */ + node->value.data.value.hasStatus = value->hasStatus; + node->value.data.value.status = value->status; + node->value.data.value.hasSourceTimestamp = value->hasSourceTimestamp; + node->value.data.value.sourceTimestamp = value->sourceTimestamp; + node->value.data.value.hasSourcePicoseconds = value->hasSourcePicoseconds; + node->value.data.value.sourcePicoseconds = value->sourcePicoseconds; + return UA_STATUSCODE_GOOD; +} + +/* Stack layout: ... | node */ +static UA_StatusCode +writeValueAttribute(UA_Server *server, UA_Session *session, + UA_VariableNode *node, const UA_DataValue *value, + const UA_String *indexRange) { + UA_assert(node != NULL); + + /* Parse the range */ + UA_NumericRange range; + UA_NumericRange *rangeptr = NULL; + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(indexRange && indexRange->length > 0) { + retval = UA_NumericRange_parseFromString(&range, indexRange); + if(retval != UA_STATUSCODE_GOOD) + return retval; + rangeptr = ⦥ + } + + /* Created an editable version. The data is not touched. Only the variant + * "container". */ + UA_DataValue adjustedValue = *value; + + /* Type checking. May change the type of editableValue */ + if(value->hasValue && value->value.type) { + adjustValue(server, &adjustedValue.value, &node->dataType); + + /* The value may be an extension object, especially the nodeset compiler + * uses extension objects to write variable values. If value is an + * extension object we check if the current node value is also an + * extension object. */ + const UA_NodeId nodeDataType = UA_NODEID_NUMERIC(0, UA_NS0ID_STRUCTURE); + const UA_NodeId *nodeDataTypePtr = &node->dataType; + if(value->value.type->typeId.identifierType == UA_NODEIDTYPE_NUMERIC && + value->value.type->typeId.identifier.numeric == UA_NS0ID_STRUCTURE) + nodeDataTypePtr = &nodeDataType; + + if(!compatibleValue(server, session, nodeDataTypePtr, node->valueRank, + node->arrayDimensionsSize, node->arrayDimensions, + &adjustedValue.value, rangeptr)) { + if(rangeptr) + UA_free(range.dimensions); + return UA_STATUSCODE_BADTYPEMISMATCH; + } + } + + /* Set the source timestamp if there is none */ + UA_DateTime now = UA_DateTime_now(); + if(!adjustedValue.hasSourceTimestamp) { + adjustedValue.sourceTimestamp = now; + adjustedValue.hasSourceTimestamp = true; + } + + /* Update the timestamp when the value was last updated in the server */ + adjustedValue.serverTimestamp = now; + adjustedValue.hasServerTimestamp = true; + + /* Ok, do it */ + if(node->valueSource == UA_VALUESOURCE_DATA) { + if(!rangeptr) + retval = writeValueAttributeWithoutRange(node, &adjustedValue); + else + retval = writeValueAttributeWithRange(node, &adjustedValue, rangeptr); + +#ifdef UA_ENABLE_HISTORIZING + /* node is a UA_VariableNode*, but it may also point to a UA_VariableTypeNode */ + /* UA_VariableTypeNode doesn't have the historizing attribute */ + if(retval == UA_STATUSCODE_GOOD && node->nodeClass == UA_NODECLASS_VARIABLE && + server->config.historyDatabase.setValue) + server->config.historyDatabase.setValue(server, server->config.historyDatabase.context, + &session->sessionId, session->sessionHandle, + &node->nodeId, node->historizing, &adjustedValue); +#endif + /* Callback after writing */ + if(retval == UA_STATUSCODE_GOOD && node->value.data.callback.onWrite) + node->value.data.callback.onWrite(server, &session->sessionId, + session->sessionHandle, &node->nodeId, + node->context, rangeptr, + &adjustedValue); + } else { + if(node->value.dataSource.write) { + retval = node->value.dataSource.write(server, &session->sessionId, + session->sessionHandle, &node->nodeId, + node->context, rangeptr, &adjustedValue); + } else { + retval = UA_STATUSCODE_BADWRITENOTSUPPORTED; + } + } + + /* Clean up */ + if(rangeptr) + UA_free(range.dimensions); + return retval; +} + +static UA_StatusCode +writeIsAbstractAttribute(UA_Node *node, UA_Boolean value) { + switch(node->nodeClass) { + case UA_NODECLASS_OBJECTTYPE: + ((UA_ObjectTypeNode*)node)->isAbstract = value; + break; + case UA_NODECLASS_REFERENCETYPE: + ((UA_ReferenceTypeNode*)node)->isAbstract = value; + break; + case UA_NODECLASS_VARIABLETYPE: + ((UA_VariableTypeNode*)node)->isAbstract = value; + break; + case UA_NODECLASS_DATATYPE: + ((UA_DataTypeNode*)node)->isAbstract = value; + break; + default: + return UA_STATUSCODE_BADNODECLASSINVALID; + } + return UA_STATUSCODE_GOOD; +} + +/*****************/ +/* Write Service */ +/*****************/ + +#define CHECK_DATATYPE_SCALAR(EXP_DT) \ + if(!wvalue->value.hasValue || \ + &UA_TYPES[UA_TYPES_##EXP_DT] != wvalue->value.value.type || \ + !UA_Variant_isScalar(&wvalue->value.value)) { \ + retval = UA_STATUSCODE_BADTYPEMISMATCH; \ + break; \ + } + +#define CHECK_DATATYPE_ARRAY(EXP_DT) \ + if(!wvalue->value.hasValue || \ + &UA_TYPES[UA_TYPES_##EXP_DT] != wvalue->value.value.type || \ + UA_Variant_isScalar(&wvalue->value.value)) { \ + retval = UA_STATUSCODE_BADTYPEMISMATCH; \ + break; \ + } + +#define CHECK_NODECLASS_WRITE(CLASS) \ + if((node->nodeClass & (CLASS)) == 0) { \ + retval = UA_STATUSCODE_BADNODECLASSINVALID; \ + break; \ + } + +#define CHECK_USERWRITEMASK(mask) \ + if(!(userWriteMask & (mask))) { \ + retval = UA_STATUSCODE_BADUSERACCESSDENIED; \ + break; \ + } + +#define GET_NODETYPE \ + type = (const UA_VariableTypeNode*) \ + getNodeType(server, node); \ + if(!type) { \ + retval = UA_STATUSCODE_BADTYPEMISMATCH; \ + break; \ + } + +/* This function implements the main part of the write service and operates on a + copy of the node (not in single-threaded mode). */ +static UA_StatusCode +copyAttributeIntoNode(UA_Server *server, UA_Session *session, + UA_Node *node, const UA_WriteValue *wvalue) { + const void *value = wvalue->value.value.data; + UA_UInt32 userWriteMask = getUserWriteMask(server, session, node); + UA_StatusCode retval = UA_STATUSCODE_GOOD; + + const UA_VariableTypeNode *type; + + switch(wvalue->attributeId) { + case UA_ATTRIBUTEID_NODEID: + case UA_ATTRIBUTEID_NODECLASS: + case UA_ATTRIBUTEID_USERWRITEMASK: + case UA_ATTRIBUTEID_USERACCESSLEVEL: + case UA_ATTRIBUTEID_USEREXECUTABLE: + retval = UA_STATUSCODE_BADWRITENOTSUPPORTED; + break; + case UA_ATTRIBUTEID_BROWSENAME: + CHECK_USERWRITEMASK(UA_WRITEMASK_BROWSENAME); + CHECK_DATATYPE_SCALAR(QUALIFIEDNAME); + UA_QualifiedName_deleteMembers(&node->browseName); + UA_QualifiedName_copy((const UA_QualifiedName *)value, &node->browseName); + break; + case UA_ATTRIBUTEID_DISPLAYNAME: + CHECK_USERWRITEMASK(UA_WRITEMASK_DISPLAYNAME); + CHECK_DATATYPE_SCALAR(LOCALIZEDTEXT); + UA_LocalizedText_deleteMembers(&node->displayName); + UA_LocalizedText_copy((const UA_LocalizedText *)value, &node->displayName); + break; + case UA_ATTRIBUTEID_DESCRIPTION: + CHECK_USERWRITEMASK(UA_WRITEMASK_DESCRIPTION); + CHECK_DATATYPE_SCALAR(LOCALIZEDTEXT); + UA_LocalizedText_deleteMembers(&node->description); + UA_LocalizedText_copy((const UA_LocalizedText *)value, &node->description); + break; + case UA_ATTRIBUTEID_WRITEMASK: + CHECK_USERWRITEMASK(UA_WRITEMASK_WRITEMASK); + CHECK_DATATYPE_SCALAR(UINT32); + node->writeMask = *(const UA_UInt32*)value; + break; + case UA_ATTRIBUTEID_ISABSTRACT: + CHECK_USERWRITEMASK(UA_WRITEMASK_ISABSTRACT); + CHECK_DATATYPE_SCALAR(BOOLEAN); + retval = writeIsAbstractAttribute(node, *(const UA_Boolean*)value); + break; + case UA_ATTRIBUTEID_SYMMETRIC: + CHECK_NODECLASS_WRITE(UA_NODECLASS_REFERENCETYPE); + CHECK_USERWRITEMASK(UA_WRITEMASK_SYMMETRIC); + CHECK_DATATYPE_SCALAR(BOOLEAN); + ((UA_ReferenceTypeNode*)node)->symmetric = *(const UA_Boolean*)value; + break; + case UA_ATTRIBUTEID_INVERSENAME: + CHECK_NODECLASS_WRITE(UA_NODECLASS_REFERENCETYPE); + CHECK_USERWRITEMASK(UA_WRITEMASK_INVERSENAME); + CHECK_DATATYPE_SCALAR(LOCALIZEDTEXT); + UA_LocalizedText_deleteMembers(&((UA_ReferenceTypeNode*)node)->inverseName); + UA_LocalizedText_copy((const UA_LocalizedText *)value, + &((UA_ReferenceTypeNode*)node)->inverseName); + break; + case UA_ATTRIBUTEID_CONTAINSNOLOOPS: + CHECK_NODECLASS_WRITE(UA_NODECLASS_VIEW); + CHECK_USERWRITEMASK(UA_WRITEMASK_CONTAINSNOLOOPS); + CHECK_DATATYPE_SCALAR(BOOLEAN); + ((UA_ViewNode*)node)->containsNoLoops = *(const UA_Boolean*)value; + break; + case UA_ATTRIBUTEID_EVENTNOTIFIER: + CHECK_NODECLASS_WRITE(UA_NODECLASS_VIEW | UA_NODECLASS_OBJECT); + CHECK_USERWRITEMASK(UA_WRITEMASK_EVENTNOTIFIER); + CHECK_DATATYPE_SCALAR(BYTE); + if(node->nodeClass == UA_NODECLASS_VIEW) { + ((UA_ViewNode*)node)->eventNotifier = *(const UA_Byte*)value; + } else { + ((UA_ObjectNode*)node)->eventNotifier = *(const UA_Byte*)value; + } + break; + case UA_ATTRIBUTEID_VALUE: + CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); + if(node->nodeClass == UA_NODECLASS_VARIABLE) { + /* The access to a value variable is granted via the AccessLevel + * and UserAccessLevel attributes */ + UA_Byte accessLevel = getAccessLevel(server, session, (const UA_VariableNode*)node); + if(!(accessLevel & (UA_ACCESSLEVELMASK_WRITE))) { + retval = UA_STATUSCODE_BADNOTWRITABLE; + break; + } + accessLevel = getUserAccessLevel(server, session, + (const UA_VariableNode*)node); + if(!(accessLevel & (UA_ACCESSLEVELMASK_WRITE))) { + retval = UA_STATUSCODE_BADUSERACCESSDENIED; + break; + } + } else { /* UA_NODECLASS_VARIABLETYPE */ + CHECK_USERWRITEMASK(UA_WRITEMASK_VALUEFORVARIABLETYPE); + } + retval = writeValueAttribute(server, session, (UA_VariableNode*)node, + &wvalue->value, &wvalue->indexRange); + break; + case UA_ATTRIBUTEID_DATATYPE: + CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); + CHECK_USERWRITEMASK(UA_WRITEMASK_DATATYPE); + CHECK_DATATYPE_SCALAR(NODEID); + GET_NODETYPE + retval = writeDataTypeAttribute(server, session, (UA_VariableNode*)node, + type, (const UA_NodeId*)value); + UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)type); + break; + case UA_ATTRIBUTEID_VALUERANK: + CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); + CHECK_USERWRITEMASK(UA_WRITEMASK_VALUERANK); + CHECK_DATATYPE_SCALAR(INT32); + GET_NODETYPE + retval = writeValueRankAttribute(server, session, (UA_VariableNode*)node, + type, *(const UA_Int32*)value); + UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)type); + break; + case UA_ATTRIBUTEID_ARRAYDIMENSIONS: + CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); + CHECK_USERWRITEMASK(UA_WRITEMASK_ARRRAYDIMENSIONS); + CHECK_DATATYPE_ARRAY(UINT32); + GET_NODETYPE + retval = writeArrayDimensionsAttribute(server, session, (UA_VariableNode*)node, + type, wvalue->value.value.arrayLength, + (UA_UInt32 *)wvalue->value.value.data); + UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)type); + break; + case UA_ATTRIBUTEID_ACCESSLEVEL: + CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE); + CHECK_USERWRITEMASK(UA_WRITEMASK_ACCESSLEVEL); + CHECK_DATATYPE_SCALAR(BYTE); + ((UA_VariableNode*)node)->accessLevel = *(const UA_Byte*)value; + break; + case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL: + CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE); + CHECK_USERWRITEMASK(UA_WRITEMASK_MINIMUMSAMPLINGINTERVAL); + CHECK_DATATYPE_SCALAR(DOUBLE); + ((UA_VariableNode*)node)->minimumSamplingInterval = *(const UA_Double*)value; + break; + case UA_ATTRIBUTEID_HISTORIZING: + CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE); + CHECK_USERWRITEMASK(UA_WRITEMASK_HISTORIZING); + CHECK_DATATYPE_SCALAR(BOOLEAN); + ((UA_VariableNode*)node)->historizing = *(const UA_Boolean*)value; + break; + case UA_ATTRIBUTEID_EXECUTABLE: + CHECK_NODECLASS_WRITE(UA_NODECLASS_METHOD); + CHECK_USERWRITEMASK(UA_WRITEMASK_EXECUTABLE); + CHECK_DATATYPE_SCALAR(BOOLEAN); + ((UA_MethodNode*)node)->executable = *(const UA_Boolean*)value; + break; + default: + retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID; + break; + } + if(retval != UA_STATUSCODE_GOOD) + UA_LOG_INFO_SESSION(&server->config.logger, session, + "WriteRequest returned status code %s", + UA_StatusCode_name(retval)); + return retval; +} + +static void +Operation_Write(UA_Server *server, UA_Session *session, void *context, + UA_WriteValue *wv, UA_StatusCode *result) { + *result = UA_Server_editNode(server, session, &wv->nodeId, + (UA_EditNodeCallback)copyAttributeIntoNode, wv); +} + +void +Service_Write(UA_Server *server, UA_Session *session, + const UA_WriteRequest *request, + UA_WriteResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing WriteRequest"); + + if(server->config.maxNodesPerWrite != 0 && + request->nodesToWriteSize > server->config.maxNodesPerWrite) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_Write, NULL, + &request->nodesToWriteSize, &UA_TYPES[UA_TYPES_WRITEVALUE], + &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +} + +UA_StatusCode +UA_Server_writeWithSession(UA_Server *server, UA_Session *session, + const UA_WriteValue *value) { + return UA_Server_editNode(server, session, &value->nodeId, + (UA_EditNodeCallback)copyAttributeIntoNode, + /* casting away const qualifier because callback uses const anyway */ + (UA_WriteValue *)(uintptr_t)value); +} + +UA_StatusCode +UA_Server_write(UA_Server *server, const UA_WriteValue *value) { + return UA_Server_editNode(server, &server->adminSession, &value->nodeId, + (UA_EditNodeCallback)copyAttributeIntoNode, + /* casting away const qualifier because callback uses const anyway */ + (UA_WriteValue *)(uintptr_t)value); +} + +/* Convenience function to be wrapped into inline functions */ +UA_StatusCode +__UA_Server_write(UA_Server *server, const UA_NodeId *nodeId, + const UA_AttributeId attributeId, + const UA_DataType *attr_type, + const void *attr) { + UA_WriteValue wvalue; + UA_WriteValue_init(&wvalue); + wvalue.nodeId = *nodeId; + wvalue.attributeId = attributeId; + wvalue.value.hasValue = true; + if(attr_type != &UA_TYPES[UA_TYPES_VARIANT]) { + /* hacked cast. the target WriteValue is used as const anyway */ + UA_Variant_setScalar(&wvalue.value.value, + (void*)(uintptr_t)attr, attr_type); + } else { + wvalue.value.value = *(const UA_Variant*)attr; + } + return UA_Server_write(server, &wvalue); +} + +#ifdef UA_ENABLE_HISTORIZING +void +Service_HistoryRead(UA_Server *server, UA_Session *session, + const UA_HistoryReadRequest *request, + UA_HistoryReadResponse *response) { + if(request->historyReadDetails.encoding != UA_EXTENSIONOBJECT_DECODED) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTSUPPORTED; + return; + } + + if(request->historyReadDetails.content.decoded.type != &UA_TYPES[UA_TYPES_READRAWMODIFIEDDETAILS]) { + /* TODO handle more request->historyReadDetails.content.decoded.type types */ + response->responseHeader.serviceResult = UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED; + return; + } + + /* History read with ReadRawModifiedDetails */ + UA_ReadRawModifiedDetails * details = (UA_ReadRawModifiedDetails*) + request->historyReadDetails.content.decoded.data; + if(details->isReadModified) { + // TODO add server->config.historyReadService.read_modified + response->responseHeader.serviceResult = UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED; + return; + } + + /* Something to do? */ + if(request->nodesToReadSize == 0) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO; + return; + } + + /* Check if there are too many operations */ + if(server->config.maxNodesPerRead != 0 && + request->nodesToReadSize > server->config.maxNodesPerRead) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + /* The history database is not configured */ + if(!server->config.historyDatabase.readRaw) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED; + return; + } + + /* Allocate a temporary array to forward the result pointers to the + * backend */ + UA_HistoryData ** historyData = (UA_HistoryData **) + UA_calloc(request->nodesToReadSize, sizeof(UA_HistoryData*)); + if(!historyData) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + + /* Allocate the results array */ + response->results = (UA_HistoryReadResult*)UA_Array_new(request->nodesToReadSize, + &UA_TYPES[UA_TYPES_HISTORYREADRESULT]); + if(!response->results) { + UA_free(historyData); + response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + response->resultsSize = request->nodesToReadSize; + + for(size_t i = 0; i < response->resultsSize; ++i) { + UA_HistoryData * data = UA_HistoryData_new(); + response->results[i].historyData.encoding = UA_EXTENSIONOBJECT_DECODED; + response->results[i].historyData.content.decoded.type = &UA_TYPES[UA_TYPES_HISTORYDATA]; + response->results[i].historyData.content.decoded.data = data; + historyData[i] = data; + } + server->config.historyDatabase.readRaw(server, server->config.historyDatabase.context, + &session->sessionId, session->sessionHandle, + &request->requestHeader, details, + request->timestampsToReturn, + request->releaseContinuationPoints, + request->nodesToReadSize, request->nodesToRead, + response, historyData); + UA_free(historyData); +} + +void +Service_HistoryUpdate(UA_Server *server, UA_Session *session, + const UA_HistoryUpdateRequest *request, + UA_HistoryUpdateResponse *response) { + response->resultsSize = request->historyUpdateDetailsSize; + response->results = (UA_HistoryUpdateResult*)UA_Array_new(response->resultsSize, &UA_TYPES[UA_TYPES_HISTORYUPDATERESULT]); + if (!response->results) { + response->resultsSize = 0; + response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + for (size_t i = 0; i < request->historyUpdateDetailsSize; ++i) { + UA_HistoryUpdateResult_init(&response->results[i]); + if(request->historyUpdateDetails[i].encoding != UA_EXTENSIONOBJECT_DECODED) { + response->results[i].statusCode = UA_STATUSCODE_BADNOTSUPPORTED; + continue; + } + if (request->historyUpdateDetails[i].content.decoded.type + == &UA_TYPES[UA_TYPES_UPDATEDATADETAILS]) { + if (server->config.historyDatabase.updateData) { + server->config.historyDatabase.updateData(server, + server->config.historyDatabase.context, + &session->sessionId, session->sessionHandle, + &request->requestHeader, + (UA_UpdateDataDetails*)request->historyUpdateDetails[i].content.decoded.data, + &response->results[i]); + } else { + response->results[i].statusCode = UA_STATUSCODE_BADNOTSUPPORTED; + } + continue; + } else + if (request->historyUpdateDetails[i].content.decoded.type + == &UA_TYPES[UA_TYPES_DELETERAWMODIFIEDDETAILS]) { + if (server->config.historyDatabase.deleteRawModified) { + server->config.historyDatabase.deleteRawModified(server, + server->config.historyDatabase.context, + &session->sessionId, session->sessionHandle, + &request->requestHeader, + (UA_DeleteRawModifiedDetails*)request->historyUpdateDetails[i].content.decoded.data, + &response->results[i]); + } else { + response->results[i].statusCode = UA_STATUSCODE_BADNOTSUPPORTED; + } + continue; + } else { + response->results[i].statusCode = UA_STATUSCODE_BADNOTSUPPORTED; + continue; + } + } + response->responseHeader.serviceResult = UA_STATUSCODE_GOOD; +} + +#endif + +UA_StatusCode UA_EXPORT +UA_Server_writeObjectProperty(UA_Server *server, const UA_NodeId objectId, + const UA_QualifiedName propertyName, + const UA_Variant value) { + UA_RelativePathElement rpe; + UA_RelativePathElement_init(&rpe); + rpe.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY); + rpe.isInverse = false; + rpe.includeSubtypes = false; + rpe.targetName = propertyName; + + UA_BrowsePath bp; + UA_BrowsePath_init(&bp); + bp.startingNode = objectId; + bp.relativePath.elementsSize = 1; + bp.relativePath.elements = &rpe; + + UA_StatusCode retval; + UA_BrowsePathResult bpr = UA_Server_translateBrowsePathToNodeIds(server, &bp); + if(bpr.statusCode != UA_STATUSCODE_GOOD || bpr.targetsSize < 1) { + retval = bpr.statusCode; + UA_BrowsePathResult_deleteMembers(&bpr); + return retval; + } + + retval = UA_Server_writeValue(server, bpr.targets[0].targetId.nodeId, value); + + UA_BrowsePathResult_deleteMembers(&bpr); + return retval; +} + +UA_StatusCode UA_EXPORT +UA_Server_writeObjectProperty_scalar(UA_Server *server, const UA_NodeId objectId, + const UA_QualifiedName propertyName, + const void *value, const UA_DataType *type) { + UA_Variant var; + UA_Variant_init(&var); + UA_Variant_setScalar(&var, (void*)(uintptr_t)value, type); + return UA_Server_writeObjectProperty(server, objectId, propertyName, var); +} + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_services_discovery.c" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2014-2016 (c) Sten Grüner + * Copyright 2014, 2017 (c) Florian Palm + * Copyright 2016 (c) Oleksiy Vasylyev + * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) frax2222 + * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB + */ + + +#ifdef UA_ENABLE_DISCOVERY + + +static UA_StatusCode +setApplicationDescriptionFromRegisteredServer(const UA_FindServersRequest *request, + UA_ApplicationDescription *target, + const UA_RegisteredServer *registeredServer) { + UA_ApplicationDescription_init(target); + UA_StatusCode retval = UA_String_copy(®isteredServer->serverUri, &target->applicationUri); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + retval = UA_String_copy(®isteredServer->productUri, &target->productUri); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + // if the client requests a specific locale, select the corresponding server name + if(request->localeIdsSize) { + UA_Boolean appNameFound = false; + for(size_t i =0; ilocaleIdsSize && !appNameFound; i++) { + for(size_t j =0; jserverNamesSize; j++) { + if(UA_String_equal(&request->localeIds[i], ®isteredServer->serverNames[j].locale)) { + retval = UA_LocalizedText_copy(®isteredServer->serverNames[j], + &target->applicationName); + if(retval != UA_STATUSCODE_GOOD) + return retval; + appNameFound = true; + break; + } + } + } + + // server does not have the requested local, therefore we can select the + // most suitable one + if(!appNameFound && registeredServer->serverNamesSize) { + retval = UA_LocalizedText_copy(®isteredServer->serverNames[0], + &target->applicationName); + if(retval != UA_STATUSCODE_GOOD) + return retval; + } + } else if(registeredServer->serverNamesSize) { + // just take the first name + retval = UA_LocalizedText_copy(®isteredServer->serverNames[0], &target->applicationName); + if(retval != UA_STATUSCODE_GOOD) + return retval; + } + + target->applicationType = registeredServer->serverType; + retval = UA_String_copy(®isteredServer->gatewayServerUri, &target->gatewayServerUri); + if(retval != UA_STATUSCODE_GOOD) + return retval; + // TODO where do we get the discoveryProfileUri for application data? + + target->discoveryUrlsSize = registeredServer->discoveryUrlsSize; + if(registeredServer->discoveryUrlsSize) { + size_t duSize = sizeof(UA_String) * registeredServer->discoveryUrlsSize; + target->discoveryUrls = (UA_String *)UA_malloc(duSize); + if(!target->discoveryUrls) + return UA_STATUSCODE_BADOUTOFMEMORY; + for(size_t i = 0; i < registeredServer->discoveryUrlsSize; i++) { + retval = UA_String_copy(®isteredServer->discoveryUrls[i], &target->discoveryUrls[i]); + if(retval != UA_STATUSCODE_GOOD) + return retval; + } + } + + return retval; +} +#endif + +static UA_StatusCode +setApplicationDescriptionFromServer(UA_ApplicationDescription *target, const UA_Server *server) { + /* Copy ApplicationDescription from the config */ + UA_StatusCode result = UA_ApplicationDescription_copy(&server->config.applicationDescription, target); + if(result != UA_STATUSCODE_GOOD) + return result; + + /* Add the discoveryUrls from the networklayers only if discoveryUrl + * not already present and to avoid redundancy */ + if(!target->discoveryUrlsSize) { + size_t discSize = sizeof(UA_String) * (target->discoveryUrlsSize + server->config.networkLayersSize); + UA_String* disc = (UA_String *)UA_realloc(target->discoveryUrls, discSize); + if(!disc) + return UA_STATUSCODE_BADOUTOFMEMORY; + size_t existing = target->discoveryUrlsSize; + target->discoveryUrls = disc; + target->discoveryUrlsSize += server->config.networkLayersSize; + + for(size_t i = 0; i < server->config.networkLayersSize; i++) { + UA_ServerNetworkLayer* nl = &server->config.networkLayers[i]; + UA_String_copy(&nl->discoveryUrl, &target->discoveryUrls[existing + i]); + } + } + + return UA_STATUSCODE_GOOD; +} + +void Service_FindServers(UA_Server *server, UA_Session *session, + const UA_FindServersRequest *request, + UA_FindServersResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing FindServersRequest"); + + /* Return the server itself? */ + UA_Boolean foundSelf = false; + if(request->serverUrisSize) { + for(size_t i = 0; i < request->serverUrisSize; i++) { + if(UA_String_equal(&request->serverUris[i], + &server->config.applicationDescription.applicationUri)) { + foundSelf = true; + break; + } + } + } else { + foundSelf = true; + } + +#ifndef UA_ENABLE_DISCOVERY + if(!foundSelf) + return; + + UA_ApplicationDescription *ad = UA_ApplicationDescription_new(); + if(!ad) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + + UA_StatusCode retval = setApplicationDescriptionFromServer(ad, server); + if(retval != UA_STATUSCODE_GOOD) { + UA_ApplicationDescription_delete(ad); + response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + + response->servers = ad; + response->serversSize = 1; + return; + +#else + + /* Temporarily store all the pointers which we found to avoid reiterating + * through the list */ + size_t foundServersSize = 0; + UA_STACKARRAY(UA_RegisteredServer*, foundServers, server->discoveryManager.registeredServersSize+1); + + registeredServer_list_entry* current; + LIST_FOREACH(current, &server->discoveryManager.registeredServers, pointers) { + if(request->serverUrisSize) { + /* If client only requested a specific set of servers */ + for(size_t i = 0; i < request->serverUrisSize; i++) { + if(UA_String_equal(¤t->registeredServer.serverUri, &request->serverUris[i])) { + foundServers[foundServersSize] = ¤t->registeredServer; + foundServersSize++; + break; + } + } + } else { + /* Return all registered servers */ + foundServers[foundServersSize] = ¤t->registeredServer; + foundServersSize++; + } + } + + size_t allocSize = foundServersSize; + if(foundSelf) + allocSize++; + + /* Nothing to do? */ + if(allocSize == 0) + return; + + /* Allocate memory */ + response->servers = (UA_ApplicationDescription*)UA_Array_new(allocSize, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]); + if(!response->servers) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + response->serversSize = allocSize; + + /* Copy into the response. TODO: Evaluate return codes */ + size_t pos = 0; + if(foundSelf) { + setApplicationDescriptionFromServer(&response->servers[pos++], server); + } + for(size_t i = 0; i < foundServersSize; i++) { + setApplicationDescriptionFromRegisteredServer(request, &response->servers[pos++], foundServers[i]); + } + +#endif +} + +void +Service_GetEndpoints(UA_Server *server, UA_Session *session, + const UA_GetEndpointsRequest *request, + UA_GetEndpointsResponse *response) { + /* If the client expects to see a specific endpointurl, mirror it back. If + not, clone the endpoints with the discovery url of all networklayers. */ + const UA_String *endpointUrl = &request->endpointUrl; + if(endpointUrl->length > 0) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing GetEndpointsRequest with endpointUrl " + UA_PRINTF_STRING_FORMAT, UA_PRINTF_STRING_DATA(*endpointUrl)); + } else { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing GetEndpointsRequest with an empty endpointUrl"); + } + + /* test if the supported binary profile shall be returned */ + size_t reSize = sizeof(UA_Boolean) * server->config.endpointsSize; + UA_STACKARRAY(UA_Boolean, relevant_endpoints, reSize); + memset(relevant_endpoints, 0, reSize); + size_t relevant_count = 0; + if(request->profileUrisSize == 0) { + for(size_t j = 0; j < server->config.endpointsSize; ++j) + relevant_endpoints[j] = true; + relevant_count = server->config.endpointsSize; + } else { + for(size_t j = 0; j < server->config.endpointsSize; ++j) { + for(size_t i = 0; i < request->profileUrisSize; ++i) { + if(!UA_String_equal(&request->profileUris[i], + &server->config.endpoints[j].transportProfileUri)) + continue; + relevant_endpoints[j] = true; + ++relevant_count; + break; + } + } + } + + if(relevant_count == 0) { + response->endpointsSize = 0; + return; + } + + /* Clone the endpoint for each networklayer? */ + size_t clone_times = 1; + UA_Boolean nl_endpointurl = false; + if(endpointUrl->length == 0) { + clone_times = server->config.networkLayersSize; + nl_endpointurl = true; + } + + response->endpoints = + (UA_EndpointDescription*)UA_Array_new(relevant_count * clone_times, + &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); + if(!response->endpoints) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + response->endpointsSize = relevant_count * clone_times; + + size_t k = 0; + UA_StatusCode retval; + for(size_t i = 0; i < clone_times; ++i) { + if(nl_endpointurl) + endpointUrl = &server->config.networkLayers[i].discoveryUrl; + for(size_t j = 0; j < server->config.endpointsSize; ++j) { + if(!relevant_endpoints[j]) + continue; + retval = UA_EndpointDescription_copy(&server->config.endpoints[j], + &response->endpoints[k]); + if(retval != UA_STATUSCODE_GOOD) + goto error; + retval = UA_String_copy(endpointUrl, &response->endpoints[k].endpointUrl); + if(retval != UA_STATUSCODE_GOOD) + goto error; + ++k; + } + } + + return; +error: + response->responseHeader.serviceResult = retval; + UA_Array_delete(response->endpoints, response->endpointsSize, + &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); + response->endpoints = NULL; + response->endpointsSize = 0; +} + +#ifdef UA_ENABLE_DISCOVERY + +static void +process_RegisterServer(UA_Server *server, UA_Session *session, + const UA_RequestHeader* requestHeader, + const UA_RegisteredServer *requestServer, + const size_t requestDiscoveryConfigurationSize, + const UA_ExtensionObject *requestDiscoveryConfiguration, + UA_ResponseHeader* responseHeader, + size_t *responseConfigurationResultsSize, + UA_StatusCode **responseConfigurationResults, + size_t *responseDiagnosticInfosSize, + UA_DiagnosticInfo *responseDiagnosticInfos) { + /* Find the server from the request in the registered list */ + registeredServer_list_entry* current; + registeredServer_list_entry *registeredServer_entry = NULL; + LIST_FOREACH(current, &server->discoveryManager.registeredServers, pointers) { + if(UA_String_equal(¤t->registeredServer.serverUri, &requestServer->serverUri)) { + registeredServer_entry = current; + break; + } + } + + UA_MdnsDiscoveryConfiguration *mdnsConfig = NULL; + + const UA_String* mdnsServerName = NULL; + if(requestDiscoveryConfigurationSize) { + *responseConfigurationResults = + (UA_StatusCode *)UA_Array_new(requestDiscoveryConfigurationSize, + &UA_TYPES[UA_TYPES_STATUSCODE]); + if(!(*responseConfigurationResults)) { + responseHeader->serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + *responseConfigurationResultsSize = requestDiscoveryConfigurationSize; + + for(size_t i = 0; i < requestDiscoveryConfigurationSize; i++) { + const UA_ExtensionObject *object = &requestDiscoveryConfiguration[i]; + if(!mdnsConfig && (object->encoding == UA_EXTENSIONOBJECT_DECODED || + object->encoding == UA_EXTENSIONOBJECT_DECODED_NODELETE) && + (object->content.decoded.type == &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION])) { + mdnsConfig = (UA_MdnsDiscoveryConfiguration *)object->content.decoded.data; + mdnsServerName = &mdnsConfig->mdnsServerName; + (*responseConfigurationResults)[i] = UA_STATUSCODE_GOOD; + } else { + (*responseConfigurationResults)[i] = UA_STATUSCODE_BADNOTSUPPORTED; + } + } + } + + if(!mdnsServerName && requestServer->serverNamesSize) + mdnsServerName = &requestServer->serverNames[0].text; + + if(!mdnsServerName) { + responseHeader->serviceResult = UA_STATUSCODE_BADSERVERNAMEMISSING; + return; + } + + if(requestServer->discoveryUrlsSize == 0) { + responseHeader->serviceResult = UA_STATUSCODE_BADDISCOVERYURLMISSING; + return; + } + + if(requestServer->semaphoreFilePath.length) { +#ifdef UA_ENABLE_DISCOVERY_SEMAPHORE + char* filePath = (char*) + UA_malloc(sizeof(char)*requestServer->semaphoreFilePath.length+1); + if(!filePath) { + UA_LOG_ERROR_SESSION(&server->config.logger, session, + "Cannot allocate memory for semaphore path. Out of memory."); + responseHeader->serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + memcpy(filePath, requestServer->semaphoreFilePath.data, requestServer->semaphoreFilePath.length ); + filePath[requestServer->semaphoreFilePath.length] = '\0'; + if(!UA_fileExists( filePath )) { + responseHeader->serviceResult = UA_STATUSCODE_BADSEMPAHOREFILEMISSING; + UA_free(filePath); + return; + } + UA_free(filePath); +#else + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_CLIENT, + "Ignoring semaphore file path. open62541 not compiled " + "with UA_ENABLE_DISCOVERY_SEMAPHORE=ON"); +#endif + } + +#ifdef UA_ENABLE_DISCOVERY_MULTICAST + if(server->config.discovery.mdnsEnable) { + for(size_t i = 0; i < requestServer->discoveryUrlsSize; i++) { + /* create TXT if is online and first index, delete TXT if is offline and last index */ + UA_Boolean updateTxt = (requestServer->isOnline && i==0) || + (!requestServer->isOnline && i==requestServer->discoveryUrlsSize); + UA_Server_updateMdnsForDiscoveryUrl(server, mdnsServerName, mdnsConfig, + &requestServer->discoveryUrls[i], + requestServer->isOnline, updateTxt); + } + } +#endif + + if(!requestServer->isOnline) { + // server is shutting down. Remove it from the registered servers list + if(!registeredServer_entry) { + // server not found, show warning + UA_LOG_WARNING_SESSION(&server->config.logger, session, + "Could not unregister server %.*s. Not registered.", + (int)requestServer->serverUri.length, requestServer->serverUri.data); + responseHeader->serviceResult = UA_STATUSCODE_BADNOTHINGTODO; + return; + } + + if(server->discoveryManager.registerServerCallback) + server->discoveryManager. + registerServerCallback(requestServer, + server->discoveryManager.registerServerCallbackData); + + // server found, remove from list + LIST_REMOVE(registeredServer_entry, pointers); + UA_RegisteredServer_deleteMembers(®isteredServer_entry->registeredServer); +#ifndef UA_ENABLE_MULTITHREADING + UA_free(registeredServer_entry); + server->discoveryManager.registeredServersSize--; +#else + UA_atomic_subSize(&server->discoveryManager.registeredServersSize, 1); + registeredServer_entry->delayedCleanup.callback = NULL; /* only free the structure */ + UA_WorkQueue_enqueueDelayed(&server->workQueue, ®isteredServer_entry->delayedCleanup); +#endif + responseHeader->serviceResult = UA_STATUSCODE_GOOD; + return; + } + + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(!registeredServer_entry) { + // server not yet registered, register it by adding it to the list + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Registering new server: %.*s", + (int)requestServer->serverUri.length, requestServer->serverUri.data); + + registeredServer_entry = + (registeredServer_list_entry *)UA_malloc(sizeof(registeredServer_list_entry)); + if(!registeredServer_entry) { + responseHeader->serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + + LIST_INSERT_HEAD(&server->discoveryManager.registeredServers, registeredServer_entry, pointers); +#ifndef UA_ENABLE_MULTITHREADING + server->discoveryManager.registeredServersSize++; +#else + UA_atomic_addSize(&server->discoveryManager.registeredServersSize, 1); +#endif + } else { + UA_RegisteredServer_deleteMembers(®isteredServer_entry->registeredServer); + } + + // Always call the callback, if it is set. + // Previously we only called it if it was a new register call. It may be the case that this endpoint + // registered before, then crashed, restarts and registeres again. In that case the entry is not deleted + // and the callback would not be called. + if(server->discoveryManager.registerServerCallback) + server->discoveryManager. + registerServerCallback(requestServer, + server->discoveryManager.registerServerCallbackData); + + // copy the data from the request into the list + UA_RegisteredServer_copy(requestServer, ®isteredServer_entry->registeredServer); + registeredServer_entry->lastSeen = UA_DateTime_nowMonotonic(); + responseHeader->serviceResult = retval; +} + +void Service_RegisterServer(UA_Server *server, UA_Session *session, + const UA_RegisterServerRequest *request, + UA_RegisterServerResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing RegisterServerRequest"); + process_RegisterServer(server, session, &request->requestHeader, &request->server, 0, + NULL, &response->responseHeader, 0, NULL, 0, NULL); +} + +void Service_RegisterServer2(UA_Server *server, UA_Session *session, + const UA_RegisterServer2Request *request, + UA_RegisterServer2Response *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing RegisterServer2Request"); + process_RegisterServer(server, session, &request->requestHeader, &request->server, + request->discoveryConfigurationSize, request->discoveryConfiguration, + &response->responseHeader, &response->configurationResultsSize, + &response->configurationResults, &response->diagnosticInfosSize, + response->diagnosticInfos); +} + +/* Cleanup server registration: If the semaphore file path is set, then it just + * checks the existence of the file. When it is deleted, the registration is + * removed. If there is no semaphore file, then the registration will be removed + * if it is older than 60 minutes. */ +void UA_Discovery_cleanupTimedOut(UA_Server *server, UA_DateTime nowMonotonic) { + UA_DateTime timedOut = nowMonotonic; + // registration is timed out if lastSeen is older than 60 minutes (default + // value, can be modified by user). + if(server->config.discovery.cleanupTimeout) + timedOut -= server->config.discovery.cleanupTimeout*UA_DATETIME_SEC; + + registeredServer_list_entry* current, *temp; + LIST_FOREACH_SAFE(current, &server->discoveryManager.registeredServers, pointers, temp) { + UA_Boolean semaphoreDeleted = false; + +#ifdef UA_ENABLE_DISCOVERY_SEMAPHORE + if(current->registeredServer.semaphoreFilePath.length) { + size_t fpSize = sizeof(char)*current->registeredServer.semaphoreFilePath.length+1; + // todo: malloc may fail: return a statuscode + char* filePath = (char *)UA_malloc(fpSize); + if(filePath) { + memcpy(filePath, current->registeredServer.semaphoreFilePath.data, + current->registeredServer.semaphoreFilePath.length ); + filePath[current->registeredServer.semaphoreFilePath.length] = '\0'; + semaphoreDeleted = UA_fileExists(filePath) == false; + UA_free(filePath); + } else { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Cannot check registration semaphore. Out of memory"); + } + } +#endif + + if(semaphoreDeleted || (server->config.discovery.cleanupTimeout && + current->lastSeen < timedOut)) { + if(semaphoreDeleted) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Registration of server with URI %.*s is removed because " + "the semaphore file '%.*s' was deleted.", + (int)current->registeredServer.serverUri.length, + current->registeredServer.serverUri.data, + (int)current->registeredServer.semaphoreFilePath.length, + current->registeredServer.semaphoreFilePath.data); + } else { + // cppcheck-suppress unreadVariable + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Registration of server with URI %.*s has timed out and is removed.", + (int)current->registeredServer.serverUri.length, + current->registeredServer.serverUri.data); + } + LIST_REMOVE(current, pointers); + UA_RegisteredServer_deleteMembers(¤t->registeredServer); +#ifndef UA_ENABLE_MULTITHREADING + UA_free(current); + server->discoveryManager.registeredServersSize--; +#else + UA_atomic_subSize(&server->discoveryManager.registeredServersSize, 1); + current->delayedCleanup.callback = NULL; /* Only free the structure */ + UA_WorkQueue_enqueueDelayed(&server->workQueue, ¤t->delayedCleanup); +#endif + } + } +} + +/* Called by the UA_Server callback. The OPC UA specification says: + * + * > If an error occurs during registration (e.g. the Discovery Server is not running) then the Server + * > must periodically re-attempt registration. The frequency of these attempts should start at 1 second + * > but gradually increase until the registration frequency is the same as what it would be if not + * > errors occurred. The recommended approach would double the period each attempt until reaching the maximum. + * + * We will do so by using the additional data parameter which holds information + * if the next interval is default or if it is a repeated call. */ +static void +periodicServerRegister(UA_Server *server, void *data) { + UA_assert(data != NULL); + + struct PeriodicServerRegisterCallback *cb = (struct PeriodicServerRegisterCallback *)data; + + UA_StatusCode retval = UA_Client_connect_noSession(cb->client, cb->discovery_server_url); + if (retval == UA_STATUSCODE_GOOD) { + /* Register + You can also use a semaphore file. That file must exist. When the file is + deleted, the server is automatically unregistered. The semaphore file has + to be accessible by the discovery server + + UA_StatusCode retval = UA_Server_register_discovery(server, + "opc.tcp://localhost:4840", "/path/to/some/file"); + */ + retval = UA_Server_register_discovery(server, cb->client, NULL); + } + if (cb->client->state == UA_CLIENTSTATE_CONNECTED) { + UA_StatusCode retval1 = UA_Client_disconnect(cb->client); + if(retval1 != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Could not disconnect client from register server. StatusCode %s", + UA_StatusCode_name(retval)); + } + } + /* Registering failed */ + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Could not register server with discovery server. " + "Is the discovery server started? StatusCode %s", + UA_StatusCode_name(retval)); + + /* If the server was previously registered, retry in one second, + * else, double the previous interval */ + UA_Double nextInterval = 1000.0; + if(!cb->registered) + nextInterval = cb->this_interval * 2; + + /* The interval should be smaller than the default interval */ + if(nextInterval > cb->default_interval) + nextInterval = cb->default_interval; + + cb->this_interval = nextInterval; + UA_Server_changeRepeatedCallbackInterval(server, cb->id, nextInterval); + return; + } + + /* Registering succeeded */ + UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Server successfully registered. Next periodical register will be in %d seconds", + (int)(cb->default_interval/1000)); + + if(!cb->registered) { + retval = UA_Server_changeRepeatedCallbackInterval(server, cb->id, cb->default_interval); + /* If changing the interval fails, try again after the next registering */ + if(retval == UA_STATUSCODE_GOOD) + cb->registered = true; + } +} + +UA_StatusCode +UA_Server_addPeriodicServerRegisterCallback(UA_Server *server, + struct UA_Client *client, + const char* discoveryServerUrl, + UA_Double intervalMs, + UA_Double delayFirstRegisterMs, + UA_UInt64 *periodicCallbackId) { + + /* No valid server URL */ + if(!discoveryServerUrl) { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "No discovery server URL provided"); + return UA_STATUSCODE_BADINTERNALERROR; + } + + + if (client->connection.state != UA_CONNECTION_CLOSED) + return UA_STATUSCODE_BADINVALIDSTATE; + + /* check if we are already registering with the given discovery url and remove the old periodic call */ + { + periodicServerRegisterCallback_entry *rs, *rs_tmp; + LIST_FOREACH_SAFE(rs, &server->discoveryManager. + periodicServerRegisterCallbacks, pointers, rs_tmp) { + if(strcmp(rs->callback->discovery_server_url, discoveryServerUrl) == 0) { + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, + "There is already a register callback for '%s' in place. Removing the older one.", discoveryServerUrl); + UA_Server_removeRepeatedCallback(server, rs->callback->id); + LIST_REMOVE(rs, pointers); + UA_free(rs->callback->discovery_server_url); + UA_free(rs->callback); + UA_free(rs); + break; + } + } + } + + /* Allocate and initialize */ + struct PeriodicServerRegisterCallback* cb = + (struct PeriodicServerRegisterCallback*) + UA_malloc(sizeof(struct PeriodicServerRegisterCallback)); + if(!cb) + return UA_STATUSCODE_BADOUTOFMEMORY; + + /* Start repeating a failed register after 1s, then increase the delay. Set + * to 500ms, as the delay is doubled before changing the callback + * interval.*/ + cb->this_interval = 500.0; + cb->default_interval = intervalMs; + cb->registered = false; + cb->client = client; + size_t len = strlen(discoveryServerUrl); + cb->discovery_server_url = (char*)UA_malloc(len+1); + if (!cb->discovery_server_url) { + UA_free(cb); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + memcpy(cb->discovery_server_url, discoveryServerUrl, len+1); + + /* Add the callback */ + UA_StatusCode retval = + UA_Server_addRepeatedCallback(server, periodicServerRegister, + cb, delayFirstRegisterMs, &cb->id); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Could not create periodic job for server register. " + "StatusCode %s", UA_StatusCode_name(retval)); + UA_free(cb); + return retval; + } + +#ifndef __clang_analyzer__ + // the analyzer reports on LIST_INSERT_HEAD a use after free false positive + periodicServerRegisterCallback_entry *newEntry = + (periodicServerRegisterCallback_entry *)UA_malloc(sizeof(periodicServerRegisterCallback_entry)); + if(!newEntry) { + UA_Server_removeRepeatedCallback(server, cb->id); + UA_free(cb); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + newEntry->callback = cb; + LIST_INSERT_HEAD(&server->discoveryManager.periodicServerRegisterCallbacks, newEntry, pointers); +#endif + + if(periodicCallbackId) + *periodicCallbackId = cb->id; + return UA_STATUSCODE_GOOD; +} + +void +UA_Server_setRegisterServerCallback(UA_Server *server, + UA_Server_registerServerCallback cb, + void* data) { + server->discoveryManager.registerServerCallback = cb; + server->discoveryManager.registerServerCallbackData = data; +} + +#endif /* UA_ENABLE_DISCOVERY */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_services_subscription.c" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2016-2017 (c) Florian Palm + * Copyright 2015 (c) Chris Iatrou + * Copyright 2015-2016 (c) Sten Grüner + * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2018 (c) Ari Breitkreuz, fortiss GmbH + * Copyright 2017 (c) Mattias Bornhager + * Copyright 2017 (c) Henrik Norrman + * Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA + * Copyright 2018 (c) Fabian Arndt, Root-Core + */ + + +#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */ + +static UA_StatusCode +setSubscriptionSettings(UA_Server *server, UA_Subscription *subscription, + UA_Double requestedPublishingInterval, + UA_UInt32 requestedLifetimeCount, + UA_UInt32 requestedMaxKeepAliveCount, + UA_UInt32 maxNotificationsPerPublish, UA_Byte priority) { + /* deregister the callback if required */ + Subscription_unregisterPublishCallback(server, subscription); + + /* re-parameterize the subscription */ + UA_BOUNDEDVALUE_SETWBOUNDS(server->config.publishingIntervalLimits, + requestedPublishingInterval, subscription->publishingInterval); + /* check for nan*/ + if(requestedPublishingInterval != requestedPublishingInterval) + subscription->publishingInterval = server->config.publishingIntervalLimits.min; + UA_BOUNDEDVALUE_SETWBOUNDS(server->config.keepAliveCountLimits, + requestedMaxKeepAliveCount, subscription->maxKeepAliveCount); + UA_BOUNDEDVALUE_SETWBOUNDS(server->config.lifeTimeCountLimits, + requestedLifetimeCount, subscription->lifeTimeCount); + if(subscription->lifeTimeCount < 3 * subscription->maxKeepAliveCount) + subscription->lifeTimeCount = 3 * subscription->maxKeepAliveCount; + subscription->notificationsPerPublish = maxNotificationsPerPublish; + if(maxNotificationsPerPublish == 0 || + maxNotificationsPerPublish > server->config.maxNotificationsPerPublish) + subscription->notificationsPerPublish = server->config.maxNotificationsPerPublish; + subscription->priority = priority; + + UA_StatusCode retval = Subscription_registerPublishCallback(server, subscription); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_DEBUG_SESSION(&server->config.logger, subscription->session, + "Subscription %u | Could not register publish callback with error code %s", + subscription->subscriptionId, UA_StatusCode_name(retval)); + } + return retval; +} + +void +Service_CreateSubscription(UA_Server *server, UA_Session *session, + const UA_CreateSubscriptionRequest *request, + UA_CreateSubscriptionResponse *response) { + /* Check limits for the number of subscriptions */ + if(((server->config.maxSubscriptions != 0) && + (server->numSubscriptions >= server->config.maxSubscriptions)) || + ((server->config.maxSubscriptionsPerSession != 0) && + (session->numSubscriptions >= server->config.maxSubscriptionsPerSession))) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYSUBSCRIPTIONS; + return; + } + + /* Create the subscription */ + UA_Subscription *newSubscription = UA_Subscription_new(session, response->subscriptionId); + if(!newSubscription) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing CreateSubscriptionRequest failed"); + response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + return; + } + + UA_Session_addSubscription(server, session, newSubscription); /* Also assigns the subscription id */ + + /* Set the subscription parameters */ + newSubscription->publishingEnabled = request->publishingEnabled; + UA_StatusCode retval = setSubscriptionSettings(server, newSubscription, request->requestedPublishingInterval, + request->requestedLifetimeCount, request->requestedMaxKeepAliveCount, + request->maxNotificationsPerPublish, request->priority); + + if(retval != UA_STATUSCODE_GOOD) { + response->responseHeader.serviceResult = retval; + return; + } + + newSubscription->currentKeepAliveCount = newSubscription->maxKeepAliveCount; /* set settings first */ + + /* Prepare the response */ + response->subscriptionId = newSubscription->subscriptionId; + response->revisedPublishingInterval = newSubscription->publishingInterval; + response->revisedLifetimeCount = newSubscription->lifeTimeCount; + response->revisedMaxKeepAliveCount = newSubscription->maxKeepAliveCount; + + UA_LOG_INFO_SESSION(&server->config.logger, session, "Subscription %u | " + "Created the Subscription with a publishing interval of %.2f ms", + response->subscriptionId, newSubscription->publishingInterval); +} + +void +Service_ModifySubscription(UA_Server *server, UA_Session *session, + const UA_ModifySubscriptionRequest *request, + UA_ModifySubscriptionResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing ModifySubscriptionRequest"); + + UA_Subscription *sub = UA_Session_getSubscriptionById(session, request->subscriptionId); + if(!sub) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; + return; + } + + UA_StatusCode retval = setSubscriptionSettings(server, sub, request->requestedPublishingInterval, + request->requestedLifetimeCount, request->requestedMaxKeepAliveCount, + request->maxNotificationsPerPublish, request->priority); + + if(retval != UA_STATUSCODE_GOOD) { + response->responseHeader.serviceResult = retval; + return; + } + + sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */ + response->revisedPublishingInterval = sub->publishingInterval; + response->revisedLifetimeCount = sub->lifeTimeCount; + response->revisedMaxKeepAliveCount = sub->maxKeepAliveCount; +} + +static void +Operation_SetPublishingMode(UA_Server *Server, UA_Session *session, + const UA_Boolean *publishingEnabled, const UA_UInt32 *subscriptionId, + UA_StatusCode *result) { + UA_Subscription *sub = UA_Session_getSubscriptionById(session, *subscriptionId); + if(!sub) { + *result = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; + return; + } + + sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */ + sub->publishingEnabled = *publishingEnabled; /* Set the publishing mode */ +} + +void +Service_SetPublishingMode(UA_Server *server, UA_Session *session, + const UA_SetPublishingModeRequest *request, + UA_SetPublishingModeResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing SetPublishingModeRequest"); + UA_Boolean publishingEnabled = request->publishingEnabled; /* request is const */ + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_SetPublishingMode, + &publishingEnabled, + &request->subscriptionIdsSize, &UA_TYPES[UA_TYPES_UINT32], + &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +} + +/* TODO: Unify with senderror in ua_server_binary.c */ +static void +subscriptionSendError(UA_SecureChannel *channel, UA_UInt32 requestHandle, + UA_UInt32 requestId, UA_StatusCode error) { + UA_PublishResponse err_response; + UA_PublishResponse_init(&err_response); + err_response.responseHeader.requestHandle = requestHandle; + err_response.responseHeader.timestamp = UA_DateTime_now(); + err_response.responseHeader.serviceResult = error; + UA_SecureChannel_sendSymmetricMessage(channel, requestId, UA_MESSAGETYPE_MSG, + &err_response, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); +} + +void +Service_Publish(UA_Server *server, UA_Session *session, + const UA_PublishRequest *request, UA_UInt32 requestId) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing PublishRequest"); + + /* Return an error if the session has no subscription */ + if(LIST_EMPTY(&session->serverSubscriptions)) { + subscriptionSendError(session->header.channel, request->requestHeader.requestHandle, + requestId, UA_STATUSCODE_BADNOSUBSCRIPTION); + return; + } + + /* Handle too many subscriptions to free resources before trying to allocate + * resources for the new publish request. If the limit has been reached the + * oldest publish request shall be responded */ + if((server->config.maxPublishReqPerSession != 0) && + (session->numPublishReq >= server->config.maxPublishReqPerSession)) { + if(!UA_Subscription_reachedPublishReqLimit(server, session)) { + subscriptionSendError(session->header.channel, requestId, + request->requestHeader.requestHandle, + UA_STATUSCODE_BADINTERNALERROR); + return; + } + } + + /* Allocate the response to store it in the retransmission queue */ + UA_PublishResponseEntry *entry = (UA_PublishResponseEntry *) + UA_malloc(sizeof(UA_PublishResponseEntry)); + if(!entry) { + subscriptionSendError(session->header.channel, requestId, + request->requestHeader.requestHandle, + UA_STATUSCODE_BADOUTOFMEMORY); + return; + } + + /* Prepare the response */ + entry->requestId = requestId; + UA_PublishResponse *response = &entry->response; + UA_PublishResponse_init(response); + response->responseHeader.requestHandle = request->requestHeader.requestHandle; + + /* Allocate the results array to acknowledge the acknowledge */ + if(request->subscriptionAcknowledgementsSize > 0) { + response->results = (UA_StatusCode *) + UA_Array_new(request->subscriptionAcknowledgementsSize, + &UA_TYPES[UA_TYPES_STATUSCODE]); + if(!response->results) { + UA_free(entry); + subscriptionSendError(session->header.channel, requestId, + request->requestHeader.requestHandle, + UA_STATUSCODE_BADOUTOFMEMORY); + return; + } + response->resultsSize = request->subscriptionAcknowledgementsSize; + } + + /* Delete Acknowledged Subscription Messages */ + for(size_t i = 0; i < request->subscriptionAcknowledgementsSize; ++i) { + UA_SubscriptionAcknowledgement *ack = &request->subscriptionAcknowledgements[i]; + UA_Subscription *sub = UA_Session_getSubscriptionById(session, ack->subscriptionId); + if(!sub) { + response->results[i] = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Cannot process acknowledgements subscription %u", + ack->subscriptionId); + continue; + } + /* Remove the acked transmission from the retransmission queue */ + response->results[i] = UA_Subscription_removeRetransmissionMessage(sub, ack->sequenceNumber); + } + + /* Queue the publish response. It will be dequeued in a repeated publish + * callback. This can also be triggered right now for a late + * subscription. */ + UA_Session_queuePublishReq(session, entry, false); + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Queued a publication message"); + + /* If there are late subscriptions, the new publish request is used to + * answer them immediately. However, a single subscription that generates + * many notifications must not "starve" other late subscriptions. Therefore + * we keep track of the last subscription that got preferential treatment. + * We start searching for late subscriptions **after** the last one. */ + + UA_Subscription *immediate = NULL; + if(session->lastSeenSubscriptionId > 0) { + LIST_FOREACH(immediate, &session->serverSubscriptions, listEntry) { + if(immediate->subscriptionId == session->lastSeenSubscriptionId) { + immediate = LIST_NEXT(immediate, listEntry); + break; + } + } + } + + /* If no entry was found, start at the beginning and don't restart */ + UA_Boolean found = false; + if(!immediate) + immediate = LIST_FIRST(&session->serverSubscriptions); + else + found = true; + + repeat: + while(immediate) { + if(immediate->state == UA_SUBSCRIPTIONSTATE_LATE) { + session->lastSeenSubscriptionId = immediate->subscriptionId; + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Subscription %u | Response on a late subscription", + immediate->subscriptionId); + UA_Subscription_publish(server, immediate); + return; + } + immediate = LIST_NEXT(immediate, listEntry); + } + + /* Restart at the beginning of the list */ + if(found) { + immediate = LIST_FIRST(&session->serverSubscriptions); + found = false; + goto repeat; + } + + /* No late subscription this time */ + session->lastSeenSubscriptionId = 0; +} + +static void +Operation_DeleteSubscription(UA_Server *server, UA_Session *session, void *_, + const UA_UInt32 *subscriptionId, UA_StatusCode *result) { + *result = UA_Session_deleteSubscription(server, session, *subscriptionId); + if(*result == UA_STATUSCODE_GOOD) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Subscription %u | Subscription deleted", + *subscriptionId); + } else { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Deleting Subscription with Id %u failed with error code %s", + *subscriptionId, UA_StatusCode_name(*result)); + } +} + +void +Service_DeleteSubscriptions(UA_Server *server, UA_Session *session, + const UA_DeleteSubscriptionsRequest *request, + UA_DeleteSubscriptionsResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing DeleteSubscriptionsRequest"); + + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, + (UA_ServiceOperation)Operation_DeleteSubscription, NULL, + &request->subscriptionIdsSize, &UA_TYPES[UA_TYPES_UINT32], + &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); + + /* The session has at least one subscription */ + if(LIST_FIRST(&session->serverSubscriptions)) + return; + + /* Send remaining publish responses if the last subscription was removed */ + UA_Subscription_answerPublishRequestsNoSubscription(server, session); +} + +void +Service_Republish(UA_Server *server, UA_Session *session, + const UA_RepublishRequest *request, + UA_RepublishResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing RepublishRequest"); + + /* Get the subscription */ + UA_Subscription *sub = UA_Session_getSubscriptionById(session, request->subscriptionId); + if(!sub) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; + return; + } + + /* Reset the subscription lifetime */ + sub->currentLifetimeCount = 0; + + /* Find the notification in the retransmission queue */ + UA_NotificationMessageEntry *entry; + TAILQ_FOREACH(entry, &sub->retransmissionQueue, listEntry) { + if(entry->message.sequenceNumber == request->retransmitSequenceNumber) + break; + } + if(!entry) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADMESSAGENOTAVAILABLE; + return; + } + + response->responseHeader.serviceResult = + UA_NotificationMessage_copy(&entry->message, &response->notificationMessage); +} + +#endif /* UA_ENABLE_SUBSCRIPTIONS */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_services_monitoreditem.c" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2016-2017 (c) Florian Palm + * Copyright 2015 (c) Chris Iatrou + * Copyright 2015-2016 (c) Sten Grüner + * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2018 (c) Ari Breitkreuz, fortiss GmbH + * Copyright 2017 (c) Mattias Bornhager + * Copyright 2017 (c) Henrik Norrman + * Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA + * Copyright 2018 (c) Fabian Arndt, Root-Core + */ + + +#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */ + +static UA_StatusCode +setMonitoredItemSettings(UA_Server *server, UA_MonitoredItem *mon, + UA_MonitoringMode monitoringMode, + const UA_MonitoringParameters *params, + const UA_DataType* dataType) { + UA_StatusCode retval = UA_STATUSCODE_GOOD; + + if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) { + /* Event MonitoredItem */ +#ifndef UA_ENABLE_SUBSCRIPTIONS_EVENTS + return UA_STATUSCODE_BADNOTSUPPORTED; +#else + if(params->filter.encoding != UA_EXTENSIONOBJECT_DECODED && + params->filter.encoding != UA_EXTENSIONOBJECT_DECODED_NODELETE) + return UA_STATUSCODE_BADEVENTFILTERINVALID; + if(params->filter.content.decoded.type != &UA_TYPES[UA_TYPES_EVENTFILTER]) + return UA_STATUSCODE_BADEVENTFILTERINVALID; + UA_EventFilter_clear(&mon->filter.eventFilter); + retval = UA_EventFilter_copy((UA_EventFilter *)params->filter.content.decoded.data, + &mon->filter.eventFilter); +#endif + } else { + /* DataChange MonitoredItem */ + if(params->filter.encoding != UA_EXTENSIONOBJECT_DECODED && + params->filter.encoding != UA_EXTENSIONOBJECT_DECODED_NODELETE) { + /* Default: Look for status and value */ + UA_DataChangeFilter_clear(&mon->filter.dataChangeFilter); + mon->filter.dataChangeFilter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE; + } else if(params->filter.content.decoded.type == &UA_TYPES[UA_TYPES_DATACHANGEFILTER]) { + UA_DataChangeFilter *filter = (UA_DataChangeFilter *)params->filter.content.decoded.data; + // TODO implement EURange to support UA_DEADBANDTYPE_PERCENT + switch(filter->deadbandType) { + case UA_DEADBANDTYPE_NONE: + break; + case UA_DEADBANDTYPE_ABSOLUTE: + if(!dataType || !UA_DataType_isNumeric(dataType)) + return UA_STATUSCODE_BADFILTERNOTALLOWED; + break; + case UA_DEADBANDTYPE_PERCENT: + return UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED; + default: + return UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED; + } + retval = UA_DataChangeFilter_copy(filter, &mon->filter.dataChangeFilter); + } else { + return UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED; + } + } + + if(retval != UA_STATUSCODE_GOOD) + return retval; + + /* <-- The point of no return --> */ + + /* Unregister the callback */ + UA_MonitoredItem_unregisterSampleCallback(server, mon); + + /* ClientHandle */ + mon->clientHandle = params->clientHandle; + + /* SamplingInterval */ + UA_Double samplingInterval = params->samplingInterval; + + if(mon->attributeId == UA_ATTRIBUTEID_VALUE) { + const UA_VariableNode *vn = (const UA_VariableNode *) + UA_Nodestore_getNode(server->nsCtx, &mon->monitoredNodeId); + if(vn) { + if(vn->nodeClass == UA_NODECLASS_VARIABLE && + samplingInterval < vn->minimumSamplingInterval) + samplingInterval = vn->minimumSamplingInterval; + UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node *)vn); + } + } + + UA_BOUNDEDVALUE_SETWBOUNDS(server->config.samplingIntervalLimits, + samplingInterval, mon->samplingInterval); + if(samplingInterval != samplingInterval) /* Check for nan */ + mon->samplingInterval = server->config.samplingIntervalLimits.min; + + /* QueueSize */ + UA_BOUNDEDVALUE_SETWBOUNDS(server->config.queueSizeLimits, + params->queueSize, mon->maxQueueSize); + + /* DiscardOldest */ + mon->discardOldest = params->discardOldest; + + /* Remove the last sample (for comparison with the current value) only when + * monitoring is switched off. */ + if(monitoringMode == UA_MONITORINGMODE_DISABLED) { + UA_ByteString_clear(&mon->lastSampledValue); + UA_Variant_clear(&mon->lastValue); + } + + /* Register sample callback if reporting is enabled */ + mon->monitoringMode = monitoringMode; + if(monitoringMode == UA_MONITORINGMODE_SAMPLING || + monitoringMode == UA_MONITORINGMODE_REPORTING) + return UA_MonitoredItem_registerSampleCallback(server, mon); + + return UA_STATUSCODE_GOOD; +} + +static const UA_String binaryEncoding = {sizeof("Default Binary") - 1, (UA_Byte *)"Default Binary"}; + +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS +static UA_StatusCode +UA_Server_addMonitoredItemToNodeEditNodeCallback(UA_Server *server, UA_Session *session, + UA_Node *node, void *data) { + /* data is the MonitoredItem */ + /* SLIST_INSERT_HEAD */ + ((UA_MonitoredItem *)data)->next = ((UA_ObjectNode *)node)->monitoredItemQueue; + ((UA_ObjectNode *)node)->monitoredItemQueue = (UA_MonitoredItem *)data; + return UA_STATUSCODE_GOOD; +} +#endif + +/* Thread-local variables to pass additional arguments into the operation */ +struct createMonContext { + UA_Subscription *sub; + UA_TimestampsToReturn timestampsToReturn; + + /* If sub is NULL, use local callbacks */ + UA_Server_DataChangeNotificationCallback dataChangeCallback; + void *context; +}; + +static void +Operation_CreateMonitoredItem(UA_Server *server, UA_Session *session, struct createMonContext *cmc, + const UA_MonitoredItemCreateRequest *request, + UA_MonitoredItemCreateResult *result) { + /* Check available capacity */ + if(cmc->sub && + (((server->config.maxMonitoredItems != 0) && + (server->numMonitoredItems >= server->config.maxMonitoredItems)) || + ((server->config.maxMonitoredItemsPerSubscription != 0) && + (cmc->sub->monitoredItemsSize >= server->config.maxMonitoredItemsPerSubscription)))) { + result->statusCode = UA_STATUSCODE_BADTOOMANYMONITOREDITEMS; + return; + } + + /* Make an example read to get errors in the itemToMonitor. Allow return + * codes "good" and "uncertain", as well as a list of statuscodes that might + * be repaired inside the data source. */ + UA_DataValue v = UA_Server_readWithSession(server, session, &request->itemToMonitor, + cmc->timestampsToReturn); + if(v.hasStatus && (v.status >> 30) > 1 && + v.status != UA_STATUSCODE_BADRESOURCEUNAVAILABLE && + v.status != UA_STATUSCODE_BADCOMMUNICATIONERROR && + v.status != UA_STATUSCODE_BADWAITINGFORINITIALDATA && + v.status != UA_STATUSCODE_BADUSERACCESSDENIED && + v.status != UA_STATUSCODE_BADNOTREADABLE && + v.status != UA_STATUSCODE_BADINDEXRANGENODATA) { + result->statusCode = v.status; + UA_DataValue_deleteMembers(&v); + return; + } + + /* Check if the encoding is supported */ + if(request->itemToMonitor.dataEncoding.name.length > 0 && + (!UA_String_equal(&binaryEncoding, &request->itemToMonitor.dataEncoding.name) || + request->itemToMonitor.dataEncoding.namespaceIndex != 0)) { + result->statusCode = UA_STATUSCODE_BADDATAENCODINGUNSUPPORTED; + UA_DataValue_deleteMembers(&v); + return; + } + + /* Check if the encoding is set for a value */ + if(request->itemToMonitor.attributeId != UA_ATTRIBUTEID_VALUE && + request->itemToMonitor.dataEncoding.name.length > 0) { + result->statusCode = UA_STATUSCODE_BADDATAENCODINGINVALID; + UA_DataValue_deleteMembers(&v); + return; + } + + /* Allocate the MonitoredItem */ + size_t nmsize = sizeof(UA_MonitoredItem); + if(!cmc->sub) + nmsize = sizeof(UA_LocalMonitoredItem); + UA_MonitoredItem *newMon = (UA_MonitoredItem*)UA_malloc(nmsize); + if(!newMon) { + result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; + UA_DataValue_deleteMembers(&v); + return; + } + + /* Initialize the MonitoredItem */ + UA_MonitoredItem_init(newMon, cmc->sub); + newMon->attributeId = request->itemToMonitor.attributeId; + newMon->timestampsToReturn = cmc->timestampsToReturn; + UA_StatusCode retval = UA_STATUSCODE_GOOD; + retval |= UA_NodeId_copy(&request->itemToMonitor.nodeId, &newMon->monitoredNodeId); + retval |= UA_String_copy(&request->itemToMonitor.indexRange, &newMon->indexRange); + retval |= setMonitoredItemSettings(server, newMon, request->monitoringMode, + &request->requestedParameters, v.value.type); + UA_DataValue_deleteMembers(&v); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "Subscription %u | Could not create a MonitoredItem " + "with StatusCode %s", cmc->sub ? cmc->sub->subscriptionId : 0, + UA_StatusCode_name(retval)); + result->statusCode = retval; + UA_MonitoredItem_delete(server, newMon); + return; + } + + /* Add to the subscriptions or the local MonitoredItems */ + if(cmc->sub) { + newMon->monitoredItemId = ++cmc->sub->lastMonitoredItemId; + UA_Subscription_addMonitoredItem(server, cmc->sub, newMon); +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + if(newMon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) { + /* Insert the monitored item into the node's queue */ + UA_Server_editNode(server, NULL, &newMon->monitoredNodeId, + UA_Server_addMonitoredItemToNodeEditNodeCallback, newMon); + } +#endif + } else { + //TODO support events for local monitored items + UA_LocalMonitoredItem *localMon = (UA_LocalMonitoredItem*)newMon; + localMon->context = cmc->context; + localMon->callback.dataChangeCallback = cmc->dataChangeCallback; + newMon->monitoredItemId = ++server->lastLocalMonitoredItemId; + LIST_INSERT_HEAD(&server->localMonitoredItems, newMon, listEntry); + } + + /* Register MonitoredItem in userland */ + if(server->config.monitoredItemRegisterCallback) { + void *targetContext = NULL; + UA_Server_getNodeContext(server, request->itemToMonitor.nodeId, &targetContext); + server->config.monitoredItemRegisterCallback(server, &session->sessionId, + session->sessionHandle, + &request->itemToMonitor.nodeId, + targetContext, newMon->attributeId, false); + newMon->registered = true; + } + + UA_LOG_INFO_SESSION(&server->config.logger, session, + "Subscription %u | MonitoredItem %i | " + "Created the MonitoredItem", + cmc->sub ? cmc->sub->subscriptionId : 0, + newMon->monitoredItemId); + + /* Create the first sample */ + if(request->monitoringMode == UA_MONITORINGMODE_REPORTING && + newMon->attributeId != UA_ATTRIBUTEID_EVENTNOTIFIER) + UA_MonitoredItem_sampleCallback(server, newMon); + + /* Prepare the response */ + result->revisedSamplingInterval = newMon->samplingInterval; + result->revisedQueueSize = newMon->maxQueueSize; + result->monitoredItemId = newMon->monitoredItemId; +} + +void +Service_CreateMonitoredItems(UA_Server *server, UA_Session *session, + const UA_CreateMonitoredItemsRequest *request, + UA_CreateMonitoredItemsResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing CreateMonitoredItemsRequest"); + + if(server->config.maxMonitoredItemsPerCall != 0 && + request->itemsToCreateSize > server->config.maxMonitoredItemsPerCall) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + /* Check if the timestampstoreturn is valid */ + struct createMonContext cmc; + cmc.timestampsToReturn = request->timestampsToReturn; + if(cmc.timestampsToReturn > UA_TIMESTAMPSTORETURN_NEITHER) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTIMESTAMPSTORETURNINVALID; + return; + } + + /* Find the subscription */ + cmc.sub = UA_Session_getSubscriptionById(session, request->subscriptionId); + if(!cmc.sub) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; + return; + } + + /* Reset the subscription lifetime */ + cmc.sub->currentLifetimeCount = 0; + + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_CreateMonitoredItem, &cmc, + &request->itemsToCreateSize, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST], + &response->resultsSize, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]); +} + +UA_MonitoredItemCreateResult +UA_Server_createDataChangeMonitoredItem(UA_Server *server, + UA_TimestampsToReturn timestampsToReturn, + const UA_MonitoredItemCreateRequest item, + void *monitoredItemContext, + UA_Server_DataChangeNotificationCallback callback) { + struct createMonContext cmc; + cmc.sub = NULL; + cmc.context = monitoredItemContext; + cmc.dataChangeCallback = callback; + cmc.timestampsToReturn = timestampsToReturn; + + UA_MonitoredItemCreateResult result; + UA_MonitoredItemCreateResult_init(&result); + Operation_CreateMonitoredItem(server, &server->adminSession, &cmc, &item, &result); + return result; +} + +static void +Operation_ModifyMonitoredItem(UA_Server *server, UA_Session *session, UA_Subscription *sub, + const UA_MonitoredItemModifyRequest *request, + UA_MonitoredItemModifyResult *result) { + /* Get the MonitoredItem */ + UA_MonitoredItem *mon = UA_Subscription_getMonitoredItem(sub, request->monitoredItemId); + if(!mon) { + result->statusCode = UA_STATUSCODE_BADMONITOREDITEMIDINVALID; + return; + } + + /* Read the current value to test if filters are possible. + * Can return an empty value (v.value.type == NULL). */ + UA_ReadValueId rvid; + UA_ReadValueId_init(&rvid); + rvid.nodeId = mon->monitoredNodeId; + rvid.attributeId = mon->attributeId; + rvid.indexRange = mon->indexRange; + UA_DataValue v = UA_Server_readWithSession(server, session, &rvid, mon->timestampsToReturn); + UA_StatusCode retval = setMonitoredItemSettings(server, mon, mon->monitoringMode, + &request->requestedParameters, + v.value.type); + UA_DataValue_deleteMembers(&v); + if(retval != UA_STATUSCODE_GOOD) { + result->statusCode = retval; + return; + } + + result->revisedSamplingInterval = mon->samplingInterval; + result->revisedQueueSize = mon->maxQueueSize; + + /* Remove some notifications if the queue is now too small */ + UA_MonitoredItem_ensureQueueSpace(server, mon); +} + +void +Service_ModifyMonitoredItems(UA_Server *server, UA_Session *session, + const UA_ModifyMonitoredItemsRequest *request, + UA_ModifyMonitoredItemsResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing ModifyMonitoredItemsRequest"); + + if(server->config.maxMonitoredItemsPerCall != 0 && + request->itemsToModifySize > server->config.maxMonitoredItemsPerCall) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + /* Check if the timestampstoreturn is valid */ + if(request->timestampsToReturn > UA_TIMESTAMPSTORETURN_NEITHER) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTIMESTAMPSTORETURNINVALID; + return; + } + + /* Get the subscription */ + UA_Subscription *sub = UA_Session_getSubscriptionById(session, request->subscriptionId); + if(!sub) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; + return; + } + + sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */ + + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, + (UA_ServiceOperation)Operation_ModifyMonitoredItem, sub, + &request->itemsToModifySize, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST], + &response->resultsSize, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]); +} + +struct setMonitoringContext { + UA_Subscription *sub; + UA_MonitoringMode monitoringMode; +}; + +static void +Operation_SetMonitoringMode(UA_Server *server, UA_Session *session, + struct setMonitoringContext *smc, + const UA_UInt32 *monitoredItemId, UA_StatusCode *result) { + UA_MonitoredItem *mon = UA_Subscription_getMonitoredItem(smc->sub, *monitoredItemId); + if(!mon) { + *result = UA_STATUSCODE_BADMONITOREDITEMIDINVALID; + return; + } + UA_Subscription *sub = mon->subscription; + + /* Check if the MonitoringMode is valid or not */ + if(smc->monitoringMode > UA_MONITORINGMODE_REPORTING) { + *result = UA_STATUSCODE_BADMONITORINGMODEINVALID; + return; + } + + /* Nothing has changed */ + if(mon->monitoringMode == smc->monitoringMode) + return; + + mon->monitoringMode = smc->monitoringMode; + + /* When reporting is enabled, put all notifications that were already + * sampled into the global queue of the subscription. When sampling is + * enabled, remove all notifications from the global queue. !!! This needs + * to be the same operation as in UA_Notification_enqueue !!! */ + if(mon->monitoringMode == UA_MONITORINGMODE_REPORTING) { + UA_Notification *notification; + TAILQ_FOREACH(notification, &mon->queue, listEntry) { + TAILQ_INSERT_TAIL(&sub->notificationQueue, notification, globalEntry); + ++sub->notificationQueueSize; +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) { + ++sub->eventNotifications; + } else +#endif + { + ++sub->dataChangeNotifications; + } + } + /* Register the sampling callback with an interval */ + *result = UA_MonitoredItem_registerSampleCallback(server, mon); + } else if(mon->monitoringMode == UA_MONITORINGMODE_SAMPLING) { + UA_Notification *notification; + TAILQ_FOREACH(notification, &mon->queue, listEntry) { + TAILQ_REMOVE(&sub->notificationQueue, notification, globalEntry); + TAILQ_NEXT(notification, globalEntry) = UA_SUBSCRIPTION_QUEUE_SENTINEL; + --sub->notificationQueueSize; +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) { + --sub->eventNotifications; + } else +#endif + { + --sub->dataChangeNotifications; + } + } + /* Register the sampling callback with an interval */ + *result = UA_MonitoredItem_registerSampleCallback(server, mon); + } else { + /* UA_MONITORINGMODE_DISABLED */ + UA_MonitoredItem_unregisterSampleCallback(server, mon); + + /* Setting the mode to DISABLED or SAMPLING causes all queued Notifications to be deleted */ + UA_Notification *notification, *notification_tmp; + TAILQ_FOREACH_SAFE(notification, &mon->queue, listEntry, notification_tmp) { + UA_Notification_dequeue(server, notification); + UA_Notification_delete(notification); + } + + /* Initialize lastSampledValue */ + UA_ByteString_deleteMembers(&mon->lastSampledValue); + UA_Variant_deleteMembers(&mon->lastValue); + } +} + +void +Service_SetMonitoringMode(UA_Server *server, UA_Session *session, + const UA_SetMonitoringModeRequest *request, + UA_SetMonitoringModeResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing SetMonitoringMode"); + + if(server->config.maxMonitoredItemsPerCall != 0 && + request->monitoredItemIdsSize > server->config.maxMonitoredItemsPerCall) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + /* Get the subscription */ + struct setMonitoringContext smc; + smc.sub = UA_Session_getSubscriptionById(session, request->subscriptionId); + if(!smc.sub) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; + return; + } + + smc.sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */ + + smc.monitoringMode = request->monitoringMode; + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, + (UA_ServiceOperation)Operation_SetMonitoringMode, &smc, + &request->monitoredItemIdsSize, &UA_TYPES[UA_TYPES_UINT32], + &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +} + +static void +Operation_DeleteMonitoredItem(UA_Server *server, UA_Session *session, UA_Subscription *sub, + const UA_UInt32 *monitoredItemId, UA_StatusCode *result) { + *result = UA_Subscription_deleteMonitoredItem(server, sub, *monitoredItemId); +} + +void +Service_DeleteMonitoredItems(UA_Server *server, UA_Session *session, + const UA_DeleteMonitoredItemsRequest *request, + UA_DeleteMonitoredItemsResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing DeleteMonitoredItemsRequest"); + + if(server->config.maxMonitoredItemsPerCall != 0 && + request->monitoredItemIdsSize > server->config.maxMonitoredItemsPerCall) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + /* Get the subscription */ + UA_Subscription *sub = UA_Session_getSubscriptionById(session, request->subscriptionId); + if(!sub) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; + return; + } + + /* Reset the subscription lifetime */ + sub->currentLifetimeCount = 0; + + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, + (UA_ServiceOperation)Operation_DeleteMonitoredItem, sub, + &request->monitoredItemIdsSize, &UA_TYPES[UA_TYPES_UINT32], + &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +} + +UA_StatusCode +UA_Server_deleteMonitoredItem(UA_Server *server, UA_UInt32 monitoredItemId) { + UA_MonitoredItem *mon; + LIST_FOREACH(mon, &server->localMonitoredItems, listEntry) { + if(mon->monitoredItemId != monitoredItemId) + continue; + LIST_REMOVE(mon, listEntry); + UA_MonitoredItem_delete(server, mon); + return UA_STATUSCODE_GOOD; + } + return UA_STATUSCODE_BADMONITOREDITEMIDINVALID; +} + +#endif /* UA_ENABLE_SUBSCRIPTIONS */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_services_securechannel.c" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2014, 2017 (c) Florian Palm + * Copyright 2015 (c) Oleksiy Vasylyev + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB + */ + + +void +Service_OpenSecureChannel(UA_Server *server, UA_SecureChannel *channel, + const UA_OpenSecureChannelRequest *request, + UA_OpenSecureChannelResponse *response) { + if(request->requestType == UA_SECURITYTOKENREQUESTTYPE_RENEW) { + /* Renew the channel */ + response->responseHeader.serviceResult = + UA_SecureChannelManager_renew(&server->secureChannelManager, + channel, request, response); + + /* Logging */ + if(response->responseHeader.serviceResult == UA_STATUSCODE_GOOD) { + UA_LOG_DEBUG_CHANNEL(&server->config.logger, channel, + "SecureChannel renewed"); + } else { + UA_LOG_DEBUG_CHANNEL(&server->config.logger, channel, + "Renewing SecureChannel failed"); + } + return; + } + + /* Must be ISSUE or RENEW */ + if(request->requestType != UA_SECURITYTOKENREQUESTTYPE_ISSUE) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; + return; + } + + /* Open the channel */ + response->responseHeader.serviceResult = + UA_SecureChannelManager_open(&server->secureChannelManager, channel, + request, response); + + /* Logging */ + if(response->responseHeader.serviceResult == UA_STATUSCODE_GOOD) { + UA_LOG_INFO_CHANNEL(&server->config.logger, channel, + "Opened SecureChannel"); + } else { + UA_LOG_INFO_CHANNEL(&server->config.logger, channel, + "Opening a SecureChannel failed"); + } +} + +/* The server does not send a CloseSecureChannel response */ +void +Service_CloseSecureChannel(UA_Server *server, UA_SecureChannel *channel) { + UA_LOG_INFO_CHANNEL(&server->config.logger, channel, "CloseSecureChannel"); + UA_SecureChannelManager_close(&server->secureChannelManager, + channel->securityToken.channelId); +} + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_services_nodemanagement.c" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2014-2017 (c) Florian Palm + * Copyright 2015-2016 (c) Sten Grüner + * Copyright 2015-2016 (c) Chris Iatrou + * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2017 (c) Julian Grothoff + * Copyright 2016 (c) LEvertz + * Copyright 2016 (c) Lorenz Haas + * Copyright 2017 (c) frax2222 + * Copyright 2017-2018 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Christian von Arnim + * Copyright 2017 (c) Henrik Norrman + */ + + +/*********************/ +/* Edit Node Context */ +/*********************/ + +UA_StatusCode +UA_Server_getNodeContext(UA_Server *server, UA_NodeId nodeId, + void **nodeContext) { + const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &nodeId); + if(!node) + return UA_STATUSCODE_BADNODEIDUNKNOWN; + *nodeContext = node->context; + UA_Nodestore_releaseNode(server->nsCtx, node); + return UA_STATUSCODE_GOOD; +} + +static UA_StatusCode +setDeconstructedNode(UA_Server *server, UA_Session *session, + UA_Node *node, void *context) { + node->constructed = false; + return UA_STATUSCODE_GOOD; +} + +static UA_StatusCode +setConstructedNodeContext(UA_Server *server, UA_Session *session, + UA_Node *node, void *context) { + node->context = context; + node->constructed = true; + return UA_STATUSCODE_GOOD; +} + +static UA_StatusCode +editNodeContext(UA_Server *server, UA_Session* session, + UA_Node* node, void *context) { + node->context = context; + return UA_STATUSCODE_GOOD; +} + +UA_StatusCode +UA_Server_setNodeContext(UA_Server *server, UA_NodeId nodeId, + void *nodeContext) { + return UA_Server_editNode(server, &server->adminSession, &nodeId, + (UA_EditNodeCallback)editNodeContext, nodeContext); +} + +/**********************/ +/* Consistency Checks */ +/**********************/ + +#define UA_PARENT_REFERENCES_COUNT 2 + +const UA_NodeId parentReferences[UA_PARENT_REFERENCES_COUNT] = { + {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASSUBTYPE}}, + {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASCOMPONENT}} +}; + +/* Check if the requested parent node exists, has the right node class and is + * referenced with an allowed (hierarchical) reference type. For "type" nodes, + * only hasSubType references are allowed. */ +static UA_StatusCode +checkParentReference(UA_Server *server, UA_Session *session, UA_NodeClass nodeClass, + const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId) { + /* Objects do not need a parent (e.g. mandatory/optional modellingrules) */ + /* Also, there are some variables which do not have parents, e.g. EnumStrings, EnumValues */ + if((nodeClass == UA_NODECLASS_OBJECT || nodeClass == UA_NODECLASS_VARIABLE) && + UA_NodeId_isNull(parentNodeId) && UA_NodeId_isNull(referenceTypeId)) + return UA_STATUSCODE_GOOD; + + /* See if the parent exists */ + const UA_Node *parent = UA_Nodestore_getNode(server->nsCtx, parentNodeId); + if(!parent) { + UA_LOG_NODEID_WRAP(parentNodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Parent node %.*s not found", + (int)nodeIdStr.length, nodeIdStr.data)); + return UA_STATUSCODE_BADPARENTNODEIDINVALID; + } + + UA_NodeClass parentNodeClass = parent->nodeClass; + UA_Nodestore_releaseNode(server->nsCtx, parent); + + /* Check the referencetype exists */ + const UA_ReferenceTypeNode *referenceType = (const UA_ReferenceTypeNode*) + UA_Nodestore_getNode(server->nsCtx, referenceTypeId); + if(!referenceType) { + UA_LOG_NODEID_WRAP(referenceTypeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Reference type %.*s to the parent not found", + (int)nodeIdStr.length, nodeIdStr.data)); + return UA_STATUSCODE_BADREFERENCETYPEIDINVALID; + } + + /* Check if the referencetype is a reference type node */ + if(referenceType->nodeClass != UA_NODECLASS_REFERENCETYPE) { + UA_LOG_NODEID_WRAP(referenceTypeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Reference type %.*s to the parent is not a ReferenceTypeNode", + (int)nodeIdStr.length, nodeIdStr.data)); + UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)referenceType); + return UA_STATUSCODE_BADREFERENCETYPEIDINVALID; + } + + UA_Boolean referenceTypeIsAbstract = referenceType->isAbstract; + UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)referenceType); + /* Check that the reference type is not abstract */ + if(referenceTypeIsAbstract == true) { + UA_LOG_NODEID_WRAP(referenceTypeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Abstract reference type %.*s to the parent not allowed", + (int)nodeIdStr.length, nodeIdStr.data)); + return UA_STATUSCODE_BADREFERENCENOTALLOWED; + } + + /* Check hassubtype relation for type nodes */ + if(nodeClass == UA_NODECLASS_DATATYPE || + nodeClass == UA_NODECLASS_VARIABLETYPE || + nodeClass == UA_NODECLASS_OBJECTTYPE || + nodeClass == UA_NODECLASS_REFERENCETYPE) { + /* type needs hassubtype reference to the supertype */ + if(!UA_NodeId_equal(referenceTypeId, &subtypeId)) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Type nodes need to have a HasSubType " + "reference to the parent"); + return UA_STATUSCODE_BADREFERENCENOTALLOWED; + } + /* supertype needs to be of the same node type */ + if(parentNodeClass != nodeClass) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Type nodes needs to be of the same node " + "type as their parent"); + return UA_STATUSCODE_BADPARENTNODEIDINVALID; + } + return UA_STATUSCODE_GOOD; + } + + /* Test if the referencetype is hierarchical */ + if(!isNodeInTree(server->nsCtx, referenceTypeId, + &hierarchicalReferences, &subtypeId, 1)) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Reference type to the parent is not hierarchical"); + return UA_STATUSCODE_BADREFERENCETYPEIDINVALID; + } + + return UA_STATUSCODE_GOOD; +} + +static UA_StatusCode +typeCheckVariableNode(UA_Server *server, UA_Session *session, + const UA_VariableNode *node, + const UA_VariableTypeNode *vt) { + /* The value might come from a datasource, so we perform a + * regular read. */ + UA_DataValue value; + UA_DataValue_init(&value); + UA_StatusCode retval = readValueAttribute(server, session, node, &value); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + UA_NodeId baseDataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE); + + /* Check the datatype against the vt */ + /* If the node does not have any value and the dataType is BaseDataType, + * then it's also fine. This is the default for empty nodes. */ + if(!compatibleDataType(server, &node->dataType, &vt->dataType, false) && + (value.hasValue || !UA_NodeId_equal(&node->dataType, &baseDataType))) { + UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: The value of %.*s is incompatible with " + "the datatype of the VariableType", + (int)nodeIdStr.length, nodeIdStr.data)); + UA_DataValue_deleteMembers(&value); + return UA_STATUSCODE_BADTYPEMISMATCH; + } + + /* Check valueRank against array dimensions */ + if(!compatibleValueRankArrayDimensions(server, session, node->valueRank, + node->arrayDimensionsSize)) { + UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: The value rank of %.*s is incomatible " + "with its array dimensions", (int)nodeIdStr.length, nodeIdStr.data)); + UA_DataValue_deleteMembers(&value); + return UA_STATUSCODE_BADTYPEMISMATCH; + } + + /* Check valueRank against the vt */ + if(!compatibleValueRanks(node->valueRank, vt->valueRank)) { + UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: The value rank of %.*s is incomatible " + "with the value rank of the VariableType", + (int)nodeIdStr.length, nodeIdStr.data)); + UA_DataValue_deleteMembers(&value); + return UA_STATUSCODE_BADTYPEMISMATCH; + } + + /* Check array dimensions against the vt */ + if(!compatibleArrayDimensions(vt->arrayDimensionsSize, vt->arrayDimensions, + node->arrayDimensionsSize, node->arrayDimensions)) { + UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: The array dimensions of %.*s are " + "incomatible with the array dimensions of the VariableType", + (int)nodeIdStr.length, nodeIdStr.data)); + UA_DataValue_deleteMembers(&value); + return UA_STATUSCODE_BADTYPEMISMATCH; + } + + /* Typecheck the value */ + if(value.hasValue && value.value.data) { + /* If the type-check failed write the same value again. The + * write-service tries to convert to the correct type... */ + if(!compatibleValue(server, session, &node->dataType, node->valueRank, + node->arrayDimensionsSize, node->arrayDimensions, + &value.value, NULL)) + retval = UA_Server_writeValue(server, node->nodeId, value.value); + UA_DataValue_deleteMembers(&value); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: The value of of %.*s is incomatible with the " + "variable definition", (int)nodeIdStr.length, nodeIdStr.data)); + } + } + + return retval; +} + +/********************/ +/* Instantiate Node */ +/********************/ + +static const UA_NodeId baseDataVariableType = + {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_BASEDATAVARIABLETYPE}}; +static const UA_NodeId baseObjectType = + {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_BASEOBJECTTYPE}}; +static const UA_NodeId hasTypeDefinition = + {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASTYPEDEFINITION}}; + +/* Use attributes from the variable type wherever required. Reload the node if + * changes were made. */ +static UA_StatusCode +useVariableTypeAttributes(UA_Server *server, UA_Session *session, + const UA_VariableNode **node_ptr, + const UA_VariableTypeNode *vt) { + const UA_VariableNode *node = *node_ptr; + UA_Boolean modified = false; + + /* If no value is set, see if the vt provides one and copy it. This needs to + * be done before copying the datatype from the vt, as setting the datatype + * triggers a typecheck. */ + UA_DataValue orig; + UA_DataValue_init(&orig); + UA_StatusCode retval = readValueAttribute(server, session, node, &orig); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + if(orig.value.type) { + /* A value is present */ + UA_DataValue_deleteMembers(&orig); + } else { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "AddNodes: No value given; Copy the value " + "from the TypeDefinition"); + UA_WriteValue v; + UA_WriteValue_init(&v); + retval = readValueAttribute(server, session, (const UA_VariableNode*)vt, &v.value); + if(retval == UA_STATUSCODE_GOOD && v.value.hasValue) { + v.nodeId = node->nodeId; + v.attributeId = UA_ATTRIBUTEID_VALUE; + retval = UA_Server_writeWithSession(server, session, &v); + modified = true; + } + UA_DataValue_deleteMembers(&v.value); + if(retval != UA_STATUSCODE_GOOD) + return retval; + } + + /* If no datatype is given, use the datatype of the vt */ + if(UA_NodeId_isNull(&node->dataType)) { + UA_LOG_INFO_SESSION(&server->config.logger, session, "AddNodes: " + "No datatype given; Copy the datatype attribute " + "from the TypeDefinition"); + UA_WriteValue v; + UA_WriteValue_init(&v); + v.nodeId = node->nodeId; + v.attributeId = UA_ATTRIBUTEID_DATATYPE; + v.value.hasValue = true; + UA_Variant_setScalar(&v.value.value, (void*)(uintptr_t)&vt->dataType, + &UA_TYPES[UA_TYPES_NODEID]); + retval = UA_Server_writeWithSession(server, session, &v); + modified = true; + if(retval != UA_STATUSCODE_GOOD) + return retval; + } + + /* Use the ArrayDimensions of the vt */ + if(node->arrayDimensionsSize == 0 && vt->arrayDimensionsSize > 0) { + UA_WriteValue v; + UA_WriteValue_init(&v); + v.nodeId = node->nodeId; + v.attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS; + v.value.hasValue = true; + UA_Variant_setArray(&v.value.value, vt->arrayDimensions, + vt->arrayDimensionsSize, &UA_TYPES[UA_TYPES_UINT32]); + retval = UA_Server_writeWithSession(server, session, &v); + modified = true; + if(retval != UA_STATUSCODE_GOOD) + return retval; + } + + /* If the node was modified, update the pointer to the new version */ + if(modified) { + const UA_VariableNode *updated = (const UA_VariableNode*) + UA_Nodestore_getNode(server->nsCtx, &node->nodeId); + + if(!updated) + return UA_STATUSCODE_BADINTERNALERROR; + + UA_Nodestore_releaseNode(server->nsCtx, (const UA_Node*)node); + *node_ptr = updated; + } + + return UA_STATUSCODE_GOOD; +} + +/* Search for an instance of "browseName" in node searchInstance. Used during + * copyChildNodes to find overwritable/mergable nodes. Does not touch + * outInstanceNodeId if no child is found. */ +static UA_StatusCode +findChildByBrowsename(UA_Server *server, UA_Session *session, + const UA_NodeId *searchInstance, + const UA_QualifiedName *browseName, + UA_NodeId *outInstanceNodeId) { + UA_BrowseDescription bd; + UA_BrowseDescription_init(&bd); + bd.nodeId = *searchInstance; + bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES); + bd.includeSubtypes = true; + bd.browseDirection = UA_BROWSEDIRECTION_FORWARD; + bd.nodeClassMask = UA_NODECLASS_OBJECT | UA_NODECLASS_VARIABLE | UA_NODECLASS_METHOD; + bd.resultMask = UA_BROWSERESULTMASK_BROWSENAME; + + UA_BrowseResult br; + UA_BrowseResult_init(&br); + UA_UInt32 maxrefs = 0; + Operation_Browse(server, session, &maxrefs, &bd, &br); + if(br.statusCode != UA_STATUSCODE_GOOD) + return br.statusCode; + + UA_StatusCode retval = UA_STATUSCODE_GOOD; + for(size_t i = 0; i < br.referencesSize; ++i) { + UA_ReferenceDescription *rd = &br.references[i]; + if(rd->browseName.namespaceIndex == browseName->namespaceIndex && + UA_String_equal(&rd->browseName.name, &browseName->name)) { + retval = UA_NodeId_copy(&rd->nodeId.nodeId, outInstanceNodeId); + break; + } + } + + UA_BrowseResult_deleteMembers(&br); + return retval; +} + +static const UA_NodeId mandatoryId = + {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_MODELLINGRULE_MANDATORY}}; +static const UA_NodeId hasModellingRuleId = + {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASMODELLINGRULE}}; + +static UA_Boolean +isMandatoryChild(UA_Server *server, UA_Session *session, + const UA_NodeId *childNodeId) { + /* Get the child */ + const UA_Node *child = UA_Nodestore_getNode(server->nsCtx, childNodeId); + if(!child) + return false; + + /* Look for the reference making the child mandatory */ + for(size_t i = 0; i < child->referencesSize; ++i) { + UA_NodeReferenceKind *refs = &child->references[i]; + if(!UA_NodeId_equal(&hasModellingRuleId, &refs->referenceTypeId)) + continue; + if(refs->isInverse) + continue; + for(size_t j = 0; j < refs->refTargetsSize; ++j) { + if(UA_NodeId_equal(&mandatoryId, &refs->refTargets[j].target.nodeId)) { + UA_Nodestore_releaseNode(server->nsCtx, child); + return true; + } + } + } + + UA_Nodestore_releaseNode(server->nsCtx, child); + return false; +} + +static UA_StatusCode +copyAllChildren(UA_Server *server, UA_Session *session, + const UA_NodeId *source, const UA_NodeId *destination); + +static UA_StatusCode +recursiveTypeCheckAddChildren(UA_Server *server, UA_Session *session, + const UA_Node **node, const UA_Node *type); + +static void +Operation_addReference(UA_Server *server, UA_Session *session, void *context, + const UA_AddReferencesItem *item, UA_StatusCode *retval); + +static UA_StatusCode +copyChild(UA_Server *server, UA_Session *session, const UA_NodeId *destinationNodeId, + const UA_ReferenceDescription *rd) { + /* Is there an existing child with the browsename? */ + UA_NodeId existingChild = UA_NODEID_NULL; + UA_StatusCode retval = findChildByBrowsename(server, session, destinationNodeId, + &rd->browseName, &existingChild); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + /* Have a child with that browseName. Deep-copy missing members. */ + if(!UA_NodeId_isNull(&existingChild)) { + if(rd->nodeClass == UA_NODECLASS_VARIABLE || + rd->nodeClass == UA_NODECLASS_OBJECT) + retval = copyAllChildren(server, session, &rd->nodeId.nodeId, &existingChild); + UA_NodeId_deleteMembers(&existingChild); + return retval; + } + + /* Is the child mandatory? If not, ask callback whether child should be instantiated. + * If not, skip. */ + if(!isMandatoryChild(server, session, &rd->nodeId.nodeId)) { + if(!server->config.nodeLifecycle.createOptionalChild) + return UA_STATUSCODE_GOOD; + + if(server->config.nodeLifecycle.createOptionalChild(server, + &session->sessionId, + session->sessionHandle, + &rd->nodeId.nodeId, + destinationNodeId, + &rd->referenceTypeId) == UA_FALSE) { + return UA_STATUSCODE_GOOD; + } + } + + /* Child is a method -> create a reference */ + if(rd->nodeClass == UA_NODECLASS_METHOD) { + UA_AddReferencesItem newItem; + UA_AddReferencesItem_init(&newItem); + newItem.sourceNodeId = *destinationNodeId; + newItem.referenceTypeId = rd->referenceTypeId; + newItem.isForward = true; + newItem.targetNodeId = rd->nodeId; + newItem.targetNodeClass = UA_NODECLASS_METHOD; + Operation_addReference(server, session, NULL, &newItem, &retval); + return retval; + } + + /* Child is a variable or object */ + if(rd->nodeClass == UA_NODECLASS_VARIABLE || + rd->nodeClass == UA_NODECLASS_OBJECT) { + /* Make a copy of the node */ + UA_Node *node; + retval = UA_Nodestore_getNodeCopy(server->nsCtx, &rd->nodeId.nodeId, &node); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + /* Remove the context of the copied node */ + node->context = NULL; + node->constructed = false; + + /* Reset the NodeId (random numeric id will be assigned in the nodestore) */ + UA_NodeId_deleteMembers(&node->nodeId); + node->nodeId.namespaceIndex = destinationNodeId->namespaceIndex; + + if (server->config.nodeLifecycle.generateChildNodeId) { + retval = server->config.nodeLifecycle.generateChildNodeId(server, + &session->sessionId, session->sessionHandle, + &rd->nodeId.nodeId, + destinationNodeId, + &rd->referenceTypeId, + &node->nodeId); + if(retval != UA_STATUSCODE_GOOD) { + UA_Nodestore_deleteNode(server->nsCtx, node); + return retval; + } + } + + + /* Remove references, they are re-created from scratch in addnode_finish */ + /* TODO: Be more clever in removing references that are re-added during + * addnode_finish. That way, we can call addnode_finish also on children that were + * manually added by the user during addnode_begin and addnode_finish. */ + /* For now we keep all the modelling rule references and delete all others */ + UA_NodeId modellingRuleReferenceId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE); + UA_Node_deleteReferencesSubset(node, 1, &modellingRuleReferenceId); + + /* Add the node to the nodestore */ + UA_NodeId newNodeId; + retval = UA_Nodestore_insertNode(server->nsCtx, node, &newNodeId); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + /* Add the node references */ + retval = AddNode_addRefs(server, session, &newNodeId, destinationNodeId, + &rd->referenceTypeId, &rd->typeDefinition.nodeId); + if(retval != UA_STATUSCODE_GOOD) { + UA_Nodestore_removeNode(server->nsCtx, &newNodeId); + return retval; + } + + /* For the new child, recursively copy the members of the original. No + * typechecking is performed here. Assuming that the original is + * consistent. */ + retval = copyAllChildren(server, session, &rd->nodeId.nodeId, &newNodeId); + } + + return retval; +} + +/* Copy any children of Node sourceNodeId to another node destinationNodeId. */ +static UA_StatusCode +copyAllChildren(UA_Server *server, UA_Session *session, + const UA_NodeId *source, const UA_NodeId *destination) { + /* Browse to get all children of the source */ + UA_BrowseDescription bd; + UA_BrowseDescription_init(&bd); + bd.nodeId = *source; + bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES); + bd.includeSubtypes = true; + bd.browseDirection = UA_BROWSEDIRECTION_FORWARD; + bd.nodeClassMask = UA_NODECLASS_OBJECT | UA_NODECLASS_VARIABLE | UA_NODECLASS_METHOD; + bd.resultMask = UA_BROWSERESULTMASK_REFERENCETYPEID | UA_BROWSERESULTMASK_NODECLASS | + UA_BROWSERESULTMASK_BROWSENAME | UA_BROWSERESULTMASK_TYPEDEFINITION; + + UA_BrowseResult br; + UA_BrowseResult_init(&br); + UA_UInt32 maxrefs = 0; + Operation_Browse(server, session, &maxrefs, &bd, &br); + if(br.statusCode != UA_STATUSCODE_GOOD) + return br.statusCode; + + UA_StatusCode retval = UA_STATUSCODE_GOOD; + for(size_t i = 0; i < br.referencesSize; ++i) { + UA_ReferenceDescription *rd = &br.references[i]; + retval = copyChild(server, session, destination, rd); + if(retval != UA_STATUSCODE_GOOD) + return retval; + } + + UA_BrowseResult_deleteMembers(&br); + return retval; +} + +static UA_StatusCode +addTypeChildren(UA_Server *server, UA_Session *session, + const UA_Node *node, const UA_Node *type) { + /* Get the hierarchy of the type and all its supertypes */ + UA_NodeId *hierarchy = NULL; + size_t hierarchySize = 0; + UA_StatusCode retval = getParentTypeAndInterfaceHierarchy(server, &type->nodeId, + &hierarchy, &hierarchySize); + if(retval != UA_STATUSCODE_GOOD) + return retval; + UA_assert(hierarchySize < 1000); + + /* Copy members of the type and supertypes (and instantiate them) */ + for(size_t i = 0; i < hierarchySize; ++i) { + retval = copyAllChildren(server, session, &hierarchy[i], &node->nodeId); + if(retval != UA_STATUSCODE_GOOD) + break; + } + + UA_Array_delete(hierarchy, hierarchySize, &UA_TYPES[UA_TYPES_NODEID]); + return retval; +} + +static UA_StatusCode +addRef(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId, + const UA_NodeId *referenceTypeId, const UA_NodeId *parentNodeId, + UA_Boolean forward) { + UA_AddReferencesItem ref_item; + UA_AddReferencesItem_init(&ref_item); + ref_item.sourceNodeId = *nodeId; + ref_item.referenceTypeId = *referenceTypeId; + ref_item.isForward = forward; + ref_item.targetNodeId.nodeId = *parentNodeId; + + UA_StatusCode retval = UA_STATUSCODE_GOOD; + Operation_addReference(server, session, NULL, &ref_item, &retval); + return retval; +} + +/************/ +/* Add Node */ +/************/ + +static const UA_NodeId hasSubtype = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASSUBTYPE}}; + +UA_StatusCode +AddNode_addRefs(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId, + const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId, + const UA_NodeId *typeDefinitionId) { + /* Get the node */ + const UA_Node *type = NULL; + const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, nodeId); + if(!node) + return UA_STATUSCODE_BADNODEIDUNKNOWN; + + /* Use the typeDefinition as parent for type-nodes */ + if(node->nodeClass == UA_NODECLASS_VARIABLETYPE || + node->nodeClass == UA_NODECLASS_OBJECTTYPE || + node->nodeClass == UA_NODECLASS_REFERENCETYPE || + node->nodeClass == UA_NODECLASS_DATATYPE) { + if(UA_NodeId_equal(referenceTypeId, &UA_NODEID_NULL)) + referenceTypeId = &hasSubtype; + const UA_Node *parentNode = UA_Nodestore_getNode(server->nsCtx, parentNodeId); + if(parentNode) { + if(parentNode->nodeClass == node->nodeClass) + typeDefinitionId = parentNodeId; + UA_Nodestore_releaseNode(server->nsCtx, parentNode); + } + } + + UA_StatusCode retval; + /* Make sure newly created node does not have itself as parent */ + if (UA_NodeId_equal(nodeId, parentNodeId)) { + UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: The node %.*s can not have " + "itself as parent", + (int)nodeIdStr.length, nodeIdStr.data)); + retval = UA_STATUSCODE_BADINVALIDARGUMENT; + goto cleanup; + } + + + /* Check parent reference. Objects may have no parent. */ + retval = checkParentReference(server, session, node->nodeClass, + parentNodeId, referenceTypeId); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: The parent reference for %.*s is invalid " + "with status code %s", + (int)nodeIdStr.length, nodeIdStr.data, + UA_StatusCode_name(retval))); + goto cleanup; + } + + /* Replace empty typeDefinition with the most permissive default */ + if((node->nodeClass == UA_NODECLASS_VARIABLE || + node->nodeClass == UA_NODECLASS_OBJECT) && + UA_NodeId_isNull(typeDefinitionId)) { + UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: No TypeDefinition for %.*s; Use the default " + "TypeDefinition for the Variable/Object", + (int)nodeIdStr.length, nodeIdStr.data)); + if(node->nodeClass == UA_NODECLASS_VARIABLE) + typeDefinitionId = &baseDataVariableType; + else + typeDefinitionId = &baseObjectType; + } + + /* Get the node type. There must be a typedefinition for variables, objects + * and type-nodes. See the above checks. */ + if(!UA_NodeId_isNull(typeDefinitionId)) { + /* Get the type node */ + type = UA_Nodestore_getNode(server->nsCtx, typeDefinitionId); + if(!type) { + UA_LOG_NODEID_WRAP(typeDefinitionId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Node type %.*s not found", + (int)nodeIdStr.length, nodeIdStr.data)); + retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; + goto cleanup; + } + + UA_Boolean typeOk = false; + switch(node->nodeClass) { + case UA_NODECLASS_DATATYPE: + typeOk = type->nodeClass == UA_NODECLASS_DATATYPE; + break; + case UA_NODECLASS_METHOD: + typeOk = type->nodeClass == UA_NODECLASS_METHOD; + break; + case UA_NODECLASS_OBJECT: + typeOk = type->nodeClass == UA_NODECLASS_OBJECTTYPE; + break; + case UA_NODECLASS_OBJECTTYPE: + typeOk = type->nodeClass == UA_NODECLASS_OBJECTTYPE; + break; + case UA_NODECLASS_REFERENCETYPE: + typeOk = type->nodeClass == UA_NODECLASS_REFERENCETYPE; + break; + case UA_NODECLASS_VARIABLE: + typeOk = type->nodeClass == UA_NODECLASS_VARIABLETYPE; + break; + case UA_NODECLASS_VARIABLETYPE: + typeOk = type->nodeClass == UA_NODECLASS_VARIABLETYPE; + break; + case UA_NODECLASS_VIEW: + typeOk = type->nodeClass == UA_NODECLASS_VIEW; + break; + default: + typeOk = false; + } + if(!typeOk) { + UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Type for %.*s does not match node class", + (int)nodeIdStr.length, nodeIdStr.data)); + retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; + goto cleanup; + } + + /* See if the type has the correct node class. For type-nodes, we know + * that type has the same nodeClass from checkParentReference. */ + if(node->nodeClass == UA_NODECLASS_VARIABLE) { + if(((const UA_VariableTypeNode*)type)->isAbstract) { + /* Get subtypes of the parent reference types */ + UA_NodeId *parentTypeHierarchy = NULL; + size_t parentTypeHierarchySize = 0; + retval |= referenceSubtypes(server, &parentReferences[0], + &parentTypeHierarchySize, &parentTypeHierarchy); + retval |= referenceSubtypes(server, &parentReferences[1], + &parentTypeHierarchySize, &parentTypeHierarchy); + if(retval != UA_STATUSCODE_GOOD) { + UA_Array_delete(parentTypeHierarchy, parentTypeHierarchySize, + &UA_TYPES[UA_TYPES_NODEID]); + goto cleanup; + } + + /* Abstract variable is allowed if parent is a children of a + * base data variable. An abstract variable may be part of an + * object type which again is below BaseObjectType */ + const UA_NodeId variableTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE); + const UA_NodeId objectTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE); + if(!isNodeInTree(server->nsCtx, parentNodeId, &variableTypes, + parentTypeHierarchy, parentTypeHierarchySize) && + !isNodeInTree(server->nsCtx, parentNodeId, &objectTypes, + parentTypeHierarchy, parentTypeHierarchySize)) { + UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Type of variable node %.*s must " + "be VariableType and not cannot be abstract", + (int)nodeIdStr.length, nodeIdStr.data)); + retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; + } + UA_Array_delete(parentTypeHierarchy, parentTypeHierarchySize, + &UA_TYPES[UA_TYPES_NODEID]); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; + } + } + + if(node->nodeClass == UA_NODECLASS_OBJECT) { + if(((const UA_ObjectTypeNode*)type)->isAbstract) { + /* Get subtypes of the parent reference types */ + UA_NodeId *parentTypeHierarchy = NULL; + size_t parentTypeHierarchySize = 0; + retval |= referenceSubtypes(server, &parentReferences[0], + &parentTypeHierarchySize, &parentTypeHierarchy); + retval |= referenceSubtypes(server, &parentReferences[1], + &parentTypeHierarchySize, &parentTypeHierarchy); + if(retval != UA_STATUSCODE_GOOD) { + UA_Array_delete(parentTypeHierarchy, parentTypeHierarchySize, + &UA_TYPES[UA_TYPES_NODEID]); + goto cleanup; + } + + /* Object node created of an abstract ObjectType. Only allowed + * if within BaseObjectType folder or if it's an event (subType of BaseEventType) */ + const UA_NodeId objectTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE); + UA_Boolean isInBaseObjectType = isNodeInTree(server->nsCtx, parentNodeId, &objectTypes, + parentTypeHierarchy, parentTypeHierarchySize); + + const UA_NodeId eventTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEEVENTTYPE); + UA_Boolean isInBaseEventType = isNodeInTree(server->nsCtx, &type->nodeId, &eventTypes, &hasSubtype, 1); + + if(!isInBaseObjectType && !(isInBaseEventType && UA_NodeId_isNull(parentNodeId))) { + UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Type of object node %.*s must " + "be ObjectType and not be abstract", + (int)nodeIdStr.length, nodeIdStr.data)); + retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; + } + UA_Array_delete(parentTypeHierarchy, parentTypeHierarchySize, + &UA_TYPES[UA_TYPES_NODEID]); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; + } + } + } + + /* Add reference to the parent */ + if(!UA_NodeId_isNull(parentNodeId)) { + if(UA_NodeId_isNull(referenceTypeId)) { + UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Reference to parent of %.*s cannot be null", + (int)nodeIdStr.length, nodeIdStr.data)); + retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; + goto cleanup; + } + + retval = addRef(server, session, &node->nodeId, referenceTypeId, parentNodeId, false); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Adding reference to parent of %.*s failed", + (int)nodeIdStr.length, nodeIdStr.data)); + goto cleanup; + } + } + + /* Add a hasTypeDefinition reference */ + if(node->nodeClass == UA_NODECLASS_VARIABLE || + node->nodeClass == UA_NODECLASS_OBJECT) { + UA_assert(type != NULL); /* see above */ + retval = addRef(server, session, &node->nodeId, &hasTypeDefinition, &type->nodeId, true); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_NODEID_WRAP(nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Adding a reference to the type " + "definition of %.*s failed with error code %s", + (int)nodeIdStr.length, nodeIdStr.data, + UA_StatusCode_name(retval))); + } + } + + cleanup: + UA_Nodestore_releaseNode(server->nsCtx, node); + if(type) + UA_Nodestore_releaseNode(server->nsCtx, type); + return retval; +} + +/* Create the node and add it to the nodestore. But don't typecheck and add + * references so far */ +UA_StatusCode +AddNode_raw(UA_Server *server, UA_Session *session, void *nodeContext, + const UA_AddNodesItem *item, UA_NodeId *outNewNodeId) { + /* Do not check access for server */ + if(session != &server->adminSession && server->config.accessControl.allowAddNode && + !server->config.accessControl.allowAddNode(server, &server->config.accessControl, + &session->sessionId, session->sessionHandle, item)) { + return UA_STATUSCODE_BADUSERACCESSDENIED; + } + + /* Check the namespaceindex */ + if(item->requestedNewNodeId.nodeId.namespaceIndex >= server->namespacesSize) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Namespace invalid"); + return UA_STATUSCODE_BADNODEIDINVALID; + } + + if(item->nodeAttributes.encoding != UA_EXTENSIONOBJECT_DECODED && + item->nodeAttributes.encoding != UA_EXTENSIONOBJECT_DECODED_NODELETE) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Node attributes invalid"); + return UA_STATUSCODE_BADINTERNALERROR; + } + + /* Create a node */ + UA_Node *node = UA_Nodestore_newNode(server->nsCtx, item->nodeClass); + if(!node) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Node could not create a node " + "in the nodestore"); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + + /* Fill the node attributes */ + node->context = nodeContext; + UA_StatusCode retval = UA_NodeId_copy(&item->requestedNewNodeId.nodeId, &node->nodeId); + if(retval != UA_STATUSCODE_GOOD) + goto create_error; + + retval = UA_QualifiedName_copy(&item->browseName, &node->browseName); + if(retval != UA_STATUSCODE_GOOD) + goto create_error; + + retval = UA_Node_setAttributes(node, item->nodeAttributes.content.decoded.data, + item->nodeAttributes.content.decoded.type); + if(retval != UA_STATUSCODE_GOOD) + goto create_error; + + /* Add the node to the nodestore */ + retval = UA_Nodestore_insertNode(server->nsCtx, node, outNewNodeId); + if(retval != UA_STATUSCODE_GOOD) + UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Node could not add the new node " + "to the nodestore with error code %s", + UA_StatusCode_name(retval)); + return retval; + +create_error: + UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Node could not create a node " + "with error code %s", UA_StatusCode_name(retval)); + UA_Nodestore_deleteNode(server->nsCtx, node); + return retval; +} + +/* Prepare the node, then add it to the nodestore */ +static UA_StatusCode +Operation_addNode_begin(UA_Server *server, UA_Session *session, void *nodeContext, + const UA_AddNodesItem *item, const UA_NodeId *parentNodeId, + const UA_NodeId *referenceTypeId, UA_NodeId *outNewNodeId) { + /* Create a temporary NodeId if none is returned */ + UA_NodeId newId; + if(!outNewNodeId) { + UA_NodeId_init(&newId); + outNewNodeId = &newId; + } + + /* Create the node and add it to the nodestore */ + UA_StatusCode retval = AddNode_raw(server, session, nodeContext, item, outNewNodeId); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + /* Typecheck and add references to parent and type definition */ + retval = AddNode_addRefs(server, session, outNewNodeId, parentNodeId, + referenceTypeId, &item->typeDefinition.nodeId); + if(retval != UA_STATUSCODE_GOOD) + UA_Server_deleteNode(server, *outNewNodeId, true); + + if(outNewNodeId == &newId) + UA_NodeId_deleteMembers(&newId); + return retval; +} + +static UA_StatusCode +recursiveTypeCheckAddChildren(UA_Server *server, UA_Session *session, + const UA_Node **nodeptr, const UA_Node *type) { + UA_assert(type != NULL); + UA_StatusCode retval = UA_STATUSCODE_GOOD; + const UA_Node *node = *nodeptr; + + /* Use attributes from the type. The value and value constraints are the + * same for the variable and variabletype attribute structs. */ + if(node->nodeClass == UA_NODECLASS_VARIABLE || + node->nodeClass == UA_NODECLASS_VARIABLETYPE) { + retval = useVariableTypeAttributes(server, session, (const UA_VariableNode**)nodeptr, + (const UA_VariableTypeNode*)type); + node = *nodeptr; /* If the node was replaced */ + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Using attributes for %.*s from the variable type " + "failed with error code %s", (int)nodeIdStr.length, + nodeIdStr.data, UA_StatusCode_name(retval))); + return retval; + } + + /* Check NodeClass for 'hasSubtype'. UA_NODECLASS_VARIABLE not allowed to have subtype */ + if((node->nodeClass == UA_NODECLASS_VARIABLE) && (UA_NodeId_equal( + &node->references->referenceTypeId, &hasSubtype))) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: VariableType not allowed to have HasSubType"); + return UA_STATUSCODE_BADREFERENCENOTALLOWED; + } + + /* Check if all attributes hold the constraints of the type now. The initial + * attributes must type-check. The constructor might change the attributes + * again. Then, the changes are type-checked by the normal write service. */ + retval = typeCheckVariableNode(server, session, (const UA_VariableNode*)node, + (const UA_VariableTypeNode*)type); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Type-checking the variable node %.*s " + "failed with error code %s", (int)nodeIdStr.length, + nodeIdStr.data, UA_StatusCode_name(retval))); + return retval; + } + } + + /* Add (mandatory) child nodes from the type definition */ + if(node->nodeClass == UA_NODECLASS_VARIABLE || + node->nodeClass == UA_NODECLASS_OBJECT) { + retval = addTypeChildren(server, session, node, type); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Adding child nodes of %.*s failed with error code %s", + (int)nodeIdStr.length, nodeIdStr.data, UA_StatusCode_name(retval))); + } + } + + return UA_STATUSCODE_GOOD; +} + +static UA_StatusCode +findDefaultInstanceBrowseNameNode(UA_Server *server, + UA_NodeId startingNode, UA_NodeId *foundId){ + + UA_NodeId_init(foundId); + UA_RelativePathElement rpe; + UA_RelativePathElement_init(&rpe); + rpe.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY); + rpe.isInverse = false; + rpe.includeSubtypes = false; + rpe.targetName = UA_QUALIFIEDNAME(0, "DefaultInstanceBrowseName"); + UA_BrowsePath bp; + UA_BrowsePath_init(&bp); + bp.startingNode = startingNode; + bp.relativePath.elementsSize = 1; + bp.relativePath.elements = &rpe; + UA_BrowsePathResult bpr = + UA_Server_translateBrowsePathToNodeIds(server, &bp); + UA_StatusCode retval = bpr.statusCode; + if (retval == UA_STATUSCODE_GOOD && + bpr.targetsSize > 0) { + retval = UA_NodeId_copy(&bpr.targets[0].targetId.nodeId, foundId); + } + UA_BrowsePathResult_deleteMembers(&bpr); + return retval; +} + +/* Check if we got a valid browse name for the new node. + * For object nodes the BrowseName may only be null if the parent type has a + * 'DefaultInstanceBrowseName' property. + * */ +static UA_StatusCode +checkValidBrowseName(UA_Server *server, UA_Session *session, + const UA_Node *node, const UA_Node *type) { + + UA_assert(type != NULL); + UA_StatusCode retval = UA_STATUSCODE_GOOD; + + if(node->nodeClass != UA_NODECLASS_OBJECT) { + /* nodes other than Objects must have a browseName */ + if (UA_QualifiedName_isNull(&node->browseName)) + return UA_STATUSCODE_BADBROWSENAMEINVALID; + return UA_STATUSCODE_GOOD; + } + + /* If the object node already has a browse name we are done here. */ + if(!UA_QualifiedName_isNull(&node->browseName)) + return UA_STATUSCODE_GOOD; + + /* at this point we have an object with an empty browse name. + * Check the type node if it has a DefaultInstanceBrowseName property + */ + + UA_NodeId defaultBrowseNameNode; + retval = findDefaultInstanceBrowseNameNode(server, type->nodeId, &defaultBrowseNameNode); + if (retval != UA_STATUSCODE_GOOD) { + if (retval == UA_STATUSCODE_BADNOMATCH) + /* the DefaultBrowseName property is not found, return the corresponding status code */ + return UA_STATUSCODE_BADBROWSENAMEINVALID; + return retval; + } + + UA_Variant defaultBrowseName; + retval = UA_Server_readValue(server, defaultBrowseNameNode, &defaultBrowseName); + if (retval != UA_STATUSCODE_GOOD) + return retval; + + UA_QualifiedName *defaultValue = (UA_QualifiedName *) defaultBrowseName.data; + retval = UA_Server_writeBrowseName(server, node->nodeId, *defaultValue); + UA_Variant_clear(&defaultBrowseName); + + return retval; +} + +/* Construct children first */ +static UA_StatusCode +recursiveCallConstructors(UA_Server *server, UA_Session *session, + const UA_Node *node, const UA_Node *type) { + if(node->constructed) + return UA_STATUSCODE_GOOD; + + /* Construct the children */ + UA_BrowseDescription bd; + UA_BrowseDescription_init(&bd); + bd.nodeId = node->nodeId; + bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES); + bd.includeSubtypes = true; + bd.browseDirection = UA_BROWSEDIRECTION_FORWARD; + + UA_BrowseResult br; + UA_BrowseResult_init(&br); + UA_UInt32 maxrefs = 0; + Operation_Browse(server, session, &maxrefs, &bd, &br); + if(br.statusCode != UA_STATUSCODE_GOOD) + return br.statusCode; + + /* Call the constructor for every unconstructed node */ + UA_StatusCode retval = UA_STATUSCODE_GOOD; + for(size_t i = 0; i < br.referencesSize; ++i) { + UA_ReferenceDescription *rd = &br.references[i]; + const UA_Node *target = UA_Nodestore_getNode(server->nsCtx, &rd->nodeId.nodeId); + if(!target) + continue; + if(target->constructed) { + UA_Nodestore_releaseNode(server->nsCtx, target); + continue; + } + + const UA_Node *targetType = NULL; + if(node->nodeClass == UA_NODECLASS_VARIABLE || + node->nodeClass == UA_NODECLASS_OBJECT) { + targetType = getNodeType(server, target); + if(!targetType) { + UA_Nodestore_releaseNode(server->nsCtx, target); + retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; + break; + } + } + retval = recursiveCallConstructors(server, session, target, targetType); + UA_Nodestore_releaseNode(server->nsCtx, target); + if(targetType) + UA_Nodestore_releaseNode(server->nsCtx, targetType); + if(retval != UA_STATUSCODE_GOOD) + break; + } + + UA_BrowseResult_deleteMembers(&br); + + /* If a child could not be constructed or the node is already constructed */ + if(retval != UA_STATUSCODE_GOOD) + return retval; + + /* Get the node type constructor */ + const UA_NodeTypeLifecycle *lifecycle = NULL; + if(type && node->nodeClass == UA_NODECLASS_OBJECT) { + const UA_ObjectTypeNode *ot = (const UA_ObjectTypeNode*)type; + lifecycle = &ot->lifecycle; + } else if(type && node->nodeClass == UA_NODECLASS_VARIABLE) { + const UA_VariableTypeNode *vt = (const UA_VariableTypeNode*)type; + lifecycle = &vt->lifecycle; + } + + /* Call the global constructor */ + void *context = node->context; + if(server->config.nodeLifecycle.constructor) + retval = server->config.nodeLifecycle.constructor(server, &session->sessionId, + session->sessionHandle, + &node->nodeId, &context); + + /* Call the type constructor */ + if(retval == UA_STATUSCODE_GOOD && lifecycle && lifecycle->constructor) + retval = lifecycle->constructor(server, &session->sessionId, + session->sessionHandle, &type->nodeId, + type->context, &node->nodeId, &context); + if(retval != UA_STATUSCODE_GOOD) + goto fail1; + + /* Set the context *and* mark the node as constructed */ + if(retval == UA_STATUSCODE_GOOD) + retval = UA_Server_editNode(server, &server->adminSession, &node->nodeId, + (UA_EditNodeCallback)setConstructedNodeContext, + context); + + /* All good, return */ + if(retval == UA_STATUSCODE_GOOD) + return retval; + + /* Fail. Call the destructors. */ + if(lifecycle && lifecycle->destructor) + lifecycle->destructor(server, &session->sessionId, + session->sessionHandle, &type->nodeId, + type->context, &node->nodeId, &context); + + fail1: + if(server->config.nodeLifecycle.destructor) + server->config.nodeLifecycle.destructor(server, &session->sessionId, + session->sessionHandle, + &node->nodeId, context); + return retval; +} + +static void +recursiveDeconstructNode(UA_Server *server, UA_Session *session, + size_t hierarchicalReferencesSize, + UA_ExpandedNodeId *hierarchicalReferences, + const UA_Node *node); + +static void +recursiveDeleteNode(UA_Server *server, UA_Session *session, + size_t hierarchicalReferencesSize, + UA_ExpandedNodeId *hierarchicalReferences, + const UA_Node *node, UA_Boolean removeTargetRefs); + +static UA_StatusCode +setVariableNodeDynamic(UA_Server *server, UA_Session *session, + UA_Node *node, const void *_) { + (void)_; /* unused */ + if(node->nodeClass == UA_NODECLASS_VARIABLE) + ((UA_VariableNode*)node)->isDynamic = true; + return UA_STATUSCODE_GOOD; +} + +static UA_StatusCode +checkSetIsDynamicVariable(UA_Server *server, UA_Session *session, + const UA_NodeId *nodeId) { + /* Get all hierarchical reference types */ + UA_ExpandedNodeId *hierarchicalRefs = NULL; + size_t hierarchicalRefsSize = 0; + UA_NodeId hr = UA_NODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES); + browseRecursive(server, 1, &hr, 1, &subtypeId, UA_BROWSEDIRECTION_FORWARD, true, + &hierarchicalRefsSize, &hierarchicalRefs); + + UA_NodeId *hierarchicalRefs2 = (UA_NodeId*) + UA_Array_new(hierarchicalRefsSize, &UA_TYPES[UA_TYPES_NODEID]); + if(!hierarchicalRefs2) { + UA_Array_delete(hierarchicalRefs, hierarchicalRefsSize, &UA_TYPES[UA_TYPES_NODEID]); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + + for(size_t i = 0; i < hierarchicalRefsSize; i++) { + hierarchicalRefs2[i] = hierarchicalRefs[i].nodeId; + UA_NodeId_init(&hierarchicalRefs[i].nodeId); + } + UA_Array_delete(hierarchicalRefs, hierarchicalRefsSize, &UA_TYPES[UA_TYPES_NODEID]); + + /* Is the variable under the server object? */ + UA_NodeId serverNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER); + if(isNodeInTree(server->nsCtx, nodeId, &serverNodeId, + hierarchicalRefs2, hierarchicalRefsSize)) { + UA_Array_delete(hierarchicalRefs2, hierarchicalRefsSize, &UA_TYPES[UA_TYPES_NODEID]); + return UA_STATUSCODE_GOOD; + } + + /* Is the variable in the type hierarchy? */ + UA_NodeId typesNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER); + if(isNodeInTree(server->nsCtx, nodeId, &typesNodeId, + hierarchicalRefs2, hierarchicalRefsSize)) { + UA_Array_delete(hierarchicalRefs2, hierarchicalRefsSize, &UA_TYPES[UA_TYPES_NODEID]); + return UA_STATUSCODE_GOOD; + } + + /* Is the variable a property of a method node (InputArguments / + * OutputArguments)? */ + UA_BrowseDescription bd; + UA_BrowseDescription_init(&bd); + bd.nodeId = *nodeId; + bd.browseDirection = UA_BROWSEDIRECTION_INVERSE; + bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY); + bd.includeSubtypes = false; + bd.nodeClassMask = UA_NODECLASS_METHOD; + UA_BrowseResult br; + UA_BrowseResult_init(&br); + UA_UInt32 maxrefs = 0; + Operation_Browse(server, session, &maxrefs, &bd, &br); + if(br.referencesSize > 0) { + UA_BrowseResult_clear(&br); + UA_Array_delete(hierarchicalRefs2, hierarchicalRefsSize, &UA_TYPES[UA_TYPES_NODEID]); + return UA_STATUSCODE_GOOD; + } + + /* Set the variable to "dynamic" */ + UA_Server_editNode(server, session, nodeId, + (UA_EditNodeCallback)setVariableNodeDynamic, NULL); + + UA_Array_delete(hierarchicalRefs2, hierarchicalRefsSize, &UA_TYPES[UA_TYPES_NODEID]); + return UA_STATUSCODE_GOOD; +} + +/* Children, references, type-checking, constructors. */ +UA_StatusCode +AddNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId) { + UA_StatusCode retval = UA_STATUSCODE_GOOD; + + /* Get the node */ + const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, nodeId); + if(!node) + return UA_STATUSCODE_BADNODEIDUNKNOWN; + + const UA_Node *type = NULL; + + /* Instantiate variables and objects */ + if(node->nodeClass == UA_NODECLASS_VARIABLE || + node->nodeClass == UA_NODECLASS_VARIABLETYPE || + node->nodeClass == UA_NODECLASS_OBJECT) { + /* Get the type node */ + type = getNodeType(server, node); + if(!type) { + if(server->bootstrapNS0) + goto constructor; + UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Node type for %.*s not found", + (int)nodeIdStr.length, nodeIdStr.data)); + retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; + goto cleanup; + } + + retval = checkValidBrowseName(server, session, node, type); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; + + retval = recursiveTypeCheckAddChildren(server, session, &node, type); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; + } + + /* Set variables to dynamic (source and server timestamps are meaningful) if + * they fulfill some conditions */ + if(node->nodeClass == UA_NODECLASS_VARIABLE) { + retval = checkSetIsDynamicVariable(server, session, nodeId); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; + } + + /* Call the constructor(s) */ + constructor: + retval = recursiveCallConstructors(server, session, node, type); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_NODEID_WRAP(&node->nodeId, UA_LOG_INFO_SESSION(&server->config.logger, session, + "AddNodes: Calling the node constructor(s) of %.*s failed " + "with status code %s", (int)nodeIdStr.length, + nodeIdStr.data, UA_StatusCode_name(retval))); + } + + cleanup: + if(type) + UA_Nodestore_releaseNode(server->nsCtx, type); + if(retval != UA_STATUSCODE_GOOD) { + recursiveDeconstructNode(server, session, 0, NULL, node); + recursiveDeleteNode(server, session, 0, NULL, node, true); + } + UA_Nodestore_releaseNode(server->nsCtx, node); + return retval; +} + +static void +Operation_addNode(UA_Server *server, UA_Session *session, void *nodeContext, + const UA_AddNodesItem *item, UA_AddNodesResult *result) { + result->statusCode = + Operation_addNode_begin(server, session, nodeContext, item, &item->parentNodeId.nodeId, + &item->referenceTypeId, &result->addedNodeId); + if(result->statusCode != UA_STATUSCODE_GOOD) + return; + + /* AddNodes_finish */ + result->statusCode = AddNode_finish(server, session, &result->addedNodeId); + + /* If finishing failed, the node was deleted */ + if(result->statusCode != UA_STATUSCODE_GOOD) + UA_NodeId_deleteMembers(&result->addedNodeId); +} + +void +Service_AddNodes(UA_Server *server, UA_Session *session, + const UA_AddNodesRequest *request, + UA_AddNodesResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Processing AddNodesRequest"); + + if(server->config.maxNodesPerNodeManagement != 0 && + request->nodesToAddSize > server->config.maxNodesPerNodeManagement) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, + (UA_ServiceOperation)Operation_addNode, NULL, + &request->nodesToAddSize, &UA_TYPES[UA_TYPES_ADDNODESITEM], + &response->resultsSize, &UA_TYPES[UA_TYPES_ADDNODESRESULT]); +} + +UA_StatusCode +__UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass, + const UA_NodeId *requestedNewNodeId, + const UA_NodeId *parentNodeId, + const UA_NodeId *referenceTypeId, + const UA_QualifiedName browseName, + const UA_NodeId *typeDefinition, + const UA_NodeAttributes *attr, + const UA_DataType *attributeType, + void *nodeContext, UA_NodeId *outNewNodeId) { + /* Create the AddNodesItem */ + UA_AddNodesItem item; + UA_AddNodesItem_init(&item); + item.nodeClass = nodeClass; + item.requestedNewNodeId.nodeId = *requestedNewNodeId; + item.browseName = browseName; + item.parentNodeId.nodeId = *parentNodeId; + item.referenceTypeId = *referenceTypeId; + item.typeDefinition.nodeId = *typeDefinition; + item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; + item.nodeAttributes.content.decoded.type = attributeType; + item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)attr; + + /* Call the normal addnodes service */ + UA_AddNodesResult result; + UA_AddNodesResult_init(&result); + Operation_addNode(server, &server->adminSession, nodeContext, &item, &result); + if(outNewNodeId) + *outNewNodeId = result.addedNodeId; + else + UA_NodeId_deleteMembers(&result.addedNodeId); + return result.statusCode; +} + +UA_StatusCode +UA_Server_addNode_begin(UA_Server *server, const UA_NodeClass nodeClass, + const UA_NodeId requestedNewNodeId, + const UA_NodeId parentNodeId, + const UA_NodeId referenceTypeId, + const UA_QualifiedName browseName, + const UA_NodeId typeDefinition, + const void *attr, const UA_DataType *attributeType, + void *nodeContext, UA_NodeId *outNewNodeId) { + UA_AddNodesItem item; + UA_AddNodesItem_init(&item); + item.nodeClass = nodeClass; + item.requestedNewNodeId.nodeId = requestedNewNodeId; + item.browseName = browseName; + item.typeDefinition.nodeId = typeDefinition; + item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; + item.nodeAttributes.content.decoded.type = attributeType; + item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)attr; + return Operation_addNode_begin(server, &server->adminSession, nodeContext, &item, + &parentNodeId, &referenceTypeId, outNewNodeId); +} + +UA_StatusCode +UA_Server_addNode_finish(UA_Server *server, const UA_NodeId nodeId) { + return AddNode_finish(server, &server->adminSession, &nodeId); +} + +/****************/ +/* Delete Nodes */ +/****************/ + +static void +Operation_deleteReference(UA_Server *server, UA_Session *session, void *context, + const UA_DeleteReferencesItem *item, UA_StatusCode *retval); + +/* Remove references to this node (in the other nodes) */ +static void +removeIncomingReferences(UA_Server *server, UA_Session *session, + const UA_Node *node) { + UA_DeleteReferencesItem item; + UA_DeleteReferencesItem_init(&item); + item.targetNodeId.nodeId = node->nodeId; + item.deleteBidirectional = false; + UA_StatusCode dummy; + for(size_t i = 0; i < node->referencesSize; ++i) { + UA_NodeReferenceKind *refs = &node->references[i]; + item.isForward = refs->isInverse; + item.referenceTypeId = refs->referenceTypeId; + for(size_t j = 0; j < refs->refTargetsSize; ++j) { + item.sourceNodeId = refs->refTargets[j].target.nodeId; + Operation_deleteReference(server, session, NULL, &item, &dummy); + } + } +} + +/* A node can only be deleted if it has at most one incoming hierarchical + * reference. If hierarchicalReferences is NULL, always remove. */ +static UA_Boolean +multipleHierarchies(size_t hierarchicalRefsSize, UA_ExpandedNodeId *hierarchicalRefs, + const UA_Node *node) { + if(!hierarchicalRefs) + return false; + + size_t incomingRefs = 0; + for(size_t i = 0; i < node->referencesSize; i++) { + const UA_NodeReferenceKind *k = &node->references[i]; + if(!k->isInverse) + continue; + + UA_Boolean hierarchical = false; + for(size_t j = 0; j < hierarchicalRefsSize; j++) { + if(UA_NodeId_equal(&hierarchicalRefs[j].nodeId, + &k->referenceTypeId)) { + hierarchical = true; + break; + } + } + if(!hierarchical) + continue; + + incomingRefs += k->refTargetsSize; + if(incomingRefs > 1) + return true; + } + + return false; +} + +/* Recursively call the destructors of this node and all child nodes. + * Deconstructs the parent before its children. */ +static void +recursiveDeconstructNode(UA_Server *server, UA_Session *session, + size_t hierarchicalRefsSize, + UA_ExpandedNodeId *hierarchicalRefs, + const UA_Node *node) { + /* Was the constructor called for the node? */ + if(!node->constructed) + return; + + /* Call the type-level destructor */ + void *context = node->context; /* No longer needed after this function */ + if(node->nodeClass == UA_NODECLASS_OBJECT || + node->nodeClass == UA_NODECLASS_VARIABLE) { + const UA_Node *type = getNodeType(server, node); + if(type) { + const UA_NodeTypeLifecycle *lifecycle; + if(node->nodeClass == UA_NODECLASS_OBJECT) + lifecycle = &((const UA_ObjectTypeNode*)type)->lifecycle; + else + lifecycle = &((const UA_VariableTypeNode*)type)->lifecycle; + if(lifecycle->destructor) + lifecycle->destructor(server, + &session->sessionId, session->sessionHandle, + &type->nodeId, type->context, + &node->nodeId, &context); + UA_Nodestore_releaseNode(server->nsCtx, type); + } + } + + /* Call the global destructor */ + if(server->config.nodeLifecycle.destructor) + server->config.nodeLifecycle.destructor(server, &session->sessionId, + session->sessionHandle, + &node->nodeId, context); + + /* Set the constructed flag to false */ + UA_Server_editNode(server, &server->adminSession, &node->nodeId, + (UA_EditNodeCallback)setDeconstructedNode, context); + + /* Browse to get all children of the node */ + UA_BrowseDescription bd; + UA_BrowseDescription_init(&bd); + bd.nodeId = node->nodeId; + bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES); + bd.includeSubtypes = true; + bd.browseDirection = UA_BROWSEDIRECTION_FORWARD; + + UA_BrowseResult br; + UA_BrowseResult_init(&br); + UA_UInt32 maxrefs = 0; + Operation_Browse(server, session, &maxrefs, &bd, &br); + if(br.statusCode != UA_STATUSCODE_GOOD) + return; + + /* Deconstruct every child node */ + for(size_t i = 0; i < br.referencesSize; ++i) { + UA_ReferenceDescription *rd = &br.references[i]; + const UA_Node *child = UA_Nodestore_getNode(server->nsCtx, &rd->nodeId.nodeId); + if(!child) + continue; + /* Only delete child nodes that have no other parent */ + if(!multipleHierarchies(hierarchicalRefsSize, hierarchicalRefs, child)) + recursiveDeconstructNode(server, session, hierarchicalRefsSize, + hierarchicalRefs, child); + UA_Nodestore_releaseNode(server->nsCtx, child); + } + + UA_BrowseResult_deleteMembers(&br); +} + +static void +recursiveDeleteNode(UA_Server *server, UA_Session *session, + size_t hierarchicalRefsSize, + UA_ExpandedNodeId *hierarchicalRefs, + const UA_Node *node, UA_Boolean removeTargetRefs) { + /* Browse to get all children of the node */ + UA_BrowseDescription bd; + UA_BrowseDescription_init(&bd); + bd.nodeId = node->nodeId; + bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES); + bd.includeSubtypes = true; + bd.browseDirection = UA_BROWSEDIRECTION_FORWARD; + + UA_BrowseResult br; + UA_BrowseResult_init(&br); + UA_UInt32 maxrefs = 0; + Operation_Browse(server, session, &maxrefs, &bd, &br); + if(br.statusCode != UA_STATUSCODE_GOOD) + return; + + /* Remove every child */ + for(size_t i = 0; i < br.referencesSize; ++i) { + UA_ReferenceDescription *rd = &br.references[i]; + /* Check for self-reference to avoid endless loop */ + if(UA_NodeId_equal(&node->nodeId, &rd->nodeId.nodeId)) + continue; + const UA_Node *child = UA_Nodestore_getNode(server->nsCtx, &rd->nodeId.nodeId); + if(!child) + continue; + /* Only delete child nodes that have no other parent */ + if(!multipleHierarchies(hierarchicalRefsSize, hierarchicalRefs, child)) + recursiveDeleteNode(server, session, hierarchicalRefsSize, + hierarchicalRefs, child, true); + UA_Nodestore_releaseNode(server->nsCtx, child); + } + + UA_BrowseResult_deleteMembers(&br); + + if(removeTargetRefs) + removeIncomingReferences(server, session, node); + + UA_Nodestore_removeNode(server->nsCtx, &node->nodeId); +} + +static void +deleteNodeOperation(UA_Server *server, UA_Session *session, void *context, + const UA_DeleteNodesItem *item, UA_StatusCode *result) { + /* Do not check access for server */ + if(session != &server->adminSession && + server->config.accessControl.allowDeleteNode && + !server->config.accessControl.allowDeleteNode(server, &server->config.accessControl, + &session->sessionId, + session->sessionHandle, item)) { + *result = UA_STATUSCODE_BADUSERACCESSDENIED; + return; + } + + const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &item->nodeId); + if(!node) { + *result = UA_STATUSCODE_BADNODEIDUNKNOWN; + return; + } + + if(UA_Node_hasSubTypeOrInstances(node)) { + UA_LOG_INFO_SESSION(&server->config.logger, session, + "Delete Nodes: Cannot delete a type node " + "with active instances or subtypes"); + UA_Nodestore_releaseNode(server->nsCtx, node); + *result = UA_STATUSCODE_BADINTERNALERROR; + return; + } + + /* TODO: Check if the information model consistency is violated */ + /* TODO: Check if the node is a mandatory child of a parent */ + + /* A node can be referenced with hierarchical references from several + * parents in the information model. (But not in a circular way.) The + * hierarchical references are checked to see if a node can be deleted. + * Getting the type hierarchy can fail in case of low RAM. In that case the + * nodes are always deleted. */ + UA_ExpandedNodeId *hierarchicalRefs = NULL; + size_t hierarchicalRefsSize = 0; + UA_NodeId hr = UA_NODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES); + browseRecursive(server, 1, &hr, 1, &subtypeId, UA_BROWSEDIRECTION_FORWARD, true, + &hierarchicalRefsSize, &hierarchicalRefs); + if(!hierarchicalRefs) { + UA_LOG_WARNING_SESSION(&server->config.logger, session, + "Delete Nodes: Cannot test for hierarchical " + "references. Deleting the node and all child nodes."); + } + recursiveDeconstructNode(server, session, hierarchicalRefsSize, hierarchicalRefs, node); + recursiveDeleteNode(server, session, hierarchicalRefsSize, hierarchicalRefs, node, + item->deleteTargetReferences); + UA_Array_delete(hierarchicalRefs, hierarchicalRefsSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); + + UA_Nodestore_releaseNode(server->nsCtx, node); +} + +void Service_DeleteNodes(UA_Server *server, UA_Session *session, + const UA_DeleteNodesRequest *request, + UA_DeleteNodesResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing DeleteNodesRequest"); + + if(server->config.maxNodesPerNodeManagement != 0 && + request->nodesToDeleteSize > server->config.maxNodesPerNodeManagement) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, + (UA_ServiceOperation)deleteNodeOperation, + NULL, &request->nodesToDeleteSize, + &UA_TYPES[UA_TYPES_DELETENODESITEM], + &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +} + +UA_StatusCode +UA_Server_deleteNode(UA_Server *server, const UA_NodeId nodeId, + UA_Boolean deleteReferences) { + UA_DeleteNodesItem item; + item.deleteTargetReferences = deleteReferences; + item.nodeId = nodeId; + UA_StatusCode retval = UA_STATUSCODE_GOOD; + deleteNodeOperation(server, &server->adminSession, NULL, &item, &retval); + return retval; +} + +/******************/ +/* Add References */ +/******************/ + +static UA_StatusCode +addOneWayReference(UA_Server *server, UA_Session *session, + UA_Node *node, const UA_AddReferencesItem *item) { + return UA_Node_addReference(node, item); +} + +static UA_StatusCode +deleteOneWayReference(UA_Server *server, UA_Session *session, UA_Node *node, + const UA_DeleteReferencesItem *item) { + return UA_Node_deleteReference(node, item); +} + +static void +Operation_addReference(UA_Server *server, UA_Session *session, void *context, + const UA_AddReferencesItem *item, UA_StatusCode *retval) { + /* Do not check access for server */ + if(session != &server->adminSession && server->config.accessControl.allowAddReference && + !server->config.accessControl. + allowAddReference(server, &server->config.accessControl, + &session->sessionId, session->sessionHandle, item)) { + *retval = UA_STATUSCODE_BADUSERACCESSDENIED; + return; + } + + /* Currently no expandednodeids are allowed */ + if(item->targetServerUri.length > 0) { + *retval = UA_STATUSCODE_BADNOTIMPLEMENTED; + return; + } + + /* Add the first direction */ + *retval = UA_Server_editNode(server, session, &item->sourceNodeId, + (UA_EditNodeCallback)addOneWayReference, + /* cast away const because callback uses const anyway */ + (UA_AddReferencesItem *)(uintptr_t)item); + UA_Boolean firstExisted = false; + if(*retval == UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED) { + *retval = UA_STATUSCODE_GOOD; + firstExisted = true; + } else if(*retval != UA_STATUSCODE_GOOD) + return; + + /* Add the second direction */ + UA_AddReferencesItem secondItem; + UA_AddReferencesItem_init(&secondItem); + secondItem.sourceNodeId = item->targetNodeId.nodeId; + secondItem.referenceTypeId = item->referenceTypeId; + secondItem.isForward = !item->isForward; + secondItem.targetNodeId.nodeId = item->sourceNodeId; + /* keep default secondItem.targetNodeClass = UA_NODECLASS_UNSPECIFIED */ + *retval = UA_Server_editNode(server, session, &secondItem.sourceNodeId, + (UA_EditNodeCallback)addOneWayReference, &secondItem); + + /* remove reference if the second direction failed */ + UA_Boolean secondExisted = false; + if(*retval == UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED) { + *retval = UA_STATUSCODE_GOOD; + secondExisted = true; + } else if(*retval != UA_STATUSCODE_GOOD && !firstExisted) { + UA_DeleteReferencesItem deleteItem; + deleteItem.sourceNodeId = item->sourceNodeId; + deleteItem.referenceTypeId = item->referenceTypeId; + deleteItem.isForward = item->isForward; + deleteItem.targetNodeId = item->targetNodeId; + deleteItem.deleteBidirectional = false; + /* ignore returned status code */ + UA_Server_editNode(server, session, &item->sourceNodeId, + (UA_EditNodeCallback)deleteOneWayReference, &deleteItem); + } + + /* Calculate common duplicate reference not allowed result and set bad result + * if BOTH directions already existed */ + if(firstExisted && secondExisted) + *retval = UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED; +} + +void Service_AddReferences(UA_Server *server, UA_Session *session, + const UA_AddReferencesRequest *request, + UA_AddReferencesResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing AddReferencesRequest"); + + if(server->config.maxNodesPerNodeManagement != 0 && + request->referencesToAddSize > server->config.maxNodesPerNodeManagement) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, + (UA_ServiceOperation)Operation_addReference, + NULL, &request->referencesToAddSize, + &UA_TYPES[UA_TYPES_ADDREFERENCESITEM], + &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +} + +UA_StatusCode +UA_Server_addReference(UA_Server *server, const UA_NodeId sourceId, + const UA_NodeId refTypeId, + const UA_ExpandedNodeId targetId, + UA_Boolean isForward) { + UA_AddReferencesItem item; + UA_AddReferencesItem_init(&item); + item.sourceNodeId = sourceId; + item.referenceTypeId = refTypeId; + item.isForward = isForward; + item.targetNodeId = targetId; + + UA_StatusCode retval = UA_STATUSCODE_GOOD; + Operation_addReference(server, &server->adminSession, NULL, &item, &retval); + return retval; +} + +/*********************/ +/* Delete References */ +/*********************/ + +static void +Operation_deleteReference(UA_Server *server, UA_Session *session, void *context, + const UA_DeleteReferencesItem *item, UA_StatusCode *retval) { + /* Do not check access for server */ + if(session != &server->adminSession && + server->config.accessControl.allowDeleteReference && + !server->config.accessControl.allowDeleteReference(server, + &server->config.accessControl, + &session->sessionId, + session->sessionHandle, item)) { + *retval = UA_STATUSCODE_BADUSERACCESSDENIED; + return; + } + + // TODO: Check consistency constraints, remove the references. + *retval = UA_Server_editNode(server, session, &item->sourceNodeId, + (UA_EditNodeCallback)deleteOneWayReference, + /* cast away const qualifier because callback uses it anyway */ + (UA_DeleteReferencesItem *)(uintptr_t)item); + if(*retval != UA_STATUSCODE_GOOD) + return; + + if(!item->deleteBidirectional || item->targetNodeId.serverIndex != 0) + return; + + UA_DeleteReferencesItem secondItem; + UA_DeleteReferencesItem_init(&secondItem); + secondItem.isForward = !item->isForward; + secondItem.sourceNodeId = item->targetNodeId.nodeId; + secondItem.targetNodeId.nodeId = item->sourceNodeId; + secondItem.referenceTypeId = item->referenceTypeId; + *retval = UA_Server_editNode(server, session, &secondItem.sourceNodeId, + (UA_EditNodeCallback)deleteOneWayReference, + &secondItem); +} + +void +Service_DeleteReferences(UA_Server *server, UA_Session *session, + const UA_DeleteReferencesRequest *request, + UA_DeleteReferencesResponse *response) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Processing DeleteReferencesRequest"); + + if(server->config.maxNodesPerNodeManagement != 0 && + request->referencesToDeleteSize > server->config.maxNodesPerNodeManagement) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; + return; + } + + response->responseHeader.serviceResult = + UA_Server_processServiceOperations(server, session, + (UA_ServiceOperation)Operation_deleteReference, + NULL, &request->referencesToDeleteSize, + &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM], + &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +} + +UA_StatusCode +UA_Server_deleteReference(UA_Server *server, const UA_NodeId sourceNodeId, + const UA_NodeId referenceTypeId, UA_Boolean isForward, + const UA_ExpandedNodeId targetNodeId, + UA_Boolean deleteBidirectional) { + UA_DeleteReferencesItem item; + item.sourceNodeId = sourceNodeId; + item.referenceTypeId = referenceTypeId; + item.isForward = isForward; + item.targetNodeId = targetNodeId; + item.deleteBidirectional = deleteBidirectional; + + UA_StatusCode retval = UA_STATUSCODE_GOOD; + Operation_deleteReference(server, &server->adminSession, NULL, &item, &retval); + return retval; +} + +/**********************/ +/* Set Value Callback */ +/**********************/ + +static UA_StatusCode +setValueCallback(UA_Server *server, UA_Session *session, + UA_VariableNode *node, const UA_ValueCallback *callback) { + if(node->nodeClass != UA_NODECLASS_VARIABLE) + return UA_STATUSCODE_BADNODECLASSINVALID; + node->value.data.callback = *callback; + return UA_STATUSCODE_GOOD; +} + +UA_StatusCode +UA_Server_setVariableNode_valueCallback(UA_Server *server, + const UA_NodeId nodeId, + const UA_ValueCallback callback) { + return UA_Server_editNode(server, &server->adminSession, &nodeId, + (UA_EditNodeCallback)setValueCallback, + /* cast away const because callback uses const anyway */ + (UA_ValueCallback *)(uintptr_t) &callback); +} + +/***************************************************/ +/* Special Handling of Variables with Data Sources */ +/***************************************************/ + +UA_StatusCode +UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requestedNewNodeId, + const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId, + const UA_QualifiedName browseName, const UA_NodeId typeDefinition, + const UA_VariableAttributes attr, const UA_DataSource dataSource, + void *nodeContext, UA_NodeId *outNewNodeId) { + UA_AddNodesItem item; + UA_AddNodesItem_init(&item); + item.nodeClass = UA_NODECLASS_VARIABLE; + item.requestedNewNodeId.nodeId = requestedNewNodeId; + item.browseName = browseName; + UA_ExpandedNodeId typeDefinitionId; + UA_ExpandedNodeId_init(&typeDefinitionId); + typeDefinitionId.nodeId = typeDefinition; + item.typeDefinition = typeDefinitionId; + item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; + item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)&attr; + item.nodeAttributes.content.decoded.type = &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]; + UA_NodeId newNodeId; + if(!outNewNodeId) { + newNodeId = UA_NODEID_NULL; + outNewNodeId = &newNodeId; } - connection->state = UA_CONNECTION_ESTABLISHED; + /* Create the node and add it to the nodestore */ + UA_StatusCode retval = AddNode_raw(server, &server->adminSession, nodeContext, + &item, outNewNodeId); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; - /* Build acknowledge response */ - UA_TcpAcknowledgeMessage ackMessage; - ackMessage.protocolVersion = connection->localConf.protocolVersion; - ackMessage.receiveBufferSize = connection->localConf.recvBufferSize; - ackMessage.sendBufferSize = connection->localConf.sendBufferSize; - ackMessage.maxMessageSize = connection->localConf.maxMessageSize; - ackMessage.maxChunkCount = connection->localConf.maxChunkCount; - UA_TcpMessageHeader ackHeader; - ackHeader.messageTypeAndChunkType = UA_MESSAGETYPE_ACK + UA_CHUNKTYPE_FINAL; - ackHeader.messageSize = 8 + 20; /* ackHeader + ackMessage */ + /* Set the data source */ + retval = UA_Server_setVariableNode_dataSource(server, *outNewNodeId, dataSource); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; - /* Get the send buffer from the network layer */ - UA_ByteString ack_msg; - UA_ByteString_init(&ack_msg); - retval = connection->getSendBuffer(connection, connection->localConf.sendBufferSize, - &ack_msg); + /* Typecheck and add references to parent and type definition */ + retval = AddNode_addRefs(server, &server->adminSession, outNewNodeId, &parentNodeId, + &referenceTypeId, &typeDefinition); if(retval != UA_STATUSCODE_GOOD) - return retval; + goto cleanup; - /* Encode and send the response */ - UA_Byte *bufPos = ack_msg.data; - const UA_Byte *bufEnd = &ack_msg.data[ack_msg.length]; + /* Call the constructors */ + retval = AddNode_finish(server, &server->adminSession, outNewNodeId); - retval = UA_TcpMessageHeader_encodeBinary(&ackHeader, &bufPos, &bufEnd); - if(retval != UA_STATUSCODE_GOOD) { - connection->releaseSendBuffer(connection, &ack_msg); - return retval; - } + cleanup: + if(outNewNodeId == &newNodeId) + UA_NodeId_deleteMembers(&newNodeId); - retval = UA_TcpAcknowledgeMessage_encodeBinary(&ackMessage, &bufPos, &bufEnd); - if(retval != UA_STATUSCODE_GOOD) { - connection->releaseSendBuffer(connection, &ack_msg); - return retval; - } - ack_msg.length = ackHeader.messageSize; - return connection->send(connection, &ack_msg); + return retval; } -/* OPN -> Open up/renew the securechannel */ static UA_StatusCode -processOPN(UA_Server *server, UA_SecureChannel *channel, - const UA_UInt32 requestId, const UA_ByteString *msg) { - /* Decode the request */ - size_t offset = 0; - UA_NodeId requestType; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - UA_OpenSecureChannelRequest openSecureChannelRequest; - retval |= UA_NodeId_decodeBinary(msg, &offset, &requestType); - retval |= UA_OpenSecureChannelRequest_decodeBinary(msg, &offset, &openSecureChannelRequest); - - /* Error occurred */ - if(retval != UA_STATUSCODE_GOOD || - requestType.identifier.numeric != UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST].binaryEncodingId) { - UA_NodeId_deleteMembers(&requestType); - UA_OpenSecureChannelRequest_deleteMembers(&openSecureChannelRequest); - UA_LOG_INFO_CHANNEL(server->config.logger, channel, - "Could not decode the OPN message. Closing the connection."); - UA_SecureChannelManager_close(&server->secureChannelManager, channel->securityToken.channelId); - return retval; - } - UA_NodeId_deleteMembers(&requestType); - - /* Call the service */ - UA_OpenSecureChannelResponse openScResponse; - UA_OpenSecureChannelResponse_init(&openScResponse); - Service_OpenSecureChannel(server, channel, &openSecureChannelRequest, &openScResponse); - UA_OpenSecureChannelRequest_deleteMembers(&openSecureChannelRequest); - if(openScResponse.responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_LOG_INFO_CHANNEL(server->config.logger, channel, "Could not open a SecureChannel. " - "Closing the connection."); - UA_SecureChannelManager_close(&server->secureChannelManager, - channel->securityToken.channelId); - return openScResponse.responseHeader.serviceResult; - } +setDataSource(UA_Server *server, UA_Session *session, + UA_VariableNode* node, const UA_DataSource *dataSource) { + if(node->nodeClass != UA_NODECLASS_VARIABLE) + return UA_STATUSCODE_BADNODECLASSINVALID; + if(node->valueSource == UA_VALUESOURCE_DATA) + UA_DataValue_deleteMembers(&node->value.data.value); + node->value.dataSource = *dataSource; + node->valueSource = UA_VALUESOURCE_DATASOURCE; + return UA_STATUSCODE_GOOD; +} - /* Send the response */ - retval = UA_SecureChannel_sendAsymmetricOPNMessage(channel, requestId, &openScResponse, - &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]); - UA_OpenSecureChannelResponse_deleteMembers(&openScResponse); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO_CHANNEL(server->config.logger, channel, - "Could not send the OPN answer with error code %s", - UA_StatusCode_name(retval)); - UA_SecureChannelManager_close(&server->secureChannelManager, - channel->securityToken.channelId); - } - return retval; +UA_StatusCode +UA_Server_setVariableNode_dataSource(UA_Server *server, const UA_NodeId nodeId, + const UA_DataSource dataSource) { + return UA_Server_editNode(server, &server->adminSession, &nodeId, + (UA_EditNodeCallback)setDataSource, + /* casting away const because callback casts it back anyway */ + (UA_DataSource *) (uintptr_t)&dataSource); } -static UA_StatusCode -processMSG(UA_Server *server, UA_SecureChannel *channel, - UA_UInt32 requestId, const UA_ByteString *msg) { - /* At 0, the nodeid starts... */ - size_t offset = 0; +/************************************/ +/* Special Handling of Method Nodes */ +/************************************/ - /* Decode the nodeid */ - UA_NodeId requestTypeId; - UA_StatusCode retval = UA_NodeId_decodeBinary(msg, &offset, &requestTypeId); - if(retval != UA_STATUSCODE_GOOD) - return retval; - if(requestTypeId.namespaceIndex != 0 || - requestTypeId.identifierType != UA_NODEIDTYPE_NUMERIC) - UA_NodeId_deleteMembers(&requestTypeId); /* leads to badserviceunsupported */ +#ifdef UA_ENABLE_METHODCALLS - /* Store the start-position of the request */ - size_t requestPos = offset; +static const UA_NodeId hasproperty = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASPROPERTY}}; +static const UA_NodeId propertytype = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_PROPERTYTYPE}}; - /* Get the service pointers */ - UA_Service service = NULL; - UA_InSituService serviceInsitu = NULL; - const UA_DataType *requestType = NULL; - const UA_DataType *responseType = NULL; - UA_Boolean sessionRequired = true; - UA_ServiceType serviceType = UA_SERVICETYPE_NORMAL; - getServicePointers(requestTypeId.identifier.numeric, &requestType, - &responseType, &service, &serviceInsitu, &sessionRequired, &serviceType); - if(!requestType) { - if(requestTypeId.identifier.numeric == 787) { - UA_LOG_INFO_CHANNEL(server->config.logger, channel, - "Client requested a subscription, " \ - "but those are not enabled in the build"); - } else { - UA_LOG_INFO_CHANNEL(server->config.logger, channel, - "Unknown request with type identifier %i", - requestTypeId.identifier.numeric); - } - return sendServiceFault(channel, msg, requestPos, &UA_TYPES[UA_TYPES_SERVICEFAULT], - requestId, UA_STATUSCODE_BADSERVICEUNSUPPORTED); - } - UA_assert(responseType); +static UA_StatusCode +UA_Server_addMethodNodeEx_finish(UA_Server *server, const UA_NodeId nodeId, UA_MethodCallback method, + const size_t inputArgumentsSize, const UA_Argument *inputArguments, + const UA_NodeId inputArgumentsRequestedNewNodeId, + UA_NodeId *inputArgumentsOutNewNodeId, + const size_t outputArgumentsSize, const UA_Argument *outputArguments, + const UA_NodeId outputArgumentsRequestedNewNodeId, + UA_NodeId *outputArgumentsOutNewNodeId) { + /* Browse to see which argument nodes exist */ + UA_BrowseDescription bd; + UA_BrowseDescription_init(&bd); + bd.nodeId = nodeId; + bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY); + bd.includeSubtypes = false; + bd.browseDirection = UA_BROWSEDIRECTION_FORWARD; + bd.nodeClassMask = UA_NODECLASS_VARIABLE; + bd.resultMask = UA_BROWSERESULTMASK_BROWSENAME; - /* Decode the request */ - UA_STACKARRAY(UA_Byte, request, requestType->memSize); - UA_RequestHeader *requestHeader = (UA_RequestHeader*)request; - retval = UA_decodeBinary(msg, &offset, request, requestType, - server->config.customDataTypesSize, - server->config.customDataTypes); + UA_BrowseResult br; + UA_BrowseResult_init(&br); + UA_UInt32 maxrefs = 0; + Operation_Browse(server, &server->adminSession, &maxrefs, &bd, &br); + + UA_StatusCode retval = br.statusCode; if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_DEBUG_CHANNEL(server->config.logger, channel, - "Could not decode the request"); - return sendServiceFault(channel, msg, requestPos, responseType, requestId, retval); + UA_Server_deleteNode(server, nodeId, true); + UA_BrowseResult_deleteMembers(&br); + return retval; } - /* Prepare the respone */ - UA_STACKARRAY(UA_Byte, responseBuf, responseType->memSize); - void *response = (void*)(uintptr_t)&responseBuf[0]; /* Get around aliasing rules */ - UA_init(response, responseType); - UA_Session *session = NULL; /* must be initialized before goto send_response */ - - /* CreateSession doesn't need a session */ - if(requestType == &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]) { - Service_CreateSession(server, channel, - (const UA_CreateSessionRequest *)request, - (UA_CreateSessionResponse *)response); - #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - // store the authentication token and session ID so we can help fuzzing by setting - // these values in the next request automatically - UA_CreateSessionResponse *res = (UA_CreateSessionResponse *)response; - UA_NodeId_copy(&res->authenticationToken, &unsafe_fuzz_authenticationToken); - #endif - goto send_response; + /* Filter out the argument nodes */ + UA_NodeId inputArgsId = UA_NODEID_NULL; + UA_NodeId outputArgsId = UA_NODEID_NULL; + const UA_QualifiedName inputArgsName = UA_QUALIFIEDNAME(0, "InputArguments"); + const UA_QualifiedName outputArgsName = UA_QUALIFIEDNAME(0, "OutputArguments"); + for(size_t i = 0; i < br.referencesSize; i++) { + UA_ReferenceDescription *rd = &br.references[i]; + if(rd->browseName.namespaceIndex == 0 && + UA_String_equal(&rd->browseName.name, &inputArgsName.name)) + inputArgsId = rd->nodeId.nodeId; + else if(rd->browseName.namespaceIndex == 0 && + UA_String_equal(&rd->browseName.name, &outputArgsName.name)) + outputArgsId = rd->nodeId.nodeId; } - #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - // set the authenticationToken from the create session request to help fuzzing cover more lines - UA_NodeId_deleteMembers(&requestHeader->authenticationToken); - if(!UA_NodeId_isNull(&unsafe_fuzz_authenticationToken)) - UA_NodeId_copy(&unsafe_fuzz_authenticationToken, &requestHeader->authenticationToken); - #endif - - /* Find the matching session */ - session = (UA_Session*)UA_SecureChannel_getSession(channel, &requestHeader->authenticationToken); - if(!session && !UA_NodeId_isNull(&requestHeader->authenticationToken)) - session = UA_SessionManager_getSessionByToken(&server->sessionManager, - &requestHeader->authenticationToken); + /* Add the Input Arguments VariableNode */ + if(inputArgumentsSize > 0 && UA_NodeId_isNull(&inputArgsId)) { + UA_VariableAttributes attr = UA_VariableAttributes_default; + char *name = "InputArguments"; + attr.displayName = UA_LOCALIZEDTEXT("", name); + attr.dataType = UA_TYPES[UA_TYPES_ARGUMENT].typeId; + attr.valueRank = UA_VALUERANK_ONE_DIMENSION; + UA_UInt32 inputArgsSize32 = (UA_UInt32)inputArgumentsSize; + attr.arrayDimensions = &inputArgsSize32; + attr.arrayDimensionsSize = 1; + UA_Variant_setArray(&attr.value, (void *)(uintptr_t)inputArguments, + inputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]); + retval = UA_Server_addVariableNode(server, inputArgumentsRequestedNewNodeId, nodeId, + hasproperty, UA_QUALIFIEDNAME(0, name), + propertytype, attr, NULL, &inputArgsId); + if(retval != UA_STATUSCODE_GOOD) + goto error; + } - if(requestType == &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]) { - if(!session) { - UA_LOG_DEBUG_CHANNEL(server->config.logger, channel, - "Trying to activate a session that is " \ - "not known in the server"); - UA_deleteMembers(request, requestType); - return sendServiceFault(channel, msg, requestPos, responseType, - requestId, UA_STATUSCODE_BADSESSIONIDINVALID); - } - Service_ActivateSession(server, channel, session, - (const UA_ActivateSessionRequest*)request, - (UA_ActivateSessionResponse*)response); - goto send_response; + /* Add the Output Arguments VariableNode */ + if(outputArgumentsSize > 0 && UA_NodeId_isNull(&outputArgsId)) { + UA_VariableAttributes attr = UA_VariableAttributes_default; + char *name = "OutputArguments"; + attr.displayName = UA_LOCALIZEDTEXT("", name); + attr.dataType = UA_TYPES[UA_TYPES_ARGUMENT].typeId; + attr.valueRank = UA_VALUERANK_ONE_DIMENSION; + UA_UInt32 outputArgsSize32 = (UA_UInt32)outputArgumentsSize; + attr.arrayDimensions = &outputArgsSize32; + attr.arrayDimensionsSize = 1; + UA_Variant_setArray(&attr.value, (void *)(uintptr_t)outputArguments, + outputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]); + retval = UA_Server_addVariableNode(server, outputArgumentsRequestedNewNodeId, nodeId, + hasproperty, UA_QUALIFIEDNAME(0, name), + propertytype, attr, NULL, &outputArgsId); + if(retval != UA_STATUSCODE_GOOD) + goto error; } - /* Set an anonymous, inactive session for services that need no session */ - UA_Session anonymousSession; - if(!session) { - if(sessionRequired) { - UA_LOG_WARNING_CHANNEL(server->config.logger, channel, - "Service request %i without a valid session", - requestType->binaryEncodingId); - UA_deleteMembers(request, requestType); - return sendServiceFault(channel, msg, requestPos, responseType, - requestId, UA_STATUSCODE_BADSESSIONIDINVALID); - } + retval = UA_Server_setMethodNode_callback(server, nodeId, method); + if(retval != UA_STATUSCODE_GOOD) + goto error; - UA_Session_init(&anonymousSession); - anonymousSession.sessionId = UA_NODEID_GUID(0, UA_GUID_NULL); - anonymousSession.header.channel = channel; - session = &anonymousSession; - } + /* Call finish to add the parent reference */ + retval = AddNode_finish(server, &server->adminSession, &nodeId); + if(retval != UA_STATUSCODE_GOOD) + goto error; - /* Trying to use a non-activated session? */ - if(sessionRequired && !session->activated) { - UA_LOG_WARNING_SESSION(server->config.logger, session, - "Calling service %i on a non-activated session", - requestType->binaryEncodingId); - UA_SessionManager_removeSession(&server->sessionManager, - &session->header.authenticationToken); - UA_deleteMembers(request, requestType); - return sendServiceFault(channel, msg, requestPos, responseType, - requestId, UA_STATUSCODE_BADSESSIONNOTACTIVATED); + if(inputArgumentsOutNewNodeId != NULL) { + UA_NodeId_copy(&inputArgsId, inputArgumentsOutNewNodeId); } - - /* The session is bound to another channel */ - if(session != &anonymousSession && session->header.channel != channel) { - UA_LOG_WARNING_CHANNEL(server->config.logger, channel, - "Client tries to use a Session that is not " - "bound to this SecureChannel"); - UA_deleteMembers(request, requestType); - return sendServiceFault(channel, msg, requestPos, responseType, - requestId, UA_STATUSCODE_BADSECURECHANNELIDINVALID); + if(outputArgumentsOutNewNodeId != NULL) { + UA_NodeId_copy(&outputArgsId, outputArgumentsOutNewNodeId); } + UA_BrowseResult_deleteMembers(&br); + return retval; - /* Update the session lifetime */ - UA_Session_updateLifetime(session); +error: + UA_Server_deleteNode(server, nodeId, true); + UA_Server_deleteNode(server, inputArgsId, true); + UA_Server_deleteNode(server, outputArgsId, true); + UA_BrowseResult_deleteMembers(&br); -#ifdef UA_ENABLE_SUBSCRIPTIONS - /* The publish request is not answered immediately */ - if(requestType == &UA_TYPES[UA_TYPES_PUBLISHREQUEST]) { - Service_Publish(server, session, - (const UA_PublishRequest*)request, requestId); - UA_deleteMembers(request, requestType); - return UA_STATUSCODE_GOOD; - } -#endif + return retval; +} - send_response: +UA_StatusCode +UA_Server_addMethodNode_finish(UA_Server *server, const UA_NodeId nodeId, + UA_MethodCallback method, + size_t inputArgumentsSize, const UA_Argument* inputArguments, + size_t outputArgumentsSize, const UA_Argument* outputArguments) { + return UA_Server_addMethodNodeEx_finish(server, nodeId, method, + inputArgumentsSize, inputArguments, UA_NODEID_NULL, NULL, + outputArgumentsSize, outputArguments, UA_NODEID_NULL, NULL); +} - /* Prepare the ResponseHeader */ - ((UA_ResponseHeader*)response)->requestHandle = requestHeader->requestHandle; - ((UA_ResponseHeader*)response)->timestamp = UA_DateTime_now(); +UA_StatusCode +UA_Server_addMethodNodeEx(UA_Server *server, const UA_NodeId requestedNewNodeId, + const UA_NodeId parentNodeId, + const UA_NodeId referenceTypeId, + const UA_QualifiedName browseName, + const UA_MethodAttributes attr, UA_MethodCallback method, + size_t inputArgumentsSize, const UA_Argument *inputArguments, + const UA_NodeId inputArgumentsRequestedNewNodeId, + UA_NodeId *inputArgumentsOutNewNodeId, + size_t outputArgumentsSize, const UA_Argument *outputArguments, + const UA_NodeId outputArgumentsRequestedNewNodeId, + UA_NodeId *outputArgumentsOutNewNodeId, + void *nodeContext, UA_NodeId *outNewNodeId) { + UA_AddNodesItem item; + UA_AddNodesItem_init(&item); + item.nodeClass = UA_NODECLASS_METHOD; + item.requestedNewNodeId.nodeId = requestedNewNodeId; + item.browseName = browseName; + item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; + item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)&attr; + item.nodeAttributes.content.decoded.type = &UA_TYPES[UA_TYPES_METHODATTRIBUTES]; - /* Process normal services before initializing the message context. - * Some services may initialize new message contexts and to support network - * layers only providing one send buffer, only one message context can be - * initialized concurrently. */ - if(serviceType == UA_SERVICETYPE_NORMAL) - service(server, session, request, response); + UA_NodeId newId; + if(!outNewNodeId) { + UA_NodeId_init(&newId); + outNewNodeId = &newId; + } - /* Start the message */ - UA_NodeId typeId = UA_NODEID_NUMERIC(0, responseType->binaryEncodingId); - UA_MessageContext mc; - retval = UA_MessageContext_begin(&mc, channel, requestId, UA_MESSAGETYPE_MSG); + UA_StatusCode retval = Operation_addNode_begin(server, &server->adminSession, + nodeContext, &item, &parentNodeId, + &referenceTypeId, outNewNodeId); if(retval != UA_STATUSCODE_GOOD) - goto cleanup; + return retval; - /* Assert's required for clang-analyzer */ - UA_assert(mc.buf_pos == &mc.messageBuffer.data[UA_SECURE_MESSAGE_HEADER_LENGTH]); - UA_assert(mc.buf_end <= &mc.messageBuffer.data[mc.messageBuffer.length]); + retval = UA_Server_addMethodNodeEx_finish(server, *outNewNodeId, method, + inputArgumentsSize, inputArguments, + inputArgumentsRequestedNewNodeId, + inputArgumentsOutNewNodeId, + outputArgumentsSize, outputArguments, + outputArgumentsRequestedNewNodeId, + outputArgumentsOutNewNodeId); - retval = UA_MessageContext_encode(&mc, &typeId, &UA_TYPES[UA_TYPES_NODEID]); - if(retval != UA_STATUSCODE_GOOD) - goto cleanup; + if(outNewNodeId == &newId) + UA_NodeId_deleteMembers(&newId); + return retval; +} - switch(serviceType) { - case UA_SERVICETYPE_CUSTOM: - /* Was processed before...*/ - retval = UA_MessageContext_encode(&mc, response, responseType); - break; - case UA_SERVICETYPE_INSITU: - retval = serviceInsitu - (server, session, &mc, request, (UA_ResponseHeader*)response); - break; - case UA_SERVICETYPE_NORMAL: - default: - retval = UA_MessageContext_encode(&mc, response, responseType); - break; - } +static UA_StatusCode +editMethodCallback(UA_Server *server, UA_Session* session, + UA_Node* node, void* handle) { + if(node->nodeClass != UA_NODECLASS_METHOD) + return UA_STATUSCODE_BADNODECLASSINVALID; + UA_MethodNode *mnode = (UA_MethodNode*) node; + mnode->method = (UA_MethodCallback)(uintptr_t)handle; + return UA_STATUSCODE_GOOD; +} - /* Finish sending the message */ - if(retval != UA_STATUSCODE_GOOD) { - UA_MessageContext_abort(&mc); - goto cleanup; - } +UA_StatusCode +UA_Server_setMethodNode_callback(UA_Server *server, + const UA_NodeId methodNodeId, + UA_MethodCallback methodCallback) { + return UA_Server_editNode(server, &server->adminSession, &methodNodeId, + (UA_EditNodeCallback)editMethodCallback, + (void*)(uintptr_t)methodCallback); +} - retval = UA_MessageContext_finish(&mc); +#endif - cleanup: - if(retval != UA_STATUSCODE_GOOD) - UA_LOG_INFO_CHANNEL(server->config.logger, channel, - "Could not send the message over the SecureChannel " - "with StatusCode %s", UA_StatusCode_name(retval)); - /* Clean up */ - UA_deleteMembers(request, requestType); - UA_deleteMembers(response, responseType); - return retval; -} +/************************/ +/* Lifecycle Management */ +/************************/ -/* Takes decoded messages starting at the nodeid of the content type. */ static UA_StatusCode -processSecureChannelMessage(void *application, UA_SecureChannel *channel, - UA_MessageType messagetype, UA_UInt32 requestId, - const UA_ByteString *message) { - UA_Server *server = (UA_Server*)application; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - switch(messagetype) { - case UA_MESSAGETYPE_OPN: - UA_LOG_TRACE_CHANNEL(server->config.logger, channel, - "Process an OPN on an open channel"); - retval = processOPN(server, channel, requestId, message); - break; - case UA_MESSAGETYPE_MSG: - UA_LOG_TRACE_CHANNEL(server->config.logger, channel, "Process a MSG"); - retval = processMSG(server, channel, requestId, message); - break; - case UA_MESSAGETYPE_CLO: - UA_LOG_TRACE_CHANNEL(server->config.logger, channel, "Process a CLO"); - Service_CloseSecureChannel(server, channel); - break; - default: - UA_LOG_TRACE_CHANNEL(server->config.logger, channel, "Invalid message type"); - retval = UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; - break; +setNodeTypeLifecycle(UA_Server *server, UA_Session *session, + UA_Node* node, UA_NodeTypeLifecycle *lifecycle) { + if(node->nodeClass == UA_NODECLASS_OBJECTTYPE) { + UA_ObjectTypeNode *ot = (UA_ObjectTypeNode*)node; + ot->lifecycle = *lifecycle; + return UA_STATUSCODE_GOOD; } - return retval; + + if(node->nodeClass == UA_NODECLASS_VARIABLETYPE) { + UA_VariableTypeNode *vt = (UA_VariableTypeNode*)node; + vt->lifecycle = *lifecycle; + return UA_STATUSCODE_GOOD; + } + + return UA_STATUSCODE_BADNODECLASSINVALID; } -static UA_StatusCode -createSecureChannel(void *application, UA_Connection *connection, - UA_AsymmetricAlgorithmSecurityHeader *asymHeader) { - UA_Server *server = (UA_Server*)application; +UA_StatusCode +UA_Server_setNodeTypeLifecycle(UA_Server *server, UA_NodeId nodeId, + UA_NodeTypeLifecycle lifecycle) { + return UA_Server_editNode(server, &server->adminSession, &nodeId, + (UA_EditNodeCallback)setNodeTypeLifecycle, + &lifecycle); +} - /* Iterate over available endpoints and choose the correct one */ - UA_Endpoint *endpoint = NULL; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - for(size_t i = 0; i < server->config.endpointsSize; ++i) { - UA_Endpoint *endpointCandidate = &server->config.endpoints[i]; - if(!UA_ByteString_equal(&asymHeader->securityPolicyUri, - &endpointCandidate->securityPolicy.policyUri)) - continue; - retval = endpointCandidate->securityPolicy.asymmetricModule. - compareCertificateThumbprint(&endpointCandidate->securityPolicy, - &asymHeader->receiverCertificateThumbprint); - if(retval != UA_STATUSCODE_GOOD) - continue; +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_services_discovery_multicast.c" ***********************************/ - /* We found the correct endpoint (except for security mode) The endpoint - * needs to be changed by the client / server to match the security - * mode. The server does this in the securechannel manager */ - endpoint = endpointCandidate; - break; - } +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA + */ - if(!endpoint) - return UA_STATUSCODE_BADSECURITYPOLICYREJECTED; - /* Create a new channel */ - return UA_SecureChannelManager_create(&server->secureChannelManager, connection, - &endpoint->securityPolicy, asymHeader); -} +#if defined(UA_ENABLE_DISCOVERY) && defined(UA_ENABLE_DISCOVERY_MULTICAST) -static UA_StatusCode -processCompleteChunkWithoutChannel(UA_Server *server, UA_Connection *connection, - UA_ByteString *message) { - /* Process chunk without a channel; must be OPN */ - UA_LOG_TRACE(server->config.logger, UA_LOGCATEGORY_NETWORK, - "Connection %i | No channel attached to the connection. " - "Process the chunk directly", connection->sockfd); - size_t offset = 0; - UA_TcpMessageHeader tcpMessageHeader; - UA_StatusCode retval = - UA_TcpMessageHeader_decodeBinary(message, &offset, &tcpMessageHeader); - if(retval != UA_STATUSCODE_GOOD) - return retval; +#ifdef UA_ENABLE_MULTITHREADING - // Only HEL and OPN messages possible without a channel (on the server side) - switch(tcpMessageHeader.messageTypeAndChunkType & 0x00ffffff) { - case UA_MESSAGETYPE_HEL: - retval = processHEL(server, connection, message, &offset); - break; - case UA_MESSAGETYPE_OPN: - { - UA_LOG_TRACE(server->config.logger, UA_LOGCATEGORY_NETWORK, - "Connection %i | Process OPN message", connection->sockfd); +static void * +multicastWorkerLoop(UA_Server *server) { + struct timeval next_sleep = {.tv_sec = 0, .tv_usec = 0}; + volatile UA_Boolean *running = &server->discoveryManager.mdnsRunning; + fd_set fds; - /* Called before HEL */ - if(connection->state != UA_CONNECTION_ESTABLISHED) { - retval = UA_STATUSCODE_BADCOMMUNICATIONERROR; - break; - } + while(*running) { + FD_ZERO(&fds); + UA_fd_set(server->discoveryManager.mdnsSocket, &fds); + select(server->discoveryManager.mdnsSocket + 1, &fds, 0, 0, &next_sleep); - // Decode the asymmetric algorithm security header since it is not encrypted and - // needed to decide what security policy to use. - UA_AsymmetricAlgorithmSecurityHeader asymHeader; - UA_AsymmetricAlgorithmSecurityHeader_init(&asymHeader); - size_t messageHeaderOffset = UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH; - retval = UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(message, - &messageHeaderOffset, - &asymHeader); - if(retval != UA_STATUSCODE_GOOD) + if(!*running) break; - retval = createSecureChannel(server, connection, &asymHeader); - UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymHeader); - if(retval != UA_STATUSCODE_GOOD) + unsigned short retVal = + mdnsd_step(server->discoveryManager.mdnsDaemon, server->discoveryManager.mdnsSocket, + FD_ISSET(server->discoveryManager.mdnsSocket, &fds), true, &next_sleep); + if(retVal == 1) { + UA_LOG_SOCKET_ERRNO_WRAP( + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Multicast error: Can not read from socket. %s", errno_str)); break; - - retval = UA_SecureChannel_processChunk(connection->channel, message, - processSecureChannelMessage, - server, UA_FALSE); - if(retval != UA_STATUSCODE_GOOD) + } else if (retVal == 2) { + UA_LOG_SOCKET_ERRNO_WRAP( + UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Multicast error: Can not write to socket. %s", errno_str)); break; - break; - } - default: - UA_LOG_TRACE(server->config.logger, UA_LOGCATEGORY_NETWORK, - "Connection %i | Expected OPN or HEL message on a connection " - "without a SecureChannel", connection->sockfd); - retval = UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; - break; + } } - return retval; + return NULL; } static UA_StatusCode -processCompleteChunk(void *const application, - UA_Connection *const connection, - UA_ByteString *const chunk) { - UA_Server *const server = (UA_Server*)application; -#ifdef UA_DEBUG_DUMP_PKGS_FILE - UA_debug_dumpCompleteChunk(server, connection, chunk); -#endif - if(!connection->channel) - return processCompleteChunkWithoutChannel(server, connection, chunk); - return UA_SecureChannel_processChunk(connection->channel, chunk, - processSecureChannelMessage, - server, UA_FALSE); +multicastListenStart(UA_Server* server) { + int err = pthread_create(&server->discoveryManager.mdnsThread, NULL, + (void* (*)(void*))multicastWorkerLoop, server); + if(err != 0) { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Multicast error: Can not create multicast thread."); + return UA_STATUSCODE_BADUNEXPECTEDERROR; + } + return UA_STATUSCODE_GOOD; } - -static void -processBinaryMessage(UA_Server *server, UA_Connection *connection, - UA_ByteString *message) { - UA_LOG_TRACE(server->config.logger, UA_LOGCATEGORY_NETWORK, - "Connection %i | Received a packet.", connection->sockfd); -#ifdef UA_DEBUG_DUMP_PKGS - UA_dump_hex_pkg(message->data, message->length); -#endif - - UA_StatusCode retval = UA_Connection_processChunks(connection, server, - processCompleteChunk, message); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_NETWORK, - "Connection %i | Processing the message failed with " - "error %s", connection->sockfd, UA_StatusCode_name(retval)); - /* Send an ERR message and close the connection */ - UA_TcpErrorMessage error; - error.error = retval; - error.reason = UA_STRING_NULL; - UA_Connection_sendError(connection, &error); - connection->close(connection); + +static UA_StatusCode +multicastListenStop(UA_Server* server) { + mdnsd_shutdown(server->discoveryManager.mdnsDaemon); + // wake up select + if (write(server->discoveryManager.mdnsSocket, "\0", 1)) { + // TODO: if makes no sense here? + } // TODO: move to arch? + if (pthread_join(server->discoveryManager.mdnsThread, NULL)) { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, "Multicast error: Can not stop thread."); + return UA_STATUSCODE_BADUNEXPECTEDERROR; } + return UA_STATUSCODE_BADNOTIMPLEMENTED; } -#ifndef UA_ENABLE_MULTITHREADING +# endif /* UA_ENABLE_MULTITHREADING */ -void -UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection, - UA_ByteString *message) { - processBinaryMessage(server, connection, message); +static UA_StatusCode +addMdnsRecordForNetworkLayer(UA_Server *server, const UA_String *appName, + const UA_ServerNetworkLayer* nl) { + UA_String hostname = UA_STRING_NULL; + UA_UInt16 port = 4840; + UA_String path = UA_STRING_NULL; + UA_StatusCode retval = UA_parseEndpointUrl(&nl->discoveryUrl, &hostname, + &port, &path); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_NETWORK, + "Server url is invalid: %.*s", + (int)nl->discoveryUrl.length, nl->discoveryUrl.data); + return retval; + } + + retval = UA_Discovery_addRecord(server, appName, &hostname, port, + &path, UA_DISCOVERY_TCP, true, + server->config.discovery.mdns.serverCapabilities, + server->config.discovery.mdns.serverCapabilitiesSize); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_NETWORK, + "Cannot add mDNS Record: %s", + UA_StatusCode_name(retval)); + return retval; + } + return UA_STATUSCODE_GOOD; } -#else +void startMulticastDiscoveryServer(UA_Server *server) { + UA_String *appName = &server->config.discovery.mdns.mdnsServerName; + for(size_t i = 0; i < server->config.networkLayersSize; i++) + addMdnsRecordForNetworkLayer(server, appName, &server->config.networkLayers[i]); -typedef struct { - UA_Connection *connection; - UA_ByteString message; -} ConnectionMessage; + /* find any other server on the net */ + UA_Discovery_multicastQuery(server); -static void -workerProcessBinaryMessage(UA_Server *server, ConnectionMessage *cm) { - processBinaryMessage(server, cm->connection, &cm->message); - UA_free(cm); +# ifdef UA_ENABLE_MULTITHREADING + multicastListenStart(server); +# endif } void -UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection, - UA_ByteString *message) { - /* Allocate the memory for the callback data */ - ConnectionMessage *cm = (ConnectionMessage*)UA_malloc(sizeof(ConnectionMessage)); - - /* If malloc failed, execute immediately */ - if(!cm) { - processBinaryMessage(server, connection, message); +stopMulticastDiscoveryServer(UA_Server *server) { + if (!server->discoveryManager.mdnsDaemon) return; - } - /* Dispatch to the workers */ - cm->connection = connection; - cm->message = *message; - UA_Server_workerCallback(server, (UA_ServerCallback)workerProcessBinaryMessage, cm); -} + char hostname[256]; + if(UA_gethostname(hostname, 255) == 0) { + UA_String hnString = UA_STRING(hostname); + UA_Discovery_removeRecord(server, &server->config.discovery.mdns.mdnsServerName, + &hnString, 4840, true); + } else { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Could not get hostname for multicast discovery."); + } -static void -deleteConnectionTrampoline(UA_Server *server, void *data) { - UA_Connection *connection = (UA_Connection*)data; - connection->free(connection); +# ifdef UA_ENABLE_MULTITHREADING + multicastListenStop(server); +# else + // send out last package with TTL = 0 + iterateMulticastDiscoveryServer(server, NULL, false); +# endif } -#endif -void -UA_Server_removeConnection(UA_Server *server, UA_Connection *connection) { - UA_Connection_detachSecureChannel(connection); -#ifndef UA_ENABLE_MULTITHREADING - connection->free(connection); -#else - UA_Server_delayedCallback(server, deleteConnectionTrampoline, connection); -#endif +/* All filter criteria must be fulfilled */ +static UA_Boolean +filterServerRecord(size_t serverCapabilityFilterSize, UA_String *serverCapabilityFilter, + serverOnNetwork_list_entry* current) { + for(size_t i = 0; i < serverCapabilityFilterSize; i++) { + for(size_t j = 0; j < current->serverOnNetwork.serverCapabilitiesSize; j++) + if(!UA_String_equal(&serverCapabilityFilter[i], + ¤t->serverOnNetwork.serverCapabilities[j])) + return false; + } + return true; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_server_utils.c" ***********************************/ - -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2016 (c) Lorenz Haas - * Copyright 2017 (c) frax2222 - * Copyright 2017 (c) Florian Palm - * Copyright 2017-2018 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) Julian Grothoff - */ - - -#define UA_MAX_TREE_RECURSE 50 /* How deep up/down the tree do we recurse at most? */ - -/**********************/ -/* Parse NumericRange */ -/**********************/ - -static size_t -readDimension(UA_Byte *buf, size_t buflen, UA_NumericRangeDimension *dim) { - size_t progress = UA_readNumber(buf, buflen, &dim->min); - if(progress == 0) - return 0; - if(buflen <= progress + 1 || buf[progress] != ':') { - dim->max = dim->min; - return progress; +void Service_FindServersOnNetwork(UA_Server *server, UA_Session *session, + const UA_FindServersOnNetworkRequest *request, + UA_FindServersOnNetworkResponse *response) { + if (!server->config.discovery.mdnsEnable) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTIMPLEMENTED; + return; } - ++progress; - size_t progress2 = UA_readNumber(&buf[progress], buflen - progress, &dim->max); - if(progress2 == 0) - return 0; - - /* invalid range */ - if(dim->min >= dim->max) - return 0; - - return progress + progress2; -} + /* Set LastCounterResetTime */ + UA_DateTime_copy(&server->discoveryManager.serverOnNetworkRecordIdLastReset, + &response->lastCounterResetTime); -UA_StatusCode -UA_NumericRange_parseFromString(UA_NumericRange *range, const UA_String *str) { - size_t idx = 0; - size_t dimensionsMax = 0; - UA_NumericRangeDimension *dimensions = NULL; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - size_t offset = 0; - while(true) { - /* alloc dimensions */ - if(idx >= dimensionsMax) { - UA_NumericRangeDimension *newds; - size_t newdssize = sizeof(UA_NumericRangeDimension) * (dimensionsMax + 2); - newds = (UA_NumericRangeDimension*)UA_realloc(dimensions, newdssize); - if(!newds) { - retval = UA_STATUSCODE_BADOUTOFMEMORY; - break; - } - dimensions = newds; - dimensionsMax = dimensionsMax + 2; - } + /* Compute the max number of records to return */ + UA_UInt32 recordCount = 0; + if(request->startingRecordId < server->discoveryManager.serverOnNetworkRecordIdCounter) + recordCount = server->discoveryManager.serverOnNetworkRecordIdCounter - + request->startingRecordId; + if(request->maxRecordsToReturn && recordCount > request->maxRecordsToReturn) + recordCount = UA_MIN(recordCount, request->maxRecordsToReturn); + if(recordCount == 0) { + response->serversSize = 0; + return; + } - /* read the dimension */ - size_t progress = readDimension(&str->data[offset], str->length - offset, - &dimensions[idx]); - if(progress == 0) { - retval = UA_STATUSCODE_BADINDEXRANGEINVALID; + /* Iterate over all records and add to filtered list */ + UA_UInt32 filteredCount = 0; + UA_STACKARRAY(UA_ServerOnNetwork*, filtered, recordCount); + serverOnNetwork_list_entry* current; + LIST_FOREACH(current, &server->discoveryManager.serverOnNetwork, pointers) { + if(filteredCount >= recordCount) break; - } - offset += progress; - ++idx; + if(current->serverOnNetwork.recordId < request->startingRecordId) + continue; + if(!filterServerRecord(request->serverCapabilityFilterSize, + request->serverCapabilityFilter, current)) + continue; + filtered[filteredCount++] = ¤t->serverOnNetwork; + } - /* loop into the next dimension */ - if(offset >= str->length) - break; + if(filteredCount == 0) + return; - if(str->data[offset] != ',') { - retval = UA_STATUSCODE_BADINDEXRANGEINVALID; - break; - } - ++offset; + /* Allocate the array for the response */ + response->servers = + (UA_ServerOnNetwork*)UA_malloc(sizeof(UA_ServerOnNetwork)*filteredCount); + if(!response->servers) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + return; } + response->serversSize = filteredCount; - if(retval == UA_STATUSCODE_GOOD && idx > 0) { - range->dimensions = dimensions; - range->dimensionsSize = idx; - } else - UA_free(dimensions); - - return retval; + /* Copy the server names */ + for(size_t i = 0; i < filteredCount; i++) + UA_ServerOnNetwork_copy(filtered[i], &response->servers[filteredCount-i-1]); } -/********************************/ -/* Information Model Operations */ -/********************************/ - -/* Keeps track of already visited nodes to detect circular references */ -struct ref_history { - struct ref_history *parent; /* the previous element */ - const UA_NodeId *id; /* the id of the node at this depth */ - UA_UInt16 depth; -}; +void +UA_Server_updateMdnsForDiscoveryUrl(UA_Server *server, const UA_String *serverName, + const UA_MdnsDiscoveryConfiguration *mdnsConfig, + const UA_String *discoveryUrl, + UA_Boolean isOnline, UA_Boolean updateTxt) { + UA_String hostname = UA_STRING_NULL; + UA_UInt16 port = 4840; + UA_String path = UA_STRING_NULL; + UA_StatusCode retval = UA_parseEndpointUrl(discoveryUrl, &hostname, &port, &path); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_NETWORK, + "Server url invalid: %.*s", + (int)discoveryUrl->length, discoveryUrl->data); + return; + } -static UA_Boolean -isNodeInTreeNoCircular(UA_Nodestore *ns, const UA_NodeId *leafNode, const UA_NodeId *nodeToFind, - struct ref_history *visitedRefs, const UA_NodeId *referenceTypeIds, - size_t referenceTypeIdsSize) { - if(UA_NodeId_equal(nodeToFind, leafNode)) - return true; + if(!isOnline) { + UA_StatusCode removeRetval = + UA_Discovery_removeRecord(server, serverName, &hostname, + port, updateTxt); + if(removeRetval != UA_STATUSCODE_GOOD) + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Could not remove mDNS record for hostname %.*s.", + (int)serverName->length, serverName->data); + return; + } - if(visitedRefs->depth >= UA_MAX_TREE_RECURSE) - return false; + UA_String *capabilities = NULL; + size_t capabilitiesSize = 0; + if(mdnsConfig) { + capabilities = mdnsConfig->serverCapabilities; + capabilitiesSize = mdnsConfig->serverCapabilitiesSize; + } - const UA_Node *node = ns->getNode(ns->context, leafNode); - if(!node) - return false; + UA_StatusCode addRetval = + UA_Discovery_addRecord(server, serverName, &hostname, + port, &path, UA_DISCOVERY_TCP, updateTxt, + capabilities, capabilitiesSize); + if(addRetval != UA_STATUSCODE_GOOD) + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Could not add mDNS record for hostname %.*s.", + (int)serverName->length, serverName->data); +} - for(size_t i = 0; i < node->referencesSize; ++i) { - UA_NodeReferenceKind *refs = &node->references[i]; - /* Search upwards in the tree */ - if(!refs->isInverse) - continue; +void +UA_Server_setServerOnNetworkCallback(UA_Server *server, + UA_Server_serverOnNetworkCallback cb, + void* data) { + server->discoveryManager.serverOnNetworkCallback = cb; + server->discoveryManager.serverOnNetworkCallbackData = data; +} - /* Consider only the indicated reference types */ - UA_Boolean match = false; - for(size_t j = 0; j < referenceTypeIdsSize; ++j) { - if(UA_NodeId_equal(&refs->referenceTypeId, &referenceTypeIds[j])) { - match = true; - break; - } - } - if(!match) - continue; +static void +UA_Discovery_multicastConflict(char *name, int type, void *arg) { + // cppcheck-suppress unreadVariable + UA_Server *server = (UA_Server*) arg; + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Multicast DNS name conflict detected: " + "'%s' for type %d", name, type); +} - /* Match the targets or recurse */ - for(size_t j = 0; j < refs->targetIdsSize; ++j) { - /* Check if we already have seen the referenced node and skip to - * avoid endless recursion. Do this only at every 5th depth to save - * effort. Circular dependencies are rare and forbidden for most - * reference types. */ - if(visitedRefs->depth % 5 == 4) { - struct ref_history *last = visitedRefs; - UA_Boolean skip = UA_FALSE; - while(!skip && last) { - if(UA_NodeId_equal(last->id, &refs->targetIds[j].nodeId)) - skip = UA_TRUE; - last = last->parent; - } - if(skip) - continue; - } +/* Create a service domain with the format [servername]-[hostname]._opcua-tcp._tcp.local. */ +static void +createFullServiceDomain(char *outServiceDomain, size_t maxLen, + const UA_String *servername, const UA_String *hostname) { + size_t hostnameLen = hostname->length; + size_t servernameLen = servername->length; - /* Stack-allocate the visitedRefs structure for the next depth */ - struct ref_history nextVisitedRefs = {visitedRefs, &refs->targetIds[j].nodeId, - (UA_UInt16)(visitedRefs->depth+1)}; + maxLen -= 24; /* the length we have remaining before the opc ua postfix and + * the trailing zero */ - /* Recurse */ - UA_Boolean foundRecursive = - isNodeInTreeNoCircular(ns, &refs->targetIds[j].nodeId, nodeToFind, &nextVisitedRefs, - referenceTypeIds, referenceTypeIdsSize); - if(foundRecursive) { - ns->releaseNode(ns->context, node); - return true; - } + /* Can we use hostname and servername with full length? */ + if(hostnameLen + servernameLen + 1 > maxLen) { + if(servernameLen + 2 > maxLen) { + servernameLen = maxLen; + hostnameLen = 0; + } else { + hostnameLen = maxLen - servernameLen - 1; } } - ns->releaseNode(ns->context, node); - return false; -} - -UA_Boolean -isNodeInTree(UA_Nodestore *ns, const UA_NodeId *leafNode, const UA_NodeId *nodeToFind, - const UA_NodeId *referenceTypeIds, size_t referenceTypeIdsSize) { - struct ref_history visitedRefs = {NULL, leafNode, 0}; - return isNodeInTreeNoCircular(ns, leafNode, nodeToFind, &visitedRefs, referenceTypeIds, referenceTypeIdsSize); -} - -const UA_Node * -getNodeType(UA_Server *server, const UA_Node *node) { - /* The reference to the parent is different for variable and variabletype */ - UA_NodeId parentRef; - UA_Boolean inverse; - UA_NodeClass typeNodeClass; - switch(node->nodeClass) { - case UA_NODECLASS_OBJECT: - parentRef = UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION); - inverse = false; - typeNodeClass = UA_NODECLASS_OBJECTTYPE; - break; - case UA_NODECLASS_VARIABLE: - parentRef = UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION); - inverse = false; - typeNodeClass = UA_NODECLASS_VARIABLETYPE; - break; - case UA_NODECLASS_OBJECTTYPE: - case UA_NODECLASS_VARIABLETYPE: - case UA_NODECLASS_REFERENCETYPE: - case UA_NODECLASS_DATATYPE: - parentRef = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE); - inverse = true; - typeNodeClass = node->nodeClass; - break; - default: - return NULL; + size_t offset = 0; + if (hostnameLen > 0) { + UA_snprintf(outServiceDomain, maxLen + 1, "%.*s-%.*s", + (int) servernameLen, (char *) servername->data, + (int) hostnameLen, (char *) hostname->data); + offset = servernameLen + hostnameLen + 1; } - - /* Return the first matching candidate */ - for(size_t i = 0; i < node->referencesSize; ++i) { - if(node->references[i].isInverse != inverse) - continue; - if(!UA_NodeId_equal(&node->references[i].referenceTypeId, &parentRef)) - continue; - UA_assert(node->references[i].targetIdsSize > 0); - const UA_NodeId *targetId = &node->references[i].targetIds[0].nodeId; - const UA_Node *type = UA_Nodestore_get(server, targetId); - if(!type) - continue; - if(type->nodeClass == typeNodeClass) - return type; - UA_Nodestore_release(server, type); + else { + UA_snprintf(outServiceDomain, maxLen + 1, "%.*s", + (int) servernameLen, (char *) servername->data); + offset = servernameLen; } - - return NULL; + UA_snprintf(&outServiceDomain[offset], 24, "._opcua-tcp._tcp.local."); } -UA_Boolean -UA_Node_hasSubTypeOrInstances(const UA_Node *node) { - const UA_NodeId hasSubType = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE); - const UA_NodeId hasTypeDefinition = UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION); - for(size_t i = 0; i < node->referencesSize; ++i) { - if(node->references[i].isInverse == false && - UA_NodeId_equal(&node->references[i].referenceTypeId, &hasSubType)) - return true; - if(node->references[i].isInverse == true && - UA_NodeId_equal(&node->references[i].referenceTypeId, &hasTypeDefinition)) +/* Check if mDNS already has an entry for given hostname and port combination */ +static UA_Boolean +UA_Discovery_recordExists(UA_Server* server, const char* fullServiceDomain, + unsigned short port, const UA_DiscoveryProtocol protocol) { + // [servername]-[hostname]._opcua-tcp._tcp.local. 86400 IN SRV 0 5 port [hostname]. + mdns_record_t *r = mdnsd_get_published(server->discoveryManager.mdnsDaemon, fullServiceDomain); + while(r) { + const mdns_answer_t *data = mdnsd_record_data(r); + if(data->type == QTYPE_SRV && (port == 0 || data->srv.port == port)) return true; + r = mdnsd_record_next(r); } return false; } -static const UA_NodeId hasSubtypeNodeId = - {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASSUBTYPE}}; +static int +discovery_multicastQueryAnswer(mdns_answer_t *a, void *arg) { + UA_Server *server = (UA_Server*) arg; + if(a->type != QTYPE_PTR) + return 0; + + if(a->rdname == NULL) + return 0; -static UA_StatusCode -getTypeHierarchyFromNode(UA_NodeId **results_ptr, size_t *results_count, - size_t *results_size, const UA_Node *node) { - UA_NodeId *results = *results_ptr; - for(size_t i = 0; i < node->referencesSize; ++i) { - /* Is the reference kind relevant? */ - UA_NodeReferenceKind *refs = &node->references[i]; - if(!refs->isInverse) - continue; - if(!UA_NodeId_equal(&hasSubtypeNodeId, &refs->referenceTypeId)) - continue; + /* Skip, if we already know about this server */ + UA_Boolean exists = + UA_Discovery_recordExists(server, a->rdname, 0, UA_DISCOVERY_TCP); + if(exists == true) + return 0; - /* Append all targets of the reference kind .. if not a duplicate */ - for(size_t j = 0; j < refs->targetIdsSize; ++j) { - /* Is the target a duplicate? (multi-inheritance) */ - UA_NodeId *targetId = &refs->targetIds[j].nodeId; - UA_Boolean duplicate = false; - for(size_t k = 0; k < *results_count; ++k) { - if(UA_NodeId_equal(targetId, &results[k])) { - duplicate = true; - break; - } - } - if(duplicate) - continue; + if(mdnsd_has_query(server->discoveryManager.mdnsDaemon, a->rdname)) + return 0; - /* Increase array length if necessary */ - if(*results_count >= *results_size) { - size_t new_size = sizeof(UA_NodeId) * (*results_size) * 2; - UA_NodeId *new_results = (UA_NodeId*)UA_realloc(results, new_size); - if(!new_results) { - UA_Array_delete(results, *results_count, &UA_TYPES[UA_TYPES_NODEID]); - return UA_STATUSCODE_BADOUTOFMEMORY; - } - results = new_results; - *results_ptr = results; - *results_size *= 2; - } + UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, + "mDNS send query for: %s SRV&TXT %s", a->name, a->rdname); - /* Copy new nodeid to the end of the list */ - UA_StatusCode retval = UA_NodeId_copy(targetId, &results[*results_count]); - if(retval != UA_STATUSCODE_GOOD) { - UA_Array_delete(results, *results_count, &UA_TYPES[UA_TYPES_NODEID]); - return retval; - } - *results_count += 1; - } - } + mdnsd_query(server->discoveryManager.mdnsDaemon, a->rdname, QTYPE_SRV, + discovery_multicastQueryAnswer, server); + mdnsd_query(server->discoveryManager.mdnsDaemon, a->rdname, QTYPE_TXT, + discovery_multicastQueryAnswer, server); + return 0; +} + +UA_StatusCode +UA_Discovery_multicastQuery(UA_Server* server) { + mdnsd_query(server->discoveryManager.mdnsDaemon, "_opcua-tcp._tcp.local.", + QTYPE_PTR,discovery_multicastQueryAnswer, server); return UA_STATUSCODE_GOOD; } UA_StatusCode -getTypeHierarchy(UA_Nodestore *ns, const UA_NodeId *leafType, - UA_NodeId **typeHierarchy, size_t *typeHierarchySize) { - /* Allocate the results array. Probably too big, but saves mallocs. */ - size_t results_size = 20; - UA_NodeId *results = (UA_NodeId*)UA_malloc(sizeof(UA_NodeId) * results_size); - if(!results) - return UA_STATUSCODE_BADOUTOFMEMORY; +UA_Discovery_addRecord(UA_Server *server, const UA_String *servername, + const UA_String *hostname, UA_UInt16 port, + const UA_String *path, const UA_DiscoveryProtocol protocol, + UA_Boolean createTxt, const UA_String* capabilites, + const size_t capabilitiesSize) { + // we assume that the hostname is not an IP address, but a valid domain name + // It is required by the OPC UA spec (see Part 12, DiscoveryURL to DNS SRV mapping) + // to always use the hostname instead of the IP address - /* The leaf is the first element */ - size_t results_count = 1; - UA_StatusCode retval = UA_NodeId_copy(leafType, &results[0]); - if(retval != UA_STATUSCODE_GOOD) { - UA_free(results); - return retval; - } + if(capabilitiesSize > 0 && !capabilites) + return UA_STATUSCODE_BADINVALIDARGUMENT; - /* Loop over the array members .. and add new elements to the end */ - for(size_t idx = 0; idx < results_count; ++idx) { - /* Get the node */ - const UA_Node *node = ns->getNode(ns->context, &results[idx]); + size_t hostnameLen = hostname->length; + size_t servernameLen = servername->length; + if(hostnameLen == 0 || servernameLen == 0) + return UA_STATUSCODE_BADOUTOFRANGE; - /* Invalid node, remove from the array */ - if(!node) { - for(size_t i = idx; i < results_count-1; ++i) - results[i] = results[i+1]; - results_count--; - continue; - } + // use a limit for the hostname length to make sure full string fits into 63 + // chars (limited by DNS spec) + if(hostnameLen+servernameLen + 1 > 63) { // include dash between servername-hostname + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Multicast DNS: Combination of hostname+servername exceeds " + "maximum of 62 chars. It will be truncated."); + } else if(hostnameLen > 63) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Multicast DNS: Hostname length exceeds maximum of 63 chars. " + "It will be truncated."); + } + + if(!server->discoveryManager.mdnsMainSrvAdded) { + mdns_record_t *r = + mdnsd_shared(server->discoveryManager.mdnsDaemon, "_services._dns-sd._udp.local.", + QTYPE_PTR, 600); + mdnsd_set_host(server->discoveryManager.mdnsDaemon, r, "_opcua-tcp._tcp.local."); + server->discoveryManager.mdnsMainSrvAdded = true; + } - /* Add references from the current node to the end of the array */ - retval = getTypeHierarchyFromNode(&results, &results_count, - &results_size, node); + // [servername]-[hostname]._opcua-tcp._tcp.local. + char fullServiceDomain[63+24]; + createFullServiceDomain(fullServiceDomain, 63+24, servername, hostname); - /* Release the node */ - ns->releaseNode(ns->context, node); + UA_Boolean exists = UA_Discovery_recordExists(server, fullServiceDomain, port, protocol); + if(exists == true) + return UA_STATUSCODE_GOOD; - if(retval != UA_STATUSCODE_GOOD) { - UA_Array_delete(results, results_count, &UA_TYPES[UA_TYPES_NODEID]); - return retval; - } - } + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Multicast DNS: add record for domain: %s", fullServiceDomain); - /* Zero results. The leaf node was not found */ - if(results_count == 0) { - UA_free(results); - results = NULL; - } + // _services._dns-sd._udp.local. PTR _opcua-tcp._tcp.local - *typeHierarchy = results; - *typeHierarchySize = results_count; - return UA_STATUSCODE_GOOD; -} + // check if there is already a PTR entry for the given service. -/* For mulithreading: make a copy of the node, edit and replace. - * For singlethreading: edit the original */ -UA_StatusCode -UA_Server_editNode(UA_Server *server, UA_Session *session, - const UA_NodeId *nodeId, UA_EditNodeCallback callback, - void *data) { -#ifndef UA_ENABLE_MULTITHREADING - const UA_Node *node = UA_Nodestore_get(server, nodeId); - if(!node) - return UA_STATUSCODE_BADNODEIDUNKNOWN; - UA_StatusCode retval = callback(server, session, - (UA_Node*)(uintptr_t)node, data); - UA_Nodestore_release(server, node); - return retval; -#else - UA_StatusCode retval; - do { - UA_Node *node; - retval = server->config.nodestore.getNodeCopy(server->config.nodestore.context, - nodeId, &node); - if(retval != UA_STATUSCODE_GOOD) - return retval; - retval = callback(server, session, node, data); - if(retval != UA_STATUSCODE_GOOD) { - server->config.nodestore.deleteNode(server->config.nodestore.context, node); - return retval; - } - retval = server->config.nodestore.replaceNode(server->config.nodestore.context, node); - } while(retval != UA_STATUSCODE_GOOD); - return retval; -#endif -} + // _opcua-tcp._tcp.local. PTR [servername]-[hostname]._opcua-tcp._tcp.local. + mdns_record_t *r = mdns_find_record(server->discoveryManager.mdnsDaemon, QTYPE_PTR, + "_opcua-tcp._tcp.local.", fullServiceDomain); + if(!r) { + r = mdnsd_shared(server->discoveryManager.mdnsDaemon, "_opcua-tcp._tcp.local.", QTYPE_PTR, 600); + mdnsd_set_host(server->discoveryManager.mdnsDaemon, r, fullServiceDomain); + } -UA_StatusCode -UA_Server_processServiceOperations(UA_Server *server, UA_Session *session, - UA_ServiceOperation operationCallback, - void *context, const size_t *requestOperations, - const UA_DataType *requestOperationsType, - size_t *responseOperations, - const UA_DataType *responseOperationsType) { - size_t ops = *requestOperations; - if(ops == 0) - return UA_STATUSCODE_BADNOTHINGTODO; + /* The first 63 characters of the hostname (or less) */ + size_t maxHostnameLen = UA_MIN(hostnameLen, 63); + char localDomain[65]; + memcpy(localDomain, hostname->data, maxHostnameLen); + localDomain[maxHostnameLen] = '.'; + localDomain[maxHostnameLen+1] = '\0'; - /* No padding after size_t */ - void **respPos = (void**)((uintptr_t)responseOperations + sizeof(size_t)); - *respPos = UA_Array_new(ops, responseOperationsType); - if(!(*respPos)) - return UA_STATUSCODE_BADOUTOFMEMORY; + // [servername]-[hostname]._opcua-tcp._tcp.local. 86400 IN SRV 0 5 port [hostname]. + r = mdnsd_unique(server->discoveryManager.mdnsDaemon, fullServiceDomain, QTYPE_SRV, 600, + UA_Discovery_multicastConflict, server); + mdnsd_set_srv(server->discoveryManager.mdnsDaemon, r, 0, 0, port, localDomain); - *responseOperations = ops; - uintptr_t respOp = (uintptr_t)*respPos; - /* No padding after size_t */ - uintptr_t reqOp = *(uintptr_t*)((uintptr_t)requestOperations + sizeof(size_t)); - for(size_t i = 0; i < ops; i++) { - operationCallback(server, session, context, (void*)reqOp, (void*)respOp); - reqOp += requestOperationsType->memSize; - respOp += responseOperationsType->memSize; + // A/AAAA record for all ip addresses. + // [servername]-[hostname]._opcua-tcp._tcp.local. A [ip]. + // [hostname]. A [ip]. + mdns_set_address_record(server, fullServiceDomain, localDomain); + + // TXT record: [servername]-[hostname]._opcua-tcp._tcp.local. TXT path=/ caps=NA,DA,... + UA_STACKARRAY(char, pathChars, path->length + 1); + if(createTxt) { + if(path->length > 0) + memcpy(pathChars, path->data, path->length); + pathChars[path->length] = 0; + mdns_create_txt(server, fullServiceDomain, pathChars, capabilites, + capabilitiesSize, UA_Discovery_multicastConflict); } + return UA_STATUSCODE_GOOD; } -/*********************************/ -/* Default attribute definitions */ -/*********************************/ +UA_StatusCode +UA_Discovery_removeRecord(UA_Server *server, const UA_String *servername, + const UA_String *hostname, UA_UInt16 port, + UA_Boolean removeTxt) { + // use a limit for the hostname length to make sure full string fits into 63 + // chars (limited by DNS spec) + size_t hostnameLen = hostname->length; + size_t servernameLen = servername->length; + if(hostnameLen == 0 || servernameLen == 0) + return UA_STATUSCODE_BADOUTOFRANGE; -const UA_ObjectAttributes UA_ObjectAttributes_default = { - 0, /* specifiedAttributes */ - {{0, NULL}, {0, NULL}}, /* displayName */ - {{0, NULL}, {0, NULL}}, /* description */ - 0, 0, /* writeMask (userWriteMask) */ - 0 /* eventNotifier */ -}; + if(hostnameLen+servernameLen+1 > 63) { // include dash between servername-hostname + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Multicast DNS: Combination of hostname+servername exceeds " + "maximum of 62 chars. It will be truncated."); + } -const UA_VariableAttributes UA_VariableAttributes_default = { - 0, /* specifiedAttributes */ - {{0, NULL}, {0, NULL}}, /* displayName */ - {{0, NULL}, {0, NULL}}, /* description */ - 0, 0, /* writeMask (userWriteMask) */ - {NULL, UA_VARIANT_DATA, - 0, NULL, 0, NULL}, /* value */ - {0, UA_NODEIDTYPE_NUMERIC, - {UA_NS0ID_BASEDATATYPE}}, /* dataType */ - UA_VALUERANK_ANY, /* valueRank */ - 0, NULL, /* arrayDimensions */ - UA_ACCESSLEVELMASK_READ, 0, /* accessLevel (userAccessLevel) */ - 0.0, /* minimumSamplingInterval */ - false /* historizing */ -}; + // [servername]-[hostname]._opcua-tcp._tcp.local. + char fullServiceDomain[63 + 24]; + createFullServiceDomain(fullServiceDomain, 63+24, servername, hostname); -const UA_MethodAttributes UA_MethodAttributes_default = { - 0, /* specifiedAttributes */ - {{0, NULL}, {0, NULL}}, /* displayName */ - {{0, NULL}, {0, NULL}}, /* description */ - 0, 0, /* writeMask (userWriteMask) */ - true, true /* executable (userExecutable) */ -}; + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Multicast DNS: remove record for domain: %s", fullServiceDomain); -const UA_ObjectTypeAttributes UA_ObjectTypeAttributes_default = { - 0, /* specifiedAttributes */ - {{0, NULL}, {0, NULL}}, /* displayName */ - {{0, NULL}, {0, NULL}}, /* description */ - 0, 0, /* writeMask (userWriteMask) */ - false /* isAbstract */ -}; + // _opcua-tcp._tcp.local. PTR [servername]-[hostname]._opcua-tcp._tcp.local. + mdns_record_t *r = mdns_find_record(server->discoveryManager.mdnsDaemon, QTYPE_PTR, + "_opcua-tcp._tcp.local.", fullServiceDomain); + if(!r) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Multicast DNS: could not remove record. " + "PTR Record not found for domain: %s", fullServiceDomain); + return UA_STATUSCODE_BADNOTHINGTODO; + } + mdnsd_done(server->discoveryManager.mdnsDaemon, r); -const UA_VariableTypeAttributes UA_VariableTypeAttributes_default = { - 0, /* specifiedAttributes */ - {{0, NULL}, {0, NULL}}, /* displayName */ - {{0, NULL}, {0, NULL}}, /* description */ - 0, 0, /* writeMask (userWriteMask) */ - {NULL, UA_VARIANT_DATA, - 0, NULL, 0, NULL}, /* value */ - {0, UA_NODEIDTYPE_NUMERIC, - {UA_NS0ID_BASEDATATYPE}}, /* dataType */ - UA_VALUERANK_ANY, /* valueRank */ - 0, NULL, /* arrayDimensions */ - false /* isAbstract */ -}; + // looks for [servername]-[hostname]._opcua-tcp._tcp.local. 86400 IN SRV 0 5 port hostname.local. + // and TXT record: [servername]-[hostname]._opcua-tcp._tcp.local. TXT path=/ caps=NA,DA,... + // and A record: [servername]-[hostname]._opcua-tcp._tcp.local. A [ip] + mdns_record_t *r2 = mdnsd_get_published(server->discoveryManager.mdnsDaemon, fullServiceDomain); + if(!r2) { + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Multicast DNS: could not remove record. Record not " + "found for domain: %s", fullServiceDomain); + return UA_STATUSCODE_BADNOTHINGTODO; + } -const UA_ReferenceTypeAttributes UA_ReferenceTypeAttributes_default = { - 0, /* specifiedAttributes */ - {{0, NULL}, {0, NULL}}, /* displayName */ - {{0, NULL}, {0, NULL}}, /* description */ - 0, 0, /* writeMask (userWriteMask) */ - false, /* isAbstract */ - false, /* symmetric */ - {{0, NULL}, {0, NULL}} /* inverseName */ -}; + while(r2) { + const mdns_answer_t *data = mdnsd_record_data(r2); + mdns_record_t *next = mdnsd_record_next(r2); + if((removeTxt && data->type == QTYPE_TXT) || + (removeTxt && data->type == QTYPE_A) || + data->srv.port == port) { + mdnsd_done(server->discoveryManager.mdnsDaemon, r2); + } + r2 = next; + } -const UA_DataTypeAttributes UA_DataTypeAttributes_default = { - 0, /* specifiedAttributes */ - {{0, NULL}, {0, NULL}}, /* displayName */ - {{0, NULL}, {0, NULL}}, /* description */ - 0, 0, /* writeMask (userWriteMask) */ - false /* isAbstract */ -}; + return UA_STATUSCODE_GOOD; +} -const UA_ViewAttributes UA_ViewAttributes_default = { - 0, /* specifiedAttributes */ - {{0, NULL}, {0, NULL}}, /* displayName */ - {{0, NULL}, {0, NULL}}, /* description */ - 0, 0, /* writeMask (userWriteMask) */ - false, /* containsNoLoops */ - 0 /* eventNotifier */ -}; +UA_StatusCode +iterateMulticastDiscoveryServer(UA_Server* server, UA_DateTime *nextRepeat, + UA_Boolean processIn) { + struct timeval next_sleep = { 0, 0 }; + unsigned short retval = mdnsd_step(server->discoveryManager.mdnsDaemon, + (int)server->discoveryManager.mdnsSocket, + processIn, true, &next_sleep); + if(retval == 1) { + UA_LOG_SOCKET_ERRNO_WRAP( + UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Multicast error: Can not read from socket. %s", errno_str)); + return UA_STATUSCODE_BADNOCOMMUNICATION; + } else if(retval == 2) { + UA_LOG_SOCKET_ERRNO_WRAP( + UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, + "Multicast error: Can not write to socket. %s", errno_str)); + return UA_STATUSCODE_BADNOCOMMUNICATION; + } + + if(nextRepeat) + *nextRepeat = UA_DateTime_now() + + (UA_DateTime)((next_sleep.tv_sec * UA_DATETIME_SEC) + + (next_sleep.tv_usec * UA_DATETIME_USEC)); + return UA_STATUSCODE_GOOD; +} +#endif /* defined(UA_ENABLE_DISCOVERY) && defined(UA_ENABLE_DISCOVERY_MULTICAST) */ -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_server_worker.c" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/client/ua_client.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2014-2016 (c) Sten Grüner - * Copyright 2015 (c) Chris Iatrou - * Copyright 2015 (c) Nick Goossens - * Copyright 2015 (c) Jörg Schüler-Maroldt - * Copyright 2015-2016 (c) Oleksiy Vasylyev - * Copyright 2016-2017 (c) Florian Palm + * Copyright 2015-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2015-2016 (c) Sten Grüner + * Copyright 2015-2016 (c) Chris Iatrou + * Copyright 2015 (c) hfaham + * Copyright 2015-2017 (c) Florian Palm + * Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA + * Copyright 2015 (c) Holger Jeromin + * Copyright 2015 (c) Oleksiy Vasylyev + * Copyright 2016 (c) TorbenD * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2016 (c) Lorenz Haas - * Copyright 2017 (c) Jonas Green + * Copyright 2016 (c) Lykurg + * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2018 (c) Kalycito Infotech Private Limited */ -#ifdef UA_ENABLE_VALGRIND_INTERACTIVE -#include -#endif - -#define UA_MAXTIMEOUT 50 /* Max timeout in ms between main-loop iterations */ -/** - * Worker Threads and Dispatch Queue - * --------------------------------- - * The worker threads dequeue callbacks from a central Multi-Producer - * Multi-Consumer Queue (MPMC). When there are no callbacks, workers go idle. - * The condition to wake them up is triggered whenever a callback is - * dispatched. - * - * Future Plans: Use work-stealing to load-balance between cores. - * Le, Nhat Minh, et al. "Correct and efficient work-stealing for weak memory - * models." ACM SIGPLAN Notices. Vol. 48. No. 8. ACM, 2013. */ -#ifdef UA_ENABLE_MULTITHREADING +#define STATUS_CODE_BAD_POINTER 0x01 -struct UA_Worker { - UA_Server *server; - pthread_t thr; - UA_UInt32 counter; - volatile UA_Boolean running; +/********************/ +/* Client Lifecycle */ +/********************/ - /* separate cache lines */ - char padding[64 - sizeof(void*) - sizeof(pthread_t) - - sizeof(UA_UInt32) - sizeof(UA_Boolean)]; -}; +static void +UA_Client_init(UA_Client* client) { + memset(client, 0, sizeof(UA_Client)); + UA_SecureChannel_init(&client->channel); + if(client->config.stateCallback) + client->config.stateCallback(client, client->state); + /* Catch error during async connection */ + client->connectStatus = UA_STATUSCODE_GOOD; -struct UA_WorkerCallback { - SIMPLEQ_ENTRY(UA_WorkerCallback) next; - UA_ServerCallback callback; - void *data; + UA_Timer_init(&client->timer); + UA_WorkQueue_init(&client->workQueue); +} - UA_Boolean delayed; /* Is it a delayed callback? */ - UA_Boolean countersSampled; /* Have the worker counters been sampled? */ - UA_UInt32 workerCounters[]; /* Counter value for each worker */ -}; -typedef struct UA_WorkerCallback WorkerCallback; +UA_Client * +UA_Client_new() { + UA_Client *client = (UA_Client*)UA_malloc(sizeof(UA_Client)); + if(!client) + return NULL; + UA_Client_init(client); + return client; +} -/* Forward Declaration */ static void -processDelayedCallback(UA_Server *server, WorkerCallback *dc); - -static void * -workerLoop(UA_Worker *worker) { - UA_Server *server = worker->server; - UA_UInt32 *counter = &worker->counter; - volatile UA_Boolean *running = &worker->running; - - /* Initialize the (thread local) random seed with the ram address - * of the worker. Not for security-critical entropy! */ - UA_random_seed((uintptr_t)worker); +UA_ClientConfig_deleteMembers(UA_ClientConfig *config) { + UA_ApplicationDescription_deleteMembers(&config->clientDescription); - while(*running) { - UA_atomic_addUInt32(counter, 1); - pthread_mutex_lock(&server->dispatchQueue_accessMutex); - WorkerCallback *dc = SIMPLEQ_FIRST(&server->dispatchQueue); - if(dc) { - SIMPLEQ_REMOVE_HEAD(&server->dispatchQueue, next); - } - pthread_mutex_unlock(&server->dispatchQueue_accessMutex); - if(!dc) { - /* Nothing to do. Sleep until a callback is dispatched */ - pthread_mutex_lock(&server->dispatchQueue_conditionMutex); - pthread_cond_wait(&server->dispatchQueue_condition, - &server->dispatchQueue_conditionMutex); - pthread_mutex_unlock(&server->dispatchQueue_conditionMutex); - continue; - } + UA_ExtensionObject_deleteMembers(&config->userIdentityToken); + UA_String_deleteMembers(&config->securityPolicyUri); - if(dc->delayed) { - processDelayedCallback(server, dc); - continue; - } + UA_EndpointDescription_deleteMembers(&config->endpoint); + UA_UserTokenPolicy_deleteMembers(&config->userTokenPolicy); - dc->callback(server, dc->data); - UA_free(dc); - } + if(config->certificateVerification.deleteMembers) + config->certificateVerification.deleteMembers(&config->certificateVerification); - UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER, - "Worker shut down"); - return NULL; + /* Delete the SecurityPolicies */ + if(config->securityPolicies == 0) + return; + for(size_t i = 0; i < config->securityPoliciesSize; i++) + config->securityPolicies[i].deleteMembers(&config->securityPolicies[i]); + UA_free(config->securityPolicies); + config->securityPolicies = 0; } -void UA_Server_cleanupDispatchQueue(UA_Server *server) { - while(true) { - pthread_mutex_lock(&server->dispatchQueue_accessMutex); - WorkerCallback *dc = SIMPLEQ_FIRST(&server->dispatchQueue); - if(!dc) { - pthread_mutex_unlock(&server->dispatchQueue_accessMutex); - break; - } - SIMPLEQ_REMOVE_HEAD(&server->dispatchQueue, next); - pthread_mutex_unlock(&server->dispatchQueue_accessMutex); - dc->callback(server, dc->data); - UA_free(dc); - } -} +static void +UA_Client_deleteMembers(UA_Client *client) { + UA_Client_disconnect(client); + /* Commented as UA_SecureChannel_deleteMembers already done + * in UA_Client_disconnect function */ + //UA_SecureChannel_deleteMembersCleanup(&client->channel); + if (client->connection.free) + client->connection.free(&client->connection); + UA_Connection_deleteMembers(&client->connection); + UA_NodeId_deleteMembers(&client->authenticationToken); + UA_String_deleteMembers(&client->endpointUrl); -#endif + /* Delete the async service calls */ + UA_Client_AsyncService_removeAll(client, UA_STATUSCODE_BADSHUTDOWN); -/** - * Repeated Callbacks - * ------------------ - * Repeated Callbacks are handled by UA_Timer (used in both client and server). - * In the multi-threaded case, callbacks are dispatched to workers. Otherwise, - * they are executed immediately. */ + /* Delete the subscriptions */ +#ifdef UA_ENABLE_SUBSCRIPTIONS + UA_Client_Subscriptions_clean(client); +#endif -void -UA_Server_workerCallback(UA_Server *server, UA_ServerCallback callback, - void *data) { -#ifndef UA_ENABLE_MULTITHREADING - /* Execute immediately */ - callback(server, data); -#else - /* Execute immediately if memory could not be allocated */ - WorkerCallback *dc = (WorkerCallback*)UA_malloc(sizeof(WorkerCallback)); - if(!dc) { - callback(server, data); - return; - } + /* Delete the timed work */ + UA_Timer_deleteMembers(&client->timer); - /* Enqueue for the worker threads */ - dc->callback = callback; - dc->data = data; - dc->delayed = false; - pthread_mutex_lock(&server->dispatchQueue_accessMutex); - SIMPLEQ_INSERT_TAIL(&server->dispatchQueue, dc, next); - pthread_mutex_unlock(&server->dispatchQueue_accessMutex); + /* Clean up the work queue */ + UA_WorkQueue_cleanup(&client->workQueue); - /* Wake up sleeping workers */ - pthread_cond_broadcast(&server->dispatchQueue_condition); -#endif + UA_ClientConfig_deleteMembers(&client->config); } -/** - * Delayed Callbacks - * ----------------- - * - * Delayed Callbacks are called only when all callbacks that were dispatched - * prior are finished. In the single-threaded case, the callback is added to a - * singly-linked list that is processed at the end of the server's main-loop. In - * the multi-threaded case, the delay is ensure by a three-step procedure: - * - * 1. The delayed callback is dispatched to the worker queue. So it is only - * dequeued when all prior callbacks have been dequeued. - * - * 2. When the callback is first dequeued by a worker, sample the counter of all - * workers. Once all counters have advanced, the callback is ready. - * - * 3. Check regularly if the callback is ready by adding it back to the dispatch - * queue. */ - -/* Delayed callback to free the subscription memory */ -static void -freeCallback(UA_Server *server, void *data) { - UA_free(data); +void +UA_Client_reset(UA_Client* client) { + UA_Client_deleteMembers(client); + UA_Client_init(client); } -/* TODO: Delayed free should never fail. This can be achieved by adding a prefix - * with the list pointers */ -UA_StatusCode -UA_Server_delayedFree(UA_Server *server, void *data) { - return UA_Server_delayedCallback(server, freeCallback, data); +void +UA_Client_delete(UA_Client* client) { + UA_Client_deleteMembers(client); + UA_free(client); } -#ifndef UA_ENABLE_MULTITHREADING +UA_ClientState +UA_Client_getState(UA_Client *client) { + return client->state; +} -typedef struct UA_DelayedCallback { - SLIST_ENTRY(UA_DelayedCallback) next; - UA_ServerCallback callback; - void *data; -} UA_DelayedCallback; +UA_ClientConfig * +UA_Client_getConfig(UA_Client *client) { + if(!client) + return NULL; + return &client->config; +} -UA_StatusCode -UA_Server_delayedCallback(UA_Server *server, UA_ServerCallback callback, - void *data) { - UA_DelayedCallback *dc = - (UA_DelayedCallback*)UA_malloc(sizeof(UA_DelayedCallback)); - if(!dc) - return UA_STATUSCODE_BADOUTOFMEMORY; +/****************/ +/* Raw Services */ +/****************/ - dc->callback = callback; - dc->data = data; - SLIST_INSERT_HEAD(&server->delayedCallbacks, dc, next); - return UA_STATUSCODE_GOOD; -} +/* For synchronous service calls. Execute async responses with a callback. When + * the response with the correct requestId turns up, return it via the + * SyncResponseDescription pointer. */ +typedef struct { + UA_Client *client; + UA_Boolean received; + UA_UInt32 requestId; + void *response; + const UA_DataType *responseType; +} SyncResponseDescription; -void UA_Server_cleanupDelayedCallbacks(UA_Server *server) { - UA_DelayedCallback *dc, *dc_tmp; - SLIST_FOREACH_SAFE(dc, &server->delayedCallbacks, next, dc_tmp) { - SLIST_REMOVE(&server->delayedCallbacks, dc, UA_DelayedCallback, next); - dc->callback(server, dc->data); - UA_free(dc); - } -} +/* For both synchronous and asynchronous service calls */ +static UA_StatusCode +sendSymmetricServiceRequest(UA_Client *client, const void *request, + const UA_DataType *requestType, UA_UInt32 *requestId) { + /* Make sure we have a valid session */ + UA_StatusCode retval = UA_STATUSCODE_GOOD; + /* FIXME: this is just a dirty workaround. We need to rework some of the sync and async processing + * FIXME: in the client. Currently a lot of stuff is semi broken and in dire need of cleaning up.*/ + /*UA_StatusCode retval = openSecureChannel(client, true); + if(retval != UA_STATUSCODE_GOOD) + return retval;*/ -#else /* UA_ENABLE_MULTITHREADING */ + /* Adjusting the request header. The const attribute is violated, but we + * only touch the following members: */ + UA_RequestHeader *rr = (UA_RequestHeader*)(uintptr_t)request; + rr->authenticationToken = client->authenticationToken; /* cleaned up at the end */ + rr->timestamp = UA_DateTime_now(); + rr->requestHandle = ++client->requestHandle; -UA_StatusCode -UA_Server_delayedCallback(UA_Server *server, UA_ServerCallback callback, - void *data) { - size_t dcsize = sizeof(WorkerCallback) + - (sizeof(UA_UInt32) * server->config.nThreads); - WorkerCallback *dc = (WorkerCallback*)UA_malloc(dcsize); - if(!dc) - return UA_STATUSCODE_BADOUTOFMEMORY; + /* Send the request */ + UA_UInt32 rqId = ++client->requestId; + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Sending a request of type %i", requestType->typeId.identifier.numeric); - /* Enqueue for the worker threads */ - dc->callback = callback; - dc->data = data; - dc->delayed = true; - dc->countersSampled = false; - pthread_mutex_lock(&server->dispatchQueue_accessMutex); - SIMPLEQ_INSERT_TAIL(&server->dispatchQueue, dc, next); - pthread_mutex_unlock(&server->dispatchQueue_accessMutex); + if (client->channel.nextSecurityToken.tokenId != 0) // Change to the new security token if the secure channel has been renewed. + UA_SecureChannel_revolveTokens(&client->channel); + retval = UA_SecureChannel_sendSymmetricMessage(&client->channel, rqId, UA_MESSAGETYPE_MSG, + rr, requestType); + UA_NodeId_init(&rr->authenticationToken); /* Do not return the token to the user */ + if(retval != UA_STATUSCODE_GOOD) + return retval; - /* Wake up sleeping workers */ - pthread_cond_broadcast(&server->dispatchQueue_condition); + *requestId = rqId; return UA_STATUSCODE_GOOD; } -/* Called from the worker loop */ -static void -processDelayedCallback(UA_Server *server, WorkerCallback *dc) { - /* Set the worker counters */ - if(!dc->countersSampled) { - for(size_t i = 0; i < server->config.nThreads; ++i) - dc->workerCounters[i] = server->workers[i].counter; - dc->countersSampled = true; - - /* Re-add to the dispatch queue */ - pthread_mutex_lock(&server->dispatchQueue_accessMutex); - SIMPLEQ_INSERT_TAIL(&server->dispatchQueue, dc, next); - pthread_mutex_unlock(&server->dispatchQueue_accessMutex); - - /* Wake up sleeping workers */ - pthread_cond_broadcast(&server->dispatchQueue_condition); - return; - } +static const UA_NodeId +serviceFaultId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_SERVICEFAULT_ENCODING_DEFAULTBINARY}}; - /* Have all other jobs finished? */ - UA_Boolean ready = true; - for(size_t i = 0; i < server->config.nThreads; ++i) { - if(dc->workerCounters[i] == server->workers[i].counter) { - ready = false; +/* Look for the async callback in the linked list, execute and delete it */ +static UA_StatusCode +processAsyncResponse(UA_Client *client, UA_UInt32 requestId, const UA_NodeId *responseTypeId, + const UA_ByteString *responseMessage, size_t *offset) { + /* Find the callback */ + AsyncServiceCall *ac; + LIST_FOREACH(ac, &client->asyncServiceCalls, pointers) { + if(ac->requestId == requestId) break; - } } + if(!ac) + return UA_STATUSCODE_BADREQUESTHEADERINVALID; - /* Re-add to the dispatch queue. - * TODO: What is the impact of this loop? - * Can we add a small delay here? */ - if(!ready) { - pthread_mutex_lock(&server->dispatchQueue_accessMutex); - SIMPLEQ_INSERT_TAIL(&server->dispatchQueue, dc, next); - pthread_mutex_unlock(&server->dispatchQueue_accessMutex); + /* Allocate the response */ + UA_STACKARRAY(UA_Byte, responseBuf, ac->responseType->memSize); + void *response = (void*)(uintptr_t)&responseBuf[0]; /* workaround aliasing rules */ - /* Wake up sleeping workers */ - pthread_cond_broadcast(&server->dispatchQueue_condition); - return; + /* Verify the type of the response */ + const UA_DataType *responseType = ac->responseType; + const UA_NodeId expectedNodeId = UA_NODEID_NUMERIC(0, ac->responseType->binaryEncodingId); + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(!UA_NodeId_equal(responseTypeId, &expectedNodeId)) { + UA_init(response, ac->responseType); + if(UA_NodeId_equal(responseTypeId, &serviceFaultId)) { + /* Decode as a ServiceFault, i.e. only the response header */ + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Received a ServiceFault response"); + responseType = &UA_TYPES[UA_TYPES_SERVICEFAULT]; + } else { + /* Close the connection */ + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Reply contains the wrong service response"); + retval = UA_STATUSCODE_BADCOMMUNICATIONERROR; + goto process; + } } - /* Execute the callback */ - dc->callback(server, dc->data); - UA_free(dc); -} - -#endif - -/** - * Main Server Loop - * ---------------- - * Start: Spin up the workers and the network layer and sample the server's - * start time. - * Iterate: Process repeated callbacks and events in the network layer. - * This part can be driven from an external main-loop in an - * event-driven single-threaded architecture. - * Stop: Stop workers, finish all callbacks, stop the network layer, - * clean up */ - -UA_StatusCode -UA_Server_run_startup(UA_Server *server) { - UA_Variant var; - UA_StatusCode result = UA_STATUSCODE_GOOD; - - /* Sample the start time and set it to the Server object */ - server->startTime = UA_DateTime_now(); - UA_Variant_init(&var); - UA_Variant_setScalar(&var, &server->startTime, &UA_TYPES[UA_TYPES_DATETIME]); - UA_Server_writeValue(server, - UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STARTTIME), - var); - - /* Start the networklayers */ - for(size_t i = 0; i < server->config.networkLayersSize; ++i) { - UA_ServerNetworkLayer *nl = &server->config.networkLayers[i]; - result |= nl->start(nl, &server->config.customHostname); - } + /* Decode the response */ + retval = UA_decodeBinary(responseMessage, offset, response, responseType, client->config.customDataTypes); - /* Spin up the worker threads */ -#ifdef UA_ENABLE_MULTITHREADING - UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_SERVER, - "Spinning up %u worker thread(s)", server->config.nThreads); - pthread_mutex_init(&server->dispatchQueue_accessMutex, NULL); - pthread_cond_init(&server->dispatchQueue_condition, NULL); - pthread_mutex_init(&server->dispatchQueue_conditionMutex, NULL); - server->workers = (UA_Worker*)UA_malloc(server->config.nThreads * sizeof(UA_Worker)); - if(!server->workers) - return UA_STATUSCODE_BADOUTOFMEMORY; - for(size_t i = 0; i < server->config.nThreads; ++i) { - UA_Worker *worker = &server->workers[i]; - worker->server = server; - worker->counter = 0; - worker->running = true; - pthread_create(&worker->thr, NULL, (void* (*)(void*))workerLoop, worker); + process: + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Could not decode the response with id %u due to %s", + requestId, UA_StatusCode_name(retval)); + ((UA_ResponseHeader*)response)->serviceResult = retval; + } else if(((UA_ResponseHeader*)response)->serviceResult != UA_STATUSCODE_GOOD) { + /* Decode as a ServiceFault, i.e. only the response header */ + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "The ServiceResult has the StatusCode %s", + UA_StatusCode_name(((UA_ResponseHeader*)response)->serviceResult)); } -#endif - /* Start the multicast discovery server */ -#ifdef UA_ENABLE_DISCOVERY_MULTICAST - if(server->config.applicationDescription.applicationType == - UA_APPLICATIONTYPE_DISCOVERYSERVER) - startMulticastDiscoveryServer(server); -#endif + /* Call the callback */ + if(ac->callback) + ac->callback(client, ac->userdata, requestId, response); + UA_deleteMembers(response, ac->responseType); - return result; + /* Remove the callback */ + LIST_REMOVE(ac, pointers); + UA_free(ac); + return retval; } -UA_UInt16 -UA_Server_run_iterate(UA_Server *server, UA_Boolean waitInternal) { - /* Process repeated work */ - UA_DateTime now = UA_DateTime_nowMonotonic(); - UA_DateTime nextRepeated = - UA_Timer_process(&server->timer, now, - (UA_TimerDispatchCallback)UA_Server_workerCallback, - server); - UA_DateTime latest = now + (UA_MAXTIMEOUT * UA_DATETIME_MSEC); - if(nextRepeated > latest) - nextRepeated = latest; - - UA_UInt16 timeout = 0; - - /* round always to upper value to avoid timeout to be set to 0 - * if(nextRepeated - now) < (UA_DATETIME_MSEC/2) */ - if(waitInternal) - timeout = (UA_UInt16)(((nextRepeated - now) + (UA_DATETIME_MSEC - 1)) / UA_DATETIME_MSEC); +/* Processes the received service response. Either with an async callback or by + * decoding the message and returning it "upwards" in the + * SyncResponseDescription. */ +static void +processServiceResponse(void *application, UA_SecureChannel *channel, + UA_MessageType messageType, UA_UInt32 requestId, + const UA_ByteString *message) { + SyncResponseDescription *rd = (SyncResponseDescription*)application; - /* Listen on the networklayer */ - for(size_t i = 0; i < server->config.networkLayersSize; ++i) { - UA_ServerNetworkLayer *nl = &server->config.networkLayers[i]; - nl->listen(nl, server, timeout); + /* Must be OPN or MSG */ + if(messageType != UA_MESSAGETYPE_OPN && + messageType != UA_MESSAGETYPE_MSG) { + UA_LOG_TRACE_CHANNEL(&rd->client->config.logger, channel, + "Invalid message type"); + return; } -#ifndef UA_ENABLE_MULTITHREADING - /* Process delayed callbacks when all callbacks and network events are done. - * If multithreading is enabled, the cleanup of delayed values is attempted - * by a callback in the job queue. */ - UA_Server_cleanupDelayedCallbacks(server); -#endif + /* Forward declaration for the goto */ + UA_NodeId expectedNodeId = UA_NODEID_NULL; -#if defined(UA_ENABLE_DISCOVERY_MULTICAST) && !defined(UA_ENABLE_MULTITHREADING) - if(server->config.applicationDescription.applicationType == - UA_APPLICATIONTYPE_DISCOVERYSERVER) { - // TODO multicastNextRepeat does not consider new input data (requests) - // on the socket. It will be handled on the next call. if needed, we - // need to use select with timeout on the multicast socket - // server->mdnsSocket (see example in mdnsd library) on higher level. - UA_DateTime multicastNextRepeat = 0; - UA_StatusCode hasNext = - iterateMulticastDiscoveryServer(server, &multicastNextRepeat, UA_TRUE); - if(hasNext == UA_STATUSCODE_GOOD && multicastNextRepeat < nextRepeated) - nextRepeated = multicastNextRepeat; + /* Decode the data type identifier of the response */ + size_t offset = 0; + UA_NodeId responseId; + UA_StatusCode retval = UA_NodeId_decodeBinary(message, &offset, &responseId); + if(retval != UA_STATUSCODE_GOOD) + goto finish; + + /* Got an asynchronous response. Don't expected a synchronous response + * (responseType NULL) or the id does not match. */ + if(!rd->responseType || requestId != rd->requestId) { + retval = processAsyncResponse(rd->client, requestId, &responseId, message, &offset); + goto finish; } -#endif - now = UA_DateTime_nowMonotonic(); - timeout = 0; - if(nextRepeated > now) - timeout = (UA_UInt16)((nextRepeated - now) / UA_DATETIME_MSEC); - return timeout; -} + /* Got the synchronous response */ + rd->received = true; -UA_StatusCode -UA_Server_run_shutdown(UA_Server *server) { - /* Stop the netowrk layer */ - for(size_t i = 0; i < server->config.networkLayersSize; ++i) { - UA_ServerNetworkLayer *nl = &server->config.networkLayers[i]; - nl->stop(nl, server); + /* Check that the response type matches */ + expectedNodeId = UA_NODEID_NUMERIC(0, rd->responseType->binaryEncodingId); + if(!UA_NodeId_equal(&responseId, &expectedNodeId)) { + if(UA_NodeId_equal(&responseId, &serviceFaultId)) { + UA_init(rd->response, rd->responseType); + retval = UA_decodeBinary(message, &offset, rd->response, + &UA_TYPES[UA_TYPES_SERVICEFAULT], + rd->client->config.customDataTypes); + if(retval != UA_STATUSCODE_GOOD) + ((UA_ResponseHeader*)rd->response)->serviceResult = retval; + UA_LOG_INFO(&rd->client->config.logger, UA_LOGCATEGORY_CLIENT, + "Received a ServiceFault response with StatusCode %s", + UA_StatusCode_name(((UA_ResponseHeader*)rd->response)->serviceResult)); + } else { + /* Close the connection */ + UA_LOG_ERROR(&rd->client->config.logger, UA_LOGCATEGORY_CLIENT, + "Reply contains the wrong service response"); + retval = UA_STATUSCODE_BADCOMMUNICATIONERROR; + } + goto finish; } -#ifdef UA_ENABLE_MULTITHREADING - /* Shut down the workers */ - if(server->workers) { - UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_SERVER, - "Shutting down %u worker thread(s)", - server->config.nThreads); - for(size_t i = 0; i < server->config.nThreads; ++i) - server->workers[i].running = false; - pthread_cond_broadcast(&server->dispatchQueue_condition); - for(size_t i = 0; i < server->config.nThreads; ++i) - pthread_join(server->workers[i].thr, NULL); - UA_free(server->workers); - server->workers = NULL; - } - - /* Execute the remaining callbacks in the dispatch queue. Also executes - * delayed callbacks. */ - UA_Server_cleanupDispatchQueue(server); +#ifdef UA_ENABLE_TYPENAMES + UA_LOG_DEBUG(&rd->client->config.logger, UA_LOGCATEGORY_CLIENT, + "Decode a message of type %s", rd->responseType->typeName); #else - /* Process remaining delayed callbacks */ - UA_Server_cleanupDelayedCallbacks(server); + UA_LOG_DEBUG(&rd->client->config.logger, UA_LOGCATEGORY_CLIENT, + "Decode a message of type %u", responseId.identifier.numeric); #endif -#ifdef UA_ENABLE_DISCOVERY_MULTICAST - /* Stop multicast discovery */ - if(server->config.applicationDescription.applicationType == - UA_APPLICATIONTYPE_DISCOVERYSERVER) - stopMulticastDiscoveryServer(server); -#endif + /* Decode the response */ + retval = UA_decodeBinary(message, &offset, rd->response, rd->responseType, + rd->client->config.customDataTypes); - return UA_STATUSCODE_GOOD; +finish: + UA_NodeId_deleteMembers(&responseId); + if(retval != UA_STATUSCODE_GOOD) { + if(retval == UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED) + retval = UA_STATUSCODE_BADRESPONSETOOLARGE; + UA_LOG_INFO(&rd->client->config.logger, UA_LOGCATEGORY_CLIENT, + "Error receiving the response with status code %s", + UA_StatusCode_name(retval)); + + if(rd->response) { + UA_ResponseHeader *respHeader = (UA_ResponseHeader*)rd->response; + respHeader->serviceResult = retval; + } + } } -UA_StatusCode -UA_Server_run(UA_Server *server, volatile UA_Boolean *running) { - UA_StatusCode retval = UA_Server_run_startup(server); +/* Forward complete chunks directly to the securechannel */ +static UA_StatusCode +client_processChunk(void *application, UA_Connection *connection, UA_ByteString *chunk) { + SyncResponseDescription *rd = (SyncResponseDescription*)application; + UA_StatusCode retval = UA_SecureChannel_decryptAddChunk(&rd->client->channel, chunk, true); if(retval != UA_STATUSCODE_GOOD) return retval; -#ifdef UA_ENABLE_VALGRIND_INTERACTIVE - size_t loopCount = 0; -#endif - while(*running) { -#ifdef UA_ENABLE_VALGRIND_INTERACTIVE - if(loopCount == 0) { - VALGRIND_DO_LEAK_CHECK; - } - ++loopCount; - loopCount %= UA_VALGRIND_INTERACTIVE_INTERVAL; -#endif - UA_Server_run_iterate(server, true); - } - return UA_Server_run_shutdown(server); + return UA_SecureChannel_persistIncompleteMessages(&rd->client->channel); } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_server_discovery.c" ***********************************/ +/* Receive and process messages until a synchronous message arrives or the + * timout finishes */ +UA_StatusCode +receiveServiceResponse(UA_Client *client, void *response, const UA_DataType *responseType, + UA_DateTime maxDate, const UA_UInt32 *synchronousRequestId) { + /* Prepare the response and the structure we give into processServiceResponse */ + SyncResponseDescription rd = { client, false, 0, response, responseType }; -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - */ + /* Return upon receiving the synchronized response. All other responses are + * processed with a callback "in the background". */ + if(synchronousRequestId) + rd.requestId = *synchronousRequestId; + UA_StatusCode retval; + do { + UA_DateTime now = UA_DateTime_nowMonotonic(); -#ifdef UA_ENABLE_DISCOVERY + /* >= avoid timeout to be set to 0 */ + if(now >= maxDate) + return UA_STATUSCODE_GOODNONCRITICALTIMEOUT; -static UA_StatusCode -register_server_with_discovery_server(UA_Server *server, - const char* discoveryServerUrl, - const UA_Boolean isUnregister, - const char* semaphoreFilePath) { - if(!discoveryServerUrl) { - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, - "No discovery server url provided"); - return UA_STATUSCODE_BADINTERNALERROR; - } + /* round always to upper value to avoid timeout to be set to 0 + * if(maxDate - now) < (UA_DATETIME_MSEC/2) */ + UA_UInt32 timeout = (UA_UInt32)(((maxDate - now) + (UA_DATETIME_MSEC - 1)) / UA_DATETIME_MSEC); - /* Create the client */ - UA_ClientConfig clientConfig = UA_Server_getClientConfig(); - UA_Client *client = UA_Client_new(clientConfig); - if(!client) - return UA_STATUSCODE_BADOUTOFMEMORY; + retval = UA_Connection_receiveChunksBlocking(&client->connection, &rd, client_processChunk, timeout); + UA_SecureChannel_processCompleteMessages(&client->channel, &rd, processServiceResponse); + + if(retval != UA_STATUSCODE_GOOD && retval != UA_STATUSCODE_GOODNONCRITICALTIMEOUT) { + if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED) + setClientState(client, UA_CLIENTSTATE_DISCONNECTED); + UA_Client_disconnect(client); + break; + } + } while(!rd.received); + return retval; +} + +void +__UA_Client_Service(UA_Client *client, const void *request, + const UA_DataType *requestType, void *response, + const UA_DataType *responseType) { + UA_init(response, responseType); + UA_ResponseHeader *respHeader = (UA_ResponseHeader*)response; - /* Connect the client */ - UA_StatusCode retval = UA_Client_connect(client, discoveryServerUrl); + /* Send the request */ + UA_UInt32 requestId; + UA_StatusCode retval = sendSymmetricServiceRequest(client, request, requestType, &requestId); if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_CLIENT, - "Connecting to the discovery server failed with statuscode %s", - UA_StatusCode_name(retval)); + if(retval == UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED) + respHeader->serviceResult = UA_STATUSCODE_BADREQUESTTOOLARGE; + else + respHeader->serviceResult = retval; UA_Client_disconnect(client); - UA_Client_delete(client); - return retval; + return; } - /* Prepare the request. Do not cleanup the request after the service call, - * as the members are stack-allocated or point into the server config. */ - UA_RegisterServer2Request request; - UA_RegisterServer2Request_init(&request); - request.requestHeader.timestamp = UA_DateTime_now(); - request.requestHeader.timeoutHint = 10000; - - request.server.isOnline = !isUnregister; - request.server.serverUri = server->config.applicationDescription.applicationUri; - request.server.productUri = server->config.applicationDescription.productUri; - request.server.serverType = server->config.applicationDescription.applicationType; - request.server.gatewayServerUri = server->config.applicationDescription.gatewayServerUri; - - if(semaphoreFilePath) { -#ifdef UA_ENABLE_DISCOVERY_SEMAPHORE - request.server.semaphoreFilePath = - UA_STRING((char*)(uintptr_t)semaphoreFilePath); /* dirty cast */ -#else - UA_LOG_WARNING(server->config.logger, UA_LOGCATEGORY_CLIENT, - "Ignoring semaphore file path. open62541 not compiled " - "with UA_ENABLE_DISCOVERY_SEMAPHORE=ON"); -#endif + /* Retrieve the response */ + UA_DateTime maxDate = UA_DateTime_nowMonotonic() + + (client->config.timeout * UA_DATETIME_MSEC); + retval = receiveServiceResponse(client, response, responseType, maxDate, &requestId); + if(retval == UA_STATUSCODE_GOODNONCRITICALTIMEOUT) { + /* In synchronous service, if we have don't have a reply we need to close the connection */ + UA_Client_disconnect(client); + retval = UA_STATUSCODE_BADCONNECTIONCLOSED; } + if(retval != UA_STATUSCODE_GOOD) + respHeader->serviceResult = retval; +} - request.server.serverNames = &server->config.applicationDescription.applicationName; - request.server.serverNamesSize = 1; - - /* Copy the discovery urls from the server config and the network layers*/ - size_t config_discurls = server->config.applicationDescription.discoveryUrlsSize; - size_t nl_discurls = server->config.networkLayersSize; - size_t total_discurls = config_discurls + nl_discurls; - UA_STACKARRAY(UA_String, urlsBuf, total_discurls); - request.server.discoveryUrls = urlsBuf; - request.server.discoveryUrlsSize = total_discurls; +UA_StatusCode +receiveServiceResponseAsync(UA_Client *client, void *response, + const UA_DataType *responseType) { + SyncResponseDescription rd = { client, false, 0, response, responseType }; - for(size_t i = 0; i < config_discurls; ++i) - request.server.discoveryUrls[i] = server->config.applicationDescription.discoveryUrls[i]; + UA_StatusCode retval = UA_Connection_receiveChunksNonBlocking( + &client->connection, &rd, client_processChunk); + UA_SecureChannel_processCompleteMessages(&client->channel, &rd, processServiceResponse); + /*let client run when non critical timeout*/ + if(retval != UA_STATUSCODE_GOOD + && retval != UA_STATUSCODE_GOODNONCRITICALTIMEOUT) { + if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED) { + setClientState(client, UA_CLIENTSTATE_DISCONNECTED); + } + UA_Client_disconnect(client); + } + return retval; +} - /* TODO: Add nl only if discoveryUrl not already present */ - for(size_t i = 0; i < nl_discurls; ++i) { - UA_ServerNetworkLayer *nl = &server->config.networkLayers[i]; - request.server.discoveryUrls[config_discurls + i] = nl->discoveryUrl; +UA_StatusCode +receivePacketAsync(UA_Client *client) { + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if (UA_Client_getState(client) == UA_CLIENTSTATE_DISCONNECTED || + UA_Client_getState(client) == UA_CLIENTSTATE_WAITING_FOR_ACK) { + retval = UA_Connection_receiveChunksNonBlocking(&client->connection, client, processACKResponseAsync); + } + else if(UA_Client_getState(client) == UA_CLIENTSTATE_CONNECTED) { + retval = UA_Connection_receiveChunksNonBlocking(&client->connection, client, processOPNResponseAsync); + } + if(retval != UA_STATUSCODE_GOOD && retval != UA_STATUSCODE_GOODNONCRITICALTIMEOUT) { + if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED) + setClientState(client, UA_CLIENTSTATE_DISCONNECTED); + UA_Client_disconnect(client); } + return retval; +} - UA_MdnsDiscoveryConfiguration mdnsConfig; - UA_MdnsDiscoveryConfiguration_init(&mdnsConfig); +void +UA_Client_AsyncService_cancel(UA_Client *client, AsyncServiceCall *ac, + UA_StatusCode statusCode) { + /* Create an empty response with the statuscode */ + UA_STACKARRAY(UA_Byte, responseBuf, ac->responseType->memSize); + void *resp = (void*)(uintptr_t)&responseBuf[0]; /* workaround aliasing rules */ + UA_init(resp, ac->responseType); + ((UA_ResponseHeader*)resp)->serviceResult = statusCode; - request.discoveryConfigurationSize = 1; - request.discoveryConfiguration = UA_ExtensionObject_new(); - UA_ExtensionObject_init(&request.discoveryConfiguration[0]); - request.discoveryConfiguration[0].encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; - request.discoveryConfiguration[0].content.decoded.type = &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION]; - request.discoveryConfiguration[0].content.decoded.data = &mdnsConfig; + if(ac->callback) + ac->callback(client, ac->userdata, ac->requestId, resp); - mdnsConfig.mdnsServerName = server->config.mdnsServerName; - mdnsConfig.serverCapabilities = server->config.serverCapabilities; - mdnsConfig.serverCapabilitiesSize = server->config.serverCapabilitiesSize; + /* Clean up the response. Users might move data into it. For whatever reasons. */ + UA_deleteMembers(resp, ac->responseType); +} - // First try with RegisterServer2, if that isn't implemented, use RegisterServer - UA_RegisterServer2Response response; - __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST], - &response, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]); +void UA_Client_AsyncService_removeAll(UA_Client *client, UA_StatusCode statusCode) { + AsyncServiceCall *ac, *ac_tmp; + LIST_FOREACH_SAFE(ac, &client->asyncServiceCalls, pointers, ac_tmp) { + LIST_REMOVE(ac, pointers); + UA_Client_AsyncService_cancel(client, ac, statusCode); + UA_free(ac); + } +} - UA_StatusCode serviceResult = response.responseHeader.serviceResult; - UA_RegisterServer2Response_deleteMembers(&response); - UA_ExtensionObject_delete(request.discoveryConfiguration); +UA_StatusCode +__UA_Client_AsyncServiceEx(UA_Client *client, const void *request, + const UA_DataType *requestType, + UA_ClientAsyncServiceCallback callback, + const UA_DataType *responseType, + void *userdata, UA_UInt32 *requestId, + UA_UInt32 timeout) { + /* Prepare the entry for the linked list */ + AsyncServiceCall *ac = (AsyncServiceCall*)UA_malloc(sizeof(AsyncServiceCall)); + if(!ac) + return UA_STATUSCODE_BADOUTOFMEMORY; + ac->callback = callback; + ac->responseType = responseType; + ac->userdata = userdata; + ac->timeout = timeout; - if(serviceResult == UA_STATUSCODE_BADNOTIMPLEMENTED || - serviceResult == UA_STATUSCODE_BADSERVICEUNSUPPORTED) { - /* Try RegisterServer */ - UA_RegisterServerRequest request_fallback; - UA_RegisterServerRequest_init(&request_fallback); - /* Copy from RegisterServer2 request */ - request_fallback.requestHeader = request.requestHeader; - request_fallback.server = request.server; + /* Call the service and set the requestId */ + UA_StatusCode retval = sendSymmetricServiceRequest(client, request, requestType, &ac->requestId); + if(retval != UA_STATUSCODE_GOOD) { + UA_free(ac); + return retval; + } - UA_RegisterServerResponse response_fallback; + ac->start = UA_DateTime_nowMonotonic(); - __UA_Client_Service(client, &request_fallback, - &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST], - &response_fallback, - &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]); + /* Store the entry for async processing */ + LIST_INSERT_HEAD(&client->asyncServiceCalls, ac, pointers); + if(requestId) + *requestId = ac->requestId; + return UA_STATUSCODE_GOOD; +} - serviceResult = response_fallback.responseHeader.serviceResult; - UA_RegisterServerResponse_deleteMembers(&response_fallback); - } +UA_StatusCode +__UA_Client_AsyncService(UA_Client *client, const void *request, + const UA_DataType *requestType, + UA_ClientAsyncServiceCallback callback, + const UA_DataType *responseType, + void *userdata, UA_UInt32 *requestId) { + return __UA_Client_AsyncServiceEx(client, request, requestType, callback, + responseType, userdata, requestId, + client->config.timeout); +} - if(serviceResult != UA_STATUSCODE_GOOD) { - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_CLIENT, - "RegisterServer/RegisterServer2 failed with statuscode %s", - UA_StatusCode_name(serviceResult)); + +UA_StatusCode +UA_Client_sendAsyncRequest(UA_Client *client, const void *request, + const UA_DataType *requestType, + UA_ClientAsyncServiceCallback callback, + const UA_DataType *responseType, void *userdata, + UA_UInt32 *requestId) { + if (UA_Client_getState(client) < UA_CLIENTSTATE_SECURECHANNEL) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Client must be connected to send high-level requests"); + return UA_STATUSCODE_BADSERVERNOTCONNECTED; } + return __UA_Client_AsyncService(client, request, requestType, callback, + responseType, userdata, requestId); +} - UA_Client_disconnect(client); - UA_Client_delete(client); - return serviceResult; +UA_StatusCode UA_EXPORT +UA_Client_addTimedCallback(UA_Client *client, UA_ClientCallback callback, + void *data, UA_DateTime date, UA_UInt64 *callbackId) { + return UA_Timer_addTimedCallback(&client->timer, (UA_ApplicationCallback) callback, + client, data, date, callbackId); } UA_StatusCode -UA_Server_register_discovery(UA_Server *server, const char* discoveryServerUrl, - const char* semaphoreFilePath) { - return register_server_with_discovery_server(server, discoveryServerUrl, - UA_FALSE, semaphoreFilePath); +UA_Client_addRepeatedCallback(UA_Client *client, UA_ClientCallback callback, + void *data, UA_Double interval_ms, UA_UInt64 *callbackId) { + return UA_Timer_addRepeatedCallback(&client->timer, (UA_ApplicationCallback) callback, + client, data, interval_ms, callbackId); } UA_StatusCode -UA_Server_unregister_discovery(UA_Server *server, const char* discoveryServerUrl) { - return register_server_with_discovery_server(server, discoveryServerUrl, - UA_TRUE, NULL); +UA_Client_changeRepeatedCallbackInterval(UA_Client *client, UA_UInt64 callbackId, + UA_Double interval_ms) { + return UA_Timer_changeRepeatedCallbackInterval(&client->timer, callbackId, + interval_ms); } -#endif /* UA_ENABLE_DISCOVERY */ +void +UA_Client_removeCallback(UA_Client *client, UA_UInt64 callbackId) { + UA_Timer_removeCallback(&client->timer, callbackId); +} -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_securechannel_manager.c" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/client/ua_client_connect.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2014-2017 (c) Florian Palm - * Copyright 2015-2016 (c) Sten Grüner - * Copyright 2015 (c) Oleksiy Vasylyev - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA + * Copyright 2017-2019 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2018 (c) Kalycito Infotech Private Limited */ -#define STARTCHANNELID 1 -#define STARTTOKENID 1 -UA_StatusCode -UA_SecureChannelManager_init(UA_SecureChannelManager *cm, UA_Server *server) { - TAILQ_INIT(&cm->channels); - // TODO: use an ID that is likely to be unique after a restart - cm->lastChannelId = STARTCHANNELID; - cm->lastTokenId = STARTTOKENID; - cm->currentChannelCount = 0; - cm->server = server; - return UA_STATUSCODE_GOOD; -} +/* Size are refered in bytes */ +#define UA_MINMESSAGESIZE 8192 +#define UA_SESSION_LOCALNONCELENGTH 32 +#define MAX_DATA_SIZE 4096 + /********************/ + /* Set client state */ + /********************/ void -UA_SecureChannelManager_deleteMembers(UA_SecureChannelManager *cm) { - channel_entry *entry, *temp; - TAILQ_FOREACH_SAFE(entry, &cm->channels, pointers, temp) { - TAILQ_REMOVE(&cm->channels, entry, pointers); - UA_SecureChannel_deleteMembersCleanup(&entry->channel); - UA_free(entry); +setClientState(UA_Client *client, UA_ClientState state) { + if(client->state != state) { + client->state = state; + if(client->config.stateCallback) + client->config.stateCallback(client, client->state); } } -static void -removeSecureChannelCallback(UA_Server *server, void *entry) { - channel_entry *centry = (channel_entry *)entry; - UA_SecureChannel_deleteMembersCleanup(¢ry->channel); - UA_free(entry); -} +/***********************/ +/* Open the Connection */ +/***********************/ + +#define UA_BITMASK_MESSAGETYPE 0x00ffffffu +#define UA_BITMASK_CHUNKTYPE 0xff000000u static UA_StatusCode -removeSecureChannel(UA_SecureChannelManager *cm, channel_entry *entry) { - /* Add a delayed callback to remove the channel when the currently - * scheduled jobs have completed */ - UA_StatusCode retval = UA_Server_delayedCallback(cm->server, removeSecureChannelCallback, entry); +processACKResponse(void *application, UA_Connection *connection, UA_ByteString *chunk) { + UA_Client *client = (UA_Client*)application; + + /* Decode the message */ + size_t offset = 0; + UA_StatusCode retval; + UA_TcpMessageHeader messageHeader; + UA_TcpAcknowledgeMessage ackMessage; + retval = UA_TcpMessageHeader_decodeBinary(chunk, &offset, &messageHeader); if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_WARNING(cm->server->config.logger, UA_LOGCATEGORY_SESSION, - "Could not remove the secure channel with error code %s", - UA_StatusCode_name(retval)); - return retval; /* Try again next time */ + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_NETWORK, + "Decoding ACK message failed"); + return retval; } - /* Detach the channel and make the capacity available */ - TAILQ_REMOVE(&cm->channels, entry, pointers); - UA_atomic_subUInt32(&cm->currentChannelCount, 1); - return UA_STATUSCODE_GOOD; + // check if we got an error response from the server + UA_MessageType messageType = (UA_MessageType) + (messageHeader.messageTypeAndChunkType & UA_BITMASK_MESSAGETYPE); + UA_ChunkType chunkType = (UA_ChunkType) + (messageHeader.messageTypeAndChunkType & UA_BITMASK_CHUNKTYPE); + if (messageType == UA_MESSAGETYPE_ERR) { + // Header + ErrorMessage (error + reasonLength_field + length) + UA_StatusCode error = *(UA_StatusCode*)(&chunk->data[offset]); + UA_UInt32 len = *((UA_UInt32*)&chunk->data[offset + 4]); + UA_Byte *data = (UA_Byte*)&chunk->data[offset + 4+4]; + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_NETWORK, + "Received ERR response. %s - %.*s", UA_StatusCode_name(error), len, data); + return error; + } + if (chunkType != UA_CHUNKTYPE_FINAL) { + return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; + } + + /* Decode the ACK message */ + retval = UA_TcpAcknowledgeMessage_decodeBinary(chunk, &offset, &ackMessage); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_NETWORK, + "Decoding ACK message failed"); + return retval; + } + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_NETWORK, "Received ACK message"); + + /* Process the ACK message */ + return UA_Connection_processHELACK(connection, &client->config.localConnectionConfig, + (const UA_ConnectionConfig*)&ackMessage); } -/* remove channels that were not renewed or who have no connection attached */ -void -UA_SecureChannelManager_cleanupTimedOut(UA_SecureChannelManager *cm, UA_DateTime nowMonotonic) { - channel_entry *entry, *temp; - TAILQ_FOREACH_SAFE(entry, &cm->channels, pointers, temp) { - UA_DateTime timeout = entry->channel.securityToken.createdAt + - (UA_DateTime)(entry->channel.securityToken.revisedLifetime * UA_DATETIME_MSEC); - if(timeout < nowMonotonic || !entry->channel.connection) { - UA_LOG_INFO_CHANNEL(cm->server->config.logger, &entry->channel, - "SecureChannel has timed out"); - removeSecureChannel(cm, entry); - } else if(entry->channel.nextSecurityToken.tokenId > 0) { - UA_SecureChannel_revolveTokens(&entry->channel); - } +static UA_StatusCode +HelAckHandshake(UA_Client *client, const UA_String endpointUrl) { + /* Get a buffer */ + UA_ByteString message; + UA_Connection *conn = &client->connection; + UA_StatusCode retval = conn->getSendBuffer(conn, UA_MINMESSAGESIZE, &message); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + /* Prepare the HEL message and encode at offset 8 */ + UA_TcpHelloMessage hello; + /* just reference to avoid copy */ + hello.endpointUrl = endpointUrl; + memcpy(&hello, &client->config.localConnectionConfig, + sizeof(UA_ConnectionConfig)); /* same struct layout */ + + UA_Byte *bufPos = &message.data[8]; /* skip the header */ + const UA_Byte *bufEnd = &message.data[message.length]; + retval = UA_TcpHelloMessage_encodeBinary(&hello, &bufPos, bufEnd); + /* avoid deleting reference */ + hello.endpointUrl = UA_STRING_NULL; + UA_TcpHelloMessage_deleteMembers(&hello); + if(retval != UA_STATUSCODE_GOOD) { + conn->releaseSendBuffer(conn, &message); + return retval; + } + + /* Encode the message header at offset 0 */ + UA_TcpMessageHeader messageHeader; + messageHeader.messageTypeAndChunkType = UA_CHUNKTYPE_FINAL + UA_MESSAGETYPE_HEL; + messageHeader.messageSize = (UA_UInt32)((uintptr_t)bufPos - (uintptr_t)message.data); + bufPos = message.data; + retval = UA_TcpMessageHeader_encodeBinary(&messageHeader, &bufPos, bufEnd); + if(retval != UA_STATUSCODE_GOOD) { + conn->releaseSendBuffer(conn, &message); + return retval; + } + + /* Send the HEL message */ + message.length = messageHeader.messageSize; + retval = conn->send(conn, &message); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_NETWORK, + "Sending HEL failed"); + return retval; + } + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_NETWORK, + "Sent HEL message"); + + /* Loop until we have a complete chunk */ + retval = UA_Connection_receiveChunksBlocking(conn, client, processACKResponse, + client->config.timeout); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_NETWORK, + "Receiving ACK message failed with %s", UA_StatusCode_name(retval)); + if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED) + client->state = UA_CLIENTSTATE_DISCONNECTED; + UA_Client_disconnect(client); } + return retval; } -/* remove the first channel that has no session attached */ -static UA_Boolean -purgeFirstChannelWithoutSession(UA_SecureChannelManager *cm) { - channel_entry *entry; - TAILQ_FOREACH(entry, &cm->channels, pointers) { - if(LIST_EMPTY(&entry->channel.sessions)) { - UA_LOG_INFO_CHANNEL(cm->server->config.logger, &entry->channel, - "Channel was purged since maxSecureChannels was " - "reached and channel had no session attached"); - removeSecureChannel(cm, entry); - return true; - } +UA_SecurityPolicy * +getSecurityPolicy(UA_Client *client, UA_String policyUri) { + for(size_t i = 0; i < client->config.securityPoliciesSize; i++) { + if(UA_String_equal(&policyUri, &client->config.securityPolicies[i].policyUri)) + return &client->config.securityPolicies[i]; } - return false; + return NULL; +} + +static void +processDecodedOPNResponse(UA_Client *client, UA_OpenSecureChannelResponse *response, + UA_Boolean renew) { + /* Replace the token */ + if(renew) + client->channel.nextSecurityToken = response->securityToken; + else + client->channel.securityToken = response->securityToken; + + /* Replace the nonce */ + UA_ByteString_deleteMembers(&client->channel.remoteNonce); + client->channel.remoteNonce = response->serverNonce; + UA_ByteString_init(&response->serverNonce); + + if(client->channel.state == UA_SECURECHANNELSTATE_OPEN) + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "SecureChannel renewed"); + else + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Opened SecureChannel with SecurityPolicy %.*s", + (int)client->channel.securityPolicy->policyUri.length, + client->channel.securityPolicy->policyUri.data); + + /* Response.securityToken.revisedLifetime is UInt32 we need to cast it to + * DateTime=Int64 we take 75% of lifetime to start renewing as described in + * standard */ + client->channel.state = UA_SECURECHANNELSTATE_OPEN; + client->nextChannelRenewal = UA_DateTime_nowMonotonic() + (UA_DateTime) + (client->channel.securityToken.revisedLifetime * (UA_Double)UA_DATETIME_MSEC * 0.75); } UA_StatusCode -UA_SecureChannelManager_create(UA_SecureChannelManager *const cm, UA_Connection *const connection, - const UA_SecurityPolicy *const securityPolicy, - const UA_AsymmetricAlgorithmSecurityHeader *const asymHeader) { - /* connection already has a channel attached. */ - if(connection->channel != NULL) - return UA_STATUSCODE_BADINTERNALERROR; +openSecureChannel(UA_Client *client, UA_Boolean renew) { + /* Check if sc is still valid */ + if(renew && client->nextChannelRenewal > UA_DateTime_nowMonotonic()) + return UA_STATUSCODE_GOOD; - /* Check if there exists a free SC, otherwise try to purge one SC without a - * session the purge has been introduced to pass CTT, it is not clear what - * strategy is expected here */ - if(cm->currentChannelCount >= cm->server->config.maxSecureChannels && - !purgeFirstChannelWithoutSession(cm)) - return UA_STATUSCODE_BADOUTOFMEMORY; + UA_Connection *conn = &client->connection; + if(conn->state != UA_CONNECTION_ESTABLISHED) + return UA_STATUSCODE_BADSERVERNOTCONNECTED; - UA_LOG_INFO(cm->server->config.logger, UA_LOGCATEGORY_SECURECHANNEL, - "Creating a new SecureChannel"); + /* Generate clientNonce. */ + UA_StatusCode retval = UA_SecureChannel_generateLocalNonce(&client->channel); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Generating a local nonce failed"); + return retval; + } - channel_entry *entry = (channel_entry *)UA_malloc(sizeof(channel_entry)); - if(!entry) - return UA_STATUSCODE_BADOUTOFMEMORY; + /* Prepare the OpenSecureChannelRequest */ + UA_OpenSecureChannelRequest opnSecRq; + UA_OpenSecureChannelRequest_init(&opnSecRq); + opnSecRq.requestHeader.timestamp = UA_DateTime_now(); + opnSecRq.requestHeader.authenticationToken = client->authenticationToken; + if(renew) { + opnSecRq.requestType = UA_SECURITYTOKENREQUESTTYPE_RENEW; + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, + "Requesting to renew the SecureChannel"); + } else { + opnSecRq.requestType = UA_SECURITYTOKENREQUESTTYPE_ISSUE; + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, + "Requesting to open a SecureChannel"); + } - /* Create the channel context and parse the sender (remote) certificate used for the - * secureChannel. */ - UA_StatusCode retval = UA_SecureChannel_init(&entry->channel, securityPolicy, - &asymHeader->senderCertificate); + /* Set the securityMode to input securityMode from client data */ + opnSecRq.securityMode = client->channel.securityMode; + + opnSecRq.clientNonce = client->channel.localNonce; + opnSecRq.requestedLifetime = client->config.secureChannelLifeTime; + + /* Send the OPN message */ + UA_UInt32 requestId = ++client->requestId; + retval = UA_SecureChannel_sendAsymmetricOPNMessage(&client->channel, requestId, &opnSecRq, + &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); if(retval != UA_STATUSCODE_GOOD) { - UA_free(entry); + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, + "Sending OPN message failed with error %s", UA_StatusCode_name(retval)); + UA_Client_disconnect(client); return retval; } - /* Channel state is fresh (0) */ - entry->channel.securityToken.channelId = 0; - entry->channel.securityToken.tokenId = cm->lastTokenId++; - entry->channel.securityToken.createdAt = UA_DateTime_now(); - entry->channel.securityToken.revisedLifetime = cm->server->config.maxSecurityTokenLifetime; + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, "OPN message sent"); - TAILQ_INSERT_TAIL(&cm->channels, entry, pointers); - UA_atomic_addUInt32(&cm->currentChannelCount, 1); - UA_Connection_attachSecureChannel(connection, &entry->channel); - return UA_STATUSCODE_GOOD; -} + /* Increase nextChannelRenewal to avoid that we re-start renewal when + * publish responses are received before the OPN response arrives. */ + client->nextChannelRenewal = UA_DateTime_nowMonotonic() + + (2 * ((UA_DateTime)client->config.timeout * UA_DATETIME_MSEC)); -UA_StatusCode -UA_SecureChannelManager_open(UA_SecureChannelManager *cm, UA_SecureChannel *channel, - const UA_OpenSecureChannelRequest *request, - UA_OpenSecureChannelResponse *response) { - if(channel->state != UA_SECURECHANNELSTATE_FRESH) { - UA_LOG_ERROR_CHANNEL(cm->server->config.logger, channel, - "Called open on already open or closed channel"); - return UA_STATUSCODE_BADINTERNALERROR; - } + /* Receive / decrypt / decode the OPN response. Process async services in + * the background until the OPN response arrives. */ + UA_OpenSecureChannelResponse response; + retval = receiveServiceResponse(client, &response, + &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE], + UA_DateTime_nowMonotonic() + + ((UA_DateTime)client->config.timeout * UA_DATETIME_MSEC), + &requestId); - if(request->securityMode != UA_MESSAGESECURITYMODE_NONE && - UA_ByteString_equal(&channel->securityPolicy->policyUri, &UA_SECURITY_POLICY_NONE_URI)) { - return UA_STATUSCODE_BADSECURITYMODEREJECTED; + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, + "Receiving service response failed with error %s", UA_StatusCode_name(retval)); + UA_Client_disconnect(client); + return retval; } - channel->securityMode = request->securityMode; - channel->securityToken.createdAt = UA_DateTime_nowMonotonic(); - channel->securityToken.channelId = cm->lastChannelId++; - channel->securityToken.createdAt = UA_DateTime_now(); + processDecodedOPNResponse(client, &response, renew); + UA_OpenSecureChannelResponse_deleteMembers(&response); + return retval; +} - /* Set the lifetime. Lifetime 0 -> set the maximum possible */ - channel->securityToken.revisedLifetime = - (request->requestedLifetime > cm->server->config.maxSecurityTokenLifetime) ? - cm->server->config.maxSecurityTokenLifetime : request->requestedLifetime; - if(channel->securityToken.revisedLifetime == 0) - channel->securityToken.revisedLifetime = cm->server->config.maxSecurityTokenLifetime; +/* Function to verify the signature corresponds to ClientNonce + * using the local certificate */ +static UA_StatusCode +checkClientSignature(const UA_SecureChannel *channel, + const UA_CreateSessionResponse *response) { + if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && + channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) + return UA_STATUSCODE_GOOD; - /* Set the nonces and generate the keys */ - UA_StatusCode retval = UA_ByteString_copy(&request->clientNonce, &channel->remoteNonce); - retval |= UA_SecureChannel_generateLocalNonce(channel); - retval |= UA_SecureChannel_generateNewKeys(channel); - if(retval != UA_STATUSCODE_GOOD) - return retval; + if(!channel->securityPolicy) + return UA_STATUSCODE_BADINTERNALERROR; - /* Set the response */ - retval = UA_ByteString_copy(&channel->localNonce, &response->serverNonce); - retval |= UA_ChannelSecurityToken_copy(&channel->securityToken, &response->securityToken); - response->responseHeader.timestamp = UA_DateTime_now(); - response->responseHeader.requestHandle = request->requestHeader.requestHandle; + const UA_SecurityPolicy *sp = channel->securityPolicy; + const UA_ByteString *lc = &sp->localCertificate; + + size_t dataToVerifySize = lc->length + channel->localNonce.length; + UA_ByteString dataToVerify = UA_BYTESTRING_NULL; + UA_StatusCode retval = UA_ByteString_allocBuffer(&dataToVerify, dataToVerifySize); if(retval != UA_STATUSCODE_GOOD) return retval; - /* The channel is open */ - channel->state = UA_SECURECHANNELSTATE_OPEN; + memcpy(dataToVerify.data, lc->data, lc->length); + memcpy(dataToVerify.data + lc->length, + channel->localNonce.data, channel->localNonce.length); - return UA_STATUSCODE_GOOD; + retval = sp->certificateSigningAlgorithm. + verify(sp, channel->channelContext, &dataToVerify, + &response->serverSignature.signature); + UA_ByteString_deleteMembers(&dataToVerify); + return retval; } +/* Function to create a signature using remote certificate and nonce */ +#ifdef UA_ENABLE_ENCRYPTION UA_StatusCode -UA_SecureChannelManager_renew(UA_SecureChannelManager *cm, UA_SecureChannel *channel, - const UA_OpenSecureChannelRequest *request, - UA_OpenSecureChannelResponse *response) { - if(channel->state != UA_SECURECHANNELSTATE_OPEN) { - UA_LOG_ERROR_CHANNEL(cm->server->config.logger, channel, - "Called renew on channel which is not open"); - return UA_STATUSCODE_BADINTERNALERROR; - } +signActivateSessionRequest(UA_SecureChannel *channel, + UA_ActivateSessionRequest *request) { + if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && + channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) + return UA_STATUSCODE_GOOD; - /* If no security token is already issued */ - if(channel->nextSecurityToken.tokenId == 0) { - channel->nextSecurityToken.channelId = channel->securityToken.channelId; - channel->nextSecurityToken.tokenId = cm->lastTokenId++; - channel->nextSecurityToken.createdAt = UA_DateTime_now(); - channel->nextSecurityToken.revisedLifetime = - (request->requestedLifetime > cm->server->config.maxSecurityTokenLifetime) ? - cm->server->config.maxSecurityTokenLifetime : request->requestedLifetime; - if(channel->nextSecurityToken.revisedLifetime == 0) /* lifetime 0 -> return the max lifetime */ - channel->nextSecurityToken.revisedLifetime = cm->server->config.maxSecurityTokenLifetime; - } + const UA_SecurityPolicy *sp = channel->securityPolicy; + UA_SignatureData *sd = &request->clientSignature; - /* Replace the nonces */ - UA_ByteString_deleteMembers(&channel->remoteNonce); - UA_StatusCode retval = UA_ByteString_copy(&request->clientNonce, &channel->remoteNonce); - retval |= UA_SecureChannel_generateLocalNonce(channel); + /* Prepare the signature */ + size_t signatureSize = sp->certificateSigningAlgorithm. + getLocalSignatureSize(sp, channel->channelContext); + UA_StatusCode retval = UA_String_copy(&sp->certificateSigningAlgorithm.uri, + &sd->algorithm); if(retval != UA_STATUSCODE_GOOD) return retval; - /* Set the response */ - response->responseHeader.requestHandle = request->requestHeader.requestHandle; - retval = UA_ByteString_copy(&channel->localNonce, &response->serverNonce); - retval |= UA_ChannelSecurityToken_copy(&channel->nextSecurityToken, &response->securityToken); + retval = UA_ByteString_allocBuffer(&sd->signature, signatureSize); if(retval != UA_STATUSCODE_GOOD) return retval; - /* Reset the internal creation date to the monotonic clock */ - channel->nextSecurityToken.createdAt = UA_DateTime_nowMonotonic(); - return UA_STATUSCODE_GOOD; -} + /* Allocate a temporary buffer */ + size_t dataToSignSize = channel->remoteCertificate.length + channel->remoteNonce.length; + if(dataToSignSize > MAX_DATA_SIZE) + return UA_STATUSCODE_BADINTERNALERROR; -UA_SecureChannel * -UA_SecureChannelManager_get(UA_SecureChannelManager *cm, UA_UInt32 channelId) { - channel_entry *entry; - TAILQ_FOREACH(entry, &cm->channels, pointers) { - if(entry->channel.securityToken.channelId == channelId) - return &entry->channel; - } - return NULL; + UA_ByteString dataToSign; + retval = UA_ByteString_allocBuffer(&dataToSign, dataToSignSize); + if(retval != UA_STATUSCODE_GOOD) + return retval; /* sd->signature is cleaned up with the response */ + + /* Sign the signature */ + memcpy(dataToSign.data, channel->remoteCertificate.data, + channel->remoteCertificate.length); + memcpy(dataToSign.data + channel->remoteCertificate.length, + channel->remoteNonce.data, channel->remoteNonce.length); + retval = sp->certificateSigningAlgorithm.sign(sp, channel->channelContext, + &dataToSign, &sd->signature); + + /* Clean up */ + UA_ByteString_deleteMembers(&dataToSign); + return retval; } UA_StatusCode -UA_SecureChannelManager_close(UA_SecureChannelManager *cm, UA_UInt32 channelId) { - channel_entry *entry; - TAILQ_FOREACH(entry, &cm->channels, pointers) { - if(entry->channel.securityToken.channelId == channelId) - break; +encryptUserIdentityToken(UA_Client *client, const UA_String *userTokenSecurityPolicy, + UA_ExtensionObject *userIdentityToken) { + UA_IssuedIdentityToken *iit = NULL; + UA_UserNameIdentityToken *unit = NULL; + UA_ByteString *tokenData; + if(userIdentityToken->content.decoded.type == &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN]) { + iit = (UA_IssuedIdentityToken*)userIdentityToken->content.decoded.data; + tokenData = &iit->tokenData; + } else if(userIdentityToken->content.decoded.type == &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]) { + unit = (UA_UserNameIdentityToken*)userIdentityToken->content.decoded.data; + tokenData = &unit->password; + } else { + return UA_STATUSCODE_GOOD; } - if(!entry) + + /* No encryption */ + const UA_String none = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None"); + if(userTokenSecurityPolicy->length == 0 || + UA_String_equal(userTokenSecurityPolicy, &none)) { + return UA_STATUSCODE_GOOD; + } + + UA_SecurityPolicy *sp = getSecurityPolicy(client, *userTokenSecurityPolicy); + if(!sp) { + UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_NETWORK, + "Could not find the required SecurityPolicy for the UserToken"); + return UA_STATUSCODE_BADSECURITYPOLICYREJECTED; + } + + /* Create a temp channel context */ + + void *channelContext; + UA_StatusCode retval = sp->channelModule. + newContext(sp, &client->config.endpoint.serverCertificate, &channelContext); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_NETWORK, + "Could not instantiate the SecurityPolicy for the UserToken"); return UA_STATUSCODE_BADINTERNALERROR; - return removeSecureChannel(cm, entry); -} + } + + /* Compute the encrypted length (at least one byte padding) */ + size_t plainTextBlockSize = sp->asymmetricModule.cryptoModule. + encryptionAlgorithm.getRemotePlainTextBlockSize(sp, channelContext); + UA_UInt32 length = (UA_UInt32)(tokenData->length + client->channel.remoteNonce.length); + UA_UInt32 totalLength = length + 4; /* Including the length field */ + size_t blocks = totalLength / plainTextBlockSize; + if(totalLength % plainTextBlockSize != 0) + blocks++; + size_t overHead = + UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(sp, channelContext, + blocks * plainTextBlockSize); + + /* Allocate memory for encryption overhead */ + UA_ByteString encrypted; + retval = UA_ByteString_allocBuffer(&encrypted, (blocks * plainTextBlockSize) + overHead); + if(retval != UA_STATUSCODE_GOOD) { + sp->channelModule.deleteContext(channelContext); + return UA_STATUSCODE_BADOUTOFMEMORY; + } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_session_manager.c" ***********************************/ + UA_Byte *pos = encrypted.data; + const UA_Byte *end = &encrypted.data[encrypted.length]; + UA_UInt32_encodeBinary(&length, &pos, end); + memcpy(pos, tokenData->data, tokenData->length); + memcpy(&pos[tokenData->length], client->channel.remoteNonce.data, + client->channel.remoteNonce.length); -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2014, 2017 (c) Florian Palm - * Copyright 2015 (c) Sten Grüner - * Copyright 2015 (c) Oleksiy Vasylyev - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - */ + /* Add padding + * + * 7.36.2.2 Legacy Encrypted Token Secret Format: A Client should not add any + * padding after the secret. If a Client adds padding then all bytes shall + * be zero. A Server shall check for padding added by Clients and ensure + * that all padding bytes are zeros. */ + size_t paddedLength = plainTextBlockSize * blocks; + for(size_t i = totalLength; i < paddedLength; i++) + encrypted.data[i] = 0; + encrypted.length = paddedLength; + + retval = sp->asymmetricModule.cryptoModule.encryptionAlgorithm.encrypt(sp, channelContext, + &encrypted); + encrypted.length = (blocks * plainTextBlockSize) + overHead; + + if(iit) { + retval |= UA_String_copy(&sp->asymmetricModule.cryptoModule.encryptionAlgorithm.uri, + &iit->encryptionAlgorithm); + } else { + retval |= UA_String_copy(&sp->asymmetricModule.cryptoModule.encryptionAlgorithm.uri, + &unit->encryptionAlgorithm); + } + UA_ByteString_deleteMembers(tokenData); + *tokenData = encrypted; -UA_StatusCode -UA_SessionManager_init(UA_SessionManager *sm, UA_Server *server) { - LIST_INIT(&sm->sessions); - sm->currentSessionCount = 0; - sm->server = server; - return UA_STATUSCODE_GOOD; -} + /* Delete the temp channel context */ + sp->channelModule.deleteContext(channelContext); -/* Delayed callback to free the session memory */ -static void -removeSessionCallback(UA_Server *server, void *entry) { - session_list_entry *sentry = (session_list_entry*)entry; - UA_Session_deleteMembersCleanup(&sentry->session, server); - UA_free(sentry); + return retval; } +#endif static UA_StatusCode -removeSession(UA_SessionManager *sm, session_list_entry *sentry) { - /* Remove the Subscriptions */ -#ifdef UA_ENABLE_SUBSCRIPTIONS - UA_Subscription *sub, *tempsub; - LIST_FOREACH_SAFE(sub, &sentry->session.serverSubscriptions, listEntry, tempsub) { - UA_Session_deleteSubscription(sm->server, &sentry->session, sub->subscriptionId); - } +activateSession(UA_Client *client) { + UA_ActivateSessionRequest request; + UA_ActivateSessionRequest_init(&request); + request.requestHeader.requestHandle = ++client->requestHandle; + request.requestHeader.timestamp = UA_DateTime_now(); + request.requestHeader.timeoutHint = 600000; + UA_StatusCode retval = + UA_ExtensionObject_copy(&client->config.userIdentityToken, &request.userIdentityToken); + if(retval != UA_STATUSCODE_GOOD) + return retval; - UA_PublishResponseEntry *entry; - while((entry = UA_Session_dequeuePublishReq(&sentry->session))) { - UA_PublishResponse_deleteMembers(&entry->response); - UA_free(entry); + /* If not token is set, use anonymous */ + if(request.userIdentityToken.encoding == UA_EXTENSIONOBJECT_ENCODED_NOBODY) { + UA_AnonymousIdentityToken *t = UA_AnonymousIdentityToken_new(); + if(!t) { + UA_ActivateSessionRequest_deleteMembers(&request); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + request.userIdentityToken.content.decoded.data = t; + request.userIdentityToken.content.decoded.type = &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]; + request.userIdentityToken.encoding = UA_EXTENSIONOBJECT_DECODED; } -#endif - /* Detach the Session from the SecureChannel */ - UA_Session_detachFromSecureChannel(&sentry->session); + /* Set the policy-Id from the endpoint. Every IdentityToken starts with a + * string. */ + retval = UA_String_copy(&client->config.userTokenPolicy.policyId, + (UA_String*)request.userIdentityToken.content.decoded.data); - /* Deactivate the session */ - sentry->session.activated = false; +#ifdef UA_ENABLE_ENCRYPTION + /* Encrypt the UserIdentityToken */ + const UA_String *userTokenPolicy = &client->channel.securityPolicy->policyUri; + if(client->config.userTokenPolicy.securityPolicyUri.length > 0) + userTokenPolicy = &client->config.userTokenPolicy.securityPolicyUri; + retval |= encryptUserIdentityToken(client, userTokenPolicy, &request.userIdentityToken); + + /* This function call is to prepare a client signature */ + retval |= signActivateSessionRequest(&client->channel, &request); +#endif - /* Add a delayed callback to remove the session when the currently - * scheduled jobs have completed */ - UA_StatusCode retval = UA_Server_delayedCallback(sm->server, removeSessionCallback, sentry); if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_WARNING_SESSION(sm->server->config.logger, &sentry->session, - "Could not remove session with error code %s", - UA_StatusCode_name(retval)); - return retval; /* Try again next time */ + UA_ActivateSessionRequest_deleteMembers(&request); + return retval; } - /* Detach the session from the session manager and make the capacity - * available */ - LIST_REMOVE(sentry, pointers); - UA_atomic_subUInt32(&sm->currentSessionCount, 1); - return UA_STATUSCODE_GOOD; -} + UA_ActivateSessionResponse response; + __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST], + &response, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]); -void UA_SessionManager_deleteMembers(UA_SessionManager *sm) { - session_list_entry *current, *temp; - LIST_FOREACH_SAFE(current, &sm->sessions, pointers, temp) { - removeSession(sm, current); + if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "ActivateSession failed with error code %s", + UA_StatusCode_name(response.responseHeader.serviceResult)); } + + retval = response.responseHeader.serviceResult; + UA_ActivateSessionRequest_deleteMembers(&request); + UA_ActivateSessionResponse_deleteMembers(&response); + return retval; } -void -UA_SessionManager_cleanupTimedOut(UA_SessionManager *sm, - UA_DateTime nowMonotonic) { - session_list_entry *sentry, *temp; - LIST_FOREACH_SAFE(sentry, &sm->sessions, pointers, temp) { - /* Session has timed out? */ - if(sentry->session.validTill >= nowMonotonic) - continue; - UA_LOG_INFO_SESSION(sm->server->config.logger, &sentry->session, - "Session has timed out"); - sm->server->config.accessControl.closeSession(sm->server, - &sm->server->config.accessControl, - &sentry->session.sessionId, - sentry->session.sessionHandle); - removeSession(sm, sentry); +/* Gets a list of endpoints. Memory is allocated for endpointDescription array */ +UA_StatusCode +UA_Client_getEndpointsInternal(UA_Client *client, const UA_String endpointUrl, + size_t *endpointDescriptionsSize, + UA_EndpointDescription **endpointDescriptions) { + UA_GetEndpointsRequest request; + UA_GetEndpointsRequest_init(&request); + request.requestHeader.timestamp = UA_DateTime_now(); + request.requestHeader.timeoutHint = 10000; + // assume the endpointurl outlives the service call + request.endpointUrl = endpointUrl; + + UA_GetEndpointsResponse response; + __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST], + &response, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]); + + if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_StatusCode retval = response.responseHeader.serviceResult; + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "GetEndpointRequest failed with error code %s", + UA_StatusCode_name(retval)); + UA_GetEndpointsResponse_deleteMembers(&response); + return retval; } + *endpointDescriptions = response.endpoints; + *endpointDescriptionsSize = response.endpointsSize; + response.endpoints = NULL; + response.endpointsSize = 0; + UA_GetEndpointsResponse_deleteMembers(&response); + return UA_STATUSCODE_GOOD; } -UA_Session * -UA_SessionManager_getSessionByToken(UA_SessionManager *sm, const UA_NodeId *token) { - session_list_entry *current = NULL; - LIST_FOREACH(current, &sm->sessions, pointers) { - /* Token does not match */ - if(!UA_NodeId_equal(¤t->session.header.authenticationToken, token)) +static UA_StatusCode +selectEndpoint(UA_Client *client, const UA_String endpointUrl) { + UA_EndpointDescription* endpointArray = NULL; + size_t endpointArraySize = 0; + UA_StatusCode retval = + UA_Client_getEndpointsInternal(client, endpointUrl, + &endpointArraySize, &endpointArray); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + UA_Boolean endpointFound = false; + UA_Boolean tokenFound = false; + UA_String binaryTransport = UA_STRING("http://opcfoundation.org/UA-Profile/" + "Transport/uatcp-uasc-uabinary"); + + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Found %lu endpoints", (long unsigned)endpointArraySize); + for(size_t i = 0; i < endpointArraySize; ++i) { + UA_EndpointDescription* endpoint = &endpointArray[i]; + /* Match Binary TransportProfile? + * Note: Siemens returns empty ProfileUrl, we will accept it as binary */ + if(endpoint->transportProfileUri.length != 0 && + !UA_String_equal(&endpoint->transportProfileUri, &binaryTransport)) continue; - /* Session has timed out */ - if(UA_DateTime_nowMonotonic() > current->session.validTill) { - UA_LOG_INFO_SESSION(sm->server->config.logger, ¤t->session, - "Client tries to use a session that has timed out"); - return NULL; + /* Valid SecurityMode? */ + if(endpoint->securityMode < 1 || endpoint->securityMode > 3) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting endpoint %lu: invalid security mode", (long unsigned)i); + continue; } - /* Ok, return */ - return ¤t->session; - } + /* Selected SecurityMode? */ + if(client->config.securityMode > 0 && + client->config.securityMode != endpoint->securityMode) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting endpoint %lu: security mode doesn't match", (long unsigned)i); + continue; + } - /* Session not found */ - UA_LOG_INFO(sm->server->config.logger, UA_LOGCATEGORY_SESSION, - "Try to use Session with token " UA_PRINTF_GUID_FORMAT " but is not found", - UA_PRINTF_GUID_DATA(token->identifier.guid)); - return NULL; -} + /* Matching SecurityPolicy? */ + if(client->config.securityPolicyUri.length > 0 && + !UA_String_equal(&client->config.securityPolicyUri, + &endpoint->securityPolicyUri)) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting endpoint %lu: security policy doesn't match", (long unsigned)i); + continue; + } -UA_Session * -UA_SessionManager_getSessionById(UA_SessionManager *sm, const UA_NodeId *sessionId) { - session_list_entry *current = NULL; - LIST_FOREACH(current, &sm->sessions, pointers) { - /* Token does not match */ - if(!UA_NodeId_equal(¤t->session.sessionId, sessionId)) + /* SecurityPolicy available? */ + if(!getSecurityPolicy(client, endpoint->securityPolicyUri)) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting endpoint %lu: security policy not available", (long unsigned)i); continue; + } - /* Session has timed out */ - if(UA_DateTime_nowMonotonic() > current->session.validTill) { - UA_LOG_INFO_SESSION(sm->server->config.logger, ¤t->session, - "Client tries to use a session that has timed out"); - return NULL; + endpointFound = true; + + /* Select a matching UserTokenPolicy inside the endpoint */ + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Endpoint %lu has %lu user token policies", (long unsigned)i, (long unsigned)endpoint->userIdentityTokensSize); + for(size_t j = 0; j < endpoint->userIdentityTokensSize; ++j) { + UA_UserTokenPolicy* userToken = &endpoint->userIdentityTokens[j]; + + /* Usertokens also have a security policy... */ + if (userToken->tokenType != UA_USERTOKENTYPE_ANONYMOUS && + userToken->securityPolicyUri.length > 0 && + !getSecurityPolicy(client, userToken->securityPolicyUri)) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting UserTokenPolicy %lu in endpoint %lu: security policy '%.*s' not available", + (long unsigned)j, (long unsigned)i, + (int)userToken->securityPolicyUri.length, userToken->securityPolicyUri.data); + continue; + } + + if(userToken->tokenType > 3) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting UserTokenPolicy %lu in endpoint %lu: invalid token type", (long unsigned)j, (long unsigned)i); + continue; + } + + /* Does the token type match the client configuration? */ + if (userToken->tokenType == UA_USERTOKENTYPE_ANONYMOUS && + client->config.userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN] && + client->config.userIdentityToken.content.decoded.type != NULL) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting UserTokenPolicy %lu (anonymous) in endpoint %lu: configuration doesn't match", (long unsigned)j, (long unsigned)i); + continue; + } + if (userToken->tokenType == UA_USERTOKENTYPE_USERNAME && + client->config.userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting UserTokenPolicy %lu (username) in endpoint %lu: configuration doesn't match", (long unsigned)j, (long unsigned)i); + continue; + } + if (userToken->tokenType == UA_USERTOKENTYPE_CERTIFICATE && + client->config.userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN]) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting UserTokenPolicy %lu (certificate) in endpoint %lu: configuration doesn't match", (long unsigned)j, (long unsigned)i); + continue; + } + if (userToken->tokenType == UA_USERTOKENTYPE_ISSUEDTOKEN && + client->config.userIdentityToken.content.decoded.type != &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN]) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Rejecting UserTokenPolicy %lu (token) in endpoint %lu: configuration doesn't match", (long unsigned)j, (long unsigned)i); + continue; + } + + /* Endpoint with matching UserTokenPolicy found. Copy to the configuration. */ + tokenFound = true; + UA_EndpointDescription_deleteMembers(&client->config.endpoint); + UA_EndpointDescription temp = *endpoint; + temp.userIdentityTokensSize = 0; + temp.userIdentityTokens = NULL; + UA_UserTokenPolicy_deleteMembers(&client->config.userTokenPolicy); + + retval = UA_EndpointDescription_copy(&temp, &client->config.endpoint); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Copying endpoint description failed with error code %s", + UA_StatusCode_name(retval)); + break; + } + + retval = UA_UserTokenPolicy_copy(userToken, &client->config.userTokenPolicy); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Copying user token policy failed with error code %s", + UA_StatusCode_name(retval)); + break; + } + +#if UA_LOGLEVEL <= 300 + const char *securityModeNames[3] = {"None", "Sign", "SignAndEncrypt"}; + const char *userTokenTypeNames[4] = {"Anonymous", "UserName", + "Certificate", "IssuedToken"}; + UA_String *securityPolicyUri = &userToken->securityPolicyUri; + if(securityPolicyUri->length == 0) + securityPolicyUri = &endpoint->securityPolicyUri; + + /* Log the selected endpoint */ + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Selected Endpoint %.*s with SecurityMode %s and SecurityPolicy %.*s", + (int)endpoint->endpointUrl.length, endpoint->endpointUrl.data, + securityModeNames[endpoint->securityMode - 1], + (int)endpoint->securityPolicyUri.length, + endpoint->securityPolicyUri.data); + + /* Log the selected UserTokenPolicy */ + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Selected UserTokenPolicy %.*s with UserTokenType %s and SecurityPolicy %.*s", + (int)userToken->policyId.length, userToken->policyId.data, + userTokenTypeNames[userToken->tokenType], + (int)securityPolicyUri->length, securityPolicyUri->data); +#endif + break; } - /* Ok, return */ - return ¤t->session; + if(tokenFound) + break; } - /* Session not found */ - UA_LOG_INFO(sm->server->config.logger, UA_LOGCATEGORY_SESSION, - "Try to use Session with identifier " UA_PRINTF_GUID_FORMAT " but is not found", - UA_PRINTF_GUID_DATA(sessionId->identifier.guid)); - return NULL; + UA_Array_delete(endpointArray, endpointArraySize, + &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); + + if(retval != UA_STATUSCODE_GOOD) + return retval; + + if(!endpointFound) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "No suitable endpoint found"); + retval = UA_STATUSCODE_BADINTERNALERROR; + } else if(!tokenFound) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "No suitable UserTokenPolicy found for the possible endpoints"); + retval = UA_STATUSCODE_BADINTERNALERROR; + } + return retval; } -/* Creates and adds a session. But it is not yet attached to a secure channel. */ -UA_StatusCode -UA_SessionManager_createSession(UA_SessionManager *sm, UA_SecureChannel *channel, - const UA_CreateSessionRequest *request, UA_Session **session) { - if(sm->currentSessionCount >= sm->server->config.maxSessions) - return UA_STATUSCODE_BADTOOMANYSESSIONS; +static UA_StatusCode +createSession(UA_Client *client) { + UA_CreateSessionRequest request; + UA_CreateSessionRequest_init(&request); + UA_StatusCode retval = UA_STATUSCODE_GOOD; - session_list_entry *newentry = (session_list_entry *)UA_malloc(sizeof(session_list_entry)); - if(!newentry) - return UA_STATUSCODE_BADOUTOFMEMORY; + if(client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGN || + client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { + if(client->channel.localNonce.length != UA_SESSION_LOCALNONCELENGTH) { + UA_ByteString_deleteMembers(&client->channel.localNonce); + retval = UA_ByteString_allocBuffer(&client->channel.localNonce, + UA_SESSION_LOCALNONCELENGTH); + if(retval != UA_STATUSCODE_GOOD) + return retval; + } - UA_atomic_addUInt32(&sm->currentSessionCount, 1); - UA_Session_init(&newentry->session); - newentry->session.sessionId = UA_NODEID_GUID(1, UA_Guid_random()); - newentry->session.header.authenticationToken = UA_NODEID_GUID(1, UA_Guid_random()); + retval = client->channel.securityPolicy->symmetricModule. + generateNonce(client->channel.securityPolicy, &client->channel.localNonce); + if(retval != UA_STATUSCODE_GOOD) + return retval; + } - if(request->requestedSessionTimeout <= sm->server->config.maxSessionTimeout && - request->requestedSessionTimeout > 0) - newentry->session.timeout = request->requestedSessionTimeout; - else - newentry->session.timeout = sm->server->config.maxSessionTimeout; + request.requestHeader.timestamp = UA_DateTime_now(); + request.requestHeader.timeoutHint = 10000; + UA_ByteString_copy(&client->channel.localNonce, &request.clientNonce); + request.requestedSessionTimeout = client->config.requestedSessionTimeout; + request.maxResponseMessageSize = UA_INT32_MAX; + UA_String_copy(&client->config.endpoint.endpointUrl, &request.endpointUrl); - UA_Session_updateLifetime(&newentry->session); - LIST_INSERT_HEAD(&sm->sessions, newentry, pointers); - *session = &newentry->session; - return UA_STATUSCODE_GOOD; + UA_ApplicationDescription_copy(&client->config.clientDescription, + &request.clientDescription); + + if(client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGN || + client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { + UA_ByteString_copy(&client->channel.securityPolicy->localCertificate, + &request.clientCertificate); + } + + UA_CreateSessionResponse response; + __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST], + &response, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]); + + if(response.responseHeader.serviceResult == UA_STATUSCODE_GOOD) { + /* Verify the encrypted response */ + if(client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGN || + client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { + + if(!UA_ByteString_equal(&response.serverCertificate, + &client->channel.remoteCertificate)) { + retval = UA_STATUSCODE_BADCERTIFICATEINVALID; + goto cleanup; + } + + /* Verify the client signature */ + retval = checkClientSignature(&client->channel, &response); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; + } + + /* Copy nonce and and authenticationtoken */ + UA_ByteString_deleteMembers(&client->channel.remoteNonce); + retval |= UA_ByteString_copy(&response.serverNonce, &client->channel.remoteNonce); + + UA_NodeId_deleteMembers(&client->authenticationToken); + retval |= UA_NodeId_copy(&response.authenticationToken, &client->authenticationToken); + } + + retval |= response.responseHeader.serviceResult; + + cleanup: + UA_CreateSessionRequest_deleteMembers(&request); + UA_CreateSessionResponse_deleteMembers(&response); + return retval; } UA_StatusCode -UA_SessionManager_removeSession(UA_SessionManager *sm, const UA_NodeId *token) { - session_list_entry *current; - LIST_FOREACH(current, &sm->sessions, pointers) { - if(UA_NodeId_equal(¤t->session.header.authenticationToken, token)) - break; +UA_Client_connectTCPSecureChannel(UA_Client *client, const UA_String endpointUrl) { + if(client->state >= UA_CLIENTSTATE_CONNECTED) + return UA_STATUSCODE_GOOD; + + UA_ChannelSecurityToken_init(&client->channel.securityToken); + client->channel.state = UA_SECURECHANNELSTATE_FRESH; + client->channel.sendSequenceNumber = 0; + client->requestId = 0; + + /* Set the channel SecurityMode */ + client->channel.securityMode = client->config.endpoint.securityMode; + if(client->channel.securityMode == UA_MESSAGESECURITYMODE_INVALID) + client->channel.securityMode = UA_MESSAGESECURITYMODE_NONE; + + /* Initialized the SecureChannel */ + UA_StatusCode retval = UA_STATUSCODE_GOOD; + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Initialize the SecurityPolicy context"); + if(!client->channel.securityPolicy) { + /* Set the channel SecurityPolicy to #None if no endpoint is selected */ + UA_String sps = client->config.endpoint.securityPolicyUri; + if(sps.length == 0) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "SecurityPolicy not specified -> use default #None"); + sps = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None"); + } + + UA_SecurityPolicy *sp = getSecurityPolicy(client, sps); + if(!sp) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Failed to find the required security policy"); + retval = UA_STATUSCODE_BADINTERNALERROR; + goto cleanup; + } + + + retval = UA_SecureChannel_setSecurityPolicy(&client->channel, sp, + &client->config.endpoint.serverCertificate); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Failed to set the security policy"); + goto cleanup; + } } - if(!current) - return UA_STATUSCODE_BADSESSIONIDINVALID; - return removeSession(sm, current); + + /* Open a TCP connection */ + client->connection = client->config.connectionFunc(client->config.localConnectionConfig, + endpointUrl, client->config.timeout, + &client->config.logger); + if(client->connection.state != UA_CONNECTION_OPENING) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Opening the TCP socket failed"); + retval = UA_STATUSCODE_BADCONNECTIONCLOSED; + goto cleanup; + } + + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "TCP connection established"); + + /* Perform the HEL/ACK handshake */ + client->connection.config = client->config.localConnectionConfig; + retval = HelAckHandshake(client, endpointUrl); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "HEL/ACK handshake failed"); + goto cleanup; + } + setClientState(client, UA_CLIENTSTATE_CONNECTED); + + /* Open a SecureChannel. */ + client->channel.connection = &client->connection; + retval = openSecureChannel(client, false); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Opening a secure channel failed"); + goto cleanup; + } + retval = UA_SecureChannel_generateNewKeys(&client->channel); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Generating new keys failed"); + return retval; + } + setClientState(client, UA_CLIENTSTATE_SECURECHANNEL); + + return retval; + +cleanup: + UA_Client_disconnect(client); + return retval; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_subscription.c" ***********************************/ +UA_StatusCode +UA_Client_connectSession(UA_Client *client) { + if(client->state < UA_CLIENTSTATE_SECURECHANNEL) + return UA_STATUSCODE_BADINTERNALERROR; -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2015-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2015 (c) Chris Iatrou - * Copyright 2015-2016 (c) Sten Grüner - * Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA - * Copyright 2015 (c) Joakim L. Gilje - * Copyright 2016-2017 (c) Florian Palm - * Copyright 2015-2016 (c) Oleksiy Vasylyev - * Copyright 2017 (c) frax2222 - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) Mattias Bornhager - * Copyright 2018 (c) Hilscher Gesellschaft für Systemautomation mbH (Author: Martin Lang) - */ + /* Delete async service. TODO: Move this from connect to the disconnect/cleanup phase */ + UA_Client_AsyncService_removeAll(client, UA_STATUSCODE_BADSHUTDOWN); + // TODO: actually, reactivate an existing session is working, but currently + // republish is not implemented This option is disabled until we have a good + // implementation of the subscription recovery. -#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */ +#ifdef UA_SESSION_RECOVERY + /* Try to activate an existing Session for this SecureChannel */ + if((!UA_NodeId_equal(&client->authenticationToken, &UA_NODEID_NULL)) && (createNewSession)) { + UA_StatusCode res = activateSession(client); + if(res != UA_STATUSCODE_BADSESSIONIDINVALID) { + if(res == UA_STATUSCODE_GOOD) { + setClientState(client, UA_CLIENTSTATE_SESSION_RENEWED); + } else { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Could not activate the Session with StatusCode %s", + UA_StatusCode_name(retval)); + UA_Client_disconnect(client); + } + return res; + } + } +#endif /* UA_SESSION_RECOVERY */ -UA_Subscription * -UA_Subscription_new(UA_Session *session, UA_UInt32 subscriptionId) { - /* Allocate the memory */ - UA_Subscription *newSub = - (UA_Subscription*)UA_calloc(1, sizeof(UA_Subscription)); - if(!newSub) - return NULL; + /* Could not recover an old session. Remove authenticationToken */ + UA_NodeId_deleteMembers(&client->authenticationToken); - /* Remaining members are covered by calloc zeroing out the memory */ - newSub->session = session; - newSub->subscriptionId = subscriptionId; - newSub->state = UA_SUBSCRIPTIONSTATE_NORMAL; /* The first publish response is sent immediately */ - /* Even if the first publish response is a keepalive the sequence number is 1. - * This can happen by a subscription without a monitored item (see CTT test scripts). */ - newSub->nextSequenceNumber = 1; - TAILQ_INIT(&newSub->retransmissionQueue); - TAILQ_INIT(&newSub->notificationQueue); - return newSub; + /* Create a session */ + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT, "Create a new session"); + UA_StatusCode retval = createSession(client); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Could not open a Session with StatusCode %s", + UA_StatusCode_name(retval)); + UA_Client_disconnect(client); + return retval; + } + + /* A new session has been created. We need to clean up the subscriptions */ +#ifdef UA_ENABLE_SUBSCRIPTIONS + UA_Client_Subscriptions_clean(client); + client->currentlyOutStandingPublishRequests = 0; +#endif + + /* Activate the session */ + retval = activateSession(client); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Could not activate the Session with StatusCode %s", + UA_StatusCode_name(retval)); + UA_Client_disconnect(client); + return retval; + } + setClientState(client, UA_CLIENTSTATE_SESSION); + return retval; +} + +#ifdef UA_ENABLE_ENCRYPTION +/* The local ApplicationURI has to match the certificates of the + * SecurityPolicies */ +static void +verifyClientApplicationURI(const UA_Client *client) { +#if UA_LOGLEVEL <= 400 + for(size_t i = 0; i < client->config.securityPoliciesSize; i++) { + UA_SecurityPolicy *sp = &client->config.securityPolicies[i]; + if(!sp->certificateVerification) + continue; + UA_StatusCode retval = + sp->certificateVerification-> + verifyApplicationURI(sp->certificateVerification->context, + &sp->localCertificate, + &client->config.clientDescription.applicationUri); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "The configured ApplicationURI does not match the URI " + "specified in the certificate for the SecurityPolicy %.*s", + (int)sp->policyUri.length, sp->policyUri.data); + } + } +#endif } +#endif -void -UA_Subscription_deleteMembers(UA_Server *server, UA_Subscription *sub) { - Subscription_unregisterPublishCallback(server, sub); +UA_StatusCode +UA_Client_connectInternal(UA_Client *client, const UA_String endpointUrl) { + if(client->state >= UA_CLIENTSTATE_CONNECTED) + return UA_STATUSCODE_GOOD; - /* Delete monitored Items */ - UA_MonitoredItem *mon, *tmp_mon; - LIST_FOREACH_SAFE(mon, &sub->monitoredItems, listEntry, tmp_mon) { - UA_LOG_INFO_SESSION(server->config.logger, sub->session, - "Subscription %u | MonitoredItem %i | " - "Deleted the MonitoredItem", sub->subscriptionId, - mon->monitoredItemId); - MonitoredItem_delete(server, mon); + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Connecting to endpoint %.*s", (int)endpointUrl.length, + endpointUrl.data); + +#ifdef UA_ENABLE_ENCRYPTION + verifyClientApplicationURI(client); +#endif + + /* Get endpoints only if the description has not been touched (memset to zero) */ + UA_Byte test = 0; + UA_Byte *pos = (UA_Byte*)&client->config.endpoint; + for(size_t i = 0; i < sizeof(UA_EndpointDescription); i++) + test = test | pos[i]; + pos = (UA_Byte*)&client->config.userTokenPolicy; + for(size_t i = 0; i < sizeof(UA_UserTokenPolicy); i++) + test = test | pos[i]; + UA_Boolean getEndpoints = (test == 0); + + /* Connect up to the SecureChannel */ + UA_StatusCode retval = UA_Client_connectTCPSecureChannel(client, endpointUrl); + if (retval != UA_STATUSCODE_GOOD) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Couldn't connect the client to a TCP secure channel"); + goto cleanup; } - sub->monitoredItemsSize = 0; + + /* Get and select endpoints if required */ + if(getEndpoints) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Endpoint and UserTokenPolicy unconfigured, perform GetEndpoints"); + retval = selectEndpoint(client, endpointUrl); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; - /* Delete Retransmission Queue */ - UA_NotificationMessageEntry *nme, *nme_tmp; - TAILQ_FOREACH_SAFE(nme, &sub->retransmissionQueue, listEntry, nme_tmp) { - TAILQ_REMOVE(&sub->retransmissionQueue, nme, listEntry); - UA_NotificationMessage_deleteMembers(&nme->message); - UA_free(nme); - --sub->session->totalRetransmissionQueueSize; - --sub->retransmissionQueueSize; + /* Reconnect with a new SecureChannel if the current one does not match + * the selected endpoint */ + if(!UA_String_equal(&client->config.endpoint.securityPolicyUri, + &client->channel.securityPolicy->policyUri)) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Disconnect to switch to a different SecurityPolicy"); + UA_Client_disconnect(client); + return UA_Client_connectInternal(client, endpointUrl); + } } - UA_assert(sub->retransmissionQueueSize == 0); - UA_LOG_INFO_SESSION(server->config.logger, sub->session, - "Subscription %u | Deleted the Subscription", - sub->subscriptionId); -} + retval = UA_Client_connectSession(client); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; -UA_MonitoredItem * -UA_Subscription_getMonitoredItem(UA_Subscription *sub, UA_UInt32 monitoredItemId) { - UA_MonitoredItem *mon; - LIST_FOREACH(mon, &sub->monitoredItems, listEntry) { - if(mon->monitoredItemId == monitoredItemId) - break; - } - return mon; + return retval; + +cleanup: + UA_Client_disconnect(client); + return retval; } UA_StatusCode -UA_Subscription_deleteMonitoredItem(UA_Server *server, UA_Subscription *sub, - UA_UInt32 monitoredItemId) { - /* Find the MonitoredItem */ - UA_MonitoredItem *mon; - LIST_FOREACH(mon, &sub->monitoredItems, listEntry) { - if(mon->monitoredItemId == monitoredItemId) - break; - } - if(!mon) - return UA_STATUSCODE_BADMONITOREDITEMIDINVALID; - - UA_LOG_INFO_SESSION(server->config.logger, sub->session, - "Subscription %u | MonitoredItem %i | " - "Delete the MonitoredItem", sub->subscriptionId, - mon->monitoredItemId); +UA_Client_connect(UA_Client *client, const char *endpointUrl) { + return UA_Client_connectInternal(client, UA_STRING((char*)(uintptr_t)endpointUrl)); +} - /* Remove the MonitoredItem */ - MonitoredItem_delete(server, mon); - sub->monitoredItemsSize--; - return UA_STATUSCODE_GOOD; +UA_StatusCode +UA_Client_connect_noSession(UA_Client *client, const char *endpointUrl) { + return UA_Client_connectTCPSecureChannel(client, UA_STRING((char*)(uintptr_t)endpointUrl)); } -void -UA_Subscription_addMonitoredItem(UA_Subscription *sub, UA_MonitoredItem *newMon) { - sub->monitoredItemsSize++; - LIST_INSERT_HEAD(&sub->monitoredItems, newMon, listEntry); +UA_StatusCode +UA_Client_connect_username(UA_Client *client, const char *endpointUrl, + const char *username, const char *password) { + UA_UserNameIdentityToken* identityToken = UA_UserNameIdentityToken_new(); + if(!identityToken) + return UA_STATUSCODE_BADOUTOFMEMORY; + identityToken->userName = UA_STRING_ALLOC(username); + identityToken->password = UA_STRING_ALLOC(password); + UA_ExtensionObject_deleteMembers(&client->config.userIdentityToken); + client->config.userIdentityToken.encoding = UA_EXTENSIONOBJECT_DECODED; + client->config.userIdentityToken.content.decoded.type = &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]; + client->config.userIdentityToken.content.decoded.data = identityToken; + return UA_Client_connect(client, endpointUrl); } -static void -removeOldestRetransmissionMessage(UA_Session *session) { - UA_NotificationMessageEntry *oldestEntry = NULL; - UA_Subscription *oldestSub = NULL; +/************************/ +/* Close the Connection */ +/************************/ - UA_Subscription *sub; - LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) { - UA_NotificationMessageEntry *first = - TAILQ_LAST(&sub->retransmissionQueue, ListOfNotificationMessages); - if(!first) - continue; - if(!oldestEntry || oldestEntry->message.publishTime > first->message.publishTime) { - oldestEntry = first; - oldestSub = sub; - } - } - UA_assert(oldestEntry); - UA_assert(oldestSub); +static void +sendCloseSession(UA_Client *client) { + UA_CloseSessionRequest request; + UA_CloseSessionRequest_init(&request); - TAILQ_REMOVE(&oldestSub->retransmissionQueue, oldestEntry, listEntry); - UA_NotificationMessage_deleteMembers(&oldestEntry->message); - UA_free(oldestEntry); - --session->totalRetransmissionQueueSize; - --oldestSub->retransmissionQueueSize; + request.requestHeader.timestamp = UA_DateTime_now(); + request.requestHeader.timeoutHint = 10000; + request.deleteSubscriptions = true; + UA_CloseSessionResponse response; + __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST], + &response, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]); + UA_CloseSessionRequest_deleteMembers(&request); + UA_CloseSessionResponse_deleteMembers(&response); } static void -UA_Subscription_addRetransmissionMessage(UA_Server *server, UA_Subscription *sub, - UA_NotificationMessageEntry *entry) { - /* Release the oldest entry if there is not enough space */ - if(server->config.maxRetransmissionQueueSize > 0 && - sub->session->totalRetransmissionQueueSize >= server->config.maxRetransmissionQueueSize) { - UA_LOG_WARNING_SESSION(server->config.logger, sub->session, "Subscription %u | " - "Retransmission queue overflow", sub->subscriptionId); - removeOldestRetransmissionMessage(sub->session); - } - - /* Add entry */ - TAILQ_INSERT_TAIL(&sub->retransmissionQueue, entry, listEntry); - ++sub->session->totalRetransmissionQueueSize; - ++sub->retransmissionQueueSize; +sendCloseSecureChannel(UA_Client *client) { + UA_SecureChannel *channel = &client->channel; + UA_CloseSecureChannelRequest request; + UA_CloseSecureChannelRequest_init(&request); + request.requestHeader.requestHandle = ++client->requestHandle; + request.requestHeader.timestamp = UA_DateTime_now(); + request.requestHeader.timeoutHint = 10000; + request.requestHeader.authenticationToken = client->authenticationToken; + UA_SecureChannel_sendSymmetricMessage(channel, ++client->requestId, + UA_MESSAGETYPE_CLO, &request, + &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); + UA_CloseSecureChannelRequest_deleteMembers(&request); + UA_SecureChannel_close(&client->channel); + UA_SecureChannel_deleteMembers(&client->channel); } UA_StatusCode -UA_Subscription_removeRetransmissionMessage(UA_Subscription *sub, UA_UInt32 sequenceNumber) { - /* Find the retransmission message */ - UA_NotificationMessageEntry *entry; - TAILQ_FOREACH(entry, &sub->retransmissionQueue, listEntry) { - if(entry->message.sequenceNumber == sequenceNumber) - break; +UA_Client_disconnect(UA_Client *client) { + /* Is a session established? */ + if(client->state >= UA_CLIENTSTATE_SESSION) { + client->state = UA_CLIENTSTATE_SECURECHANNEL; + sendCloseSession(client); } - if(!entry) - return UA_STATUSCODE_BADSEQUENCENUMBERUNKNOWN; + UA_NodeId_deleteMembers(&client->authenticationToken); + client->requestHandle = 0; - /* Remove the retransmission message */ - TAILQ_REMOVE(&sub->retransmissionQueue, entry, listEntry); - --sub->session->totalRetransmissionQueueSize; - --sub->retransmissionQueueSize; - UA_NotificationMessage_deleteMembers(&entry->message); - UA_free(entry); + /* Is a secure channel established? */ + if(client->state >= UA_CLIENTSTATE_SECURECHANNEL) { + client->state = UA_CLIENTSTATE_CONNECTED; + sendCloseSecureChannel(client); + } + + /* Close the TCP connection */ + if(client->connection.state != UA_CONNECTION_CLOSED + && client->connection.state != UA_CONNECTION_OPENING) + /* UA_ClientConnectionTCP_init sets initial state to opening */ + if(client->connection.close != NULL) + client->connection.close(&client->connection); + +#ifdef UA_ENABLE_SUBSCRIPTIONS + // TODO REMOVE WHEN UA_SESSION_RECOVERY IS READY + /* We need to clean up the subscriptions */ + UA_Client_Subscriptions_clean(client); +#endif + + UA_SecureChannel_deleteMembers(&client->channel); + + setClientState(client, UA_CLIENTSTATE_DISCONNECTED); return UA_STATUSCODE_GOOD; } -/* Iterate over the monitoreditems of the subscription, starting at mon, and - * move notifications into the response. */ -static void -moveNotificationsFromMonitoredItems(UA_Subscription *sub, UA_MonitoredItemNotification *mins, - size_t minsSize) { - size_t pos = 0; - UA_Notification *notification, *notification_tmp; - TAILQ_FOREACH_SAFE(notification, &sub->notificationQueue, globalEntry, notification_tmp) { - if(pos >= minsSize) - return; +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/client/ua_client_connect_async.c" ***********************************/ - UA_MonitoredItem *mon = notification->mon; +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + + +#define UA_MINMESSAGESIZE 8192 +#define UA_SESSION_LOCALNONCELENGTH 32 +#define MAX_DATA_SIZE 4096 + +/* Asynchronous client connection + * To prepare an async connection, UA_Client_connectAsync() is called, which does not connect the + * client directly. UA_Client_run_iterate() takes care of actually connecting the client: + * if client is disconnected: + * send hello msg and set the client state to be WAITING_FOR_ACK + * (see UA_Client_connect_iterate()) + * if client is waiting for the ACK: + * call the non-blocking receiving function and register processACKResponseAsync() as its callback + * (see receivePacketAsync()) + * if ACK is processed (callback called): + * processACKResponseAsync() calls openSecureChannelAsync() at the end, which prepares the request + * to open secure channel and the client is connected + * if client is connected: + * call the non-blocking receiving function and register processOPNResponse() as its callback + * (see receivePacketAsync()) + * if OPN-request processed (callback called) + * send session request, where the session response is put into a normal AsyncServiceCall, and when + * called, request to activate session is sent, where its response is again put into an AsyncServiceCall + * in the very last step responseActivateSession(): + * the user defined callback that is passed into UA_Client_connectAsync() is called and the + * async connection finalized. + * */ - /* Remove the notification from the queues */ - TAILQ_REMOVE(&sub->notificationQueue, notification, globalEntry); - TAILQ_REMOVE(&mon->queue, notification, listEntry); - --mon->queueSize; - --sub->notificationQueueSize; +/***********************/ +/* Open the Connection */ +/***********************/ +static UA_StatusCode +openSecureChannelAsync(UA_Client *client/*, UA_Boolean renew*/); - /* Move the content to the response */ - UA_MonitoredItemNotification *min = &mins[pos]; - min->clientHandle = mon->clientHandle; - if(mon->monitoredItemType == UA_MONITOREDITEMTYPE_CHANGENOTIFY) { - min->value = notification->data.value; - } else { - /* TODO implementation for events */ - } - UA_free(notification); - ++pos; - } -} +static UA_StatusCode +requestSession(UA_Client *client, UA_UInt32 *requestId); static UA_StatusCode -prepareNotificationMessage(UA_Subscription *sub, UA_NotificationMessage *message, - size_t notifications) { - /* Array of ExtensionObject to hold different kinds of notifications - * (currently only DataChangeNotifications) */ - message->notificationData = UA_ExtensionObject_new(); - if(!message->notificationData) - return UA_STATUSCODE_BADOUTOFMEMORY; - message->notificationDataSize = 1; +requestGetEndpoints(UA_Client *client, UA_UInt32 *requestId); - /* Allocate Notification */ - UA_DataChangeNotification *dcn = UA_DataChangeNotification_new(); - if(!dcn) { - UA_NotificationMessage_deleteMembers(message); - return UA_STATUSCODE_BADOUTOFMEMORY; - } - UA_ExtensionObject *data = message->notificationData; - data->encoding = UA_EXTENSIONOBJECT_DECODED; - data->content.decoded.data = dcn; - data->content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]; - - /* Allocate array of notifications */ - dcn->monitoredItems = (UA_MonitoredItemNotification *) - UA_Array_new(notifications, - &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]); - if(!dcn->monitoredItems) { - UA_NotificationMessage_deleteMembers(message); - return UA_STATUSCODE_BADOUTOFMEMORY; +/*receives hello ack, opens secure channel*/ +UA_StatusCode +processACKResponseAsync(void *application, UA_Connection *connection, + UA_ByteString *chunk) { + UA_Client *client = (UA_Client*)application; + + /* Decode the message */ + size_t offset = 0; + UA_TcpMessageHeader messageHeader; + UA_TcpAcknowledgeMessage ackMessage; + client->connectStatus = UA_TcpMessageHeader_decodeBinary (chunk, &offset, + &messageHeader); + client->connectStatus |= UA_TcpAcknowledgeMessage_decodeBinary( + chunk, &offset, &ackMessage); + if (client->connectStatus != UA_STATUSCODE_GOOD) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_NETWORK, + "Decoding ACK message failed"); + return client->connectStatus; } - dcn->monitoredItemsSize = notifications; + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_NETWORK, "Received ACK message"); - /* Move notifications into the response .. the point of no return */ + client->connectStatus = + UA_Connection_processHELACK(connection, &client->config.localConnectionConfig, + (const UA_ConnectionConfig*)&ackMessage); + if(client->connectStatus != UA_STATUSCODE_GOOD) + return client->connectStatus; - moveNotificationsFromMonitoredItems(sub, dcn->monitoredItems, notifications); + client->state = UA_CLIENTSTATE_CONNECTED; - return UA_STATUSCODE_GOOD; + /* Open a SecureChannel. TODO: Select with endpoint */ + client->channel.connection = &client->connection; + client->connectStatus = openSecureChannelAsync(client/*, false*/); + return client->connectStatus; } -/* According to OPC Unified Architecture, Part 4 5.13.1.1 i) The value 0 is - * never used for the sequence number */ -static UA_UInt32 -UA_Subscription_nextSequenceNumber(UA_UInt32 sequenceNumber) { - UA_UInt32 nextSequenceNumber = sequenceNumber + 1; - if(nextSequenceNumber == 0) - nextSequenceNumber = 1; - return nextSequenceNumber; -} +static UA_StatusCode +sendHELMessage(UA_Client *client) { + /* Get a buffer */ + UA_ByteString message; + UA_Connection *conn = &client->connection; + UA_StatusCode retval = conn->getSendBuffer(conn, UA_MINMESSAGESIZE, &message); + if(retval != UA_STATUSCODE_GOOD) + return retval; -static void -publishCallback(UA_Server *server, UA_Subscription *sub) { - sub->readyNotifications = sub->notificationQueueSize; - UA_Subscription_publish(server, sub); -} + /* Prepare the HEL message and encode at offset 8 */ + UA_TcpHelloMessage hello; + UA_String_copy(&client->endpointUrl, &hello.endpointUrl); /* must be less than 4096 bytes */ + memcpy(&hello, &client->config.localConnectionConfig, + sizeof(UA_ConnectionConfig)); /* same struct layout */ -void -UA_Subscription_publish(UA_Server *server, UA_Subscription *sub) { - UA_LOG_DEBUG_SESSION(server->config.logger, sub->session, "Subscription %u | " - "Publish Callback", sub->subscriptionId); - /* Dequeue a response */ - UA_PublishResponseEntry *pre = UA_Session_dequeuePublishReq(sub->session); - if(pre) { - sub->currentLifetimeCount = 0; /* Reset the LifetimeCounter */ - } else { - UA_LOG_DEBUG_SESSION(server->config.logger, sub->session, - "Subscription %u | The publish queue is empty", - sub->subscriptionId); - ++sub->currentLifetimeCount; + UA_Byte *bufPos = &message.data[8]; /* skip the header */ + const UA_Byte *bufEnd = &message.data[message.length]; + client->connectStatus = UA_TcpHelloMessage_encodeBinary(&hello, &bufPos, bufEnd); + UA_TcpHelloMessage_deleteMembers (&hello); - if(sub->currentLifetimeCount > sub->lifeTimeCount) { - UA_LOG_DEBUG_SESSION(server->config.logger, sub->session, - "Subscription %u | End of lifetime " - "for subscription", sub->subscriptionId); - UA_Session_deleteSubscription(server, sub->session, sub->subscriptionId); - /* TODO: send a StatusChangeNotification with Bad_Timeout */ - return; - } + /* Encode the message header at offset 0 */ + UA_TcpMessageHeader messageHeader; + messageHeader.messageTypeAndChunkType = UA_CHUNKTYPE_FINAL + UA_MESSAGETYPE_HEL; + messageHeader.messageSize = (UA_UInt32) ((uintptr_t)bufPos - (uintptr_t)message.data); + bufPos = message.data; + retval = UA_TcpMessageHeader_encodeBinary(&messageHeader, &bufPos, bufEnd); + if(retval != UA_STATUSCODE_GOOD) { + conn->releaseSendBuffer(conn, &message); + return retval; } - if (sub->readyNotifications > sub->notificationQueueSize) - sub->readyNotifications = sub->notificationQueueSize; - - /* Count the available notifications */ - UA_UInt32 notifications = sub->readyNotifications; - if(!sub->publishingEnabled) - notifications = 0; + /* Send the HEL message */ + message.length = messageHeader.messageSize; + retval = conn->send (conn, &message); - UA_Boolean moreNotifications = false; - if(notifications > sub->notificationsPerPublish) { - notifications = sub->notificationsPerPublish; - moreNotifications = true; + if(retval == UA_STATUSCODE_GOOD) { + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_NETWORK, "Sent HEL message"); + } else { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_NETWORK, "Sending HEL failed"); } + return retval; +} - /* Return if no notifications and no keepalive */ - if(notifications == 0) { - ++sub->currentKeepAliveCount; - if(sub->currentKeepAliveCount < sub->maxKeepAliveCount) { - if(pre) - UA_Session_queuePublishReq(sub->session, pre, true); /* Re-enqueue */ - return; - } - UA_LOG_DEBUG_SESSION(server->config.logger, sub->session, - "Subscription %u | Sending a KeepAlive", - sub->subscriptionId); +static void +processDecodedOPNResponseAsync(void *application, UA_SecureChannel *channel, + UA_MessageType messageType, + UA_UInt32 requestId, + const UA_ByteString *message) { + /* Does the request id match? */ + UA_Client *client = (UA_Client*)application; + if(requestId != client->requestId) { + UA_Client_disconnect(client); + return; } - /* We want to send a response. Is it possible? */ - UA_SecureChannel *channel = sub->session->header.channel; - if(!channel || !pre) { - UA_LOG_DEBUG_SESSION(server->config.logger, sub->session, - "Subscription %u | Want to send a publish response but can't. " - "The subscription is late.", sub->subscriptionId); - sub->state = UA_SUBSCRIPTIONSTATE_LATE; - if(pre) - UA_Session_queuePublishReq(sub->session, pre, true); /* Re-enqueue */ + /* Is the content of the expected type? */ + size_t offset = 0; + UA_NodeId responseId; + UA_NodeId expectedId = UA_NODEID_NUMERIC( + 0, UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE].binaryEncodingId); + UA_StatusCode retval = UA_NodeId_decodeBinary(message, &offset, + &responseId); + if(retval != UA_STATUSCODE_GOOD) { + UA_Client_disconnect(client); return; } - - /* Prepare the response */ - UA_PublishResponse *response = &pre->response; - UA_NotificationMessage *message = &response->notificationMessage; - UA_NotificationMessageEntry *retransmission = NULL; - if(notifications > 0) { - /* Allocate the retransmission entry */ - retransmission = (UA_NotificationMessageEntry*)UA_malloc(sizeof(UA_NotificationMessageEntry)); - if(!retransmission) { - UA_LOG_WARNING_SESSION(server->config.logger, sub->session, - "Subscription %u | Could not allocate memory for retransmission. " - "The subscription is late.", sub->subscriptionId); - sub->state = UA_SUBSCRIPTIONSTATE_LATE; - UA_Session_queuePublishReq(sub->session, pre, true); /* Re-enqueue */ - return; - } - - /* Prepare the response */ - UA_StatusCode retval = prepareNotificationMessage(sub, message, notifications); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_WARNING_SESSION(server->config.logger, sub->session, - "Subscription %u | Could not prepare the notification message. " - "The subscription is late.", sub->subscriptionId); - UA_free(retransmission); - sub->state = UA_SUBSCRIPTIONSTATE_LATE; - UA_Session_queuePublishReq(sub->session, pre, true); /* Re-enqueue */ - return; - } + if(!UA_NodeId_equal(&responseId, &expectedId)) { + UA_NodeId_deleteMembers(&responseId); + UA_Client_disconnect(client); + return; } + UA_NodeId_deleteMembers (&responseId); - /* <-- The point of no return --> */ - - /* Adjust the number of ready notifications */ - UA_assert(sub->readyNotifications >= notifications); - sub->readyNotifications -= notifications; + /* Decode the response */ + UA_OpenSecureChannelResponse response; + retval = UA_OpenSecureChannelResponse_decodeBinary(message, &offset, + &response); + if(retval != UA_STATUSCODE_GOOD) { + UA_Client_disconnect(client); + return; + } - /* Set up the response */ - response->responseHeader.timestamp = UA_DateTime_now(); - response->subscriptionId = sub->subscriptionId; - response->moreNotifications = moreNotifications; - message->publishTime = response->responseHeader.timestamp; + /* Response.securityToken.revisedLifetime is UInt32 we need to cast it to + * DateTime=Int64 we take 75% of lifetime to start renewing as described in + * standard */ + client->nextChannelRenewal = UA_DateTime_nowMonotonic() + + (UA_DateTime) (response.securityToken.revisedLifetime + * (UA_Double) UA_DATETIME_MSEC * 0.75); - /* Set sequence number to message. Started at 1 which is given - * during creating a new subscription. The 1 is required for - * initial publish response with or without an monitored item. */ - message->sequenceNumber = sub->nextSequenceNumber; + /* Replace the token and nonce */ + UA_ChannelSecurityToken_deleteMembers(&client->channel.securityToken); + UA_ByteString_deleteMembers(&client->channel.remoteNonce); + client->channel.securityToken = response.securityToken; + client->channel.remoteNonce = response.serverNonce; + UA_ResponseHeader_deleteMembers(&response.responseHeader); /* the other members were moved */ + if(client->channel.state == UA_SECURECHANNELSTATE_OPEN) + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, "SecureChannel renewed"); + else + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, "SecureChannel opened"); + client->channel.state = UA_SECURECHANNELSTATE_OPEN; - if(notifications > 0) { - /* Put the notification message into the retransmission queue. This - * needs to be done here, so that the message itself is included in the - * available sequence numbers for acknowledgement. */ - retransmission->message = response->notificationMessage; - UA_Subscription_addRetransmissionMessage(server, sub, retransmission); - /* Only if a notification was created, the sequence number must be increased. - * For a keepalive the sequence number can be reused. */ - sub->nextSequenceNumber = UA_Subscription_nextSequenceNumber(sub->nextSequenceNumber); - } + if(client->state < UA_CLIENTSTATE_SECURECHANNEL) + setClientState(client, UA_CLIENTSTATE_SECURECHANNEL); +} - /* Get the available sequence numbers from the retransmission queue */ - size_t available = sub->retransmissionQueueSize; - UA_STACKARRAY(UA_UInt32, seqNumbers, available); - if(available > 0) { - response->availableSequenceNumbers = seqNumbers; - response->availableSequenceNumbersSize = available; - size_t i = 0; - UA_NotificationMessageEntry *nme; - TAILQ_FOREACH(nme, &sub->retransmissionQueue, listEntry) { - response->availableSequenceNumbers[i] = nme->message.sequenceNumber; - ++i; - } +UA_StatusCode +processOPNResponseAsync(void *application, UA_Connection *connection, + UA_ByteString *chunk) { + UA_Client *client = (UA_Client*) application; + UA_StatusCode retval = UA_SecureChannel_decryptAddChunk(&client->channel, chunk, true); + client->connectStatus = retval; + if(retval != UA_STATUSCODE_GOOD) + goto error; + UA_SecureChannel_processCompleteMessages(&client->channel, client, processDecodedOPNResponseAsync); + + if(client->state < UA_CLIENTSTATE_SECURECHANNEL) { + retval = UA_STATUSCODE_BADSECURECHANNELCLOSED; + goto error; } - /* Send the response */ - UA_LOG_DEBUG_SESSION(server->config.logger, sub->session, - "Subscription %u | Sending out a publish response " - "with %u notifications", sub->subscriptionId, - (UA_UInt32)notifications); - UA_SecureChannel_sendSymmetricMessage(sub->session->header.channel, pre->requestId, - UA_MESSAGETYPE_MSG, response, - &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); + retval = UA_SecureChannel_persistIncompleteMessages(&client->channel); + if(retval != UA_STATUSCODE_GOOD) + goto error; - /* Reset subscription state to normal */ - sub->state = UA_SUBSCRIPTIONSTATE_NORMAL; - sub->currentKeepAliveCount = 0; + retval = UA_SecureChannel_generateNewKeys(&client->channel); + if(retval != UA_STATUSCODE_GOOD) + goto error; - /* Free the response */ - UA_Array_delete(response->results, response->resultsSize, &UA_TYPES[UA_TYPES_UINT32]); - UA_free(pre); /* No need for UA_PublishResponse_deleteMembers */ + /* Following requests and responses */ + UA_UInt32 reqId; + if(client->endpointsHandshake) + retval = requestGetEndpoints (client, &reqId); + else + retval = requestSession (client, &reqId); - /* Repeat sending responses if there are more notifications to send */ - if(moreNotifications) - UA_Subscription_publish(server, sub); -} + if(retval != UA_STATUSCODE_GOOD) + goto error; -UA_Boolean -UA_Subscription_reachedPublishReqLimit(UA_Server *server, UA_Session *session) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Reached number of publish request limit"); + return retval; - /* Dequeue a response */ - UA_PublishResponseEntry *pre = UA_Session_dequeuePublishReq(session); +error: + UA_Client_disconnect(client); - /* Cannot publish without a response */ - if(!pre) { - UA_LOG_FATAL_SESSION(server->config.logger, session, "No publish requests available"); - return false; - } + return retval; +} - /* <-- The point of no return --> */ +/* OPN messges to renew the channel are sent asynchronous */ +static UA_StatusCode +openSecureChannelAsync(UA_Client *client/*, UA_Boolean renew*/) { + /* Check if sc is still valid */ + /*if(renew && client->nextChannelRenewal - UA_DateTime_nowMonotonic () > 0) + return UA_STATUSCODE_GOOD;*/ - UA_PublishResponse *response = &pre->response; - UA_NotificationMessage *message = &response->notificationMessage; + UA_Connection *conn = &client->connection; + if(conn->state != UA_CONNECTION_ESTABLISHED) + return UA_STATUSCODE_BADSERVERNOTCONNECTED; - /* Set up the response. Note that this response has no related subscription id */ - response->responseHeader.timestamp = UA_DateTime_now(); - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYPUBLISHREQUESTS; - response->subscriptionId = 0; - response->moreNotifications = false; - message->publishTime = response->responseHeader.timestamp; - message->sequenceNumber = 0; - response->availableSequenceNumbersSize = 0; + /* Prepare the OpenSecureChannelRequest */ + UA_OpenSecureChannelRequest opnSecRq; + UA_OpenSecureChannelRequest_init(&opnSecRq); + opnSecRq.requestHeader.timestamp = UA_DateTime_now(); + opnSecRq.requestHeader.authenticationToken = client->authenticationToken; + /*if(renew) { + opnSecRq.requestType = UA_SECURITYTOKENREQUESTTYPE_RENEW; + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, + "Requesting to renew the SecureChannel"); + } else {*/ + opnSecRq.requestType = UA_SECURITYTOKENREQUESTTYPE_ISSUE; + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, + "Requesting to open a SecureChannel"); + //} + opnSecRq.securityMode = client->channel.securityMode; - /* Send the response */ - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Sending out a publish response triggered by too many publish requests"); - UA_SecureChannel_sendSymmetricMessage(session->header.channel, pre->requestId, - UA_MESSAGETYPE_MSG, response, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); + opnSecRq.clientNonce = client->channel.localNonce; + opnSecRq.requestedLifetime = client->config.secureChannelLifeTime; - /* Free the response */ - UA_Array_delete(response->results, response->resultsSize, &UA_TYPES[UA_TYPES_UINT32]); - UA_free(pre); /* no need for UA_PublishResponse_deleteMembers */ + /* Prepare the entry for the linked list */ + UA_UInt32 requestId = ++client->requestId; + /*AsyncServiceCall *ac = NULL; + if(renew) { + ac = (AsyncServiceCall*)UA_malloc(sizeof(AsyncServiceCall)); + if (!ac) + return UA_STATUSCODE_BADOUTOFMEMORY; + ac->callback = + (UA_ClientAsyncServiceCallback) processDecodedOPNResponseAsync; + ac->responseType = &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]; + ac->requestId = requestId; + ac->userdata = NULL; + }*/ - return true; -} + /* Send the OPN message */ + UA_StatusCode retval = UA_SecureChannel_sendAsymmetricOPNMessage ( + &client->channel, requestId, &opnSecRq, + &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); + client->connectStatus = retval; -UA_StatusCode -Subscription_registerPublishCallback(UA_Server *server, UA_Subscription *sub) { - UA_LOG_DEBUG_SESSION(server->config.logger, sub->session, - "Subscription %u | Register subscription " - "publishing callback", sub->subscriptionId); + if(retval != UA_STATUSCODE_GOOD) { + client->connectStatus = retval; + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, + "Sending OPN message failed with error %s", + UA_StatusCode_name(retval)); + UA_Client_disconnect(client); + //if(renew) + // UA_free(ac); + return retval; + } - if(sub->publishCallbackIsRegistered) - return UA_STATUSCODE_GOOD; + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, + "OPN message sent"); - UA_StatusCode retval = - UA_Server_addRepeatedCallback(server, (UA_ServerCallback)publishCallback, - sub, (UA_UInt32)sub->publishingInterval, &sub->publishCallbackId); - if(retval != UA_STATUSCODE_GOOD) + /* Store the entry for async processing and return */ + /*if(renew) { + LIST_INSERT_HEAD(&client->asyncServiceCalls, ac, pointers); return retval; - - sub->publishCallbackIsRegistered = true; - return UA_STATUSCODE_GOOD; + }*/ + return retval; } -UA_StatusCode -Subscription_unregisterPublishCallback(UA_Server *server, UA_Subscription *sub) { - UA_LOG_DEBUG_SESSION(server->config.logger, sub->session, "Subscription %u | " - "Unregister subscription publishing callback", sub->subscriptionId); +static void +responseActivateSession(UA_Client *client, void *userdata, UA_UInt32 requestId, + void *response) { + UA_ActivateSessionResponse *activateResponse = + (UA_ActivateSessionResponse *) response; + if(activateResponse->responseHeader.serviceResult) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "ActivateSession failed with error code %s", + UA_StatusCode_name(activateResponse->responseHeader.serviceResult)); + } + client->connection.state = UA_CONNECTION_ESTABLISHED; + setClientState(client, UA_CLIENTSTATE_SESSION); - if(!sub->publishCallbackIsRegistered) - return UA_STATUSCODE_GOOD; +#ifdef UA_ENABLE_SUBSCRIPTIONS + /* A new session has been created. We need to clean up the subscriptions */ + UA_Client_Subscriptions_clean(client); +#endif + + /* Call onConnect (client_async.c) callback */ + if(client->asyncConnectCall.callback) + client->asyncConnectCall.callback(client, client->asyncConnectCall.userdata, + requestId + 1, + &activateResponse->responseHeader.serviceResult); +} - UA_StatusCode retval = UA_Server_removeRepeatedCallback(server, sub->publishCallbackId); +static UA_StatusCode +requestActivateSession (UA_Client *client, UA_UInt32 *requestId) { + UA_ActivateSessionRequest request; + UA_ActivateSessionRequest_init(&request); + request.requestHeader.requestHandle = ++client->requestHandle; + request.requestHeader.timestamp = UA_DateTime_now (); + request.requestHeader.timeoutHint = 600000; + UA_StatusCode retval = + UA_ExtensionObject_copy(&client->config.userIdentityToken, &request.userIdentityToken); if(retval != UA_STATUSCODE_GOOD) return retval; - sub->publishCallbackIsRegistered = false; - return UA_STATUSCODE_GOOD; -} - -/* When the session has publish requests stored but the last subscription is - * deleted... Send out empty responses */ -void -UA_Subscription_answerPublishRequestsNoSubscription(UA_Server *server, UA_Session *session) { - /* No session or there are remaining subscriptions */ - if(!session || LIST_FIRST(&session->serverSubscriptions)) - return; + /* If not token is set, use anonymous */ + if(request.userIdentityToken.encoding == UA_EXTENSIONOBJECT_ENCODED_NOBODY) { + UA_AnonymousIdentityToken *t = UA_AnonymousIdentityToken_new(); + if(!t) { + UA_ActivateSessionRequest_deleteMembers(&request); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + request.userIdentityToken.content.decoded.data = t; + request.userIdentityToken.content.decoded.type = &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]; + request.userIdentityToken.encoding = UA_EXTENSIONOBJECT_DECODED; + } - /* Send a response for every queued request */ - UA_PublishResponseEntry *pre; - while((pre = UA_Session_dequeuePublishReq(session))) { - UA_PublishResponse *response = &pre->response; - response->responseHeader.serviceResult = UA_STATUSCODE_BADNOSUBSCRIPTION; - response->responseHeader.timestamp = UA_DateTime_now(); - UA_SecureChannel_sendSymmetricMessage(session->header.channel, pre->requestId, UA_MESSAGETYPE_MSG, - response, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); - UA_PublishResponse_deleteMembers(response); - UA_free(pre); + /* Set the policy-Id from the endpoint. Every IdentityToken starts with a + * string. */ + retval = UA_String_copy(&client->config.userTokenPolicy.policyId, + (UA_String*)request.userIdentityToken.content.decoded.data); + +#ifdef UA_ENABLE_ENCRYPTION + /* Encrypt the UserIdentityToken */ + const UA_String *userTokenPolicy = &client->channel.securityPolicy->policyUri; + if(client->config.userTokenPolicy.securityPolicyUri.length > 0) + userTokenPolicy = &client->config.userTokenPolicy.securityPolicyUri; + retval |= encryptUserIdentityToken(client, userTokenPolicy, &request.userIdentityToken); + + /* This function call is to prepare a client signature */ + retval |= signActivateSessionRequest(&client->channel, &request); +#endif + + if(retval != UA_STATUSCODE_GOOD) { + UA_ActivateSessionRequest_deleteMembers(&request); + client->connectStatus = retval; + return retval; } -} -#endif /* UA_ENABLE_SUBSCRIPTIONS */ + retval = UA_Client_sendAsyncRequest ( + client, &request, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST], + (UA_ClientAsyncServiceCallback) responseActivateSession, + &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE], NULL, requestId); -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_subscription_datachange.c" ***********************************/ + UA_ActivateSessionRequest_deleteMembers(&request); + client->connectStatus = retval; + return retval; +} -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA - */ +/* Combination of UA_Client_getEndpointsInternal and getEndpoints */ +static void +responseGetEndpoints(UA_Client *client, void *userdata, UA_UInt32 requestId, + void *response) { + UA_EndpointDescription* endpointArray = NULL; + size_t endpointArraySize = 0; + UA_GetEndpointsResponse* resp; + resp = (UA_GetEndpointsResponse*)response; + if (resp->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + client->connectStatus = resp->responseHeader.serviceResult; + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "GetEndpointRequest failed with error code %s", + UA_StatusCode_name (client->connectStatus)); + UA_GetEndpointsResponse_deleteMembers(resp); + return; + } + endpointArray = resp->endpoints; + endpointArraySize = resp->endpointsSize; + resp->endpoints = NULL; + resp->endpointsSize = 0; -#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */ + UA_Boolean endpointFound = false; + UA_Boolean tokenFound = false; + UA_String securityNone = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None"); + UA_String binaryTransport = UA_STRING("http://opcfoundation.org/UA-Profile/" + "Transport/uatcp-uasc-uabinary"); -#define UA_VALUENCODING_MAXSTACK 512 + // TODO: compare endpoint information with client->endpointUri + for(size_t i = 0; i < endpointArraySize; ++i) { + UA_EndpointDescription* endpoint = &endpointArray[i]; + /* look out for binary transport endpoints */ + /* Note: Siemens returns empty ProfileUrl, we will accept it as binary */ + if(endpoint->transportProfileUri.length != 0 + && !UA_String_equal (&endpoint->transportProfileUri, + &binaryTransport)) + continue; -UA_MonitoredItem * -UA_MonitoredItem_new(UA_MonitoredItemType monType) { - /* Allocate the memory */ - UA_MonitoredItem *newItem = - (UA_MonitoredItem *) UA_calloc(1, sizeof(UA_MonitoredItem)); - if(!newItem) - return NULL; + /* Look for an endpoint corresponding to the client security policy */ + if(!UA_String_equal(&endpoint->securityPolicyUri, &client->channel.securityPolicy->policyUri)) + continue; - /* Remaining members are covered by calloc zeroing out the memory */ - newItem->monitoredItemType = monType; /* currently hardcoded */ - newItem->timestampsToReturn = UA_TIMESTAMPSTORETURN_SOURCE; - TAILQ_INIT(&newItem->queue); - return newItem; -} + endpointFound = true; -void -MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem) { - UA_Subscription *sub = monitoredItem->subscription; + /* Look for a user token policy with an anonymous token */ + for(size_t j = 0; j < endpoint->userIdentityTokensSize; ++j) { + UA_UserTokenPolicy* userToken = &endpoint->userIdentityTokens[j]; - if(monitoredItem->monitoredItemType == UA_MONITOREDITEMTYPE_CHANGENOTIFY) { - /* Remove the sampling callback */ - MonitoredItem_unregisterSampleCallback(server, monitoredItem); + /* Usertokens also have a security policy... */ + if(userToken->securityPolicyUri.length > 0 && + !UA_String_equal(&userToken->securityPolicyUri, &securityNone)) + continue; - /* Clear the queued notifications */ - UA_Notification *notification, *notification_tmp; - TAILQ_FOREACH_SAFE(notification, &monitoredItem->queue, listEntry, notification_tmp) { - /* Remove the item from the queues */ - TAILQ_REMOVE(&monitoredItem->queue, notification, listEntry); - TAILQ_REMOVE(&sub->notificationQueue, notification, globalEntry); - --sub->notificationQueueSize; + /* Does the token type match the client configuration? */ + if((userToken->tokenType == UA_USERTOKENTYPE_ANONYMOUS && + client->config.userIdentityToken.content.decoded.type != + &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN] && + client->config.userIdentityToken.content.decoded.type != NULL) || + (userToken->tokenType == UA_USERTOKENTYPE_USERNAME && + client->config.userIdentityToken.content.decoded.type != + &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]) || + (userToken->tokenType == UA_USERTOKENTYPE_CERTIFICATE && + client->config.userIdentityToken.content.decoded.type != + &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN]) || + (userToken->tokenType == UA_USERTOKENTYPE_ISSUEDTOKEN && + client->config.userIdentityToken.content.decoded.type != + &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN])) + continue; - UA_DataValue_deleteMembers(¬ification->data.value); - UA_free(notification); + /* Endpoint with matching usertokenpolicy found */ + tokenFound = true; + UA_EndpointDescription_deleteMembers(&client->config.endpoint); + UA_EndpointDescription_copy(endpoint, &client->config.endpoint); + UA_UserTokenPolicy_deleteMembers(&client->config.userTokenPolicy); + UA_UserTokenPolicy_copy(userToken, &client->config.userTokenPolicy); + break; } - monitoredItem->queueSize = 0; - } else { - /* TODO: Access val data.event */ - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, - "MonitoredItemTypes other than ChangeNotify are not supported yet"); } - /* Remove the monitored item */ - if(monitoredItem->listEntry.le_prev != NULL) - LIST_REMOVE(monitoredItem, listEntry); - UA_String_deleteMembers(&monitoredItem->indexRange); - UA_ByteString_deleteMembers(&monitoredItem->lastSampledValue); - UA_Variant_deleteMembers(&monitoredItem->lastValue); - UA_NodeId_deleteMembers(&monitoredItem->monitoredNodeId); - UA_Server_delayedFree(server, monitoredItem); -} - -void MonitoredItem_ensureQueueSpace(UA_MonitoredItem *mon) { - if(mon->queueSize <= mon->maxQueueSize) - return; + UA_Array_delete(endpointArray, endpointArraySize, + &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); - /* Remove notifications until the queue size is reached */ - UA_Subscription *sub = mon->subscription; - while(mon->queueSize > mon->maxQueueSize) { - UA_assert(mon->queueSize >= 2); /* At least two Notifications in the queue */ - - /* Make sure that the MonitoredItem does not lose its place in the - * global queue when notifications are removed. Otherwise the - * MonitoredItem can "starve" itself by putting new notifications always - * at the end of the global queue and removing the old ones. - * - * - If the oldest notification is removed, put the second oldest - * notification right behind it. - * - If the newest notification is removed, put the new notification - * right behind it. */ - - UA_Notification *del; /* The notification that will be deleted */ - UA_Notification *after_del; /* The notification to keep and move after del */ - if(mon->discardOldest) { - /* Remove the oldest */ - del = TAILQ_FIRST(&mon->queue); - after_del = TAILQ_NEXT(del, listEntry); - } else { - /* Remove the second newest (to keep the up-to-date notification) */ - after_del = TAILQ_LAST(&mon->queue, NotificationQueue); - del = TAILQ_PREV(after_del, NotificationQueue, listEntry); - } + if(!endpointFound) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "No suitable endpoint found"); + client->connectStatus = UA_STATUSCODE_BADINTERNALERROR; + } else if(!tokenFound) { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "No suitable UserTokenPolicy found for the possible endpoints"); + client->connectStatus = UA_STATUSCODE_BADINTERNALERROR; + } + requestSession(client, &requestId); +} - /* Move after_del right after del in the global queue */ - TAILQ_REMOVE(&sub->notificationQueue, after_del, globalEntry); - TAILQ_INSERT_AFTER(&sub->notificationQueue, del, after_del, globalEntry); +static UA_StatusCode +requestGetEndpoints(UA_Client *client, UA_UInt32 *requestId) { + UA_GetEndpointsRequest request; + UA_GetEndpointsRequest_init(&request); + request.requestHeader.timestamp = UA_DateTime_now(); + request.requestHeader.timeoutHint = 10000; + /* assume the endpointurl outlives the service call */ + UA_String_copy(&client->endpointUrl, &request.endpointUrl); - /* Remove the notification from the queues */ - TAILQ_REMOVE(&mon->queue, del, listEntry); - TAILQ_REMOVE(&sub->notificationQueue, del, globalEntry); - --mon->queueSize; - --sub->notificationQueueSize; + client->connectStatus = UA_Client_sendAsyncRequest( + client, &request, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST], + (UA_ClientAsyncServiceCallback) responseGetEndpoints, + &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE], NULL, requestId); + UA_GetEndpointsRequest_deleteMembers(&request); + return client->connectStatus; - /* Free the notification */ - if(mon->monitoredItemType == UA_MONITOREDITEMTYPE_CHANGENOTIFY) { - UA_DataValue_deleteMembers(&del->data.value); - } else { - /* TODO: event implemantation */ - } +} - /* Work around a false positive in clang analyzer */ -#ifndef __clang_analyzer__ - UA_free(del); -#endif - } +static void +responseSessionCallback(UA_Client *client, void *userdata, UA_UInt32 requestId, + void *response) { + UA_CreateSessionResponse *sessionResponse = + (UA_CreateSessionResponse *)response; + UA_NodeId_copy(&sessionResponse->authenticationToken, + &client->authenticationToken); + requestActivateSession(client, &requestId); +} - if(mon->monitoredItemType == UA_MONITOREDITEMTYPE_CHANGENOTIFY) { - /* Get the element that carries the infobits */ - UA_Notification *notification = NULL; - if(mon->discardOldest) - notification = TAILQ_FIRST(&mon->queue); - else - notification = TAILQ_LAST(&mon->queue, NotificationQueue); - UA_assert(notification); +static UA_StatusCode +requestSession(UA_Client *client, UA_UInt32 *requestId) { + UA_CreateSessionRequest request; + UA_CreateSessionRequest_init(&request); - if(mon->maxQueueSize > 1) { - /* Add the infobits either to the newest or the new last entry */ - notification->data.value.hasStatus = true; - notification->data.value.status |= (UA_STATUSCODE_INFOTYPE_DATAVALUE | - UA_STATUSCODE_INFOBITS_OVERFLOW); - } else { - /* If the queue size is reduced to one, remove the infobits */ - notification->data.value.status &= ~(UA_StatusCode)(UA_STATUSCODE_INFOTYPE_DATAVALUE | - UA_STATUSCODE_INFOBITS_OVERFLOW); + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGN || + client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { + if(client->channel.localNonce.length != UA_SESSION_LOCALNONCELENGTH) { + UA_ByteString_deleteMembers(&client->channel.localNonce); + retval = UA_ByteString_allocBuffer(&client->channel.localNonce, + UA_SESSION_LOCALNONCELENGTH); + if(retval != UA_STATUSCODE_GOOD) + return retval; } + + retval = client->channel.securityPolicy->symmetricModule. + generateNonce(client->channel.securityPolicy, &client->channel.localNonce); + if(retval != UA_STATUSCODE_GOOD) + return retval; } - /* TODO: Infobits for Events? */ -} + request.requestHeader.requestHandle = ++client->requestHandle; + request.requestHeader.timestamp = UA_DateTime_now(); + request.requestHeader.timeoutHint = 10000; + UA_ByteString_copy(&client->channel.localNonce, &request.clientNonce); + request.requestedSessionTimeout = client->config.requestedSessionTimeout; + request.maxResponseMessageSize = UA_INT32_MAX; + UA_String_copy(&client->config.endpoint.endpointUrl, &request.endpointUrl); -#define ABS_SUBTRACT_TYPE_INDEPENDENT(a,b) ((a)>(b)?(a)-(b):(b)-(a)) + UA_ApplicationDescription_copy(&client->config.clientDescription, + &request.clientDescription); -static UA_INLINE UA_Boolean -outOfDeadBand(const void *data1, const void *data2, const size_t index, const UA_DataType *type, const UA_Double deadbandValue) { - if(type == &UA_TYPES[UA_TYPES_BOOLEAN]) { - if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Boolean*)data1)[index], ((const UA_Boolean*)data2)[index]) <= deadbandValue) - return false; - } else - if (type == &UA_TYPES[UA_TYPES_SBYTE]) { - if (ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_SByte*)data1)[index], ((const UA_SByte*)data2)[index]) <= deadbandValue) - return false; - } else - if (type == &UA_TYPES[UA_TYPES_BYTE]) { - if (ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Byte*)data1)[index], ((const UA_Byte*)data2)[index]) <= deadbandValue) - return false; - } else - if (type == &UA_TYPES[UA_TYPES_INT16]) { - if (ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Int16*)data1)[index], ((const UA_Int16*)data2)[index]) <= deadbandValue) - return false; - } else - if (type == &UA_TYPES[UA_TYPES_UINT16]) { - if (ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_UInt16*)data1)[index], ((const UA_UInt16*)data2)[index]) <= deadbandValue) - return false; - } else - if (type == &UA_TYPES[UA_TYPES_INT32]) { - if (ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Int32*)data1)[index], ((const UA_Int32*)data2)[index]) <= deadbandValue) - return false; - } else - if (type == &UA_TYPES[UA_TYPES_UINT32]) { - if (ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_UInt32*)data1)[index], ((const UA_UInt32*)data2)[index]) <= deadbandValue) - return false; - } else - if (type == &UA_TYPES[UA_TYPES_INT64]) { - if (ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Int64*)data1)[index], ((const UA_Int64*)data2)[index]) <= deadbandValue) - return false; - } else - if (type == &UA_TYPES[UA_TYPES_UINT64]) { - if (ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_UInt64*)data1)[index], ((const UA_UInt64*)data2)[index]) <= deadbandValue) - return false; - } else - if (type == &UA_TYPES[UA_TYPES_FLOAT]) { - if (ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Float*)data1)[index], ((const UA_Float*)data2)[index]) <= deadbandValue) - return false; - } else - if (type == &UA_TYPES[UA_TYPES_DOUBLE]) { - if (ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Double*)data1)[index], ((const UA_Double*)data2)[index]) <= deadbandValue) - return false; - } - return true; + retval = UA_Client_sendAsyncRequest ( + client, &request, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST], + (UA_ClientAsyncServiceCallback) responseSessionCallback, + &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE], NULL, requestId); + UA_CreateSessionRequest_deleteMembers(&request); + client->connectStatus = retval; + return client->connectStatus; } -static UA_INLINE UA_Boolean -updateNeededForFilteredValue(const UA_Variant *value, const UA_Variant *oldValue, const UA_Double deadbandValue) { - if (value->arrayLength != oldValue->arrayLength) { - return true; - } - if (value->type != oldValue->type) { - return true; - } - if (UA_Variant_isScalar(value)) { - return outOfDeadBand(value->data, oldValue->data, 0, value->type, deadbandValue); - } else { - for (size_t i = 0; i < value->arrayLength; ++i) { - if (outOfDeadBand(value->data, oldValue->data, i, value->type, deadbandValue)) - return true; +UA_StatusCode +UA_Client_connect_iterate(UA_Client *client) { + UA_LOG_TRACE(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Client connect iterate"); + if (client->connection.state == UA_CONNECTION_ESTABLISHED){ + if(client->state < UA_CLIENTSTATE_WAITING_FOR_ACK) { + client->connectStatus = sendHELMessage(client); + if(client->connectStatus == UA_STATUSCODE_GOOD) { + setClientState(client, UA_CLIENTSTATE_WAITING_FOR_ACK); + } else { + client->connection.close(&client->connection); + client->connection.free(&client->connection); + } + return client->connectStatus; } } - return false; -} -/* Errors are returned as no change detected */ -static UA_Boolean -detectValueChangeWithFilter(UA_MonitoredItem *mon, UA_DataValue *value, - UA_ByteString *encoding) { - if (isDataTypeNumeric(value->value.type) - && (mon->filter.trigger == UA_DATACHANGETRIGGER_STATUSVALUE - || mon->filter.trigger == UA_DATACHANGETRIGGER_STATUSVALUETIMESTAMP)) { - if (mon->filter.deadbandType == UA_DEADBANDTYPE_ABSOLUTE) { - if (!updateNeededForFilteredValue(&value->value, &mon->lastValue, mon->filter.deadbandValue)) - return false; - } /*else if (mon->filter.deadbandType == UA_DEADBANDTYPE_PERCENT) { - // TODO where do this EURange come from ? - UA_Double deadbandValue = fabs(mon->filter.deadbandValue * (EURange.high-EURange.low)); - if (!updateNeededForFilteredValue(value->value, mon->lastValue, deadbandValue)) - return false; - }*/ + /* If server is not connected */ + if(client->connection.state == UA_CONNECTION_CLOSED) { + client->connectStatus = UA_STATUSCODE_BADCONNECTIONCLOSED; + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_NETWORK, + "No connection to server."); } - /* Encode the data for comparison */ - size_t binsize = UA_calcSizeBinary(value, &UA_TYPES[UA_TYPES_DATAVALUE]); - if(binsize == 0) - return false; - - /* Allocate buffer on the heap if necessary */ - if(binsize > UA_VALUENCODING_MAXSTACK && - UA_ByteString_allocBuffer(encoding, binsize) != UA_STATUSCODE_GOOD) - return false; - - /* Encode the value */ - UA_Byte *bufPos = encoding->data; - const UA_Byte *bufEnd = &encoding->data[encoding->length]; - UA_StatusCode retval = UA_encodeBinary(value, &UA_TYPES[UA_TYPES_DATAVALUE], - &bufPos, &bufEnd, NULL, NULL); - if(retval != UA_STATUSCODE_GOOD) - return false; + if(client->connectStatus != UA_STATUSCODE_GOOD) { + client->connection.close(&client->connection); + client->connection.free(&client->connection); + } - /* The value has changed */ - encoding->length = (uintptr_t)bufPos - (uintptr_t)encoding->data; - return !mon->lastSampledValue.data || !UA_String_equal(encoding, &mon->lastSampledValue); + return client->connectStatus; } -/* Has this sample changed from the last one? The method may allocate additional - * space for the encoding buffer. Detect the change in encoding->data. */ -static UA_Boolean -detectValueChange(UA_MonitoredItem *mon, UA_DataValue *value, UA_ByteString *encoding) { - /* Apply Filter */ - UA_Boolean hasValue = value->hasValue; - if(mon->filter.trigger == UA_DATACHANGETRIGGER_STATUS) - value->hasValue = false; - - UA_Boolean hasServerTimestamp = value->hasServerTimestamp; - UA_Boolean hasServerPicoseconds = value->hasServerPicoseconds; - value->hasServerTimestamp = false; - value->hasServerPicoseconds = false; - - UA_Boolean hasSourceTimestamp = value->hasSourceTimestamp; - UA_Boolean hasSourcePicoseconds = value->hasSourcePicoseconds; - if(mon->filter.trigger < UA_DATACHANGETRIGGER_STATUSVALUETIMESTAMP) { - value->hasSourceTimestamp = false; - value->hasSourcePicoseconds = false; - } - - /* Detect the Value Change */ - UA_Boolean res = detectValueChangeWithFilter(mon, value, encoding); - - /* Reset the filter */ - value->hasValue = hasValue; - value->hasServerTimestamp = hasServerTimestamp; - value->hasServerPicoseconds = hasServerPicoseconds; - value->hasSourceTimestamp = hasSourceTimestamp; - value->hasSourcePicoseconds = hasSourcePicoseconds; - return res; -} +UA_StatusCode +UA_Client_connect_async(UA_Client *client, const char *endpointUrl, + UA_ClientAsyncServiceCallback callback, + void *userdata) { + UA_LOG_TRACE(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Client internal async"); -/* Returns whether a new sample was created */ -static UA_Boolean -sampleCallbackWithValue(UA_Server *server, UA_Subscription *sub, - UA_MonitoredItem *monitoredItem, - UA_DataValue *value, - UA_ByteString *valueEncoding) { - UA_assert(monitoredItem->monitoredItemType == UA_MONITOREDITEMTYPE_CHANGENOTIFY); - /* Store the pointer to the stack-allocated bytestring to see if a heap-allocation - * was necessary */ - UA_Byte *stackValueEncoding = valueEncoding->data; + if(client->state >= UA_CLIENTSTATE_WAITING_FOR_ACK) + return UA_STATUSCODE_GOOD; - /* Has the value changed? */ - UA_Boolean changed = detectValueChange(monitoredItem, value, valueEncoding); - if(!changed) - return false; + UA_ChannelSecurityToken_init(&client->channel.securityToken); + client->channel.state = UA_SECURECHANNELSTATE_FRESH; + client->endpointsHandshake = true; + client->channel.sendSequenceNumber = 0; + client->requestId = 0; - /* Allocate the entry for the publish queue */ - UA_Notification *newNotification = - (UA_Notification *)UA_malloc(sizeof(UA_Notification)); - if(!newNotification) { - UA_LOG_WARNING_SESSION(server->config.logger, sub->session, - "Subscription %u | MonitoredItem %i | " - "Item for the publishing queue could not be allocated", - sub->subscriptionId, monitoredItem->monitoredItemId); - return false; + UA_String_deleteMembers(&client->endpointUrl); + client->endpointUrl = UA_STRING_ALLOC(endpointUrl); + + UA_StatusCode retval = UA_STATUSCODE_GOOD; + client->connection = + client->config.initConnectionFunc(client->config.localConnectionConfig, + client->endpointUrl, + client->config.timeout, &client->config.logger); + if(client->connection.state != UA_CONNECTION_OPENING) { + UA_LOG_TRACE(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Could not init async connection"); + retval = UA_STATUSCODE_BADCONNECTIONCLOSED; + goto cleanup; } - /* Copy valueEncoding on the heap for the next comparison (if not already done) */ - if(valueEncoding->data == stackValueEncoding) { - UA_ByteString cbs; - if(UA_ByteString_copy(valueEncoding, &cbs) != UA_STATUSCODE_GOOD) { - UA_LOG_WARNING_SESSION(server->config.logger, sub->session, - "Subscription %u | MonitoredItem %i | " - "ByteString to compare values could not be created", - sub->subscriptionId, monitoredItem->monitoredItemId); - UA_free(newNotification); - return false; + /* Set the channel SecurityMode if not done so far */ + if(client->channel.securityMode == UA_MESSAGESECURITYMODE_INVALID) + client->channel.securityMode = UA_MESSAGESECURITYMODE_NONE; + + /* Set the channel SecurityPolicy if not done so far */ + if(!client->channel.securityPolicy) { + UA_SecurityPolicy *sp = + getSecurityPolicy(client, UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None")); + if(!sp) { + retval = UA_STATUSCODE_BADINTERNALERROR; + goto cleanup; } - *valueEncoding = cbs; + UA_ByteString remoteCertificate = UA_BYTESTRING_NULL; + retval = UA_SecureChannel_setSecurityPolicy(&client->channel, sp, + &remoteCertificate); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; } - /* Prepare the newQueueItem */ - if(value->hasValue && value->value.storageType == UA_VARIANT_DATA_NODELETE) { - /* Make a deep copy of the value */ - UA_StatusCode retval = UA_DataValue_copy(value, &newNotification->data.value); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_WARNING_SESSION(server->config.logger, sub->session, - "Subscription %u | MonitoredItem %i | " - "Item for the publishing queue could not be prepared", - sub->subscriptionId, monitoredItem->monitoredItemId); - UA_free(newNotification); - return false; - } - } else { - newNotification->data.value = *value; /* Just copy the value and do not release it */ + client->asyncConnectCall.callback = callback; + client->asyncConnectCall.userdata = userdata; + + if(!client->connection.connectCallbackID) { + UA_LOG_TRACE(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Adding async connection callback"); + retval = UA_Client_addRepeatedCallback( + client, client->config.pollConnectionFunc, &client->connection, 100.0, + &client->connection.connectCallbackID); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; } - /* <-- Point of no return --> */ + retval = UA_SecureChannel_generateLocalNonce(&client->channel); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; - UA_LOG_DEBUG_SESSION(server->config.logger, sub->session, - "Subscription %u | MonitoredItem %u | Sampled a new value", - sub->subscriptionId, monitoredItem->monitoredItemId); + /* Delete async service. TODO: Move this from connect to the disconnect/cleanup phase */ + UA_Client_AsyncService_removeAll(client, UA_STATUSCODE_BADSHUTDOWN); - newNotification->mon = monitoredItem; +#ifdef UA_ENABLE_SUBSCRIPTIONS + client->currentlyOutStandingPublishRequests = 0; +#endif - /* Replace the encoding for comparison */ - UA_Variant_deleteMembers(&monitoredItem->lastValue); - UA_Variant_copy(&value->value, &monitoredItem->lastValue); - UA_ByteString_deleteMembers(&monitoredItem->lastSampledValue); - monitoredItem->lastSampledValue = *valueEncoding; + UA_NodeId_deleteMembers(&client->authenticationToken); - /* Add the notification to the end of local and global queue */ - TAILQ_INSERT_TAIL(&monitoredItem->queue, newNotification, listEntry); - TAILQ_INSERT_TAIL(&sub->notificationQueue, newNotification, globalEntry); - ++monitoredItem->queueSize; - ++sub->notificationQueueSize; + /* Generate new local and remote key */ + retval = UA_SecureChannel_generateNewKeys(&client->channel); + if(retval != UA_STATUSCODE_GOOD) + goto cleanup; - /* Remove some notifications if the queue is beyond maximum capacity */ - MonitoredItem_ensureQueueSpace(monitoredItem); + return retval; - return true; + cleanup: + UA_LOG_TRACE(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Failure during async connect"); + UA_Client_disconnect(client); + return retval; } -void -UA_MonitoredItem_SampleCallback(UA_Server *server, - UA_MonitoredItem *monitoredItem) { - UA_Subscription *sub = monitoredItem->subscription; - if(monitoredItem->monitoredItemType != UA_MONITOREDITEMTYPE_CHANGENOTIFY) { - UA_LOG_DEBUG_SESSION(server->config.logger, sub->session, - "Subscription %u | MonitoredItem %i | " - "Not a data change notification", - sub->subscriptionId, monitoredItem->monitoredItemId); - return; - } +/* Async disconnection */ +static void +sendCloseSecureChannelAsync(UA_Client *client, void *userdata, + UA_UInt32 requestId, void *response) { + UA_NodeId_deleteMembers (&client->authenticationToken); + client->requestHandle = 0; - /* Read the value */ - UA_ReadValueId rvid; - UA_ReadValueId_init(&rvid); - rvid.nodeId = monitoredItem->monitoredNodeId; - rvid.attributeId = monitoredItem->attributeId; - rvid.indexRange = monitoredItem->indexRange; - UA_DataValue value = - UA_Server_readWithSession(server, sub->session, - &rvid, monitoredItem->timestampsToReturn); + UA_SecureChannel *channel = &client->channel; + UA_CloseSecureChannelRequest request; + UA_CloseSecureChannelRequest_init(&request); + request.requestHeader.requestHandle = ++client->requestHandle; + request.requestHeader.timestamp = UA_DateTime_now(); + request.requestHeader.timeoutHint = 10000; + request.requestHeader.authenticationToken = client->authenticationToken; + UA_SecureChannel_sendSymmetricMessage( + channel, ++client->requestId, UA_MESSAGETYPE_CLO, &request, + &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); + UA_SecureChannel_close(&client->channel); + UA_SecureChannel_deleteMembers(&client->channel); +} - /* Stack-allocate some memory for the value encoding. We might heap-allocate - * more memory if needed. This is just enough for scalars and small - * structures. */ - UA_STACKARRAY(UA_Byte, stackValueEncoding, UA_VALUENCODING_MAXSTACK); - UA_ByteString valueEncoding; - valueEncoding.data = stackValueEncoding; - valueEncoding.length = UA_VALUENCODING_MAXSTACK; +static void +sendCloseSessionAsync(UA_Client *client, UA_UInt32 *requestId) { + UA_CloseSessionRequest request; + UA_CloseSessionRequest_init(&request); - /* Create a sample and compare with the last value */ - UA_Boolean newNotification = sampleCallbackWithValue(server, sub, monitoredItem, - &value, &valueEncoding); + request.requestHeader.timestamp = UA_DateTime_now(); + request.requestHeader.timeoutHint = 10000; + request.deleteSubscriptions = true; - /* Clean up */ - if(!newNotification) { - if(valueEncoding.data != stackValueEncoding) - UA_ByteString_deleteMembers(&valueEncoding); - UA_DataValue_deleteMembers(&value); - } -} + UA_Client_sendAsyncRequest( + client, &request, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST], + (UA_ClientAsyncServiceCallback) sendCloseSecureChannelAsync, + &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE], NULL, requestId); -UA_StatusCode -MonitoredItem_registerSampleCallback(UA_Server *server, UA_MonitoredItem *mon) { - if(mon->sampleCallbackIsRegistered) - return UA_STATUSCODE_GOOD; - UA_StatusCode retval = - UA_Server_addRepeatedCallback(server, (UA_ServerCallback)UA_MonitoredItem_SampleCallback, - mon, (UA_UInt32)mon->samplingInterval, &mon->sampleCallbackId); - if(retval == UA_STATUSCODE_GOOD) - mon->sampleCallbackIsRegistered = true; - return retval; } UA_StatusCode -MonitoredItem_unregisterSampleCallback(UA_Server *server, UA_MonitoredItem *mon) { - if(!mon->sampleCallbackIsRegistered) - return UA_STATUSCODE_GOOD; - mon->sampleCallbackIsRegistered = false; - return UA_Server_removeRepeatedCallback(server, mon->sampleCallbackId); -} +UA_Client_disconnect_async(UA_Client *client, UA_UInt32 *requestId) { + /* Is a session established? */ + if (client->state == UA_CLIENTSTATE_SESSION) { + client->state = UA_CLIENTSTATE_SESSION_DISCONNECTED; + sendCloseSessionAsync(client, requestId); + } -#endif /* UA_ENABLE_SUBSCRIPTIONS */ + /* Close the TCP connection + * shutdown and close (in tcp.c) are already async*/ + if (client->state >= UA_CLIENTSTATE_CONNECTED) + client->connection.close(&client->connection); + else + UA_Client_removeRepeatedCallback(client, client->connection.connectCallbackID); + +#ifdef UA_ENABLE_SUBSCRIPTIONS +// TODO REMOVE WHEN UA_SESSION_RECOVERY IS READY + /* We need to clean up the subscriptions */ + UA_Client_Subscriptions_clean(client); +#endif -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_services_view.c" ***********************************/ + setClientState(client, UA_CLIENTSTATE_DISCONNECTED); + return UA_STATUSCODE_GOOD; +} + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/client/ua_client_discovery.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2014-2017 (c) Florian Palm - * Copyright 2015-2016 (c) Sten Grüner - * Copyright 2015 (c) LEvertz - * Copyright 2015 (c) Chris Iatrou - * Copyright 2015 (c) Ecosmos - * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2016 (c) Lorenz Haas - * Copyright 2017 (c) pschoppe - * Copyright 2017 (c) Julian Grothoff - * Copyright 2017 (c) Henrik Norrman */ -/* Target node on top of the stack */ -static UA_StatusCode -fillReferenceDescription(UA_Server *server, const UA_Node *curr, - const UA_NodeReferenceKind *ref, - UA_UInt32 mask, UA_ReferenceDescription *descr) { - UA_ReferenceDescription_init(descr); - UA_StatusCode retval = UA_NodeId_copy(&curr->nodeId, &descr->nodeId.nodeId); - if(mask & UA_BROWSERESULTMASK_REFERENCETYPEID) - retval |= UA_NodeId_copy(&ref->referenceTypeId, &descr->referenceTypeId); - if(mask & UA_BROWSERESULTMASK_ISFORWARD) - descr->isForward = !ref->isInverse; - if(mask & UA_BROWSERESULTMASK_NODECLASS) - retval |= UA_NodeClass_copy(&curr->nodeClass, &descr->nodeClass); - if(mask & UA_BROWSERESULTMASK_BROWSENAME) - retval |= UA_QualifiedName_copy(&curr->browseName, &descr->browseName); - if(mask & UA_BROWSERESULTMASK_DISPLAYNAME) - retval |= UA_LocalizedText_copy(&curr->displayName, &descr->displayName); - if(mask & UA_BROWSERESULTMASK_TYPEDEFINITION) { - if(curr->nodeClass == UA_NODECLASS_OBJECT || - curr->nodeClass == UA_NODECLASS_VARIABLE) { - const UA_Node *type = getNodeType(server, curr); - if(type) { - retval |= UA_NodeId_copy(&type->nodeId, &descr->typeDefinition.nodeId); - UA_Nodestore_release(server, type); - } - } +UA_StatusCode +UA_Client_getEndpoints(UA_Client *client, const char *serverUrl, + size_t* endpointDescriptionsSize, + UA_EndpointDescription** endpointDescriptions) { + UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED); + /* Client is already connected to a different server */ + if(connected && strncmp((const char*)client->config.endpoint.endpointUrl.data, serverUrl, + client->config.endpoint.endpointUrl.length) != 0) { + return UA_STATUSCODE_BADINVALIDARGUMENT; + } + + UA_StatusCode retval; + const UA_String url = UA_STRING((char*)(uintptr_t)serverUrl); + if(!connected) { + retval = UA_Client_connectTCPSecureChannel(client, url); + if(retval != UA_STATUSCODE_GOOD) + return retval; } + retval = UA_Client_getEndpointsInternal(client, url, endpointDescriptionsSize, + endpointDescriptions); + + if(!connected) + UA_Client_disconnect(client); return retval; } -static void -removeCp(ContinuationPointEntry *cp, UA_Session* session) { - LIST_REMOVE(cp, pointers); - UA_ByteString_deleteMembers(&cp->identifier); - UA_BrowseDescription_deleteMembers(&cp->browseDescription); - UA_free(cp); - ++session->availableContinuationPoints; -} +UA_StatusCode +UA_Client_findServers(UA_Client *client, const char *serverUrl, + size_t serverUrisSize, UA_String *serverUris, + size_t localeIdsSize, UA_String *localeIds, + size_t *registeredServersSize, + UA_ApplicationDescription **registeredServers) { + UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED); + /* Client is already connected to a different server */ + if(connected && strncmp((const char*)client->config.endpoint.endpointUrl.data, serverUrl, + client->config.endpoint.endpointUrl.length) != 0) { + return UA_STATUSCODE_BADINVALIDARGUMENT; + } -static UA_Boolean -relevantReference(UA_Server *server, UA_Boolean includeSubtypes, - const UA_NodeId *rootRef, const UA_NodeId *testRef) { - if(!includeSubtypes) - return UA_NodeId_equal(rootRef, testRef); + UA_StatusCode retval; + const UA_String url = UA_STRING((char*)(uintptr_t)serverUrl); + if(!connected) { + retval = UA_Client_connectTCPSecureChannel(client, url); + if(retval != UA_STATUSCODE_GOOD) + return retval; + } - const UA_NodeId hasSubType = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE); - return isNodeInTree(&server->config.nodestore, testRef, rootRef, &hasSubType, 1); + /* Prepare the request */ + UA_FindServersRequest request; + UA_FindServersRequest_init(&request); + request.serverUrisSize = serverUrisSize; + request.serverUris = serverUris; + request.localeIdsSize = localeIdsSize; + request.localeIds = localeIds; + + /* Send the request */ + UA_FindServersResponse response; + __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST], + &response, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); + + /* Process the response */ + retval = response.responseHeader.serviceResult; + if(retval == UA_STATUSCODE_GOOD) { + *registeredServersSize = response.serversSize; + *registeredServers = response.servers; + response.serversSize = 0; + response.servers = NULL; + } else { + *registeredServersSize = 0; + *registeredServers = NULL; + } + + /* Clean up */ + UA_FindServersResponse_deleteMembers(&response); + if(!connected) + UA_Client_disconnect(client); + return retval; } -/* Returns whether the node / continuationpoint is done */ -static UA_Boolean -browseReferences(UA_Server *server, const UA_Node *node, - ContinuationPointEntry *cp, UA_BrowseResult *result) { - UA_assert(cp != NULL); - const UA_BrowseDescription *descr = &cp->browseDescription; +#ifdef UA_ENABLE_DISCOVERY - /* If the node has no references, just return */ - if(node->referencesSize == 0) { - result->referencesSize = 0; - return true; +UA_StatusCode +UA_Client_findServersOnNetwork(UA_Client *client, const char *serverUrl, + UA_UInt32 startingRecordId, UA_UInt32 maxRecordsToReturn, + size_t serverCapabilityFilterSize, UA_String *serverCapabilityFilter, + size_t *serverOnNetworkSize, UA_ServerOnNetwork **serverOnNetwork) { + UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED); + /* Client is already connected to a different server */ + if(connected && strncmp((const char*)client->config.endpoint.endpointUrl.data, serverUrl, + client->config.endpoint.endpointUrl.length) != 0) { + return UA_STATUSCODE_BADINVALIDARGUMENT; + } + + UA_StatusCode retval; + const UA_String url = UA_STRING((char*)(uintptr_t)serverUrl); + if(!connected) { + retval = UA_Client_connectTCPSecureChannel(client, url); + if(retval != UA_STATUSCODE_GOOD) + return retval; } - /* Follow all references? */ - UA_Boolean browseAll = UA_NodeId_isNull(&descr->referenceTypeId); + /* Prepare the request */ + UA_FindServersOnNetworkRequest request; + UA_FindServersOnNetworkRequest_init(&request); + request.startingRecordId = startingRecordId; + request.maxRecordsToReturn = maxRecordsToReturn; + request.serverCapabilityFilterSize = serverCapabilityFilterSize; + request.serverCapabilityFilter = serverCapabilityFilter; - /* How many references can we return at most? */ - size_t maxrefs = cp->maxReferences; - if(maxrefs == 0) { - if(server->config.maxReferencesPerNode != 0) { - maxrefs = server->config.maxReferencesPerNode; - } else { - maxrefs = UA_INT32_MAX; - } + /* Send the request */ + UA_FindServersOnNetworkResponse response; + __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST], + &response, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]); + + /* Process the response */ + retval = response.responseHeader.serviceResult; + if(retval == UA_STATUSCODE_GOOD) { + *serverOnNetworkSize = response.serversSize; + *serverOnNetwork = response.servers; + response.serversSize = 0; + response.servers = NULL; } else { - if(server->config.maxReferencesPerNode != 0 && maxrefs > server->config.maxReferencesPerNode) { - maxrefs = server->config.maxReferencesPerNode; - } + *serverOnNetworkSize = 0; + *serverOnNetwork = NULL; } - /* Allocate the results array */ - size_t refs_size = 2; /* True size of the array */ - result->references = (UA_ReferenceDescription*) - UA_Array_new(refs_size, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); - if(!result->references) { - result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; - return false; - } + /* Clean up */ + UA_FindServersOnNetworkResponse_deleteMembers(&response); + if(!connected) + UA_Client_disconnect(client); + return retval; +} - size_t referenceKindIndex = cp->referenceKindIndex; - size_t targetIndex = cp->targetIndex; +#endif - /* Loop over the node's references */ - for(; referenceKindIndex < node->referencesSize; ++referenceKindIndex) { - UA_NodeReferenceKind *rk = &node->references[referenceKindIndex]; +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/client/ua_client_highlevel.c" ***********************************/ - /* Reference in the right direction? */ - if(rk->isInverse && descr->browseDirection == UA_BROWSEDIRECTION_FORWARD) - continue; - if(!rk->isInverse && descr->browseDirection == UA_BROWSEDIRECTION_INVERSE) - continue; +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2015-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2015 (c) Oleksiy Vasylyev + * Copyright 2017 (c) Florian Palm + * Copyright 2016 (c) Chris Iatrou + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2018 (c) Fabian Arndt + * Copyright 2018 (c) Peter Rustler, basyskom GmbH + */ - /* Is the reference part of the hierarchy of references we look for? */ - if(!browseAll && !relevantReference(server, descr->includeSubtypes, - &descr->referenceTypeId, &rk->referenceTypeId)) - continue; - /* Loop over the targets */ - for(; targetIndex < rk->targetIdsSize; ++targetIndex) { - /* Get the node */ - const UA_Node *target = UA_Nodestore_get(server, &rk->targetIds[targetIndex].nodeId); - if(!target) - continue; - /* Test if the node class matches */ - if(descr->nodeClassMask != 0 && (target->nodeClass & descr->nodeClassMask) == 0) { - UA_Nodestore_release(server, target); - continue; - } +UA_StatusCode +UA_Client_NamespaceGetIndex(UA_Client *client, UA_String *namespaceUri, + UA_UInt16 *namespaceIndex) { + UA_ReadRequest request; + UA_ReadRequest_init(&request); + UA_ReadValueId id; + UA_ReadValueId_init(&id); + id.attributeId = UA_ATTRIBUTEID_VALUE; + id.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY); + request.nodesToRead = &id; + request.nodesToReadSize = 1; - /* A match! Can we return it? */ - if(result->referencesSize >= maxrefs) { - /* There are references we could not return */ - cp->referenceKindIndex = referenceKindIndex; - cp->targetIndex = targetIndex; - UA_Nodestore_release(server, target); - return false; - } + UA_ReadResponse response = UA_Client_Service_read(client, request); - /* Make enough space in the array */ - if(result->referencesSize >= refs_size) { - refs_size *= 2; - if(refs_size > maxrefs) - refs_size = maxrefs; - UA_ReferenceDescription *rd = (UA_ReferenceDescription*) - UA_realloc(result->references, sizeof(UA_ReferenceDescription) * refs_size); - if(!rd) { - result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; - UA_Nodestore_release(server, target); - goto error_recovery; - } - result->references = rd; - } + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) + retval = response.responseHeader.serviceResult; + else if(response.resultsSize != 1 || !response.results[0].hasValue) + retval = UA_STATUSCODE_BADNODEATTRIBUTESINVALID; + else if(response.results[0].value.type != &UA_TYPES[UA_TYPES_STRING]) + retval = UA_STATUSCODE_BADTYPEMISMATCH; + + if(retval != UA_STATUSCODE_GOOD) { + UA_ReadResponse_deleteMembers(&response); + return retval; + } + + retval = UA_STATUSCODE_BADNOTFOUND; + UA_String *ns = (UA_String *)response.results[0].value.data; + for(size_t i = 0; i < response.results[0].value.arrayLength; ++i) { + if(UA_String_equal(namespaceUri, &ns[i])) { + *namespaceIndex = (UA_UInt16)i; + retval = UA_STATUSCODE_GOOD; + break; + } + } - /* Copy the node description. Target is on top of the stack */ - result->statusCode = - fillReferenceDescription(server, target, rk, descr->resultMask, - &result->references[result->referencesSize]); + UA_ReadResponse_deleteMembers(&response); + return retval; +} - UA_Nodestore_release(server, target); +UA_StatusCode +UA_Client_forEachChildNodeCall(UA_Client *client, UA_NodeId parentNodeId, + UA_NodeIteratorCallback callback, void *handle) { + UA_BrowseRequest bReq; + UA_BrowseRequest_init(&bReq); + bReq.requestedMaxReferencesPerNode = 0; + bReq.nodesToBrowse = UA_BrowseDescription_new(); + bReq.nodesToBrowseSize = 1; + UA_NodeId_copy(&parentNodeId, &bReq.nodesToBrowse[0].nodeId); + bReq.nodesToBrowse[0].resultMask = UA_BROWSERESULTMASK_ALL; //return everything + bReq.nodesToBrowse[0].browseDirection = UA_BROWSEDIRECTION_BOTH; - if(result->statusCode != UA_STATUSCODE_GOOD) - goto error_recovery; + UA_BrowseResponse bResp = UA_Client_Service_browse(client, bReq); - /* Increase the counter */ - result->referencesSize++; + UA_StatusCode retval = bResp.responseHeader.serviceResult; + if(retval == UA_STATUSCODE_GOOD) { + for(size_t i = 0; i < bResp.resultsSize; ++i) { + for(size_t j = 0; j < bResp.results[i].referencesSize; ++j) { + UA_ReferenceDescription *ref = &bResp.results[i].references[j]; + retval |= callback(ref->nodeId.nodeId, !ref->isForward, + ref->referenceTypeId, handle); + } } - - targetIndex = 0; /* Start at index 0 for the next reference kind */ } - /* No relevant references, return array of length zero */ - if(result->referencesSize == 0) { - UA_free(result->references); - result->references = (UA_ReferenceDescription*)UA_EMPTY_ARRAY_SENTINEL; - } + UA_BrowseRequest_deleteMembers(&bReq); + UA_BrowseResponse_deleteMembers(&bResp); + return retval; +} - /* The node is done */ - return true; +/*******************/ +/* Node Management */ +/*******************/ - error_recovery: - if(result->referencesSize == 0) - UA_free(result->references); - else - UA_Array_delete(result->references, result->referencesSize, - &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); - result->references = NULL; - result->referencesSize = 0; - return false; +UA_StatusCode +UA_Client_addReference(UA_Client *client, const UA_NodeId sourceNodeId, + const UA_NodeId referenceTypeId, UA_Boolean isForward, + const UA_String targetServerUri, + const UA_ExpandedNodeId targetNodeId, + UA_NodeClass targetNodeClass) { + UA_AddReferencesItem item; + UA_AddReferencesItem_init(&item); + item.sourceNodeId = sourceNodeId; + item.referenceTypeId = referenceTypeId; + item.isForward = isForward; + item.targetServerUri = targetServerUri; + item.targetNodeId = targetNodeId; + item.targetNodeClass = targetNodeClass; + UA_AddReferencesRequest request; + UA_AddReferencesRequest_init(&request); + request.referencesToAdd = &item; + request.referencesToAddSize = 1; + UA_AddReferencesResponse response = UA_Client_Service_addReferences(client, request); + UA_StatusCode retval = response.responseHeader.serviceResult; + if(retval != UA_STATUSCODE_GOOD) { + UA_AddReferencesResponse_deleteMembers(&response); + return retval; + } + if(response.resultsSize != 1) { + UA_AddReferencesResponse_deleteMembers(&response); + return UA_STATUSCODE_BADUNEXPECTEDERROR; + } + retval = response.results[0]; + UA_AddReferencesResponse_deleteMembers(&response); + return retval; } -/* Results for a single browsedescription. This is the inner loop for both - * Browse and BrowseNext. The ContinuationPoint contains all the data used. - * Including the BrowseDescription. Returns whether there are remaining - * references. */ -static UA_Boolean -browseWithContinuation(UA_Server *server, UA_Session *session, - ContinuationPointEntry *cp, UA_BrowseResult *result) { - const UA_BrowseDescription *descr = &cp->browseDescription; +UA_StatusCode +UA_Client_deleteReference(UA_Client *client, const UA_NodeId sourceNodeId, + const UA_NodeId referenceTypeId, UA_Boolean isForward, + const UA_ExpandedNodeId targetNodeId, + UA_Boolean deleteBidirectional) { + UA_DeleteReferencesItem item; + UA_DeleteReferencesItem_init(&item); + item.sourceNodeId = sourceNodeId; + item.referenceTypeId = referenceTypeId; + item.isForward = isForward; + item.targetNodeId = targetNodeId; + item.deleteBidirectional = deleteBidirectional; + UA_DeleteReferencesRequest request; + UA_DeleteReferencesRequest_init(&request); + request.referencesToDelete = &item; + request.referencesToDeleteSize = 1; + UA_DeleteReferencesResponse response = UA_Client_Service_deleteReferences(client, request); + UA_StatusCode retval = response.responseHeader.serviceResult; + if(retval != UA_STATUSCODE_GOOD) { + UA_DeleteReferencesResponse_deleteMembers(&response); + return retval; + } + if(response.resultsSize != 1) { + UA_DeleteReferencesResponse_deleteMembers(&response); + return UA_STATUSCODE_BADUNEXPECTEDERROR; + } + retval = response.results[0]; + UA_DeleteReferencesResponse_deleteMembers(&response); + return retval; +} - /* Is the browsedirection valid? */ - if(descr->browseDirection != UA_BROWSEDIRECTION_BOTH && - descr->browseDirection != UA_BROWSEDIRECTION_FORWARD && - descr->browseDirection != UA_BROWSEDIRECTION_INVERSE) { - result->statusCode = UA_STATUSCODE_BADBROWSEDIRECTIONINVALID; - return true; +UA_StatusCode +UA_Client_deleteNode(UA_Client *client, const UA_NodeId nodeId, + UA_Boolean deleteTargetReferences) { + UA_DeleteNodesItem item; + UA_DeleteNodesItem_init(&item); + item.nodeId = nodeId; + item.deleteTargetReferences = deleteTargetReferences; + UA_DeleteNodesRequest request; + UA_DeleteNodesRequest_init(&request); + request.nodesToDelete = &item; + request.nodesToDeleteSize = 1; + UA_DeleteNodesResponse response = UA_Client_Service_deleteNodes(client, request); + UA_StatusCode retval = response.responseHeader.serviceResult; + if(retval != UA_STATUSCODE_GOOD) { + UA_DeleteNodesResponse_deleteMembers(&response); + return retval; } + if(response.resultsSize != 1) { + UA_DeleteNodesResponse_deleteMembers(&response); + return UA_STATUSCODE_BADUNEXPECTEDERROR; + } + retval = response.results[0]; + UA_DeleteNodesResponse_deleteMembers(&response); + return retval; +} - /* Is the reference type valid? */ - if(!UA_NodeId_isNull(&descr->referenceTypeId)) { - const UA_Node *reftype = UA_Nodestore_get(server, &descr->referenceTypeId); - if(!reftype) { - result->statusCode = UA_STATUSCODE_BADREFERENCETYPEIDINVALID; - return true; - } +UA_StatusCode +__UA_Client_addNode(UA_Client *client, const UA_NodeClass nodeClass, + const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId, + const UA_NodeId referenceTypeId, const UA_QualifiedName browseName, + const UA_NodeId typeDefinition, const UA_NodeAttributes *attr, + const UA_DataType *attributeType, UA_NodeId *outNewNodeId) { + UA_AddNodesRequest request; + UA_AddNodesRequest_init(&request); + UA_AddNodesItem item; + UA_AddNodesItem_init(&item); + item.parentNodeId.nodeId = parentNodeId; + item.referenceTypeId = referenceTypeId; + item.requestedNewNodeId.nodeId = requestedNewNodeId; + item.browseName = browseName; + item.nodeClass = nodeClass; + item.typeDefinition.nodeId = typeDefinition; + item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; + item.nodeAttributes.content.decoded.type = attributeType; + item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)attr; // hack. is not written into. + request.nodesToAdd = &item; + request.nodesToAddSize = 1; + UA_AddNodesResponse response = UA_Client_Service_addNodes(client, request); - UA_Boolean isRef = (reftype->nodeClass == UA_NODECLASS_REFERENCETYPE); - UA_Nodestore_release(server, reftype); + UA_StatusCode retval = response.responseHeader.serviceResult; + if(retval != UA_STATUSCODE_GOOD) { + UA_AddNodesResponse_deleteMembers(&response); + return retval; + } - if(!isRef) { - result->statusCode = UA_STATUSCODE_BADREFERENCETYPEIDINVALID; - return true; - } + if(response.resultsSize != 1) { + UA_AddNodesResponse_deleteMembers(&response); + return UA_STATUSCODE_BADUNEXPECTEDERROR; } - const UA_Node *node = UA_Nodestore_get(server, &descr->nodeId); - if(!node) { - result->statusCode = UA_STATUSCODE_BADNODEIDUNKNOWN; - return true; + /* Move the id of the created node */ + retval = response.results[0].statusCode; + if(retval == UA_STATUSCODE_GOOD && outNewNodeId) { + *outNewNodeId = response.results[0].addedNodeId; + UA_NodeId_init(&response.results[0].addedNodeId); } - /* Browse the references */ - UA_Boolean done = browseReferences(server, node, cp, result); - UA_Nodestore_release(server, node); - return done; + UA_AddNodesResponse_deleteMembers(&response); + return retval; } -/* Start to browse with no previous cp */ -void -Operation_Browse(UA_Server *server, UA_Session *session, UA_UInt32 *maxrefs, - const UA_BrowseDescription *descr, UA_BrowseResult *result) { - /* Stack-allocate a temporary cp */ - UA_STACKARRAY(ContinuationPointEntry, cp, 1); - memset(cp, 0, sizeof(ContinuationPointEntry)); - cp->maxReferences = *maxrefs; - cp->browseDescription = *descr; /* Shallow copy. Deep-copy later if we persist the cp. */ +/********/ +/* Call */ +/********/ - UA_Boolean done = browseWithContinuation(server, session, cp, result); +#ifdef UA_ENABLE_METHODCALLS - /* Exit early if done or an error occurred */ - if(done || result->statusCode != UA_STATUSCODE_GOOD) - return; +UA_StatusCode +UA_Client_call(UA_Client *client, const UA_NodeId objectId, + const UA_NodeId methodId, size_t inputSize, + const UA_Variant *input, size_t *outputSize, + UA_Variant **output) { + /* Set up the request */ + UA_CallRequest request; + UA_CallRequest_init(&request); + UA_CallMethodRequest item; + UA_CallMethodRequest_init(&item); + item.methodId = methodId; + item.objectId = objectId; + item.inputArguments = (UA_Variant *)(void*)(uintptr_t)input; // cast const... + item.inputArgumentsSize = inputSize; + request.methodsToCall = &item; + request.methodsToCallSize = 1; - /* Persist the new continuation point */ - ContinuationPointEntry *cp2 = NULL; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(session->availableContinuationPoints <= 0 || - !(cp2 = (ContinuationPointEntry *)UA_malloc(sizeof(ContinuationPointEntry)))) { - retval = UA_STATUSCODE_BADNOCONTINUATIONPOINTS; - goto cleanup; + /* Call the service */ + UA_CallResponse response = UA_Client_Service_call(client, request); + UA_StatusCode retval = response.responseHeader.serviceResult; + if(retval == UA_STATUSCODE_GOOD) { + if(response.resultsSize == 1) + retval = response.results[0].statusCode; + else + retval = UA_STATUSCODE_BADUNEXPECTEDERROR; } - memset(cp2, 0, sizeof(ContinuationPointEntry)); - cp2->referenceKindIndex = cp->referenceKindIndex; - cp2->targetIndex = cp->targetIndex; - cp2->maxReferences = cp->maxReferences; - retval = UA_BrowseDescription_copy(descr, &cp2->browseDescription); - if(retval != UA_STATUSCODE_GOOD) - goto cleanup; - - /* Create a random bytestring via a Guid */ - UA_Guid *ident = UA_Guid_new(); - if(!ident) { - retval = UA_STATUSCODE_BADOUTOFMEMORY; - goto cleanup; + if(retval != UA_STATUSCODE_GOOD) { + UA_CallResponse_deleteMembers(&response); + return retval; } - *ident = UA_Guid_random(); - cp2->identifier.data = (UA_Byte*)ident; - cp2->identifier.length = sizeof(UA_Guid); - - /* Return the cp identifier */ - retval = UA_ByteString_copy(&cp2->identifier, &result->continuationPoint); - if(retval != UA_STATUSCODE_GOOD) - goto cleanup; - - /* Attach the cp to the session */ - LIST_INSERT_HEAD(&session->continuationPoints, cp2, pointers); - --session->availableContinuationPoints; - return; - cleanup: - if(cp2) { - UA_ByteString_deleteMembers(&cp2->identifier); - UA_BrowseDescription_deleteMembers(&cp2->browseDescription); - UA_free(cp2); + /* Move the output arguments */ + if(output != NULL && outputSize != NULL) { + *output = response.results[0].outputArguments; + *outputSize = response.results[0].outputArgumentsSize; + response.results[0].outputArguments = NULL; + response.results[0].outputArgumentsSize = 0; } - UA_BrowseResult_deleteMembers(result); - result->statusCode = retval; + UA_CallResponse_deleteMembers(&response); + return retval; } -void Service_Browse(UA_Server *server, UA_Session *session, - const UA_BrowseRequest *request, UA_BrowseResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Processing BrowseRequest"); +#endif - if(server->config.maxNodesPerBrowse != 0 && - request->nodesToBrowseSize > server->config.maxNodesPerBrowse) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; - } - - /* No views supported at the moment */ - if(!UA_NodeId_isNull(&request->view.viewId)) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADVIEWIDUNKNOWN; - return; - } +/********************/ +/* Write Attributes */ +/********************/ - UA_UInt32 requestedMaxReferencesPerNode = request->requestedMaxReferencesPerNode; - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_Browse, - &requestedMaxReferencesPerNode, - &request->nodesToBrowseSize, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION], - &response->resultsSize, &UA_TYPES[UA_TYPES_BROWSERESULT]); -} +UA_StatusCode +__UA_Client_writeAttribute(UA_Client *client, const UA_NodeId *nodeId, + UA_AttributeId attributeId, const void *in, + const UA_DataType *inDataType) { + if(!in) + return UA_STATUSCODE_BADTYPEMISMATCH; -UA_BrowseResult -UA_Server_browse(UA_Server *server, UA_UInt32 maxrefs, const UA_BrowseDescription *descr) { - UA_BrowseResult result; - UA_BrowseResult_init(&result); - Operation_Browse(server, &server->adminSession, &maxrefs, descr, &result); - return result; -} + UA_WriteValue wValue; + UA_WriteValue_init(&wValue); + wValue.nodeId = *nodeId; + wValue.attributeId = attributeId; + if(attributeId == UA_ATTRIBUTEID_VALUE) + wValue.value.value = *(const UA_Variant*)in; + else + /* hack. is never written into. */ + UA_Variant_setScalar(&wValue.value.value, (void*)(uintptr_t)in, inDataType); + wValue.value.hasValue = true; + UA_WriteRequest wReq; + UA_WriteRequest_init(&wReq); + wReq.nodesToWrite = &wValue; + wReq.nodesToWriteSize = 1; -static void -Operation_BrowseNext(UA_Server *server, UA_Session *session, UA_Boolean *releaseContinuationPoints, - const UA_ByteString *continuationPoint, UA_BrowseResult *result) { - /* Find the continuation point */ - ContinuationPointEntry *cp; - LIST_FOREACH(cp, &session->continuationPoints, pointers) { - if(UA_ByteString_equal(&cp->identifier, continuationPoint)) - break; - } - if(!cp) { - result->statusCode = UA_STATUSCODE_BADCONTINUATIONPOINTINVALID; - return; - } + UA_WriteResponse wResp = UA_Client_Service_write(client, wReq); - /* Remove the cp */ - if(*releaseContinuationPoints) { - removeCp(cp, session); - return; + UA_StatusCode retval = wResp.responseHeader.serviceResult; + if(retval == UA_STATUSCODE_GOOD) { + if(wResp.resultsSize == 1) + retval = wResp.results[0]; + else + retval = UA_STATUSCODE_BADUNEXPECTEDERROR; } - /* Continue browsing */ - UA_Boolean done = browseWithContinuation(server, session, cp, result); - - if(done) { - /* Remove the cp if there are no references left */ - removeCp(cp, session); - } else { - /* Return the cp identifier */ - UA_StatusCode retval = UA_ByteString_copy(&cp->identifier, &result->continuationPoint); - if(retval != UA_STATUSCODE_GOOD) { - UA_BrowseResult_deleteMembers(result); - result->statusCode = retval; - } - } + UA_WriteResponse_deleteMembers(&wResp); + return retval; } -void -Service_BrowseNext(UA_Server *server, UA_Session *session, - const UA_BrowseNextRequest *request, - UA_BrowseNextResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing BrowseNextRequest"); - UA_Boolean releaseContinuationPoints = request->releaseContinuationPoints; /* request is const */ - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_BrowseNext, - &releaseContinuationPoints, - &request->continuationPointsSize, &UA_TYPES[UA_TYPES_BYTESTRING], - &response->resultsSize, &UA_TYPES[UA_TYPES_BROWSERESULT]); -} +UA_StatusCode +UA_Client_writeArrayDimensionsAttribute(UA_Client *client, const UA_NodeId nodeId, + size_t newArrayDimensionsSize, + const UA_UInt32 *newArrayDimensions) { + if(!newArrayDimensions) + return UA_STATUSCODE_BADTYPEMISMATCH; -UA_BrowseResult -UA_Server_browseNext(UA_Server *server, UA_Boolean releaseContinuationPoint, - const UA_ByteString *continuationPoint) { - UA_BrowseResult result; - UA_BrowseResult_init(&result); - Operation_BrowseNext(server, &server->adminSession, &releaseContinuationPoint, - continuationPoint, &result); - return result; -} + UA_WriteValue wValue; + UA_WriteValue_init(&wValue); + wValue.nodeId = nodeId; + wValue.attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS; + UA_Variant_setArray(&wValue.value.value, (void*)(uintptr_t)newArrayDimensions, + newArrayDimensionsSize, &UA_TYPES[UA_TYPES_UINT32]); + wValue.value.hasValue = true; + UA_WriteRequest wReq; + UA_WriteRequest_init(&wReq); + wReq.nodesToWrite = &wValue; + wReq.nodesToWriteSize = 1; -/***********************/ -/* TranslateBrowsePath */ -/***********************/ + UA_WriteResponse wResp = UA_Client_Service_write(client, wReq); -static void -walkBrowsePathElementReferenceTargets(UA_BrowsePathResult *result, size_t *targetsSize, - UA_NodeId **next, size_t *nextSize, size_t *nextCount, - UA_UInt32 elemDepth, const UA_NodeReferenceKind *rk) { - /* Loop over the targets */ - for(size_t i = 0; i < rk->targetIdsSize; i++) { - UA_ExpandedNodeId *targetId = &rk->targetIds[i]; + UA_StatusCode retval = wResp.responseHeader.serviceResult; + if(retval == UA_STATUSCODE_GOOD) { + if(wResp.resultsSize == 1) + retval = wResp.results[0]; + else + retval = UA_STATUSCODE_BADUNEXPECTEDERROR; + } + UA_WriteResponse_deleteMembers(&wResp); + return retval; +} - /* Does the reference point to an external server? Then add to the - * targets with the right path depth. */ - if(targetId->serverIndex != 0) { - UA_BrowsePathTarget *tempTargets = - (UA_BrowsePathTarget*)UA_realloc(result->targets, - sizeof(UA_BrowsePathTarget) * (*targetsSize) * 2); - if(!tempTargets) { - result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; - return; - } - result->targets = tempTargets; - (*targetsSize) *= 2; - result->statusCode = UA_ExpandedNodeId_copy(targetId, - &result->targets[result->targetsSize].targetId); - result->targets[result->targetsSize].remainingPathIndex = elemDepth; - continue; - } +/*******************/ +/* Read Attributes */ +/*******************/ - /* Can we store the node in the array of candidates for deep-search? */ - if(*nextSize <= *nextCount) { - UA_NodeId *tempNext = - (UA_NodeId*)UA_realloc(*next, sizeof(UA_NodeId) * (*nextSize) * 2); - if(!tempNext) { - result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; - return; - } - *next = tempNext; - (*nextSize) *= 2; - } +UA_StatusCode +__UA_Client_readAttribute(UA_Client *client, const UA_NodeId *nodeId, + UA_AttributeId attributeId, void *out, + const UA_DataType *outDataType) { + UA_ReadValueId item; + UA_ReadValueId_init(&item); + item.nodeId = *nodeId; + item.attributeId = attributeId; + UA_ReadRequest request; + UA_ReadRequest_init(&request); + request.nodesToRead = &item; + request.nodesToReadSize = 1; + UA_ReadResponse response = UA_Client_Service_read(client, request); + UA_StatusCode retval = response.responseHeader.serviceResult; + if(retval == UA_STATUSCODE_GOOD) { + if(response.resultsSize == 1) + retval = response.results[0].status; + else + retval = UA_STATUSCODE_BADUNEXPECTEDERROR; + } + if(retval != UA_STATUSCODE_GOOD) { + UA_ReadResponse_deleteMembers(&response); + return retval; + } - /* Add the node to the next array for the following path element */ - result->statusCode = UA_NodeId_copy(&targetId->nodeId, - &(*next)[*nextCount]); - if(result->statusCode != UA_STATUSCODE_GOOD) - return; - ++(*nextCount); + /* Set the StatusCode */ + UA_DataValue *res = response.results; + if(res->hasStatus) + retval = res->status; + + /* Return early of no value is given */ + if(!res->hasValue) { + if(retval == UA_STATUSCODE_GOOD) + retval = UA_STATUSCODE_BADUNEXPECTEDERROR; + UA_ReadResponse_deleteMembers(&response); + return retval; } -} -static void -walkBrowsePathElement(UA_Server *server, UA_Session *session, - UA_BrowsePathResult *result, size_t *targetsSize, - const UA_RelativePathElement *elem, UA_UInt32 elemDepth, - const UA_QualifiedName *targetName, - const UA_NodeId *current, const size_t currentCount, - UA_NodeId **next, size_t *nextSize, size_t *nextCount) { - /* Return all references? */ - UA_Boolean all_refs = UA_NodeId_isNull(&elem->referenceTypeId); - if(!all_refs) { - const UA_Node *rootRef = UA_Nodestore_get(server, &elem->referenceTypeId); - if(!rootRef) - return; - UA_Boolean match = (rootRef->nodeClass == UA_NODECLASS_REFERENCETYPE); - UA_Nodestore_release(server, rootRef); - if(!match) - return; + /* Copy value into out */ + if(attributeId == UA_ATTRIBUTEID_VALUE) { + memcpy(out, &res->value, sizeof(UA_Variant)); + UA_Variant_init(&res->value); + } else if(attributeId == UA_ATTRIBUTEID_NODECLASS) { + memcpy(out, (UA_NodeClass*)res->value.data, sizeof(UA_NodeClass)); + } else if(UA_Variant_isScalar(&res->value) && + res->value.type == outDataType) { + memcpy(out, res->value.data, res->value.type->memSize); + UA_free(res->value.data); + res->value.data = NULL; + } else { + retval = UA_STATUSCODE_BADUNEXPECTEDERROR; } - /* Iterate over all nodes at the current depth-level */ - for(size_t i = 0; i < currentCount; ++i) { - /* Get the node */ - const UA_Node *node = UA_Nodestore_get(server, ¤t[i]); - if(!node) { - /* If we cannot find the node at depth 0, the starting node does not exist */ - if(elemDepth == 0) - result->statusCode = UA_STATUSCODE_BADNODEIDUNKNOWN; - continue; - } - - /* Test whether the current node has the target name required in the - * previous path element */ - if(targetName && (targetName->namespaceIndex != node->browseName.namespaceIndex || - !UA_String_equal(&targetName->name, &node->browseName.name))) { - UA_Nodestore_release(server, node); - continue; - } + UA_ReadResponse_deleteMembers(&response); + return retval; +} - /* Loop over the nodes references */ - for(size_t r = 0; r < node->referencesSize && - result->statusCode == UA_STATUSCODE_GOOD; ++r) { - UA_NodeReferenceKind *rk = &node->references[r]; +static UA_StatusCode +processReadArrayDimensionsResult(UA_ReadResponse *response, + UA_UInt32 **outArrayDimensions, + size_t *outArrayDimensionsSize) { + UA_StatusCode retval = response->responseHeader.serviceResult; + if(retval != UA_STATUSCODE_GOOD) + return retval; - /* Does the direction of the reference match? */ - if(rk->isInverse != elem->isInverse) - continue; + if(response->resultsSize != 1) + return UA_STATUSCODE_BADUNEXPECTEDERROR; - /* Is the node relevant? */ - if(!all_refs && !relevantReference(server, elem->includeSubtypes, - &elem->referenceTypeId, &rk->referenceTypeId)) - continue; + retval = response->results[0].status; + if(retval != UA_STATUSCODE_GOOD) + return retval; - /* Walk over the reference targets */ - walkBrowsePathElementReferenceTargets(result, targetsSize, next, nextSize, - nextCount, elemDepth, rk); - } + UA_DataValue *res = &response->results[0]; + if(!res->hasValue || + UA_Variant_isScalar(&res->value) || + res->value.type != &UA_TYPES[UA_TYPES_UINT32]) + return UA_STATUSCODE_BADUNEXPECTEDERROR; - UA_Nodestore_release(server, node); - } + /* Move results */ + *outArrayDimensions = (UA_UInt32*)res->value.data; + *outArrayDimensionsSize = res->value.arrayLength; + res->value.data = NULL; + res->value.arrayLength = 0; + return UA_STATUSCODE_GOOD; } -/* This assumes that result->targets has enough room for all currentCount elements */ -static void -addBrowsePathTargets(UA_Server *server, UA_Session *session, - UA_BrowsePathResult *result, const UA_QualifiedName *targetName, - UA_NodeId *current, size_t currentCount) { - for(size_t i = 0; i < currentCount; i++) { - const UA_Node *node = UA_Nodestore_get(server, ¤t[i]); - if(!node) { - UA_NodeId_deleteMembers(¤t[i]); - continue; - } +UA_StatusCode +UA_Client_readArrayDimensionsAttribute(UA_Client *client, const UA_NodeId nodeId, + size_t *outArrayDimensionsSize, + UA_UInt32 **outArrayDimensions) { + UA_ReadValueId item; + UA_ReadValueId_init(&item); + item.nodeId = nodeId; + item.attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS; + UA_ReadRequest request; + UA_ReadRequest_init(&request); + request.nodesToRead = &item; + request.nodesToReadSize = 1; - /* Test whether the current node has the target name required in the - * previous path element */ - UA_Boolean valid = targetName->namespaceIndex == node->browseName.namespaceIndex && - UA_String_equal(&targetName->name, &node->browseName.name); + UA_ReadResponse response = UA_Client_Service_read(client, request); + UA_StatusCode retval = processReadArrayDimensionsResult(&response, outArrayDimensions, + outArrayDimensionsSize); + UA_ReadResponse_deleteMembers(&response); + return retval; +} - UA_Nodestore_release(server, node); +/*********************/ +/* Historical Access */ +/*********************/ +#ifdef UA_ENABLE_HISTORIZING +static UA_HistoryReadResponse +__UA_Client_HistoryRead(UA_Client *client, const UA_NodeId *nodeId, + UA_ExtensionObject* details, UA_String indexRange, + UA_TimestampsToReturn timestampsToReturn, + UA_ByteString continuationPoint, UA_Boolean releaseConti) { - if(!valid) { - UA_NodeId_deleteMembers(¤t[i]); - continue; - } + UA_HistoryReadValueId item; + UA_HistoryReadValueId_init(&item); - /* Move the nodeid to the target array */ - UA_BrowsePathTarget_init(&result->targets[result->targetsSize]); - result->targets[result->targetsSize].targetId.nodeId = current[i]; - result->targets[result->targetsSize].remainingPathIndex = UA_UINT32_MAX; - ++result->targetsSize; - } -} + item.nodeId = *nodeId; + item.indexRange = indexRange; + item.continuationPoint = continuationPoint; + item.dataEncoding = UA_QUALIFIEDNAME(0, "Default Binary"); -static void -walkBrowsePath(UA_Server *server, UA_Session *session, const UA_BrowsePath *path, - UA_BrowsePathResult *result, size_t targetsSize, - UA_NodeId **current, size_t *currentSize, size_t *currentCount, - UA_NodeId **next, size_t *nextSize, size_t *nextCount) { - UA_assert(*currentCount == 1); - UA_assert(*nextCount == 0); + UA_HistoryReadRequest request; + UA_HistoryReadRequest_init(&request); - /* Points to the targetName of the _previous_ path element */ - const UA_QualifiedName *targetName = NULL; + request.nodesToRead = &item; + request.nodesToReadSize = 1; + request.timestampsToReturn = timestampsToReturn; // Defaults to Source + request.releaseContinuationPoints = releaseConti; // No values are returned, if true - /* Iterate over path elements */ - UA_assert(path->relativePath.elementsSize > 0); - for(UA_UInt32 i = 0; i < path->relativePath.elementsSize; ++i) { - walkBrowsePathElement(server, session, result, &targetsSize, - &path->relativePath.elements[i], i, targetName, - *current, *currentCount, next, nextSize, nextCount); + /* Build ReadDetails */ + request.historyReadDetails = *details; - /* Clean members of current */ - for(size_t j = 0; j < *currentCount; j++) - UA_NodeId_deleteMembers(&(*current)[j]); - *currentCount = 0; + return UA_Client_Service_historyRead(client, request); +} - /* When no targets are left or an error occurred. None of next's - * elements will be copied to result->targets */ - if(*nextCount == 0 || result->statusCode != UA_STATUSCODE_GOOD) { - UA_assert(*currentCount == 0); - UA_assert(*nextCount == 0); - return; +static UA_StatusCode +__UA_Client_HistoryRead_service(UA_Client *client, const UA_NodeId *nodeId, + const UA_HistoricalIteratorCallback callback, + UA_ExtensionObject *details, UA_String indexRange, + UA_TimestampsToReturn timestampsToReturn, + void *callbackContext) { + + UA_ByteString continuationPoint = UA_BYTESTRING_NULL; + UA_Boolean continuationAvail = false; + UA_Boolean fetchMore = false; + UA_StatusCode retval = UA_STATUSCODE_GOOD; + + do { + /* We release the continuation point, if no more data is requested by the user */ + UA_Boolean cleanup = !fetchMore && continuationAvail; + UA_HistoryReadResponse response = + __UA_Client_HistoryRead(client, nodeId, details, indexRange, timestampsToReturn, continuationPoint, cleanup); + + if (cleanup) { + retval = response.responseHeader.serviceResult; +cleanup: UA_HistoryReadResponse_deleteMembers(&response); + UA_ByteString_deleteMembers(&continuationPoint); + return retval; } - /* Exchange current and next for the next depth */ - size_t tSize = *currentSize; size_t tCount = *currentCount; UA_NodeId *tT = *current; - *currentSize = *nextSize; *currentCount = *nextCount; *current = *next; - *nextSize = tSize; *nextCount = tCount; *next = tT; + retval = response.responseHeader.serviceResult; + if (retval == UA_STATUSCODE_GOOD) { + if (response.resultsSize == 1) + retval = response.results[0].statusCode; + else + retval = UA_STATUSCODE_BADUNEXPECTEDERROR; + } + if (retval != UA_STATUSCODE_GOOD) + goto cleanup; - /* Store the target name of the previous path element */ - targetName = &path->relativePath.elements[i].targetName; - } + UA_HistoryReadResult *res = response.results; - UA_assert(targetName != NULL); - UA_assert(*nextCount == 0); + /* Clear old and check / store new continuation point */ + UA_ByteString_deleteMembers(&continuationPoint); + UA_ByteString_copy(&res->continuationPoint, &continuationPoint); + continuationAvail = !UA_ByteString_equal(&continuationPoint, &UA_BYTESTRING_NULL); - /* After the last BrowsePathElement, move members from current to the - * result targets */ + /* Client callback with possibility to request further values */ + fetchMore = callback(client, nodeId, continuationAvail, &res->historyData, callbackContext); - /* Realloc if more space is needed */ - if(targetsSize < result->targetsSize + (*currentCount)) { - UA_BrowsePathTarget *newTargets = - (UA_BrowsePathTarget*)UA_realloc(result->targets, sizeof(UA_BrowsePathTarget) * - (result->targetsSize + (*currentCount))); - if(!newTargets) { - result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; - for(size_t i = 0; i < *currentCount; ++i) - UA_NodeId_deleteMembers(&(*current)[i]); - *currentCount = 0; - return; - } - result->targets = newTargets; - } + /* Regular cleanup */ + UA_HistoryReadResponse_deleteMembers(&response); + } while (continuationAvail); - /* Move the elements of current to the targets */ - addBrowsePathTargets(server, session, result, targetName, *current, *currentCount); - *currentCount = 0; + return retval; } -static void -Operation_TranslateBrowsePathToNodeIds(UA_Server *server, UA_Session *session, - void *context, const UA_BrowsePath *path, - UA_BrowsePathResult *result) { - if(path->relativePath.elementsSize <= 0) { - result->statusCode = UA_STATUSCODE_BADNOTHINGTODO; - return; - } - - /* RelativePath elements must not have an empty targetName */ - for(size_t i = 0; i < path->relativePath.elementsSize; ++i) { - if(UA_QualifiedName_isNull(&path->relativePath.elements[i].targetName)) { - result->statusCode = UA_STATUSCODE_BADBROWSENAMEINVALID; - return; - } - } +#ifdef UA_ENABLE_EXPERIMENTAL_HISTORIZING +UA_StatusCode +UA_Client_HistoryRead_events(UA_Client *client, const UA_NodeId *nodeId, + const UA_HistoricalIteratorCallback callback, + UA_DateTime startTime, UA_DateTime endTime, + UA_String indexRange, const UA_EventFilter filter, UA_UInt32 numValuesPerNode, + UA_TimestampsToReturn timestampsToReturn, void *callbackContext) { - /* Allocate memory for the targets */ - size_t targetsSize = 10; /* When to realloc; the member count is stored in - * result->targetsSize */ - result->targets = - (UA_BrowsePathTarget*)UA_malloc(sizeof(UA_BrowsePathTarget) * targetsSize); - if(!result->targets) { - result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; - return; - } + UA_ReadEventDetails details; + UA_ReadEventDetails_init(&details); + details.filter = filter; - /* Allocate memory for two temporary arrays. One with the results for the - * previous depth of the path. The other for the new results at the current - * depth. The two arrays alternate as we descend down the tree. */ - size_t currentSize = 10; /* When to realloc */ - size_t currentCount = 0; /* Current elements */ - UA_NodeId *current = (UA_NodeId*)UA_malloc(sizeof(UA_NodeId) * currentSize); - if(!current) { - result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; - UA_free(result->targets); - return; - } - size_t nextSize = 10; /* When to realloc */ - size_t nextCount = 0; /* Current elements */ - UA_NodeId *next = (UA_NodeId*)UA_malloc(sizeof(UA_NodeId) * nextSize); - if(!next) { - result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; - UA_free(result->targets); - UA_free(current); - return; - } + // At least two of the following parameters must be set + details.numValuesPerNode = numValuesPerNode; // 0 = return all / max server is capable of + details.startTime = startTime; + details.endTime = endTime; - /* Copy the starting node into current */ - result->statusCode = UA_NodeId_copy(&path->startingNode, ¤t[0]); - if(result->statusCode != UA_STATUSCODE_GOOD) { - UA_free(result->targets); - UA_free(current); - UA_free(next); - return; - } - currentCount = 1; + UA_ExtensionObject detailsExtensionObject; + UA_ExtensionObject_init(&detailsExtensionObject); + detailsExtensionObject.content.decoded.type = &UA_TYPES[UA_TYPES_READEVENTDETAILS]; + detailsExtensionObject.content.decoded.data = &details; + detailsExtensionObject.encoding = UA_EXTENSIONOBJECT_DECODED; - /* Walk the path elements */ - walkBrowsePath(server, session, path, result, targetsSize, - ¤t, ¤tSize, ¤tCount, - &next, &nextSize, &nextCount); + return __UA_Client_HistoryRead_service(client, nodeId, callback, &detailsExtensionObject, + indexRange, timestampsToReturn, callbackContext); +} +#endif // UA_ENABLE_EXPERIMENTAL_HISTORIZING - UA_assert(currentCount == 0); - UA_assert(nextCount == 0); +static UA_StatusCode +__UA_Client_HistoryRead_service_rawMod(UA_Client *client, const UA_NodeId *nodeId, + const UA_HistoricalIteratorCallback callback, + UA_DateTime startTime,UA_DateTime endTime, + UA_String indexRange, UA_Boolean returnBounds, UA_UInt32 numValuesPerNode, + UA_Boolean readModified, UA_TimestampsToReturn timestampsToReturn, + void *callbackContext) { + + UA_ReadRawModifiedDetails details; + UA_ReadRawModifiedDetails_init(&details); + details.isReadModified = readModified; // Return only modified values + details.returnBounds = returnBounds; // Return values pre / post given range + + // At least two of the following parameters must be set + details.numValuesPerNode = numValuesPerNode; // 0 = return all / max server is capable of + details.startTime = startTime; + details.endTime = endTime; + + UA_ExtensionObject detailsExtensionObject; + UA_ExtensionObject_init(&detailsExtensionObject); + detailsExtensionObject.content.decoded.type = &UA_TYPES[UA_TYPES_READRAWMODIFIEDDETAILS]; + detailsExtensionObject.content.decoded.data = &details; + detailsExtensionObject.encoding = UA_EXTENSIONOBJECT_DECODED; + + return __UA_Client_HistoryRead_service(client, nodeId, callback, + &detailsExtensionObject, indexRange, + timestampsToReturn, callbackContext); +} - /* No results => BadNoMatch status code */ - if(result->targetsSize == 0 && result->statusCode == UA_STATUSCODE_GOOD) - result->statusCode = UA_STATUSCODE_BADNOMATCH; +UA_StatusCode +UA_Client_HistoryRead_raw(UA_Client *client, const UA_NodeId *nodeId, + const UA_HistoricalIteratorCallback callback, + UA_DateTime startTime, UA_DateTime endTime, + UA_String indexRange, UA_Boolean returnBounds, UA_UInt32 numValuesPerNode, + UA_TimestampsToReturn timestampsToReturn, void *callbackContext) { - /* Clean up the temporary arrays and the targets */ - UA_free(current); - UA_free(next); - if(result->statusCode != UA_STATUSCODE_GOOD) { - for(size_t i = 0; i < result->targetsSize; ++i) - UA_BrowsePathTarget_deleteMembers(&result->targets[i]); - UA_free(result->targets); - result->targets = NULL; - result->targetsSize = 0; - } + return __UA_Client_HistoryRead_service_rawMod(client, nodeId, callback, startTime, endTime, indexRange, returnBounds, + numValuesPerNode, false, timestampsToReturn, callbackContext); } -UA_BrowsePathResult -UA_Server_translateBrowsePathToNodeIds(UA_Server *server, - const UA_BrowsePath *browsePath) { - UA_BrowsePathResult result; - UA_BrowsePathResult_init(&result); - Operation_TranslateBrowsePathToNodeIds(server, &server->adminSession, NULL, browsePath, &result); - return result; +#ifdef UA_ENABLE_EXPERIMENTAL_HISTORIZING +UA_StatusCode +UA_Client_HistoryRead_modified(UA_Client *client, const UA_NodeId *nodeId, + const UA_HistoricalIteratorCallback callback, + UA_DateTime startTime, UA_DateTime endTime, + UA_String indexRange, UA_Boolean returnBounds, UA_UInt32 maxItems, + UA_TimestampsToReturn timestampsToReturn, void *callbackContext) { + + return __UA_Client_HistoryRead_service_rawMod(client, nodeId, callback, startTime, endTime, indexRange, returnBounds, + maxItems, true, timestampsToReturn, callbackContext); } +#endif // UA_ENABLE_EXPERIMENTAL_HISTORIZING -void -Service_TranslateBrowsePathsToNodeIds(UA_Server *server, UA_Session *session, - const UA_TranslateBrowsePathsToNodeIdsRequest *request, - UA_TranslateBrowsePathsToNodeIdsResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing TranslateBrowsePathsToNodeIdsRequest"); +static UA_HistoryUpdateResponse +__UA_Client_HistoryUpdate(UA_Client *client, + void *details, + size_t typeId) +{ + UA_HistoryUpdateRequest request; + UA_HistoryUpdateRequest_init(&request); - if(server->config.maxNodesPerTranslateBrowsePathsToNodeIds != 0 && - request->browsePathsSize > server->config.maxNodesPerTranslateBrowsePathsToNodeIds) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; - } + UA_ExtensionObject extension; + UA_ExtensionObject_init(&extension); + request.historyUpdateDetailsSize = 1; + request.historyUpdateDetails = &extension; - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, - (UA_ServiceOperation)Operation_TranslateBrowsePathToNodeIds, - NULL, &request->browsePathsSize, &UA_TYPES[UA_TYPES_BROWSEPATH], - &response->resultsSize, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT]); -} + extension.encoding = UA_EXTENSIONOBJECT_DECODED; + extension.content.decoded.type = &UA_TYPES[typeId]; + extension.content.decoded.data = details; -void Service_RegisterNodes(UA_Server *server, UA_Session *session, - const UA_RegisterNodesRequest *request, - UA_RegisterNodesResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing RegisterNodesRequest"); + UA_HistoryUpdateResponse response; + response = UA_Client_Service_historyUpdate(client, request); + //UA_HistoryUpdateRequest_deleteMembers(&request); + return response; +} - //TODO: hang the nodeids to the session if really needed - if(request->nodesToRegisterSize == 0) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO; - return; +static UA_StatusCode +__UA_Client_HistoryUpdate_updateData(UA_Client *client, + const UA_NodeId *nodeId, + UA_PerformUpdateType type, + UA_DataValue *value) +{ + UA_StatusCode ret = UA_STATUSCODE_GOOD; + UA_UpdateDataDetails details; + UA_UpdateDataDetails_init(&details); + + details.performInsertReplace = type; + details.updateValuesSize = 1; + details.updateValues = value; + UA_NodeId_copy(nodeId, &details.nodeId); + + UA_HistoryUpdateResponse response; + response = __UA_Client_HistoryUpdate(client, &details, UA_TYPES_UPDATEDATADETAILS); + if (response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + ret = response.responseHeader.serviceResult; + goto cleanup; } - - if(server->config.maxNodesPerRegisterNodes != 0 && - request->nodesToRegisterSize > server->config.maxNodesPerRegisterNodes) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; + if (response.resultsSize != 1 || response.results[0].operationResultsSize != 1) { + ret = UA_STATUSCODE_BADUNEXPECTEDERROR; + goto cleanup; } - - response->responseHeader.serviceResult = - UA_Array_copy(request->nodesToRegister, request->nodesToRegisterSize, - (void**)&response->registeredNodeIds, &UA_TYPES[UA_TYPES_NODEID]); - if(response->responseHeader.serviceResult == UA_STATUSCODE_GOOD) - response->registeredNodeIdsSize = request->nodesToRegisterSize; + if (response.results[0].statusCode != UA_STATUSCODE_GOOD) { + ret = response.results[0].statusCode; + goto cleanup; + } + ret = response.results[0].operationResults[0]; +cleanup: + UA_HistoryUpdateResponse_deleteMembers(&response); + UA_NodeId_deleteMembers(&details.nodeId); + return ret; } -void Service_UnregisterNodes(UA_Server *server, UA_Session *session, - const UA_UnregisterNodesRequest *request, - UA_UnregisterNodesResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing UnRegisterNodesRequest"); +UA_StatusCode +UA_Client_HistoryUpdate_insert(UA_Client *client, + const UA_NodeId *nodeId, + UA_DataValue *value) +{ + return __UA_Client_HistoryUpdate_updateData(client, + nodeId, + UA_PERFORMUPDATETYPE_INSERT, + value); +} - //TODO: remove the nodeids from the session if really needed - if(request->nodesToUnregisterSize == 0) - response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO; +UA_StatusCode +UA_Client_HistoryUpdate_replace(UA_Client *client, + const UA_NodeId *nodeId, + UA_DataValue *value) +{ + return __UA_Client_HistoryUpdate_updateData(client, + nodeId, + UA_PERFORMUPDATETYPE_REPLACE, + value); +} - if(server->config.maxNodesPerRegisterNodes != 0 && - request->nodesToUnregisterSize > server->config.maxNodesPerRegisterNodes) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; - } +UA_StatusCode +UA_Client_HistoryUpdate_update(UA_Client *client, + const UA_NodeId *nodeId, + UA_DataValue *value) +{ + return __UA_Client_HistoryUpdate_updateData(client, + nodeId, + UA_PERFORMUPDATETYPE_UPDATE, + value); } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_services_call.c" ***********************************/ +UA_StatusCode +UA_Client_HistoryUpdate_deleteRaw(UA_Client *client, + const UA_NodeId *nodeId, + UA_DateTime startTimestamp, + UA_DateTime endTimestamp) +{ + UA_StatusCode ret = UA_STATUSCODE_GOOD; -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2015 (c) Chris Iatrou - * Copyright 2015-2017 (c) Florian Palm - * Copyright 2015-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2015-2016 (c) Sten Grüner - * Copyright 2015 (c) Oleksiy Vasylyev - * Copyright 2016 (c) LEvertz - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) Julian Grothoff - */ + UA_DeleteRawModifiedDetails details; + UA_DeleteRawModifiedDetails_init(&details); + details.isDeleteModified = false; + details.startTime = startTimestamp; + details.endTime = endTimestamp; + UA_NodeId_copy(nodeId, &details.nodeId); -#ifdef UA_ENABLE_METHODCALLS /* conditional compilation */ + UA_HistoryUpdateResponse response; + response = __UA_Client_HistoryUpdate(client, &details, UA_TYPES_DELETERAWMODIFIEDDETAILS); + if (response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + ret = response.responseHeader.serviceResult; + goto cleanup; + } + if (response.resultsSize != 1) { + ret = UA_STATUSCODE_BADUNEXPECTEDERROR; + goto cleanup; + } -static const UA_VariableNode * -getArgumentsVariableNode(UA_Server *server, const UA_MethodNode *ofMethod, - UA_String withBrowseName) { - UA_NodeId hasProperty = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY); - for(size_t i = 0; i < ofMethod->referencesSize; ++i) { - UA_NodeReferenceKind *rk = &ofMethod->references[i]; + ret = response.results[0].statusCode; - if(rk->isInverse != false) - continue; +cleanup: + UA_HistoryUpdateResponse_deleteMembers(&response); + UA_NodeId_deleteMembers(&details.nodeId); + return ret; +} +#endif // UA_ENABLE_HISTORIZING - if(!UA_NodeId_equal(&hasProperty, &rk->referenceTypeId)) - continue; +/* Async Functions */ - for(size_t j = 0; j < rk->targetIdsSize; ++j) { - const UA_Node *refTarget = - server->config.nodestore.getNode(server->config.nodestore.context, - &rk->targetIds[j].nodeId); - if(!refTarget) - continue; - if(refTarget->nodeClass == UA_NODECLASS_VARIABLE && - refTarget->browseName.namespaceIndex == 0 && - UA_String_equal(&withBrowseName, &refTarget->browseName.name)) { - return (const UA_VariableNode*)refTarget; - } - server->config.nodestore.releaseNode(server->config.nodestore.context, - refTarget); +static +void ValueAttributeRead(UA_Client *client, void *userdata, + UA_UInt32 requestId, void *response) { + if(!response) + return; + + /* Find the callback for the response */ + CustomCallback *cc; + LIST_FOREACH(cc, &client->customCallbacks, pointers) { + if(cc->callbackId == requestId) + break; + } + if(!cc) + return; + + UA_ReadResponse *rr = (UA_ReadResponse *) response; + UA_DataValue *res = rr->results; + UA_Boolean done = false; + if(rr->resultsSize == 1 && res != NULL && res->hasValue) { + if(cc->attributeId == UA_ATTRIBUTEID_VALUE) { + /* Call directly with the variant */ + cc->callback(client, userdata, requestId, &res->value); + done = true; + } else if(UA_Variant_isScalar(&res->value) && + res->value.type == cc->outDataType) { + /* Unpack the value */ + UA_STACKARRAY(UA_Byte, value, cc->outDataType->memSize); + memcpy(&value, res->value.data, cc->outDataType->memSize); + cc->callback(client, userdata, requestId, &value); + done = true; } } - return NULL; + + /* Could not process, delete the callback anyway */ + if(!done) + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Cannot process the response to the async read " + "request %u", requestId); + + LIST_REMOVE(cc, pointers); + UA_free(cc); } -static UA_StatusCode -typeCheckArguments(UA_Server *server, UA_Session *session, - const UA_VariableNode *argRequirements, size_t argsSize, - UA_Variant *args, UA_StatusCode *inputArgumentResults) { - /* Verify that we have a Variant containing UA_Argument (scalar or array) in - * the "InputArguments" node */ - if(argRequirements->valueSource != UA_VALUESOURCE_DATA) - return UA_STATUSCODE_BADINTERNALERROR; - if(!argRequirements->value.data.value.hasValue) - return UA_STATUSCODE_BADINTERNALERROR; - if(argRequirements->value.data.value.value.type != &UA_TYPES[UA_TYPES_ARGUMENT]) - return UA_STATUSCODE_BADINTERNALERROR; +/*Read Attributes*/ +UA_StatusCode __UA_Client_readAttribute_async(UA_Client *client, + const UA_NodeId *nodeId, UA_AttributeId attributeId, + const UA_DataType *outDataType, UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + UA_ReadValueId item; + UA_ReadValueId_init(&item); + item.nodeId = *nodeId; + item.attributeId = attributeId; + UA_ReadRequest request; + UA_ReadRequest_init(&request); + request.nodesToRead = &item; + request.nodesToReadSize = 1; - /* Verify the number of arguments. A scalar argument value is interpreted as - * an array of length 1. */ - size_t argReqsSize = argRequirements->value.data.value.value.arrayLength; - if(UA_Variant_isScalar(&argRequirements->value.data.value.value)) - argReqsSize = 1; - if(argReqsSize > argsSize) - return UA_STATUSCODE_BADARGUMENTSMISSING; - if(argReqsSize < argsSize) - return UA_STATUSCODE_BADTOOMANYARGUMENTS; + __UA_Client_AsyncService(client, &request, &UA_TYPES[UA_TYPES_READREQUEST], + ValueAttributeRead, &UA_TYPES[UA_TYPES_READRESPONSE], + userdata, reqId); + + CustomCallback *cc = (CustomCallback*) UA_malloc(sizeof(CustomCallback)); + if (!cc) + return UA_STATUSCODE_BADOUTOFMEMORY; + cc->callback = callback; + cc->callbackId = *reqId; + + cc->attributeId = attributeId; + cc->outDataType = outDataType; + + LIST_INSERT_HEAD(&client->customCallbacks, cc, pointers); - /* Type-check every argument against the definition */ - UA_Argument *argReqs = (UA_Argument*)argRequirements->value.data.value.value.data; - for(size_t i = 0; i < argReqsSize; ++i) { - if(!compatibleValue(server, session, &argReqs[i].dataType, argReqs[i].valueRank, - argReqs[i].arrayDimensionsSize, argReqs[i].arrayDimensions, - &args[i], NULL)) - return UA_STATUSCODE_BADTYPEMISMATCH; - } return UA_STATUSCODE_GOOD; } -static UA_StatusCode -validMethodArguments(UA_Server *server, UA_Session *session, const UA_MethodNode *method, - const UA_CallMethodRequest *request, - UA_StatusCode *inputArgumentResults) { - /* Get the input arguments node */ - const UA_VariableNode *inputArguments = - getArgumentsVariableNode(server, method, UA_STRING("InputArguments")); - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(!inputArguments) { - if(request->inputArgumentsSize > 0) - retval = UA_STATUSCODE_BADINVALIDARGUMENT; - return retval; - } +/*Write Attributes*/ +UA_StatusCode __UA_Client_writeAttribute_async(UA_Client *client, + const UA_NodeId *nodeId, UA_AttributeId attributeId, const void *in, + const UA_DataType *inDataType, UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + if (!in) + return UA_STATUSCODE_BADTYPEMISMATCH; - /* Verify the request */ - retval = typeCheckArguments(server, session, inputArguments, - request->inputArgumentsSize, - request->inputArguments, - inputArgumentResults); + UA_WriteValue wValue; + UA_WriteValue_init(&wValue); + wValue.nodeId = *nodeId; + wValue.attributeId = attributeId; + if (attributeId == UA_ATTRIBUTEID_VALUE) + wValue.value.value = *(const UA_Variant*) in; + else + /* hack. is never written into. */ + UA_Variant_setScalar(&wValue.value.value, (void*) (uintptr_t) in, + inDataType); + wValue.value.hasValue = true; + UA_WriteRequest wReq; + UA_WriteRequest_init(&wReq); + wReq.nodesToWrite = &wValue; + wReq.nodesToWriteSize = 1; - /* Release the input arguments node */ - server->config.nodestore.releaseNode(server->config.nodestore.context, - (const UA_Node*)inputArguments); - return retval; + return __UA_Client_AsyncService(client, &wReq, + &UA_TYPES[UA_TYPES_WRITEREQUEST], callback, + &UA_TYPES[UA_TYPES_WRITERESPONSE], userdata, reqId); } -static const UA_NodeId hasComponentNodeId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASCOMPONENT}}; -static const UA_NodeId hasSubTypeNodeId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASSUBTYPE}}; +/*Node Management*/ -static void -callWithMethodAndObject(UA_Server *server, UA_Session *session, - const UA_CallMethodRequest *request, UA_CallMethodResult *result, - const UA_MethodNode *method, const UA_ObjectNode *object) { - /* Verify the object's NodeClass */ - if(object->nodeClass != UA_NODECLASS_OBJECT && - object->nodeClass != UA_NODECLASS_OBJECTTYPE) { - result->statusCode = UA_STATUSCODE_BADNODECLASSINVALID; - return; - } +UA_StatusCode UA_EXPORT +__UA_Client_addNode_async(UA_Client *client, const UA_NodeClass nodeClass, + const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId, + const UA_NodeId referenceTypeId, const UA_QualifiedName browseName, + const UA_NodeId typeDefinition, const UA_NodeAttributes *attr, + const UA_DataType *attributeType, UA_NodeId *outNewNodeId, + UA_ClientAsyncServiceCallback callback, void *userdata, + UA_UInt32 *reqId) { + UA_AddNodesRequest request; + UA_AddNodesRequest_init(&request); + UA_AddNodesItem item; + UA_AddNodesItem_init(&item); + item.parentNodeId.nodeId = parentNodeId; + item.referenceTypeId = referenceTypeId; + item.requestedNewNodeId.nodeId = requestedNewNodeId; + item.browseName = browseName; + item.nodeClass = nodeClass; + item.typeDefinition.nodeId = typeDefinition; + item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; + item.nodeAttributes.content.decoded.type = attributeType; + item.nodeAttributes.content.decoded.data = (void*) (uintptr_t) attr; // hack. is not written into. + request.nodesToAdd = &item; + request.nodesToAddSize = 1; - /* Verify the method's NodeClass */ - if(method->nodeClass != UA_NODECLASS_METHOD) { - result->statusCode = UA_STATUSCODE_BADNODECLASSINVALID; - return; - } + return __UA_Client_AsyncService(client, &request, + &UA_TYPES[UA_TYPES_ADDNODESREQUEST], callback, + &UA_TYPES[UA_TYPES_ADDNODESRESPONSE], userdata, reqId); - /* Is there a method to execute? */ - if(!method->method) { - result->statusCode = UA_STATUSCODE_BADINTERNALERROR; - return; - } +} - /* Verify method/object relations. Object must have a hasComponent or a - * subtype of hasComponent reference to the method node. Therefore, check - * every reference between the parent object and the method node if there is - * a hasComponent (or subtype) reference */ - UA_Boolean found = false; - for(size_t i = 0; i < object->referencesSize && !found; ++i) { - UA_NodeReferenceKind *rk = &object->references[i]; - if(rk->isInverse) - continue; - if(!isNodeInTree(&server->config.nodestore, &rk->referenceTypeId, - &hasComponentNodeId, &hasSubTypeNodeId, 1)) - continue; - for(size_t j = 0; j < rk->targetIdsSize; ++j) { - if(UA_NodeId_equal(&rk->targetIds[j].nodeId, &request->methodId)) { - found = true; - break; - } - } - } - if(!found) { - result->statusCode = UA_STATUSCODE_BADMETHODINVALID; - return; - } +/* Misc Highlevel Functions */ +#ifdef UA_ENABLE_METHODCALLS +UA_StatusCode __UA_Client_call_async(UA_Client *client, + const UA_NodeId objectId, const UA_NodeId methodId, size_t inputSize, + const UA_Variant *input, UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { - /* Verify access rights */ - UA_Boolean executable = method->executable; - if(session != &server->adminSession) - executable = executable && - server->config.accessControl.getUserExecutableOnObject(server, - &server->config.accessControl, &session->sessionId, - session->sessionHandle, &request->methodId, method->context, - &request->objectId, object->context); - if(!executable) { - result->statusCode = UA_STATUSCODE_BADNOTWRITABLE; // There is no NOTEXECUTABLE? - return; - } + UA_CallRequest request; + UA_CallRequest_init(&request); + UA_CallMethodRequest item; + UA_CallMethodRequest_init(&item); + item.methodId = methodId; + item.objectId = objectId; + item.inputArguments = (UA_Variant *) (void*) (uintptr_t) input; // cast const... + item.inputArgumentsSize = inputSize; + request.methodsToCall = &item; + request.methodsToCallSize = 1; - /* Verify Input Arguments */ - result->statusCode = validMethodArguments(server, session, method, request, result->inputArgumentResults); + return __UA_Client_AsyncService(client, &request, + &UA_TYPES[UA_TYPES_CALLREQUEST], callback, + &UA_TYPES[UA_TYPES_CALLRESPONSE], userdata, reqId); +} +#endif - /* Return inputArgumentResults only for BADINVALIDARGUMENT */ - if(result->statusCode != UA_STATUSCODE_BADINVALIDARGUMENT) { - UA_Array_delete(result->inputArgumentResults, result->inputArgumentResultsSize, - &UA_TYPES[UA_TYPES_STATUSCODE]); - result->inputArgumentResults = NULL; - result->inputArgumentResultsSize = 0; +UA_StatusCode __UA_Client_translateBrowsePathsToNodeIds_async(UA_Client *client, + char *paths[], UA_UInt32 ids[], size_t pathSize, + UA_ClientAsyncServiceCallback callback, void *userdata, + UA_UInt32 *reqId) { + + UA_BrowsePath browsePath; + UA_BrowsePath_init(&browsePath); + browsePath.startingNode = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER); + browsePath.relativePath.elements = (UA_RelativePathElement*) UA_Array_new( + pathSize, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]); + if (!browsePath.relativePath.elements) + return UA_STATUSCODE_BADOUTOFMEMORY; + browsePath.relativePath.elementsSize = pathSize; + + UA_TranslateBrowsePathsToNodeIdsRequest request; + UA_TranslateBrowsePathsToNodeIdsRequest_init(&request); + request.browsePaths = &browsePath; + request.browsePathsSize = 1; + + UA_StatusCode retval = __UA_Client_AsyncService(client, &request, + &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST], callback, + &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE], userdata, + reqId); + if (retval != UA_STATUSCODE_GOOD) { + UA_Array_delete(browsePath.relativePath.elements, + browsePath.relativePath.elementsSize, + &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]); + return retval; } + UA_BrowsePath_deleteMembers(&browsePath); + return retval; +} - /* Error during type-checking? */ - if(result->statusCode != UA_STATUSCODE_GOOD) - return; +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/client/ua_client_subscriptions.c" ***********************************/ - /* Get the output arguments node */ - const UA_VariableNode *outputArguments = - getArgumentsVariableNode(server, method, UA_STRING("OutputArguments")); +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2015 (c) Oleksiy Vasylyev + * Copyright 2016 (c) Sten Grüner + * Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA + * Copyright 2016-2017 (c) Florian Palm + * Copyright 2017 (c) Frank Meerkötter + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + */ - /* Allocate the output arguments array */ - if(outputArguments) { - if(outputArguments->value.data.value.value.arrayLength > 0) { - result->outputArguments = (UA_Variant*) - UA_Array_new(outputArguments->value.data.value.value.arrayLength, - &UA_TYPES[UA_TYPES_VARIANT]); - if(!result->outputArguments) { - result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; - return; - } - result->outputArgumentsSize = outputArguments->value.data.value.value.arrayLength; - } - /* Release the output arguments node */ - server->config.nodestore.releaseNode(server->config.nodestore.context, - (const UA_Node*)outputArguments); - } - /* Call the method */ - result->statusCode = method->method(server, &session->sessionId, session->sessionHandle, - &method->nodeId, method->context, - &object->nodeId, object->context, - request->inputArgumentsSize, request->inputArguments, - result->outputArgumentsSize, result->outputArguments); - /* TODO: Verify Output matches the argument definition */ -} +#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */ -static void -Operation_CallMethod(UA_Server *server, UA_Session *session, void *context, - const UA_CallMethodRequest *request, UA_CallMethodResult *result) { - /* Get the method node */ - const UA_MethodNode *method = (const UA_MethodNode*) - server->config.nodestore.getNode(server->config.nodestore.context, - &request->methodId); - if(!method) { - result->statusCode = UA_STATUSCODE_BADMETHODINVALID; - return; +/*****************/ +/* Subscriptions */ +/*****************/ + +UA_CreateSubscriptionResponse UA_EXPORT +UA_Client_Subscriptions_create(UA_Client *client, + const UA_CreateSubscriptionRequest request, + void *subscriptionContext, + UA_Client_StatusChangeNotificationCallback statusChangeCallback, + UA_Client_DeleteSubscriptionCallback deleteCallback) { + UA_CreateSubscriptionResponse response; + UA_CreateSubscriptionResponse_init(&response); + + /* Allocate the internal representation */ + UA_Client_Subscription *newSub = (UA_Client_Subscription*) + UA_malloc(sizeof(UA_Client_Subscription)); + if(!newSub) { + response.responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + return response; } - /* Get the object node */ - const UA_ObjectNode *object = (const UA_ObjectNode*) - server->config.nodestore.getNode(server->config.nodestore.context, - &request->objectId); - if(!object) { - result->statusCode = UA_STATUSCODE_BADNODEIDINVALID; - server->config.nodestore.releaseNode(server->config.nodestore.context, - (const UA_Node*)method); - return; + /* Send the request as a synchronous service call */ + __UA_Client_Service(client, + &request, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST], + &response, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]); + if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_free(newSub); + return response; } - /* Continue with method and object as context */ - callWithMethodAndObject(server, session, request, result, method, object); + /* Prepare the internal representation */ + newSub->context = subscriptionContext; + newSub->subscriptionId = response.subscriptionId; + newSub->sequenceNumber = 0; + newSub->lastActivity = UA_DateTime_nowMonotonic(); + newSub->statusChangeCallback = statusChangeCallback; + newSub->deleteCallback = deleteCallback; + newSub->publishingInterval = response.revisedPublishingInterval; + newSub->maxKeepAliveCount = response.revisedMaxKeepAliveCount; + LIST_INIT(&newSub->monitoredItems); + LIST_INSERT_HEAD(&client->subscriptions, newSub, listEntry); - /* Release the method and object node */ - server->config.nodestore.releaseNode(server->config.nodestore.context, - (const UA_Node*)method); - server->config.nodestore.releaseNode(server->config.nodestore.context, - (const UA_Node*)object); + return response; } -void Service_Call(UA_Server *server, UA_Session *session, - const UA_CallRequest *request, - UA_CallResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing CallRequest"); +static UA_Client_Subscription * +findSubscription(const UA_Client *client, UA_UInt32 subscriptionId) { + UA_Client_Subscription *sub = NULL; + LIST_FOREACH(sub, &client->subscriptions, listEntry) { + if(sub->subscriptionId == subscriptionId) + break; + } + return sub; +} - if(server->config.maxNodesPerMethodCall != 0 && - request->methodsToCallSize > server->config.maxNodesPerMethodCall) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; +UA_ModifySubscriptionResponse UA_EXPORT +UA_Client_Subscriptions_modify(UA_Client *client, const UA_ModifySubscriptionRequest request) { + UA_ModifySubscriptionResponse response; + UA_ModifySubscriptionResponse_init(&response); + + /* Find the internal representation */ + UA_Client_Subscription *sub = findSubscription(client, request.subscriptionId); + if(!sub) { + response.responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; + return response; } + + /* Call the service */ + __UA_Client_Service(client, + &request, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST], + &response, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]); - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_CallMethod, NULL, - &request->methodsToCallSize, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST], - &response->resultsSize, &UA_TYPES[UA_TYPES_CALLMETHODRESULT]); + /* Adjust the internal representation */ + sub->publishingInterval = response.revisedPublishingInterval; + sub->maxKeepAliveCount = response.revisedMaxKeepAliveCount; + return response; } -UA_CallMethodResult UA_EXPORT -UA_Server_call(UA_Server *server, const UA_CallMethodRequest *request) { - UA_CallMethodResult result; - UA_CallMethodResult_init(&result); - Operation_CallMethod(server, &server->adminSession, NULL, request, &result); - return result; +static void +UA_Client_Subscription_deleteInternal(UA_Client *client, UA_Client_Subscription *sub) { + /* Remove the MonitoredItems */ + UA_Client_MonitoredItem *mon, *mon_tmp; + LIST_FOREACH_SAFE(mon, &sub->monitoredItems, listEntry, mon_tmp) + UA_Client_MonitoredItem_remove(client, sub, mon); + + /* Call the delete callback */ + if(sub->deleteCallback) + sub->deleteCallback(client, sub->subscriptionId, sub->context); + + /* Remove */ + LIST_REMOVE(sub, listEntry); + UA_free(sub); } -#endif /* UA_ENABLE_METHODCALLS */ +UA_DeleteSubscriptionsResponse UA_EXPORT +UA_Client_Subscriptions_delete(UA_Client *client, const UA_DeleteSubscriptionsRequest request) { + UA_STACKARRAY(UA_Client_Subscription*, subs, request.subscriptionIdsSize); + memset(subs, 0, sizeof(void*) * request.subscriptionIdsSize); -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_services_session.c" ***********************************/ + /* temporary remove the subscriptions from the list */ + for(size_t i = 0; i < request.subscriptionIdsSize; i++) { + subs[i] = findSubscription(client, request.subscriptionIds[i]); + if (subs[i]) + LIST_REMOVE(subs[i], listEntry); + } -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2014-2018 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2014-2017 (c) Florian Palm - * Copyright 2014-2016 (c) Sten Grüner - * Copyright 2015 (c) Chris Iatrou - * Copyright 2015 (c) Oleksiy Vasylyev - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB - */ + /* Send the request */ + UA_DeleteSubscriptionsResponse response; + __UA_Client_Service(client, + &request, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST], + &response, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]); + if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) + goto cleanup; + if(request.subscriptionIdsSize != response.resultsSize) { + response.responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; + goto cleanup; + } -static UA_StatusCode -signCreateSessionResponse(UA_Server *server, UA_SecureChannel *channel, - const UA_CreateSessionRequest *request, - UA_CreateSessionResponse *response) { - if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && - channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) - return UA_STATUSCODE_GOOD; + /* Loop over the removed subscriptions and remove internally */ + for(size_t i = 0; i < request.subscriptionIdsSize; i++) { + if(response.results[i] != UA_STATUSCODE_GOOD && + response.results[i] != UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID) { + /* Something was wrong, reinsert the subscription in the list */ + if (subs[i]) + LIST_INSERT_HEAD(&client->subscriptions, subs[i], listEntry); + continue; + } - const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy; - UA_SignatureData *signatureData = &response->serverSignature; + if(!subs[i]) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "No internal representation of subscription %u", + request.subscriptionIds[i]); + continue; + } + + LIST_INSERT_HEAD(&client->subscriptions, subs[i], listEntry); + UA_Client_Subscription_deleteInternal(client, subs[i]); + } - /* Prepare the signature */ - size_t signatureSize = securityPolicy->certificateSigningAlgorithm. - getLocalSignatureSize(securityPolicy, channel->channelContext); - UA_StatusCode retval = UA_String_copy(&securityPolicy->certificateSigningAlgorithm.uri, - &signatureData->algorithm); - retval |= UA_ByteString_allocBuffer(&signatureData->signature, signatureSize); - if(retval != UA_STATUSCODE_GOOD) - return retval; + return response; - /* Allocate a temp buffer */ - size_t dataToSignSize = request->clientCertificate.length + request->clientNonce.length; - UA_ByteString dataToSign; - retval = UA_ByteString_allocBuffer(&dataToSign, dataToSignSize); - if(retval != UA_STATUSCODE_GOOD) - return retval; /* signatureData->signature is cleaned up with the response */ +cleanup: + for(size_t i = 0; i < request.subscriptionIdsSize; i++) { + if (subs[i]) { + LIST_INSERT_HEAD(&client->subscriptions, subs[i], listEntry); + } + } + return response; +} - /* Sign the signature */ - memcpy(dataToSign.data, request->clientCertificate.data, request->clientCertificate.length); - memcpy(dataToSign.data + request->clientCertificate.length, - request->clientNonce.data, request->clientNonce.length); - retval = securityPolicy->certificateSigningAlgorithm. - sign(securityPolicy, channel->channelContext, &dataToSign, &signatureData->signature); +UA_StatusCode UA_EXPORT +UA_Client_Subscriptions_deleteSingle(UA_Client *client, UA_UInt32 subscriptionId) { + UA_DeleteSubscriptionsRequest request; + UA_DeleteSubscriptionsRequest_init(&request); + request.subscriptionIds = &subscriptionId; + request.subscriptionIdsSize = 1; + + UA_DeleteSubscriptionsResponse response = + UA_Client_Subscriptions_delete(client, request); - /* Clean up */ - UA_ByteString_deleteMembers(&dataToSign); + UA_StatusCode retval = response.responseHeader.serviceResult; + if(retval != UA_STATUSCODE_GOOD) { + UA_DeleteSubscriptionsResponse_deleteMembers(&response); + return retval; + } + + if(response.resultsSize != 1) { + UA_DeleteSubscriptionsResponse_deleteMembers(&response); + return UA_STATUSCODE_BADINTERNALERROR; + } + + retval = response.results[0]; + UA_DeleteSubscriptionsResponse_deleteMembers(&response); return retval; } +/******************/ +/* MonitoredItems */ +/******************/ + void -Service_CreateSession(UA_Server *server, UA_SecureChannel *channel, - const UA_CreateSessionRequest *request, - UA_CreateSessionResponse *response) { - if(!channel) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; - return; - } +UA_Client_MonitoredItem_remove(UA_Client *client, UA_Client_Subscription *sub, + UA_Client_MonitoredItem *mon) { + // NOLINTNEXTLINE + LIST_REMOVE(mon, listEntry); + if(mon->deleteCallback) + mon->deleteCallback(client, sub->subscriptionId, sub->context, + mon->monitoredItemId, mon->context); + UA_free(mon); +} - if(!channel->connection) { +static void +__UA_Client_MonitoredItems_create(UA_Client *client, + const UA_CreateMonitoredItemsRequest *request, + void **contexts, void **handlingCallbacks, + UA_Client_DeleteMonitoredItemCallback *deleteCallbacks, + UA_CreateMonitoredItemsResponse *response) { + UA_CreateMonitoredItemsResponse_init(response); + + if (!request->itemsToCreateSize) { response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; return; } - UA_LOG_DEBUG_CHANNEL(server->config.logger, channel, "Trying to create session"); - - if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || - channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { - /* Compare the clientCertificate with the remoteCertificate of the channel. - * Both the clientCertificate of this request and the remoteCertificate - * of the channel may contain a partial or a complete certificate chain. - * The compareCertificate function of the channelModule will compare the - * first certificate of each chain. The end certificate shall be located - * first in the chain according to the OPC UA specification Part 6 (1.04), - * chapter 6.2.3.*/ - if(channel->securityPolicy->channelModule.compareCertificate(channel->channelContext, - &request->clientCertificate) != UA_STATUSCODE_GOOD) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADCERTIFICATEINVALID; - return; + /* Fix clang warning */ + size_t itemsToCreateSize = request->itemsToCreateSize; + UA_Client_Subscription *sub = NULL; + + /* Allocate the memory for internal representations */ + UA_STACKARRAY(UA_Client_MonitoredItem*, mis, itemsToCreateSize); + memset(mis, 0, sizeof(void*) * itemsToCreateSize); + for(size_t i = 0; i < itemsToCreateSize; i++) { + mis[i] = (UA_Client_MonitoredItem*)UA_malloc(sizeof(UA_Client_MonitoredItem)); + if(!mis[i]) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; + goto cleanup; } } - if(channel->securityToken.channelId == 0) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADSECURECHANNELIDINVALID; - return; + /* Get the subscription */ + sub = findSubscription(client, request->subscriptionId); + if(!sub) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; + goto cleanup; } - if(!UA_ByteString_equal(&channel->securityPolicy->policyUri, - &UA_SECURITY_POLICY_NONE_URI) && - request->clientNonce.length < 32) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADNONCEINVALID; - return; - } + /* Set the clientHandle */ + for(size_t i = 0; i < itemsToCreateSize; i++) + request->itemsToCreate[i].requestedParameters.clientHandle = ++(client->monitoredItemHandles); - /* TODO: Compare application URI with certificate uri (decode certificate) */ - UA_CertificateVerification *cv = channel->securityPolicy->certificateVerification; - if(cv && cv->verifyApplicationURI) { - response->responseHeader.serviceResult = - cv->verifyApplicationURI(cv->context, &request->clientCertificate, - &request->clientDescription.applicationUri); - if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) - return; - } + /* Call the service */ + __UA_Client_Service(client, request, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST], + response, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]); + if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) + goto cleanup; - UA_Session *newSession = NULL; - response->responseHeader.serviceResult = - UA_SessionManager_createSession(&server->sessionManager, channel, request, &newSession); - if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_LOG_DEBUG_CHANNEL(server->config.logger, channel, - "Processing CreateSessionRequest failed"); - return; + if(response->resultsSize != itemsToCreateSize) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; + goto cleanup; } - UA_assert(newSession != NULL); + /* Add internally */ + for(size_t i = 0; i < itemsToCreateSize; i++) { + if(response->results[i].statusCode != UA_STATUSCODE_GOOD) { + if (deleteCallbacks[i]) + deleteCallbacks[i](client, sub->subscriptionId, sub->context, 0, contexts[i]); + UA_free(mis[i]); + mis[i] = NULL; + continue; + } + + UA_Client_MonitoredItem *newMon = mis[i]; + newMon->clientHandle = request->itemsToCreate[i].requestedParameters.clientHandle; + newMon->monitoredItemId = response->results[i].monitoredItemId; + newMon->context = contexts[i]; + newMon->deleteCallback = deleteCallbacks[i]; + newMon->handler.dataChangeCallback = + (UA_Client_DataChangeNotificationCallback)(uintptr_t)handlingCallbacks[i]; + newMon->isEventMonitoredItem = + (request->itemsToCreate[i].itemToMonitor.attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER); + LIST_INSERT_HEAD(&sub->monitoredItems, newMon, listEntry); - /* Allocate the response */ - response->serverEndpoints = (UA_EndpointDescription *) - UA_Array_new(server->config.endpointsSize, - &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); - if(!response->serverEndpoints) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; - UA_SessionManager_removeSession(&server->sessionManager, - &newSession->header.authenticationToken); - return; + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Subscription %u | Added a MonitoredItem with handle %u", + sub->subscriptionId, newMon->clientHandle); } - response->serverEndpointsSize = server->config.endpointsSize; - /* Copy the server's endpointdescriptions into the response */ - for(size_t i = 0; i < server->config.endpointsSize; ++i) - response->responseHeader.serviceResult |= - UA_EndpointDescription_copy(&server->config.endpoints[i].endpointDescription, - &response->serverEndpoints[i]); - if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_SessionManager_removeSession(&server->sessionManager, - &newSession->header.authenticationToken); - return; - } + return; - /* Mirror back the endpointUrl */ - for(size_t i = 0; i < response->serverEndpointsSize; ++i) { - UA_String_deleteMembers(&response->serverEndpoints[i].endpointUrl); - response->responseHeader.serviceResult |= - UA_String_copy(&request->endpointUrl, - &response->serverEndpoints[i].endpointUrl); + cleanup: + for(size_t i = 0; i < itemsToCreateSize; i++) { + if (deleteCallbacks[i]) { + if (sub) + deleteCallbacks[i](client, sub->subscriptionId, sub->context, 0, contexts[i]); + else + deleteCallbacks[i](client, 0, NULL, 0, contexts[i]); + } + if(mis[i]) + UA_free(mis[i]); } +} - /* Attach the session to the channel. But don't activate for now. */ - UA_Session_attachToSecureChannel(newSession, channel); +UA_CreateMonitoredItemsResponse UA_EXPORT +UA_Client_MonitoredItems_createDataChanges(UA_Client *client, + const UA_CreateMonitoredItemsRequest request, void **contexts, + UA_Client_DataChangeNotificationCallback *callbacks, + UA_Client_DeleteMonitoredItemCallback *deleteCallbacks) { + UA_CreateMonitoredItemsResponse response; + __UA_Client_MonitoredItems_create(client, &request, contexts, + (void**)(uintptr_t)callbacks, deleteCallbacks, &response); + return response; +} - /* Fill the session information */ - newSession->maxResponseMessageSize = request->maxResponseMessageSize; - newSession->maxRequestMessageSize = - channel->connection->localConf.maxMessageSize; - response->responseHeader.serviceResult |= - UA_ApplicationDescription_copy(&request->clientDescription, - &newSession->clientDescription); +UA_MonitoredItemCreateResult UA_EXPORT +UA_Client_MonitoredItems_createDataChange(UA_Client *client, UA_UInt32 subscriptionId, + UA_TimestampsToReturn timestampsToReturn, const UA_MonitoredItemCreateRequest item, + void *context, UA_Client_DataChangeNotificationCallback callback, + UA_Client_DeleteMonitoredItemCallback deleteCallback) { + UA_CreateMonitoredItemsRequest request; + UA_CreateMonitoredItemsRequest_init(&request); + request.subscriptionId = subscriptionId; + request.timestampsToReturn = timestampsToReturn; + request.itemsToCreate = (UA_MonitoredItemCreateRequest*)(uintptr_t)&item; + request.itemsToCreateSize = 1; + UA_CreateMonitoredItemsResponse response = + UA_Client_MonitoredItems_createDataChanges(client, request, &context, + &callback, &deleteCallback); + UA_MonitoredItemCreateResult result; + UA_MonitoredItemCreateResult_init(&result); + if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) + result.statusCode = response.responseHeader.serviceResult; - /* Prepare the response */ - response->sessionId = newSession->sessionId; - response->revisedSessionTimeout = (UA_Double)newSession->timeout; - response->authenticationToken = newSession->header.authenticationToken; - response->responseHeader.serviceResult |= - UA_String_copy(&request->sessionName, &newSession->sessionName); + if(result.statusCode == UA_STATUSCODE_GOOD && + response.resultsSize != 1) + result.statusCode = UA_STATUSCODE_BADINTERNALERROR; + + if(result.statusCode == UA_STATUSCODE_GOOD) + UA_MonitoredItemCreateResult_copy(&response.results[0] , &result); + UA_CreateMonitoredItemsResponse_deleteMembers(&response); + return result; +} - UA_ByteString_init(&response->serverCertificate); +UA_CreateMonitoredItemsResponse UA_EXPORT +UA_Client_MonitoredItems_createEvents(UA_Client *client, + const UA_CreateMonitoredItemsRequest request, void **contexts, + UA_Client_EventNotificationCallback *callback, + UA_Client_DeleteMonitoredItemCallback *deleteCallback) { + UA_CreateMonitoredItemsResponse response; + __UA_Client_MonitoredItems_create(client, &request, contexts, + (void**)(uintptr_t)callback, deleteCallback, &response); + return response; +} - if(server->config.endpointsSize > 0) - for(size_t i = 0; i < response->serverEndpointsSize; ++i) { - if(response->serverEndpoints[i].securityMode==channel->securityMode && - UA_ByteString_equal(&response->serverEndpoints[i].securityPolicyUri, - &channel->securityPolicy->policyUri) && - UA_String_equal(&response->serverEndpoints[i].endpointUrl, - &request->endpointUrl)) - { - response->responseHeader.serviceResult |= - UA_ByteString_copy(&response->serverEndpoints[i].serverCertificate, - &response->serverCertificate); - } - } +UA_MonitoredItemCreateResult UA_EXPORT +UA_Client_MonitoredItems_createEvent(UA_Client *client, UA_UInt32 subscriptionId, + UA_TimestampsToReturn timestampsToReturn, const UA_MonitoredItemCreateRequest item, + void *context, UA_Client_EventNotificationCallback callback, + UA_Client_DeleteMonitoredItemCallback deleteCallback) { + UA_CreateMonitoredItemsRequest request; + UA_CreateMonitoredItemsRequest_init(&request); + request.subscriptionId = subscriptionId; + request.timestampsToReturn = timestampsToReturn; + request.itemsToCreate = (UA_MonitoredItemCreateRequest*)(uintptr_t)&item; + request.itemsToCreateSize = 1; + UA_CreateMonitoredItemsResponse response = + UA_Client_MonitoredItems_createEvents(client, request, &context, + &callback, &deleteCallback); + UA_StatusCode retval = response.responseHeader.serviceResult; + UA_MonitoredItemCreateResult result; + UA_MonitoredItemCreateResult_init(&result); + if(retval != UA_STATUSCODE_GOOD) { + UA_CreateMonitoredItemsResponse_deleteMembers(&response); + result.statusCode = retval; + return result; + } + UA_MonitoredItemCreateResult_copy(response.results , &result); + UA_CreateMonitoredItemsResponse_deleteMembers(&response); + return result; +} - /* Create a session nonce */ - response->responseHeader.serviceResult |= UA_Session_generateNonce(newSession); - response->responseHeader.serviceResult |= - UA_ByteString_copy(&newSession->serverNonce, &response->serverNonce); +UA_DeleteMonitoredItemsResponse UA_EXPORT +UA_Client_MonitoredItems_delete(UA_Client *client, const UA_DeleteMonitoredItemsRequest request) { + /* Send the request */ + UA_DeleteMonitoredItemsResponse response; + __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST], + &response, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]); + if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) + return response; - /* Sign the signature */ - response->responseHeader.serviceResult |= - signCreateSessionResponse(server, channel, request, response); + UA_Client_Subscription *sub = findSubscription(client, request.subscriptionId); + if(!sub) { + UA_LOG_INFO(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "No internal representation of subscription %u", + request.subscriptionId); + return response; + } - /* Failure -> remove the session */ - if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_SessionManager_removeSession(&server->sessionManager, - &newSession->header.authenticationToken); - return; + /* Loop over deleted MonitoredItems */ + for(size_t i = 0; i < response.resultsSize; i++) { + if(response.results[i] != UA_STATUSCODE_GOOD && + response.results[i] != UA_STATUSCODE_BADMONITOREDITEMIDINVALID) { + continue; + } + +#ifndef __clang_analyzer__ + /* Delete the internal representation */ + UA_Client_MonitoredItem *mon; + LIST_FOREACH(mon, &sub->monitoredItems, listEntry) { + // NOLINTNEXTLINE + if (mon->monitoredItemId == request.monitoredItemIds[i]) { + UA_Client_MonitoredItem_remove(client, sub, mon); + break; + } + } +#endif } - UA_LOG_DEBUG_CHANNEL(server->config.logger, channel, - "Session " UA_PRINTF_GUID_FORMAT " created", - UA_PRINTF_GUID_DATA(newSession->sessionId.identifier.guid)); + return response; } -static UA_StatusCode -checkSignature(const UA_Server *server, const UA_SecureChannel *channel, - UA_Session *session, const UA_ActivateSessionRequest *request) { - if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && - channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) - return UA_STATUSCODE_GOOD; - - if(!channel->securityPolicy) - return UA_STATUSCODE_BADINTERNALERROR; - const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; - const UA_ByteString *localCertificate = &securityPolicy->localCertificate; +UA_StatusCode UA_EXPORT +UA_Client_MonitoredItems_deleteSingle(UA_Client *client, UA_UInt32 subscriptionId, UA_UInt32 monitoredItemId) { + UA_DeleteMonitoredItemsRequest request; + UA_DeleteMonitoredItemsRequest_init(&request); + request.subscriptionId = subscriptionId; + request.monitoredItemIds = &monitoredItemId; + request.monitoredItemIdsSize = 1; - size_t dataToVerifySize = localCertificate->length + session->serverNonce.length; + UA_DeleteMonitoredItemsResponse response = + UA_Client_MonitoredItems_delete(client, request); - UA_ByteString dataToVerify; - UA_StatusCode retval = UA_ByteString_allocBuffer(&dataToVerify, dataToVerifySize); - if(retval != UA_STATUSCODE_GOOD) + UA_StatusCode retval = response.responseHeader.serviceResult; + if(retval != UA_STATUSCODE_GOOD) { + UA_DeleteMonitoredItemsResponse_deleteMembers(&response); return retval; + } - memcpy(dataToVerify.data, localCertificate->data, localCertificate->length); - memcpy(dataToVerify.data + localCertificate->length, - session->serverNonce.data, session->serverNonce.length); + if(response.resultsSize != 1) { + UA_DeleteMonitoredItemsResponse_deleteMembers(&response); + return UA_STATUSCODE_BADINTERNALERROR; + } - retval = securityPolicy->certificateSigningAlgorithm.verify(securityPolicy, channel->channelContext, &dataToVerify, - &request->clientSignature.signature); - UA_ByteString_deleteMembers(&dataToVerify); + retval = response.results[0]; + UA_DeleteMonitoredItemsResponse_deleteMembers(&response); return retval; } -/* TODO: Check all of the following: - * - * Part 4, §5.6.3: When the ActivateSession Service is called for the first time - * then the Server shall reject the request if the SecureChannel is not same as - * the one associated with the CreateSession request. Subsequent calls to - * ActivateSession may be associated with different SecureChannels. If this is - * the case then the Server shall verify that the Certificate the Client used to - * create the new SecureChannel is the same as the Certificate used to create - * the original SecureChannel. In addition, the Server shall verify that the - * Client supplied a UserIdentityToken that is identical to the token currently - * associated with the Session. Once the Server accepts the new SecureChannel it - * shall reject requests sent via the old SecureChannel. */ - -void -Service_ActivateSession(UA_Server *server, UA_SecureChannel *channel, - UA_Session *session, const UA_ActivateSessionRequest *request, - UA_ActivateSessionResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Execute ActivateSession"); - - if(session->validTill < UA_DateTime_nowMonotonic()) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "ActivateSession: SecureChannel %i wants " - "to activate, but the session has timed out", - channel->securityToken.channelId); - response->responseHeader.serviceResult = - UA_STATUSCODE_BADSESSIONIDINVALID; - return; - } - - /* Check if the signature corresponds to the ServerNonce that was last sent - * to the client */ - response->responseHeader.serviceResult = checkSignature(server, channel, session, request); - if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "Signature check failed with status code %s", - UA_StatusCode_name(response->responseHeader.serviceResult)); - return; - } +UA_ModifyMonitoredItemsResponse UA_EXPORT +UA_Client_MonitoredItems_modify(UA_Client *client, + const UA_ModifyMonitoredItemsRequest request) { + UA_ModifyMonitoredItemsResponse response; - /* Callback into userland access control */ - response->responseHeader.serviceResult = - server->config.accessControl.activateSession(server, &server->config.accessControl, - &session->sessionId, &request->userIdentityToken, - &session->sessionHandle); - if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "ActivateSession: Could not generate a server nonce"); - return; + UA_Client_Subscription *sub = 0; + LIST_FOREACH(sub, &client->subscriptions, listEntry) { + if (sub->subscriptionId == request.subscriptionId) + break; } - if(session->header.channel && session->header.channel != channel) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "ActivateSession: Detach from old channel"); - /* Detach the old SecureChannel and attach the new */ - UA_Session_detachFromSecureChannel(session); - UA_Session_attachToSecureChannel(session, channel); + if (!sub) { + UA_ModifyMonitoredItemsResponse_init(&response); + response.responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; + return response; } - /* Activate the session */ - session->activated = true; - UA_Session_updateLifetime(session); + UA_ModifyMonitoredItemsRequest modifiedRequest; + UA_ModifyMonitoredItemsRequest_copy(&request, &modifiedRequest); - /* Generate a new session nonce for the next time ActivateSession is called */ - response->responseHeader.serviceResult = UA_Session_generateNonce(session); - response->responseHeader.serviceResult |= - UA_ByteString_copy(&session->serverNonce, &response->serverNonce); - if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_Session_detachFromSecureChannel(session); - session->activated = false; - UA_LOG_INFO_SESSION(server->config.logger, session, - "ActivateSession: Could not generate a server nonce"); - return; + for (size_t i = 0; i < modifiedRequest.itemsToModifySize; ++i) { + UA_Client_MonitoredItem *mon = 0; + LIST_FOREACH(mon, &sub->monitoredItems, listEntry) { + if(mon->monitoredItemId == modifiedRequest.itemsToModify[i].monitoredItemId) { + modifiedRequest.itemsToModify[i].requestedParameters.clientHandle = mon->clientHandle; + break; + } + } } - UA_LOG_INFO_SESSION(server->config.logger, session, - "ActivateSession: Session activated"); -} - -void -Service_CloseSession(UA_Server *server, UA_Session *session, - const UA_CloseSessionRequest *request, - UA_CloseSessionResponse *response) { - UA_LOG_INFO_SESSION(server->config.logger, session, "CloseSession"); + __UA_Client_Service(client, + &modifiedRequest, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST], + &response, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]); - /* Callback into userland access control */ - server->config.accessControl.closeSession(server, &server->config.accessControl, - &session->sessionId, session->sessionHandle); - response->responseHeader.serviceResult = - UA_SessionManager_removeSession(&server->sessionManager, - &session->header.authenticationToken); + UA_ModifyMonitoredItemsRequest_deleteMembers(&modifiedRequest); + return response; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_services_attribute.c" ***********************************/ +/*************************************/ +/* Async Processing of Notifications */ +/*************************************/ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2014-2018 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2015-2016 (c) Sten Grüner - * Copyright 2014-2017 (c) Florian Palm - * Copyright 2015 (c) Christian Fimmers - * Copyright 2015-2016 (c) Chris Iatrou - * Copyright 2015-2016 (c) Oleksiy Vasylyev - * Copyright 2015 (c) wuyangtang - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2016 (c) Lorenz Haas - * Copyright 2017 (c) frax2222 - * Copyright 2017 (c) Thomas Bender - * Copyright 2017 (c) Julian Grothoff - * Copyright 2017 (c) Jonas Green - * Copyright 2017 (c) Henrik Norrman - */ +/* Assume the request is already initialized */ +UA_StatusCode +UA_Client_preparePublishRequest(UA_Client *client, UA_PublishRequest *request) { + /* Count acks */ + UA_Client_NotificationsAckNumber *ack; + LIST_FOREACH(ack, &client->pendingNotificationsAcks, listEntry) + ++request->subscriptionAcknowledgementsSize; + /* Create the array. Returns a sentinel pointer if the length is zero. */ + request->subscriptionAcknowledgements = (UA_SubscriptionAcknowledgement*) + UA_Array_new(request->subscriptionAcknowledgementsSize, + &UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT]); + if(!request->subscriptionAcknowledgements) { + request->subscriptionAcknowledgementsSize = 0; + return UA_STATUSCODE_BADOUTOFMEMORY; + } -/******************/ -/* Access Control */ -/******************/ + size_t i = 0; + UA_Client_NotificationsAckNumber *ack_tmp; + LIST_FOREACH_SAFE(ack, &client->pendingNotificationsAcks, listEntry, ack_tmp) { + request->subscriptionAcknowledgements[i].sequenceNumber = ack->subAck.sequenceNumber; + request->subscriptionAcknowledgements[i].subscriptionId = ack->subAck.subscriptionId; + ++i; + LIST_REMOVE(ack, listEntry); + UA_free(ack); + } + return UA_STATUSCODE_GOOD; +} +/* According to OPC Unified Architecture, Part 4 5.13.1.1 i) */ +/* The value 0 is never used for the sequence number */ static UA_UInt32 -getUserWriteMask(UA_Server *server, const UA_Session *session, - const UA_Node *node) { - if(session == &server->adminSession) - return 0xFFFFFFFF; /* the local admin user has all rights */ - return node->writeMask & - server->config.accessControl.getUserRightsMask(server, &server->config.accessControl, - &session->sessionId, session->sessionHandle, - &node->nodeId, node->context); +UA_Client_Subscriptions_nextSequenceNumber(UA_UInt32 sequenceNumber) { + UA_UInt32 nextSequenceNumber = sequenceNumber + 1; + if(nextSequenceNumber == 0) + nextSequenceNumber = 1; + return nextSequenceNumber; } -static UA_Byte -getAccessLevel(UA_Server *server, const UA_Session *session, - const UA_VariableNode *node) { - if(session == &server->adminSession) - return 0xFF; /* the local admin user has all rights */ - return node->accessLevel; -} +static void +processDataChangeNotification(UA_Client *client, UA_Client_Subscription *sub, + UA_DataChangeNotification *dataChangeNotification) { + for(size_t j = 0; j < dataChangeNotification->monitoredItemsSize; ++j) { + UA_MonitoredItemNotification *min = &dataChangeNotification->monitoredItems[j]; -static UA_Byte -getUserAccessLevel(UA_Server *server, const UA_Session *session, - const UA_VariableNode *node) { - if(session == &server->adminSession) - return 0xFF; /* the local admin user has all rights */ - return node->accessLevel & - server->config.accessControl.getUserAccessLevel(server, &server->config.accessControl, - &session->sessionId, session->sessionHandle, - &node->nodeId, node->context); -} + /* Find the MonitoredItem */ + UA_Client_MonitoredItem *mon; + LIST_FOREACH(mon, &sub->monitoredItems, listEntry) { + if(mon->clientHandle == min->clientHandle) + break; + } -static UA_Boolean -getUserExecutable(UA_Server *server, const UA_Session *session, - const UA_MethodNode *node) { - if(session == &server->adminSession) - return true; /* the local admin user has all rights */ - return node->executable & - server->config.accessControl.getUserExecutable(server, &server->config.accessControl, - &session->sessionId, session->sessionHandle, - &node->nodeId, node->context); -} + if(!mon) { + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Could not process a notification with clienthandle %u on subscription %u", + min->clientHandle, sub->subscriptionId); + continue; + } -/****************/ -/* Read Service */ -/****************/ + if(mon->isEventMonitoredItem) { + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "MonitoredItem is configured for Events. But received a " + "DataChangeNotification."); + continue; + } -static UA_StatusCode -readArrayDimensionsAttribute(const UA_VariableNode *vn, UA_DataValue *v) { - UA_Variant_setArray(&v->value, vn->arrayDimensions, - vn->arrayDimensionsSize, &UA_TYPES[UA_TYPES_UINT32]); - v->value.storageType = UA_VARIANT_DATA_NODELETE; - return UA_STATUSCODE_GOOD; + mon->handler.dataChangeCallback(client, sub->subscriptionId, sub->context, + mon->monitoredItemId, mon->context, + &min->value); + } } static void -setScalarNoDelete(UA_Variant *v, const void * UA_RESTRICT p, - const UA_DataType *type) { - UA_Variant_setScalar(v, (void*)(uintptr_t)p, type); - v->storageType = UA_VARIANT_DATA_NODELETE; -} +processEventNotification(UA_Client *client, UA_Client_Subscription *sub, + UA_EventNotificationList *eventNotificationList) { + for(size_t j = 0; j < eventNotificationList->eventsSize; ++j) { + UA_EventFieldList *eventFieldList = &eventNotificationList->events[j]; -static UA_StatusCode -readIsAbstractAttribute(const UA_Node *node, UA_Variant *v) { - const UA_Boolean *isAbstract; - switch(node->nodeClass) { - case UA_NODECLASS_REFERENCETYPE: - isAbstract = &((const UA_ReferenceTypeNode*)node)->isAbstract; - break; - case UA_NODECLASS_OBJECTTYPE: - isAbstract = &((const UA_ObjectTypeNode*)node)->isAbstract; - break; - case UA_NODECLASS_VARIABLETYPE: - isAbstract = &((const UA_VariableTypeNode*)node)->isAbstract; - break; - case UA_NODECLASS_DATATYPE: - isAbstract = &((const UA_DataTypeNode*)node)->isAbstract; - break; - default: - return UA_STATUSCODE_BADATTRIBUTEIDINVALID; - } + /* Find the MonitoredItem */ + UA_Client_MonitoredItem *mon; + LIST_FOREACH(mon, &sub->monitoredItems, listEntry) { + if(mon->clientHandle == eventFieldList->clientHandle) + break; + } - setScalarNoDelete(v, isAbstract, &UA_TYPES[UA_TYPES_BOOLEAN]); - v->storageType = UA_VARIANT_DATA_NODELETE; - return UA_STATUSCODE_GOOD; -} + if(!mon) { + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Could not process a notification with clienthandle %u on subscription %u", + eventFieldList->clientHandle, sub->subscriptionId); + continue; + } -static UA_StatusCode -readValueAttributeFromNode(UA_Server *server, UA_Session *session, - const UA_VariableNode *vn, UA_DataValue *v, - UA_NumericRange *rangeptr) { - if(vn->value.data.callback.onRead) { - vn->value.data.callback.onRead(server, &session->sessionId, - session->sessionHandle, &vn->nodeId, - vn->context, rangeptr, &vn->value.data.value); - const UA_Node *old = (const UA_Node *)vn; - /* Reopen the node to see the changes from onRead */ - vn = (const UA_VariableNode*)UA_Nodestore_get(server, &vn->nodeId); - UA_Nodestore_release(server, old); + if(!mon->isEventMonitoredItem) { + UA_LOG_DEBUG(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "MonitoredItem is configured for DataChanges. But received a " + "EventNotification."); + continue; + } + + mon->handler.eventCallback(client, sub->subscriptionId, sub->context, + mon->monitoredItemId, mon->context, + eventFieldList->eventFieldsSize, + eventFieldList->eventFields); } - if(rangeptr) - return UA_Variant_copyRange(&vn->value.data.value.value, &v->value, *rangeptr); - *v = vn->value.data.value; - v->value.storageType = UA_VARIANT_DATA_NODELETE; - return UA_STATUSCODE_GOOD; } -static UA_StatusCode -readValueAttributeFromDataSource(UA_Server *server, UA_Session *session, - const UA_VariableNode *vn, UA_DataValue *v, - UA_TimestampsToReturn timestamps, - UA_NumericRange *rangeptr) { - if(!vn->value.dataSource.read) - return UA_STATUSCODE_BADINTERNALERROR; - UA_Boolean sourceTimeStamp = (timestamps == UA_TIMESTAMPSTORETURN_SOURCE || - timestamps == UA_TIMESTAMPSTORETURN_BOTH); - return vn->value.dataSource.read(server, &session->sessionId, session->sessionHandle, - &vn->nodeId, vn->context, sourceTimeStamp, rangeptr, v); -} +static void +processNotificationMessage(UA_Client *client, UA_Client_Subscription *sub, + UA_ExtensionObject *msg) { + if(msg->encoding != UA_EXTENSIONOBJECT_DECODED) + return; -static UA_StatusCode -readValueAttributeComplete(UA_Server *server, UA_Session *session, - const UA_VariableNode *vn, UA_TimestampsToReturn timestamps, - const UA_String *indexRange, UA_DataValue *v) { - /* Compute the index range */ - UA_NumericRange range; - UA_NumericRange *rangeptr = NULL; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(indexRange && indexRange->length > 0) { - retval = UA_NumericRange_parseFromString(&range, indexRange); - if(retval != UA_STATUSCODE_GOOD) - return retval; - rangeptr = ⦥ + /* Handle DataChangeNotification */ + if(msg->content.decoded.type == &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]) { + UA_DataChangeNotification *dataChangeNotification = + (UA_DataChangeNotification *)msg->content.decoded.data; + processDataChangeNotification(client, sub, dataChangeNotification); + return; } - /* Read the value */ - if(vn->valueSource == UA_VALUESOURCE_DATA) - retval = readValueAttributeFromNode(server, session, vn, v, rangeptr); - else - retval = readValueAttributeFromDataSource(server, session, vn, v, timestamps, rangeptr); + /* Handle EventNotification */ + if(msg->content.decoded.type == &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]) { + UA_EventNotificationList *eventNotificationList = + (UA_EventNotificationList *)msg->content.decoded.data; + processEventNotification(client, sub, eventNotificationList); + return; + } - /* Clean up */ - if(rangeptr) - UA_free(range.dimensions); - return retval; -} + /* Handle StatusChangeNotification */ + if(msg->content.decoded.type == &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]) { + if(sub->statusChangeCallback) { + sub->statusChangeCallback(client, sub->subscriptionId, sub->context, + (UA_StatusChangeNotification*)msg->content.decoded.data); + } else { + UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Dropped a StatusChangeNotification since no callback is registered"); + } + return; + } -UA_StatusCode -readValueAttribute(UA_Server *server, UA_Session *session, - const UA_VariableNode *vn, UA_DataValue *v) { - return readValueAttributeComplete(server, session, vn, UA_TIMESTAMPSTORETURN_NEITHER, NULL, v); + UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Unknown notification message type"); } -static const UA_String binEncoding = {sizeof("Default Binary")-1, (UA_Byte*)"Default Binary"}; -static const UA_String xmlEncoding = {sizeof("Default XML")-1, (UA_Byte*)"Default XML"}; -static const UA_String jsonEncoding = {sizeof("Default JSON")-1, (UA_Byte*)"Default JSON"}; - -#define CHECK_NODECLASS(CLASS) \ - if(!(node->nodeClass & (CLASS))) { \ - retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID; \ - break; \ - } +void +UA_Client_Subscriptions_processPublishResponse(UA_Client *client, UA_PublishRequest *request, + UA_PublishResponse *response) { + UA_NotificationMessage *msg = &response->notificationMessage; -/* Returns a datavalue that may point into the node via the - * UA_VARIANT_DATA_NODELETE tag. Don't access the returned DataValue once the - * node has been released! */ -static void -Read(const UA_Node *node, UA_Server *server, UA_Session *session, - UA_TimestampsToReturn timestampsToReturn, - const UA_ReadValueId *id, UA_DataValue *v) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Read the attribute %i", id->attributeId); + client->currentlyOutStandingPublishRequests--; - /* Only Binary Encoding is supported */ - if(id->dataEncoding.name.length > 0 && - !UA_String_equal(&binEncoding, &id->dataEncoding.name)) { - if(UA_String_equal(&xmlEncoding, &id->dataEncoding.name) || - UA_String_equal(&jsonEncoding, &id->dataEncoding.name)) - v->status = UA_STATUSCODE_BADDATAENCODINGUNSUPPORTED; - else - v->status = UA_STATUSCODE_BADDATAENCODINGINVALID; - v->hasStatus = true; + if(response->responseHeader.serviceResult == UA_STATUSCODE_BADTOOMANYPUBLISHREQUESTS) { + if(client->config.outStandingPublishRequests > 1) { + client->config.outStandingPublishRequests--; + UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Too many publishrequest, reduce outStandingPublishRequests to %d", + client->config.outStandingPublishRequests); + } else { + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Too many publishrequest when outStandingPublishRequests = 1"); + UA_Client_Subscriptions_deleteSingle(client, response->subscriptionId); + } return; } - /* Index range for an attribute other than value */ - if(id->indexRange.length > 0 && id->attributeId != UA_ATTRIBUTEID_VALUE) { - v->hasStatus = true; - v->status = UA_STATUSCODE_BADINDEXRANGENODATA; + if(response->responseHeader.serviceResult == UA_STATUSCODE_BADSHUTDOWN) return; - } - /* Read the attribute */ - UA_StatusCode retval = UA_STATUSCODE_GOOD; - switch(id->attributeId) { - case UA_ATTRIBUTEID_NODEID: - setScalarNoDelete(&v->value, &node->nodeId, &UA_TYPES[UA_TYPES_NODEID]); - break; - case UA_ATTRIBUTEID_NODECLASS: - setScalarNoDelete(&v->value, &node->nodeClass, &UA_TYPES[UA_TYPES_NODECLASS]); - break; - case UA_ATTRIBUTEID_BROWSENAME: - setScalarNoDelete(&v->value, &node->browseName, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]); - break; - case UA_ATTRIBUTEID_DISPLAYNAME: - setScalarNoDelete(&v->value, &node->displayName, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); - break; - case UA_ATTRIBUTEID_DESCRIPTION: - setScalarNoDelete(&v->value, &node->description, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); - break; - case UA_ATTRIBUTEID_WRITEMASK: - setScalarNoDelete(&v->value, &node->writeMask, &UA_TYPES[UA_TYPES_UINT32]); - break; - case UA_ATTRIBUTEID_USERWRITEMASK: { - UA_UInt32 userWriteMask = getUserWriteMask(server, session, node); - retval = UA_Variant_setScalarCopy(&v->value, &userWriteMask, &UA_TYPES[UA_TYPES_UINT32]); - break; } - case UA_ATTRIBUTEID_ISABSTRACT: - retval = readIsAbstractAttribute(node, &v->value); - break; - case UA_ATTRIBUTEID_SYMMETRIC: - CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE); - setScalarNoDelete(&v->value, &((const UA_ReferenceTypeNode*)node)->symmetric, - &UA_TYPES[UA_TYPES_BOOLEAN]); - break; - case UA_ATTRIBUTEID_INVERSENAME: - CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE); - setScalarNoDelete(&v->value, &((const UA_ReferenceTypeNode*)node)->inverseName, - &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); - break; - case UA_ATTRIBUTEID_CONTAINSNOLOOPS: - CHECK_NODECLASS(UA_NODECLASS_VIEW); - setScalarNoDelete(&v->value, &((const UA_ViewNode*)node)->containsNoLoops, - &UA_TYPES[UA_TYPES_BOOLEAN]); - break; - case UA_ATTRIBUTEID_EVENTNOTIFIER: - CHECK_NODECLASS(UA_NODECLASS_VIEW | UA_NODECLASS_OBJECT); - setScalarNoDelete(&v->value, &((const UA_ViewNode*)node)->eventNotifier, - &UA_TYPES[UA_TYPES_BYTE]); - break; - case UA_ATTRIBUTEID_VALUE: { - CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); - /* VariableTypes don't have the AccessLevel concept. Always allow reading the value. */ - if(node->nodeClass == UA_NODECLASS_VARIABLE) { - /* The access to a value variable is granted via the AccessLevel - * and UserAccessLevel attributes */ - UA_Byte accessLevel = getAccessLevel(server, session, (const UA_VariableNode*)node); - if(!(accessLevel & (UA_ACCESSLEVELMASK_READ))) { - retval = UA_STATUSCODE_BADNOTREADABLE; - break; - } - accessLevel = getUserAccessLevel(server, session, - (const UA_VariableNode*)node); - if(!(accessLevel & (UA_ACCESSLEVELMASK_READ))) { - retval = UA_STATUSCODE_BADUSERACCESSDENIED; - break; - } + if(!LIST_FIRST(&client->subscriptions)) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADNOSUBSCRIPTION; + return; + } + + if(response->responseHeader.serviceResult == UA_STATUSCODE_BADSESSIONCLOSED) { + if(client->state >= UA_CLIENTSTATE_SESSION) { + UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Received Publish Response with code %s", + UA_StatusCode_name(response->responseHeader.serviceResult)); + UA_Client_Subscription* sub = findSubscription(client, response->subscriptionId); + if (sub != NULL) + UA_Client_Subscription_deleteInternal(client, sub); } - retval = readValueAttributeComplete(server, session, (const UA_VariableNode*)node, - timestampsToReturn, &id->indexRange, v); - break; + return; } - case UA_ATTRIBUTEID_DATATYPE: - CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); - setScalarNoDelete(&v->value, &((const UA_VariableTypeNode*)node)->dataType, - &UA_TYPES[UA_TYPES_NODEID]); - break; - case UA_ATTRIBUTEID_VALUERANK: - CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); - setScalarNoDelete(&v->value, &((const UA_VariableTypeNode*)node)->valueRank, - &UA_TYPES[UA_TYPES_INT32]); - break; - case UA_ATTRIBUTEID_ARRAYDIMENSIONS: - CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); - retval = readArrayDimensionsAttribute((const UA_VariableNode*)node, v); - break; - case UA_ATTRIBUTEID_ACCESSLEVEL: - CHECK_NODECLASS(UA_NODECLASS_VARIABLE); - setScalarNoDelete(&v->value, &((const UA_VariableNode*)node)->accessLevel, - &UA_TYPES[UA_TYPES_BYTE]); - break; - case UA_ATTRIBUTEID_USERACCESSLEVEL: { - CHECK_NODECLASS(UA_NODECLASS_VARIABLE); - UA_Byte userAccessLevel = getUserAccessLevel(server, session, - (const UA_VariableNode*)node); - retval = UA_Variant_setScalarCopy(&v->value, &userAccessLevel, &UA_TYPES[UA_TYPES_BYTE]); - break; } - case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL: - CHECK_NODECLASS(UA_NODECLASS_VARIABLE); - setScalarNoDelete(&v->value, &((const UA_VariableNode*)node)->minimumSamplingInterval, - &UA_TYPES[UA_TYPES_DOUBLE]); - break; - case UA_ATTRIBUTEID_HISTORIZING: - CHECK_NODECLASS(UA_NODECLASS_VARIABLE); - setScalarNoDelete(&v->value, &((const UA_VariableNode*)node)->historizing, - &UA_TYPES[UA_TYPES_BOOLEAN]); - break; - case UA_ATTRIBUTEID_EXECUTABLE: - CHECK_NODECLASS(UA_NODECLASS_METHOD); - setScalarNoDelete(&v->value, &((const UA_MethodNode*)node)->executable, - &UA_TYPES[UA_TYPES_BOOLEAN]); - break; - case UA_ATTRIBUTEID_USEREXECUTABLE: { - CHECK_NODECLASS(UA_NODECLASS_METHOD); - UA_Boolean userExecutable = getUserExecutable(server, session, - (const UA_MethodNode*)node); - retval = UA_Variant_setScalarCopy(&v->value, &userExecutable, &UA_TYPES[UA_TYPES_BOOLEAN]); - break; } - default: - retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID; + + if(response->responseHeader.serviceResult == UA_STATUSCODE_BADSESSIONIDINVALID) { + UA_Client_disconnect(client); /* TODO: This should be handled before the process callback */ + UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Received BadSessionIdInvalid"); + return; } - /* Return error code when reading has failed */ - if(retval != UA_STATUSCODE_GOOD) { - v->hasStatus = true; - v->status = retval; + if(response->responseHeader.serviceResult == UA_STATUSCODE_BADTIMEOUT) { + if (client->config.inactivityCallback) + client->config.inactivityCallback(client); + UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Received Timeout for Publish Response"); return; } - v->hasValue = true; + if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Received Publish Response with code %s", + UA_StatusCode_name(response->responseHeader.serviceResult)); + return; + } - /* Create server timestamp */ - if(timestampsToReturn == UA_TIMESTAMPSTORETURN_SERVER || - timestampsToReturn == UA_TIMESTAMPSTORETURN_BOTH) { - if (!v->hasServerTimestamp) { - v->serverTimestamp = UA_DateTime_now(); - v->hasServerTimestamp = true; - } + UA_Client_Subscription *sub = findSubscription(client, response->subscriptionId); + if(!sub) { + response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; + UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Received Publish Response for a non-existant subscription"); + return; } - /* Handle source time stamp */ - if(id->attributeId == UA_ATTRIBUTEID_VALUE) { - if(timestampsToReturn == UA_TIMESTAMPSTORETURN_SERVER || - timestampsToReturn == UA_TIMESTAMPSTORETURN_NEITHER) { - v->hasSourceTimestamp = false; - v->hasSourcePicoseconds = false; - } else if(!v->hasSourceTimestamp) { - v->sourceTimestamp = UA_DateTime_now(); - v->hasSourceTimestamp = true; - } + sub->lastActivity = UA_DateTime_nowMonotonic(); + + /* Detect missing message - OPC Unified Architecture, Part 4 5.13.1.1 e) */ + if(UA_Client_Subscriptions_nextSequenceNumber(sub->sequenceNumber) != msg->sequenceNumber) { + UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Invalid subscription sequence number: expected %u but got %u", + UA_Client_Subscriptions_nextSequenceNumber(sub->sequenceNumber), + msg->sequenceNumber); + /* This is an error. But we do not abort the connection. Some server + * SDKs misbehave from time to time and send out-of-order sequence + * numbers. (Probably some multi-threading synchronization issue.) */ + /* UA_Client_disconnect(client); + return; */ } + /* According to f), a keep-alive message contains no notifications and has the sequence number + * of the next NotificationMessage that is to be sent => More than one consecutive keep-alive + * message or a NotificationMessage following a keep-alive message will share the same sequence + * number. */ + if (msg->notificationDataSize) + sub->sequenceNumber = msg->sequenceNumber; + + /* Process the notification messages */ + for(size_t k = 0; k < msg->notificationDataSize; ++k) + processNotificationMessage(client, sub, &msg->notificationData[k]); + + /* Add to the list of pending acks */ + for(size_t i = 0; i < response->availableSequenceNumbersSize; i++) { + if(response->availableSequenceNumbers[i] != msg->sequenceNumber) + continue; + UA_Client_NotificationsAckNumber *tmpAck = (UA_Client_NotificationsAckNumber*) + UA_malloc(sizeof(UA_Client_NotificationsAckNumber)); + if(!tmpAck) { + UA_LOG_WARNING(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Not enough memory to store the acknowledgement for a publish " + "message on subscription %u", sub->subscriptionId); + break; + } + tmpAck->subAck.sequenceNumber = msg->sequenceNumber; + tmpAck->subAck.subscriptionId = sub->subscriptionId; + LIST_INSERT_HEAD(&client->pendingNotificationsAcks, tmpAck, listEntry); + break; + } } -static UA_StatusCode -Operation_Read(UA_Server *server, UA_Session *session, UA_MessageContext *mc, - UA_TimestampsToReturn timestampsToReturn, const UA_ReadValueId *id) { - UA_DataValue dv; - UA_DataValue_init(&dv); +static void +processPublishResponseAsync(UA_Client *client, void *userdata, UA_UInt32 requestId, + void *response) { + UA_PublishRequest *req = (UA_PublishRequest*)userdata; + UA_PublishResponse *res = (UA_PublishResponse*)response; - /* Get the node */ - const UA_Node *node = UA_Nodestore_get(server, &id->nodeId); + /* Process the response */ + UA_Client_Subscriptions_processPublishResponse(client, req, res); - /* Perform the read operation */ - if(node) { - Read(node, server, session, timestampsToReturn, id, &dv); - } else { - dv.hasStatus = true; - dv.status = UA_STATUSCODE_BADNODEIDUNKNOWN; + /* Delete the cached request */ + UA_PublishRequest_delete(req); + + /* Fill up the outstanding publish requests */ + UA_Client_Subscriptions_backgroundPublish(client); +} + +void +UA_Client_Subscriptions_clean(UA_Client *client) { + UA_Client_NotificationsAckNumber *n, *tmp; + LIST_FOREACH_SAFE(n, &client->pendingNotificationsAcks, listEntry, tmp) { + LIST_REMOVE(n, listEntry); + UA_free(n); } - /* Encode (and send) the results */ - UA_StatusCode retval = UA_MessageContext_encode(mc, &dv, &UA_TYPES[UA_TYPES_DATAVALUE]); + UA_Client_Subscription *sub, *tmps; + LIST_FOREACH_SAFE(sub, &client->subscriptions, listEntry, tmps) + UA_Client_Subscription_deleteInternal(client, sub); /* force local removal */ - /* Free copied data and release the node */ - UA_Variant_deleteMembers(&dv.value); - UA_Nodestore_release(server, node); - return retval; + client->monitoredItemHandles = 0; } -UA_StatusCode Service_Read(UA_Server *server, UA_Session *session, UA_MessageContext *mc, - const UA_ReadRequest *request, UA_ResponseHeader *responseHeader) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing ReadRequest"); +void +UA_Client_Subscriptions_backgroundPublishInactivityCheck(UA_Client *client) { + if(client->state < UA_CLIENTSTATE_SESSION) + return; - /* Check if the timestampstoreturn is valid */ - if(request->timestampsToReturn > UA_TIMESTAMPSTORETURN_NEITHER) - responseHeader->serviceResult = UA_STATUSCODE_BADTIMESTAMPSTORETURNINVALID; + /* Is the lack of responses the client's fault? */ + if(client->currentlyOutStandingPublishRequests == 0) + return; - if(request->nodesToReadSize == 0) - responseHeader->serviceResult = UA_STATUSCODE_BADNOTHINGTODO; + UA_Client_Subscription *sub; + LIST_FOREACH(sub, &client->subscriptions, listEntry) { + UA_DateTime maxSilence = (UA_DateTime) + ((sub->publishingInterval * sub->maxKeepAliveCount) + + client->config.timeout) * UA_DATETIME_MSEC; + if(maxSilence + sub->lastActivity < UA_DateTime_nowMonotonic()) { + /* Reset activity */ + sub->lastActivity = UA_DateTime_nowMonotonic(); - /* Check if maxAge is valid */ - if(request->maxAge < 0) - responseHeader->serviceResult = UA_STATUSCODE_BADMAXAGEINVALID; + if(client->config.subscriptionInactivityCallback) + client->config.subscriptionInactivityCallback(client, sub->subscriptionId, + sub->context); + UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT, + "Inactivity for Subscription %u.", sub->subscriptionId); + } + } +} - /* Check if there are too many operations */ - if(server->config.maxNodesPerRead != 0 && - request->nodesToReadSize > server->config.maxNodesPerRead) - responseHeader->serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; +UA_StatusCode +UA_Client_Subscriptions_backgroundPublish(UA_Client *client) { + if(client->state < UA_CLIENTSTATE_SESSION) + return UA_STATUSCODE_BADSERVERNOTCONNECTED; - /* Encode the response header */ - UA_StatusCode retval = - UA_MessageContext_encode(mc, responseHeader, &UA_TYPES[UA_TYPES_RESPONSEHEADER]); - if(retval != UA_STATUSCODE_GOOD) - return retval; + /* The session must have at least one subscription */ + if(!LIST_FIRST(&client->subscriptions)) + return UA_STATUSCODE_GOOD; - /* Process nothing if we return an error code for the entire service */ - UA_Int32 arraySize = (UA_Int32)request->nodesToReadSize; - if(responseHeader->serviceResult != UA_STATUSCODE_GOOD) - arraySize = 0; + while(client->currentlyOutStandingPublishRequests < client->config.outStandingPublishRequests) { + UA_PublishRequest *request = UA_PublishRequest_new(); + if (!request) + return UA_STATUSCODE_BADOUTOFMEMORY; - /* Process all ReadValueIds */ - retval = UA_MessageContext_encode(mc, &arraySize, &UA_TYPES[UA_TYPES_INT32]); - if(retval != UA_STATUSCODE_GOOD) - return retval; + request->requestHeader.timeoutHint=60000; + UA_StatusCode retval = UA_Client_preparePublishRequest(client, request); + if(retval != UA_STATUSCODE_GOOD) { + UA_PublishRequest_delete(request); + return retval; + } + + UA_UInt32 requestId; + client->currentlyOutStandingPublishRequests++; - for(UA_Int32 i = 0; i < arraySize; i++) { - retval = Operation_Read(server, session, mc, request->timestampsToReturn, - &request->nodesToRead[i]); - if(retval != UA_STATUSCODE_GOOD) + /* Disable the timeout, it is treat in UA_Client_Subscriptions_backgroundPublishInactivityCheck */ + retval = __UA_Client_AsyncServiceEx(client, request, &UA_TYPES[UA_TYPES_PUBLISHREQUEST], + processPublishResponseAsync, + &UA_TYPES[UA_TYPES_PUBLISHRESPONSE], + (void*)request, &requestId, 0); + if(retval != UA_STATUSCODE_GOOD) { + UA_PublishRequest_delete(request); return retval; + } } - /* Don't return any DiagnosticInfo */ - arraySize = -1; - return UA_MessageContext_encode(mc, &arraySize, &UA_TYPES[UA_TYPES_INT32]); + return UA_STATUSCODE_GOOD; } -UA_DataValue -UA_Server_readWithSession(UA_Server *server, UA_Session *session, - const UA_ReadValueId *item, - UA_TimestampsToReturn timestampsToReturn) { - UA_DataValue dv; - UA_DataValue_init(&dv); +#endif /* UA_ENABLE_SUBSCRIPTIONS */ - /* Get the node */ - const UA_Node *node = UA_Nodestore_get(server, &item->nodeId); - if(!node) { - dv.hasStatus = true; - dv.status = UA_STATUSCODE_BADNODEIDUNKNOWN; - return dv; - } +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/client/ua_client_worker.c" ***********************************/ - /* Perform the read operation */ - Read(node, server, session, timestampsToReturn, item, &dv); +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - /* Do we have to copy the result before releasing the node? */ - if(dv.hasValue && dv.value.storageType == UA_VARIANT_DATA_NODELETE) { - UA_DataValue dv2; - UA_StatusCode retval = UA_DataValue_copy(&dv, &dv2); - if(retval == UA_STATUSCODE_GOOD) { - dv = dv2; - } else { - UA_DataValue_init(&dv); - dv.hasStatus = true; - dv.status = retval; + +static void +asyncServiceTimeoutCheck(UA_Client *client) { + UA_DateTime now = UA_DateTime_nowMonotonic(); + + /* Timeout occurs, remove the callback */ + AsyncServiceCall *ac, *ac_tmp; + LIST_FOREACH_SAFE(ac, &client->asyncServiceCalls, pointers, ac_tmp) { + if(!ac->timeout) + continue; + + if(ac->start + (UA_DateTime)(ac->timeout * UA_DATETIME_MSEC) <= now) { + LIST_REMOVE(ac, pointers); + UA_Client_AsyncService_cancel(client, ac, UA_STATUSCODE_BADTIMEOUT); + UA_free(ac); } } - - /* Release the node and return */ - UA_Nodestore_release(server, node); - return dv; } -/* Exposes the Read service to local users */ -UA_DataValue -UA_Server_read(UA_Server *server, const UA_ReadValueId *item, - UA_TimestampsToReturn timestamps) { - return UA_Server_readWithSession(server, &server->adminSession, item, timestamps); +static void +backgroundConnectivityCallback(UA_Client *client, void *userdata, + UA_UInt32 requestId, const UA_ReadResponse *response) { + if(response->responseHeader.serviceResult == UA_STATUSCODE_BADTIMEOUT) { + if (client->config.inactivityCallback) + client->config.inactivityCallback(client); + } + client->pendingConnectivityCheck = false; + client->lastConnectivityCheck = UA_DateTime_nowMonotonic(); } -/* Used in inline functions exposing the Read service with more syntactic sugar - * for individual attributes */ -UA_StatusCode -__UA_Server_read(UA_Server *server, const UA_NodeId *nodeId, - const UA_AttributeId attributeId, void *v) { - /* Call the read service */ - UA_ReadValueId item; - UA_ReadValueId_init(&item); - item.nodeId = *nodeId; - item.attributeId = attributeId; - UA_DataValue dv = UA_Server_read(server, &item, UA_TIMESTAMPSTORETURN_NEITHER); +static UA_StatusCode +UA_Client_backgroundConnectivity(UA_Client *client) { + if(!client->config.connectivityCheckInterval) + return UA_STATUSCODE_GOOD; - /* Check the return value */ - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(dv.hasStatus) - retval = dv.status; - else if(!dv.hasValue) - retval = UA_STATUSCODE_BADUNEXPECTEDERROR; - if(retval != UA_STATUSCODE_GOOD) { - UA_DataValue_deleteMembers(&dv); - return retval; - } + if (client->pendingConnectivityCheck) + return UA_STATUSCODE_GOOD; - if(attributeId == UA_ATTRIBUTEID_VALUE || - attributeId == UA_ATTRIBUTEID_ARRAYDIMENSIONS) { - /* Return the entire variant */ - memcpy(v, &dv.value, sizeof(UA_Variant)); - } else { - /* Return the variant content only */ - memcpy(v, dv.value.data, dv.value.type->memSize); - UA_free(dv.value.data); - } - return retval; -} + UA_DateTime now = UA_DateTime_nowMonotonic(); + UA_DateTime nextDate = client->lastConnectivityCheck + (UA_DateTime)(client->config.connectivityCheckInterval * UA_DATETIME_MSEC); -/*****************/ -/* Type Checking */ -/*****************/ + if(now <= nextDate) + return UA_STATUSCODE_GOOD; -enum type_equivalence { - TYPE_EQUIVALENCE_NONE, - TYPE_EQUIVALENCE_ENUM, - TYPE_EQUIVALENCE_OPAQUE -}; + UA_ReadRequest request; + UA_ReadRequest_init(&request); -static enum type_equivalence -typeEquivalence(const UA_DataType *t) { - if(t->membersSize != 1 || !t->members[0].namespaceZero) - return TYPE_EQUIVALENCE_NONE; - if(t->members[0].memberTypeIndex == UA_TYPES_INT32) - return TYPE_EQUIVALENCE_ENUM; - if(t->members[0].memberTypeIndex == UA_TYPES_BYTE && t->members[0].isArray) - return TYPE_EQUIVALENCE_OPAQUE; - return TYPE_EQUIVALENCE_NONE; + UA_ReadValueId rvid; + UA_ReadValueId_init(&rvid); + rvid.attributeId = UA_ATTRIBUTEID_VALUE; + rvid.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE); + + request.nodesToRead = &rvid; + request.nodesToReadSize = 1; + + UA_StatusCode retval = __UA_Client_AsyncService(client, &request, &UA_TYPES[UA_TYPES_READREQUEST], + (UA_ClientAsyncServiceCallback)backgroundConnectivityCallback, + &UA_TYPES[UA_TYPES_READRESPONSE], NULL, NULL); + + client->pendingConnectivityCheck = true; + + return retval; } -const UA_NodeId subtypeId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASSUBTYPE}}; -static const UA_NodeId enumNodeId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_ENUMERATION}}; +/** + * Main Client Loop + * ---------------- + * Start: Spin up the workers and the network layer + * Iterate: Process repeated callbacks and events in the network layer. + * This part can be driven from an external main-loop in an + * event-driven single-threaded architecture. + * Stop: Stop workers, finish all callbacks, stop the network layer, + * clean up */ -UA_Boolean -compatibleDataType(UA_Server *server, const UA_NodeId *dataType, - const UA_NodeId *constraintDataType, UA_Boolean isValue) { - /* Do not allow empty datatypes */ - if(UA_NodeId_isNull(dataType)) - return false; +static void +clientExecuteRepeatedCallback(UA_Client *client, UA_ApplicationCallback cb, + void *callbackApplication, void *data) { + cb(callbackApplication, data); + /* TODO: Use workers in the client + * UA_WorkQueue_enqueue(&client->workQueue, cb, callbackApplication, data); */ +} - /* No constraint (TODO: use variant instead) */ - if(UA_NodeId_isNull(constraintDataType)) - return true; +UA_StatusCode UA_Client_run_iterate(UA_Client *client, UA_UInt16 timeout) { +// TODO connectivity check & timeout features for the async implementation (timeout == 0) + UA_StatusCode retval = UA_STATUSCODE_GOOD; +#ifdef UA_ENABLE_SUBSCRIPTIONS + UA_StatusCode retvalPublish = UA_Client_Subscriptions_backgroundPublish(client); + if(client->state >= UA_CLIENTSTATE_SESSION && retvalPublish != UA_STATUSCODE_GOOD) + return retvalPublish; +#endif + /* Make sure we have an open channel */ - /* Same datatypes */ - if (UA_NodeId_equal(dataType, constraintDataType)) - return true; + /************************************************************/ + /* FIXME: This is a dirty workaround */ + if(client->state >= UA_CLIENTSTATE_SECURECHANNEL) + retval = openSecureChannel(client, true); + /* FIXME: Will most likely break somewhere in the future */ + /************************************************************/ - /* Variant allows any subtype */ - if(UA_NodeId_equal(constraintDataType, &UA_TYPES[UA_TYPES_VARIANT].typeId)) - return true; + if(timeout) { + if(retval != UA_STATUSCODE_GOOD) + return retval; - /* Is the value-type a subtype of the required type? */ - if(isNodeInTree(&server->config.nodestore, dataType, constraintDataType, &subtypeId, 1)) - return true; + retval = UA_Client_backgroundConnectivity(client); + if(retval != UA_STATUSCODE_GOOD) + return retval; - /* Enum allows Int32 (only) */ - if(UA_NodeId_equal(dataType, &UA_TYPES[UA_TYPES_INT32].typeId) && - isNodeInTree(&server->config.nodestore, constraintDataType, &enumNodeId, &subtypeId, 1)) - return true; + UA_DateTime maxDate = UA_DateTime_nowMonotonic() + (timeout * UA_DATETIME_MSEC); + retval = receiveServiceResponse(client, NULL, NULL, maxDate, NULL); + if(retval == UA_STATUSCODE_GOODNONCRITICALTIMEOUT) + retval = UA_STATUSCODE_GOOD; + } else { + UA_DateTime now = UA_DateTime_nowMonotonic(); + UA_Timer_process(&client->timer, now, + (UA_TimerExecutionCallback)clientExecuteRepeatedCallback, client); - /* More checks for the data type of real values (variants) */ - if(isValue) { - /* If value is a built-in type: The target data type may be a sub type of - * the built-in type. (e.g. UtcTime is sub-type of DateTime and has a - * DateTime value). A type is builtin if its NodeId is in Namespace 0 and - * has a numeric identifier <= 25 (DiagnosticInfo) */ - if(dataType->namespaceIndex == 0 && - dataType->identifierType == UA_NODEIDTYPE_NUMERIC && - dataType->identifier.numeric <= 25 && - isNodeInTree(&server->config.nodestore, constraintDataType, - dataType, &subtypeId, 1)) - return true; + UA_ClientState cs = UA_Client_getState(client); + retval = UA_Client_connect_iterate(client); + + /* Connection failed, drop the rest */ + if(retval != UA_STATUSCODE_GOOD) + return retval; + if((cs == UA_CLIENTSTATE_SECURECHANNEL) || (cs == UA_CLIENTSTATE_SESSION)) { + /* Check for new data */ + retval = receiveServiceResponseAsync(client, NULL, NULL); + } else { + retval = receivePacketAsync(client); + } } +#ifdef UA_ENABLE_SUBSCRIPTIONS + /* The inactivity check must be done after receiveServiceResponse*/ + UA_Client_Subscriptions_backgroundPublishInactivityCheck(client); +#endif + asyncServiceTimeoutCheck(client); - return false; +#ifndef UA_ENABLE_MULTITHREADING + /* Process delayed callbacks when all callbacks and network events are + * done */ + UA_WorkQueue_manuallyProcessDelayed(&client->workQueue); +#endif + return retval; } -/* Test whether a ValueRank and the given arraydimensions are compatible. - * - * 5.6.2 Variable NodeClass: If the maximum is unknown the value shall be 0. The - * number of elements shall be equal to the value of the ValueRank Attribute. - * This Attribute shall be null if ValueRank <= 0. */ -UA_Boolean -compatibleValueRankArrayDimensions(UA_Server *server, UA_Session *session, - UA_Int32 valueRank, size_t arrayDimensionsSize) { - /* ValueRank invalid */ - if(valueRank < UA_VALUERANK_SCALAR_OR_ONE_DIMENSION) { - UA_LOG_INFO_SESSION(server->config.logger, session, "The ValueRank is invalid (< -3)"); - return false; - } +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/deps/libc_time.c" ***********************************/ - /* case -3, UA_VALUERANK_SCALAR_OR_ONE_DIMENSION: the value can be a scalar or a one dimensional array */ - /* case -2, UA_VALUERANK_ANY: the value can be a scalar or an array with any number of dimensions */ - /* case -1, UA_VALUERANK_SCALAR: the value is a scalar */ - /* case 0, UA_VALUERANK_ONE_OR_MORE_DIMENSIONS: the value is an array with one or more dimensions */ - if(valueRank <= UA_VALUERANK_ONE_OR_MORE_DIMENSIONS) { - if(arrayDimensionsSize > 0) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "No ArrayDimensions can be defined for a ValueRank <= 0"); - return false; - } - return true; - } - - /* case >= 1, UA_VALUERANK_ONE_DIMENSION: the value is an array with the specified number of dimensions */ - if(arrayDimensionsSize != (size_t)valueRank) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "The number of ArrayDimensions is not equal to the (positive) ValueRank"); - return false; +/* Originally released by the musl project (http://www.musl-libc.org/) under the + * MIT license. Taken from the file /src/time/__secs_to_tm.c */ + +#include + +/* 2000-03-01 (mod 400 year, immediately after feb29 */ +#define LEAPOCH (946684800LL + 86400*(31+29)) + +#define DAYS_PER_400Y (365*400 + 97) +#define DAYS_PER_100Y (365*100 + 24) +#define DAYS_PER_4Y (365*4 + 1) + +int __secs_to_tm(long long t, struct mytm *tm) { + long long days, secs, years; + int remdays, remsecs, remyears; + int qc_cycles, c_cycles, q_cycles; + int months; + static const char days_in_month[] = {31,30,31,30,31,31,30,31,30,31,31,29}; + + /* Reject time_t values whose year would overflow int */ + if (t < INT_MIN * 31622400LL || t > INT_MAX * 31622400LL) + return -1; + + secs = t - LEAPOCH; + days = secs / 86400LL; + remsecs = (int)(secs % 86400); + if (remsecs < 0) { + remsecs += 86400; + --days; } - return true; -} -UA_Boolean -compatibleValueRanks(UA_Int32 valueRank, UA_Int32 constraintValueRank) { - /* Check if the valuerank of the variabletype allows the change. */ - switch(constraintValueRank) { - case UA_VALUERANK_SCALAR_OR_ONE_DIMENSION: /* the value can be a scalar or a one dimensional array */ - if(valueRank != UA_VALUERANK_SCALAR && valueRank != UA_VALUERANK_ONE_DIMENSION) - return false; - break; - case UA_VALUERANK_ANY: /* the value can be a scalar or an array with any number of dimensions */ - break; - case UA_VALUERANK_SCALAR: /* the value is a scalar */ - if(valueRank != UA_VALUERANK_SCALAR) - return false; - break; - case UA_VALUERANK_ONE_OR_MORE_DIMENSIONS: /* the value is an array with one or more dimensions */ - if(valueRank < (UA_Int32) UA_VALUERANK_ONE_OR_MORE_DIMENSIONS) - return false; - break; - default: /* >= 1: the value is an array with the specified number of dimensions */ - if(valueRank != constraintValueRank) - return false; - break; + qc_cycles = (int)(days / DAYS_PER_400Y); + remdays = (int)(days % DAYS_PER_400Y); + if (remdays < 0) { + remdays += DAYS_PER_400Y; + --qc_cycles; } - return true; -} -/* Check if the ValueRank allows for the value dimension. This is more - * permissive than checking for the ArrayDimensions attribute. Because the value - * can have dimensions if the ValueRank < 0 */ -static UA_Boolean -compatibleValueRankValue(UA_Int32 valueRank, const UA_Variant *value) { - /* Invalid ValueRank */ - if(valueRank < UA_VALUERANK_SCALAR_OR_ONE_DIMENSION) - return false; + c_cycles = remdays / DAYS_PER_100Y; + if (c_cycles == 4) --c_cycles; + remdays -= c_cycles * DAYS_PER_100Y; - /* Empty arrays (-1) always match */ - if(!value->data) - return true; + q_cycles = remdays / DAYS_PER_4Y; + if (q_cycles == 25) --q_cycles; + remdays -= q_cycles * DAYS_PER_4Y; - size_t arrayDims = value->arrayDimensionsSize; - if(!arrayDims && !UA_Variant_isScalar(value)) - arrayDims = 1; /* array but no arraydimensions -> implicit array dimension 1 */ + remyears = remdays / 365; + if (remyears == 4) --remyears; + remdays -= remyears * 365; - /* We cannot simply use compatibleValueRankArrayDimensions since we can have - * defined ArrayDimensions for the value if the ValueRank is -2 */ - switch(valueRank) { - case UA_VALUERANK_SCALAR_OR_ONE_DIMENSION: /* The value can be a scalar or a one dimensional array */ - return (arrayDims <= 1); - case UA_VALUERANK_ANY: /* The value can be a scalar or an array with any number of dimensions */ - return true; - case UA_VALUERANK_SCALAR: /* The value is a scalar */ - return (arrayDims == 0); - default: - break; - } + years = remyears + 4*q_cycles + 100*c_cycles + 400LL*qc_cycles; + + for (months=0; days_in_month[months] <= remdays; ++months) + remdays -= days_in_month[months]; - UA_assert(valueRank >= UA_VALUERANK_ONE_OR_MORE_DIMENSIONS); + if (years+100 > INT_MAX || years+100 < INT_MIN) + return -1; - /* case 0: the value is an array with one or more dimensions */ - return (arrayDims == (UA_UInt32)valueRank); -} + tm->tm_year = (int)(years + 100); + tm->tm_mon = months + 2; + if (tm->tm_mon >= 12) { + tm->tm_mon -=12; + ++tm->tm_year; + } + tm->tm_mday = remdays + 1; + tm->tm_hour = remsecs / 3600; + tm->tm_min = remsecs / 60 % 60; + tm->tm_sec = remsecs % 60; -UA_Boolean -compatibleArrayDimensions(size_t constraintArrayDimensionsSize, - const UA_UInt32 *constraintArrayDimensions, - size_t testArrayDimensionsSize, - const UA_UInt32 *testArrayDimensions) { - /* No array dimensions defined -> everything is permitted if the value rank fits */ - if(constraintArrayDimensionsSize == 0) - return true; + return 0; +} - /* Dimension count must match */ - if(testArrayDimensionsSize != constraintArrayDimensionsSize) - return false; +static const int secs_through_month[] = + {0, 31*86400, 59*86400, 90*86400, + 120*86400, 151*86400, 181*86400, 212*86400, + 243*86400, 273*86400, 304*86400, 334*86400 }; - /* Dimension lengths must match; zero in the constraint is a wildcard */ - for(size_t i = 0; i < constraintArrayDimensionsSize; ++i) { - if(constraintArrayDimensions[i] != testArrayDimensions[i] && - constraintArrayDimensions[i] != 0) - return false; +static int +__month_to_secs(int month, int is_leap) { + int t = secs_through_month[month]; + if (is_leap && month >= 2) + t+=86400; + return t; +} + +static long long +__year_to_secs(const long long year, int *is_leap) { + int cycles, centuries, leaps, rem; + int is_leap_val = 0; + if (!is_leap) { + is_leap = &is_leap_val; + } + cycles = (int)((year-100) / 400); + rem = (int)((year-100) % 400); + if (rem < 0) { + cycles--; + rem += 400; + } + if (!rem) { + *is_leap = 1; + centuries = 0; + leaps = 0; + } else { + if (rem >= 200) { + if (rem >= 300) centuries = 3, rem -= 300; + else centuries = 2, rem -= 200; + } else { + if (rem >= 100) centuries = 1, rem -= 100; + else centuries = 0; + } + if (!rem) { + *is_leap = 0; + leaps = 0; + } else { + leaps = (rem / (int)4U); + rem %= (int)4U; + *is_leap = !rem; + } } - return true; + + leaps += 97*cycles + 24*centuries - *is_leap; + + return (year-100) * 31536000LL + leaps * 86400LL + 946684800 + 86400; } -UA_Boolean -compatibleValueArrayDimensions(const UA_Variant *value, size_t targetArrayDimensionsSize, - const UA_UInt32 *targetArrayDimensions) { - size_t valueArrayDimensionsSize = value->arrayDimensionsSize; - UA_UInt32 *valueArrayDimensions = value->arrayDimensions; - UA_UInt32 tempArrayDimensions; - if(valueArrayDimensions == 0 && !UA_Variant_isScalar(value)) { - valueArrayDimensionsSize = 1; - tempArrayDimensions = (UA_UInt32)value->arrayLength; - valueArrayDimensions = &tempArrayDimensions; +long long __tm_to_secs(const struct mytm *tm) { + int is_leap; + long long year = tm->tm_year; + int month = tm->tm_mon; + if (month >= 12 || month < 0) { + int adj = month / 12; + month %= 12; + if (month < 0) { + adj--; + month += 12; + } + year += adj; } - return compatibleArrayDimensions(targetArrayDimensionsSize, targetArrayDimensions, - valueArrayDimensionsSize, valueArrayDimensions); + long long t = __year_to_secs(year, &is_leap); + t += __month_to_secs(month, is_leap); + t += 86400LL * (tm->tm_mday-1); + t += 3600LL * tm->tm_hour; + t += 60LL * tm->tm_min; + t += tm->tm_sec; + return t; } -UA_Boolean -compatibleValue(UA_Server *server, UA_Session *session, const UA_NodeId *targetDataTypeId, - UA_Int32 targetValueRank, size_t targetArrayDimensionsSize, - const UA_UInt32 *targetArrayDimensions, const UA_Variant *value, - const UA_NumericRange *range) { - /* Empty value */ - if(!value->type) { - /* Empty value is allowed for BaseDataType */ - if(UA_NodeId_equal(targetDataTypeId, &UA_TYPES[UA_TYPES_VARIANT].typeId) || - UA_NodeId_equal(targetDataTypeId, &UA_NODEID_NULL)) - return true; +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/deps/pcg_basic.c" ***********************************/ - /* Workaround: Allow empty value if the target data type is abstract */ - const UA_Node *datatype = UA_Nodestore_get(server, targetDataTypeId); - if(datatype && datatype->nodeClass == UA_NODECLASS_DATATYPE) { - UA_Boolean isAbstract = ((const UA_DataTypeNode*)datatype)->isAbstract; - UA_Nodestore_release(server, datatype); - if(isAbstract) - return true; - } +/* + * PCG Random Number Generation for C. + * + * Copyright 2014 Melissa O'Neill + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * For additional information about the PCG random number generation scheme, + * including its license and other licensing options, visit + * + * http://www.pcg-random.org + */ - UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_SERVER, - "Only Variables with data type BaseDataType may contain " - "a null (empty) value"); - return false; - } - /* Has the value a subtype of the required type? BaseDataType (Variant) can - * be anything... */ - if(!compatibleDataType(server, &value->type->typeId, targetDataTypeId, true)) - return false; +void pcg32_srandom_r(pcg32_random_t* rng, uint64_t initial_state, uint64_t initseq) { + rng->state = 0U; + rng->inc = (initseq << 1u) | 1u; + pcg32_random_r(rng); + rng->state += initial_state; + pcg32_random_r(rng); +} - /* Array dimensions are checked later when writing the range */ - if(range) - return true; +uint32_t pcg32_random_r(pcg32_random_t* rng) { + uint64_t oldstate = rng->state; + rng->state = oldstate * 6364136223846793005ULL + rng->inc; + uint32_t xorshifted = (uint32_t)(((oldstate >> 18u) ^ oldstate) >> 27u); + uint32_t rot = (uint32_t)(oldstate >> 59u); + return (xorshifted >> rot) | (xorshifted << ((~rot + 1u) & 31)); /* was (xorshifted >> rot) | (xorshifted << ((-rot) & 31)) */ +} - /* See if the array dimensions match. */ - if(!compatibleValueArrayDimensions(value, targetArrayDimensionsSize, targetArrayDimensions)) - return false; +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/deps/base64.c" ***********************************/ - /* Check if the valuerank allows for the value dimension */ - return compatibleValueRankValue(targetValueRank, value); -} +/* + * Base64 encoding: Copyright (c) 2005-2011, Jouni Malinen + * This software may be distributed under the terms of the BSD license. + * + * Base64 decoding: Copyright (c) 2016, polfosol + * Posted at https://stackoverflow.com/a/37109258 under the CC-BY-SA Creative + * Commons license. + */ -/*****************/ -/* Write Service */ -/*****************/ -static void -adjustValue(UA_Server *server, UA_Variant *value, - const UA_NodeId *targetDataTypeId) { - const UA_DataType *targetDataType = UA_findDataType(targetDataTypeId); - if(!targetDataType) - return; +static const unsigned char base64_table[65] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +unsigned char * +UA_base64(const unsigned char *src, size_t len, size_t *out_len) { + if(len == 0) { + *out_len = 0; + return (unsigned char*)UA_EMPTY_ARRAY_SENTINEL; + } + + size_t olen = 4*((len + 2) / 3); /* 3-byte blocks to 4-byte */ + if(olen < len) + return NULL; /* integer overflow */ + + unsigned char *out = (unsigned char*)UA_malloc(olen); + if(!out) + return NULL; + + const unsigned char *end = src + len; + const unsigned char *in = src; + unsigned char *pos = out; + while(end - in >= 3) { + *pos++ = base64_table[in[0] >> 2]; + *pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)]; + *pos++ = base64_table[((in[1] & 0x0f) << 2) | (in[2] >> 6)]; + *pos++ = base64_table[in[2] & 0x3f]; + in += 3; + } + + if(end - in) { + *pos++ = base64_table[in[0] >> 2]; + if(end - in == 1) { + *pos++ = base64_table[(in[0] & 0x03) << 4]; + *pos++ = '='; + } else { + *pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)]; + *pos++ = base64_table[(in[1] & 0x0f) << 2]; + } + *pos++ = '='; + } + + *out_len = (size_t)(pos - out); + return out; +} + +static const uint32_t from_b64[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, 62, 62, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 63, + 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51}; + +unsigned char * +UA_unbase64(const unsigned char *src, size_t len, size_t *out_len) { + // we need a minimum length + if(len <= 2) { + *out_len = 0; + return (unsigned char*)UA_EMPTY_ARRAY_SENTINEL; + } + + const unsigned char *p = src; + size_t pad1 = len % 4 || p[len - 1] == '='; + size_t pad2 = pad1 && (len % 4 > 2 || p[len - 2] != '='); + const size_t last = (len - pad1) / 4 << 2; + + unsigned char *str = (unsigned char*)UA_malloc(last / 4 * 3 + pad1 + pad2); + if(!str) + return NULL; - /* A string is written to a byte array. the valuerank and array dimensions - * are checked later */ - if(targetDataType == &UA_TYPES[UA_TYPES_BYTE] && - value->type == &UA_TYPES[UA_TYPES_BYTESTRING] && - UA_Variant_isScalar(value)) { - UA_ByteString *str = (UA_ByteString*)value->data; - value->type = &UA_TYPES[UA_TYPES_BYTE]; - value->arrayLength = str->length; - value->data = str->data; - return; + unsigned char *pos = str; + for(size_t i = 0; i < last; i += 4) { + uint32_t n = from_b64[p[i]] << 18 | from_b64[p[i + 1]] << 12 | + from_b64[p[i + 2]] << 6 | from_b64[p[i + 3]]; + *pos++ = (unsigned char)(n >> 16); + *pos++ = (unsigned char)(n >> 8 & 0xFF); + *pos++ = (unsigned char)(n & 0xFF); } - /* An enum was sent as an int32, or an opaque type as a bytestring. This - * is detected with the typeIndex indicating the "true" datatype. */ - enum type_equivalence te1 = typeEquivalence(targetDataType); - enum type_equivalence te2 = typeEquivalence(value->type); - if(te1 != TYPE_EQUIVALENCE_NONE && te1 == te2) { - value->type = targetDataType; - return; + if(pad1) { + if (last + 1 >= len) { + UA_free(str); + *out_len = 0; + return (unsigned char*)UA_EMPTY_ARRAY_SENTINEL; + } + uint32_t n = from_b64[p[last]] << 18 | from_b64[p[last + 1]] << 12; + *pos++ = (unsigned char)(n >> 16); + if(pad2) { + if (last + 2 >= len) { + UA_free(str); + *out_len = 0; + return (unsigned char*)UA_EMPTY_ARRAY_SENTINEL; + } + n |= from_b64[p[last + 2]] << 6; + *pos++ = (unsigned char)(n >> 8 & 0xFF); + } } - /* No more possible equivalencies */ + *out_len = (uintptr_t)(pos - str); + return str; } -static UA_StatusCode -writeArrayDimensionsAttribute(UA_Server *server, UA_Session *session, - UA_VariableNode *node, const UA_VariableTypeNode *type, - size_t arrayDimensionsSize, UA_UInt32 *arrayDimensions) { - UA_assert(node != NULL); - UA_assert(type != NULL); +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/namespace0_generated.c" ***********************************/ - /* If this is a variabletype, there must be no instances or subtypes of it - * when we do the change */ - if(node->nodeClass == UA_NODECLASS_VARIABLETYPE && - UA_Node_hasSubTypeOrInstances((UA_Node*)node)) { - UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_SERVER, - "Cannot change a variable type with existing instances"); - return UA_STATUSCODE_BADINTERNALERROR; - } +/* WARNING: This is a generated file. + * Any manual changes will be overwritten. */ - /* Check that the array dimensions match with the valuerank */ - if(!compatibleValueRankArrayDimensions(server, session, node->valueRank, arrayDimensionsSize)) { - UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER, - "Cannot write the ArrayDimensions. The ValueRank does not match."); - return UA_STATUSCODE_BADTYPEMISMATCH; - } - /* Check if the array dimensions match with the wildcards in the - * variabletype (dimension length 0) */ - if(type->arrayDimensions && - !compatibleArrayDimensions(type->arrayDimensionsSize, type->arrayDimensions, - arrayDimensionsSize, arrayDimensions)) { - UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER, - "Array dimensions in the variable type do not match"); - return UA_STATUSCODE_BADTYPEMISMATCH; - } - /* Check if the current value is compatible with the array dimensions */ - UA_DataValue value; - UA_DataValue_init(&value); - UA_StatusCode retval = readValueAttribute(server, session, node, &value); - if(retval != UA_STATUSCODE_GOOD) - return retval; - if(value.hasValue) { - if(!compatibleValueArrayDimensions(&value.value, arrayDimensionsSize, arrayDimensions)) - retval = UA_STATUSCODE_BADTYPEMISMATCH; - UA_DataValue_deleteMembers(&value); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER, - "Array dimensions in the current value do not match"); - return retval; - } - } +/* HasAddIn - ns=0;i=17604 */ - /* Ok, apply */ - UA_UInt32 *oldArrayDimensions = node->arrayDimensions; - size_t oldArrayDimensionsSize = node->arrayDimensionsSize; - retval = UA_Array_copy(arrayDimensions, arrayDimensionsSize, - (void**)&node->arrayDimensions, - &UA_TYPES[UA_TYPES_UINT32]); - if(retval != UA_STATUSCODE_GOOD) - return retval; - UA_Array_delete(oldArrayDimensions, oldArrayDimensionsSize, &UA_TYPES[UA_TYPES_UINT32]); - node->arrayDimensionsSize = arrayDimensionsSize; - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_0_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default; +attr.inverseName = UA_LOCALIZEDTEXT("", "AddInOf"); +attr.displayName = UA_LOCALIZEDTEXT("", "HasAddIn"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE, +UA_NODEID_NUMERIC(ns[0], 17604), +UA_NODEID_NUMERIC(ns[0], 32), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "HasAddIn"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); +return retVal; } -/* Stack layout: ... | node | type */ -static UA_StatusCode -writeValueRankAttribute(UA_Server *server, UA_Session *session, - UA_VariableNode *node, const UA_VariableTypeNode *type, - UA_Int32 valueRank) { - UA_assert(node != NULL); - UA_assert(type != NULL); +static UA_StatusCode function_namespace0_generated_0_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 17604) +); +} - UA_Int32 constraintValueRank = type->valueRank; +/* HasInterface - ns=0;i=17603 */ - /* If this is a variabletype, there must be no instances or subtypes of it - * when we do the change */ - if(node->nodeClass == UA_NODECLASS_VARIABLETYPE && - UA_Node_hasSubTypeOrInstances((const UA_Node*)node)) - return UA_STATUSCODE_BADINTERNALERROR; +static UA_StatusCode function_namespace0_generated_1_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default; +attr.inverseName = UA_LOCALIZEDTEXT("", "InterfaceOf"); +attr.displayName = UA_LOCALIZEDTEXT("", "HasInterface"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE, +UA_NODEID_NUMERIC(ns[0], 17603), +UA_NODEID_NUMERIC(ns[0], 32), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "HasInterface"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Check if the valuerank of the variabletype allows the change. */ - if(!compatibleValueRanks(valueRank, constraintValueRank)) - return UA_STATUSCODE_BADTYPEMISMATCH; +static UA_StatusCode function_namespace0_generated_1_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 17603) +); +} - /* Check if the new valuerank is compatible with the array dimensions. Use - * the read service to handle data sources. */ - size_t arrayDims = node->arrayDimensionsSize; - if(arrayDims == 0) { - /* the value could be an array with no arrayDimensions defined. - dimensions zero indicate a scalar for compatibleValueRankArrayDimensions. */ - UA_DataValue value; - UA_DataValue_init(&value); - UA_StatusCode retval = readValueAttribute(server, session, node, &value); - if(retval != UA_STATUSCODE_GOOD) - return retval; - if(!value.hasValue || !value.value.type) { - /* no value -> apply */ - node->valueRank = valueRank; - return UA_STATUSCODE_GOOD; - } - if(!UA_Variant_isScalar(&value.value)) - arrayDims = 1; - UA_DataValue_deleteMembers(&value); - } - if(!compatibleValueRankArrayDimensions(server, session, valueRank, arrayDims)) - return UA_STATUSCODE_BADTYPEMISMATCH; +/* HasHistoricalConfiguration - ns=0;i=56 */ - /* All good, apply the change */ - node->valueRank = valueRank; - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_2_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default; +attr.inverseName = UA_LOCALIZEDTEXT("", "HistoricalConfigurationOf"); +attr.displayName = UA_LOCALIZEDTEXT("", "HasHistoricalConfiguration"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE, +UA_NODEID_NUMERIC(ns[0], 56), +UA_NODEID_NUMERIC(ns[0], 44), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "HasHistoricalConfiguration"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); +return retVal; } -static UA_StatusCode -writeDataTypeAttribute(UA_Server *server, UA_Session *session, - UA_VariableNode *node, const UA_VariableTypeNode *type, - const UA_NodeId *dataType) { - UA_assert(node != NULL); - UA_assert(type != NULL); +static UA_StatusCode function_namespace0_generated_2_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 56) +); +} - /* If this is a variabletype, there must be no instances or subtypes of it - when we do the change */ - if(node->nodeClass == UA_NODECLASS_VARIABLETYPE && - UA_Node_hasSubTypeOrInstances((const UA_Node*)node)) - return UA_STATUSCODE_BADINTERNALERROR; +/* HasEffect - ns=0;i=54 */ - /* Does the new type match the constraints of the variabletype? */ - if(!compatibleDataType(server, dataType, &type->dataType, false)) - return UA_STATUSCODE_BADTYPEMISMATCH; +static UA_StatusCode function_namespace0_generated_3_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default; +attr.inverseName = UA_LOCALIZEDTEXT("", "MayBeEffectedBy"); +attr.displayName = UA_LOCALIZEDTEXT("", "HasEffect"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE, +UA_NODEID_NUMERIC(ns[0], 54), +UA_NODEID_NUMERIC(ns[0], 32), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "HasEffect"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Check if the current value would match the new type */ - UA_DataValue value; - UA_DataValue_init(&value); - UA_StatusCode retval = readValueAttribute(server, session, node, &value); - if(retval != UA_STATUSCODE_GOOD) - return retval; - if(value.hasValue) { - if(!compatibleValue(server, session, dataType, node->valueRank, - node->arrayDimensionsSize, node->arrayDimensions, - &value.value, NULL)) - retval = UA_STATUSCODE_BADTYPEMISMATCH; - UA_DataValue_deleteMembers(&value); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER, - "The current value does not match the new data type"); - return retval; - } - } +static UA_StatusCode function_namespace0_generated_3_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 54) +); +} - /* Replace the datatype nodeid */ - UA_NodeId dtCopy = node->dataType; - retval = UA_NodeId_copy(dataType, &node->dataType); - if(retval != UA_STATUSCODE_GOOD) { - node->dataType = dtCopy; - return retval; - } - UA_NodeId_deleteMembers(&dtCopy); - return UA_STATUSCODE_GOOD; +/* HasCause - ns=0;i=53 */ + +static UA_StatusCode function_namespace0_generated_4_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default; +attr.inverseName = UA_LOCALIZEDTEXT("", "MayBeCausedBy"); +attr.displayName = UA_LOCALIZEDTEXT("", "HasCause"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE, +UA_NODEID_NUMERIC(ns[0], 53), +UA_NODEID_NUMERIC(ns[0], 32), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "HasCause"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); +return retVal; } -static UA_StatusCode -writeValueAttributeWithoutRange(UA_VariableNode *node, const UA_DataValue *value) { - UA_DataValue new_value; - UA_StatusCode retval = UA_DataValue_copy(value, &new_value); - if(retval != UA_STATUSCODE_GOOD) - return retval; - UA_DataValue_deleteMembers(&node->value.data.value); - node->value.data.value = new_value; - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_4_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 53) +); } -static UA_StatusCode -writeValueAttributeWithRange(UA_VariableNode *node, const UA_DataValue *value, - const UA_NumericRange *rangeptr) { - /* Value on both sides? */ - if(value->status != node->value.data.value.status || - !value->hasValue || !node->value.data.value.hasValue) - return UA_STATUSCODE_BADINDEXRANGEINVALID; +/* ToState - ns=0;i=52 */ - /* Make scalar a one-entry array for range matching */ - UA_Variant editableValue; - const UA_Variant *v = &value->value; - if(UA_Variant_isScalar(&value->value)) { - editableValue = value->value; - editableValue.arrayLength = 1; - v = &editableValue; - } +static UA_StatusCode function_namespace0_generated_5_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default; +attr.inverseName = UA_LOCALIZEDTEXT("", "FromTransition"); +attr.displayName = UA_LOCALIZEDTEXT("", "ToState"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE, +UA_NODEID_NUMERIC(ns[0], 52), +UA_NODEID_NUMERIC(ns[0], 32), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "ToState"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Check that the type is an exact match and not only "compatible" */ - if(!node->value.data.value.value.type || !v->type || - !UA_NodeId_equal(&node->value.data.value.value.type->typeId, - &v->type->typeId)) - return UA_STATUSCODE_BADTYPEMISMATCH; +static UA_StatusCode function_namespace0_generated_5_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 52) +); +} - /* Write the value */ - UA_StatusCode retval = UA_Variant_setRangeCopy(&node->value.data.value.value, - v->data, v->arrayLength, *rangeptr); - if(retval != UA_STATUSCODE_GOOD) - return retval; +/* FromState - ns=0;i=51 */ - /* Write the status and timestamps */ - node->value.data.value.hasStatus = value->hasStatus; - node->value.data.value.status = value->status; - node->value.data.value.hasSourceTimestamp = value->hasSourceTimestamp; - node->value.data.value.sourceTimestamp = value->sourceTimestamp; - node->value.data.value.hasSourcePicoseconds = value->hasSourcePicoseconds; - node->value.data.value.sourcePicoseconds = value->sourcePicoseconds; - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_6_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default; +attr.inverseName = UA_LOCALIZEDTEXT("", "ToTransition"); +attr.displayName = UA_LOCALIZEDTEXT("", "FromState"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_REFERENCETYPE, +UA_NODEID_NUMERIC(ns[0], 51), +UA_NODEID_NUMERIC(ns[0], 32), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "FromState"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],NULL, NULL); +return retVal; } -/* Stack layout: ... | node */ -static UA_StatusCode -writeValueAttribute(UA_Server *server, UA_Session *session, - UA_VariableNode *node, const UA_DataValue *value, - const UA_String *indexRange) { - UA_assert(node != NULL); +static UA_StatusCode function_namespace0_generated_6_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 51) +); +} - /* Parse the range */ - UA_NumericRange range; - UA_NumericRange *rangeptr = NULL; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(indexRange && indexRange->length > 0) { - retval = UA_NumericRange_parseFromString(&range, indexRange); - if(retval != UA_STATUSCODE_GOOD) - return retval; - rangeptr = ⦥ - } +/* DiagnosticInfo - ns=0;i=25 */ - /* Created an editable version. The data is not touched. Only the variant - * "container". */ - UA_DataValue adjustedValue = *value; +static UA_StatusCode function_namespace0_generated_7_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "DiagnosticInfo"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 25), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "DiagnosticInfo"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Type checking. May change the type of editableValue */ - if(value->hasValue && value->value.type) { - adjustValue(server, &adjustedValue.value, &node->dataType); +static UA_StatusCode function_namespace0_generated_7_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 25) +); +} - /* The value may be an extension object, especially the nodeset compiler - * uses extension objects to write variable values. If value is an - * extension object we check if the current node value is also an - * extension object. */ - UA_Boolean compatible; - if(value->value.type->typeId.identifierType == UA_NODEIDTYPE_NUMERIC && - value->value.type->typeId.identifier.numeric == UA_NS0ID_STRUCTURE) { - const UA_NodeId nodeDataType = UA_NODEID_NUMERIC(0, UA_NS0ID_STRUCTURE); - compatible = compatibleValue(server, session, &nodeDataType, node->valueRank, - node->arrayDimensionsSize, node->arrayDimensions, - &adjustedValue.value, rangeptr); - } else { - compatible = compatibleValue(server, session, &node->dataType, node->valueRank, - node->arrayDimensionsSize, node->arrayDimensions, - &adjustedValue.value, rangeptr); - } +/* DataValue - ns=0;i=23 */ +static UA_StatusCode function_namespace0_generated_8_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "DataValue"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 23), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "DataValue"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - if(!compatible) { - if(rangeptr) - UA_free(range.dimensions); - return UA_STATUSCODE_BADTYPEMISMATCH; - } - } +static UA_StatusCode function_namespace0_generated_8_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 23) +); +} - /* Set the source timestamp if there is none */ - UA_DateTime now = UA_DateTime_now(); - if(!adjustedValue.hasSourceTimestamp) { - adjustedValue.sourceTimestamp = now; - adjustedValue.hasSourceTimestamp = true; - } +/* Structure - ns=0;i=22 */ - if(!adjustedValue.hasServerTimestamp) { - adjustedValue.serverTimestamp = now; - adjustedValue.hasServerTimestamp = true; - } +static UA_StatusCode function_namespace0_generated_9_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.isAbstract = true; +attr.displayName = UA_LOCALIZEDTEXT("", "Structure"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 22), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Structure"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Ok, do it */ - if(node->valueSource == UA_VALUESOURCE_DATA) { - if(!rangeptr) - retval = writeValueAttributeWithoutRange(node, &adjustedValue); - else - retval = writeValueAttributeWithRange(node, &adjustedValue, rangeptr); +static UA_StatusCode function_namespace0_generated_9_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 22) +); +} + +/* ServerDiagnosticsSummaryDataType - ns=0;i=859 */ + +static UA_StatusCode function_namespace0_generated_10_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummaryDataType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 859), +UA_NODEID_NUMERIC(ns[0], 22), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "ServerDiagnosticsSummaryDataType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Callback after writing */ - if(retval == UA_STATUSCODE_GOOD && node->value.data.callback.onWrite) - node->value.data.callback.onWrite(server, &session->sessionId, - session->sessionHandle, &node->nodeId, - node->context, rangeptr, - &adjustedValue); - } else { - if(node->value.dataSource.write) { - retval = node->value.dataSource.write(server, &session->sessionId, - session->sessionHandle, &node->nodeId, - node->context, rangeptr, &adjustedValue); - } else { - retval = UA_STATUSCODE_BADWRITENOTSUPPORTED; - } - } +static UA_StatusCode function_namespace0_generated_10_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 859) +); +} - /* Clean up */ - if(rangeptr) - UA_free(range.dimensions); - return retval; +/* SignedSoftwareCertificate - ns=0;i=344 */ + +static UA_StatusCode function_namespace0_generated_11_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "SignedSoftwareCertificate"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 344), +UA_NODEID_NUMERIC(ns[0], 22), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "SignedSoftwareCertificate"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; } -static UA_StatusCode -writeIsAbstractAttribute(UA_Node *node, UA_Boolean value) { - switch(node->nodeClass) { - case UA_NODECLASS_OBJECTTYPE: - ((UA_ObjectTypeNode*)node)->isAbstract = value; - break; - case UA_NODECLASS_REFERENCETYPE: - ((UA_ReferenceTypeNode*)node)->isAbstract = value; - break; - case UA_NODECLASS_VARIABLETYPE: - ((UA_VariableTypeNode*)node)->isAbstract = value; - break; - case UA_NODECLASS_DATATYPE: - ((UA_DataTypeNode*)node)->isAbstract = value; - break; - default: - return UA_STATUSCODE_BADNODECLASSINVALID; - } - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_11_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 344) +); } -/*****************/ -/* Write Service */ -/*****************/ +/* BuildInfo - ns=0;i=338 */ -#define CHECK_DATATYPE_SCALAR(EXP_DT) \ - if(!wvalue->value.hasValue || \ - &UA_TYPES[UA_TYPES_##EXP_DT] != wvalue->value.value.type || \ - !UA_Variant_isScalar(&wvalue->value.value)) { \ - retval = UA_STATUSCODE_BADTYPEMISMATCH; \ - break; \ - } +static UA_StatusCode function_namespace0_generated_12_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "BuildInfo"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 338), +UA_NODEID_NUMERIC(ns[0], 22), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "BuildInfo"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} -#define CHECK_DATATYPE_ARRAY(EXP_DT) \ - if(!wvalue->value.hasValue || \ - &UA_TYPES[UA_TYPES_##EXP_DT] != wvalue->value.value.type || \ - UA_Variant_isScalar(&wvalue->value.value)) { \ - retval = UA_STATUSCODE_BADTYPEMISMATCH; \ - break; \ - } +static UA_StatusCode function_namespace0_generated_12_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 338) +); +} -#define CHECK_NODECLASS_WRITE(CLASS) \ - if((node->nodeClass & (CLASS)) == 0) { \ - retval = UA_STATUSCODE_BADNODECLASSINVALID; \ - break; \ - } +/* ServerStatusDataType - ns=0;i=862 */ -#define CHECK_USERWRITEMASK(mask) \ - if(!(userWriteMask & (mask))) { \ - retval = UA_STATUSCODE_BADUSERACCESSDENIED; \ - break; \ - } +static UA_StatusCode function_namespace0_generated_13_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ServerStatusDataType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 862), +UA_NODEID_NUMERIC(ns[0], 22), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "ServerStatusDataType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} -#define GET_NODETYPE \ - type = (const UA_VariableTypeNode*) \ - getNodeType(server, node); \ - if(!type) { \ - retval = UA_STATUSCODE_BADTYPEMISMATCH; \ - break; \ - } +static UA_StatusCode function_namespace0_generated_13_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 862) +); +} -/* This function implements the main part of the write service and operates on a - copy of the node (not in single-threaded mode). */ -static UA_StatusCode -copyAttributeIntoNode(UA_Server *server, UA_Session *session, - UA_Node *node, const UA_WriteValue *wvalue) { - const void *value = wvalue->value.value.data; - UA_UInt32 userWriteMask = getUserWriteMask(server, session, node); - UA_StatusCode retval = UA_STATUSCODE_GOOD; +/* EnumValueType - ns=0;i=7594 */ - const UA_VariableTypeNode *type; +static UA_StatusCode function_namespace0_generated_14_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "EnumValueType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 7594), +UA_NODEID_NUMERIC(ns[0], 22), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "EnumValueType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - switch(wvalue->attributeId) { - case UA_ATTRIBUTEID_NODEID: - case UA_ATTRIBUTEID_NODECLASS: - case UA_ATTRIBUTEID_USERWRITEMASK: - case UA_ATTRIBUTEID_USERACCESSLEVEL: - case UA_ATTRIBUTEID_USEREXECUTABLE: - retval = UA_STATUSCODE_BADWRITENOTSUPPORTED; - break; - case UA_ATTRIBUTEID_BROWSENAME: - CHECK_USERWRITEMASK(UA_WRITEMASK_BROWSENAME); - CHECK_DATATYPE_SCALAR(QUALIFIEDNAME); - UA_QualifiedName_deleteMembers(&node->browseName); - UA_QualifiedName_copy((const UA_QualifiedName *)value, &node->browseName); - break; - case UA_ATTRIBUTEID_DISPLAYNAME: - CHECK_USERWRITEMASK(UA_WRITEMASK_DISPLAYNAME); - CHECK_DATATYPE_SCALAR(LOCALIZEDTEXT); - UA_LocalizedText_deleteMembers(&node->displayName); - UA_LocalizedText_copy((const UA_LocalizedText *)value, &node->displayName); - break; - case UA_ATTRIBUTEID_DESCRIPTION: - CHECK_USERWRITEMASK(UA_WRITEMASK_DESCRIPTION); - CHECK_DATATYPE_SCALAR(LOCALIZEDTEXT); - UA_LocalizedText_deleteMembers(&node->description); - UA_LocalizedText_copy((const UA_LocalizedText *)value, &node->description); - break; - case UA_ATTRIBUTEID_WRITEMASK: - CHECK_USERWRITEMASK(UA_WRITEMASK_WRITEMASK); - CHECK_DATATYPE_SCALAR(UINT32); - node->writeMask = *(const UA_UInt32*)value; - break; - case UA_ATTRIBUTEID_ISABSTRACT: - CHECK_USERWRITEMASK(UA_WRITEMASK_ISABSTRACT); - CHECK_DATATYPE_SCALAR(BOOLEAN); - retval = writeIsAbstractAttribute(node, *(const UA_Boolean*)value); - break; - case UA_ATTRIBUTEID_SYMMETRIC: - CHECK_NODECLASS_WRITE(UA_NODECLASS_REFERENCETYPE); - CHECK_USERWRITEMASK(UA_WRITEMASK_SYMMETRIC); - CHECK_DATATYPE_SCALAR(BOOLEAN); - ((UA_ReferenceTypeNode*)node)->symmetric = *(const UA_Boolean*)value; - break; - case UA_ATTRIBUTEID_INVERSENAME: - CHECK_NODECLASS_WRITE(UA_NODECLASS_REFERENCETYPE); - CHECK_USERWRITEMASK(UA_WRITEMASK_INVERSENAME); - CHECK_DATATYPE_SCALAR(LOCALIZEDTEXT); - UA_LocalizedText_deleteMembers(&((UA_ReferenceTypeNode*)node)->inverseName); - UA_LocalizedText_copy((const UA_LocalizedText *)value, - &((UA_ReferenceTypeNode*)node)->inverseName); - break; - case UA_ATTRIBUTEID_CONTAINSNOLOOPS: - CHECK_NODECLASS_WRITE(UA_NODECLASS_VIEW); - CHECK_USERWRITEMASK(UA_WRITEMASK_CONTAINSNOLOOPS); - CHECK_DATATYPE_SCALAR(BOOLEAN); - ((UA_ViewNode*)node)->containsNoLoops = *(const UA_Boolean*)value; - break; - case UA_ATTRIBUTEID_EVENTNOTIFIER: - CHECK_NODECLASS_WRITE(UA_NODECLASS_VIEW | UA_NODECLASS_OBJECT); - CHECK_USERWRITEMASK(UA_WRITEMASK_EVENTNOTIFIER); - CHECK_DATATYPE_SCALAR(BYTE); - ((UA_ViewNode*)node)->eventNotifier = *(const UA_Byte*)value; - break; - case UA_ATTRIBUTEID_VALUE: - CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); - if(node->nodeClass == UA_NODECLASS_VARIABLE) { - /* The access to a value variable is granted via the AccessLevel - * and UserAccessLevel attributes */ - UA_Byte accessLevel = getAccessLevel(server, session, (const UA_VariableNode*)node); - if(!(accessLevel & (UA_ACCESSLEVELMASK_WRITE))) { - retval = UA_STATUSCODE_BADNOTWRITABLE; - break; - } - accessLevel = getUserAccessLevel(server, session, - (const UA_VariableNode*)node); - if(!(accessLevel & (UA_ACCESSLEVELMASK_WRITE))) { - retval = UA_STATUSCODE_BADUSERACCESSDENIED; - break; - } - } else { /* UA_NODECLASS_VARIABLETYPE */ - CHECK_USERWRITEMASK(UA_WRITEMASK_VALUEFORVARIABLETYPE); - } - retval = writeValueAttribute(server, session, (UA_VariableNode*)node, - &wvalue->value, &wvalue->indexRange); - break; - case UA_ATTRIBUTEID_DATATYPE: - CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); - CHECK_USERWRITEMASK(UA_WRITEMASK_DATATYPE); - CHECK_DATATYPE_SCALAR(NODEID); - GET_NODETYPE - retval = writeDataTypeAttribute(server, session, (UA_VariableNode*)node, - type, (const UA_NodeId*)value); - UA_Nodestore_release(server, (const UA_Node*)type); - break; - case UA_ATTRIBUTEID_VALUERANK: - CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); - CHECK_USERWRITEMASK(UA_WRITEMASK_VALUERANK); - CHECK_DATATYPE_SCALAR(INT32); - GET_NODETYPE - retval = writeValueRankAttribute(server, session, (UA_VariableNode*)node, - type, *(const UA_Int32*)value); - UA_Nodestore_release(server, (const UA_Node*)type); - break; - case UA_ATTRIBUTEID_ARRAYDIMENSIONS: - CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE); - CHECK_USERWRITEMASK(UA_WRITEMASK_ARRRAYDIMENSIONS); - CHECK_DATATYPE_ARRAY(UINT32); - GET_NODETYPE - retval = writeArrayDimensionsAttribute(server, session, (UA_VariableNode*)node, - type, wvalue->value.value.arrayLength, - (UA_UInt32 *)wvalue->value.value.data); - UA_Nodestore_release(server, (const UA_Node*)type); - break; - case UA_ATTRIBUTEID_ACCESSLEVEL: - CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE); - CHECK_USERWRITEMASK(UA_WRITEMASK_ACCESSLEVEL); - CHECK_DATATYPE_SCALAR(BYTE); - ((UA_VariableNode*)node)->accessLevel = *(const UA_Byte*)value; - break; - case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL: - CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE); - CHECK_USERWRITEMASK(UA_WRITEMASK_MINIMUMSAMPLINGINTERVAL); - CHECK_DATATYPE_SCALAR(DOUBLE); - ((UA_VariableNode*)node)->minimumSamplingInterval = *(const UA_Double*)value; - break; - case UA_ATTRIBUTEID_HISTORIZING: - CHECK_NODECLASS_WRITE(UA_NODECLASS_VARIABLE); - CHECK_USERWRITEMASK(UA_WRITEMASK_HISTORIZING); - CHECK_DATATYPE_SCALAR(BOOLEAN); - ((UA_VariableNode*)node)->historizing = *(const UA_Boolean*)value; - break; - case UA_ATTRIBUTEID_EXECUTABLE: - CHECK_NODECLASS_WRITE(UA_NODECLASS_METHOD); - CHECK_USERWRITEMASK(UA_WRITEMASK_EXECUTABLE); - CHECK_DATATYPE_SCALAR(BOOLEAN); - ((UA_MethodNode*)node)->executable = *(const UA_Boolean*)value; - break; - default: - retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID; - break; - } - if(retval != UA_STATUSCODE_GOOD) - UA_LOG_INFO_SESSION(server->config.logger, session, - "WriteRequest returned status code %s", - UA_StatusCode_name(retval)); - return retval; +static UA_StatusCode function_namespace0_generated_14_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 7594) +); } -static void -Operation_Write(UA_Server *server, UA_Session *session, void *context, - UA_WriteValue *wv, UA_StatusCode *result) { - *result = UA_Server_editNode(server, session, &wv->nodeId, - (UA_EditNodeCallback)copyAttributeIntoNode, wv); +/* Argument - ns=0;i=296 */ + +static UA_StatusCode function_namespace0_generated_15_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Argument"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 296), +UA_NODEID_NUMERIC(ns[0], 22), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Argument"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; } -void -Service_Write(UA_Server *server, UA_Session *session, - const UA_WriteRequest *request, - UA_WriteResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing WriteRequest"); +static UA_StatusCode function_namespace0_generated_15_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 296) +); +} - if(server->config.maxNodesPerWrite != 0 && - request->nodesToWriteSize > server->config.maxNodesPerWrite) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; - } +/* LocalizedText - ns=0;i=21 */ - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_Write, NULL, - &request->nodesToWriteSize, &UA_TYPES[UA_TYPES_WRITEVALUE], - &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +static UA_StatusCode function_namespace0_generated_16_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "LocalizedText"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 21), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "LocalizedText"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; } -UA_StatusCode -UA_Server_write(UA_Server *server, const UA_WriteValue *value) { - UA_StatusCode retval = - UA_Server_editNode(server, &server->adminSession, &value->nodeId, - (UA_EditNodeCallback)copyAttributeIntoNode, - /* casting away const qualifier because callback uses const anyway */ - (UA_WriteValue *)(uintptr_t)value); - return retval; +static UA_StatusCode function_namespace0_generated_16_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 21) +); } -/* Convenience function to be wrapped into inline functions */ -UA_StatusCode -__UA_Server_write(UA_Server *server, const UA_NodeId *nodeId, - const UA_AttributeId attributeId, - const UA_DataType *attr_type, - const void *attr) { - UA_WriteValue wvalue; - UA_WriteValue_init(&wvalue); - wvalue.nodeId = *nodeId; - wvalue.attributeId = attributeId; - wvalue.value.hasValue = true; - if(attr_type != &UA_TYPES[UA_TYPES_VARIANT]) { - /* hacked cast. the target WriteValue is used as const anyway */ - UA_Variant_setScalar(&wvalue.value.value, - (void*)(uintptr_t)attr, attr_type); - } else { - wvalue.value.value = *(const UA_Variant*)attr; - } - return UA_Server_write(server, &wvalue); +/* QualifiedName - ns=0;i=20 */ + +static UA_StatusCode function_namespace0_generated_17_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "QualifiedName"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 20), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "QualifiedName"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_services_discovery.c" ***********************************/ +static UA_StatusCode function_namespace0_generated_17_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 20) +); +} -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2014-2016 (c) Sten Grüner - * Copyright 2014, 2017 (c) Florian Palm - * Copyright 2016 (c) Oleksiy Vasylyev - * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) frax2222 - * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB - */ +/* StatusCode - ns=0;i=19 */ +static UA_StatusCode function_namespace0_generated_18_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "StatusCode"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 19), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "StatusCode"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} -#ifdef _WIN32 -# ifndef UNDER_CE -# include //access -# define access _access -# endif -#else -# include //access -#endif +static UA_StatusCode function_namespace0_generated_18_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 19) +); +} -#ifdef UA_ENABLE_DISCOVERY +/* ExpandedNodeId - ns=0;i=18 */ -static UA_StatusCode -setApplicationDescriptionFromRegisteredServer(const UA_FindServersRequest *request, - UA_ApplicationDescription *target, - const UA_RegisteredServer *registeredServer) { - UA_StatusCode retval = UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_19_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ExpandedNodeId"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 18), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "ExpandedNodeId"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - UA_ApplicationDescription_init(target); - retval |= UA_String_copy(®isteredServer->serverUri, &target->applicationUri); - retval |= UA_String_copy(®isteredServer->productUri, &target->productUri); +static UA_StatusCode function_namespace0_generated_19_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 18) +); +} - // if the client requests a specific locale, select the corresponding server name - if(request->localeIdsSize) { - UA_Boolean appNameFound = UA_FALSE; - for(size_t i =0; ilocaleIdsSize && !appNameFound; i++) { - for(size_t j =0; jserverNamesSize; j++) { - if(UA_String_equal(&request->localeIds[i], ®isteredServer->serverNames[j].locale)) { - retval |= UA_LocalizedText_copy(®isteredServer->serverNames[j], - &target->applicationName); - appNameFound = UA_TRUE; - break; - } - } - } +/* NodeId - ns=0;i=17 */ - // server does not have the requested local, therefore we can select the - // most suitable one - if(!appNameFound && registeredServer->serverNamesSize) - retval |= UA_LocalizedText_copy(®isteredServer->serverNames[0], - &target->applicationName); - } else if(registeredServer->serverNamesSize) { - // just take the first name - retval |= UA_LocalizedText_copy(®isteredServer->serverNames[0], &target->applicationName); - } +static UA_StatusCode function_namespace0_generated_20_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "NodeId"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 17), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "NodeId"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - target->applicationType = registeredServer->serverType; - retval |= UA_String_copy(®isteredServer->gatewayServerUri, &target->gatewayServerUri); - // TODO where do we get the discoveryProfileUri for application data? +static UA_StatusCode function_namespace0_generated_20_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 17) +); +} - target->discoveryUrlsSize = registeredServer->discoveryUrlsSize; - if(registeredServer->discoveryUrlsSize) { - size_t duSize = sizeof(UA_String) * registeredServer->discoveryUrlsSize; - target->discoveryUrls = (UA_String *)UA_malloc(duSize); - if(!target->discoveryUrls) - return UA_STATUSCODE_BADOUTOFMEMORY; - for(size_t i = 0; idiscoveryUrlsSize; i++) - retval |= UA_String_copy(®isteredServer->discoveryUrls[i], &target->discoveryUrls[i]); - } +/* XmlElement - ns=0;i=16 */ - return retval; +static UA_StatusCode function_namespace0_generated_21_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "XmlElement"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 16), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "XmlElement"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; } -#endif -static UA_StatusCode -setApplicationDescriptionFromServer(UA_ApplicationDescription *target, const UA_Server *server) { - /* Copy ApplicationDescription from the config */ +static UA_StatusCode function_namespace0_generated_21_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 16) +); +} - UA_StatusCode result = UA_ApplicationDescription_copy(&server->config.applicationDescription, - target); - if(result != UA_STATUSCODE_GOOD) { - return result; - } - // UaExpert does not list DiscoveryServer, thus set it to Server - // See http://forum.unified-automation.com/topic1987.html - if(target->applicationType == UA_APPLICATIONTYPE_DISCOVERYSERVER) - target->applicationType = UA_APPLICATIONTYPE_SERVER; +/* ByteString - ns=0;i=15 */ - /* add the discoveryUrls from the networklayers */ - size_t discSize = sizeof(UA_String) * (target->discoveryUrlsSize + server->config.networkLayersSize); - UA_String* disc = (UA_String *)UA_realloc(target->discoveryUrls, discSize); - if(!disc) { - return UA_STATUSCODE_BADOUTOFMEMORY; - } - size_t existing = target->discoveryUrlsSize; - target->discoveryUrls = disc; - target->discoveryUrlsSize += server->config.networkLayersSize; +static UA_StatusCode function_namespace0_generated_22_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ByteString"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 15), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "ByteString"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - // TODO: Add nl only if discoveryUrl not already present - for(size_t i = 0; i < server->config.networkLayersSize; i++) { - UA_ServerNetworkLayer* nl = &server->config.networkLayers[i]; - UA_String_copy(&nl->discoveryUrl, &target->discoveryUrls[existing + i]); - } - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_22_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 15) +); } -void Service_FindServers(UA_Server *server, UA_Session *session, - const UA_FindServersRequest *request, - UA_FindServersResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing FindServersRequest"); +/* Image - ns=0;i=30 */ - size_t foundServersSize = 0; - UA_ApplicationDescription *foundServers = NULL; +static UA_StatusCode function_namespace0_generated_23_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.isAbstract = true; +attr.displayName = UA_LOCALIZEDTEXT("", "Image"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 30), +UA_NODEID_NUMERIC(ns[0], 15), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Image"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - UA_Boolean addSelf = UA_FALSE; - // temporarily store all the pointers which we found to avoid reiterating - // through the list - UA_RegisteredServer **foundServerFilteredPointer = NULL; +static UA_StatusCode function_namespace0_generated_23_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 30) +); +} -#ifdef UA_ENABLE_DISCOVERY - // check if client only requested a specific set of servers - if(request->serverUrisSize) { - size_t fsfpSize = sizeof(UA_RegisteredServer*) * server->registeredServersSize; - foundServerFilteredPointer = (UA_RegisteredServer **)UA_malloc(fsfpSize); - if(!foundServerFilteredPointer) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; - return; - } +/* Guid - ns=0;i=14 */ - for(size_t i = 0; i < request->serverUrisSize; i++) { - if(!addSelf && UA_String_equal(&request->serverUris[i], - &server->config.applicationDescription.applicationUri)) { - addSelf = UA_TRUE; - } else { - registeredServer_list_entry* current; - LIST_FOREACH(current, &server->registeredServers, pointers) { - if(UA_String_equal(¤t->registeredServer.serverUri, &request->serverUris[i])) { - // check if entry already in list: - UA_Boolean existing = false; - for(size_t j=0; jserverUri, &request->serverUris[i])) { - existing = true; - break; - } - } - if(!existing) - foundServerFilteredPointer[foundServersSize++] = ¤t->registeredServer; - break; - } - } - } - } +static UA_StatusCode function_namespace0_generated_24_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Guid"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 14), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Guid"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - if(addSelf) - foundServersSize++; +static UA_StatusCode function_namespace0_generated_24_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 14) +); +} - } else { - addSelf = true; - // self + registered servers - foundServersSize = 1 + server->registeredServersSize; - } -#else - if(request->serverUrisSize) { - for(size_t i = 0; i < request->serverUrisSize; i++) { - if(UA_String_equal(&request->serverUris[i], - &server->config.applicationDescription.applicationUri)) { - addSelf = UA_TRUE; - foundServersSize = 1; - break; - } - } - } else { - addSelf = UA_TRUE; - foundServersSize = 1; - } -#endif +/* DateTime - ns=0;i=13 */ + +static UA_StatusCode function_namespace0_generated_25_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "DateTime"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 13), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "DateTime"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - if(foundServersSize) { - size_t fsSize = sizeof(UA_ApplicationDescription) * foundServersSize; - foundServers = (UA_ApplicationDescription *)UA_malloc(fsSize); - if(!foundServers) { - if(foundServerFilteredPointer) - UA_free(foundServerFilteredPointer); - response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; - return; - } +static UA_StatusCode function_namespace0_generated_25_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 13) +); +} - if(addSelf) { - response->responseHeader.serviceResult = - setApplicationDescriptionFromServer(&foundServers[0], server); - if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_free(foundServers); - if(foundServerFilteredPointer) - UA_free(foundServerFilteredPointer); - return; - } - } +/* UtcTime - ns=0;i=294 */ -#ifdef UA_ENABLE_DISCOVERY - size_t currentIndex = 0; - if(addSelf) - currentIndex++; - - // add all the registered servers to the list - - if(foundServerFilteredPointer) { - // use filtered list because client only requested specific uris - // -1 because foundServersSize also includes this self server - size_t iterCount = addSelf ? foundServersSize - 1 : foundServersSize; - for(size_t i = 0; i < iterCount; i++) { - response->responseHeader.serviceResult = - setApplicationDescriptionFromRegisteredServer(request, &foundServers[currentIndex++], - foundServerFilteredPointer[i]); - if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_free(foundServers); - UA_free(foundServerFilteredPointer); - return; - } - } - UA_free(foundServerFilteredPointer); - foundServerFilteredPointer = NULL; - } else { - registeredServer_list_entry* current; - LIST_FOREACH(current, &server->registeredServers, pointers) { - response->responseHeader.serviceResult = - setApplicationDescriptionFromRegisteredServer(request, &foundServers[currentIndex++], - ¤t->registeredServer); - if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_free(foundServers); - return; - } - } - } -#endif - } +static UA_StatusCode function_namespace0_generated_26_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "UtcTime"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 294), +UA_NODEID_NUMERIC(ns[0], 13), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "UtcTime"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} + +static UA_StatusCode function_namespace0_generated_26_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 294) +); +} - if(foundServerFilteredPointer) - UA_free(foundServerFilteredPointer); +/* String - ns=0;i=12 */ - response->servers = foundServers; - response->serversSize = foundServersSize; +static UA_StatusCode function_namespace0_generated_27_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "String"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 12), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "String"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; } -void Service_GetEndpoints(UA_Server *server, UA_Session *session, - const UA_GetEndpointsRequest *request, - UA_GetEndpointsResponse *response) { - /* If the client expects to see a specific endpointurl, mirror it back. If - not, clone the endpoints with the discovery url of all networklayers. */ - const UA_String *endpointUrl = &request->endpointUrl; - if(endpointUrl->length > 0) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing GetEndpointsRequest with endpointUrl " - UA_PRINTF_STRING_FORMAT, UA_PRINTF_STRING_DATA(*endpointUrl)); - } else { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing GetEndpointsRequest with an empty endpointUrl"); - } +static UA_StatusCode function_namespace0_generated_27_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 12) +); +} - /* test if the supported binary profile shall be returned */ - size_t reSize = sizeof(UA_Boolean) * server->config.endpointsSize; - UA_STACKARRAY(UA_Boolean, relevant_endpoints, reSize); - memset(relevant_endpoints, 0, reSize); - size_t relevant_count = 0; - if(request->profileUrisSize == 0) { - for(size_t j = 0; j < server->config.endpointsSize; ++j) - relevant_endpoints[j] = true; - relevant_count = server->config.endpointsSize; - } else { - for(size_t j = 0; j < server->config.endpointsSize; ++j) { - for(size_t i = 0; i < request->profileUrisSize; ++i) { - if(!UA_String_equal(&request->profileUris[i], - &server->config.endpoints[j].endpointDescription.transportProfileUri)) - continue; - relevant_endpoints[j] = true; - ++relevant_count; - break; - } - } - } +/* LocaleId - ns=0;i=295 */ - if(relevant_count == 0) { - response->endpointsSize = 0; - return; - } +static UA_StatusCode function_namespace0_generated_28_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "LocaleId"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 295), +UA_NODEID_NUMERIC(ns[0], 12), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "LocaleId"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Clone the endpoint for each networklayer? */ - size_t clone_times = 1; - UA_Boolean nl_endpointurl = false; - if(endpointUrl->length == 0) { - clone_times = server->config.networkLayersSize; - nl_endpointurl = true; - } +static UA_StatusCode function_namespace0_generated_28_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 295) +); +} - response->endpoints = - (UA_EndpointDescription*)UA_Array_new(relevant_count * clone_times, - &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); - if(!response->endpoints) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; - return; - } - response->endpointsSize = relevant_count * clone_times; +/* Boolean - ns=0;i=1 */ - size_t k = 0; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - for(size_t i = 0; i < clone_times; ++i) { - if(nl_endpointurl) - endpointUrl = &server->config.networkLayers[i].discoveryUrl; - for(size_t j = 0; j < server->config.endpointsSize; ++j) { - if(!relevant_endpoints[j]) - continue; - retval |= UA_EndpointDescription_copy(&server->config.endpoints[j].endpointDescription, - &response->endpoints[k]); - retval |= UA_String_copy(endpointUrl, &response->endpoints[k].endpointUrl); - ++k; - } - } +static UA_StatusCode function_namespace0_generated_29_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Boolean"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 1), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Boolean"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - if(retval != UA_STATUSCODE_GOOD) { - response->responseHeader.serviceResult = retval; - UA_Array_delete(response->endpoints, response->endpointsSize, - &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); - response->endpoints = NULL; - response->endpointsSize = 0; - return; - } +static UA_StatusCode function_namespace0_generated_29_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 1) +); } -#ifdef UA_ENABLE_DISCOVERY +/* Enumeration - ns=0;i=29 */ -#ifdef UA_ENABLE_MULTITHREADING -static void -freeEntry(UA_Server *server, void *entry) { - UA_free(entry); +static UA_StatusCode function_namespace0_generated_30_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.isAbstract = true; +attr.displayName = UA_LOCALIZEDTEXT("", "Enumeration"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 29), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Enumeration"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; } -#endif -static void -process_RegisterServer(UA_Server *server, UA_Session *session, - const UA_RequestHeader* requestHeader, - const UA_RegisteredServer *requestServer, - const size_t requestDiscoveryConfigurationSize, - const UA_ExtensionObject *requestDiscoveryConfiguration, - UA_ResponseHeader* responseHeader, - size_t *responseConfigurationResultsSize, - UA_StatusCode **responseConfigurationResults, - size_t *responseDiagnosticInfosSize, - UA_DiagnosticInfo *responseDiagnosticInfos) { - /* Find the server from the request in the registered list */ - registeredServer_list_entry* current; - registeredServer_list_entry *registeredServer_entry = NULL; - LIST_FOREACH(current, &server->registeredServers, pointers) { - if(UA_String_equal(¤t->registeredServer.serverUri, &requestServer->serverUri)) { - registeredServer_entry = current; - break; - } - } +static UA_StatusCode function_namespace0_generated_30_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 29) +); +} - UA_MdnsDiscoveryConfiguration *mdnsConfig = NULL; +/* RedundancySupport - ns=0;i=851 */ - const UA_String* mdnsServerName = NULL; - if(requestDiscoveryConfigurationSize) { - *responseConfigurationResults = - (UA_StatusCode *)UA_Array_new(requestDiscoveryConfigurationSize, - &UA_TYPES[UA_TYPES_STATUSCODE]); - if(!(*responseConfigurationResults)) { - responseHeader->serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; - return; - } - *responseConfigurationResultsSize = requestDiscoveryConfigurationSize; +static UA_StatusCode function_namespace0_generated_31_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "RedundancySupport"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 851), +UA_NODEID_NUMERIC(ns[0], 29), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "RedundancySupport"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - for(size_t i = 0; i < requestDiscoveryConfigurationSize; i++) { - const UA_ExtensionObject *object = &requestDiscoveryConfiguration[i]; - if(!mdnsConfig && (object->encoding == UA_EXTENSIONOBJECT_DECODED || - object->encoding == UA_EXTENSIONOBJECT_DECODED_NODELETE) && - (object->content.decoded.type == &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION])) { - mdnsConfig = (UA_MdnsDiscoveryConfiguration *)object->content.decoded.data; - mdnsServerName = &mdnsConfig->mdnsServerName; - (*responseConfigurationResults)[i] = UA_STATUSCODE_GOOD; - } else { - (*responseConfigurationResults)[i] = UA_STATUSCODE_BADNOTSUPPORTED; - } - } - } +static UA_StatusCode function_namespace0_generated_31_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 851) +); +} - if(!mdnsServerName && requestServer->serverNamesSize) - mdnsServerName = &requestServer->serverNames[0].text; +/* EnumStrings - ns=0;i=7611 */ - if(!mdnsServerName) { - responseHeader->serviceResult = UA_STATUSCODE_BADSERVERNAMEMISSING; - return; - } +static UA_StatusCode function_namespace0_generated_32_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +attr.valueRank = 1; +attr.arrayDimensionsSize = 1; +UA_UInt32 arrayDimensions[1]; +arrayDimensions[0] = 0; +attr.arrayDimensions = &arrayDimensions[0]; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 21); +UA_LocalizedText variablenode_ns_0_i_7611_variant_DataContents[6]; +variablenode_ns_0_i_7611_variant_DataContents[0] = UA_LOCALIZEDTEXT("", "None"); +variablenode_ns_0_i_7611_variant_DataContents[1] = UA_LOCALIZEDTEXT("", "Cold"); +variablenode_ns_0_i_7611_variant_DataContents[2] = UA_LOCALIZEDTEXT("", "Warm"); +variablenode_ns_0_i_7611_variant_DataContents[3] = UA_LOCALIZEDTEXT("", "Hot"); +variablenode_ns_0_i_7611_variant_DataContents[4] = UA_LOCALIZEDTEXT("", "Transparent"); +variablenode_ns_0_i_7611_variant_DataContents[5] = UA_LOCALIZEDTEXT("", "HotAndMirrored"); +UA_Variant_setArray(&attr.value, &variablenode_ns_0_i_7611_variant_DataContents, (UA_Int32) 6, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); +attr.displayName = UA_LOCALIZEDTEXT("", "EnumStrings"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 7611), +UA_NODEID_NUMERIC(ns[0], 851), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "EnumStrings"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - if(requestServer->discoveryUrlsSize == 0) { - responseHeader->serviceResult = UA_STATUSCODE_BADDISCOVERYURLMISSING; - return; - } +static UA_StatusCode function_namespace0_generated_32_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 7611) +); +} - if(requestServer->semaphoreFilePath.length) { -#ifdef UA_ENABLE_DISCOVERY_SEMAPHORE - char* filePath = (char*) - UA_malloc(sizeof(char)*requestServer->semaphoreFilePath.length+1); - if(!filePath) { - UA_LOG_ERROR_SESSION(server->config.logger, session, - "Cannot allocate memory for semaphore path. Out of memory."); - responseHeader->serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; - return; - } - memcpy(filePath, requestServer->semaphoreFilePath.data, requestServer->semaphoreFilePath.length ); - filePath[requestServer->semaphoreFilePath.length] = '\0'; - if(access( filePath, 0 ) == -1) { - responseHeader->serviceResult = UA_STATUSCODE_BADSEMPAHOREFILEMISSING; - UA_free(filePath); - return; - } - UA_free(filePath); -#else - UA_LOG_WARNING(server->config.logger, UA_LOGCATEGORY_CLIENT, - "Ignoring semaphore file path. open62541 not compiled " - "with UA_ENABLE_DISCOVERY_SEMAPHORE=ON"); -#endif - } +/* ServerState - ns=0;i=852 */ -#ifdef UA_ENABLE_DISCOVERY_MULTICAST - if(server->config.applicationDescription.applicationType == UA_APPLICATIONTYPE_DISCOVERYSERVER) { - for(size_t i = 0; i < requestServer->discoveryUrlsSize; i++) { - /* create TXT if is online and first index, delete TXT if is offline and last index */ - UA_Boolean updateTxt = (requestServer->isOnline && i==0) || - (!requestServer->isOnline && i==requestServer->discoveryUrlsSize); - UA_Discovery_update_MdnsForDiscoveryUrl(server, mdnsServerName, mdnsConfig, - &requestServer->discoveryUrls[i], - requestServer->isOnline, updateTxt); - } - } -#endif +static UA_StatusCode function_namespace0_generated_33_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ServerState"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 852), +UA_NODEID_NUMERIC(ns[0], 29), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "ServerState"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - if(!requestServer->isOnline) { - // server is shutting down. Remove it from the registered servers list - if(!registeredServer_entry) { - // server not found, show warning - UA_LOG_WARNING_SESSION(server->config.logger, session, - "Could not unregister server %.*s. Not registered.", - (int)requestServer->serverUri.length, requestServer->serverUri.data); - responseHeader->serviceResult = UA_STATUSCODE_BADNOTHINGTODO; - return; - } +static UA_StatusCode function_namespace0_generated_33_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 852) +); +} - if(server->registerServerCallback) - server->registerServerCallback(requestServer, server->registerServerCallbackData); +/* NamingRuleType - ns=0;i=120 */ - // server found, remove from list - LIST_REMOVE(registeredServer_entry, pointers); - UA_RegisteredServer_deleteMembers(®isteredServer_entry->registeredServer); -#ifndef UA_ENABLE_MULTITHREADING - UA_free(registeredServer_entry); - server->registeredServersSize--; -#else - UA_atomic_subSize(&server->registeredServersSize, 1); - UA_Server_delayedCallback(server, freeEntry, registeredServer_entry); -#endif - responseHeader->serviceResult = UA_STATUSCODE_GOOD; - return; - } +static UA_StatusCode function_namespace0_generated_34_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "NamingRuleType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 120), +UA_NODEID_NUMERIC(ns[0], 29), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "NamingRuleType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(!registeredServer_entry) { - // server not yet registered, register it by adding it to the list - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Registering new server: %.*s", - (int)requestServer->serverUri.length, requestServer->serverUri.data); +static UA_StatusCode function_namespace0_generated_34_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 120) +); +} - registeredServer_entry = - (registeredServer_list_entry *)UA_malloc(sizeof(registeredServer_list_entry)); - if(!registeredServer_entry) { - responseHeader->serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; - return; - } +/* EnumValues - ns=0;i=12169 */ - LIST_INSERT_HEAD(&server->registeredServers, registeredServer_entry, pointers); -#ifndef UA_ENABLE_MULTITHREADING - server->registeredServersSize++; -#else - UA_atomic_addSize(&server->registeredServersSize, 1); -#endif +static UA_StatusCode function_namespace0_generated_35_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +attr.valueRank = 1; +attr.arrayDimensionsSize = 1; +UA_UInt32 arrayDimensions[1]; +arrayDimensions[0] = 0; +attr.arrayDimensions = &arrayDimensions[0]; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7594); +UA_EnumValueType variablenode_ns_0_i_12169_variant_DataContents[3]; + +UA_init(&variablenode_ns_0_i_12169_variant_DataContents[0], &UA_TYPES[UA_TYPES_ENUMVALUETYPE]); +variablenode_ns_0_i_12169_variant_DataContents[0].value = (UA_Int64) 1; +variablenode_ns_0_i_12169_variant_DataContents[0].displayName = UA_LOCALIZEDTEXT("", "Mandatory"); +variablenode_ns_0_i_12169_variant_DataContents[0].description = UA_LOCALIZEDTEXT("", "The BrowseName must appear in all instances of the type."); + +UA_init(&variablenode_ns_0_i_12169_variant_DataContents[1], &UA_TYPES[UA_TYPES_ENUMVALUETYPE]); +variablenode_ns_0_i_12169_variant_DataContents[1].value = (UA_Int64) 2; +variablenode_ns_0_i_12169_variant_DataContents[1].displayName = UA_LOCALIZEDTEXT("", "Optional"); +variablenode_ns_0_i_12169_variant_DataContents[1].description = UA_LOCALIZEDTEXT("", "The BrowseName may appear in an instance of the type."); + +UA_init(&variablenode_ns_0_i_12169_variant_DataContents[2], &UA_TYPES[UA_TYPES_ENUMVALUETYPE]); +variablenode_ns_0_i_12169_variant_DataContents[2].value = (UA_Int64) 3; +variablenode_ns_0_i_12169_variant_DataContents[2].displayName = UA_LOCALIZEDTEXT("", "Constraint"); +variablenode_ns_0_i_12169_variant_DataContents[2].description = UA_LOCALIZEDTEXT("", "The modelling rule defines a constraint and the BrowseName is not used in an instance of the type."); +UA_Variant_setArray(&attr.value, &variablenode_ns_0_i_12169_variant_DataContents, (UA_Int32) 3, &UA_TYPES[UA_TYPES_ENUMVALUETYPE]); +attr.displayName = UA_LOCALIZEDTEXT("", "EnumValues"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 12169), +UA_NODEID_NUMERIC(ns[0], 120), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "EnumValues"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); - if(server->registerServerCallback) - server->registerServerCallback(requestServer, server->registerServerCallbackData); - } else { - UA_RegisteredServer_deleteMembers(®isteredServer_entry->registeredServer); - } - // copy the data from the request into the list - UA_RegisteredServer_copy(requestServer, ®isteredServer_entry->registeredServer); - registeredServer_entry->lastSeen = UA_DateTime_nowMonotonic(); - responseHeader->serviceResult = retval; + +return retVal; } -void Service_RegisterServer(UA_Server *server, UA_Session *session, - const UA_RegisterServerRequest *request, - UA_RegisterServerResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing RegisterServerRequest"); - process_RegisterServer(server, session, &request->requestHeader, &request->server, 0, - NULL, &response->responseHeader, 0, NULL, 0, NULL); +static UA_StatusCode function_namespace0_generated_35_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 12169) +); } -void Service_RegisterServer2(UA_Server *server, UA_Session *session, - const UA_RegisterServer2Request *request, - UA_RegisterServer2Response *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing RegisterServer2Request"); - process_RegisterServer(server, session, &request->requestHeader, &request->server, - request->discoveryConfigurationSize, request->discoveryConfiguration, - &response->responseHeader, &response->configurationResultsSize, - &response->configurationResults, &response->diagnosticInfosSize, - response->diagnosticInfos); +/* Number - ns=0;i=26 */ + +static UA_StatusCode function_namespace0_generated_36_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.isAbstract = true; +attr.displayName = UA_LOCALIZEDTEXT("", "Number"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 26), +UA_NODEID_NUMERIC(ns[0], 24), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Number"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; } -/* Cleanup server registration: If the semaphore file path is set, then it just - * checks the existence of the file. When it is deleted, the registration is - * removed. If there is no semaphore file, then the registration will be removed - * if it is older than 60 minutes. */ -void UA_Discovery_cleanupTimedOut(UA_Server *server, UA_DateTime nowMonotonic) { - UA_DateTime timedOut = nowMonotonic; - // registration is timed out if lastSeen is older than 60 minutes (default - // value, can be modified by user). - if(server->config.discoveryCleanupTimeout) - timedOut -= server->config.discoveryCleanupTimeout*UA_DATETIME_SEC; +static UA_StatusCode function_namespace0_generated_36_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 26) +); +} - registeredServer_list_entry* current, *temp; - LIST_FOREACH_SAFE(current, &server->registeredServers, pointers, temp) { - UA_Boolean semaphoreDeleted = UA_FALSE; +/* Float - ns=0;i=10 */ -#ifdef UA_ENABLE_DISCOVERY_SEMAPHORE - if(current->registeredServer.semaphoreFilePath.length) { - size_t fpSize = sizeof(char)*current->registeredServer.semaphoreFilePath.length+1; - // todo: malloc may fail: return a statuscode - char* filePath = (char *)UA_malloc(fpSize); - if(filePath) { - memcpy(filePath, current->registeredServer.semaphoreFilePath.data, - current->registeredServer.semaphoreFilePath.length ); - filePath[current->registeredServer.semaphoreFilePath.length] = '\0'; -#ifdef UNDER_CE - FILE *fp = fopen(filePath,"rb"); - semaphoreDeleted = (fp==NULL); - if(fp) - fclose(fp); -#else - semaphoreDeleted = access( filePath, 0 ) == -1; -#endif - UA_free(filePath); - } else { - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, "Cannot check registration semaphore. Out of memory"); - } - } -#endif +static UA_StatusCode function_namespace0_generated_37_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Float"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 10), +UA_NODEID_NUMERIC(ns[0], 26), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Float"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - if(semaphoreDeleted || (server->config.discoveryCleanupTimeout && - current->lastSeen < timedOut)) { - if(semaphoreDeleted) { - UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_SERVER, - "Registration of server with URI %.*s is removed because " - "the semaphore file '%.*s' was deleted.", - (int)current->registeredServer.serverUri.length, - current->registeredServer.serverUri.data, - (int)current->registeredServer.semaphoreFilePath.length, - current->registeredServer.semaphoreFilePath.data); - } else { - // cppcheck-suppress unreadVariable - UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_SERVER, - "Registration of server with URI %.*s has timed out and is removed.", - (int)current->registeredServer.serverUri.length, - current->registeredServer.serverUri.data); - } - LIST_REMOVE(current, pointers); - UA_RegisteredServer_deleteMembers(¤t->registeredServer); -#ifndef UA_ENABLE_MULTITHREADING - UA_free(current); - server->registeredServersSize--; -#else - UA_atomic_subSize(&server->registeredServersSize, 1); - UA_Server_delayedCallback(server, freeEntry, current); -#endif - } - } +static UA_StatusCode function_namespace0_generated_37_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 10) +); } -struct PeriodicServerRegisterCallback { - UA_UInt64 id; - UA_UInt32 this_interval; - UA_UInt32 default_interval; - UA_Boolean registered; - const char* discovery_server_url; -}; +/* UInteger - ns=0;i=28 */ -/* Called by the UA_Server callback. The OPC UA specification says: - * - * > If an error occurs during registration (e.g. the Discovery Server is not running) then the Server - * > must periodically re-attempt registration. The frequency of these attempts should start at 1 second - * > but gradually increase until the registration frequency is the same as what it would be if not - * > errors occurred. The recommended approach would double the period each attempt until reaching the maximum. - * - * We will do so by using the additional data parameter which holds information - * if the next interval is default or if it is a repeaded call. */ -static void -periodicServerRegister(UA_Server *server, void *data) { - UA_assert(data != NULL); +static UA_StatusCode function_namespace0_generated_38_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.isAbstract = true; +attr.displayName = UA_LOCALIZEDTEXT("", "UInteger"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 28), +UA_NODEID_NUMERIC(ns[0], 26), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "UInteger"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - struct PeriodicServerRegisterCallback *cb = (struct PeriodicServerRegisterCallback *)data; +static UA_StatusCode function_namespace0_generated_38_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 28) +); +} - /* Which URL to register on */ - // fixme: remove magic url - const char * server_url; - if(cb->discovery_server_url != NULL) - server_url = cb->discovery_server_url; - else - server_url = "opc.tcp://localhost:4840"; +/* UInt16 - ns=0;i=5 */ - /* Register - You can also use a semaphore file. That file must exist. When the file is - deleted, the server is automatically unregistered. The semaphore file has - to be accessible by the discovery server - - UA_StatusCode retval = UA_Server_register_discovery(server, - "opc.tcp://localhost:4840", "/path/to/some/file"); - */ - UA_StatusCode retval = UA_Server_register_discovery(server, server_url, NULL); +static UA_StatusCode function_namespace0_generated_39_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "UInt16"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 5), +UA_NODEID_NUMERIC(ns[0], 28), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "UInt16"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Registering failed */ - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, - "Could not register server with discovery server. " - "Is the discovery server started? StatusCode %s", - UA_StatusCode_name(retval)); +static UA_StatusCode function_namespace0_generated_39_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 5) +); +} - /* If the server was previously registered, retry in one second, - * else, double the previous interval */ - UA_UInt32 nextInterval = 1000; - if(!cb->registered) - nextInterval = cb->this_interval * 2; +/* UInt64 - ns=0;i=9 */ - /* The interval should be smaller than the default interval */ - if(nextInterval > cb->default_interval) - nextInterval = cb->default_interval; +static UA_StatusCode function_namespace0_generated_40_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "UInt64"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 9), +UA_NODEID_NUMERIC(ns[0], 28), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "UInt64"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - cb->this_interval = nextInterval; - UA_Server_changeRepeatedCallbackInterval(server, cb->id, nextInterval); - return; - } +static UA_StatusCode function_namespace0_generated_40_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 9) +); +} - /* Registering succeeded */ - UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER, - "Server successfully registered. Next periodical register will be in %d seconds", - (int)(cb->default_interval/1000)); +/* Byte - ns=0;i=3 */ - if(!cb->registered) { - retval = UA_Server_changeRepeatedCallbackInterval(server, cb->id, cb->default_interval); - /* If changing the interval fails, try again after the next registering */ - if(retval == UA_STATUSCODE_GOOD) - cb->registered = true; - } +static UA_StatusCode function_namespace0_generated_41_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Byte"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 3), +UA_NODEID_NUMERIC(ns[0], 28), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Byte"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; } -UA_StatusCode -UA_Server_addPeriodicServerRegisterCallback(UA_Server *server, - const char* discoveryServerUrl, - UA_UInt32 intervalMs, - UA_UInt32 delayFirstRegisterMs, - UA_UInt64 *periodicCallbackId) { +static UA_StatusCode function_namespace0_generated_41_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 3) +); +} - /* No valid server URL */ - if(!discoveryServerUrl) { - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, - "No discovery server URL provided"); - return UA_STATUSCODE_BADINTERNALERROR; - } +/* UInt32 - ns=0;i=7 */ +static UA_StatusCode function_namespace0_generated_42_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "UInt32"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 7), +UA_NODEID_NUMERIC(ns[0], 28), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "UInt32"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - /* check if we are already registering with the given discovery url and remove the old periodic call */ - { - periodicServerRegisterCallback_entry *rs, *rs_tmp; - LIST_FOREACH_SAFE(rs, &server->periodicServerRegisterCallbacks, pointers, rs_tmp) { - if(strcmp(rs->callback->discovery_server_url, discoveryServerUrl) == 0) { - UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_SERVER, - "There is already a register callback for '%s' in place. Removing the older one.", discoveryServerUrl); - UA_Server_removeRepeatedCallback(server, rs->callback->id); - LIST_REMOVE(rs, pointers); - UA_free(rs->callback); - UA_free(rs); - break; - } - } - } +static UA_StatusCode function_namespace0_generated_42_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 7) +); +} - /* Allocate and initialize */ - struct PeriodicServerRegisterCallback* cb = - (struct PeriodicServerRegisterCallback*) - UA_malloc(sizeof(struct PeriodicServerRegisterCallback)); - if(!cb) - return UA_STATUSCODE_BADOUTOFMEMORY; +/* Integer - ns=0;i=27 */ - /* Start repeating a failed register after 1s, then increase the delay. Set - * to 500ms, as the delay is doubled before changing the callback - * interval.*/ - cb->this_interval = 500; - cb->default_interval = intervalMs; - cb->registered = false; - cb->discovery_server_url = discoveryServerUrl; +static UA_StatusCode function_namespace0_generated_43_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.isAbstract = true; +attr.displayName = UA_LOCALIZEDTEXT("", "Integer"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 27), +UA_NODEID_NUMERIC(ns[0], 26), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Integer"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} +static UA_StatusCode function_namespace0_generated_43_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 27) +); +} +/* Int16 - ns=0;i=4 */ - /* Add the callback */ - UA_StatusCode retval = - UA_Server_addRepeatedCallback(server, periodicServerRegister, - cb, delayFirstRegisterMs, &cb->id); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, - "Could not create periodic job for server register. " - "StatusCode %s", UA_StatusCode_name(retval)); - UA_free(cb); - return retval; - } +static UA_StatusCode function_namespace0_generated_44_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Int16"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 4), +UA_NODEID_NUMERIC(ns[0], 27), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Int16"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} -#ifndef __clang_analyzer__ - // the analyzer reports on LIST_INSERT_HEAD a use after free false positive - periodicServerRegisterCallback_entry *newEntry = - (periodicServerRegisterCallback_entry *)UA_malloc(sizeof(periodicServerRegisterCallback_entry)); - if(!newEntry) { - UA_Server_removeRepeatedCallback(server, cb->id); - UA_free(cb); - return UA_STATUSCODE_BADOUTOFMEMORY; - } - newEntry->callback = cb; - LIST_INSERT_HEAD(&server->periodicServerRegisterCallbacks, newEntry, pointers); -#endif +static UA_StatusCode function_namespace0_generated_44_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 4) +); +} - if(periodicCallbackId) - *periodicCallbackId = cb->id; - return UA_STATUSCODE_GOOD; +/* Int32 - ns=0;i=6 */ + +static UA_StatusCode function_namespace0_generated_45_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Int32"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 6), +UA_NODEID_NUMERIC(ns[0], 27), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Int32"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; } -void -UA_Server_setRegisterServerCallback(UA_Server *server, - UA_Server_registerServerCallback cb, - void* data) { - server->registerServerCallback = cb; - server->registerServerCallbackData = data; +static UA_StatusCode function_namespace0_generated_45_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 6) +); } -#endif /* UA_ENABLE_DISCOVERY */ +/* Int64 - ns=0;i=8 */ -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_services_subscription.c" ***********************************/ +static UA_StatusCode function_namespace0_generated_46_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Int64"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 8), +UA_NODEID_NUMERIC(ns[0], 27), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Int64"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2016-2017 (c) Florian Palm - * Copyright 2015 (c) Chris Iatrou - * Copyright 2015-2016 (c) Sten Grüner - * Copyright 2015-2016 (c) Oleksiy Vasylyev - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) Mattias Bornhager - * Copyright 2017 (c) Henrik Norrman - * Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA - */ +static UA_StatusCode function_namespace0_generated_46_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 8) +); +} +/* SByte - ns=0;i=2 */ -#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */ +static UA_StatusCode function_namespace0_generated_47_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "SByte"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 2), +UA_NODEID_NUMERIC(ns[0], 27), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "SByte"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} -#define UA_BOUNDEDVALUE_SETWBOUNDS(BOUNDS, SRC, DST) { \ - if(SRC > BOUNDS.max) DST = BOUNDS.max; \ - else if(SRC < BOUNDS.min) DST = BOUNDS.min; \ - else DST = SRC; \ - } +static UA_StatusCode function_namespace0_generated_47_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2) +); +} -static UA_StatusCode -setSubscriptionSettings(UA_Server *server, UA_Subscription *subscription, - UA_Double requestedPublishingInterval, - UA_UInt32 requestedLifetimeCount, - UA_UInt32 requestedMaxKeepAliveCount, - UA_UInt32 maxNotificationsPerPublish, UA_Byte priority) { - /* deregister the callback if required */ - UA_StatusCode retval = Subscription_unregisterPublishCallback(server, subscription); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_DEBUG_SESSION(server->config.logger, subscription->session, - "Subscription %u | Could not unregister publish callback with error code %s", - subscription->subscriptionId, UA_StatusCode_name(retval)); - return retval; - } +/* Decimal - ns=0;i=50 */ - /* re-parameterize the subscription */ - subscription->publishingInterval = requestedPublishingInterval; - UA_BOUNDEDVALUE_SETWBOUNDS(server->config.publishingIntervalLimits, - requestedPublishingInterval, subscription->publishingInterval); - /* check for nan*/ - if(requestedPublishingInterval != requestedPublishingInterval) - subscription->publishingInterval = server->config.publishingIntervalLimits.min; - UA_BOUNDEDVALUE_SETWBOUNDS(server->config.keepAliveCountLimits, - requestedMaxKeepAliveCount, subscription->maxKeepAliveCount); - UA_BOUNDEDVALUE_SETWBOUNDS(server->config.lifeTimeCountLimits, - requestedLifetimeCount, subscription->lifeTimeCount); - if(subscription->lifeTimeCount < 3 * subscription->maxKeepAliveCount) - subscription->lifeTimeCount = 3 * subscription->maxKeepAliveCount; - subscription->notificationsPerPublish = maxNotificationsPerPublish; - if(maxNotificationsPerPublish == 0 || - maxNotificationsPerPublish > server->config.maxNotificationsPerPublish) - subscription->notificationsPerPublish = server->config.maxNotificationsPerPublish; - subscription->priority = priority; +static UA_StatusCode function_namespace0_generated_48_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Decimal"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 50), +UA_NODEID_NUMERIC(ns[0], 26), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Decimal"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - retval = Subscription_registerPublishCallback(server, subscription); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_DEBUG_SESSION(server->config.logger, subscription->session, - "Subscription %u | Could not register publish callback with error code %s", - subscription->subscriptionId, UA_StatusCode_name(retval)); - return retval; - } - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_48_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 50) +); } -void -Service_CreateSubscription(UA_Server *server, UA_Session *session, - const UA_CreateSubscriptionRequest *request, - UA_CreateSubscriptionResponse *response) { - /* Check limits for the number of subscriptions */ - if((server->config.maxSubscriptionsPerSession != 0) && - (session->numSubscriptions >= server->config.maxSubscriptionsPerSession)) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYSUBSCRIPTIONS; - return; - } +/* Double - ns=0;i=11 */ - /* Create the subscription */ - UA_Subscription *newSubscription = UA_Subscription_new(session, response->subscriptionId); - if(!newSubscription) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing CreateSubscriptionRequest failed"); - response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; - return; - } +static UA_StatusCode function_namespace0_generated_49_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Double"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 11), +UA_NODEID_NUMERIC(ns[0], 26), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Double"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - UA_Session_addSubscription(session, newSubscription); /* Also assigns the subscription id */ +static UA_StatusCode function_namespace0_generated_49_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11) +); +} - /* Set the subscription parameters */ - newSubscription->publishingEnabled = request->publishingEnabled; - UA_StatusCode retval = setSubscriptionSettings(server, newSubscription, request->requestedPublishingInterval, - request->requestedLifetimeCount, request->requestedMaxKeepAliveCount, - request->maxNotificationsPerPublish, request->priority); +/* Duration - ns=0;i=290 */ - if(retval != UA_STATUSCODE_GOOD) { - response->responseHeader.serviceResult = retval; - return; - } +static UA_StatusCode function_namespace0_generated_50_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_DataTypeAttributes attr = UA_DataTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Duration"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_DATATYPE, +UA_NODEID_NUMERIC(ns[0], 290), +UA_NODEID_NUMERIC(ns[0], 11), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "Duration"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],NULL, NULL); +return retVal; +} - newSubscription->currentKeepAliveCount = newSubscription->maxKeepAliveCount; /* set settings first */ +static UA_StatusCode function_namespace0_generated_50_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 290) +); +} - /* Prepare the response */ - response->subscriptionId = newSubscription->subscriptionId; - response->revisedPublishingInterval = newSubscription->publishingInterval; - response->revisedLifetimeCount = newSubscription->lifeTimeCount; - response->revisedMaxKeepAliveCount = newSubscription->maxKeepAliveCount; +/* InterfaceTypes - ns=0;i=17708 */ - UA_LOG_INFO_SESSION(server->config.logger, session, "Subscription %u | " - "Created the Subscription with a publishing interval of %f ms", - response->subscriptionId, newSubscription->publishingInterval); +static UA_StatusCode function_namespace0_generated_51_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "InterfaceTypes"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 17708), +UA_NODEID_NUMERIC(ns[0], 86), +UA_NODEID_NUMERIC(ns[0], 35), +UA_QUALIFIEDNAME(ns[0], "InterfaceTypes"), +UA_NODEID_NUMERIC(ns[0], 61), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; } -void -Service_ModifySubscription(UA_Server *server, UA_Session *session, - const UA_ModifySubscriptionRequest *request, - UA_ModifySubscriptionResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Processing ModifySubscriptionRequest"); - - UA_Subscription *sub = UA_Session_getSubscriptionById(session, request->subscriptionId); - if(!sub) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; - return; - } +static UA_StatusCode function_namespace0_generated_51_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 17708) +); +} - UA_StatusCode retval = setSubscriptionSettings(server, sub, request->requestedPublishingInterval, - request->requestedLifetimeCount, request->requestedMaxKeepAliveCount, - request->maxNotificationsPerPublish, request->priority); +/* BaseInterfaceType - ns=0;i=17602 */ - if(retval != UA_STATUSCODE_GOOD) { - response->responseHeader.serviceResult = retval; - return; - } +static UA_StatusCode function_namespace0_generated_52_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; +attr.isAbstract = true; +attr.displayName = UA_LOCALIZEDTEXT("", "BaseInterfaceType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, +UA_NODEID_NUMERIC(ns[0], 17602), +UA_NODEID_NUMERIC(ns[0], 58), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "BaseInterfaceType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 17602), UA_NODEID_NUMERIC(ns[0], 35), UA_EXPANDEDNODEID_NUMERIC(ns[0], 17708), false); +return retVal; +} - sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */ - response->revisedPublishingInterval = sub->publishingInterval; - response->revisedLifetimeCount = sub->lifeTimeCount; - response->revisedMaxKeepAliveCount = sub->maxKeepAliveCount; +static UA_StatusCode function_namespace0_generated_52_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 17602) +); } -static void -Operation_SetPublishingMode(UA_Server *Server, UA_Session *session, - UA_Boolean *publishingEnabled, UA_UInt32 *subscriptionId, - UA_StatusCode *result) { - UA_Subscription *sub = UA_Session_getSubscriptionById(session, *subscriptionId); - if(!sub) { - *result = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; - return; - } +/* ServerDiagnosticsSummaryType - ns=0;i=2150 */ - sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */ - sub->publishingEnabled = *publishingEnabled; /* Set the publishing mode */ +static UA_StatusCode function_namespace0_generated_53_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 859); +attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummaryType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE, +UA_NODEID_NUMERIC(ns[0], 2150), +UA_NODEID_NUMERIC(ns[0], 63), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "ServerDiagnosticsSummaryType"), +UA_NODEID_NUMERIC(ns[0], 0), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); +return retVal; } -void -Service_SetPublishingMode(UA_Server *server, UA_Session *session, - const UA_SetPublishingModeRequest *request, - UA_SetPublishingModeResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Processing SetPublishingModeRequest"); - UA_Boolean publishingEnabled = request->publishingEnabled; /* request is const */ - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_SetPublishingMode, - &publishingEnabled, - &request->subscriptionIdsSize, &UA_TYPES[UA_TYPES_UINT32], - &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +static UA_StatusCode function_namespace0_generated_53_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2150) +); } -static UA_StatusCode -setMonitoredItemSettings(UA_Server *server, UA_MonitoredItem *mon, - UA_MonitoringMode monitoringMode, - const UA_MonitoringParameters *params, - // This parameter is optional and used only if mon->lastValue is not set yet. - // Then numeric type will be detected from this value. Set null as defaut. - const UA_DataType* dataType) { +/* CumulatedSessionCount - ns=0;i=2153 */ - /* Filter */ - if(params->filter.encoding != UA_EXTENSIONOBJECT_DECODED) { - UA_DataChangeFilter_init(&(mon->filter)); - mon->filter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE; - } else if(params->filter.content.decoded.type != &UA_TYPES[UA_TYPES_DATACHANGEFILTER]) { - return UA_STATUSCODE_BADMONITOREDITEMFILTERINVALID; - } else { - UA_DataChangeFilter *filter = (UA_DataChangeFilter *)params->filter.content.decoded.data; - // TODO implement EURange to support UA_DEADBANDTYPE_PERCENT - if (filter->deadbandType == UA_DEADBANDTYPE_PERCENT) { - return UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED; - } - if (UA_Variant_isEmpty(&mon->lastValue)) { - if (!dataType || !isDataTypeNumeric(dataType)) - return UA_STATUSCODE_BADFILTERNOTALLOWED; - } else - if (!isDataTypeNumeric(mon->lastValue.type)) { - return UA_STATUSCODE_BADFILTERNOTALLOWED; - } - UA_DataChangeFilter_copy(filter, &(mon->filter)); - } +static UA_StatusCode function_namespace0_generated_54_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSessionCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2153), +UA_NODEID_NUMERIC(ns[0], 2150), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "CumulatedSessionCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - MonitoredItem_unregisterSampleCallback(server, mon); - mon->monitoringMode = monitoringMode; +static UA_StatusCode function_namespace0_generated_54_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2153) +); +} - /* ClientHandle */ - mon->clientHandle = params->clientHandle; +/* CurrentSessionCount - ns=0;i=2152 */ - /* SamplingInterval */ - UA_Double samplingInterval = params->samplingInterval; - if(mon->attributeId == UA_ATTRIBUTEID_VALUE) { - const UA_VariableNode *vn = (const UA_VariableNode *) - UA_Nodestore_get(server, &mon->monitoredNodeId); - if(vn) { - if(vn->nodeClass == UA_NODECLASS_VARIABLE && - samplingInterval < vn->minimumSamplingInterval) - samplingInterval = vn->minimumSamplingInterval; - UA_Nodestore_release(server, (const UA_Node *)vn); - } - } else if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) { - /* TODO: events should not need a samplinginterval */ - samplingInterval = 10000.0f; // 10 seconds to reduce the load - } - mon->samplingInterval = samplingInterval; - UA_BOUNDEDVALUE_SETWBOUNDS(server->config.samplingIntervalLimits, - samplingInterval, mon->samplingInterval); - if(samplingInterval != samplingInterval) /* Check for nan */ - mon->samplingInterval = server->config.samplingIntervalLimits.min; +static UA_StatusCode function_namespace0_generated_55_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSessionCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2152), +UA_NODEID_NUMERIC(ns[0], 2150), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "CurrentSessionCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} +static UA_StatusCode function_namespace0_generated_55_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2152) +); +} - /* QueueSize */ - UA_BOUNDEDVALUE_SETWBOUNDS(server->config.queueSizeLimits, - params->queueSize, mon->maxQueueSize); +/* SessionAbortCount - ns=0;i=2157 */ - /* DiscardOldest */ - mon->discardOldest = params->discardOldest; +static UA_StatusCode function_namespace0_generated_56_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "SessionAbortCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2157), +UA_NODEID_NUMERIC(ns[0], 2150), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "SessionAbortCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Register sample callback if reporting is enabled */ - if(monitoringMode == UA_MONITORINGMODE_REPORTING) - return MonitoredItem_registerSampleCallback(server, mon); +static UA_StatusCode function_namespace0_generated_56_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2157) +); +} - return UA_STATUSCODE_GOOD; +/* PublishingIntervalCount - ns=0;i=2159 */ + +static UA_StatusCode function_namespace0_generated_57_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "PublishingIntervalCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2159), +UA_NODEID_NUMERIC(ns[0], 2150), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "PublishingIntervalCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -static const UA_String binaryEncoding = {sizeof("Default Binary") - 1, (UA_Byte *)"Default Binary"}; +static UA_StatusCode function_namespace0_generated_57_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2159) +); +} -/* Thread-local variables to pass additional arguments into the operation */ -struct createMonContext { - UA_Subscription *sub; - UA_TimestampsToReturn timestampsToReturn; -}; +/* RejectedSessionCount - ns=0;i=2155 */ -static void -Operation_CreateMonitoredItem(UA_Server *server, UA_Session *session, struct createMonContext *cmc, - const UA_MonitoredItemCreateRequest *request, - UA_MonitoredItemCreateResult *result) { - /* Check available capacity */ - if(server->config.maxMonitoredItemsPerSubscription != 0 && - cmc->sub->monitoredItemsSize >= server->config.maxMonitoredItemsPerSubscription) { - result->statusCode = UA_STATUSCODE_BADTOOMANYMONITOREDITEMS; - return; - } +static UA_StatusCode function_namespace0_generated_58_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "RejectedSessionCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2155), +UA_NODEID_NUMERIC(ns[0], 2150), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "RejectedSessionCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Make an example read to get errors in the itemToMonitor. Allow return - * codes "good" and "uncertain", as well as a list of statuscodes that might - * be repaired inside the data source. */ - UA_DataValue v = UA_Server_readWithSession(server, session, &request->itemToMonitor, - cmc->timestampsToReturn); - if(v.hasStatus && (v.status >> 30) > 1 && - v.status != UA_STATUSCODE_BADRESOURCEUNAVAILABLE && - v.status != UA_STATUSCODE_BADCOMMUNICATIONERROR && - v.status != UA_STATUSCODE_BADWAITINGFORINITIALDATA && - v.status != UA_STATUSCODE_BADUSERACCESSDENIED && - v.status != UA_STATUSCODE_BADNOTREADABLE && - v.status != UA_STATUSCODE_BADINDEXRANGENODATA) { - result->statusCode = v.status; - UA_DataValue_deleteMembers(&v); - return; - } +static UA_StatusCode function_namespace0_generated_58_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2155) +); +} - /* Check if the encoding is supported */ - if(request->itemToMonitor.dataEncoding.name.length > 0 && - (!UA_String_equal(&binaryEncoding, &request->itemToMonitor.dataEncoding.name) || - request->itemToMonitor.dataEncoding.namespaceIndex != 0)) { - result->statusCode = UA_STATUSCODE_BADDATAENCODINGUNSUPPORTED; - UA_DataValue_deleteMembers(&v); - return; - } +/* ServerViewCount - ns=0;i=2151 */ - /* Check if the encoding is set for a value */ - if(request->itemToMonitor.attributeId != UA_ATTRIBUTEID_VALUE && - request->itemToMonitor.dataEncoding.name.length > 0) { - result->statusCode = UA_STATUSCODE_BADDATAENCODINGINVALID; - UA_DataValue_deleteMembers(&v); - return; - } +static UA_StatusCode function_namespace0_generated_59_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "ServerViewCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2151), +UA_NODEID_NUMERIC(ns[0], 2150), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "ServerViewCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Create the monitoreditem */ - UA_MonitoredItem *newMon = UA_MonitoredItem_new(UA_MONITOREDITEMTYPE_CHANGENOTIFY); - if(!newMon) { - result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY; - UA_DataValue_deleteMembers(&v); - return; - } - UA_StatusCode retval = UA_NodeId_copy(&request->itemToMonitor.nodeId, - &newMon->monitoredNodeId); - if(retval != UA_STATUSCODE_GOOD) { - result->statusCode = retval; - MonitoredItem_delete(server, newMon); - UA_DataValue_deleteMembers(&v); - return; - } - newMon->subscription = cmc->sub; - newMon->attributeId = request->itemToMonitor.attributeId; - UA_String_copy(&request->itemToMonitor.indexRange, &newMon->indexRange); - newMon->monitoredItemId = ++cmc->sub->lastMonitoredItemId; - newMon->timestampsToReturn = cmc->timestampsToReturn; - retval = setMonitoredItemSettings(server, newMon, request->monitoringMode, - &request->requestedParameters, v.value.type); - UA_DataValue_deleteMembers(&v); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO_SESSION(server->config.logger, cmc->sub->session, - "Subscription %u | Could not create a MonitoredItem " - "with StatusCode %s", cmc->sub->subscriptionId, - UA_StatusCode_name(retval)); - result->statusCode = retval; - MonitoredItem_delete(server, newMon); - --cmc->sub->lastMonitoredItemId; - return; - } +static UA_StatusCode function_namespace0_generated_59_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2151) +); +} - UA_Subscription_addMonitoredItem(cmc->sub, newMon); - UA_LOG_INFO_SESSION(server->config.logger, cmc->sub->session, - "Subscription %u | MonitoredItem %i | " - "Created the MonitoredItem", cmc->sub->subscriptionId, - newMon->monitoredItemId); +/* CumulatedSubscriptionCount - ns=0;i=2161 */ - /* Create the first sample */ - if(request->monitoringMode == UA_MONITORINGMODE_REPORTING) - UA_MonitoredItem_SampleCallback(server, newMon); +static UA_StatusCode function_namespace0_generated_60_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSubscriptionCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2161), +UA_NODEID_NUMERIC(ns[0], 2150), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "CumulatedSubscriptionCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Prepare the response */ - result->revisedSamplingInterval = newMon->samplingInterval; - result->revisedQueueSize = newMon->maxQueueSize; - result->monitoredItemId = newMon->monitoredItemId; +static UA_StatusCode function_namespace0_generated_60_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2161) +); } -void -Service_CreateMonitoredItems(UA_Server *server, UA_Session *session, - const UA_CreateMonitoredItemsRequest *request, - UA_CreateMonitoredItemsResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Processing CreateMonitoredItemsRequest"); +/* CurrentSubscriptionCount - ns=0;i=2160 */ - if(server->config.maxMonitoredItemsPerCall != 0 && - request->itemsToCreateSize > server->config.maxMonitoredItemsPerCall) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; - } +static UA_StatusCode function_namespace0_generated_61_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2160), +UA_NODEID_NUMERIC(ns[0], 2150), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "CurrentSubscriptionCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Check if the timestampstoreturn is valid */ - struct createMonContext cmc; - cmc.timestampsToReturn = request->timestampsToReturn; - if(cmc.timestampsToReturn > UA_TIMESTAMPSTORETURN_NEITHER) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTIMESTAMPSTORETURNINVALID; - return; - } +static UA_StatusCode function_namespace0_generated_61_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2160) +); +} - /* Find the subscription */ - cmc.sub = UA_Session_getSubscriptionById(session, request->subscriptionId); - if(!cmc.sub) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; - return; - } +/* SecurityRejectedRequestsCount - ns=0;i=2162 */ - /* Reset the subscription lifetime */ - cmc.sub->currentLifetimeCount = 0; +static UA_StatusCode function_namespace0_generated_62_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedRequestsCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2162), +UA_NODEID_NUMERIC(ns[0], 2150), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "SecurityRejectedRequestsCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_CreateMonitoredItem, &cmc, - &request->itemsToCreateSize, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST], - &response->resultsSize, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]); +static UA_StatusCode function_namespace0_generated_62_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2162) +); } -static void -Operation_ModifyMonitoredItem(UA_Server *server, UA_Session *session, UA_Subscription *sub, - const UA_MonitoredItemModifyRequest *request, - UA_MonitoredItemModifyResult *result) { - /* Get the MonitoredItem */ - UA_MonitoredItem *mon = UA_Subscription_getMonitoredItem(sub, request->monitoredItemId); - if(!mon) { - result->statusCode = UA_STATUSCODE_BADMONITOREDITEMIDINVALID; - return; - } - UA_StatusCode retval; - retval = setMonitoredItemSettings(server, mon, mon->monitoringMode, &request->requestedParameters, NULL); - if(retval != UA_STATUSCODE_GOOD) { - result->statusCode = retval; - return; - } +/* RejectedRequestsCount - ns=0;i=2163 */ - result->revisedSamplingInterval = mon->samplingInterval; - result->revisedQueueSize = mon->maxQueueSize; +static UA_StatusCode function_namespace0_generated_63_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "RejectedRequestsCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2163), +UA_NODEID_NUMERIC(ns[0], 2150), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "RejectedRequestsCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Remove some notifications if the queue is now too small */ - MonitoredItem_ensureQueueSpace(mon); +static UA_StatusCode function_namespace0_generated_63_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2163) +); } -void -Service_ModifyMonitoredItems(UA_Server *server, UA_Session *session, - const UA_ModifyMonitoredItemsRequest *request, - UA_ModifyMonitoredItemsResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Processing ModifyMonitoredItemsRequest"); +/* SessionTimeoutCount - ns=0;i=2156 */ - if(server->config.maxMonitoredItemsPerCall != 0 && - request->itemsToModifySize > server->config.maxMonitoredItemsPerCall) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; - } +static UA_StatusCode function_namespace0_generated_64_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "SessionTimeoutCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2156), +UA_NODEID_NUMERIC(ns[0], 2150), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "SessionTimeoutCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Check if the timestampstoreturn is valid */ - if(request->timestampsToReturn > UA_TIMESTAMPSTORETURN_NEITHER) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTIMESTAMPSTORETURNINVALID; - return; - } +static UA_StatusCode function_namespace0_generated_64_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2156) +); +} - /* Get the subscription */ - UA_Subscription *sub = UA_Session_getSubscriptionById(session, request->subscriptionId); - if(!sub) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; - return; - } +/* SecurityRejectedSessionCount - ns=0;i=2154 */ - sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */ +static UA_StatusCode function_namespace0_generated_65_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedSessionCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2154), +UA_NODEID_NUMERIC(ns[0], 2150), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "SecurityRejectedSessionCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, - (UA_ServiceOperation)Operation_ModifyMonitoredItem, sub, - &request->itemsToModifySize, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST], - &response->resultsSize, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]); +static UA_StatusCode function_namespace0_generated_65_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2154) +); } -struct setMonitoringContext { - UA_Subscription *sub; - UA_MonitoringMode monitoringMode; -}; +/* BuildInfoType - ns=0;i=3051 */ -static void -Operation_SetMonitoringMode(UA_Server *server, UA_Session *session, - struct setMonitoringContext *smc, - UA_UInt32 *monitoredItemId, UA_StatusCode *result) { - UA_MonitoredItem *mon = UA_Subscription_getMonitoredItem(smc->sub, *monitoredItemId); - if(!mon) { - *result = UA_STATUSCODE_BADMONITOREDITEMIDINVALID; - return; - } +static UA_StatusCode function_namespace0_generated_66_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 338); +attr.displayName = UA_LOCALIZEDTEXT("", "BuildInfoType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE, +UA_NODEID_NUMERIC(ns[0], 3051), +UA_NODEID_NUMERIC(ns[0], 63), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "BuildInfoType"), +UA_NODEID_NUMERIC(ns[0], 0), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); +return retVal; +} - if(mon->monitoredItemType != UA_MONITOREDITEMTYPE_CHANGENOTIFY) { - *result = UA_STATUSCODE_BADNOTIMPLEMENTED; - return; - } +static UA_StatusCode function_namespace0_generated_66_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 3051) +); +} - /* Check if the MonitoringMode is valid or not */ - if(smc->monitoringMode > UA_MONITORINGMODE_REPORTING) { - *result = UA_STATUSCODE_BADMONITORINGMODEINVALID; - return; - } +/* ServerStatusType - ns=0;i=2138 */ - if(mon->monitoringMode == smc->monitoringMode) - return; +static UA_StatusCode function_namespace0_generated_67_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 862); +attr.displayName = UA_LOCALIZEDTEXT("", "ServerStatusType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE, +UA_NODEID_NUMERIC(ns[0], 2138), +UA_NODEID_NUMERIC(ns[0], 63), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "ServerStatusType"), +UA_NODEID_NUMERIC(ns[0], 0), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); +return retVal; +} - mon->monitoringMode = smc->monitoringMode; - if(mon->monitoringMode == UA_MONITORINGMODE_REPORTING) { - *result = MonitoredItem_registerSampleCallback(server, mon); - } else { - MonitoredItem_unregisterSampleCallback(server, mon); +static UA_StatusCode function_namespace0_generated_67_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2138) +); +} - // TODO correctly implement SAMPLING - /* Setting the mode to DISABLED or SAMPLING causes all queued Notifications to be deleted */ - UA_Notification *notification, *notification_tmp; - TAILQ_FOREACH_SAFE(notification, &mon->queue, listEntry, notification_tmp) { - TAILQ_REMOVE(&mon->queue, notification, listEntry); - TAILQ_REMOVE(&smc->sub->notificationQueue, notification, globalEntry); - --smc->sub->notificationQueueSize; +/* OperationLimitsType - ns=0;i=11564 */ - UA_DataValue_deleteMembers(¬ification->data.value); - UA_free(notification); - } - mon->queueSize = 0; +static UA_StatusCode function_namespace0_generated_68_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "OperationLimitsType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, +UA_NODEID_NUMERIC(ns[0], 11564), +UA_NODEID_NUMERIC(ns[0], 61), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "OperationLimitsType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Initialize lastSampledValue */ - UA_ByteString_deleteMembers(&mon->lastSampledValue); - UA_Variant_deleteMembers(&mon->lastValue); - } +static UA_StatusCode function_namespace0_generated_68_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11564) +); } -void -Service_SetMonitoringMode(UA_Server *server, UA_Session *session, - const UA_SetMonitoringModeRequest *request, - UA_SetMonitoringModeResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Processing SetMonitoringMode"); +/* MaxNodesPerBrowse - ns=0;i=11570 */ - if(server->config.maxMonitoredItemsPerCall != 0 && - request->monitoredItemIdsSize > server->config.maxMonitoredItemsPerCall) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; - } +static UA_StatusCode function_namespace0_generated_69_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerBrowse"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11570), +UA_NODEID_NUMERIC(ns[0], 11564), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerBrowse"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Get the subscription */ - struct setMonitoringContext smc; - smc.sub = UA_Session_getSubscriptionById(session, request->subscriptionId); - if(!smc.sub) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; - return; - } +static UA_StatusCode function_namespace0_generated_69_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11570) +); +} - smc.sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */ +/* MaxNodesPerWrite - ns=0;i=11567 */ - smc.monitoringMode = request->monitoringMode; - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, - (UA_ServiceOperation)Operation_SetMonitoringMode, &smc, - &request->monitoredItemIdsSize, &UA_TYPES[UA_TYPES_UINT32], - &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +static UA_StatusCode function_namespace0_generated_70_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerWrite"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11567), +UA_NODEID_NUMERIC(ns[0], 11564), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerWrite"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -/* TODO: Unify with senderror in ua_server_binary.c */ -static void -subscriptionSendError(UA_SecureChannel *channel, UA_UInt32 requestHandle, - UA_UInt32 requestId, UA_StatusCode error) { - UA_PublishResponse err_response; - UA_PublishResponse_init(&err_response); - err_response.responseHeader.requestHandle = requestHandle; - err_response.responseHeader.timestamp = UA_DateTime_now(); - err_response.responseHeader.serviceResult = error; - UA_SecureChannel_sendSymmetricMessage(channel, requestId, UA_MESSAGETYPE_MSG, - &err_response, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); +static UA_StatusCode function_namespace0_generated_70_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11567) +); } -void -Service_Publish(UA_Server *server, UA_Session *session, - const UA_PublishRequest *request, UA_UInt32 requestId) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Processing PublishRequest"); +/* MaxNodesPerRegisterNodes - ns=0;i=11571 */ - /* Return an error if the session has no subscription */ - if(LIST_EMPTY(&session->serverSubscriptions)) { - subscriptionSendError(session->header.channel, request->requestHeader.requestHandle, - requestId, UA_STATUSCODE_BADNOSUBSCRIPTION); - return; - } +static UA_StatusCode function_namespace0_generated_71_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRegisterNodes"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11571), +UA_NODEID_NUMERIC(ns[0], 11564), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerRegisterNodes"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Handle too many subscriptions to free resources before trying to allocate - * resources for the new publish request. If the limit has been reached the - * oldest publish request shall be responded */ - if((server->config.maxPublishReqPerSession != 0) && - (session->numPublishReq >= server->config.maxPublishReqPerSession)) { - if(!UA_Subscription_reachedPublishReqLimit(server, session)) { - subscriptionSendError(session->header.channel, requestId, - request->requestHeader.requestHandle, - UA_STATUSCODE_BADINTERNALERROR); - return; - } - } +static UA_StatusCode function_namespace0_generated_71_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11571) +); +} - /* Allocate the response to store it in the retransmission queue */ - UA_PublishResponseEntry *entry = (UA_PublishResponseEntry *) - UA_malloc(sizeof(UA_PublishResponseEntry)); - if(!entry) { - subscriptionSendError(session->header.channel, requestId, - request->requestHeader.requestHandle, - UA_STATUSCODE_BADOUTOFMEMORY); - return; - } +/* MaxMonitoredItemsPerCall - ns=0;i=11574 */ - /* Prepare the response */ - entry->requestId = requestId; - UA_PublishResponse *response = &entry->response; - UA_PublishResponse_init(response); - response->responseHeader.requestHandle = request->requestHeader.requestHandle; +static UA_StatusCode function_namespace0_generated_72_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxMonitoredItemsPerCall"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11574), +UA_NODEID_NUMERIC(ns[0], 11564), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxMonitoredItemsPerCall"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Allocate the results array to acknowledge the acknowledge */ - if(request->subscriptionAcknowledgementsSize > 0) { - response->results = (UA_StatusCode *) - UA_Array_new(request->subscriptionAcknowledgementsSize, - &UA_TYPES[UA_TYPES_STATUSCODE]); - if(!response->results) { - UA_free(entry); - subscriptionSendError(session->header.channel, requestId, - request->requestHeader.requestHandle, - UA_STATUSCODE_BADOUTOFMEMORY); - return; - } - response->resultsSize = request->subscriptionAcknowledgementsSize; - } +static UA_StatusCode function_namespace0_generated_72_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11574) +); +} - /* Delete Acknowledged Subscription Messages */ - for(size_t i = 0; i < request->subscriptionAcknowledgementsSize; ++i) { - UA_SubscriptionAcknowledgement *ack = &request->subscriptionAcknowledgements[i]; - UA_Subscription *sub = UA_Session_getSubscriptionById(session, ack->subscriptionId); - if(!sub) { - response->results[i] = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Cannot process acknowledgements subscription %u", - ack->subscriptionId); - continue; - } - /* Remove the acked transmission from the retransmission queue */ - response->results[i] = UA_Subscription_removeRetransmissionMessage(sub, ack->sequenceNumber); - } +/* MaxNodesPerMethodCall - ns=0;i=11569 */ - /* Queue the publish response. It will be dequeued in a repeated publish - * callback. This can also be triggered right now for a late - * subscription. */ - UA_Session_queuePublishReq(session, entry, false); - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Queued a publication message"); +static UA_StatusCode function_namespace0_generated_73_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerMethodCall"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11569), +UA_NODEID_NUMERIC(ns[0], 11564), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerMethodCall"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* If there are late subscriptions, the new publish request is used to - * answer them immediately. However, a single subscription that generates - * many notifications must not "starve" other late subscriptions. Therefore - * we keep track of the last subscription that got preferential treatment. - * We start searching for late subscriptions **after** the last one. */ +static UA_StatusCode function_namespace0_generated_73_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11569) +); +} - UA_Subscription *immediate = NULL; - if(session->lastSeenSubscriptionId > 0) { - LIST_FOREACH(immediate, &session->serverSubscriptions, listEntry) { - if(immediate->subscriptionId == session->lastSeenSubscriptionId) { - immediate = LIST_NEXT(immediate, listEntry); - break; - } - } - } +/* MaxNodesPerRead - ns=0;i=11565 */ - /* If no entry was found, start at the beginning and don't restart */ - UA_Boolean found = false; - if(!immediate) - immediate = LIST_FIRST(&session->serverSubscriptions); - else - found = true; +static UA_StatusCode function_namespace0_generated_74_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRead"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11565), +UA_NODEID_NUMERIC(ns[0], 11564), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerRead"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - repeat: - while(immediate) { - if(immediate->state == UA_SUBSCRIPTIONSTATE_LATE) { - session->lastSeenSubscriptionId = immediate->subscriptionId; - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Subscription %u | Response on a late subscription", - immediate->subscriptionId); - UA_Subscription_publish(server, immediate); - return; - } - immediate = LIST_NEXT(immediate, listEntry); - } +static UA_StatusCode function_namespace0_generated_74_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11565) +); +} - /* Restart at the beginning of the list */ - if(found) { - immediate = LIST_FIRST(&session->serverSubscriptions); - found = false; - goto repeat; - } +/* MaxNodesPerNodeManagement - ns=0;i=11573 */ - /* No late subscription this time */ - session->lastSeenSubscriptionId = 0; +static UA_StatusCode function_namespace0_generated_75_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerNodeManagement"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11573), +UA_NODEID_NUMERIC(ns[0], 11564), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerNodeManagement"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -static void -Operation_DeleteSubscription(UA_Server *server, UA_Session *session, void *_, - UA_UInt32 *subscriptionId, UA_StatusCode *result) { - *result = UA_Session_deleteSubscription(server, session, *subscriptionId); - if(*result == UA_STATUSCODE_GOOD) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Subscription %u | Subscription deleted", - *subscriptionId); - } else { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Deleting Subscription with Id %u failed with error code %s", - *subscriptionId, UA_StatusCode_name(*result)); - } +static UA_StatusCode function_namespace0_generated_75_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11573) +); } -void -Service_DeleteSubscriptions(UA_Server *server, UA_Session *session, - const UA_DeleteSubscriptionsRequest *request, - UA_DeleteSubscriptionsResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Processing DeleteSubscriptionsRequest"); +/* MaxNodesPerTranslateBrowsePathsToNodeIds - ns=0;i=11572 */ - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, - (UA_ServiceOperation)Operation_DeleteSubscription, NULL, - &request->subscriptionIdsSize, &UA_TYPES[UA_TYPES_UINT32], - &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +static UA_StatusCode function_namespace0_generated_76_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerTranslateBrowsePathsToNodeIds"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11572), +UA_NODEID_NUMERIC(ns[0], 11564), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerTranslateBrowsePathsToNodeIds"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* The session has at least one subscription */ - if(LIST_FIRST(&session->serverSubscriptions)) - return; +static UA_StatusCode function_namespace0_generated_76_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11572) +); +} - /* Send remaining publish responses if the last subscription was removed */ - UA_Subscription_answerPublishRequestsNoSubscription(server, session); +/* ServerRedundancyType - ns=0;i=2034 */ + +static UA_StatusCode function_namespace0_generated_77_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ServerRedundancyType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, +UA_NODEID_NUMERIC(ns[0], 2034), +UA_NODEID_NUMERIC(ns[0], 58), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "ServerRedundancyType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); +return retVal; } -static void -Operation_DeleteMonitoredItem(UA_Server *server, UA_Session *session, UA_Subscription *sub, - UA_UInt32 *monitoredItemId, UA_StatusCode *result) { - *result = UA_Subscription_deleteMonitoredItem(server, sub, *monitoredItemId); +static UA_StatusCode function_namespace0_generated_77_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2034) +); } -void -Service_DeleteMonitoredItems(UA_Server *server, UA_Session *session, - const UA_DeleteMonitoredItemsRequest *request, - UA_DeleteMonitoredItemsResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Processing DeleteMonitoredItemsRequest"); +/* RedundancySupport - ns=0;i=2035 */ - if(server->config.maxMonitoredItemsPerCall != 0 && - request->monitoredItemIdsSize > server->config.maxMonitoredItemsPerCall) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; - } +static UA_StatusCode function_namespace0_generated_78_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 851); +attr.displayName = UA_LOCALIZEDTEXT("", "RedundancySupport"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2035), +UA_NODEID_NUMERIC(ns[0], 2034), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "RedundancySupport"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Get the subscription */ - UA_Subscription *sub = UA_Session_getSubscriptionById(session, request->subscriptionId); - if(!sub) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; - return; - } +static UA_StatusCode function_namespace0_generated_78_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2035) +); +} - /* Reset the subscription lifetime */ - sub->currentLifetimeCount = 0; +/* VendorServerInfoType - ns=0;i=2033 */ - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, - (UA_ServiceOperation)Operation_DeleteMonitoredItem, sub, - &request->monitoredItemIdsSize, &UA_TYPES[UA_TYPES_UINT32], - &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +static UA_StatusCode function_namespace0_generated_79_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "VendorServerInfoType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, +UA_NODEID_NUMERIC(ns[0], 2033), +UA_NODEID_NUMERIC(ns[0], 58), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "VendorServerInfoType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); +return retVal; } -void -Service_Republish(UA_Server *server, UA_Session *session, const UA_RepublishRequest *request, - UA_RepublishResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Processing RepublishRequest"); +static UA_StatusCode function_namespace0_generated_79_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2033) +); +} - /* Get the subscription */ - UA_Subscription *sub = UA_Session_getSubscriptionById(session, request->subscriptionId); - if(!sub) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; - return; - } +/* ServerDiagnosticsType - ns=0;i=2020 */ - /* Reset the subscription lifetime */ - sub->currentLifetimeCount = 0; +static UA_StatusCode function_namespace0_generated_80_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, +UA_NODEID_NUMERIC(ns[0], 2020), +UA_NODEID_NUMERIC(ns[0], 58), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "ServerDiagnosticsType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Find the notification in the retransmission queue */ - UA_NotificationMessageEntry *entry; - TAILQ_FOREACH(entry, &sub->retransmissionQueue, listEntry) { - if(entry->message.sequenceNumber == request->retransmitSequenceNumber) - break; - } - if(!entry) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADMESSAGENOTAVAILABLE; - return; - } +static UA_StatusCode function_namespace0_generated_80_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2020) +); +} - response->responseHeader.serviceResult = - UA_NotificationMessage_copy(&entry->message, &response->notificationMessage); +/* ServerCapabilitiesType - ns=0;i=2013 */ + +static UA_StatusCode function_namespace0_generated_81_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ServerCapabilitiesType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, +UA_NODEID_NUMERIC(ns[0], 2013), +UA_NODEID_NUMERIC(ns[0], 58), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "ServerCapabilitiesType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); +return retVal; } -#endif /* UA_ENABLE_SUBSCRIPTIONS */ +static UA_StatusCode function_namespace0_generated_81_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2013) +); +} -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_services_securechannel.c" ***********************************/ +/* OperationLimits - ns=0;i=11551 */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2014, 2017 (c) Florian Palm - * Copyright 2015 (c) Oleksiy Vasylyev - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB - */ +static UA_StatusCode function_namespace0_generated_82_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "OperationLimits"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 11551), +UA_NODEID_NUMERIC(ns[0], 2013), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "OperationLimits"), +UA_NODEID_NUMERIC(ns[0], 11564), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; +} +static UA_StatusCode function_namespace0_generated_82_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11551) +); +} -void -Service_OpenSecureChannel(UA_Server *server, UA_SecureChannel *channel, - const UA_OpenSecureChannelRequest *request, - UA_OpenSecureChannelResponse *response) { - if(request->requestType == UA_SECURITYTOKENREQUESTTYPE_RENEW) { - /* Renew the channel */ - response->responseHeader.serviceResult = - UA_SecureChannelManager_renew(&server->secureChannelManager, - channel, request, response); +/* ServerType - ns=0;i=2004 */ - /* Logging */ - if(response->responseHeader.serviceResult == UA_STATUSCODE_GOOD) { - UA_LOG_DEBUG_CHANNEL(server->config.logger, channel, - "SecureChannel renewed"); - } else { - UA_LOG_DEBUG_CHANNEL(server->config.logger, channel, - "Renewing SecureChannel failed"); - } - return; - } +static UA_StatusCode function_namespace0_generated_83_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ServerType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, +UA_NODEID_NUMERIC(ns[0], 2004), +UA_NODEID_NUMERIC(ns[0], 58), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "ServerType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Must be ISSUE or RENEW */ - if(request->requestType != UA_SECURITYTOKENREQUESTTYPE_ISSUE) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; - return; - } +static UA_StatusCode function_namespace0_generated_83_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2004) +); +} - /* Open the channel */ - response->responseHeader.serviceResult = - UA_SecureChannelManager_open(&server->secureChannelManager, channel, - request, response); +/* VendorServerInfo - ns=0;i=2011 */ - /* Logging */ - if(response->responseHeader.serviceResult == UA_STATUSCODE_GOOD) { - UA_LOG_INFO_CHANNEL(server->config.logger, channel, - "Opened SecureChannel"); - } else { - UA_LOG_INFO_CHANNEL(server->config.logger, channel, - "Opening a SecureChannel failed"); - } +static UA_StatusCode function_namespace0_generated_84_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "VendorServerInfo"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 2011), +UA_NODEID_NUMERIC(ns[0], 2004), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "VendorServerInfo"), +UA_NODEID_NUMERIC(ns[0], 2033), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; } -/* The server does not send a CloseSecureChannel response */ -void -Service_CloseSecureChannel(UA_Server *server, UA_SecureChannel *channel) { - UA_LOG_INFO_CHANNEL(server->config.logger, channel, "CloseSecureChannel"); - UA_SecureChannelManager_close(&server->secureChannelManager, - channel->securityToken.channelId); +static UA_StatusCode function_namespace0_generated_84_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2011) +); } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_services_nodemanagement.c" ***********************************/ +/* Server - ns=0;i=2253 */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2014-2017 (c) Florian Palm - * Copyright 2015-2016 (c) Sten Grüner - * Copyright 2015-2016 (c) Chris Iatrou - * Copyright 2015-2016 (c) Oleksiy Vasylyev - * Copyright 2017 (c) Julian Grothoff - * Copyright 2016 (c) LEvertz - * Copyright 2016 (c) Lorenz Haas - * Copyright 2017 (c) frax2222 - * Copyright 2017-2018 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) Christian von Arnim - * Copyright 2017 (c) Henrik Norrman - */ +static UA_StatusCode function_namespace0_generated_85_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.eventNotifier = true; +attr.displayName = UA_LOCALIZEDTEXT("", "Server"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 2253), +UA_NODEID_NUMERIC(ns[0], 85), +UA_NODEID_NUMERIC(ns[0], 35), +UA_QUALIFIEDNAME(ns[0], "Server"), +UA_NODEID_NUMERIC(ns[0], 2004), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; +} +static UA_StatusCode function_namespace0_generated_85_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2253) +); +} -/*********************/ -/* Edit Node Context */ -/*********************/ +/* ServerDiagnostics - ns=0;i=2274 */ -UA_StatusCode -UA_Server_getNodeContext(UA_Server *server, UA_NodeId nodeId, - void **nodeContext) { - const UA_Node *node = UA_Nodestore_get(server, &nodeId); - if(!node) - return UA_STATUSCODE_BADNODEIDUNKNOWN; +static UA_StatusCode function_namespace0_generated_86_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnostics"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 2274), +UA_NODEID_NUMERIC(ns[0], 2253), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "ServerDiagnostics"), +UA_NODEID_NUMERIC(ns[0], 2020), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; +} - *nodeContext = node->context; - UA_Nodestore_release(server, node); - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_86_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2274) +); } -static UA_StatusCode -editNodeContext(UA_Server *server, UA_Session* session, - UA_Node* node, void *context) { - node->context = context; - return UA_STATUSCODE_GOOD; +/* ServerDiagnosticsSummary - ns=0;i=2275 */ + +static UA_StatusCode function_namespace0_generated_87_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 859); +attr.displayName = UA_LOCALIZEDTEXT("", "ServerDiagnosticsSummary"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2275), +UA_NODEID_NUMERIC(ns[0], 2274), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "ServerDiagnosticsSummary"), +UA_NODEID_NUMERIC(ns[0], 2150), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -UA_StatusCode -UA_Server_setNodeContext(UA_Server *server, UA_NodeId nodeId, - void *nodeContext) { - UA_StatusCode retval = - UA_Server_editNode(server, &server->adminSession, &nodeId, - (UA_EditNodeCallback)editNodeContext, nodeContext); - return retval; +static UA_StatusCode function_namespace0_generated_87_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2275) +); } -/**********************/ -/* Consistency Checks */ -/**********************/ +/* SecurityRejectedRequestsCount - ns=0;i=2287 */ +static UA_StatusCode function_namespace0_generated_88_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedRequestsCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2287), +UA_NODEID_NUMERIC(ns[0], 2275), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "SecurityRejectedRequestsCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} -#define UA_PARENT_REFERENCES_COUNT 2 +static UA_StatusCode function_namespace0_generated_88_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2287) +); +} -const UA_NodeId parentReferences[UA_PARENT_REFERENCES_COUNT] = { - { - 0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASSUBTYPE} - }, - { - 0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASCOMPONENT} - } -}; +/* SessionTimeoutCount - ns=0;i=2281 */ +static UA_StatusCode function_namespace0_generated_89_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "SessionTimeoutCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2281), +UA_NODEID_NUMERIC(ns[0], 2275), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "SessionTimeoutCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} -/* Check if the requested parent node exists, has the right node class and is - * referenced with an allowed (hierarchical) reference type. For "type" nodes, - * only hasSubType references are allowed. */ -static UA_StatusCode -checkParentReference(UA_Server *server, UA_Session *session, UA_NodeClass nodeClass, - const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId) { - /* Objects do not need a parent (e.g. mandatory/optional modellingrules) */ - if(nodeClass == UA_NODECLASS_OBJECT && UA_NodeId_isNull(parentNodeId) && - UA_NodeId_isNull(referenceTypeId)) - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_89_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2281) +); +} - /* Omit checks during bootstrap */ - if(server->bootstrapNS0) - return UA_STATUSCODE_GOOD; +/* RejectedRequestsCount - ns=0;i=2288 */ - /* See if the parent exists */ - const UA_Node *parent = UA_Nodestore_get(server, parentNodeId); - if(!parent) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Parent node not found"); - return UA_STATUSCODE_BADPARENTNODEIDINVALID; - } +static UA_StatusCode function_namespace0_generated_90_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "RejectedRequestsCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2288), +UA_NODEID_NUMERIC(ns[0], 2275), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "RejectedRequestsCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - UA_NodeClass parentNodeClass = parent->nodeClass; - UA_Nodestore_release(server, parent); +static UA_StatusCode function_namespace0_generated_90_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2288) +); +} - /* Check the referencetype exists */ - const UA_ReferenceTypeNode *referenceType = (const UA_ReferenceTypeNode*) - UA_Nodestore_get(server, referenceTypeId); - if(!referenceType) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Reference type to the parent not found"); - return UA_STATUSCODE_BADREFERENCETYPEIDINVALID; - } +/* CurrentSubscriptionCount - ns=0;i=2285 */ - /* Check if the referencetype is a reference type node */ - if(referenceType->nodeClass != UA_NODECLASS_REFERENCETYPE) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Reference type to the parent invalid"); - UA_Nodestore_release(server, (const UA_Node*)referenceType); - return UA_STATUSCODE_BADREFERENCETYPEIDINVALID; - } +static UA_StatusCode function_namespace0_generated_91_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSubscriptionCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2285), +UA_NODEID_NUMERIC(ns[0], 2275), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "CurrentSubscriptionCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - UA_Boolean referenceTypeIsAbstract = referenceType->isAbstract; - UA_Nodestore_release(server, (const UA_Node*)referenceType); - /* Check that the reference type is not abstract */ - if(referenceTypeIsAbstract == true) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Abstract reference type to the parent not allowed"); - return UA_STATUSCODE_BADREFERENCENOTALLOWED; - } +static UA_StatusCode function_namespace0_generated_91_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2285) +); +} - /* Check hassubtype relation for type nodes */ - if(nodeClass == UA_NODECLASS_DATATYPE || - nodeClass == UA_NODECLASS_VARIABLETYPE || - nodeClass == UA_NODECLASS_OBJECTTYPE || - nodeClass == UA_NODECLASS_REFERENCETYPE) { - /* type needs hassubtype reference to the supertype */ - if(!UA_NodeId_equal(referenceTypeId, &subtypeId)) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: New type node need to have a " - "HasSubType reference"); - return UA_STATUSCODE_BADREFERENCENOTALLOWED; - } - /* supertype needs to be of the same node type */ - if(parentNodeClass != nodeClass) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: New type node needs to be of the same " - "node type as the parent"); - return UA_STATUSCODE_BADPARENTNODEIDINVALID; - } - return UA_STATUSCODE_GOOD; - } +/* ServerViewCount - ns=0;i=2276 */ - /* Test if the referencetype is hierarchical */ - const UA_NodeId hierarchicalReference = - UA_NODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES); - if(!isNodeInTree(&server->config.nodestore, referenceTypeId, - &hierarchicalReference, &subtypeId, 1)) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Reference type is not hierarchical"); - return UA_STATUSCODE_BADREFERENCETYPEIDINVALID; - } +static UA_StatusCode function_namespace0_generated_92_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "ServerViewCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2276), +UA_NODEID_NUMERIC(ns[0], 2275), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "ServerViewCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_92_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2276) +); } -static UA_StatusCode -typeCheckVariableNode(UA_Server *server, UA_Session *session, - const UA_VariableNode *node, - const UA_VariableTypeNode *vt, - const UA_NodeId *parentNodeId) { - /* The value might come from a datasource, so we perform a - * regular read. */ - UA_DataValue value; - UA_DataValue_init(&value); - UA_StatusCode retval = readValueAttribute(server, session, node, &value); - if(retval != UA_STATUSCODE_GOOD) - return retval; +/* PublishingIntervalCount - ns=0;i=2284 */ - /* Check the datatype against the vt */ - if(!compatibleDataType(server, &node->dataType, &vt->dataType, false)) - return UA_STATUSCODE_BADTYPEMISMATCH; +static UA_StatusCode function_namespace0_generated_93_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "PublishingIntervalCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2284), +UA_NODEID_NUMERIC(ns[0], 2275), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "PublishingIntervalCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Check valueRank against array dimensions */ - if(!compatibleValueRankArrayDimensions(server, session, node->valueRank, node->arrayDimensionsSize)) - return UA_STATUSCODE_BADTYPEMISMATCH; +static UA_StatusCode function_namespace0_generated_93_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2284) +); +} - /* If variable node is created below BaseObjectType and has its default valueRank of -2, - * skip the test */ - const UA_NodeId objectTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE); - - // TODO handle subtypes of parent reference types - if(node->valueRank != vt->valueRank && - node->valueRank != UA_VariableAttributes_default.valueRank && - !isNodeInTree(&server->config.nodestore, parentNodeId, &objectTypes, - parentReferences, UA_PARENT_REFERENCES_COUNT)) { - /* Check valueRank against the vt */ - if(!compatibleValueRanks(node->valueRank, vt->valueRank)) - return UA_STATUSCODE_BADTYPEMISMATCH; - } +/* SecurityRejectedSessionCount - ns=0;i=2279 */ - /* Check array dimensions against the vt */ - if(!compatibleArrayDimensions(vt->arrayDimensionsSize, vt->arrayDimensions, - node->arrayDimensionsSize, node->arrayDimensions)) - return UA_STATUSCODE_BADTYPEMISMATCH; +static UA_StatusCode function_namespace0_generated_94_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "SecurityRejectedSessionCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2279), +UA_NODEID_NUMERIC(ns[0], 2275), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "SecurityRejectedSessionCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Typecheck the value */ - if(value.hasValue && value.value.data) { - /* If the type-check failed write the same value again. The - * write-service tries to convert to the correct type... */ - if(!compatibleValue(server, session, &node->dataType, node->valueRank, - node->arrayDimensionsSize, node->arrayDimensions, - &value.value, NULL)) - retval = UA_Server_writeValue(server, node->nodeId, value.value); - UA_DataValue_deleteMembers(&value); - } - return retval; +static UA_StatusCode function_namespace0_generated_94_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2279) +); } -/********************/ -/* Instantiate Node */ -/********************/ +/* SessionAbortCount - ns=0;i=2282 */ -static const UA_NodeId baseDataVariableType = - {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_BASEDATAVARIABLETYPE}}; -static const UA_NodeId baseObjectType = - {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_BASEOBJECTTYPE}}; +static UA_StatusCode function_namespace0_generated_95_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "SessionAbortCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2282), +UA_NODEID_NUMERIC(ns[0], 2275), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "SessionAbortCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} -/* Use attributes from the variable type wherever required */ -static UA_StatusCode -useVariableTypeAttributes(UA_Server *server, UA_Session *session, - UA_VariableNode *node, const UA_AddNodesItem *item) { - const UA_VariableAttributes *attributes = (const UA_VariableAttributes*) - item->nodeAttributes.content.decoded.data; +static UA_StatusCode function_namespace0_generated_95_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2282) +); +} - /* Select the type definition */ - const UA_NodeId *typeDefinition; - if(node->nodeClass == UA_NODECLASS_VARIABLE) - typeDefinition = &item->typeDefinition.nodeId; - else /* UA_NODECLASS_VARIABLETYPE */ - typeDefinition = &item->parentNodeId.nodeId; - - /* Replace an empty typeDefinition with the most permissive default */ - if(UA_NodeId_isNull(typeDefinition)) - typeDefinition = &baseDataVariableType; - - const UA_VariableTypeNode *vt = (const UA_VariableTypeNode*) - UA_Nodestore_get(server, typeDefinition); - if(!vt || vt->nodeClass != UA_NODECLASS_VARIABLETYPE) { - UA_Nodestore_release(server, (const UA_Node*)vt); - return UA_STATUSCODE_BADTYPEMISMATCH; - } +/* CurrentSessionCount - ns=0;i=2277 */ - /* If no value is set, see if the vt provides one and copy it. This needs to - * be done before copying the datatype from the vt, as setting the datatype - * triggers a typecheck. */ - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(!attributes->value.type) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "AddNodes: No value given; Copy the value" - "from the TypeDefinition"); - UA_DataValue vt_value; - UA_DataValue_init(&vt_value); - retval = readValueAttribute(server, session, - (const UA_VariableNode*)vt, &vt_value); - if(retval == UA_STATUSCODE_GOOD && vt_value.hasValue) { - retval = UA_Variant_copy(&vt_value.value, &node->value.data.value.value); - node->value.data.value.hasValue = true; - } - UA_DataValue_deleteMembers(&vt_value); - } +static UA_StatusCode function_namespace0_generated_96_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "CurrentSessionCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2277), +UA_NODEID_NUMERIC(ns[0], 2275), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "CurrentSessionCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* If no datatype is given, use the datatype of the vt */ - if(retval == UA_STATUSCODE_GOOD && UA_NodeId_isNull(&node->dataType)) { - UA_LOG_INFO_SESSION(server->config.logger, session, "AddNodes: " - "No datatype given; Copy the datatype attribute " - "from the TypeDefinition"); - retval = UA_NodeId_copy(&vt->dataType, &node->dataType); - } +static UA_StatusCode function_namespace0_generated_96_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2277) +); +} - /* TODO: If the vt has arraydimensions but this variable does not, copy */ +/* RejectedSessionCount - ns=0;i=3705 */ - UA_Nodestore_release(server, (const UA_Node*)vt); - return retval; +static UA_StatusCode function_namespace0_generated_97_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "RejectedSessionCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 3705), +UA_NODEID_NUMERIC(ns[0], 2275), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "RejectedSessionCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -/* Search for an instance of "browseName" in node searchInstance. Used during - * copyChildNodes to find overwritable/mergable nodes. Does not touch - * outInstanceNodeId if no child is found. */ -static UA_StatusCode -findChildByBrowsename(UA_Server *server, UA_Session *session, - const UA_NodeId *searchInstance, - const UA_QualifiedName *browseName, - UA_NodeId *outInstanceNodeId) { - UA_BrowseDescription bd; - UA_BrowseDescription_init(&bd); - bd.nodeId = *searchInstance; - bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES); - bd.includeSubtypes = true; - bd.browseDirection = UA_BROWSEDIRECTION_FORWARD; - bd.nodeClassMask = UA_NODECLASS_OBJECT | UA_NODECLASS_VARIABLE | UA_NODECLASS_METHOD; - bd.resultMask = UA_BROWSERESULTMASK_NODECLASS | UA_BROWSERESULTMASK_BROWSENAME; - - UA_BrowseResult br; - UA_BrowseResult_init(&br); - UA_UInt32 maxrefs = 0; - Operation_Browse(server, session, &maxrefs, &bd, &br); - if(br.statusCode != UA_STATUSCODE_GOOD) - return br.statusCode; +static UA_StatusCode function_namespace0_generated_97_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 3705) +); +} - UA_StatusCode retval = UA_STATUSCODE_GOOD; - for(size_t i = 0; i < br.referencesSize; ++i) { - UA_ReferenceDescription *rd = &br.references[i]; - if(rd->browseName.namespaceIndex == browseName->namespaceIndex && - UA_String_equal(&rd->browseName.name, &browseName->name)) { - retval = UA_NodeId_copy(&rd->nodeId.nodeId, outInstanceNodeId); - break; - } - } +/* CumulatedSubscriptionCount - ns=0;i=2286 */ - UA_BrowseResult_deleteMembers(&br); - return retval; +static UA_StatusCode function_namespace0_generated_98_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSubscriptionCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2286), +UA_NODEID_NUMERIC(ns[0], 2275), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "CumulatedSubscriptionCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -static const UA_NodeId mandatoryId = - {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_MODELLINGRULE_MANDATORY}}; -static const UA_NodeId hasModellingRuleId = - {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASMODELLINGRULE}}; +static UA_StatusCode function_namespace0_generated_98_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2286) +); +} -static UA_Boolean -isMandatoryChild(UA_Server *server, UA_Session *session, - const UA_NodeId *childNodeId) { - /* Get the child */ - const UA_Node *child = UA_Nodestore_get(server, childNodeId); - if(!child) - return false; +/* CumulatedSessionCount - ns=0;i=2278 */ - /* Look for the reference making the child mandatory */ - for(size_t i = 0; i < child->referencesSize; ++i) { - UA_NodeReferenceKind *refs = &child->references[i]; - if(!UA_NodeId_equal(&hasModellingRuleId, &refs->referenceTypeId)) - continue; - if(refs->isInverse) - continue; - for(size_t j = 0; j < refs->targetIdsSize; ++j) { - if(UA_NodeId_equal(&mandatoryId, &refs->targetIds[j].nodeId)) { - UA_Nodestore_release(server, child); - return true; - } - } - } +static UA_StatusCode function_namespace0_generated_99_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "CumulatedSessionCount"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2278), +UA_NODEID_NUMERIC(ns[0], 2275), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "CumulatedSessionCount"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - UA_Nodestore_release(server, child); - return false; +static UA_StatusCode function_namespace0_generated_99_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2278) +); } -static UA_StatusCode -copyChildNodes(UA_Server *server, UA_Session *session, - const UA_NodeId *sourceNodeId, - const UA_NodeId *destinationNodeId); +/* EnabledFlag - ns=0;i=2294 */ -static void -Operation_addReference(UA_Server *server, UA_Session *session, void *context, - const UA_AddReferencesItem *item, UA_StatusCode *retval); +static UA_StatusCode function_namespace0_generated_100_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 3; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 1); +attr.displayName = UA_LOCALIZEDTEXT("", "EnabledFlag"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2294), +UA_NODEID_NUMERIC(ns[0], 2274), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "EnabledFlag"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} +static UA_StatusCode function_namespace0_generated_100_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2294) +); +} -/* - * This method only deletes references from the node which are not matching any type in the given array. - * Could be used to e.g. delete all the references, except 'HASMODELINGRULE' - */ -static void deleteReferencesSubset(UA_Node *node, size_t referencesSkipSize, UA_NodeId* referencesSkip) { - if(referencesSkipSize == 0) { - UA_Node_deleteReferences(node); - return; - } +/* Auditing - ns=0;i=2994 */ - /* Let's count if there are references left. If not just delete all the references. - * It's faster */ - size_t newSize = 0; - for(size_t i = 0; i < node->referencesSize; ++i) { - for(size_t j = 0; j < referencesSkipSize; j++) { - if(UA_NodeId_equal(&node->references[i].referenceTypeId, &referencesSkip[j])) { - newSize++; - } - } - } - if(newSize == 0) { - UA_Node_deleteReferences(node); - return; - } +static UA_StatusCode function_namespace0_generated_101_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 1000.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 1); +attr.displayName = UA_LOCALIZEDTEXT("", "Auditing"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2994), +UA_NODEID_NUMERIC(ns[0], 2253), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "Auditing"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Now copy the remaining references to a new array */ - UA_NodeReferenceKind *newReferences = (UA_NodeReferenceKind *)UA_malloc(sizeof(UA_NodeReferenceKind) * (newSize)); - size_t curr = 0; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - for(size_t i = 0; i < node->referencesSize && retval == UA_STATUSCODE_GOOD; ++i) { - for(size_t j = 0; j < referencesSkipSize; j++) { - if(!UA_NodeId_equal(&node->references[i].referenceTypeId, &referencesSkip[j])) - continue; +static UA_StatusCode function_namespace0_generated_101_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2994) +); +} - // copy the reference - UA_NodeReferenceKind *srefs = &node->references[i]; - UA_NodeReferenceKind *drefs = &newReferences[curr++]; - drefs->isInverse = srefs->isInverse; - retval = UA_NodeId_copy(&srefs->referenceTypeId, &drefs->referenceTypeId); - if(retval != UA_STATUSCODE_GOOD) - break; - retval = UA_Array_copy(srefs->targetIds, srefs->targetIdsSize, - (void**)&drefs->targetIds, - &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); - if(retval != UA_STATUSCODE_GOOD) - break; - drefs->targetIdsSize = srefs->targetIdsSize; - break; - } - if(retval != UA_STATUSCODE_GOOD) { - for(size_t k=0; ktargetIdsSize; ++j) - UA_ExpandedNodeId_deleteMembers(&refs->targetIds[j]); - UA_Array_delete(refs->targetIds, refs->targetIdsSize, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); - UA_NodeId_deleteMembers(&refs->referenceTypeId); - } - } - } +/* ServerCapabilities - ns=0;i=2268 */ - UA_Node_deleteReferences(node); - if(retval == UA_STATUSCODE_GOOD) { - node->references = newReferences; - node->referencesSize = newSize; - } else { - UA_free(newReferences); - } +static UA_StatusCode function_namespace0_generated_102_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ServerCapabilities"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 2268), +UA_NODEID_NUMERIC(ns[0], 2253), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "ServerCapabilities"), +UA_NODEID_NUMERIC(ns[0], 2013), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; } -static UA_StatusCode -AddNode_typeCheckAddRefs(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId, - const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId, - const UA_NodeId *typeDefinitionId); - -static UA_StatusCode -copyChildNode(UA_Server *server, UA_Session *session, - const UA_NodeId *destinationNodeId, - const UA_ReferenceDescription *rd) { - UA_NodeId existingChild = UA_NODEID_NULL; - UA_StatusCode retval = - findChildByBrowsename(server, session, destinationNodeId, - &rd->browseName, &existingChild); - if(retval != UA_STATUSCODE_GOOD) - return retval; +static UA_StatusCode function_namespace0_generated_102_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2268) +); +} - /* Have a child with that browseName. Try to deep-copy missing members. */ - if(!UA_NodeId_isNull(&existingChild)) { - if(rd->nodeClass == UA_NODECLASS_VARIABLE || - rd->nodeClass == UA_NODECLASS_OBJECT) - retval = copyChildNodes(server, session, &rd->nodeId.nodeId, &existingChild); - UA_NodeId_deleteMembers(&existingChild); - return retval; - } +/* MinSupportedSampleRate - ns=0;i=2272 */ - /* Is the child mandatory? If not, skip */ - if(!isMandatoryChild(server, session, &rd->nodeId.nodeId)) - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_103_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 290); +attr.displayName = UA_LOCALIZEDTEXT("", "MinSupportedSampleRate"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2272), +UA_NODEID_NUMERIC(ns[0], 2268), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MinSupportedSampleRate"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* No existing child with that browsename. Create it. */ - if(rd->nodeClass == UA_NODECLASS_METHOD) { - /* Add a reference to the method in the objecttype */ - UA_AddReferencesItem newItem; - UA_AddReferencesItem_init(&newItem); - newItem.sourceNodeId = *destinationNodeId; - newItem.referenceTypeId = rd->referenceTypeId; - newItem.isForward = true; - newItem.targetNodeId = rd->nodeId; - newItem.targetNodeClass = UA_NODECLASS_METHOD; - Operation_addReference(server, session, NULL, &newItem, &retval); - return retval; - } +static UA_StatusCode function_namespace0_generated_103_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2272) +); +} - /* Node exists and is a variable or object. Instantiate missing mandatory - * children */ - if(rd->nodeClass == UA_NODECLASS_VARIABLE || - rd->nodeClass == UA_NODECLASS_OBJECT) { - /* Get the node */ - UA_Node *node; - retval = UA_Nodestore_getCopy(server, &rd->nodeId.nodeId, &node); - if(retval != UA_STATUSCODE_GOOD) - return retval; +/* AggregateFunctions - ns=0;i=2997 */ - /* Get the type */ - const UA_Node *type = getNodeType(server, node); - const UA_NodeId *typeId; - if(type) - typeId = &type->nodeId; - else - typeId = &UA_NODEID_NULL; +static UA_StatusCode function_namespace0_generated_104_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "AggregateFunctions"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 2997), +UA_NODEID_NUMERIC(ns[0], 2268), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "AggregateFunctions"), +UA_NODEID_NUMERIC(ns[0], 61), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; +} - /* Reset the NodeId (random numeric id will be assigned in the nodestore) */ - UA_NodeId_deleteMembers(&node->nodeId); - node->nodeId.namespaceIndex = destinationNodeId->namespaceIndex; +static UA_StatusCode function_namespace0_generated_104_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2997) +); +} - /* Remove references, they are re-created from scratch in addnode_finish */ - /* TODO: Be more clever in removing references that are re-added during - * addnode_finish. That way, we can call addnode_finish also on children that were - * manually added by the user during addnode_begin and addnode_finish. */ - /* For now we keep all the modelling rule references and delete all others */ - UA_NodeId modellingRuleReferenceId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE); - deleteReferencesSubset(node, 1, &modellingRuleReferenceId); +/* MaxQueryContinuationPoints - ns=0;i=2736 */ - /* Add the node to the nodestore */ - UA_NodeId newNodeId; - retval = UA_Nodestore_insert(server, node, &newNodeId); - if(retval != UA_STATUSCODE_GOOD) { - UA_Nodestore_release(server, type); - return retval; - } +static UA_StatusCode function_namespace0_generated_105_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 5); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxQueryContinuationPoints"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2736), +UA_NODEID_NUMERIC(ns[0], 2268), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxQueryContinuationPoints"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Add all the children of this child to the new child node to make sure we take - * the values from the nearest inherited object first. - * The call to addNode_finish will then only add the children from the type and - * thus skip the direct children of rd->nodeId.nodeId */ - copyChildNodes(server, session, &rd->nodeId.nodeId, &newNodeId); +static UA_StatusCode function_namespace0_generated_105_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2736) +); +} - /* Add the parent reference */ - retval = AddNode_typeCheckAddRefs(server, session, &newNodeId, destinationNodeId, - &rd->referenceTypeId, typeId); - if(retval != UA_STATUSCODE_GOOD) { - UA_Nodestore_delete(server, node); - UA_Nodestore_release(server, type); - return retval; - } +/* ModellingRules - ns=0;i=2996 */ - /* Call addnode_finish, this recursively adds additional members, the type - * definition and so on of the base type of this child, if they are not yet - * in the destination */ - retval |= Operation_addNode_finish(server, session, &newNodeId); - UA_NodeId_deleteMembers(&newNodeId); - UA_Nodestore_release(server, type); - } - return retval; +static UA_StatusCode function_namespace0_generated_106_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ModellingRules"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 2996), +UA_NODEID_NUMERIC(ns[0], 2268), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "ModellingRules"), +UA_NODEID_NUMERIC(ns[0], 61), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; } -/* Copy any children of Node sourceNodeId to another node destinationNodeId. */ -static UA_StatusCode -copyChildNodes(UA_Server *server, UA_Session *session, - const UA_NodeId *sourceNodeId, const UA_NodeId *destinationNodeId) { - /* Browse to get all children of the source */ - UA_BrowseDescription bd; - UA_BrowseDescription_init(&bd); - bd.nodeId = *sourceNodeId; - bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES); - bd.includeSubtypes = true; - bd.browseDirection = UA_BROWSEDIRECTION_FORWARD; - bd.nodeClassMask = UA_NODECLASS_OBJECT | UA_NODECLASS_VARIABLE | UA_NODECLASS_METHOD; - bd.resultMask = UA_BROWSERESULTMASK_REFERENCETYPEID | UA_BROWSERESULTMASK_NODECLASS | - UA_BROWSERESULTMASK_BROWSENAME; +static UA_StatusCode function_namespace0_generated_106_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2996) +); +} - UA_BrowseResult br; - UA_BrowseResult_init(&br); - UA_UInt32 maxrefs = 0; - Operation_Browse(server, session, &maxrefs, &bd, &br); - if(br.statusCode != UA_STATUSCODE_GOOD) - return br.statusCode; +/* MaxHistoryContinuationPoints - ns=0;i=2737 */ - UA_StatusCode retval = UA_STATUSCODE_GOOD; - for(size_t i = 0; i < br.referencesSize; ++i) { - UA_ReferenceDescription *rd = &br.references[i]; - retval |= copyChildNode(server, session, destinationNodeId, rd); - } +static UA_StatusCode function_namespace0_generated_107_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 5); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxHistoryContinuationPoints"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2737), +UA_NODEID_NUMERIC(ns[0], 2268), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxHistoryContinuationPoints"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - UA_BrowseResult_deleteMembers(&br); - return retval; +static UA_StatusCode function_namespace0_generated_107_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2737) +); } -static UA_StatusCode -addChildren(UA_Server *server, UA_Session *session, - const UA_Node *node, const UA_Node *type) { - /* Get the hierarchy of the type and all its supertypes */ - UA_NodeId *hierarchy = NULL; - size_t hierarchySize = 0; - UA_StatusCode retval = getTypeHierarchy(&server->config.nodestore, &type->nodeId, - &hierarchy, &hierarchySize); - if(retval != UA_STATUSCODE_GOOD) - return retval; +/* ServerProfileArray - ns=0;i=2269 */ - /* Copy members of the type and supertypes (and instantiate them) */ - for(size_t i = 0; i < hierarchySize; ++i) - retval |= copyChildNodes(server, session, &hierarchy[i], &node->nodeId); - UA_Array_delete(hierarchy, hierarchySize, &UA_TYPES[UA_TYPES_NODEID]); - return retval; +static UA_StatusCode function_namespace0_generated_108_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +attr.valueRank = 1; +attr.arrayDimensionsSize = 1; +UA_UInt32 arrayDimensions[1]; +arrayDimensions[0] = 0; +attr.arrayDimensions = &arrayDimensions[0]; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +attr.displayName = UA_LOCALIZEDTEXT("", "ServerProfileArray"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2269), +UA_NODEID_NUMERIC(ns[0], 2268), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "ServerProfileArray"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -/* Calls the global destructor internally of the global constructor succeeds and - * the type-level constructor fails. */ -static UA_StatusCode callConstructors(UA_Server *server, UA_Session *session, - const UA_Node *node, const UA_Node *type) { - /* Get the node type constructor */ - const UA_NodeTypeLifecycle *lifecycle = NULL; - if(node->nodeClass == UA_NODECLASS_OBJECT) { - const UA_ObjectTypeNode *ot = (const UA_ObjectTypeNode*)type; - lifecycle = &ot->lifecycle; - } else if(node->nodeClass == UA_NODECLASS_VARIABLE) { - const UA_VariableTypeNode *vt = (const UA_VariableTypeNode*)type; - lifecycle = &vt->lifecycle; - } +static UA_StatusCode function_namespace0_generated_108_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2269) +); +} - /* Call the global constructor */ - void *context = node->context; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(server->config.nodeLifecycle.constructor) - retval = server->config.nodeLifecycle.constructor(server, &session->sessionId, - session->sessionHandle, - &node->nodeId, &context); +/* MaxBrowseContinuationPoints - ns=0;i=2735 */ - /* Call the type constructor */ - if(retval == UA_STATUSCODE_GOOD && lifecycle && lifecycle->constructor) - retval = lifecycle->constructor(server, &session->sessionId, - session->sessionHandle, &type->nodeId, - type->context, &node->nodeId, &context); +static UA_StatusCode function_namespace0_generated_109_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 5); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxBrowseContinuationPoints"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2735), +UA_NODEID_NUMERIC(ns[0], 2268), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxBrowseContinuationPoints"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Set the context *and* mark the node as constructed */ - if(retval == UA_STATUSCODE_GOOD) - retval = UA_Server_editNode(server, &server->adminSession, &node->nodeId, - (UA_EditNodeCallback)editNodeContext, - context); +static UA_StatusCode function_namespace0_generated_109_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2735) +); +} - /* Fail. Call the global destructor. */ - if(retval != UA_STATUSCODE_GOOD && server->config.nodeLifecycle.destructor) - server->config.nodeLifecycle.destructor(server, &session->sessionId, - session->sessionHandle, - &node->nodeId, context); +/* SoftwareCertificates - ns=0;i=3704 */ - return retval; +static UA_StatusCode function_namespace0_generated_110_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +attr.valueRank = 1; +attr.arrayDimensionsSize = 1; +UA_UInt32 arrayDimensions[1]; +arrayDimensions[0] = 0; +attr.arrayDimensions = &arrayDimensions[0]; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 344); +attr.displayName = UA_LOCALIZEDTEXT("", "SoftwareCertificates"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 3704), +UA_NODEID_NUMERIC(ns[0], 2268), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "SoftwareCertificates"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -static UA_StatusCode -addTypeDefRef(UA_Server *server, UA_Session *session, - const UA_Node *node, const UA_Node *type) { - UA_StatusCode retval = UA_STATUSCODE_GOOD; - UA_AddReferencesItem addref; - UA_AddReferencesItem_init(&addref); - addref.sourceNodeId = node->nodeId; - addref.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION); - addref.isForward = true; - addref.targetNodeId.nodeId = type->nodeId; - Operation_addReference(server, session, NULL, &addref, &retval); - return retval; +static UA_StatusCode function_namespace0_generated_110_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 3704) +); } -static UA_StatusCode -getTypeDef(UA_Server *server, const UA_Node *node, UA_NodeId **typeDefinitionId) { - UA_NodeId hasTypeDef = UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION); - for (size_t i=0; i< node->referencesSize; i++) { - if (node->references[i].isInverse == UA_FALSE && UA_NodeId_equal(&node->references[i].referenceTypeId, &hasTypeDef) && - node->references[i].targetIdsSize > 0) { - *typeDefinitionId = &node->references[i].targetIds[0].nodeId; - return UA_STATUSCODE_GOOD; - } - } +/* LocaleIdArray - ns=0;i=2271 */ - return UA_STATUSCODE_BADNOTFOUND; +static UA_StatusCode function_namespace0_generated_111_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +attr.valueRank = 1; +attr.arrayDimensionsSize = 1; +UA_UInt32 arrayDimensions[1]; +arrayDimensions[0] = 0; +attr.arrayDimensions = &arrayDimensions[0]; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 295); +attr.displayName = UA_LOCALIZEDTEXT("", "LocaleIdArray"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2271), +UA_NODEID_NUMERIC(ns[0], 2268), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "LocaleIdArray"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -static UA_StatusCode -addParentRef(UA_Server *server, UA_Session *session, - const UA_NodeId *nodeId, - const UA_NodeId *referenceTypeId, - const UA_NodeId *parentNodeId) { - UA_StatusCode retval = UA_STATUSCODE_GOOD; - UA_AddReferencesItem ref_item; - UA_AddReferencesItem_init(&ref_item); - ref_item.sourceNodeId = *nodeId; - ref_item.referenceTypeId = *referenceTypeId; - ref_item.isForward = false; - ref_item.targetNodeId.nodeId = *parentNodeId; - Operation_addReference(server, session, NULL, &ref_item, &retval); - return retval; +static UA_StatusCode function_namespace0_generated_111_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2271) +); } -/************/ -/* Add Node */ -/************/ +/* OperationLimits - ns=0;i=11704 */ -static void -removeDeconstructedNode(UA_Server *server, UA_Session *session, - const UA_Node *node, UA_Boolean removeTargetRefs); +static UA_StatusCode function_namespace0_generated_112_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "OperationLimits"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 11704), +UA_NODEID_NUMERIC(ns[0], 2268), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "OperationLimits"), +UA_NODEID_NUMERIC(ns[0], 11564), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; +} -static const UA_NodeId hasSubtype = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASSUBTYPE}}; +static UA_StatusCode function_namespace0_generated_112_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11704) +); +} -static UA_StatusCode -AddNode_typeCheckAddRefs(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId, - const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId, - const UA_NodeId *typeDefinitionId) { - /* Get the node */ - const UA_Node *node = UA_Nodestore_get(server, nodeId); - if(!node) - return UA_STATUSCODE_BADNODEIDUNKNOWN; +/* MaxNodesPerRegisterNodes - ns=0;i=11711 */ - UA_StatusCode retval = UA_STATUSCODE_GOOD; - const UA_Node *type = NULL; +static UA_StatusCode function_namespace0_generated_113_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRegisterNodes"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11711), +UA_NODEID_NUMERIC(ns[0], 11704), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerRegisterNodes"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Use the typeDefinition as parent for type-nodes */ - if(node->nodeClass == UA_NODECLASS_VARIABLETYPE || - node->nodeClass == UA_NODECLASS_OBJECTTYPE || - node->nodeClass == UA_NODECLASS_REFERENCETYPE || - node->nodeClass == UA_NODECLASS_DATATYPE) { - if(UA_NodeId_equal(referenceTypeId, &UA_NODEID_NULL)) - referenceTypeId = &hasSubtype; - const UA_Node *parentNode = UA_Nodestore_get(server, parentNodeId); - if(parentNode) { - if(parentNode->nodeClass == node->nodeClass) - typeDefinitionId = parentNodeId; - UA_Nodestore_release(server, parentNode); - } - } +static UA_StatusCode function_namespace0_generated_113_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11711) +); +} - if(server->bootstrapNS0) - goto get_type; +/* MaxNodesPerTranslateBrowsePathsToNodeIds - ns=0;i=11712 */ - /* Check parent reference. Objects may have no parent. */ - retval = checkParentReference(server, session, node->nodeClass, - parentNodeId, referenceTypeId); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: The parent reference is invalid"); - goto cleanup; - } +static UA_StatusCode function_namespace0_generated_114_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerTranslateBrowsePathsToNodeIds"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11712), +UA_NODEID_NUMERIC(ns[0], 11704), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerTranslateBrowsePathsToNodeIds"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Replace empty typeDefinition with the most permissive default */ - if((node->nodeClass == UA_NODECLASS_VARIABLE || - node->nodeClass == UA_NODECLASS_OBJECT) && - UA_NodeId_isNull(typeDefinitionId)) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: No TypeDefinition; Use the default " - "TypeDefinition for the Variable/Object"); - if(node->nodeClass == UA_NODECLASS_VARIABLE) - typeDefinitionId = &baseDataVariableType; - else - typeDefinitionId = &baseObjectType; - } +static UA_StatusCode function_namespace0_generated_114_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11712) +); +} - get_type: - /* Get the node type. There must be a typedefinition for variables, objects - * and type-nodes. See the above checks. */ - if(!UA_NodeId_isNull(typeDefinitionId)) { - /* Get the type node */ - type = UA_Nodestore_get(server, typeDefinitionId); - if(!type) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Node type not found in nodestore"); - retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; - goto cleanup; - } +/* MaxNodesPerRead - ns=0;i=11705 */ - UA_Boolean typeOk = UA_FALSE; - switch(node->nodeClass) { - case UA_NODECLASS_DATATYPE: - typeOk = type->nodeClass == UA_NODECLASS_DATATYPE; - break; - case UA_NODECLASS_METHOD: - typeOk = type->nodeClass == UA_NODECLASS_METHOD; - break; - case UA_NODECLASS_OBJECT: - typeOk = type->nodeClass == UA_NODECLASS_OBJECTTYPE; - break; - case UA_NODECLASS_OBJECTTYPE: - typeOk = type->nodeClass == UA_NODECLASS_OBJECTTYPE; - break; - case UA_NODECLASS_REFERENCETYPE: - typeOk = type->nodeClass == UA_NODECLASS_REFERENCETYPE; - break; - case UA_NODECLASS_VARIABLE: - typeOk = type->nodeClass == UA_NODECLASS_VARIABLETYPE; - break; - case UA_NODECLASS_VARIABLETYPE: - typeOk = type->nodeClass == UA_NODECLASS_VARIABLETYPE; - break; - case UA_NODECLASS_VIEW: - typeOk = type->nodeClass == UA_NODECLASS_VIEW; - break; - default: - typeOk = UA_FALSE; - } - if(!typeOk) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Type does not match node class"); - retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; - goto cleanup; - } +static UA_StatusCode function_namespace0_generated_115_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerRead"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11705), +UA_NODEID_NUMERIC(ns[0], 11704), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerRead"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* See if the type has the correct node class. For type-nodes, we know - * that type has the same nodeClass from checkParentReference. */ - if(!server->bootstrapNS0 && node->nodeClass == UA_NODECLASS_VARIABLE) { - if(((const UA_VariableTypeNode*)type)->isAbstract) { - /* Abstract variable is allowed if parent is a children of a base data variable */ - const UA_NodeId variableTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE); - /* A variable may be of an object type which again is below BaseObjectType */ - const UA_NodeId objectTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE); - // TODO handle subtypes of parent reference types - if(!isNodeInTree(&server->config.nodestore, parentNodeId, &variableTypes, - parentReferences, UA_PARENT_REFERENCES_COUNT) && - !isNodeInTree(&server->config.nodestore, parentNodeId, &objectTypes, - parentReferences, UA_PARENT_REFERENCES_COUNT)) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Type of variable node must " - "be VariableType and not cannot be abstract"); - retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; - goto cleanup; - } - } - } +static UA_StatusCode function_namespace0_generated_115_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11705) +); +} - if(!server->bootstrapNS0 && node->nodeClass == UA_NODECLASS_OBJECT) { - if(((const UA_ObjectTypeNode*)type)->isAbstract) { - /* Object node created of an abstract ObjectType. Only allowed - * if within BaseObjectType folder */ - const UA_NodeId objectTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE); - // TODO handle subtypes of parent reference types - if(!isNodeInTree(&server->config.nodestore, parentNodeId, &objectTypes, - parentReferences, UA_PARENT_REFERENCES_COUNT)) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Type of object node must " - "be ObjectType and not be abstract"); - retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; - goto cleanup; - } - } - } - } +/* MaxNodesPerBrowse - ns=0;i=11710 */ - /* Check if all attributes hold the constraints of the type now. The initial - * attributes must type-check. The constructor might change the attributes - * again. Then, the changes are type-checked by the normal write service. */ - if(type && (node->nodeClass == UA_NODECLASS_VARIABLE || - node->nodeClass == UA_NODECLASS_VARIABLETYPE)) { - retval = typeCheckVariableNode(server, session, (const UA_VariableNode*)node, - (const UA_VariableTypeNode*)type, parentNodeId); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Type-checking the variable node " - "failed with error code %s", UA_StatusCode_name(retval)); - goto cleanup; - } - } +static UA_StatusCode function_namespace0_generated_116_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerBrowse"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11710), +UA_NODEID_NUMERIC(ns[0], 11704), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerBrowse"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Add reference to the parent */ - if(!UA_NodeId_isNull(parentNodeId)) { - if(UA_NodeId_isNull(referenceTypeId)) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Reference to parent cannot be null"); - retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; - goto cleanup; - } +static UA_StatusCode function_namespace0_generated_116_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11710) +); +} - retval = addParentRef(server, session, &node->nodeId, referenceTypeId, parentNodeId); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Adding reference to parent failed"); - goto cleanup; - } - } +/* MaxNodesPerWrite - ns=0;i=11707 */ - /* Add a hasTypeDefinition reference */ - if(node->nodeClass == UA_NODECLASS_VARIABLE || - node->nodeClass == UA_NODECLASS_OBJECT) { - UA_assert(type != NULL); /* see above */ - retval = addTypeDefRef(server, session, node, type); - if(retval != UA_STATUSCODE_GOOD) - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Adding a reference to the type " - "definition failed with error code %s", - UA_StatusCode_name(retval)); - } +static UA_StatusCode function_namespace0_generated_117_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerWrite"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11707), +UA_NODEID_NUMERIC(ns[0], 11704), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerWrite"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - cleanup: - UA_Nodestore_release(server, node); - if(type) - UA_Nodestore_release(server, type); - if(retval != UA_STATUSCODE_GOOD) - UA_Server_deleteNode(server, *nodeId, UA_TRUE); - return retval; +static UA_StatusCode function_namespace0_generated_117_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11707) +); } -/* Create the node and add it to the nodestore. But don't typecheck and add - * references so far */ -static UA_StatusCode -AddNode_raw(UA_Server *server, UA_Session *session, void *nodeContext, - const UA_AddNodesItem *item, UA_NodeId *outNewNodeId) { - UA_assert(outNewNodeId); +/* MaxNodesPerMethodCall - ns=0;i=11709 */ - /* Do not check access for server */ - if(session != &server->adminSession && server->config.accessControl.allowAddNode && - !server->config.accessControl.allowAddNode(server, &server->config.accessControl, - &session->sessionId, session->sessionHandle, item)) { - return UA_STATUSCODE_BADUSERACCESSDENIED; - } +static UA_StatusCode function_namespace0_generated_118_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerMethodCall"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11709), +UA_NODEID_NUMERIC(ns[0], 11704), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerMethodCall"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Check the namespaceindex */ - if(item->requestedNewNodeId.nodeId.namespaceIndex >= server->namespacesSize) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Namespace invalid"); - return UA_STATUSCODE_BADNODEIDINVALID; - } +static UA_StatusCode function_namespace0_generated_118_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11709) +); +} - if(item->nodeAttributes.encoding != UA_EXTENSIONOBJECT_DECODED && - item->nodeAttributes.encoding != UA_EXTENSIONOBJECT_DECODED_NODELETE) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Node attributes invalid"); - return UA_STATUSCODE_BADINTERNALERROR; - } +/* MaxMonitoredItemsPerCall - ns=0;i=11714 */ - /* Create a node */ - UA_Node *node = UA_Nodestore_new(server, item->nodeClass); - if(!node) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Node could not create a node " - "in the nodestore"); - return UA_STATUSCODE_BADOUTOFMEMORY; - } +static UA_StatusCode function_namespace0_generated_119_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxMonitoredItemsPerCall"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11714), +UA_NODEID_NUMERIC(ns[0], 11704), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxMonitoredItemsPerCall"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Fill the node attributes */ - node->context = nodeContext; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - retval |= UA_NodeId_copy(&item->requestedNewNodeId.nodeId, &node->nodeId); - retval |= UA_QualifiedName_copy(&item->browseName, &node->browseName); - retval |= UA_Node_setAttributes(node, item->nodeAttributes.content.decoded.data, - item->nodeAttributes.content.decoded.type); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Node could not create a node " - "with error code %s", UA_StatusCode_name(retval)); - UA_Nodestore_delete(server, node); - return retval; - } +static UA_StatusCode function_namespace0_generated_119_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11714) +); +} - /* Use attributes from the typedefinition */ - if(!server->bootstrapNS0 && - (node->nodeClass == UA_NODECLASS_VARIABLE || - node->nodeClass == UA_NODECLASS_VARIABLETYPE)) { - /* Use attributes from the type. The value and value constraints are the - * same for the variable and variabletype attribute structs. */ - retval = useVariableTypeAttributes(server, session, - (UA_VariableNode*)node, item); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Using attributes from the variable type " - "failed with error code %s", UA_StatusCode_name(retval)); - UA_Nodestore_delete(server, node); - return retval; - } - } +/* MaxNodesPerNodeManagement - ns=0;i=11713 */ - /* Add the node to the nodestore */ - retval = UA_Nodestore_insert(server, node, outNewNodeId); - if(retval != UA_STATUSCODE_GOOD) - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Node could not add the new node " - "to the nodestore with error code %s", - UA_StatusCode_name(retval)); - return retval; +static UA_StatusCode function_namespace0_generated_120_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "MaxNodesPerNodeManagement"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11713), +UA_NODEID_NUMERIC(ns[0], 11704), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "MaxNodesPerNodeManagement"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -/* Prepare the node, then add it to the nodestore */ -UA_StatusCode -Operation_addNode_begin(UA_Server *server, UA_Session *session, void *nodeContext, - const UA_AddNodesItem *item, const UA_NodeId *parentNodeId, - const UA_NodeId *referenceTypeId, UA_NodeId *outNewNodeId) { - /* Create a temporary NodeId if none is returned */ - UA_NodeId newId; - if(!outNewNodeId) { - UA_NodeId_init(&newId); - outNewNodeId = &newId; - } +static UA_StatusCode function_namespace0_generated_120_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11713) +); +} - /* Create the node and add it to the nodestore */ - UA_StatusCode retval = AddNode_raw(server, session, nodeContext, item, outNewNodeId); - if(retval != UA_STATUSCODE_GOOD) - return retval; +/* ServerArray - ns=0;i=2254 */ - /* Typecheck and add references to parent and type definition */ - retval = AddNode_typeCheckAddRefs(server, session, outNewNodeId, parentNodeId, - referenceTypeId, &item->typeDefinition.nodeId); - if(outNewNodeId == &newId) - UA_NodeId_deleteMembers(&newId); - return retval; +static UA_StatusCode function_namespace0_generated_121_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 1000.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +attr.valueRank = 1; +attr.arrayDimensionsSize = 1; +UA_UInt32 arrayDimensions[1]; +arrayDimensions[0] = 0; +attr.arrayDimensions = &arrayDimensions[0]; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +attr.displayName = UA_LOCALIZEDTEXT("", "ServerArray"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2254), +UA_NODEID_NUMERIC(ns[0], 2253), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "ServerArray"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -/* Children, references, type-checking, constructors. */ -UA_StatusCode -Operation_addNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId) { - UA_StatusCode retval = UA_STATUSCODE_GOOD; - - /* Get the node */ - const UA_Node *node = UA_Nodestore_get(server, nodeId); - if(!node) - return UA_STATUSCODE_BADNODEIDUNKNOWN; +static UA_StatusCode function_namespace0_generated_121_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2254) +); +} - const UA_Node *type = NULL; +/* ServerRedundancy - ns=0;i=2296 */ - /* Instantiate variables and objects */ - if(node->nodeClass == UA_NODECLASS_VARIABLE || - node->nodeClass == UA_NODECLASS_OBJECT) { - UA_NodeId *typeDefId; - retval = getTypeDef(server, node, &typeDefId); - if (retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Can not get type definition of node since it " - "has no 'hasTypeDef' reference"); - goto cleanup; - } +static UA_StatusCode function_namespace0_generated_122_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ServerRedundancy"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 2296), +UA_NODEID_NUMERIC(ns[0], 2253), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "ServerRedundancy"), +UA_NODEID_NUMERIC(ns[0], 2034), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; +} - /* Get the type node */ - type = UA_Nodestore_get(server, typeDefId); - if(!type) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Node type not found in nodestore"); - retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID; - goto cleanup; - } +static UA_StatusCode function_namespace0_generated_122_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2296) +); +} - /* Add (mandatory) child nodes from the type definition */ - if(!server->bootstrapNS0) { - retval = addChildren(server, session, node, type); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Adding child nodes failed with error code %s", - UA_StatusCode_name(retval)); - goto cleanup; - } - } - } +/* RedundancySupport - ns=0;i=3709 */ - /* Call the constructor(s) */ - retval = callConstructors(server, session, node, type); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "AddNodes: Calling the node constructor(s) failed " - "with status code %s", UA_StatusCode_name(retval)); - } +static UA_StatusCode function_namespace0_generated_123_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 851); +attr.displayName = UA_LOCALIZEDTEXT("", "RedundancySupport"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 3709), +UA_NODEID_NUMERIC(ns[0], 2296), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "RedundancySupport"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - cleanup: - if(type) - UA_Nodestore_release(server, type); - if(retval != UA_STATUSCODE_GOOD) - removeDeconstructedNode(server, session, node, true); - UA_Nodestore_release(server, node); - return retval; +static UA_StatusCode function_namespace0_generated_123_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 3709) +); } -static void -Operation_addNode(UA_Server *server, UA_Session *session, void *nodeContext, - const UA_AddNodesItem *item, UA_AddNodesResult *result) { - result->statusCode = - Operation_addNode_begin(server, session, nodeContext, item, &item->parentNodeId.nodeId, - &item->referenceTypeId, &result->addedNodeId); - if(result->statusCode != UA_STATUSCODE_GOOD) - return; +/* ServerStatus - ns=0;i=2256 */ - /* AddNodes_finish */ - result->statusCode = - Operation_addNode_finish(server, session, &result->addedNodeId); +static UA_StatusCode function_namespace0_generated_124_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 1000.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 862); +attr.displayName = UA_LOCALIZEDTEXT("", "ServerStatus"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2256), +UA_NODEID_NUMERIC(ns[0], 2253), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "ServerStatus"), +UA_NODEID_NUMERIC(ns[0], 2138), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* If finishing failed, the node was deleted */ - if(result->statusCode != UA_STATUSCODE_GOOD) - UA_NodeId_deleteMembers(&result->addedNodeId); +static UA_StatusCode function_namespace0_generated_124_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2256) +); } -void -Service_AddNodes(UA_Server *server, UA_Session *session, - const UA_AddNodesRequest *request, - UA_AddNodesResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, "Processing AddNodesRequest"); +/* StartTime - ns=0;i=2257 */ - if(server->config.maxNodesPerNodeManagement != 0 && - request->nodesToAddSize > server->config.maxNodesPerNodeManagement) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; - } +static UA_StatusCode function_namespace0_generated_125_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 294); +attr.displayName = UA_LOCALIZEDTEXT("", "StartTime"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2257), +UA_NODEID_NUMERIC(ns[0], 2256), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "StartTime"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_addNode, NULL, - &request->nodesToAddSize, &UA_TYPES[UA_TYPES_ADDNODESITEM], - &response->resultsSize, &UA_TYPES[UA_TYPES_ADDNODESRESULT]); +static UA_StatusCode function_namespace0_generated_125_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2257) +); } -UA_StatusCode -__UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass, - const UA_NodeId *requestedNewNodeId, - const UA_NodeId *parentNodeId, - const UA_NodeId *referenceTypeId, - const UA_QualifiedName browseName, - const UA_NodeId *typeDefinition, - const UA_NodeAttributes *attr, - const UA_DataType *attributeType, - void *nodeContext, UA_NodeId *outNewNodeId) { - /* Create the AddNodesItem */ - UA_AddNodesItem item; - UA_AddNodesItem_init(&item); - item.nodeClass = nodeClass; - item.requestedNewNodeId.nodeId = *requestedNewNodeId; - item.browseName = browseName; - item.parentNodeId.nodeId = *parentNodeId; - item.referenceTypeId = *referenceTypeId; - item.typeDefinition.nodeId = *typeDefinition; - item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; - item.nodeAttributes.content.decoded.type = attributeType; - item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)attr; +/* SecondsTillShutdown - ns=0;i=2992 */ - /* Call the normal addnodes service */ - UA_AddNodesResult result; - UA_AddNodesResult_init(&result); - Operation_addNode(server, &server->adminSession, nodeContext, &item, &result); - if(outNewNodeId) - *outNewNodeId = result.addedNodeId; - else - UA_NodeId_deleteMembers(&result.addedNodeId); - return result.statusCode; +static UA_StatusCode function_namespace0_generated_126_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 7); +attr.displayName = UA_LOCALIZEDTEXT("", "SecondsTillShutdown"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2992), +UA_NODEID_NUMERIC(ns[0], 2256), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "SecondsTillShutdown"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -UA_StatusCode -UA_Server_addNode_begin(UA_Server *server, const UA_NodeClass nodeClass, - const UA_NodeId requestedNewNodeId, - const UA_NodeId parentNodeId, - const UA_NodeId referenceTypeId, - const UA_QualifiedName browseName, - const UA_NodeId typeDefinition, - const void *attr, const UA_DataType *attributeType, - void *nodeContext, UA_NodeId *outNewNodeId) { - UA_AddNodesItem item; - UA_AddNodesItem_init(&item); - item.nodeClass = nodeClass; - item.requestedNewNodeId.nodeId = requestedNewNodeId; - item.browseName = browseName; - item.typeDefinition.nodeId = typeDefinition; - item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; - item.nodeAttributes.content.decoded.type = attributeType; - item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)attr; - return Operation_addNode_begin(server, &server->adminSession, nodeContext, &item, - &parentNodeId, &referenceTypeId, outNewNodeId); +static UA_StatusCode function_namespace0_generated_126_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2992) +); } -UA_StatusCode -UA_Server_addNode_finish(UA_Server *server, const UA_NodeId nodeId) { - return Operation_addNode_finish(server, &server->adminSession, &nodeId); +/* BuildInfo - ns=0;i=2260 */ + +static UA_StatusCode function_namespace0_generated_127_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 338); +attr.displayName = UA_LOCALIZEDTEXT("", "BuildInfo"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2260), +UA_NODEID_NUMERIC(ns[0], 2256), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "BuildInfo"), +UA_NODEID_NUMERIC(ns[0], 3051), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -/****************/ -/* Delete Nodes */ -/****************/ +static UA_StatusCode function_namespace0_generated_127_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2260) +); +} -static void -Operation_deleteReference(UA_Server *server, UA_Session *session, void *context, - const UA_DeleteReferencesItem *item, UA_StatusCode *retval); +/* ProductUri - ns=0;i=2262 */ -/* Remove references to this node (in the other nodes) */ -static void -removeIncomingReferences(UA_Server *server, UA_Session *session, - const UA_Node *node) { - UA_DeleteReferencesItem item; - UA_DeleteReferencesItem_init(&item); - item.targetNodeId.nodeId = node->nodeId; - item.deleteBidirectional = false; - UA_StatusCode dummy; - for(size_t i = 0; i < node->referencesSize; ++i) { - UA_NodeReferenceKind *refs = &node->references[i]; - item.isForward = refs->isInverse; - item.referenceTypeId = refs->referenceTypeId; - for(size_t j = 0; j < refs->targetIdsSize; ++j) { - item.sourceNodeId = refs->targetIds[j].nodeId; - Operation_deleteReference(server, session, NULL, &item, &dummy); - } - } +static UA_StatusCode function_namespace0_generated_128_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 1000.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +attr.displayName = UA_LOCALIZEDTEXT("", "ProductUri"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2262), +UA_NODEID_NUMERIC(ns[0], 2260), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "ProductUri"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -static void -deconstructNode(UA_Server *server, UA_Session *session, - const UA_Node *node) { - /* Call the type-level destructor */ - void *context = node->context; /* No longer needed after this function */ - if(node->nodeClass == UA_NODECLASS_OBJECT || - node->nodeClass == UA_NODECLASS_VARIABLE) { - const UA_Node *type = getNodeType(server, node); - if(type) { - const UA_NodeTypeLifecycle *lifecycle; - if(node->nodeClass == UA_NODECLASS_OBJECT) - lifecycle = &((const UA_ObjectTypeNode*)type)->lifecycle; - else - lifecycle = &((const UA_VariableTypeNode*)type)->lifecycle; - if(lifecycle->destructor) - lifecycle->destructor(server, - &session->sessionId, session->sessionHandle, - &type->nodeId, type->context, - &node->nodeId, &context); - UA_Nodestore_release(server, type); - } - } +static UA_StatusCode function_namespace0_generated_128_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2262) +); +} - /* Call the global destructor */ - if(server->config.nodeLifecycle.destructor) - server->config.nodeLifecycle.destructor(server, &session->sessionId, - session->sessionHandle, - &node->nodeId, context); +/* BuildDate - ns=0;i=2266 */ + +static UA_StatusCode function_namespace0_generated_129_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 1000.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 294); +attr.displayName = UA_LOCALIZEDTEXT("", "BuildDate"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2266), +UA_NODEID_NUMERIC(ns[0], 2260), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "BuildDate"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -static void -deleteNodeOperation(UA_Server *server, UA_Session *session, void *context, - const UA_DeleteNodesItem *item, UA_StatusCode *result); +static UA_StatusCode function_namespace0_generated_129_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2266) +); +} -static void -removeChildren(UA_Server *server, UA_Session *session, - const UA_Node *node) { - /* Browse to get all children of the node */ - UA_BrowseDescription bd; - UA_BrowseDescription_init(&bd); - bd.nodeId = node->nodeId; - bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_AGGREGATES); - bd.includeSubtypes = true; - bd.browseDirection = UA_BROWSEDIRECTION_FORWARD; - bd.nodeClassMask = UA_NODECLASS_OBJECT | UA_NODECLASS_VARIABLE | UA_NODECLASS_METHOD; - bd.resultMask = UA_BROWSERESULTMASK_NONE; +/* SoftwareVersion - ns=0;i=2264 */ - UA_BrowseResult br; - UA_BrowseResult_init(&br); - UA_UInt32 maxrefs = 0; - Operation_Browse(server, session, &maxrefs, &bd, &br); - if(br.statusCode != UA_STATUSCODE_GOOD) - return; +static UA_StatusCode function_namespace0_generated_130_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 1000.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +attr.displayName = UA_LOCALIZEDTEXT("", "SoftwareVersion"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2264), +UA_NODEID_NUMERIC(ns[0], 2260), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "SoftwareVersion"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - UA_DeleteNodesItem item; - item.deleteTargetReferences = true; +static UA_StatusCode function_namespace0_generated_130_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2264) +); +} - /* Remove every child */ - for(size_t i = 0; i < br.referencesSize; ++i) { - UA_ReferenceDescription *rd = &br.references[i]; - // check for self-reference to avoid endless loop - if(UA_NodeId_equal(&node->nodeId, &rd->nodeId.nodeId)) - continue; - item.nodeId = rd->nodeId.nodeId; - UA_StatusCode retval; - deleteNodeOperation(server, session, NULL, &item, &retval); - } +/* ManufacturerName - ns=0;i=2263 */ - UA_BrowseResult_deleteMembers(&br); +static UA_StatusCode function_namespace0_generated_131_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 1000.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +attr.displayName = UA_LOCALIZEDTEXT("", "ManufacturerName"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2263), +UA_NODEID_NUMERIC(ns[0], 2260), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "ManufacturerName"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -static void -removeDeconstructedNode(UA_Server *server, UA_Session *session, - const UA_Node *node, UA_Boolean removeTargetRefs) { - /* Remove all children of the node */ - removeChildren(server, session, node); +static UA_StatusCode function_namespace0_generated_131_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2263) +); +} - /* Remove references to the node (not the references going out, as the node - * will be deleted anyway) */ - if(removeTargetRefs) - removeIncomingReferences(server, session, node); +/* ProductName - ns=0;i=2261 */ - /* Remove the node in the nodestore */ - UA_Nodestore_remove(server, &node->nodeId); +static UA_StatusCode function_namespace0_generated_132_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 1000.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +attr.displayName = UA_LOCALIZEDTEXT("", "ProductName"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2261), +UA_NODEID_NUMERIC(ns[0], 2260), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "ProductName"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -static void -deleteNodeOperation(UA_Server *server, UA_Session *session, void *context, - const UA_DeleteNodesItem *item, UA_StatusCode *result) { - /* Do not check access for server */ - if(session != &server->adminSession && server->config.accessControl.allowDeleteNode && - !server->config.accessControl.allowDeleteNode(server, &server->config.accessControl, - &session->sessionId, session->sessionHandle, item)) { - *result = UA_STATUSCODE_BADUSERACCESSDENIED; - return; - } +static UA_StatusCode function_namespace0_generated_132_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2261) +); +} - const UA_Node *node = UA_Nodestore_get(server, &item->nodeId); - if(!node) { - *result = UA_STATUSCODE_BADNODEIDUNKNOWN; - return; - } +/* BuildNumber - ns=0;i=2265 */ + +static UA_StatusCode function_namespace0_generated_133_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 1000.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +attr.displayName = UA_LOCALIZEDTEXT("", "BuildNumber"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2265), +UA_NODEID_NUMERIC(ns[0], 2260), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "BuildNumber"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - if(UA_Node_hasSubTypeOrInstances(node)) { - UA_LOG_INFO_SESSION(server->config.logger, session, - "Delete Nodes: Cannot delete a type node " - "with active instances or subtypes"); - UA_Nodestore_release(server, node); - *result = UA_STATUSCODE_BADINTERNALERROR; - return; - } +static UA_StatusCode function_namespace0_generated_133_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2265) +); +} - /* TODO: Check if the information model consistency is violated */ - /* TODO: Check if the node is a mandatory child of a parent */ +/* CurrentTime - ns=0;i=2258 */ - deconstructNode(server, session, node); - removeDeconstructedNode(server, session, node, item->deleteTargetReferences); - UA_Nodestore_release(server, node); +static UA_StatusCode function_namespace0_generated_134_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 294); +attr.displayName = UA_LOCALIZEDTEXT("", "CurrentTime"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2258), +UA_NODEID_NUMERIC(ns[0], 2256), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "CurrentTime"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -void Service_DeleteNodes(UA_Server *server, UA_Session *session, - const UA_DeleteNodesRequest *request, - UA_DeleteNodesResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing DeleteNodesRequest"); +static UA_StatusCode function_namespace0_generated_134_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2258) +); +} - if(server->config.maxNodesPerNodeManagement != 0 && - request->nodesToDeleteSize > server->config.maxNodesPerNodeManagement) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; - } +/* State - ns=0;i=2259 */ - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)deleteNodeOperation, NULL, - &request->nodesToDeleteSize, &UA_TYPES[UA_TYPES_DELETENODESITEM], - &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +static UA_StatusCode function_namespace0_generated_135_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 852); +attr.displayName = UA_LOCALIZEDTEXT("", "State"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2259), +UA_NODEID_NUMERIC(ns[0], 2256), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "State"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -UA_StatusCode -UA_Server_deleteNode(UA_Server *server, const UA_NodeId nodeId, - UA_Boolean deleteReferences) { - UA_DeleteNodesItem item; - item.deleteTargetReferences = deleteReferences; - item.nodeId = nodeId; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - deleteNodeOperation(server, &server->adminSession, NULL, &item, &retval); - return retval; +static UA_StatusCode function_namespace0_generated_135_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2259) +); } -/******************/ -/* Add References */ -/******************/ +/* ShutdownReason - ns=0;i=2993 */ -static UA_StatusCode -addOneWayReference(UA_Server *server, UA_Session *session, - UA_Node *node, const UA_AddReferencesItem *item) { - return UA_Node_addReference(node, item); +static UA_StatusCode function_namespace0_generated_136_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 21); +attr.displayName = UA_LOCALIZEDTEXT("", "ShutdownReason"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2993), +UA_NODEID_NUMERIC(ns[0], 2256), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "ShutdownReason"), +UA_NODEID_NUMERIC(ns[0], 63), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -static UA_StatusCode -deleteOneWayReference(UA_Server *server, UA_Session *session, UA_Node *node, - const UA_DeleteReferencesItem *item) { - return UA_Node_deleteReference(node, item); +static UA_StatusCode function_namespace0_generated_136_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2993) +); } -static void -Operation_addReference(UA_Server *server, UA_Session *session, void *context, - const UA_AddReferencesItem *item, UA_StatusCode *retval) { - /* Do not check access for server */ - if(session != &server->adminSession && server->config.accessControl.allowAddReference && - !server->config.accessControl.allowAddReference(server, &server->config.accessControl, - &session->sessionId, session->sessionHandle, item)) { - *retval = UA_STATUSCODE_BADUSERACCESSDENIED; - return; - } +/* ServiceLevel - ns=0;i=2267 */ - /* Currently no expandednodeids are allowed */ - if(item->targetServerUri.length > 0) { - *retval = UA_STATUSCODE_BADNOTIMPLEMENTED; - return; - } +static UA_StatusCode function_namespace0_generated_137_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 1000.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 3); +attr.displayName = UA_LOCALIZEDTEXT("", "ServiceLevel"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2267), +UA_NODEID_NUMERIC(ns[0], 2253), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "ServiceLevel"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Add the first direction */ - *retval = UA_Server_editNode(server, session, &item->sourceNodeId, - (UA_EditNodeCallback)addOneWayReference, - /* cast away const because callback uses const anyway */ - (UA_AddReferencesItem *)(uintptr_t)item); - UA_Boolean firstExisted = UA_FALSE; - if(*retval == UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED) { - *retval = UA_STATUSCODE_GOOD; - firstExisted = UA_TRUE; - } else if(*retval != UA_STATUSCODE_GOOD) - return; +static UA_StatusCode function_namespace0_generated_137_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2267) +); +} - /* Add the second direction */ - UA_AddReferencesItem secondItem; - UA_AddReferencesItem_init(&secondItem); - secondItem.sourceNodeId = item->targetNodeId.nodeId; - secondItem.referenceTypeId = item->referenceTypeId; - secondItem.isForward = !item->isForward; - secondItem.targetNodeId.nodeId = item->sourceNodeId; - /* keep default secondItem.targetNodeClass = UA_NODECLASS_UNSPECIFIED */ - *retval = UA_Server_editNode(server, session, &secondItem.sourceNodeId, - (UA_EditNodeCallback)addOneWayReference, &secondItem); +/* VendorServerInfo - ns=0;i=2295 */ - /* remove reference if the second direction failed */ - UA_Boolean secondExisted = UA_FALSE; - if(*retval == UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED) { - *retval = UA_STATUSCODE_GOOD; - secondExisted = UA_TRUE; - } else if(*retval != UA_STATUSCODE_GOOD && !firstExisted) { - UA_DeleteReferencesItem deleteItem; - deleteItem.sourceNodeId = item->sourceNodeId; - deleteItem.referenceTypeId = item->referenceTypeId; - deleteItem.isForward = item->isForward; - deleteItem.targetNodeId = item->targetNodeId; - deleteItem.deleteBidirectional = false; - /* ignore returned status code */ - UA_Server_editNode(server, session, &item->sourceNodeId, - (UA_EditNodeCallback)deleteOneWayReference, &deleteItem); - } +static UA_StatusCode function_namespace0_generated_138_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "VendorServerInfo"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 2295), +UA_NODEID_NUMERIC(ns[0], 2253), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "VendorServerInfo"), +UA_NODEID_NUMERIC(ns[0], 2033), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; +} - /* Calculate common duplicate reference not allowed result and set bad result - * if BOTH directions already existed */ - if(firstExisted && secondExisted) - *retval = UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED; +static UA_StatusCode function_namespace0_generated_138_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2295) +); } -void Service_AddReferences(UA_Server *server, UA_Session *session, - const UA_AddReferencesRequest *request, - UA_AddReferencesResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing AddReferencesRequest"); +/* GetMonitoredItems - ns=0;i=11492 */ - if(server->config.maxNodesPerNodeManagement != 0 && - request->referencesToAddSize > server->config.maxNodesPerNodeManagement) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; - } +static UA_StatusCode function_namespace0_generated_139_begin(UA_Server *server, UA_UInt16* ns) { +#ifdef UA_ENABLE_METHODCALLS +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_MethodAttributes attr = UA_MethodAttributes_default; +attr.executable = true; +attr.userExecutable = true; +attr.displayName = UA_LOCALIZEDTEXT("", "GetMonitoredItems"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_METHOD, +UA_NODEID_NUMERIC(ns[0], 11492), +UA_NODEID_NUMERIC(ns[0], 2253), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "GetMonitoredItems"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_METHODATTRIBUTES],NULL, NULL); +return retVal; +#else +return UA_STATUSCODE_GOOD; +#endif /* UA_ENABLE_METHODCALLS */ +} - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_addReference, NULL, - &request->referencesToAddSize, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM], - &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +static UA_StatusCode function_namespace0_generated_139_finish(UA_Server *server, UA_UInt16* ns) { +#ifdef UA_ENABLE_METHODCALLS +return UA_Server_addMethodNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11492) +, NULL, 0, NULL, 0, NULL); +#else +return UA_STATUSCODE_GOOD; +#endif /* UA_ENABLE_METHODCALLS */ } -UA_StatusCode -UA_Server_addReference(UA_Server *server, const UA_NodeId sourceId, - const UA_NodeId refTypeId, - const UA_ExpandedNodeId targetId, - UA_Boolean isForward) { - UA_AddReferencesItem item; - UA_AddReferencesItem_init(&item); - item.sourceNodeId = sourceId; - item.referenceTypeId = refTypeId; - item.isForward = isForward; - item.targetNodeId = targetId; +/* InputArguments - ns=0;i=11493 */ - UA_StatusCode retval = UA_STATUSCODE_GOOD; - Operation_addReference(server, &server->adminSession, NULL, &item, &retval); - return retval; +static UA_StatusCode function_namespace0_generated_140_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +attr.valueRank = 1; +attr.arrayDimensionsSize = 1; +UA_UInt32 arrayDimensions[1]; +arrayDimensions[0] = 0; +attr.arrayDimensions = &arrayDimensions[0]; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 296); +UA_Argument variablenode_ns_0_i_11493_variant_DataContents[1]; + +UA_init(&variablenode_ns_0_i_11493_variant_DataContents[0], &UA_TYPES[UA_TYPES_ARGUMENT]); +variablenode_ns_0_i_11493_variant_DataContents[0].name = UA_STRING("SubscriptionId"); +variablenode_ns_0_i_11493_variant_DataContents[0].dataType = UA_NODEID_NUMERIC(ns[0], 7); +variablenode_ns_0_i_11493_variant_DataContents[0].valueRank = (UA_Int32) -1; +UA_Variant_setArray(&attr.value, &variablenode_ns_0_i_11493_variant_DataContents, (UA_Int32) 1, &UA_TYPES[UA_TYPES_ARGUMENT]); +attr.displayName = UA_LOCALIZEDTEXT("", "InputArguments"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11493), +UA_NODEID_NUMERIC(ns[0], 11492), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "InputArguments"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); + +return retVal; } -/*********************/ -/* Delete References */ -/*********************/ +static UA_StatusCode function_namespace0_generated_140_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11493) +); +} -static void -Operation_deleteReference(UA_Server *server, UA_Session *session, void *context, - const UA_DeleteReferencesItem *item, UA_StatusCode *retval) { - /* Do not check access for server */ - if(session != &server->adminSession && server->config.accessControl.allowDeleteReference && - !server->config.accessControl.allowDeleteReference(server, &server->config.accessControl, - &session->sessionId, session->sessionHandle, item)) { - *retval = UA_STATUSCODE_BADUSERACCESSDENIED; - return; - } +/* OutputArguments - ns=0;i=11494 */ - // TODO: Check consistency constraints, remove the references. - *retval = UA_Server_editNode(server, session, &item->sourceNodeId, - (UA_EditNodeCallback)deleteOneWayReference, - /* cast away const qualifier because callback uses it anyway */ - (UA_DeleteReferencesItem *)(uintptr_t)item); - if(*retval != UA_STATUSCODE_GOOD) - return; +static UA_StatusCode function_namespace0_generated_141_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +attr.valueRank = 1; +attr.arrayDimensionsSize = 1; +UA_UInt32 arrayDimensions[1]; +arrayDimensions[0] = 0; +attr.arrayDimensions = &arrayDimensions[0]; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 296); +UA_Argument variablenode_ns_0_i_11494_variant_DataContents[2]; + +UA_init(&variablenode_ns_0_i_11494_variant_DataContents[0], &UA_TYPES[UA_TYPES_ARGUMENT]); +variablenode_ns_0_i_11494_variant_DataContents[0].name = UA_STRING("ServerHandles"); +variablenode_ns_0_i_11494_variant_DataContents[0].dataType = UA_NODEID_NUMERIC(ns[0], 7); +variablenode_ns_0_i_11494_variant_DataContents[0].valueRank = (UA_Int32) 1; +UA_STACKARRAY(UA_UInt32, variablenode_ns_0_i_11494_variant_DataContents0_arrayDimensions, 1); +UA_init(variablenode_ns_0_i_11494_variant_DataContents0_arrayDimensions, &UA_TYPES[UA_TYPES_UINT32]); +variablenode_ns_0_i_11494_variant_DataContents0_arrayDimensions[0] = (UA_UInt32) 0; +variablenode_ns_0_i_11494_variant_DataContents[0].arrayDimensionsSize = 1; +variablenode_ns_0_i_11494_variant_DataContents[0].arrayDimensions = variablenode_ns_0_i_11494_variant_DataContents0_arrayDimensions; + +UA_init(&variablenode_ns_0_i_11494_variant_DataContents[1], &UA_TYPES[UA_TYPES_ARGUMENT]); +variablenode_ns_0_i_11494_variant_DataContents[1].name = UA_STRING("ClientHandles"); +variablenode_ns_0_i_11494_variant_DataContents[1].dataType = UA_NODEID_NUMERIC(ns[0], 7); +variablenode_ns_0_i_11494_variant_DataContents[1].valueRank = (UA_Int32) 1; +UA_STACKARRAY(UA_UInt32, variablenode_ns_0_i_11494_variant_DataContents1_arrayDimensions, 1); +UA_init(variablenode_ns_0_i_11494_variant_DataContents1_arrayDimensions, &UA_TYPES[UA_TYPES_UINT32]); +variablenode_ns_0_i_11494_variant_DataContents1_arrayDimensions[0] = (UA_UInt32) 0; +variablenode_ns_0_i_11494_variant_DataContents[1].arrayDimensionsSize = 1; +variablenode_ns_0_i_11494_variant_DataContents[1].arrayDimensions = variablenode_ns_0_i_11494_variant_DataContents1_arrayDimensions; +UA_Variant_setArray(&attr.value, &variablenode_ns_0_i_11494_variant_DataContents, (UA_Int32) 2, &UA_TYPES[UA_TYPES_ARGUMENT]); +attr.displayName = UA_LOCALIZEDTEXT("", "OutputArguments"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 11494), +UA_NODEID_NUMERIC(ns[0], 11492), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "OutputArguments"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); - if(!item->deleteBidirectional || item->targetNodeId.serverIndex != 0) - return; - UA_DeleteReferencesItem secondItem; - UA_DeleteReferencesItem_init(&secondItem); - secondItem.isForward = !item->isForward; - secondItem.sourceNodeId = item->targetNodeId.nodeId; - secondItem.targetNodeId.nodeId = item->sourceNodeId; - secondItem.referenceTypeId = item->referenceTypeId; - *retval = UA_Server_editNode(server, session, &secondItem.sourceNodeId, - (UA_EditNodeCallback)deleteOneWayReference, - &secondItem); +return retVal; } -void -Service_DeleteReferences(UA_Server *server, UA_Session *session, - const UA_DeleteReferencesRequest *request, - UA_DeleteReferencesResponse *response) { - UA_LOG_DEBUG_SESSION(server->config.logger, session, - "Processing DeleteReferencesRequest"); +static UA_StatusCode function_namespace0_generated_141_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 11494) +); +} - if(server->config.maxNodesPerNodeManagement != 0 && - request->referencesToDeleteSize > server->config.maxNodesPerNodeManagement) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYOPERATIONS; - return; - } +/* NamespaceArray - ns=0;i=2255 */ - response->responseHeader.serviceResult = - UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_deleteReference, NULL, - &request->referencesToDeleteSize, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM], - &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]); +static UA_StatusCode function_namespace0_generated_142_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 1000.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +attr.valueRank = 1; +attr.arrayDimensionsSize = 1; +UA_UInt32 arrayDimensions[1]; +arrayDimensions[0] = 0; +attr.arrayDimensions = &arrayDimensions[0]; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +attr.displayName = UA_LOCALIZEDTEXT("", "NamespaceArray"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 2255), +UA_NODEID_NUMERIC(ns[0], 2253), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "NamespaceArray"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +return retVal; } -UA_StatusCode -UA_Server_deleteReference(UA_Server *server, const UA_NodeId sourceNodeId, - const UA_NodeId referenceTypeId, UA_Boolean isForward, - const UA_ExpandedNodeId targetNodeId, - UA_Boolean deleteBidirectional) { - UA_DeleteReferencesItem item; - item.sourceNodeId = sourceNodeId; - item.referenceTypeId = referenceTypeId; - item.isForward = isForward; - item.targetNodeId = targetNodeId; - item.deleteBidirectional = deleteBidirectional; - - UA_StatusCode retval = UA_STATUSCODE_GOOD; - Operation_deleteReference(server, &server->adminSession, NULL, &item, &retval); - return retval; +static UA_StatusCode function_namespace0_generated_142_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 2255) +); } -/**********************/ -/* Set Value Callback */ -/**********************/ +/* ModellingRuleType - ns=0;i=77 */ -static UA_StatusCode -setValueCallback(UA_Server *server, UA_Session *session, - UA_VariableNode *node, const UA_ValueCallback *callback) { - if(node->nodeClass != UA_NODECLASS_VARIABLE) - return UA_STATUSCODE_BADNODECLASSINVALID; - node->value.data.callback = *callback; - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_143_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "ModellingRuleType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, +UA_NODEID_NUMERIC(ns[0], 77), +UA_NODEID_NUMERIC(ns[0], 58), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "ModellingRuleType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); +return retVal; } -UA_StatusCode -UA_Server_setVariableNode_valueCallback(UA_Server *server, - const UA_NodeId nodeId, - const UA_ValueCallback callback) { - return UA_Server_editNode(server, &server->adminSession, &nodeId, - (UA_EditNodeCallback)setValueCallback, - /* cast away const because callback uses const anyway */ - (UA_ValueCallback *)(uintptr_t) &callback); +static UA_StatusCode function_namespace0_generated_143_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 77) +); } -/***************************************************/ -/* Special Handling of Variables with Data Sources */ -/***************************************************/ +/* NamingRule - ns=0;i=111 */ -UA_StatusCode -UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requestedNewNodeId, - const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId, - const UA_QualifiedName browseName, const UA_NodeId typeDefinition, - const UA_VariableAttributes attr, const UA_DataSource dataSource, - void *nodeContext, UA_NodeId *outNewNodeId) { - UA_AddNodesItem item; - UA_AddNodesItem_init(&item); - item.nodeClass = UA_NODECLASS_VARIABLE; - item.requestedNewNodeId.nodeId = requestedNewNodeId; - item.browseName = browseName; - UA_ExpandedNodeId typeDefinitionId; - UA_ExpandedNodeId_init(&typeDefinitionId); - typeDefinitionId.nodeId = typeDefinition; - item.typeDefinition = typeDefinitionId; - item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; - item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)&attr; - item.nodeAttributes.content.decoded.type = &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]; - UA_NodeId newNodeId; - if(!outNewNodeId) { - newNodeId = UA_NODEID_NULL; - outNewNodeId = &newNodeId; - } +static UA_StatusCode function_namespace0_generated_144_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 120); +UA_Int32 *variablenode_ns_0_i_111_variant_DataContents = UA_Int32_new(); +if (!variablenode_ns_0_i_111_variant_DataContents) return UA_STATUSCODE_BADOUTOFMEMORY; +UA_Int32_init(variablenode_ns_0_i_111_variant_DataContents); +*variablenode_ns_0_i_111_variant_DataContents = (UA_Int32) 1; +UA_Variant_setScalar(&attr.value, variablenode_ns_0_i_111_variant_DataContents, &UA_TYPES[UA_TYPES_INT32]); +attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 111), +UA_NODEID_NUMERIC(ns[0], 77), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "NamingRule"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +UA_Int32_delete(variablenode_ns_0_i_111_variant_DataContents); +return retVal; +} - /* Create the node and add it to the nodestore */ - UA_StatusCode retval = AddNode_raw(server, &server->adminSession, nodeContext, &item, outNewNodeId); - if(retval != UA_STATUSCODE_GOOD) - goto cleanup; +static UA_StatusCode function_namespace0_generated_144_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 111) +); +} - /* Set the data source */ - retval = UA_Server_setVariableNode_dataSource(server, *outNewNodeId, dataSource); - if(retval != UA_STATUSCODE_GOOD) - goto cleanup; +/* Optional - ns=0;i=80 */ - /* Typecheck and add references to parent and type definition */ - retval = AddNode_typeCheckAddRefs(server, &server->adminSession, outNewNodeId, &parentNodeId, - &referenceTypeId, &typeDefinition); - if(retval != UA_STATUSCODE_GOOD) - goto cleanup; +static UA_StatusCode function_namespace0_generated_145_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Optional"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 80), +UA_NODEID_NUMERIC(ns[0], 0), +UA_NODEID_NUMERIC(ns[0], 0), +UA_QUALIFIEDNAME(ns[0], "Optional"), +UA_NODEID_NUMERIC(ns[0], 77), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11572), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11574), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11565), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11551), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11569), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11573), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11571), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11570), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 80), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 11567), false); +return retVal; +} - /* Call the constructors */ - retval = Operation_addNode_finish(server, &server->adminSession, outNewNodeId); +static UA_StatusCode function_namespace0_generated_145_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 80) +); +} - cleanup: - if(outNewNodeId == &newNodeId) - UA_NodeId_deleteMembers(&newNodeId); +/* NamingRule - ns=0;i=113 */ - return retval; +static UA_StatusCode function_namespace0_generated_146_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 120); +UA_Int32 *variablenode_ns_0_i_113_variant_DataContents = UA_Int32_new(); +if (!variablenode_ns_0_i_113_variant_DataContents) return UA_STATUSCODE_BADOUTOFMEMORY; +UA_Int32_init(variablenode_ns_0_i_113_variant_DataContents); +*variablenode_ns_0_i_113_variant_DataContents = (UA_Int32) 2; +UA_Variant_setScalar(&attr.value, variablenode_ns_0_i_113_variant_DataContents, &UA_TYPES[UA_TYPES_INT32]); +attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 113), +UA_NODEID_NUMERIC(ns[0], 80), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "NamingRule"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +UA_Int32_delete(variablenode_ns_0_i_113_variant_DataContents); +return retVal; } -static UA_StatusCode -setDataSource(UA_Server *server, UA_Session *session, - UA_VariableNode* node, const UA_DataSource *dataSource) { - if(node->nodeClass != UA_NODECLASS_VARIABLE) - return UA_STATUSCODE_BADNODECLASSINVALID; - if(node->valueSource == UA_VALUESOURCE_DATA) - UA_DataValue_deleteMembers(&node->value.data.value); - node->value.dataSource = *dataSource; - node->valueSource = UA_VALUESOURCE_DATASOURCE; - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_146_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 113) +); } -UA_StatusCode -UA_Server_setVariableNode_dataSource(UA_Server *server, const UA_NodeId nodeId, - const UA_DataSource dataSource) { - return UA_Server_editNode(server, &server->adminSession, &nodeId, - (UA_EditNodeCallback)setDataSource, - /* casting away const because callback casts it back anyway */ - (UA_DataSource *) (uintptr_t)&dataSource); +/* Mandatory - ns=0;i=78 */ + +static UA_StatusCode function_namespace0_generated_147_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Mandatory"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 78), +UA_NODEID_NUMERIC(ns[0], 0), +UA_NODEID_NUMERIC(ns[0], 0), +UA_QUALIFIEDNAME(ns[0], "Mandatory"), +UA_NODEID_NUMERIC(ns[0], 77), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 7611), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2161), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2154), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 12169), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2011), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2035), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2157), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2160), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2153), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 111), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2163), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2156), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2152), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2155), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2151), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2162), false); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 78), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 2159), false); +return retVal; } -/************************************/ -/* Special Handling of Method Nodes */ -/************************************/ +static UA_StatusCode function_namespace0_generated_147_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 78) +); +} -#ifdef UA_ENABLE_METHODCALLS +/* NamingRule - ns=0;i=112 */ -static const UA_NodeId hasproperty = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_HASPROPERTY}}; -static const UA_NodeId propertytype = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_PROPERTYTYPE}}; +static UA_StatusCode function_namespace0_generated_148_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 120); +UA_Int32 *variablenode_ns_0_i_112_variant_DataContents = UA_Int32_new(); +if (!variablenode_ns_0_i_112_variant_DataContents) return UA_STATUSCODE_BADOUTOFMEMORY; +UA_Int32_init(variablenode_ns_0_i_112_variant_DataContents); +*variablenode_ns_0_i_112_variant_DataContents = (UA_Int32) 1; +UA_Variant_setScalar(&attr.value, variablenode_ns_0_i_112_variant_DataContents, &UA_TYPES[UA_TYPES_INT32]); +attr.displayName = UA_LOCALIZEDTEXT("", "NamingRule"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 112), +UA_NODEID_NUMERIC(ns[0], 78), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "NamingRule"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +UA_Int32_delete(variablenode_ns_0_i_112_variant_DataContents); +return retVal; +} -static UA_StatusCode -UA_Server_addMethodNodeEx_finish(UA_Server *server, const UA_NodeId nodeId, - UA_MethodCallback method, - const size_t inputArgumentsSize, const UA_Argument *inputArguments, - const UA_NodeId inputArgumentsRequestedNewNodeId, - UA_NodeId *inputArgumentsOutNewNodeId, - const size_t outputArgumentsSize, const UA_Argument *outputArguments, - const UA_NodeId outputArgumentsRequestedNewNodeId, - UA_NodeId *outputArgumentsOutNewNodeId) { - /* Browse to see which argument nodes exist */ - UA_BrowseDescription bd; - UA_BrowseDescription_init(&bd); - bd.nodeId = nodeId; - bd.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY); - bd.includeSubtypes = false; - bd.browseDirection = UA_BROWSEDIRECTION_FORWARD; - bd.nodeClassMask = UA_NODECLASS_VARIABLE; - bd.resultMask = UA_BROWSERESULTMASK_BROWSENAME; +static UA_StatusCode function_namespace0_generated_148_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 112) +); +} - UA_BrowseResult br; - UA_BrowseResult_init(&br); - UA_UInt32 maxrefs = 0; - Operation_Browse(server, &server->adminSession, &maxrefs, &bd, &br); +/* DataTypeEncodingType - ns=0;i=76 */ - UA_StatusCode retval = br.statusCode; - if(retval != UA_STATUSCODE_GOOD) { - UA_Server_deleteNode(server, nodeId, true); - UA_BrowseResult_deleteMembers(&br); - return retval; - } +static UA_StatusCode function_namespace0_generated_149_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeEncodingType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, +UA_NODEID_NUMERIC(ns[0], 76), +UA_NODEID_NUMERIC(ns[0], 58), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "DataTypeEncodingType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); +return retVal; +} - /* Filter out the argument nodes */ - UA_NodeId inputArgsId = UA_NODEID_NULL; - UA_NodeId outputArgsId = UA_NODEID_NULL; - const UA_QualifiedName inputArgsName = UA_QUALIFIEDNAME(0, "InputArguments"); - const UA_QualifiedName outputArgsName = UA_QUALIFIEDNAME(0, "OutputArguments"); - for(size_t i = 0; i < br.referencesSize; i++) { - UA_ReferenceDescription *rd = &br.references[i]; - if(rd->browseName.namespaceIndex == 0 && - UA_String_equal(&rd->browseName.name, &inputArgsName.name)) - inputArgsId = rd->nodeId.nodeId; - else if(rd->browseName.namespaceIndex == 0 && - UA_String_equal(&rd->browseName.name, &outputArgsName.name)) - outputArgsId = rd->nodeId.nodeId; - } +static UA_StatusCode function_namespace0_generated_149_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 76) +); +} - /* Add the Input Arguments VariableNode */ - if(inputArgumentsSize > 0 && UA_NodeId_isNull(&inputArgsId)) { - UA_VariableAttributes attr = UA_VariableAttributes_default; - char *name = "InputArguments"; - attr.displayName = UA_LOCALIZEDTEXT("", name); - attr.dataType = UA_TYPES[UA_TYPES_ARGUMENT].typeId; - attr.valueRank = UA_VALUERANK_ONE_DIMENSION; - UA_UInt32 inputArgsSize32 = (UA_UInt32)inputArgumentsSize; - attr.arrayDimensions = &inputArgsSize32; - attr.arrayDimensionsSize = 1; - UA_Variant_setArray(&attr.value, (void*)(uintptr_t) inputArguments, - inputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]); - retval |= UA_Server_addVariableNode(server, inputArgumentsRequestedNewNodeId, nodeId, - hasproperty, UA_QUALIFIEDNAME(0, name), - propertytype, attr, NULL, &inputArgsId); - } +/* Default Binary - ns=0;i=8251 */ - /* Add the Output Arguments VariableNode */ - if(outputArgumentsSize > 0 && UA_NodeId_isNull(&outputArgsId)) { - UA_VariableAttributes attr = UA_VariableAttributes_default; - char *name = "OutputArguments"; - attr.displayName = UA_LOCALIZEDTEXT("", name); - attr.dataType = UA_TYPES[UA_TYPES_ARGUMENT].typeId; - attr.valueRank = UA_VALUERANK_ONE_DIMENSION; - UA_UInt32 outputArgsSize32 = (UA_UInt32)outputArgumentsSize; - attr.arrayDimensions = &outputArgsSize32; - attr.arrayDimensionsSize = 1; - UA_Variant_setArray(&attr.value, (void*)(uintptr_t) outputArguments, - outputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]); - retval |= UA_Server_addVariableNode(server, outputArgumentsRequestedNewNodeId, nodeId, - hasproperty, UA_QUALIFIEDNAME(0, name), - propertytype, attr, NULL, &outputArgsId); - } +static UA_StatusCode function_namespace0_generated_150_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Default Binary"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 8251), +UA_NODEID_NUMERIC(ns[0], 0), +UA_NODEID_NUMERIC(ns[0], 0), +UA_QUALIFIEDNAME(ns[0], "Default Binary"), +UA_NODEID_NUMERIC(ns[0], 76), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 8251), UA_NODEID_NUMERIC(ns[0], 38), UA_EXPANDEDNODEID_NUMERIC(ns[0], 7594), false); +return retVal; +} - retval |= UA_Server_setMethodNode_callback(server, nodeId, method); +static UA_StatusCode function_namespace0_generated_150_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 8251) +); +} - /* Call finish to add the parent reference */ - retval |= Operation_addNode_finish(server, &server->adminSession, &nodeId); +/* Default Binary - ns=0;i=298 */ - if(retval != UA_STATUSCODE_GOOD) { - UA_Server_deleteNode(server, nodeId, true); - UA_Server_deleteNode(server, inputArgsId, true); - UA_Server_deleteNode(server, outputArgsId, true); - } else { - if(inputArgumentsOutNewNodeId != NULL) { - UA_NodeId_copy(&inputArgsId, inputArgumentsOutNewNodeId); - } - if(outputArgumentsOutNewNodeId != NULL) { - UA_NodeId_copy(&outputArgsId, outputArgumentsOutNewNodeId); - } - } - UA_BrowseResult_deleteMembers(&br); - return retval; +static UA_StatusCode function_namespace0_generated_151_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Default Binary"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 298), +UA_NODEID_NUMERIC(ns[0], 0), +UA_NODEID_NUMERIC(ns[0], 0), +UA_QUALIFIEDNAME(ns[0], "Default Binary"), +UA_NODEID_NUMERIC(ns[0], 76), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 298), UA_NODEID_NUMERIC(ns[0], 38), UA_EXPANDEDNODEID_NUMERIC(ns[0], 296), false); +return retVal; } -UA_StatusCode -UA_Server_addMethodNode_finish(UA_Server *server, const UA_NodeId nodeId, - UA_MethodCallback method, - size_t inputArgumentsSize, const UA_Argument* inputArguments, - size_t outputArgumentsSize, const UA_Argument* outputArguments) { - return UA_Server_addMethodNodeEx_finish(server, nodeId, method, - inputArgumentsSize, inputArguments, UA_NODEID_NULL, NULL, - outputArgumentsSize, outputArguments, UA_NODEID_NULL, NULL); +static UA_StatusCode function_namespace0_generated_151_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 298) +); } -UA_StatusCode -UA_Server_addMethodNodeEx(UA_Server *server, const UA_NodeId requestedNewNodeId, - const UA_NodeId parentNodeId, - const UA_NodeId referenceTypeId, - const UA_QualifiedName browseName, - const UA_MethodAttributes attr, UA_MethodCallback method, - size_t inputArgumentsSize, const UA_Argument *inputArguments, - const UA_NodeId inputArgumentsRequestedNewNodeId, - UA_NodeId *inputArgumentsOutNewNodeId, - size_t outputArgumentsSize, const UA_Argument *outputArguments, - const UA_NodeId outputArgumentsRequestedNewNodeId, - UA_NodeId *outputArgumentsOutNewNodeId, - void *nodeContext, UA_NodeId *outNewNodeId) { - UA_AddNodesItem item; - UA_AddNodesItem_init(&item); - item.nodeClass = UA_NODECLASS_METHOD; - item.requestedNewNodeId.nodeId = requestedNewNodeId; - item.browseName = browseName; - item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; - item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)&attr; - item.nodeAttributes.content.decoded.type = &UA_TYPES[UA_TYPES_METHODATTRIBUTES]; +/* DataTypeSystemType - ns=0;i=75 */ - UA_NodeId newId; - if(!outNewNodeId) { - UA_NodeId_init(&newId); - outNewNodeId = &newId; - } +static UA_StatusCode function_namespace0_generated_152_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeSystemType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECTTYPE, +UA_NODEID_NUMERIC(ns[0], 75), +UA_NODEID_NUMERIC(ns[0], 58), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "DataTypeSystemType"), + UA_NODEID_NULL, +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],NULL, NULL); +return retVal; +} - UA_StatusCode retval = Operation_addNode_begin(server, &server->adminSession, nodeContext, - &item, &parentNodeId, &referenceTypeId, outNewNodeId); - if(retval != UA_STATUSCODE_GOOD) - return retval; +static UA_StatusCode function_namespace0_generated_152_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 75) +); +} - retval = UA_Server_addMethodNodeEx_finish(server, *outNewNodeId, method, - inputArgumentsSize, inputArguments, - inputArgumentsRequestedNewNodeId, - inputArgumentsOutNewNodeId, - outputArgumentsSize, outputArguments, - outputArgumentsRequestedNewNodeId, - outputArgumentsOutNewNodeId); +/* XML Schema - ns=0;i=92 */ - if(outNewNodeId == &newId) - UA_NodeId_deleteMembers(&newId); - return retval; +static UA_StatusCode function_namespace0_generated_153_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "XML Schema"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 92), +UA_NODEID_NUMERIC(ns[0], 90), +UA_NODEID_NUMERIC(ns[0], 35), +UA_QUALIFIEDNAME(ns[0], "XML Schema"), +UA_NODEID_NUMERIC(ns[0], 75), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; } -static UA_StatusCode -editMethodCallback(UA_Server *server, UA_Session* session, - UA_Node* node, void* handle) { - if(node->nodeClass != UA_NODECLASS_METHOD) - return UA_STATUSCODE_BADNODECLASSINVALID; - UA_MethodNode *mnode = (UA_MethodNode*) node; - mnode->method = (UA_MethodCallback)(uintptr_t)handle; - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_153_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 92) +); } -UA_StatusCode -UA_Server_setMethodNode_callback(UA_Server *server, - const UA_NodeId methodNodeId, - UA_MethodCallback methodCallback) { - return UA_Server_editNode(server, &server->adminSession, &methodNodeId, - (UA_EditNodeCallback)editMethodCallback, - (void*)(uintptr_t)methodCallback); -} +/* OPC Binary - ns=0;i=93 */ -#endif +static UA_StatusCode function_namespace0_generated_154_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "OPC Binary"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 93), +UA_NODEID_NUMERIC(ns[0], 90), +UA_NODEID_NUMERIC(ns[0], 35), +UA_QUALIFIEDNAME(ns[0], "OPC Binary"), +UA_NODEID_NUMERIC(ns[0], 75), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; +} -/************************/ -/* Lifecycle Management */ -/************************/ +static UA_StatusCode function_namespace0_generated_154_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 93) +); +} -static UA_StatusCode -setNodeTypeLifecycle(UA_Server *server, UA_Session *session, - UA_Node* node, UA_NodeTypeLifecycle *lifecycle) { - if(node->nodeClass == UA_NODECLASS_OBJECTTYPE) { - UA_ObjectTypeNode *ot = (UA_ObjectTypeNode*)node; - ot->lifecycle = *lifecycle; - return UA_STATUSCODE_GOOD; - } +/* DataTypeDictionaryType - ns=0;i=72 */ - if(node->nodeClass == UA_NODECLASS_VARIABLETYPE) { - UA_VariableTypeNode *vt = (UA_VariableTypeNode*)node; - vt->lifecycle = *lifecycle; - return UA_STATUSCODE_GOOD; - } +static UA_StatusCode function_namespace0_generated_155_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 15); +attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeDictionaryType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE, +UA_NODEID_NUMERIC(ns[0], 72), +UA_NODEID_NUMERIC(ns[0], 63), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "DataTypeDictionaryType"), +UA_NODEID_NUMERIC(ns[0], 0), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); +return retVal; +} - return UA_STATUSCODE_BADNODECLASSINVALID; +static UA_StatusCode function_namespace0_generated_155_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 72) +); } -UA_StatusCode -UA_Server_setNodeTypeLifecycle(UA_Server *server, UA_NodeId nodeId, - UA_NodeTypeLifecycle lifecycle) { - return UA_Server_editNode(server, &server->adminSession, &nodeId, - (UA_EditNodeCallback)setNodeTypeLifecycle, - &lifecycle); +/* DataTypeVersion - ns=0;i=106 */ + +static UA_StatusCode function_namespace0_generated_156_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeVersion"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 106), +UA_NODEID_NUMERIC(ns[0], 72), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "DataTypeVersion"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 106), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 80), true); +return retVal; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/server/ua_services_discovery_multicast.c" ***********************************/ +static UA_StatusCode function_namespace0_generated_156_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 106) +); +} -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA - */ +/* NamespaceUri - ns=0;i=107 */ -/* Enable POSIX features */ -#if !defined(_XOPEN_SOURCE) && !defined(_WRS_KERNEL) -# define _XOPEN_SOURCE 600 -#endif -#ifndef _DEFAULT_SOURCE -# define _DEFAULT_SOURCE -#endif -/* On older systems we need to define _BSD_SOURCE. - * _DEFAULT_SOURCE is an alias for that. */ -#ifndef _BSD_SOURCE -# define _BSD_SOURCE +static UA_StatusCode function_namespace0_generated_157_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +attr.displayName = UA_LOCALIZEDTEXT("", "NamespaceUri"); +#ifdef UA_ENABLE_NODESET_COMPILER_DESCRIPTIONS +attr.description = UA_LOCALIZEDTEXT("", "A URI that uniquely identifies the dictionary."); #endif +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 107), +UA_NODEID_NUMERIC(ns[0], 72), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "NamespaceUri"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 107), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 80), true); +return retVal; +} +static UA_StatusCode function_namespace0_generated_157_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 107) +); +} -#if defined(UA_ENABLE_DISCOVERY) && defined(UA_ENABLE_DISCOVERY_MULTICAST) +/* Opc.Ua - ns=0;i=7617 */ -#ifdef _MSC_VER -# ifndef UNDER_CE -# include //access -# define access _access -# endif -#else -# include //access -# include // struct timeval -#endif +static UA_StatusCode function_namespace0_generated_158_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 15); +UA_ByteString *variablenode_ns_0_i_7617_variant_DataContents = UA_ByteString_new(); +if (!variablenode_ns_0_i_7617_variant_DataContents) return UA_STATUSCODE_BADOUTOFMEMORY; +UA_ByteString_init(variablenode_ns_0_i_7617_variant_DataContents); +*variablenode_ns_0_i_7617_variant_DataContents = UA_BYTESTRING_NULL; +UA_Variant_setScalar(&attr.value, variablenode_ns_0_i_7617_variant_DataContents, &UA_TYPES[UA_TYPES_BYTESTRING]); +attr.displayName = UA_LOCALIZEDTEXT("", "Opc.Ua"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 7617), +UA_NODEID_NUMERIC(ns[0], 93), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "Opc.Ua"), +UA_NODEID_NUMERIC(ns[0], 72), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +variablenode_ns_0_i_7617_variant_DataContents->data = NULL; +variablenode_ns_0_i_7617_variant_DataContents->length = 0; +UA_ByteString_delete(variablenode_ns_0_i_7617_variant_DataContents); +return retVal; +} -#include -#include -#ifdef _WIN32 -# define CLOSESOCKET(S) closesocket((SOCKET)S) -# define errno__ WSAGetLastError() -#else -# define CLOSESOCKET(S) close(S) -# define errno__ errno -#endif +static UA_StatusCode function_namespace0_generated_158_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 7617) +); +} +/* DataTypeDescriptionType - ns=0;i=69 */ -#ifdef UA_ENABLE_MULTITHREADING +static UA_StatusCode function_namespace0_generated_159_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeDescriptionType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLETYPE, +UA_NODEID_NUMERIC(ns[0], 69), +UA_NODEID_NUMERIC(ns[0], 63), +UA_NODEID_NUMERIC(ns[0], 45), +UA_QUALIFIEDNAME(ns[0], "DataTypeDescriptionType"), +UA_NODEID_NUMERIC(ns[0], 0), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],NULL, NULL); +return retVal; +} -static void * -multicastWorkerLoop(UA_Server *server) { - struct timeval next_sleep = {.tv_sec = 0, .tv_usec = 0}; - volatile UA_Boolean *running = &server->mdnsRunning; - fd_set fds; +static UA_StatusCode function_namespace0_generated_159_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 69) +); +} - while(*running) { - FD_ZERO(&fds); - FD_SET(server->mdnsSocket, &fds); - select(server->mdnsSocket + 1, &fds, 0, 0, &next_sleep); +/* DataTypeVersion - ns=0;i=104 */ - if(!*running) - break; +static UA_StatusCode function_namespace0_generated_160_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +attr.displayName = UA_LOCALIZEDTEXT("", "DataTypeVersion"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 104), +UA_NODEID_NUMERIC(ns[0], 69), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "DataTypeVersion"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 104), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 80), true); +return retVal; +} - unsigned short retVal = - mdnsd_step(server->mdnsDaemon, server->mdnsSocket, - FD_ISSET(server->mdnsSocket, &fds), true, &next_sleep); - if(retVal == 1) { - UA_LOG_SOCKET_ERRNO_WRAP( - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast error: Can not read from socket. %s", errno_str)); - break; - } else if (retVal == 2) { - UA_LOG_SOCKET_ERRNO_WRAP( - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast error: Can not write to socket. %s", errno_str)); - break; - } - } - return NULL; +static UA_StatusCode function_namespace0_generated_160_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 104) +); } -static UA_StatusCode -multicastListenStart(UA_Server* server) { - int err = pthread_create(&server->mdnsThread, NULL, - (void* (*)(void*))multicastWorkerLoop, server); - if(err != 0) { - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast error: Can not create multicast thread."); - return UA_STATUSCODE_BADUNEXPECTEDERROR; - } - return UA_STATUSCODE_GOOD; +/* EnumValueType - ns=0;i=7656 */ + +static UA_StatusCode function_namespace0_generated_161_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +UA_String *variablenode_ns_0_i_7656_variant_DataContents = UA_String_new(); +if (!variablenode_ns_0_i_7656_variant_DataContents) return UA_STATUSCODE_BADOUTOFMEMORY; +UA_String_init(variablenode_ns_0_i_7656_variant_DataContents); +*variablenode_ns_0_i_7656_variant_DataContents = UA_STRING_ALLOC("EnumValueType"); +UA_Variant_setScalar(&attr.value, variablenode_ns_0_i_7656_variant_DataContents, &UA_TYPES[UA_TYPES_STRING]); +attr.displayName = UA_LOCALIZEDTEXT("", "EnumValueType"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 7656), +UA_NODEID_NUMERIC(ns[0], 7617), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "EnumValueType"), +UA_NODEID_NUMERIC(ns[0], 69), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +UA_String_delete(variablenode_ns_0_i_7656_variant_DataContents); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 7656), UA_NODEID_NUMERIC(ns[0], 39), UA_EXPANDEDNODEID_NUMERIC(ns[0], 8251), false); +return retVal; } -static UA_StatusCode -multicastListenStop(UA_Server* server) { - mdnsd_shutdown(server->mdnsDaemon); - // wake up select - write(server->mdnsSocket, "\0", 1); - if(pthread_join(server->mdnsThread, NULL)) { - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast error: Can not stop thread."); - return UA_STATUSCODE_BADUNEXPECTEDERROR; - } - return UA_STATUSCODE_BADNOTIMPLEMENTED; +static UA_StatusCode function_namespace0_generated_161_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 7656) +); } -# endif /* UA_ENABLE_MULTITHREADING */ +/* DictionaryFragment - ns=0;i=105 */ -static UA_StatusCode -addMdnsRecordForNetworkLayer(UA_Server *server, const UA_String *appName, - const UA_ServerNetworkLayer* nl) { - UA_String hostname = UA_STRING_NULL; - UA_UInt16 port = 4840; - UA_String path = UA_STRING_NULL; - UA_StatusCode retval = UA_parseEndpointUrl(&nl->discoveryUrl, &hostname, - &port, &path); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_WARNING(server->config.logger, UA_LOGCATEGORY_NETWORK, - "Server url is invalid: %.*s", - (int)nl->discoveryUrl.length, nl->discoveryUrl.data); - return retval; - } - UA_Discovery_addRecord(server, appName, &hostname, port, - &path, UA_DISCOVERY_TCP, UA_TRUE, - server->config.serverCapabilities, - &server->config.serverCapabilitiesSize); - return UA_STATUSCODE_GOOD; +static UA_StatusCode function_namespace0_generated_162_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 15); +attr.displayName = UA_LOCALIZEDTEXT("", "DictionaryFragment"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 105), +UA_NODEID_NUMERIC(ns[0], 69), +UA_NODEID_NUMERIC(ns[0], 46), +UA_QUALIFIEDNAME(ns[0], "DictionaryFragment"), +UA_NODEID_NUMERIC(ns[0], 68), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 105), UA_NODEID_NUMERIC(ns[0], 37), UA_EXPANDEDNODEID_NUMERIC(ns[0], 80), true); +return retVal; } -void startMulticastDiscoveryServer(UA_Server *server) { - UA_String *appName = &server->config.mdnsServerName; - for(size_t i = 0; i < server->config.networkLayersSize; i++) - addMdnsRecordForNetworkLayer(server, appName, &server->config.networkLayers[i]); - - /* find any other server on the net */ - UA_Discovery_multicastQuery(server); - -# ifdef UA_ENABLE_MULTITHREADING - multicastListenStart(server); -# endif +static UA_StatusCode function_namespace0_generated_162_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 105) +); } -void stopMulticastDiscoveryServer(UA_Server *server) { - char hostname[256]; - if(gethostname(hostname, 255) == 0) { - UA_String hnString = UA_STRING(hostname); - UA_Discovery_removeRecord(server, &server->config.mdnsServerName, - &hnString, 4840, UA_TRUE); - } else { - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, - "Could not get hostname for multicast discovery."); - } +/* Argument - ns=0;i=7650 */ -# ifdef UA_ENABLE_MULTITHREADING - multicastListenStop(server); -# else - // send out last package with TTL = 0 - iterateMulticastDiscoveryServer(server, NULL, UA_FALSE); -# endif +static UA_StatusCode function_namespace0_generated_163_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_VariableAttributes attr = UA_VariableAttributes_default; +attr.minimumSamplingInterval = 0.000000; +attr.userAccessLevel = 1; +attr.accessLevel = 1; +/* Value rank inherited */ +attr.valueRank = -1; +attr.dataType = UA_NODEID_NUMERIC(ns[0], 12); +UA_String *variablenode_ns_0_i_7650_variant_DataContents = UA_String_new(); +if (!variablenode_ns_0_i_7650_variant_DataContents) return UA_STATUSCODE_BADOUTOFMEMORY; +UA_String_init(variablenode_ns_0_i_7650_variant_DataContents); +*variablenode_ns_0_i_7650_variant_DataContents = UA_STRING_ALLOC("Argument"); +UA_Variant_setScalar(&attr.value, variablenode_ns_0_i_7650_variant_DataContents, &UA_TYPES[UA_TYPES_STRING]); +attr.displayName = UA_LOCALIZEDTEXT("", "Argument"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_VARIABLE, +UA_NODEID_NUMERIC(ns[0], 7650), +UA_NODEID_NUMERIC(ns[0], 7617), +UA_NODEID_NUMERIC(ns[0], 47), +UA_QUALIFIEDNAME(ns[0], "Argument"), +UA_NODEID_NUMERIC(ns[0], 69), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],NULL, NULL); +UA_String_delete(variablenode_ns_0_i_7650_variant_DataContents); +retVal |= UA_Server_addReference(server, UA_NODEID_NUMERIC(ns[0], 7650), UA_NODEID_NUMERIC(ns[0], 39), UA_EXPANDEDNODEID_NUMERIC(ns[0], 298), false); +return retVal; } -/* All filter criteria must be fulfilled */ -static UA_Boolean -filterServerRecord(size_t serverCapabilityFilterSize, UA_String *serverCapabilityFilter, - serverOnNetwork_list_entry* current) { - for(size_t i = 0; i < serverCapabilityFilterSize; i++) { - for(size_t j = 0; j < current->serverOnNetwork.serverCapabilitiesSize; j++) - if(!UA_String_equal(&serverCapabilityFilter[i], - ¤t->serverOnNetwork.serverCapabilities[j])) - return false; - } - return true; +static UA_StatusCode function_namespace0_generated_163_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 7650) +); } -void Service_FindServersOnNetwork(UA_Server *server, UA_Session *session, - const UA_FindServersOnNetworkRequest *request, - UA_FindServersOnNetworkResponse *response) { - /* Set LastCounterResetTime */ - UA_DateTime_copy(&server->serverOnNetworkRecordIdLastReset, - &response->lastCounterResetTime); +/* Default XML - ns=0;i=3063 */ - /* Compute the max number of records to return */ - UA_UInt32 recordCount = 0; - if(request->startingRecordId < server->serverOnNetworkRecordIdCounter) - recordCount = server->serverOnNetworkRecordIdCounter - request->startingRecordId; - if(request->maxRecordsToReturn && recordCount > request->maxRecordsToReturn) - recordCount = UA_MIN(recordCount, request->maxRecordsToReturn); - if(recordCount == 0) { - response->serversSize = 0; - return; - } +static UA_StatusCode function_namespace0_generated_164_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Default XML"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 3063), +UA_NODEID_NUMERIC(ns[0], 0), +UA_NODEID_NUMERIC(ns[0], 0), +UA_QUALIFIEDNAME(ns[0], "Default XML"), +UA_NODEID_NUMERIC(ns[0], 58), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; +} - /* Iterate over all records and add to filtered list */ - UA_UInt32 filteredCount = 0; - UA_STACKARRAY(UA_ServerOnNetwork*, filtered, recordCount); - serverOnNetwork_list_entry* current; - LIST_FOREACH(current, &server->serverOnNetwork, pointers) { - if(filteredCount >= recordCount) - break; - if(current->serverOnNetwork.recordId < request->startingRecordId) - continue; - if(!filterServerRecord(request->serverCapabilityFilterSize, - request->serverCapabilityFilter, current)) - continue; - filtered[filteredCount++] = ¤t->serverOnNetwork; - } +static UA_StatusCode function_namespace0_generated_164_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 3063) +); +} - if(filteredCount == 0) - return; +/* Default Binary - ns=0;i=3062 */ - /* Allocate the array for the response */ - response->servers = - (UA_ServerOnNetwork*)UA_malloc(sizeof(UA_ServerOnNetwork)*filteredCount); - if(!response->servers) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; - return; - } - response->serversSize = filteredCount; +static UA_StatusCode function_namespace0_generated_165_begin(UA_Server *server, UA_UInt16* ns) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +UA_ObjectAttributes attr = UA_ObjectAttributes_default; +attr.displayName = UA_LOCALIZEDTEXT("", "Default Binary"); +retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_OBJECT, +UA_NODEID_NUMERIC(ns[0], 3062), +UA_NODEID_NUMERIC(ns[0], 0), +UA_NODEID_NUMERIC(ns[0], 0), +UA_QUALIFIEDNAME(ns[0], "Default Binary"), +UA_NODEID_NUMERIC(ns[0], 58), +(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],NULL, NULL); +return retVal; +} - /* Copy the server names */ - for(size_t i = 0; i < filteredCount; i++) - UA_ServerOnNetwork_copy(filtered[i], &response->servers[filteredCount-i-1]); +static UA_StatusCode function_namespace0_generated_165_finish(UA_Server *server, UA_UInt16* ns) { +return UA_Server_addNode_finish(server, +UA_NODEID_NUMERIC(ns[0], 3062) +); } -void -UA_Discovery_update_MdnsForDiscoveryUrl(UA_Server *server, const UA_String *serverName, - const UA_MdnsDiscoveryConfiguration *mdnsConfig, - const UA_String *discoveryUrl, - UA_Boolean isOnline, UA_Boolean updateTxt) { - UA_String hostname = UA_STRING_NULL; - UA_UInt16 port = 4840; - UA_String path = UA_STRING_NULL; - UA_StatusCode retval = UA_parseEndpointUrl(discoveryUrl, &hostname, &port, &path); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_WARNING(server->config.logger, UA_LOGCATEGORY_NETWORK, - "Server url invalid: %.*s", - (int)discoveryUrl->length, discoveryUrl->data); - return; - } +UA_StatusCode namespace0_generated(UA_Server *server) { +UA_StatusCode retVal = UA_STATUSCODE_GOOD; +/* Use namespace ids generated by the server */ +UA_UInt16 ns[1]; +ns[0] = UA_Server_addNamespace(server, "http://opcfoundation.org/UA/"); +bool dummy = ( +!(retVal = function_namespace0_generated_0_begin(server, ns)) && +!(retVal = function_namespace0_generated_1_begin(server, ns)) && +!(retVal = function_namespace0_generated_2_begin(server, ns)) && +!(retVal = function_namespace0_generated_3_begin(server, ns)) && +!(retVal = function_namespace0_generated_4_begin(server, ns)) && +!(retVal = function_namespace0_generated_5_begin(server, ns)) && +!(retVal = function_namespace0_generated_6_begin(server, ns)) && +!(retVal = function_namespace0_generated_7_begin(server, ns)) && +!(retVal = function_namespace0_generated_8_begin(server, ns)) && +!(retVal = function_namespace0_generated_9_begin(server, ns)) && +!(retVal = function_namespace0_generated_10_begin(server, ns)) && +!(retVal = function_namespace0_generated_11_begin(server, ns)) && +!(retVal = function_namespace0_generated_12_begin(server, ns)) && +!(retVal = function_namespace0_generated_13_begin(server, ns)) && +!(retVal = function_namespace0_generated_14_begin(server, ns)) && +!(retVal = function_namespace0_generated_15_begin(server, ns)) && +!(retVal = function_namespace0_generated_16_begin(server, ns)) && +!(retVal = function_namespace0_generated_17_begin(server, ns)) && +!(retVal = function_namespace0_generated_18_begin(server, ns)) && +!(retVal = function_namespace0_generated_19_begin(server, ns)) && +!(retVal = function_namespace0_generated_20_begin(server, ns)) && +!(retVal = function_namespace0_generated_21_begin(server, ns)) && +!(retVal = function_namespace0_generated_22_begin(server, ns)) && +!(retVal = function_namespace0_generated_23_begin(server, ns)) && +!(retVal = function_namespace0_generated_24_begin(server, ns)) && +!(retVal = function_namespace0_generated_25_begin(server, ns)) && +!(retVal = function_namespace0_generated_26_begin(server, ns)) && +!(retVal = function_namespace0_generated_27_begin(server, ns)) && +!(retVal = function_namespace0_generated_28_begin(server, ns)) && +!(retVal = function_namespace0_generated_29_begin(server, ns)) && +!(retVal = function_namespace0_generated_30_begin(server, ns)) && +!(retVal = function_namespace0_generated_31_begin(server, ns)) && +!(retVal = function_namespace0_generated_32_begin(server, ns)) && +!(retVal = function_namespace0_generated_33_begin(server, ns)) && +!(retVal = function_namespace0_generated_34_begin(server, ns)) && +!(retVal = function_namespace0_generated_35_begin(server, ns)) && +!(retVal = function_namespace0_generated_36_begin(server, ns)) && +!(retVal = function_namespace0_generated_37_begin(server, ns)) && +!(retVal = function_namespace0_generated_38_begin(server, ns)) && +!(retVal = function_namespace0_generated_39_begin(server, ns)) && +!(retVal = function_namespace0_generated_40_begin(server, ns)) && +!(retVal = function_namespace0_generated_41_begin(server, ns)) && +!(retVal = function_namespace0_generated_42_begin(server, ns)) && +!(retVal = function_namespace0_generated_43_begin(server, ns)) && +!(retVal = function_namespace0_generated_44_begin(server, ns)) && +!(retVal = function_namespace0_generated_45_begin(server, ns)) && +!(retVal = function_namespace0_generated_46_begin(server, ns)) && +!(retVal = function_namespace0_generated_47_begin(server, ns)) && +!(retVal = function_namespace0_generated_48_begin(server, ns)) && +!(retVal = function_namespace0_generated_49_begin(server, ns)) && +!(retVal = function_namespace0_generated_50_begin(server, ns)) && +!(retVal = function_namespace0_generated_51_begin(server, ns)) && +!(retVal = function_namespace0_generated_52_begin(server, ns)) && +!(retVal = function_namespace0_generated_53_begin(server, ns)) && +!(retVal = function_namespace0_generated_54_begin(server, ns)) && +!(retVal = function_namespace0_generated_55_begin(server, ns)) && +!(retVal = function_namespace0_generated_56_begin(server, ns)) && +!(retVal = function_namespace0_generated_57_begin(server, ns)) && +!(retVal = function_namespace0_generated_58_begin(server, ns)) && +!(retVal = function_namespace0_generated_59_begin(server, ns)) && +!(retVal = function_namespace0_generated_60_begin(server, ns)) && +!(retVal = function_namespace0_generated_61_begin(server, ns)) && +!(retVal = function_namespace0_generated_62_begin(server, ns)) && +!(retVal = function_namespace0_generated_63_begin(server, ns)) && +!(retVal = function_namespace0_generated_64_begin(server, ns)) && +!(retVal = function_namespace0_generated_65_begin(server, ns)) && +!(retVal = function_namespace0_generated_66_begin(server, ns)) && +!(retVal = function_namespace0_generated_67_begin(server, ns)) && +!(retVal = function_namespace0_generated_68_begin(server, ns)) && +!(retVal = function_namespace0_generated_69_begin(server, ns)) && +!(retVal = function_namespace0_generated_70_begin(server, ns)) && +!(retVal = function_namespace0_generated_71_begin(server, ns)) && +!(retVal = function_namespace0_generated_72_begin(server, ns)) && +!(retVal = function_namespace0_generated_73_begin(server, ns)) && +!(retVal = function_namespace0_generated_74_begin(server, ns)) && +!(retVal = function_namespace0_generated_75_begin(server, ns)) && +!(retVal = function_namespace0_generated_76_begin(server, ns)) && +!(retVal = function_namespace0_generated_77_begin(server, ns)) && +!(retVal = function_namespace0_generated_78_begin(server, ns)) && +!(retVal = function_namespace0_generated_79_begin(server, ns)) && +!(retVal = function_namespace0_generated_80_begin(server, ns)) && +!(retVal = function_namespace0_generated_81_begin(server, ns)) && +!(retVal = function_namespace0_generated_82_begin(server, ns)) && +!(retVal = function_namespace0_generated_83_begin(server, ns)) && +!(retVal = function_namespace0_generated_84_begin(server, ns)) && +!(retVal = function_namespace0_generated_85_begin(server, ns)) && +!(retVal = function_namespace0_generated_86_begin(server, ns)) && +!(retVal = function_namespace0_generated_87_begin(server, ns)) && +!(retVal = function_namespace0_generated_88_begin(server, ns)) && +!(retVal = function_namespace0_generated_89_begin(server, ns)) && +!(retVal = function_namespace0_generated_90_begin(server, ns)) && +!(retVal = function_namespace0_generated_91_begin(server, ns)) && +!(retVal = function_namespace0_generated_92_begin(server, ns)) && +!(retVal = function_namespace0_generated_93_begin(server, ns)) && +!(retVal = function_namespace0_generated_94_begin(server, ns)) && +!(retVal = function_namespace0_generated_95_begin(server, ns)) && +!(retVal = function_namespace0_generated_96_begin(server, ns)) && +!(retVal = function_namespace0_generated_97_begin(server, ns)) && +!(retVal = function_namespace0_generated_98_begin(server, ns)) && +!(retVal = function_namespace0_generated_99_begin(server, ns)) && +!(retVal = function_namespace0_generated_100_begin(server, ns)) && +!(retVal = function_namespace0_generated_101_begin(server, ns)) && +!(retVal = function_namespace0_generated_102_begin(server, ns)) && +!(retVal = function_namespace0_generated_103_begin(server, ns)) && +!(retVal = function_namespace0_generated_104_begin(server, ns)) && +!(retVal = function_namespace0_generated_105_begin(server, ns)) && +!(retVal = function_namespace0_generated_106_begin(server, ns)) && +!(retVal = function_namespace0_generated_107_begin(server, ns)) && +!(retVal = function_namespace0_generated_108_begin(server, ns)) && +!(retVal = function_namespace0_generated_109_begin(server, ns)) && +!(retVal = function_namespace0_generated_110_begin(server, ns)) && +!(retVal = function_namespace0_generated_111_begin(server, ns)) && +!(retVal = function_namespace0_generated_112_begin(server, ns)) && +!(retVal = function_namespace0_generated_113_begin(server, ns)) && +!(retVal = function_namespace0_generated_114_begin(server, ns)) && +!(retVal = function_namespace0_generated_115_begin(server, ns)) && +!(retVal = function_namespace0_generated_116_begin(server, ns)) && +!(retVal = function_namespace0_generated_117_begin(server, ns)) && +!(retVal = function_namespace0_generated_118_begin(server, ns)) && +!(retVal = function_namespace0_generated_119_begin(server, ns)) && +!(retVal = function_namespace0_generated_120_begin(server, ns)) && +!(retVal = function_namespace0_generated_121_begin(server, ns)) && +!(retVal = function_namespace0_generated_122_begin(server, ns)) && +!(retVal = function_namespace0_generated_123_begin(server, ns)) && +!(retVal = function_namespace0_generated_124_begin(server, ns)) && +!(retVal = function_namespace0_generated_125_begin(server, ns)) && +!(retVal = function_namespace0_generated_126_begin(server, ns)) && +!(retVal = function_namespace0_generated_127_begin(server, ns)) && +!(retVal = function_namespace0_generated_128_begin(server, ns)) && +!(retVal = function_namespace0_generated_129_begin(server, ns)) && +!(retVal = function_namespace0_generated_130_begin(server, ns)) && +!(retVal = function_namespace0_generated_131_begin(server, ns)) && +!(retVal = function_namespace0_generated_132_begin(server, ns)) && +!(retVal = function_namespace0_generated_133_begin(server, ns)) && +!(retVal = function_namespace0_generated_134_begin(server, ns)) && +!(retVal = function_namespace0_generated_135_begin(server, ns)) && +!(retVal = function_namespace0_generated_136_begin(server, ns)) && +!(retVal = function_namespace0_generated_137_begin(server, ns)) && +!(retVal = function_namespace0_generated_138_begin(server, ns)) && +!(retVal = function_namespace0_generated_139_begin(server, ns)) && +!(retVal = function_namespace0_generated_140_begin(server, ns)) && +!(retVal = function_namespace0_generated_141_begin(server, ns)) && +!(retVal = function_namespace0_generated_142_begin(server, ns)) && +!(retVal = function_namespace0_generated_143_begin(server, ns)) && +!(retVal = function_namespace0_generated_144_begin(server, ns)) && +!(retVal = function_namespace0_generated_145_begin(server, ns)) && +!(retVal = function_namespace0_generated_146_begin(server, ns)) && +!(retVal = function_namespace0_generated_147_begin(server, ns)) && +!(retVal = function_namespace0_generated_148_begin(server, ns)) && +!(retVal = function_namespace0_generated_149_begin(server, ns)) && +!(retVal = function_namespace0_generated_150_begin(server, ns)) && +!(retVal = function_namespace0_generated_151_begin(server, ns)) && +!(retVal = function_namespace0_generated_152_begin(server, ns)) && +!(retVal = function_namespace0_generated_153_begin(server, ns)) && +!(retVal = function_namespace0_generated_154_begin(server, ns)) && +!(retVal = function_namespace0_generated_155_begin(server, ns)) && +!(retVal = function_namespace0_generated_156_begin(server, ns)) && +!(retVal = function_namespace0_generated_157_begin(server, ns)) && +!(retVal = function_namespace0_generated_158_begin(server, ns)) && +!(retVal = function_namespace0_generated_159_begin(server, ns)) && +!(retVal = function_namespace0_generated_160_begin(server, ns)) && +!(retVal = function_namespace0_generated_161_begin(server, ns)) && +!(retVal = function_namespace0_generated_162_begin(server, ns)) && +!(retVal = function_namespace0_generated_163_begin(server, ns)) && +!(retVal = function_namespace0_generated_164_begin(server, ns)) && +!(retVal = function_namespace0_generated_165_begin(server, ns)) && +!(retVal = function_namespace0_generated_165_finish(server, ns)) && +!(retVal = function_namespace0_generated_164_finish(server, ns)) && +!(retVal = function_namespace0_generated_163_finish(server, ns)) && +!(retVal = function_namespace0_generated_162_finish(server, ns)) && +!(retVal = function_namespace0_generated_161_finish(server, ns)) && +!(retVal = function_namespace0_generated_160_finish(server, ns)) && +!(retVal = function_namespace0_generated_159_finish(server, ns)) && +!(retVal = function_namespace0_generated_158_finish(server, ns)) && +!(retVal = function_namespace0_generated_157_finish(server, ns)) && +!(retVal = function_namespace0_generated_156_finish(server, ns)) && +!(retVal = function_namespace0_generated_155_finish(server, ns)) && +!(retVal = function_namespace0_generated_154_finish(server, ns)) && +!(retVal = function_namespace0_generated_153_finish(server, ns)) && +!(retVal = function_namespace0_generated_152_finish(server, ns)) && +!(retVal = function_namespace0_generated_151_finish(server, ns)) && +!(retVal = function_namespace0_generated_150_finish(server, ns)) && +!(retVal = function_namespace0_generated_149_finish(server, ns)) && +!(retVal = function_namespace0_generated_148_finish(server, ns)) && +!(retVal = function_namespace0_generated_147_finish(server, ns)) && +!(retVal = function_namespace0_generated_146_finish(server, ns)) && +!(retVal = function_namespace0_generated_145_finish(server, ns)) && +!(retVal = function_namespace0_generated_144_finish(server, ns)) && +!(retVal = function_namespace0_generated_143_finish(server, ns)) && +!(retVal = function_namespace0_generated_142_finish(server, ns)) && +!(retVal = function_namespace0_generated_141_finish(server, ns)) && +!(retVal = function_namespace0_generated_140_finish(server, ns)) && +!(retVal = function_namespace0_generated_139_finish(server, ns)) && +!(retVal = function_namespace0_generated_138_finish(server, ns)) && +!(retVal = function_namespace0_generated_137_finish(server, ns)) && +!(retVal = function_namespace0_generated_136_finish(server, ns)) && +!(retVal = function_namespace0_generated_135_finish(server, ns)) && +!(retVal = function_namespace0_generated_134_finish(server, ns)) && +!(retVal = function_namespace0_generated_133_finish(server, ns)) && +!(retVal = function_namespace0_generated_132_finish(server, ns)) && +!(retVal = function_namespace0_generated_131_finish(server, ns)) && +!(retVal = function_namespace0_generated_130_finish(server, ns)) && +!(retVal = function_namespace0_generated_129_finish(server, ns)) && +!(retVal = function_namespace0_generated_128_finish(server, ns)) && +!(retVal = function_namespace0_generated_127_finish(server, ns)) && +!(retVal = function_namespace0_generated_126_finish(server, ns)) && +!(retVal = function_namespace0_generated_125_finish(server, ns)) && +!(retVal = function_namespace0_generated_124_finish(server, ns)) && +!(retVal = function_namespace0_generated_123_finish(server, ns)) && +!(retVal = function_namespace0_generated_122_finish(server, ns)) && +!(retVal = function_namespace0_generated_121_finish(server, ns)) && +!(retVal = function_namespace0_generated_120_finish(server, ns)) && +!(retVal = function_namespace0_generated_119_finish(server, ns)) && +!(retVal = function_namespace0_generated_118_finish(server, ns)) && +!(retVal = function_namespace0_generated_117_finish(server, ns)) && +!(retVal = function_namespace0_generated_116_finish(server, ns)) && +!(retVal = function_namespace0_generated_115_finish(server, ns)) && +!(retVal = function_namespace0_generated_114_finish(server, ns)) && +!(retVal = function_namespace0_generated_113_finish(server, ns)) && +!(retVal = function_namespace0_generated_112_finish(server, ns)) && +!(retVal = function_namespace0_generated_111_finish(server, ns)) && +!(retVal = function_namespace0_generated_110_finish(server, ns)) && +!(retVal = function_namespace0_generated_109_finish(server, ns)) && +!(retVal = function_namespace0_generated_108_finish(server, ns)) && +!(retVal = function_namespace0_generated_107_finish(server, ns)) && +!(retVal = function_namespace0_generated_106_finish(server, ns)) && +!(retVal = function_namespace0_generated_105_finish(server, ns)) && +!(retVal = function_namespace0_generated_104_finish(server, ns)) && +!(retVal = function_namespace0_generated_103_finish(server, ns)) && +!(retVal = function_namespace0_generated_102_finish(server, ns)) && +!(retVal = function_namespace0_generated_101_finish(server, ns)) && +!(retVal = function_namespace0_generated_100_finish(server, ns)) && +!(retVal = function_namespace0_generated_99_finish(server, ns)) && +!(retVal = function_namespace0_generated_98_finish(server, ns)) && +!(retVal = function_namespace0_generated_97_finish(server, ns)) && +!(retVal = function_namespace0_generated_96_finish(server, ns)) && +!(retVal = function_namespace0_generated_95_finish(server, ns)) && +!(retVal = function_namespace0_generated_94_finish(server, ns)) && +!(retVal = function_namespace0_generated_93_finish(server, ns)) && +!(retVal = function_namespace0_generated_92_finish(server, ns)) && +!(retVal = function_namespace0_generated_91_finish(server, ns)) && +!(retVal = function_namespace0_generated_90_finish(server, ns)) && +!(retVal = function_namespace0_generated_89_finish(server, ns)) && +!(retVal = function_namespace0_generated_88_finish(server, ns)) && +!(retVal = function_namespace0_generated_87_finish(server, ns)) && +!(retVal = function_namespace0_generated_86_finish(server, ns)) && +!(retVal = function_namespace0_generated_85_finish(server, ns)) && +!(retVal = function_namespace0_generated_84_finish(server, ns)) && +!(retVal = function_namespace0_generated_83_finish(server, ns)) && +!(retVal = function_namespace0_generated_82_finish(server, ns)) && +!(retVal = function_namespace0_generated_81_finish(server, ns)) && +!(retVal = function_namespace0_generated_80_finish(server, ns)) && +!(retVal = function_namespace0_generated_79_finish(server, ns)) && +!(retVal = function_namespace0_generated_78_finish(server, ns)) && +!(retVal = function_namespace0_generated_77_finish(server, ns)) && +!(retVal = function_namespace0_generated_76_finish(server, ns)) && +!(retVal = function_namespace0_generated_75_finish(server, ns)) && +!(retVal = function_namespace0_generated_74_finish(server, ns)) && +!(retVal = function_namespace0_generated_73_finish(server, ns)) && +!(retVal = function_namespace0_generated_72_finish(server, ns)) && +!(retVal = function_namespace0_generated_71_finish(server, ns)) && +!(retVal = function_namespace0_generated_70_finish(server, ns)) && +!(retVal = function_namespace0_generated_69_finish(server, ns)) && +!(retVal = function_namespace0_generated_68_finish(server, ns)) && +!(retVal = function_namespace0_generated_67_finish(server, ns)) && +!(retVal = function_namespace0_generated_66_finish(server, ns)) && +!(retVal = function_namespace0_generated_65_finish(server, ns)) && +!(retVal = function_namespace0_generated_64_finish(server, ns)) && +!(retVal = function_namespace0_generated_63_finish(server, ns)) && +!(retVal = function_namespace0_generated_62_finish(server, ns)) && +!(retVal = function_namespace0_generated_61_finish(server, ns)) && +!(retVal = function_namespace0_generated_60_finish(server, ns)) && +!(retVal = function_namespace0_generated_59_finish(server, ns)) && +!(retVal = function_namespace0_generated_58_finish(server, ns)) && +!(retVal = function_namespace0_generated_57_finish(server, ns)) && +!(retVal = function_namespace0_generated_56_finish(server, ns)) && +!(retVal = function_namespace0_generated_55_finish(server, ns)) && +!(retVal = function_namespace0_generated_54_finish(server, ns)) && +!(retVal = function_namespace0_generated_53_finish(server, ns)) && +!(retVal = function_namespace0_generated_52_finish(server, ns)) && +!(retVal = function_namespace0_generated_51_finish(server, ns)) && +!(retVal = function_namespace0_generated_50_finish(server, ns)) && +!(retVal = function_namespace0_generated_49_finish(server, ns)) && +!(retVal = function_namespace0_generated_48_finish(server, ns)) && +!(retVal = function_namespace0_generated_47_finish(server, ns)) && +!(retVal = function_namespace0_generated_46_finish(server, ns)) && +!(retVal = function_namespace0_generated_45_finish(server, ns)) && +!(retVal = function_namespace0_generated_44_finish(server, ns)) && +!(retVal = function_namespace0_generated_43_finish(server, ns)) && +!(retVal = function_namespace0_generated_42_finish(server, ns)) && +!(retVal = function_namespace0_generated_41_finish(server, ns)) && +!(retVal = function_namespace0_generated_40_finish(server, ns)) && +!(retVal = function_namespace0_generated_39_finish(server, ns)) && +!(retVal = function_namespace0_generated_38_finish(server, ns)) && +!(retVal = function_namespace0_generated_37_finish(server, ns)) && +!(retVal = function_namespace0_generated_36_finish(server, ns)) && +!(retVal = function_namespace0_generated_35_finish(server, ns)) && +!(retVal = function_namespace0_generated_34_finish(server, ns)) && +!(retVal = function_namespace0_generated_33_finish(server, ns)) && +!(retVal = function_namespace0_generated_32_finish(server, ns)) && +!(retVal = function_namespace0_generated_31_finish(server, ns)) && +!(retVal = function_namespace0_generated_30_finish(server, ns)) && +!(retVal = function_namespace0_generated_29_finish(server, ns)) && +!(retVal = function_namespace0_generated_28_finish(server, ns)) && +!(retVal = function_namespace0_generated_27_finish(server, ns)) && +!(retVal = function_namespace0_generated_26_finish(server, ns)) && +!(retVal = function_namespace0_generated_25_finish(server, ns)) && +!(retVal = function_namespace0_generated_24_finish(server, ns)) && +!(retVal = function_namespace0_generated_23_finish(server, ns)) && +!(retVal = function_namespace0_generated_22_finish(server, ns)) && +!(retVal = function_namespace0_generated_21_finish(server, ns)) && +!(retVal = function_namespace0_generated_20_finish(server, ns)) && +!(retVal = function_namespace0_generated_19_finish(server, ns)) && +!(retVal = function_namespace0_generated_18_finish(server, ns)) && +!(retVal = function_namespace0_generated_17_finish(server, ns)) && +!(retVal = function_namespace0_generated_16_finish(server, ns)) && +!(retVal = function_namespace0_generated_15_finish(server, ns)) && +!(retVal = function_namespace0_generated_14_finish(server, ns)) && +!(retVal = function_namespace0_generated_13_finish(server, ns)) && +!(retVal = function_namespace0_generated_12_finish(server, ns)) && +!(retVal = function_namespace0_generated_11_finish(server, ns)) && +!(retVal = function_namespace0_generated_10_finish(server, ns)) && +!(retVal = function_namespace0_generated_9_finish(server, ns)) && +!(retVal = function_namespace0_generated_8_finish(server, ns)) && +!(retVal = function_namespace0_generated_7_finish(server, ns)) && +!(retVal = function_namespace0_generated_6_finish(server, ns)) && +!(retVal = function_namespace0_generated_5_finish(server, ns)) && +!(retVal = function_namespace0_generated_4_finish(server, ns)) && +!(retVal = function_namespace0_generated_3_finish(server, ns)) && +!(retVal = function_namespace0_generated_2_finish(server, ns)) && +!(retVal = function_namespace0_generated_1_finish(server, ns)) && +!(retVal = function_namespace0_generated_0_finish(server, ns)) +); (void)(dummy); +return retVal; +} - if(!isOnline) { - UA_StatusCode removeRetval = - UA_Discovery_removeRecord(server, serverName, &hostname, - port, updateTxt); - if(removeRetval != UA_STATUSCODE_GOOD) - UA_LOG_WARNING(server->config.logger, UA_LOGCATEGORY_SERVER, - "Could not remove mDNS record for hostname %.*s.", - (int)serverName->length, serverName->data); - return; - } +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_discovery_manager.c" ***********************************/ - UA_String *capabilities = NULL; - size_t capabilitiesSize = 0; - if(mdnsConfig) { - capabilities = mdnsConfig->serverCapabilities; - capabilitiesSize = mdnsConfig->serverCapabilitiesSize; - } +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2014, 2017 (c) Florian Palm + * Copyright 2015-2016, 2019 (c) Sten Grüner + * Copyright 2015 (c) Chris Iatrou + * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Julian Grothoff + */ - UA_StatusCode addRetval = - UA_Discovery_addRecord(server, serverName, &hostname, - port, &path, UA_DISCOVERY_TCP, updateTxt, - capabilities, &capabilitiesSize); - if(addRetval != UA_STATUSCODE_GOOD) - UA_LOG_WARNING(server->config.logger, UA_LOGCATEGORY_SERVER, - "Could not add mDNS record for hostname %.*s.", - (int)serverName->length, serverName->data); -} -void -UA_Server_setServerOnNetworkCallback(UA_Server *server, - UA_Server_serverOnNetworkCallback cb, - void* data) { - server->serverOnNetworkCallback = cb; - server->serverOnNetworkCallbackData = data; -} +#ifdef UA_ENABLE_DISCOVERY -static void -socket_mdns_set_nonblocking(int sockfd) { -#ifdef _WIN32 - u_long iMode = 1; - ioctlsocket(sockfd, FIONBIO, &iMode); -#else - int opts = fcntl(sockfd, F_GETFL); - fcntl(sockfd, F_SETFL, opts|O_NONBLOCK); +#ifdef UA_ENABLE_DISCOVERY_MULTICAST + +#ifndef IN_ZERONET +#define IN_ZERONET(addr) ((addr & IN_CLASSA_NET) == 0) #endif -} /* Create multicast 224.0.0.251:5353 socket */ -#ifdef _WIN32 -static SOCKET -#else -static int -#endif -discovery_createMulticastSocket(void) { -#ifdef _WIN32 - SOCKET s; -#else - int s; -#endif +static UA_SOCKET +discovery_createMulticastSocket(UA_Server* server) { + UA_SOCKET s; int flag = 1, ittl = 255; struct sockaddr_in in; struct ip_mreq mc; @@ -35651,6381 +49529,5808 @@ discovery_createMulticastSocket(void) { in.sin_port = htons(5353); in.sin_addr.s_addr = 0; -#ifdef _WIN32 - if((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) - return INVALID_SOCKET; -#else - if((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) - return -1; -#endif + if((s = UA_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == UA_INVALID_SOCKET) + return UA_INVALID_SOCKET; #ifdef SO_REUSEPORT - setsockopt(s, SOL_SOCKET, SO_REUSEPORT, (char *)&flag, sizeof(flag)); -#endif - setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&flag, sizeof(flag)); - if(bind(s, (struct sockaddr *)&in, sizeof(in))) { - CLOSESOCKET(s); -#ifdef _WIN32 - return INVALID_SOCKET; -#else - return -1; + UA_setsockopt(s, SOL_SOCKET, SO_REUSEPORT, (char *)&flag, sizeof(flag)); #endif + UA_setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&flag, sizeof(flag)); + if(UA_bind(s, (struct sockaddr *)&in, sizeof(in))) { + UA_close(s); + return UA_INVALID_SOCKET; + } + + /* Custom outbound multicast interface */ + size_t length = server->config.discovery.mdnsInterfaceIP.length; + if(length > 0){ + char* interfaceName = (char*)UA_malloc(length+1); + if (!interfaceName) { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_NETWORK, "Multicast DNS: cannot alloc memory for iface name"); + return 0; + } + struct in_addr ina; + memset(&ina, 0, sizeof(ina)); + memcpy(interfaceName, server->config.discovery.mdnsInterfaceIP.data, length); + interfaceName[length] = '\0'; + inet_pton(AF_INET, interfaceName, &ina); + UA_free(interfaceName); + /* Set interface for outbound multicast */ + if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (char*)&ina, sizeof(ina)) < 0) + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, "Multicast DNS: failed setting IP_MULTICAST_IF to %s: %s", inet_ntoa(ina), strerror(errno)); + } + + /* Check outbound multicast interface parameters */ + struct in_addr interface_addr; + socklen_t addr_size = sizeof(struct in_addr); + if (getsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (char*)&interface_addr, &addr_size) < 0) { + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_NETWORK, "Multicast DNS: getsockopt(IP_MULTICAST_IF) failed"); + } + + if(IN_ZERONET(ntohl(interface_addr.s_addr))){ + UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_NETWORK, "Multicast DNS: outbound interface 0.0.0.0, it means that the first OS interface is used (you can explicitly set the interface by using 'discovery.mdnsInterfaceIP' config parameter)"); + }else{ + char buf[16]; + inet_ntop(AF_INET, &interface_addr, buf, 16); + UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_NETWORK, "Multicast DNS: outbound interface is %s", buf); } mc.imr_multiaddr.s_addr = inet_addr("224.0.0.251"); mc.imr_interface.s_addr = htonl(INADDR_ANY); - setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mc, sizeof(mc)); - setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl)); - setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ittl, sizeof(ittl)); + UA_setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mc, sizeof(mc)); + UA_setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl)); + UA_setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ittl, sizeof(ittl)); - socket_mdns_set_nonblocking(s); + UA_socket_set_nonblocking(s); //TODO: check return value return s; } +static UA_StatusCode +initMulticastDiscoveryServer(UA_DiscoveryManager *dm, UA_Server* server) { + server->discoveryManager.mdnsDaemon = mdnsd_new(QCLASS_IN, 1000); + UA_initialize_architecture_network(); -UA_StatusCode -initMulticastDiscoveryServer(UA_Server* server) { - server->mdnsDaemon = mdnsd_new(QCLASS_IN, 1000); -#ifdef _WIN32 - WORD wVersionRequested = MAKEWORD(2, 2); - WSADATA wsaData; - WSAStartup(wVersionRequested, &wsaData); -#endif - -#ifdef _WIN32 - if((server->mdnsSocket = discovery_createMulticastSocket()) == INVALID_SOCKET) { -#else - if((server->mdnsSocket = discovery_createMulticastSocket()) < 0) { -#endif + if((server->discoveryManager.mdnsSocket = discovery_createMulticastSocket(server)) == UA_INVALID_SOCKET) { UA_LOG_SOCKET_ERRNO_WRAP( - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, + UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, "Could not create multicast socket. Error: %s", errno_str)); return UA_STATUSCODE_BADUNEXPECTEDERROR; } - mdnsd_register_receive_callback(server->mdnsDaemon, + mdnsd_register_receive_callback(server->discoveryManager.mdnsDaemon, mdns_record_received, server); return UA_STATUSCODE_GOOD; } -void destroyMulticastDiscoveryServer(UA_Server* server) { - mdnsd_shutdown(server->mdnsDaemon); - mdnsd_free(server->mdnsDaemon); -#ifdef _WIN32 - if(server->mdnsSocket != INVALID_SOCKET) { -#else - if(server->mdnsSocket >= 0) { -#endif - CLOSESOCKET(server->mdnsSocket); -#ifdef _WIN32 - server->mdnsSocket = INVALID_SOCKET; -#else - server->mdnsSocket = -1; -#endif - } -} - -static void -UA_Discovery_multicastConflict(char *name, int type, void *arg) { - // cppcheck-suppress unreadVariable - UA_Server *server = (UA_Server*) arg; - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast DNS name conflict detected: " - "'%s' for type %d", name, type); -} - -/* Create a service domain with the format [servername]-[hostname]._opcua-tcp._tcp.local. */ static void -createFullServiceDomain(char *outServiceDomain, size_t maxLen, - const UA_String *servername, const UA_String *hostname) { - size_t hostnameLen = hostname->length; - size_t servernameLen = servername->length; - - maxLen -= 24; /* the length we have remaining before the opc ua postfix and - * the trailing zero */ - - /* Can we use hostname and servername with full length? */ - if(hostnameLen + servernameLen + 1 > maxLen) { - if(servernameLen + 2 > maxLen) { - servernameLen = maxLen; - hostnameLen = 0; - } else { - hostnameLen = maxLen - servernameLen - 1; - } - } +destroyMulticastDiscoveryServer(UA_DiscoveryManager *dm) { + if (!dm->mdnsDaemon) + return; - /* Copy into outServiceDomain */ - size_t offset = 0; - memcpy(&outServiceDomain[offset], servername->data, servernameLen); - offset += servernameLen; - if(hostnameLen > 0) { - memcpy(&outServiceDomain[offset], "-", 1); - ++offset; - memcpy(&outServiceDomain[offset], hostname->data, hostnameLen); - offset += hostnameLen; - } - memcpy(&outServiceDomain[offset], "._opcua-tcp._tcp.local.", 23); - offset += 23; - outServiceDomain[offset] = 0; -} + mdnsd_shutdown(dm->mdnsDaemon); + mdnsd_free(dm->mdnsDaemon); -/* Check if mDNS already has an entry for given hostname and port combination */ -static UA_Boolean -UA_Discovery_recordExists(UA_Server* server, const char* fullServiceDomain, - unsigned short port, const UA_DiscoveryProtocol protocol) { - // [servername]-[hostname]._opcua-tcp._tcp.local. 86400 IN SRV 0 5 port [hostname]. - mdns_record_t *r = mdnsd_get_published(server->mdnsDaemon, fullServiceDomain); - while(r) { - const mdns_answer_t *data = mdnsd_record_data(r); - if(data->type == QTYPE_SRV && (port == 0 || data->srv.port == port)) - return UA_TRUE; - r = mdnsd_record_next(r); + if(dm->mdnsSocket != UA_INVALID_SOCKET) { + UA_close(dm->mdnsSocket); + dm->mdnsSocket = UA_INVALID_SOCKET; } - return UA_FALSE; } -static int -discovery_multicastQueryAnswer(mdns_answer_t *a, void *arg) { - UA_Server *server = (UA_Server*) arg; - if(a->type != QTYPE_PTR) - return 0; - - if(a->rdname == NULL) - return 0; - - /* Skip, if we already know about this server */ - UA_Boolean exists = - UA_Discovery_recordExists(server, a->rdname, 0, UA_DISCOVERY_TCP); - if(exists == UA_TRUE) - return 0; - - if(mdnsd_has_query(server->mdnsDaemon, a->rdname)) - return 0; +#endif /* UA_ENABLE_DISCOVERY_MULTICAST */ - UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER, - "mDNS send query for: %s SRV&TXT %s", a->name, a->rdname); +void +UA_DiscoveryManager_init(UA_DiscoveryManager *dm, UA_Server *server) { + LIST_INIT(&dm->registeredServers); + dm->registeredServersSize = 0; + LIST_INIT(&dm->periodicServerRegisterCallbacks); + dm->registerServerCallback = NULL; + dm->registerServerCallbackData = NULL; - mdnsd_query(server->mdnsDaemon, a->rdname, QTYPE_SRV, - discovery_multicastQueryAnswer, server); - mdnsd_query(server->mdnsDaemon, a->rdname, QTYPE_TXT, - discovery_multicastQueryAnswer, server); - return 0; -} +#ifdef UA_ENABLE_DISCOVERY_MULTICAST + dm->mdnsDaemon = NULL; + dm->mdnsSocket = UA_INVALID_SOCKET; + dm->mdnsMainSrvAdded = false; + if(server->config.discovery.mdnsEnable) + initMulticastDiscoveryServer(dm, server); + + LIST_INIT(&dm->serverOnNetwork); + dm->serverOnNetworkSize = 0; + dm->serverOnNetworkRecordIdCounter = 0; + dm->serverOnNetworkRecordIdLastReset = UA_DateTime_now(); + memset(dm->serverOnNetworkHash, 0, + sizeof(struct serverOnNetwork_hash_entry*) * SERVER_ON_NETWORK_HASH_PRIME); -UA_StatusCode -UA_Discovery_multicastQuery(UA_Server* server) { - mdnsd_query(server->mdnsDaemon, "_opcua-tcp._tcp.local.", - QTYPE_PTR,discovery_multicastQueryAnswer, server); - return UA_STATUSCODE_GOOD; + dm->serverOnNetworkCallback = NULL; + dm->serverOnNetworkCallbackData = NULL; +#endif /* UA_ENABLE_DISCOVERY_MULTICAST */ } -UA_StatusCode -UA_Discovery_addRecord(UA_Server *server, const UA_String *servername, - const UA_String *hostname, UA_UInt16 port, - const UA_String *path, const UA_DiscoveryProtocol protocol, - UA_Boolean createTxt, const UA_String* capabilites, - size_t *capabilitiesSize) { - if(!capabilitiesSize || (*capabilitiesSize > 0 && !capabilites)) - return UA_STATUSCODE_BADINVALIDARGUMENT; - - size_t hostnameLen = hostname->length; - size_t servernameLen = servername->length; - if(hostnameLen == 0 || servernameLen == 0) - return UA_STATUSCODE_BADOUTOFRANGE; - - // use a limit for the hostname length to make sure full string fits into 63 - // chars (limited by DNS spec) - if(hostnameLen+servernameLen + 1 > 63) { // include dash between servername-hostname - UA_LOG_WARNING(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast DNS: Combination of hostname+servername exceeds " - "maximum of 62 chars. It will be truncated."); - } else if(hostnameLen > 63) { - UA_LOG_WARNING(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast DNS: Hostname length exceeds maximum of 63 chars. " - "It will be truncated."); - } - - if(!server->mdnsMainSrvAdded) { - mdns_record_t *r = - mdnsd_shared(server->mdnsDaemon, "_services._dns-sd._udp.local.", - QTYPE_PTR, 600); - mdnsd_set_host(server->mdnsDaemon, r, "_opcua-tcp._tcp.local."); - server->mdnsMainSrvAdded = UA_TRUE; - } - - // [servername]-[hostname]._opcua-tcp._tcp.local. - char fullServiceDomain[63+24]; - createFullServiceDomain(fullServiceDomain, 63+24, servername, hostname); - - UA_Boolean exists = UA_Discovery_recordExists(server, fullServiceDomain, port, protocol); - if(exists == UA_TRUE) - return UA_STATUSCODE_GOOD; - - UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast DNS: add record for domain: %s", fullServiceDomain); - - // _services._dns-sd._udp.local. PTR _opcua-tcp._tcp.local - - // check if there is already a PTR entry for the given service. - - // _opcua-tcp._tcp.local. PTR [servername]-[hostname]._opcua-tcp._tcp.local. - mdns_record_t *r = mdns_find_record(server->mdnsDaemon, QTYPE_PTR, - "_opcua-tcp._tcp.local.", fullServiceDomain); - if(!r) { - r = mdnsd_shared(server->mdnsDaemon, "_opcua-tcp._tcp.local.", QTYPE_PTR, 600); - mdnsd_set_host(server->mdnsDaemon, r, fullServiceDomain); - } - - /* The first 63 characters of the hostname (or less) */ - size_t maxHostnameLen = UA_MIN(hostnameLen, 63); - char localDomain[65]; - memcpy(localDomain, hostname->data, maxHostnameLen); - localDomain[maxHostnameLen] = '.'; - localDomain[maxHostnameLen+1] = '\0'; - - // [servername]-[hostname]._opcua-tcp._tcp.local. 86400 IN SRV 0 5 port [hostname]. - r = mdnsd_unique(server->mdnsDaemon, fullServiceDomain, QTYPE_SRV, 600, - UA_Discovery_multicastConflict, server); - mdnsd_set_srv(server->mdnsDaemon, r, 0, 0, port, localDomain); - - // A/AAAA record for all ip addresses. - // [servername]-[hostname]._opcua-tcp._tcp.local. A [ip]. - // [hostname]. A [ip]. - mdns_set_address_record(server, fullServiceDomain, localDomain); - - // TXT record: [servername]-[hostname]._opcua-tcp._tcp.local. TXT path=/ caps=NA,DA,... - UA_STACKARRAY(char, pathChars, path->length + 1); - if(createTxt) { - memcpy(pathChars, path->data, path->length); - pathChars[path->length] = 0; - mdns_create_txt(server, fullServiceDomain, pathChars, capabilites, - capabilitiesSize, UA_Discovery_multicastConflict); +void +UA_DiscoveryManager_deleteMembers(UA_DiscoveryManager *dm, UA_Server *server) { + registeredServer_list_entry *rs, *rs_tmp; + LIST_FOREACH_SAFE(rs, &dm->registeredServers, pointers, rs_tmp) { + LIST_REMOVE(rs, pointers); + UA_RegisteredServer_deleteMembers(&rs->registeredServer); + UA_free(rs); } - - return UA_STATUSCODE_GOOD; -} - -UA_StatusCode -UA_Discovery_removeRecord(UA_Server *server, const UA_String *servername, - const UA_String *hostname, UA_UInt16 port, - UA_Boolean removeTxt) { - // use a limit for the hostname length to make sure full string fits into 63 - // chars (limited by DNS spec) - size_t hostnameLen = hostname->length; - size_t servernameLen = servername->length; - if(hostnameLen == 0 || servernameLen == 0) - return UA_STATUSCODE_BADOUTOFRANGE; - - if(hostnameLen+servernameLen+1 > 63) { // include dash between servername-hostname - UA_LOG_WARNING(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast DNS: Combination of hostname+servername exceeds " - "maximum of 62 chars. It will be truncated."); + periodicServerRegisterCallback_entry *ps, *ps_tmp; + LIST_FOREACH_SAFE(ps, &dm->periodicServerRegisterCallbacks, pointers, ps_tmp) { + LIST_REMOVE(ps, pointers); + if (ps->callback->discovery_server_url) + UA_free(ps->callback->discovery_server_url); + UA_free(ps->callback); + UA_free(ps); } - // [servername]-[hostname]._opcua-tcp._tcp.local. - char fullServiceDomain[63 + 24]; - createFullServiceDomain(fullServiceDomain, 63+24, servername, hostname); - - UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast DNS: remove record for domain: %s", fullServiceDomain); - - // _opcua-tcp._tcp.local. PTR [servername]-[hostname]._opcua-tcp._tcp.local. - mdns_record_t *r = mdns_find_record(server->mdnsDaemon, QTYPE_PTR, - "_opcua-tcp._tcp.local.", fullServiceDomain); - if(!r) { - UA_LOG_WARNING(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast DNS: could not remove record. " - "PTR Record not found for domain: %s", fullServiceDomain); - return UA_STATUSCODE_BADNOTHINGTODO; - } - mdnsd_done(server->mdnsDaemon, r); +# ifdef UA_ENABLE_DISCOVERY_MULTICAST + if(server->config.discovery.mdnsEnable) + destroyMulticastDiscoveryServer(dm); - // looks for [servername]-[hostname]._opcua-tcp._tcp.local. 86400 IN SRV 0 5 port hostname.local. - // and TXT record: [servername]-[hostname]._opcua-tcp._tcp.local. TXT path=/ caps=NA,DA,... - // and A record: [servername]-[hostname]._opcua-tcp._tcp.local. A [ip] - mdns_record_t *r2 = mdnsd_get_published(server->mdnsDaemon, fullServiceDomain); - if(!r2) { - UA_LOG_WARNING(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast DNS: could not remove record. Record not " - "found for domain: %s", fullServiceDomain); - return UA_STATUSCODE_BADNOTHINGTODO; + serverOnNetwork_list_entry *son, *son_tmp; + LIST_FOREACH_SAFE(son, &dm->serverOnNetwork, pointers, son_tmp) { + LIST_REMOVE(son, pointers); + UA_ServerOnNetwork_deleteMembers(&son->serverOnNetwork); + if(son->pathTmp) + UA_free(son->pathTmp); + UA_free(son); } - while(r2) { - const mdns_answer_t *data = mdnsd_record_data(r2); - mdns_record_t *next = mdnsd_record_next(r2); - if((removeTxt && data->type == QTYPE_TXT) || - (removeTxt && data->type == QTYPE_A) || - data->srv.port == port) { - mdnsd_done(server->mdnsDaemon, r2); + for(size_t i = 0; i < SERVER_ON_NETWORK_HASH_PRIME; i++) { + serverOnNetwork_hash_entry* currHash = dm->serverOnNetworkHash[i]; + while(currHash) { + serverOnNetwork_hash_entry* nextHash = currHash->next; + UA_free(currHash); + currHash = nextHash; } - r2 = next; - } - - return UA_STATUSCODE_GOOD; -} - -UA_StatusCode -iterateMulticastDiscoveryServer(UA_Server* server, UA_DateTime *nextRepeat, - UA_Boolean processIn) { - struct timeval next_sleep = { 0, 0 }; - unsigned short retval = mdnsd_step(server->mdnsDaemon, server->mdnsSocket, - processIn, true, &next_sleep); - if(retval == 1) { - UA_LOG_SOCKET_ERRNO_WRAP( - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast error: Can not read from socket. %s", errno_str)); - return UA_STATUSCODE_BADNOCOMMUNICATION; - } else if(retval == 2) { - UA_LOG_SOCKET_ERRNO_WRAP( - UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, - "Multicast error: Can not write to socket. %s", errno_str)); - return UA_STATUSCODE_BADNOCOMMUNICATION; } - if(nextRepeat) - *nextRepeat = UA_DateTime_now() + - (UA_DateTime)((next_sleep.tv_sec * UA_DATETIME_SEC) + - (next_sleep.tv_usec * UA_DATETIME_USEC)); - return UA_STATUSCODE_GOOD; +# endif /* UA_ENABLE_DISCOVERY_MULTICAST */ } -#endif /* defined(UA_ENABLE_DISCOVERY) && defined(UA_ENABLE_DISCOVERY_MULTICAST) */ +#endif /* UA_ENABLE_DISCOVERY */ -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/client/ua_client.c" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_subscription.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2015-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2015 (c) Chris Iatrou * Copyright 2015-2016 (c) Sten Grüner - * Copyright 2015-2016 (c) Chris Iatrou - * Copyright 2015 (c) hfaham - * Copyright 2015-2017 (c) Florian Palm * Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA - * Copyright 2015 (c) Holger Jeromin - * Copyright 2015 (c) Oleksiy Vasylyev - * Copyright 2016 (c) TorbenD + * Copyright 2015 (c) Joakim L. Gilje + * Copyright 2016-2017 (c) Florian Palm + * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2017 (c) frax2222 * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2016 (c) Lykurg - * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2017 (c) Ari Breitkreuz, fortiss GmbH + * Copyright 2017 (c) Mattias Bornhager + * Copyright 2018 (c) Hilscher Gesellschaft für Systemautomation mbH (Author: Martin Lang) */ -/********************/ -/* Client Lifecycle */ -/********************/ - -static void -UA_Client_init(UA_Client* client, UA_ClientConfig config) { - memset(client, 0, sizeof(UA_Client)); - /* TODO: Select policy according to the endpoint */ - UA_SecurityPolicy_None(&client->securityPolicy, NULL, UA_BYTESTRING_NULL, config.logger); - client->channel.securityPolicy = &client->securityPolicy; - client->channel.securityMode = UA_MESSAGESECURITYMODE_NONE; - client->config = config; - if(client->config.stateCallback) - client->config.stateCallback(client, client->state); -} +#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */ -UA_Client * -UA_Client_new(UA_ClientConfig config) { - UA_Client *client = (UA_Client*)UA_malloc(sizeof(UA_Client)); - if(!client) +UA_Subscription * +UA_Subscription_new(UA_Session *session, UA_UInt32 subscriptionId) { + /* Allocate the memory */ + UA_Subscription *newSub = + (UA_Subscription*)UA_calloc(1, sizeof(UA_Subscription)); + if(!newSub) return NULL; - UA_Client_init(client, config); - return client; -} - -static void -UA_Client_deleteMembers(UA_Client* client) { - UA_Client_disconnect(client); - client->securityPolicy.deleteMembers(&client->securityPolicy); - UA_SecureChannel_deleteMembersCleanup(&client->channel); - UA_Connection_deleteMembers(&client->connection); - if(client->endpointUrl.data) - UA_String_deleteMembers(&client->endpointUrl); - UA_UserTokenPolicy_deleteMembers(&client->token); - UA_NodeId_deleteMembers(&client->authenticationToken); - if(client->username.data) - UA_String_deleteMembers(&client->username); - if(client->password.data) - UA_String_deleteMembers(&client->password); - /* Delete the async service calls */ - UA_Client_AsyncService_removeAll(client, UA_STATUSCODE_BADSHUTDOWN); - - /* Delete the subscriptions */ -#ifdef UA_ENABLE_SUBSCRIPTIONS - UA_Client_Subscriptions_clean(client); -#endif + /* Remaining members are covered by calloc zeroing out the memory */ + newSub->session = session; + newSub->subscriptionId = subscriptionId; + newSub->state = UA_SUBSCRIPTIONSTATE_NORMAL; /* The first publish response is sent immediately */ + /* Even if the first publish response is a keepalive the sequence number is 1. + * This can happen by a subscription without a monitored item (see CTT test scripts). */ + newSub->nextSequenceNumber = 1; + TAILQ_INIT(&newSub->retransmissionQueue); + TAILQ_INIT(&newSub->notificationQueue); + return newSub; } void -UA_Client_reset(UA_Client* client) { - UA_Client_deleteMembers(client); - UA_Client_init(client, client->config); -} +UA_Subscription_deleteMembers(UA_Server *server, UA_Subscription *sub) { + Subscription_unregisterPublishCallback(server, sub); -void -UA_Client_delete(UA_Client* client) { - UA_Client_deleteMembers(client); - UA_free(client); -} + /* Delete monitored Items */ + UA_MonitoredItem *mon, *tmp_mon; + LIST_FOREACH_SAFE(mon, &sub->monitoredItems, listEntry, tmp_mon) { + LIST_REMOVE(mon, listEntry); + UA_LOG_INFO_SESSION(&server->config.logger, sub->session, + "Subscription %u | MonitoredItem %i | " + "Deleted the MonitoredItem", sub->subscriptionId, + mon->monitoredItemId); + UA_MonitoredItem_delete(server, mon); + } + UA_assert(server->numMonitoredItems >= sub->monitoredItemsSize); + server->numMonitoredItems -= sub->monitoredItemsSize; + sub->monitoredItemsSize = 0; -UA_ClientState -UA_Client_getState(UA_Client *client) { - return client->state; -} + /* Delete Retransmission Queue */ + UA_NotificationMessageEntry *nme, *nme_tmp; + TAILQ_FOREACH_SAFE(nme, &sub->retransmissionQueue, listEntry, nme_tmp) { + TAILQ_REMOVE(&sub->retransmissionQueue, nme, listEntry); + UA_NotificationMessage_deleteMembers(&nme->message); + UA_free(nme); + --sub->session->totalRetransmissionQueueSize; + --sub->retransmissionQueueSize; + } + UA_assert(sub->retransmissionQueueSize == 0); -void * -UA_Client_getContext(UA_Client *client) { - if(!client) - return NULL; - return client->config.clientContext; + UA_LOG_INFO_SESSION(&server->config.logger, sub->session, + "Subscription %u | Deleted the Subscription", + sub->subscriptionId); } -/****************/ -/* Raw Services */ -/****************/ - -/* For synchronous service calls. Execute async responses with a callback. When - * the response with the correct requestId turns up, return it via the - * SyncResponseDescription pointer. */ -typedef struct { - UA_Client *client; - UA_Boolean received; - UA_UInt32 requestId; - void *response; - const UA_DataType *responseType; -} SyncResponseDescription; - -/* For both synchronous and asynchronous service calls */ -static UA_StatusCode -sendSymmetricServiceRequest(UA_Client *client, const void *request, - const UA_DataType *requestType, UA_UInt32 *requestId) { - UA_StatusCode retval; +UA_MonitoredItem * +UA_Subscription_getMonitoredItem(UA_Subscription *sub, UA_UInt32 monitoredItemId) { + UA_MonitoredItem *mon; + LIST_FOREACH(mon, &sub->monitoredItems, listEntry) { + if(mon->monitoredItemId == monitoredItemId) + break; + } + return mon; +} - /* If a message is pending in the chunk don't call UA_Client_manuallyRenewSecureChannel - * to prevent incomming message desynchronization */ - if(!client->connection.pendingMessage) { - /* Make sure we have a valid session */ - retval = UA_Client_manuallyRenewSecureChannel(client); - if(retval != UA_STATUSCODE_GOOD) - return retval; +UA_StatusCode +UA_Subscription_deleteMonitoredItem(UA_Server *server, UA_Subscription *sub, + UA_UInt32 monitoredItemId) { + /* Find the MonitoredItem */ + UA_MonitoredItem *mon; + LIST_FOREACH(mon, &sub->monitoredItems, listEntry) { + if(mon->monitoredItemId == monitoredItemId) + break; } + if(!mon) + return UA_STATUSCODE_BADMONITOREDITEMIDINVALID; - /* Adjusting the request header. The const attribute is violated, but we - * only touch the following members: */ - UA_RequestHeader *rr = (UA_RequestHeader*)(uintptr_t)request; - rr->authenticationToken = client->authenticationToken; /* cleaned up at the end */ - rr->timestamp = UA_DateTime_now(); - rr->requestHandle = ++client->requestHandle; + UA_LOG_INFO_SESSION(&server->config.logger, sub->session, + "Subscription %u | MonitoredItem %i | " + "Delete the MonitoredItem", sub->subscriptionId, + mon->monitoredItemId); - /* Send the request */ - UA_UInt32 rqId = ++client->requestId; - UA_LOG_DEBUG(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Sending a request of type %i", requestType->typeId.identifier.numeric); + /* Remove the MonitoredItem */ + LIST_REMOVE(mon, listEntry); + UA_assert(sub->monitoredItemsSize > 0); + UA_assert(server->numMonitoredItems > 0); + sub->monitoredItemsSize--; + server->numMonitoredItems--; - if (client->channel.nextSecurityToken.tokenId != 0) // Change to the new security token if the secure channel has been renewed. - UA_SecureChannel_revolveTokens(&client->channel); - retval = UA_SecureChannel_sendSymmetricMessage(&client->channel, rqId, UA_MESSAGETYPE_MSG, - rr, requestType); - UA_NodeId_init(&rr->authenticationToken); /* Do not return the token to the user */ - if(retval != UA_STATUSCODE_GOOD) - return retval; + /* Remove content and delayed free */ + UA_MonitoredItem_delete(server, mon); - *requestId = rqId; return UA_STATUSCODE_GOOD; } -static const UA_NodeId -serviceFaultId = {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_SERVICEFAULT_ENCODING_DEFAULTBINARY}}; - -/* Look for the async callback in the linked list, execute and delete it */ -static UA_StatusCode -processAsyncResponse(UA_Client *client, UA_UInt32 requestId, const UA_NodeId *responseTypeId, - const UA_ByteString *responseMessage, size_t *offset) { - /* Find the callback */ - AsyncServiceCall *ac; - LIST_FOREACH(ac, &client->asyncServiceCalls, pointers) { - if(ac->requestId == requestId) - break; - } - if(!ac) - return UA_STATUSCODE_BADREQUESTHEADERINVALID; +void +UA_Subscription_addMonitoredItem(UA_Server *server, UA_Subscription *sub, UA_MonitoredItem *newMon) { + sub->monitoredItemsSize++; + server->numMonitoredItems++; + LIST_INSERT_HEAD(&sub->monitoredItems, newMon, listEntry); +} - /* Allocate the response */ - UA_STACKARRAY(UA_Byte, responseBuf, ac->responseType->memSize); - void *response = (void*)(uintptr_t)&responseBuf[0]; /* workaround aliasing rules */ +static void +removeOldestRetransmissionMessage(UA_Session *session) { + UA_NotificationMessageEntry *oldestEntry = NULL; + UA_Subscription *oldestSub = NULL; - /* Verify the type of the response */ - const UA_DataType *responseType = ac->responseType; - const UA_NodeId expectedNodeId = UA_NODEID_NUMERIC(0, ac->responseType->binaryEncodingId); - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(!UA_NodeId_equal(responseTypeId, &expectedNodeId)) { - UA_init(response, ac->responseType); - if(UA_NodeId_equal(responseTypeId, &serviceFaultId)) { - /* Decode as a ServiceFault, i.e. only the response header */ - UA_LOG_INFO(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Received a ServiceFault response"); - responseType = &UA_TYPES[UA_TYPES_SERVICEFAULT]; - } else { - /* Close the connection */ - UA_LOG_ERROR(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Reply contains the wrong service response"); - retval = UA_STATUSCODE_BADCOMMUNICATIONERROR; - goto process; + UA_Subscription *sub; + LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) { + UA_NotificationMessageEntry *first = + TAILQ_LAST(&sub->retransmissionQueue, ListOfNotificationMessages); + if(!first) + continue; + if(!oldestEntry || oldestEntry->message.publishTime > first->message.publishTime) { + oldestEntry = first; + oldestSub = sub; } } + UA_assert(oldestEntry); + UA_assert(oldestSub); - /* Decode the response */ - retval = UA_decodeBinary(responseMessage, offset, response, - responseType, 0, NULL); + TAILQ_REMOVE(&oldestSub->retransmissionQueue, oldestEntry, listEntry); + UA_NotificationMessage_deleteMembers(&oldestEntry->message); + UA_free(oldestEntry); + --session->totalRetransmissionQueueSize; + --oldestSub->retransmissionQueueSize; +} - process: - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Could not decode the response with id %u due to %s", - requestId, UA_StatusCode_name(retval)); - ((UA_ResponseHeader*)response)->serviceResult = retval; +static void +UA_Subscription_addRetransmissionMessage(UA_Server *server, UA_Subscription *sub, + UA_NotificationMessageEntry *entry) { + /* Release the oldest entry if there is not enough space */ + if(server->config.maxRetransmissionQueueSize > 0 && + sub->session->totalRetransmissionQueueSize >= server->config.maxRetransmissionQueueSize) { + UA_LOG_WARNING_SESSION(&server->config.logger, sub->session, "Subscription %u | " + "Retransmission queue overflow", sub->subscriptionId); + removeOldestRetransmissionMessage(sub->session); } - /* Call the callback */ - if (ac->callback) - ac->callback(client, ac->userdata, requestId, response, ac->responseType); - UA_deleteMembers(response, ac->responseType); + /* Add entry */ + TAILQ_INSERT_TAIL(&sub->retransmissionQueue, entry, listEntry); + ++sub->session->totalRetransmissionQueueSize; + ++sub->retransmissionQueueSize; +} - /* Remove the callback */ - LIST_REMOVE(ac, pointers); - UA_free(ac); - return retval; +UA_StatusCode +UA_Subscription_removeRetransmissionMessage(UA_Subscription *sub, UA_UInt32 sequenceNumber) { + /* Find the retransmission message */ + UA_NotificationMessageEntry *entry; + TAILQ_FOREACH(entry, &sub->retransmissionQueue, listEntry) { + if(entry->message.sequenceNumber == sequenceNumber) + break; + } + if(!entry) + return UA_STATUSCODE_BADSEQUENCENUMBERUNKNOWN; + + /* Remove the retransmission message */ + TAILQ_REMOVE(&sub->retransmissionQueue, entry, listEntry); + --sub->session->totalRetransmissionQueueSize; + --sub->retransmissionQueueSize; + UA_NotificationMessage_deleteMembers(&entry->message); + UA_free(entry); + return UA_STATUSCODE_GOOD; } -/* Processes the received service response. Either with an async callback or by - * decoding the message and returning it "upwards" in the - * SyncResponseDescription. */ static UA_StatusCode -processServiceResponse(void *application, UA_SecureChannel *channel, - UA_MessageType messageType, UA_UInt32 requestId, - const UA_ByteString *message) { - SyncResponseDescription *rd = (SyncResponseDescription*)application; +prepareNotificationMessage(UA_Server *server, UA_Subscription *sub, + UA_NotificationMessage *message, size_t notifications) { + UA_assert(notifications > 0); - /* Must be OPN or MSG */ - if(messageType != UA_MESSAGETYPE_OPN && - messageType != UA_MESSAGETYPE_MSG) { - UA_LOG_TRACE_CHANNEL(rd->client->config.logger, channel, - "Invalid message type"); - return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; + /* Allocate an ExtensionObject for events and data */ + message->notificationData = (UA_ExtensionObject*) + UA_Array_new(2, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); + if(!message->notificationData) + return UA_STATUSCODE_BADOUTOFMEMORY; + message->notificationDataSize = 2; + + /* Pre-allocate DataChangeNotifications */ + size_t notificationDataIdx = 0; + UA_DataChangeNotification *dcn = NULL; + if(sub->dataChangeNotifications > 0) { + dcn = UA_DataChangeNotification_new(); + if(!dcn) { + UA_NotificationMessage_deleteMembers(message); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + message->notificationData->encoding = UA_EXTENSIONOBJECT_DECODED; + message->notificationData->content.decoded.data = dcn; + message->notificationData->content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]; + + size_t dcnSize = sub->dataChangeNotifications; + if(dcnSize > notifications) + dcnSize = notifications; + dcn->monitoredItems = (UA_MonitoredItemNotification*) + UA_Array_new(dcnSize, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]); + if(!dcn->monitoredItems) { + UA_NotificationMessage_deleteMembers(message); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + dcn->monitoredItemsSize = dcnSize; + notificationDataIdx++; + } + +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + UA_EventNotificationList *enl = NULL; + UA_StatusChangeNotification *scn = NULL; + /* Pre-allocate either StatusChange or EventNotifications. Sending a + * (single) StatusChangeNotification has priority. */ + if(sub->statusChangeNotifications > 0) { + scn = UA_StatusChangeNotification_new(); + if(!scn) { + UA_NotificationMessage_deleteMembers(message); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + message->notificationData[notificationDataIdx].encoding = UA_EXTENSIONOBJECT_DECODED; + message->notificationData[notificationDataIdx].content.decoded.data = scn; + message->notificationData[notificationDataIdx].content.decoded.type = &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]; + notificationDataIdx++; + } else if(sub->eventNotifications > 0) { + enl = UA_EventNotificationList_new(); + if(!enl) { + UA_NotificationMessage_deleteMembers(message); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + message->notificationData[notificationDataIdx].encoding = UA_EXTENSIONOBJECT_DECODED; + message->notificationData[notificationDataIdx].content.decoded.data = enl; + message->notificationData[notificationDataIdx].content.decoded.type = &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]; + + size_t enlSize = sub->eventNotifications; + if(enlSize > notifications) + enlSize = notifications; + enl->events = (UA_EventFieldList*) UA_Array_new(enlSize, &UA_TYPES[UA_TYPES_EVENTFIELDLIST]); + if(!enl->events) { + UA_NotificationMessage_deleteMembers(message); + return UA_STATUSCODE_BADOUTOFMEMORY; + } + enl->eventsSize = enlSize; + notificationDataIdx++; } +#endif - /* Has the SecureChannel timed out? - * TODO: Solve this for client and server together */ - if(rd->client->state >= UA_CLIENTSTATE_SECURECHANNEL && - (channel->securityToken.createdAt + - (channel->securityToken.revisedLifetime * UA_DATETIME_MSEC)) - < UA_DateTime_nowMonotonic()) - return UA_STATUSCODE_BADSECURECHANNELCLOSED; + UA_assert(notificationDataIdx > 0); + message->notificationDataSize = notificationDataIdx; - /* Decode the data type identifier of the response */ - size_t offset = 0; - UA_NodeId responseId; - UA_StatusCode retval = UA_NodeId_decodeBinary(message, &offset, &responseId); - if(retval != UA_STATUSCODE_GOOD) - goto finish; + /* <-- The point of no return --> */ - /* Got an asynchronous response. Don't expected a synchronous response - * (responseType NULL) or the id does not match. */ - if(!rd->responseType || requestId != rd->requestId) { - retval = processAsyncResponse(rd->client, requestId, &responseId, message, &offset); - goto finish; - } + size_t totalNotifications = 0; /* How many notifications were moved to the response overall? */ + size_t dcnPos = 0; /* How many DataChangeNotifications were put into the list? */ +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + size_t enlPos = 0; /* How many EventNotifications were moved into the list */ +#endif + UA_Notification *notification, *notification_tmp; + TAILQ_FOREACH_SAFE(notification, &sub->notificationQueue, globalEntry, notification_tmp) { + if(totalNotifications >= notifications) + break; - /* Got the synchronous response */ - rd->received = true; + UA_MonitoredItem *mon = notification->mon; - /* Forward declaration for the goto */ - UA_NodeId expectedNodeId = UA_NODEID_NUMERIC(0, rd->responseType->binaryEncodingId); + /* Remove from the queues and decrease the counters */ + UA_Notification_dequeue(server, notification); - /* Check that the response type matches */ - if(!UA_NodeId_equal(&responseId, &expectedNodeId)) { - if(UA_NodeId_equal(&responseId, &serviceFaultId)) { - UA_LOG_INFO(rd->client->config.logger, UA_LOGCATEGORY_CLIENT, - "Received a ServiceFault response"); - UA_init(rd->response, rd->responseType); - retval = UA_decodeBinary(message, &offset, rd->response, - &UA_TYPES[UA_TYPES_SERVICEFAULT], 0, NULL); - } else { - /* Close the connection */ - UA_LOG_ERROR(rd->client->config.logger, UA_LOGCATEGORY_CLIENT, - "Reply contains the wrong service response"); - retval = UA_STATUSCODE_BADCOMMUNICATIONERROR; - } - goto finish; - } + /* Move the content to the response */ +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) { - UA_LOG_DEBUG(rd->client->config.logger, UA_LOGCATEGORY_CLIENT, - "Decode a message of type %u", responseId.identifier.numeric); + UA_assert(enl != NULL); /* Have at least one event notification */ - /* Decode the response */ - retval = UA_decodeBinary(message, &offset, rd->response, rd->responseType, - rd->client->config.customDataTypesSize, - rd->client->config.customDataTypes); + /* Move the content to the response */ + UA_EventFieldList *efl = &enl->events[enlPos]; + *efl = notification->data.event.fields; + UA_EventFieldList_init(¬ification->data.event.fields); + efl->clientHandle = mon->clientHandle; -finish: - UA_NodeId_deleteMembers(&responseId); - if(retval != UA_STATUSCODE_GOOD) { - if(retval == UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED) - retval = UA_STATUSCODE_BADRESPONSETOOLARGE; - UA_LOG_INFO(rd->client->config.logger, UA_LOGCATEGORY_CLIENT, - "Error receiving the response with status code %s", - UA_StatusCode_name(retval)); + enlPos++; + } else +#endif + { + UA_assert(dcn != NULL); /* Have at least one change notification */ + /* Move the content to the response */ + UA_MonitoredItemNotification *min = &dcn->monitoredItems[dcnPos]; + min->clientHandle = mon->clientHandle; + min->value = notification->data.value; + UA_DataValue_init(¬ification->data.value); /* Reset after the value has been moved */ + dcnPos++; + } - if(rd->response) { - UA_ResponseHeader *respHeader = (UA_ResponseHeader*)rd->response; - respHeader->serviceResult = retval; + UA_Notification_delete(notification); + totalNotifications++; + } + + /* Set sizes */ + if(dcn) { + dcn->monitoredItemsSize = dcnPos; + if(dcnPos == 0) { + UA_free(dcn->monitoredItems); + dcn->monitoredItems = NULL; } } - return retval; + +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + if(enl) { + enl->eventsSize = enlPos; + if(enlPos == 0) { + UA_free(enl->events); + enl->events = NULL; + } + } +#endif + + return UA_STATUSCODE_GOOD; } -/* Forward complete chunks directly to the securechannel */ -static UA_StatusCode -client_processChunk(void *application, UA_Connection *connection, UA_ByteString *chunk) { - SyncResponseDescription *rd = (SyncResponseDescription*)application; - return UA_SecureChannel_processChunk(&rd->client->channel, chunk, - processServiceResponse, - rd, UA_TRUE); +/* According to OPC Unified Architecture, Part 4 5.13.1.1 i) The value 0 is + * never used for the sequence number */ +static UA_UInt32 +UA_Subscription_nextSequenceNumber(UA_UInt32 sequenceNumber) { + UA_UInt32 nextSequenceNumber = sequenceNumber + 1; + if(nextSequenceNumber == 0) + nextSequenceNumber = 1; + return nextSequenceNumber; } -/* Receive and process messages until a synchronous message arrives or the - * timout finishes */ -UA_StatusCode -receiveServiceResponse(UA_Client *client, void *response, const UA_DataType *responseType, - UA_DateTime maxDate, UA_UInt32 *synchronousRequestId) { - /* Prepare the response and the structure we give into processServiceResponse */ - SyncResponseDescription rd = { client, false, 0, response, responseType }; +static void +publishCallback(UA_Server *server, UA_Subscription *sub) { + sub->readyNotifications = sub->notificationQueueSize; + UA_Subscription_publish(server, sub); +} - /* Return upon receiving the synchronized response. All other responses are - * processed with a callback "in the background". */ - if(synchronousRequestId) - rd.requestId = *synchronousRequestId; +void +UA_Subscription_publish(UA_Server *server, UA_Subscription *sub) { + UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session, "Subscription %u | " + "Publish Callback", sub->subscriptionId); + /* Dequeue a response */ + UA_PublishResponseEntry *pre = UA_Session_dequeuePublishReq(sub->session); + if(pre) { + sub->currentLifetimeCount = 0; /* Reset the LifetimeCounter */ + } else { + UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session, + "Subscription %u | The publish queue is empty", + sub->subscriptionId); + ++sub->currentLifetimeCount; - UA_StatusCode retval; - do { - UA_DateTime now = UA_DateTime_nowMonotonic(); + if(sub->currentLifetimeCount > sub->lifeTimeCount) { + UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session, + "Subscription %u | End of lifetime " + "for subscription", sub->subscriptionId); + UA_Session_deleteSubscription(server, sub->session, sub->subscriptionId); + /* TODO: send a StatusChangeNotification with Bad_Timeout */ + return; + } + } - /* >= avoid timeout to be set to 0 */ - if(now >= maxDate) - return UA_STATUSCODE_GOODNONCRITICALTIMEOUT; + /* If there are several late publish responses... */ + if(sub->readyNotifications > sub->notificationQueueSize) + sub->readyNotifications = sub->notificationQueueSize; - /* round always to upper value to avoid timeout to be set to 0 - * if(maxDate - now) < (UA_DATETIME_MSEC/2) */ - UA_UInt32 timeout = (UA_UInt32)(((maxDate - now) + (UA_DATETIME_MSEC - 1)) / UA_DATETIME_MSEC); + /* Count the available notifications */ + UA_UInt32 notifications = sub->readyNotifications; + if(!sub->publishingEnabled) + notifications = 0; - retval = UA_Connection_receiveChunksBlocking(&client->connection, &rd, client_processChunk, timeout); + UA_Boolean moreNotifications = false; + if(notifications > sub->notificationsPerPublish) { + notifications = sub->notificationsPerPublish; + moreNotifications = true; + } - if(retval != UA_STATUSCODE_GOOD && retval != UA_STATUSCODE_GOODNONCRITICALTIMEOUT) { - if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED) - setClientState(client, UA_CLIENTSTATE_DISCONNECTED); - UA_Client_close(client); - break; + /* Return if no notifications and no keepalive */ + if(notifications == 0) { + ++sub->currentKeepAliveCount; + if(sub->currentKeepAliveCount < sub->maxKeepAliveCount) { + if(pre) + UA_Session_queuePublishReq(sub->session, pre, true); /* Re-enqueue */ + return; } - } while(!rd.received); - return retval; -} - -void -__UA_Client_Service(UA_Client *client, const void *request, - const UA_DataType *requestType, void *response, - const UA_DataType *responseType) { - UA_init(response, responseType); - UA_ResponseHeader *respHeader = (UA_ResponseHeader*)response; + UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session, + "Subscription %u | Sending a KeepAlive", + sub->subscriptionId); + } - /* Send the request */ - UA_UInt32 requestId; - UA_StatusCode retval = sendSymmetricServiceRequest(client, request, requestType, &requestId); - if(retval != UA_STATUSCODE_GOOD) { - if(retval == UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED) - respHeader->serviceResult = UA_STATUSCODE_BADREQUESTTOOLARGE; - else - respHeader->serviceResult = retval; - UA_Client_close(client); + /* We want to send a response. Is the channel open? */ + UA_SecureChannel *channel = sub->session->header.channel; + if(!channel || !pre) { + UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session, + "Subscription %u | Want to send a publish response but can't. " + "The subscription is late.", sub->subscriptionId); + sub->state = UA_SUBSCRIPTIONSTATE_LATE; + if(pre) + UA_Session_queuePublishReq(sub->session, pre, true); /* Re-enqueue */ return; } - /* Retrieve the response */ - UA_DateTime maxDate = UA_DateTime_nowMonotonic() + - (client->config.timeout * UA_DATETIME_MSEC); - retval = receiveServiceResponse(client, response, responseType, maxDate, &requestId); - if(retval == UA_STATUSCODE_GOODNONCRITICALTIMEOUT) { - /* In synchronous service, if we have don't have a reply we need to close the connection */ - UA_Client_close(client); - retval = UA_STATUSCODE_BADCONNECTIONCLOSED; + /* Prepare the response */ + UA_PublishResponse *response = &pre->response; + UA_NotificationMessage *message = &response->notificationMessage; + UA_NotificationMessageEntry *retransmission = NULL; + if(notifications > 0) { + if(server->config.enableRetransmissionQueue) { + /* Allocate the retransmission entry */ + retransmission = (UA_NotificationMessageEntry*)UA_malloc(sizeof(UA_NotificationMessageEntry)); + if(!retransmission) { + UA_LOG_WARNING_SESSION(&server->config.logger, sub->session, + "Subscription %u | Could not allocate memory for retransmission. " + "The subscription is late.", sub->subscriptionId); + sub->state = UA_SUBSCRIPTIONSTATE_LATE; + UA_Session_queuePublishReq(sub->session, pre, true); /* Re-enqueue */ + return; + } + } + + /* Prepare the response */ + UA_StatusCode retval = prepareNotificationMessage(server, sub, message, notifications); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING_SESSION(&server->config.logger, sub->session, + "Subscription %u | Could not prepare the notification message. " + "The subscription is late.", sub->subscriptionId); + /* If the retransmission queue is enabled a retransmission message is allocated */ + if(retransmission) + UA_free(retransmission); + sub->state = UA_SUBSCRIPTIONSTATE_LATE; + UA_Session_queuePublishReq(sub->session, pre, true); /* Re-enqueue */ + return; + } } - if(retval != UA_STATUSCODE_GOOD) - respHeader->serviceResult = retval; -} -void -UA_Client_AsyncService_cancel(UA_Client *client, AsyncServiceCall *ac, - UA_StatusCode statusCode) { - /* Create an empty response with the statuscode */ - UA_STACKARRAY(UA_Byte, responseBuf, ac->responseType->memSize); - void *resp = (void*)(uintptr_t)&responseBuf[0]; /* workaround aliasing rules */ - UA_init(resp, ac->responseType); - ((UA_ResponseHeader*)resp)->serviceResult = statusCode; + /* <-- The point of no return --> */ - if (ac->callback) - ac->callback(client, ac->userdata, ac->requestId, resp, ac->responseType); + /* Adjust the number of ready notifications */ + UA_assert(sub->readyNotifications >= notifications); + sub->readyNotifications -= notifications; - /* Clean up the response. Users might move data into it. For whatever reasons. */ - UA_deleteMembers(resp, ac->responseType); -} + /* Set up the response */ + response->responseHeader.timestamp = UA_DateTime_now(); + response->subscriptionId = sub->subscriptionId; + response->moreNotifications = moreNotifications; + message->publishTime = response->responseHeader.timestamp; -void UA_Client_AsyncService_removeAll(UA_Client *client, UA_StatusCode statusCode) { - AsyncServiceCall *ac, *ac_tmp; - LIST_FOREACH_SAFE(ac, &client->asyncServiceCalls, pointers, ac_tmp) { - LIST_REMOVE(ac, pointers); - UA_Client_AsyncService_cancel(client, ac, statusCode); - UA_free(ac); + /* Set sequence number to message. Started at 1 which is given + * during creating a new subscription. The 1 is required for + * initial publish response with or without an monitored item. */ + message->sequenceNumber = sub->nextSequenceNumber; + + if(notifications > 0) { + /* If the retransmission queue is enabled a retransmission message is allocated */ + if(retransmission) { + /* Put the notification message into the retransmission queue. This + * needs to be done here, so that the message itself is included in the + * available sequence numbers for acknowledgement. */ + retransmission->message = response->notificationMessage; + UA_Subscription_addRetransmissionMessage(server, sub, retransmission); + } + /* Only if a notification was created, the sequence number must be increased. + * For a keepalive the sequence number can be reused. */ + sub->nextSequenceNumber = UA_Subscription_nextSequenceNumber(sub->nextSequenceNumber); + } + + /* Get the available sequence numbers from the retransmission queue */ + size_t available = sub->retransmissionQueueSize; + UA_STACKARRAY(UA_UInt32, seqNumbers, available); + if(available > 0) { + response->availableSequenceNumbers = seqNumbers; + response->availableSequenceNumbersSize = available; + size_t i = 0; + UA_NotificationMessageEntry *nme; + TAILQ_FOREACH(nme, &sub->retransmissionQueue, listEntry) { + response->availableSequenceNumbers[i] = nme->message.sequenceNumber; + ++i; + } } -} -UA_StatusCode -__UA_Client_AsyncServiceEx(UA_Client *client, const void *request, - const UA_DataType *requestType, - UA_ClientAsyncServiceCallback callback, - const UA_DataType *responseType, - void *userdata, UA_UInt32 *requestId, - UA_UInt32 timeout) { - /* Prepare the entry for the linked list */ - AsyncServiceCall *ac = (AsyncServiceCall*)UA_malloc(sizeof(AsyncServiceCall)); - if(!ac) - return UA_STATUSCODE_BADOUTOFMEMORY; - ac->callback = callback; - ac->responseType = responseType; - ac->userdata = userdata; - ac->timeout = timeout; + /* Send the response */ + UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session, + "Subscription %u | Sending out a publish response " + "with %u notifications", sub->subscriptionId, + (UA_UInt32)notifications); + UA_SecureChannel_sendSymmetricMessage(sub->session->header.channel, pre->requestId, + UA_MESSAGETYPE_MSG, response, + &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); - /* Call the service and set the requestId */ - UA_StatusCode retval = sendSymmetricServiceRequest(client, request, requestType, &ac->requestId); - if(retval != UA_STATUSCODE_GOOD) { - ac->requestId = 0; - UA_Client_AsyncService_cancel(client, ac, UA_STATUSCODE_BADTIMEOUT); - UA_free(ac); - return retval; - } + /* Reset subscription state to normal */ + sub->state = UA_SUBSCRIPTIONSTATE_NORMAL; + sub->currentKeepAliveCount = 0; - ac->start = UA_DateTime_nowMonotonic(); + /* Free the response */ + if(retransmission) + /* NotificationMessage was moved into retransmission queue */ + UA_NotificationMessage_init(&response->notificationMessage); + response->availableSequenceNumbers = NULL; + response->availableSequenceNumbersSize = 0; + UA_PublishResponse_clear(&pre->response); + UA_free(pre); - /* Store the entry for async processing */ - LIST_INSERT_HEAD(&client->asyncServiceCalls, ac, pointers); - if(requestId) - *requestId = ac->requestId; - return UA_STATUSCODE_GOOD; + /* Repeat sending responses if there are more notifications to send */ + if(moreNotifications) + UA_Subscription_publish(server, sub); } -UA_StatusCode -__UA_Client_AsyncService(UA_Client *client, const void *request, - const UA_DataType *requestType, - UA_ClientAsyncServiceCallback callback, - const UA_DataType *responseType, - void *userdata, UA_UInt32 *requestId) { - return __UA_Client_AsyncServiceEx(client, request, requestType, callback, - responseType, userdata, requestId, - client->config.timeout); -} +UA_Boolean +UA_Subscription_reachedPublishReqLimit(UA_Server *server, UA_Session *session) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Reached number of publish request limit"); -static void -backgroundConnectivityCallback(UA_Client *client, void *userdata, - UA_UInt32 requestId, const UA_ReadResponse *response, - const UA_DataType *responseType) { - if(response->responseHeader.serviceResult == UA_STATUSCODE_BADTIMEOUT) { - if (client->config.inactivityCallback) - client->config.inactivityCallback(client); + /* Dequeue a response */ + UA_PublishResponseEntry *pre = UA_Session_dequeuePublishReq(session); + + /* Cannot publish without a response */ + if(!pre) { + UA_LOG_FATAL_SESSION(&server->config.logger, session, "No publish requests available"); + return false; } - client->pendingConnectivityCheck = false; - client->lastConnectivityCheck = UA_DateTime_nowMonotonic(); -} -static UA_StatusCode -UA_Client_backgroundConnectivity(UA_Client *client) { - if(!client->config.connectivityCheckInterval) - return UA_STATUSCODE_GOOD; + /* <-- The point of no return --> */ - if (client->pendingConnectivityCheck) - return UA_STATUSCODE_GOOD; + UA_PublishResponse *response = &pre->response; + UA_NotificationMessage *message = &response->notificationMessage; - UA_DateTime now = UA_DateTime_nowMonotonic(); - UA_DateTime nextDate = client->lastConnectivityCheck + (UA_DateTime)(client->config.connectivityCheckInterval * UA_DATETIME_MSEC); + /* Set up the response. Note that this response has no related subscription id */ + response->responseHeader.timestamp = UA_DateTime_now(); + response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYPUBLISHREQUESTS; + response->subscriptionId = 0; + response->moreNotifications = false; + message->publishTime = response->responseHeader.timestamp; + message->sequenceNumber = 0; + response->availableSequenceNumbersSize = 0; - if(now <= nextDate) - return UA_STATUSCODE_GOOD; + /* Send the response */ + UA_LOG_DEBUG_SESSION(&server->config.logger, session, + "Sending out a publish response triggered by too many publish requests"); + UA_SecureChannel_sendSymmetricMessage(session->header.channel, pre->requestId, + UA_MESSAGETYPE_MSG, response, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); - UA_ReadRequest request; - UA_ReadRequest_init(&request); + /* Free the response */ + UA_Array_delete(response->results, response->resultsSize, &UA_TYPES[UA_TYPES_UINT32]); + UA_free(pre); /* no need for UA_PublishResponse_deleteMembers */ - UA_ReadValueId rvid; - UA_ReadValueId_init(&rvid); - rvid.attributeId = UA_ATTRIBUTEID_VALUE; - rvid.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE); + return true; +} - request.nodesToRead = &rvid; - request.nodesToReadSize = 1; +UA_StatusCode +Subscription_registerPublishCallback(UA_Server *server, UA_Subscription *sub) { + UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session, + "Subscription %u | Register subscription " + "publishing callback", sub->subscriptionId); - UA_StatusCode retval = __UA_Client_AsyncService(client, &request, &UA_TYPES[UA_TYPES_READREQUEST], - (UA_ClientAsyncServiceCallback)backgroundConnectivityCallback, - &UA_TYPES[UA_TYPES_READRESPONSE], NULL, NULL); + if(sub->publishCallbackIsRegistered) + return UA_STATUSCODE_GOOD; - client->pendingConnectivityCheck = true; + UA_StatusCode retval = + UA_Server_addRepeatedCallback(server, (UA_ServerCallback)publishCallback, + sub, (UA_UInt32)sub->publishingInterval, &sub->publishCallbackId); + if(retval != UA_STATUSCODE_GOOD) + return retval; - return retval; + sub->publishCallbackIsRegistered = true; + return UA_STATUSCODE_GOOD; } -static void -asyncServiceTimeoutCheck(UA_Client *client) { - UA_DateTime now = UA_DateTime_nowMonotonic(); +void +Subscription_unregisterPublishCallback(UA_Server *server, UA_Subscription *sub) { + UA_LOG_DEBUG_SESSION(&server->config.logger, sub->session, "Subscription %u | " + "Unregister subscription publishing callback", sub->subscriptionId); - /* Timeout occurs, remove the callback */ - AsyncServiceCall *ac, *ac_tmp; - LIST_FOREACH_SAFE(ac, &client->asyncServiceCalls, pointers, ac_tmp) { - if (!ac->timeout) - continue; + if(!sub->publishCallbackIsRegistered) + return; - if (ac->start + (UA_DateTime)(ac->timeout * UA_DATETIME_MSEC) <= now) { - LIST_REMOVE(ac, pointers); - UA_Client_AsyncService_cancel(client, ac, UA_STATUSCODE_BADTIMEOUT); - UA_free(ac); - } - } + UA_Server_removeRepeatedCallback(server, sub->publishCallbackId); + sub->publishCallbackIsRegistered = false; } -UA_StatusCode -UA_Client_runAsync(UA_Client *client, UA_UInt16 timeout) { - /* TODO: Call repeated jobs that are scheduled */ -#ifdef UA_ENABLE_SUBSCRIPTIONS - UA_StatusCode retvalPublish = UA_Client_Subscriptions_backgroundPublish(client); - if (retvalPublish != UA_STATUSCODE_GOOD) - return retvalPublish; -#endif - UA_StatusCode retval = UA_Client_manuallyRenewSecureChannel(client); - if (retval != UA_STATUSCODE_GOOD) - return retval; - - retval = UA_Client_backgroundConnectivity(client); - if(retval != UA_STATUSCODE_GOOD) - return retval; +/* When the session has publish requests stored but the last subscription is + * deleted... Send out empty responses */ +void +UA_Subscription_answerPublishRequestsNoSubscription(UA_Server *server, UA_Session *session) { + /* No session or there are remaining subscriptions */ + if(!session || LIST_FIRST(&session->serverSubscriptions)) + return; - UA_DateTime maxDate = UA_DateTime_nowMonotonic() + (timeout * UA_DATETIME_MSEC); - retval = receiveServiceResponse(client, NULL, NULL, maxDate, NULL); - if(retval == UA_STATUSCODE_GOODNONCRITICALTIMEOUT) - retval = UA_STATUSCODE_GOOD; -#ifdef UA_ENABLE_SUBSCRIPTIONS - /* The inactivity check must be done after receiveServiceResponse */ - UA_Client_Subscriptions_backgroundPublishInactivityCheck(client); -#endif - asyncServiceTimeoutCheck(client); - return retval; + /* Send a response for every queued request */ + UA_PublishResponseEntry *pre; + while((pre = UA_Session_dequeuePublishReq(session))) { + UA_PublishResponse *response = &pre->response; + response->responseHeader.serviceResult = UA_STATUSCODE_BADNOSUBSCRIPTION; + response->responseHeader.timestamp = UA_DateTime_now(); + UA_SecureChannel_sendSymmetricMessage(session->header.channel, pre->requestId, UA_MESSAGETYPE_MSG, + response, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); + UA_PublishResponse_deleteMembers(response); + UA_free(pre); + } } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/client/ua_client_connect.c" ***********************************/ +#endif /* UA_ENABLE_SUBSCRIPTIONS */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_subscription_monitoreditem.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB - * Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2017-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2018 (c) Ari Breitkreuz, fortiss GmbH + * Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA + * Copyright 2018 (c) Fabian Arndt, Root-Core */ -#define UA_MINMESSAGESIZE 8192 - - - /********************/ - /* Set client state */ - /********************/ -void -setClientState(UA_Client *client, UA_ClientState state) { - if(client->state != state) { - client->state = state; - if(client->config.stateCallback) - client->config.stateCallback(client, client->state); - } -} - -/***********************/ -/* Open the Connection */ -/***********************/ +#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */ -#define UA_BITMASK_MESSAGETYPE 0x00ffffff -#define UA_BITMASK_CHUNKTYPE 0xff000000 +/****************/ +/* Notification */ +/****************/ -static UA_StatusCode -processACKResponse(void *application, UA_Connection *connection, UA_ByteString *chunk) { - UA_Client *client = (UA_Client*)application; +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS - /* Decode the message */ - size_t offset = 0; - UA_StatusCode retval; - UA_TcpMessageHeader messageHeader; - UA_TcpAcknowledgeMessage ackMessage; - retval = UA_TcpMessageHeader_decodeBinary(chunk, &offset, &messageHeader); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO(client->config.logger, UA_LOGCATEGORY_NETWORK, - "Decoding ACK message failed"); - return retval; - } +static const UA_NodeId overflowEventType = + {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE}}; +static const UA_NodeId simpleOverflowEventType = + {0, UA_NODEIDTYPE_NUMERIC, {UA_NS0ID_SIMPLEOVERFLOWEVENTTYPE}}; - // check if we got an error response from the server - UA_MessageType messageType = (UA_MessageType) - (messageHeader.messageTypeAndChunkType & UA_BITMASK_MESSAGETYPE); - UA_ChunkType chunkType = (UA_ChunkType) - (messageHeader.messageTypeAndChunkType & UA_BITMASK_CHUNKTYPE); - if (messageType == UA_MESSAGETYPE_ERR) { - // Header + ErrorMessage (error + reasonLength_field + length) - UA_StatusCode error = *(UA_StatusCode*)(&chunk->data[offset]); - UA_UInt32 len = *((UA_UInt32*)&chunk->data[offset + 4]); - UA_Byte *data = (UA_Byte*)&chunk->data[offset + 4+4]; - UA_LOG_ERROR(client->config.logger, UA_LOGCATEGORY_NETWORK, - "Received ERR response. %s - %.*s", UA_StatusCode_name(error), len, data); - return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; - } - if (chunkType != UA_CHUNKTYPE_FINAL) { - return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; - } +static UA_Boolean +UA_Notification_isOverflowEvent(UA_Server *server, UA_Notification *n) { + UA_MonitoredItem *mon = n->mon; + if(mon->attributeId != UA_ATTRIBUTEID_EVENTNOTIFIER) + return false; - retval |= UA_TcpAcknowledgeMessage_decodeBinary(chunk, &offset, &ackMessage); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO(client->config.logger, UA_LOGCATEGORY_NETWORK, - "Decoding ACK message failed"); - return retval; + UA_EventFieldList *efl = &n->data.event.fields; + if(efl->eventFieldsSize >= 1 && + efl->eventFields[0].type == &UA_TYPES[UA_TYPES_NODEID] && + isNodeInTree(server->nsCtx, (const UA_NodeId *)efl->eventFields[0].data, + &overflowEventType, &subtypeId, 1)) { + return true; } - /* Store remote connection settings and adjust local configuration to not - * exceed the limits */ - UA_LOG_DEBUG(client->config.logger, UA_LOGCATEGORY_NETWORK, "Received ACK message"); - connection->remoteConf.maxChunkCount = ackMessage.maxChunkCount; /* may be zero -> unlimited */ - connection->remoteConf.maxMessageSize = ackMessage.maxMessageSize; /* may be zero -> unlimited */ - connection->remoteConf.protocolVersion = ackMessage.protocolVersion; - connection->remoteConf.sendBufferSize = ackMessage.sendBufferSize; - connection->remoteConf.recvBufferSize = ackMessage.receiveBufferSize; - if(connection->remoteConf.recvBufferSize < connection->localConf.sendBufferSize) - connection->localConf.sendBufferSize = connection->remoteConf.recvBufferSize; - if(connection->remoteConf.sendBufferSize < connection->localConf.recvBufferSize) - connection->localConf.recvBufferSize = connection->remoteConf.sendBufferSize; - connection->state = UA_CONNECTION_ESTABLISHED; - return UA_STATUSCODE_GOOD; + return false; } +/* The specification states in Part 4 5.12.1.5 that an EventQueueOverflowEvent + * "is generated when the first Event has to be discarded [...] without + * discarding any other event". So only generate one for all deleted events. */ static UA_StatusCode -HelAckHandshake(UA_Client *client) { - /* Get a buffer */ - UA_ByteString message; - UA_Connection *conn = &client->connection; - UA_StatusCode retval = conn->getSendBuffer(conn, UA_MINMESSAGESIZE, &message); - if(retval != UA_STATUSCODE_GOOD) - return retval; - - /* Prepare the HEL message and encode at offset 8 */ - UA_TcpHelloMessage hello; - UA_String_copy(&client->endpointUrl, &hello.endpointUrl); /* must be less than 4096 bytes */ - hello.maxChunkCount = conn->localConf.maxChunkCount; - hello.maxMessageSize = conn->localConf.maxMessageSize; - hello.protocolVersion = conn->localConf.protocolVersion; - hello.receiveBufferSize = conn->localConf.recvBufferSize; - hello.sendBufferSize = conn->localConf.sendBufferSize; - - UA_Byte *bufPos = &message.data[8]; /* skip the header */ - const UA_Byte *bufEnd = &message.data[message.length]; - retval = UA_TcpHelloMessage_encodeBinary(&hello, &bufPos, &bufEnd); - UA_TcpHelloMessage_deleteMembers(&hello); +createEventOverflowNotification(UA_Server *server, UA_Subscription *sub, + UA_MonitoredItem *mon, UA_Notification *indicator) { + /* Avoid two redundant overflow events in a row */ + if(UA_Notification_isOverflowEvent(server, indicator)) + return UA_STATUSCODE_GOOD; - /* Encode the message header at offset 0 */ - UA_TcpMessageHeader messageHeader; - messageHeader.messageTypeAndChunkType = UA_CHUNKTYPE_FINAL + UA_MESSAGETYPE_HEL; - messageHeader.messageSize = (UA_UInt32)((uintptr_t)bufPos - (uintptr_t)message.data); - bufPos = message.data; - retval |= UA_TcpMessageHeader_encodeBinary(&messageHeader, &bufPos, &bufEnd); + /* A notification is inserted into the queue which includes only the + * NodeId of the overflowEventType. It is up to the client to check for + * possible overflows. */ + + /* Allocate the notification */ + UA_Notification *overflowNotification = (UA_Notification *) + UA_malloc(sizeof(UA_Notification)); + if(!overflowNotification) + return UA_STATUSCODE_BADOUTOFMEMORY;; + + /* Set the notification fields */ + overflowNotification->mon = mon; + UA_EventFieldList_init(&overflowNotification->data.event.fields); + overflowNotification->data.event.fields.eventFields = UA_Variant_new(); + if(!overflowNotification->data.event.fields.eventFields) { + UA_free(overflowNotification); + return UA_STATUSCODE_BADOUTOFMEMORY;; + } + overflowNotification->data.event.fields.eventFieldsSize = 1; + UA_StatusCode retval = + UA_Variant_setScalarCopy(overflowNotification->data.event.fields.eventFields, + &simpleOverflowEventType, &UA_TYPES[UA_TYPES_NODEID]); if(retval != UA_STATUSCODE_GOOD) { - conn->releaseSendBuffer(conn, &message); + UA_EventFieldList_deleteMembers(&overflowNotification->data.event.fields); + UA_free(overflowNotification); return retval; } - /* Send the HEL message */ - message.length = messageHeader.messageSize; - retval = conn->send(conn, &message); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO(client->config.logger, UA_LOGCATEGORY_NETWORK, - "Sending HEL failed"); - return retval; - } - UA_LOG_DEBUG(client->config.logger, UA_LOGCATEGORY_NETWORK, - "Sent HEL message"); + /* Insert before the "indicator notification". This is either first in the + * queue (if the oldest notification was removed) or before the new event + * that remains the last element of the queue. */ + TAILQ_INSERT_BEFORE(indicator, overflowNotification, listEntry); + ++mon->eventOverflows; + ++mon->queueSize; - /* Loop until we have a complete chunk */ - retval = UA_Connection_receiveChunksBlocking(conn, client, processACKResponse, - client->config.timeout); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_INFO(client->config.logger, UA_LOGCATEGORY_NETWORK, - "Receiving ACK message failed"); - if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED) - client->state = UA_CLIENTSTATE_DISCONNECTED; - UA_Client_close(client); + TAILQ_NEXT(overflowNotification, globalEntry) = UA_SUBSCRIPTION_QUEUE_SENTINEL; + if(mon->monitoringMode == UA_MONITORINGMODE_REPORTING) { + TAILQ_INSERT_BEFORE(indicator, overflowNotification, globalEntry); + ++sub->notificationQueueSize; + ++sub->eventNotifications; } - return retval; + return UA_STATUSCODE_GOOD; } -static void -processDecodedOPNResponse(UA_Client *client, UA_OpenSecureChannelResponse *response, UA_Boolean renew) { - /* Replace the token */ - if (renew) - client->channel.nextSecurityToken = response->securityToken; // Set the next token - else - client->channel.securityToken = response->securityToken; // Set initial token +#endif - /* Replace the nonce */ - UA_ByteString_deleteMembers(&client->channel.remoteNonce); - client->channel.remoteNonce = response->serverNonce; - UA_ByteString_init(&response->serverNonce); +/* !!! The enqueue and dequeue operations need to match the reporting + * disable/enable logic in Operation_SetMonitoringMode !!! */ - if(client->channel.state == UA_SECURECHANNELSTATE_OPEN) - UA_LOG_DEBUG(client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, - "SecureChannel in the server renewed"); - else - UA_LOG_DEBUG(client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, - "Opened SecureChannel acknowledged by the server"); +void +UA_Notification_enqueue(UA_Server *server, UA_Subscription *sub, + UA_MonitoredItem *mon, UA_Notification *n) { + /* Add to the MonitoredItem */ + TAILQ_INSERT_TAIL(&mon->queue, n, listEntry); + ++mon->queueSize; + +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER && + UA_Notification_isOverflowEvent(server, n)) + ++mon->eventOverflows; +#endif - /* Response.securityToken.revisedLifetime is UInt32 we need to cast it to - * DateTime=Int64 we take 75% of lifetime to start renewing as described in - * standard */ - client->channel.state = UA_SECURECHANNELSTATE_OPEN; - client->nextChannelRenewal = UA_DateTime_nowMonotonic() + (UA_DateTime) - (client->channel.securityToken.revisedLifetime * (UA_Double)UA_DATETIME_MSEC * 0.75); -} + /* Add to the subscription if reporting is enabled */ + TAILQ_NEXT(n, globalEntry) = UA_SUBSCRIPTION_QUEUE_SENTINEL; + if(mon->monitoringMode == UA_MONITORINGMODE_REPORTING) { + TAILQ_INSERT_TAIL(&sub->notificationQueue, n, globalEntry); + ++sub->notificationQueueSize; +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) { + ++sub->eventNotifications; + } else +#endif + { + ++sub->dataChangeNotifications; + } + } -static UA_StatusCode -openSecureChannel(UA_Client *client, UA_Boolean renew) { - /* Check if sc is still valid */ - if(renew && client->nextChannelRenewal > UA_DateTime_nowMonotonic()) - return UA_STATUSCODE_GOOD; + /* Ensure enough space is available in the MonitoredItem. Do this only after + * adding the new Notification. */ + UA_MonitoredItem_ensureQueueSpace(server, mon); +} - UA_Connection *conn = &client->connection; - if(conn->state != UA_CONNECTION_ESTABLISHED) - return UA_STATUSCODE_BADSERVERNOTCONNECTED; +void +UA_Notification_dequeue(UA_Server *server, UA_Notification *n) { + UA_MonitoredItem *mon = n->mon; + UA_Subscription *sub = mon->subscription; - /* Prepare the OpenSecureChannelRequest */ - UA_OpenSecureChannelRequest opnSecRq; - UA_OpenSecureChannelRequest_init(&opnSecRq); - opnSecRq.requestHeader.timestamp = UA_DateTime_now(); - opnSecRq.requestHeader.authenticationToken = client->authenticationToken; - if(renew) { - opnSecRq.requestType = UA_SECURITYTOKENREQUESTTYPE_RENEW; - UA_LOG_DEBUG(client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, - "Requesting to renew the SecureChannel"); - } else { - opnSecRq.requestType = UA_SECURITYTOKENREQUESTTYPE_ISSUE; - UA_LOG_DEBUG(client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, - "Requesting to open a SecureChannel"); + /* Remove from the MonitoredItem queue */ +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER && + UA_Notification_isOverflowEvent(server, n)) + --mon->eventOverflows; +#endif + TAILQ_REMOVE(&mon->queue, n, listEntry); + --mon->queueSize; + + /* Remove from the subscription's queue */ + if(TAILQ_NEXT(n, globalEntry) != UA_SUBSCRIPTION_QUEUE_SENTINEL) { +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) { + --sub->eventNotifications; + } else +#endif + { + --sub->dataChangeNotifications; + } + TAILQ_REMOVE(&sub->notificationQueue, n, globalEntry); + --sub->notificationQueueSize; } - opnSecRq.securityMode = UA_MESSAGESECURITYMODE_NONE; - opnSecRq.clientNonce = client->channel.localNonce; - opnSecRq.requestedLifetime = client->config.secureChannelLifeTime; +} - /* Send the OPN message */ - UA_UInt32 requestId = ++client->requestId; - UA_StatusCode retval = - UA_SecureChannel_sendAsymmetricOPNMessage(&client->channel, requestId, &opnSecRq, - &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); - if(retval != UA_STATUSCODE_GOOD) { - UA_LOG_ERROR(client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, - "Sending OPN message failed with error %s", UA_StatusCode_name(retval)); - UA_Client_close(client); - return retval; +void +UA_Notification_delete(UA_Notification *n) { +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + UA_MonitoredItem *mon = n->mon; + if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) { + UA_EventFieldList_deleteMembers(&n->data.event.fields); + /* EventFilterResult currently isn't being used + * UA_EventFilterResult_delete(notification->data.event->result); */ + } else +#endif + { + UA_DataValue_deleteMembers(&n->data.value); } + UA_free(n); +} - UA_LOG_DEBUG(client->config.logger, UA_LOGCATEGORY_SECURECHANNEL, "OPN message sent"); +/*****************/ +/* MonitoredItem */ +/*****************/ - /* Increase nextChannelRenewal to avoid that we re-start renewal when - * publish responses are received before the OPN response arrives. */ - client->nextChannelRenewal = UA_DateTime_nowMonotonic() + - (2 * ((UA_DateTime)client->config.timeout * UA_DATETIME_MSEC)); +void +UA_MonitoredItem_init(UA_MonitoredItem *mon, UA_Subscription *sub) { + memset(mon, 0, sizeof(UA_MonitoredItem)); + mon->subscription = sub; + TAILQ_INIT(&mon->queue); +} - /* Receive / decrypt / decode the OPN response. Process async services in - * the background until the OPN response arrives. */ - UA_OpenSecureChannelResponse response; - retval = receiveServiceResponse(client, &response, - &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE], - UA_DateTime_nowMonotonic() + - ((UA_DateTime)client->config.timeout * UA_DATETIME_MSEC), - &requestId); +void +UA_MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem) { + /* Remove the sampling callback */ + UA_MonitoredItem_unregisterSampleCallback(server, monitoredItem); - if(retval != UA_STATUSCODE_GOOD) { - UA_Client_close(client); - return retval; + /* Remove the queued notifications if attached to a subscription (not a + * local MonitoredItem) */ + if(monitoredItem->subscription) { + UA_Notification *notification, *notification_tmp; + TAILQ_FOREACH_SAFE(notification, &monitoredItem->queue, + listEntry, notification_tmp) { + /* Remove the item from the queues and free the memory */ + UA_Notification_dequeue(server, notification); + UA_Notification_delete(notification); + } } - processDecodedOPNResponse(client, &response, renew); - UA_OpenSecureChannelResponse_deleteMembers(&response); - return retval; -} - -static UA_StatusCode -activateSession(UA_Client *client) { - UA_ActivateSessionRequest request; - UA_ActivateSessionRequest_init(&request); - request.requestHeader.requestHandle = ++client->requestHandle; - request.requestHeader.timestamp = UA_DateTime_now(); - request.requestHeader.timeoutHint = 600000; - - //manual ExtensionObject encoding of the identityToken - if(client->authenticationMethod == UA_CLIENTAUTHENTICATION_NONE) { - UA_AnonymousIdentityToken* identityToken = UA_AnonymousIdentityToken_new(); - UA_AnonymousIdentityToken_init(identityToken); - UA_String_copy(&client->token.policyId, &identityToken->policyId); - request.userIdentityToken.encoding = UA_EXTENSIONOBJECT_DECODED; - request.userIdentityToken.content.decoded.type = &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]; - request.userIdentityToken.content.decoded.data = identityToken; - } else { - UA_UserNameIdentityToken* identityToken = UA_UserNameIdentityToken_new(); - UA_UserNameIdentityToken_init(identityToken); - UA_String_copy(&client->token.policyId, &identityToken->policyId); - UA_String_copy(&client->username, &identityToken->userName); - UA_String_copy(&client->password, &identityToken->password); - request.userIdentityToken.encoding = UA_EXTENSIONOBJECT_DECODED; - request.userIdentityToken.content.decoded.type = &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]; - request.userIdentityToken.content.decoded.data = identityToken; +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + if(monitoredItem->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) { + /* Remove the monitored item from the node queue */ + UA_Server_editNode(server, NULL, &monitoredItem->monitoredNodeId, + UA_MonitoredItem_removeNodeEventCallback, monitoredItem); + UA_EventFilter_clear(&monitoredItem->filter.eventFilter); + } else +#endif + { + /* UA_DataChangeFilter does not hold dynamic content we need to free */ + /* UA_DataChangeFilter_clear(&monitoredItem->filter.dataChangeFilter); */ } - UA_ActivateSessionResponse response; - __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST], - &response, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]); + /* Deregister MonitoredItem in userland */ + if(server->config.monitoredItemRegisterCallback && monitoredItem->registered) { + /* Get the session context. Local MonitoredItems don't have a subscription. */ + UA_Session *session = NULL; + if(monitoredItem->subscription) + session = monitoredItem->subscription->session; + if(!session) + session = &server->adminSession; - if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_LOG_ERROR(client->config.logger, UA_LOGCATEGORY_CLIENT, - "ActivateSession failed with error code %s", - UA_StatusCode_name(response.responseHeader.serviceResult)); + /* Get the node context */ + void *targetContext = NULL; + UA_Server_getNodeContext(server, monitoredItem->monitoredNodeId, &targetContext); + + /* Deregister */ + server->config.monitoredItemRegisterCallback(server, &session->sessionId, + session->sessionHandle, + &monitoredItem->monitoredNodeId, + targetContext, monitoredItem->attributeId, true); } - UA_StatusCode retval = response.responseHeader.serviceResult; - UA_ActivateSessionRequest_deleteMembers(&request); - UA_ActivateSessionResponse_deleteMembers(&response); - return retval; + /* Remove the monitored item */ + if(monitoredItem->listEntry.le_prev != NULL) + LIST_REMOVE(monitoredItem, listEntry); + UA_String_deleteMembers(&monitoredItem->indexRange); + UA_ByteString_deleteMembers(&monitoredItem->lastSampledValue); + UA_Variant_deleteMembers(&monitoredItem->lastValue); + UA_NodeId_deleteMembers(&monitoredItem->monitoredNodeId); + + /* No actual callback, just remove the structure */ + monitoredItem->delayedFreePointers.callback = NULL; + UA_WorkQueue_enqueueDelayed(&server->workQueue, &monitoredItem->delayedFreePointers); } -/* Gets a list of endpoints. Memory is allocated for endpointDescription array */ UA_StatusCode -UA_Client_getEndpointsInternal(UA_Client *client, size_t* endpointDescriptionsSize, - UA_EndpointDescription** endpointDescriptions) { - UA_GetEndpointsRequest request; - UA_GetEndpointsRequest_init(&request); - request.requestHeader.timestamp = UA_DateTime_now(); - request.requestHeader.timeoutHint = 10000; - // assume the endpointurl outlives the service call - request.endpointUrl = client->endpointUrl; +UA_MonitoredItem_ensureQueueSpace(UA_Server *server, UA_MonitoredItem *mon) { + /* Assert: The eventoverflow are counted in the queue size; There can be + * only one eventoverflow more than normal entries */ + UA_assert(mon->queueSize >= mon->eventOverflows); + UA_assert(mon->eventOverflows <= mon->queueSize - mon->eventOverflows + 1); - UA_GetEndpointsResponse response; - __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST], - &response, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]); + /* Nothing to do */ + if(mon->queueSize - mon->eventOverflows <= mon->maxQueueSize) + return UA_STATUSCODE_GOOD; - if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_StatusCode retval = response.responseHeader.serviceResult; - UA_LOG_ERROR(client->config.logger, UA_LOGCATEGORY_CLIENT, - "GetEndpointRequest failed with error code %s", - UA_StatusCode_name(retval)); - UA_GetEndpointsResponse_deleteMembers(&response); - return retval; - } - *endpointDescriptions = response.endpoints; - *endpointDescriptionsSize = response.endpointsSize; - response.endpoints = NULL; - response.endpointsSize = 0; - UA_GetEndpointsResponse_deleteMembers(&response); +#ifdef __clang_analyzer__ return UA_STATUSCODE_GOOD; -} - -static UA_StatusCode -getEndpoints(UA_Client *client) { - UA_EndpointDescription* endpointArray = NULL; - size_t endpointArraySize = 0; - UA_StatusCode retval = - UA_Client_getEndpointsInternal(client, &endpointArraySize, &endpointArray); - if(retval != UA_STATUSCODE_GOOD) - return retval; - - UA_Boolean endpointFound = false; - UA_Boolean tokenFound = false; - UA_String securityNone = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None"); - UA_String binaryTransport = UA_STRING("http://opcfoundation.org/UA-Profile/" - "Transport/uatcp-uasc-uabinary"); - - // TODO: compare endpoint information with client->endpointUri - for(size_t i = 0; i < endpointArraySize; ++i) { - UA_EndpointDescription* endpoint = &endpointArray[i]; - /* look out for binary transport endpoints */ - /* Note: Siemens returns empty ProfileUrl, we will accept it as binary */ - if(endpoint->transportProfileUri.length != 0 && - !UA_String_equal(&endpoint->transportProfileUri, &binaryTransport)) - continue; - /* look out for an endpoint without security */ - if(!UA_String_equal(&endpoint->securityPolicyUri, &securityNone)) - continue; +#endif + + /* Remove notifications until the queue size is reached */ + UA_Subscription *sub = mon->subscription; + while(mon->queueSize - mon->eventOverflows > mon->maxQueueSize) { + /* At least two notifications that are not eventOverflows in the queue */ + UA_assert(mon->queueSize - mon->eventOverflows >= 2); - /* endpoint with no security found */ - endpointFound = true; + /* Select the next notification to delete. Skip over overflow events. */ + UA_Notification *del = NULL; + if(mon->discardOldest) { + /* Remove the oldest */ + del = TAILQ_FIRST(&mon->queue); +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + while(UA_Notification_isOverflowEvent(server, del)) + del = TAILQ_NEXT(del, listEntry); /* skip overflow events */ +#endif + } else { + /* Remove the second newest (to keep the up-to-date notification). + * The last entry is not an OverflowEvent -- we just added it. */ + del = TAILQ_LAST(&mon->queue, NotificationQueue); + del = TAILQ_PREV(del, NotificationQueue, listEntry); +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + while(UA_Notification_isOverflowEvent(server, del)) + del = TAILQ_PREV(del, NotificationQueue, listEntry); /* skip overflow events */ +#endif + } - /* look for a user token policy with an anonymous token */ - for(size_t j = 0; j < endpoint->userIdentityTokensSize; ++j) { - UA_UserTokenPolicy* userToken = &endpoint->userIdentityTokens[j]; + UA_assert(del); /* There must have been one entry that can be deleted */ + + /* If reporting is activated (entries are also in the subscriptions + * global queue): Move the entry after del in the per-MonitoredItem + * queue right after del in the global queue. (It is already right after + * del in the per-MonitoredItem queue.) This is required so we don't + * starve MonitoredItems with a high sampling interval by always + * removing their first appearance in the gloal queue for the + * Subscription. */ + if(TAILQ_NEXT(del, globalEntry) != UA_SUBSCRIPTION_QUEUE_SENTINEL) { + UA_Notification *after_del = TAILQ_NEXT(del, listEntry); + UA_assert(after_del); /* There must be one remaining element after del */ + TAILQ_REMOVE(&sub->notificationQueue, after_del, globalEntry); + TAILQ_INSERT_AFTER(&sub->notificationQueue, del, after_del, globalEntry); + } - /* Usertokens also have a security policy... */ - if(userToken->securityPolicyUri.length > 0 && - !UA_String_equal(&userToken->securityPolicyUri, &securityNone)) - continue; + /* Delete the notification */ + UA_Notification_dequeue(server, del); + UA_Notification_delete(del); + } - /* UA_CLIENTAUTHENTICATION_NONE == UA_USERTOKENTYPE_ANONYMOUS - * UA_CLIENTAUTHENTICATION_USERNAME == UA_USERTOKENTYPE_USERNAME - * TODO: Check equivalence for other types when adding the support */ - if((int)client->authenticationMethod != (int)userToken->tokenType) - continue; + /* Get the element where the overflow shall be announced (infobits or + * overflowevent) */ + UA_Notification *indicator; + if(mon->discardOldest) + indicator = TAILQ_FIRST(&mon->queue); + else + indicator = TAILQ_LAST(&mon->queue, NotificationQueue); + UA_assert(indicator); - /* Endpoint with matching usertokenpolicy found */ - tokenFound = true; - UA_UserTokenPolicy_deleteMembers(&client->token); - UA_UserTokenPolicy_copy(userToken, &client->token); - break; + /* Create an overflow notification */ +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) { + return createEventOverflowNotification(server, sub, mon, indicator); + } else +#endif + { + /* Set the infobits of a datachange notification */ + if(mon->maxQueueSize > 1) { + /* Add the infobits either to the newest or the new last entry */ + indicator->data.value.hasStatus = true; + indicator->data.value.status |= + (UA_STATUSCODE_INFOTYPE_DATAVALUE | UA_STATUSCODE_INFOBITS_OVERFLOW); } } + return UA_STATUSCODE_GOOD; +} - UA_Array_delete(endpointArray, endpointArraySize, - &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); +UA_StatusCode +UA_MonitoredItem_registerSampleCallback(UA_Server *server, UA_MonitoredItem *mon) { + if(mon->sampleCallbackIsRegistered) + return UA_STATUSCODE_GOOD; - if(!endpointFound) { - UA_LOG_ERROR(client->config.logger, UA_LOGCATEGORY_CLIENT, - "No suitable endpoint found"); - retval = UA_STATUSCODE_BADINTERNALERROR; - } else if(!tokenFound) { - UA_LOG_ERROR(client->config.logger, UA_LOGCATEGORY_CLIENT, - "No suitable UserTokenPolicy found for the possible endpoints"); - retval = UA_STATUSCODE_BADINTERNALERROR; - } + /* Only DataChange MonitoredItems have a callback with a sampling interval */ + if(mon->attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER) + return UA_STATUSCODE_GOOD; + + UA_StatusCode retval = + UA_Server_addRepeatedCallback(server, (UA_ServerCallback)UA_MonitoredItem_sampleCallback, + mon, mon->samplingInterval, &mon->sampleCallbackId); + if(retval == UA_STATUSCODE_GOOD) + mon->sampleCallbackIsRegistered = true; return retval; } -static UA_StatusCode -createSession(UA_Client *client) { - UA_CreateSessionRequest request; - UA_CreateSessionRequest_init(&request); +void +UA_MonitoredItem_unregisterSampleCallback(UA_Server *server, UA_MonitoredItem *mon) { + if(!mon->sampleCallbackIsRegistered) + return; + UA_Server_removeRepeatedCallback(server, mon->sampleCallbackId); + mon->sampleCallbackIsRegistered = false; +} + +#endif /* UA_ENABLE_SUBSCRIPTIONS */ - request.requestHeader.timestamp = UA_DateTime_now(); - request.requestHeader.timeoutHint = 10000; - UA_ByteString_copy(&client->channel.localNonce, &request.clientNonce); - request.requestedSessionTimeout = 1200000; - request.maxResponseMessageSize = UA_INT32_MAX; - UA_String_copy(&client->endpointUrl, &request.endpointUrl); +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/src/server/ua_subscription_datachange.c" ***********************************/ - UA_CreateSessionResponse response; - __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST], - &response, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]); +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2018 (c) Ari Breitkreuz, fortiss GmbH + * Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA + * Copyright 2018 (c) Fabian Arndt, Root-Core + */ - UA_NodeId_copy(&response.authenticationToken, &client->authenticationToken); - UA_StatusCode retval = response.responseHeader.serviceResult; - UA_CreateSessionRequest_deleteMembers(&request); - UA_CreateSessionResponse_deleteMembers(&response); - return retval; -} +#ifdef UA_ENABLE_DA +#include // fabs +#endif -UA_StatusCode -UA_Client_connectInternal(UA_Client *client, const char *endpointUrl, - UA_Boolean endpointsHandshake, UA_Boolean createNewSession) { - if(client->state >= UA_CLIENTSTATE_CONNECTED) - return UA_STATUSCODE_GOOD; - UA_ChannelSecurityToken_init(&client->channel.securityToken); - client->channel.state = UA_SECURECHANNELSTATE_FRESH; - client->channel.sendSequenceNumber = 0; - client->requestId = 0; +#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */ - UA_StatusCode retval = UA_STATUSCODE_GOOD; - client->connection = - client->config.connectionFunc(client->config.localConnectionConfig, - endpointUrl, client->config.timeout, - client->config.logger); - if(client->connection.state != UA_CONNECTION_OPENING) { - retval = UA_STATUSCODE_BADCONNECTIONCLOSED; - goto cleanup; - } +#define UA_VALUENCODING_MAXSTACK 512 - UA_String_deleteMembers(&client->endpointUrl); - client->endpointUrl = UA_STRING_ALLOC(endpointUrl); - if(!client->endpointUrl.data) { - retval = UA_STATUSCODE_BADOUTOFMEMORY; - goto cleanup; +#define ABS_SUBTRACT_TYPE_INDEPENDENT(a,b) ((a)>(b)?(a)-(b):(b)-(a)) + +static UA_Boolean +outOfDeadBand(const void *data1, const void *data2, const size_t arrayPos, + const UA_DataType *type, const UA_Double deadbandValue) { + if(type == &UA_TYPES[UA_TYPES_BOOLEAN]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Boolean*)data1)[arrayPos], + ((const UA_Boolean*)data2)[arrayPos]) <= deadbandValue) + return false; + } else if(type == &UA_TYPES[UA_TYPES_SBYTE]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_SByte*)data1)[arrayPos], + ((const UA_SByte*)data2)[arrayPos]) <= deadbandValue) + return false; + } else if(type == &UA_TYPES[UA_TYPES_BYTE]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Byte*)data1)[arrayPos], + ((const UA_Byte*)data2)[arrayPos]) <= deadbandValue) + return false; + } else if(type == &UA_TYPES[UA_TYPES_INT16]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Int16*)data1)[arrayPos], + ((const UA_Int16*)data2)[arrayPos]) <= deadbandValue) + return false; + } else if(type == &UA_TYPES[UA_TYPES_UINT16]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_UInt16*)data1)[arrayPos], + ((const UA_UInt16*)data2)[arrayPos]) <= deadbandValue) + return false; + } else if(type == &UA_TYPES[UA_TYPES_INT32]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Int32*)data1)[arrayPos], + ((const UA_Int32*)data2)[arrayPos]) <= deadbandValue) + return false; + } else if(type == &UA_TYPES[UA_TYPES_UINT32]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_UInt32*)data1)[arrayPos], + ((const UA_UInt32*)data2)[arrayPos]) <= deadbandValue) + return false; + } else if(type == &UA_TYPES[UA_TYPES_INT64]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Int64*)data1)[arrayPos], + ((const UA_Int64*)data2)[arrayPos]) <= deadbandValue) + return false; + } else if(type == &UA_TYPES[UA_TYPES_UINT64]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_UInt64*)data1)[arrayPos], + ((const UA_UInt64*)data2)[arrayPos]) <= deadbandValue) + return false; + } else if(type == &UA_TYPES[UA_TYPES_FLOAT]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Float*)data1)[arrayPos], + ((const UA_Float*)data2)[arrayPos]) <= deadbandValue) + return false; + } else if(type == &UA_TYPES[UA_TYPES_DOUBLE]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Double*)data1)[arrayPos], + ((const UA_Double*)data2)[arrayPos]) <= deadbandValue) + return false; } + return true; +} - /* Open a TCP connection */ - client->connection.localConf = client->config.localConnectionConfig; - retval = HelAckHandshake(client); - if(retval != UA_STATUSCODE_GOOD) - goto cleanup; - setClientState(client, UA_CLIENTSTATE_CONNECTED); +#ifdef UA_ENABLE_DA +static UA_INLINE UA_Boolean +outOfPercentDeadBand(const void *data1, const void *data2, const size_t index, + const UA_DataType *type, const UA_Double deadbandValue, UA_Range* range) { + if(type == &UA_TYPES[UA_TYPES_SBYTE]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_SByte*)data1)[index], + ((const UA_SByte*)data2)[index]) <= (deadbandValue/100.0)*(fabs(range->high - range->low)) || + *(const UA_SByte*)data1 > range->high) + return false; + } else if(type == &UA_TYPES[UA_TYPES_BYTE]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Byte*)data1)[index], + ((const UA_Byte*)data2)[index]) <= (deadbandValue/100.0)*(fabs(range->high - range->low)) || + *(const UA_Byte*)data1 > range->high) + return false; + } else if(type == &UA_TYPES[UA_TYPES_INT16]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Int16*)data1)[index], + ((const UA_Int16*)data2)[index]) <= (deadbandValue/100.0)*(fabs(range->high - range->low)) || + *(const UA_Int16*)data1 > range->high) + return false; + } else if(type == &UA_TYPES[UA_TYPES_UINT16]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_UInt16*)data1)[index], + ((const UA_UInt16*)data2)[index]) <= (deadbandValue/100.0)*(fabs(range->high - range->low)) || + *(const UA_UInt16*)data1 > range->high) + return false; + } else if(type == &UA_TYPES[UA_TYPES_INT32]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Int32*)data1)[index], + ((const UA_Int32*)data2)[index]) <= (deadbandValue/100.0)*(fabs(range->high - range->low)) || + *(const UA_Int32*)data1 > range->high) + return false; + } else if(type == &UA_TYPES[UA_TYPES_UINT32]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_UInt32*)data1)[index], + ((const UA_UInt32*)data2)[index]) <= (deadbandValue/100.0)*(fabs(range->high - range->low)) || + *(const UA_UInt32*)data1 > range->high) + return false; + } else if(type == &UA_TYPES[UA_TYPES_INT64]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Int64*)data1)[index], + ((const UA_Int64*)data2)[index]) <= (deadbandValue/100.0)*(fabs(range->high - range->low)) || + *(const UA_Int64*)data1 > range->high) + return false; + } else if(type == &UA_TYPES[UA_TYPES_UINT64]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_UInt64*)data1)[index], + ((const UA_UInt64*)data2)[index]) <= (deadbandValue/100.0)*(fabs(range->high - range->low)) || + *(const UA_UInt64*)data1 > range->high) + return false; + } else if(type == &UA_TYPES[UA_TYPES_FLOAT]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Float*)data1)[index], + ((const UA_Float*)data2)[index]) <= (deadbandValue/100.0)*(fabs(range->high - range->low)) || + *(const UA_Float*)data1 > range->high) + return false; + } else if(type == &UA_TYPES[UA_TYPES_DOUBLE]) { + if(ABS_SUBTRACT_TYPE_INDEPENDENT(((const UA_Double*)data1)[index], + ((const UA_Double*)data2)[index]) <= (deadbandValue/100.0)*(fabs(range->high - range->low)) || + *(const UA_Double*)data1 > range->high) + return false; + } + return true; +} +#endif /* UA_ENABLE_DA */ - /* Open a SecureChannel. TODO: Select with endpoint */ - client->channel.connection = &client->connection; - retval = openSecureChannel(client, false); - if(retval != UA_STATUSCODE_GOOD) - goto cleanup; - setClientState(client, UA_CLIENTSTATE_SECURECHANNEL); +static UA_INLINE UA_Boolean +updateNeededForFilteredValue(const UA_Variant *value, const UA_Variant *oldValue, + const UA_Double deadbandValue) { + if(value->arrayLength != oldValue->arrayLength) + return true; + if(value->type != oldValue->type) + return true; - /* Delete async service. TODO: Move this from connect to the disconnect/cleanup phase */ - UA_Client_AsyncService_removeAll(client, UA_STATUSCODE_BADSHUTDOWN); + if (UA_Variant_isScalar(value)) { + return outOfDeadBand(value->data, oldValue->data, 0, value->type, deadbandValue); + } + for (size_t i = 0; i < value->arrayLength; ++i) { + if (outOfDeadBand(value->data, oldValue->data, i, value->type, deadbandValue)) + return true; + } + return false; +} -#ifdef UA_ENABLE_SUBSCRIPTIONS - client->currentlyOutStandingPublishRequests = 0; -#endif +#ifdef UA_ENABLE_DA +static UA_INLINE UA_Boolean +updateNeededForFilteredPercentValue(const UA_Variant *value, const UA_Variant *oldValue, + const UA_Double deadbandValue, UA_Range* euRange) { + if(value->arrayLength != oldValue->arrayLength) + return true; -// TODO: actually, reactivate an existing session is working, but currently republish is not implemented -// This option is disabled until we have a good implementation of the subscription recovery. + if(value->type != oldValue->type) + return true; -#ifdef UA_SESSION_RECOVERY - /* Try to activate an existing Session for this SecureChannel */ - if((!UA_NodeId_equal(&client->authenticationToken, &UA_NODEID_NULL)) && (createNewSession)) { - retval = activateSession(client); - if(retval == UA_STATUSCODE_BADSESSIONIDINVALID) { - /* Could not recover an old session. Remove authenticationToken */ - UA_NodeId_deleteMembers(&client->authenticationToken); - } else { - if(retval != UA_STATUSCODE_GOOD) - goto cleanup; - setClientState(client, UA_CLIENTSTATE_SESSION_RENEWED); - return retval; - } - } else { - UA_NodeId_deleteMembers(&client->authenticationToken); + if (UA_Variant_isScalar(value)) { + return outOfPercentDeadBand(value->data, oldValue->data, 0, value->type, deadbandValue, euRange); } -#else - UA_NodeId_deleteMembers(&client->authenticationToken); -#endif /* UA_SESSION_RECOVERY */ + for (size_t i = 0; i < value->arrayLength; ++i) { + if (outOfPercentDeadBand(value->data, oldValue->data, i, value->type, deadbandValue, euRange)) + return true; + } + return false; +} - /* Get Endpoints */ - if(endpointsHandshake) { - retval = getEndpoints(client); - if(retval != UA_STATUSCODE_GOOD) - goto cleanup; +static UA_Boolean +updateNeededForStatusCode(const UA_DataValue *value, const UA_MonitoredItem *mon) { + if (UA_Variant_isScalar(&value->value)) { + if(value->status != mon->lastStatus) + return true; } + return false; +} +#endif - /* Create the Session for this SecureChannel */ - if(createNewSession) { - retval = createSession(client); - if(retval != UA_STATUSCODE_GOOD) - goto cleanup; -#ifdef UA_ENABLE_SUBSCRIPTIONS - /* A new session has been created. We need to clean up the subscriptions */ - UA_Client_Subscriptions_clean(client); + +/* When a change is detected, encoding contains the heap-allocated binary + * encoded value. The default for changed is false. */ +static UA_StatusCode +detectValueChangeWithFilter(UA_Server *server, UA_MonitoredItem *mon, UA_DataValue *value, + UA_ByteString *encoding, UA_Boolean *changed) { + if(UA_DataType_isNumeric(value->value.type) && + (mon->filter.dataChangeFilter.trigger == UA_DATACHANGETRIGGER_STATUSVALUE || + mon->filter.dataChangeFilter.trigger == UA_DATACHANGETRIGGER_STATUSVALUETIMESTAMP)) { + if(mon->filter.dataChangeFilter.deadbandType == UA_DEADBANDTYPE_ABSOLUTE) { + if(!updateNeededForFilteredValue(&value->value, &mon->lastValue, + mon->filter.dataChangeFilter.deadbandValue)) + return UA_STATUSCODE_GOOD; + } +#ifdef UA_ENABLE_DA + else if(mon->filter.dataChangeFilter.deadbandType == UA_DEADBANDTYPE_PERCENT) { + UA_QualifiedName qn = UA_QUALIFIEDNAME(0, "EURange"); + UA_BrowsePathResult bpr = UA_Server_browseSimplifiedBrowsePath(server, mon->monitoredNodeId, 1, &qn); + if(bpr.statusCode != UA_STATUSCODE_GOOD || bpr.targetsSize < 1) { //if branch is not entried, property has been found + UA_BrowsePathResult_deleteMembers(&bpr); + return UA_STATUSCODE_GOOD; + } + const UA_VariableNode* node = + (const UA_VariableNode*) UA_Nodestore_getNode(server->nsCtx, &bpr.targets->targetId.nodeId); + UA_Range* euRange = (UA_Range*) node->value.data.value.value.data; + if(!updateNeededForFilteredPercentValue(&value->value, &mon->lastValue, + mon->filter.dataChangeFilter.deadbandValue, euRange)) { + if(!updateNeededForStatusCode(value, mon)) //when same value, but different status code is written + return UA_STATUSCODE_GOOD; + } + } #endif - retval = activateSession(client); - if(retval != UA_STATUSCODE_GOOD) - goto cleanup; - setClientState(client, UA_CLIENTSTATE_SESSION); } - return retval; + /* Stack-allocate some memory for the value encoding. We might heap-allocate + * more memory if needed. This is just enough for scalars and small + * structures. */ + UA_STACKARRAY(UA_Byte, stackValueEncoding, UA_VALUENCODING_MAXSTACK); + UA_ByteString valueEncoding; + valueEncoding.data = stackValueEncoding; + valueEncoding.length = UA_VALUENCODING_MAXSTACK; -cleanup: - UA_Client_close(client); - return retval; -} + /* Encode the value */ + UA_Byte *bufPos = valueEncoding.data; + const UA_Byte *bufEnd = &valueEncoding.data[valueEncoding.length]; + UA_StatusCode retval = UA_encodeBinary(value, &UA_TYPES[UA_TYPES_DATAVALUE], + &bufPos, &bufEnd, NULL, NULL); + if(retval == UA_STATUSCODE_BADENCODINGERROR) { + size_t binsize = UA_calcSizeBinary(value, &UA_TYPES[UA_TYPES_DATAVALUE]); + if(binsize == 0) + return UA_STATUSCODE_BADENCODINGERROR; -UA_StatusCode -UA_Client_connect(UA_Client *client, const char *endpointUrl) { - return UA_Client_connectInternal(client, endpointUrl, UA_TRUE, UA_TRUE); -} + if(binsize > UA_VALUENCODING_MAXSTACK) { + retval = UA_ByteString_allocBuffer(&valueEncoding, binsize); + if(retval == UA_STATUSCODE_GOOD) { + bufPos = valueEncoding.data; + bufEnd = &valueEncoding.data[valueEncoding.length]; + retval = UA_encodeBinary(value, &UA_TYPES[UA_TYPES_DATAVALUE], + &bufPos, &bufEnd, NULL, NULL); + } + } + } + if(retval != UA_STATUSCODE_GOOD) { + if(valueEncoding.data != stackValueEncoding) + UA_ByteString_deleteMembers(&valueEncoding); + return retval; + } -UA_StatusCode -UA_Client_connect_username(UA_Client *client, const char *endpointUrl, - const char *username, const char *password) { - client->authenticationMethod = UA_CLIENTAUTHENTICATION_USERNAME; - client->username = UA_STRING_ALLOC(username); - client->password = UA_STRING_ALLOC(password); - return UA_Client_connect(client, endpointUrl); -} + /* Has the value changed? */ + valueEncoding.length = (uintptr_t)bufPos - (uintptr_t)valueEncoding.data; + *changed = (!mon->lastSampledValue.data || + !UA_String_equal(&valueEncoding, &mon->lastSampledValue)); -UA_StatusCode -UA_Client_manuallyRenewSecureChannel(UA_Client *client) { - UA_StatusCode retval = openSecureChannel(client, true); - if(retval != UA_STATUSCODE_GOOD) - UA_Client_close(client); + /* No change */ + if(!(*changed)) { + if(valueEncoding.data != stackValueEncoding) + UA_ByteString_deleteMembers(&valueEncoding); + return UA_STATUSCODE_GOOD; + } - return retval; -} + /* Change detected. Copy encoding on the heap if necessary. */ + if(valueEncoding.data == stackValueEncoding) + return UA_ByteString_copy(&valueEncoding, encoding); -/************************/ -/* Close the Connection */ -/************************/ + *encoding = valueEncoding; + return UA_STATUSCODE_GOOD; +} -static void -sendCloseSession(UA_Client *client) { - UA_CloseSessionRequest request; - UA_CloseSessionRequest_init(&request); +/* Has this sample changed from the last one? The method may allocate additional + * space for the encoding buffer. Detect the change in encoding->data. */ +static UA_StatusCode +detectValueChange(UA_Server *server, UA_MonitoredItem *mon, + UA_DataValue value, UA_ByteString *encoding, UA_Boolean *changed) { + /* Apply Filter */ + if(mon->filter.dataChangeFilter.trigger == UA_DATACHANGETRIGGER_STATUS) + value.hasValue = false; - request.requestHeader.timestamp = UA_DateTime_now(); - request.requestHeader.timeoutHint = 10000; - request.deleteSubscriptions = true; - UA_CloseSessionResponse response; - __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST], - &response, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]); - UA_CloseSessionRequest_deleteMembers(&request); - UA_CloseSessionResponse_deleteMembers(&response); -} + value.hasServerTimestamp = false; + value.hasServerPicoseconds = false; + if(mon->filter.dataChangeFilter.trigger < UA_DATACHANGETRIGGER_STATUSVALUETIMESTAMP) { + value.hasSourceTimestamp = false; + value.hasSourcePicoseconds = false; + } -static void -sendCloseSecureChannel(UA_Client *client) { - UA_SecureChannel *channel = &client->channel; - UA_CloseSecureChannelRequest request; - UA_CloseSecureChannelRequest_init(&request); - request.requestHeader.requestHandle = ++client->requestHandle; - request.requestHeader.timestamp = UA_DateTime_now(); - request.requestHeader.timeoutHint = 10000; - request.requestHeader.authenticationToken = client->authenticationToken; - UA_SecureChannel_sendSymmetricMessage(channel, ++client->requestId, - UA_MESSAGETYPE_CLO, &request, - &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); - UA_CloseSecureChannelRequest_deleteMembers(&request); - UA_SecureChannel_deleteMembersCleanup(&client->channel); + /* Detect the value change */ + return detectValueChangeWithFilter(server, mon, &value, encoding, changed); } -UA_StatusCode -UA_Client_disconnect(UA_Client *client) { - /* Is a session established? */ - if(client->state >= UA_CLIENTSTATE_SESSION) { - client->state = UA_CLIENTSTATE_SECURECHANNEL; - sendCloseSession(client); +/* movedValue returns whether the sample was moved to the notification. The + * default is false. */ +static UA_StatusCode +sampleCallbackWithValue(UA_Server *server, UA_Session *session, + UA_Subscription *sub, UA_MonitoredItem *mon, + UA_DataValue *value, UA_Boolean *movedValue) { + UA_assert(mon->attributeId != UA_ATTRIBUTEID_EVENTNOTIFIER); + + /* Contains heap-allocated binary encoding of the value if a change was detected */ + UA_ByteString binValueEncoding = UA_BYTESTRING_NULL; + + /* Has the value changed? Allocates memory in binValueEncoding if necessary. + * value is edited internally so we make a shallow copy. */ + UA_Boolean changed = false; + UA_StatusCode retval = detectValueChange(server, mon, *value, &binValueEncoding, &changed); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING_SESSION(&server->config.logger, session, "Subscription %u | " + "MonitoredItem %i | Value change detection failed with StatusCode %s", + sub ? sub->subscriptionId : 0, mon->monitoredItemId, + UA_StatusCode_name(retval)); + return retval; } - UA_NodeId_deleteMembers(&client->authenticationToken); - client->requestHandle = 0; - - /* Is a secure channel established? */ - if(client->state >= UA_CLIENTSTATE_SECURECHANNEL) { - client->state = UA_CLIENTSTATE_CONNECTED; - sendCloseSecureChannel(client); + if(!changed) { + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Subscription %u | " + "MonitoredItem %i | The value has not changed", + sub ? sub->subscriptionId : 0, mon->monitoredItemId); + return UA_STATUSCODE_GOOD; } - /* Close the TCP connection */ - if(client->connection.state != UA_CONNECTION_CLOSED) - client->connection.close(&client->connection); + /* The MonitoredItem is attached to a subscription (not server-local). + * Prepare a notification and enqueue it. */ + if(sub) { + /* Allocate a new notification */ + UA_Notification *newNotification = (UA_Notification *)UA_malloc(sizeof(UA_Notification)); + if(!newNotification) { + UA_ByteString_deleteMembers(&binValueEncoding); + return UA_STATUSCODE_BADOUTOFMEMORY; + } -#ifdef UA_ENABLE_SUBSCRIPTIONS -// TODO REMOVE WHEN UA_SESSION_RECOVERY IS READY - /* We need to clean up the subscriptions */ - UA_Client_Subscriptions_clean(client); -#endif + if(value->value.storageType == UA_VARIANT_DATA) { + newNotification->data.value = *value; /* Move the value to the notification */ + *movedValue = true; + } else { /* => (value->value.storageType == UA_VARIANT_DATA_NODELETE) */ + retval = UA_DataValue_copy(value, &newNotification->data.value); + if(retval != UA_STATUSCODE_GOOD) { + UA_ByteString_deleteMembers(&binValueEncoding); + UA_free(newNotification); + return retval; + } + } - setClientState(client, UA_CLIENTSTATE_DISCONNECTED); - return UA_STATUSCODE_GOOD; -} + /* <-- Point of no return --> */ -UA_StatusCode -UA_Client_close(UA_Client *client) { - client->requestHandle = 0; + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Subscription %u | " + "MonitoredItem %i | Enqueue a new notification", + sub ? sub->subscriptionId : 0, mon->monitoredItemId); - if(client->state >= UA_CLIENTSTATE_SECURECHANNEL) - UA_SecureChannel_deleteMembersCleanup(&client->channel); + newNotification->mon = mon; + UA_Notification_enqueue(server, sub, mon, newNotification); + } - /* Close the TCP connection */ - if(client->connection.state != UA_CONNECTION_CLOSED) - client->connection.close(&client->connection); + /* Store the encoding for comparison */ + UA_ByteString_deleteMembers(&mon->lastSampledValue); + mon->lastSampledValue = binValueEncoding; -#ifdef UA_ENABLE_SUBSCRIPTIONS -// TODO REMOVE WHEN UA_SESSION_RECOVERY IS READY - /* We need to clean up the subscriptions */ - UA_Client_Subscriptions_clean(client); + /* Store the value for filter comparison (we don't want to decode + * lastSampledValue in every iteration). Don't test the return code here. If + * this fails, lastValue is empty and a notification will be forced for the + * next deadband comparison. */ + if((mon->filter.dataChangeFilter.deadbandType == UA_DEADBANDTYPE_NONE || + mon->filter.dataChangeFilter.deadbandType == UA_DEADBANDTYPE_ABSOLUTE || + mon->filter.dataChangeFilter.deadbandType == UA_DEADBANDTYPE_PERCENT) && + (mon->filter.dataChangeFilter.trigger == UA_DATACHANGETRIGGER_STATUS || + mon->filter.dataChangeFilter.trigger == UA_DATACHANGETRIGGER_STATUSVALUE || + mon->filter.dataChangeFilter.trigger == UA_DATACHANGETRIGGER_STATUSVALUETIMESTAMP)) { + UA_Variant_deleteMembers(&mon->lastValue); + UA_Variant_copy(&value->value, &mon->lastValue); +#ifdef UA_ENABLE_DA + UA_StatusCode_deleteMembers(&mon->lastStatus); + UA_StatusCode_copy(&value->status, &mon->lastStatus); #endif + } + + /* Call the local callback if the MonitoredItem is not attached to a + * subscription. Do this at the very end. Because the callback might delete + * the subscription. */ + if(!sub) { + UA_LocalMonitoredItem *localMon = (UA_LocalMonitoredItem*) mon; + void *nodeContext = NULL; + UA_Server_getNodeContext(server, mon->monitoredNodeId, &nodeContext); + localMon->callback.dataChangeCallback(server, mon->monitoredItemId, + localMon->context, + &mon->monitoredNodeId, + nodeContext, mon->attributeId, + value); + } - setClientState(client, UA_CLIENTSTATE_DISCONNECTED); return UA_STATUSCODE_GOOD; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/client/ua_client_discovery.c" ***********************************/ +void +UA_MonitoredItem_sampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem) { + UA_Subscription *sub = monitoredItem->subscription; + UA_Session *session = &server->adminSession; + if(sub) + session = sub->session; -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - */ + UA_LOG_DEBUG_SESSION(&server->config.logger, session, "Subscription %u | " + "MonitoredItem %i | Sample callback called", + sub ? sub->subscriptionId : 0, monitoredItem->monitoredItemId); + UA_assert(monitoredItem->attributeId != UA_ATTRIBUTEID_EVENTNOTIFIER); -UA_StatusCode -UA_Client_getEndpoints(UA_Client *client, const char *serverUrl, - size_t* endpointDescriptionsSize, - UA_EndpointDescription** endpointDescriptions) { - UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED); - /* Client is already connected to a different server */ - if(connected && strncmp((const char*)client->endpointUrl.data, serverUrl, - client->endpointUrl.length) != 0) { - return UA_STATUSCODE_BADINVALIDARGUMENT; + /* Get the node */ + const UA_Node *node = UA_Nodestore_getNode(server->nsCtx, &monitoredItem->monitoredNodeId); + + /* Sample the value. The sample can still point into the node. */ + UA_DataValue value; + UA_DataValue_init(&value); + if(node) { + UA_ReadValueId rvid; + UA_ReadValueId_init(&rvid); + rvid.nodeId = monitoredItem->monitoredNodeId; + rvid.attributeId = monitoredItem->attributeId; + rvid.indexRange = monitoredItem->indexRange; + ReadWithNode(node, server, session, monitoredItem->timestampsToReturn, &rvid, &value); + } else { + value.hasStatus = true; + value.status = UA_STATUSCODE_BADNODEIDUNKNOWN; } - UA_StatusCode retval; - if(!connected) { - retval = UA_Client_connectInternal(client, serverUrl, UA_FALSE, UA_FALSE); - if(retval != UA_STATUSCODE_GOOD) - return retval; + /* Operate on the sample */ + UA_Boolean movedValue = false; + UA_StatusCode retval = sampleCallbackWithValue(server, session, sub, monitoredItem, &value, &movedValue); + if(retval != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING_SESSION(&server->config.logger, session, "Subscription %u | " + "MonitoredItem %i | Sampling returned the statuscode %s", + sub ? sub->subscriptionId : 0, monitoredItem->monitoredItemId, + UA_StatusCode_name(retval)); } - retval = UA_Client_getEndpointsInternal(client, endpointDescriptionsSize, endpointDescriptions); - if(!connected) - UA_Client_disconnect(client); - return retval; + /* Delete the sample if it was not moved to the notification. */ + if(!movedValue) + UA_DataValue_deleteMembers(&value); /* Does nothing for UA_VARIANT_DATA_NODELETE */ + if(node) + UA_Nodestore_releaseNode(server->nsCtx, node); } -UA_StatusCode -UA_Client_findServers(UA_Client *client, const char *serverUrl, - size_t serverUrisSize, UA_String *serverUris, - size_t localeIdsSize, UA_String *localeIds, - size_t *registeredServersSize, - UA_ApplicationDescription **registeredServers) { - UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED); - /* Client is already connected to a different server */ - if(connected && strncmp((const char*)client->endpointUrl.data, serverUrl, - client->endpointUrl.length) != 0) { - return UA_STATUSCODE_BADINVALIDARGUMENT; - } +#endif /* UA_ENABLE_SUBSCRIPTIONS */ - if(!connected) { - UA_StatusCode retval = UA_Client_connectInternal(client, serverUrl, UA_TRUE, UA_FALSE); - if(retval != UA_STATUSCODE_GOOD) - return retval; - } +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/ua_log_stdout.c" ***********************************/ - /* Prepare the request */ - UA_FindServersRequest request; - UA_FindServersRequest_init(&request); - request.serverUrisSize = serverUrisSize; - request.serverUris = serverUris; - request.localeIdsSize = localeIdsSize; - request.localeIds = localeIds; +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2016-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA + */ - /* Send the request */ - UA_FindServersResponse response; - __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST], - &response, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); - /* Process the response */ - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD) { - *registeredServersSize = response.serversSize; - *registeredServers = response.servers; - response.serversSize = 0; - response.servers = NULL; - } else { - *registeredServersSize = 0; - *registeredServers = NULL; - } +#include - /* Clean up */ - UA_FindServersResponse_deleteMembers(&response); - if(!connected) - UA_Client_disconnect(client); - return retval; -} +#ifdef UA_ENABLE_MULTITHREADING +#include +static pthread_mutex_t printf_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif -UA_StatusCode -UA_Client_findServersOnNetwork(UA_Client *client, const char *serverUrl, - UA_UInt32 startingRecordId, UA_UInt32 maxRecordsToReturn, - size_t serverCapabilityFilterSize, UA_String *serverCapabilityFilter, - size_t *serverOnNetworkSize, UA_ServerOnNetwork **serverOnNetwork) { - UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED); - /* Client is already connected to a different server */ - if(connected && strncmp((const char*)client->endpointUrl.data, serverUrl, - client->endpointUrl.length) != 0) { - return UA_STATUSCODE_BADINVALIDARGUMENT; - } +/* ANSI escape sequences for color output taken from here: + * https://stackoverflow.com/questions/3219393/stdlib-and-colored-output-in-c*/ - if(!connected) { - UA_StatusCode retval = UA_Client_connectInternal(client, serverUrl, UA_TRUE, UA_FALSE); - if(retval != UA_STATUSCODE_GOOD) - return retval; - } +#ifdef UA_ENABLE_LOG_COLORS +# define ANSI_COLOR_RED "\x1b[31m" +# define ANSI_COLOR_GREEN "\x1b[32m" +# define ANSI_COLOR_YELLOW "\x1b[33m" +# define ANSI_COLOR_BLUE "\x1b[34m" +# define ANSI_COLOR_MAGENTA "\x1b[35m" +# define ANSI_COLOR_CYAN "\x1b[36m" +# define ANSI_COLOR_RESET "\x1b[0m" +#else +# define ANSI_COLOR_RED "" +# define ANSI_COLOR_GREEN "" +# define ANSI_COLOR_YELLOW "" +# define ANSI_COLOR_BLUE "" +# define ANSI_COLOR_MAGENTA "" +# define ANSI_COLOR_CYAN "" +# define ANSI_COLOR_RESET "" +#endif - /* Prepare the request */ - UA_FindServersOnNetworkRequest request; - UA_FindServersOnNetworkRequest_init(&request); - request.startingRecordId = startingRecordId; - request.maxRecordsToReturn = maxRecordsToReturn; - request.serverCapabilityFilterSize = serverCapabilityFilterSize; - request.serverCapabilityFilter = serverCapabilityFilter; +const char *logLevelNames[6] = {"trace", "debug", + ANSI_COLOR_GREEN "info", + ANSI_COLOR_YELLOW "warn", + ANSI_COLOR_RED "error", + ANSI_COLOR_MAGENTA "fatal"}; +const char *logCategoryNames[7] = {"network", "channel", "session", "server", + "client", "userland", "securitypolicy"}; - /* Send the request */ - UA_FindServersOnNetworkResponse response; - __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST], - &response, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]); +#ifdef __clang__ +__attribute__((__format__(__printf__, 4 , 0))) +#endif +void +UA_Log_Stdout_log(void *_, UA_LogLevel level, UA_LogCategory category, + const char *msg, va_list args) { + UA_Int64 tOffset = UA_DateTime_localTimeUtcOffset(); + UA_DateTimeStruct dts = UA_DateTime_toStruct(UA_DateTime_now() + tOffset); - /* Process the response */ - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD) { - *serverOnNetworkSize = response.serversSize; - *serverOnNetwork = response.servers; - response.serversSize = 0; - response.servers = NULL; - } else { - *serverOnNetworkSize = 0; - *serverOnNetwork = NULL; - } +#ifdef UA_ENABLE_MULTITHREADING + pthread_mutex_lock(&printf_mutex); +#endif + + printf("[%04u-%02u-%02u %02u:%02u:%02u.%03u (UTC%+05d)] %s/%s" ANSI_COLOR_RESET "\t", + dts.year, dts.month, dts.day, dts.hour, dts.min, dts.sec, dts.milliSec, + (int)(tOffset / UA_DATETIME_SEC / 36), logLevelNames[level], logCategoryNames[category]); + vprintf(msg, args); + printf("\n"); + fflush(stdout); + +#ifdef UA_ENABLE_MULTITHREADING + pthread_mutex_unlock(&printf_mutex); +#endif +} + +void +UA_Log_Stdout_clear(void *logContext) { - /* Clean up */ - UA_FindServersOnNetworkResponse_deleteMembers(&response); - if(!connected) - UA_Client_disconnect(client); - return retval; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/client/ua_client_highlevel.c" ***********************************/ +const UA_Logger UA_Log_Stdout_ = {UA_Log_Stdout_log, NULL, UA_Log_Stdout_clear}; +const UA_Logger *UA_Log_Stdout = &UA_Log_Stdout_; -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/ua_accesscontrol_default.c" ***********************************/ + +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. * - * Copyright 2015-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2015 (c) Oleksiy Vasylyev - * Copyright 2017 (c) Florian Palm - * Copyright 2016 (c) Chris Iatrou + * Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2017 (c) Stefan Profanter, fortiss GmbH */ -UA_StatusCode -UA_Client_NamespaceGetIndex(UA_Client *client, UA_String *namespaceUri, - UA_UInt16 *namespaceIndex) { - UA_ReadRequest request; - UA_ReadRequest_init(&request); - UA_ReadValueId id; - UA_ReadValueId_init(&id); - id.attributeId = UA_ATTRIBUTEID_VALUE; - id.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY); - request.nodesToRead = &id; - request.nodesToReadSize = 1; +/* Example access control management. Anonymous and username / password login. + * The access rights are maximally permissive. */ - UA_ReadResponse response = UA_Client_Service_read(client, request); +typedef struct { + UA_Boolean allowAnonymous; + size_t usernamePasswordLoginSize; + UA_UsernamePasswordLogin *usernamePasswordLogin; +} AccessControlContext; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) - retval = response.responseHeader.serviceResult; - else if(response.resultsSize != 1 || !response.results[0].hasValue) - retval = UA_STATUSCODE_BADNODEATTRIBUTESINVALID; - else if(response.results[0].value.type != &UA_TYPES[UA_TYPES_STRING]) - retval = UA_STATUSCODE_BADTYPEMISMATCH; +#define ANONYMOUS_POLICY "open62541-anonymous-policy" +#define USERNAME_POLICY "open62541-username-policy" +const UA_String anonymous_policy = UA_STRING_STATIC(ANONYMOUS_POLICY); +const UA_String username_policy = UA_STRING_STATIC(USERNAME_POLICY); - if(retval != UA_STATUSCODE_GOOD) { - UA_ReadResponse_deleteMembers(&response); - return retval; +/************************/ +/* Access Control Logic */ +/************************/ + +static UA_StatusCode +activateSession_default(UA_Server *server, UA_AccessControl *ac, + const UA_EndpointDescription *endpointDescription, + const UA_ByteString *secureChannelRemoteCertificate, + const UA_NodeId *sessionId, + const UA_ExtensionObject *userIdentityToken, + void **sessionContext) { + AccessControlContext *context = (AccessControlContext*)ac->context; + + /* The empty token is interpreted as anonymous */ + if(userIdentityToken->encoding == UA_EXTENSIONOBJECT_ENCODED_NOBODY) { + if(!context->allowAnonymous) + return UA_STATUSCODE_BADIDENTITYTOKENINVALID; + + /* No userdata atm */ + *sessionContext = NULL; + return UA_STATUSCODE_GOOD; } - retval = UA_STATUSCODE_BADNOTFOUND; - UA_String *ns = (UA_String *)response.results[0].value.data; - for(size_t i = 0; i < response.results[0].value.arrayLength; ++i) { - if(UA_String_equal(namespaceUri, &ns[i])) { - *namespaceIndex = (UA_UInt16)i; - retval = UA_STATUSCODE_GOOD; - break; - } + /* Could the token be decoded? */ + if(userIdentityToken->encoding < UA_EXTENSIONOBJECT_DECODED) + return UA_STATUSCODE_BADIDENTITYTOKENINVALID; + + /* Anonymous login */ + if(userIdentityToken->content.decoded.type == &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]) { + if(!context->allowAnonymous) + return UA_STATUSCODE_BADIDENTITYTOKENINVALID; + + const UA_AnonymousIdentityToken *token = (UA_AnonymousIdentityToken*) + userIdentityToken->content.decoded.data; + + /* Compatibility notice: Siemens OPC Scout v10 provides an empty + * policyId. This is not compliant. For compatibility, assume that empty + * policyId == ANONYMOUS_POLICY */ + if(token->policyId.data && !UA_String_equal(&token->policyId, &anonymous_policy)) + return UA_STATUSCODE_BADIDENTITYTOKENINVALID; + + /* No userdata atm */ + *sessionContext = NULL; + return UA_STATUSCODE_GOOD; } - UA_ReadResponse_deleteMembers(&response); - return retval; -} + /* Username and password */ + if(userIdentityToken->content.decoded.type == &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]) { + const UA_UserNameIdentityToken *userToken = + (UA_UserNameIdentityToken*)userIdentityToken->content.decoded.data; -UA_StatusCode -UA_Client_forEachChildNodeCall(UA_Client *client, UA_NodeId parentNodeId, - UA_NodeIteratorCallback callback, void *handle) { - UA_BrowseRequest bReq; - UA_BrowseRequest_init(&bReq); - bReq.requestedMaxReferencesPerNode = 0; - bReq.nodesToBrowse = UA_BrowseDescription_new(); - bReq.nodesToBrowseSize = 1; - UA_NodeId_copy(&parentNodeId, &bReq.nodesToBrowse[0].nodeId); - bReq.nodesToBrowse[0].resultMask = UA_BROWSERESULTMASK_ALL; //return everything - bReq.nodesToBrowse[0].browseDirection = UA_BROWSEDIRECTION_BOTH; + if(!UA_String_equal(&userToken->policyId, &username_policy)) + return UA_STATUSCODE_BADIDENTITYTOKENINVALID; - UA_BrowseResponse bResp = UA_Client_Service_browse(client, bReq); + /* The userToken has been decrypted by the server before forwarding + * it to the plugin. This information can be used here. */ + /* if(userToken->encryptionAlgorithm.length > 0) {} */ - UA_StatusCode retval = bResp.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD) { - for(size_t i = 0; i < bResp.resultsSize; ++i) { - for(size_t j = 0; j < bResp.results[i].referencesSize; ++j) { - UA_ReferenceDescription *ref = &bResp.results[i].references[j]; - retval |= callback(ref->nodeId.nodeId, !ref->isForward, - ref->referenceTypeId, handle); + /* Empty username and password */ + if(userToken->userName.length == 0 && userToken->password.length == 0) + return UA_STATUSCODE_BADIDENTITYTOKENINVALID; + + /* Try to match username/pw */ + UA_Boolean match = false; + for(size_t i = 0; i < context->usernamePasswordLoginSize; i++) { + if(UA_String_equal(&userToken->userName, &context->usernamePasswordLogin[i].username) && + UA_String_equal(&userToken->password, &context->usernamePasswordLogin[i].password)) { + match = true; + break; } } + if(!match) + return UA_STATUSCODE_BADUSERACCESSDENIED; + + /* No userdata atm */ + *sessionContext = NULL; + return UA_STATUSCODE_GOOD; } - UA_BrowseRequest_deleteMembers(&bReq); - UA_BrowseResponse_deleteMembers(&bResp); - return retval; + /* Unsupported token type */ + return UA_STATUSCODE_BADIDENTITYTOKENINVALID; } -/*******************/ -/* Node Management */ -/*******************/ - -UA_StatusCode -UA_Client_addReference(UA_Client *client, const UA_NodeId sourceNodeId, - const UA_NodeId referenceTypeId, UA_Boolean isForward, - const UA_String targetServerUri, - const UA_ExpandedNodeId targetNodeId, - UA_NodeClass targetNodeClass) { - UA_AddReferencesItem item; - UA_AddReferencesItem_init(&item); - item.sourceNodeId = sourceNodeId; - item.referenceTypeId = referenceTypeId; - item.isForward = isForward; - item.targetServerUri = targetServerUri; - item.targetNodeId = targetNodeId; - item.targetNodeClass = targetNodeClass; - UA_AddReferencesRequest request; - UA_AddReferencesRequest_init(&request); - request.referencesToAdd = &item; - request.referencesToAddSize = 1; - UA_AddReferencesResponse response = UA_Client_Service_addReferences(client, request); - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval != UA_STATUSCODE_GOOD) { - UA_AddReferencesResponse_deleteMembers(&response); - return retval; - } - if(response.resultsSize != 1) { - UA_AddReferencesResponse_deleteMembers(&response); - return UA_STATUSCODE_BADUNEXPECTEDERROR; - } - retval = response.results[0]; - UA_AddReferencesResponse_deleteMembers(&response); - return retval; +static void +closeSession_default(UA_Server *server, UA_AccessControl *ac, + const UA_NodeId *sessionId, void *sessionContext) { + /* no context to clean up */ } -UA_StatusCode -UA_Client_deleteReference(UA_Client *client, const UA_NodeId sourceNodeId, - const UA_NodeId referenceTypeId, UA_Boolean isForward, - const UA_ExpandedNodeId targetNodeId, - UA_Boolean deleteBidirectional) { - UA_DeleteReferencesItem item; - UA_DeleteReferencesItem_init(&item); - item.sourceNodeId = sourceNodeId; - item.referenceTypeId = referenceTypeId; - item.isForward = isForward; - item.targetNodeId = targetNodeId; - item.deleteBidirectional = deleteBidirectional; - UA_DeleteReferencesRequest request; - UA_DeleteReferencesRequest_init(&request); - request.referencesToDelete = &item; - request.referencesToDeleteSize = 1; - UA_DeleteReferencesResponse response = UA_Client_Service_deleteReferences(client, request); - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval != UA_STATUSCODE_GOOD) { - UA_DeleteReferencesResponse_deleteMembers(&response); - return retval; - } - if(response.resultsSize != 1) { - UA_DeleteReferencesResponse_deleteMembers(&response); - return UA_STATUSCODE_BADUNEXPECTEDERROR; - } - retval = response.results[0]; - UA_DeleteReferencesResponse_deleteMembers(&response); - return retval; +static UA_UInt32 +getUserRightsMask_default(UA_Server *server, UA_AccessControl *ac, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeId, void *nodeContext) { + return 0xFFFFFFFF; } -UA_StatusCode -UA_Client_deleteNode(UA_Client *client, const UA_NodeId nodeId, - UA_Boolean deleteTargetReferences) { - UA_DeleteNodesItem item; - UA_DeleteNodesItem_init(&item); - item.nodeId = nodeId; - item.deleteTargetReferences = deleteTargetReferences; - UA_DeleteNodesRequest request; - UA_DeleteNodesRequest_init(&request); - request.nodesToDelete = &item; - request.nodesToDeleteSize = 1; - UA_DeleteNodesResponse response = UA_Client_Service_deleteNodes(client, request); - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval != UA_STATUSCODE_GOOD) { - UA_DeleteNodesResponse_deleteMembers(&response); - return retval; - } - if(response.resultsSize != 1) { - UA_DeleteNodesResponse_deleteMembers(&response); - return UA_STATUSCODE_BADUNEXPECTEDERROR; - } - retval = response.results[0]; - UA_DeleteNodesResponse_deleteMembers(&response); - return retval; +static UA_Byte +getUserAccessLevel_default(UA_Server *server, UA_AccessControl *ac, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeId, void *nodeContext) { + return 0xFF; } -UA_StatusCode -__UA_Client_addNode(UA_Client *client, const UA_NodeClass nodeClass, - const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId, - const UA_NodeId referenceTypeId, const UA_QualifiedName browseName, - const UA_NodeId typeDefinition, const UA_NodeAttributes *attr, - const UA_DataType *attributeType, UA_NodeId *outNewNodeId) { - UA_AddNodesRequest request; - UA_AddNodesRequest_init(&request); - UA_AddNodesItem item; - UA_AddNodesItem_init(&item); - item.parentNodeId.nodeId = parentNodeId; - item.referenceTypeId = referenceTypeId; - item.requestedNewNodeId.nodeId = requestedNewNodeId; - item.browseName = browseName; - item.nodeClass = nodeClass; - item.typeDefinition.nodeId = typeDefinition; - item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; - item.nodeAttributes.content.decoded.type = attributeType; - item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)attr; // hack. is not written into. - request.nodesToAdd = &item; - request.nodesToAddSize = 1; - UA_AddNodesResponse response = UA_Client_Service_addNodes(client, request); - - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval != UA_STATUSCODE_GOOD) { - UA_AddNodesResponse_deleteMembers(&response); - return retval; - } - - if(response.resultsSize != 1) { - UA_AddNodesResponse_deleteMembers(&response); - return UA_STATUSCODE_BADUNEXPECTEDERROR; - } - - /* Move the id of the created node */ - retval = response.results[0].statusCode; - if(retval == UA_STATUSCODE_GOOD && outNewNodeId) { - *outNewNodeId = response.results[0].addedNodeId; - UA_NodeId_init(&response.results[0].addedNodeId); - } +static UA_Boolean +getUserExecutable_default(UA_Server *server, UA_AccessControl *ac, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *methodId, void *methodContext) { + return true; +} - UA_AddNodesResponse_deleteMembers(&response); - return retval; +static UA_Boolean +getUserExecutableOnObject_default(UA_Server *server, UA_AccessControl *ac, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *methodId, void *methodContext, + const UA_NodeId *objectId, void *objectContext) { + return true; } -/********/ -/* Call */ -/********/ +static UA_Boolean +allowAddNode_default(UA_Server *server, UA_AccessControl *ac, + const UA_NodeId *sessionId, void *sessionContext, + const UA_AddNodesItem *item) { + return true; +} -#ifdef UA_ENABLE_METHODCALLS +static UA_Boolean +allowAddReference_default(UA_Server *server, UA_AccessControl *ac, + const UA_NodeId *sessionId, void *sessionContext, + const UA_AddReferencesItem *item) { + return true; +} -UA_StatusCode -UA_Client_call(UA_Client *client, const UA_NodeId objectId, - const UA_NodeId methodId, size_t inputSize, - const UA_Variant *input, size_t *outputSize, - UA_Variant **output) { - /* Set up the request */ - UA_CallRequest request; - UA_CallRequest_init(&request); - UA_CallMethodRequest item; - UA_CallMethodRequest_init(&item); - item.methodId = methodId; - item.objectId = objectId; - item.inputArguments = (UA_Variant *)(void*)(uintptr_t)input; // cast const... - item.inputArgumentsSize = inputSize; - request.methodsToCall = &item; - request.methodsToCallSize = 1; +static UA_Boolean +allowDeleteNode_default(UA_Server *server, UA_AccessControl *ac, + const UA_NodeId *sessionId, void *sessionContext, + const UA_DeleteNodesItem *item) { + return true; +} - /* Call the service */ - UA_CallResponse response = UA_Client_Service_call(client, request); - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD) { - if(response.resultsSize == 1) - retval = response.results[0].statusCode; - else - retval = UA_STATUSCODE_BADUNEXPECTEDERROR; - } - if(retval != UA_STATUSCODE_GOOD) { - UA_CallResponse_deleteMembers(&response); - return retval; - } +static UA_Boolean +allowDeleteReference_default(UA_Server *server, UA_AccessControl *ac, + const UA_NodeId *sessionId, void *sessionContext, + const UA_DeleteReferencesItem *item) { + return true; +} - /* Move the output arguments */ - if(output != NULL && outputSize != NULL) { - *output = response.results[0].outputArguments; - *outputSize = response.results[0].outputArgumentsSize; - response.results[0].outputArguments = NULL; - response.results[0].outputArgumentsSize = 0; - } - UA_CallResponse_deleteMembers(&response); - return retval; +#ifdef UA_ENABLE_HISTORIZING +static UA_Boolean +allowHistoryUpdateUpdateData_default(UA_Server *server, UA_AccessControl *ac, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeId, + UA_PerformUpdateType performInsertReplace, + const UA_DataValue *value) { + return true; } +static UA_Boolean +allowHistoryUpdateDeleteRawModified_default(UA_Server *server, UA_AccessControl *ac, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeId, + UA_DateTime startTimestamp, + UA_DateTime endTimestamp, + bool isDeleteModified) { + return true; +} #endif -/********************/ -/* Write Attributes */ -/********************/ - -UA_StatusCode -__UA_Client_writeAttribute(UA_Client *client, const UA_NodeId *nodeId, - UA_AttributeId attributeId, const void *in, - const UA_DataType *inDataType) { - if(!in) - return UA_STATUSCODE_BADTYPEMISMATCH; +/***************************************/ +/* Create Delete Access Control Plugin */ +/***************************************/ - UA_WriteValue wValue; - UA_WriteValue_init(&wValue); - wValue.nodeId = *nodeId; - wValue.attributeId = attributeId; - if(attributeId == UA_ATTRIBUTEID_VALUE) - wValue.value.value = *(const UA_Variant*)in; - else - /* hack. is never written into. */ - UA_Variant_setScalar(&wValue.value.value, (void*)(uintptr_t)in, inDataType); - wValue.value.hasValue = true; - UA_WriteRequest wReq; - UA_WriteRequest_init(&wReq); - wReq.nodesToWrite = &wValue; - wReq.nodesToWriteSize = 1; +static void deleteMembers_default(UA_AccessControl *ac) { + UA_Array_delete((void*)(uintptr_t)ac->userTokenPolicies, + ac->userTokenPoliciesSize, + &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); + ac->userTokenPolicies = NULL; + ac->userTokenPoliciesSize = 0; - UA_WriteResponse wResp = UA_Client_Service_write(client, wReq); + AccessControlContext *context = (AccessControlContext*)ac->context; - UA_StatusCode retval = wResp.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD) { - if(wResp.resultsSize == 1) - retval = wResp.results[0]; - else - retval = UA_STATUSCODE_BADUNEXPECTEDERROR; + if (context) { + for(size_t i = 0; i < context->usernamePasswordLoginSize; i++) { + UA_String_deleteMembers(&context->usernamePasswordLogin[i].username); + UA_String_deleteMembers(&context->usernamePasswordLogin[i].password); + } + if(context->usernamePasswordLoginSize > 0) + UA_free(context->usernamePasswordLogin); + UA_free(ac->context); } - - UA_WriteResponse_deleteMembers(&wResp); - return retval; } UA_StatusCode -UA_Client_writeArrayDimensionsAttribute(UA_Client *client, const UA_NodeId nodeId, - size_t newArrayDimensionsSize, - const UA_UInt32 *newArrayDimensions) { - if(!newArrayDimensions) - return UA_STATUSCODE_BADTYPEMISMATCH; +UA_AccessControl_default(UA_ServerConfig *config, UA_Boolean allowAnonymous, + const UA_ByteString *userTokenPolicyUri, + size_t usernamePasswordLoginSize, + const UA_UsernamePasswordLogin *usernamePasswordLogin) { + UA_AccessControl *ac = &config->accessControl; + ac->deleteMembers = deleteMembers_default; + ac->activateSession = activateSession_default; + ac->closeSession = closeSession_default; + ac->getUserRightsMask = getUserRightsMask_default; + ac->getUserAccessLevel = getUserAccessLevel_default; + ac->getUserExecutable = getUserExecutable_default; + ac->getUserExecutableOnObject = getUserExecutableOnObject_default; + ac->allowAddNode = allowAddNode_default; + ac->allowAddReference = allowAddReference_default; + +#ifdef UA_ENABLE_HISTORIZING + ac->allowHistoryUpdateUpdateData = allowHistoryUpdateUpdateData_default; + ac->allowHistoryUpdateDeleteRawModified = allowHistoryUpdateDeleteRawModified_default; +#endif - UA_WriteValue wValue; - UA_WriteValue_init(&wValue); - wValue.nodeId = nodeId; - wValue.attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS; - UA_Variant_setArray(&wValue.value.value, (void*)(uintptr_t)newArrayDimensions, - newArrayDimensionsSize, &UA_TYPES[UA_TYPES_UINT32]); - wValue.value.hasValue = true; - UA_WriteRequest wReq; - UA_WriteRequest_init(&wReq); - wReq.nodesToWrite = &wValue; - wReq.nodesToWriteSize = 1; + ac->allowDeleteNode = allowDeleteNode_default; + ac->allowDeleteReference = allowDeleteReference_default; - UA_WriteResponse wResp = UA_Client_Service_write(client, wReq); + AccessControlContext *context = (AccessControlContext*) + UA_malloc(sizeof(AccessControlContext)); + if (!context) + return UA_STATUSCODE_BADOUTOFMEMORY; + memset(context, 0, sizeof(AccessControlContext)); + ac->context = context; - UA_StatusCode retval = wResp.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD) { - if(wResp.resultsSize == 1) - retval = wResp.results[0]; - else - retval = UA_STATUSCODE_BADUNEXPECTEDERROR; + /* Allow anonymous? */ + context->allowAnonymous = allowAnonymous; + + /* Copy username/password to the access control plugin */ + if(usernamePasswordLoginSize > 0) { + context->usernamePasswordLogin = (UA_UsernamePasswordLogin*) + UA_malloc(usernamePasswordLoginSize * sizeof(UA_UsernamePasswordLogin)); + if(!context->usernamePasswordLogin) + return UA_STATUSCODE_BADOUTOFMEMORY; + context->usernamePasswordLoginSize = usernamePasswordLoginSize; + for(size_t i = 0; i < usernamePasswordLoginSize; i++) { + UA_String_copy(&usernamePasswordLogin[i].username, &context->usernamePasswordLogin[i].username); + UA_String_copy(&usernamePasswordLogin[i].password, &context->usernamePasswordLogin[i].password); + } } - UA_WriteResponse_deleteMembers(&wResp); - return retval; -} -/*******************/ -/* Read Attributes */ -/*******************/ + /* Set the allowed policies */ + size_t policies = 0; + if(allowAnonymous) + policies++; + if(usernamePasswordLoginSize > 0) + policies++; + ac->userTokenPoliciesSize = 0; + ac->userTokenPolicies = (UA_UserTokenPolicy *) + UA_Array_new(policies, &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); + if(!ac->userTokenPolicies) + return UA_STATUSCODE_BADOUTOFMEMORY; + ac->userTokenPoliciesSize = policies; -UA_StatusCode -__UA_Client_readAttribute(UA_Client *client, const UA_NodeId *nodeId, - UA_AttributeId attributeId, void *out, - const UA_DataType *outDataType) { - UA_ReadValueId item; - UA_ReadValueId_init(&item); - item.nodeId = *nodeId; - item.attributeId = attributeId; - UA_ReadRequest request; - UA_ReadRequest_init(&request); - request.nodesToRead = &item; - request.nodesToReadSize = 1; - UA_ReadResponse response = UA_Client_Service_read(client, request); - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD) { - if(response.resultsSize == 1) - retval = response.results[0].status; - else - retval = UA_STATUSCODE_BADUNEXPECTEDERROR; - } - if(retval != UA_STATUSCODE_GOOD) { - UA_ReadResponse_deleteMembers(&response); - return retval; + policies = 0; + if(allowAnonymous) { + ac->userTokenPolicies[policies].tokenType = UA_USERTOKENTYPE_ANONYMOUS; + ac->userTokenPolicies[policies].policyId = UA_STRING_ALLOC(ANONYMOUS_POLICY); + if (!ac->userTokenPolicies[policies].policyId.data) + return UA_STATUSCODE_BADOUTOFMEMORY; + policies++; } - /* Set the StatusCode */ - UA_DataValue *res = response.results; - if(res->hasStatus) - retval = res->status; + if(usernamePasswordLoginSize > 0) { + ac->userTokenPolicies[policies].tokenType = UA_USERTOKENTYPE_USERNAME; + ac->userTokenPolicies[policies].policyId = UA_STRING_ALLOC(USERNAME_POLICY); + if(!ac->userTokenPolicies[policies].policyId.data) + return UA_STATUSCODE_BADOUTOFMEMORY; - /* Return early of no value is given */ - if(!res->hasValue) { - if(retval == UA_STATUSCODE_GOOD) - retval = UA_STATUSCODE_BADUNEXPECTEDERROR; - UA_ReadResponse_deleteMembers(&response); - return retval; +#if UA_LOGLEVEL <= 400 + const UA_String noneUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None"); + if(UA_ByteString_equal(userTokenPolicyUri, &noneUri)) { + UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_SERVER, + "Username/Password configured, but no encrypting SecurityPolicy. " + "This can leak credentials on the network."); + } +#endif + return UA_ByteString_copy(userTokenPolicyUri, + &ac->userTokenPolicies[policies].securityPolicyUri); } + return UA_STATUSCODE_GOOD; +} - /* Copy value into out */ - if(attributeId == UA_ATTRIBUTEID_VALUE) { - memcpy(out, &res->value, sizeof(UA_Variant)); - UA_Variant_init(&res->value); - } else if(attributeId == UA_ATTRIBUTEID_NODECLASS) { - memcpy(out, (UA_NodeClass*)res->value.data, sizeof(UA_NodeClass)); - } else if(UA_Variant_isScalar(&res->value) && - res->value.type == outDataType) { - memcpy(out, res->value.data, res->value.type->memSize); - UA_free(res->value.data); - res->value.data = NULL; - } else { - retval = UA_STATUSCODE_BADUNEXPECTEDERROR; - } +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/ua_pki_default.c" ***********************************/ - UA_ReadResponse_deleteMembers(&response); - return retval; -} +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2019 (c) Kalycito Infotech Private Limited + * Copyright 2019 (c) Julius Pfrommer, Fraunhofer IOSB + */ -static UA_StatusCode -processReadArrayDimensionsResult(UA_ReadResponse *response, - UA_UInt32 **outArrayDimensions, - size_t *outArrayDimensionsSize) { - UA_StatusCode retval = response->responseHeader.serviceResult; - if(retval != UA_STATUSCODE_GOOD) - return retval; - if(response->resultsSize != 1) - return UA_STATUSCODE_BADUNEXPECTEDERROR; +#ifdef UA_ENABLE_ENCRYPTION +#include +#include +#include +#endif - retval = response->results[0].status; - if(retval != UA_STATUSCODE_GOOD) - return retval; +#define REMOTECERTIFICATETRUSTED 1 +#define ISSUERKNOWN 2 +#define DUALPARENT 3 +#define PARENTFOUND 4 - UA_DataValue *res = &response->results[0]; - if(!res->hasValue || - UA_Variant_isScalar(&res->value) || - res->value.type != &UA_TYPES[UA_TYPES_UINT32]) - return UA_STATUSCODE_BADUNEXPECTEDERROR; +/************/ +/* AllowAll */ +/************/ - /* Move results */ - *outArrayDimensions = (UA_UInt32*)res->value.data; - *outArrayDimensionsSize = res->value.arrayLength; - res->value.data = NULL; - res->value.arrayLength = 0; +static UA_StatusCode +verifyCertificateAllowAll(void *verificationContext, + const UA_ByteString *certificate) { return UA_STATUSCODE_GOOD; } -UA_StatusCode -UA_Client_readArrayDimensionsAttribute(UA_Client *client, const UA_NodeId nodeId, - size_t *outArrayDimensionsSize, - UA_UInt32 **outArrayDimensions) { - UA_ReadValueId item; - UA_ReadValueId_init(&item); - item.nodeId = nodeId; - item.attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS; - UA_ReadRequest request; - UA_ReadRequest_init(&request); - request.nodesToRead = &item; - request.nodesToReadSize = 1; +static UA_StatusCode +verifyApplicationURIAllowAll(void *verificationContext, + const UA_ByteString *certificate, + const UA_String *applicationURI) { + return UA_STATUSCODE_GOOD; +} - UA_ReadResponse response = UA_Client_Service_read(client, request); - UA_StatusCode retval = processReadArrayDimensionsResult(&response, outArrayDimensions, - outArrayDimensionsSize); - UA_ReadResponse_deleteMembers(&response); - return retval; +static void +deleteVerifyAllowAll(UA_CertificateVerification *cv) { + +} + +void UA_CertificateVerification_AcceptAll(UA_CertificateVerification *cv) { + cv->verifyCertificate = verifyCertificateAllowAll; + cv->verifyApplicationURI = verifyApplicationURIAllowAll; + cv->deleteMembers = deleteVerifyAllowAll; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/client/ua_client_subscriptions.c" ***********************************/ +#ifdef UA_ENABLE_ENCRYPTION + +typedef struct { + /* If the folders are defined, we use them to reload the certificates during + * runtime */ + UA_String trustListFolder; + UA_String issuerListFolder; + UA_String revocationListFolder; -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2015-2018 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2015 (c) Oleksiy Vasylyev - * Copyright 2016 (c) Sten Grüner - * Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA - * Copyright 2016-2017 (c) Florian Palm - * Copyright 2017 (c) Frank Meerkötter - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - */ + mbedtls_x509_crt certificateTrustList; + mbedtls_x509_crt certificateIssuerList; + mbedtls_x509_crl certificateRevocationList; +} CertInfo; +#ifdef __linux__ /* Linux only so far */ -#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */ +#include +#include -/*****************/ -/* Subscriptions */ -/*****************/ +static UA_StatusCode +fileNamesFromFolder(const UA_String *folder, size_t *pathsSize, UA_String **paths) { + char buf[PATH_MAX + 1]; + if(folder->length > PATH_MAX) + return UA_STATUSCODE_BADINTERNALERROR; -UA_CreateSubscriptionResponse UA_EXPORT -UA_Client_Subscriptions_create(UA_Client *client, - const UA_CreateSubscriptionRequest request, - void *subscriptionContext, - UA_Client_StatusChangeNotificationCallback statusChangeCallback, - UA_Client_DeleteSubscriptionCallback deleteCallback) { - UA_CreateSubscriptionResponse response; - UA_CreateSubscriptionResponse_init(&response); + memcpy(buf, folder->data, folder->length); + buf[folder->length] = 0; - /* Allocate the internal representation */ - UA_Client_Subscription *newSub = (UA_Client_Subscription*) - UA_malloc(sizeof(UA_Client_Subscription)); - if(!newSub) { - response.responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; - return response; - } + DIR *dir = opendir(buf); + if(!dir) + return UA_STATUSCODE_BADINTERNALERROR; - /* Send the request as a synchronous service call */ - __UA_Client_Service(client, - &request, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST], - &response, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]); - if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_free(newSub); - return response; + *paths = (UA_String*)UA_Array_new(256, &UA_TYPES[UA_TYPES_STRING]); + if(*paths == NULL) { + closedir(dir); + return UA_STATUSCODE_BADOUTOFMEMORY; } - /* Prepare the internal representation */ - newSub->context = subscriptionContext; - newSub->subscriptionId = response.subscriptionId; - newSub->sequenceNumber = 0; - newSub->lastActivity = UA_DateTime_nowMonotonic(); - newSub->statusChangeCallback = statusChangeCallback; - newSub->deleteCallback = deleteCallback; - newSub->publishingInterval = response.revisedPublishingInterval; - newSub->maxKeepAliveCount = response.revisedMaxKeepAliveCount; - LIST_INIT(&newSub->monitoredItems); - LIST_INSERT_HEAD(&client->subscriptions, newSub, listEntry); - - return response; -} + struct dirent *ent; + char buf2[PATH_MAX + 1]; + realpath(buf, buf2); + size_t pathlen = strlen(buf2); + *pathsSize = 0; + while((ent = readdir (dir)) != NULL && *pathsSize < 256) { + if(ent->d_type != DT_REG) + continue; + buf2[pathlen] = '/'; + buf2[pathlen+1] = 0; + strcat(buf2, ent->d_name); + (*paths)[*pathsSize] = UA_STRING_ALLOC(buf2); + *pathsSize += 1; + } + closedir(dir); -static UA_Client_Subscription * -findSubscription(const UA_Client *client, UA_UInt32 subscriptionId) { - UA_Client_Subscription *sub = NULL; - LIST_FOREACH(sub, &client->subscriptions, listEntry) { - if(sub->subscriptionId == subscriptionId) - break; + if(*pathsSize == 0) { + UA_free(*paths); + *paths = NULL; } - return sub; + return UA_STATUSCODE_GOOD; } -UA_ModifySubscriptionResponse UA_EXPORT -UA_Client_Subscriptions_modify(UA_Client *client, const UA_ModifySubscriptionRequest request) { - UA_ModifySubscriptionResponse response; - UA_ModifySubscriptionResponse_init(&response); +static UA_StatusCode +reloadCertificates(CertInfo *ci) { + UA_StatusCode retval = UA_STATUSCODE_GOOD; + int err = 0; - /* Find the internal representation */ - UA_Client_Subscription *sub = findSubscription(client, request.subscriptionId); - if(!sub) { - response.responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; - return response; + /* Load the trustlists */ + if(ci->trustListFolder.length > 0) { + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Reloading the trust-list"); + mbedtls_x509_crt_free(&ci->certificateTrustList); + mbedtls_x509_crt_init(&ci->certificateTrustList); + + char f[PATH_MAX]; + memcpy(f, ci->trustListFolder.data, ci->trustListFolder.length); + f[ci->trustListFolder.length] = 0; + err = mbedtls_x509_crt_parse_path(&ci->certificateTrustList, f); + if(err == 0) { + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "Loaded certificate from %s", f); + } else { + char errBuff[300]; + mbedtls_strerror(err, errBuff, 300); + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "Failed to load certificate from %s", f); + } } - - /* Call the service */ - __UA_Client_Service(client, - &request, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST], - &response, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]); - /* Adjust the internal representation */ - sub->publishingInterval = response.revisedPublishingInterval; - sub->maxKeepAliveCount = response.revisedMaxKeepAliveCount; - return response; + /* Load the revocationlists */ + if(ci->revocationListFolder.length > 0) { + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Reloading the revocation-list"); + size_t pathsSize = 0; + UA_String *paths = NULL; + retval = fileNamesFromFolder(&ci->revocationListFolder, &pathsSize, &paths); + if(retval != UA_STATUSCODE_GOOD) + return retval; + mbedtls_x509_crl_free(&ci->certificateRevocationList); + mbedtls_x509_crl_init(&ci->certificateRevocationList); + for(size_t i = 0; i < pathsSize; i++) { + char f[PATH_MAX]; + memcpy(f, paths[i].data, paths[i].length); + f[paths[i].length] = 0; + err = mbedtls_x509_crl_parse_file(&ci->certificateRevocationList, f); + if(err == 0) { + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "Loaded certificate from %.*s", + (int)paths[i].length, paths[i].data); + } else { + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "Failed to load certificate from %.*s", + (int)paths[i].length, paths[i].data); + } + } + UA_Array_delete(paths, pathsSize, &UA_TYPES[UA_TYPES_STRING]); + paths = NULL; + pathsSize = 0; + } + + /* Load the issuerlists */ + if(ci->issuerListFolder.length > 0) { + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Reloading the issuer-list"); + mbedtls_x509_crt_free(&ci->certificateIssuerList); + mbedtls_x509_crt_init(&ci->certificateIssuerList); + char f[PATH_MAX]; + memcpy(f, ci->issuerListFolder.data, ci->issuerListFolder.length); + f[ci->issuerListFolder.length] = 0; + err = mbedtls_x509_crt_parse_path(&ci->certificateIssuerList, f); + if(err == 0) { + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "Loaded certificate from %s", f); + } else { + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "Failed to load certificate from %s", f); + } + } + + return retval; } -static void -UA_Client_Subscription_deleteInternal(UA_Client *client, UA_Client_Subscription *sub) { - /* Remove the MonitoredItems */ - UA_Client_MonitoredItem *mon, *mon_tmp; - LIST_FOREACH_SAFE(mon, &sub->monitoredItems, listEntry, mon_tmp) - UA_Client_MonitoredItem_remove(client, sub, mon); +#endif - /* Call the delete callback */ - if(sub->deleteCallback) - sub->deleteCallback(client, sub->subscriptionId, sub->context); +static UA_StatusCode +certificateVerification_verify(void *verificationContext, + const UA_ByteString *certificate) { + CertInfo *ci = (CertInfo*)verificationContext; + if(!ci) + return UA_STATUSCODE_BADINTERNALERROR; - /* Remove */ - LIST_REMOVE(sub, listEntry); - UA_free(sub); -} +#ifdef __linux__ /* Reload certificates if folder paths are specified */ + reloadCertificates(ci); +#endif -UA_DeleteSubscriptionsResponse UA_EXPORT -UA_Client_Subscriptions_delete(UA_Client *client, const UA_DeleteSubscriptionsRequest request) { - UA_STACKARRAY(UA_Client_Subscription*, subs, request.subscriptionIdsSize); - memset(subs, 0, sizeof(void*) * request.subscriptionIdsSize); + /* if(ci->certificateTrustList.raw.len == 0) { */ + /* UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, */ + /* "No Trustlist loaded. Accepting the certificate."); */ + /* return UA_STATUSCODE_GOOD; */ + /* } */ - /* temporary remove the subscriptions from the list */ - for(size_t i = 0; i < request.subscriptionIdsSize; i++) { - subs[i] = findSubscription(client, request.subscriptionIds[i]); - if (subs[i]) - LIST_REMOVE(subs[i], listEntry); - } + /* Parse the certificate */ + mbedtls_x509_crt remoteCertificate; - /* Send the request */ - UA_DeleteSubscriptionsResponse response; - __UA_Client_Service(client, - &request, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST], - &response, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]); - if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) - goto cleanup; + /* Temporary Object to parse the trustList */ + mbedtls_x509_crt *tempCert; - if(request.subscriptionIdsSize != response.resultsSize) { - response.responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; - goto cleanup; - } + /* Temporary Object to parse the revocationList */ + mbedtls_x509_crl *tempCrl; - /* Loop over the removed subscriptions and remove internally */ - for(size_t i = 0; i < request.subscriptionIdsSize; i++) { - if(response.results[i] != UA_STATUSCODE_GOOD && response.results[i] != UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID) { - /* Something was wrong, reinsert the subscription in the list */ - if (subs[i]) - LIST_INSERT_HEAD(&client->subscriptions, subs[i], listEntry); - continue; - } + /* Temporary Object to identify the parent CA when there is no intermediate CA */ + mbedtls_x509_crt *parentCert; - if(!subs[i]) { - UA_LOG_INFO(client->config.logger, UA_LOGCATEGORY_CLIENT, - "No internal representation of subscription %u", - request.subscriptionIds[i]); - continue; - } else { - LIST_INSERT_HEAD(&client->subscriptions, subs[i], listEntry); - } + /* Temporary Object to identify the parent CA when there is intermediate CA */ + mbedtls_x509_crt *parentCert_2; - UA_Client_Subscription_deleteInternal(client, subs[i]); + /* Flag value to identify if the issuer certificate is found */ + int issuerKnown = 0; + + /* Flag value to identify if the parent certificate found */ + int parentFound = 0; + + mbedtls_x509_crt_init(&remoteCertificate); + int mbedErr = mbedtls_x509_crt_parse(&remoteCertificate, certificate->data, + certificate->length); + if(mbedErr) { + /* char errBuff[300]; */ + /* mbedtls_strerror(mbedErr, errBuff, 300); */ + /* UA_LOG_WARNING(data->policyContext->securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, */ + /* "Could not parse the remote certificate with error: %s", errBuff); */ + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; } - return response; + /* Verify */ + mbedtls_x509_crt_profile crtProfile = { + MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA1) | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256), + 0xFFFFFF, 0x000000, 128 * 8 // in bits + }; // TODO: remove magic numbers -cleanup: - for(size_t i = 0; i < request.subscriptionIdsSize; i++) { - if (subs[i]) { - LIST_INSERT_HEAD(&client->subscriptions, subs[i], listEntry); + uint32_t flags = 0; + mbedErr = mbedtls_x509_crt_verify_with_profile(&remoteCertificate, + &ci->certificateTrustList, + &ci->certificateRevocationList, + &crtProfile, NULL, &flags, NULL, NULL); + + /* Flag to check if the remote certificate is trusted or not */ + int TRUSTED = 0; + + /* Check if the remoteCertificate is present in the trustList while mbedErr value is not zero */ + if(mbedErr && !(flags & MBEDTLS_X509_BADCERT_EXPIRED) && !(flags & MBEDTLS_X509_BADCERT_FUTURE)) { + for(tempCert = &ci->certificateTrustList; tempCert != NULL; tempCert = tempCert->next) { + if(remoteCertificate.raw.len == tempCert->raw.len && + memcmp(remoteCertificate.raw.p, tempCert->raw.p, remoteCertificate.raw.len) == 0) { + TRUSTED = REMOTECERTIFICATETRUSTED; + break; + } } } - return response; -} -UA_StatusCode UA_EXPORT -UA_Client_Subscriptions_deleteSingle(UA_Client *client, UA_UInt32 subscriptionId) { - UA_DeleteSubscriptionsRequest request; - UA_DeleteSubscriptionsRequest_init(&request); - request.subscriptionIds = &subscriptionId; - request.subscriptionIdsSize = 1; - - UA_DeleteSubscriptionsResponse response = - UA_Client_Subscriptions_delete(client, request); + /* If the remote certificate is present in the trustList then check if the issuer certificate + * of remoteCertificate is present in issuerList */ + if(TRUSTED && mbedErr) { + mbedErr = mbedtls_x509_crt_verify_with_profile(&remoteCertificate, + &ci->certificateIssuerList, + &ci->certificateRevocationList, + &crtProfile, NULL, &flags, NULL, NULL); + + /* Check if the parent certificate has a CRL file available */ + if(!mbedErr) { + /* Flag value to identify if that there is an intermediate CA present */ + int dualParent = 0; + + /* Identify the topmost parent certificate for the remoteCertificate */ + for( parentCert = &ci->certificateIssuerList; parentCert != NULL; parentCert = parentCert->next ) { + if(memcmp(remoteCertificate.issuer_raw.p, parentCert->subject_raw.p, parentCert->subject_raw.len) == 0) { + for(parentCert_2 = &ci->certificateTrustList; parentCert_2 != NULL; parentCert_2 = parentCert_2->next) { + if(memcmp(parentCert->issuer_raw.p, parentCert_2->subject_raw.p, parentCert_2->subject_raw.len) == 0) { + dualParent = DUALPARENT; + parentFound = PARENTFOUND; + break; + } - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval != UA_STATUSCODE_GOOD) { - UA_DeleteSubscriptionsResponse_deleteMembers(&response); - return retval; - } + } - if(response.resultsSize != 1) { - UA_DeleteSubscriptionsResponse_deleteMembers(&response); - return UA_STATUSCODE_BADINTERNALERROR; - } + parentFound = PARENTFOUND; + } - retval = response.results[0]; - UA_DeleteSubscriptionsResponse_deleteMembers(&response); - return retval; -} + if(parentFound == PARENTFOUND) { + break; + } -/******************/ -/* MonitoredItems */ -/******************/ + } -void -UA_Client_MonitoredItem_remove(UA_Client *client, UA_Client_Subscription *sub, - UA_Client_MonitoredItem *mon) { - LIST_REMOVE(mon, listEntry); - if(mon->deleteCallback) - mon->deleteCallback(client, sub->subscriptionId, sub->context, - mon->monitoredItemId, mon->context); - UA_free(mon); -} + /* Check if there is an intermediate certificate between the topmost parent + * certificate and child certificate + * If yes the topmost parent certificate is to be checked whether it has a + * CRL file avaiable */ + if(dualParent == DUALPARENT && parentFound == PARENTFOUND) { + parentCert = parentCert_2; + } -static void -__UA_Client_MonitoredItems_create(UA_Client *client, - const UA_CreateMonitoredItemsRequest *request, - void **contexts, void **handlingCallbacks, - UA_Client_DeleteMonitoredItemCallback *deleteCallbacks, - UA_CreateMonitoredItemsResponse *response) { - UA_CreateMonitoredItemsResponse_init(response); + /* If a parent certificate is found traverse the revocationList and identify + * if there is any CRL file that corresponds to the parentCertificate */ + if(parentFound == PARENTFOUND) { + tempCrl = &ci->certificateRevocationList; + while(tempCrl != NULL) { + if(tempCrl->version != 0 && + tempCrl->issuer_raw.len == parentCert->subject_raw.len && + memcmp(tempCrl->issuer_raw.p, + parentCert->subject_raw.p, + tempCrl->issuer_raw.len) == 0) { + issuerKnown = ISSUERKNOWN; + break; + } - if (!request->itemsToCreateSize) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; - return; - } + tempCrl = tempCrl->next; + } + + /* If the CRL file corresponding to the parent certificate is not present + * then return UA_STATUSCODE_BADCERTIFICATEISSUERREVOCATIONUNKNOWN */ + if(!issuerKnown) { + return UA_STATUSCODE_BADCERTIFICATEISSUERREVOCATIONUNKNOWN; + } + + } - /* Fix clang warning */ - size_t itemsToCreateSize = request->itemsToCreateSize; - UA_Client_Subscription *sub = NULL; - - /* Allocate the memory for internal representations */ - UA_STACKARRAY(UA_Client_MonitoredItem*, mis, itemsToCreateSize); - memset(mis, 0, sizeof(void*) * itemsToCreateSize); - for(size_t i = 0; i < itemsToCreateSize; i++) { - mis[i] = (UA_Client_MonitoredItem*)UA_malloc(sizeof(UA_Client_MonitoredItem)); - if(!mis[i]) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY; - goto cleanup; } - } - /* Get the subscription */ - sub = findSubscription(client, request->subscriptionId); - if(!sub) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; - goto cleanup; } + else if(!mbedErr && !TRUSTED) { + /* This else if section is to identify if the parent certificate which is present in trustList + * has CRL file corresponding to it */ - /* Set the clientHandle */ - for(size_t i = 0; i < itemsToCreateSize; i++) - request->itemsToCreate[i].requestedParameters.clientHandle = ++(client->monitoredItemHandles); + /* Identify the parent certificate of the remoteCertificate */ + for(parentCert = &ci->certificateTrustList; parentCert != NULL; parentCert = parentCert->next) { + if(memcmp(remoteCertificate.issuer_raw.p, parentCert->subject_raw.p, parentCert->subject_raw.len) == 0) { + parentFound = PARENTFOUND; + break; + } - /* Call the service */ - __UA_Client_Service(client, request, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST], - response, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]); - if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) - goto cleanup; + } - if(response->resultsSize != itemsToCreateSize) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; - goto cleanup; - } + /* If the parent certificate is found traverse the revocationList and identify + * if there is any CRL file that corresponds to the parentCertificate */ + if(parentFound == PARENTFOUND && + memcmp(remoteCertificate.issuer_raw.p, remoteCertificate.subject_raw.p, remoteCertificate.subject_raw.len) != 0) { + tempCrl = &ci->certificateRevocationList; + while(tempCrl != NULL) { + if(tempCrl->version != 0 && + tempCrl->issuer_raw.len == parentCert->subject_raw.len && + memcmp(tempCrl->issuer_raw.p, + parentCert->subject_raw.p, + tempCrl->issuer_raw.len) == 0) { + issuerKnown = ISSUERKNOWN; + break; + } + + tempCrl = tempCrl->next; + } + + /* If the CRL file corresponding to the parent certificate is not present + * then return UA_STATUSCODE_BADCERTIFICATEREVOCATIONUNKNOWN */ + if(!issuerKnown) { + return UA_STATUSCODE_BADCERTIFICATEREVOCATIONUNKNOWN; + } - /* Add internally */ - for(size_t i = 0; i < itemsToCreateSize; i++) { - if(response->results[i].statusCode != UA_STATUSCODE_GOOD) { - if (deleteCallbacks[i]) - deleteCallbacks[i](client, sub->subscriptionId, sub->context, 0, contexts[i]); - UA_free(mis[i]); - mis[i] = NULL; - continue; } - - UA_Client_MonitoredItem *newMon = mis[i]; - newMon->clientHandle = request->itemsToCreate[i].requestedParameters.clientHandle; - newMon->monitoredItemId = response->results[i].monitoredItemId; - newMon->context = contexts[i]; - newMon->deleteCallback = deleteCallbacks[i]; - newMon->handler.dataChangeCallback = - (UA_Client_DataChangeNotificationCallback)(uintptr_t)handlingCallbacks[i]; - newMon->isEventMonitoredItem = - (request->itemsToCreate[i].itemToMonitor.attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER); - LIST_INSERT_HEAD(&sub->monitoredItems, newMon, listEntry); + } - return; + // TODO: Extend verification - cleanup: - for(size_t i = 0; i < itemsToCreateSize; i++) { - if (deleteCallbacks[i]) { - if (sub) - deleteCallbacks[i](client, sub->subscriptionId, sub->context, 0, contexts[i]); - else - deleteCallbacks[i](client, 0, NULL, 0, contexts[i]); + /* This condition will check whether the certificate is a User certificate + * or a CA certificate. If the MBEDTLS_X509_KU_KEY_CERT_SIGN and + * MBEDTLS_X509_KU_CRL_SIGN of key_usage are set, then the certificate + * shall be condidered as CA Certificate and cannot be used to establish a + * connection. Refer the test case CTT/Security/Security Certificate Validation/029.js + * for more details */ + if((remoteCertificate.key_usage & MBEDTLS_X509_KU_KEY_CERT_SIGN) && + (remoteCertificate.key_usage & MBEDTLS_X509_KU_CRL_SIGN)) { + return UA_STATUSCODE_BADCERTIFICATEUSENOTALLOWED; + } + + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(mbedErr) { + /* char buff[100]; */ + /* mbedtls_x509_crt_verify_info(buff, 100, "", flags); */ + /* UA_LOG_ERROR(channelContextData->policyContext->securityPolicy->logger, */ + /* UA_LOGCATEGORY_SECURITYPOLICY, */ + /* "Verifying the certificate failed with error: %s", buff); */ + + if(flags & (uint32_t)MBEDTLS_X509_BADCERT_NOT_TRUSTED) { + retval = UA_STATUSCODE_BADCERTIFICATEUNTRUSTED; + } else if(flags & (uint32_t)MBEDTLS_X509_BADCERT_FUTURE || + flags & (uint32_t)MBEDTLS_X509_BADCERT_EXPIRED) { + retval = UA_STATUSCODE_BADCERTIFICATETIMEINVALID; + } else if(flags & (uint32_t)MBEDTLS_X509_BADCERT_REVOKED || + flags & (uint32_t)MBEDTLS_X509_BADCRL_EXPIRED) { + retval = UA_STATUSCODE_BADCERTIFICATEREVOKED; + } else { + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; } - if(mis[i]) - UA_free(mis[i]); } -} -UA_CreateMonitoredItemsResponse UA_EXPORT -UA_Client_MonitoredItems_createDataChanges(UA_Client *client, - const UA_CreateMonitoredItemsRequest request, void **contexts, - UA_Client_DataChangeNotificationCallback *callbacks, - UA_Client_DeleteMonitoredItemCallback *deleteCallbacks) { - UA_CreateMonitoredItemsResponse response; - __UA_Client_MonitoredItems_create(client, &request, contexts, - (void**)(uintptr_t)callbacks, deleteCallbacks, &response); - return response; + mbedtls_x509_crt_free(&remoteCertificate); + return retval; } -UA_MonitoredItemCreateResult UA_EXPORT -UA_Client_MonitoredItems_createDataChange(UA_Client *client, UA_UInt32 subscriptionId, - UA_TimestampsToReturn timestampsToReturn, const UA_MonitoredItemCreateRequest item, - void *context, UA_Client_DataChangeNotificationCallback callback, - UA_Client_DeleteMonitoredItemCallback deleteCallback) { - UA_CreateMonitoredItemsRequest request; - UA_CreateMonitoredItemsRequest_init(&request); - request.subscriptionId = subscriptionId; - request.timestampsToReturn = timestampsToReturn; - request.itemsToCreate = (UA_MonitoredItemCreateRequest*)(uintptr_t)&item; - request.itemsToCreateSize = 1; - UA_CreateMonitoredItemsResponse response = - UA_Client_MonitoredItems_createDataChanges(client, request, &context, - &callback, &deleteCallback); - UA_MonitoredItemCreateResult result; - UA_MonitoredItemCreateResult_init(&result); - if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) - result.statusCode = response.responseHeader.serviceResult; +/* Find binary substring. Taken and adjusted from + * http://tungchingkai.blogspot.com/2011/07/binary-strstr.html */ - if(result.statusCode == UA_STATUSCODE_GOOD && - response.resultsSize != 1) - result.statusCode = UA_STATUSCODE_BADINTERNALERROR; - - if(result.statusCode == UA_STATUSCODE_GOOD) - UA_MonitoredItemCreateResult_copy(&response.results[0] , &result); - UA_CreateMonitoredItemsResponse_deleteMembers(&response); - return result; -} +static const unsigned char * +bstrchr(const unsigned char *s, const unsigned char ch, size_t l) { + /* find first occurrence of c in char s[] for length l*/ + /* handle special case */ + if(l == 0) + return (NULL); -UA_CreateMonitoredItemsResponse UA_EXPORT -UA_Client_MonitoredItems_createEvents(UA_Client *client, - const UA_CreateMonitoredItemsRequest request, void **contexts, - UA_Client_EventNotificationCallback *callbacks, - UA_Client_DeleteMonitoredItemCallback *deleteCallbacks) { - UA_CreateMonitoredItemsResponse response; - __UA_Client_MonitoredItems_create(client, &request, contexts, - (void**)(uintptr_t)callbacks, deleteCallbacks, &response); - return response; + for(; *s != ch; ++s, --l) + if(l == 0) + return (NULL); + return s; } -UA_MonitoredItemCreateResult UA_EXPORT -UA_Client_MonitoredItems_createEvent(UA_Client *client, UA_UInt32 subscriptionId, - UA_TimestampsToReturn timestampsToReturn, const UA_MonitoredItemCreateRequest item, - void *context, UA_Client_EventNotificationCallback callback, - UA_Client_DeleteMonitoredItemCallback deleteCallback) { - UA_CreateMonitoredItemsRequest request; - UA_CreateMonitoredItemsRequest_init(&request); - request.subscriptionId = subscriptionId; - request.timestampsToReturn = timestampsToReturn; - request.itemsToCreate = (UA_MonitoredItemCreateRequest*)(uintptr_t)&item; - request.itemsToCreateSize = 1; - UA_CreateMonitoredItemsResponse response = - UA_Client_MonitoredItems_createEvents(client, request, &context, - &callback, &deleteCallback); - UA_MonitoredItemCreateResult result; - UA_MonitoredItemCreateResult_copy(response.results , &result); - UA_CreateMonitoredItemsResponse_deleteMembers(&response); - return result; -} +static const unsigned char * +bstrstr(const unsigned char *s1, size_t l1, const unsigned char *s2, size_t l2) { + /* find first occurrence of s2[] in s1[] for length l1*/ + const unsigned char *ss1 = s1; + const unsigned char *ss2 = s2; + /* handle special case */ + if(l1 == 0) + return (NULL); + if(l2 == 0) + return s1; -UA_DeleteMonitoredItemsResponse UA_EXPORT -UA_Client_MonitoredItems_delete(UA_Client *client, const UA_DeleteMonitoredItemsRequest request) { - /* Send the request */ - UA_DeleteMonitoredItemsResponse response; - __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST], - &response, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]); - if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD) - return response; + /* match prefix */ + for (; (s1 = bstrchr(s1, *s2, (uintptr_t)ss1-(uintptr_t)s1+(uintptr_t)l1)) != NULL && + (uintptr_t)ss1-(uintptr_t)s1+(uintptr_t)l1 != 0; ++s1) { - UA_Client_Subscription *sub = findSubscription(client, request.subscriptionId); - if(!sub) { - UA_LOG_INFO(client->config.logger, UA_LOGCATEGORY_CLIENT, - "No internal representation of subscription %u", - request.subscriptionId); - return response; + /* match rest of prefix */ + const unsigned char *sc1, *sc2; + for (sc1 = s1, sc2 = s2; ;) + if (++sc2 >= ss2+l2) + return s1; + else if (*++sc1 != *sc2) + break; } + return NULL; +} - /* Loop over deleted MonitoredItems */ - for(size_t i = 0; i < response.resultsSize; i++) { - if(response.results[i] != UA_STATUSCODE_GOOD && - response.results[i] != UA_STATUSCODE_BADMONITOREDITEMIDINVALID) { - continue; - } +static UA_StatusCode +certificateVerification_verifyApplicationURI(void *verificationContext, + const UA_ByteString *certificate, + const UA_String *applicationURI) { + CertInfo *ci = (CertInfo*)verificationContext; + if(!ci) + return UA_STATUSCODE_BADINTERNALERROR; -#ifndef __clang_analyzer__ - /* Delete the internal representation */ - UA_Client_MonitoredItem *mon; - LIST_FOREACH(mon, &sub->monitoredItems, listEntry) { - if(mon->monitoredItemId == request.monitoredItemIds[i]) { - UA_Client_MonitoredItem_remove(client, sub, mon); - break; - } - } -#endif - } + /* Parse the certificate */ + mbedtls_x509_crt remoteCertificate; + mbedtls_x509_crt_init(&remoteCertificate); + int mbedErr = mbedtls_x509_crt_parse(&remoteCertificate, certificate->data, + certificate->length); + if(mbedErr) + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; - return response; + /* Poor man's ApplicationUri verification. mbedTLS does not parse all fields + * of the Alternative Subject Name. Instead test whether the URI-string is + * present in the v3_ext field in general. + * + * TODO: Improve parsing of the Alternative Subject Name */ + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(bstrstr(remoteCertificate.v3_ext.p, remoteCertificate.v3_ext.len, + applicationURI->data, applicationURI->length) == NULL) + retval = UA_STATUSCODE_BADCERTIFICATEURIINVALID; + + mbedtls_x509_crt_free(&remoteCertificate); + return retval; } -UA_StatusCode UA_EXPORT -UA_Client_MonitoredItems_deleteSingle(UA_Client *client, UA_UInt32 subscriptionId, UA_UInt32 monitoredItemId) { - UA_DeleteMonitoredItemsRequest request; - UA_DeleteMonitoredItemsRequest_init(&request); - request.subscriptionId = subscriptionId; - request.monitoredItemIds = &monitoredItemId; - request.monitoredItemIdsSize = 1; +static void +certificateVerification_deleteMembers(UA_CertificateVerification *cv) { + CertInfo *ci = (CertInfo*)cv->context; + if(!ci) + return; + mbedtls_x509_crt_free(&ci->certificateTrustList); + mbedtls_x509_crl_free(&ci->certificateRevocationList); + mbedtls_x509_crt_free(&ci->certificateIssuerList); + UA_String_clear(&ci->trustListFolder); + UA_String_clear(&ci->issuerListFolder); + UA_String_clear(&ci->revocationListFolder); + UA_free(ci); + cv->context = NULL; +} - UA_DeleteMonitoredItemsResponse response = - UA_Client_MonitoredItems_delete(client, request); +UA_StatusCode +UA_CertificateVerification_Trustlist(UA_CertificateVerification *cv, + const UA_ByteString *certificateTrustList, + size_t certificateTrustListSize, + const UA_ByteString *certificateIssuerList, + size_t certificateIssuerListSize, + const UA_ByteString *certificateRevocationList, + size_t certificateRevocationListSize) { + CertInfo *ci = (CertInfo*)UA_malloc(sizeof(CertInfo)); + if(!ci) + return UA_STATUSCODE_BADOUTOFMEMORY; + memset(ci, 0, sizeof(CertInfo)); + mbedtls_x509_crt_init(&ci->certificateTrustList); + mbedtls_x509_crl_init(&ci->certificateRevocationList); + mbedtls_x509_crt_init(&ci->certificateIssuerList); - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval != UA_STATUSCODE_GOOD) { - UA_DeleteMonitoredItemsResponse_deleteMembers(&response); - return retval; - } + cv->context = (void*)ci; + if(certificateTrustListSize > 0) + cv->verifyCertificate = certificateVerification_verify; + else + cv->verifyCertificate = verifyCertificateAllowAll; + cv->deleteMembers = certificateVerification_deleteMembers; + cv->verifyApplicationURI = certificateVerification_verifyApplicationURI; - if(response.resultsSize != 1) { - UA_DeleteMonitoredItemsResponse_deleteMembers(&response); - return UA_STATUSCODE_BADINTERNALERROR; + int err = 0; + for(size_t i = 0; i < certificateTrustListSize; i++) { + err = mbedtls_x509_crt_parse(&ci->certificateTrustList, + certificateTrustList[i].data, + certificateTrustList[i].length); + if(err) + goto error; + } + for(size_t i = 0; i < certificateIssuerListSize; i++) { + err = mbedtls_x509_crt_parse(&ci->certificateIssuerList, + certificateIssuerList[i].data, + certificateIssuerList[i].length); + if(err) + goto error; + } + for(size_t i = 0; i < certificateRevocationListSize; i++) { + err = mbedtls_x509_crl_parse(&ci->certificateRevocationList, + certificateRevocationList[i].data, + certificateRevocationList[i].length); + if(err) + goto error; } - retval = response.results[0]; - UA_DeleteMonitoredItemsResponse_deleteMembers(&response); - return retval; + return UA_STATUSCODE_GOOD; +error: + certificateVerification_deleteMembers(cv); + return UA_STATUSCODE_BADINTERNALERROR; } -/*************************************/ -/* Async Processing of Notifications */ -/*************************************/ +#ifdef __linux__ /* Linux only so far */ -/* Assume the request is already initialized */ UA_StatusCode -UA_Client_preparePublishRequest(UA_Client *client, UA_PublishRequest *request) { - /* Count acks */ - UA_Client_NotificationsAckNumber *ack; - LIST_FOREACH(ack, &client->pendingNotificationsAcks, listEntry) - ++request->subscriptionAcknowledgementsSize; - - /* Create the array. Returns a sentinel pointer if the length is zero. */ - request->subscriptionAcknowledgements = (UA_SubscriptionAcknowledgement*) - UA_Array_new(request->subscriptionAcknowledgementsSize, - &UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT]); - if(!request->subscriptionAcknowledgements) { - request->subscriptionAcknowledgementsSize = 0; +UA_CertificateVerification_CertFolders(UA_CertificateVerification *cv, + const char *trustListFolder, + const char *issuerListFolder, + const char *revocationListFolder) { + CertInfo *ci = (CertInfo*)UA_malloc(sizeof(CertInfo)); + if(!ci) return UA_STATUSCODE_BADOUTOFMEMORY; - } + memset(ci, 0, sizeof(CertInfo)); + mbedtls_x509_crt_init(&ci->certificateTrustList); + mbedtls_x509_crl_init(&ci->certificateRevocationList); + mbedtls_x509_crt_init(&ci->certificateIssuerList); + + /* Only set the folder paths. They will be reloaded during runtime. + * TODO: Add a more efficient reloading of only the changes */ + ci->trustListFolder = UA_STRING_ALLOC(trustListFolder); + ci->issuerListFolder = UA_STRING_ALLOC(issuerListFolder); + ci->revocationListFolder = UA_STRING_ALLOC(revocationListFolder); + + reloadCertificates(ci); + + cv->context = (void*)ci; + cv->verifyCertificate = certificateVerification_verify; + cv->deleteMembers = certificateVerification_deleteMembers; + cv->verifyApplicationURI = certificateVerification_verifyApplicationURI; - size_t i = 0; - UA_Client_NotificationsAckNumber *ack_tmp; - LIST_FOREACH_SAFE(ack, &client->pendingNotificationsAcks, listEntry, ack_tmp) { - request->subscriptionAcknowledgements[i].sequenceNumber = ack->subAck.sequenceNumber; - request->subscriptionAcknowledgements[i].subscriptionId = ack->subAck.subscriptionId; - ++i; - LIST_REMOVE(ack, listEntry); - UA_free(ack); - } return UA_STATUSCODE_GOOD; } -/* According to OPC Unified Architecture, Part 4 5.13.1.1 i) */ -/* The value 0 is never used for the sequence number */ -static UA_UInt32 -UA_Client_Subscriptions_nextSequenceNumber(UA_UInt32 sequenceNumber) { - UA_UInt32 nextSequenceNumber = sequenceNumber + 1; - if(nextSequenceNumber == 0) - nextSequenceNumber = 1; - return nextSequenceNumber; -} +#endif -static void -processDataChangeNotification(UA_Client *client, UA_Client_Subscription *sub, - UA_DataChangeNotification *dataChangeNotification) { - for(size_t j = 0; j < dataChangeNotification->monitoredItemsSize; ++j) { - UA_MonitoredItemNotification *min = &dataChangeNotification->monitoredItems[j]; +#endif - /* Find the MonitoredItem */ - UA_Client_MonitoredItem *mon; - LIST_FOREACH(mon, &sub->monitoredItems, listEntry) { - if(mon->clientHandle == min->clientHandle) - break; - } +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/ua_nodestore_default.c" ***********************************/ - if(!mon) { - UA_LOG_DEBUG(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Could not process a notification with clienthandle %u on subscription %u", - min->clientHandle, sub->subscriptionId); - continue; - } +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Julian Grothoff + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + */ - if(mon->isEventMonitoredItem) { - UA_LOG_DEBUG(client->config.logger, UA_LOGCATEGORY_CLIENT, - "MonitoredItem is configured for Events. But received a " - "DataChangeNotification."); - continue; - } - mon->handler.dataChangeCallback(client, sub->subscriptionId, sub->context, - mon->monitoredItemId, mon->context, - &min->value); - } -} +#ifndef UA_ENABLE_CUSTOM_NODESTORE -static void -processEventNotification(UA_Client *client, UA_Client_Subscription *sub, - UA_EventNotificationList *eventNotificationList) { - for(size_t j = 0; j < eventNotificationList->eventsSize; ++j) { - UA_EventFieldList *eventFieldList = &eventNotificationList->events[j]; +#ifdef UA_ENABLE_MULTITHREADING +#include +#define BEGIN_CRITSECT(NODEMAP) pthread_mutex_lock(&(NODEMAP)->mutex) +#define END_CRITSECT(NODEMAP) pthread_mutex_unlock(&(NODEMAP)->mutex) +#else +#define BEGIN_CRITSECT(NODEMAP) do {} while(0) +#define END_CRITSECT(NODEMAP) do {} while(0) +#endif - /* Find the MonitoredItem */ - UA_Client_MonitoredItem *mon; - LIST_FOREACH(mon, &sub->monitoredItems, listEntry) { - if(mon->monitoredItemId == eventFieldList->clientHandle) - break; - } +/* container_of */ +#define container_of(ptr, type, member) \ + (type *)((uintptr_t)ptr - offsetof(type,member)) - if(!mon) { - UA_LOG_DEBUG(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Could not process a notification with clienthandle %u on subscription %u", - eventFieldList->clientHandle, sub->subscriptionId); - continue; - } +struct NodeEntry; +typedef struct NodeEntry NodeEntry; - if(!mon->isEventMonitoredItem) { - UA_LOG_DEBUG(client->config.logger, UA_LOGCATEGORY_CLIENT, - "MonitoredItem is configured for DataChanges. But received a " - "EventNotification."); - continue; - } +struct NodeEntry { + ZIP_ENTRY(NodeEntry) zipfields; + UA_UInt32 nodeIdHash; + UA_UInt16 refCount; /* How many consumers have a reference to the node? */ + UA_Boolean deleted; /* Node was marked as deleted and can be deleted when refCount == 0 */ + NodeEntry *orig; /* If a copy is made to replace a node, track that we + * replace only the node from which the copy was made. + * Important for concurrent operations. */ + UA_NodeId nodeId; /* This is actually a UA_Node that also starts with a NodeId */ +}; - mon->handler.eventCallback(client, sub->subscriptionId, sub->context, - mon->monitoredItemId, mon->context, - eventFieldList->eventFieldsSize, - eventFieldList->eventFields); - } +/* Absolute ordering for NodeIds */ +static enum ZIP_CMP +cmpNodeId(const void *a, const void *b) { + const NodeEntry *aa = (const NodeEntry*)a; + const NodeEntry *bb = (const NodeEntry*)b; + + /* Compare hash */ + if(aa->nodeIdHash < bb->nodeIdHash) + return ZIP_CMP_LESS; + if(aa->nodeIdHash > bb->nodeIdHash) + return ZIP_CMP_MORE; + + /* Compore nodes in detail */ + return (enum ZIP_CMP)UA_NodeId_order(&aa->nodeId, &bb->nodeId); } -static void -processNotificationMessage(UA_Client *client, UA_Client_Subscription *sub, - UA_ExtensionObject *msg) { - if(msg->encoding != UA_EXTENSIONOBJECT_DECODED) - return; +ZIP_HEAD(NodeTree, NodeEntry); +typedef struct NodeTree NodeTree; - /* Handle DataChangeNotification */ - if(msg->content.decoded.type == &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]) { - UA_DataChangeNotification *dataChangeNotification = - (UA_DataChangeNotification *)msg->content.decoded.data; - processDataChangeNotification(client, sub, dataChangeNotification); - return; - } +typedef struct { + NodeTree root; +#ifdef UA_ENABLE_MULTITHREADING + pthread_mutex_t mutex; /* Protect access */ +#endif +} NodeMap; - /* Handle EventNotification */ - if(msg->content.decoded.type == &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]) { - UA_EventNotificationList *eventNotificationList = - (UA_EventNotificationList *)msg->content.decoded.data; - processEventNotification(client, sub, eventNotificationList); - return; - } +ZIP_PROTTYPE(NodeTree, NodeEntry, NodeEntry) +ZIP_IMPL(NodeTree, NodeEntry, zipfields, NodeEntry, zipfields, cmpNodeId) - /* Handle StatusChangeNotification */ - if(msg->content.decoded.type == &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]) { - if(sub->statusChangeCallback) { - sub->statusChangeCallback(client, sub->subscriptionId, sub->context, - (UA_StatusChangeNotification*)msg->content.decoded.data); - } else { - UA_LOG_WARNING(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Dropped a StatusChangeNotification since no callback is registered"); - } - return; +static NodeEntry * +newEntry(UA_NodeClass nodeClass) { + size_t size = sizeof(NodeEntry) - sizeof(UA_NodeId); + switch(nodeClass) { + case UA_NODECLASS_OBJECT: + size += sizeof(UA_ObjectNode); + break; + case UA_NODECLASS_VARIABLE: + size += sizeof(UA_VariableNode); + break; + case UA_NODECLASS_METHOD: + size += sizeof(UA_MethodNode); + break; + case UA_NODECLASS_OBJECTTYPE: + size += sizeof(UA_ObjectTypeNode); + break; + case UA_NODECLASS_VARIABLETYPE: + size += sizeof(UA_VariableTypeNode); + break; + case UA_NODECLASS_REFERENCETYPE: + size += sizeof(UA_ReferenceTypeNode); + break; + case UA_NODECLASS_DATATYPE: + size += sizeof(UA_DataTypeNode); + break; + case UA_NODECLASS_VIEW: + size += sizeof(UA_ViewNode); + break; + default: + return NULL; } + NodeEntry *entry = (NodeEntry*)UA_calloc(1, size); + if(!entry) + return NULL; + UA_Node *node = (UA_Node*)&entry->nodeId; + node->nodeClass = nodeClass; + return entry; +} - UA_LOG_WARNING(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Unknown notification message type"); +static void +deleteEntry(NodeEntry *entry) { + UA_Node_deleteMembers((UA_Node*)&entry->nodeId); + UA_free(entry); } -void -UA_Client_Subscriptions_processPublishResponse(UA_Client *client, UA_PublishRequest *request, - UA_PublishResponse *response) { - UA_NotificationMessage *msg = &response->notificationMessage; +static void +cleanupEntry(NodeEntry *entry) { + if(entry->deleted && entry->refCount == 0) + deleteEntry(entry); +} - client->currentlyOutStandingPublishRequests--; +/***********************/ +/* Interface functions */ +/***********************/ - if(response->responseHeader.serviceResult == UA_STATUSCODE_BADTOOMANYPUBLISHREQUESTS) { - if(client->config.outStandingPublishRequests > 1) { - client->config.outStandingPublishRequests--; - UA_LOG_WARNING(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Too many publishrequest, reduce outStandingPublishRequests to %d", - client->config.outStandingPublishRequests); - } else { - UA_LOG_ERROR(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Too many publishrequest when outStandingPublishRequests = 1"); - UA_Client_Subscriptions_deleteSingle(client, response->subscriptionId); - } - return; - } +/* Not yet inserted into the NodeMap */ +UA_Node * +UA_Nodestore_newNode(void *nsCtx, UA_NodeClass nodeClass) { + NodeEntry *entry = newEntry(nodeClass); + if(!entry) + return NULL; + return (UA_Node*)&entry->nodeId; +} - if(response->responseHeader.serviceResult == UA_STATUSCODE_BADSHUTDOWN) - return; +/* Not yet inserted into the NodeMap */ +void +UA_Nodestore_deleteNode(void *nsCtx, UA_Node *node) { + deleteEntry(container_of(node, NodeEntry, nodeId)); +} - if(!LIST_FIRST(&client->subscriptions)) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADNOSUBSCRIPTION; - return; +const UA_Node * +UA_Nodestore_getNode(void *nsCtx, const UA_NodeId *nodeId) { + NodeMap *ns = (NodeMap*)nsCtx; + BEGIN_CRITSECT(ns); + NodeEntry dummy; + dummy.nodeIdHash = UA_NodeId_hash(nodeId); + dummy.nodeId = *nodeId; + NodeEntry *entry = ZIP_FIND(NodeTree, &ns->root, &dummy); + if(!entry) { + END_CRITSECT(ns); + return NULL; } + ++entry->refCount; + END_CRITSECT(ns); + return (const UA_Node*)&entry->nodeId; +} - if(response->responseHeader.serviceResult == UA_STATUSCODE_BADSESSIONCLOSED) { - if(client->state >= UA_CLIENTSTATE_SESSION) { - UA_LOG_WARNING(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Received Publish Response with code %s", - UA_StatusCode_name(response->responseHeader.serviceResult)); - } +void +UA_Nodestore_releaseNode(void *nsCtx, const UA_Node *node) { + if(!node) return; - } +#ifdef UA_ENABLE_MULTITHREADING + NodeMap *ns = (NodeMap*)nsCtx; +#endif + BEGIN_CRITSECT(ns); + NodeEntry *entry = container_of(node, NodeEntry, nodeId); + UA_assert(entry->refCount > 0); + --entry->refCount; + cleanupEntry(entry); + END_CRITSECT(ns); +} - if(response->responseHeader.serviceResult == UA_STATUSCODE_BADSESSIONIDINVALID) { - UA_Client_close(client); /* TODO: This should be handled before the process callback */ - UA_LOG_WARNING(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Received BadSessionIdInvalid"); - return; - } +UA_StatusCode +UA_Nodestore_getNodeCopy(void *nsCtx, const UA_NodeId *nodeId, + UA_Node **outNode) { + /* Find the node */ + const UA_Node *node = UA_Nodestore_getNode(nsCtx, nodeId); + if(!node) + return UA_STATUSCODE_BADNODEIDUNKNOWN; - if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) { - UA_LOG_WARNING(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Received Publish Response with code %s", - UA_StatusCode_name(response->responseHeader.serviceResult)); - return; + /* Create the new entry */ + NodeEntry *ne = newEntry(node->nodeClass); + if(!ne) { + UA_Nodestore_releaseNode(nsCtx, node); + return UA_STATUSCODE_BADOUTOFMEMORY; } - UA_Client_Subscription *sub = findSubscription(client, response->subscriptionId); - if(!sub) { - response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR; - UA_LOG_WARNING(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Received Publish Response for a non-existant subscription"); - return; + /* Copy the node content */ + UA_Node *nnode = (UA_Node*)&ne->nodeId; + UA_StatusCode retval = UA_Node_copy(node, nnode); + UA_Nodestore_releaseNode(nsCtx, node); + if(retval != UA_STATUSCODE_GOOD) { + deleteEntry(ne); + return retval; } - sub->lastActivity = UA_DateTime_nowMonotonic(); + ne->orig = container_of(node, NodeEntry, nodeId); + *outNode = nnode; + return UA_STATUSCODE_GOOD; +} - /* Detect missing message - OPC Unified Architecture, Part 4 5.13.1.1 e) */ - if(UA_Client_Subscriptions_nextSequenceNumber(sub->sequenceNumber) != msg->sequenceNumber) { - UA_LOG_WARNING(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Invalid subscription sequence number: expected %u but got %u", - UA_Client_Subscriptions_nextSequenceNumber(sub->sequenceNumber), - msg->sequenceNumber); - /* This is an error. But we do not abort the connection. Some server - * SDKs misbehave from time to time and send out-of-order sequence - * numbers. (Probably some multi-threading synchronization issue.) */ - /* UA_Client_close(client); - return; */ +UA_StatusCode +UA_Nodestore_insertNode(void *nsCtx, UA_Node *node, UA_NodeId *addedNodeId) { + NodeEntry *entry = container_of(node, NodeEntry, nodeId); + NodeMap *ns = (NodeMap*)nsCtx; + BEGIN_CRITSECT(ns); + + /* Ensure that the NodeId is unique */ + NodeEntry dummy; + dummy.nodeId = node->nodeId; + if(node->nodeId.identifierType == UA_NODEIDTYPE_NUMERIC && + node->nodeId.identifier.numeric == 0) { + do { /* Create a random nodeid until we find an unoccupied id */ + node->nodeId.identifier.numeric = UA_UInt32_random(); + dummy.nodeId.identifier.numeric = node->nodeId.identifier.numeric; + dummy.nodeIdHash = UA_NodeId_hash(&node->nodeId); + } while(ZIP_FIND(NodeTree, &ns->root, &dummy)); + } else { + dummy.nodeIdHash = UA_NodeId_hash(&node->nodeId); + if(ZIP_FIND(NodeTree, &ns->root, &dummy)) { /* The nodeid exists */ + deleteEntry(entry); + END_CRITSECT(ns); + return UA_STATUSCODE_BADNODEIDEXISTS; + } } - /* According to f), a keep-alive message contains no notifications and has the sequence number - * of the next NotificationMessage that is to be sent => More than one consecutive keep-alive - * message or a NotificationMessage following a keep-alive message will share the same sequence - * number. */ - if (msg->notificationDataSize) - sub->sequenceNumber = msg->sequenceNumber; - /* Process the notification messages */ - for(size_t k = 0; k < msg->notificationDataSize; ++k) - processNotificationMessage(client, sub, &msg->notificationData[k]); + /* Copy the NodeId */ + if(addedNodeId) { + UA_StatusCode retval = UA_NodeId_copy(&node->nodeId, addedNodeId); + if(retval != UA_STATUSCODE_GOOD) { + deleteEntry(entry); + END_CRITSECT(ns); + return retval; + } + } - /* Add to the list of pending acks */ - for(size_t i = 0; i < response->availableSequenceNumbersSize; i++) { - if(response->availableSequenceNumbers[i] != msg->sequenceNumber) - continue; - UA_Client_NotificationsAckNumber *tmpAck = (UA_Client_NotificationsAckNumber*) - UA_malloc(sizeof(UA_Client_NotificationsAckNumber)); - if(!tmpAck) { - UA_LOG_WARNING(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Not enough memory to store the acknowledgement for a publish " - "message on subscription %u", sub->subscriptionId); - break; - } - tmpAck->subAck.sequenceNumber = msg->sequenceNumber; - tmpAck->subAck.subscriptionId = sub->subscriptionId; - LIST_INSERT_HEAD(&client->pendingNotificationsAcks, tmpAck, listEntry); - break; - } + /* Insert the node */ + entry->nodeIdHash = dummy.nodeIdHash; + ZIP_INSERT(NodeTree, &ns->root, entry, ZIP_FFS32(UA_UInt32_random())); + END_CRITSECT(ns); + return UA_STATUSCODE_GOOD; } -static void -processPublishResponseAsync(UA_Client *client, void *userdata, UA_UInt32 requestId, - void *response, const UA_DataType *responseType) { - UA_PublishRequest *req = (UA_PublishRequest*)userdata; - UA_PublishResponse *res = (UA_PublishResponse*)response; +UA_StatusCode +UA_Nodestore_replaceNode(void *nsCtx, UA_Node *node) { + /* Find the node */ + const UA_Node *oldNode = UA_Nodestore_getNode(nsCtx, &node->nodeId); + if(!oldNode) + return UA_STATUSCODE_BADNODEIDUNKNOWN; - /* Process the response */ - UA_Client_Subscriptions_processPublishResponse(client, req, res); + /* Test if the copy is current */ + NodeEntry *entry = container_of(node, NodeEntry, nodeId); + NodeEntry *oldEntry = container_of(oldNode, NodeEntry, nodeId); + if(oldEntry != entry->orig) { + /* The node was already updated since the copy was made */ + deleteEntry(entry); + UA_Nodestore_releaseNode(nsCtx, oldNode); + return UA_STATUSCODE_BADINTERNALERROR; + } - /* Delete the cached request */ - UA_PublishRequest_delete(req); + /* Replace */ + NodeMap *ns = (NodeMap*)nsCtx; + BEGIN_CRITSECT(ns); + ZIP_REMOVE(NodeTree, &ns->root, oldEntry); + entry->nodeIdHash = oldEntry->nodeIdHash; + ZIP_INSERT(NodeTree, &ns->root, entry, ZIP_RANK(entry, zipfields)); + oldEntry->deleted = true; + END_CRITSECT(ns); - /* Fill up the outstanding publish requests */ - UA_Client_Subscriptions_backgroundPublish(client); + UA_Nodestore_releaseNode(nsCtx, oldNode); + return UA_STATUSCODE_GOOD; } -void -UA_Client_Subscriptions_clean(UA_Client *client) { - UA_Client_NotificationsAckNumber *n, *tmp; - LIST_FOREACH_SAFE(n, &client->pendingNotificationsAcks, listEntry, tmp) { - LIST_REMOVE(n, listEntry); - UA_free(n); +UA_StatusCode +UA_Nodestore_removeNode(void *nsCtx, const UA_NodeId *nodeId) { + NodeMap *ns = (NodeMap*)nsCtx; + BEGIN_CRITSECT(ns); + NodeEntry dummy; + dummy.nodeIdHash = UA_NodeId_hash(nodeId); + dummy.nodeId = *nodeId; + NodeEntry *entry = ZIP_FIND(NodeTree, &ns->root, &dummy); + if(!entry) { + END_CRITSECT(ns); + return UA_STATUSCODE_BADNODEIDUNKNOWN; } + ZIP_REMOVE(NodeTree, &ns->root, entry); + entry->deleted = true; + cleanupEntry(entry); + END_CRITSECT(ns); + return UA_STATUSCODE_GOOD; +} - UA_Client_Subscription *sub, *tmps; - LIST_FOREACH_SAFE(sub, &client->subscriptions, listEntry, tmps) - UA_Client_Subscription_deleteInternal(client, sub); /* force local removal */ +struct VisitorData { + UA_NodestoreVisitor visitor; + void *visitorContext; +}; - client->monitoredItemHandles = 0; +static void +nodeVisitor(NodeEntry *entry, void *data) { + struct VisitorData *d = (struct VisitorData*)data; + d->visitor(d->visitorContext, (UA_Node*)&entry->nodeId); } void -UA_Client_Subscriptions_backgroundPublishInactivityCheck(UA_Client *client) { - if(client->state < UA_CLIENTSTATE_SESSION) - return; +UA_Nodestore_iterate(void *nsCtx, UA_NodestoreVisitor visitor, + void *visitorCtx) { + struct VisitorData d; + d.visitor = visitor; + d.visitorContext = visitorCtx; + NodeMap *ns = (NodeMap*)nsCtx; + BEGIN_CRITSECT(ns); + ZIP_ITER(NodeTree, &ns->root, nodeVisitor, &d); + END_CRITSECT(ns); +} - /* Is the lack of responses the client's fault? */ - if(client->currentlyOutStandingPublishRequests == 0) - return; +static void +deleteNodeVisitor(NodeEntry *entry, void *data) { + deleteEntry(entry); +} - UA_Client_Subscription *sub; - LIST_FOREACH(sub, &client->subscriptions, listEntry) { - UA_DateTime maxSilence = (UA_DateTime) - ((sub->publishingInterval * sub->maxKeepAliveCount) + - client->config.timeout) * UA_DATETIME_MSEC; - if(maxSilence + sub->lastActivity < UA_DateTime_nowMonotonic()) { - /* Reset activity */ - sub->lastActivity = UA_DateTime_nowMonotonic(); +/***********************/ +/* Nodestore Lifecycle */ +/***********************/ - if(client->config.subscriptionInactivityCallback) - client->config.subscriptionInactivityCallback(client, sub->subscriptionId, sub->context); - UA_LOG_ERROR(client->config.logger, UA_LOGCATEGORY_CLIENT, - "Inactivity for Subscription %u.", sub->subscriptionId); - } - } -} +const UA_Boolean inPlaceEditAllowed = true; UA_StatusCode -UA_Client_Subscriptions_backgroundPublish(UA_Client *client) { - if(client->state < UA_CLIENTSTATE_SESSION) - return UA_STATUSCODE_BADSERVERNOTCONNECTED; - - /* The session must have at least one subscription */ - if(!LIST_FIRST(&client->subscriptions)) - return UA_STATUSCODE_GOOD; +UA_Nodestore_new(void **nsCtx) { + /* Allocate and initialize the nodemap */ + NodeMap *nodemap = (NodeMap*)UA_malloc(sizeof(NodeMap)); + if(!nodemap) + return UA_STATUSCODE_BADOUTOFMEMORY; +#ifdef UA_ENABLE_MULTITHREADING + pthread_mutex_init(&nodemap->mutex, NULL); +#endif - while(client->currentlyOutStandingPublishRequests < client->config.outStandingPublishRequests) { - UA_PublishRequest *request = UA_PublishRequest_new(); - if (!request) - return UA_STATUSCODE_BADOUTOFMEMORY; + ZIP_INIT(&nodemap->root); - request->requestHeader.timeoutHint=60000; - UA_StatusCode retval = UA_Client_preparePublishRequest(client, request); - if(retval != UA_STATUSCODE_GOOD) { - UA_PublishRequest_delete(request); - return retval; - } - - UA_UInt32 requestId; - client->currentlyOutStandingPublishRequests++; + /* Populate the nodestore */ + *nsCtx = (void*)nodemap; + return UA_STATUSCODE_GOOD; +} - /* Disable the timeout, it is treat in UA_Client_Subscriptions_backgroundPublishInactivityCheck */ - retval = __UA_Client_AsyncServiceEx(client, request, &UA_TYPES[UA_TYPES_PUBLISHREQUEST], - processPublishResponseAsync, - &UA_TYPES[UA_TYPES_PUBLISHRESPONSE], - (void*)request, &requestId, 0); - if(retval != UA_STATUSCODE_GOOD) { - UA_PublishRequest_delete(request); - return retval; - } - } +void +UA_Nodestore_delete(void *nsCtx) { + if (!nsCtx) + return; - return UA_STATUSCODE_GOOD; + NodeMap *ns = (NodeMap*)nsCtx; +#ifdef UA_ENABLE_MULTITHREADING + pthread_mutex_destroy(&ns->mutex); +#endif + ZIP_ITER(NodeTree, &ns->root, deleteNodeVisitor, NULL); + UA_free(ns); } -#endif /* UA_ENABLE_SUBSCRIPTIONS */ +#endif /* UA_ENABLE_CUSTOM_NODESTORE */ -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/src/client/ua_client_subscriptions_deprecated.c" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/ua_config_default.c" ***********************************/ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. * - * Copyright 2015-2018 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2015 (c) Oleksiy Vasylyev - * Copyright 2016 (c) Sten Grüner - * Copyright 2017-2018 (c) Thomas Stalder, Blue Time Concept SA - * Copyright 2016-2017 (c) Florian Palm - * Copyright 2017 (c) Frank Meerkötter + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Julian Grothoff + * Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA + * Copyright 2018 (c) Daniel Feist, Precitec GmbH & Co. KG + * Copyright 2018 (c) Fabian Arndt, Root-Core + * Copyright 2019 (c) Kalycito Infotech Private Limited */ -#ifdef UA_ENABLE_SUBSCRIPTIONS /* conditional compilation */ +/* Struct initialization works across ANSI C/C99/C++ if it is done when the + * variable is first declared. Assigning values to existing structs is + * heterogeneous across the three. */ +static UA_INLINE UA_UInt32Range +UA_UINT32RANGE(UA_UInt32 min, UA_UInt32 max) { + UA_UInt32Range range = {min, max}; + return range; +} + +static UA_INLINE UA_DurationRange +UA_DURATIONRANGE(UA_Duration min, UA_Duration max) { + UA_DurationRange range = {min, max}; + return range; +} + +/*******************************/ +/* Default Connection Settings */ +/*******************************/ + +const UA_ConnectionConfig UA_ConnectionConfig_default = { + 0, /* .protocolVersion */ + 65535, /* .sendBufferSize, 64k per chunk */ + 65535, /* .recvBufferSize, 64k per chunk */ + 0, /* .maxMessageSize, 0 -> unlimited */ + 0 /* .maxChunkCount, 0 -> unlimited */ +}; + +/***************************/ +/* Default Server Settings */ +/***************************/ + +#define MANUFACTURER_NAME "open62541" +#define PRODUCT_NAME "open62541 OPC UA Server" +#define PRODUCT_URI "http://open62541.org" +#define APPLICATION_NAME "open62541-based OPC UA Application" +#define APPLICATION_URI "urn:unconfigured:application" +#define APPLICATION_URI_SERVER "urn:open62541.server.application" + +#define STRINGIFY(arg) #arg +#define VERSION(MAJOR, MINOR, PATCH, LABEL) \ + STRINGIFY(MAJOR) "." STRINGIFY(MINOR) "." STRINGIFY(PATCH) LABEL + +static UA_StatusCode +createEndpoint(UA_ServerConfig *conf, UA_EndpointDescription *endpoint, + const UA_SecurityPolicy *securityPolicy, + UA_MessageSecurityMode securityMode) { + UA_EndpointDescription_init(endpoint); + + endpoint->securityMode = securityMode; + UA_String_copy(&securityPolicy->policyUri, &endpoint->securityPolicyUri); + endpoint->transportProfileUri = + UA_STRING_ALLOC("http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary"); -const UA_SubscriptionSettings UA_SubscriptionSettings_default = { - 500.0, /* .requestedPublishingInterval */ - 10000, /* .requestedLifetimeCount */ - 1, /* .requestedMaxKeepAliveCount */ - 0, /* .maxNotificationsPerPublish */ - true, /* .publishingEnabled */ - 0 /* .priority */ -}; + /* Add security level value for the corresponding message security mode */ + endpoint->securityLevel = (UA_Byte) securityMode; -UA_StatusCode -UA_Client_Subscriptions_new(UA_Client *client, UA_SubscriptionSettings settings, - UA_UInt32 *newSubscriptionId) { - UA_CreateSubscriptionRequest request; - UA_CreateSubscriptionRequest_init(&request); - request.requestedPublishingInterval = settings.requestedPublishingInterval; - request.requestedLifetimeCount = settings.requestedLifetimeCount; - request.requestedMaxKeepAliveCount = settings.requestedMaxKeepAliveCount; - request.maxNotificationsPerPublish = settings.maxNotificationsPerPublish; - request.publishingEnabled = settings.publishingEnabled; - request.priority = settings.priority; - - UA_CreateSubscriptionResponse response = - UA_Client_Subscriptions_create(client, request, NULL, NULL, NULL); + /* Enable all login mechanisms from the access control plugin */ + UA_StatusCode retval = UA_Array_copy(conf->accessControl.userTokenPolicies, + conf->accessControl.userTokenPoliciesSize, + (void **)&endpoint->userIdentityTokens, + &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); + if(retval != UA_STATUSCODE_GOOD) + return retval; + endpoint->userIdentityTokensSize = conf->accessControl.userTokenPoliciesSize; - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD && newSubscriptionId) - *newSubscriptionId = response.subscriptionId; - - UA_CreateSubscriptionResponse_deleteMembers(&response); - return retval; + UA_String_copy(&securityPolicy->localCertificate, &endpoint->serverCertificate); + UA_ApplicationDescription_copy(&conf->applicationDescription, &endpoint->server); + + return UA_STATUSCODE_GOOD; } -UA_StatusCode -UA_Client_Subscriptions_remove(UA_Client *client, UA_UInt32 subscriptionId) { - UA_DeleteSubscriptionsRequest request; - UA_DeleteSubscriptionsRequest_init(&request); - request.subscriptionIdsSize = 1; - request.subscriptionIds = &subscriptionId; +static const size_t usernamePasswordsSize = 2; +static UA_UsernamePasswordLogin usernamePasswords[2] = { + {UA_STRING_STATIC("user1"), UA_STRING_STATIC("password")}, + {UA_STRING_STATIC("user2"), UA_STRING_STATIC("password1")}}; - UA_DeleteSubscriptionsResponse response = - UA_Client_Subscriptions_delete(client, request); +static UA_StatusCode +setDefaultConfig(UA_ServerConfig *conf) { + if (!conf) + return UA_STATUSCODE_BADINVALIDARGUMENT; - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD) { - if(response.resultsSize != 1) - retval = UA_STATUSCODE_BADINTERNALERROR; - } + /* Zero out.. All members have a valid initial value */ + UA_ServerConfig_clean(conf); + memset(conf, 0, sizeof(UA_ServerConfig)); - if(retval == UA_STATUSCODE_GOOD) - retval = response.results[0]; + /* --> Start setting the default static config <-- */ + conf->nThreads = 1; + conf->logger = UA_Log_Stdout_; - UA_DeleteSubscriptionsResponse_deleteMembers(&response); - return retval; -} + conf->shutdownDelay = 0.0; -UA_StatusCode -UA_Client_Subscriptions_manuallySendPublishRequest(UA_Client *client) { - if(client->state < UA_CLIENTSTATE_SESSION) - return UA_STATUSCODE_BADSERVERNOTCONNECTED; + /* Server Description */ + conf->buildInfo.productUri = UA_STRING_ALLOC(PRODUCT_URI); + conf->buildInfo.manufacturerName = UA_STRING_ALLOC(MANUFACTURER_NAME); + conf->buildInfo.productName = UA_STRING_ALLOC(PRODUCT_NAME); + conf->buildInfo.softwareVersion = + UA_STRING_ALLOC(VERSION(UA_OPEN62541_VER_MAJOR, UA_OPEN62541_VER_MINOR, + UA_OPEN62541_VER_PATCH, UA_OPEN62541_VER_LABEL)); + #ifdef UA_PACK_DEBIAN + conf->buildInfo.buildNumber = UA_STRING_ALLOC("deb"); + #else + conf->buildInfo.buildNumber = UA_STRING_ALLOC(__DATE__ " " __TIME__); + #endif + conf->buildInfo.buildDate = UA_DateTime_now(); - UA_StatusCode retval = UA_STATUSCODE_GOOD; + conf->applicationDescription.applicationUri = UA_STRING_ALLOC(APPLICATION_URI_SERVER); + conf->applicationDescription.productUri = UA_STRING_ALLOC(PRODUCT_URI); + conf->applicationDescription.applicationName = + UA_LOCALIZEDTEXT_ALLOC("en", APPLICATION_NAME); + conf->applicationDescription.applicationType = UA_APPLICATIONTYPE_SERVER; + /* conf->applicationDescription.gatewayServerUri = UA_STRING_NULL; */ + /* conf->applicationDescription.discoveryProfileUri = UA_STRING_NULL; */ + /* conf->applicationDescription.discoveryUrlsSize = 0; */ + /* conf->applicationDescription.discoveryUrls = NULL; */ - UA_DateTime now = UA_DateTime_nowMonotonic(); - UA_DateTime maxDate = now + (UA_DateTime)(client->config.timeout * UA_DATETIME_MSEC); +#ifdef UA_ENABLE_DISCOVERY_MULTICAST + UA_MdnsDiscoveryConfiguration_init(&conf->discovery.mdns); + conf->discovery.mdnsInterfaceIP = UA_STRING_NULL; +#endif - UA_Boolean moreNotifications = true; - while(moreNotifications) { - UA_PublishRequest request; - UA_PublishRequest_init(&request); - retval = UA_Client_preparePublishRequest(client, &request); - if(retval != UA_STATUSCODE_GOOD) - return retval; + /* Custom DataTypes */ + /* conf->customDataTypesSize = 0; */ + /* conf->customDataTypes = NULL; */ - /* Manually increase the number of sent publish requests. Otherwise we - * send out one too many when we process async responses when we wait - * for the correct publish response. The - * currentlyOutStandingPublishRequests will be reduced during processing - * of the response. */ - client->currentlyOutStandingPublishRequests++; + /* Networking */ + /* conf->networkLayersSize = 0; */ + /* conf->networkLayers = NULL; */ + /* conf->customHostname = UA_STRING_NULL; */ - UA_PublishResponse response; - __UA_Client_Service(client, - &request, &UA_TYPES[UA_TYPES_PUBLISHREQUEST], - &response, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); - UA_Client_Subscriptions_processPublishResponse(client, &request, &response); - UA_PublishRequest_deleteMembers(&request); - - now = UA_DateTime_nowMonotonic(); - if(now > maxDate) { - moreNotifications = UA_FALSE; - retval = UA_STATUSCODE_GOODNONCRITICALTIMEOUT; - } else { - moreNotifications = response.moreNotifications; - } + /* Endpoints */ + /* conf->endpoints = {0, NULL}; */ - UA_PublishResponse_deleteMembers(&response); - UA_PublishRequest_deleteMembers(&request); - } + /* Certificate Verification that accepts every certificate. Can be + * overwritten when the policy is specialized. */ + UA_CertificateVerification_AcceptAll(&conf->certificateVerification); - if(client->state < UA_CLIENTSTATE_SESSION) - return UA_STATUSCODE_BADSERVERNOTCONNECTED; + /* Global Node Lifecycle */ + conf->nodeLifecycle.constructor = NULL; + conf->nodeLifecycle.destructor = NULL; + conf->nodeLifecycle.createOptionalChild = NULL; + conf->nodeLifecycle.generateChildNodeId = NULL; - return retval; -} + /* Relax constraints for the InformationModel */ + conf->relaxEmptyValueConstraint = true; /* Allow empty values */ -/* Callbacks for the MonitoredItems. The callbacks for the deprecated API are - * wrapped. The wrapper is cleaned up upon destruction. */ + /* Limits for SecureChannels */ + conf->maxSecureChannels = 40; + conf->maxSecurityTokenLifetime = 10 * 60 * 1000; /* 10 minutes */ -typedef struct { - UA_MonitoredItemHandlingFunction origCallback; - void *context; -} dataChangeCallbackWrapper; + /* Limits for Sessions */ + conf->maxSessions = 100; + conf->maxSessionTimeout = 60.0 * 60.0 * 1000.0; /* 1h */ -static void -dataChangeCallback(UA_Client *client, UA_UInt32 subId, void *subContext, - UA_UInt32 monId, void *monContext, UA_DataValue *value) { - dataChangeCallbackWrapper *wrapper = (dataChangeCallbackWrapper*)monContext; - wrapper->origCallback(client, monId, value, wrapper->context); -} + /* Limits for Subscriptions */ + conf->publishingIntervalLimits = UA_DURATIONRANGE(100.0, 3600.0 * 1000.0); + conf->lifeTimeCountLimits = UA_UINT32RANGE(3, 15000); + conf->keepAliveCountLimits = UA_UINT32RANGE(1, 100); + conf->maxNotificationsPerPublish = 1000; + conf->enableRetransmissionQueue = true; + conf->maxRetransmissionQueueSize = 0; /* unlimited */ +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + conf->maxEventsPerNode = 0; /* unlimited */ +#endif -typedef struct { - UA_MonitoredEventHandlingFunction origCallback; - void *context; -} eventCallbackWrapper; + /* Limits for MonitoredItems */ + conf->samplingIntervalLimits = UA_DURATIONRANGE(50.0, 24.0 * 3600.0 * 1000.0); + conf->queueSizeLimits = UA_UINT32RANGE(1, 100); -static void -eventCallback(UA_Client *client, UA_UInt32 subId, void *subContext, - UA_UInt32 monId, void *monContext, size_t nEventFields, - UA_Variant *eventFields) { - eventCallbackWrapper *wrapper = (eventCallbackWrapper*)monContext; - wrapper->origCallback(client, monId, nEventFields, eventFields, wrapper->context); -} +#ifdef UA_ENABLE_DISCOVERY + conf->discovery.cleanupTimeout = 60 * 60; +#endif -static void -deleteMonitoredItemCallback(UA_Client *client, UA_UInt32 subId, void *subContext, - UA_UInt32 monId, void *monContext) { - UA_free(monContext); -} - -static UA_StatusCode -addMonitoredItems(UA_Client *client, const UA_UInt32 subscriptionId, - UA_MonitoredItemCreateRequest *items, size_t itemsSize, - UA_MonitoredItemHandlingFunction *hfs, void **hfContexts, - UA_StatusCode *itemResults, UA_UInt32 *newMonitoredItemIds) { - /* Create array of wrappers and callbacks */ - UA_STACKARRAY(dataChangeCallbackWrapper*, wrappers, itemsSize); - UA_STACKARRAY(UA_Client_DeleteMonitoredItemCallback, deleteCbs, itemsSize); - UA_STACKARRAY(UA_Client_DataChangeNotificationCallback, wrapperCbs, itemsSize); - - for(size_t i = 0; i < itemsSize; i++) { - wrappers[i] = (dataChangeCallbackWrapper*)UA_malloc(sizeof(dataChangeCallbackWrapper)); - if(!wrappers[i]) { - for(size_t j = 0; j < i; j++) - UA_free(wrappers[j]); - return UA_STATUSCODE_BADOUTOFMEMORY; - } - wrappers[i]->origCallback = (UA_MonitoredItemHandlingFunction)(uintptr_t)hfs[i]; - wrappers[i]->context = hfContexts[i]; +#ifdef UA_ENABLE_HISTORIZING + /* conf->accessHistoryDataCapability = UA_FALSE; */ + /* conf->maxReturnDataValues = 0; */ - deleteCbs[i] = deleteMonitoredItemCallback; - wrapperCbs[i] = dataChangeCallback; - } + /* conf->accessHistoryEventsCapability = UA_FALSE; */ + /* conf->maxReturnEventValues = 0; */ - /* Prepare the request */ - UA_CreateMonitoredItemsRequest request; - UA_CreateMonitoredItemsRequest_init(&request); - request.subscriptionId = subscriptionId; - request.itemsToCreateSize = itemsSize; - request.itemsToCreate = items; + /* conf->insertDataCapability = UA_FALSE; */ + /* conf->insertEventCapability = UA_FALSE; */ + /* conf->insertAnnotationsCapability = UA_FALSE; */ - /* Process and return */ - UA_CreateMonitoredItemsResponse response = - UA_Client_MonitoredItems_createDataChanges(client, request, (void**)wrappers, - wrapperCbs, deleteCbs); + /* conf->replaceDataCapability = UA_FALSE; */ + /* conf->replaceEventCapability = UA_FALSE; */ - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD && response.resultsSize != itemsSize) - retval = UA_STATUSCODE_BADINTERNALERROR; + /* conf->updateDataCapability = UA_FALSE; */ + /* conf->updateEventCapability = UA_FALSE; */ - if(retval == UA_STATUSCODE_GOOD) { - for(size_t i = 0; i < itemsSize; i++) { - itemResults[i] = response.results[i].statusCode; - newMonitoredItemIds[i] = response.results[i].monitoredItemId; - } - } + /* conf->deleteRawCapability = UA_FALSE; */ + /* conf->deleteEventCapability = UA_FALSE; */ + /* conf->deleteAtTimeDataCapability = UA_FALSE; */ +#endif - UA_CreateMonitoredItemsResponse_deleteMembers(&response); - return retval; + /* --> Finish setting the default static config <-- */ + + return UA_STATUSCODE_GOOD; } -UA_StatusCode -UA_Client_Subscriptions_addMonitoredItems(UA_Client *client, const UA_UInt32 subscriptionId, - UA_MonitoredItemCreateRequest *items, size_t itemsSize, - UA_MonitoredItemHandlingFunction *hfs, - void **hfContexts, UA_StatusCode *itemResults, - UA_UInt32 *newMonitoredItemIds) { - return addMonitoredItems(client, subscriptionId, items, itemsSize, hfs, hfContexts, itemResults, - newMonitoredItemIds); +UA_EXPORT UA_StatusCode +UA_ServerConfig_setBasics(UA_ServerConfig* conf) { + return setDefaultConfig(conf); } -UA_StatusCode -UA_Client_Subscriptions_addMonitoredItem(UA_Client *client, UA_UInt32 subscriptionId, - UA_NodeId nodeId, UA_UInt32 attributeID, - UA_MonitoredItemHandlingFunction hf, void *hfContext, - UA_UInt32 *newMonitoredItemId, UA_Double samplingInterval) { - UA_MonitoredItemCreateRequest item; - UA_MonitoredItemCreateRequest_init(&item); - item.itemToMonitor.nodeId = nodeId; - item.itemToMonitor.attributeId = attributeID; - item.monitoringMode = UA_MONITORINGMODE_REPORTING; - item.requestedParameters.samplingInterval = samplingInterval; - item.requestedParameters.discardOldest = true; - item.requestedParameters.queueSize = 1; +static UA_StatusCode +addDefaultNetworkLayers(UA_ServerConfig *conf, UA_UInt16 portNumber, + UA_UInt32 sendBufferSize, UA_UInt32 recvBufferSize) { + return UA_ServerConfig_addNetworkLayerTCP(conf, portNumber, sendBufferSize, recvBufferSize); +} - UA_StatusCode retval_item = UA_STATUSCODE_GOOD; - UA_StatusCode retval = - addMonitoredItems(client, subscriptionId, &item, 1, - (UA_MonitoredItemHandlingFunction*)(uintptr_t)&hf, - &hfContext, &retval_item, newMonitoredItemId); - return retval | retval_item; -} - -static UA_StatusCode -addMonitoredEvents(UA_Client *client, const UA_UInt32 subscriptionId, - UA_MonitoredItemCreateRequest *items, size_t itemsSize, - UA_MonitoredEventHandlingFunction *hfs, - void **hfContexts, UA_StatusCode *itemResults, - UA_UInt32 *newMonitoredItemIds) { - /* Create array of wrappers and callbacks */ - UA_STACKARRAY(eventCallbackWrapper*, wrappers, itemsSize); - UA_STACKARRAY(UA_Client_DeleteMonitoredItemCallback, deleteCbs, itemsSize); - UA_STACKARRAY(UA_Client_EventNotificationCallback, wrapperCbs, itemsSize); - - for(size_t i = 0; i < itemsSize; i++) { - wrappers[i] = (eventCallbackWrapper*)UA_malloc(sizeof(eventCallbackWrapper)); - if(!wrappers[i]) { - for(size_t j = 0; j < i; j++) - UA_free(wrappers[j]); - return UA_STATUSCODE_BADOUTOFMEMORY; - } - wrappers[i]->origCallback = (UA_MonitoredEventHandlingFunction)(uintptr_t)hfs[i]; - wrappers[i]->context = hfContexts[i]; - deleteCbs[i] = deleteMonitoredItemCallback; - wrapperCbs[i] = eventCallback; - } +UA_EXPORT UA_StatusCode +UA_ServerConfig_addNetworkLayerTCP(UA_ServerConfig *conf, UA_UInt16 portNumber, + UA_UInt32 sendBufferSize, UA_UInt32 recvBufferSize) { + /* Add a network layer */ + UA_ServerNetworkLayer *tmp = (UA_ServerNetworkLayer *) + UA_realloc(conf->networkLayers, sizeof(UA_ServerNetworkLayer) * (1 + conf->networkLayersSize)); + if(!tmp) + return UA_STATUSCODE_BADOUTOFMEMORY; + conf->networkLayers = tmp; - /* Prepare the request */ - UA_CreateMonitoredItemsRequest request; - UA_CreateMonitoredItemsRequest_init(&request); - request.subscriptionId = subscriptionId; - request.itemsToCreateSize = itemsSize; - request.itemsToCreate = items; + UA_ConnectionConfig config = UA_ConnectionConfig_default; + if (sendBufferSize > 0) + config.sendBufferSize = sendBufferSize; + if (recvBufferSize > 0) + config.recvBufferSize = recvBufferSize; - /* Process and return */ - UA_CreateMonitoredItemsResponse response = - UA_Client_MonitoredItems_createEvents(client, request, (void**)wrappers, - wrapperCbs, deleteCbs); + conf->networkLayers[conf->networkLayersSize] = + UA_ServerNetworkLayerTCP(config, portNumber, &conf->logger); + if (!conf->networkLayers[conf->networkLayersSize].handle) + return UA_STATUSCODE_BADOUTOFMEMORY; + conf->networkLayersSize++; - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD && response.resultsSize != itemsSize) - retval = UA_STATUSCODE_BADINTERNALERROR; + return UA_STATUSCODE_GOOD; +} - if(retval == UA_STATUSCODE_GOOD) { - for(size_t i = 0; i < itemsSize; i++) - itemResults[i] = response.results[i].statusCode; - } +UA_EXPORT UA_StatusCode +UA_ServerConfig_addSecurityPolicyNone(UA_ServerConfig *config, + const UA_ByteString *certificate) { + UA_StatusCode retval; - UA_CreateMonitoredItemsResponse_deleteMembers(&response); - return retval; -} + /* Allocate the SecurityPolicies */ + UA_SecurityPolicy *tmp = (UA_SecurityPolicy *) + UA_realloc(config->securityPolicies, sizeof(UA_SecurityPolicy) * (1 + config->securityPoliciesSize)); + if(!tmp) + return UA_STATUSCODE_BADOUTOFMEMORY; + config->securityPolicies = tmp; + + /* Populate the SecurityPolicies */ + UA_ByteString localCertificate = UA_BYTESTRING_NULL; + if(certificate) + localCertificate = *certificate; + retval = UA_SecurityPolicy_None(&config->securityPolicies[config->securityPoliciesSize], NULL, + localCertificate, &config->logger); + if(retval != UA_STATUSCODE_GOOD) + return retval; + config->securityPoliciesSize++; -UA_StatusCode -UA_Client_Subscriptions_addMonitoredEvents(UA_Client *client, const UA_UInt32 subscriptionId, - UA_MonitoredItemCreateRequest *items, size_t itemsSize, - UA_MonitoredEventHandlingFunction *hfs, - void **hfContexts, UA_StatusCode *itemResults, - UA_UInt32 *newMonitoredItemIds) { - return addMonitoredEvents(client, subscriptionId, items, itemsSize, hfs, - hfContexts, itemResults, newMonitoredItemIds); + return UA_STATUSCODE_GOOD; } -UA_StatusCode -UA_Client_Subscriptions_addMonitoredEvent(UA_Client *client, UA_UInt32 subscriptionId, - const UA_NodeId nodeId, UA_UInt32 attributeID, - const UA_SimpleAttributeOperand *selectClauses, - size_t selectClausesSize, - const UA_ContentFilterElement *whereClauses, - size_t whereClausesSize, - const UA_MonitoredEventHandlingFunction hf, - void *hfContext, UA_UInt32 *newMonitoredItemId) { - UA_MonitoredItemCreateRequest item; - UA_MonitoredItemCreateRequest_init(&item); - item.itemToMonitor.nodeId = nodeId; - item.itemToMonitor.attributeId = attributeID; - item.monitoringMode = UA_MONITORINGMODE_REPORTING; - item.requestedParameters.samplingInterval = 0; - item.requestedParameters.discardOldest = false; +UA_EXPORT UA_StatusCode +UA_ServerConfig_addEndpoint(UA_ServerConfig *config, const UA_String securityPolicyUri, + UA_MessageSecurityMode securityMode) +{ + UA_StatusCode retval; - UA_EventFilter *evFilter = UA_EventFilter_new(); - if(!evFilter) + /* Allocate the endpoint */ + UA_EndpointDescription * tmp = (UA_EndpointDescription *) + UA_realloc(config->endpoints, sizeof(UA_EndpointDescription) * (1 + config->endpointsSize)); + if(!tmp) { return UA_STATUSCODE_BADOUTOFMEMORY; - UA_EventFilter_init(evFilter); - evFilter->selectClausesSize = selectClausesSize; - evFilter->selectClauses = (UA_SimpleAttributeOperand*)(uintptr_t)selectClauses; - evFilter->whereClause.elementsSize = whereClausesSize; - evFilter->whereClause.elements = (UA_ContentFilterElement*)(uintptr_t)whereClauses; - - item.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; - item.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_EVENTFILTER]; - item.requestedParameters.filter.content.decoded.data = evFilter; - UA_StatusCode retval_item = UA_STATUSCODE_GOOD; - UA_StatusCode retval = addMonitoredEvents(client, subscriptionId, &item, 1, - (UA_MonitoredEventHandlingFunction*)(uintptr_t)&hf, - &hfContext, &retval_item, newMonitoredItemId); - UA_free(evFilter); - return retval | retval_item; -} - -static UA_StatusCode -removeMonitoredItems(UA_Client *client, UA_UInt32 subscriptionId, - UA_UInt32 *monitoredItemIds, size_t itemsSize, - UA_StatusCode *itemResults) { - UA_DeleteMonitoredItemsRequest request; - UA_DeleteMonitoredItemsRequest_init(&request); - request.subscriptionId = subscriptionId; - request.monitoredItemIdsSize = itemsSize; - request.monitoredItemIds = monitoredItemIds; + } + config->endpoints = tmp; - UA_DeleteMonitoredItemsResponse response = UA_Client_MonitoredItems_delete(client, request); - UA_StatusCode retval = response.responseHeader.serviceResult; - if(retval == UA_STATUSCODE_GOOD) { - if(response.resultsSize != itemsSize) { - retval = UA_STATUSCODE_BADINTERNALERROR; - } else { - for(size_t i = 0; i < itemsSize; i++) - itemResults[i] = response.results[i]; + /* Lookup the security policy */ + const UA_SecurityPolicy *policy = NULL; + for (size_t i = 0; i < config->securityPoliciesSize; ++i) { + if (UA_String_equal(&securityPolicyUri, &config->securityPolicies[i].policyUri)) { + policy = &config->securityPolicies[i]; + break; } } - UA_DeleteMonitoredItemsResponse_deleteMembers(&response); - return retval; -} + if (!policy) + return UA_STATUSCODE_BADINVALIDARGUMENT; -UA_StatusCode -UA_Client_Subscriptions_removeMonitoredItems(UA_Client *client, UA_UInt32 subscriptionId, - UA_UInt32 *monitoredItemIds, size_t itemsSize, - UA_StatusCode *itemResults) { - return removeMonitoredItems(client, subscriptionId, monitoredItemIds, itemsSize, itemResults); -} + /* Populate the endpoint */ + retval = createEndpoint(config, &config->endpoints[config->endpointsSize], + policy, securityMode); + if(retval != UA_STATUSCODE_GOOD) + return retval; + config->endpointsSize++; -UA_StatusCode -UA_Client_Subscriptions_removeMonitoredItem(UA_Client *client, UA_UInt32 subscriptionId, - UA_UInt32 monitoredItemId) { - UA_StatusCode retval_item = UA_STATUSCODE_GOOD; - UA_StatusCode retval = removeMonitoredItems(client, subscriptionId, &monitoredItemId, 1, &retval_item); - return retval | retval_item; + return UA_STATUSCODE_GOOD; } -#endif /* UA_ENABLE_SUBSCRIPTIONS */ - -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/deps/libc_time.c" ***********************************/ - -/* Originally released by the musl project (http://www.musl-libc.org/) under the - * MIT license. Taken from the file /src/time/__secs_to_tm.c */ - -#include - -/* 2000-03-01 (mod 400 year, immediately after feb29 */ -#define LEAPOCH (946684800LL + 86400*(31+29)) - -#define DAYS_PER_400Y (365*400 + 97) -#define DAYS_PER_100Y (365*100 + 24) -#define DAYS_PER_4Y (365*4 + 1) - -int __secs_to_tm(long long t, struct mytm *tm) { - long long days, secs, years; - int remdays, remsecs, remyears; - int qc_cycles, c_cycles, q_cycles; - int months; - int wday, yday, leap; - static const char days_in_month[] = {31,30,31,30,31,31,30,31,30,31,31,29}; - - /* Reject time_t values whose year would overflow int */ - if (t < INT_MIN * 31622400LL || t > INT_MAX * 31622400LL) - return -1; +UA_EXPORT UA_StatusCode +UA_ServerConfig_addAllEndpoints(UA_ServerConfig *config) { + UA_StatusCode retval; - secs = t - LEAPOCH; - days = secs / 86400LL; - remsecs = (int)(secs % 86400); - if (remsecs < 0) { - remsecs += 86400; - --days; + /* Allocate the endpoints */ + UA_EndpointDescription * tmp = (UA_EndpointDescription *) + UA_realloc(config->endpoints, sizeof(UA_EndpointDescription) * (2 * config->securityPoliciesSize + config->endpointsSize)); + if(!tmp) { + return UA_STATUSCODE_BADOUTOFMEMORY; } + config->endpoints = tmp; - wday = (int)((3+days)%7); - if (wday < 0) wday += 7; + /* Populate the endpoints */ + for (size_t i = 0; i < config->securityPoliciesSize; ++i) { + if (UA_String_equal(&UA_SECURITY_POLICY_NONE_URI, &config->securityPolicies[i].policyUri)) { + retval = createEndpoint(config, &config->endpoints[config->endpointsSize], + &config->securityPolicies[i], UA_MESSAGESECURITYMODE_NONE); + if(retval != UA_STATUSCODE_GOOD) + return retval; + config->endpointsSize++; + } else { + retval = createEndpoint(config, &config->endpoints[config->endpointsSize], + &config->securityPolicies[i], UA_MESSAGESECURITYMODE_SIGN); + if(retval != UA_STATUSCODE_GOOD) + return retval; + config->endpointsSize++; - qc_cycles = (int)(days / DAYS_PER_400Y); - remdays = (int)(days % DAYS_PER_400Y); - if (remdays < 0) { - remdays += DAYS_PER_400Y; - --qc_cycles; + retval = createEndpoint(config, &config->endpoints[config->endpointsSize], + &config->securityPolicies[i], UA_MESSAGESECURITYMODE_SIGNANDENCRYPT); + if(retval != UA_STATUSCODE_GOOD) + return retval; + config->endpointsSize++; + } } - c_cycles = remdays / DAYS_PER_100Y; - if (c_cycles == 4) --c_cycles; - remdays -= c_cycles * DAYS_PER_100Y; - - q_cycles = remdays / DAYS_PER_4Y; - if (q_cycles == 25) --q_cycles; - remdays -= q_cycles * DAYS_PER_4Y; - - remyears = remdays / 365; - if (remyears == 4) --remyears; - remdays -= remyears * 365; + return UA_STATUSCODE_GOOD; +} - leap = !remyears && (q_cycles || !c_cycles); - yday = remdays + 31 + 28 + leap; - if (yday >= 365+leap) yday -= 365+leap; +UA_EXPORT UA_StatusCode +UA_ServerConfig_setMinimalCustomBuffer(UA_ServerConfig *config, UA_UInt16 portNumber, + const UA_ByteString *certificate, + UA_UInt32 sendBufferSize, + UA_UInt32 recvBufferSize) { + if (!config) + return UA_STATUSCODE_BADINVALIDARGUMENT; - years = remyears + 4*q_cycles + 100*c_cycles + 400LL*qc_cycles; + UA_StatusCode retval = setDefaultConfig(config); + if(retval != UA_STATUSCODE_GOOD) { + UA_ServerConfig_clean(config); + return retval; + } - for (months=0; days_in_month[months] <= remdays; ++months) - remdays -= days_in_month[months]; + retval = addDefaultNetworkLayers(config, portNumber, sendBufferSize, recvBufferSize); + if(retval != UA_STATUSCODE_GOOD) { + UA_ServerConfig_clean(config); + return retval; + } - if (years+100 > INT_MAX || years+100 < INT_MIN) - return -1; + /* Allocate the SecurityPolicies */ + retval = UA_ServerConfig_addSecurityPolicyNone(config, certificate); + if(retval != UA_STATUSCODE_GOOD) { + UA_ServerConfig_clean(config); + return retval; + } - tm->tm_year = (int)(years + 100); - tm->tm_mon = months + 2; - if (tm->tm_mon >= 12) { - tm->tm_mon -=12; - ++tm->tm_year; + /* Initialize the Access Control plugin */ + retval = UA_AccessControl_default(config, true, + &config->securityPolicies[config->securityPoliciesSize-1].policyUri, + usernamePasswordsSize, usernamePasswords); + if(retval != UA_STATUSCODE_GOOD) { + UA_ServerConfig_clean(config); + return retval; } - tm->tm_mday = remdays + 1; - tm->tm_wday = wday; - tm->tm_yday = yday; - tm->tm_hour = remsecs / 3600; - tm->tm_min = remsecs / 60 % 60; - tm->tm_sec = remsecs % 60; + /* Allocate the endpoint */ + retval = UA_ServerConfig_addEndpoint(config, UA_SECURITY_POLICY_NONE_URI, UA_MESSAGESECURITYMODE_NONE); + if(retval != UA_STATUSCODE_GOOD) { + UA_ServerConfig_clean(config); + return retval; + } - return 0; + return UA_STATUSCODE_GOOD; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/deps/pcg_basic.c" ***********************************/ - -/* - * PCG Random Number Generation for C. - * - * Copyright 2014 Melissa O'Neill - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * For additional information about the PCG random number generation scheme, - * including its license and other licensing options, visit - * - * http://www.pcg-random.org - */ +#ifdef UA_ENABLE_ENCRYPTION +UA_EXPORT UA_StatusCode +UA_ServerConfig_addSecurityPolicyBasic128Rsa15(UA_ServerConfig *config, + const UA_ByteString *certificate, + const UA_ByteString *privateKey) { + UA_StatusCode retval; -void pcg32_srandom_r(pcg32_random_t* rng, uint64_t initial_state, uint64_t initseq) { - rng->state = 0U; - rng->inc = (initseq << 1u) | 1u; - pcg32_random_r(rng); - rng->state += initial_state; - pcg32_random_r(rng); -} + /* Allocate the SecurityPolicies */ + UA_SecurityPolicy *tmp = (UA_SecurityPolicy *) + UA_realloc(config->securityPolicies, sizeof(UA_SecurityPolicy) * (1 + config->securityPoliciesSize)); + if(!tmp) + return UA_STATUSCODE_BADOUTOFMEMORY; + config->securityPolicies = tmp; + + /* Populate the SecurityPolicies */ + UA_ByteString localCertificate = UA_BYTESTRING_NULL; + UA_ByteString localPrivateKey = UA_BYTESTRING_NULL; + if(certificate) + localCertificate = *certificate; + if(privateKey) + localPrivateKey = *privateKey; + retval = UA_SecurityPolicy_Basic128Rsa15(&config->securityPolicies[config->securityPoliciesSize], + &config->certificateVerification, + localCertificate, localPrivateKey, &config->logger); + if(retval != UA_STATUSCODE_GOOD) + return retval; + config->securityPoliciesSize++; -uint32_t pcg32_random_r(pcg32_random_t* rng) { - uint64_t oldstate = rng->state; - rng->state = oldstate * 6364136223846793005ULL + rng->inc; - uint32_t xorshifted = (uint32_t)(((oldstate >> 18u) ^ oldstate) >> 27u); - uint32_t rot = (uint32_t)(oldstate >> 59u); - return (xorshifted >> rot) | (xorshifted << ((~rot + 1u) & 31)); /* was (xorshifted >> rot) | (xorshifted << ((-rot) & 31)) */ + return UA_STATUSCODE_GOOD; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_network_tcp.c" ***********************************/ - -/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. - * - * Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) frax2222 - * Copyright 2017 (c) Jose Cabral - * Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA - */ - -/* Enable POSIX features */ -#if !defined(_XOPEN_SOURCE) && !defined(_WRS_KERNEL) -# define _XOPEN_SOURCE 600 -#endif -#ifndef _DEFAULT_SOURCE -# define _DEFAULT_SOURCE -#endif -/* On older systems we need to define _BSD_SOURCE. - * _DEFAULT_SOURCE is an alias for that. */ -#ifndef _BSD_SOURCE -# define _BSD_SOURCE -#endif - -/* Disable some security warnings on MSVC */ -#ifdef _MSC_VER -# define _CRT_SECURE_NO_WARNINGS -#endif +UA_EXPORT UA_StatusCode +UA_ServerConfig_addSecurityPolicyBasic256(UA_ServerConfig *config, + const UA_ByteString *certificate, + const UA_ByteString *privateKey) { + UA_StatusCode retval; -/* Assume that Windows versions are newer than Windows XP */ -#if defined(__MINGW32__) && (!defined(WINVER) || WINVER < 0x501) -# undef WINVER -# undef _WIN32_WINDOWS -# undef _WIN32_WINNT -# define WINVER 0x0501 -# define _WIN32_WINDOWS 0x0501 -# define _WIN32_WINNT 0x0501 -#endif + /* Allocate the SecurityPolicies */ + UA_SecurityPolicy *tmp = (UA_SecurityPolicy *) + UA_realloc(config->securityPolicies, sizeof(UA_SecurityPolicy) * (1 + config->securityPoliciesSize)); + if(!tmp) + return UA_STATUSCODE_BADOUTOFMEMORY; + config->securityPolicies = tmp; + + /* Populate the SecurityPolicies */ + UA_ByteString localCertificate = UA_BYTESTRING_NULL; + UA_ByteString localPrivateKey = UA_BYTESTRING_NULL; + if(certificate) + localCertificate = *certificate; + if(privateKey) + localPrivateKey = *privateKey; + retval = UA_SecurityPolicy_Basic256(&config->securityPolicies[config->securityPoliciesSize], + &config->certificateVerification, + localCertificate, localPrivateKey, &config->logger); + if(retval != UA_STATUSCODE_GOOD) + return retval; + config->securityPoliciesSize++; + return UA_STATUSCODE_GOOD; +} -#include // snprintf -#include // memset +UA_EXPORT UA_StatusCode +UA_ServerConfig_addSecurityPolicyBasic256Sha256(UA_ServerConfig *config, + const UA_ByteString *certificate, + const UA_ByteString *privateKey) { + UA_StatusCode retval; -#if !defined(UA_FREERTOS) -# include -#else -# define AI_PASSIVE 0x01 -# define TRUE 1 -# define FALSE 0 -# define ioctl ioctlsocket -#endif + /* Allocate the SecurityPolicies */ + UA_SecurityPolicy *tmp = (UA_SecurityPolicy *) + UA_realloc(config->securityPolicies, sizeof(UA_SecurityPolicy) * (1 + config->securityPoliciesSize)); + if(!tmp) + return UA_STATUSCODE_BADOUTOFMEMORY; + config->securityPolicies = tmp; + + /* Populate the SecurityPolicies */ + UA_ByteString localCertificate = UA_BYTESTRING_NULL; + UA_ByteString localPrivateKey = UA_BYTESTRING_NULL; + if(certificate) + localCertificate = *certificate; + if(privateKey) + localPrivateKey = *privateKey; + retval = UA_SecurityPolicy_Basic256Sha256(&config->securityPolicies[config->securityPoliciesSize], + &config->certificateVerification, + localCertificate, localPrivateKey, &config->logger); + if(retval != UA_STATUSCODE_GOOD) + return retval; + config->securityPoliciesSize++; -#ifdef _WIN32 -# include -# include -# define CLOSESOCKET(S) closesocket((SOCKET)S) -# define ssize_t int -# define WIN32_INT (int) -# define OPTVAL_TYPE char -# define ERR_CONNECTION_PROGRESS WSAEWOULDBLOCK -# define UA_sleep_ms(X) Sleep(X) -#else /* _WIN32 */ -# if defined(UA_FREERTOS) -# define UA_FREERTOS_HOSTNAME "10.200.4.114" -static inline int gethostname_freertos(char* name, size_t len){ - if(strlen(UA_FREERTOS_HOSTNAME) > (len)) - return -1; - strcpy(name, UA_FREERTOS_HOSTNAME); - return 0; -} -#define gethostname gethostname_freertos -# include -# include -# define CLOSESOCKET(S) lwip_close(S) -# define sockaddr_storage sockaddr -# ifdef BYTE_ORDER -# undef BYTE_ORDER -# endif -# define UA_sleep_ms(X) vTaskDelay(pdMS_TO_TICKS(X)) -# else /* Not freeRTOS */ -# define CLOSESOCKET(S) close(S) -# include -# include -# include -# include -# if defined(_WRS_KERNEL) -# include -# include -# define UA_sleep_ms(X) \ - { \ - struct timespec timeToSleep; \ - timeToSleep.tv_sec = X / 1000; \ - timeToSleep.tv_nsec = 1000000 * (X % 1000); \ - nanosleep(&timeToSleep, NULL); \ - } -# else /* defined(_WRS_KERNEL) */ -# include -# define UA_sleep_ms(X) usleep(X * 1000) -# endif /* defined(_WRS_KERNEL) */ -# endif /* Not freeRTOS */ - -# define SOCKET int -# define WIN32_INT -# define OPTVAL_TYPE int -# define ERR_CONNECTION_PROGRESS EINPROGRESS - - -# include -# include // read, write, close - -# ifdef __QNX__ -# include -# endif -# if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) -# include -# if defined(BSD) -# include -# endif -# endif -# if !defined(__CYGWIN__) && !defined(UA_FREERTOS) -# include -# endif -#endif /* _WIN32 */ - -/* unsigned int for windows and workaround to a glibc bug */ -/* Additionally if GNU_LIBRARY is not defined, it may be using - * musl libc (e.g. Docker Alpine) */ -#if defined(_WIN32) || defined(__OpenBSD__) || \ - (defined(__GNU_LIBRARY__) && (__GNU_LIBRARY__ <= 6) && \ - (__GLIBC__ <= 2) && (__GLIBC_MINOR__ < 16) || \ - !defined(__GNU_LIBRARY__)) -# define UA_fd_set(fd, fds) FD_SET((unsigned int)fd, fds) -# define UA_fd_isset(fd, fds) FD_ISSET((unsigned int)fd, fds) -#else -# define UA_fd_set(fd, fds) FD_SET(fd, fds) -# define UA_fd_isset(fd, fds) FD_ISSET(fd, fds) -#endif + return UA_STATUSCODE_GOOD; +} -#ifdef UNDER_CE -# define errno WSAGetLastError() -#endif +UA_EXPORT UA_StatusCode +UA_ServerConfig_addAllSecurityPolicies(UA_ServerConfig *config, + const UA_ByteString *certificate, + const UA_ByteString *privateKey) { + UA_StatusCode retval; -#ifdef _WIN32 -# define errno__ WSAGetLastError() -# define INTERRUPTED WSAEINTR -# define WOULDBLOCK WSAEWOULDBLOCK -# define AGAIN WSAEWOULDBLOCK -#else -# define errno__ errno -# define INTERRUPTED EINTR -# define WOULDBLOCK EWOULDBLOCK -# define AGAIN EAGAIN -#endif + /* Allocate the SecurityPolicies */ + UA_SecurityPolicy *tmp = (UA_SecurityPolicy *) + UA_realloc(config->securityPolicies, sizeof(UA_SecurityPolicy) * (4 + config->securityPoliciesSize)); + if(!tmp) + return UA_STATUSCODE_BADOUTOFMEMORY; + config->securityPolicies = tmp; + + /* Populate the SecurityPolicies */ + UA_ByteString localCertificate = UA_BYTESTRING_NULL; + UA_ByteString localPrivateKey = UA_BYTESTRING_NULL; + if(certificate) + localCertificate = *certificate; + if(privateKey) + localPrivateKey = *privateKey; + retval = UA_SecurityPolicy_None(&config->securityPolicies[config->securityPoliciesSize], NULL, + localCertificate, &config->logger); + if(retval != UA_STATUSCODE_GOOD) + return retval; + config->securityPoliciesSize++; -/****************************/ -/* Generic Socket Functions */ -/****************************/ + retval = UA_SecurityPolicy_Basic128Rsa15(&config->securityPolicies[config->securityPoliciesSize], + &config->certificateVerification, + localCertificate, localPrivateKey, &config->logger); + if(retval != UA_STATUSCODE_GOOD) + return retval; + config->securityPoliciesSize++; -static UA_StatusCode -connection_getsendbuffer(UA_Connection *connection, - size_t length, UA_ByteString *buf) { - if(length > connection->remoteConf.recvBufferSize) - return UA_STATUSCODE_BADCOMMUNICATIONERROR; - return UA_ByteString_allocBuffer(buf, length); -} + retval = UA_SecurityPolicy_Basic256(&config->securityPolicies[config->securityPoliciesSize], + &config->certificateVerification, + localCertificate, localPrivateKey, &config->logger); + if(retval != UA_STATUSCODE_GOOD) + return retval; + config->securityPoliciesSize++; -static void -connection_releasesendbuffer(UA_Connection *connection, - UA_ByteString *buf) { - UA_ByteString_deleteMembers(buf); -} + retval = UA_SecurityPolicy_Basic256Sha256(&config->securityPolicies[config->securityPoliciesSize], + &config->certificateVerification, + localCertificate, localPrivateKey, &config->logger); + if(retval != UA_STATUSCODE_GOOD) + return retval; + config->securityPoliciesSize++; -static void -connection_releaserecvbuffer(UA_Connection *connection, - UA_ByteString *buf) { - UA_ByteString_deleteMembers(buf); + return retval; } -static UA_StatusCode -connection_write(UA_Connection *connection, UA_ByteString *buf) { - if(connection->state == UA_CONNECTION_CLOSED) { - UA_ByteString_deleteMembers(buf); - return UA_STATUSCODE_BADCONNECTIONCLOSED; +UA_EXPORT UA_StatusCode +UA_ServerConfig_setDefaultWithSecurityPolicies(UA_ServerConfig *conf, + UA_UInt16 portNumber, + const UA_ByteString *certificate, + const UA_ByteString *privateKey, + const UA_ByteString *trustList, + size_t trustListSize, + const UA_ByteString *issuerList, + size_t issuerListSize, + const UA_ByteString *revocationList, + size_t revocationListSize) { + UA_StatusCode retval = setDefaultConfig(conf); + if(retval != UA_STATUSCODE_GOOD) { + UA_ServerConfig_clean(conf); + return retval; } - /* Prevent OS signals when sending to a closed socket */ - int flags = 0; -#ifdef MSG_NOSIGNAL - flags |= MSG_NOSIGNAL; -#endif - - /* Send the full buffer. This may require several calls to send */ - size_t nWritten = 0; - do { - ssize_t n = 0; - do { - size_t bytes_to_send = buf->length - nWritten; - n = send((SOCKET)connection->sockfd, - (const char*)buf->data + nWritten, - WIN32_INT bytes_to_send, flags); - if(n < 0 && errno__ != INTERRUPTED && errno__ != AGAIN) { - connection->close(connection); - UA_ByteString_deleteMembers(buf); - return UA_STATUSCODE_BADCONNECTIONCLOSED; - } - } while(n < 0); - nWritten += (size_t)n; - } while(nWritten < buf->length); - - /* Free the buffer */ - UA_ByteString_deleteMembers(buf); - return UA_STATUSCODE_GOOD; -} - -static UA_StatusCode -connection_recv(UA_Connection *connection, UA_ByteString *response, - UA_UInt32 timeout) { - if(connection->state == UA_CONNECTION_CLOSED) - return UA_STATUSCODE_BADCONNECTIONCLOSED; - - /* Listen on the socket for the given timeout until a message arrives */ - if(timeout > 0) { - fd_set fdset; - FD_ZERO(&fdset); - UA_fd_set(connection->sockfd, &fdset); - UA_UInt32 timeout_usec = timeout * 1000; - struct timeval tmptv = {(long int)(timeout_usec / 1000000), - (long int)(timeout_usec % 1000000)}; - int resultsize = select(connection->sockfd+1, &fdset, NULL, - NULL, &tmptv); - - /* No result */ - if(resultsize == 0) - return UA_STATUSCODE_GOODNONCRITICALTIMEOUT; - - if(resultsize == -1) { - /* The call to select was interrupted manually. Act as if it timed - * out */ - if(errno == EINTR) - return UA_STATUSCODE_GOODNONCRITICALTIMEOUT; + retval = UA_CertificateVerification_Trustlist(&conf->certificateVerification, + trustList, trustListSize, + issuerList, issuerListSize, + revocationList, revocationListSize); + if (retval != UA_STATUSCODE_GOOD) + return retval; - /* The error cannot be recovered. Close the connection. */ - connection->close(connection); - return UA_STATUSCODE_BADCONNECTIONCLOSED; - } - } + if(trustListSize == 0) + UA_LOG_WARNING(&conf->logger, UA_LOGCATEGORY_USERLAND, + "No CA trust-list provided. " + "Any remote certificate will be accepted."); - response->data = (UA_Byte*) - UA_malloc(connection->localConf.recvBufferSize); - if(!response->data) { - response->length = 0; - return UA_STATUSCODE_BADOUTOFMEMORY; /* not enough memory retry */ + retval = addDefaultNetworkLayers(conf, portNumber, 0, 0); + if(retval != UA_STATUSCODE_GOOD) { + UA_ServerConfig_clean(conf); + return retval; } - /* Get the received packet(s) */ - ssize_t ret = recv(connection->sockfd, (char*)response->data, - connection->localConf.recvBufferSize, 0); - - /* The remote side closed the connection */ - if(ret == 0) { - UA_ByteString_deleteMembers(response); - connection->close(connection); - return UA_STATUSCODE_BADCONNECTIONCLOSED; + retval = UA_ServerConfig_addAllSecurityPolicies(conf, certificate, privateKey); + if(retval != UA_STATUSCODE_GOOD) { + UA_ServerConfig_clean(conf); + return retval; } - /* Error case */ - if(ret < 0) { - UA_ByteString_deleteMembers(response); - if(errno__ == INTERRUPTED || (timeout > 0) ? - false : (errno__ == EAGAIN || errno__ == WOULDBLOCK)) - return UA_STATUSCODE_GOOD; /* statuscode_good but no data -> retry */ - connection->close(connection); - return UA_STATUSCODE_BADCONNECTIONCLOSED; + retval = UA_AccessControl_default(conf, true, + &conf->securityPolicies[conf->securityPoliciesSize-1].policyUri, + usernamePasswordsSize, usernamePasswords); + if(retval != UA_STATUSCODE_GOOD) { + UA_ServerConfig_clean(conf); + return retval; } - /* Set the length of the received buffer */ - response->length = (size_t)ret; - return UA_STATUSCODE_GOOD; -} + retval = UA_ServerConfig_addAllEndpoints(conf); + if(retval != UA_STATUSCODE_GOOD) { + UA_ServerConfig_clean(conf); + return retval; + } -static UA_StatusCode -socket_set_nonblocking(SOCKET sockfd) { -#ifdef _WIN32 - u_long iMode = 1; - if(ioctlsocket(sockfd, FIONBIO, &iMode) != NO_ERROR) - return UA_STATUSCODE_BADINTERNALERROR; -#elif defined(_WRS_KERNEL) || defined(UA_FREERTOS) - int on = TRUE; - if(ioctl(sockfd, FIONBIO, &on) < 0) - return UA_STATUSCODE_BADINTERNALERROR; -#else - int opts = fcntl(sockfd, F_GETFL); - if(opts < 0 || fcntl(sockfd, F_SETFL, opts|O_NONBLOCK) < 0) - return UA_STATUSCODE_BADINTERNALERROR; -#endif return UA_STATUSCODE_GOOD; } -static UA_StatusCode -socket_set_blocking(SOCKET sockfd) { -#ifdef _WIN32 - u_long iMode = 0; - if(ioctlsocket(sockfd, FIONBIO, &iMode) != NO_ERROR) - return UA_STATUSCODE_BADINTERNALERROR; -#elif defined(_WRS_KERNEL) || defined(UA_FREERTOS) - int on = FALSE; - if(ioctl(sockfd, FIONBIO, &on) < 0) - return UA_STATUSCODE_BADINTERNALERROR; -#else - int opts = fcntl(sockfd, F_GETFL); - if(opts < 0 || fcntl(sockfd, F_SETFL, opts & (~O_NONBLOCK)) < 0) - return UA_STATUSCODE_BADINTERNALERROR; #endif - return UA_STATUSCODE_GOOD; -} /***************************/ -/* Server NetworkLayer TCP */ +/* Default Client Settings */ /***************************/ -#define MAXBACKLOG 100 -#define NOHELLOTIMEOUT 120000 /* timeout in ms before close the connection - * if server does not receive Hello Message */ +static UA_INLINE void +UA_ClientConnectionTCP_poll_callback(UA_Client *client, void *data) { + UA_ClientConnectionTCP_poll(client, data); +} -typedef struct ConnectionEntry { - UA_Connection connection; - LIST_ENTRY(ConnectionEntry) pointers; -} ConnectionEntry; +UA_StatusCode +UA_ClientConfig_setDefault(UA_ClientConfig *config) { + config->timeout = 5000; + config->secureChannelLifeTime = 10 * 60 * 1000; /* 10 minutes */ -typedef struct { - UA_Logger logger; - UA_ConnectionConfig conf; - UA_UInt16 port; - UA_Int32 serverSockets[FD_SETSIZE]; - UA_UInt16 serverSocketsSize; - LIST_HEAD(, ConnectionEntry) connections; -} ServerNetworkLayerTCP; + config->logger.log = UA_Log_Stdout_log; + config->logger.context = NULL; + config->logger.clear = UA_Log_Stdout_clear; -static void -ServerNetworkLayerTCP_freeConnection(UA_Connection *connection) { - UA_Connection_deleteMembers(connection); - UA_free(connection); -} + config->localConnectionConfig = UA_ConnectionConfig_default; -/* This performs only 'shutdown'. 'close' is called when the shutdown - * socket is returned from select. */ -static void -ServerNetworkLayerTCP_close(UA_Connection *connection) { - if (connection->state == UA_CONNECTION_CLOSED) - return; - shutdown((SOCKET)connection->sockfd, 2); - connection->state = UA_CONNECTION_CLOSED; -} + /* Certificate Verification that accepts every certificate. Can be + * overwritten when the policy is specialized. */ + UA_CertificateVerification_AcceptAll(&config->certificateVerification); -static UA_StatusCode -ServerNetworkLayerTCP_add(ServerNetworkLayerTCP *layer, UA_Int32 newsockfd, - struct sockaddr_storage *remote) { - /* Set nonblocking */ - socket_set_nonblocking(newsockfd); + /* With encryption enabled, the applicationUri needs to match the URI from + * the certificate */ + config->clientDescription.applicationUri = UA_STRING_ALLOC(APPLICATION_URI); + config->clientDescription.applicationType = UA_APPLICATIONTYPE_CLIENT; - /* Do not merge packets on the socket (disable Nagle's algorithm) */ - int dummy = 1; - if(setsockopt(newsockfd, IPPROTO_TCP, TCP_NODELAY, - (const char *)&dummy, sizeof(dummy)) < 0) { - UA_LOG_SOCKET_ERRNO_WRAP( - UA_LOG_ERROR(layer->logger, UA_LOGCATEGORY_NETWORK, - "Cannot set socket option TCP_NODELAY. Error: %s", - errno_str)); - return UA_STATUSCODE_BADUNEXPECTEDERROR; + if(config->securityPoliciesSize > 0) { + UA_LOG_ERROR(&config->logger, UA_LOGCATEGORY_NETWORK, + "Could not initialize a config that already has SecurityPolicies"); + return UA_STATUSCODE_BADINTERNALERROR; } -#if !defined(UA_FREERTOS) - /* Get the peer name for logging */ - char remote_name[100]; - int res = getnameinfo((struct sockaddr*)remote, - sizeof(struct sockaddr_storage), - remote_name, sizeof(remote_name), - NULL, 0, NI_NUMERICHOST); - if(res == 0) { - UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK, - "Connection %i | New connection over TCP from %s", - (int)newsockfd, remote_name); - } else { - UA_LOG_SOCKET_ERRNO_WRAP(UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, - "Connection %i | New connection over TCP, " - "getnameinfo failed with error: %s", - (int)newsockfd, errno_str)); - } -#endif - /* Allocate and initialize the connection */ - ConnectionEntry *e = (ConnectionEntry*)UA_malloc(sizeof(ConnectionEntry)); - if(!e){ - CLOSESOCKET(newsockfd); + config->securityPolicies = (UA_SecurityPolicy*)UA_malloc(sizeof(UA_SecurityPolicy)); + if(!config->securityPolicies) return UA_STATUSCODE_BADOUTOFMEMORY; + UA_StatusCode retval = UA_SecurityPolicy_None(config->securityPolicies, NULL, + UA_BYTESTRING_NULL, &config->logger); + if(retval != UA_STATUSCODE_GOOD) { + UA_free(config->securityPolicies); + config->securityPolicies = NULL; + return retval; } + config->securityPoliciesSize = 1; - UA_Connection *c = &e->connection; - memset(c, 0, sizeof(UA_Connection)); - c->sockfd = newsockfd; - c->handle = layer; - c->localConf = layer->conf; - c->remoteConf = layer->conf; - c->send = connection_write; - c->close = ServerNetworkLayerTCP_close; - c->free = ServerNetworkLayerTCP_freeConnection; - c->getSendBuffer = connection_getsendbuffer; - c->releaseSendBuffer = connection_releasesendbuffer; - c->releaseRecvBuffer = connection_releaserecvbuffer; - c->state = UA_CONNECTION_OPENING; - c->openingDate = UA_DateTime_nowMonotonic(); + config->connectionFunc = UA_ClientConnectionTCP; + config->initConnectionFunc = UA_ClientConnectionTCP_init; /* for async client */ + config->pollConnectionFunc = UA_ClientConnectionTCP_poll_callback; /* for async connection */ - /* Add to the linked list */ - LIST_INSERT_HEAD(&layer->connections, e, pointers); - return UA_STATUSCODE_GOOD; -} + config->customDataTypes = NULL; + config->stateCallback = NULL; + config->connectivityCheckInterval = 0; -static void -addServerSocket(ServerNetworkLayerTCP *layer, struct addrinfo *ai) { - /* Create the server socket */ - SOCKET newsock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); -#ifdef _WIN32 - if(newsock == INVALID_SOCKET) -#else - if(newsock < 0) -#endif - { - UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, - "Error opening the server socket"); - return; - } + config->requestedSessionTimeout = 1200000; /* requestedSessionTimeout */ - /* Some Linux distributions have net.ipv6.bindv6only not activated. So - * sockets can double-bind to IPv4 and IPv6. This leads to problems. Use - * AF_INET6 sockets only for IPv6. */ + config->inactivityCallback = NULL; + config->clientContext = NULL; - int optval = 1; -#if !defined(UA_FREERTOS) - if(ai->ai_family == AF_INET6 && - setsockopt(newsock, IPPROTO_IPV6, IPV6_V6ONLY, - (const char*)&optval, sizeof(optval)) == -1) { - UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, - "Could not set an IPv6 socket to IPv6 only"); - CLOSESOCKET(newsock); - return; - } +#ifdef UA_ENABLE_SUBSCRIPTIONS + config->outStandingPublishRequests = 10; + config->subscriptionInactivityCallback = NULL; #endif - if(setsockopt(newsock, SOL_SOCKET, SO_REUSEADDR, - (const char *)&optval, sizeof(optval)) == -1) { - UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, - "Could not make the socket reusable"); - CLOSESOCKET(newsock); - return; - } + return UA_STATUSCODE_GOOD; +} - if(socket_set_nonblocking(newsock) != UA_STATUSCODE_GOOD) { - UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, - "Could not set the server socket to nonblocking"); - CLOSESOCKET(newsock); - return; - } +#ifdef UA_ENABLE_ENCRYPTION +UA_StatusCode +UA_ClientConfig_setDefaultEncryption(UA_ClientConfig *config, + UA_ByteString localCertificate, UA_ByteString privateKey, + const UA_ByteString *trustList, size_t trustListSize, + const UA_ByteString *revocationList, size_t revocationListSize) { + UA_StatusCode retval = UA_ClientConfig_setDefault(config); + if(retval != UA_STATUSCODE_GOOD) + return retval; - /* Bind socket to address */ - if(bind(newsock, ai->ai_addr, WIN32_INT ai->ai_addrlen) < 0) { - UA_LOG_SOCKET_ERRNO_WRAP( - UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, - "Error binding a server socket: %s", errno_str)); - CLOSESOCKET(newsock); - return; - } + retval = UA_CertificateVerification_Trustlist(&config->certificateVerification, + trustList, trustListSize, + NULL, 0, + revocationList, revocationListSize); + if(retval != UA_STATUSCODE_GOOD) + return retval; - /* Start listening */ - if(listen(newsock, MAXBACKLOG) < 0) { - UA_LOG_SOCKET_ERRNO_WRAP( - UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, - "Error listening on server socket: %s", errno_str)); - CLOSESOCKET(newsock); - return; - } + /* Populate SecurityPolicies */ + UA_SecurityPolicy *sp = (UA_SecurityPolicy*) + UA_realloc(config->securityPolicies, sizeof(UA_SecurityPolicy) * 4); + if(!sp) + return UA_STATUSCODE_BADOUTOFMEMORY; + config->securityPolicies = sp; - layer->serverSockets[layer->serverSocketsSize] = (UA_Int32)newsock; - layer->serverSocketsSize++; -} + retval = UA_SecurityPolicy_Basic128Rsa15(&config->securityPolicies[1], + &config->certificateVerification, + localCertificate, privateKey, &config->logger); + if(retval != UA_STATUSCODE_GOOD) + return retval; + ++config->securityPoliciesSize; -static UA_StatusCode -ServerNetworkLayerTCP_start(UA_ServerNetworkLayer *nl, const UA_String *customHostname) { -#ifdef _WIN32 - WORD wVersionRequested = MAKEWORD(2, 2); - WSADATA wsaData; - WSAStartup(wVersionRequested, &wsaData); -#endif + retval = UA_SecurityPolicy_Basic256(&config->securityPolicies[2], + &config->certificateVerification, + localCertificate, privateKey, &config->logger); + if(retval != UA_STATUSCODE_GOOD) + return retval; + ++config->securityPoliciesSize; - ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP *)nl->handle; + retval = UA_SecurityPolicy_Basic256Sha256(&config->securityPolicies[3], + &config->certificateVerification, + localCertificate, privateKey, &config->logger); + if(retval != UA_STATUSCODE_GOOD) + return retval; + ++config->securityPoliciesSize; - /* Get the discovery url from the hostname */ - UA_String du = UA_STRING_NULL; - if (customHostname->length) { - char discoveryUrl[256]; -#ifndef _MSC_VER - du.length = (size_t)snprintf(discoveryUrl, 255, "opc.tcp://%.*s:%d/", - (int)customHostname->length, - customHostname->data, - layer->port); -#else - du.length = (size_t)_snprintf_s(discoveryUrl, 255, _TRUNCATE, - "opc.tcp://%.*s:%d/", - (int)customHostname->length, - customHostname->data, - layer->port); -#endif - du.data = (UA_Byte*)discoveryUrl; - }else{ - char hostname[256]; - if(gethostname(hostname, 255) == 0) { - char discoveryUrl[256]; -#ifndef _MSC_VER - du.length = (size_t)snprintf(discoveryUrl, 255, "opc.tcp://%s:%d/", - hostname, layer->port); -#else - du.length = (size_t)_snprintf_s(discoveryUrl, 255, _TRUNCATE, - "opc.tcp://%s:%d/", hostname, - layer->port); + return UA_STATUSCODE_GOOD; +} #endif - du.data = (UA_Byte*)discoveryUrl; - } - } - UA_String_copy(&du, &nl->discoveryUrl); - /* Get addrinfo of the server and create server sockets */ - char portno[6]; -#ifndef _MSC_VER - snprintf(portno, 6, "%d", layer->port); -#else - _snprintf_s(portno, 6, _TRUNCATE, "%d", layer->port); -#endif - struct addrinfo hints, *res; - memset(&hints, 0, sizeof hints); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_PASSIVE; -#if defined(UA_FREERTOS) - hints.ai_protocol = IPPROTO_TCP; - char hostname[] = UA_FREERTOS_HOSTNAME; - if(getaddrinfo(hostname, portno, &hints, &res) != 0) -#else - if(getaddrinfo(NULL, portno, &hints, &res) != 0) -#endif - return UA_STATUSCODE_BADINTERNALERROR; +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/securityPolicies/ua_securitypolicy_none.c" ***********************************/ - /* There might be serveral addrinfos (for different network cards, - * IPv4/IPv6). Add a server socket for all of them. */ - struct addrinfo *ai = res; - for(layer->serverSocketsSize = 0; - layer->serverSocketsSize < FD_SETSIZE && ai != NULL; - ai = ai->ai_next) - addServerSocket(layer, ai); - freeaddrinfo(res); +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + */ - UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK, - "TCP network layer listening on %.*s", - (int)nl->discoveryUrl.length, nl->discoveryUrl.data); + +static UA_StatusCode +verify_none(const UA_SecurityPolicy *securityPolicy, + void *channelContext, + const UA_ByteString *message, + const UA_ByteString *signature) { return UA_STATUSCODE_GOOD; } -/* After every select, reset the sockets to listen on */ -static UA_Int32 -setFDSet(ServerNetworkLayerTCP *layer, fd_set *fdset) { - FD_ZERO(fdset); - UA_Int32 highestfd = 0; - for(UA_UInt16 i = 0; i < layer->serverSocketsSize; i++) { - UA_fd_set(layer->serverSockets[i], fdset); - if(layer->serverSockets[i] > highestfd) - highestfd = layer->serverSockets[i]; - } +static UA_StatusCode +sign_none(const UA_SecurityPolicy *securityPolicy, + void *channelContext, + const UA_ByteString *message, + UA_ByteString *signature) { + return UA_STATUSCODE_GOOD; +} - ConnectionEntry *e; - LIST_FOREACH(e, &layer->connections, pointers) { - UA_fd_set(e->connection.sockfd, fdset); - if(e->connection.sockfd > highestfd) - highestfd = e->connection.sockfd; - } +static size_t +length_none(const UA_SecurityPolicy *securityPolicy, + const void *channelContext) { + return 0; +} - return highestfd; +static UA_StatusCode +encrypt_none(const UA_SecurityPolicy *securityPolicy, + void *channelContext, + UA_ByteString *data) { + return UA_STATUSCODE_GOOD; } static UA_StatusCode -ServerNetworkLayerTCP_listen(UA_ServerNetworkLayer *nl, UA_Server *server, - UA_UInt16 timeout) { - /* Every open socket can generate two jobs */ - ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP *)nl->handle; +decrypt_none(const UA_SecurityPolicy *securityPolicy, + void *channelContext, + UA_ByteString *data) { + return UA_STATUSCODE_GOOD; +} - if (layer->serverSocketsSize == 0) - return UA_STATUSCODE_GOOD; +static UA_StatusCode +makeThumbprint_none(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *certificate, + UA_ByteString *thumbprint) { + return UA_STATUSCODE_GOOD; +} - /* Listen on open sockets (including the server) */ - fd_set fdset, errset; - UA_Int32 highestfd = setFDSet(layer, &fdset); - setFDSet(layer, &errset); - struct timeval tmptv = {0, timeout * 1000}; - if (select(highestfd+1, &fdset, NULL, &errset, &tmptv) < 0) { - UA_LOG_SOCKET_ERRNO_WRAP( - UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, - "Socket select failed with %s", errno_str)); - // we will retry, so do not return bad - return UA_STATUSCODE_GOOD; - } +static UA_StatusCode +compareThumbprint_none(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *certificateThumbprint) { + return UA_STATUSCODE_GOOD; +} - /* Accept new connections via the server sockets */ - for(UA_UInt16 i = 0; i < layer->serverSocketsSize; i++) { - if(!UA_fd_isset(layer->serverSockets[i], &fdset)) - continue; +static UA_StatusCode +generateKey_none(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *secret, + const UA_ByteString *seed, + UA_ByteString *out) { + return UA_STATUSCODE_GOOD; +} - struct sockaddr_storage remote; - socklen_t remote_size = sizeof(remote); - SOCKET newsockfd = accept((SOCKET)layer->serverSockets[i], - (struct sockaddr*)&remote, &remote_size); -#ifdef _WIN32 - if(newsockfd == INVALID_SOCKET) -#else - if(newsockfd < 0) -#endif - continue; +/* Use the non-cryptographic RNG to set the nonce */ +static UA_StatusCode +generateNonce_none(const UA_SecurityPolicy *securityPolicy, UA_ByteString *out) { + if(securityPolicy == NULL || out == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - UA_LOG_TRACE(layer->logger, UA_LOGCATEGORY_NETWORK, - "Connection %i | New TCP connection on server socket %i", - (int)newsockfd, layer->serverSockets[i]); + if(out->length == 0) + return UA_STATUSCODE_GOOD; - ServerNetworkLayerTCP_add(layer, (UA_Int32)newsockfd, &remote); + /* Fill blocks of four byte */ + size_t i = 0; + while(i + 3 < out->length) { + UA_UInt32 rand = UA_UInt32_random(); + memcpy(&out->data[i], &rand, 4); + i = i+4; } - /* Read from established sockets */ - ConnectionEntry *e, *e_tmp; - UA_DateTime now = UA_DateTime_nowMonotonic(); - LIST_FOREACH_SAFE(e, &layer->connections, pointers, e_tmp) { - if ((e->connection.state == UA_CONNECTION_OPENING) && - (now > (e->connection.openingDate + (NOHELLOTIMEOUT * UA_DATETIME_MSEC)))){ - UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK, - "Connection %i | Closed by the server (no Hello Message)", - e->connection.sockfd); - LIST_REMOVE(e, pointers); - CLOSESOCKET(e->connection.sockfd); - UA_Server_removeConnection(server, &e->connection); - continue; - } - - if(!UA_fd_isset(e->connection.sockfd, &errset) && - !UA_fd_isset(e->connection.sockfd, &fdset)) - continue; - - UA_LOG_TRACE(layer->logger, UA_LOGCATEGORY_NETWORK, - "Connection %i | Activity on the socket", - e->connection.sockfd); - - UA_ByteString buf = UA_BYTESTRING_NULL; - UA_StatusCode retval = connection_recv(&e->connection, &buf, 0); + /* Fill the remaining byte */ + UA_UInt32 rand = UA_UInt32_random(); + memcpy(&out->data[i], &rand, out->length % 4); - if(retval == UA_STATUSCODE_GOOD) { - /* Process packets */ - UA_Server_processBinaryMessage(server, &e->connection, &buf); - connection_releaserecvbuffer(&e->connection, &buf); - } else if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED) { - /* The socket is shutdown but not closed */ - UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK, - "Connection %i | Closed", - e->connection.sockfd); - LIST_REMOVE(e, pointers); - CLOSESOCKET(e->connection.sockfd); - UA_Server_removeConnection(server, &e->connection); - } - } return UA_STATUSCODE_GOOD; } -static void -ServerNetworkLayerTCP_stop(UA_ServerNetworkLayer *nl, UA_Server *server) { - ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP *)nl->handle; - UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK, - "Shutting down the TCP network layer"); - - /* Close the server sockets */ - for(UA_UInt16 i = 0; i < layer->serverSocketsSize; i++) { - shutdown((SOCKET)layer->serverSockets[i], 2); - CLOSESOCKET(layer->serverSockets[i]); - } - layer->serverSocketsSize = 0; - - /* Close open connections */ - ConnectionEntry *e; - LIST_FOREACH(e, &layer->connections, pointers) - ServerNetworkLayerTCP_close(&e->connection); - - /* Run recv on client sockets. This picks up the closed sockets and frees - * the connection. */ - ServerNetworkLayerTCP_listen(nl, server, 0); - -#ifdef _WIN32 - WSACleanup(); -#endif +static UA_StatusCode +newContext_none(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *remoteCertificate, + void **channelContext) { + return UA_STATUSCODE_GOOD; } -/* run only when the server is stopped */ static void -ServerNetworkLayerTCP_deleteMembers(UA_ServerNetworkLayer *nl) { - ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP *)nl->handle; - UA_String_deleteMembers(&nl->discoveryUrl); - - /* Hard-close and remove remaining connections. The server is no longer - * running. So this is safe. */ - ConnectionEntry *e, *e_tmp; - LIST_FOREACH_SAFE(e, &layer->connections, pointers, e_tmp) { - LIST_REMOVE(e, pointers); - CLOSESOCKET(e->connection.sockfd); - UA_free(e); - } - - /* Free the layer */ - UA_free(layer); +deleteContext_none(void *channelContext) { } -UA_ServerNetworkLayer -UA_ServerNetworkLayerTCP(UA_ConnectionConfig conf, UA_UInt16 port, UA_Logger logger) { - UA_ServerNetworkLayer nl; - memset(&nl, 0, sizeof(UA_ServerNetworkLayer)); - nl.start = ServerNetworkLayerTCP_start; - nl.listen = ServerNetworkLayerTCP_listen; - nl.stop = ServerNetworkLayerTCP_stop; - nl.deleteMembers = ServerNetworkLayerTCP_deleteMembers; - - ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP*) - UA_calloc(1,sizeof(ServerNetworkLayerTCP)); - if(!layer) - return nl; - nl.handle = layer; +static UA_StatusCode +setContextValue_none(void *channelContext, + const UA_ByteString *key) { + return UA_STATUSCODE_GOOD; +} - layer->logger = (logger != NULL ? logger : UA_Log_Stdout); - layer->conf = conf; - layer->port = port; +static UA_StatusCode +compareCertificate_none(const void *channelContext, + const UA_ByteString *certificate) { + return UA_STATUSCODE_GOOD; +} - return nl; +static UA_StatusCode +updateCertificateAndPrivateKey_none(UA_SecurityPolicy *policy, + const UA_ByteString newCertificate, + const UA_ByteString newPrivateKey) { + UA_ByteString_deleteMembers(&policy->localCertificate); + UA_ByteString_copy(&newCertificate, &policy->localCertificate); + return UA_STATUSCODE_GOOD; } -/***************************/ -/* Client NetworkLayer TCP */ -/***************************/ static void -ClientNetworkLayerTCP_close(UA_Connection *connection) { - if (connection->state == UA_CONNECTION_CLOSED) - return; - shutdown((SOCKET)connection->sockfd, 2); - CLOSESOCKET(connection->sockfd); - connection->state = UA_CONNECTION_CLOSED; +policy_deletemembers_none(UA_SecurityPolicy *policy) { + UA_ByteString_deleteMembers(&policy->localCertificate); } -UA_Connection -UA_ClientConnectionTCP(UA_ConnectionConfig conf, - const char *endpointUrl, const UA_UInt32 timeout, - UA_Logger logger) { -#ifdef _WIN32 - WORD wVersionRequested; - WSADATA wsaData; - wVersionRequested = MAKEWORD(2, 2); - WSAStartup(wVersionRequested, &wsaData); -#endif +UA_StatusCode +UA_SecurityPolicy_None(UA_SecurityPolicy *policy, + UA_CertificateVerification *certificateVerification, + const UA_ByteString localCertificate, const UA_Logger *logger) { + policy->policyContext = (void *)(uintptr_t)logger; + policy->policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None"); + policy->logger = logger; + UA_ByteString_copy(&localCertificate, &policy->localCertificate); - if(logger == NULL) { - logger = UA_Log_Stdout; - } + policy->certificateVerification = certificateVerification; - UA_Connection connection; - memset(&connection, 0, sizeof(UA_Connection)); - connection.state = UA_CONNECTION_CLOSED; - connection.localConf = conf; - connection.remoteConf = conf; - connection.send = connection_write; - connection.recv = connection_recv; - connection.close = ClientNetworkLayerTCP_close; - connection.free = NULL; - connection.getSendBuffer = connection_getsendbuffer; - connection.releaseSendBuffer = connection_releasesendbuffer; - connection.releaseRecvBuffer = connection_releaserecvbuffer; + policy->symmetricModule.generateKey = generateKey_none; + policy->symmetricModule.generateNonce = generateNonce_none; - UA_String endpointUrlString = UA_STRING((char*)(uintptr_t)endpointUrl); - UA_String hostnameString = UA_STRING_NULL; - UA_String pathString = UA_STRING_NULL; - UA_UInt16 port = 0; - char hostname[512]; + UA_SecurityPolicySignatureAlgorithm *sym_signatureAlgorithm = + &policy->symmetricModule.cryptoModule.signatureAlgorithm; + sym_signatureAlgorithm->uri = UA_STRING_NULL; + sym_signatureAlgorithm->verify = verify_none; + sym_signatureAlgorithm->sign = sign_none; + sym_signatureAlgorithm->getLocalSignatureSize = length_none; + sym_signatureAlgorithm->getRemoteSignatureSize = length_none; + sym_signatureAlgorithm->getLocalKeyLength = length_none; + sym_signatureAlgorithm->getRemoteKeyLength = length_none; - UA_StatusCode parse_retval = - UA_parseEndpointUrl(&endpointUrlString, &hostnameString, - &port, &pathString); - if(parse_retval != UA_STATUSCODE_GOOD || hostnameString.length > 511) { - UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, - "Server url is invalid: %s", endpointUrl); - return connection; - } - memcpy(hostname, hostnameString.data, hostnameString.length); - hostname[hostnameString.length] = 0; + UA_SecurityPolicyEncryptionAlgorithm *sym_encryptionAlgorithm = + &policy->symmetricModule.cryptoModule.encryptionAlgorithm; + sym_encryptionAlgorithm->uri = UA_STRING_NULL; + sym_encryptionAlgorithm->encrypt = encrypt_none; + sym_encryptionAlgorithm->decrypt = decrypt_none; + sym_encryptionAlgorithm->getLocalKeyLength = length_none; + sym_encryptionAlgorithm->getRemoteKeyLength = length_none; + sym_encryptionAlgorithm->getLocalBlockSize = length_none; + sym_encryptionAlgorithm->getRemoteBlockSize = length_none; + sym_encryptionAlgorithm->getLocalPlainTextBlockSize = length_none; + sym_encryptionAlgorithm->getRemotePlainTextBlockSize = length_none; + policy->symmetricModule.secureChannelNonceLength = 0; - if(port == 0) { - port = 4840; - UA_LOG_INFO(logger, UA_LOGCATEGORY_NETWORK, - "No port defined, using default port %d", port); - } + policy->asymmetricModule.makeCertificateThumbprint = makeThumbprint_none; + policy->asymmetricModule.compareCertificateThumbprint = compareThumbprint_none; - struct addrinfo hints, *server; - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; -#if defined(UA_FREERTOS) - hints.ai_protocol = IPPROTO_TCP; -#endif - char portStr[6]; -#ifndef _MSC_VER - snprintf(portStr, 6, "%d", port); -#else - _snprintf_s(portStr, 6, _TRUNCATE, "%d", port); -#endif - int error = getaddrinfo(hostname, portStr, &hints, &server); - if(error != 0 || !server) { -#if !defined(UA_FREERTOS) - UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, + // This only works for none since symmetric and asymmetric crypto modules do the same i.e. nothing + policy->asymmetricModule.cryptoModule = policy->symmetricModule.cryptoModule; + + // Use the same signing algorithm as for asymmetric signing + policy->certificateSigningAlgorithm = policy->asymmetricModule.cryptoModule.signatureAlgorithm; + + policy->channelModule.newContext = newContext_none; + policy->channelModule.deleteContext = deleteContext_none; + policy->channelModule.setLocalSymEncryptingKey = setContextValue_none; + policy->channelModule.setLocalSymSigningKey = setContextValue_none; + policy->channelModule.setLocalSymIv = setContextValue_none; + policy->channelModule.setRemoteSymEncryptingKey = setContextValue_none; + policy->channelModule.setRemoteSymSigningKey = setContextValue_none; + policy->channelModule.setRemoteSymIv = setContextValue_none; + policy->channelModule.compareCertificate = compareCertificate_none; + policy->updateCertificateAndPrivateKey = updateCertificateAndPrivateKey_none; + policy->deleteMembers = policy_deletemembers_none; - "DNS lookup of %s failed with error %s", - hostname, gai_strerror(error)); -#else - UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, - "DNS lookup of %s failed with error", - hostname); -#endif - return connection; - } + return UA_STATUSCODE_GOOD; +} - UA_Boolean connected = UA_FALSE; - UA_DateTime dtTimeout = timeout * UA_DATETIME_MSEC; - UA_DateTime connStart = UA_DateTime_nowMonotonic(); - SOCKET clientsockfd; +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/securityPolicies/securitypolicy_mbedtls_common.c" ***********************************/ - /* On linux connect may immediately return with ECONNREFUSED but we still - * want to try to connect. So use a loop and retry until timeout is - * reached. */ - do { - /* Get a socket */ - clientsockfd = socket(server->ai_family, - server->ai_socktype, - server->ai_protocol); - #ifdef _WIN32 - if(clientsockfd == INVALID_SOCKET) { - #else - if(clientsockfd < 0) { - #endif - UA_LOG_SOCKET_ERRNO_WRAP(UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, - "Could not create client socket: %s", errno_str)); - freeaddrinfo(server); - return connection; - } - connection.state = UA_CONNECTION_OPENING; +#ifdef UA_ENABLE_ENCRYPTION - /* Connect to the server */ - connection.sockfd = (UA_Int32) clientsockfd; /* cast for win32 */ - /* Non blocking connect to be able to timeout */ - if (socket_set_nonblocking(clientsockfd) != UA_STATUSCODE_GOOD) { - UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, - "Could not set the client socket to nonblocking"); - ClientNetworkLayerTCP_close(&connection); - freeaddrinfo(server); - return connection; - } +#include +#include +#include +#include +#include +#include +#include +#include +#include - /* Non blocking connect */ - error = connect(clientsockfd, server->ai_addr, WIN32_INT server->ai_addrlen); +void +swapBuffers(UA_ByteString *const bufA, UA_ByteString *const bufB) { + UA_ByteString tmp = *bufA; + *bufA = *bufB; + *bufB = tmp; +} - if ((error == -1) && (errno__ != ERR_CONNECTION_PROGRESS)) { - ClientNetworkLayerTCP_close(&connection); - UA_LOG_SOCKET_ERRNO_WRAP( - UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, - "Connection to %s failed with error: %s", - endpointUrl, errno_str)); - freeaddrinfo(server); - return connection; - } +void +mbedtls_hmac(mbedtls_md_context_t *context, const UA_ByteString *key, + const UA_ByteString *in, unsigned char *out) { + mbedtls_md_hmac_starts(context, key->data, key->length); + mbedtls_md_hmac_update(context, in->data, in->length); + mbedtls_md_hmac_finish(context, out); +} - /* Use select to wait and check if connected */ - if (error == -1 && (errno__ == ERR_CONNECTION_PROGRESS)) { - /* connection in progress. Wait until connected using select */ - UA_DateTime timeSinceStart = UA_DateTime_nowMonotonic() - connStart; - if(timeSinceStart > dtTimeout) - break; +UA_StatusCode +mbedtls_generateKey(mbedtls_md_context_t *context, + const UA_ByteString *secret, const UA_ByteString *seed, + UA_ByteString *out) { + size_t hashLen = (size_t)mbedtls_md_get_size(context->md_info); - fd_set fdset; - FD_ZERO(&fdset); - UA_fd_set(clientsockfd, &fdset); - UA_DateTime timeout_usec = (dtTimeout - timeSinceStart) / UA_DATETIME_USEC; - struct timeval tmptv = {(long int) (timeout_usec / 1000000), - (long int) (timeout_usec % 1000000)}; + UA_ByteString A_and_seed; + UA_ByteString_allocBuffer(&A_and_seed, hashLen + seed->length); + memcpy(A_and_seed.data + hashLen, seed->data, seed->length); - int resultsize = select((UA_Int32)(clientsockfd + 1), NULL, &fdset, NULL, &tmptv); + UA_ByteString ANext_and_seed; + UA_ByteString_allocBuffer(&ANext_and_seed, hashLen + seed->length); + memcpy(ANext_and_seed.data + hashLen, seed->data, seed->length); - if(resultsize == 1) { -#ifdef _WIN32 - /* Windows does not have any getsockopt equivalent and it is not - * needed there */ - connected = true; - break; -#else - OPTVAL_TYPE so_error; - socklen_t len = sizeof so_error; + UA_ByteString A = { + hashLen, + A_and_seed.data + }; - int ret = getsockopt(clientsockfd, SOL_SOCKET, SO_ERROR, &so_error, &len); + UA_ByteString ANext = { + hashLen, + ANext_and_seed.data + }; - if (ret != 0 || so_error != 0) { - /* on connection refused we should still try to connect */ - /* connection refused happens on localhost or local ip without timeout */ - if (so_error != ECONNREFUSED) { - ClientNetworkLayerTCP_close(&connection); - UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, - "Connection to %s failed with error: %s", - endpointUrl, strerror(ret == 0 ? so_error : errno__)); - freeaddrinfo(server); - return connection; - } - /* wait until we try a again. Do not make this too small, otherwise the - * timeout is somehow wrong */ - UA_sleep_ms(100); - } else { - connected = true; - break; - } -#endif + mbedtls_hmac(context, secret, seed, A.data); + + UA_StatusCode retval = 0; + for(size_t offset = 0; offset < out->length; offset += hashLen) { + UA_ByteString outSegment = { + hashLen, + out->data + offset + }; + UA_Boolean bufferAllocated = UA_FALSE; + // Not enough room in out buffer to write the hash. + if(offset + hashLen > out->length) { + outSegment.data = NULL; + outSegment.length = 0; + retval = UA_ByteString_allocBuffer(&outSegment, hashLen); + if(retval != UA_STATUSCODE_GOOD) { + UA_ByteString_deleteMembers(&A_and_seed); + UA_ByteString_deleteMembers(&ANext_and_seed); + return retval; } - } else { - connected = true; - break; + bufferAllocated = UA_TRUE; } - ClientNetworkLayerTCP_close(&connection); - - } while ((UA_DateTime_nowMonotonic() - connStart) < dtTimeout); - freeaddrinfo(server); + mbedtls_hmac(context, secret, &A_and_seed, outSegment.data); + mbedtls_hmac(context, secret, &A, ANext.data); - if(!connected) { - /* connection timeout */ - if (connection.state != UA_CONNECTION_CLOSED) - ClientNetworkLayerTCP_close(&connection); - UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, - "Trying to connect to %s timed out", - endpointUrl); - return connection; - } + if(retval != UA_STATUSCODE_GOOD) { + if(bufferAllocated) + UA_ByteString_deleteMembers(&outSegment); + UA_ByteString_deleteMembers(&A_and_seed); + UA_ByteString_deleteMembers(&ANext_and_seed); + return retval; + } + if(bufferAllocated) { + memcpy(out->data + offset, outSegment.data, out->length - offset); + UA_ByteString_deleteMembers(&outSegment); + } - /* We are connected. Reset socket to blocking */ - if(socket_set_blocking(clientsockfd) != UA_STATUSCODE_GOOD) { - UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, - "Could not set the client socket to blocking"); - ClientNetworkLayerTCP_close(&connection); - return connection; + swapBuffers(&ANext_and_seed, &A_and_seed); + swapBuffers(&ANext, &A); } -#ifdef SO_NOSIGPIPE - int val = 1; - int sso_result = setsockopt(connection.sockfd, SOL_SOCKET, - SO_NOSIGPIPE, (void*)&val, sizeof(val)); - if(sso_result < 0) - UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, - "Couldn't set SO_NOSIGPIPE"); -#endif - - return connection; + UA_ByteString_deleteMembers(&A_and_seed); + UA_ByteString_deleteMembers(&ANext_and_seed); + return UA_STATUSCODE_GOOD; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_clock.c" ***********************************/ +UA_StatusCode +mbedtls_verifySig_sha1(mbedtls_x509_crt *certificate, const UA_ByteString *message, + const UA_ByteString *signature) { + /* Compute the sha1 hash */ + unsigned char hash[UA_SHA1_LENGTH]; +#if MBEDTLS_VERSION_NUMBER >= 0x02070000 + mbedtls_sha1_ret(message->data, message->length, hash); +#else + mbedtls_sha1(message->data, message->length, hash); +#endif -/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. - * - * Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA - */ + /* Set the RSA settings */ + mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(certificate->pk); + if(!rsaContext) + return UA_STATUSCODE_BADINTERNALERROR; + mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, 0); -/* Enable POSIX features */ -#if !defined(_XOPEN_SOURCE) && !defined(_WRS_KERNEL) -# define _XOPEN_SOURCE 600 -#endif -#ifndef _DEFAULT_SOURCE -# define _DEFAULT_SOURCE -#endif -/* On older systems we need to define _BSD_SOURCE. - * _DEFAULT_SOURCE is an alias for that. */ -#ifndef _BSD_SOURCE -# define _BSD_SOURCE -#endif + /* Verify */ + int mbedErr = mbedtls_pk_verify(&certificate->pk, + MBEDTLS_MD_SHA1, hash, UA_SHA1_LENGTH, + signature->data, signature->length); + if(mbedErr) + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; + return UA_STATUSCODE_GOOD; +} -#include -#ifdef _WIN32 -/* Backup definition of SLIST_ENTRY on mingw winnt.h */ -# ifdef SLIST_ENTRY -# pragma push_macro("SLIST_ENTRY") -# undef SLIST_ENTRY -# define POP_SLIST_ENTRY -# endif -# include -/* restore definition */ -# ifdef POP_SLIST_ENTRY -# undef SLIST_ENTRY -# undef POP_SLIST_ENTRY -# pragma pop_macro("SLIST_ENTRY") -# endif +UA_StatusCode +mbedtls_sign_sha1(mbedtls_pk_context *localPrivateKey, + mbedtls_ctr_drbg_context *drbgContext, + const UA_ByteString *message, + UA_ByteString *signature) { + unsigned char hash[UA_SHA1_LENGTH]; +#if MBEDTLS_VERSION_NUMBER >= 0x02070000 + mbedtls_sha1_ret(message->data, message->length, hash); #else -# include + mbedtls_sha1(message->data, message->length, hash); #endif -#if defined(__APPLE__) || defined(__MACH__) -# include -# include -#endif + mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(*localPrivateKey); + mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, 0); + + size_t sigLen = 0; + int mbedErr = mbedtls_pk_sign(localPrivateKey, MBEDTLS_MD_SHA1, hash, + UA_SHA1_LENGTH, signature->data, &sigLen, + mbedtls_ctr_drbg_random, drbgContext); + if(mbedErr) + return UA_STATUSCODE_BADINTERNALERROR; + return UA_STATUSCODE_GOOD; +} +UA_StatusCode +mbedtls_thumbprint_sha1(const UA_ByteString *certificate, + UA_ByteString *thumbprint) { + if(UA_ByteString_equal(certificate, &UA_BYTESTRING_NULL)) + return UA_STATUSCODE_BADINTERNALERROR; -#if defined(UA_FREERTOS) -#include -#endif + if(thumbprint->length != UA_SHA1_LENGTH) + return UA_STATUSCODE_BADINTERNALERROR; -UA_DateTime UA_DateTime_now(void) { -#if defined(_WIN32) - /* Windows filetime has the same definition as UA_DateTime */ - FILETIME ft; - SYSTEMTIME st; - GetSystemTime(&st); - SystemTimeToFileTime(&st, &ft); - ULARGE_INTEGER ul; - ul.LowPart = ft.dwLowDateTime; - ul.HighPart = ft.dwHighDateTime; - return (UA_DateTime)ul.QuadPart; + /* The certificate thumbprint is always a 20 bit sha1 hash, see Part 4 of the Specification. */ +#if MBEDTLS_VERSION_NUMBER >= 0x02070000 + mbedtls_sha1_ret(certificate->data, certificate->length, thumbprint->data); #else - struct timeval tv; - gettimeofday(&tv, NULL); - return (tv.tv_sec * UA_DATETIME_SEC) + (tv.tv_usec * UA_DATETIME_USEC) + UA_DATETIME_UNIX_EPOCH; + mbedtls_sha1(certificate->data, certificate->length, thumbprint->data); #endif + return UA_STATUSCODE_GOOD; } -/* Credit to https://stackoverflow.com/questions/13804095/get-the-time-zone-gmt-offset-in-c */ -UA_Int64 UA_DateTime_localTimeUtcOffset(void) { - time_t gmt, rawtime = time(NULL); +UA_StatusCode +mbedtls_encrypt_rsaOaep(mbedtls_rsa_context *context, + mbedtls_ctr_drbg_context *drbgContext, + UA_ByteString *data, const size_t plainTextBlockSize) { + if(data->length % plainTextBlockSize != 0) + return UA_STATUSCODE_BADINTERNALERROR; -#ifdef _WIN32 - struct tm ptm; - gmtime_s(&ptm, &rawtime); - // Request that mktime() looksup dst in timezone database - ptm.tm_isdst = -1; - gmt = mktime(&ptm); -#else - struct tm *ptm; - struct tm gbuf; - ptm = gmtime_r(&rawtime, &gbuf); - // Request that mktime() looksup dst in timezone database - ptm->tm_isdst = -1; - gmt = mktime(ptm); -#endif + size_t max_blocks = data->length / plainTextBlockSize; - return (UA_Int64) (difftime(rawtime, gmt) * UA_DATETIME_SEC); -} + UA_ByteString encrypted; + UA_StatusCode retval = UA_ByteString_allocBuffer(&encrypted, max_blocks * context->len); + if(retval != UA_STATUSCODE_GOOD) + return retval; -UA_DateTime UA_DateTime_nowMonotonic(void) { -#if defined(_WIN32) - LARGE_INTEGER freq, ticks; - QueryPerformanceFrequency(&freq); - QueryPerformanceCounter(&ticks); - UA_Double ticks2dt = UA_DATETIME_SEC / (UA_Double)freq.QuadPart; - return (UA_DateTime)(ticks.QuadPart * ticks2dt); -#elif defined(__APPLE__) || defined(__MACH__) - /* OS X does not have clock_gettime, use clock_get_time */ - clock_serv_t cclock; - mach_timespec_t mts; - host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock); - clock_get_time(cclock, &mts); - mach_port_deallocate(mach_task_self(), cclock); - return (mts.tv_sec * UA_DATETIME_SEC) + (mts.tv_nsec / 100); -#elif !defined(CLOCK_MONOTONIC_RAW) -# if defined(UA_FREERTOS) - portTickType TaskTime = xTaskGetTickCount(); - UA_DateTimeStruct UATime; - UATime.milliSec = (UA_UInt16) TaskTime; - struct timespec ts; - ts.tv_sec = UATime.milliSec/1000; - ts.tv_nsec = (UATime.milliSec % 1000)* 1000000; - return (ts.tv_sec * UA_DATETIME_SEC) + (ts.tv_nsec / 100); -# else - struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); - return (ts.tv_sec * UA_DATETIME_SEC) + (ts.tv_nsec / 100); -# endif -#else - struct timespec ts; - clock_gettime(CLOCK_MONOTONIC_RAW, &ts); - return (ts.tv_sec * UA_DATETIME_SEC) + (ts.tv_nsec / 100); -#endif + size_t lenDataToEncrypt = data->length; + size_t inOffset = 0; + size_t offset = 0; + const unsigned char *label = NULL; + while(lenDataToEncrypt >= plainTextBlockSize) { + int mbedErr = mbedtls_rsa_rsaes_oaep_encrypt(context, mbedtls_ctr_drbg_random, + drbgContext, MBEDTLS_RSA_PUBLIC, + label, 0, plainTextBlockSize, + data->data + inOffset, encrypted.data + offset); + if(mbedErr) { + UA_ByteString_deleteMembers(&encrypted); + return UA_STATUSCODE_BADINTERNALERROR; + } + + inOffset += plainTextBlockSize; + offset += context->len; + lenDataToEncrypt -= plainTextBlockSize; + } + + memcpy(data->data, encrypted.data, offset); + UA_ByteString_deleteMembers(&encrypted); + return UA_STATUSCODE_GOOD; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_log_stdout.c" ***********************************/ +UA_StatusCode +mbedtls_decrypt_rsaOaep(mbedtls_pk_context *localPrivateKey, + mbedtls_ctr_drbg_context *drbgContext, + UA_ByteString *data) { + mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(*localPrivateKey); + mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA1); -/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. - * - * Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA - */ + if(data->length % rsaContext->len != 0) + return UA_STATUSCODE_BADINTERNALERROR; -#include + size_t inOffset = 0; + size_t outOffset = 0; + size_t outLength = 0; + unsigned char buf[512]; -/* ANSI escape sequences for color output taken from here: - * https://stackoverflow.com/questions/3219393/stdlib-and-colored-output-in-c*/ + while(inOffset < data->length) { + int mbedErr = mbedtls_rsa_rsaes_oaep_decrypt(rsaContext, mbedtls_ctr_drbg_random, + drbgContext, MBEDTLS_RSA_PRIVATE, + NULL, 0, &outLength, + data->data + inOffset, + buf, 512); + if(mbedErr) + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; -#ifdef _WIN32 -# define ANSI_COLOR_RED "" -# define ANSI_COLOR_GREEN "" -# define ANSI_COLOR_YELLOW "" -# define ANSI_COLOR_BLUE "" -# define ANSI_COLOR_MAGENTA "" -# define ANSI_COLOR_CYAN "" -# define ANSI_COLOR_RESET "" -#else -# define ANSI_COLOR_RED "\x1b[31m" -# define ANSI_COLOR_GREEN "\x1b[32m" -# define ANSI_COLOR_YELLOW "\x1b[33m" -# define ANSI_COLOR_BLUE "\x1b[34m" -# define ANSI_COLOR_MAGENTA "\x1b[35m" -# define ANSI_COLOR_CYAN "\x1b[36m" -# define ANSI_COLOR_RESET "\x1b[0m" -#endif + memcpy(data->data + outOffset, buf, outLength); + inOffset += rsaContext->len; + outOffset += outLength; + } + + data->length = outOffset; + return UA_STATUSCODE_GOOD; +} -#ifdef UA_ENABLE_MULTITHREADING -#include -static pthread_mutex_t printf_mutex = PTHREAD_MUTEX_INITIALIZER; #endif -const char *logLevelNames[6] = {"trace", "debug", - ANSI_COLOR_GREEN "info", - ANSI_COLOR_YELLOW "warn", - ANSI_COLOR_RED "error", - ANSI_COLOR_MAGENTA "fatal"}; -const char *logCategoryNames[7] = {"network", "channel", "session", "server", - "client", "userland", "securitypolicy"}; +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/securityPolicies/ua_securitypolicy_basic128rsa15.c" ***********************************/ -#ifdef __clang__ -__attribute__((__format__(__printf__, 3 , 0))) -#endif -void -UA_Log_Stdout(UA_LogLevel level, UA_LogCategory category, - const char *msg, va_list args) { - UA_Int64 tOffset = UA_DateTime_localTimeUtcOffset(); - UA_DateTimeStruct dts = UA_DateTime_toStruct(UA_DateTime_now() + tOffset); +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2018-2019 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2019 (c) Kalycito Infotech Private Limited + * + */ -#ifdef UA_ENABLE_MULTITHREADING - pthread_mutex_lock(&printf_mutex); -#endif - printf("[%04u-%02u-%02u %02u:%02u:%02u.%03u (UTC%+05d)] %s/%s" ANSI_COLOR_RESET "\t", - dts.year, dts.month, dts.day, dts.hour, dts.min, dts.sec, dts.milliSec, - (int)(tOffset / UA_DATETIME_SEC / 36), logLevelNames[level], logCategoryNames[category]); - vprintf(msg, args); - printf("\n"); - fflush(stdout); +#ifdef UA_ENABLE_ENCRYPTION -#ifdef UA_ENABLE_MULTITHREADING - pthread_mutex_unlock(&printf_mutex); -#endif -} -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_accesscontrol_default.c" ***********************************/ -/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. - * - * Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Notes: + * mbedTLS' AES allows in-place encryption and decryption. Sow we don't have to + * allocate temp buffers. + * https://tls.mbed.org/discussions/generic/in-place-decryption-with-aes256-same-input-output-buffer */ +#define UA_SECURITYPOLICY_BASIC128RSA15_RSAPADDING_LEN 11 +#define UA_SECURITYPOLICY_BASIC128RSA15_SYM_KEY_LENGTH 16 +#define UA_BASIC128RSA15_SYM_SIGNING_KEY_LENGTH 16 +#define UA_SECURITYPOLICY_BASIC128RSA15_SYM_ENCRYPTION_BLOCK_SIZE 16 +#define UA_SECURITYPOLICY_BASIC128RSA15_SYM_PLAIN_TEXT_BLOCK_SIZE 16 +#define UA_SECURITYPOLICY_BASIC128RSA15_MINASYMKEYLENGTH 128 +#define UA_SECURITYPOLICY_BASIC128RSA15_MAXASYMKEYLENGTH 512 -/* Example access control management. Anonymous and username / password login. - * The access rights are maximally permissive. */ +typedef struct { + const UA_SecurityPolicy *securityPolicy; + UA_ByteString localCertThumbprint; + + mbedtls_ctr_drbg_context drbgContext; + mbedtls_entropy_context entropyContext; + mbedtls_md_context_t sha1MdContext; + mbedtls_pk_context localPrivateKey; +} Basic128Rsa15_PolicyContext; typedef struct { - UA_Boolean allowAnonymous; - size_t usernamePasswordLoginSize; - UA_UsernamePasswordLogin *usernamePasswordLogin; -} AccessControlContext; + Basic128Rsa15_PolicyContext *policyContext; -#define ANONYMOUS_POLICY "open62541-anonymous-policy" -#define USERNAME_POLICY "open62541-username-policy" -const UA_String anonymous_policy = UA_STRING_STATIC(ANONYMOUS_POLICY); -const UA_String username_policy = UA_STRING_STATIC(USERNAME_POLICY); + UA_ByteString localSymSigningKey; + UA_ByteString localSymEncryptingKey; + UA_ByteString localSymIv; -/************************/ -/* Access Control Logic */ -/************************/ + UA_ByteString remoteSymSigningKey; + UA_ByteString remoteSymEncryptingKey; + UA_ByteString remoteSymIv; + + mbedtls_x509_crt remoteCertificate; +} Basic128Rsa15_ChannelContext; + +/********************/ +/* AsymmetricModule */ +/********************/ static UA_StatusCode -activateSession_default(UA_Server *server, UA_AccessControl *ac, - const UA_NodeId *sessionId, - const UA_ExtensionObject *userIdentityToken, - void **sessionContext) { - AccessControlContext *context = (AccessControlContext*)ac->context; +asym_verify_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + Basic128Rsa15_ChannelContext *cc, + const UA_ByteString *message, + const UA_ByteString *signature) { + if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - /* The empty token is interpreted as anonymous */ - if(userIdentityToken->encoding == UA_EXTENSIONOBJECT_ENCODED_NOBODY) { - if(!context->allowAnonymous) - return UA_STATUSCODE_BADIDENTITYTOKENINVALID; + return mbedtls_verifySig_sha1(&cc->remoteCertificate, message, signature); +} - /* No userdata atm */ - *sessionContext = NULL; - return UA_STATUSCODE_GOOD; - } +static UA_StatusCode +asym_sign_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + Basic128Rsa15_ChannelContext *cc, + const UA_ByteString *message, + UA_ByteString *signature) { + if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - /* Could the token be decoded? */ - if(userIdentityToken->encoding < UA_EXTENSIONOBJECT_DECODED) - return UA_STATUSCODE_BADIDENTITYTOKENINVALID; + Basic128Rsa15_PolicyContext *pc = cc->policyContext; + return mbedtls_sign_sha1(&pc->localPrivateKey, &pc->drbgContext, + message, signature); +} - /* Anonymous login */ - if(userIdentityToken->content.decoded.type == &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]) { - if(!context->allowAnonymous) - return UA_STATUSCODE_BADIDENTITYTOKENINVALID; +static size_t +asym_getLocalSignatureSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const Basic128Rsa15_ChannelContext *cc) { + if(securityPolicy == NULL || cc == NULL) + return 0; - const UA_AnonymousIdentityToken *token = (UA_AnonymousIdentityToken*) - userIdentityToken->content.decoded.data; + return mbedtls_pk_rsa(cc->policyContext->localPrivateKey)->len; +} - /* Compatibility notice: Siemens OPC Scout v10 provides an empty - * policyId. This is not compliant. For compatibility, assume that empty - * policyId == ANONYMOUS_POLICY */ - if(token->policyId.data && !UA_String_equal(&token->policyId, &anonymous_policy)) - return UA_STATUSCODE_BADIDENTITYTOKENINVALID; +static size_t +asym_getRemoteSignatureSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const Basic128Rsa15_ChannelContext *cc) { + if(securityPolicy == NULL || cc == NULL) + return 0; - /* No userdata atm */ - *sessionContext = NULL; - return UA_STATUSCODE_GOOD; - } + return mbedtls_pk_rsa(cc->remoteCertificate.pk)->len; +} - /* Username and password */ - if(userIdentityToken->content.decoded.type == &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]) { - const UA_UserNameIdentityToken *userToken = - (UA_UserNameIdentityToken*)userIdentityToken->content.decoded.data; +static UA_StatusCode +asym_encrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + Basic128Rsa15_ChannelContext *cc, + UA_ByteString *data) { + if(securityPolicy == NULL || cc == NULL || data == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - if(!UA_String_equal(&userToken->policyId, &username_policy)) - return UA_STATUSCODE_BADIDENTITYTOKENINVALID; + const size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. + getRemotePlainTextBlockSize(securityPolicy, cc); - /* TODO: Support encrypted username/password over unencrypted SecureChannels */ - if(userToken->encryptionAlgorithm.length > 0) - return UA_STATUSCODE_BADIDENTITYTOKENINVALID; + if(data->length % plainTextBlockSize != 0) + return UA_STATUSCODE_BADINTERNALERROR; - /* Empty username and password */ - if(userToken->userName.length == 0 && userToken->password.length == 0) - return UA_STATUSCODE_BADIDENTITYTOKENINVALID; + mbedtls_rsa_context *remoteRsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); + mbedtls_rsa_set_padding(remoteRsaContext, MBEDTLS_RSA_PKCS_V15, 0); - /* Try to match username/pw */ - UA_Boolean match = false; - for(size_t i = 0; i < context->usernamePasswordLoginSize; i++) { - if(UA_String_equal(&userToken->userName, &context->usernamePasswordLogin[i].username) && - UA_String_equal(&userToken->password, &context->usernamePasswordLogin[i].password)) { - match = true; - break; - } + UA_ByteString encrypted; + const size_t bufferOverhead = + UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(securityPolicy, cc, data->length); + UA_StatusCode retval = UA_ByteString_allocBuffer(&encrypted, data->length + bufferOverhead); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + size_t lenDataToEncrypt = data->length; + size_t inOffset = 0; + size_t offset = 0; + size_t outLength = 0; + Basic128Rsa15_PolicyContext *pc = cc->policyContext; + while(lenDataToEncrypt >= plainTextBlockSize) { + int mbedErr = mbedtls_pk_encrypt(&cc->remoteCertificate.pk, + data->data + inOffset, plainTextBlockSize, + encrypted.data + offset, &outLength, + encrypted.length - offset, + mbedtls_ctr_drbg_random, + &pc->drbgContext); + if(mbedErr) { + UA_ByteString_deleteMembers(&encrypted); + return UA_STATUSCODE_BADINTERNALERROR; } - if(!match) - return UA_STATUSCODE_BADUSERACCESSDENIED; - /* No userdata atm */ - *sessionContext = NULL; - return UA_STATUSCODE_GOOD; + inOffset += plainTextBlockSize; + offset += outLength; + lenDataToEncrypt -= plainTextBlockSize; } - /* Unsupported token type */ - return UA_STATUSCODE_BADIDENTITYTOKENINVALID; -} + memcpy(data->data, encrypted.data, offset); + UA_ByteString_deleteMembers(&encrypted); -static void -closeSession_default(UA_Server *server, UA_AccessControl *ac, - const UA_NodeId *sessionId, void *sessionContext) { - /* no context to clean up */ + return UA_STATUSCODE_GOOD; } -static UA_UInt32 -getUserRightsMask_default(UA_Server *server, UA_AccessControl *ac, - const UA_NodeId *sessionId, void *sessionContext, - const UA_NodeId *nodeId, void *nodeContext) { - return 0xFFFFFFFF; -} +static UA_StatusCode +asym_decrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + Basic128Rsa15_ChannelContext *cc, + UA_ByteString *data) { + if(securityPolicy == NULL || cc == NULL || data == NULL) + return UA_STATUSCODE_BADINTERNALERROR; -static UA_Byte -getUserAccessLevel_default(UA_Server *server, UA_AccessControl *ac, - const UA_NodeId *sessionId, void *sessionContext, - const UA_NodeId *nodeId, void *nodeContext) { - return 0xFF; -} + mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(cc->policyContext->localPrivateKey); + mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, 0); -static UA_Boolean -getUserExecutable_default(UA_Server *server, UA_AccessControl *ac, - const UA_NodeId *sessionId, void *sessionContext, - const UA_NodeId *methodId, void *methodContext) { - return true; -} + if(data->length % rsaContext->len != 0) + return UA_STATUSCODE_BADINTERNALERROR; -static UA_Boolean -getUserExecutableOnObject_default(UA_Server *server, UA_AccessControl *ac, - const UA_NodeId *sessionId, void *sessionContext, - const UA_NodeId *methodId, void *methodContext, - const UA_NodeId *objectId, void *objectContext) { - return true; -} + size_t inOffset = 0; + size_t outOffset = 0; + size_t outLength = 0; + unsigned char buf[512]; -static UA_Boolean -allowAddNode_default(UA_Server *server, UA_AccessControl *ac, - const UA_NodeId *sessionId, void *sessionContext, - const UA_AddNodesItem *item) { - return true; -} + while(inOffset < data->length) { + int mbedErr = mbedtls_pk_decrypt(&cc->policyContext->localPrivateKey, + data->data + inOffset, rsaContext->len, + buf, &outLength, 512, NULL, NULL); + if(mbedErr) + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; -static UA_Boolean -allowAddReference_default(UA_Server *server, UA_AccessControl *ac, - const UA_NodeId *sessionId, void *sessionContext, - const UA_AddReferencesItem *item) { - return true; -} + memcpy(data->data + outOffset, buf, outLength); + inOffset += rsaContext->len; + outOffset += outLength; + } -static UA_Boolean -allowDeleteNode_default(UA_Server *server, UA_AccessControl *ac, - const UA_NodeId *sessionId, void *sessionContext, - const UA_DeleteNodesItem *item) { - return true; + data->length = outOffset; + return UA_STATUSCODE_GOOD; } -static UA_Boolean -allowDeleteReference_default(UA_Server *server, UA_AccessControl *ac, - const UA_NodeId *sessionId, void *sessionContext, - const UA_DeleteReferencesItem *item) { - return true; +static size_t +asym_getLocalEncryptionKeyLength_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const Basic128Rsa15_ChannelContext *cc) { + return mbedtls_pk_get_len(&cc->policyContext->localPrivateKey) * 8; } -/***************************************/ -/* Create Delete Access Control Plugin */ -/***************************************/ - -static void deleteMembers_default(UA_AccessControl *ac) { - UA_Array_delete((void*)(uintptr_t)ac->userTokenPolicies, - ac->userTokenPoliciesSize, - &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); - - AccessControlContext *context = (AccessControlContext*)ac->context; - for(size_t i = 0; i < context->usernamePasswordLoginSize; i++) { - UA_String_deleteMembers(&context->usernamePasswordLogin[i].username); - UA_String_deleteMembers(&context->usernamePasswordLogin[i].password); - } - if(context->usernamePasswordLoginSize > 0) - UA_free(context->usernamePasswordLogin); - UA_free(ac->context); +static size_t +asym_getRemoteEncryptionKeyLength_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const Basic128Rsa15_ChannelContext *cc) { + return mbedtls_pk_get_len(&cc->remoteCertificate.pk) * 8; } -UA_AccessControl -UA_AccessControl_default(UA_Boolean allowAnonymous, size_t usernamePasswordLoginSize, - const UA_UsernamePasswordLogin *usernamePasswordLogin) { - AccessControlContext *context = (AccessControlContext*) - UA_malloc(sizeof(AccessControlContext)); - - UA_AccessControl ac; - memset(&ac, 0, sizeof(ac)); - ac.context = context; - ac.deleteMembers = deleteMembers_default; - ac.activateSession = activateSession_default; - ac.closeSession = closeSession_default; - ac.getUserRightsMask = getUserRightsMask_default; - ac.getUserAccessLevel = getUserAccessLevel_default; - ac.getUserExecutable = getUserExecutable_default; - ac.getUserExecutableOnObject = getUserExecutableOnObject_default; - ac.allowAddNode = allowAddNode_default; - ac.allowAddReference = allowAddReference_default; - ac.allowDeleteNode = allowDeleteNode_default; - ac.allowDeleteReference = allowDeleteReference_default; +static size_t +asym_getRemoteBlockSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const Basic128Rsa15_ChannelContext *cc) { + mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); + return rsaContext->len; +} - /* Allow anonymous? */ - context->allowAnonymous = allowAnonymous; +static size_t +asym_getRemotePlainTextBlockSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const Basic128Rsa15_ChannelContext *cc) { + mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); + return rsaContext->len - UA_SECURITYPOLICY_BASIC128RSA15_RSAPADDING_LEN; +} - /* Copy username/password to the access control plugin */ - if(usernamePasswordLoginSize > 0) { - context->usernamePasswordLogin = (UA_UsernamePasswordLogin*) - UA_malloc(usernamePasswordLoginSize * sizeof(UA_UsernamePasswordLogin)); - if(!context->usernamePasswordLogin) - return ac; - context->usernamePasswordLoginSize = usernamePasswordLoginSize; - for(size_t i = 0; i < usernamePasswordLoginSize; i++) { - UA_String_copy(&usernamePasswordLogin[i].username, &context->usernamePasswordLogin[i].username); - UA_String_copy(&usernamePasswordLogin[i].password, &context->usernamePasswordLogin[i].password); - } - } +static UA_StatusCode +asym_makeThumbprint_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *certificate, + UA_ByteString *thumbprint) { + if(securityPolicy == NULL || certificate == NULL || thumbprint == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + return mbedtls_thumbprint_sha1(certificate, thumbprint); +} - /* Set the allowed policies */ - size_t policies = 0; - if(allowAnonymous) - policies++; - if(usernamePasswordLoginSize > 0) - policies++; - ac.userTokenPoliciesSize = 0; - ac.userTokenPolicies = (UA_UserTokenPolicy *) - UA_Array_new(policies, &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); - if(!ac.userTokenPolicies) - return ac; - ac.userTokenPoliciesSize = policies; +static UA_StatusCode +asymmetricModule_compareCertificateThumbprint_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *certificateThumbprint) { + if(securityPolicy == NULL || certificateThumbprint == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - policies = 0; - if(allowAnonymous) { - ac.userTokenPolicies[policies].tokenType = UA_USERTOKENTYPE_ANONYMOUS; - ac.userTokenPolicies[policies].policyId = UA_STRING_ALLOC(ANONYMOUS_POLICY); - policies++; - } + Basic128Rsa15_PolicyContext *pc = (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext; + if(!UA_ByteString_equal(certificateThumbprint, &pc->localCertThumbprint)) + return UA_STATUSCODE_BADCERTIFICATEINVALID; - if(usernamePasswordLoginSize > 0) { - ac.userTokenPolicies[policies].tokenType = UA_USERTOKENTYPE_USERNAME; - ac.userTokenPolicies[policies].policyId = UA_STRING_ALLOC(USERNAME_POLICY); - /* No encryption of username/password supported at the moment */ - ac.userTokenPolicies[policies].securityPolicyUri = - UA_STRING_ALLOC("http://opcfoundation.org/UA/SecurityPolicy#None"); - } - return ac; + return UA_STATUSCODE_GOOD; } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_pki_certificate.c" ***********************************/ +/*******************/ +/* SymmetricModule */ +/*******************/ -/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. - * - * Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB - */ +static UA_StatusCode +sym_verify_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + Basic128Rsa15_ChannelContext *cc, + const UA_ByteString *message, + const UA_ByteString *signature) { + if(securityPolicy == NULL || cc == NULL || message == NULL || signature == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + /* Compute MAC */ + if(signature->length != UA_SHA1_LENGTH) { + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Signature size does not have the desired size defined by the security policy"); + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; + } -#ifdef UA_ENABLE_ENCRYPTION -#include -#include -#endif + Basic128Rsa15_PolicyContext *pc = + (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext; -/************/ -/* AllowAll */ -/************/ + unsigned char mac[UA_SHA1_LENGTH]; + mbedtls_hmac(&pc->sha1MdContext, &cc->remoteSymSigningKey, message, mac); -static UA_StatusCode -verifyCertificateAllowAll(void *verificationContext, - const UA_ByteString *certificate) { + /* Compare with Signature */ + if(!UA_constantTimeEqual(signature->data, mac, UA_SHA1_LENGTH)) + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; return UA_STATUSCODE_GOOD; } static UA_StatusCode -verifyApplicationURIAllowAll(void *verificationContext, - const UA_ByteString *certificate, - const UA_String *applicationURI) { +sym_sign_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const Basic128Rsa15_ChannelContext *cc, + const UA_ByteString *message, + UA_ByteString *signature) { + if(signature->length != UA_SHA1_LENGTH) + return UA_STATUSCODE_BADINTERNALERROR; + + mbedtls_hmac(&cc->policyContext->sha1MdContext, &cc->localSymSigningKey, + message, signature->data); return UA_STATUSCODE_GOOD; } -static void -deleteVerifyAllowAll(UA_CertificateVerification *cv) { +static size_t +sym_getSignatureSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const void *channelContext) { + return UA_SHA1_LENGTH; +} +static size_t +sym_getSigningKeyLength_sp_basic128rsa15(const UA_SecurityPolicy *const securityPolicy, + const void *const channelContext) { + return UA_BASIC128RSA15_SYM_SIGNING_KEY_LENGTH; } -void UA_CertificateVerification_AcceptAll(UA_CertificateVerification *cv) { - cv->verifyCertificate = verifyCertificateAllowAll; - cv->verifyApplicationURI = verifyApplicationURIAllowAll; - cv->deleteMembers = deleteVerifyAllowAll; +static size_t +sym_getEncryptionKeyLength_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const void *channelContext) { + return UA_SECURITYPOLICY_BASIC128RSA15_SYM_KEY_LENGTH; } -#ifdef UA_ENABLE_ENCRYPTION +static size_t +sym_getEncryptionBlockSize_sp_basic128rsa15(const UA_SecurityPolicy *const securityPolicy, + const void *const channelContext) { + return UA_SECURITYPOLICY_BASIC128RSA15_SYM_ENCRYPTION_BLOCK_SIZE; +} -typedef struct { - mbedtls_x509_crt certificateTrustList; - mbedtls_x509_crl certificateRevocationList; -} CertInfo; +static size_t +sym_getPlainTextBlockSize_sp_basic128rsa15(const UA_SecurityPolicy *const securityPolicy, + const void *const channelContext) { + return UA_SECURITYPOLICY_BASIC128RSA15_SYM_PLAIN_TEXT_BLOCK_SIZE; +} static UA_StatusCode -certificateVerification_verify(void *verificationContext, - const UA_ByteString *certificate) { - CertInfo *ci = (CertInfo*)verificationContext; - if(!ci) +sym_encrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const Basic128Rsa15_ChannelContext *cc, + UA_ByteString *data) { + if(securityPolicy == NULL || cc == NULL || data == NULL) return UA_STATUSCODE_BADINTERNALERROR; - /* Parse the certificate */ - mbedtls_x509_crt remoteCertificate; - mbedtls_x509_crt_init(&remoteCertificate); - int mbedErr = mbedtls_x509_crt_parse(&remoteCertificate, certificate->data, - certificate->length); - if(mbedErr) { - /* char errBuff[300]; */ - /* mbedtls_strerror(mbedErr, errBuff, 300); */ - /* UA_LOG_WARNING(data->policyContext->securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, */ - /* "Could not parse the remote certificate with error: %s", errBuff); */ - return UA_STATUSCODE_BADSECURITYCHECKSFAILED; - } + if(cc->localSymIv.length != + securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.getLocalBlockSize(securityPolicy, cc)) + return UA_STATUSCODE_BADINTERNALERROR; - /* Verify */ - mbedtls_x509_crt_profile crtProfile = { - MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA1) | MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256), - 0xFFFFFF, 0x000000, 128 * 8 // in bits - }; // TODO: remove magic numbers + size_t plainTextBlockSize = + securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.getLocalPlainTextBlockSize(securityPolicy, cc); - uint32_t flags = 0; - mbedErr = mbedtls_x509_crt_verify_with_profile(&remoteCertificate, - &ci->certificateTrustList, - &ci->certificateRevocationList, - &crtProfile, NULL, &flags, NULL, NULL); + if(data->length % plainTextBlockSize != 0) { + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Length of data to encrypt is not a multiple of the plain text block size." + "Padding might not have been calculated appropriately."); + return UA_STATUSCODE_BADINTERNALERROR; + } - // TODO: Extend verification - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(mbedErr) { - /* char buff[100]; */ - /* mbedtls_x509_crt_verify_info(buff, 100, "", flags); */ - /* UA_LOG_ERROR(channelContextData->policyContext->securityPolicy->logger, */ - /* UA_LOGCATEGORY_SECURITYPOLICY, */ - /* "Verifying the certificate failed with error: %s", buff); */ + /* Keylength in bits */ + unsigned int keylength = (unsigned int)(cc->localSymEncryptingKey.length * 8); + mbedtls_aes_context aesContext; + int mbedErr = mbedtls_aes_setkey_enc(&aesContext, cc->localSymEncryptingKey.data, keylength); + if(mbedErr) + return UA_STATUSCODE_BADINTERNALERROR; - if(flags & MBEDTLS_X509_BADCERT_NOT_TRUSTED) { - retval = UA_STATUSCODE_BADCERTIFICATEUNTRUSTED; - } else if (flags & MBEDTLS_X509_BADCERT_FUTURE || - flags & MBEDTLS_X509_BADCERT_EXPIRED) { - retval = UA_STATUSCODE_BADCERTIFICATETIMEINVALID; - } else if(flags & MBEDTLS_X509_BADCERT_REVOKED || - flags & MBEDTLS_X509_BADCRL_EXPIRED) { - retval = UA_STATUSCODE_BADCERTIFICATEREVOKED; - } else { - retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; - } - } + UA_ByteString ivCopy; + UA_StatusCode retval = UA_ByteString_copy(&cc->localSymIv, &ivCopy); + if(retval != UA_STATUSCODE_GOOD) + return retval; - mbedtls_x509_crt_free(&remoteCertificate); + mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_ENCRYPT, data->length, + ivCopy.data, data->data, data->data); + if(mbedErr) + retval = UA_STATUSCODE_BADINTERNALERROR; + UA_ByteString_deleteMembers(&ivCopy); return retval; } -/* Find binary substring. Taken and adjusted from - * http://tungchingkai.blogspot.com/2011/07/binary-strstr.html */ +static UA_StatusCode +sym_decrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const Basic128Rsa15_ChannelContext *cc, + UA_ByteString *data) { + if(securityPolicy == NULL || cc == NULL || data == NULL) + return UA_STATUSCODE_BADINTERNALERROR; -static const unsigned char * -bstrchr(const unsigned char *s, const unsigned char ch, size_t l) { - /* find first occurrence of c in char s[] for length l*/ - /* handle special case */ - if(l == 0) - return (NULL); + size_t encryptionBlockSize = securityPolicy->symmetricModule.cryptoModule. + encryptionAlgorithm.getRemoteBlockSize(securityPolicy, cc); - for(; *s != ch; ++s, --l) - if(l == 0) - return (NULL); - return s; + if(cc->remoteSymIv.length != encryptionBlockSize) + return UA_STATUSCODE_BADINTERNALERROR; + + if(data->length % encryptionBlockSize != 0) { + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Length of data to decrypt is not a multiple of the encryptingBlock size."); + return UA_STATUSCODE_BADINTERNALERROR; + } + + unsigned int keylength = (unsigned int)(cc->remoteSymEncryptingKey.length * 8); + mbedtls_aes_context aesContext; + int mbedErr = mbedtls_aes_setkey_dec(&aesContext, cc->remoteSymEncryptingKey.data, keylength); + if(mbedErr) + return UA_STATUSCODE_BADINTERNALERROR; + + UA_ByteString ivCopy; + UA_StatusCode retval = UA_ByteString_copy(&cc->remoteSymIv, &ivCopy); + if(retval != UA_STATUSCODE_GOOD) + return retval; + + mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_DECRYPT, data->length, + ivCopy.data, data->data, data->data); + if(mbedErr) + retval = UA_STATUSCODE_BADINTERNALERROR; + UA_ByteString_deleteMembers(&ivCopy); + return retval; } -static const unsigned char * -bstrstr(const unsigned char *s1, size_t l1, const unsigned char *s2, size_t l2) { - /* find first occurrence of s2[] in s1[] for length l1*/ - const unsigned char *ss1 = s1; - const unsigned char *ss2 = s2; - /* handle special case */ - if(l1 == 0) - return (NULL); - if(l2 == 0) - return s1; +static UA_StatusCode +sym_generateKey_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *secret, const UA_ByteString *seed, + UA_ByteString *out) { + if(securityPolicy == NULL || secret == NULL || seed == NULL || out == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - /* match prefix */ - for (; (s1 = bstrchr(s1, *s2, (uintptr_t)ss1-(uintptr_t)s1+(uintptr_t)l1)) != NULL && - (uintptr_t)ss1-(uintptr_t)s1+(uintptr_t)l1 != 0; ++s1) { + Basic128Rsa15_PolicyContext *pc = + (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext; - /* match rest of prefix */ - const unsigned char *sc1, *sc2; - for (sc1 = s1, sc2 = s2; ;) - if (++sc2 >= ss2+l2) - return s1; - else if (*++sc1 != *sc2) - break; - } - return NULL; + return mbedtls_generateKey(&pc->sha1MdContext, secret, seed, out); } static UA_StatusCode -certificateVerification_verifyApplicationURI(void *verificationContext, - const UA_ByteString *certificate, - const UA_String *applicationURI) { - CertInfo *ci = (CertInfo*)verificationContext; - if(!ci) +sym_generateNonce_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + UA_ByteString *out) { + if(securityPolicy == NULL || securityPolicy->policyContext == NULL || out == NULL) return UA_STATUSCODE_BADINTERNALERROR; - /* Parse the certificate */ - mbedtls_x509_crt remoteCertificate; - mbedtls_x509_crt_init(&remoteCertificate); - int mbedErr = mbedtls_x509_crt_parse(&remoteCertificate, certificate->data, - certificate->length); - if(mbedErr) - return UA_STATUSCODE_BADSECURITYCHECKSFAILED; + Basic128Rsa15_PolicyContext *pc = + (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext; - /* Poor man's ApplicationUri verification. mbedTLS does not parse all fields - * of the Alternative Subject Name. Instead test whether the URI-string is - * present in the v3_ext field in general. - * - * TODO: Improve parsing of the Alternative Subject Name */ - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(bstrstr(remoteCertificate.v3_ext.p, remoteCertificate.v3_ext.len, - applicationURI->data, applicationURI->length) == NULL) - retval = UA_STATUSCODE_BADCERTIFICATEURIINVALID; + int mbedErr = mbedtls_ctr_drbg_random(&pc->drbgContext, out->data, out->length); + if(mbedErr) + return UA_STATUSCODE_BADUNEXPECTEDERROR; - mbedtls_x509_crt_free(&remoteCertificate); - return retval; + return UA_STATUSCODE_GOOD; } -static void -certificateVerification_deleteMembers(UA_CertificateVerification *cv) { - CertInfo *ci = (CertInfo*)cv->context; - if(!ci) - return; - mbedtls_x509_crt_free(&ci->certificateTrustList); - mbedtls_x509_crl_free(&ci->certificateRevocationList); - UA_free(ci); - cv->context = NULL; -} +/*****************/ +/* ChannelModule */ +/*****************/ -UA_StatusCode -UA_CertificateVerification_Trustlist(UA_CertificateVerification *cv, - const UA_ByteString *certificateTrustList, - size_t certificateTrustListSize, - const UA_ByteString *certificateRevocationList, - size_t certificateRevocationListSize) { - CertInfo *ci = (CertInfo*)malloc(sizeof(CertInfo)); - if(!ci) - return UA_STATUSCODE_BADOUTOFMEMORY; - mbedtls_x509_crt_init(&ci->certificateTrustList); - mbedtls_x509_crl_init(&ci->certificateRevocationList); +/* Assumes that the certificate has been verified externally */ +static UA_StatusCode +parseRemoteCertificate_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, + const UA_ByteString *remoteCertificate) { + if(remoteCertificate == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - cv->context = (void*)ci; - if(certificateTrustListSize > 0) - cv->verifyCertificate = certificateVerification_verify; - else - cv->verifyCertificate = verifyCertificateAllowAll; - cv->deleteMembers = certificateVerification_deleteMembers; - cv->verifyApplicationURI = certificateVerification_verifyApplicationURI; + /* Parse the certificate */ + int mbedErr = mbedtls_x509_crt_parse(&cc->remoteCertificate, remoteCertificate->data, + remoteCertificate->length); + if(mbedErr) + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; - int err = 0; - for(size_t i = 0; i < certificateTrustListSize; i++) { - err |= mbedtls_x509_crt_parse(&ci->certificateTrustList, - certificateTrustList[i].data, - certificateTrustList[i].length); - } - for(size_t i = 0; i < certificateRevocationListSize; i++) { - err |= mbedtls_x509_crl_parse(&ci->certificateRevocationList, - certificateRevocationList[i].data, - certificateRevocationList[i].length); - } + /* Check the key length */ + mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); + if(rsaContext->len < UA_SECURITYPOLICY_BASIC128RSA15_MINASYMKEYLENGTH || + rsaContext->len > UA_SECURITYPOLICY_BASIC128RSA15_MAXASYMKEYLENGTH) + return UA_STATUSCODE_BADCERTIFICATEUSENOTALLOWED; - if(err) { - certificateVerification_deleteMembers(cv); - return UA_STATUSCODE_BADINTERNALERROR; - } return UA_STATUSCODE_GOOD; } -#endif - -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_nodestore_default.c" ***********************************/ - -/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. - * - * Copyright 2017 (c) Julian Grothoff - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - */ +static void +channelContext_deleteContext_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc) { + UA_ByteString_deleteMembers(&cc->localSymSigningKey); + UA_ByteString_deleteMembers(&cc->localSymEncryptingKey); + UA_ByteString_deleteMembers(&cc->localSymIv); + UA_ByteString_deleteMembers(&cc->remoteSymSigningKey); + UA_ByteString_deleteMembers(&cc->remoteSymEncryptingKey); + UA_ByteString_deleteMembers(&cc->remoteSymIv); -/* container_of */ -#define container_of(ptr, type, member) \ - (type *)((uintptr_t)ptr - offsetof(type,member)) + mbedtls_x509_crt_free(&cc->remoteCertificate); -#ifdef UA_ENABLE_MULTITHREADING -#include -#define BEGIN_CRITSECT(NODEMAP) pthread_mutex_lock(&(NODEMAP)->mutex) -#define END_CRITSECT(NODEMAP) pthread_mutex_unlock(&(NODEMAP)->mutex) -#else -#define BEGIN_CRITSECT(NODEMAP) -#define END_CRITSECT(NODEMAP) -#endif + UA_free(cc); +} -/* The default Nodestore is simply a hash-map from NodeIds to Nodes. To find an - * entry, iterate over candidate positions according to the NodeId hash. - * - * - Tombstone or non-matching NodeId: continue searching - * - Matching NodeId: Return the entry - * - NULL: Abort the search */ +static UA_StatusCode +channelContext_newContext_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *remoteCertificate, + void **pp_contextData) { + if(securityPolicy == NULL || remoteCertificate == NULL || pp_contextData == NULL) + return UA_STATUSCODE_BADINTERNALERROR; -typedef struct UA_NodeMapEntry { - struct UA_NodeMapEntry *orig; /* the version this is a copy from (or NULL) */ - UA_UInt16 refCount; /* How many consumers have a reference to the node? */ - UA_Boolean deleted; /* Node was marked as deleted and can be deleted when refCount == 0 */ - UA_Node node; -} UA_NodeMapEntry; + /* Allocate the channel context */ + *pp_contextData = UA_malloc(sizeof(Basic128Rsa15_ChannelContext)); + if(*pp_contextData == NULL) + return UA_STATUSCODE_BADOUTOFMEMORY; -#define UA_NODEMAP_MINSIZE 64 -#define UA_NODEMAP_TOMBSTONE ((UA_NodeMapEntry*)0x01) + Basic128Rsa15_ChannelContext *cc = (Basic128Rsa15_ChannelContext *)*pp_contextData; -typedef struct { - UA_NodeMapEntry **entries; - UA_UInt32 size; - UA_UInt32 count; - UA_UInt32 sizePrimeIndex; -#ifdef UA_ENABLE_MULTITHREADING - pthread_mutex_t mutex; /* Protect access */ -#endif -} UA_NodeMap; + /* Initialize the channel context */ + cc->policyContext = (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext; -/*********************/ -/* HashMap Utilities */ -/*********************/ + UA_ByteString_init(&cc->localSymSigningKey); + UA_ByteString_init(&cc->localSymEncryptingKey); + UA_ByteString_init(&cc->localSymIv); -/* The size of the hash-map is always a prime number. They are chosen to be - * close to the next power of 2. So the size ca. doubles with each prime. */ -static UA_UInt32 const primes[] = { - 7, 13, 31, 61, 127, 251, - 509, 1021, 2039, 4093, 8191, 16381, - 32749, 65521, 131071, 262139, 524287, 1048573, - 2097143, 4194301, 8388593, 16777213, 33554393, 67108859, - 134217689, 268435399, 536870909, 1073741789, 2147483647, 4294967291 -}; + UA_ByteString_init(&cc->remoteSymSigningKey); + UA_ByteString_init(&cc->remoteSymEncryptingKey); + UA_ByteString_init(&cc->remoteSymIv); -static UA_UInt32 mod(UA_UInt32 h, UA_UInt32 size) { return h % size; } -static UA_UInt32 mod2(UA_UInt32 h, UA_UInt32 size) { return 1 + (h % (size - 2)); } + mbedtls_x509_crt_init(&cc->remoteCertificate); -static UA_UInt16 -higher_prime_index(UA_UInt32 n) { - UA_UInt16 low = 0; - UA_UInt16 high = (UA_UInt16)(sizeof(primes) / sizeof(UA_UInt32)); - while(low != high) { - UA_UInt16 mid = (UA_UInt16)(low + ((high - low) / 2)); - if(n > primes[mid]) - low = (UA_UInt16)(mid + 1); - else - high = mid; + // TODO: this can be optimized so that we dont allocate memory before parsing the certificate + UA_StatusCode retval = parseRemoteCertificate_sp_basic128rsa15(cc, remoteCertificate); + if(retval != UA_STATUSCODE_GOOD) { + channelContext_deleteContext_sp_basic128rsa15(cc); + *pp_contextData = NULL; } - return low; + return retval; } -/* returns an empty slot or null if the nodeid exists or if no empty slot is found. */ -static UA_NodeMapEntry ** -findFreeSlot(const UA_NodeMap *ns, const UA_NodeId *nodeid) { - UA_NodeMapEntry **retval = NULL; - UA_UInt32 h = UA_NodeId_hash(nodeid); - UA_UInt32 size = ns->size; - UA_UInt64 idx = mod(h, size); // use 64 bit container to avoid overflow - UA_UInt32 startIdx = (UA_UInt32)idx; - UA_UInt32 hash2 = mod2(h, size); - UA_NodeMapEntry *entry = NULL; +static UA_StatusCode +channelContext_setLocalSymEncryptingKey_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, + const UA_ByteString *key) { + if(key == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - do { - entry = ns->entries[(UA_UInt32)idx]; - if(entry > UA_NODEMAP_TOMBSTONE && - UA_NodeId_equal(&entry->node.nodeId, nodeid)) - return NULL; - if(!retval && entry <= UA_NODEMAP_TOMBSTONE) - retval = &ns->entries[(UA_UInt32)idx]; - idx += hash2; - if(idx >= size) - idx -= size; - } while((UA_UInt32)idx != startIdx && entry); - - /* NULL is returned if there is no free slot (idx == startIdx). - * Otherwise the first free slot is returned after we are sure, - * that the node id cannot be found in the used hashmap (!entry). */ - return retval; + UA_ByteString_deleteMembers(&cc->localSymEncryptingKey); + return UA_ByteString_copy(key, &cc->localSymEncryptingKey); } -/* The occupancy of the table after the call will be about 50% */ static UA_StatusCode -expand(UA_NodeMap *ns) { - UA_UInt32 osize = ns->size; - UA_UInt32 count = ns->count; - /* Resize only when table after removal of unused elements is either too - full or too empty */ - if(count * 2 < osize && (count * 8 > osize || osize <= UA_NODEMAP_MINSIZE)) - return UA_STATUSCODE_GOOD; - - UA_NodeMapEntry **oentries = ns->entries; - UA_UInt32 nindex = higher_prime_index(count * 2); - UA_UInt32 nsize = primes[nindex]; - UA_NodeMapEntry **nentries = (UA_NodeMapEntry **)UA_calloc(nsize, sizeof(UA_NodeMapEntry*)); - if(!nentries) - return UA_STATUSCODE_BADOUTOFMEMORY; +channelContext_setLocalSymSigningKey_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, + const UA_ByteString *key) { + if(key == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - ns->entries = nentries; - ns->size = nsize; - ns->sizePrimeIndex = nindex; + UA_ByteString_deleteMembers(&cc->localSymSigningKey); + return UA_ByteString_copy(key, &cc->localSymSigningKey); +} - /* recompute the position of every entry and insert the pointer */ - for(size_t i = 0, j = 0; i < osize && j < count; ++i) { - if(oentries[i] <= UA_NODEMAP_TOMBSTONE) - continue; - UA_NodeMapEntry **e = findFreeSlot(ns, &oentries[i]->node.nodeId); - UA_assert(e); - *e = oentries[i]; - ++j; - } - UA_free(oentries); - return UA_STATUSCODE_GOOD; -} +static UA_StatusCode +channelContext_setLocalSymIv_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, + const UA_ByteString *iv) { + if(iv == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; -static UA_NodeMapEntry * -newEntry(UA_NodeClass nodeClass) { - size_t size = sizeof(UA_NodeMapEntry) - sizeof(UA_Node); - switch(nodeClass) { - case UA_NODECLASS_OBJECT: - size += sizeof(UA_ObjectNode); - break; - case UA_NODECLASS_VARIABLE: - size += sizeof(UA_VariableNode); - break; - case UA_NODECLASS_METHOD: - size += sizeof(UA_MethodNode); - break; - case UA_NODECLASS_OBJECTTYPE: - size += sizeof(UA_ObjectTypeNode); - break; - case UA_NODECLASS_VARIABLETYPE: - size += sizeof(UA_VariableTypeNode); - break; - case UA_NODECLASS_REFERENCETYPE: - size += sizeof(UA_ReferenceTypeNode); - break; - case UA_NODECLASS_DATATYPE: - size += sizeof(UA_DataTypeNode); - break; - case UA_NODECLASS_VIEW: - size += sizeof(UA_ViewNode); - break; - default: - return NULL; - } - UA_NodeMapEntry *entry = (UA_NodeMapEntry*)UA_calloc(1, size); - if(!entry) - return NULL; - entry->node.nodeClass = nodeClass; - return entry; + UA_ByteString_deleteMembers(&cc->localSymIv); + return UA_ByteString_copy(iv, &cc->localSymIv); } -static void -deleteEntry(UA_NodeMapEntry *entry) { - UA_Node_deleteMembers(&entry->node); - UA_free(entry); -} +static UA_StatusCode +channelContext_setRemoteSymEncryptingKey_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, + const UA_ByteString *key) { + if(key == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; -static void -cleanupEntry(UA_NodeMapEntry *entry) { - if(entry->deleted && entry->refCount == 0) - deleteEntry(entry); + UA_ByteString_deleteMembers(&cc->remoteSymEncryptingKey); + return UA_ByteString_copy(key, &cc->remoteSymEncryptingKey); } static UA_StatusCode -clearSlot(UA_NodeMap *ns, UA_NodeMapEntry **slot) { - (*slot)->deleted = true; - cleanupEntry(*slot); - *slot = UA_NODEMAP_TOMBSTONE; - --ns->count; - /* Downsize the hashmap if it is very empty */ - if(ns->count * 8 < ns->size && ns->size > 32) - expand(ns); /* Can fail. Just continue with the bigger hashmap. */ - return UA_STATUSCODE_GOOD; +channelContext_setRemoteSymSigningKey_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, + const UA_ByteString *key) { + if(key == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + + UA_ByteString_deleteMembers(&cc->remoteSymSigningKey); + return UA_ByteString_copy(key, &cc->remoteSymSigningKey); } -static UA_NodeMapEntry ** -findOccupiedSlot(const UA_NodeMap *ns, const UA_NodeId *nodeid) { - UA_UInt32 h = UA_NodeId_hash(nodeid); - UA_UInt32 size = ns->size; - UA_UInt64 idx = mod(h, size); // use 64 bit container to avoid overflow - UA_UInt32 hash2 = mod2(h, size); - UA_UInt32 startIdx = (UA_UInt32)idx; - UA_NodeMapEntry *entry = NULL; +static UA_StatusCode +channelContext_setRemoteSymIv_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, + const UA_ByteString *iv) { + if(iv == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - do { - entry = ns->entries[(UA_UInt32)idx]; - if(entry > UA_NODEMAP_TOMBSTONE && - UA_NodeId_equal(&entry->node.nodeId, nodeid)) - return &ns->entries[(UA_UInt32)idx]; - idx += hash2; - if(idx >= size) - idx -= size; - } while((UA_UInt32)idx != startIdx && entry); - - /* NULL is returned if there is no free slot (idx == startIdx) - * and the node id is not found or if the end of the used slots (!entry) - * is reached. */ - return NULL; + UA_ByteString_deleteMembers(&cc->remoteSymIv); + return UA_ByteString_copy(iv, &cc->remoteSymIv); } -/***********************/ -/* Interface functions */ -/***********************/ +static UA_StatusCode +channelContext_compareCertificate_sp_basic128rsa15(const Basic128Rsa15_ChannelContext *cc, + const UA_ByteString *certificate) { + if(cc == NULL || certificate == NULL) + return UA_STATUSCODE_BADINTERNALERROR; -static UA_Node * -UA_NodeMap_newNode(void *context, UA_NodeClass nodeClass) { - UA_NodeMapEntry *entry = newEntry(nodeClass); - if(!entry) - return NULL; - return &entry->node; -} + mbedtls_x509_crt cert; + mbedtls_x509_crt_init(&cert); + int mbedErr = mbedtls_x509_crt_parse(&cert, certificate->data, certificate->length); + if(mbedErr) + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; -static void -UA_NodeMap_deleteNode(void *context, UA_Node *node) { -#ifdef UA_ENABLE_MULTITHREADING - UA_NodeMap *ns = (UA_NodeMap*)context; -#endif - BEGIN_CRITSECT(ns); - UA_NodeMapEntry *entry = container_of(node, UA_NodeMapEntry, node); - UA_assert(&entry->node == node); - deleteEntry(entry); - END_CRITSECT(ns); -} + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(cert.raw.len != cc->remoteCertificate.raw.len || + memcmp(cert.raw.p, cc->remoteCertificate.raw.p, cert.raw.len) != 0) + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; -static const UA_Node * -UA_NodeMap_getNode(void *context, const UA_NodeId *nodeid) { - UA_NodeMap *ns = (UA_NodeMap*)context; - BEGIN_CRITSECT(ns); - UA_NodeMapEntry **entry = findOccupiedSlot(ns, nodeid); - if(!entry) { - END_CRITSECT(ns); - return NULL; - } - ++(*entry)->refCount; - END_CRITSECT(ns); - return (const UA_Node*)&(*entry)->node; + mbedtls_x509_crt_free(&cert); + return retval; } static void -UA_NodeMap_releaseNode(void *context, const UA_Node *node) { - if (!node) +deleteMembers_sp_basic128rsa15(UA_SecurityPolicy *securityPolicy) { + if(securityPolicy == NULL) return; -#ifdef UA_ENABLE_MULTITHREADING - UA_NodeMap *ns = (UA_NodeMap*)context; -#endif - BEGIN_CRITSECT(ns); - UA_NodeMapEntry *entry = container_of(node, UA_NodeMapEntry, node); - UA_assert(&entry->node == node); - UA_assert(entry->refCount > 0); - --entry->refCount; - cleanupEntry(entry); - END_CRITSECT(ns); -} -static UA_StatusCode -UA_NodeMap_getNodeCopy(void *context, const UA_NodeId *nodeid, - UA_Node **outNode) { - UA_NodeMap *ns = (UA_NodeMap*)context; - BEGIN_CRITSECT(ns); - UA_NodeMapEntry **slot = findOccupiedSlot(ns, nodeid); - if(!slot) { - END_CRITSECT(ns); - return UA_STATUSCODE_BADNODEIDUNKNOWN; - } - UA_NodeMapEntry *entry = *slot; - UA_NodeMapEntry *newItem = newEntry(entry->node.nodeClass); - if(!newItem) { - END_CRITSECT(ns); - return UA_STATUSCODE_BADOUTOFMEMORY; - } - UA_StatusCode retval = UA_Node_copy(&entry->node, &newItem->node); - if(retval == UA_STATUSCODE_GOOD) { - newItem->orig = entry; // store the pointer to the original - *outNode = &newItem->node; - } else { - deleteEntry(newItem); - } - END_CRITSECT(ns); - return retval; -} + if(securityPolicy->policyContext == NULL) + return; -static UA_StatusCode -UA_NodeMap_removeNode(void *context, const UA_NodeId *nodeid) { - UA_NodeMap *ns = (UA_NodeMap*)context; - BEGIN_CRITSECT(ns); - UA_NodeMapEntry **slot = findOccupiedSlot(ns, nodeid); - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(slot) - retval = clearSlot(ns, slot); - else - retval = UA_STATUSCODE_BADNODEIDUNKNOWN; - END_CRITSECT(ns); - return retval; + UA_ByteString_deleteMembers(&securityPolicy->localCertificate); + + /* delete all allocated members in the context */ + Basic128Rsa15_PolicyContext *pc = (Basic128Rsa15_PolicyContext *) + securityPolicy->policyContext; + + mbedtls_ctr_drbg_free(&pc->drbgContext); + mbedtls_entropy_free(&pc->entropyContext); + mbedtls_pk_free(&pc->localPrivateKey); + mbedtls_md_free(&pc->sha1MdContext); + UA_ByteString_deleteMembers(&pc->localCertThumbprint); + + UA_LOG_DEBUG(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Deleted members of EndpointContext for sp_basic128rsa15"); + + UA_free(pc); + securityPolicy->policyContext = NULL; } static UA_StatusCode -UA_NodeMap_insertNode(void *context, UA_Node *node, - UA_NodeId *addedNodeId) { - UA_NodeMap *ns = (UA_NodeMap*)context; - BEGIN_CRITSECT(ns); - if(ns->size * 3 <= ns->count * 4) { - if(expand(ns) != UA_STATUSCODE_GOOD) { - END_CRITSECT(ns); - return UA_STATUSCODE_BADINTERNALERROR; - } - } +updateCertificateAndPrivateKey_sp_basic128rsa15(UA_SecurityPolicy *securityPolicy, + const UA_ByteString newCertificate, + const UA_ByteString newPrivateKey) { + if(securityPolicy == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - UA_NodeMapEntry **slot; - if(node->nodeId.identifierType == UA_NODEIDTYPE_NUMERIC && - node->nodeId.identifier.numeric == 0) { - /* create a random nodeid */ - /* start at least with 50,000 to make sure we don not conflict with nodes from the spec */ - /* if we find a conflict, we just try another identifier until we have tried all possible identifiers */ - /* since the size is prime and we don't change the increase val, we will reach the starting id again */ - /* E.g. adding a nodeset will create children while there are still other nodes which need to be created */ - /* Thus the node ids may collide */ - UA_UInt32 size = ns->size; - UA_UInt64 identifier = mod(50000 + size+1, size); // start value, use 64 bit container to avoid overflow - UA_UInt32 increase = mod2(ns->count+1, size); - UA_UInt32 startId = (UA_UInt32)identifier; // mod ensures us that the id is a valid 32 bit + if(securityPolicy->policyContext == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - do { - node->nodeId.identifier.numeric = (UA_UInt32)identifier; - slot = findFreeSlot(ns, &node->nodeId); - if(slot) - break; - identifier += increase; - if(identifier >= size) - identifier -= size; - } while((UA_UInt32)identifier != startId); - - if (!slot) { - END_CRITSECT(ns); - return UA_STATUSCODE_BADOUTOFMEMORY; - } - } else { - slot = findFreeSlot(ns, &node->nodeId); - if(!slot) { - deleteEntry(container_of(node, UA_NodeMapEntry, node)); - END_CRITSECT(ns); - return UA_STATUSCODE_BADNODEIDEXISTS; - } - } + Basic128Rsa15_PolicyContext *pc = (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext; - *slot = container_of(node, UA_NodeMapEntry, node); - ++ns->count; - UA_assert(&(*slot)->node == node); + UA_ByteString_deleteMembers(&securityPolicy->localCertificate); - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(addedNodeId) { - retval = UA_NodeId_copy(&node->nodeId, addedNodeId); - if(retval != UA_STATUSCODE_GOOD) - clearSlot(ns, slot); + UA_StatusCode retval = UA_ByteString_allocBuffer(&securityPolicy->localCertificate, newCertificate.length + 1); + if(retval != UA_STATUSCODE_GOOD) + return retval; + memcpy(securityPolicy->localCertificate.data, newCertificate.data, newCertificate.length); + securityPolicy->localCertificate.data[newCertificate.length] = '\0'; + securityPolicy->localCertificate.length--; + + /* Set the new private key */ + mbedtls_pk_free(&pc->localPrivateKey); + mbedtls_pk_init(&pc->localPrivateKey); + int mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey, + newPrivateKey.data, newPrivateKey.length, + NULL, 0); + if(mbedErr) { + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; + goto error; } - END_CRITSECT(ns); + retval = asym_makeThumbprint_sp_basic128rsa15(pc->securityPolicy, + &securityPolicy->localCertificate, + &pc->localCertThumbprint); + if(retval != UA_STATUSCODE_GOOD) + goto error; + + return retval; + + error: + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Could not update certificate and private key"); + if(securityPolicy->policyContext != NULL) + deleteMembers_sp_basic128rsa15(securityPolicy); return retval; } static UA_StatusCode -UA_NodeMap_replaceNode(void *context, UA_Node *node) { - UA_NodeMap *ns = (UA_NodeMap*)context; - BEGIN_CRITSECT(ns); - UA_NodeMapEntry **slot = findOccupiedSlot(ns, &node->nodeId); - if(!slot) { - END_CRITSECT(ns); - return UA_STATUSCODE_BADNODEIDUNKNOWN; - } - UA_NodeMapEntry *newEntryContainer = container_of(node, UA_NodeMapEntry, node); - if(*slot != newEntryContainer->orig) { - /* The node was updated since the copy was made */ - deleteEntry(newEntryContainer); - END_CRITSECT(ns); +policyContext_newContext_sp_basic128rsa15(UA_SecurityPolicy *securityPolicy, + const UA_ByteString localPrivateKey) { + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(securityPolicy == NULL) return UA_STATUSCODE_BADINTERNALERROR; - } - (*slot)->deleted = true; - cleanupEntry(*slot); - *slot = newEntryContainer; - END_CRITSECT(ns); - return UA_STATUSCODE_GOOD; -} - -static void -UA_NodeMap_iterate(void *context, void *visitorContext, - UA_NodestoreVisitor visitor) { - UA_NodeMap *ns = (UA_NodeMap*)context; - BEGIN_CRITSECT(ns); - for(UA_UInt32 i = 0; i < ns->size; ++i) { - if(ns->entries[i] > UA_NODEMAP_TOMBSTONE) { - END_CRITSECT(ns); - UA_NodeMapEntry *entry = ns->entries[i]; - entry->refCount++; - visitor(visitorContext, &entry->node); - entry->refCount--; - cleanupEntry(entry); - BEGIN_CRITSECT(ns); - } - } - END_CRITSECT(ns); -} -static void -UA_NodeMap_delete(void *context) { - UA_NodeMap *ns = (UA_NodeMap*)context; -#ifdef UA_ENABLE_MULTITHREADING - pthread_mutex_destroy(&ns->mutex); -#endif - UA_UInt32 size = ns->size; - UA_NodeMapEntry **entries = ns->entries; - for(UA_UInt32 i = 0; i < size; ++i) { - if(entries[i] > UA_NODEMAP_TOMBSTONE) { - /* On debugging builds, check that all nodes were release */ - UA_assert(entries[i]->refCount == 0); - /* Delete the node */ - deleteEntry(entries[i]); - } + if (localPrivateKey.length == 0) { + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Can not initialize security policy. Private key is empty."); + return UA_STATUSCODE_BADINVALIDARGUMENT; } - UA_free(ns->entries); - UA_free(ns); -} -UA_StatusCode -UA_Nodestore_default_new(UA_Nodestore *ns) { - /* Allocate and initialize the nodemap */ - UA_NodeMap *nodemap = (UA_NodeMap*)UA_malloc(sizeof(UA_NodeMap)); - if(!nodemap) - return UA_STATUSCODE_BADOUTOFMEMORY; - nodemap->sizePrimeIndex = higher_prime_index(UA_NODEMAP_MINSIZE); - nodemap->size = primes[nodemap->sizePrimeIndex]; - nodemap->count = 0; - nodemap->entries = (UA_NodeMapEntry**) - UA_calloc(nodemap->size, sizeof(UA_NodeMapEntry*)); - if(!nodemap->entries) { - UA_free(nodemap); - return UA_STATUSCODE_BADOUTOFMEMORY; + Basic128Rsa15_PolicyContext *pc = (Basic128Rsa15_PolicyContext *) + UA_malloc(sizeof(Basic128Rsa15_PolicyContext)); + securityPolicy->policyContext = (void *)pc; + if(!pc) { + retval = UA_STATUSCODE_BADOUTOFMEMORY; + goto error; } -#ifdef UA_ENABLE_MULTITHREADING - pthread_mutex_init(&nodemap->mutex, NULL); -#endif - /* Populate the nodestore */ - ns->context = nodemap; - ns->deleteNodestore = UA_NodeMap_delete; - ns->inPlaceEditAllowed = true; - ns->newNode = UA_NodeMap_newNode; - ns->deleteNode = UA_NodeMap_deleteNode; - ns->getNode = UA_NodeMap_getNode; - ns->releaseNode = UA_NodeMap_releaseNode; - ns->getNodeCopy = UA_NodeMap_getNodeCopy; - ns->insertNode = UA_NodeMap_insertNode; - ns->replaceNode = UA_NodeMap_replaceNode; - ns->removeNode = UA_NodeMap_removeNode; - ns->iterate = UA_NodeMap_iterate; - - return UA_STATUSCODE_GOOD; -} + /* Initialize the PolicyContext */ + memset(pc, 0, sizeof(Basic128Rsa15_PolicyContext)); + mbedtls_ctr_drbg_init(&pc->drbgContext); + mbedtls_entropy_init(&pc->entropyContext); + mbedtls_pk_init(&pc->localPrivateKey); + mbedtls_md_init(&pc->sha1MdContext); + pc->securityPolicy = securityPolicy; -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_config_default.c" ***********************************/ + /* Initialized the message digest */ + const mbedtls_md_info_t *const mdInfo = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1); + int mbedErr = mbedtls_md_setup(&pc->sha1MdContext, mdInfo, MBEDTLS_MD_SHA1); + if(mbedErr) { + retval = UA_STATUSCODE_BADOUTOFMEMORY; + goto error; + } -/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. - * - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2017 (c) Julian Grothoff - * Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA - * Copyright 2018 (c) Daniel Feist, Precitec GmbH & Co. KG - */ + /* Add the system entropy source */ + mbedErr = mbedtls_entropy_add_source(&pc->entropyContext, + mbedtls_platform_entropy_poll, NULL, 0, + MBEDTLS_ENTROPY_SOURCE_STRONG); + if(mbedErr) { + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; + goto error; + } + /* Seed the RNG */ + char *personalization = "open62541-drbg"; + mbedErr = mbedtls_ctr_drbg_seed(&pc->drbgContext, mbedtls_entropy_func, + &pc->entropyContext, + (const unsigned char *)personalization, 14); + if(mbedErr) { + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; + goto error; + } -#ifdef UA_ENABLE_ENCRYPTION -#endif + /* Set the private key */ + mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey, + localPrivateKey.data, localPrivateKey.length, + NULL, 0); + if(mbedErr) { + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; + goto error; + } + /* Set the local certificate thumbprint */ + retval = UA_ByteString_allocBuffer(&pc->localCertThumbprint, UA_SHA1_LENGTH); + if(retval != UA_STATUSCODE_GOOD) + goto error; + retval = asym_makeThumbprint_sp_basic128rsa15(pc->securityPolicy, + &securityPolicy->localCertificate, + &pc->localCertThumbprint); + if(retval != UA_STATUSCODE_GOOD) + goto error; -/* Struct initialization works across ANSI C/C99/C++ if it is done when the - * variable is first declared. Assigning values to existing structs is - * heterogeneous across the three. */ -static UA_INLINE UA_UInt32Range -UA_UINT32RANGE(UA_UInt32 min, UA_UInt32 max) { - UA_UInt32Range range = {min, max}; - return range; -} + return UA_STATUSCODE_GOOD; -static UA_INLINE UA_DurationRange -UA_DURATIONRANGE(UA_Duration min, UA_Duration max) { - UA_DurationRange range = {min, max}; - return range; +error: + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Could not create securityContext: %s", UA_StatusCode_name(retval)); + if(securityPolicy->policyContext != NULL) + deleteMembers_sp_basic128rsa15(securityPolicy); + return retval; } -/*******************************/ -/* Default Connection Settings */ -/*******************************/ - -const UA_ConnectionConfig UA_ConnectionConfig_default = { - 0, /* .protocolVersion */ - 65535, /* .sendBufferSize, 64k per chunk */ - 65535, /* .recvBufferSize, 64k per chunk */ - 0, /* .maxMessageSize, 0 -> unlimited */ - 0 /* .maxChunkCount, 0 -> unlimited */ -}; +UA_StatusCode +UA_SecurityPolicy_Basic128Rsa15(UA_SecurityPolicy *policy, + UA_CertificateVerification *certificateVerification, + const UA_ByteString localCertificate, + const UA_ByteString localPrivateKey, const UA_Logger *logger) { + memset(policy, 0, sizeof(UA_SecurityPolicy)); + policy->logger = logger; -/***************************/ -/* Default Server Settings */ -/***************************/ + policy->policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15"); -#define MANUFACTURER_NAME "open62541" -#define PRODUCT_NAME "open62541 OPC UA Server" -#define PRODUCT_URI "http://open62541.org" -#define APPLICATION_NAME "open62541-based OPC UA Application" -#define APPLICATION_URI "urn:unconfigured:application" + UA_SecurityPolicyAsymmetricModule *const asymmetricModule = &policy->asymmetricModule; + UA_SecurityPolicySymmetricModule *const symmetricModule = &policy->symmetricModule; + UA_SecurityPolicyChannelModule *const channelModule = &policy->channelModule; -#define STRINGIFY(arg) #arg -#define VERSION(MAJOR, MINOR, PATCH, LABEL) \ - STRINGIFY(MAJOR) "." STRINGIFY(MINOR) "." STRINGIFY(PATCH) LABEL + /* Copy the certificate and add a NULL to the end */ + UA_StatusCode retval = + UA_ByteString_allocBuffer(&policy->localCertificate, localCertificate.length + 1); + if(retval != UA_STATUSCODE_GOOD) + return retval; + memcpy(policy->localCertificate.data, localCertificate.data, localCertificate.length); + policy->localCertificate.data[localCertificate.length] = '\0'; + policy->localCertificate.length--; + policy->certificateVerification = certificateVerification; -static UA_StatusCode -createSecurityPolicyNoneEndpoint(UA_ServerConfig *conf, UA_Endpoint *endpoint, - const UA_ByteString localCertificate) { - UA_EndpointDescription_init(&endpoint->endpointDescription); + /* AsymmetricModule */ + UA_SecurityPolicySignatureAlgorithm *asym_signatureAlgorithm = + &asymmetricModule->cryptoModule.signatureAlgorithm; + asym_signatureAlgorithm->uri = + UA_STRING("http://www.w3.org/2000/09/xmldsig#rsa-sha1\0"); + asym_signatureAlgorithm->verify = + (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, + const UA_ByteString *, const UA_ByteString *))asym_verify_sp_basic128rsa15; + asym_signatureAlgorithm->sign = + (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, + const UA_ByteString *, UA_ByteString *))asym_sign_sp_basic128rsa15; + asym_signatureAlgorithm->getLocalSignatureSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getLocalSignatureSize_sp_basic128rsa15; + asym_signatureAlgorithm->getRemoteSignatureSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteSignatureSize_sp_basic128rsa15; + asym_signatureAlgorithm->getLocalKeyLength = NULL; // TODO: Write function + asym_signatureAlgorithm->getRemoteKeyLength = NULL; // TODO: Write function - UA_SecurityPolicy_None(&endpoint->securityPolicy, NULL, localCertificate, conf->logger); - endpoint->endpointDescription.securityMode = UA_MESSAGESECURITYMODE_NONE; - endpoint->endpointDescription.securityPolicyUri = - UA_STRING_ALLOC("http://opcfoundation.org/UA/SecurityPolicy#None"); - endpoint->endpointDescription.transportProfileUri = - UA_STRING_ALLOC("http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary"); + UA_SecurityPolicyEncryptionAlgorithm *asym_encryptionAlgorithm = + &asymmetricModule->cryptoModule.encryptionAlgorithm; + asym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#rsa-1_5"); + asym_encryptionAlgorithm->encrypt = + (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))asym_encrypt_sp_basic128rsa15; + asym_encryptionAlgorithm->decrypt = + (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *)) + asym_decrypt_sp_basic128rsa15; + asym_encryptionAlgorithm->getLocalKeyLength = + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getLocalEncryptionKeyLength_sp_basic128rsa15; + asym_encryptionAlgorithm->getRemoteKeyLength = + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteEncryptionKeyLength_sp_basic128rsa15; + asym_encryptionAlgorithm->getLocalBlockSize = NULL; // TODO: Write function + asym_encryptionAlgorithm->getRemoteBlockSize = (size_t (*)(const UA_SecurityPolicy *, + const void *))asym_getRemoteBlockSize_sp_basic128rsa15; + asym_encryptionAlgorithm->getLocalPlainTextBlockSize = NULL; // TODO: Write function + asym_encryptionAlgorithm->getRemotePlainTextBlockSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemotePlainTextBlockSize_sp_basic128rsa15; - /* Enable all login mechanisms from the access control plugin */ - UA_StatusCode retval = UA_Array_copy(conf->accessControl.userTokenPolicies, - conf->accessControl.userTokenPoliciesSize, - (void **)&endpoint->endpointDescription.userIdentityTokens, - &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); - if(retval != UA_STATUSCODE_GOOD) - return retval; - endpoint->endpointDescription.userIdentityTokensSize = - conf->accessControl.userTokenPoliciesSize; + asymmetricModule->makeCertificateThumbprint = asym_makeThumbprint_sp_basic128rsa15; + asymmetricModule->compareCertificateThumbprint = + asymmetricModule_compareCertificateThumbprint_sp_basic128rsa15; - UA_String_copy(&localCertificate, &endpoint->endpointDescription.serverCertificate); - UA_ApplicationDescription_copy(&conf->applicationDescription, - &endpoint->endpointDescription.server); + /* SymmetricModule */ + symmetricModule->generateKey = sym_generateKey_sp_basic128rsa15; + symmetricModule->generateNonce = sym_generateNonce_sp_basic128rsa15; - return UA_STATUSCODE_GOOD; -} + UA_SecurityPolicySignatureAlgorithm *sym_signatureAlgorithm = + &symmetricModule->cryptoModule.signatureAlgorithm; + sym_signatureAlgorithm->uri = + UA_STRING("http://www.w3.org/2000/09/xmldsig#hmac-sha1\0"); + sym_signatureAlgorithm->verify = + (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, const UA_ByteString *, + const UA_ByteString *))sym_verify_sp_basic128rsa15; + sym_signatureAlgorithm->sign = + (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, + const UA_ByteString *, UA_ByteString *))sym_sign_sp_basic128rsa15; + sym_signatureAlgorithm->getLocalSignatureSize = sym_getSignatureSize_sp_basic128rsa15; + sym_signatureAlgorithm->getRemoteSignatureSize = sym_getSignatureSize_sp_basic128rsa15; + sym_signatureAlgorithm->getLocalKeyLength = + (size_t (*)(const UA_SecurityPolicy *, + const void *))sym_getSigningKeyLength_sp_basic128rsa15; + sym_signatureAlgorithm->getRemoteKeyLength = + (size_t (*)(const UA_SecurityPolicy *, + const void *))sym_getSigningKeyLength_sp_basic128rsa15; -void -UA_ServerConfig_set_customHostname(UA_ServerConfig *config, const UA_String customHostname) { - if(!config) - return; - UA_String_deleteMembers(&config->customHostname); - UA_String_copy(&customHostname, &config->customHostname); -} + UA_SecurityPolicyEncryptionAlgorithm *sym_encryptionAlgorithm = + &symmetricModule->cryptoModule.encryptionAlgorithm; + sym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#aes128-cbc"); + sym_encryptionAlgorithm->encrypt = + (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_encrypt_sp_basic128rsa15; + sym_encryptionAlgorithm->decrypt = + (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_decrypt_sp_basic128rsa15; + sym_encryptionAlgorithm->getLocalKeyLength = sym_getEncryptionKeyLength_sp_basic128rsa15; + sym_encryptionAlgorithm->getRemoteKeyLength = sym_getEncryptionKeyLength_sp_basic128rsa15; + sym_encryptionAlgorithm->getLocalBlockSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic128rsa15; + sym_encryptionAlgorithm->getRemoteBlockSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic128rsa15; + sym_encryptionAlgorithm->getLocalPlainTextBlockSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic128rsa15; + sym_encryptionAlgorithm->getRemotePlainTextBlockSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic128rsa15; + symmetricModule->secureChannelNonceLength = 16; -#ifdef UA_ENABLE_ENCRYPTION + // Use the same signature algorithm as the asymmetric component for certificate signing (see standard) + policy->certificateSigningAlgorithm = policy->asymmetricModule.cryptoModule.signatureAlgorithm; -static UA_StatusCode -createSecurityPolicyBasic128Rsa15Endpoint(UA_ServerConfig *const conf, - UA_Endpoint *endpoint, - UA_MessageSecurityMode securityMode, - const UA_ByteString localCertificate, - const UA_ByteString localPrivateKey) { - UA_EndpointDescription_init(&endpoint->endpointDescription); + /* ChannelModule */ + channelModule->newContext = channelContext_newContext_sp_basic128rsa15; + channelModule->deleteContext = (void (*)(void *)) + channelContext_deleteContext_sp_basic128rsa15; - UA_StatusCode retval = - UA_SecurityPolicy_Basic128Rsa15(&endpoint->securityPolicy, &conf->certificateVerification, - localCertificate, localPrivateKey, conf->logger); - if(retval != UA_STATUSCODE_GOOD) { - endpoint->securityPolicy.deleteMembers(&endpoint->securityPolicy); - return retval; - } + channelModule->setLocalSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) + channelContext_setLocalSymEncryptingKey_sp_basic128rsa15; + channelModule->setLocalSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) + channelContext_setLocalSymSigningKey_sp_basic128rsa15; + channelModule->setLocalSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *)) + channelContext_setLocalSymIv_sp_basic128rsa15; - endpoint->endpointDescription.securityMode = securityMode; - endpoint->endpointDescription.securityPolicyUri = - UA_STRING_ALLOC("http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15"); - endpoint->endpointDescription.transportProfileUri = - UA_STRING_ALLOC("http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary"); + channelModule->setRemoteSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) + channelContext_setRemoteSymEncryptingKey_sp_basic128rsa15; + channelModule->setRemoteSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) + channelContext_setRemoteSymSigningKey_sp_basic128rsa15; + channelModule->setRemoteSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *)) + channelContext_setRemoteSymIv_sp_basic128rsa15; - /* Enable all login mechanisms from the access control plugin */ - retval = UA_Array_copy(conf->accessControl.userTokenPolicies, - conf->accessControl.userTokenPoliciesSize, - (void **)&endpoint->endpointDescription.userIdentityTokens, - &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); - if(retval != UA_STATUSCODE_GOOD) - return retval; - endpoint->endpointDescription.userIdentityTokensSize = - conf->accessControl.userTokenPoliciesSize; + channelModule->compareCertificate = (UA_StatusCode (*)(const void *, const UA_ByteString *)) + channelContext_compareCertificate_sp_basic128rsa15; - UA_String_copy(&localCertificate, &endpoint->endpointDescription.serverCertificate); - UA_ApplicationDescription_copy(&conf->applicationDescription, - &endpoint->endpointDescription.server); + policy->updateCertificateAndPrivateKey = updateCertificateAndPrivateKey_sp_basic128rsa15; + policy->deleteMembers = deleteMembers_sp_basic128rsa15; - return UA_STATUSCODE_GOOD; + return policyContext_newContext_sp_basic128rsa15(policy, localPrivateKey); } -static UA_StatusCode -createSecurityPolicyBasic256Sha256Endpoint(UA_ServerConfig *const conf, - UA_Endpoint *endpoint, - UA_MessageSecurityMode securityMode, - const UA_ByteString localCertificate, - const UA_ByteString localPrivateKey) { - UA_EndpointDescription_init(&endpoint->endpointDescription); +#endif - UA_StatusCode retval = - UA_SecurityPolicy_Basic256Sha256(&endpoint->securityPolicy, &conf->certificateVerification, localCertificate, - localPrivateKey, conf->logger); - if(retval != UA_STATUSCODE_GOOD) { - endpoint->securityPolicy.deleteMembers(&endpoint->securityPolicy); - return retval; - } +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/securityPolicies/ua_securitypolicy_basic256.c" ***********************************/ - endpoint->endpointDescription.securityMode = securityMode; - endpoint->endpointDescription.securityPolicyUri = - UA_STRING_ALLOC("http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256"); - endpoint->endpointDescription.transportProfileUri = - UA_STRING_ALLOC("http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary"); +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2018 (c) Daniel Feist, Precitec GmbH & Co. KG + * Copyright 2019 (c) Kalycito Infotech Private Limited + * + */ - /* Enable all login mechanisms from the access control plugin */ - retval = UA_Array_copy(conf->accessControl.userTokenPolicies, - conf->accessControl.userTokenPoliciesSize, - (void **)&endpoint->endpointDescription.userIdentityTokens, - &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); - if(retval != UA_STATUSCODE_GOOD) - return retval; - endpoint->endpointDescription.userIdentityTokensSize = - conf->accessControl.userTokenPoliciesSize; - UA_String_copy(&localCertificate, &endpoint->endpointDescription.serverCertificate); - UA_ApplicationDescription_copy(&conf->applicationDescription, - &endpoint->endpointDescription.server); +#ifdef UA_ENABLE_ENCRYPTION - return UA_STATUSCODE_GOOD; -} -#endif -const size_t usernamePasswordsSize = 2; -UA_UsernamePasswordLogin usernamePasswords[2] = { - {UA_STRING_STATIC("user1"), UA_STRING_STATIC("password")}, - {UA_STRING_STATIC("user2"), UA_STRING_STATIC("password1")}}; +#include +#include +#include +#include +#include +#include -static UA_ServerConfig * -createDefaultConfig(void) { - UA_ServerConfig *conf = (UA_ServerConfig *)UA_malloc(sizeof(UA_ServerConfig)); - if(!conf) - return NULL; +/* Notes: + * mbedTLS' AES allows in-place encryption and decryption. Sow we don't have to + * allocate temp buffers. + * https://tls.mbed.org/discussions/generic/in-place-decryption-with-aes256-same-input-output-buffer + */ - /* Zero out.. All members have a valid initial value */ - memset(conf, 0, sizeof(UA_ServerConfig)); +#define UA_SECURITYPOLICY_BASIC256SHA1_RSAPADDING_LEN 42 +#define UA_SHA1_LENGTH 20 +#define UA_BASIC256_SYM_SIGNING_KEY_LENGTH 24 +#define UA_SECURITYPOLICY_BASIC256_SYM_KEY_LENGTH 32 +#define UA_SECURITYPOLICY_BASIC256_SYM_ENCRYPTION_BLOCK_SIZE 16 +#define UA_SECURITYPOLICY_BASIC256_SYM_PLAIN_TEXT_BLOCK_SIZE 16 +#define UA_SECURITYPOLICY_BASIC256_MINASYMKEYLENGTH 128 +#define UA_SECURITYPOLICY_BASIC256_MAXASYMKEYLENGTH 512 - /* --> Start setting the default static config <-- */ - conf->nThreads = 1; - conf->logger = UA_Log_Stdout; +typedef struct { + const UA_SecurityPolicy *securityPolicy; + UA_ByteString localCertThumbprint; - /* Server Description */ - conf->buildInfo.productUri = UA_STRING_ALLOC(PRODUCT_URI); - conf->buildInfo.manufacturerName = UA_STRING_ALLOC(MANUFACTURER_NAME); - conf->buildInfo.productName = UA_STRING_ALLOC(PRODUCT_NAME); - conf->buildInfo.softwareVersion = - UA_STRING_ALLOC(VERSION(UA_OPEN62541_VER_MAJOR, UA_OPEN62541_VER_MINOR, - UA_OPEN62541_VER_PATCH, UA_OPEN62541_VER_LABEL)); - conf->buildInfo.buildNumber = UA_STRING_ALLOC(__DATE__ - " " - __TIME__); - conf->buildInfo.buildDate = 0; + mbedtls_ctr_drbg_context drbgContext; + mbedtls_entropy_context entropyContext; + mbedtls_md_context_t sha1MdContext; + mbedtls_pk_context localPrivateKey; +} Basic256_PolicyContext; - conf->applicationDescription.applicationUri = UA_STRING_ALLOC(APPLICATION_URI); - conf->applicationDescription.productUri = UA_STRING_ALLOC(PRODUCT_URI); - conf->applicationDescription.applicationName = - UA_LOCALIZEDTEXT_ALLOC("en", APPLICATION_NAME); - conf->applicationDescription.applicationType = UA_APPLICATIONTYPE_SERVER; - /* conf->applicationDescription.gatewayServerUri = UA_STRING_NULL; */ - /* conf->applicationDescription.discoveryProfileUri = UA_STRING_NULL; */ - /* conf->applicationDescription.discoveryUrlsSize = 0; */ - /* conf->applicationDescription.discoveryUrls = NULL; */ +typedef struct { + Basic256_PolicyContext *policyContext; -#ifdef UA_ENABLE_DISCOVERY - /* conf->mdnsServerName = UA_STRING_NULL; */ - /* conf->serverCapabilitiesSize = 0; */ - /* conf->serverCapabilities = NULL; */ -#endif + UA_ByteString localSymSigningKey; + UA_ByteString localSymEncryptingKey; + UA_ByteString localSymIv; - /* Custom DataTypes */ - /* conf->customDataTypesSize = 0; */ - /* conf->customDataTypes = NULL; */ + UA_ByteString remoteSymSigningKey; + UA_ByteString remoteSymEncryptingKey; + UA_ByteString remoteSymIv; - /* Networking */ - /* conf->networkLayersSize = 0; */ - /* conf->networkLayers = NULL; */ - /* conf->customHostname = UA_STRING_NULL; */ + mbedtls_x509_crt remoteCertificate; +} Basic256_ChannelContext; - /* Endpoints */ - /* conf->endpoints = {0, NULL}; */ +/********************/ +/* AsymmetricModule */ +/********************/ - /* Certificate Verification that accepts every certificate. Can be - * overwritten when the policy is specialized. */ - UA_CertificateVerification_AcceptAll(&conf->certificateVerification); +/* VERIFY AsymmetricSignatureAlgorithm_RSA-PKCS15-SHA2-256 */ +static UA_StatusCode +asym_verify_sp_basic256(const UA_SecurityPolicy *securityPolicy, + Basic256_ChannelContext *cc, + const UA_ByteString *message, + const UA_ByteString *signature) { + if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - /* Global Node Lifecycle */ - conf->nodeLifecycle.constructor = NULL; - conf->nodeLifecycle.destructor = NULL; + return mbedtls_verifySig_sha1(&cc->remoteCertificate, message, signature); +} - /* Access Control. Anonymous Login only. */ - conf->accessControl = UA_AccessControl_default(true, usernamePasswordsSize, usernamePasswords); +/* AsymmetricSignatureAlgorithm_RSA-PKCS15-SHA2-256 */ +static UA_StatusCode +asym_sign_sp_basic256(const UA_SecurityPolicy *securityPolicy, + Basic256_ChannelContext *cc, + const UA_ByteString *message, + UA_ByteString *signature) { + if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - /* Limits for SecureChannels */ - conf->maxSecureChannels = 40; - conf->maxSecurityTokenLifetime = 10 * 60 * 1000; /* 10 minutes */ + Basic256_PolicyContext *pc = cc->policyContext; + return mbedtls_sign_sha1(&pc->localPrivateKey, &pc->drbgContext, + message, signature); +} - /* Limits for Sessions */ - conf->maxSessions = 100; - conf->maxSessionTimeout = 60.0 * 60.0 * 1000.0; /* 1h */ +static size_t +asym_getLocalSignatureSize_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const Basic256_ChannelContext *cc) { + if(securityPolicy == NULL || cc == NULL) + return 0; + return mbedtls_pk_rsa(cc->policyContext->localPrivateKey)->len; +} - /* Limits for Subscriptions */ - conf->publishingIntervalLimits = UA_DURATIONRANGE(100.0, 3600.0 * 1000.0); - conf->lifeTimeCountLimits = UA_UINT32RANGE(3, 15000); - conf->keepAliveCountLimits = UA_UINT32RANGE(1, 100); - conf->maxNotificationsPerPublish = 1000; - conf->maxRetransmissionQueueSize = 0; /* unlimited */ +static size_t +asym_getRemoteSignatureSize_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const Basic256_ChannelContext *cc) { + if(securityPolicy == NULL || cc == NULL) + return 0; + return mbedtls_pk_rsa(cc->remoteCertificate.pk)->len; +} - /* Limits for MonitoredItems */ - conf->samplingIntervalLimits = UA_DURATIONRANGE(50.0, 24.0 * 3600.0 * 1000.0); - conf->queueSizeLimits = UA_UINT32RANGE(1, 100); +/* AsymmetricEncryptionAlgorithm_RSA-OAEP-SHA1 */ +static UA_StatusCode +asym_encrypt_sp_basic256(const UA_SecurityPolicy *securityPolicy, + Basic256_ChannelContext *cc, + UA_ByteString *data) { + if(securityPolicy == NULL || cc == NULL || data == NULL) + return UA_STATUSCODE_BADINTERNALERROR; -#ifdef UA_ENABLE_DISCOVERY - conf->discoveryCleanupTimeout = 60 * 60; -#endif + const size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule. + encryptionAlgorithm.getRemotePlainTextBlockSize(securityPolicy, cc); - /* --> Finish setting the default static config <-- */ + mbedtls_rsa_context *remoteRsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); + mbedtls_rsa_set_padding(remoteRsaContext, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA1); - return conf; + return mbedtls_encrypt_rsaOaep(remoteRsaContext, &cc->policyContext->drbgContext, + data, plainTextBlockSize); } +/* AsymmetricEncryptionAlgorithm_RSA-OAEP-SHA1 */ static UA_StatusCode -addDefaultNetworkLayers(UA_ServerConfig *conf, UA_UInt16 portNumber) { - /* Add a network layer */ - conf->networkLayers = (UA_ServerNetworkLayer *) - UA_malloc(sizeof(UA_ServerNetworkLayer)); - if(!conf->networkLayers) - return UA_STATUSCODE_BADOUTOFMEMORY; +asym_decrypt_sp_basic256(const UA_SecurityPolicy *securityPolicy, + Basic256_ChannelContext *cc, + UA_ByteString *data) { + if(securityPolicy == NULL || cc == NULL || data == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + return mbedtls_decrypt_rsaOaep(&cc->policyContext->localPrivateKey, + &cc->policyContext->drbgContext, data); +} - conf->networkLayers[0] = - UA_ServerNetworkLayerTCP(UA_ConnectionConfig_default, portNumber, conf->logger); - if (!conf->networkLayers[0].handle) - return UA_STATUSCODE_BADOUTOFMEMORY; - conf->networkLayersSize = 1; +static size_t +asym_getLocalEncryptionKeyLength_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const Basic256_ChannelContext *cc) { + return mbedtls_pk_get_len(&cc->policyContext->localPrivateKey) * 8; +} - return UA_STATUSCODE_GOOD; +static size_t +asym_getRemoteEncryptionKeyLength_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const Basic256_ChannelContext *cc) { + return mbedtls_pk_get_len(&cc->remoteCertificate.pk) * 8; } -UA_ServerConfig * -UA_ServerConfig_new_minimal(UA_UInt16 portNumber, - const UA_ByteString *certificate) { - UA_ServerConfig *conf = createDefaultConfig(); +static size_t +asym_getRemoteBlockSize_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const Basic256_ChannelContext *cc) { + mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); + return rsaContext->len; +} - UA_StatusCode retval = UA_Nodestore_default_new(&conf->nodestore); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } +static size_t +asym_getRemotePlainTextBlockSize_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const Basic256_ChannelContext *cc) { + mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); + return rsaContext->len - UA_SECURITYPOLICY_BASIC256SHA1_RSAPADDING_LEN; +} - if(addDefaultNetworkLayers(conf, portNumber) != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } +static UA_StatusCode +asym_makeThumbprint_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *certificate, + UA_ByteString *thumbprint) { + if(securityPolicy == NULL || certificate == NULL || thumbprint == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + return mbedtls_thumbprint_sha1(certificate, thumbprint); +} - /* Allocate the endpoint */ - conf->endpoints = (UA_Endpoint *)UA_malloc(sizeof(UA_Endpoint)); - if(!conf->endpoints) { - UA_ServerConfig_delete(conf); - return NULL; - } - conf->endpointsSize = 1; +static UA_StatusCode +asymmetricModule_compareCertificateThumbprint_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *certificateThumbprint) { + if(securityPolicy == NULL || certificateThumbprint == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - /* Populate the endpoint */ - UA_ByteString localCertificate = UA_BYTESTRING_NULL; - if(certificate) - localCertificate = *certificate; - retval = - createSecurityPolicyNoneEndpoint(conf, &conf->endpoints[0], localCertificate); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } + Basic256_PolicyContext *pc = (Basic256_PolicyContext *)securityPolicy->policyContext; + if(!UA_ByteString_equal(certificateThumbprint, &pc->localCertThumbprint)) + return UA_STATUSCODE_BADCERTIFICATEINVALID; - return conf; + return UA_STATUSCODE_GOOD; } -#ifdef UA_ENABLE_ENCRYPTION - -UA_ServerConfig * -UA_ServerConfig_new_basic128rsa15(UA_UInt16 portNumber, - const UA_ByteString *certificate, - const UA_ByteString *privateKey, - const UA_ByteString *trustList, - size_t trustListSize, - const UA_ByteString *revocationList, - size_t revocationListSize) { - UA_ServerConfig *conf = createDefaultConfig(); - - UA_StatusCode retval = UA_CertificateVerification_Trustlist(&conf->certificateVerification, - trustList, trustListSize, - revocationList, revocationListSize); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } +/*******************/ +/* SymmetricModule */ +/*******************/ - retval = UA_Nodestore_default_new(&conf->nodestore); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } +static UA_StatusCode +sym_verify_sp_basic256(const UA_SecurityPolicy *securityPolicy, + Basic256_ChannelContext *cc, + const UA_ByteString *message, + const UA_ByteString *signature) { + if(securityPolicy == NULL || cc == NULL || message == NULL || signature == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - if(addDefaultNetworkLayers(conf, portNumber) != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; + /* Compute MAC */ + if(signature->length != UA_SHA1_LENGTH) { + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Signature size does not have the desired size defined by the security policy"); + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; } - if(trustListSize == 0) - UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, - "No CA trust-list provided. Any remote certificate will be accepted."); + Basic256_PolicyContext *pc = + (Basic256_PolicyContext *)securityPolicy->policyContext; + + unsigned char mac[UA_SHA1_LENGTH]; + mbedtls_hmac(&pc->sha1MdContext, &cc->remoteSymSigningKey, message, mac); - /* Allocate the endpoints */ - conf->endpointsSize = 0; - conf->endpoints = (UA_Endpoint *)UA_malloc(sizeof(UA_Endpoint) * 3); - if(!conf->endpoints) { - UA_ServerConfig_delete(conf); - return NULL; - } + /* Compare with Signature */ + if(!UA_constantTimeEqual(signature->data, mac, UA_SHA1_LENGTH)) + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; + return UA_STATUSCODE_GOOD; +} - /* Populate the endpoints */ - ++conf->endpointsSize; - retval = createSecurityPolicyNoneEndpoint(conf, &conf->endpoints[0], *certificate); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } +static UA_StatusCode +sym_sign_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const Basic256_ChannelContext *cc, + const UA_ByteString *message, + UA_ByteString *signature) { + if(signature->length != UA_SHA1_LENGTH) + return UA_STATUSCODE_BADINTERNALERROR; - ++conf->endpointsSize; - retval = createSecurityPolicyBasic128Rsa15Endpoint(conf, &conf->endpoints[1], - UA_MESSAGESECURITYMODE_SIGN, *certificate, - *privateKey); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } + mbedtls_hmac(&cc->policyContext->sha1MdContext, &cc->localSymSigningKey, + message, signature->data); + return UA_STATUSCODE_GOOD; +} - ++conf->endpointsSize; - retval = createSecurityPolicyBasic128Rsa15Endpoint(conf, &conf->endpoints[2], - UA_MESSAGESECURITYMODE_SIGNANDENCRYPT, *certificate, - *privateKey); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } +static size_t +sym_getSignatureSize_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const void *channelContext) { + return UA_SHA1_LENGTH; +} - return conf; +static size_t +sym_getSigningKeyLength_sp_basic256(const UA_SecurityPolicy *const securityPolicy, + const void *const channelContext) { + return UA_BASIC256_SYM_SIGNING_KEY_LENGTH; } -UA_ServerConfig * -UA_ServerConfig_new_basic256sha256(UA_UInt16 portNumber, - const UA_ByteString *certificate, - const UA_ByteString *privateKey, - const UA_ByteString *trustList, - size_t trustListSize, - const UA_ByteString *revocationList, - size_t revocationListSize) { - UA_ServerConfig *conf = createDefaultConfig(); +static size_t +sym_getEncryptionKeyLength_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const void *channelContext) { + return UA_SECURITYPOLICY_BASIC256_SYM_KEY_LENGTH; +} - UA_StatusCode retval = UA_CertificateVerification_Trustlist(&conf->certificateVerification, - trustList, trustListSize, - revocationList, revocationListSize); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } +static size_t +sym_getEncryptionBlockSize_sp_basic256(const UA_SecurityPolicy *const securityPolicy, + const void *const channelContext) { + return UA_SECURITYPOLICY_BASIC256_SYM_ENCRYPTION_BLOCK_SIZE; +} - retval = UA_Nodestore_default_new(&conf->nodestore); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } +static size_t +sym_getPlainTextBlockSize_sp_basic256(const UA_SecurityPolicy *const securityPolicy, + const void *const channelContext) { + return UA_SECURITYPOLICY_BASIC256_SYM_PLAIN_TEXT_BLOCK_SIZE; +} - if(addDefaultNetworkLayers(conf, portNumber) != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } +static UA_StatusCode +sym_encrypt_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const Basic256_ChannelContext *cc, + UA_ByteString *data) { + if(securityPolicy == NULL || cc == NULL || data == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - if(trustListSize == 0) - UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, - "No CA trust-list provided. Any remote certificate will be accepted."); + if(cc->localSymIv.length != + securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm. + getLocalBlockSize(securityPolicy, cc)) + return UA_STATUSCODE_BADINTERNALERROR; - /* Allocate the endpoints */ - conf->endpointsSize = 0; - conf->endpoints = (UA_Endpoint *)UA_malloc(sizeof(UA_Endpoint) * 3); - if(!conf->endpoints) { - UA_ServerConfig_delete(conf); - return NULL; - } + size_t plainTextBlockSize = + securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm. + getLocalPlainTextBlockSize(securityPolicy, cc); - /* Populate the endpoints */ - ++conf->endpointsSize; - retval = createSecurityPolicyNoneEndpoint(conf, &conf->endpoints[0], *certificate); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; + if(data->length % plainTextBlockSize != 0) { + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Length of data to encrypt is not a multiple of the plain text block size." + "Padding might not have been calculated appropriately."); + return UA_STATUSCODE_BADINTERNALERROR; } - ++conf->endpointsSize; - retval = createSecurityPolicyBasic256Sha256Endpoint(conf, &conf->endpoints[1], - UA_MESSAGESECURITYMODE_SIGN, *certificate, - *privateKey); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } + /* Keylength in bits */ + unsigned int keylength = (unsigned int)(cc->localSymEncryptingKey.length * 8); + mbedtls_aes_context aesContext; + int mbedErr = mbedtls_aes_setkey_enc(&aesContext, cc->localSymEncryptingKey.data, keylength); + if(mbedErr) + return UA_STATUSCODE_BADINTERNALERROR; - ++conf->endpointsSize; - retval = createSecurityPolicyBasic256Sha256Endpoint(conf, &conf->endpoints[2], - UA_MESSAGESECURITYMODE_SIGNANDENCRYPT, *certificate, - *privateKey); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } + UA_ByteString ivCopy; + UA_StatusCode retval = UA_ByteString_copy(&cc->localSymIv, &ivCopy); + if(retval != UA_STATUSCODE_GOOD) + return retval; - return conf; + mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_ENCRYPT, data->length, + ivCopy.data, data->data, data->data); + if(mbedErr) + retval = UA_STATUSCODE_BADINTERNALERROR; + UA_ByteString_deleteMembers(&ivCopy); + return retval; } -UA_ServerConfig * -UA_ServerConfig_new_allSecurityPolicies(UA_UInt16 portNumber, - const UA_ByteString *certificate, - const UA_ByteString *privateKey, - const UA_ByteString *trustList, - size_t trustListSize, - const UA_ByteString *revocationList, - size_t revocationListSize) { - UA_ServerConfig *conf = createDefaultConfig(); +static UA_StatusCode +sym_decrypt_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const Basic256_ChannelContext *cc, + UA_ByteString *data) { + if(securityPolicy == NULL || cc == NULL || data == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - UA_StatusCode retval = UA_CertificateVerification_Trustlist(&conf->certificateVerification, - trustList, trustListSize, - revocationList, revocationListSize); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } + size_t encryptionBlockSize = + securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm. + getRemoteBlockSize(securityPolicy, cc); - retval = UA_Nodestore_default_new(&conf->nodestore); - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } + if(cc->remoteSymIv.length != encryptionBlockSize) + return UA_STATUSCODE_BADINTERNALERROR; - if(addDefaultNetworkLayers(conf, portNumber) != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; + if(data->length % encryptionBlockSize != 0) { + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Length of data to decrypt is not a multiple of the encryptingBlock size."); + return UA_STATUSCODE_BADINTERNALERROR; } - if(trustListSize == 0) - UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, - "No CA trust-list provided. Any remote certificate will be accepted."); + unsigned int keylength = (unsigned int)(cc->remoteSymEncryptingKey.length * 8); + mbedtls_aes_context aesContext; + int mbedErr = mbedtls_aes_setkey_dec(&aesContext, cc->remoteSymEncryptingKey.data, keylength); + if(mbedErr) + return UA_STATUSCODE_BADINTERNALERROR; - /* Allocate the endpoints */ - conf->endpointsSize = 0; - conf->endpoints = (UA_Endpoint *)UA_malloc(sizeof(UA_Endpoint) * 5); - if(!conf->endpoints) { - UA_ServerConfig_delete(conf); - return NULL; - } + UA_ByteString ivCopy; + UA_StatusCode retval = UA_ByteString_copy(&cc->remoteSymIv, &ivCopy); + if(retval != UA_STATUSCODE_GOOD) + return retval; - /* Populate the endpoints */ - retval = createSecurityPolicyNoneEndpoint(conf, &conf->endpoints[conf->endpointsSize], *certificate); - ++conf->endpointsSize; - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } + mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_DECRYPT, data->length, + ivCopy.data, data->data, data->data); + if(mbedErr) + retval = UA_STATUSCODE_BADINTERNALERROR; + UA_ByteString_deleteMembers(&ivCopy); + return retval; +} - retval = createSecurityPolicyBasic128Rsa15Endpoint(conf, &conf->endpoints[conf->endpointsSize], - UA_MESSAGESECURITYMODE_SIGN, *certificate, - *privateKey); - ++conf->endpointsSize; - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } +static UA_StatusCode +sym_generateKey_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *secret, const UA_ByteString *seed, + UA_ByteString *out) { + if(securityPolicy == NULL || secret == NULL || seed == NULL || out == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - retval = createSecurityPolicyBasic128Rsa15Endpoint(conf, &conf->endpoints[conf->endpointsSize], - UA_MESSAGESECURITYMODE_SIGNANDENCRYPT, *certificate, - *privateKey); - ++conf->endpointsSize; - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } + Basic256_PolicyContext *pc = + (Basic256_PolicyContext *)securityPolicy->policyContext; - retval = createSecurityPolicyBasic256Sha256Endpoint(conf, &conf->endpoints[conf->endpointsSize], - UA_MESSAGESECURITYMODE_SIGN, *certificate, - *privateKey); - ++conf->endpointsSize; - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } + return mbedtls_generateKey(&pc->sha1MdContext, secret, seed, out); +} - retval = createSecurityPolicyBasic256Sha256Endpoint(conf, &conf->endpoints[conf->endpointsSize], - UA_MESSAGESECURITYMODE_SIGNANDENCRYPT, *certificate, - *privateKey); - ++conf->endpointsSize; - if(retval != UA_STATUSCODE_GOOD) { - UA_ServerConfig_delete(conf); - return NULL; - } +static UA_StatusCode +sym_generateNonce_sp_basic256(const UA_SecurityPolicy *securityPolicy, + UA_ByteString *out) { + if(securityPolicy == NULL || securityPolicy->policyContext == NULL || out == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - return conf; -} + Basic256_PolicyContext *pc = + (Basic256_PolicyContext *)securityPolicy->policyContext; + int mbedErr = mbedtls_ctr_drbg_random(&pc->drbgContext, out->data, out->length); + if(mbedErr) + return UA_STATUSCODE_BADUNEXPECTEDERROR; -#endif + return UA_STATUSCODE_GOOD; +} -void -UA_ServerConfig_delete(UA_ServerConfig *config) { - if(!config) - return; +/*****************/ +/* ChannelModule */ +/*****************/ - /* Server Description */ - UA_BuildInfo_deleteMembers(&config->buildInfo); - UA_ApplicationDescription_deleteMembers(&config->applicationDescription); -#ifdef UA_ENABLE_DISCOVERY - UA_String_deleteMembers(&config->mdnsServerName); - UA_Array_delete(config->serverCapabilities, config->serverCapabilitiesSize, - &UA_TYPES[UA_TYPES_STRING]); - config->serverCapabilities = NULL; - config->serverCapabilitiesSize = 0; -#endif +/* Assumes that the certificate has been verified externally */ +static UA_StatusCode +parseRemoteCertificate_sp_basic256(Basic256_ChannelContext *cc, + const UA_ByteString *remoteCertificate) { + if(remoteCertificate == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; - /* Nodestore */ - if(config->nodestore.deleteNodestore) - config->nodestore.deleteNodestore(config->nodestore.context); + /* Parse the certificate */ + int mbedErr = mbedtls_x509_crt_parse(&cc->remoteCertificate, remoteCertificate->data, + remoteCertificate->length); + if(mbedErr) + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; - /* Custom DataTypes */ - for(size_t i = 0; i < config->customDataTypesSize; ++i) - UA_free(config->customDataTypes[i].members); - UA_free(config->customDataTypes); - config->customDataTypes = NULL; - config->customDataTypesSize = 0; + /* Check the key length */ + mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); + if(rsaContext->len < UA_SECURITYPOLICY_BASIC256_MINASYMKEYLENGTH || + rsaContext->len > UA_SECURITYPOLICY_BASIC256_MAXASYMKEYLENGTH) + return UA_STATUSCODE_BADCERTIFICATEUSENOTALLOWED; - /* Networking */ - for(size_t i = 0; i < config->networkLayersSize; ++i) - config->networkLayers[i].deleteMembers(&config->networkLayers[i]); - UA_free(config->networkLayers); - config->networkLayers = NULL; - config->networkLayersSize = 0; - UA_String_deleteMembers(&config->customHostname); - config->customHostname = UA_STRING_NULL; + return UA_STATUSCODE_GOOD; +} - for(size_t i = 0; i < config->endpointsSize; ++i) { - UA_SecurityPolicy *policy = &config->endpoints[i].securityPolicy; - policy->deleteMembers(policy); - UA_EndpointDescription_deleteMembers(&config->endpoints[i].endpointDescription); - } - UA_free(config->endpoints); - config->endpoints = NULL; - config->endpointsSize = 0; +static void +channelContext_deleteContext_sp_basic256(Basic256_ChannelContext *cc) { + UA_ByteString_deleteMembers(&cc->localSymSigningKey); + UA_ByteString_deleteMembers(&cc->localSymEncryptingKey); + UA_ByteString_deleteMembers(&cc->localSymIv); - /* Certificate Validation */ - config->certificateVerification.deleteMembers(&config->certificateVerification); + UA_ByteString_deleteMembers(&cc->remoteSymSigningKey); + UA_ByteString_deleteMembers(&cc->remoteSymEncryptingKey); + UA_ByteString_deleteMembers(&cc->remoteSymIv); - /* Access Control */ - config->accessControl.deleteMembers(&config->accessControl); + mbedtls_x509_crt_free(&cc->remoteCertificate); - UA_free(config); + UA_free(cc); } -/***************************/ -/* Default Client Settings */ -/***************************/ +static UA_StatusCode +channelContext_newContext_sp_basic256(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *remoteCertificate, + void **pp_contextData) { + if(securityPolicy == NULL || remoteCertificate == NULL || pp_contextData == NULL) + return UA_STATUSCODE_BADINTERNALERROR; -const UA_ClientConfig UA_ClientConfig_default = { - 5000, /* .timeout, 5 seconds */ - 10 * 60 * 1000, /* .secureChannelLifeTime, 10 minutes */ - UA_Log_Stdout, /* .logger */ - { /* .localConnectionConfig */ - 0, /* .protocolVersion */ - 65535, /* .sendBufferSize, 64k per chunk */ - 65535, /* .recvBufferSize, 64k per chunk */ - 0, /* .maxMessageSize, 0 -> unlimited */ - 0 /* .maxChunkCount, 0 -> unlimited */ - }, - UA_ClientConnectionTCP, /* .connectionFunc */ - - 0, /* .customDataTypesSize */ - NULL, /*.customDataTypes */ - - NULL, /*.stateCallback */ -#ifdef UA_ENABLE_SUBSCRIPTIONS - NULL, /*.subscriptionInactivityCallback */ -#endif - NULL, /*.inactivityCallback */ - NULL, /*.clientContext */ -#ifdef UA_ENABLE_SUBSCRIPTIONS - 10, /* .outStandingPublishRequests */ -#endif - 0 /* .connectivityCheckInterval */ -}; + /* Allocate the channel context */ + *pp_contextData = UA_malloc(sizeof(Basic256_ChannelContext)); + if(*pp_contextData == NULL) + return UA_STATUSCODE_BADOUTOFMEMORY; -UA_ClientConfig UA_Server_getClientConfig(void) -{ - return UA_ClientConfig_default; -} + Basic256_ChannelContext *cc = (Basic256_ChannelContext *)*pp_contextData; -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_securitypolicy_none.c" ***********************************/ + /* Initialize the channel context */ + cc->policyContext = (Basic256_PolicyContext *)securityPolicy->policyContext; -/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. - * - * Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - */ + UA_ByteString_init(&cc->localSymSigningKey); + UA_ByteString_init(&cc->localSymEncryptingKey); + UA_ByteString_init(&cc->localSymIv); + + UA_ByteString_init(&cc->remoteSymSigningKey); + UA_ByteString_init(&cc->remoteSymEncryptingKey); + UA_ByteString_init(&cc->remoteSymIv); + mbedtls_x509_crt_init(&cc->remoteCertificate); -static UA_StatusCode -verify_none(const UA_SecurityPolicy *securityPolicy, - void *channelContext, - const UA_ByteString *message, - const UA_ByteString *signature) { - return UA_STATUSCODE_GOOD; + // TODO: this can be optimized so that we dont allocate memory before parsing the certificate + UA_StatusCode retval = parseRemoteCertificate_sp_basic256(cc, remoteCertificate); + if(retval != UA_STATUSCODE_GOOD) { + channelContext_deleteContext_sp_basic256(cc); + *pp_contextData = NULL; + } + return retval; } static UA_StatusCode -sign_none(const UA_SecurityPolicy *securityPolicy, - void *channelContext, - const UA_ByteString *message, - UA_ByteString *signature) { - return UA_STATUSCODE_GOOD; -} +channelContext_setLocalSymEncryptingKey_sp_basic256(Basic256_ChannelContext *cc, + const UA_ByteString *key) { + if(key == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; -static size_t -length_none(const UA_SecurityPolicy *securityPolicy, - const void *channelContext) { - return 0; + UA_ByteString_deleteMembers(&cc->localSymEncryptingKey); + return UA_ByteString_copy(key, &cc->localSymEncryptingKey); } static UA_StatusCode -encrypt_none(const UA_SecurityPolicy *securityPolicy, - void *channelContext, - UA_ByteString *data) { - return UA_STATUSCODE_GOOD; +channelContext_setLocalSymSigningKey_sp_basic256(Basic256_ChannelContext *cc, + const UA_ByteString *key) { + if(key == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + + UA_ByteString_deleteMembers(&cc->localSymSigningKey); + return UA_ByteString_copy(key, &cc->localSymSigningKey); } + static UA_StatusCode -decrypt_none(const UA_SecurityPolicy *securityPolicy, - void *channelContext, - UA_ByteString *data) { - return UA_STATUSCODE_GOOD; +channelContext_setLocalSymIv_sp_basic256(Basic256_ChannelContext *cc, + const UA_ByteString *iv) { + if(iv == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + + UA_ByteString_deleteMembers(&cc->localSymIv); + return UA_ByteString_copy(iv, &cc->localSymIv); } static UA_StatusCode -makeThumbprint_none(const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *certificate, - UA_ByteString *thumbprint) { - return UA_STATUSCODE_GOOD; +channelContext_setRemoteSymEncryptingKey_sp_basic256(Basic256_ChannelContext *cc, + const UA_ByteString *key) { + if(key == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + + UA_ByteString_deleteMembers(&cc->remoteSymEncryptingKey); + return UA_ByteString_copy(key, &cc->remoteSymEncryptingKey); } static UA_StatusCode -compareThumbprint_none(const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *certificateThumbprint) { - return UA_STATUSCODE_GOOD; +channelContext_setRemoteSymSigningKey_sp_basic256(Basic256_ChannelContext *cc, + const UA_ByteString *key) { + if(key == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + + UA_ByteString_deleteMembers(&cc->remoteSymSigningKey); + return UA_ByteString_copy(key, &cc->remoteSymSigningKey); } static UA_StatusCode -generateKey_none(const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *secret, - const UA_ByteString *seed, - UA_ByteString *out) { - return UA_STATUSCODE_GOOD; +channelContext_setRemoteSymIv_sp_basic256(Basic256_ChannelContext *cc, + const UA_ByteString *iv) { + if(iv == NULL || cc == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + + UA_ByteString_deleteMembers(&cc->remoteSymIv); + return UA_ByteString_copy(iv, &cc->remoteSymIv); } -/* Use the non-cryptographic RNG to set the nonce */ static UA_StatusCode -generateNonce_none(const UA_SecurityPolicy *securityPolicy, UA_ByteString *out) { - if(securityPolicy == NULL || out == NULL) +channelContext_compareCertificate_sp_basic256(const Basic256_ChannelContext *cc, + const UA_ByteString *certificate) { + if(cc == NULL || certificate == NULL) return UA_STATUSCODE_BADINTERNALERROR; - /* Fill blocks of four byte */ - size_t i = 0; - while(i + 3 < out->length) { - UA_UInt32 rand = UA_UInt32_random(); - memcpy(&out->data[i], &rand, 4); - i = i+4; - } - - /* Fill the remaining byte */ - UA_UInt32 rand = UA_UInt32_random(); - memcpy(&out->data[i], &rand, out->length % 4); + mbedtls_x509_crt cert; + mbedtls_x509_crt_init(&cert); + int mbedErr = mbedtls_x509_crt_parse(&cert, certificate->data, certificate->length); + if(mbedErr) + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; - return UA_STATUSCODE_GOOD; -} + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(cert.raw.len != cc->remoteCertificate.raw.len || + memcmp(cert.raw.p, cc->remoteCertificate.raw.p, cert.raw.len) != 0) + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; -static UA_StatusCode -newContext_none(const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *remoteCertificate, - void **channelContext) { - return UA_STATUSCODE_GOOD; + mbedtls_x509_crt_free(&cert); + return retval; } static void -deleteContext_none(void *channelContext) { +deleteMembers_sp_basic256(UA_SecurityPolicy *securityPolicy) { + if(securityPolicy == NULL) + return; + + if(securityPolicy->policyContext == NULL) + return; + + UA_ByteString_deleteMembers(&securityPolicy->localCertificate); + + /* delete all allocated members in the context */ + Basic256_PolicyContext *pc = (Basic256_PolicyContext *) + securityPolicy->policyContext; + + mbedtls_ctr_drbg_free(&pc->drbgContext); + mbedtls_entropy_free(&pc->entropyContext); + mbedtls_pk_free(&pc->localPrivateKey); + mbedtls_md_free(&pc->sha1MdContext); + UA_ByteString_deleteMembers(&pc->localCertThumbprint); + + UA_LOG_DEBUG(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Deleted members of EndpointContext for sp_basic256"); + + UA_free(pc); + securityPolicy->policyContext = NULL; } static UA_StatusCode -setContextValue_none(void *channelContext, - const UA_ByteString *key) { - return UA_STATUSCODE_GOOD; +updateCertificateAndPrivateKey_sp_basic256(UA_SecurityPolicy *securityPolicy, + const UA_ByteString newCertificate, + const UA_ByteString newPrivateKey) { + if(securityPolicy == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + + if(securityPolicy->policyContext == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + + Basic256_PolicyContext *pc = (Basic256_PolicyContext *) + securityPolicy->policyContext; + + UA_ByteString_deleteMembers(&securityPolicy->localCertificate); + + UA_StatusCode retval = UA_ByteString_allocBuffer(&securityPolicy->localCertificate, + newCertificate.length + 1); + if(retval != UA_STATUSCODE_GOOD) + return retval; + memcpy(securityPolicy->localCertificate.data, newCertificate.data, newCertificate.length); + securityPolicy->localCertificate.data[newCertificate.length] = '\0'; + securityPolicy->localCertificate.length--; + + /* Set the new private key */ + mbedtls_pk_free(&pc->localPrivateKey); + mbedtls_pk_init(&pc->localPrivateKey); + int mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey, + newPrivateKey.data, newPrivateKey.length, + NULL, 0); + if(mbedErr) { + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; + goto error; + } + + retval = asym_makeThumbprint_sp_basic256(pc->securityPolicy, + &securityPolicy->localCertificate, + &pc->localCertThumbprint); + if(retval != UA_STATUSCODE_GOOD) + goto error; + + return retval; + + error: + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Could not update certificate and private key"); + if(securityPolicy->policyContext != NULL) + deleteMembers_sp_basic256(securityPolicy); + return retval; } static UA_StatusCode -compareCertificate_none(const void *channelContext, - const UA_ByteString *certificate) { +policyContext_newContext_sp_basic256(UA_SecurityPolicy *securityPolicy, + const UA_ByteString localPrivateKey) { + UA_StatusCode retval = UA_STATUSCODE_GOOD; + if(securityPolicy == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + + if (localPrivateKey.length == 0) { + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Can not initialize security policy. Private key is empty."); + return UA_STATUSCODE_BADINVALIDARGUMENT; + } + + Basic256_PolicyContext *pc = (Basic256_PolicyContext *) + UA_malloc(sizeof(Basic256_PolicyContext)); + securityPolicy->policyContext = (void *)pc; + if(!pc) { + retval = UA_STATUSCODE_BADOUTOFMEMORY; + goto error; + } + + /* Initialize the PolicyContext */ + memset(pc, 0, sizeof(Basic256_PolicyContext)); + mbedtls_ctr_drbg_init(&pc->drbgContext); + mbedtls_entropy_init(&pc->entropyContext); + mbedtls_pk_init(&pc->localPrivateKey); + mbedtls_md_init(&pc->sha1MdContext); + pc->securityPolicy = securityPolicy; + + /* Initialized the message digest */ + const mbedtls_md_info_t *mdInfo = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1); + int mbedErr = mbedtls_md_setup(&pc->sha1MdContext, mdInfo, MBEDTLS_MD_SHA1); + if(mbedErr) { + retval = UA_STATUSCODE_BADOUTOFMEMORY; + goto error; + } + + /* Add the system entropy source */ + mbedErr = mbedtls_entropy_add_source(&pc->entropyContext, + mbedtls_platform_entropy_poll, NULL, 0, + MBEDTLS_ENTROPY_SOURCE_STRONG); + if(mbedErr) { + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; + goto error; + } + + /* Seed the RNG */ + char *personalization = "open62541-drbg"; + mbedErr = mbedtls_ctr_drbg_seed(&pc->drbgContext, mbedtls_entropy_func, + &pc->entropyContext, + (const unsigned char *)personalization, 14); + if(mbedErr) { + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; + goto error; + } + + /* Set the private key */ + mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey, localPrivateKey.data, + localPrivateKey.length, NULL, 0); + if(mbedErr) { + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; + goto error; + } + + /* Set the local certificate thumbprint */ + retval = UA_ByteString_allocBuffer(&pc->localCertThumbprint, UA_SHA1_LENGTH); + if(retval != UA_STATUSCODE_GOOD) + goto error; + retval = asym_makeThumbprint_sp_basic256(pc->securityPolicy, + &securityPolicy->localCertificate, + &pc->localCertThumbprint); + if(retval != UA_STATUSCODE_GOOD) + goto error; + return UA_STATUSCODE_GOOD; -} -static void -policy_deletemembers_none(UA_SecurityPolicy *policy) { - UA_ByteString_deleteMembers(&policy->localCertificate); +error: + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Could not create securityContext: %s", UA_StatusCode_name(retval)); + if(securityPolicy->policyContext != NULL) + deleteMembers_sp_basic256(securityPolicy); + return retval; } UA_StatusCode -UA_SecurityPolicy_None(UA_SecurityPolicy *policy, UA_CertificateVerification *certificateVerification, - const UA_ByteString localCertificate, UA_Logger logger) { - policy->policyContext = (void *)(uintptr_t)logger; - policy->policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None"); +UA_SecurityPolicy_Basic256(UA_SecurityPolicy *policy, + UA_CertificateVerification *certificateVerification, + const UA_ByteString localCertificate, + const UA_ByteString localPrivateKey, const UA_Logger *logger) { + memset(policy, 0, sizeof(UA_SecurityPolicy)); policy->logger = logger; - UA_ByteString_copy(&localCertificate, &policy->localCertificate); + policy->policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#Basic256"); + + UA_SecurityPolicyAsymmetricModule *const asymmetricModule = &policy->asymmetricModule; + UA_SecurityPolicySymmetricModule *const symmetricModule = &policy->symmetricModule; + UA_SecurityPolicyChannelModule *const channelModule = &policy->channelModule; + + /* Copy the certificate and add a NULL to the end */ + UA_StatusCode retval = + UA_ByteString_allocBuffer(&policy->localCertificate, localCertificate.length + 1); + if(retval != UA_STATUSCODE_GOOD) + return retval; + memcpy(policy->localCertificate.data, localCertificate.data, localCertificate.length); + policy->localCertificate.data[localCertificate.length] = '\0'; + policy->localCertificate.length--; policy->certificateVerification = certificateVerification; - policy->symmetricModule.generateKey = generateKey_none; - policy->symmetricModule.generateNonce = generateNonce_none; + /* AsymmetricModule */ + UA_SecurityPolicySignatureAlgorithm *asym_signatureAlgorithm = + &asymmetricModule->cryptoModule.signatureAlgorithm; + asym_signatureAlgorithm->uri = + UA_STRING("http://www.w3.org/2000/09/xmldsig#rsa-sha1\0"); + asym_signatureAlgorithm->verify = + (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, + const UA_ByteString *, const UA_ByteString *))asym_verify_sp_basic256; + asym_signatureAlgorithm->sign = + (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, + const UA_ByteString *, UA_ByteString *))asym_sign_sp_basic256; + asym_signatureAlgorithm->getLocalSignatureSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getLocalSignatureSize_sp_basic256; + asym_signatureAlgorithm->getRemoteSignatureSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteSignatureSize_sp_basic256; + asym_signatureAlgorithm->getLocalKeyLength = NULL; // TODO: Write function + asym_signatureAlgorithm->getRemoteKeyLength = NULL; // TODO: Write function + + UA_SecurityPolicyEncryptionAlgorithm *asym_encryptionAlgorithm = + &asymmetricModule->cryptoModule.encryptionAlgorithm; + asym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#rsa-oaep\0"); + asym_encryptionAlgorithm->encrypt = + (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))asym_encrypt_sp_basic256; + asym_encryptionAlgorithm->decrypt = + (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *)) + asym_decrypt_sp_basic256; + asym_encryptionAlgorithm->getLocalKeyLength = + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getLocalEncryptionKeyLength_sp_basic256; + asym_encryptionAlgorithm->getRemoteKeyLength = + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteEncryptionKeyLength_sp_basic256; + asym_encryptionAlgorithm->getLocalBlockSize = NULL; // TODO: Write function + asym_encryptionAlgorithm->getRemoteBlockSize = (size_t (*)(const UA_SecurityPolicy *, + const void *))asym_getRemoteBlockSize_sp_basic256; + asym_encryptionAlgorithm->getLocalPlainTextBlockSize = NULL; // TODO: Write function + asym_encryptionAlgorithm->getRemotePlainTextBlockSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemotePlainTextBlockSize_sp_basic256; + + asymmetricModule->makeCertificateThumbprint = asym_makeThumbprint_sp_basic256; + asymmetricModule->compareCertificateThumbprint = + asymmetricModule_compareCertificateThumbprint_sp_basic256; + + /* SymmetricModule */ + symmetricModule->generateKey = sym_generateKey_sp_basic256; + symmetricModule->generateNonce = sym_generateNonce_sp_basic256; UA_SecurityPolicySignatureAlgorithm *sym_signatureAlgorithm = - &policy->symmetricModule.cryptoModule.signatureAlgorithm; - sym_signatureAlgorithm->uri = UA_STRING_NULL; - sym_signatureAlgorithm->verify = verify_none; - sym_signatureAlgorithm->sign = sign_none; - sym_signatureAlgorithm->getLocalSignatureSize = length_none; - sym_signatureAlgorithm->getRemoteSignatureSize = length_none; - sym_signatureAlgorithm->getLocalKeyLength = length_none; - sym_signatureAlgorithm->getRemoteKeyLength = length_none; + &symmetricModule->cryptoModule.signatureAlgorithm; + sym_signatureAlgorithm->uri = + UA_STRING("http://www.w3.org/2000/09/xmldsig#hmac-sha1\0"); + sym_signatureAlgorithm->verify = + (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, const UA_ByteString *, + const UA_ByteString *))sym_verify_sp_basic256; + sym_signatureAlgorithm->sign = + (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, + const UA_ByteString *, UA_ByteString *))sym_sign_sp_basic256; + sym_signatureAlgorithm->getLocalSignatureSize = sym_getSignatureSize_sp_basic256; + sym_signatureAlgorithm->getRemoteSignatureSize = sym_getSignatureSize_sp_basic256; + sym_signatureAlgorithm->getLocalKeyLength = + (size_t (*)(const UA_SecurityPolicy *, + const void *))sym_getSigningKeyLength_sp_basic256; + sym_signatureAlgorithm->getRemoteKeyLength = + (size_t (*)(const UA_SecurityPolicy *, + const void *))sym_getSigningKeyLength_sp_basic256; UA_SecurityPolicyEncryptionAlgorithm *sym_encryptionAlgorithm = - &policy->symmetricModule.cryptoModule.encryptionAlgorithm; - sym_encryptionAlgorithm->encrypt = encrypt_none; - sym_encryptionAlgorithm->decrypt = decrypt_none; - sym_encryptionAlgorithm->getLocalKeyLength = length_none; - sym_encryptionAlgorithm->getRemoteKeyLength = length_none; - sym_encryptionAlgorithm->getLocalBlockSize = length_none; - sym_encryptionAlgorithm->getRemoteBlockSize = length_none; - sym_encryptionAlgorithm->getLocalPlainTextBlockSize = length_none; - sym_encryptionAlgorithm->getRemotePlainTextBlockSize = length_none; - policy->symmetricModule.secureChannelNonceLength = 0; + &symmetricModule->cryptoModule.encryptionAlgorithm; + sym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#aes256-cbc\0"); + sym_encryptionAlgorithm->encrypt = + (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_encrypt_sp_basic256; + sym_encryptionAlgorithm->decrypt = + (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_decrypt_sp_basic256; + sym_encryptionAlgorithm->getLocalKeyLength = sym_getEncryptionKeyLength_sp_basic256; + sym_encryptionAlgorithm->getRemoteKeyLength = sym_getEncryptionKeyLength_sp_basic256; + sym_encryptionAlgorithm->getLocalBlockSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic256; + sym_encryptionAlgorithm->getRemoteBlockSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic256; + sym_encryptionAlgorithm->getLocalPlainTextBlockSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic256; + sym_encryptionAlgorithm->getRemotePlainTextBlockSize = + (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic256; + symmetricModule->secureChannelNonceLength = 32; - policy->asymmetricModule.makeCertificateThumbprint = makeThumbprint_none; - policy->asymmetricModule.compareCertificateThumbprint = compareThumbprint_none; + // Use the same signature algorithm as the asymmetric component for certificate signing (see standard) + policy->certificateSigningAlgorithm = policy->asymmetricModule.cryptoModule.signatureAlgorithm; - // This only works for none since symmetric and asymmetric crypto modules do the same i.e. nothing - policy->asymmetricModule.cryptoModule = policy->symmetricModule.cryptoModule; + /* ChannelModule */ + channelModule->newContext = channelContext_newContext_sp_basic256; + channelModule->deleteContext = (void (*)(void *)) + channelContext_deleteContext_sp_basic256; - // Use the same signing algorithm as for asymmetric signing - policy->certificateSigningAlgorithm = policy->asymmetricModule.cryptoModule.signatureAlgorithm; + channelModule->setLocalSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) + channelContext_setLocalSymEncryptingKey_sp_basic256; + channelModule->setLocalSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) + channelContext_setLocalSymSigningKey_sp_basic256; + channelModule->setLocalSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *)) + channelContext_setLocalSymIv_sp_basic256; - policy->channelModule.newContext = newContext_none; - policy->channelModule.deleteContext = deleteContext_none; - policy->channelModule.setLocalSymEncryptingKey = setContextValue_none; - policy->channelModule.setLocalSymSigningKey = setContextValue_none; - policy->channelModule.setLocalSymIv = setContextValue_none; - policy->channelModule.setRemoteSymEncryptingKey = setContextValue_none; - policy->channelModule.setRemoteSymSigningKey = setContextValue_none; - policy->channelModule.setRemoteSymIv = setContextValue_none; - policy->channelModule.compareCertificate = compareCertificate_none; - policy->deleteMembers = policy_deletemembers_none; + channelModule->setRemoteSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) + channelContext_setRemoteSymEncryptingKey_sp_basic256; + channelModule->setRemoteSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) + channelContext_setRemoteSymSigningKey_sp_basic256; + channelModule->setRemoteSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *)) + channelContext_setRemoteSymIv_sp_basic256; - return UA_STATUSCODE_GOOD; + channelModule->compareCertificate = (UA_StatusCode (*)(const void *, const UA_ByteString *)) + channelContext_compareCertificate_sp_basic256; + + policy->updateCertificateAndPrivateKey = updateCertificateAndPrivateKey_sp_basic256; + policy->deleteMembers = deleteMembers_sp_basic256; + + return policyContext_newContext_sp_basic256(policy, localPrivateKey); } -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_securitypolicy_basic128rsa15.c" ***********************************/ +#endif + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/securityPolicies/ua_securitypolicy_basic256sha256.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2018 (c) Daniel Feist, Precitec GmbH & Co. KG */ #ifdef UA_ENABLE_ENCRYPTION + #include -#include -#include #include #include #include #include -#include +#include #include - +#include +#include +#include /* Notes: * mbedTLS' AES allows in-place encryption and decryption. Sow we don't have to @@ -42033,32 +55338,15 @@ UA_SecurityPolicy_None(UA_SecurityPolicy *policy, UA_CertificateVerification *ce * https://tls.mbed.org/discussions/generic/in-place-decryption-with-aes256-same-input-output-buffer */ -#define UA_SECURITYPOLICY_BASIC128RSA15_RSAPADDING_LEN 11 +#define UA_SECURITYPOLICY_BASIC256SHA256_RSAPADDING_LEN 42 #define UA_SHA1_LENGTH 20 -#define UA_SECURITYPOLICY_BASIC128RSA15_SYM_KEY_LENGTH 16 -#define UA_BASIC128RSA15_SYM_SIGNING_KEY_LENGTH 16 -#define UA_SECURITYPOLICY_BASIC128RSA15_SYM_ENCRYPTION_BLOCK_SIZE 16 -#define UA_SECURITYPOLICY_BASIC128RSA15_SYM_PLAIN_TEXT_BLOCK_SIZE 16 -#define UA_SECURITYPOLICY_BASIC128RSA15_MINASYMKEYLENGTH 128 -#define UA_SECURITYPOLICY_BASIC128RSA15_MAXASYMKEYLENGTH 256 - -#define UA_LOG_MBEDERR \ - char errBuff[300]; \ - mbedtls_strerror(mbedErr, errBuff, 300); \ - UA_LOG_WARNING(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, \ - "mbedTLS returned an error: %s", errBuff); \ - -#define UA_MBEDTLS_ERRORHANDLING(errorcode) \ - if(mbedErr) { \ - UA_LOG_MBEDERR \ - retval = errorcode; \ - } - -#define UA_MBEDTLS_ERRORHANDLING_RETURN(errorcode) \ - if(mbedErr) { \ - UA_LOG_MBEDERR \ - return errorcode; \ - } +#define UA_SHA256_LENGTH 32 +#define UA_BASIC256SHA256_SYM_SIGNING_KEY_LENGTH 32 +#define UA_SECURITYPOLICY_BASIC256SHA256_SYM_KEY_LENGTH 32 +#define UA_SECURITYPOLICY_BASIC256SHA256_SYM_ENCRYPTION_BLOCK_SIZE 16 +#define UA_SECURITYPOLICY_BASIC256SHA256_SYM_PLAIN_TEXT_BLOCK_SIZE 16 +#define UA_SECURITYPOLICY_BASIC256SHA256_MINASYMKEYLENGTH 256 +#define UA_SECURITYPOLICY_BASIC256SHA256_MAXASYMKEYLENGTH 512 typedef struct { const UA_SecurityPolicy *securityPolicy; @@ -42066,12 +55354,12 @@ typedef struct { mbedtls_ctr_drbg_context drbgContext; mbedtls_entropy_context entropyContext; - mbedtls_md_context_t sha1MdContext; + mbedtls_md_context_t sha256MdContext; mbedtls_pk_context localPrivateKey; -} Basic128Rsa15_PolicyContext; +} Basic256Sha256_PolicyContext; typedef struct { - Basic128Rsa15_PolicyContext *policyContext; + Basic256Sha256_PolicyContext *policyContext; UA_ByteString localSymSigningKey; UA_ByteString localSymEncryptingKey; @@ -42082,236 +55370,172 @@ typedef struct { UA_ByteString remoteSymIv; mbedtls_x509_crt remoteCertificate; -} Basic128Rsa15_ChannelContext; - +} Basic256Sha256_ChannelContext; /********************/ /* AsymmetricModule */ /********************/ +/* VERIFY AsymmetricSignatureAlgorithm_RSA-PKCS15-SHA2-256 */ static UA_StatusCode -asym_verify_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - Basic128Rsa15_ChannelContext *cc, - const UA_ByteString *message, - const UA_ByteString *signature) { +asym_verify_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + Basic256Sha256_ChannelContext *cc, + const UA_ByteString *message, + const UA_ByteString *signature) { if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL) return UA_STATUSCODE_BADINTERNALERROR; - /* Compute the sha1 hash */ - unsigned char hash[UA_SHA1_LENGTH]; + unsigned char hash[UA_SHA256_LENGTH]; #if MBEDTLS_VERSION_NUMBER >= 0x02070000 - mbedtls_sha1_ret(message->data, message->length, hash); + // TODO check return status + mbedtls_sha256_ret(message->data, message->length, hash, 0); #else - mbedtls_sha1(message->data, message->length, hash); + mbedtls_sha256(message->data, message->length, hash, 0); #endif /* Set the RSA settings */ mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); - mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, 0); + mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256); - /* Verify */ + /* For RSA keys, the default padding type is PKCS#1 v1.5 in mbedtls_pk_verify() */ + /* Alternatively, use more specific function mbedtls_rsa_rsassa_pkcs1_v15_verify(), i.e. */ + /* int mbedErr = mbedtls_rsa_rsassa_pkcs1_v15_verify(rsaContext, NULL, NULL, + MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA256, + UA_SHA256_LENGTH, hash, + signature->data); */ int mbedErr = mbedtls_pk_verify(&cc->remoteCertificate.pk, - MBEDTLS_MD_SHA1, hash, UA_SHA1_LENGTH, + MBEDTLS_MD_SHA256, hash, UA_SHA256_LENGTH, signature->data, signature->length); - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADSECURITYCHECKSFAILED); + + if(mbedErr) + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; return UA_STATUSCODE_GOOD; } +/* AsymmetricSignatureAlgorithm_RSA-PKCS15-SHA2-256 */ static UA_StatusCode -asym_sign_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - Basic128Rsa15_ChannelContext *cc, - const UA_ByteString *message, - UA_ByteString *signature) { +asym_sign_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + Basic256Sha256_ChannelContext *cc, + const UA_ByteString *message, + UA_ByteString *signature) { if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL) return UA_STATUSCODE_BADINTERNALERROR; - unsigned char hash[UA_SHA1_LENGTH]; + unsigned char hash[UA_SHA256_LENGTH]; #if MBEDTLS_VERSION_NUMBER >= 0x02070000 - mbedtls_sha1_ret(message->data, message->length, hash); + // TODO check return status + mbedtls_sha256_ret(message->data, message->length, hash, 0); #else - mbedtls_sha1(message->data, message->length, hash); + mbedtls_sha256(message->data, message->length, hash, 0); #endif - Basic128Rsa15_PolicyContext *pc = cc->policyContext; - mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(pc->localPrivateKey); - mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, 0); - - size_t sigLen = 0; - int mbedErr = mbedtls_pk_sign(&pc->localPrivateKey, - MBEDTLS_MD_SHA1, hash, - UA_SHA1_LENGTH, signature->data, - &sigLen, mbedtls_ctr_drbg_random, - &pc->drbgContext); - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADINTERNALERROR); - return UA_STATUSCODE_GOOD; -} - -static size_t -asym_getLocalSignatureSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const Basic128Rsa15_ChannelContext *cc) { - if(securityPolicy == NULL || cc == NULL) - return 0; - - return mbedtls_pk_rsa(cc->policyContext->localPrivateKey)->len; -} - -static size_t -asym_getRemoteSignatureSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const Basic128Rsa15_ChannelContext *cc) { - if(securityPolicy == NULL || cc == NULL) - return 0; - - return mbedtls_pk_rsa(cc->remoteCertificate.pk)->len; -} - -static UA_StatusCode -asym_encrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - Basic128Rsa15_ChannelContext *cc, - UA_ByteString *data) { - if(securityPolicy == NULL || cc == NULL || data == NULL) - return UA_STATUSCODE_BADINTERNALERROR; - - const size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. - getRemotePlainTextBlockSize(securityPolicy, cc); - - if(data->length % plainTextBlockSize != 0) - return UA_STATUSCODE_BADINTERNALERROR; - - mbedtls_rsa_context *remoteRsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); - mbedtls_rsa_set_padding(remoteRsaContext, MBEDTLS_RSA_PKCS_V15, 0); - - UA_ByteString encrypted; - const size_t bufferOverhead = - UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(securityPolicy, cc, data->length); - UA_StatusCode retval = UA_ByteString_allocBuffer(&encrypted, data->length + bufferOverhead); - if(retval != UA_STATUSCODE_GOOD) - return retval; - - size_t lenDataToEncrypt = data->length; - size_t inOffset = 0; - size_t offset = 0; - size_t outLength = 0; - Basic128Rsa15_PolicyContext *pc = cc->policyContext; - while(lenDataToEncrypt >= plainTextBlockSize) { - int mbedErr = mbedtls_pk_encrypt(&cc->remoteCertificate.pk, - data->data + inOffset, plainTextBlockSize, - encrypted.data + offset, &outLength, - encrypted.length - offset, - mbedtls_ctr_drbg_random, - &pc->drbgContext); - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADINTERNALERROR); - if(retval != UA_STATUSCODE_GOOD) { - UA_ByteString_deleteMembers(&encrypted); - return retval; - } - - inOffset += plainTextBlockSize; - offset += outLength; - lenDataToEncrypt -= plainTextBlockSize; - } - - memcpy(data->data, encrypted.data, offset); - UA_ByteString_deleteMembers(&encrypted); + Basic256Sha256_PolicyContext *pc = cc->policyContext; + mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(pc->localPrivateKey); + mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256); + + size_t sigLen = 0; + /* For RSA keys, the default padding type is PKCS#1 v1.5 in mbedtls_pk_sign */ + /* Alternatively use more specific function mbedtls_rsa_rsassa_pkcs1_v15_sign() */ + int mbedErr = mbedtls_pk_sign(&pc->localPrivateKey, + MBEDTLS_MD_SHA256, hash, + UA_SHA256_LENGTH, signature->data, + &sigLen, mbedtls_ctr_drbg_random, + &pc->drbgContext); + if(mbedErr) + return UA_STATUSCODE_BADINTERNALERROR; return UA_STATUSCODE_GOOD; } -static UA_StatusCode -asym_decrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - Basic128Rsa15_ChannelContext *cc, - UA_ByteString *data) { - if(securityPolicy == NULL || cc == NULL || data == NULL) - return UA_STATUSCODE_BADINTERNALERROR; +static size_t +asym_getLocalSignatureSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const Basic256Sha256_ChannelContext *cc) { + if(securityPolicy == NULL || cc == NULL) + return 0; - mbedtls_rsa_context *rsaContext = - mbedtls_pk_rsa(cc->policyContext->localPrivateKey); - mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, 0); + return mbedtls_pk_rsa(cc->policyContext->localPrivateKey)->len; +} - if(data->length % rsaContext->len != 0) +static size_t +asym_getRemoteSignatureSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const Basic256Sha256_ChannelContext *cc) { + if(securityPolicy == NULL || cc == NULL) + return 0; + + return mbedtls_pk_rsa(cc->remoteCertificate.pk)->len; +} + +/* AsymmetricEncryptionAlgorithm_RSA-OAEP-SHA1 */ +static UA_StatusCode +asym_encrypt_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + Basic256Sha256_ChannelContext *cc, + UA_ByteString *data) { + if(securityPolicy == NULL || cc == NULL || data == NULL) return UA_STATUSCODE_BADINTERNALERROR; - UA_ByteString decrypted; - UA_StatusCode retval = UA_ByteString_allocBuffer(&decrypted, data->length); - if(retval != UA_STATUSCODE_GOOD) - return retval; + const size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule. + encryptionAlgorithm.getRemotePlainTextBlockSize(securityPolicy, cc); - size_t lenDataToDecrypt = data->length; - size_t inOffset = 0; - size_t offset = 0; - size_t outLength = 0; - while(lenDataToDecrypt >= rsaContext->len) { - int mbedErr = mbedtls_pk_decrypt(&cc->policyContext->localPrivateKey, - data->data + inOffset, rsaContext->len, - decrypted.data + offset, &outLength, - decrypted.length - offset, NULL, NULL); - if(mbedErr) - UA_ByteString_deleteMembers(&decrypted); // TODO: Maybe change error macro to jump to cleanup? - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADSECURITYCHECKSFAILED); + mbedtls_rsa_context *remoteRsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); + mbedtls_rsa_set_padding(remoteRsaContext, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA1); - inOffset += rsaContext->len; - offset += outLength; - lenDataToDecrypt -= rsaContext->len; - } + return mbedtls_encrypt_rsaOaep(remoteRsaContext, &cc->policyContext->drbgContext, + data, plainTextBlockSize); +} - if(lenDataToDecrypt == 0) { - memcpy(data->data, decrypted.data, offset); - data->length = offset; - } else { - retval = UA_STATUSCODE_BADINTERNALERROR; - } +/* AsymmetricEncryptionAlgorithm_RSA-OAEP-SHA1 */ +static UA_StatusCode +asym_decrypt_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + Basic256Sha256_ChannelContext *cc, + UA_ByteString *data) { + if(securityPolicy == NULL || cc == NULL || data == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + return mbedtls_decrypt_rsaOaep(&cc->policyContext->localPrivateKey, + &cc->policyContext->drbgContext, data); +} - UA_ByteString_deleteMembers(&decrypted); - return retval; +static size_t +asym_getLocalEncryptionKeyLength_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const Basic256Sha256_ChannelContext *cc) { + return mbedtls_pk_get_len(&cc->policyContext->localPrivateKey) * 8; } static size_t -asym_getRemoteEncryptionKeyLength_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const Basic128Rsa15_ChannelContext *cc) { +asym_getRemoteEncryptionKeyLength_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const Basic256Sha256_ChannelContext *cc) { return mbedtls_pk_get_len(&cc->remoteCertificate.pk) * 8; } static size_t -asym_getRemoteBlockSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const Basic128Rsa15_ChannelContext *cc) { +asym_getRemoteBlockSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const Basic256Sha256_ChannelContext *cc) { mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); return rsaContext->len; } static size_t -asym_getRemotePlainTextBlockSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const Basic128Rsa15_ChannelContext *cc) { +asym_getRemotePlainTextBlockSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const Basic256Sha256_ChannelContext *cc) { mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); - return rsaContext->len - UA_SECURITYPOLICY_BASIC128RSA15_RSAPADDING_LEN; + return rsaContext->len - UA_SECURITYPOLICY_BASIC256SHA256_RSAPADDING_LEN; } static UA_StatusCode -asym_makeThumbprint_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *certificate, - UA_ByteString *thumbprint) { +asym_makeThumbprint_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *certificate, + UA_ByteString *thumbprint) { if(securityPolicy == NULL || certificate == NULL || thumbprint == NULL) return UA_STATUSCODE_BADINTERNALERROR; - - if(UA_ByteString_equal(certificate, &UA_BYTESTRING_NULL)) - return UA_STATUSCODE_BADINTERNALERROR; - - if(thumbprint->length != UA_SHA1_LENGTH) - return UA_STATUSCODE_BADINTERNALERROR; - -#if MBEDTLS_VERSION_NUMBER >= 0x02070000 - mbedtls_sha1_ret(certificate->data, certificate->length, thumbprint->data); -#else - mbedtls_sha1(certificate->data, certificate->length, thumbprint->data); -#endif - return UA_STATUSCODE_GOOD; + return mbedtls_thumbprint_sha1(certificate, thumbprint); } static UA_StatusCode -asymmetricModule_compareCertificateThumbprint_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *certificateThumbprint) { +asymmetricModule_compareCertificateThumbprint_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *certificateThumbprint) { if(securityPolicy == NULL || certificateThumbprint == NULL) return UA_STATUSCODE_BADINTERNALERROR; - Basic128Rsa15_PolicyContext *pc = (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext; + Basic256Sha256_PolicyContext *pc = (Basic256Sha256_PolicyContext *)securityPolicy->policyContext; if(!UA_ByteString_equal(certificateThumbprint, &pc->localCertThumbprint)) return UA_STATUSCODE_BADCERTIFICATEINVALID; @@ -42322,102 +55546,94 @@ asymmetricModule_compareCertificateThumbprint_sp_basic128rsa15(const UA_Security /* SymmetricModule */ /*******************/ -static void -md_hmac(mbedtls_md_context_t *context, const UA_ByteString *key, - const UA_ByteString *in, unsigned char out[20]) { - mbedtls_md_hmac_starts(context, key->data, key->length); - mbedtls_md_hmac_update(context, in->data, in->length); - mbedtls_md_hmac_finish(context, out); -} - static UA_StatusCode -sym_verify_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - Basic128Rsa15_ChannelContext *cc, - const UA_ByteString *message, - const UA_ByteString *signature) { +sym_verify_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + Basic256Sha256_ChannelContext *cc, + const UA_ByteString *message, + const UA_ByteString *signature) { if(securityPolicy == NULL || cc == NULL || message == NULL || signature == NULL) return UA_STATUSCODE_BADINTERNALERROR; /* Compute MAC */ - if(signature->length != UA_SHA1_LENGTH) { + if(signature->length != UA_SHA256_LENGTH) { UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, "Signature size does not have the desired size defined by the security policy"); return UA_STATUSCODE_BADSECURITYCHECKSFAILED; } - Basic128Rsa15_PolicyContext *pc = - (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext; + Basic256Sha256_PolicyContext *pc = + (Basic256Sha256_PolicyContext *)securityPolicy->policyContext; - unsigned char mac[UA_SHA1_LENGTH]; - md_hmac(&pc->sha1MdContext, &cc->remoteSymSigningKey, message, mac); + unsigned char mac[UA_SHA256_LENGTH]; + mbedtls_hmac(&pc->sha256MdContext, &cc->remoteSymSigningKey, message, mac); /* Compare with Signature */ - if(memcmp(signature->data, mac, UA_SHA1_LENGTH) != 0) + if(!UA_constantTimeEqual(signature->data, mac, UA_SHA256_LENGTH)) return UA_STATUSCODE_BADSECURITYCHECKSFAILED; return UA_STATUSCODE_GOOD; } static UA_StatusCode -sym_sign_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const Basic128Rsa15_ChannelContext *cc, - const UA_ByteString *message, - UA_ByteString *signature) { - if(signature->length != UA_SHA1_LENGTH) +sym_sign_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const Basic256Sha256_ChannelContext *cc, + const UA_ByteString *message, + UA_ByteString *signature) { + if(signature->length != UA_SHA256_LENGTH) return UA_STATUSCODE_BADINTERNALERROR; - md_hmac(&cc->policyContext->sha1MdContext, &cc->localSymSigningKey, - message, signature->data); + mbedtls_hmac(&cc->policyContext->sha256MdContext, &cc->localSymSigningKey, + message, signature->data); return UA_STATUSCODE_GOOD; } static size_t -sym_getSignatureSize_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const void *channelContext) { - return UA_SHA1_LENGTH; +sym_getSignatureSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const void *channelContext) { + return UA_SHA256_LENGTH; } static size_t -sym_getSigningKeyLength_sp_basic128rsa15(const UA_SecurityPolicy *const securityPolicy, - const void *const channelContext) { - return UA_BASIC128RSA15_SYM_SIGNING_KEY_LENGTH; +sym_getSigningKeyLength_sp_basic256sha256(const UA_SecurityPolicy *const securityPolicy, + const void *const channelContext) { + return UA_BASIC256SHA256_SYM_SIGNING_KEY_LENGTH; } static size_t -sym_getEncryptionKeyLength_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const void *channelContext) { - return UA_SECURITYPOLICY_BASIC128RSA15_SYM_KEY_LENGTH; +sym_getEncryptionKeyLength_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const void *channelContext) { + return UA_SECURITYPOLICY_BASIC256SHA256_SYM_KEY_LENGTH; } static size_t -sym_getEncryptionBlockSize_sp_basic128rsa15(const UA_SecurityPolicy *const securityPolicy, - const void *const channelContext) { - return UA_SECURITYPOLICY_BASIC128RSA15_SYM_ENCRYPTION_BLOCK_SIZE; +sym_getEncryptionBlockSize_sp_basic256sha256(const UA_SecurityPolicy *const securityPolicy, + const void *const channelContext) { + return UA_SECURITYPOLICY_BASIC256SHA256_SYM_ENCRYPTION_BLOCK_SIZE; } static size_t -sym_getPlainTextBlockSize_sp_basic128rsa15(const UA_SecurityPolicy *const securityPolicy, - const void *const channelContext) { - return UA_SECURITYPOLICY_BASIC128RSA15_SYM_PLAIN_TEXT_BLOCK_SIZE; +sym_getPlainTextBlockSize_sp_basic256sha256(const UA_SecurityPolicy *const securityPolicy, + const void *const channelContext) { + return UA_SECURITYPOLICY_BASIC256SHA256_SYM_PLAIN_TEXT_BLOCK_SIZE; } static UA_StatusCode -sym_encrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const Basic128Rsa15_ChannelContext *cc, - UA_ByteString *data) { +sym_encrypt_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const Basic256Sha256_ChannelContext *cc, + UA_ByteString *data) { if(securityPolicy == NULL || cc == NULL || data == NULL) return UA_STATUSCODE_BADINTERNALERROR; - if(cc->localSymIv.length != - securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.getLocalBlockSize(securityPolicy, cc)) + if(cc->localSymIv.length != securityPolicy->symmetricModule.cryptoModule. + encryptionAlgorithm.getLocalBlockSize(securityPolicy, cc)) return UA_STATUSCODE_BADINTERNALERROR; - size_t plainTextBlockSize = - securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.getLocalPlainTextBlockSize(securityPolicy, cc); + size_t plainTextBlockSize = securityPolicy->symmetricModule.cryptoModule. + encryptionAlgorithm.getLocalPlainTextBlockSize(securityPolicy, cc); if(data->length % plainTextBlockSize != 0) { UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, "Length of data to encrypt is not a multiple of the plain text block size." - "Padding might not have been calculated appropriately."); + "Padding might not have been calculated appropriately."); return UA_STATUSCODE_BADINTERNALERROR; } @@ -42425,7 +55641,8 @@ sym_encrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, unsigned int keylength = (unsigned int)(cc->localSymEncryptingKey.length * 8); mbedtls_aes_context aesContext; int mbedErr = mbedtls_aes_setkey_enc(&aesContext, cc->localSymEncryptingKey.data, keylength); - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADINTERNALERROR); + if(mbedErr) + return UA_STATUSCODE_BADINTERNALERROR; UA_ByteString ivCopy; UA_StatusCode retval = UA_ByteString_copy(&cc->localSymIv, &ivCopy); @@ -42434,20 +55651,21 @@ sym_encrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_ENCRYPT, data->length, ivCopy.data, data->data, data->data); - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADINTERNALERROR); + if(mbedErr) + retval = UA_STATUSCODE_BADINTERNALERROR; UA_ByteString_deleteMembers(&ivCopy); return retval; } static UA_StatusCode -sym_decrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const Basic128Rsa15_ChannelContext *cc, - UA_ByteString *data) { +sym_decrypt_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const Basic256Sha256_ChannelContext *cc, + UA_ByteString *data) { if(securityPolicy == NULL || cc == NULL || data == NULL) return UA_STATUSCODE_BADINTERNALERROR; - size_t encryptionBlockSize = - securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.getLocalBlockSize(securityPolicy, cc); + size_t encryptionBlockSize = securityPolicy->symmetricModule.cryptoModule. + encryptionAlgorithm.getRemoteBlockSize(securityPolicy, cc); if(cc->remoteSymIv.length != encryptionBlockSize) return UA_STATUSCODE_BADINTERNALERROR; @@ -42461,7 +55679,8 @@ sym_decrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, unsigned int keylength = (unsigned int)(cc->remoteSymEncryptingKey.length * 8); mbedtls_aes_context aesContext; int mbedErr = mbedtls_aes_setkey_dec(&aesContext, cc->remoteSymEncryptingKey.data, keylength); - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADINTERNALERROR); + if(mbedErr) + return UA_STATUSCODE_BADINTERNALERROR; UA_ByteString ivCopy; UA_StatusCode retval = UA_ByteString_copy(&cc->remoteSymIv, &ivCopy); @@ -42470,109 +55689,36 @@ sym_decrypt_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_DECRYPT, data->length, ivCopy.data, data->data, data->data); - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADINTERNALERROR); + if(mbedErr) + retval = UA_STATUSCODE_BADINTERNALERROR; UA_ByteString_deleteMembers(&ivCopy); return retval; } -static void -swapBuffers(UA_ByteString *const bufA, UA_ByteString *const bufB) { - UA_ByteString tmp = *bufA; - *bufA = *bufB; - *bufB = tmp; -} - static UA_StatusCode -sym_generateKey_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *secret, const UA_ByteString *seed, - UA_ByteString *out) { +sym_generateKey_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *secret, const UA_ByteString *seed, + UA_ByteString *out) { if(securityPolicy == NULL || secret == NULL || seed == NULL || out == NULL) return UA_STATUSCODE_BADINTERNALERROR; - Basic128Rsa15_PolicyContext *pc = - (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext; - - size_t hashLen = 0; - const mbedtls_md_info_t *mdInfo = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1); - hashLen = (size_t)mbedtls_md_get_size(mdInfo); - - UA_ByteString A_and_seed; - UA_ByteString_allocBuffer(&A_and_seed, hashLen + seed->length); - memcpy(A_and_seed.data + hashLen, seed->data, seed->length); - - UA_ByteString ANext_and_seed; - UA_ByteString_allocBuffer(&ANext_and_seed, hashLen + seed->length); - memcpy(ANext_and_seed.data + hashLen, seed->data, seed->length); - - UA_ByteString A = { - hashLen, - A_and_seed.data - }; - - UA_ByteString ANext = { - hashLen, - ANext_and_seed.data - }; - - md_hmac(&pc->sha1MdContext, secret, seed, A.data); - - UA_StatusCode retval = 0; - for(size_t offset = 0; offset < out->length; offset += hashLen) { - UA_ByteString outSegment = { - hashLen, - out->data + offset - }; - UA_Boolean bufferAllocated = UA_FALSE; - // Not enough room in out buffer to write the hash. - if(offset + hashLen > out->length) { - outSegment.data = NULL; - outSegment.length = 0; - retval |= UA_ByteString_allocBuffer(&outSegment, hashLen); - if(retval != UA_STATUSCODE_GOOD) { - UA_ByteString_deleteMembers(&A_and_seed); - UA_ByteString_deleteMembers(&ANext_and_seed); - return retval; - } - bufferAllocated = UA_TRUE; - } - - md_hmac(&pc->sha1MdContext, secret, &A_and_seed, outSegment.data); - md_hmac(&pc->sha1MdContext, secret, &A, ANext.data); - - if(retval != UA_STATUSCODE_GOOD) { - if(bufferAllocated) - UA_ByteString_deleteMembers(&outSegment); - UA_ByteString_deleteMembers(&A_and_seed); - UA_ByteString_deleteMembers(&ANext_and_seed); - return retval; - } - - if(bufferAllocated) { - memcpy(out->data + offset, outSegment.data, out->length - offset); - UA_ByteString_deleteMembers(&outSegment); - } - - swapBuffers(&ANext_and_seed, &A_and_seed); - swapBuffers(&ANext, &A); - } + Basic256Sha256_PolicyContext *pc = + (Basic256Sha256_PolicyContext *)securityPolicy->policyContext; - UA_ByteString_deleteMembers(&A_and_seed); - UA_ByteString_deleteMembers(&ANext_and_seed); - return UA_STATUSCODE_GOOD; + return mbedtls_generateKey(&pc->sha256MdContext, secret, seed, out); } static UA_StatusCode -sym_generateNonce_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - UA_ByteString *out) { +sym_generateNonce_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + UA_ByteString *out) { if(securityPolicy == NULL || securityPolicy->policyContext == NULL || out == NULL) return UA_STATUSCODE_BADINTERNALERROR; - Basic128Rsa15_PolicyContext *data = - (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext; - - int mbedErr = mbedtls_ctr_drbg_random(&data->drbgContext, out->data, out->length); - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADUNEXPECTEDERROR); - + Basic256Sha256_PolicyContext *pc = + (Basic256Sha256_PolicyContext *)securityPolicy->policyContext; + int mbedErr = mbedtls_ctr_drbg_random(&pc->drbgContext, out->data, out->length); + if(mbedErr) + return UA_STATUSCODE_BADUNEXPECTEDERROR; return UA_STATUSCODE_GOOD; } @@ -42582,29 +55728,28 @@ sym_generateNonce_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, /* Assumes that the certificate has been verified externally */ static UA_StatusCode -parseRemoteCertificate_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, - const UA_ByteString *remoteCertificate) { +parseRemoteCertificate_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, + const UA_ByteString *remoteCertificate) { if(remoteCertificate == NULL || cc == NULL) return UA_STATUSCODE_BADINTERNALERROR; - const UA_SecurityPolicy *securityPolicy = cc->policyContext->securityPolicy; - /* Parse the certificate */ int mbedErr = mbedtls_x509_crt_parse(&cc->remoteCertificate, remoteCertificate->data, remoteCertificate->length); - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADSECURITYCHECKSFAILED); + if(mbedErr) + return UA_STATUSCODE_BADSECURITYCHECKSFAILED; /* Check the key length */ mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); - if(rsaContext->len < UA_SECURITYPOLICY_BASIC128RSA15_MINASYMKEYLENGTH || - rsaContext->len > UA_SECURITYPOLICY_BASIC128RSA15_MAXASYMKEYLENGTH) + if(rsaContext->len < UA_SECURITYPOLICY_BASIC256SHA256_MINASYMKEYLENGTH || + rsaContext->len > UA_SECURITYPOLICY_BASIC256SHA256_MAXASYMKEYLENGTH) return UA_STATUSCODE_BADCERTIFICATEUSENOTALLOWED; return UA_STATUSCODE_GOOD; } static void -channelContext_deleteContext_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc) { +channelContext_deleteContext_sp_basic256sha256(Basic256Sha256_ChannelContext *cc) { UA_ByteString_deleteMembers(&cc->localSymSigningKey); UA_ByteString_deleteMembers(&cc->localSymEncryptingKey); UA_ByteString_deleteMembers(&cc->localSymIv); @@ -42619,21 +55764,21 @@ channelContext_deleteContext_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc) } static UA_StatusCode -channelContext_newContext_sp_basic128rsa15(const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *remoteCertificate, - void **pp_contextData) { +channelContext_newContext_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, + const UA_ByteString *remoteCertificate, + void **pp_contextData) { if(securityPolicy == NULL || remoteCertificate == NULL || pp_contextData == NULL) return UA_STATUSCODE_BADINTERNALERROR; /* Allocate the channel context */ - *pp_contextData = UA_malloc(sizeof(Basic128Rsa15_ChannelContext)); + *pp_contextData = UA_malloc(sizeof(Basic256Sha256_ChannelContext)); if(*pp_contextData == NULL) return UA_STATUSCODE_BADOUTOFMEMORY; - Basic128Rsa15_ChannelContext *cc = (Basic128Rsa15_ChannelContext *)*pp_contextData; + Basic256Sha256_ChannelContext *cc = (Basic256Sha256_ChannelContext *)*pp_contextData; /* Initialize the channel context */ - cc->policyContext = (Basic128Rsa15_PolicyContext *)securityPolicy->policyContext; + cc->policyContext = (Basic256Sha256_PolicyContext *)securityPolicy->policyContext; UA_ByteString_init(&cc->localSymSigningKey); UA_ByteString_init(&cc->localSymEncryptingKey); @@ -42646,17 +55791,17 @@ channelContext_newContext_sp_basic128rsa15(const UA_SecurityPolicy *securityPoli mbedtls_x509_crt_init(&cc->remoteCertificate); // TODO: this can be optimized so that we dont allocate memory before parsing the certificate - UA_StatusCode retval = parseRemoteCertificate_sp_basic128rsa15(cc, remoteCertificate); + UA_StatusCode retval = parseRemoteCertificate_sp_basic256sha256(cc, remoteCertificate); if(retval != UA_STATUSCODE_GOOD) { - channelContext_deleteContext_sp_basic128rsa15(cc); + channelContext_deleteContext_sp_basic256sha256(cc); *pp_contextData = NULL; } return retval; } static UA_StatusCode -channelContext_setLocalSymEncryptingKey_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, - const UA_ByteString *key) { +channelContext_setLocalSymEncryptingKey_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, + const UA_ByteString *key) { if(key == NULL || cc == NULL) return UA_STATUSCODE_BADINTERNALERROR; @@ -42665,8 +55810,8 @@ channelContext_setLocalSymEncryptingKey_sp_basic128rsa15(Basic128Rsa15_ChannelCo } static UA_StatusCode -channelContext_setLocalSymSigningKey_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, - const UA_ByteString *key) { +channelContext_setLocalSymSigningKey_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, + const UA_ByteString *key) { if(key == NULL || cc == NULL) return UA_STATUSCODE_BADINTERNALERROR; @@ -42676,8 +55821,8 @@ channelContext_setLocalSymSigningKey_sp_basic128rsa15(Basic128Rsa15_ChannelConte static UA_StatusCode -channelContext_setLocalSymIv_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, - const UA_ByteString *iv) { +channelContext_setLocalSymIv_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, + const UA_ByteString *iv) { if(iv == NULL || cc == NULL) return UA_STATUSCODE_BADINTERNALERROR; @@ -42686,8 +55831,8 @@ channelContext_setLocalSymIv_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, } static UA_StatusCode -channelContext_setRemoteSymEncryptingKey_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, - const UA_ByteString *key) { +channelContext_setRemoteSymEncryptingKey_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, + const UA_ByteString *key) { if(key == NULL || cc == NULL) return UA_STATUSCODE_BADINTERNALERROR; @@ -42696,8 +55841,8 @@ channelContext_setRemoteSymEncryptingKey_sp_basic128rsa15(Basic128Rsa15_ChannelC } static UA_StatusCode -channelContext_setRemoteSymSigningKey_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, - const UA_ByteString *key) { +channelContext_setRemoteSymSigningKey_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, + const UA_ByteString *key) { if(key == NULL || cc == NULL) return UA_STATUSCODE_BADINTERNALERROR; @@ -42706,8 +55851,8 @@ channelContext_setRemoteSymSigningKey_sp_basic128rsa15(Basic128Rsa15_ChannelCont } static UA_StatusCode -channelContext_setRemoteSymIv_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, - const UA_ByteString *iv) { +channelContext_setRemoteSymIv_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, + const UA_ByteString *iv) { if(iv == NULL || cc == NULL) return UA_STATUSCODE_BADINTERNALERROR; @@ -42716,20 +55861,16 @@ channelContext_setRemoteSymIv_sp_basic128rsa15(Basic128Rsa15_ChannelContext *cc, } static UA_StatusCode -channelContext_compareCertificate_sp_basic128rsa15(const Basic128Rsa15_ChannelContext *cc, - const UA_ByteString *certificate) { +channelContext_compareCertificate_sp_basic256sha256(const Basic256Sha256_ChannelContext *cc, + const UA_ByteString *certificate) { if(cc == NULL || certificate == NULL) return UA_STATUSCODE_BADINTERNALERROR; - const UA_SecurityPolicy *securityPolicy = cc->policyContext->securityPolicy; - mbedtls_x509_crt cert; mbedtls_x509_crt_init(&cert); int mbedErr = mbedtls_x509_crt_parse(&cert, certificate->data, certificate->length); - if(mbedErr) { - UA_LOG_MBEDERR; + if(mbedErr) return UA_STATUSCODE_BADSECURITYCHECKSFAILED; - } UA_StatusCode retval = UA_STATUSCODE_GOOD; if(cert.raw.len != cc->remoteCertificate.raw.len || @@ -42741,7 +55882,7 @@ channelContext_compareCertificate_sp_basic128rsa15(const Basic128Rsa15_ChannelCo } static void -deleteMembers_sp_basic128rsa15(UA_SecurityPolicy *securityPolicy) { +deleteMembers_sp_basic256sha256(UA_SecurityPolicy *securityPolicy) { if(securityPolicy == NULL) return; @@ -42751,31 +55892,86 @@ deleteMembers_sp_basic128rsa15(UA_SecurityPolicy *securityPolicy) { UA_ByteString_deleteMembers(&securityPolicy->localCertificate); /* delete all allocated members in the context */ - Basic128Rsa15_PolicyContext *pc = (Basic128Rsa15_PolicyContext *) + Basic256Sha256_PolicyContext *pc = (Basic256Sha256_PolicyContext *) securityPolicy->policyContext; mbedtls_ctr_drbg_free(&pc->drbgContext); mbedtls_entropy_free(&pc->entropyContext); mbedtls_pk_free(&pc->localPrivateKey); - mbedtls_md_free(&pc->sha1MdContext); + mbedtls_md_free(&pc->sha256MdContext); UA_ByteString_deleteMembers(&pc->localCertThumbprint); UA_LOG_DEBUG(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, - "Deleted members of EndpointContext for sp_basic128rsa15"); + "Deleted members of EndpointContext for sp_basic256sha256"); UA_free(pc); securityPolicy->policyContext = NULL; } static UA_StatusCode -policyContext_newContext_sp_basic128rsa15(UA_SecurityPolicy *securityPolicy, - const UA_ByteString localPrivateKey) { +updateCertificateAndPrivateKey_sp_basic256sha256(UA_SecurityPolicy *securityPolicy, + const UA_ByteString newCertificate, + const UA_ByteString newPrivateKey) { + if(securityPolicy == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + + if(securityPolicy->policyContext == NULL) + return UA_STATUSCODE_BADINTERNALERROR; + + Basic256Sha256_PolicyContext *pc = + (Basic256Sha256_PolicyContext *) securityPolicy->policyContext; + + UA_ByteString_deleteMembers(&securityPolicy->localCertificate); + + UA_StatusCode retval = UA_ByteString_allocBuffer(&securityPolicy->localCertificate, + newCertificate.length + 1); + if(retval != UA_STATUSCODE_GOOD) + return retval; + memcpy(securityPolicy->localCertificate.data, newCertificate.data, newCertificate.length); + securityPolicy->localCertificate.data[newCertificate.length] = '\0'; + securityPolicy->localCertificate.length--; + + /* Set the new private key */ + mbedtls_pk_free(&pc->localPrivateKey); + mbedtls_pk_init(&pc->localPrivateKey); + int mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey, newPrivateKey.data, + newPrivateKey.length, NULL, 0); + if(mbedErr) { + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; + goto error; + } + + retval = asym_makeThumbprint_sp_basic256sha256(pc->securityPolicy, + &securityPolicy->localCertificate, + &pc->localCertThumbprint); + if(retval != UA_STATUSCODE_GOOD) + goto error; + + return retval; + + error: + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Could not update certificate and private key"); + if(securityPolicy->policyContext != NULL) + deleteMembers_sp_basic256sha256(securityPolicy); + return retval; +} + +static UA_StatusCode +policyContext_newContext_sp_basic256sha256(UA_SecurityPolicy *securityPolicy, + const UA_ByteString localPrivateKey) { UA_StatusCode retval = UA_STATUSCODE_GOOD; if(securityPolicy == NULL) return UA_STATUSCODE_BADINTERNALERROR; - Basic128Rsa15_PolicyContext *pc = (Basic128Rsa15_PolicyContext *) - UA_malloc(sizeof(Basic128Rsa15_PolicyContext)); + if (localPrivateKey.length == 0) { + UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, + "Can not initialize security policy. Private key is empty."); + return UA_STATUSCODE_BADINVALIDARGUMENT; + } + + Basic256Sha256_PolicyContext *pc = (Basic256Sha256_PolicyContext *) + UA_malloc(sizeof(Basic256Sha256_PolicyContext)); securityPolicy->policyContext = (void *)pc; if(!pc) { retval = UA_STATUSCODE_BADOUTOFMEMORY; @@ -42783,50 +55979,53 @@ policyContext_newContext_sp_basic128rsa15(UA_SecurityPolicy *securityPolicy, } /* Initialize the PolicyContext */ - memset(pc, 0, sizeof(Basic128Rsa15_PolicyContext)); + memset(pc, 0, sizeof(Basic256Sha256_PolicyContext)); mbedtls_ctr_drbg_init(&pc->drbgContext); mbedtls_entropy_init(&pc->entropyContext); mbedtls_pk_init(&pc->localPrivateKey); - mbedtls_md_init(&pc->sha1MdContext); + mbedtls_md_init(&pc->sha256MdContext); pc->securityPolicy = securityPolicy; /* Initialized the message digest */ - const mbedtls_md_info_t *const mdInfo = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1); - int mbedErr = mbedtls_md_setup(&pc->sha1MdContext, mdInfo, MBEDTLS_MD_SHA1); - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADOUTOFMEMORY); - if(retval != UA_STATUSCODE_GOOD) + const mbedtls_md_info_t *const mdInfo = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256); + int mbedErr = mbedtls_md_setup(&pc->sha256MdContext, mdInfo, MBEDTLS_MD_SHA256); + if(mbedErr) { + retval = UA_STATUSCODE_BADOUTOFMEMORY; goto error; + } /* Add the system entropy source */ mbedErr = mbedtls_entropy_add_source(&pc->entropyContext, mbedtls_platform_entropy_poll, NULL, 0, MBEDTLS_ENTROPY_SOURCE_STRONG); - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADSECURITYCHECKSFAILED); - if(retval != UA_STATUSCODE_GOOD) + if(mbedErr) { + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; goto error; + } /* Seed the RNG */ char *personalization = "open62541-drbg"; mbedErr = mbedtls_ctr_drbg_seed(&pc->drbgContext, mbedtls_entropy_func, &pc->entropyContext, (const unsigned char *)personalization, 14); - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADSECURITYCHECKSFAILED); - if(retval != UA_STATUSCODE_GOOD) + if(mbedErr) { + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; goto error; + } /* Set the private key */ - mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey, - localPrivateKey.data, localPrivateKey.length, - NULL, 0); - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADSECURITYCHECKSFAILED); - if(retval != UA_STATUSCODE_GOOD) + mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey, localPrivateKey.data, + localPrivateKey.length, NULL, 0); + if(mbedErr) { + retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; goto error; + } /* Set the local certificate thumbprint */ retval = UA_ByteString_allocBuffer(&pc->localCertThumbprint, UA_SHA1_LENGTH); if(retval != UA_STATUSCODE_GOOD) goto error; - retval = asym_makeThumbprint_sp_basic128rsa15(pc->securityPolicy, + retval = asym_makeThumbprint_sp_basic256sha256(pc->securityPolicy, &securityPolicy->localCertificate, &pc->localCertThumbprint); if(retval != UA_STATUSCODE_GOOD) @@ -42836,20 +56035,21 @@ policyContext_newContext_sp_basic128rsa15(UA_SecurityPolicy *securityPolicy, error: UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, - "Could not create securityContext"); + "Could not create securityContext: %s", UA_StatusCode_name(retval)); if(securityPolicy->policyContext != NULL) - deleteMembers_sp_basic128rsa15(securityPolicy); + deleteMembers_sp_basic256sha256(securityPolicy); return retval; } UA_StatusCode -UA_SecurityPolicy_Basic128Rsa15(UA_SecurityPolicy *policy, UA_CertificateVerification *certificateVerification, - const UA_ByteString localCertificate, const UA_ByteString localPrivateKey, - UA_Logger logger) { +UA_SecurityPolicy_Basic256Sha256(UA_SecurityPolicy *policy, + UA_CertificateVerification *certificateVerification, + const UA_ByteString localCertificate, + const UA_ByteString localPrivateKey, const UA_Logger *logger) { memset(policy, 0, sizeof(UA_SecurityPolicy)); policy->logger = logger; - policy->policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15"); + policy->policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256"); UA_SecurityPolicyAsymmetricModule *const asymmetricModule = &policy->asymmetricModule; UA_SecurityPolicySymmetricModule *const symmetricModule = &policy->symmetricModule; @@ -42869,45 +56069,46 @@ UA_SecurityPolicy_Basic128Rsa15(UA_SecurityPolicy *policy, UA_CertificateVerific UA_SecurityPolicySignatureAlgorithm *asym_signatureAlgorithm = &asymmetricModule->cryptoModule.signatureAlgorithm; asym_signatureAlgorithm->uri = - UA_STRING("http://www.w3.org/2000/09/xmldsig#rsa-sha1\0"); + UA_STRING("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\0"); asym_signatureAlgorithm->verify = (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, - const UA_ByteString *, const UA_ByteString *))asym_verify_sp_basic128rsa15; + const UA_ByteString *, const UA_ByteString *))asym_verify_sp_basic256sha256; asym_signatureAlgorithm->sign = (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, - const UA_ByteString *, UA_ByteString *))asym_sign_sp_basic128rsa15; + const UA_ByteString *, UA_ByteString *))asym_sign_sp_basic256sha256; asym_signatureAlgorithm->getLocalSignatureSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getLocalSignatureSize_sp_basic128rsa15; + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getLocalSignatureSize_sp_basic256sha256; asym_signatureAlgorithm->getRemoteSignatureSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteSignatureSize_sp_basic128rsa15; + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteSignatureSize_sp_basic256sha256; asym_signatureAlgorithm->getLocalKeyLength = NULL; // TODO: Write function asym_signatureAlgorithm->getRemoteKeyLength = NULL; // TODO: Write function UA_SecurityPolicyEncryptionAlgorithm *asym_encryptionAlgorithm = &asymmetricModule->cryptoModule.encryptionAlgorithm; - asym_encryptionAlgorithm->uri = UA_STRING("TODO: ALG URI"); + asym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#rsa-oaep\0"); asym_encryptionAlgorithm->encrypt = - (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))asym_encrypt_sp_basic128rsa15; + (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))asym_encrypt_sp_basic256sha256; asym_encryptionAlgorithm->decrypt = (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *)) - asym_decrypt_sp_basic128rsa15; - asym_encryptionAlgorithm->getLocalKeyLength = NULL; // TODO: Write function + asym_decrypt_sp_basic256sha256; + asym_encryptionAlgorithm->getLocalKeyLength = + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getLocalEncryptionKeyLength_sp_basic256sha256; asym_encryptionAlgorithm->getRemoteKeyLength = - (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteEncryptionKeyLength_sp_basic128rsa15; + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteEncryptionKeyLength_sp_basic256sha256; asym_encryptionAlgorithm->getLocalBlockSize = NULL; // TODO: Write function asym_encryptionAlgorithm->getRemoteBlockSize = (size_t (*)(const UA_SecurityPolicy *, - const void *))asym_getRemoteBlockSize_sp_basic128rsa15; + const void *))asym_getRemoteBlockSize_sp_basic256sha256; asym_encryptionAlgorithm->getLocalPlainTextBlockSize = NULL; // TODO: Write function asym_encryptionAlgorithm->getRemotePlainTextBlockSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemotePlainTextBlockSize_sp_basic128rsa15; + (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemotePlainTextBlockSize_sp_basic256sha256; - asymmetricModule->makeCertificateThumbprint = asym_makeThumbprint_sp_basic128rsa15; + asymmetricModule->makeCertificateThumbprint = asym_makeThumbprint_sp_basic256sha256; asymmetricModule->compareCertificateThumbprint = - asymmetricModule_compareCertificateThumbprint_sp_basic128rsa15; + asymmetricModule_compareCertificateThumbprint_sp_basic256sha256; /* SymmetricModule */ - symmetricModule->generateKey = sym_generateKey_sp_basic128rsa15; - symmetricModule->generateNonce = sym_generateNonce_sp_basic128rsa15; + symmetricModule->generateKey = sym_generateKey_sp_basic256sha256; + symmetricModule->generateNonce = sym_generateNonce_sp_basic256sha256; UA_SecurityPolicySignatureAlgorithm *sym_signatureAlgorithm = &symmetricModule->cryptoModule.signatureAlgorithm; @@ -42915,1064 +56116,1758 @@ UA_SecurityPolicy_Basic128Rsa15(UA_SecurityPolicy *policy, UA_CertificateVerific UA_STRING("http://www.w3.org/2000/09/xmldsig#hmac-sha1\0"); sym_signatureAlgorithm->verify = (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, const UA_ByteString *, - const UA_ByteString *))sym_verify_sp_basic128rsa15; + const UA_ByteString *))sym_verify_sp_basic256sha256; sym_signatureAlgorithm->sign = (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, - const UA_ByteString *, UA_ByteString *))sym_sign_sp_basic128rsa15; - sym_signatureAlgorithm->getLocalSignatureSize = sym_getSignatureSize_sp_basic128rsa15; - sym_signatureAlgorithm->getRemoteSignatureSize = sym_getSignatureSize_sp_basic128rsa15; + const UA_ByteString *, UA_ByteString *))sym_sign_sp_basic256sha256; + sym_signatureAlgorithm->getLocalSignatureSize = sym_getSignatureSize_sp_basic256sha256; + sym_signatureAlgorithm->getRemoteSignatureSize = sym_getSignatureSize_sp_basic256sha256; sym_signatureAlgorithm->getLocalKeyLength = (size_t (*)(const UA_SecurityPolicy *, - const void *))sym_getSigningKeyLength_sp_basic128rsa15; + const void *))sym_getSigningKeyLength_sp_basic256sha256; sym_signatureAlgorithm->getRemoteKeyLength = (size_t (*)(const UA_SecurityPolicy *, - const void *))sym_getSigningKeyLength_sp_basic128rsa15; + const void *))sym_getSigningKeyLength_sp_basic256sha256; UA_SecurityPolicyEncryptionAlgorithm *sym_encryptionAlgorithm = &symmetricModule->cryptoModule.encryptionAlgorithm; sym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#aes128-cbc"); sym_encryptionAlgorithm->encrypt = - (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_encrypt_sp_basic128rsa15; + (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_encrypt_sp_basic256sha256; sym_encryptionAlgorithm->decrypt = - (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_decrypt_sp_basic128rsa15; - sym_encryptionAlgorithm->getLocalKeyLength = sym_getEncryptionKeyLength_sp_basic128rsa15; - sym_encryptionAlgorithm->getRemoteKeyLength = sym_getEncryptionKeyLength_sp_basic128rsa15; + (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_decrypt_sp_basic256sha256; + sym_encryptionAlgorithm->getLocalKeyLength = sym_getEncryptionKeyLength_sp_basic256sha256; + sym_encryptionAlgorithm->getRemoteKeyLength = sym_getEncryptionKeyLength_sp_basic256sha256; sym_encryptionAlgorithm->getLocalBlockSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic128rsa15; + (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic256sha256; sym_encryptionAlgorithm->getRemoteBlockSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic128rsa15; + (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic256sha256; sym_encryptionAlgorithm->getLocalPlainTextBlockSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic128rsa15; + (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic256sha256; sym_encryptionAlgorithm->getRemotePlainTextBlockSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic128rsa15; - symmetricModule->secureChannelNonceLength = 16; + (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic256sha256; + symmetricModule->secureChannelNonceLength = 32; // Use the same signature algorithm as the asymmetric component for certificate signing (see standard) policy->certificateSigningAlgorithm = policy->asymmetricModule.cryptoModule.signatureAlgorithm; /* ChannelModule */ - channelModule->newContext = channelContext_newContext_sp_basic128rsa15; + channelModule->newContext = channelContext_newContext_sp_basic256sha256; channelModule->deleteContext = (void (*)(void *)) - channelContext_deleteContext_sp_basic128rsa15; + channelContext_deleteContext_sp_basic256sha256; channelModule->setLocalSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) - channelContext_setLocalSymEncryptingKey_sp_basic128rsa15; + channelContext_setLocalSymEncryptingKey_sp_basic256sha256; channelModule->setLocalSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) - channelContext_setLocalSymSigningKey_sp_basic128rsa15; + channelContext_setLocalSymSigningKey_sp_basic256sha256; channelModule->setLocalSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *)) - channelContext_setLocalSymIv_sp_basic128rsa15; + channelContext_setLocalSymIv_sp_basic256sha256; channelModule->setRemoteSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) - channelContext_setRemoteSymEncryptingKey_sp_basic128rsa15; + channelContext_setRemoteSymEncryptingKey_sp_basic256sha256; channelModule->setRemoteSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) - channelContext_setRemoteSymSigningKey_sp_basic128rsa15; + channelContext_setRemoteSymSigningKey_sp_basic256sha256; channelModule->setRemoteSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *)) - channelContext_setRemoteSymIv_sp_basic128rsa15; + channelContext_setRemoteSymIv_sp_basic256sha256; channelModule->compareCertificate = (UA_StatusCode (*)(const void *, const UA_ByteString *)) - channelContext_compareCertificate_sp_basic128rsa15; + channelContext_compareCertificate_sp_basic256sha256; - policy->deleteMembers = deleteMembers_sp_basic128rsa15; + policy->updateCertificateAndPrivateKey = updateCertificateAndPrivateKey_sp_basic256sha256; + policy->deleteMembers = deleteMembers_sp_basic256sha256; - return policyContext_newContext_sp_basic128rsa15(policy, localPrivateKey); + return policyContext_newContext_sp_basic256sha256(policy, localPrivateKey); } -#endif /* UA_ENABLE_ENCRYPTION */ +#endif -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_securitypolicy_basic256sha256.c" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/ua_pubsub_udp.c" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB - * Copyright 2018 (c) Daniel Feist, Precitec GmbH & Co. KG + * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner) + * Copyright 2018 (c) Jose Cabral, fortiss GmbH */ -#ifdef UA_ENABLE_ENCRYPTION - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - +// UDP multicast network layer specific internal data +typedef struct { + int ai_family; //Protocol family for socket. IPv4/IPv6 + struct sockaddr_storage *ai_addr; //https://msdn.microsoft.com/de-de/library/windows/desktop/ms740496(v=vs.85).aspx + UA_UInt32 messageTTL; + UA_Boolean enableLoopback; + UA_Boolean enableReuse; +} UA_PubSubChannelDataUDPMC; -/* Notes: - * mbedTLS' AES allows in-place encryption and decryption. Sow we don't have to - * allocate temp buffers. - * https://tls.mbed.org/discussions/generic/in-place-decryption-with-aes256-same-input-output-buffer +/** + * Open communication socket based on the connectionConfig. Protocol specific parameters are + * provided within the connectionConfig as KeyValuePair. + * Currently supported options: "ttl" , "loopback", "reuse" + * + * @return ref to created channel, NULL on error */ +static UA_PubSubChannel * +UA_PubSubChannelUDPMC_open(const UA_PubSubConnectionConfig *connectionConfig) { + UA_initialize_architecture_network(); -#define UA_SECURITYPOLICY_BASIC256SHA256_RSAPADDING_LEN 42 -#define UA_SHA1_LENGTH 20 -#define UA_SHA256_LENGTH 32 -#define UA_BASIC256SHA256_SYM_SIGNING_KEY_LENGTH 32 -#define UA_SECURITYPOLICY_BASIC256SHA256_SYM_KEY_LENGTH 32 -#define UA_SECURITYPOLICY_BASIC256SHA256_SYM_ENCRYPTION_BLOCK_SIZE 16 -#define UA_SECURITYPOLICY_BASIC256SHA256_SYM_PLAIN_TEXT_BLOCK_SIZE 16 -#define UA_SECURITYPOLICY_BASIC256SHA256_MINASYMKEYLENGTH 256 -#define UA_SECURITYPOLICY_BASIC256SHA256_MAXASYMKEYLENGTH 512 + UA_NetworkAddressUrlDataType address; + if(UA_Variant_hasScalarType(&connectionConfig->address, &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE])){ + address = *(UA_NetworkAddressUrlDataType *)connectionConfig->address.data; + } else { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection creation failed. Invalid Address."); + return NULL; + } + //allocate and init memory for the UDP multicast specific internal data + UA_PubSubChannelDataUDPMC * channelDataUDPMC = + (UA_PubSubChannelDataUDPMC *) UA_calloc(1, (sizeof(UA_PubSubChannelDataUDPMC))); + if(!channelDataUDPMC){ + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection creation failed. Out of memory."); + return NULL; + } + //set default values + UA_PubSubChannelDataUDPMC defaultValues = {0, NULL, 255, UA_TRUE, UA_TRUE}; + memcpy(channelDataUDPMC, &defaultValues, sizeof(UA_PubSubChannelDataUDPMC)); + //iterate over the given KeyValuePair paramters + UA_String ttlParam = UA_STRING("ttl"), loopbackParam = UA_STRING("loopback"), reuseParam = UA_STRING("reuse"); + for(size_t i = 0; i < connectionConfig->connectionPropertiesSize; i++){ + if(UA_String_equal(&connectionConfig->connectionProperties[i].key.name, &ttlParam)){ + if(UA_Variant_hasScalarType(&connectionConfig->connectionProperties[i].value, &UA_TYPES[UA_TYPES_UINT32])){ + channelDataUDPMC->messageTTL = *(UA_UInt32 *) connectionConfig->connectionProperties[i].value.data; + } + } else if(UA_String_equal(&connectionConfig->connectionProperties[i].key.name, &loopbackParam)){ + if(UA_Variant_hasScalarType(&connectionConfig->connectionProperties[i].value, &UA_TYPES[UA_TYPES_BOOLEAN])){ + channelDataUDPMC->enableLoopback = *(UA_Boolean *) connectionConfig->connectionProperties[i].value.data; + } + } else if(UA_String_equal(&connectionConfig->connectionProperties[i].key.name, &reuseParam)){ + if(UA_Variant_hasScalarType(&connectionConfig->connectionProperties[i].value, &UA_TYPES[UA_TYPES_BOOLEAN])){ + channelDataUDPMC->enableReuse = *(UA_Boolean *) connectionConfig->connectionProperties[i].value.data; + } + } else { + UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection creation. Unknown connection parameter."); + } + } + + UA_PubSubChannel *newChannel = (UA_PubSubChannel *) UA_calloc(1, sizeof(UA_PubSubChannel)); + if(!newChannel){ + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection creation failed. Out of memory."); + UA_free(channelDataUDPMC); + return NULL; + } + struct addrinfo hints, *rp, *requestResult = NULL; + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_flags = 0; + hints.ai_protocol = 0; + + UA_String hostname, path; + UA_UInt16 networkPort; + if(UA_parseEndpointUrl(&address.url, &hostname, &networkPort, &path) != UA_STATUSCODE_GOOD){ + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation failed. Invalid URL."); + UA_free(channelDataUDPMC); + UA_free(newChannel); + return NULL; + } + if(hostname.length > 512) { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation failed. URL maximum length is 512."); + UA_free(channelDataUDPMC); + UA_free(newChannel); + return NULL; + } -#define UA_LOG_MBEDERR \ - char errBuff[300]; \ - mbedtls_strerror(mbedErr, errBuff, 300); \ - UA_LOG_WARNING(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, \ - "mbedTLS returned an error: %s", errBuff); \ + UA_STACKARRAY(char, addressAsChar, sizeof(char) * hostname.length +1); + memcpy(addressAsChar, hostname.data, hostname.length); + addressAsChar[hostname.length] = 0; + char port[6]; + sprintf(port, "%u", networkPort); -#define UA_MBEDTLS_ERRORHANDLING(errorcode) \ - if(mbedErr) { \ - UA_LOG_MBEDERR \ - retval = errorcode; \ + if(UA_getaddrinfo(addressAsChar, port, &hints, &requestResult) != 0) { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation failed. Internal error."); + UA_free(channelDataUDPMC); + UA_free(newChannel); + return NULL; } -#define UA_MBEDTLS_ERRORHANDLING_RETURN(errorcode) \ - if(mbedErr) { \ - UA_LOG_MBEDERR \ - return errorcode; \ + //check if the ip address is a multicast address + if(requestResult->ai_family == PF_INET){ + struct in_addr imr_interface; + UA_inet_pton(AF_INET, addressAsChar, &imr_interface); + if((UA_ntohl(imr_interface.s_addr) & 0xF0000000) != 0xE0000000){ + UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation failed. No multicast address."); + } + } else { + //TODO check if ipv6 addrr is multicast address. } -typedef struct { - const UA_SecurityPolicy *securityPolicy; - UA_ByteString localCertThumbprint; + for(rp = requestResult; rp != NULL; rp = rp->ai_next){ + newChannel->sockfd = UA_socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if(newChannel->sockfd != UA_INVALID_SOCKET){ + break; /*success*/ + } + } + if(!rp){ + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation failed. Internal error."); + UA_freeaddrinfo(requestResult); + UA_free(channelDataUDPMC); + UA_free(newChannel); + return NULL; + } + channelDataUDPMC->ai_family = rp->ai_family; + channelDataUDPMC->ai_addr = (struct sockaddr_storage *) UA_calloc(1, sizeof(struct sockaddr_storage)); + if(!channelDataUDPMC->ai_addr){ + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation failed. Out of memory."); + UA_close(newChannel->sockfd); + UA_freeaddrinfo(requestResult); + UA_free(channelDataUDPMC); + UA_free(newChannel); + return NULL; + } + memcpy(channelDataUDPMC->ai_addr, rp->ai_addr, sizeof(*rp->ai_addr)); + //link channel and internal channel data + newChannel->handle = channelDataUDPMC; - mbedtls_ctr_drbg_context drbgContext; - mbedtls_entropy_context entropyContext; - mbedtls_md_context_t sha256MdContext; - mbedtls_pk_context localPrivateKey; -} Basic256Sha256_PolicyContext; + //Set loop back data to your host +#if UA_IPV6 + if(UA_setsockopt(newChannel->sockfd, + requestResult->ai_family == PF_INET6 ? IPPROTO_IPV6 : IPPROTO_IP, + requestResult->ai_family == PF_INET6 ? IPV6_MULTICAST_LOOP : IP_MULTICAST_LOOP, + (const char *)&channelDataUDPMC->enableLoopback, sizeof (channelDataUDPMC->enableLoopback)) +#else + if(UA_setsockopt(newChannel->sockfd, + IPPROTO_IP, + IP_MULTICAST_LOOP, + (const char *)&channelDataUDPMC->enableLoopback, sizeof (channelDataUDPMC->enableLoopback)) +#endif + < 0) { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation failed. Loopback setup failed."); + UA_close(newChannel->sockfd); + UA_freeaddrinfo(requestResult); + UA_free(channelDataUDPMC); + UA_free(newChannel); + return NULL; + } -typedef struct { - Basic256Sha256_PolicyContext *policyContext; + //Set Time to live (TTL). Value of 1 prevent forward beyond the local network. +#if UA_IPV6 + if(UA_setsockopt(newChannel->sockfd, + requestResult->ai_family == PF_INET6 ? IPPROTO_IPV6 : IPPROTO_IP, + requestResult->ai_family == PF_INET6 ? IPV6_MULTICAST_HOPS : IP_MULTICAST_TTL, + (const char *)&channelDataUDPMC->messageTTL, sizeof(channelDataUDPMC->messageTTL)) +#else + if(UA_setsockopt(newChannel->sockfd, + IPPROTO_IP, + IP_MULTICAST_TTL, + (const char *)&channelDataUDPMC->messageTTL, sizeof(channelDataUDPMC->messageTTL)) +#endif - UA_ByteString localSymSigningKey; - UA_ByteString localSymEncryptingKey; - UA_ByteString localSymIv; + < 0) { + UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation problem. Time to live setup failed."); + } - UA_ByteString remoteSymSigningKey; - UA_ByteString remoteSymEncryptingKey; - UA_ByteString remoteSymIv; + //Set reuse address -> enables sharing of the same listening address on different sockets. + if(channelDataUDPMC->enableReuse){ + int enableReuse = 1; + if(UA_setsockopt(newChannel->sockfd, + SOL_SOCKET, SO_REUSEADDR, + (const char*)&enableReuse, sizeof(enableReuse)) < 0){ + UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation problem. Reuse address setup failed."); + } + } - mbedtls_x509_crt remoteCertificate; -} Basic256Sha256_ChannelContext; + //Set the physical interface for outgoing traffic + if(address.networkInterface.length > 0){ + UA_STACKARRAY(char, interfaceAsChar, sizeof(char) * address.networkInterface.length + 1); + memcpy(interfaceAsChar, address.networkInterface.data, address.networkInterface.length); + interfaceAsChar[address.networkInterface.length] = 0; + enum{ + IPv4, +#if UA_IPV6 + IPv6, +#endif + INVALID + } ipVersion; + union { + struct ip_mreq ipv4; +#if UA_IPV6 + struct ipv6_mreq ipv6; +#endif + } group; + if(UA_inet_pton(AF_INET, interfaceAsChar, &group.ipv4.imr_interface)){ + ipVersion = IPv4; +#if UA_IPV6 + } else if (UA_inet_pton(AF_INET6, interfaceAsChar, &group.ipv6.ipv6mr_multiaddr)){ + group.ipv6.ipv6mr_interface = UA_if_nametoindex(interfaceAsChar); + ipVersion = IPv6; +#endif + } else { + ipVersion = INVALID; + } + if(ipVersion == INVALID || +#if UA_IPV6 + UA_setsockopt(newChannel->sockfd, + requestResult->ai_family == PF_INET6 ? IPPROTO_IPV6 : IPPROTO_IP, + requestResult->ai_family == PF_INET6 ? IPV6_MULTICAST_IF : IP_MULTICAST_IF, + ipVersion == IPv6 ? (const void *) &group.ipv6.ipv6mr_interface : &group.ipv4.imr_interface, + ipVersion == IPv6 ? sizeof(group.ipv6.ipv6mr_interface) : sizeof(struct in_addr)) +#else + UA_setsockopt(newChannel->sockfd, + IPPROTO_IP, + IP_MULTICAST_IF, + &group.ipv4.imr_interface, + sizeof(struct in_addr)) +#endif + < 0) { + UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "PubSub Connection creation problem. Interface selection failed."); + }; + } + UA_freeaddrinfo(requestResult); + newChannel->state = UA_PUBSUB_CHANNEL_PUB; + return newChannel; +} -/********************/ -/* AsymmetricModule */ -/********************/ +/** + * Subscribe to a given address. + * + * @return UA_STATUSCODE_GOOD on success + */ +static UA_StatusCode +UA_PubSubChannelUDPMC_regist(UA_PubSubChannel *channel, UA_ExtensionObject *transportSettings, + void (*notUsedHere)(UA_ByteString *encodedBuffer, UA_ByteString *topic)) { + if(!(channel->state == UA_PUBSUB_CHANNEL_PUB || channel->state == UA_PUBSUB_CHANNEL_RDY)){ + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection regist failed."); + return UA_STATUSCODE_BADINTERNALERROR; + } + UA_PubSubChannelDataUDPMC * connectionConfig = (UA_PubSubChannelDataUDPMC *) channel->handle; + if(connectionConfig->ai_family == PF_INET){//IPv4 handling + struct sockaddr_in addr; + memcpy(&addr, connectionConfig->ai_addr, sizeof(struct sockaddr_in)); + addr.sin_addr.s_addr = INADDR_ANY; + if (UA_bind(channel->sockfd, (const struct sockaddr *)&addr, sizeof(struct sockaddr_in)) != 0){ + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection regist failed."); + return UA_STATUSCODE_BADINTERNALERROR; + } + struct ip_mreq groupV4; + memcpy(&groupV4.imr_multiaddr, &((const struct sockaddr_in *)connectionConfig->ai_addr)->sin_addr, sizeof(struct ip_mreq)); + groupV4.imr_interface.s_addr = UA_htonl(INADDR_ANY); + //multihomed hosts can join several groups on different IF, INADDR_ANY -> kernel decides + + if(UA_setsockopt(channel->sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &groupV4, sizeof(groupV4)) != 0) { + UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "PubSub Connection not on multicast"); + } +#if UA_IPV6 + } else if (connectionConfig->ai_family == PF_INET6) {//IPv6 handling + //TODO implement regist for IPv6 +#endif + } else { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection regist failed."); + return UA_STATUSCODE_BADINTERNALERROR; + } + return UA_STATUSCODE_GOOD; +} -/* VERIFY AsymmetricSignatureAlgorithm_RSA-PKCS15-SHA2-256 */ +/** + * Remove current subscription. + * + * @return UA_STATUSCODE_GOOD on success + */ static UA_StatusCode -asym_verify_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - Basic256Sha256_ChannelContext *cc, - const UA_ByteString *message, - const UA_ByteString *signature) { - if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL) +UA_PubSubChannelUDPMC_unregist(UA_PubSubChannel *channel, UA_ExtensionObject *transportSettings) { + if(!(channel->state == UA_PUBSUB_CHANNEL_PUB_SUB || channel->state == UA_PUBSUB_CHANNEL_SUB)){ + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection unregist failed."); return UA_STATUSCODE_BADINTERNALERROR; + } + UA_PubSubChannelDataUDPMC * connectionConfig = (UA_PubSubChannelDataUDPMC *) channel->handle; + if(connectionConfig->ai_family == PF_INET){//IPv4 handling + struct ip_mreq groupV4; + memcpy(&groupV4.imr_multiaddr, &((const struct sockaddr_in *)connectionConfig->ai_addr)->sin_addr, sizeof(struct ip_mreq)); + groupV4.imr_interface.s_addr = UA_htonl(INADDR_ANY); - unsigned char hash[UA_SHA256_LENGTH]; -#if MBEDTLS_VERSION_NUMBER >= 0x02070000 - // TODO check return status - mbedtls_sha256_ret(message->data, message->length, hash, 0); -#else - mbedtls_sha256(message->data, message->length, hash, 0); + if(UA_setsockopt(channel->sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *) &groupV4, sizeof(groupV4)) != 0){ + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection unregist failed."); + return UA_STATUSCODE_BADINTERNALERROR; + } +#if UA_IPV6 + } else if (connectionConfig->ai_family == PF_INET6) {//IPv6 handling + //TODO implement unregist for IPv6 #endif + } else { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection unregist failed."); + return UA_STATUSCODE_BADINTERNALERROR; + } + return UA_STATUSCODE_GOOD; +} - /* Set the RSA settings */ - mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); - mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256); +/** + * Send messages to the connection defined address + * + * @return UA_STATUSCODE_GOOD if success + */ +static UA_StatusCode +UA_PubSubChannelUDPMC_send(UA_PubSubChannel *channel, UA_ExtensionObject *transportSettigns, const UA_ByteString *buf) { + UA_PubSubChannelDataUDPMC *channelConfigUDPMC = (UA_PubSubChannelDataUDPMC *) channel->handle; + if(!(channel->state == UA_PUBSUB_CHANNEL_PUB || channel->state == UA_PUBSUB_CHANNEL_PUB_SUB)){ + UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection sending failed. Invalid state."); + return UA_STATUSCODE_BADINTERNALERROR; + } + //TODO evalute: chunk messages or check against MTU? + long nWritten = 0; + while (nWritten < (long)buf->length) { + long n = (long)UA_sendto(channel->sockfd, buf->data, buf->length, 0, + (struct sockaddr *) channelConfigUDPMC->ai_addr, sizeof(struct sockaddr_storage)); + if(n == -1L) { + UA_LOG_WARNING(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection sending failed."); + return UA_STATUSCODE_BADINTERNALERROR; + } + nWritten += n; + } + return UA_STATUSCODE_GOOD; +} - /* For RSA keys, the default padding type is PKCS#1 v1.5 in mbedtls_pk_verify() */ - /* Alternatively, use more specific function mbedtls_rsa_rsassa_pkcs1_v15_verify(), i.e. */ - /* int mbedErr = mbedtls_rsa_rsassa_pkcs1_v15_verify(rsaContext, NULL, NULL, - MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA256, - UA_SHA256_LENGTH, hash, - signature->data); */ +/** + * Receive messages. The regist function should be called before. + * + * @param timeout in usec | on windows platforms are only multiples of 1000usec possible + * @return + */ +static UA_StatusCode +UA_PubSubChannelUDPMC_receive(UA_PubSubChannel *channel, UA_ByteString *message, UA_ExtensionObject *transportSettigns, UA_UInt32 timeout){ + if(!(channel->state == UA_PUBSUB_CHANNEL_PUB || channel->state == UA_PUBSUB_CHANNEL_PUB_SUB)) { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection receive failed. Invalid state."); + return UA_STATUSCODE_BADINTERNALERROR; + } + UA_PubSubChannelDataUDPMC *channelConfigUDPMC = (UA_PubSubChannelDataUDPMC *) channel->handle; - int mbedErr = mbedtls_pk_verify(&cc->remoteCertificate.pk, - MBEDTLS_MD_SHA256, hash, UA_SHA256_LENGTH, - signature->data, signature->length); + if(timeout > 0) { + fd_set fdset; + FD_ZERO(&fdset); + UA_fd_set(channel->sockfd, &fdset); + struct timeval tmptv = {(long int)(timeout / 1000000), + (long int)(timeout % 1000000)}; + int resultsize = UA_select(channel->sockfd+1, &fdset, NULL, + NULL, &tmptv); + if(resultsize == 0) { + message->length = 0; + return UA_STATUSCODE_GOODNONCRITICALTIMEOUT; + } + if (resultsize == -1) { + message->length = 0; + return UA_STATUSCODE_BADINTERNALERROR; + } + } - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADSECURITYCHECKSFAILED); + if(channelConfigUDPMC->ai_family == PF_INET){ + ssize_t messageLength; + messageLength = UA_recvfrom(channel->sockfd, message->data, message->length, 0, NULL, NULL); + if(messageLength > 0){ + message->length = (size_t) messageLength; + } else { + message->length = 0; + } +#if UA_IPV6 + } else { + //TODO implement recieve for IPv6 +#endif + } return UA_STATUSCODE_GOOD; } -/* AsymmetricSignatureAlgorithm_RSA-PKCS15-SHA2-256 */ +/** + * Close channel and free the channel data. + * + * @return UA_STATUSCODE_GOOD if success + */ static UA_StatusCode -asym_sign_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - Basic256Sha256_ChannelContext *cc, - const UA_ByteString *message, - UA_ByteString *signature) { - if(securityPolicy == NULL || message == NULL || signature == NULL || cc == NULL) +UA_PubSubChannelUDPMC_close(UA_PubSubChannel *channel) { + if(UA_close(channel->sockfd) != 0){ + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "PubSub Connection delete failed."); return UA_STATUSCODE_BADINTERNALERROR; + } + UA_deinitialize_architecture_network(); + //cleanup the internal NetworkLayer data + UA_PubSubChannelDataUDPMC *networkLayerData = (UA_PubSubChannelDataUDPMC *) channel->handle; + UA_free(networkLayerData->ai_addr); + UA_free(networkLayerData); + UA_free(channel); + return UA_STATUSCODE_GOOD; +} - unsigned char hash[UA_SHA256_LENGTH]; -#if MBEDTLS_VERSION_NUMBER >= 0x02070000 - // TODO check return status - mbedtls_sha256_ret(message->data, message->length, hash, 0); +/** + * Generate a new channel. based on the given configuration. + * + * @param connectionConfig connection configuration + * @return ref to created channel, NULL on error + */ +static UA_PubSubChannel * +TransportLayerUDPMC_addChannel(UA_PubSubConnectionConfig *connectionConfig) { + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "PubSub channel requested"); + UA_PubSubChannel * pubSubChannel = UA_PubSubChannelUDPMC_open(connectionConfig); + if(pubSubChannel){ + pubSubChannel->regist = UA_PubSubChannelUDPMC_regist; + pubSubChannel->unregist = UA_PubSubChannelUDPMC_unregist; + pubSubChannel->send = UA_PubSubChannelUDPMC_send; + pubSubChannel->receive = UA_PubSubChannelUDPMC_receive; + pubSubChannel->close = UA_PubSubChannelUDPMC_close; + pubSubChannel->connectionConfig = connectionConfig; + } + return pubSubChannel; +} + +//UDPMC channel factory +UA_PubSubTransportLayer +UA_PubSubTransportLayerUDPMP() { + UA_PubSubTransportLayer pubSubTransportLayer; + pubSubTransportLayer.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp"); + pubSubTransportLayer.createPubSubChannel = &TransportLayerUDPMC_addChannel; + return pubSubTransportLayer; +} + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/arch/posix/ua_clock.c" ***********************************/ + +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA + */ + +#ifdef UA_ARCHITECTURE_POSIX + + +#include + +#include + +#if defined(__APPLE__) || defined(__MACH__) +# include +# include +#endif + +UA_DateTime UA_DateTime_now(void) { + struct timeval tv; + gettimeofday(&tv, NULL); + return (tv.tv_sec * UA_DATETIME_SEC) + (tv.tv_usec * UA_DATETIME_USEC) + UA_DATETIME_UNIX_EPOCH; +} + +/* Credit to https://stackoverflow.com/questions/13804095/get-the-time-zone-gmt-offset-in-c */ +UA_Int64 UA_DateTime_localTimeUtcOffset(void) { + time_t gmt, rawtime = time(NULL); + struct tm *ptm; + struct tm gbuf; + ptm = gmtime_r(&rawtime, &gbuf); + // Request that mktime() looksup dst in timezone database + ptm->tm_isdst = -1; + gmt = mktime(ptm); + return (UA_Int64) (difftime(rawtime, gmt) * UA_DATETIME_SEC); +} + +UA_DateTime UA_DateTime_nowMonotonic(void) { +#if defined(__APPLE__) || defined(__MACH__) + /* OS X does not have clock_gettime, use clock_get_time */ + clock_serv_t cclock; + mach_timespec_t mts; + host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock); + clock_get_time(cclock, &mts); + mach_port_deallocate(mach_task_self(), cclock); + return (mts.tv_sec * UA_DATETIME_SEC) + (mts.tv_nsec / 100); +#elif !defined(CLOCK_MONOTONIC_RAW) + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (ts.tv_sec * UA_DATETIME_SEC) + (ts.tv_nsec / 100); #else - mbedtls_sha256(message->data, message->length, hash, 0); + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC_RAW, &ts); + return (ts.tv_sec * UA_DATETIME_SEC) + (ts.tv_nsec / 100); #endif +} - Basic256Sha256_PolicyContext *pc = cc->policyContext; - mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(pc->localPrivateKey); - mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256); +#endif /* UA_ARCHITECTURE_POSIX */ - size_t sigLen = 0; +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/arch/posix/ua_architecture_functions.c" ***********************************/ - /* For RSA keys, the default padding type is PKCS#1 v1.5 in mbedtls_pk_sign */ - /* Alternatively use more specific function mbedtls_rsa_rsassa_pkcs1_v15_sign() */ - int mbedErr = mbedtls_pk_sign(&pc->localPrivateKey, - MBEDTLS_MD_SHA256, hash, - UA_SHA256_LENGTH, signature->data, - &sigLen, mbedtls_ctr_drbg_random, - &pc->drbgContext); - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADINTERNALERROR); - return UA_STATUSCODE_GOOD; +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2018 (c) Jose Cabral, fortiss GmbH + */ + +#ifdef UA_ARCHITECTURE_POSIX + + +/* Global malloc singletons */ +#ifdef UA_ENABLE_MALLOC_SINGLETON +void * (*UA_globalMalloc)(size_t size) = malloc; +void (*UA_globalFree)(void *ptr) = free; +void * (*UA_globalCalloc)(size_t nelem, size_t elsize) = calloc; +void * (*UA_globalRealloc)(void *ptr, size_t size) = realloc; +#endif + +unsigned int UA_socket_set_blocking(UA_SOCKET sockfd){ + int opts = fcntl(sockfd, F_GETFL); + if(opts < 0 || fcntl(sockfd, F_SETFL, opts & (~O_NONBLOCK)) < 0) + return UA_STATUSCODE_BADINTERNALERROR; + return UA_STATUSCODE_GOOD; } -static size_t -asym_getLocalSignatureSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const Basic256Sha256_ChannelContext *cc) { - if(securityPolicy == NULL || cc == NULL) - return 0; +unsigned int UA_socket_set_nonblocking(UA_SOCKET sockfd){ + int opts = fcntl(sockfd, F_GETFL); + if(opts < 0 || fcntl(sockfd, F_SETFL, opts | O_NONBLOCK) < 0) + return UA_STATUSCODE_BADINTERNALERROR; + return UA_STATUSCODE_GOOD; +} - return mbedtls_pk_rsa(cc->policyContext->localPrivateKey)->len; +void UA_initialize_architecture_network(void){ } -static size_t -asym_getRemoteSignatureSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const Basic256Sha256_ChannelContext *cc) { - if(securityPolicy == NULL || cc == NULL) - return 0; +void UA_deinitialize_architecture_network(void){ +} - return mbedtls_pk_rsa(cc->remoteCertificate.pk)->len; +#endif /* UA_ARCHITECTURE_POSIX */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/arch/win32/ua_clock.c" ***********************************/ + +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Thomas Stalder + */ + +#ifdef UA_ARCHITECTURE_WIN32 + +#ifndef _BSD_SOURCE +# define _BSD_SOURCE +#endif + + +#include +/* Backup definition of SLIST_ENTRY on mingw winnt.h */ +# ifdef SLIST_ENTRY +# pragma push_macro("SLIST_ENTRY") +# undef SLIST_ENTRY +# define POP_SLIST_ENTRY +# endif +# include +/* restore definition */ +# ifdef POP_SLIST_ENTRY +# undef SLIST_ENTRY +# undef POP_SLIST_ENTRY +# pragma pop_macro("SLIST_ENTRY") +# endif + +UA_DateTime UA_DateTime_now(void) { + /* Windows filetime has the same definition as UA_DateTime */ + FILETIME ft; + SYSTEMTIME st; + GetSystemTime(&st); + SystemTimeToFileTime(&st, &ft); + ULARGE_INTEGER ul; + ul.LowPart = ft.dwLowDateTime; + ul.HighPart = ft.dwHighDateTime; + return (UA_DateTime)ul.QuadPart; } -/* AsymmetricEncryptionAlgorithm_RSA-OAEP-SHA1 */ -static UA_StatusCode -asym_encrypt_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - Basic256Sha256_ChannelContext *cc, - UA_ByteString *data) { - if(securityPolicy == NULL || cc == NULL || data == NULL) - return UA_STATUSCODE_BADINTERNALERROR; +/* Credit to https://stackoverflow.com/questions/13804095/get-the-time-zone-gmt-offset-in-c */ +UA_Int64 UA_DateTime_localTimeUtcOffset(void) { + time_t gmt, rawtime = time(NULL); - const size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. - getRemotePlainTextBlockSize(securityPolicy, cc); + struct tm ptm; + gmtime_s(&ptm, &rawtime); + // Request that mktime() looksup dst in timezone database + ptm.tm_isdst = -1; + gmt = mktime(&ptm); - if(data->length % plainTextBlockSize != 0) - return UA_STATUSCODE_BADINTERNALERROR; + return (UA_Int64) (difftime(rawtime, gmt) * UA_DATETIME_SEC); +} - mbedtls_rsa_context *remoteRsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); - mbedtls_rsa_set_padding(remoteRsaContext, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA1); +UA_DateTime UA_DateTime_nowMonotonic(void) { + LARGE_INTEGER freq, ticks; + QueryPerformanceFrequency(&freq); + QueryPerformanceCounter(&ticks); + UA_Double ticks2dt = UA_DATETIME_SEC / (UA_Double)freq.QuadPart; + return (UA_DateTime)(ticks.QuadPart * ticks2dt); +} - UA_ByteString encrypted; - const size_t bufferOverhead = - UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(securityPolicy, cc, data->length); - UA_StatusCode retval = UA_ByteString_allocBuffer(&encrypted, data->length + bufferOverhead); - if(retval != UA_STATUSCODE_GOOD) - return retval; +#endif /* UA_ARCHITECTURE_WIN32 */ - size_t lenDataToEncrypt = data->length; - size_t inOffset = 0; - size_t offset = 0; - const unsigned char *label = NULL; - Basic256Sha256_PolicyContext *pc = cc->policyContext; - while(lenDataToEncrypt >= plainTextBlockSize) { - int mbedErr = mbedtls_rsa_rsaes_oaep_encrypt(remoteRsaContext, mbedtls_ctr_drbg_random, - &pc->drbgContext, MBEDTLS_RSA_PUBLIC, - label, 0, plainTextBlockSize, - data->data + inOffset, encrypted.data + offset); +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/arch/win32/ua_architecture_functions.c" ***********************************/ - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADINTERNALERROR); - if(retval != UA_STATUSCODE_GOOD) { - UA_ByteString_deleteMembers(&encrypted); - return retval; - } +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2018 (c) Jose Cabral, fortiss GmbH + */ - inOffset += plainTextBlockSize; - offset += remoteRsaContext->len; - lenDataToEncrypt -= plainTextBlockSize; - } +#ifdef UA_ARCHITECTURE_WIN32 - memcpy(data->data, encrypted.data, offset); - UA_ByteString_deleteMembers(&encrypted); - return UA_STATUSCODE_GOOD; +unsigned int UA_socket_set_blocking(UA_SOCKET sockfd){ + u_long iMode = 0; + if(ioctlsocket(sockfd, FIONBIO, &iMode) != NO_ERROR) + return UA_STATUSCODE_BADINTERNALERROR; + return UA_STATUSCODE_GOOD;; } -/* AsymmetricEncryptionAlgorithm_RSA-OAEP-SHA1 */ -static UA_StatusCode -asym_decrypt_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - Basic256Sha256_ChannelContext *cc, - UA_ByteString *data) { - if(securityPolicy == NULL || cc == NULL || data == NULL) - return UA_STATUSCODE_BADINTERNALERROR; +unsigned int UA_socket_set_nonblocking(UA_SOCKET sockfd){ + u_long iMode = 1; + if(ioctlsocket(sockfd, FIONBIO, &iMode) != NO_ERROR) + return UA_STATUSCODE_BADINTERNALERROR; + return UA_STATUSCODE_GOOD;; +} - mbedtls_rsa_context *rsaContext = - mbedtls_pk_rsa(cc->policyContext->localPrivateKey); +void UA_initialize_architecture_network(void){ + WSADATA wsaData; + WSAStartup(MAKEWORD(2, 2), &wsaData); +} - mbedtls_rsa_set_padding(rsaContext, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA1); +void UA_deinitialize_architecture_network(void){ + WSACleanup(); +} - if(data->length % rsaContext->len != 0) - return UA_STATUSCODE_BADINTERNALERROR; +#endif /* UA_ARCHITECTURE_WIN32 */ - UA_ByteString decrypted; - UA_StatusCode retval = UA_ByteString_allocBuffer(&decrypted, data->length); - if(retval != UA_STATUSCODE_GOOD) - return retval; +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/arch/network_tcp.c" ***********************************/ - size_t lenDataToDecrypt = data->length; - size_t inOffset = 0; - size_t offset = 0; - size_t outLength = 0; - const unsigned char *label = NULL; - Basic256Sha256_PolicyContext *pc = cc->policyContext; +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) frax2222 + * Copyright 2017 (c) Jose Cabral + * Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA + */ - while(lenDataToDecrypt >= rsaContext->len) { - int mbedErr = mbedtls_rsa_rsaes_oaep_decrypt(rsaContext, mbedtls_ctr_drbg_random, - &pc->drbgContext, MBEDTLS_RSA_PRIVATE, - label, 0, &outLength, - data->data + inOffset, - decrypted.data + offset, - decrypted.length - offset); - if(mbedErr) - UA_ByteString_deleteMembers(&decrypted); // TODO: Maybe change error macro to jump to cleanup? - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADSECURITYCHECKSFAILED); +#define UA_INTERNAL - inOffset += rsaContext->len; - offset += outLength; - lenDataToDecrypt -= rsaContext->len; - } - if(lenDataToDecrypt == 0) { - memcpy(data->data, decrypted.data, offset); - data->length = offset; - } else { - retval = UA_STATUSCODE_BADINTERNALERROR; - } - UA_ByteString_deleteMembers(&decrypted); - return retval; +#include // memset + +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0 +#endif + +/****************************/ +/* Generic Socket Functions */ +/****************************/ + +static UA_StatusCode +connection_getsendbuffer(UA_Connection *connection, + size_t length, UA_ByteString *buf) { + if(length > connection->config.sendBufferSize) + return UA_STATUSCODE_BADCOMMUNICATIONERROR; + return UA_ByteString_allocBuffer(buf, length); } -static size_t -asym_getRemoteEncryptionKeyLength_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const Basic256Sha256_ChannelContext *cc) { - return mbedtls_pk_get_len(&cc->remoteCertificate.pk) * 8; +static void +connection_releasesendbuffer(UA_Connection *connection, + UA_ByteString *buf) { + UA_ByteString_deleteMembers(buf); } -static size_t -asym_getRemoteBlockSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const Basic256Sha256_ChannelContext *cc) { - mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); - return rsaContext->len; +static void +connection_releaserecvbuffer(UA_Connection *connection, + UA_ByteString *buf) { + UA_ByteString_deleteMembers(buf); +} + +static UA_StatusCode +connection_write(UA_Connection *connection, UA_ByteString *buf) { + if(connection->state == UA_CONNECTION_CLOSED) { + UA_ByteString_deleteMembers(buf); + return UA_STATUSCODE_BADCONNECTIONCLOSED; + } + + /* Prevent OS signals when sending to a closed socket */ + int flags = 0; + flags |= MSG_NOSIGNAL; + + /* Send the full buffer. This may require several calls to send */ + size_t nWritten = 0; + do { + ssize_t n = 0; + do { + size_t bytes_to_send = buf->length - nWritten; + n = UA_send(connection->sockfd, + (const char*)buf->data + nWritten, + bytes_to_send, flags); + if(n < 0 && UA_ERRNO != UA_INTERRUPTED && UA_ERRNO != UA_AGAIN) { + connection->close(connection); + UA_ByteString_deleteMembers(buf); + return UA_STATUSCODE_BADCONNECTIONCLOSED; + } + } while(n < 0); + nWritten += (size_t)n; + } while(nWritten < buf->length); + + /* Free the buffer */ + UA_ByteString_deleteMembers(buf); + return UA_STATUSCODE_GOOD; } -static size_t -asym_getRemotePlainTextBlockSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const Basic256Sha256_ChannelContext *cc) { - mbedtls_rsa_context *const rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); - return rsaContext->len - UA_SECURITYPOLICY_BASIC256SHA256_RSAPADDING_LEN; -} +static UA_StatusCode +connection_recv(UA_Connection *connection, UA_ByteString *response, + UA_UInt32 timeout) { + if(connection->state == UA_CONNECTION_CLOSED) + return UA_STATUSCODE_BADCONNECTIONCLOSED; + + /* Listen on the socket for the given timeout until a message arrives */ + if(timeout > 0) { + fd_set fdset; + FD_ZERO(&fdset); + UA_fd_set(connection->sockfd, &fdset); + UA_UInt32 timeout_usec = timeout * 1000; + struct timeval tmptv = {(long int)(timeout_usec / 1000000), + (int)(timeout_usec % 1000000)}; + int resultsize = UA_select(connection->sockfd+1, &fdset, NULL, + NULL, &tmptv); + + /* No result */ + if(resultsize == 0) + return UA_STATUSCODE_GOODNONCRITICALTIMEOUT; -static UA_StatusCode -asym_makeThumbprint_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *certificate, - UA_ByteString *thumbprint) { - if(securityPolicy == NULL || certificate == NULL || thumbprint == NULL) - return UA_STATUSCODE_BADINTERNALERROR; + if(resultsize == -1) { + /* The call to select was interrupted manually. Act as if it timed + * out */ + if(UA_ERRNO == EINTR) + return UA_STATUSCODE_GOODNONCRITICALTIMEOUT; - if(UA_ByteString_equal(certificate, &UA_BYTESTRING_NULL)) - return UA_STATUSCODE_BADINTERNALERROR; + /* The error cannot be recovered. Close the connection. */ + connection->close(connection); + return UA_STATUSCODE_BADCONNECTIONCLOSED; + } + } - if(thumbprint->length != UA_SHA1_LENGTH) - return UA_STATUSCODE_BADINTERNALERROR; + response->data = (UA_Byte*)UA_malloc(connection->config.recvBufferSize); + if(!response->data) { + response->length = 0; + return UA_STATUSCODE_BADOUTOFMEMORY; /* not enough memory retry */ + } - /* The certificate thumbprint is always a 20 bit sha1 hash, see Part 4 of the Specification. */ -#if MBEDTLS_VERSION_NUMBER >= 0x02070000 - mbedtls_sha1_ret(certificate->data, certificate->length, thumbprint->data); +#ifdef _WIN32 + // windows requires int parameter for length + int offset = (int)connection->incompleteChunk.length; + int remaining = connection->config.recvBufferSize - offset; #else - mbedtls_sha1(certificate->data, certificate->length, thumbprint->data); + size_t offset = connection->incompleteChunk.length; + size_t remaining = connection->config.recvBufferSize - offset; #endif - return UA_STATUSCODE_GOOD; -} -static UA_StatusCode -asymmetricModule_compareCertificateThumbprint_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *certificateThumbprint) { - if(securityPolicy == NULL || certificateThumbprint == NULL) - return UA_STATUSCODE_BADINTERNALERROR; + /* Get the received packet(s) */ + ssize_t ret = UA_recv(connection->sockfd, (char*)&response->data[offset], + remaining, 0); - Basic256Sha256_PolicyContext *pc = (Basic256Sha256_PolicyContext *)securityPolicy->policyContext; - if(!UA_ByteString_equal(certificateThumbprint, &pc->localCertThumbprint)) - return UA_STATUSCODE_BADCERTIFICATEINVALID; + /* The remote side closed the connection */ + if(ret == 0) { + UA_ByteString_deleteMembers(response); + connection->close(connection); + return UA_STATUSCODE_BADCONNECTIONCLOSED; + } + + /* Error case */ + if(ret < 0) { + UA_ByteString_deleteMembers(response); + if(UA_ERRNO == UA_INTERRUPTED || (timeout > 0) ? + false : (UA_ERRNO == UA_EAGAIN || UA_ERRNO == UA_WOULDBLOCK)) + return UA_STATUSCODE_GOOD; /* statuscode_good but no data -> retry */ + connection->close(connection); + return UA_STATUSCODE_BADCONNECTIONCLOSED; + } + /* Preprend the last incompleteChunk into the buffer */ + if (connection->incompleteChunk.length > 0) { + memcpy(response->data, connection->incompleteChunk.data, + connection->incompleteChunk.length); + UA_ByteString_deleteMembers(&connection->incompleteChunk); + } + + /* Set the length of the received buffer */ + response->length = offset + (size_t)ret; return UA_STATUSCODE_GOOD; } -/*******************/ -/* SymmetricModule */ -/*******************/ -static void -md_hmac_Basic256Sha256(mbedtls_md_context_t *context, const UA_ByteString *key, - const UA_ByteString *in, unsigned char out[32]) { - mbedtls_md_hmac_starts(context, key->data, key->length); - mbedtls_md_hmac_update(context, in->data, in->length); - mbedtls_md_hmac_finish(context, out); -} +/***************************/ +/* Server NetworkLayer TCP */ +/***************************/ -static UA_StatusCode -sym_verify_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - Basic256Sha256_ChannelContext *cc, - const UA_ByteString *message, - const UA_ByteString *signature) { - if(securityPolicy == NULL || cc == NULL || message == NULL || signature == NULL) - return UA_STATUSCODE_BADINTERNALERROR; +#define MAXBACKLOG 100 +#define NOHELLOTIMEOUT 120000 /* timeout in ms before close the connection + * if server does not receive Hello Message */ - /* Compute MAC */ - if(signature->length != UA_SHA256_LENGTH) { - UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, - "Signature size does not have the desired size defined by the security policy"); - return UA_STATUSCODE_BADSECURITYCHECKSFAILED; - } +typedef struct ConnectionEntry { + UA_Connection connection; + LIST_ENTRY(ConnectionEntry) pointers; +} ConnectionEntry; - Basic256Sha256_PolicyContext *pc = - (Basic256Sha256_PolicyContext *)securityPolicy->policyContext; +typedef struct { + const UA_Logger *logger; + UA_UInt16 port; + UA_SOCKET serverSockets[FD_SETSIZE]; + UA_UInt16 serverSocketsSize; + LIST_HEAD(, ConnectionEntry) connections; +} ServerNetworkLayerTCP; - unsigned char mac[UA_SHA256_LENGTH]; - md_hmac_Basic256Sha256(&pc->sha256MdContext, &cc->remoteSymSigningKey, message, mac); +static void +ServerNetworkLayerTCP_freeConnection(UA_Connection *connection) { + UA_Connection_deleteMembers(connection); + UA_free(connection); +} - /* Compare with Signature */ - if(memcmp(signature->data, mac, UA_SHA256_LENGTH) != 0) - return UA_STATUSCODE_BADSECURITYCHECKSFAILED; - return UA_STATUSCODE_GOOD; +/* This performs only 'shutdown'. 'close' is called when the shutdown + * socket is returned from select. */ +static void +ServerNetworkLayerTCP_close(UA_Connection *connection) { + if (connection->state == UA_CONNECTION_CLOSED) + return; + UA_shutdown((UA_SOCKET)connection->sockfd, 2); + connection->state = UA_CONNECTION_CLOSED; } static UA_StatusCode -sym_sign_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const Basic256Sha256_ChannelContext *cc, - const UA_ByteString *message, - UA_ByteString *signature) { - if(signature->length != UA_SHA256_LENGTH) - return UA_STATUSCODE_BADINTERNALERROR; +ServerNetworkLayerTCP_add(UA_ServerNetworkLayer *nl, ServerNetworkLayerTCP *layer, + UA_Int32 newsockfd, struct sockaddr_storage *remote) { + /* Set nonblocking */ + UA_socket_set_nonblocking(newsockfd);//TODO: check return value - md_hmac_Basic256Sha256(&cc->policyContext->sha256MdContext, &cc->localSymSigningKey, - message, signature->data); - return UA_STATUSCODE_GOOD; -} + /* Do not merge packets on the socket (disable Nagle's algorithm) */ + int dummy = 1; + if(UA_setsockopt(newsockfd, IPPROTO_TCP, TCP_NODELAY, + (const char *)&dummy, sizeof(dummy)) < 0) { + UA_LOG_SOCKET_ERRNO_WRAP( + UA_LOG_ERROR(layer->logger, UA_LOGCATEGORY_NETWORK, + "Cannot set socket option TCP_NODELAY. Error: %s", + errno_str)); + return UA_STATUSCODE_BADUNEXPECTEDERROR; + } -static size_t -sym_getSignatureSize_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const void *channelContext) { - return UA_SHA256_LENGTH; -} +#if defined(UA_getnameinfo) + /* Get the peer name for logging */ + char remote_name[100]; + int res = UA_getnameinfo((struct sockaddr*)remote, + sizeof(struct sockaddr_storage), + remote_name, sizeof(remote_name), + NULL, 0, NI_NUMERICHOST); + if(res == 0) { + UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK, + "Connection %i | New connection over TCP from %s", + (int)newsockfd, remote_name); + } else { + UA_LOG_SOCKET_ERRNO_WRAP(UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, + "Connection %i | New connection over TCP, " + "getnameinfo failed with error: %s", + (int)newsockfd, errno_str)); + } +#else + UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK, + "Connection %i | New connection over TCP", + (int)newsockfd); +#endif + /* Allocate and initialize the connection */ + ConnectionEntry *e = (ConnectionEntry*)UA_malloc(sizeof(ConnectionEntry)); + if(!e){ + UA_close(newsockfd); + return UA_STATUSCODE_BADOUTOFMEMORY; + } -static size_t -sym_getSigningKeyLength_sp_basic256sha256(const UA_SecurityPolicy *const securityPolicy, - const void *const channelContext) { - return UA_BASIC256SHA256_SYM_SIGNING_KEY_LENGTH; -} + UA_Connection *c = &e->connection; + memset(c, 0, sizeof(UA_Connection)); + c->sockfd = newsockfd; + c->handle = layer; + c->config = nl->localConnectionConfig; + c->send = connection_write; + c->close = ServerNetworkLayerTCP_close; + c->free = ServerNetworkLayerTCP_freeConnection; + c->getSendBuffer = connection_getsendbuffer; + c->releaseSendBuffer = connection_releasesendbuffer; + c->releaseRecvBuffer = connection_releaserecvbuffer; + c->state = UA_CONNECTION_OPENING; + c->openingDate = UA_DateTime_nowMonotonic(); -static size_t -sym_getEncryptionKeyLength_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const void *channelContext) { - return UA_SECURITYPOLICY_BASIC256SHA256_SYM_KEY_LENGTH; + /* Add to the linked list */ + LIST_INSERT_HEAD(&layer->connections, e, pointers); + return UA_STATUSCODE_GOOD; } -static size_t -sym_getEncryptionBlockSize_sp_basic256sha256(const UA_SecurityPolicy *const securityPolicy, - const void *const channelContext) { - return UA_SECURITYPOLICY_BASIC256SHA256_SYM_ENCRYPTION_BLOCK_SIZE; -} +static void +addServerSocket(ServerNetworkLayerTCP *layer, struct addrinfo *ai) { + /* Create the server socket */ + UA_SOCKET newsock = UA_socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); + if(newsock == UA_INVALID_SOCKET) + { + UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, + "Error opening the server socket"); + return; + } -static size_t -sym_getPlainTextBlockSize_sp_basic256sha256(const UA_SecurityPolicy *const securityPolicy, - const void *const channelContext) { - return UA_SECURITYPOLICY_BASIC256SHA256_SYM_PLAIN_TEXT_BLOCK_SIZE; -} + /* Some Linux distributions have net.ipv6.bindv6only not activated. So + * sockets can double-bind to IPv4 and IPv6. This leads to problems. Use + * AF_INET6 sockets only for IPv6. */ -static UA_StatusCode -sym_encrypt_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const Basic256Sha256_ChannelContext *cc, - UA_ByteString *data) { - if(securityPolicy == NULL || cc == NULL || data == NULL) - return UA_STATUSCODE_BADINTERNALERROR; + int optval = 1; +#if UA_IPV6 + if(ai->ai_family == AF_INET6 && + UA_setsockopt(newsock, IPPROTO_IPV6, IPV6_V6ONLY, + (const char*)&optval, sizeof(optval)) == -1) { + UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, + "Could not set an IPv6 socket to IPv6 only"); + UA_close(newsock); + return; + } +#endif + if(UA_setsockopt(newsock, SOL_SOCKET, SO_REUSEADDR, + (const char *)&optval, sizeof(optval)) == -1) { + UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, + "Could not make the socket reusable"); + UA_close(newsock); + return; + } - if(cc->localSymIv.length != - securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.getLocalBlockSize(securityPolicy, cc)) - return UA_STATUSCODE_BADINTERNALERROR; - size_t plainTextBlockSize = - securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.getLocalPlainTextBlockSize(securityPolicy, cc); + if(UA_socket_set_nonblocking(newsock) != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, + "Could not set the server socket to nonblocking"); + UA_close(newsock); + return; + } - if(data->length % plainTextBlockSize != 0) { - UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, - "Length of data to encrypt is not a multiple of the plain text block size." - "Padding might not have been calculated appropriately."); - return UA_STATUSCODE_BADINTERNALERROR; + /* Bind socket to address */ + if(UA_bind(newsock, ai->ai_addr, (socklen_t)ai->ai_addrlen) < 0) { + UA_LOG_SOCKET_ERRNO_WRAP( + UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, + "Error binding a server socket: %s", errno_str)); + UA_close(newsock); + return; } - /* Keylength in bits */ - unsigned int keylength = (unsigned int)(cc->localSymEncryptingKey.length * 8); - mbedtls_aes_context aesContext; - int mbedErr = mbedtls_aes_setkey_enc(&aesContext, cc->localSymEncryptingKey.data, keylength); - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADINTERNALERROR); + /* Start listening */ + if(UA_listen(newsock, MAXBACKLOG) < 0) { + UA_LOG_SOCKET_ERRNO_WRAP( + UA_LOG_WARNING(layer->logger, UA_LOGCATEGORY_NETWORK, + "Error listening on server socket: %s", errno_str)); + UA_close(newsock); + return; + } - UA_ByteString ivCopy; - UA_StatusCode retval = UA_ByteString_copy(&cc->localSymIv, &ivCopy); - if(retval != UA_STATUSCODE_GOOD) - return retval; + if (layer->port == 0) { + /* Port was automatically chosen. Read it from the OS */ + struct sockaddr_in returned_addr; + memset(&returned_addr, 0, sizeof(returned_addr)); + socklen_t len = sizeof(returned_addr); + UA_getsockname(newsock, (struct sockaddr *)&returned_addr, &len); + layer->port = ntohs(returned_addr.sin_port); + } - mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_ENCRYPT, data->length, - ivCopy.data, data->data, data->data); - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADINTERNALERROR); - UA_ByteString_deleteMembers(&ivCopy); - return retval; + layer->serverSockets[layer->serverSocketsSize] = newsock; + layer->serverSocketsSize++; } static UA_StatusCode -sym_decrypt_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const Basic256Sha256_ChannelContext *cc, - UA_ByteString *data) { - if(securityPolicy == NULL || cc == NULL || data == NULL) - return UA_STATUSCODE_BADINTERNALERROR; +ServerNetworkLayerTCP_start(UA_ServerNetworkLayer *nl, const UA_String *customHostname) { + UA_initialize_architecture_network(); - size_t encryptionBlockSize = - securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm.getLocalBlockSize(securityPolicy, cc); + ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP *)nl->handle; - if(cc->remoteSymIv.length != encryptionBlockSize) + /* Get addrinfo of the server and create server sockets */ + char portno[6]; + UA_snprintf(portno, 6, "%d", layer->port); + struct addrinfo hints, *res; + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; + hints.ai_protocol = IPPROTO_TCP; + if(UA_getaddrinfo(NULL, portno, &hints, &res) != 0) return UA_STATUSCODE_BADINTERNALERROR; - if(data->length % encryptionBlockSize != 0) { - UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, - "Length of data to decrypt is not a multiple of the encryptingBlock size."); - return UA_STATUSCODE_BADINTERNALERROR; + /* There might be serveral addrinfos (for different network cards, + * IPv4/IPv6). Add a server socket for all of them. */ + struct addrinfo *ai = res; + for(layer->serverSocketsSize = 0; + layer->serverSocketsSize < FD_SETSIZE && ai != NULL; + ai = ai->ai_next) + addServerSocket(layer, ai); + UA_freeaddrinfo(res); + + /* Get the discovery url from the hostname */ + UA_String du = UA_STRING_NULL; + char discoveryUrlBuffer[256]; + if (customHostname->length) { + du.length = (size_t)UA_snprintf(discoveryUrlBuffer, 255, "opc.tcp://%.*s:%d/", + (int)customHostname->length, + customHostname->data, + layer->port); + du.data = (UA_Byte*)discoveryUrlBuffer; + }else{ + char hostnameBuffer[256]; + if(UA_gethostname(hostnameBuffer, 255) == 0) { + du.length = (size_t)UA_snprintf(discoveryUrlBuffer, 255, "opc.tcp://%s:%d/", + hostnameBuffer, layer->port); + du.data = (UA_Byte*)discoveryUrlBuffer; + } else { + UA_LOG_ERROR(layer->logger, UA_LOGCATEGORY_NETWORK, "Could not get the hostname"); + return UA_STATUSCODE_BADINTERNALERROR; + } } + UA_String_copy(&du, &nl->discoveryUrl); - unsigned int keylength = (unsigned int)(cc->remoteSymEncryptingKey.length * 8); - mbedtls_aes_context aesContext; - int mbedErr = mbedtls_aes_setkey_dec(&aesContext, cc->remoteSymEncryptingKey.data, keylength); - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADINTERNALERROR); + UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK, + "TCP network layer listening on %.*s", + (int)nl->discoveryUrl.length, nl->discoveryUrl.data); + return UA_STATUSCODE_GOOD; +} - UA_ByteString ivCopy; - UA_StatusCode retval = UA_ByteString_copy(&cc->remoteSymIv, &ivCopy); - if(retval != UA_STATUSCODE_GOOD) - return retval; +/* After every select, reset the sockets to listen on */ +static UA_Int32 +setFDSet(ServerNetworkLayerTCP *layer, fd_set *fdset) { + FD_ZERO(fdset); + UA_Int32 highestfd = 0; + for(UA_UInt16 i = 0; i < layer->serverSocketsSize; i++) { + UA_fd_set(layer->serverSockets[i], fdset); + if((UA_Int32)layer->serverSockets[i] > highestfd) + highestfd = (UA_Int32)layer->serverSockets[i]; + } - mbedErr = mbedtls_aes_crypt_cbc(&aesContext, MBEDTLS_AES_DECRYPT, data->length, - ivCopy.data, data->data, data->data); - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADINTERNALERROR); - UA_ByteString_deleteMembers(&ivCopy); - return retval; -} + ConnectionEntry *e; + LIST_FOREACH(e, &layer->connections, pointers) { + UA_fd_set(e->connection.sockfd, fdset); + if((UA_Int32)e->connection.sockfd > highestfd) + highestfd = (UA_Int32)e->connection.sockfd; + } -static void -swapBuffers_Basic256Sha256(UA_ByteString *const bufA, UA_ByteString *const bufB) { - UA_ByteString tmp = *bufA; - *bufA = *bufB; - *bufB = tmp; + return highestfd; } static UA_StatusCode -sym_generateKey_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *secret, const UA_ByteString *seed, - UA_ByteString *out) { - if(securityPolicy == NULL || secret == NULL || seed == NULL || out == NULL) - return UA_STATUSCODE_BADINTERNALERROR; - - Basic256Sha256_PolicyContext *pc = - (Basic256Sha256_PolicyContext *)securityPolicy->policyContext; +ServerNetworkLayerTCP_listen(UA_ServerNetworkLayer *nl, UA_Server *server, + UA_UInt16 timeout) { + /* Every open socket can generate two jobs */ + ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP *)nl->handle; - size_t hashLen = 0; - const mbedtls_md_info_t *mdInfo = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256); - hashLen = (size_t)mbedtls_md_get_size(mdInfo); + if (layer->serverSocketsSize == 0) + return UA_STATUSCODE_GOOD; - UA_ByteString A_and_seed; - UA_ByteString_allocBuffer(&A_and_seed, hashLen + seed->length); - memcpy(A_and_seed.data + hashLen, seed->data, seed->length); + /* Listen on open sockets (including the server) */ + fd_set fdset, errset; + UA_Int32 highestfd = setFDSet(layer, &fdset); + setFDSet(layer, &errset); + struct timeval tmptv = {0, timeout * 1000}; + if (UA_select(highestfd+1, &fdset, NULL, &errset, &tmptv) < 0) { + UA_LOG_SOCKET_ERRNO_WRAP( + UA_LOG_DEBUG(layer->logger, UA_LOGCATEGORY_NETWORK, + "Socket select failed with %s", errno_str)); + // we will retry, so do not return bad + return UA_STATUSCODE_GOOD; + } - UA_ByteString ANext_and_seed; - UA_ByteString_allocBuffer(&ANext_and_seed, hashLen + seed->length); - memcpy(ANext_and_seed.data + hashLen, seed->data, seed->length); + /* Accept new connections via the server sockets */ + for(UA_UInt16 i = 0; i < layer->serverSocketsSize; i++) { + if(!UA_fd_isset(layer->serverSockets[i], &fdset)) + continue; - UA_ByteString A = { - hashLen, - A_and_seed.data - }; + struct sockaddr_storage remote; + socklen_t remote_size = sizeof(remote); + UA_SOCKET newsockfd = UA_accept((UA_SOCKET)layer->serverSockets[i], + (struct sockaddr*)&remote, &remote_size); + if(newsockfd == UA_INVALID_SOCKET) + continue; - UA_ByteString ANext = { - hashLen, - ANext_and_seed.data - }; + UA_LOG_TRACE(layer->logger, UA_LOGCATEGORY_NETWORK, + "Connection %i | New TCP connection on server socket %i", + (int)newsockfd, (int)(layer->serverSockets[i])); - md_hmac_Basic256Sha256(&pc->sha256MdContext, secret, seed, A.data); + ServerNetworkLayerTCP_add(nl, layer, (UA_Int32)newsockfd, &remote); + } - UA_StatusCode retval = 0; - for(size_t offset = 0; offset < out->length; offset += hashLen) { - UA_ByteString outSegment = { - hashLen, - out->data + offset - }; - UA_Boolean bufferAllocated = UA_FALSE; - // Not enough room in out buffer to write the hash. - if(offset + hashLen > out->length) { - outSegment.data = NULL; - outSegment.length = 0; - retval |= UA_ByteString_allocBuffer(&outSegment, hashLen); - if(retval != UA_STATUSCODE_GOOD) { - UA_ByteString_deleteMembers(&A_and_seed); - UA_ByteString_deleteMembers(&ANext_and_seed); - return retval; - } - bufferAllocated = UA_TRUE; + /* Read from established sockets */ + ConnectionEntry *e, *e_tmp; + UA_DateTime now = UA_DateTime_nowMonotonic(); + LIST_FOREACH_SAFE(e, &layer->connections, pointers, e_tmp) { + if ((e->connection.state == UA_CONNECTION_OPENING) && + (now > (e->connection.openingDate + (NOHELLOTIMEOUT * UA_DATETIME_MSEC)))){ + UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK, + "Connection %i | Closed by the server (no Hello Message)", + (int)(e->connection.sockfd)); + LIST_REMOVE(e, pointers); + UA_close(e->connection.sockfd); + UA_Server_removeConnection(server, &e->connection); + continue; } - md_hmac_Basic256Sha256(&pc->sha256MdContext, secret, &A_and_seed, outSegment.data); - md_hmac_Basic256Sha256(&pc->sha256MdContext, secret, &A, ANext.data); + if(!UA_fd_isset(e->connection.sockfd, &errset) && + !UA_fd_isset(e->connection.sockfd, &fdset)) + continue; - if(retval != UA_STATUSCODE_GOOD) { - if(bufferAllocated) - UA_ByteString_deleteMembers(&outSegment); - UA_ByteString_deleteMembers(&A_and_seed); - UA_ByteString_deleteMembers(&ANext_and_seed); - return retval; - } + UA_LOG_TRACE(layer->logger, UA_LOGCATEGORY_NETWORK, + "Connection %i | Activity on the socket", + (int)(e->connection.sockfd)); - if(bufferAllocated) { - memcpy(out->data + offset, outSegment.data, out->length - offset); - UA_ByteString_deleteMembers(&outSegment); - } + UA_ByteString buf = UA_BYTESTRING_NULL; + UA_StatusCode retval = connection_recv(&e->connection, &buf, 0); - swapBuffers_Basic256Sha256(&ANext_and_seed, &A_and_seed); - swapBuffers_Basic256Sha256(&ANext, &A); + if(retval == UA_STATUSCODE_GOOD) { + /* Process packets */ + UA_Server_processBinaryMessage(server, &e->connection, &buf); + connection_releaserecvbuffer(&e->connection, &buf); + } else if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED) { + /* The socket is shutdown but not closed */ + UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK, + "Connection %i | Closed", + (int)(e->connection.sockfd)); + LIST_REMOVE(e, pointers); + UA_close(e->connection.sockfd); + UA_Server_removeConnection(server, &e->connection); + } } - - UA_ByteString_deleteMembers(&A_and_seed); - UA_ByteString_deleteMembers(&ANext_and_seed); return UA_STATUSCODE_GOOD; } -static UA_StatusCode -sym_generateNonce_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - UA_ByteString *out) { - if(securityPolicy == NULL || securityPolicy->policyContext == NULL || out == NULL) - return UA_STATUSCODE_BADINTERNALERROR; +static void +ServerNetworkLayerTCP_stop(UA_ServerNetworkLayer *nl, UA_Server *server) { + ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP *)nl->handle; + UA_LOG_INFO(layer->logger, UA_LOGCATEGORY_NETWORK, + "Shutting down the TCP network layer"); - Basic256Sha256_PolicyContext *data = - (Basic256Sha256_PolicyContext *)securityPolicy->policyContext; + /* Close the server sockets */ + for(UA_UInt16 i = 0; i < layer->serverSocketsSize; i++) { + UA_shutdown(layer->serverSockets[i], 2); + UA_close(layer->serverSockets[i]); + } + layer->serverSocketsSize = 0; - int mbedErr = mbedtls_ctr_drbg_random(&data->drbgContext, out->data, out->length); - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADUNEXPECTEDERROR); + /* Close open connections */ + ConnectionEntry *e; + LIST_FOREACH(e, &layer->connections, pointers) + ServerNetworkLayerTCP_close(&e->connection); - return UA_STATUSCODE_GOOD; + /* Run recv on client sockets. This picks up the closed sockets and frees + * the connection. */ + ServerNetworkLayerTCP_listen(nl, server, 0); + + UA_deinitialize_architecture_network(); } -/*****************/ -/* ChannelModule */ -/*****************/ +/* run only when the server is stopped */ +static void +ServerNetworkLayerTCP_deleteMembers(UA_ServerNetworkLayer *nl) { + ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP *)nl->handle; + UA_String_deleteMembers(&nl->discoveryUrl); -/* Assumes that the certificate has been verified externally */ -static UA_StatusCode -parseRemoteCertificate_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, - const UA_ByteString *remoteCertificate) { - if(remoteCertificate == NULL || cc == NULL) - return UA_STATUSCODE_BADINTERNALERROR; + /* Hard-close and remove remaining connections. The server is no longer + * running. So this is safe. */ + ConnectionEntry *e, *e_tmp; + LIST_FOREACH_SAFE(e, &layer->connections, pointers, e_tmp) { + LIST_REMOVE(e, pointers); + UA_close(e->connection.sockfd); + UA_free(e); + } - const UA_SecurityPolicy *securityPolicy = cc->policyContext->securityPolicy; + /* Free the layer */ + UA_free(layer); +} - /* Parse the certificate */ - int mbedErr = mbedtls_x509_crt_parse(&cc->remoteCertificate, remoteCertificate->data, - remoteCertificate->length); - UA_MBEDTLS_ERRORHANDLING_RETURN(UA_STATUSCODE_BADSECURITYCHECKSFAILED); +UA_ServerNetworkLayer +UA_ServerNetworkLayerTCP(UA_ConnectionConfig config, UA_UInt16 port, + UA_Logger *logger) { + UA_ServerNetworkLayer nl; + memset(&nl, 0, sizeof(UA_ServerNetworkLayer)); + nl.deleteMembers = ServerNetworkLayerTCP_deleteMembers; + nl.localConnectionConfig = config; + nl.start = ServerNetworkLayerTCP_start; + nl.listen = ServerNetworkLayerTCP_listen; + nl.stop = ServerNetworkLayerTCP_stop; + nl.handle = NULL; + + ServerNetworkLayerTCP *layer = (ServerNetworkLayerTCP*) + UA_calloc(1,sizeof(ServerNetworkLayerTCP)); + if(!layer) + return nl; + nl.handle = layer; - /* Check the key length */ - mbedtls_rsa_context *rsaContext = mbedtls_pk_rsa(cc->remoteCertificate.pk); - if(rsaContext->len < UA_SECURITYPOLICY_BASIC256SHA256_MINASYMKEYLENGTH || - rsaContext->len > UA_SECURITYPOLICY_BASIC256SHA256_MAXASYMKEYLENGTH) - return UA_STATUSCODE_BADCERTIFICATEUSENOTALLOWED; + layer->logger = logger; + layer->port = port; - return UA_STATUSCODE_GOOD; + return nl; } -static void -channelContext_deleteContext_sp_basic256sha256(Basic256Sha256_ChannelContext *cc) { - UA_ByteString_deleteMembers(&cc->localSymSigningKey); - UA_ByteString_deleteMembers(&cc->localSymEncryptingKey); - UA_ByteString_deleteMembers(&cc->localSymIv); +typedef struct TCPClientConnection { + struct addrinfo hints, *server; + UA_DateTime connStart; + char* endpointURL; + UA_UInt32 timeout; +} TCPClientConnection; - UA_ByteString_deleteMembers(&cc->remoteSymSigningKey); - UA_ByteString_deleteMembers(&cc->remoteSymEncryptingKey); - UA_ByteString_deleteMembers(&cc->remoteSymIv); +/***************************/ +/* Client NetworkLayer TCP */ +/***************************/ - mbedtls_x509_crt_free(&cc->remoteCertificate); +static void +ClientNetworkLayerTCP_close(UA_Connection *connection) { + if (connection->state == UA_CONNECTION_CLOSED) + return; - UA_free(cc); + if(connection->sockfd != UA_INVALID_SOCKET) { + UA_shutdown(connection->sockfd, 2); + UA_close(connection->sockfd); + } + connection->state = UA_CONNECTION_CLOSED; } -static UA_StatusCode -channelContext_newContext_sp_basic256sha256(const UA_SecurityPolicy *securityPolicy, - const UA_ByteString *remoteCertificate, - void **pp_contextData) { - if(securityPolicy == NULL || remoteCertificate == NULL || pp_contextData == NULL) - return UA_STATUSCODE_BADINTERNALERROR; +static void +ClientNetworkLayerTCP_free(UA_Connection *connection) { + if(connection->handle) { + TCPClientConnection *tcpConnection = (TCPClientConnection *)connection->handle; + if(tcpConnection->server) + UA_freeaddrinfo(tcpConnection->server); + UA_free(tcpConnection); + connection->handle = NULL; + } +} - /* Allocate the channel context */ - *pp_contextData = UA_malloc(sizeof(Basic256Sha256_ChannelContext)); - if(*pp_contextData == NULL) - return UA_STATUSCODE_BADOUTOFMEMORY; +UA_StatusCode UA_ClientConnectionTCP_poll(UA_Client *client, void *data) { + UA_Connection *connection = (UA_Connection*) data; - Basic256Sha256_ChannelContext *cc = (Basic256Sha256_ChannelContext *)*pp_contextData; + if (connection->state == UA_CONNECTION_CLOSED) + return UA_STATUSCODE_BADDISCONNECT; - /* Initialize the channel context */ - cc->policyContext = (Basic256Sha256_PolicyContext *)securityPolicy->policyContext; + TCPClientConnection *tcpConnection = + (TCPClientConnection*) connection->handle; - UA_ByteString_init(&cc->localSymSigningKey); - UA_ByteString_init(&cc->localSymEncryptingKey); - UA_ByteString_init(&cc->localSymIv); + UA_DateTime connStart = UA_DateTime_nowMonotonic(); + UA_SOCKET clientsockfd = connection->sockfd; - UA_ByteString_init(&cc->remoteSymSigningKey); - UA_ByteString_init(&cc->remoteSymEncryptingKey); - UA_ByteString_init(&cc->remoteSymIv); + UA_ClientConfig *config = UA_Client_getConfig(client); - mbedtls_x509_crt_init(&cc->remoteCertificate); + if (connection->state == UA_CONNECTION_ESTABLISHED) { + UA_Client_removeRepeatedCallback(client, connection->connectCallbackID); + connection->connectCallbackID = 0; + return UA_STATUSCODE_GOOD; + } + if ((UA_Double) (UA_DateTime_nowMonotonic() - tcpConnection->connStart) + > tcpConnection->timeout* UA_DATETIME_MSEC ) { + // connection timeout + ClientNetworkLayerTCP_close(connection); + UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_NETWORK, + "Timed out"); + return UA_STATUSCODE_BADDISCONNECT; - // TODO: this can be optimized so that we dont allocate memory before parsing the certificate - UA_StatusCode retval = parseRemoteCertificate_sp_basic256sha256(cc, remoteCertificate); - if(retval != UA_STATUSCODE_GOOD) { - channelContext_deleteContext_sp_basic256sha256(cc); - *pp_contextData = NULL; } - return retval; -} + /* On linux connect may immediately return with ECONNREFUSED but we still want to try to connect */ + /* Thus use a loop and retry until timeout is reached */ -static UA_StatusCode -channelContext_setLocalSymEncryptingKey_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, - const UA_ByteString *key) { - if(key == NULL || cc == NULL) - return UA_STATUSCODE_BADINTERNALERROR; + /* Get a socket */ + if(clientsockfd <= 0) { + clientsockfd = UA_socket(tcpConnection->server->ai_family, + tcpConnection->server->ai_socktype, + tcpConnection->server->ai_protocol); + connection->sockfd = (UA_Int32)clientsockfd; /* cast for win32 */ + } - UA_ByteString_deleteMembers(&cc->localSymEncryptingKey); - return UA_ByteString_copy(key, &cc->localSymEncryptingKey); -} + if(clientsockfd == UA_INVALID_SOCKET) { + UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_NETWORK, + "Could not create client socket: %s", strerror(UA_ERRNO)); + ClientNetworkLayerTCP_close(connection); + return UA_STATUSCODE_BADDISCONNECT; + } -static UA_StatusCode -channelContext_setLocalSymSigningKey_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, - const UA_ByteString *key) { - if(key == NULL || cc == NULL) - return UA_STATUSCODE_BADINTERNALERROR; + /* Non blocking connect to be able to timeout */ + if(UA_socket_set_nonblocking(clientsockfd) != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_NETWORK, + "Could not set the client socket to nonblocking"); + ClientNetworkLayerTCP_close(connection); + return UA_STATUSCODE_BADDISCONNECT; + } - UA_ByteString_deleteMembers(&cc->localSymSigningKey); - return UA_ByteString_copy(key, &cc->localSymSigningKey); -} + /* Non blocking connect */ + int error = UA_connect(clientsockfd, tcpConnection->server->ai_addr, + tcpConnection->server->ai_addrlen); + if ((error == -1) && (UA_ERRNO != UA_ERR_CONNECTION_PROGRESS)) { + ClientNetworkLayerTCP_close(connection); + UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_NETWORK, + "Connection to failed with error: %s", strerror(UA_ERRNO)); + return UA_STATUSCODE_BADDISCONNECT; + } -static UA_StatusCode -channelContext_setLocalSymIv_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, - const UA_ByteString *iv) { - if(iv == NULL || cc == NULL) - return UA_STATUSCODE_BADINTERNALERROR; + /* Use select to wait and check if connected */ + if (error == -1 && (UA_ERRNO == UA_ERR_CONNECTION_PROGRESS)) { + /* connection in progress. Wait until connected using select */ - UA_ByteString_deleteMembers(&cc->localSymIv); - return UA_ByteString_copy(iv, &cc->localSymIv); -} + UA_UInt32 timeSinceStart = (UA_UInt32) + ((UA_Double) (UA_DateTime_nowMonotonic() - connStart) / UA_DATETIME_MSEC); +#ifdef _OS9000 + /* OS-9 can't use select for checking write sockets. + * Therefore, we need to use connect until success or failed + */ + UA_UInt32 timeout_usec = (tcpConnection->timeout - timeSinceStart) + * 1000; + int resultsize = 0; + do { + u_int32 time = 0x80000001; + signal_code sig; -static UA_StatusCode -channelContext_setRemoteSymEncryptingKey_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, - const UA_ByteString *key) { - if(key == NULL || cc == NULL) - return UA_STATUSCODE_BADINTERNALERROR; + timeout_usec -= 1000000/256; // Sleep 1/256 second + if (timeout_usec < 0) + break; - UA_ByteString_deleteMembers(&cc->remoteSymEncryptingKey); - return UA_ByteString_copy(key, &cc->remoteSymEncryptingKey); -} + _os_sleep(&time,&sig); + error = connect(clientsockfd, tcpConnection->server->ai_addr, + tcpConnection->server->ai_addrlen); + if ((error == -1 && UA_ERRNO == EISCONN) || (error == 0)) + resultsize = 1; + if (error == -1 && UA_ERRNO != EALREADY && UA_ERRNO != EINPROGRESS) + break; + } + while(resultsize == 0); +#else + fd_set fdset; + FD_ZERO(&fdset); + UA_fd_set(clientsockfd, &fdset); + UA_UInt32 timeout_usec = (tcpConnection->timeout - timeSinceStart) + * 1000; + struct timeval tmptv = { (long int) (timeout_usec / 1000000), + (int) (timeout_usec % 1000000) }; + + int resultsize = UA_select((UA_Int32) (clientsockfd + 1), NULL, &fdset, + NULL, &tmptv); +#endif + if (resultsize == 1) { + /* Windows does not have any getsockopt equivalent and it is not needed there */ +#ifdef _WIN32 + connection->sockfd = clientsockfd; + connection->state = UA_CONNECTION_ESTABLISHED; + return UA_STATUSCODE_GOOD; +#else + OPTVAL_TYPE so_error; + socklen_t len = sizeof so_error; + + int ret = UA_getsockopt(clientsockfd, SOL_SOCKET, SO_ERROR, &so_error, + &len); + + if (ret != 0 || so_error != 0) { + /* on connection refused we should still try to connect */ + /* connection refused happens on localhost or local ip without timeout */ + if (so_error != ECONNREFUSED) { + // general error + ClientNetworkLayerTCP_close(connection); + UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_NETWORK, + "Connection to failed with error: %s", + strerror(ret == 0 ? so_error : UA_ERRNO)); + return UA_STATUSCODE_BADDISCONNECT; + } + /* wait until we try a again. Do not make this too small, otherwise the + * timeout is somehow wrong */ -static UA_StatusCode -channelContext_setRemoteSymSigningKey_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, - const UA_ByteString *key) { - if(key == NULL || cc == NULL) - return UA_STATUSCODE_BADINTERNALERROR; + } else { + connection->state = UA_CONNECTION_ESTABLISHED; + return UA_STATUSCODE_GOOD; + } +#endif + } + } else { + connection->state = UA_CONNECTION_ESTABLISHED; + return UA_STATUSCODE_GOOD; + } - UA_ByteString_deleteMembers(&cc->remoteSymSigningKey); - return UA_ByteString_copy(key, &cc->remoteSymSigningKey); -} +#ifdef SO_NOSIGPIPE + int val = 1; + int sso_result = setsockopt(connection->sockfd, SOL_SOCKET, + SO_NOSIGPIPE, (void*)&val, sizeof(val)); + if(sso_result < 0) + UA_LOG_WARNING(&config->logger, UA_LOGCATEGORY_NETWORK, + "Couldn't set SO_NOSIGPIPE"); +#endif -static UA_StatusCode -channelContext_setRemoteSymIv_sp_basic256sha256(Basic256Sha256_ChannelContext *cc, - const UA_ByteString *iv) { - if(iv == NULL || cc == NULL) - return UA_STATUSCODE_BADINTERNALERROR; + return UA_STATUSCODE_GOOD; - UA_ByteString_deleteMembers(&cc->remoteSymIv); - return UA_ByteString_copy(iv, &cc->remoteSymIv); } -static UA_StatusCode -channelContext_compareCertificate_sp_basic256sha256(const Basic256Sha256_ChannelContext *cc, - const UA_ByteString *certificate) { - if(cc == NULL || certificate == NULL) - return UA_STATUSCODE_BADINTERNALERROR; +UA_Connection +UA_ClientConnectionTCP_init(UA_ConnectionConfig config, const UA_String endpointUrl, + UA_UInt32 timeout, UA_Logger *logger) { + UA_Connection connection; + memset(&connection, 0, sizeof(UA_Connection)); - const UA_SecurityPolicy *securityPolicy = cc->policyContext->securityPolicy; + connection.state = UA_CONNECTION_OPENING; + connection.config = config; + connection.send = connection_write; + connection.recv = connection_recv; + connection.close = ClientNetworkLayerTCP_close; + connection.free = ClientNetworkLayerTCP_free; + connection.getSendBuffer = connection_getsendbuffer; + connection.releaseSendBuffer = connection_releasesendbuffer; + connection.releaseRecvBuffer = connection_releaserecvbuffer; - mbedtls_x509_crt cert; - mbedtls_x509_crt_init(&cert); - int mbedErr = mbedtls_x509_crt_parse(&cert, certificate->data, certificate->length); - if(mbedErr) { - UA_LOG_MBEDERR; - return UA_STATUSCODE_BADSECURITYCHECKSFAILED; + TCPClientConnection *tcpClientConnection = (TCPClientConnection*) UA_malloc( + sizeof(TCPClientConnection)); + connection.handle = (void*) tcpClientConnection; + tcpClientConnection->timeout = timeout; + UA_String hostnameString = UA_STRING_NULL; + UA_String pathString = UA_STRING_NULL; + UA_UInt16 port = 0; + char hostname[512]; + tcpClientConnection->connStart = UA_DateTime_nowMonotonic(); + + UA_StatusCode parse_retval = UA_parseEndpointUrl(&endpointUrl, + &hostnameString, &port, &pathString); + if (parse_retval != UA_STATUSCODE_GOOD || hostnameString.length > 511) { + UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, + "Server url is invalid: %.*s", + (int)endpointUrl.length, endpointUrl.data); + connection.state = UA_CONNECTION_CLOSED; + return connection; } + memcpy(hostname, hostnameString.data, hostnameString.length); + hostname[hostnameString.length] = 0; - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(cert.raw.len != cc->remoteCertificate.raw.len || - memcmp(cert.raw.p, cc->remoteCertificate.raw.p, cert.raw.len) != 0) - retval = UA_STATUSCODE_BADSECURITYCHECKSFAILED; + if (port == 0) { + port = 4840; + UA_LOG_INFO(logger, UA_LOGCATEGORY_NETWORK, + "No port defined, using default port %d", port); + } - mbedtls_x509_crt_free(&cert); - return retval; + memset(&tcpClientConnection->hints, 0, sizeof(tcpClientConnection->hints)); + tcpClientConnection->hints.ai_family = AF_UNSPEC; + tcpClientConnection->hints.ai_socktype = SOCK_STREAM; + char portStr[6]; + UA_snprintf(portStr, 6, "%d", port); + int error = UA_getaddrinfo(hostname, portStr, &tcpClientConnection->hints, + &tcpClientConnection->server); + if (error != 0 || !tcpClientConnection->server) { + UA_LOG_SOCKET_ERRNO_GAI_WRAP(UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, + "DNS lookup of %s failed with error %s", hostname, errno_str)); + connection.state = UA_CONNECTION_CLOSED; + return connection; + } + return connection; } -static void -deleteMembers_sp_basic256sha256(UA_SecurityPolicy *securityPolicy) { - if(securityPolicy == NULL) - return; - - if(securityPolicy->policyContext == NULL) - return; - - UA_ByteString_deleteMembers(&securityPolicy->localCertificate); - - /* delete all allocated members in the context */ - Basic256Sha256_PolicyContext *pc = (Basic256Sha256_PolicyContext *) - securityPolicy->policyContext; - - mbedtls_ctr_drbg_free(&pc->drbgContext); - mbedtls_entropy_free(&pc->entropyContext); - mbedtls_pk_free(&pc->localPrivateKey); - mbedtls_md_free(&pc->sha256MdContext); - UA_ByteString_deleteMembers(&pc->localCertThumbprint); - - UA_LOG_DEBUG(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, - "Deleted members of EndpointContext for sp_basic256sha256"); +UA_Connection +UA_ClientConnectionTCP(UA_ConnectionConfig config, const UA_String endpointUrl, + UA_UInt32 timeout, UA_Logger *logger) { + UA_initialize_architecture_network(); - UA_free(pc); - securityPolicy->policyContext = NULL; -} + UA_Connection connection; + memset(&connection, 0, sizeof(UA_Connection)); + connection.state = UA_CONNECTION_CLOSED; + connection.config = config; + connection.send = connection_write; + connection.recv = connection_recv; + connection.close = ClientNetworkLayerTCP_close; + connection.free = ClientNetworkLayerTCP_free; + connection.getSendBuffer = connection_getsendbuffer; + connection.releaseSendBuffer = connection_releasesendbuffer; + connection.releaseRecvBuffer = connection_releaserecvbuffer; + connection.handle = NULL; -static UA_StatusCode -policyContext_newContext_sp_basic256sha256(UA_SecurityPolicy *securityPolicy, - const UA_ByteString localPrivateKey) { - UA_StatusCode retval = UA_STATUSCODE_GOOD; - if(securityPolicy == NULL) - return UA_STATUSCODE_BADINTERNALERROR; + UA_String hostnameString = UA_STRING_NULL; + UA_String pathString = UA_STRING_NULL; + UA_UInt16 port = 0; + char hostname[512]; - Basic256Sha256_PolicyContext *pc = (Basic256Sha256_PolicyContext *) - UA_malloc(sizeof(Basic256Sha256_PolicyContext)); - securityPolicy->policyContext = (void *)pc; - if(!pc) { - retval = UA_STATUSCODE_BADOUTOFMEMORY; - goto error; + UA_StatusCode parse_retval = + UA_parseEndpointUrl(&endpointUrl, &hostnameString, &port, &pathString); + if(parse_retval != UA_STATUSCODE_GOOD || hostnameString.length > 511) { + UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, + "Server url is invalid: %.*s", + (int)endpointUrl.length, endpointUrl.data); + return connection; } + memcpy(hostname, hostnameString.data, hostnameString.length); + hostname[hostnameString.length] = 0; - /* Initialize the PolicyContext */ - memset(pc, 0, sizeof(Basic256Sha256_PolicyContext)); - mbedtls_ctr_drbg_init(&pc->drbgContext); - mbedtls_entropy_init(&pc->entropyContext); - mbedtls_pk_init(&pc->localPrivateKey); - mbedtls_md_init(&pc->sha256MdContext); - pc->securityPolicy = securityPolicy; - - /* Initialized the message digest */ - const mbedtls_md_info_t *const mdInfo = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256); - int mbedErr = mbedtls_md_setup(&pc->sha256MdContext, mdInfo, MBEDTLS_MD_SHA256); - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADOUTOFMEMORY); - if(retval != UA_STATUSCODE_GOOD) - goto error; + if(port == 0) { + port = 4840; + UA_LOG_INFO(logger, UA_LOGCATEGORY_NETWORK, + "No port defined, using default port %d", port); + } - /* Add the system entropy source */ - mbedErr = mbedtls_entropy_add_source(&pc->entropyContext, - mbedtls_platform_entropy_poll, NULL, 0, - MBEDTLS_ENTROPY_SOURCE_STRONG); - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADSECURITYCHECKSFAILED); - if(retval != UA_STATUSCODE_GOOD) - goto error; + struct addrinfo hints, *server; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + char portStr[6]; + UA_snprintf(portStr, 6, "%d", port); + int error = UA_getaddrinfo(hostname, portStr, &hints, &server); + if(error != 0 || !server) { + UA_LOG_SOCKET_ERRNO_GAI_WRAP(UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, + "DNS lookup of %s failed with error %s", hostname, errno_str)); + return connection; + } - /* Seed the RNG */ - char *personalization = "open62541-drbg"; - mbedErr = mbedtls_ctr_drbg_seed(&pc->drbgContext, mbedtls_entropy_func, - &pc->entropyContext, - (const unsigned char *)personalization, 14); - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADSECURITYCHECKSFAILED); - if(retval != UA_STATUSCODE_GOOD) - goto error; + UA_Boolean connected = false; + UA_DateTime dtTimeout = timeout * UA_DATETIME_MSEC; + UA_DateTime connStart = UA_DateTime_nowMonotonic(); + UA_SOCKET clientsockfd; - /* Set the private key */ - mbedErr = mbedtls_pk_parse_key(&pc->localPrivateKey, - localPrivateKey.data, localPrivateKey.length, - NULL, 0); - UA_MBEDTLS_ERRORHANDLING(UA_STATUSCODE_BADSECURITYCHECKSFAILED); - if(retval != UA_STATUSCODE_GOOD) - goto error; + /* On linux connect may immediately return with ECONNREFUSED but we still + * want to try to connect. So use a loop and retry until timeout is + * reached. */ + do { + /* Get a socket */ + clientsockfd = UA_socket(server->ai_family, + server->ai_socktype, + server->ai_protocol); + if(clientsockfd == UA_INVALID_SOCKET) { + UA_LOG_SOCKET_ERRNO_WRAP(UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, + "Could not create client socket: %s", errno_str)); + UA_freeaddrinfo(server); + return connection; + } - /* Set the local certificate thumbprint */ - retval = UA_ByteString_allocBuffer(&pc->localCertThumbprint, UA_SHA1_LENGTH); - if(retval != UA_STATUSCODE_GOOD) - goto error; - retval = asym_makeThumbprint_sp_basic256sha256(pc->securityPolicy, - &securityPolicy->localCertificate, - &pc->localCertThumbprint); - if(retval != UA_STATUSCODE_GOOD) - goto error; + connection.state = UA_CONNECTION_OPENING; - return UA_STATUSCODE_GOOD; + /* Connect to the server */ + connection.sockfd = clientsockfd; -error: - UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, - "Could not create securityContext"); - if(securityPolicy->policyContext != NULL) - deleteMembers_sp_basic256sha256(securityPolicy); - return retval; -} + /* Non blocking connect to be able to timeout */ + if (UA_socket_set_nonblocking(clientsockfd) != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, + "Could not set the client socket to nonblocking"); + ClientNetworkLayerTCP_close(&connection); + UA_freeaddrinfo(server); + return connection; + } -UA_StatusCode -UA_SecurityPolicy_Basic256Sha256(UA_SecurityPolicy *policy, UA_CertificateVerification *certificateVerification, - const UA_ByteString localCertificate, const UA_ByteString localPrivateKey, - UA_Logger logger) { - memset(policy, 0, sizeof(UA_SecurityPolicy)); - policy->logger = logger; + /* Non blocking connect */ + error = UA_connect(clientsockfd, server->ai_addr, (socklen_t)server->ai_addrlen); - policy->policyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256"); + if ((error == -1) && (UA_ERRNO != UA_ERR_CONNECTION_PROGRESS)) { + ClientNetworkLayerTCP_close(&connection); + UA_LOG_SOCKET_ERRNO_WRAP( + UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, + "Connection to %.*s failed with error: %s", + (int)endpointUrl.length, endpointUrl.data, errno_str)); + UA_freeaddrinfo(server); + return connection; + } - UA_SecurityPolicyAsymmetricModule *const asymmetricModule = &policy->asymmetricModule; - UA_SecurityPolicySymmetricModule *const symmetricModule = &policy->symmetricModule; - UA_SecurityPolicyChannelModule *const channelModule = &policy->channelModule; + /* Use select to wait and check if connected */ + if (error == -1 && (UA_ERRNO == UA_ERR_CONNECTION_PROGRESS)) { + /* connection in progress. Wait until connected using select */ + UA_DateTime timeSinceStart = UA_DateTime_nowMonotonic() - connStart; + if(timeSinceStart > dtTimeout) + break; - /* Copy the certificate and add a NULL to the end */ - UA_StatusCode retval = - UA_ByteString_allocBuffer(&policy->localCertificate, localCertificate.length + 1); - if(retval != UA_STATUSCODE_GOOD) - return retval; - memcpy(policy->localCertificate.data, localCertificate.data, localCertificate.length); - policy->localCertificate.data[localCertificate.length] = '\0'; - policy->localCertificate.length--; - policy->certificateVerification = certificateVerification; +#ifdef _OS9000 + /* OS-9 can't use select for checking write sockets. + * Therefore, we need to use connect until success or failed + */ + UA_DateTime timeout_usec = (dtTimeout - timeSinceStart) / UA_DATETIME_USEC; + int resultsize = 0; + do { + u_int32 time = 0x80000001; + signal_code sig; - /* AsymmetricModule */ - UA_SecurityPolicySignatureAlgorithm *asym_signatureAlgorithm = - &asymmetricModule->cryptoModule.signatureAlgorithm; - asym_signatureAlgorithm->uri = - UA_STRING("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\0"); - asym_signatureAlgorithm->verify = - (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, - const UA_ByteString *, const UA_ByteString *))asym_verify_sp_basic256sha256; - asym_signatureAlgorithm->sign = - (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, - const UA_ByteString *, UA_ByteString *))asym_sign_sp_basic256sha256; - asym_signatureAlgorithm->getLocalSignatureSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getLocalSignatureSize_sp_basic256sha256; - asym_signatureAlgorithm->getRemoteSignatureSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteSignatureSize_sp_basic256sha256; - asym_signatureAlgorithm->getLocalKeyLength = NULL; // TODO: Write function - asym_signatureAlgorithm->getRemoteKeyLength = NULL; // TODO: Write function + timeout_usec -= 1000000/256; // Sleep 1/256 second + if (timeout_usec < 0) + break; - UA_SecurityPolicyEncryptionAlgorithm *asym_encryptionAlgorithm = - &asymmetricModule->cryptoModule.encryptionAlgorithm; - asym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#rsa-oaep\0"); - asym_encryptionAlgorithm->encrypt = - (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))asym_encrypt_sp_basic256sha256; - asym_encryptionAlgorithm->decrypt = - (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *)) - asym_decrypt_sp_basic256sha256; - asym_encryptionAlgorithm->getLocalKeyLength = NULL; // TODO: Write function - asym_encryptionAlgorithm->getRemoteKeyLength = - (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemoteEncryptionKeyLength_sp_basic256sha256; - asym_encryptionAlgorithm->getLocalBlockSize = NULL; // TODO: Write function - asym_encryptionAlgorithm->getRemoteBlockSize = (size_t (*)(const UA_SecurityPolicy *, - const void *))asym_getRemoteBlockSize_sp_basic256sha256; - asym_encryptionAlgorithm->getLocalPlainTextBlockSize = NULL; // TODO: Write function - asym_encryptionAlgorithm->getRemotePlainTextBlockSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))asym_getRemotePlainTextBlockSize_sp_basic256sha256; + _os_sleep(&time,&sig); + error = connect(clientsockfd, server->ai_addr, server->ai_addrlen); + if ((error == -1 && UA_ERRNO == EISCONN) || (error == 0)) + resultsize = 1; + if (error == -1 && UA_ERRNO != EALREADY && UA_ERRNO != EINPROGRESS) + break; + } + while(resultsize == 0); +#else + fd_set fdset; + FD_ZERO(&fdset); + UA_fd_set(clientsockfd, &fdset); + UA_DateTime timeout_usec = (dtTimeout - timeSinceStart) / UA_DATETIME_USEC; + struct timeval tmptv = {(long int) (timeout_usec / 1000000), + (int) (timeout_usec % 1000000)}; - asymmetricModule->makeCertificateThumbprint = asym_makeThumbprint_sp_basic256sha256; - asymmetricModule->compareCertificateThumbprint = - asymmetricModule_compareCertificateThumbprint_sp_basic256sha256; + int resultsize = UA_select((UA_Int32)(clientsockfd + 1), NULL, &fdset, NULL, &tmptv); +#endif - /* SymmetricModule */ - symmetricModule->generateKey = sym_generateKey_sp_basic256sha256; - symmetricModule->generateNonce = sym_generateNonce_sp_basic256sha256; + if(resultsize == 1) { +#ifdef _WIN32 + /* Windows does not have any getsockopt equivalent and it is not + * needed there */ + connected = true; + break; +#else + OPTVAL_TYPE so_error; + socklen_t len = sizeof so_error; - UA_SecurityPolicySignatureAlgorithm *sym_signatureAlgorithm = - &symmetricModule->cryptoModule.signatureAlgorithm; - sym_signatureAlgorithm->uri = - UA_STRING("http://www.w3.org/2000/09/xmldsig#hmac-sha1\0"); - sym_signatureAlgorithm->verify = - (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, const UA_ByteString *, - const UA_ByteString *))sym_verify_sp_basic256sha256; - sym_signatureAlgorithm->sign = - (UA_StatusCode (*)(const UA_SecurityPolicy *, void *, - const UA_ByteString *, UA_ByteString *))sym_sign_sp_basic256sha256; - sym_signatureAlgorithm->getLocalSignatureSize = sym_getSignatureSize_sp_basic256sha256; - sym_signatureAlgorithm->getRemoteSignatureSize = sym_getSignatureSize_sp_basic256sha256; - sym_signatureAlgorithm->getLocalKeyLength = - (size_t (*)(const UA_SecurityPolicy *, - const void *))sym_getSigningKeyLength_sp_basic256sha256; - sym_signatureAlgorithm->getRemoteKeyLength = - (size_t (*)(const UA_SecurityPolicy *, - const void *))sym_getSigningKeyLength_sp_basic256sha256; + int ret = UA_getsockopt(clientsockfd, SOL_SOCKET, SO_ERROR, &so_error, &len); - UA_SecurityPolicyEncryptionAlgorithm *sym_encryptionAlgorithm = - &symmetricModule->cryptoModule.encryptionAlgorithm; - sym_encryptionAlgorithm->uri = UA_STRING("http://www.w3.org/2001/04/xmlenc#aes128-cbc"); - sym_encryptionAlgorithm->encrypt = - (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_encrypt_sp_basic256sha256; - sym_encryptionAlgorithm->decrypt = - (UA_StatusCode(*)(const UA_SecurityPolicy *, void *, UA_ByteString *))sym_decrypt_sp_basic256sha256; - sym_encryptionAlgorithm->getLocalKeyLength = sym_getEncryptionKeyLength_sp_basic256sha256; - sym_encryptionAlgorithm->getRemoteKeyLength = sym_getEncryptionKeyLength_sp_basic256sha256; - sym_encryptionAlgorithm->getLocalBlockSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic256sha256; - sym_encryptionAlgorithm->getRemoteBlockSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getEncryptionBlockSize_sp_basic256sha256; - sym_encryptionAlgorithm->getLocalPlainTextBlockSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic256sha256; - sym_encryptionAlgorithm->getRemotePlainTextBlockSize = - (size_t (*)(const UA_SecurityPolicy *, const void *))sym_getPlainTextBlockSize_sp_basic256sha256; - symmetricModule->secureChannelNonceLength = 32; + if (ret != 0 || so_error != 0) { + /* on connection refused we should still try to connect */ + /* connection refused happens on localhost or local ip without timeout */ + if (so_error != ECONNREFUSED) { + ClientNetworkLayerTCP_close(&connection); + UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, + "Connection to %.*s failed with error: %s", + (int)endpointUrl.length, endpointUrl.data, + strerror(ret == 0 ? so_error : UA_ERRNO)); + UA_freeaddrinfo(server); + return connection; + } + /* wait until we try a again. Do not make this too small, otherwise the + * timeout is somehow wrong */ + UA_sleep_ms(100); + } else { + connected = true; + break; + } +#endif + } + } else { + connected = true; + break; + } + ClientNetworkLayerTCP_close(&connection); - // Use the same signature algorithm as the asymmetric component for certificate signing (see standard) - policy->certificateSigningAlgorithm = policy->asymmetricModule.cryptoModule.signatureAlgorithm; + } while ((UA_DateTime_nowMonotonic() - connStart) < dtTimeout); - /* ChannelModule */ - channelModule->newContext = channelContext_newContext_sp_basic256sha256; - channelModule->deleteContext = (void (*)(void *)) - channelContext_deleteContext_sp_basic256sha256; + UA_freeaddrinfo(server); - channelModule->setLocalSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) - channelContext_setLocalSymEncryptingKey_sp_basic256sha256; - channelModule->setLocalSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) - channelContext_setLocalSymSigningKey_sp_basic256sha256; - channelModule->setLocalSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *)) - channelContext_setLocalSymIv_sp_basic256sha256; + if(!connected) { + /* connection timeout */ + if (connection.state != UA_CONNECTION_CLOSED) + ClientNetworkLayerTCP_close(&connection); + UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, + "Trying to connect to %.*s timed out", + (int)endpointUrl.length, endpointUrl.data); + return connection; + } - channelModule->setRemoteSymEncryptingKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) - channelContext_setRemoteSymEncryptingKey_sp_basic256sha256; - channelModule->setRemoteSymSigningKey = (UA_StatusCode (*)(void *, const UA_ByteString *)) - channelContext_setRemoteSymSigningKey_sp_basic256sha256; - channelModule->setRemoteSymIv = (UA_StatusCode (*)(void *, const UA_ByteString *)) - channelContext_setRemoteSymIv_sp_basic256sha256; - channelModule->compareCertificate = (UA_StatusCode (*)(const void *, const UA_ByteString *)) - channelContext_compareCertificate_sp_basic256sha256; + /* We are connected. Reset socket to blocking */ + if(UA_socket_set_blocking(clientsockfd) != UA_STATUSCODE_GOOD) { + UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, + "Could not set the client socket to blocking"); + ClientNetworkLayerTCP_close(&connection); + return connection; + } - policy->deleteMembers = deleteMembers_sp_basic256sha256; +#ifdef SO_NOSIGPIPE + int val = 1; + int sso_result = UA_setsockopt(connection.sockfd, SOL_SOCKET, + SO_NOSIGPIPE, (void*)&val, sizeof(val)); + if(sso_result < 0) + UA_LOG_WARNING(logger, UA_LOGCATEGORY_NETWORK, + "Couldn't set SO_NOSIGPIPE"); +#endif - return policyContext_newContext_sp_basic256sha256(policy, localPrivateKey); + return connection; } - -#endif /* UA_ENABLE_ENCRYPTION */ diff --git a/ext/opcua_client/open62541.h b/ext/opcua_client/open62541.h index c453c30..2b08910 100644 --- a/ext/opcua_client/open62541.h +++ b/ext/opcua_client/open62541.h @@ -1,6 +1,6 @@ /* THIS IS A SINGLE-FILE DISTRIBUTION CONCATENATED FROM THE OPEN62541 SOURCES * visit http://open62541.org/ for information about this software - * Git-Revision: v0.3.0 + * Git-Revision: v1.0.6-dirty */ /* @@ -18,320 +18,571 @@ #ifndef OPEN62541_H_ #define OPEN62541_H_ -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/build/src_generated/ua_config.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/config.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifdef __cplusplus -extern "C" { -#endif - /** * open62541 Version * ----------------- */ -#define UA_OPEN62541_VER_MAJOR 0 -#define UA_OPEN62541_VER_MINOR 3 -#define UA_OPEN62541_VER_PATCH 0 -#define UA_OPEN62541_VER_LABEL "" /* Release candidate label, etc. */ -#define UA_OPEN62541_VER_COMMIT "v0.3.0" +#define UA_OPEN62541_VER_MAJOR 1 +#define UA_OPEN62541_VER_MINOR 0 +#define UA_OPEN62541_VER_PATCH 6 +#define UA_OPEN62541_VER_LABEL "-dirty" /* Release candidate label, etc. */ +#define UA_OPEN62541_VER_COMMIT "v1.0.6-dirty" /** * Feature Options * --------------- * Changing the feature options has no effect on a pre-compiled library. */ + #define UA_LOGLEVEL 300 +#ifndef UA_ENABLE_AMALGAMATION +#define UA_ENABLE_AMALGAMATION +#endif #define UA_ENABLE_METHODCALLS #define UA_ENABLE_NODEMANAGEMENT #define UA_ENABLE_SUBSCRIPTIONS +#define UA_ENABLE_PUBSUB +/* #undef UA_ENABLE_PUBSUB_ETH_UADP */ +/* #undef UA_ENABLE_PUBSUB_DELTAFRAMES */ +/* #undef UA_ENABLE_PUBSUB_INFORMATIONMODEL */ +/* #undef UA_ENABLE_PUBSUB_INFORMATIONMODEL_METHODS */ +#define UA_ENABLE_DA +#define UA_ENABLE_ENCRYPTION +/* #undef UA_ENABLE_HISTORIZING */ +/* #undef UA_ENABLE_MICRO_EMB_DEV_PROFILE */ +/* #undef UA_ENABLE_EXPERIMENTAL_HISTORIZING */ +/* #undef UA_ENABLE_SUBSCRIPTIONS_EVENTS */ +/* #undef UA_ENABLE_JSON_ENCODING */ + +/* Multithreading */ /* #undef UA_ENABLE_MULTITHREADING */ -/* #undef UA_ENABLE_ENCRYPTION */ +/* #undef UA_ENABLE_IMMUTABLE_NODES */ +#if defined(UA_ENABLE_MULTITHREADING) && !defined(UA_ENABLE_IMMUTABLE_NODES) +#error "The multithreading feature requires nodes to be immutable" +#endif /* Advanced Options */ +/* #undef UA_ENABLE_CUSTOM_NODESTORE */ #define UA_ENABLE_STATUSCODE_DESCRIPTIONS #define UA_ENABLE_TYPENAMES +#define UA_ENABLE_NODESET_COMPILER_DESCRIPTIONS /* #undef UA_ENABLE_DETERMINISTIC_RNG */ -/* #undef UA_ENABLE_NONSTANDARD_UDP */ #define UA_ENABLE_DISCOVERY /* #undef UA_ENABLE_DISCOVERY_MULTICAST */ +/* #undef UA_ENABLE_QUERY */ +/* #undef UA_ENABLE_MALLOC_SINGLETON */ #define UA_ENABLE_DISCOVERY_SEMAPHORE /* #undef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS */ /* #undef UA_ENABLE_VALGRIND_INTERACTIVE */ #define UA_VALGRIND_INTERACTIVE_INTERVAL 1000 +#define UA_GENERATED_NAMESPACE_ZERO +/* #undef UA_ENABLE_PUBSUB_CUSTOM_PUBLISH_HANDLING */ + +/* #undef UA_PACK_DEBIAN */ /* Options for Debugging */ -/* #undef UA_DEBUG */ +#define UA_DEBUG /* #undef UA_DEBUG_DUMP_PKGS */ /** - * C99 Definitions - * --------------- */ -#include -#include + * Function Export + * --------------- + * On Win32: Define ``UA_DYNAMIC_LINKING`` and ``UA_DYNAMIC_LINKING_EXPORT`` in + * order to export symbols for a DLL. Define ``UA_DYNAMIC_LINKING`` only to + * import symbols from a DLL.*/ +/* #undef UA_DYNAMIC_LINKING */ -/* Include stdint.h and stdbool.h or workaround for older Visual Studios */ -#if !defined(_MSC_VER) || _MSC_VER >= 1600 -# include -# include /* C99 Boolean */ -# if defined(_WRS_KERNEL) -# define UINT32_C(x) ((x) + (UINT32_MAX - UINT32_MAX)) +/* Shortcuts for extern "C" declarations */ +#if !defined(_UA_BEGIN_DECLS) +# ifdef __cplusplus +# define _UA_BEGIN_DECLS extern "C" { +# else +# define _UA_BEGIN_DECLS # endif -#else -# if !defined(__bool_true_false_are_defined) -# define bool short -# define true 1 -# define false 0 -# define __bool_true_false_are_defined +#endif +#if !defined(_UA_END_DECLS) +# ifdef __cplusplus +# define _UA_END_DECLS } +# else +# define _UA_END_DECLS # endif #endif -/** - * Assertions - * ---------- - * The assert macro is disabled by defining NDEBUG. It is often forgotten to - * include -DNDEBUG in the compiler flags when using the single-file release. So - * we make assertions dependent on the UA_DEBUG definition handled by CMake. */ -#ifdef UA_DEBUG -# include -# define UA_assert(ignore) assert(ignore) -#else -# define UA_assert(ignore) +/* Select default architecture if non is selected through CMake or compiler define */ +#if 1 && !defined(UA_ARCHITECTURE_ECOS) && !defined(UA_ARCHITECTURE_FREERTOSLWIP) && !defined(UA_ARCHITECTURE_POSIX) && !defined(UA_ARCHITECTURE_VXWORKS) && !defined(UA_ARCHITECTURE_WEC7) && !defined(UA_ARCHITECTURE_WIN32) +# ifdef _WIN32 +# define UA_ARCHITECTURE_WIN32 +# else +# define UA_ARCHITECTURE_POSIX +# endif #endif -/* Outputs an error message at compile time if the assert fails. - * Example usage: - * UA_STATIC_ASSERT(sizeof(long)==7, use_another_compiler_luke) - * See: https://stackoverflow.com/a/4815532/869402 */ -#if defined(__cplusplus) && __cplusplus >= 201103L /* C++11 or above */ -# define UA_STATIC_ASSERT(cond,msg) static_assert(cond, #msg) -#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L /* C11 or above */ -# define UA_STATIC_ASSERT(cond,msg) _Static_assert(cond, #msg) -#elif defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER) /* GCC, Clang, MSC */ -# define UA_CTASTR2(pre,post) pre ## post -# define UA_CTASTR(pre,post) UA_CTASTR2(pre,post) -# ifndef __COUNTER__ /* PPC GCC fix */ -# define __COUNTER__ __LINE__ -# endif -# define UA_STATIC_ASSERT(cond,msg) \ - typedef struct { \ - int UA_CTASTR(static_assertion_failed_,msg) : !!(cond); \ - } UA_CTASTR(static_assertion_failed_,__COUNTER__) -#else /* Everybody else */ -# define UA_STATIC_ASSERT(cond,msg) typedef char static_assertion_##msg[(cond)?1:-1] + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/architecture_base.h" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2018 (c) Stefan Profanter, fortiss GmbH + */ + +#ifndef ARCH_UA_ARCHITECTURE_BASE_H +#define ARCH_UA_ARCHITECTURE_BASE_H + +/* + * With the following list of defines, one can define its own UA_sleep_ms using a preprocessor define. + * E.g. see unit tests. + */ + +#ifdef UA_sleep_ms +void UA_sleep_ms(unsigned long ms); #endif -/** - * Memory Management - * ----------------- - * The default is to use the malloc implementation from ``stdlib.h``. Override - * if required. Changing the settings has no effect on a pre-compiled - * library. */ -#include -#if defined(_WIN32) && !defined(__clang__) -# include +#ifdef UA_malloc +void* UA_malloc(unsigned long size); #endif -#if !defined(UA_FREERTOS) +#ifdef UA_calloc +void* UA_calloc(unsigned long num, unsigned long size); //allocate memory in the heap with size*num bytes and set the memory to zero +#endif -# define UA_free(ptr) free(ptr) -# define UA_malloc(size) malloc(size) -# define UA_calloc(num, size) calloc(num, size) -# define UA_realloc(ptr, size) realloc(ptr, size) +#ifdef UA_realloc +void* UA_realloc(void *ptr, unsigned long new_size);//re-allocate memory in the heap with new_size bytes from previously allocated memory ptr +#endif -#else +#ifdef UA_free +void UA_free(void* ptr); //de-allocate memory previously allocated with UA_malloc, UA_calloc or UA_realloc +#endif + +#endif //ARCH_UA_ARCHITECTURE_BASE_H + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/arch/win32/ua_architecture.h" ***********************************/ + +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + */ + +#ifdef UA_ARCHITECTURE_WIN32 -# include +#ifndef PLUGINS_ARCH_WIN32_UA_ARCHITECTURE_H_ +#define PLUGINS_ARCH_WIN32_UA_ARCHITECTURE_H_ -# define UA_free(ptr) vPortFree(ptr) -# define UA_malloc(size) pvPortMalloc(size) -# define UA_calloc(num, size) pvPortCalloc(num, size) -# define UA_realloc(ptr, size) pvPortRealloc(ptr, size) +#ifndef _BSD_SOURCE +# define _BSD_SOURCE #endif -/* Stack-allocation of memory. Use C99 variable-length arrays if possible. - * Otherwise revert to alloca. Note that alloca is not supported on some - * plattforms. */ -#if defined(__GNUC__) || defined(__clang__) -# define UA_STACKARRAY(TYPE, NAME, SIZE) TYPE NAME[SIZE] -#elif defined(_WIN32) -# define UA_STACKARRAY(TYPE, NAME, SIZE) \ - TYPE *NAME = (TYPE*)_alloca(sizeof(TYPE) * SIZE) -#else -# include -# define UA_STACKARRAY(TYPE, NAME, SIZE) \ - TYPE *NAME = (TYPE*)alloca(sizeof(TYPE) * SIZE) +/* Disable some security warnings on MSVC */ +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +# define _CRT_SECURE_NO_WARNINGS #endif -/** - * Function Export - * --------------- - * On Win32: Define ``UA_DYNAMIC_LINKING`` and ``UA_DYNAMIC_LINKING_EXPORT`` in - * order to export symbols for a DLL. Define ``UA_DYNAMIC_LINKING`` only to - * import symbols from a DLL.*/ -/* #undef UA_DYNAMIC_LINKING */ +/* Assume that Windows versions are newer than Windows XP */ +#if defined(__MINGW32__) && (!defined(WINVER) || WINVER < 0x501) +# undef WINVER +# undef _WIN32_WINDOWS +# undef _WIN32_WINNT +# define WINVER 0x0600 +# define _WIN32_WINDOWS 0x0600 +# define _WIN32_WINNT 0x0600 //windows vista version, which included InepPton +#endif -#if defined(_WIN32) && defined(UA_DYNAMIC_LINKING) -# ifdef UA_DYNAMIC_LINKING_EXPORT /* export dll */ -# ifdef __GNUC__ -# define UA_EXPORT __attribute__ ((dllexport)) -# else -# define UA_EXPORT __declspec(dllexport) -# endif -# else /* import dll */ -# ifdef __GNUC__ -# define UA_EXPORT __attribute__ ((dllimport)) -# else -# define UA_EXPORT __declspec(dllimport) -# endif -# endif -#else /* non win32 */ -# if __GNUC__ || __clang__ -# define UA_EXPORT __attribute__ ((visibility ("default"))) +#include +#if defined(_WIN32) && !defined(__clang__) +# include +#endif + +#include +#include +#include +#include +#include + +#if defined (_MSC_VER) || defined(__clang__) +# ifndef UNDER_CE +# include //access +# define UA_access _access # endif +#else +# include //access and tests +# define UA_access access #endif -#ifndef UA_EXPORT -# define UA_EXPORT /* fallback to default */ + +#define ssize_t int +#define OPTVAL_TYPE char +#ifndef UA_sleep_ms +# define UA_sleep_ms(X) Sleep(X) #endif -/** - * Inline Functions - * ---------------- */ -#ifdef _MSC_VER -# define UA_INLINE __inline +// Windows does not support ansi colors +// #define UA_ENABLE_LOG_COLORS + +#define UA_IPV6 1 + +#if defined(__MINGW32__) && !defined(__clang__) //mingw defines SOCKET as long long unsigned int, giving errors in logging and when comparing with UA_Int32 +# define UA_SOCKET int +# define UA_INVALID_SOCKET -1 #else -# define UA_INLINE inline +# define UA_SOCKET SOCKET +# define UA_INVALID_SOCKET INVALID_SOCKET +#endif +#define UA_ERRNO WSAGetLastError() +#define UA_INTERRUPTED WSAEINTR +#define UA_AGAIN WSAEWOULDBLOCK +#define UA_EAGAIN EAGAIN +#define UA_WOULDBLOCK WSAEWOULDBLOCK +#define UA_ERR_CONNECTION_PROGRESS WSAEWOULDBLOCK + +#define UA_fd_set(fd, fds) FD_SET((UA_SOCKET)fd, fds) +#define UA_fd_isset(fd, fds) FD_ISSET((UA_SOCKET)fd, fds) + +#ifdef UNDER_CE +# define errno #endif -/** - * Non-aliasing pointers - * -------------------- */ -#ifdef _MSC_VER -# define UA_RESTRICT __restrict -#elif defined(__GNUC__) -# define UA_RESTRICT __restrict__ -#else -# define UA_RESTRICT restrict +#define UA_getnameinfo getnameinfo +#define UA_send(sockfd, buf, len, flags) send(sockfd, buf, (int)(len), flags) +#define UA_recv(sockfd, buf, len, flags) recv(sockfd, buf, (int)(len), flags) +#define UA_sendto(sockfd, buf, len, flags, dest_addr, addrlen) sendto(sockfd, (const char*)(buf), (int)(len), flags, dest_addr, (int) (addrlen)) +#define UA_recvfrom(sockfd, buf, len, flags, src_addr, addrlen) recvfrom(sockfd, (char*)(buf), (int)(len), flags, src_addr, addrlen) +#define UA_htonl htonl +#define UA_ntohl ntohl +#define UA_close closesocket +#define UA_select(nfds, readfds, writefds, exceptfds, timeout) select((int)(nfds), readfds, writefds, exceptfds, timeout) +#define UA_shutdown shutdown +#define UA_socket socket +#define UA_bind bind +#define UA_listen listen +#define UA_accept accept +#define UA_connect(sockfd, addr, addrlen) connect(sockfd, addr, (int)(addrlen)) +#define UA_getaddrinfo getaddrinfo +#define UA_getsockopt getsockopt +#define UA_setsockopt(sockfd, level, optname, optval, optlen) setsockopt(sockfd, level, optname, (const char*) (optval), optlen) +#define UA_freeaddrinfo freeaddrinfo +#define UA_gethostname gethostname +#define UA_getsockname getsockname +#define UA_inet_pton InetPton + +#if UA_IPV6 +# include +# define UA_if_nametoindex if_nametoindex #endif -/** - * Function attributes - * ------------------- */ -#if defined(__GNUC__) || defined(__clang__) -# define UA_FUNC_ATTR_MALLOC __attribute__((malloc)) -# define UA_FUNC_ATTR_PURE __attribute__ ((pure)) -# define UA_FUNC_ATTR_CONST __attribute__((const)) -# define UA_FUNC_ATTR_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -# define UA_FORMAT(X,Y) __attribute__ ((format (printf, X, Y))) -#else -# define UA_FUNC_ATTR_MALLOC -# define UA_FUNC_ATTR_PURE -# define UA_FUNC_ATTR_CONST -# define UA_FUNC_ATTR_WARN_UNUSED_RESULT -# define UA_FORMAT(X,Y) +#ifdef maxStringLength //defined in mingw64 +# undef maxStringLength #endif -#if defined(__GNUC__) || defined(__clang__) -# define UA_DEPRECATED __attribute__((deprecated)) -#elif defined(_MSC_VER) -# define UA_DEPRECATED __declspec(deprecated) -#else -# define UA_DEPRECATED +#ifndef UA_free +#define UA_free free +#endif +#ifndef UA_malloc +#define UA_malloc malloc +#endif +#ifndef UA_calloc +#define UA_calloc calloc +#endif +#ifndef UA_realloc +#define UA_realloc realloc #endif -/** - * Detect Binary Overlaying for Encoding - * ------------------------------------- - * Integers and floating point numbers are transmitted in little-endian (IEEE 754 - * for floating point) encoding. If the target architecture uses the same - * format, numeral datatypes can be memcpy'd (overlayed) on the binary stream. - * This speeds up encoding. +/* 3rd Argument is the string */ +#define UA_snprintf(source, size, ...) _snprintf_s(source, size, _TRUNCATE, __VA_ARGS__) + +#define UA_LOG_SOCKET_ERRNO_WRAP(LOG) { \ + char *errno_str = NULL; \ + FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, \ + NULL, WSAGetLastError(), \ + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \ + (LPSTR)&errno_str, 0, NULL); \ + LOG; \ + LocalFree(errno_str); \ +} +#define UA_LOG_SOCKET_ERRNO_GAI_WRAP UA_LOG_SOCKET_ERRNO_WRAP + + +/* Fix redefinition of SLIST_ENTRY on mingw winnt.h */ +#if !defined(_SYS_QUEUE_H_) && defined(SLIST_ENTRY) +# undef SLIST_ENTRY +#endif + +#endif /* PLUGINS_ARCH_WIN32_UA_ARCHITECTURE_H_ */ + +#endif /* UA_ARCHITECTURE_WIN32 */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/arch/posix/ua_architecture.h" ***********************************/ + +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. * - * Integer Endianness - * ^^^^^^^^^^^^^^^^^^ - * The definition ``UA_BINARY_OVERLAYABLE_INTEGER`` is true when the integer - * representation of the target architecture is little-endian. */ -#if defined(_WIN32) -# define UA_BINARY_OVERLAYABLE_INTEGER 1 -#elif (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ - (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) -# define UA_BINARY_OVERLAYABLE_INTEGER 1 -#elif defined(__linux__) /* Linux (including Android) */ -# include -# if __BYTE_ORDER == __LITTLE_ENDIAN -# define UA_BINARY_OVERLAYABLE_INTEGER 1 -# endif -#elif defined(__OpenBSD__) /* OpenBSD */ -# include -# if BYTE_ORDER == LITTLE_ENDIAN -# define UA_BINARY_OVERLAYABLE_INTEGER 1 -# endif -#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) /* Other BSD */ -# include -# if _BYTE_ORDER == _LITTLE_ENDIAN -# define UA_BINARY_OVERLAYABLE_INTEGER 1 -# endif -#elif defined(__APPLE__) /* Apple (MacOS, iOS) */ -# include -# if defined(__LITTLE_ENDIAN__) -# define UA_BINARY_OVERLAYABLE_INTEGER 1 -# endif -#elif defined(__QNX__) || defined(__QNXNTO__) /* QNX */ -# include -# if defined(__LITTLEENDIAN__) -# define UA_BINARY_OVERLAYABLE_INTEGER 1 -# endif + * Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + */ + +#ifdef UA_ARCHITECTURE_POSIX + + + +/* Enable POSIX features */ +#if !defined(_XOPEN_SOURCE) +# define _XOPEN_SOURCE 600 +#endif +#ifndef _DEFAULT_SOURCE +# define _DEFAULT_SOURCE +#endif +/* On older systems we need to define _BSD_SOURCE. + * _DEFAULT_SOURCE is an alias for that. */ +#ifndef _BSD_SOURCE +# define _BSD_SOURCE #endif -#ifndef UA_BINARY_OVERLAYABLE_INTEGER -# define UA_BINARY_OVERLAYABLE_INTEGER 0 +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef UA_sleep_ms +# include +# define UA_sleep_ms(X) usleep(X * 1000) #endif -/** - * Float Endianness - * ^^^^^^^^^^^^^^^^ - * The definition ``UA_BINARY_OVERLAYABLE_FLOAT`` is true when the floating - * point number representation of the target architecture is IEEE 754. Note that - * this cannot be reliable detected with macros for the clang compiler - * (beginning of 2017). ``UA_BINARY_OVERLAYABLE_FLOAT`` can be manually set if - * the target is known to be little endian with floats in the IEEE 754 - * format. */ +#define OPTVAL_TYPE int -#if defined(_WIN32) -# define UA_BINARY_OVERLAYABLE_FLOAT 1 -#elif defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ - (__FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__) /* Defined only in GCC */ -# define UA_BINARY_OVERLAYABLE_FLOAT 1 -#elif defined(__FLOAT_WORD_ORDER) && defined(__LITTLE_ENDIAN) && \ - (__FLOAT_WORD_ORDER == __LITTLE_ENDIAN) /* Defined only in GCC */ -# define UA_BINARY_OVERLAYABLE_FLOAT 1 -#elif defined(__linux__) /* Linux (including Android) */ -# include -# if defined(__ANDROID__) -# if __BYTE_ORDER == __LITTLE_ENDIAN -# define UA_BINARY_OVERLAYABLE_INTEGER 1 -# endif -# elif __FLOAT_WORD_ORDER == __LITTLE_ENDIAN -# define UA_BINARY_OVERLAYABLE_FLOAT 1 +#include +#include // read, write, close + +#ifdef __QNX__ +# include +#endif +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) +# include +# if defined(BSD) +# include # endif -#elif defined(_WRS_KERNEL) -# define UA_BINARY_OVERLAYABLE_FLOAT 1 +#endif +#if !defined(__CYGWIN__) +# include #endif -#ifndef UA_BINARY_OVERLAYABLE_FLOAT -# define UA_BINARY_OVERLAYABLE_FLOAT 0 +/* unsigned int for windows and workaround to a glibc bug */ +/* Additionally if GNU_LIBRARY is not defined, it may be using + * musl libc (e.g. Docker Alpine) */ +#if defined(__OpenBSD__) || \ + (defined(__GNU_LIBRARY__) && (__GNU_LIBRARY__ <= 6) && \ + (__GLIBC__ <= 2) && (__GLIBC_MINOR__ < 16) || \ + !defined(__GNU_LIBRARY__)) +# define UA_fd_set(fd, fds) FD_SET((unsigned int)fd, fds) +# define UA_fd_isset(fd, fds) FD_ISSET((unsigned int)fd, fds) +#else +# define UA_fd_set(fd, fds) FD_SET(fd, fds) +# define UA_fd_isset(fd, fds) FD_ISSET(fd, fds) #endif -#ifdef __cplusplus -} // extern "C" +#define UA_access access + +#define UA_IPV6 1 +#define UA_SOCKET int +#define UA_INVALID_SOCKET -1 +#define UA_ERRNO errno +#define UA_INTERRUPTED EINTR +#define UA_AGAIN EAGAIN +#define UA_EAGAIN EAGAIN +#define UA_WOULDBLOCK EWOULDBLOCK +#define UA_ERR_CONNECTION_PROGRESS EINPROGRESS + +#define UA_ENABLE_LOG_COLORS + +#define UA_getnameinfo getnameinfo +#define UA_send send +#define UA_recv recv +#define UA_sendto sendto +#define UA_recvfrom recvfrom +#define UA_htonl htonl +#define UA_ntohl ntohl +#define UA_close close +#define UA_select select +#define UA_shutdown shutdown +#define UA_socket socket +#define UA_bind bind +#define UA_listen listen +#define UA_accept accept +#define UA_connect connect +#define UA_getaddrinfo getaddrinfo +#define UA_getsockopt getsockopt +#define UA_setsockopt setsockopt +#define UA_freeaddrinfo freeaddrinfo +#define UA_gethostname gethostname +#define UA_getsockname getsockname +#define UA_inet_pton inet_pton +#if UA_IPV6 +# define UA_if_nametoindex if_nametoindex #endif +#ifdef UA_ENABLE_MALLOC_SINGLETON +extern void * (*UA_globalMalloc)(size_t size); +extern void (*UA_globalFree)(void *ptr); +extern void * (*UA_globalCalloc)(size_t nelem, size_t elsize); +extern void * (*UA_globalRealloc)(void *ptr, size_t size); +# define UA_free(ptr) UA_globalFree(ptr) +# define UA_malloc(size) UA_globalMalloc(size) +# define UA_calloc(num, size) UA_globalCalloc(num, size) +# define UA_realloc(ptr, size) UA_globalRealloc(ptr, size) +#endif -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/deps/ms_stdint.h" ***********************************/ +#include +#ifndef UA_free +# define UA_free free +#endif +#ifndef UA_malloc +# define UA_malloc malloc +#endif +#ifndef UA_calloc +# define UA_calloc calloc +#endif +#ifndef UA_realloc +# define UA_realloc realloc +#endif -// ISO C9x compliant stdint.h for Microsoft Visual Studio +#include +#define UA_snprintf snprintf + +#define UA_LOG_SOCKET_ERRNO_WRAP(LOG) { \ + char *errno_str = strerror(errno); \ + LOG; \ +} +#define UA_LOG_SOCKET_ERRNO_GAI_WRAP(LOG) { \ + const char *errno_str = gai_strerror(errno); \ + LOG; \ +} + + +#if defined(__APPLE__) && defined(_SYS_QUEUE_H_) +// in some compilers there's already a _SYS_QUEUE_H_ which is included first and doesn't have all functions + +#undef SLIST_HEAD +#undef SLIST_HEAD_INITIALIZER +#undef SLIST_ENTRY +#undef SLIST_FIRST +#undef SLIST_END +#undef SLIST_EMPTY +#undef SLIST_NEXT +#undef SLIST_FOREACH +#undef SLIST_FOREACH_SAFE +#undef SLIST_INIT +#undef SLIST_INSERT_AFTER +#undef SLIST_INSERT_HEAD +#undef SLIST_REMOVE_AFTER +#undef SLIST_REMOVE_HEAD +#undef SLIST_REMOVE +#undef LIST_HEAD +#undef LIST_HEAD_INITIALIZER +#undef LIST_ENTRY +#undef LIST_FIRST +#undef LIST_END +#undef LIST_EMPTY +#undef LIST_NEXT +#undef LIST_FOREACH +#undef LIST_FOREACH_SAFE +#undef LIST_INIT +#undef LIST_INSERT_AFTER +#undef LIST_INSERT_BEFORE +#undef LIST_INSERT_HEAD +#undef LIST_REMOVE +#undef LIST_REPLACE +#undef SIMPLEQ_HEAD +#undef SIMPLEQ_HEAD_INITIALIZER +#undef SIMPLEQ_ENTRY +#undef SIMPLEQ_FIRST +#undef SIMPLEQ_END +#undef SIMPLEQ_EMPTY +#undef SIMPLEQ_NEXT +#undef SIMPLEQ_FOREACH +#undef SIMPLEQ_FOREACH_SAFE +#undef SIMPLEQ_INIT +#undef SIMPLEQ_INSERT_HEAD +#undef SIMPLEQ_INSERT_TAIL +#undef SIMPLEQ_INSERT_AFTER +#undef SIMPLEQ_REMOVE_HEAD +#undef SIMPLEQ_REMOVE_AFTER +#undef XSIMPLEQ_HEAD +#undef XSIMPLEQ_ENTRY +#undef XSIMPLEQ_XOR +#undef XSIMPLEQ_FIRST +#undef XSIMPLEQ_END +#undef XSIMPLEQ_EMPTY +#undef XSIMPLEQ_NEXT +#undef XSIMPLEQ_FOREACH +#undef XSIMPLEQ_FOREACH_SAFE +#undef XSIMPLEQ_INIT +#undef XSIMPLEQ_INSERT_HEAD +#undef XSIMPLEQ_INSERT_TAIL +#undef XSIMPLEQ_INSERT_AFTER +#undef XSIMPLEQ_REMOVE_HEAD +#undef XSIMPLEQ_REMOVE_AFTER +#undef TAILQ_HEAD +#undef TAILQ_HEAD_INITIALIZER +#undef TAILQ_ENTRY +#undef TAILQ_FIRST +#undef TAILQ_END +#undef TAILQ_NEXT +#undef TAILQ_LAST +#undef TAILQ_PREV +#undef TAILQ_EMPTY +#undef TAILQ_FOREACH +#undef TAILQ_FOREACH_SAFE +#undef TAILQ_FOREACH_REVERSE +#undef TAILQ_FOREACH_REVERSE_SAFE +#undef TAILQ_INIT +#undef TAILQ_INSERT_HEAD +#undef TAILQ_INSERT_TAIL +#undef TAILQ_INSERT_AFTER +#undef TAILQ_INSERT_BEFORE +#undef TAILQ_REMOVE +#undef TAILQ_REPLACE +#undef CIRCLEQ_HEAD +#undef CIRCLEQ_HEAD_INITIALIZER +#undef CIRCLEQ_ENTRY +#undef CIRCLEQ_FIRST +#undef CIRCLEQ_LAST +#undef CIRCLEQ_END +#undef CIRCLEQ_NEXT +#undef CIRCLEQ_PREV +#undef CIRCLEQ_EMPTY +#undef CIRCLEQ_FOREACH +#undef CIRCLEQ_FOREACH_SAFE +#undef CIRCLEQ_FOREACH_REVERSE +#undef CIRCLEQ_FOREACH_REVERSE_SAFE +#undef CIRCLEQ_INIT +#undef CIRCLEQ_INSERT_AFTER +#undef CIRCLEQ_INSERT_BEFORE +#undef CIRCLEQ_INSERT_HEAD +#undef CIRCLEQ_INSERT_TAIL +#undef CIRCLEQ_REMOVE +#undef CIRCLEQ_REPLACE + +#undef _SYS_QUEUE_H_ + +#endif /* defined(__APPLE__) && defined(_SYS_QUEUE_H_) */ + + + +#endif /* UA_ARCHITECTURE_POSIX */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/deps/ms_stdint.h" ***********************************/ + +// ISO C9x compliant stdint.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006-2013 Alexander Chemeris @@ -586,3166 +837,14919 @@ typedef uint64_t uintmax_t; #endif // !defined(_MSC_VER) || _MSC_VER >= 1600 ] -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_constants.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/architecture_definitions.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2016 (c) Sten Grüner - * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) Florian Palm + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2018 (c) Jose Cabral, fortiss GmbH */ -#ifdef __cplusplus -extern "C" { -#endif - /** - * Standard-Defined Constants - * ========================== - * This section contains numerical and string constants that are defined in the - * OPC UA standard. - * - * .. _attribute-id: - * - * Attribute Id - * ------------ - * Every node in an OPC UA information model contains attributes depending on - * the node type. Possible attributes are as follows: */ + * C99 Definitions + * --------------- */ +#include +#include -typedef enum { - UA_ATTRIBUTEID_NODEID = 1, - UA_ATTRIBUTEID_NODECLASS = 2, - UA_ATTRIBUTEID_BROWSENAME = 3, - UA_ATTRIBUTEID_DISPLAYNAME = 4, - UA_ATTRIBUTEID_DESCRIPTION = 5, - UA_ATTRIBUTEID_WRITEMASK = 6, - UA_ATTRIBUTEID_USERWRITEMASK = 7, - UA_ATTRIBUTEID_ISABSTRACT = 8, - UA_ATTRIBUTEID_SYMMETRIC = 9, - UA_ATTRIBUTEID_INVERSENAME = 10, - UA_ATTRIBUTEID_CONTAINSNOLOOPS = 11, - UA_ATTRIBUTEID_EVENTNOTIFIER = 12, - UA_ATTRIBUTEID_VALUE = 13, - UA_ATTRIBUTEID_DATATYPE = 14, - UA_ATTRIBUTEID_VALUERANK = 15, - UA_ATTRIBUTEID_ARRAYDIMENSIONS = 16, - UA_ATTRIBUTEID_ACCESSLEVEL = 17, - UA_ATTRIBUTEID_USERACCESSLEVEL = 18, - UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL = 19, - UA_ATTRIBUTEID_HISTORIZING = 20, - UA_ATTRIBUTEID_EXECUTABLE = 21, - UA_ATTRIBUTEID_USEREXECUTABLE = 22 -} UA_AttributeId; +/* Include stdint.h and stdbool.h or workaround for older Visual Studios */ +#ifdef UNDER_CE +#endif +#if !defined(_MSC_VER) || _MSC_VER >= 1800 +# include +# include /* C99 Boolean */ +#else +# if !defined(__bool_true_false_are_defined) +# define bool unsigned char +# define true 1 +# define false 0 +# define __bool_true_false_are_defined +# endif +#endif /** - * Access Level Masks - * ------------------ - * The access level to a node is given by the following constants that are ANDed - * with the overall access level. */ + * Assertions + * ---------- + * The assert macro is disabled by defining NDEBUG. It is often forgotten to + * include -DNDEBUG in the compiler flags when using the single-file release. So + * we make assertions dependent on the UA_DEBUG definition handled by CMake. */ +#ifdef UA_DEBUG +# include +# define UA_assert(ignore) assert(ignore) +#else +# define UA_assert(ignore) do {} while(0) +#endif -#define UA_ACCESSLEVELMASK_READ (0x01<<0) -#define UA_ACCESSLEVELMASK_WRITE (0x01<<1) -#define UA_ACCESSLEVELMASK_HISTORYREAD (0x01<<2) -#define UA_ACCESSLEVELMASK_HISTORYWRITE (0x01<<3) -#define UA_ACCESSLEVELMASK_SEMANTICCHANGE (0x01<<4) -#define UA_ACCESSLEVELMASK_STATUSWRITE (0x01<<5) -#define UA_ACCESSLEVELMASK_TIMESTAMPWRITE (0x01<<6) +/* Outputs an error message at compile time if the assert fails. + * Example usage: + * UA_STATIC_ASSERT(sizeof(long)==7, use_another_compiler_luke) + * See: https://stackoverflow.com/a/4815532/869402 */ +#if defined(__cplusplus) && __cplusplus >= 201103L /* C++11 or above */ +# define UA_STATIC_ASSERT(cond,msg) static_assert(cond, #msg) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L /* C11 or above */ +# define UA_STATIC_ASSERT(cond,msg) _Static_assert(cond, #msg) +#elif defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER) /* GCC, Clang, MSC */ +# define UA_CTASTR2(pre,post) pre ## post +# define UA_CTASTR(pre,post) UA_CTASTR2(pre,post) +# ifndef __COUNTER__ /* PPC GCC fix */ +# define __COUNTER__ __LINE__ +# endif +# define UA_STATIC_ASSERT(cond,msg) \ + typedef struct { \ + int UA_CTASTR(static_assertion_failed_,msg) : !!(cond); \ + } UA_CTASTR(static_assertion_failed_,__COUNTER__) +#else /* Everybody else */ +# define UA_STATIC_ASSERT(cond,msg) typedef char static_assertion_##msg[(cond)?1:-1] +#endif -/** - * Write Masks - * ----------- - * The write mask and user write mask is given by the following constants that - * are ANDed for the overall write mask. Part 3: 5.2.7 Table 2 */ +#if defined(_WIN32) && defined(UA_DYNAMIC_LINKING) +# ifdef UA_DYNAMIC_LINKING_EXPORT /* export dll */ +# ifdef __GNUC__ +# define UA_EXPORT __attribute__ ((dllexport)) +# else +# define UA_EXPORT __declspec(dllexport) +# endif +# else /* import dll */ +# ifdef __GNUC__ +# define UA_EXPORT __attribute__ ((dllimport)) +# else +# define UA_EXPORT __declspec(dllimport) +# endif +# endif +#else /* non win32 */ +# if __GNUC__ || __clang__ +# define UA_EXPORT __attribute__ ((visibility ("default"))) +# endif +#endif +#ifndef UA_EXPORT +# define UA_EXPORT /* fallback to default */ +#endif -#define UA_WRITEMASK_ACCESSLEVEL (0x01<<0) -#define UA_WRITEMASK_ARRRAYDIMENSIONS (0x01<<1) -#define UA_WRITEMASK_BROWSENAME (0x01<<2) -#define UA_WRITEMASK_CONTAINSNOLOOPS (0x01<<3) -#define UA_WRITEMASK_DATATYPE (0x01<<4) -#define UA_WRITEMASK_DESCRIPTION (0x01<<5) -#define UA_WRITEMASK_DISPLAYNAME (0x01<<6) -#define UA_WRITEMASK_EVENTNOTIFIER (0x01<<7) -#define UA_WRITEMASK_EXECUTABLE (0x01<<8) -#define UA_WRITEMASK_HISTORIZING (0x01<<9) -#define UA_WRITEMASK_INVERSENAME (0x01<<10) -#define UA_WRITEMASK_ISABSTRACT (0x01<<11) -#define UA_WRITEMASK_MINIMUMSAMPLINGINTERVAL (0x01<<12) -#define UA_WRITEMASK_NODECLASS (0x01<<13) -#define UA_WRITEMASK_NODEID (0x01<<14) -#define UA_WRITEMASK_SYMMETRIC (0x01<<15) -#define UA_WRITEMASK_USERACCESSLEVEL (0x01<<16) -#define UA_WRITEMASK_USEREXECUTABLE (0x01<<17) -#define UA_WRITEMASK_USERWRITEMASK (0x01<<18) -#define UA_WRITEMASK_VALUERANK (0x01<<19) -#define UA_WRITEMASK_WRITEMASK (0x01<<20) -#define UA_WRITEMASK_VALUEFORVARIABLETYPE (0x01<<21) +/** + * Inline Functions + * ---------------- */ +#ifdef _MSC_VER +# define UA_INLINE __inline +#else +# define UA_INLINE inline +#endif /** - * .. _statuscodes: - * - * StatusCodes - * ----------- - * StatusCodes are extensively used in the OPC UA protocol and in the open62541 - * API. They are represented by the :ref:`statuscode` data type. The following - * definitions are autogenerated from the ``Opc.Ua.StatusCodes.csv`` file provided - * with the OPC UA standard. */ + * Non-aliasing pointers + * -------------------- */ +#ifdef _MSC_VER +# define UA_RESTRICT __restrict +#elif defined(__GNUC__) +# define UA_RESTRICT __restrict__ +#else +# define UA_RESTRICT restrict +#endif -#define UA_STATUSCODE_GOOD 0x00 -#define UA_STATUSCODE_BADUNEXPECTEDERROR 0x80010000 // An unexpected error occurred. -#define UA_STATUSCODE_BADINTERNALERROR 0x80020000 // An internal error occurred as a result of a programming or configuration error. -#define UA_STATUSCODE_BADOUTOFMEMORY 0x80030000 // Not enough memory to complete the operation. -#define UA_STATUSCODE_BADRESOURCEUNAVAILABLE 0x80040000 // An operating system resource is not available. -#define UA_STATUSCODE_BADCOMMUNICATIONERROR 0x80050000 // A low level communication error occurred. -#define UA_STATUSCODE_BADENCODINGERROR 0x80060000 // Encoding halted because of invalid data in the objects being serialized. -#define UA_STATUSCODE_BADDECODINGERROR 0x80070000 // Decoding halted because of invalid data in the stream. -#define UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED 0x80080000 // The message encoding/decoding limits imposed by the stack have been exceeded. -#define UA_STATUSCODE_BADREQUESTTOOLARGE 0x80b80000 // The request message size exceeds limits set by the server. -#define UA_STATUSCODE_BADRESPONSETOOLARGE 0x80b90000 // The response message size exceeds limits set by the client. -#define UA_STATUSCODE_BADUNKNOWNRESPONSE 0x80090000 // An unrecognized response was received from the server. -#define UA_STATUSCODE_BADTIMEOUT 0x800a0000 // The operation timed out. -#define UA_STATUSCODE_BADSERVICEUNSUPPORTED 0x800b0000 // The server does not support the requested service. -#define UA_STATUSCODE_BADSHUTDOWN 0x800c0000 // The operation was cancelled because the application is shutting down. -#define UA_STATUSCODE_BADSERVERNOTCONNECTED 0x800d0000 // The operation could not complete because the client is not connected to the server. -#define UA_STATUSCODE_BADSERVERHALTED 0x800e0000 // The server has stopped and cannot process any requests. -#define UA_STATUSCODE_BADNOTHINGTODO 0x800f0000 // There was nothing to do because the client passed a list of operations with no elements. -#define UA_STATUSCODE_BADTOOMANYOPERATIONS 0x80100000 // The request could not be processed because it specified too many operations. -#define UA_STATUSCODE_BADTOOMANYMONITOREDITEMS 0x80db0000 // The request could not be processed because there are too many monitored items in the subscription. -#define UA_STATUSCODE_BADDATATYPEIDUNKNOWN 0x80110000 // The extension object cannot be (de)serialized because the data type id is not recognized. -#define UA_STATUSCODE_BADCERTIFICATEINVALID 0x80120000 // The certificate provided as a parameter is not valid. -#define UA_STATUSCODE_BADSECURITYCHECKSFAILED 0x80130000 // An error occurred verifying security. -#define UA_STATUSCODE_BADCERTIFICATETIMEINVALID 0x80140000 // The Certificate has expired or is not yet valid. -#define UA_STATUSCODE_BADCERTIFICATEISSUERTIMEINVALID 0x80150000 // An Issuer Certificate has expired or is not yet valid. -#define UA_STATUSCODE_BADCERTIFICATEHOSTNAMEINVALID 0x80160000 // The HostName used to connect to a Server does not match a HostName in the Certificate. -#define UA_STATUSCODE_BADCERTIFICATEURIINVALID 0x80170000 // The URI specified in the ApplicationDescription does not match the URI in the Certificate. -#define UA_STATUSCODE_BADCERTIFICATEUSENOTALLOWED 0x80180000 // The Certificate may not be used for the requested operation. -#define UA_STATUSCODE_BADCERTIFICATEISSUERUSENOTALLOWED 0x80190000 // The Issuer Certificate may not be used for the requested operation. -#define UA_STATUSCODE_BADCERTIFICATEUNTRUSTED 0x801a0000 // The Certificate is not trusted. -#define UA_STATUSCODE_BADCERTIFICATEREVOCATIONUNKNOWN 0x801b0000 // It was not possible to determine if the Certificate has been revoked. -#define UA_STATUSCODE_BADCERTIFICATEISSUERREVOCATIONUNKNOWN 0x801c0000 // It was not possible to determine if the Issuer Certificate has been revoked. -#define UA_STATUSCODE_BADCERTIFICATEREVOKED 0x801d0000 // The certificate has been revoked. -#define UA_STATUSCODE_BADCERTIFICATEISSUERREVOKED 0x801e0000 // The issuer certificate has been revoked. -#define UA_STATUSCODE_BADCERTIFICATECHAININCOMPLETE 0x810d0000 // The certificate chain is incomplete. -#define UA_STATUSCODE_BADUSERACCESSDENIED 0x801f0000 // User does not have permission to perform the requested operation. -#define UA_STATUSCODE_BADIDENTITYTOKENINVALID 0x80200000 // The user identity token is not valid. -#define UA_STATUSCODE_BADIDENTITYTOKENREJECTED 0x80210000 // The user identity token is valid but the server has rejected it. -#define UA_STATUSCODE_BADSECURECHANNELIDINVALID 0x80220000 // The specified secure channel is no longer valid. -#define UA_STATUSCODE_BADINVALIDTIMESTAMP 0x80230000 // The timestamp is outside the range allowed by the server. -#define UA_STATUSCODE_BADNONCEINVALID 0x80240000 // The nonce does appear to be not a random value or it is not the correct length. -#define UA_STATUSCODE_BADSESSIONIDINVALID 0x80250000 // The session id is not valid. -#define UA_STATUSCODE_BADSESSIONCLOSED 0x80260000 // The session was closed by the client. -#define UA_STATUSCODE_BADSESSIONNOTACTIVATED 0x80270000 // The session cannot be used because ActivateSession has not been called. -#define UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID 0x80280000 // The subscription id is not valid. -#define UA_STATUSCODE_BADREQUESTHEADERINVALID 0x802a0000 // The header for the request is missing or invalid. -#define UA_STATUSCODE_BADTIMESTAMPSTORETURNINVALID 0x802b0000 // The timestamps to return parameter is invalid. -#define UA_STATUSCODE_BADREQUESTCANCELLEDBYCLIENT 0x802c0000 // The request was cancelled by the client. -#define UA_STATUSCODE_BADTOOMANYARGUMENTS 0x80e50000 // Too many arguments were provided. -#define UA_STATUSCODE_BADLICENSEEXPIRED 0x810E0000 // The server requires a license to operate in general or to perform a service or operation, but existing license is expired. -#define UA_STATUSCODE_BADLICENSELIMITSEXCEEDED 0x810F0000 // The server has limits on number of allowed operations / objects, based on installed licenses, and these limits where exceeded. -#define UA_STATUSCODE_BADLICENSENOTAVAILABLE 0x81100000 // The server does not have a license which is required to operate in general or to perform a service or operation. -#define UA_STATUSCODE_GOODSUBSCRIPTIONTRANSFERRED 0x002d0000 // The subscription was transferred to another session. -#define UA_STATUSCODE_GOODCOMPLETESASYNCHRONOUSLY 0x002e0000 // The processing will complete asynchronously. -#define UA_STATUSCODE_GOODOVERLOAD 0x002f0000 // Sampling has slowed down due to resource limitations. -#define UA_STATUSCODE_GOODCLAMPED 0x00300000 // The value written was accepted but was clamped. -#define UA_STATUSCODE_BADNOCOMMUNICATION 0x80310000 // Communication with the data source is defined, but not established, and there is no last known value available. -#define UA_STATUSCODE_BADWAITINGFORINITIALDATA 0x80320000 // Waiting for the server to obtain values from the underlying data source. -#define UA_STATUSCODE_BADNODEIDINVALID 0x80330000 // The syntax of the node id is not valid. -#define UA_STATUSCODE_BADNODEIDUNKNOWN 0x80340000 // The node id refers to a node that does not exist in the server address space. -#define UA_STATUSCODE_BADATTRIBUTEIDINVALID 0x80350000 // The attribute is not supported for the specified Node. -#define UA_STATUSCODE_BADINDEXRANGEINVALID 0x80360000 // The syntax of the index range parameter is invalid. -#define UA_STATUSCODE_BADINDEXRANGENODATA 0x80370000 // No data exists within the range of indexes specified. -#define UA_STATUSCODE_BADDATAENCODINGINVALID 0x80380000 // The data encoding is invalid. -#define UA_STATUSCODE_BADDATAENCODINGUNSUPPORTED 0x80390000 // The server does not support the requested data encoding for the node. -#define UA_STATUSCODE_BADNOTREADABLE 0x803a0000 // The access level does not allow reading or subscribing to the Node. -#define UA_STATUSCODE_BADNOTWRITABLE 0x803b0000 // The access level does not allow writing to the Node. -#define UA_STATUSCODE_BADOUTOFRANGE 0x803c0000 // The value was out of range. -#define UA_STATUSCODE_BADNOTSUPPORTED 0x803d0000 // The requested operation is not supported. -#define UA_STATUSCODE_BADNOTFOUND 0x803e0000 // A requested item was not found or a search operation ended without success. -#define UA_STATUSCODE_BADOBJECTDELETED 0x803f0000 // The object cannot be used because it has been deleted. -#define UA_STATUSCODE_BADNOTIMPLEMENTED 0x80400000 // Requested operation is not implemented. -#define UA_STATUSCODE_BADMONITORINGMODEINVALID 0x80410000 // The monitoring mode is invalid. -#define UA_STATUSCODE_BADMONITOREDITEMIDINVALID 0x80420000 // The monitoring item id does not refer to a valid monitored item. -#define UA_STATUSCODE_BADMONITOREDITEMFILTERINVALID 0x80430000 // The monitored item filter parameter is not valid. -#define UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED 0x80440000 // The server does not support the requested monitored item filter. -#define UA_STATUSCODE_BADFILTERNOTALLOWED 0x80450000 // A monitoring filter cannot be used in combination with the attribute specified. -#define UA_STATUSCODE_BADSTRUCTUREMISSING 0x80460000 // A mandatory structured parameter was missing or null. -#define UA_STATUSCODE_BADEVENTFILTERINVALID 0x80470000 // The event filter is not valid. -#define UA_STATUSCODE_BADCONTENTFILTERINVALID 0x80480000 // The content filter is not valid. -#define UA_STATUSCODE_BADFILTEROPERATORINVALID 0x80c10000 // An unregognized operator was provided in a filter. -#define UA_STATUSCODE_BADFILTEROPERATORUNSUPPORTED 0x80c20000 // A valid operator was provided, but the server does not provide support for this filter operator. -#define UA_STATUSCODE_BADFILTEROPERANDCOUNTMISMATCH 0x80c30000 // The number of operands provided for the filter operator was less then expected for the operand provided. -#define UA_STATUSCODE_BADFILTEROPERANDINVALID 0x80490000 // The operand used in a content filter is not valid. -#define UA_STATUSCODE_BADFILTERELEMENTINVALID 0x80c40000 // The referenced element is not a valid element in the content filter. -#define UA_STATUSCODE_BADFILTERLITERALINVALID 0x80c50000 // The referenced literal is not a valid value. -#define UA_STATUSCODE_BADCONTINUATIONPOINTINVALID 0x804a0000 // The continuation point provide is longer valid. -#define UA_STATUSCODE_BADNOCONTINUATIONPOINTS 0x804b0000 // The operation could not be processed because all continuation points have been allocated. -#define UA_STATUSCODE_BADREFERENCETYPEIDINVALID 0x804c0000 // The operation could not be processed because all continuation points have been allocated. -#define UA_STATUSCODE_BADBROWSEDIRECTIONINVALID 0x804d0000 // The browse direction is not valid. -#define UA_STATUSCODE_BADNODENOTINVIEW 0x804e0000 // The node is not part of the view. -#define UA_STATUSCODE_BADSERVERURIINVALID 0x804f0000 // The ServerUri is not a valid URI. -#define UA_STATUSCODE_BADSERVERNAMEMISSING 0x80500000 // No ServerName was specified. -#define UA_STATUSCODE_BADDISCOVERYURLMISSING 0x80510000 // No DiscoveryUrl was specified. -#define UA_STATUSCODE_BADSEMPAHOREFILEMISSING 0x80520000 // The semaphore file specified by the client is not valid. -#define UA_STATUSCODE_BADREQUESTTYPEINVALID 0x80530000 // The security token request type is not valid. -#define UA_STATUSCODE_BADSECURITYMODEREJECTED 0x80540000 // The security mode does not meet the requirements set by the Server. -#define UA_STATUSCODE_BADSECURITYPOLICYREJECTED 0x80550000 // The security policy does not meet the requirements set by the Server. -#define UA_STATUSCODE_BADTOOMANYSESSIONS 0x80560000 // The server has reached its maximum number of sessions. -#define UA_STATUSCODE_BADUSERSIGNATUREINVALID 0x80570000 // The user token signature is missing or invalid. -#define UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID 0x80580000 // The signature generated with the client certificate is missing or invalid. -#define UA_STATUSCODE_BADNOVALIDCERTIFICATES 0x80590000 // The client did not provide at least one software certificate that is valid and meets the profile requirements for the server. -#define UA_STATUSCODE_BADIDENTITYCHANGENOTSUPPORTED 0x80c60000 // The Server does not support changing the user identity assigned to the session. -#define UA_STATUSCODE_BADREQUESTCANCELLEDBYREQUEST 0x805a0000 // The request was cancelled by the client with the Cancel service. -#define UA_STATUSCODE_BADPARENTNODEIDINVALID 0x805b0000 // The parent node id does not to refer to a valid node. -#define UA_STATUSCODE_BADREFERENCENOTALLOWED 0x805c0000 // The reference could not be created because it violates constraints imposed by the data model. -#define UA_STATUSCODE_BADNODEIDREJECTED 0x805d0000 // The requested node id was reject because it was either invalid or server does not allow node ids to be specified by the client. -#define UA_STATUSCODE_BADNODEIDEXISTS 0x805e0000 // The requested node id is already used by another node. -#define UA_STATUSCODE_BADNODECLASSINVALID 0x805f0000 // The node class is not valid. -#define UA_STATUSCODE_BADBROWSENAMEINVALID 0x80600000 // The browse name is invalid. -#define UA_STATUSCODE_BADBROWSENAMEDUPLICATED 0x80610000 // The browse name is not unique among nodes that share the same relationship with the parent. -#define UA_STATUSCODE_BADNODEATTRIBUTESINVALID 0x80620000 // The node attributes are not valid for the node class. -#define UA_STATUSCODE_BADTYPEDEFINITIONINVALID 0x80630000 // The type definition node id does not reference an appropriate type node. -#define UA_STATUSCODE_BADSOURCENODEIDINVALID 0x80640000 // The source node id does not reference a valid node. -#define UA_STATUSCODE_BADTARGETNODEIDINVALID 0x80650000 // The target node id does not reference a valid node. -#define UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED 0x80660000 // The reference type between the nodes is already defined. -#define UA_STATUSCODE_BADINVALIDSELFREFERENCE 0x80670000 // The server does not allow this type of self reference on this node. -#define UA_STATUSCODE_BADREFERENCELOCALONLY 0x80680000 // The reference type is not valid for a reference to a remote server. -#define UA_STATUSCODE_BADNODELETERIGHTS 0x80690000 // The server will not allow the node to be deleted. -#define UA_STATUSCODE_UNCERTAINREFERENCENOTDELETED 0x40bc0000 // The server was not able to delete all target references. -#define UA_STATUSCODE_BADSERVERINDEXINVALID 0x806a0000 // The server index is not valid. -#define UA_STATUSCODE_BADVIEWIDUNKNOWN 0x806b0000 // The view id does not refer to a valid view node. -#define UA_STATUSCODE_BADVIEWTIMESTAMPINVALID 0x80c90000 // The view timestamp is not available or not supported. -#define UA_STATUSCODE_BADVIEWPARAMETERMISMATCH 0x80ca0000 // The view parameters are not consistent with each other. -#define UA_STATUSCODE_BADVIEWVERSIONINVALID 0x80cb0000 // The view version is not available or not supported. -#define UA_STATUSCODE_UNCERTAINNOTALLNODESAVAILABLE 0x40c00000 // The list of references may not be complete because the underlying system is not available. -#define UA_STATUSCODE_GOODRESULTSMAYBEINCOMPLETE 0x00ba0000 // The server should have followed a reference to a node in a remote server but did not. The result set may be incomplete. -#define UA_STATUSCODE_BADNOTTYPEDEFINITION 0x80c80000 // The provided Nodeid was not a type definition nodeid. -#define UA_STATUSCODE_UNCERTAINREFERENCEOUTOFSERVER 0x406c0000 // One of the references to follow in the relative path references to a node in the address space in another server. -#define UA_STATUSCODE_BADTOOMANYMATCHES 0x806d0000 // The requested operation has too many matches to return. -#define UA_STATUSCODE_BADQUERYTOOCOMPLEX 0x806e0000 // The requested operation requires too many resources in the server. -#define UA_STATUSCODE_BADNOMATCH 0x806f0000 // The requested operation has no match to return. -#define UA_STATUSCODE_BADMAXAGEINVALID 0x80700000 // The max age parameter is invalid. -#define UA_STATUSCODE_BADSECURITYMODEINSUFFICIENT 0x80e60000 // The operation is not permitted over the current secure channel. -#define UA_STATUSCODE_BADHISTORYOPERATIONINVALID 0x80710000 // The history details parameter is not valid. -#define UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED 0x80720000 // The server does not support the requested operation. -#define UA_STATUSCODE_BADINVALIDTIMESTAMPARGUMENT 0x80bd0000 // The defined timestamp to return was invalid. -#define UA_STATUSCODE_BADWRITENOTSUPPORTED 0x80730000 // The server not does support writing the combination of value, status and timestamps provided. -#define UA_STATUSCODE_BADTYPEMISMATCH 0x80740000 // The value supplied for the attribute is not of the same type as the attribute's value. -#define UA_STATUSCODE_BADMETHODINVALID 0x80750000 // The method id does not refer to a method for the specified object. -#define UA_STATUSCODE_BADARGUMENTSMISSING 0x80760000 // The client did not specify all of the input arguments for the method. -#define UA_STATUSCODE_BADTOOMANYSUBSCRIPTIONS 0x80770000 // The server has reached its maximum number of subscriptions. -#define UA_STATUSCODE_BADTOOMANYPUBLISHREQUESTS 0x80780000 // The server has reached the maximum number of queued publish requests. -#define UA_STATUSCODE_BADNOSUBSCRIPTION 0x80790000 // There is no subscription available for this session. -#define UA_STATUSCODE_BADSEQUENCENUMBERUNKNOWN 0x807a0000 // The sequence number is unknown to the server. -#define UA_STATUSCODE_BADMESSAGENOTAVAILABLE 0x807b0000 // The requested notification message is no longer available. -#define UA_STATUSCODE_BADINSUFFICIENTCLIENTPROFILE 0x807c0000 // The Client of the current Session does not support one or more Profiles that are necessary for the Subscription. -#define UA_STATUSCODE_BADSTATENOTACTIVE 0x80bf0000 // The sub-state machine is not currently active. -#define UA_STATUSCODE_BADTCPSERVERTOOBUSY 0x807d0000 // The server cannot process the request because it is too busy. -#define UA_STATUSCODE_BADTCPMESSAGETYPEINVALID 0x807e0000 // The type of the message specified in the header invalid. -#define UA_STATUSCODE_BADTCPSECURECHANNELUNKNOWN 0x807f0000 // The SecureChannelId and/or TokenId are not currently in use. -#define UA_STATUSCODE_BADTCPMESSAGETOOLARGE 0x80800000 // The size of the message specified in the header is too large. -#define UA_STATUSCODE_BADTCPNOTENOUGHRESOURCES 0x80810000 // There are not enough resources to process the request. -#define UA_STATUSCODE_BADTCPINTERNALERROR 0x80820000 // An internal error occurred. -#define UA_STATUSCODE_BADTCPENDPOINTURLINVALID 0x80830000 // The Server does not recognize the QueryString specified. -#define UA_STATUSCODE_BADREQUESTINTERRUPTED 0x80840000 // The request could not be sent because of a network interruption. -#define UA_STATUSCODE_BADREQUESTTIMEOUT 0x80850000 // Timeout occurred while processing the request. -#define UA_STATUSCODE_BADSECURECHANNELCLOSED 0x80860000 // The secure channel has been closed. -#define UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN 0x80870000 // The token has expired or is not recognized. -#define UA_STATUSCODE_BADSEQUENCENUMBERINVALID 0x80880000 // The sequence number is not valid. -#define UA_STATUSCODE_BADPROTOCOLVERSIONUNSUPPORTED 0x80be0000 // The applications do not have compatible protocol versions. -#define UA_STATUSCODE_BADCONFIGURATIONERROR 0x80890000 // There is a problem with the configuration that affects the usefulness of the value. -#define UA_STATUSCODE_BADNOTCONNECTED 0x808a0000 // The variable should receive its value from another variable, but has never been configured to do so. -#define UA_STATUSCODE_BADDEVICEFAILURE 0x808b0000 // There has been a failure in the device/data source that generates the value that has affected the value. -#define UA_STATUSCODE_BADSENSORFAILURE 0x808c0000 // There has been a failure in the sensor from which the value is derived by the device/data source. -#define UA_STATUSCODE_BADOUTOFSERVICE 0x808d0000 // The source of the data is not operational. -#define UA_STATUSCODE_BADDEADBANDFILTERINVALID 0x808e0000 // The deadband filter is not valid. -#define UA_STATUSCODE_UNCERTAINNOCOMMUNICATIONLASTUSABLEVALUE 0x408f0000 // Communication to the data source has failed. The variable value is the last value that had a good quality. -#define UA_STATUSCODE_UNCERTAINLASTUSABLEVALUE 0x40900000 // Whatever was updating this value has stopped doing so. -#define UA_STATUSCODE_UNCERTAINSUBSTITUTEVALUE 0x40910000 // The value is an operational value that was manually overwritten. -#define UA_STATUSCODE_UNCERTAININITIALVALUE 0x40920000 // The value is an initial value for a variable that normally receives its value from another variable. -#define UA_STATUSCODE_UNCERTAINSENSORNOTACCURATE 0x40930000 // The value is at one of the sensor limits. -#define UA_STATUSCODE_UNCERTAINENGINEERINGUNITSEXCEEDED 0x40940000 // The value is outside of the range of values defined for this parameter. -#define UA_STATUSCODE_UNCERTAINSUBNORMAL 0x40950000 // The value is derived from multiple sources and has less than the required number of Good sources. -#define UA_STATUSCODE_GOODLOCALOVERRIDE 0x00960000 // The value has been overridden. -#define UA_STATUSCODE_BADREFRESHINPROGRESS 0x80970000 // This Condition refresh failed, a Condition refresh operation is already in progress. -#define UA_STATUSCODE_BADCONDITIONALREADYDISABLED 0x80980000 // This condition has already been disabled. -#define UA_STATUSCODE_BADCONDITIONALREADYENABLED 0x80cc0000 // This condition has already been enabled. -#define UA_STATUSCODE_BADCONDITIONDISABLED 0x80990000 // Property not available, this condition is disabled. -#define UA_STATUSCODE_BADEVENTIDUNKNOWN 0x809a0000 // The specified event id is not recognized. -#define UA_STATUSCODE_BADEVENTNOTACKNOWLEDGEABLE 0x80bb0000 // The event cannot be acknowledged. -#define UA_STATUSCODE_BADDIALOGNOTACTIVE 0x80cd0000 // The dialog condition is not active. -#define UA_STATUSCODE_BADDIALOGRESPONSEINVALID 0x80ce0000 // The response is not valid for the dialog. -#define UA_STATUSCODE_BADCONDITIONBRANCHALREADYACKED 0x80cf0000 // The condition branch has already been acknowledged. -#define UA_STATUSCODE_BADCONDITIONBRANCHALREADYCONFIRMED 0x80d00000 // The condition branch has already been confirmed. -#define UA_STATUSCODE_BADCONDITIONALREADYSHELVED 0x80d10000 // The condition has already been shelved. -#define UA_STATUSCODE_BADCONDITIONNOTSHELVED 0x80d20000 // The condition is not currently shelved. -#define UA_STATUSCODE_BADSHELVINGTIMEOUTOFRANGE 0x80d30000 // The shelving time not within an acceptable range. -#define UA_STATUSCODE_BADNODATA 0x809b0000 // No data exists for the requested time range or event filter. -#define UA_STATUSCODE_BADBOUNDNOTFOUND 0x80d70000 // No data found to provide upper or lower bound value. -#define UA_STATUSCODE_BADBOUNDNOTSUPPORTED 0x80d80000 // The server cannot retrieve a bound for the variable. -#define UA_STATUSCODE_BADDATALOST 0x809d0000 // Data is missing due to collection started/stopped/lost. -#define UA_STATUSCODE_BADDATAUNAVAILABLE 0x809e0000 // Expected data is unavailable for the requested time range due to an un-mounted volume, an off-line archive or tape, or similar reason for temporary unavailability. -#define UA_STATUSCODE_BADENTRYEXISTS 0x809f0000 // The data or event was not successfully inserted because a matching entry exists. -#define UA_STATUSCODE_BADNOENTRYEXISTS 0x80a00000 // The data or event was not successfully updated because no matching entry exists. -#define UA_STATUSCODE_BADTIMESTAMPNOTSUPPORTED 0x80a10000 // The client requested history using a timestamp format the server does not support (i.e requested ServerTimestamp when server only supports SourceTimestamp). -#define UA_STATUSCODE_GOODENTRYINSERTED 0x00a20000 // The data or event was successfully inserted into the historical database. -#define UA_STATUSCODE_GOODENTRYREPLACED 0x00a30000 // The data or event field was successfully replaced in the historical database. -#define UA_STATUSCODE_UNCERTAINDATASUBNORMAL 0x40a40000 // The value is derived from multiple values and has less than the required number of Good values. -#define UA_STATUSCODE_GOODNODATA 0x00a50000 // No data exists for the requested time range or event filter. -#define UA_STATUSCODE_GOODMOREDATA 0x00a60000 // The data or event field was successfully replaced in the historical database. -#define UA_STATUSCODE_BADAGGREGATELISTMISMATCH 0x80d40000 // The requested number of Aggregates does not match the requested number of NodeIds. -#define UA_STATUSCODE_BADAGGREGATENOTSUPPORTED 0x80d50000 // The requested Aggregate is not support by the server. -#define UA_STATUSCODE_BADAGGREGATEINVALIDINPUTS 0x80d60000 // The aggregate value could not be derived due to invalid data inputs. -#define UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED 0x80da0000 // The aggregate configuration is not valid for specified node. -#define UA_STATUSCODE_GOODDATAIGNORED 0x00d90000 // The request pecifies fields which are not valid for the EventType or cannot be saved by the historian. -#define UA_STATUSCODE_BADREQUESTNOTALLOWED 0x80e40000 // The request was rejected by the server because it did not meet the criteria set by the server. -#define UA_STATUSCODE_GOODEDITED 0x00dc0000 // The value does not come from the real source and has been edited by the server. -#define UA_STATUSCODE_GOODPOSTACTIONFAILED 0x00dd0000 // There was an error in execution of these post-actions. -#define UA_STATUSCODE_UNCERTAINDOMINANTVALUECHANGED 0x40de0000 // The related EngineeringUnit has been changed but the Variable Value is still provided based on the previous unit. -#define UA_STATUSCODE_GOODDEPENDENTVALUECHANGED 0x00e00000 // A dependent value has been changed but the change has not been applied to the device. -#define UA_STATUSCODE_BADDOMINANTVALUECHANGED 0x80e10000 // The related EngineeringUnit has been changed but this change has not been applied to the device. The Variable Value is still dependent on the previous unit but its status is currently Bad. -#define UA_STATUSCODE_UNCERTAINDEPENDENTVALUECHANGED 0x40e20000 // A dependent value has been changed but the change has not been applied to the device. The quality of the dominant variable is uncertain. -#define UA_STATUSCODE_BADDEPENDENTVALUECHANGED 0x80e30000 // A dependent value has been changed but the change has not been applied to the device. The quality of the dominant variable is Bad. -#define UA_STATUSCODE_GOODCOMMUNICATIONEVENT 0x00a70000 // The communication layer has raised an event. -#define UA_STATUSCODE_GOODSHUTDOWNEVENT 0x00a80000 // The system is shutting down. -#define UA_STATUSCODE_GOODCALLAGAIN 0x00a90000 // The operation is not finished and needs to be called again. -#define UA_STATUSCODE_GOODNONCRITICALTIMEOUT 0x00aa0000 // A non-critical timeout occurred. -#define UA_STATUSCODE_BADINVALIDARGUMENT 0x80ab0000 // One or more arguments are invalid. -#define UA_STATUSCODE_BADCONNECTIONREJECTED 0x80ac0000 // Could not establish a network connection to remote server. -#define UA_STATUSCODE_BADDISCONNECT 0x80ad0000 // The server has disconnected from the client. -#define UA_STATUSCODE_BADCONNECTIONCLOSED 0x80ae0000 // The network connection has been closed. -#define UA_STATUSCODE_BADINVALIDSTATE 0x80af0000 // The operation cannot be completed because the object is closed, uninitialized or in some other invalid state. -#define UA_STATUSCODE_BADENDOFSTREAM 0x80b00000 // Cannot move beyond end of the stream. -#define UA_STATUSCODE_BADNODATAAVAILABLE 0x80b10000 // No data is currently available for reading from a non-blocking stream. -#define UA_STATUSCODE_BADWAITINGFORRESPONSE 0x80b20000 // The asynchronous operation is waiting for a response. -#define UA_STATUSCODE_BADOPERATIONABANDONED 0x80b30000 // The asynchronous operation was abandoned by the caller. -#define UA_STATUSCODE_BADEXPECTEDSTREAMTOBLOCK 0x80b40000 // The stream did not return all data requested (possibly because it is a non-blocking stream). -#define UA_STATUSCODE_BADWOULDBLOCK 0x80b50000 // Non blocking behaviour is required and the operation would block. -#define UA_STATUSCODE_BADSYNTAXERROR 0x80b60000 // A value had an invalid syntax. -#define UA_STATUSCODE_BADMAXCONNECTIONSREACHED 0x80b70000 // The operation could not be finished because all available connections are in use. +/** + * Function attributes + * ------------------- */ +#if defined(__GNUC__) || defined(__clang__) +# define UA_FUNC_ATTR_MALLOC __attribute__((malloc)) +# define UA_FUNC_ATTR_PURE __attribute__ ((pure)) +# define UA_FUNC_ATTR_CONST __attribute__((const)) +# define UA_FUNC_ATTR_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# define UA_FORMAT(X,Y) __attribute__ ((format (printf, X, Y))) +#else +# define UA_FUNC_ATTR_MALLOC +# define UA_FUNC_ATTR_PURE +# define UA_FUNC_ATTR_CONST +# define UA_FUNC_ATTR_WARN_UNUSED_RESULT +# define UA_FORMAT(X,Y) +#endif -/* These StatusCodes are manually generated. */ -#define UA_STATUSCODE_INFOTYPE_DATAVALUE 0x00000400 -#define UA_STATUSCODE_INFOBITS_OVERFLOW 0x00000080 +#if defined(__GNUC__) || defined(__clang__) +# define UA_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) +# define UA_DEPRECATED __declspec(deprecated) +#else +# define UA_DEPRECATED +#endif /** - * Namespace Zero NodeIds - * ---------------------- - * Numeric identifiers of standard-defined nodes in namespace zero. The - * following definitions are autogenerated from the ``NodeIds.csv`` file - * provided with the OPC UA standard. */ - -#define UA_NS0ID_BOOLEAN 1 // DataType -#define UA_NS0ID_SBYTE 2 // DataType -#define UA_NS0ID_BYTE 3 // DataType -#define UA_NS0ID_INT16 4 // DataType -#define UA_NS0ID_UINT16 5 // DataType -#define UA_NS0ID_INT32 6 // DataType -#define UA_NS0ID_UINT32 7 // DataType -#define UA_NS0ID_INT64 8 // DataType -#define UA_NS0ID_UINT64 9 // DataType -#define UA_NS0ID_FLOAT 10 // DataType -#define UA_NS0ID_DOUBLE 11 // DataType -#define UA_NS0ID_STRING 12 // DataType -#define UA_NS0ID_DATETIME 13 // DataType -#define UA_NS0ID_GUID 14 // DataType -#define UA_NS0ID_BYTESTRING 15 // DataType -#define UA_NS0ID_XMLELEMENT 16 // DataType -#define UA_NS0ID_NODEID 17 // DataType -#define UA_NS0ID_EXPANDEDNODEID 18 // DataType -#define UA_NS0ID_STATUSCODE 19 // DataType -#define UA_NS0ID_QUALIFIEDNAME 20 // DataType -#define UA_NS0ID_LOCALIZEDTEXT 21 // DataType -#define UA_NS0ID_STRUCTURE 22 // DataType -#define UA_NS0ID_DATAVALUE 23 // DataType -#define UA_NS0ID_BASEDATATYPE 24 // DataType -#define UA_NS0ID_DIAGNOSTICINFO 25 // DataType -#define UA_NS0ID_NUMBER 26 // DataType -#define UA_NS0ID_INTEGER 27 // DataType -#define UA_NS0ID_UINTEGER 28 // DataType -#define UA_NS0ID_ENUMERATION 29 // DataType -#define UA_NS0ID_IMAGE 30 // DataType -#define UA_NS0ID_REFERENCES 31 // ReferenceType -#define UA_NS0ID_NONHIERARCHICALREFERENCES 32 // ReferenceType -#define UA_NS0ID_HIERARCHICALREFERENCES 33 // ReferenceType -#define UA_NS0ID_HASCHILD 34 // ReferenceType -#define UA_NS0ID_ORGANIZES 35 // ReferenceType -#define UA_NS0ID_HASEVENTSOURCE 36 // ReferenceType -#define UA_NS0ID_HASMODELLINGRULE 37 // ReferenceType -#define UA_NS0ID_HASENCODING 38 // ReferenceType -#define UA_NS0ID_HASDESCRIPTION 39 // ReferenceType -#define UA_NS0ID_HASTYPEDEFINITION 40 // ReferenceType -#define UA_NS0ID_GENERATESEVENT 41 // ReferenceType -#define UA_NS0ID_AGGREGATES 44 // ReferenceType -#define UA_NS0ID_HASSUBTYPE 45 // ReferenceType -#define UA_NS0ID_HASPROPERTY 46 // ReferenceType -#define UA_NS0ID_HASCOMPONENT 47 // ReferenceType -#define UA_NS0ID_HASNOTIFIER 48 // ReferenceType -#define UA_NS0ID_HASORDEREDCOMPONENT 49 // ReferenceType -#define UA_NS0ID_FROMSTATE 51 // ReferenceType -#define UA_NS0ID_TOSTATE 52 // ReferenceType -#define UA_NS0ID_HASCAUSE 53 // ReferenceType -#define UA_NS0ID_HASEFFECT 54 // ReferenceType -#define UA_NS0ID_HASHISTORICALCONFIGURATION 56 // ReferenceType -#define UA_NS0ID_BASEOBJECTTYPE 58 // ObjectType -#define UA_NS0ID_FOLDERTYPE 61 // ObjectType -#define UA_NS0ID_BASEVARIABLETYPE 62 // VariableType -#define UA_NS0ID_BASEDATAVARIABLETYPE 63 // VariableType -#define UA_NS0ID_PROPERTYTYPE 68 // VariableType -#define UA_NS0ID_DATATYPEDESCRIPTIONTYPE 69 // VariableType -#define UA_NS0ID_DATATYPEDICTIONARYTYPE 72 // VariableType -#define UA_NS0ID_DATATYPESYSTEMTYPE 75 // ObjectType -#define UA_NS0ID_DATATYPEENCODINGTYPE 76 // ObjectType -#define UA_NS0ID_MODELLINGRULETYPE 77 // ObjectType -#define UA_NS0ID_MODELLINGRULE_MANDATORY 78 // Object -#define UA_NS0ID_MODELLINGRULE_MANDATORYSHARED 79 // Object -#define UA_NS0ID_MODELLINGRULE_OPTIONAL 80 // Object -#define UA_NS0ID_MODELLINGRULE_EXPOSESITSARRAY 83 // Object -#define UA_NS0ID_ROOTFOLDER 84 // Object -#define UA_NS0ID_OBJECTSFOLDER 85 // Object -#define UA_NS0ID_TYPESFOLDER 86 // Object -#define UA_NS0ID_VIEWSFOLDER 87 // Object -#define UA_NS0ID_OBJECTTYPESFOLDER 88 // Object -#define UA_NS0ID_VARIABLETYPESFOLDER 89 // Object -#define UA_NS0ID_DATATYPESFOLDER 90 // Object -#define UA_NS0ID_REFERENCETYPESFOLDER 91 // Object -#define UA_NS0ID_XMLSCHEMA_TYPESYSTEM 92 // Object -#define UA_NS0ID_OPCBINARYSCHEMA_TYPESYSTEM 93 // Object -#define UA_NS0ID_MODELLINGRULE_MANDATORY_NAMINGRULE 112 // Variable -#define UA_NS0ID_MODELLINGRULE_OPTIONAL_NAMINGRULE 113 // Variable -#define UA_NS0ID_MODELLINGRULE_EXPOSESITSARRAY_NAMINGRULE 114 // Variable -#define UA_NS0ID_MODELLINGRULE_MANDATORYSHARED_NAMINGRULE 116 // Variable -#define UA_NS0ID_HASSUBSTATEMACHINE 117 // ReferenceType -#define UA_NS0ID_NAMINGRULETYPE 120 // DataType -#define UA_NS0ID_DECIMAL128 121 // DataType -#define UA_NS0ID_IDTYPE 256 // DataType -#define UA_NS0ID_NODECLASS 257 // DataType -#define UA_NS0ID_NODE 258 // DataType -#define UA_NS0ID_NODE_ENCODING_DEFAULTXML 259 // Object -#define UA_NS0ID_NODE_ENCODING_DEFAULTBINARY 260 // Object -#define UA_NS0ID_OBJECTNODE 261 // DataType -#define UA_NS0ID_OBJECTNODE_ENCODING_DEFAULTXML 262 // Object -#define UA_NS0ID_OBJECTNODE_ENCODING_DEFAULTBINARY 263 // Object -#define UA_NS0ID_OBJECTTYPENODE 264 // DataType -#define UA_NS0ID_OBJECTTYPENODE_ENCODING_DEFAULTXML 265 // Object -#define UA_NS0ID_OBJECTTYPENODE_ENCODING_DEFAULTBINARY 266 // Object -#define UA_NS0ID_VARIABLENODE 267 // DataType -#define UA_NS0ID_VARIABLENODE_ENCODING_DEFAULTXML 268 // Object -#define UA_NS0ID_VARIABLENODE_ENCODING_DEFAULTBINARY 269 // Object -#define UA_NS0ID_VARIABLETYPENODE 270 // DataType -#define UA_NS0ID_VARIABLETYPENODE_ENCODING_DEFAULTXML 271 // Object -#define UA_NS0ID_VARIABLETYPENODE_ENCODING_DEFAULTBINARY 272 // Object -#define UA_NS0ID_REFERENCETYPENODE 273 // DataType -#define UA_NS0ID_REFERENCETYPENODE_ENCODING_DEFAULTXML 274 // Object -#define UA_NS0ID_REFERENCETYPENODE_ENCODING_DEFAULTBINARY 275 // Object -#define UA_NS0ID_METHODNODE 276 // DataType -#define UA_NS0ID_METHODNODE_ENCODING_DEFAULTXML 277 // Object -#define UA_NS0ID_METHODNODE_ENCODING_DEFAULTBINARY 278 // Object -#define UA_NS0ID_VIEWNODE 279 // DataType -#define UA_NS0ID_VIEWNODE_ENCODING_DEFAULTXML 280 // Object -#define UA_NS0ID_VIEWNODE_ENCODING_DEFAULTBINARY 281 // Object -#define UA_NS0ID_DATATYPENODE 282 // DataType -#define UA_NS0ID_DATATYPENODE_ENCODING_DEFAULTXML 283 // Object -#define UA_NS0ID_DATATYPENODE_ENCODING_DEFAULTBINARY 284 // Object -#define UA_NS0ID_REFERENCENODE 285 // DataType -#define UA_NS0ID_REFERENCENODE_ENCODING_DEFAULTXML 286 // Object -#define UA_NS0ID_REFERENCENODE_ENCODING_DEFAULTBINARY 287 // Object -#define UA_NS0ID_INTEGERID 288 // DataType -#define UA_NS0ID_COUNTER 289 // DataType -#define UA_NS0ID_DURATION 290 // DataType -#define UA_NS0ID_NUMERICRANGE 291 // DataType -#define UA_NS0ID_TIME 292 // DataType -#define UA_NS0ID_DATE 293 // DataType -#define UA_NS0ID_UTCTIME 294 // DataType -#define UA_NS0ID_LOCALEID 295 // DataType -#define UA_NS0ID_ARGUMENT 296 // DataType -#define UA_NS0ID_ARGUMENT_ENCODING_DEFAULTXML 297 // Object -#define UA_NS0ID_ARGUMENT_ENCODING_DEFAULTBINARY 298 // Object -#define UA_NS0ID_STATUSRESULT 299 // DataType -#define UA_NS0ID_STATUSRESULT_ENCODING_DEFAULTXML 300 // Object -#define UA_NS0ID_STATUSRESULT_ENCODING_DEFAULTBINARY 301 // Object -#define UA_NS0ID_MESSAGESECURITYMODE 302 // DataType -#define UA_NS0ID_USERTOKENTYPE 303 // DataType -#define UA_NS0ID_USERTOKENPOLICY 304 // DataType -#define UA_NS0ID_USERTOKENPOLICY_ENCODING_DEFAULTXML 305 // Object -#define UA_NS0ID_USERTOKENPOLICY_ENCODING_DEFAULTBINARY 306 // Object -#define UA_NS0ID_APPLICATIONTYPE 307 // DataType -#define UA_NS0ID_APPLICATIONDESCRIPTION 308 // DataType -#define UA_NS0ID_APPLICATIONDESCRIPTION_ENCODING_DEFAULTXML 309 // Object -#define UA_NS0ID_APPLICATIONDESCRIPTION_ENCODING_DEFAULTBINARY 310 // Object -#define UA_NS0ID_APPLICATIONINSTANCECERTIFICATE 311 // DataType -#define UA_NS0ID_ENDPOINTDESCRIPTION 312 // DataType -#define UA_NS0ID_ENDPOINTDESCRIPTION_ENCODING_DEFAULTXML 313 // Object -#define UA_NS0ID_ENDPOINTDESCRIPTION_ENCODING_DEFAULTBINARY 314 // Object -#define UA_NS0ID_SECURITYTOKENREQUESTTYPE 315 // DataType -#define UA_NS0ID_USERIDENTITYTOKEN 316 // DataType -#define UA_NS0ID_USERIDENTITYTOKEN_ENCODING_DEFAULTXML 317 // Object -#define UA_NS0ID_USERIDENTITYTOKEN_ENCODING_DEFAULTBINARY 318 // Object -#define UA_NS0ID_ANONYMOUSIDENTITYTOKEN 319 // DataType -#define UA_NS0ID_ANONYMOUSIDENTITYTOKEN_ENCODING_DEFAULTXML 320 // Object -#define UA_NS0ID_ANONYMOUSIDENTITYTOKEN_ENCODING_DEFAULTBINARY 321 // Object -#define UA_NS0ID_USERNAMEIDENTITYTOKEN 322 // DataType -#define UA_NS0ID_USERNAMEIDENTITYTOKEN_ENCODING_DEFAULTXML 323 // Object -#define UA_NS0ID_USERNAMEIDENTITYTOKEN_ENCODING_DEFAULTBINARY 324 // Object -#define UA_NS0ID_X509IDENTITYTOKEN 325 // DataType -#define UA_NS0ID_X509IDENTITYTOKEN_ENCODING_DEFAULTXML 326 // Object -#define UA_NS0ID_X509IDENTITYTOKEN_ENCODING_DEFAULTBINARY 327 // Object -#define UA_NS0ID_ENDPOINTCONFIGURATION 331 // DataType -#define UA_NS0ID_ENDPOINTCONFIGURATION_ENCODING_DEFAULTXML 332 // Object -#define UA_NS0ID_ENDPOINTCONFIGURATION_ENCODING_DEFAULTBINARY 333 // Object -#define UA_NS0ID_BUILDINFO 338 // DataType -#define UA_NS0ID_BUILDINFO_ENCODING_DEFAULTXML 339 // Object -#define UA_NS0ID_BUILDINFO_ENCODING_DEFAULTBINARY 340 // Object -#define UA_NS0ID_SIGNEDSOFTWARECERTIFICATE 344 // DataType -#define UA_NS0ID_SIGNEDSOFTWARECERTIFICATE_ENCODING_DEFAULTXML 345 // Object -#define UA_NS0ID_SIGNEDSOFTWARECERTIFICATE_ENCODING_DEFAULTBINARY 346 // Object -#define UA_NS0ID_ATTRIBUTEWRITEMASK 347 // DataType -#define UA_NS0ID_NODEATTRIBUTESMASK 348 // DataType -#define UA_NS0ID_NODEATTRIBUTES 349 // DataType -#define UA_NS0ID_NODEATTRIBUTES_ENCODING_DEFAULTXML 350 // Object -#define UA_NS0ID_NODEATTRIBUTES_ENCODING_DEFAULTBINARY 351 // Object -#define UA_NS0ID_OBJECTATTRIBUTES 352 // DataType -#define UA_NS0ID_OBJECTATTRIBUTES_ENCODING_DEFAULTXML 353 // Object -#define UA_NS0ID_OBJECTATTRIBUTES_ENCODING_DEFAULTBINARY 354 // Object -#define UA_NS0ID_VARIABLEATTRIBUTES 355 // DataType -#define UA_NS0ID_VARIABLEATTRIBUTES_ENCODING_DEFAULTXML 356 // Object -#define UA_NS0ID_VARIABLEATTRIBUTES_ENCODING_DEFAULTBINARY 357 // Object -#define UA_NS0ID_METHODATTRIBUTES 358 // DataType -#define UA_NS0ID_METHODATTRIBUTES_ENCODING_DEFAULTXML 359 // Object -#define UA_NS0ID_METHODATTRIBUTES_ENCODING_DEFAULTBINARY 360 // Object -#define UA_NS0ID_OBJECTTYPEATTRIBUTES 361 // DataType -#define UA_NS0ID_OBJECTTYPEATTRIBUTES_ENCODING_DEFAULTXML 362 // Object -#define UA_NS0ID_OBJECTTYPEATTRIBUTES_ENCODING_DEFAULTBINARY 363 // Object -#define UA_NS0ID_VARIABLETYPEATTRIBUTES 364 // DataType -#define UA_NS0ID_VARIABLETYPEATTRIBUTES_ENCODING_DEFAULTXML 365 // Object -#define UA_NS0ID_VARIABLETYPEATTRIBUTES_ENCODING_DEFAULTBINARY 366 // Object -#define UA_NS0ID_REFERENCETYPEATTRIBUTES 367 // DataType -#define UA_NS0ID_REFERENCETYPEATTRIBUTES_ENCODING_DEFAULTXML 368 // Object -#define UA_NS0ID_REFERENCETYPEATTRIBUTES_ENCODING_DEFAULTBINARY 369 // Object -#define UA_NS0ID_DATATYPEATTRIBUTES 370 // DataType -#define UA_NS0ID_DATATYPEATTRIBUTES_ENCODING_DEFAULTXML 371 // Object -#define UA_NS0ID_DATATYPEATTRIBUTES_ENCODING_DEFAULTBINARY 372 // Object -#define UA_NS0ID_VIEWATTRIBUTES 373 // DataType -#define UA_NS0ID_VIEWATTRIBUTES_ENCODING_DEFAULTXML 374 // Object -#define UA_NS0ID_VIEWATTRIBUTES_ENCODING_DEFAULTBINARY 375 // Object -#define UA_NS0ID_ADDNODESITEM 376 // DataType -#define UA_NS0ID_ADDNODESITEM_ENCODING_DEFAULTXML 377 // Object -#define UA_NS0ID_ADDNODESITEM_ENCODING_DEFAULTBINARY 378 // Object -#define UA_NS0ID_ADDREFERENCESITEM 379 // DataType -#define UA_NS0ID_ADDREFERENCESITEM_ENCODING_DEFAULTXML 380 // Object -#define UA_NS0ID_ADDREFERENCESITEM_ENCODING_DEFAULTBINARY 381 // Object -#define UA_NS0ID_DELETENODESITEM 382 // DataType -#define UA_NS0ID_DELETENODESITEM_ENCODING_DEFAULTXML 383 // Object -#define UA_NS0ID_DELETENODESITEM_ENCODING_DEFAULTBINARY 384 // Object -#define UA_NS0ID_DELETEREFERENCESITEM 385 // DataType -#define UA_NS0ID_DELETEREFERENCESITEM_ENCODING_DEFAULTXML 386 // Object -#define UA_NS0ID_DELETEREFERENCESITEM_ENCODING_DEFAULTBINARY 387 // Object -#define UA_NS0ID_SESSIONAUTHENTICATIONTOKEN 388 // DataType -#define UA_NS0ID_REQUESTHEADER 389 // DataType -#define UA_NS0ID_REQUESTHEADER_ENCODING_DEFAULTXML 390 // Object -#define UA_NS0ID_REQUESTHEADER_ENCODING_DEFAULTBINARY 391 // Object -#define UA_NS0ID_RESPONSEHEADER 392 // DataType -#define UA_NS0ID_RESPONSEHEADER_ENCODING_DEFAULTXML 393 // Object -#define UA_NS0ID_RESPONSEHEADER_ENCODING_DEFAULTBINARY 394 // Object -#define UA_NS0ID_SERVICEFAULT 395 // DataType -#define UA_NS0ID_SERVICEFAULT_ENCODING_DEFAULTXML 396 // Object -#define UA_NS0ID_SERVICEFAULT_ENCODING_DEFAULTBINARY 397 // Object -#define UA_NS0ID_FINDSERVERSREQUEST 420 // DataType -#define UA_NS0ID_FINDSERVERSREQUEST_ENCODING_DEFAULTXML 421 // Object -#define UA_NS0ID_FINDSERVERSREQUEST_ENCODING_DEFAULTBINARY 422 // Object -#define UA_NS0ID_FINDSERVERSRESPONSE 423 // DataType -#define UA_NS0ID_FINDSERVERSRESPONSE_ENCODING_DEFAULTXML 424 // Object -#define UA_NS0ID_FINDSERVERSRESPONSE_ENCODING_DEFAULTBINARY 425 // Object -#define UA_NS0ID_GETENDPOINTSREQUEST 426 // DataType -#define UA_NS0ID_GETENDPOINTSREQUEST_ENCODING_DEFAULTXML 427 // Object -#define UA_NS0ID_GETENDPOINTSREQUEST_ENCODING_DEFAULTBINARY 428 // Object -#define UA_NS0ID_GETENDPOINTSRESPONSE 429 // DataType -#define UA_NS0ID_GETENDPOINTSRESPONSE_ENCODING_DEFAULTXML 430 // Object -#define UA_NS0ID_GETENDPOINTSRESPONSE_ENCODING_DEFAULTBINARY 431 // Object -#define UA_NS0ID_REGISTEREDSERVER 432 // DataType -#define UA_NS0ID_REGISTEREDSERVER_ENCODING_DEFAULTXML 433 // Object -#define UA_NS0ID_REGISTEREDSERVER_ENCODING_DEFAULTBINARY 434 // Object -#define UA_NS0ID_REGISTERSERVERREQUEST 435 // DataType -#define UA_NS0ID_REGISTERSERVERREQUEST_ENCODING_DEFAULTXML 436 // Object -#define UA_NS0ID_REGISTERSERVERREQUEST_ENCODING_DEFAULTBINARY 437 // Object -#define UA_NS0ID_REGISTERSERVERRESPONSE 438 // DataType -#define UA_NS0ID_REGISTERSERVERRESPONSE_ENCODING_DEFAULTXML 439 // Object -#define UA_NS0ID_REGISTERSERVERRESPONSE_ENCODING_DEFAULTBINARY 440 // Object -#define UA_NS0ID_CHANNELSECURITYTOKEN 441 // DataType -#define UA_NS0ID_CHANNELSECURITYTOKEN_ENCODING_DEFAULTXML 442 // Object -#define UA_NS0ID_CHANNELSECURITYTOKEN_ENCODING_DEFAULTBINARY 443 // Object -#define UA_NS0ID_OPENSECURECHANNELREQUEST 444 // DataType -#define UA_NS0ID_OPENSECURECHANNELREQUEST_ENCODING_DEFAULTXML 445 // Object -#define UA_NS0ID_OPENSECURECHANNELREQUEST_ENCODING_DEFAULTBINARY 446 // Object -#define UA_NS0ID_OPENSECURECHANNELRESPONSE 447 // DataType -#define UA_NS0ID_OPENSECURECHANNELRESPONSE_ENCODING_DEFAULTXML 448 // Object -#define UA_NS0ID_OPENSECURECHANNELRESPONSE_ENCODING_DEFAULTBINARY 449 // Object -#define UA_NS0ID_CLOSESECURECHANNELREQUEST 450 // DataType -#define UA_NS0ID_CLOSESECURECHANNELREQUEST_ENCODING_DEFAULTXML 451 // Object -#define UA_NS0ID_CLOSESECURECHANNELREQUEST_ENCODING_DEFAULTBINARY 452 // Object -#define UA_NS0ID_CLOSESECURECHANNELRESPONSE 453 // DataType -#define UA_NS0ID_CLOSESECURECHANNELRESPONSE_ENCODING_DEFAULTXML 454 // Object -#define UA_NS0ID_CLOSESECURECHANNELRESPONSE_ENCODING_DEFAULTBINARY 455 // Object -#define UA_NS0ID_SIGNATUREDATA 456 // DataType -#define UA_NS0ID_SIGNATUREDATA_ENCODING_DEFAULTXML 457 // Object -#define UA_NS0ID_SIGNATUREDATA_ENCODING_DEFAULTBINARY 458 // Object -#define UA_NS0ID_CREATESESSIONREQUEST 459 // DataType -#define UA_NS0ID_CREATESESSIONREQUEST_ENCODING_DEFAULTXML 460 // Object -#define UA_NS0ID_CREATESESSIONREQUEST_ENCODING_DEFAULTBINARY 461 // Object -#define UA_NS0ID_CREATESESSIONRESPONSE 462 // DataType -#define UA_NS0ID_CREATESESSIONRESPONSE_ENCODING_DEFAULTXML 463 // Object -#define UA_NS0ID_CREATESESSIONRESPONSE_ENCODING_DEFAULTBINARY 464 // Object -#define UA_NS0ID_ACTIVATESESSIONREQUEST 465 // DataType -#define UA_NS0ID_ACTIVATESESSIONREQUEST_ENCODING_DEFAULTXML 466 // Object -#define UA_NS0ID_ACTIVATESESSIONREQUEST_ENCODING_DEFAULTBINARY 467 // Object -#define UA_NS0ID_ACTIVATESESSIONRESPONSE 468 // DataType -#define UA_NS0ID_ACTIVATESESSIONRESPONSE_ENCODING_DEFAULTXML 469 // Object -#define UA_NS0ID_ACTIVATESESSIONRESPONSE_ENCODING_DEFAULTBINARY 470 // Object -#define UA_NS0ID_CLOSESESSIONREQUEST 471 // DataType -#define UA_NS0ID_CLOSESESSIONREQUEST_ENCODING_DEFAULTXML 472 // Object -#define UA_NS0ID_CLOSESESSIONREQUEST_ENCODING_DEFAULTBINARY 473 // Object -#define UA_NS0ID_CLOSESESSIONRESPONSE 474 // DataType -#define UA_NS0ID_CLOSESESSIONRESPONSE_ENCODING_DEFAULTXML 475 // Object -#define UA_NS0ID_CLOSESESSIONRESPONSE_ENCODING_DEFAULTBINARY 476 // Object -#define UA_NS0ID_CANCELREQUEST 477 // DataType -#define UA_NS0ID_CANCELREQUEST_ENCODING_DEFAULTXML 478 // Object -#define UA_NS0ID_CANCELREQUEST_ENCODING_DEFAULTBINARY 479 // Object -#define UA_NS0ID_CANCELRESPONSE 480 // DataType -#define UA_NS0ID_CANCELRESPONSE_ENCODING_DEFAULTXML 481 // Object -#define UA_NS0ID_CANCELRESPONSE_ENCODING_DEFAULTBINARY 482 // Object -#define UA_NS0ID_ADDNODESRESULT 483 // DataType -#define UA_NS0ID_ADDNODESRESULT_ENCODING_DEFAULTXML 484 // Object -#define UA_NS0ID_ADDNODESRESULT_ENCODING_DEFAULTBINARY 485 // Object -#define UA_NS0ID_ADDNODESREQUEST 486 // DataType -#define UA_NS0ID_ADDNODESREQUEST_ENCODING_DEFAULTXML 487 // Object -#define UA_NS0ID_ADDNODESREQUEST_ENCODING_DEFAULTBINARY 488 // Object -#define UA_NS0ID_ADDNODESRESPONSE 489 // DataType -#define UA_NS0ID_ADDNODESRESPONSE_ENCODING_DEFAULTXML 490 // Object -#define UA_NS0ID_ADDNODESRESPONSE_ENCODING_DEFAULTBINARY 491 // Object -#define UA_NS0ID_ADDREFERENCESREQUEST 492 // DataType -#define UA_NS0ID_ADDREFERENCESREQUEST_ENCODING_DEFAULTXML 493 // Object -#define UA_NS0ID_ADDREFERENCESREQUEST_ENCODING_DEFAULTBINARY 494 // Object -#define UA_NS0ID_ADDREFERENCESRESPONSE 495 // DataType -#define UA_NS0ID_ADDREFERENCESRESPONSE_ENCODING_DEFAULTXML 496 // Object -#define UA_NS0ID_ADDREFERENCESRESPONSE_ENCODING_DEFAULTBINARY 497 // Object -#define UA_NS0ID_DELETENODESREQUEST 498 // DataType -#define UA_NS0ID_DELETENODESREQUEST_ENCODING_DEFAULTXML 499 // Object -#define UA_NS0ID_DELETENODESREQUEST_ENCODING_DEFAULTBINARY 500 // Object -#define UA_NS0ID_DELETENODESRESPONSE 501 // DataType -#define UA_NS0ID_DELETENODESRESPONSE_ENCODING_DEFAULTXML 502 // Object -#define UA_NS0ID_DELETENODESRESPONSE_ENCODING_DEFAULTBINARY 503 // Object -#define UA_NS0ID_DELETEREFERENCESREQUEST 504 // DataType -#define UA_NS0ID_DELETEREFERENCESREQUEST_ENCODING_DEFAULTXML 505 // Object -#define UA_NS0ID_DELETEREFERENCESREQUEST_ENCODING_DEFAULTBINARY 506 // Object -#define UA_NS0ID_DELETEREFERENCESRESPONSE 507 // DataType -#define UA_NS0ID_DELETEREFERENCESRESPONSE_ENCODING_DEFAULTXML 508 // Object -#define UA_NS0ID_DELETEREFERENCESRESPONSE_ENCODING_DEFAULTBINARY 509 // Object -#define UA_NS0ID_BROWSEDIRECTION 510 // DataType -#define UA_NS0ID_VIEWDESCRIPTION 511 // DataType -#define UA_NS0ID_VIEWDESCRIPTION_ENCODING_DEFAULTXML 512 // Object -#define UA_NS0ID_VIEWDESCRIPTION_ENCODING_DEFAULTBINARY 513 // Object -#define UA_NS0ID_BROWSEDESCRIPTION 514 // DataType -#define UA_NS0ID_BROWSEDESCRIPTION_ENCODING_DEFAULTXML 515 // Object -#define UA_NS0ID_BROWSEDESCRIPTION_ENCODING_DEFAULTBINARY 516 // Object -#define UA_NS0ID_BROWSERESULTMASK 517 // DataType -#define UA_NS0ID_REFERENCEDESCRIPTION 518 // DataType -#define UA_NS0ID_REFERENCEDESCRIPTION_ENCODING_DEFAULTXML 519 // Object -#define UA_NS0ID_REFERENCEDESCRIPTION_ENCODING_DEFAULTBINARY 520 // Object -#define UA_NS0ID_CONTINUATIONPOINT 521 // DataType -#define UA_NS0ID_BROWSERESULT 522 // DataType -#define UA_NS0ID_BROWSERESULT_ENCODING_DEFAULTXML 523 // Object -#define UA_NS0ID_BROWSERESULT_ENCODING_DEFAULTBINARY 524 // Object -#define UA_NS0ID_BROWSEREQUEST 525 // DataType -#define UA_NS0ID_BROWSEREQUEST_ENCODING_DEFAULTXML 526 // Object -#define UA_NS0ID_BROWSEREQUEST_ENCODING_DEFAULTBINARY 527 // Object -#define UA_NS0ID_BROWSERESPONSE 528 // DataType -#define UA_NS0ID_BROWSERESPONSE_ENCODING_DEFAULTXML 529 // Object -#define UA_NS0ID_BROWSERESPONSE_ENCODING_DEFAULTBINARY 530 // Object -#define UA_NS0ID_BROWSENEXTREQUEST 531 // DataType -#define UA_NS0ID_BROWSENEXTREQUEST_ENCODING_DEFAULTXML 532 // Object -#define UA_NS0ID_BROWSENEXTREQUEST_ENCODING_DEFAULTBINARY 533 // Object -#define UA_NS0ID_BROWSENEXTRESPONSE 534 // DataType -#define UA_NS0ID_BROWSENEXTRESPONSE_ENCODING_DEFAULTXML 535 // Object -#define UA_NS0ID_BROWSENEXTRESPONSE_ENCODING_DEFAULTBINARY 536 // Object -#define UA_NS0ID_RELATIVEPATHELEMENT 537 // DataType -#define UA_NS0ID_RELATIVEPATHELEMENT_ENCODING_DEFAULTXML 538 // Object -#define UA_NS0ID_RELATIVEPATHELEMENT_ENCODING_DEFAULTBINARY 539 // Object -#define UA_NS0ID_RELATIVEPATH 540 // DataType -#define UA_NS0ID_RELATIVEPATH_ENCODING_DEFAULTXML 541 // Object -#define UA_NS0ID_RELATIVEPATH_ENCODING_DEFAULTBINARY 542 // Object -#define UA_NS0ID_BROWSEPATH 543 // DataType -#define UA_NS0ID_BROWSEPATH_ENCODING_DEFAULTXML 544 // Object -#define UA_NS0ID_BROWSEPATH_ENCODING_DEFAULTBINARY 545 // Object -#define UA_NS0ID_BROWSEPATHTARGET 546 // DataType -#define UA_NS0ID_BROWSEPATHTARGET_ENCODING_DEFAULTXML 547 // Object -#define UA_NS0ID_BROWSEPATHTARGET_ENCODING_DEFAULTBINARY 548 // Object -#define UA_NS0ID_BROWSEPATHRESULT 549 // DataType -#define UA_NS0ID_BROWSEPATHRESULT_ENCODING_DEFAULTXML 550 // Object -#define UA_NS0ID_BROWSEPATHRESULT_ENCODING_DEFAULTBINARY 551 // Object -#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSREQUEST 552 // DataType -#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSREQUEST_ENCODING_DEFAULTXML 553 // Object -#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSREQUEST_ENCODING_DEFAULTBINARY 554 // Object -#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE 555 // DataType -#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE_ENCODING_DEFAULTXML 556 // Object -#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE_ENCODING_DEFAULTBINARY 557 // Object -#define UA_NS0ID_REGISTERNODESREQUEST 558 // DataType -#define UA_NS0ID_REGISTERNODESREQUEST_ENCODING_DEFAULTXML 559 // Object -#define UA_NS0ID_REGISTERNODESREQUEST_ENCODING_DEFAULTBINARY 560 // Object -#define UA_NS0ID_REGISTERNODESRESPONSE 561 // DataType -#define UA_NS0ID_REGISTERNODESRESPONSE_ENCODING_DEFAULTXML 562 // Object -#define UA_NS0ID_REGISTERNODESRESPONSE_ENCODING_DEFAULTBINARY 563 // Object -#define UA_NS0ID_UNREGISTERNODESREQUEST 564 // DataType -#define UA_NS0ID_UNREGISTERNODESREQUEST_ENCODING_DEFAULTXML 565 // Object -#define UA_NS0ID_UNREGISTERNODESREQUEST_ENCODING_DEFAULTBINARY 566 // Object -#define UA_NS0ID_UNREGISTERNODESRESPONSE 567 // DataType -#define UA_NS0ID_UNREGISTERNODESRESPONSE_ENCODING_DEFAULTXML 568 // Object -#define UA_NS0ID_UNREGISTERNODESRESPONSE_ENCODING_DEFAULTBINARY 569 // Object -#define UA_NS0ID_QUERYDATADESCRIPTION 570 // DataType -#define UA_NS0ID_QUERYDATADESCRIPTION_ENCODING_DEFAULTXML 571 // Object -#define UA_NS0ID_QUERYDATADESCRIPTION_ENCODING_DEFAULTBINARY 572 // Object -#define UA_NS0ID_NODETYPEDESCRIPTION 573 // DataType -#define UA_NS0ID_NODETYPEDESCRIPTION_ENCODING_DEFAULTXML 574 // Object -#define UA_NS0ID_NODETYPEDESCRIPTION_ENCODING_DEFAULTBINARY 575 // Object -#define UA_NS0ID_FILTEROPERATOR 576 // DataType -#define UA_NS0ID_QUERYDATASET 577 // DataType -#define UA_NS0ID_QUERYDATASET_ENCODING_DEFAULTXML 578 // Object -#define UA_NS0ID_QUERYDATASET_ENCODING_DEFAULTBINARY 579 // Object -#define UA_NS0ID_NODEREFERENCE 580 // DataType -#define UA_NS0ID_NODEREFERENCE_ENCODING_DEFAULTXML 581 // Object -#define UA_NS0ID_NODEREFERENCE_ENCODING_DEFAULTBINARY 582 // Object -#define UA_NS0ID_CONTENTFILTERELEMENT 583 // DataType -#define UA_NS0ID_CONTENTFILTERELEMENT_ENCODING_DEFAULTXML 584 // Object -#define UA_NS0ID_CONTENTFILTERELEMENT_ENCODING_DEFAULTBINARY 585 // Object -#define UA_NS0ID_CONTENTFILTER 586 // DataType -#define UA_NS0ID_CONTENTFILTER_ENCODING_DEFAULTXML 587 // Object -#define UA_NS0ID_CONTENTFILTER_ENCODING_DEFAULTBINARY 588 // Object -#define UA_NS0ID_FILTEROPERAND 589 // DataType -#define UA_NS0ID_FILTEROPERAND_ENCODING_DEFAULTXML 590 // Object -#define UA_NS0ID_FILTEROPERAND_ENCODING_DEFAULTBINARY 591 // Object -#define UA_NS0ID_ELEMENTOPERAND 592 // DataType -#define UA_NS0ID_ELEMENTOPERAND_ENCODING_DEFAULTXML 593 // Object -#define UA_NS0ID_ELEMENTOPERAND_ENCODING_DEFAULTBINARY 594 // Object -#define UA_NS0ID_LITERALOPERAND 595 // DataType -#define UA_NS0ID_LITERALOPERAND_ENCODING_DEFAULTXML 596 // Object -#define UA_NS0ID_LITERALOPERAND_ENCODING_DEFAULTBINARY 597 // Object -#define UA_NS0ID_ATTRIBUTEOPERAND 598 // DataType -#define UA_NS0ID_ATTRIBUTEOPERAND_ENCODING_DEFAULTXML 599 // Object -#define UA_NS0ID_ATTRIBUTEOPERAND_ENCODING_DEFAULTBINARY 600 // Object -#define UA_NS0ID_SIMPLEATTRIBUTEOPERAND 601 // DataType -#define UA_NS0ID_SIMPLEATTRIBUTEOPERAND_ENCODING_DEFAULTXML 602 // Object -#define UA_NS0ID_SIMPLEATTRIBUTEOPERAND_ENCODING_DEFAULTBINARY 603 // Object -#define UA_NS0ID_CONTENTFILTERELEMENTRESULT 604 // DataType -#define UA_NS0ID_CONTENTFILTERELEMENTRESULT_ENCODING_DEFAULTXML 605 // Object -#define UA_NS0ID_CONTENTFILTERELEMENTRESULT_ENCODING_DEFAULTBINARY 606 // Object -#define UA_NS0ID_CONTENTFILTERRESULT 607 // DataType -#define UA_NS0ID_CONTENTFILTERRESULT_ENCODING_DEFAULTXML 608 // Object -#define UA_NS0ID_CONTENTFILTERRESULT_ENCODING_DEFAULTBINARY 609 // Object -#define UA_NS0ID_PARSINGRESULT 610 // DataType -#define UA_NS0ID_PARSINGRESULT_ENCODING_DEFAULTXML 611 // Object -#define UA_NS0ID_PARSINGRESULT_ENCODING_DEFAULTBINARY 612 // Object -#define UA_NS0ID_QUERYFIRSTREQUEST 613 // DataType -#define UA_NS0ID_QUERYFIRSTREQUEST_ENCODING_DEFAULTXML 614 // Object -#define UA_NS0ID_QUERYFIRSTREQUEST_ENCODING_DEFAULTBINARY 615 // Object -#define UA_NS0ID_QUERYFIRSTRESPONSE 616 // DataType -#define UA_NS0ID_QUERYFIRSTRESPONSE_ENCODING_DEFAULTXML 617 // Object -#define UA_NS0ID_QUERYFIRSTRESPONSE_ENCODING_DEFAULTBINARY 618 // Object -#define UA_NS0ID_QUERYNEXTREQUEST 619 // DataType -#define UA_NS0ID_QUERYNEXTREQUEST_ENCODING_DEFAULTXML 620 // Object -#define UA_NS0ID_QUERYNEXTREQUEST_ENCODING_DEFAULTBINARY 621 // Object -#define UA_NS0ID_QUERYNEXTRESPONSE 622 // DataType -#define UA_NS0ID_QUERYNEXTRESPONSE_ENCODING_DEFAULTXML 623 // Object -#define UA_NS0ID_QUERYNEXTRESPONSE_ENCODING_DEFAULTBINARY 624 // Object -#define UA_NS0ID_TIMESTAMPSTORETURN 625 // DataType -#define UA_NS0ID_READVALUEID 626 // DataType -#define UA_NS0ID_READVALUEID_ENCODING_DEFAULTXML 627 // Object -#define UA_NS0ID_READVALUEID_ENCODING_DEFAULTBINARY 628 // Object -#define UA_NS0ID_READREQUEST 629 // DataType -#define UA_NS0ID_READREQUEST_ENCODING_DEFAULTXML 630 // Object -#define UA_NS0ID_READREQUEST_ENCODING_DEFAULTBINARY 631 // Object -#define UA_NS0ID_READRESPONSE 632 // DataType -#define UA_NS0ID_READRESPONSE_ENCODING_DEFAULTXML 633 // Object -#define UA_NS0ID_READRESPONSE_ENCODING_DEFAULTBINARY 634 // Object -#define UA_NS0ID_HISTORYREADVALUEID 635 // DataType -#define UA_NS0ID_HISTORYREADVALUEID_ENCODING_DEFAULTXML 636 // Object -#define UA_NS0ID_HISTORYREADVALUEID_ENCODING_DEFAULTBINARY 637 // Object -#define UA_NS0ID_HISTORYREADRESULT 638 // DataType -#define UA_NS0ID_HISTORYREADRESULT_ENCODING_DEFAULTXML 639 // Object -#define UA_NS0ID_HISTORYREADRESULT_ENCODING_DEFAULTBINARY 640 // Object -#define UA_NS0ID_HISTORYREADDETAILS 641 // DataType -#define UA_NS0ID_HISTORYREADDETAILS_ENCODING_DEFAULTXML 642 // Object -#define UA_NS0ID_HISTORYREADDETAILS_ENCODING_DEFAULTBINARY 643 // Object -#define UA_NS0ID_READEVENTDETAILS 644 // DataType -#define UA_NS0ID_READEVENTDETAILS_ENCODING_DEFAULTXML 645 // Object -#define UA_NS0ID_READEVENTDETAILS_ENCODING_DEFAULTBINARY 646 // Object -#define UA_NS0ID_READRAWMODIFIEDDETAILS 647 // DataType -#define UA_NS0ID_READRAWMODIFIEDDETAILS_ENCODING_DEFAULTXML 648 // Object -#define UA_NS0ID_READRAWMODIFIEDDETAILS_ENCODING_DEFAULTBINARY 649 // Object -#define UA_NS0ID_READPROCESSEDDETAILS 650 // DataType -#define UA_NS0ID_READPROCESSEDDETAILS_ENCODING_DEFAULTXML 651 // Object -#define UA_NS0ID_READPROCESSEDDETAILS_ENCODING_DEFAULTBINARY 652 // Object -#define UA_NS0ID_READATTIMEDETAILS 653 // DataType -#define UA_NS0ID_READATTIMEDETAILS_ENCODING_DEFAULTXML 654 // Object -#define UA_NS0ID_READATTIMEDETAILS_ENCODING_DEFAULTBINARY 655 // Object -#define UA_NS0ID_HISTORYDATA 656 // DataType -#define UA_NS0ID_HISTORYDATA_ENCODING_DEFAULTXML 657 // Object -#define UA_NS0ID_HISTORYDATA_ENCODING_DEFAULTBINARY 658 // Object -#define UA_NS0ID_HISTORYEVENT 659 // DataType -#define UA_NS0ID_HISTORYEVENT_ENCODING_DEFAULTXML 660 // Object -#define UA_NS0ID_HISTORYEVENT_ENCODING_DEFAULTBINARY 661 // Object -#define UA_NS0ID_HISTORYREADREQUEST 662 // DataType -#define UA_NS0ID_HISTORYREADREQUEST_ENCODING_DEFAULTXML 663 // Object -#define UA_NS0ID_HISTORYREADREQUEST_ENCODING_DEFAULTBINARY 664 // Object -#define UA_NS0ID_HISTORYREADRESPONSE 665 // DataType -#define UA_NS0ID_HISTORYREADRESPONSE_ENCODING_DEFAULTXML 666 // Object -#define UA_NS0ID_HISTORYREADRESPONSE_ENCODING_DEFAULTBINARY 667 // Object -#define UA_NS0ID_WRITEVALUE 668 // DataType -#define UA_NS0ID_WRITEVALUE_ENCODING_DEFAULTXML 669 // Object -#define UA_NS0ID_WRITEVALUE_ENCODING_DEFAULTBINARY 670 // Object -#define UA_NS0ID_WRITEREQUEST 671 // DataType -#define UA_NS0ID_WRITEREQUEST_ENCODING_DEFAULTXML 672 // Object -#define UA_NS0ID_WRITEREQUEST_ENCODING_DEFAULTBINARY 673 // Object -#define UA_NS0ID_WRITERESPONSE 674 // DataType -#define UA_NS0ID_WRITERESPONSE_ENCODING_DEFAULTXML 675 // Object -#define UA_NS0ID_WRITERESPONSE_ENCODING_DEFAULTBINARY 676 // Object -#define UA_NS0ID_HISTORYUPDATEDETAILS 677 // DataType -#define UA_NS0ID_HISTORYUPDATEDETAILS_ENCODING_DEFAULTXML 678 // Object -#define UA_NS0ID_HISTORYUPDATEDETAILS_ENCODING_DEFAULTBINARY 679 // Object -#define UA_NS0ID_UPDATEDATADETAILS 680 // DataType -#define UA_NS0ID_UPDATEDATADETAILS_ENCODING_DEFAULTXML 681 // Object -#define UA_NS0ID_UPDATEDATADETAILS_ENCODING_DEFAULTBINARY 682 // Object -#define UA_NS0ID_UPDATEEVENTDETAILS 683 // DataType -#define UA_NS0ID_UPDATEEVENTDETAILS_ENCODING_DEFAULTXML 684 // Object -#define UA_NS0ID_UPDATEEVENTDETAILS_ENCODING_DEFAULTBINARY 685 // Object -#define UA_NS0ID_DELETERAWMODIFIEDDETAILS 686 // DataType -#define UA_NS0ID_DELETERAWMODIFIEDDETAILS_ENCODING_DEFAULTXML 687 // Object -#define UA_NS0ID_DELETERAWMODIFIEDDETAILS_ENCODING_DEFAULTBINARY 688 // Object -#define UA_NS0ID_DELETEATTIMEDETAILS 689 // DataType -#define UA_NS0ID_DELETEATTIMEDETAILS_ENCODING_DEFAULTXML 690 // Object -#define UA_NS0ID_DELETEATTIMEDETAILS_ENCODING_DEFAULTBINARY 691 // Object -#define UA_NS0ID_DELETEEVENTDETAILS 692 // DataType -#define UA_NS0ID_DELETEEVENTDETAILS_ENCODING_DEFAULTXML 693 // Object -#define UA_NS0ID_DELETEEVENTDETAILS_ENCODING_DEFAULTBINARY 694 // Object -#define UA_NS0ID_HISTORYUPDATERESULT 695 // DataType -#define UA_NS0ID_HISTORYUPDATERESULT_ENCODING_DEFAULTXML 696 // Object -#define UA_NS0ID_HISTORYUPDATERESULT_ENCODING_DEFAULTBINARY 697 // Object -#define UA_NS0ID_HISTORYUPDATEREQUEST 698 // DataType -#define UA_NS0ID_HISTORYUPDATEREQUEST_ENCODING_DEFAULTXML 699 // Object -#define UA_NS0ID_HISTORYUPDATEREQUEST_ENCODING_DEFAULTBINARY 700 // Object -#define UA_NS0ID_HISTORYUPDATERESPONSE 701 // DataType -#define UA_NS0ID_HISTORYUPDATERESPONSE_ENCODING_DEFAULTXML 702 // Object -#define UA_NS0ID_HISTORYUPDATERESPONSE_ENCODING_DEFAULTBINARY 703 // Object -#define UA_NS0ID_CALLMETHODREQUEST 704 // DataType -#define UA_NS0ID_CALLMETHODREQUEST_ENCODING_DEFAULTXML 705 // Object -#define UA_NS0ID_CALLMETHODREQUEST_ENCODING_DEFAULTBINARY 706 // Object -#define UA_NS0ID_CALLMETHODRESULT 707 // DataType -#define UA_NS0ID_CALLMETHODRESULT_ENCODING_DEFAULTXML 708 // Object -#define UA_NS0ID_CALLMETHODRESULT_ENCODING_DEFAULTBINARY 709 // Object -#define UA_NS0ID_CALLREQUEST 710 // DataType -#define UA_NS0ID_CALLREQUEST_ENCODING_DEFAULTXML 711 // Object -#define UA_NS0ID_CALLREQUEST_ENCODING_DEFAULTBINARY 712 // Object -#define UA_NS0ID_CALLRESPONSE 713 // DataType -#define UA_NS0ID_CALLRESPONSE_ENCODING_DEFAULTXML 714 // Object -#define UA_NS0ID_CALLRESPONSE_ENCODING_DEFAULTBINARY 715 // Object -#define UA_NS0ID_MONITORINGMODE 716 // DataType -#define UA_NS0ID_DATACHANGETRIGGER 717 // DataType -#define UA_NS0ID_DEADBANDTYPE 718 // DataType -#define UA_NS0ID_MONITORINGFILTER 719 // DataType -#define UA_NS0ID_MONITORINGFILTER_ENCODING_DEFAULTXML 720 // Object -#define UA_NS0ID_MONITORINGFILTER_ENCODING_DEFAULTBINARY 721 // Object -#define UA_NS0ID_DATACHANGEFILTER 722 // DataType -#define UA_NS0ID_DATACHANGEFILTER_ENCODING_DEFAULTXML 723 // Object -#define UA_NS0ID_DATACHANGEFILTER_ENCODING_DEFAULTBINARY 724 // Object -#define UA_NS0ID_EVENTFILTER 725 // DataType -#define UA_NS0ID_EVENTFILTER_ENCODING_DEFAULTXML 726 // Object -#define UA_NS0ID_EVENTFILTER_ENCODING_DEFAULTBINARY 727 // Object -#define UA_NS0ID_AGGREGATEFILTER 728 // DataType -#define UA_NS0ID_AGGREGATEFILTER_ENCODING_DEFAULTXML 729 // Object -#define UA_NS0ID_AGGREGATEFILTER_ENCODING_DEFAULTBINARY 730 // Object -#define UA_NS0ID_MONITORINGFILTERRESULT 731 // DataType -#define UA_NS0ID_MONITORINGFILTERRESULT_ENCODING_DEFAULTXML 732 // Object -#define UA_NS0ID_MONITORINGFILTERRESULT_ENCODING_DEFAULTBINARY 733 // Object -#define UA_NS0ID_EVENTFILTERRESULT 734 // DataType -#define UA_NS0ID_EVENTFILTERRESULT_ENCODING_DEFAULTXML 735 // Object -#define UA_NS0ID_EVENTFILTERRESULT_ENCODING_DEFAULTBINARY 736 // Object -#define UA_NS0ID_AGGREGATEFILTERRESULT 737 // DataType -#define UA_NS0ID_AGGREGATEFILTERRESULT_ENCODING_DEFAULTXML 738 // Object -#define UA_NS0ID_AGGREGATEFILTERRESULT_ENCODING_DEFAULTBINARY 739 // Object -#define UA_NS0ID_MONITORINGPARAMETERS 740 // DataType -#define UA_NS0ID_MONITORINGPARAMETERS_ENCODING_DEFAULTXML 741 // Object -#define UA_NS0ID_MONITORINGPARAMETERS_ENCODING_DEFAULTBINARY 742 // Object -#define UA_NS0ID_MONITOREDITEMCREATEREQUEST 743 // DataType -#define UA_NS0ID_MONITOREDITEMCREATEREQUEST_ENCODING_DEFAULTXML 744 // Object -#define UA_NS0ID_MONITOREDITEMCREATEREQUEST_ENCODING_DEFAULTBINARY 745 // Object -#define UA_NS0ID_MONITOREDITEMCREATERESULT 746 // DataType -#define UA_NS0ID_MONITOREDITEMCREATERESULT_ENCODING_DEFAULTXML 747 // Object -#define UA_NS0ID_MONITOREDITEMCREATERESULT_ENCODING_DEFAULTBINARY 748 // Object -#define UA_NS0ID_CREATEMONITOREDITEMSREQUEST 749 // DataType -#define UA_NS0ID_CREATEMONITOREDITEMSREQUEST_ENCODING_DEFAULTXML 750 // Object -#define UA_NS0ID_CREATEMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY 751 // Object -#define UA_NS0ID_CREATEMONITOREDITEMSRESPONSE 752 // DataType -#define UA_NS0ID_CREATEMONITOREDITEMSRESPONSE_ENCODING_DEFAULTXML 753 // Object -#define UA_NS0ID_CREATEMONITOREDITEMSRESPONSE_ENCODING_DEFAULTBINARY 754 // Object -#define UA_NS0ID_MONITOREDITEMMODIFYREQUEST 755 // DataType -#define UA_NS0ID_MONITOREDITEMMODIFYREQUEST_ENCODING_DEFAULTXML 756 // Object -#define UA_NS0ID_MONITOREDITEMMODIFYREQUEST_ENCODING_DEFAULTBINARY 757 // Object -#define UA_NS0ID_MONITOREDITEMMODIFYRESULT 758 // DataType -#define UA_NS0ID_MONITOREDITEMMODIFYRESULT_ENCODING_DEFAULTXML 759 // Object -#define UA_NS0ID_MONITOREDITEMMODIFYRESULT_ENCODING_DEFAULTBINARY 760 // Object -#define UA_NS0ID_MODIFYMONITOREDITEMSREQUEST 761 // DataType -#define UA_NS0ID_MODIFYMONITOREDITEMSREQUEST_ENCODING_DEFAULTXML 762 // Object -#define UA_NS0ID_MODIFYMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY 763 // Object -#define UA_NS0ID_MODIFYMONITOREDITEMSRESPONSE 764 // DataType -#define UA_NS0ID_MODIFYMONITOREDITEMSRESPONSE_ENCODING_DEFAULTXML 765 // Object -#define UA_NS0ID_MODIFYMONITOREDITEMSRESPONSE_ENCODING_DEFAULTBINARY 766 // Object -#define UA_NS0ID_SETMONITORINGMODEREQUEST 767 // DataType -#define UA_NS0ID_SETMONITORINGMODEREQUEST_ENCODING_DEFAULTXML 768 // Object -#define UA_NS0ID_SETMONITORINGMODEREQUEST_ENCODING_DEFAULTBINARY 769 // Object -#define UA_NS0ID_SETMONITORINGMODERESPONSE 770 // DataType -#define UA_NS0ID_SETMONITORINGMODERESPONSE_ENCODING_DEFAULTXML 771 // Object -#define UA_NS0ID_SETMONITORINGMODERESPONSE_ENCODING_DEFAULTBINARY 772 // Object -#define UA_NS0ID_SETTRIGGERINGREQUEST 773 // DataType -#define UA_NS0ID_SETTRIGGERINGREQUEST_ENCODING_DEFAULTXML 774 // Object -#define UA_NS0ID_SETTRIGGERINGREQUEST_ENCODING_DEFAULTBINARY 775 // Object -#define UA_NS0ID_SETTRIGGERINGRESPONSE 776 // DataType -#define UA_NS0ID_SETTRIGGERINGRESPONSE_ENCODING_DEFAULTXML 777 // Object -#define UA_NS0ID_SETTRIGGERINGRESPONSE_ENCODING_DEFAULTBINARY 778 // Object -#define UA_NS0ID_DELETEMONITOREDITEMSREQUEST 779 // DataType -#define UA_NS0ID_DELETEMONITOREDITEMSREQUEST_ENCODING_DEFAULTXML 780 // Object -#define UA_NS0ID_DELETEMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY 781 // Object -#define UA_NS0ID_DELETEMONITOREDITEMSRESPONSE 782 // DataType -#define UA_NS0ID_DELETEMONITOREDITEMSRESPONSE_ENCODING_DEFAULTXML 783 // Object -#define UA_NS0ID_DELETEMONITOREDITEMSRESPONSE_ENCODING_DEFAULTBINARY 784 // Object -#define UA_NS0ID_CREATESUBSCRIPTIONREQUEST 785 // DataType -#define UA_NS0ID_CREATESUBSCRIPTIONREQUEST_ENCODING_DEFAULTXML 786 // Object -#define UA_NS0ID_CREATESUBSCRIPTIONREQUEST_ENCODING_DEFAULTBINARY 787 // Object -#define UA_NS0ID_CREATESUBSCRIPTIONRESPONSE 788 // DataType -#define UA_NS0ID_CREATESUBSCRIPTIONRESPONSE_ENCODING_DEFAULTXML 789 // Object -#define UA_NS0ID_CREATESUBSCRIPTIONRESPONSE_ENCODING_DEFAULTBINARY 790 // Object -#define UA_NS0ID_MODIFYSUBSCRIPTIONREQUEST 791 // DataType -#define UA_NS0ID_MODIFYSUBSCRIPTIONREQUEST_ENCODING_DEFAULTXML 792 // Object -#define UA_NS0ID_MODIFYSUBSCRIPTIONREQUEST_ENCODING_DEFAULTBINARY 793 // Object -#define UA_NS0ID_MODIFYSUBSCRIPTIONRESPONSE 794 // DataType -#define UA_NS0ID_MODIFYSUBSCRIPTIONRESPONSE_ENCODING_DEFAULTXML 795 // Object -#define UA_NS0ID_MODIFYSUBSCRIPTIONRESPONSE_ENCODING_DEFAULTBINARY 796 // Object -#define UA_NS0ID_SETPUBLISHINGMODEREQUEST 797 // DataType -#define UA_NS0ID_SETPUBLISHINGMODEREQUEST_ENCODING_DEFAULTXML 798 // Object -#define UA_NS0ID_SETPUBLISHINGMODEREQUEST_ENCODING_DEFAULTBINARY 799 // Object -#define UA_NS0ID_SETPUBLISHINGMODERESPONSE 800 // DataType -#define UA_NS0ID_SETPUBLISHINGMODERESPONSE_ENCODING_DEFAULTXML 801 // Object -#define UA_NS0ID_SETPUBLISHINGMODERESPONSE_ENCODING_DEFAULTBINARY 802 // Object -#define UA_NS0ID_NOTIFICATIONMESSAGE 803 // DataType -#define UA_NS0ID_NOTIFICATIONMESSAGE_ENCODING_DEFAULTXML 804 // Object -#define UA_NS0ID_NOTIFICATIONMESSAGE_ENCODING_DEFAULTBINARY 805 // Object -#define UA_NS0ID_MONITOREDITEMNOTIFICATION 806 // DataType -#define UA_NS0ID_MONITOREDITEMNOTIFICATION_ENCODING_DEFAULTXML 807 // Object -#define UA_NS0ID_MONITOREDITEMNOTIFICATION_ENCODING_DEFAULTBINARY 808 // Object -#define UA_NS0ID_DATACHANGENOTIFICATION 809 // DataType -#define UA_NS0ID_DATACHANGENOTIFICATION_ENCODING_DEFAULTXML 810 // Object -#define UA_NS0ID_DATACHANGENOTIFICATION_ENCODING_DEFAULTBINARY 811 // Object -#define UA_NS0ID_STATUSCHANGENOTIFICATION 818 // DataType -#define UA_NS0ID_STATUSCHANGENOTIFICATION_ENCODING_DEFAULTXML 819 // Object -#define UA_NS0ID_STATUSCHANGENOTIFICATION_ENCODING_DEFAULTBINARY 820 // Object -#define UA_NS0ID_SUBSCRIPTIONACKNOWLEDGEMENT 821 // DataType -#define UA_NS0ID_SUBSCRIPTIONACKNOWLEDGEMENT_ENCODING_DEFAULTXML 822 // Object -#define UA_NS0ID_SUBSCRIPTIONACKNOWLEDGEMENT_ENCODING_DEFAULTBINARY 823 // Object -#define UA_NS0ID_PUBLISHREQUEST 824 // DataType -#define UA_NS0ID_PUBLISHREQUEST_ENCODING_DEFAULTXML 825 // Object -#define UA_NS0ID_PUBLISHREQUEST_ENCODING_DEFAULTBINARY 826 // Object -#define UA_NS0ID_PUBLISHRESPONSE 827 // DataType -#define UA_NS0ID_PUBLISHRESPONSE_ENCODING_DEFAULTXML 828 // Object -#define UA_NS0ID_PUBLISHRESPONSE_ENCODING_DEFAULTBINARY 829 // Object -#define UA_NS0ID_REPUBLISHREQUEST 830 // DataType -#define UA_NS0ID_REPUBLISHREQUEST_ENCODING_DEFAULTXML 831 // Object -#define UA_NS0ID_REPUBLISHREQUEST_ENCODING_DEFAULTBINARY 832 // Object -#define UA_NS0ID_REPUBLISHRESPONSE 833 // DataType -#define UA_NS0ID_REPUBLISHRESPONSE_ENCODING_DEFAULTXML 834 // Object -#define UA_NS0ID_REPUBLISHRESPONSE_ENCODING_DEFAULTBINARY 835 // Object -#define UA_NS0ID_TRANSFERRESULT 836 // DataType -#define UA_NS0ID_TRANSFERRESULT_ENCODING_DEFAULTXML 837 // Object -#define UA_NS0ID_TRANSFERRESULT_ENCODING_DEFAULTBINARY 838 // Object -#define UA_NS0ID_TRANSFERSUBSCRIPTIONSREQUEST 839 // DataType -#define UA_NS0ID_TRANSFERSUBSCRIPTIONSREQUEST_ENCODING_DEFAULTXML 840 // Object -#define UA_NS0ID_TRANSFERSUBSCRIPTIONSREQUEST_ENCODING_DEFAULTBINARY 841 // Object -#define UA_NS0ID_TRANSFERSUBSCRIPTIONSRESPONSE 842 // DataType -#define UA_NS0ID_TRANSFERSUBSCRIPTIONSRESPONSE_ENCODING_DEFAULTXML 843 // Object -#define UA_NS0ID_TRANSFERSUBSCRIPTIONSRESPONSE_ENCODING_DEFAULTBINARY 844 // Object -#define UA_NS0ID_DELETESUBSCRIPTIONSREQUEST 845 // DataType -#define UA_NS0ID_DELETESUBSCRIPTIONSREQUEST_ENCODING_DEFAULTXML 846 // Object -#define UA_NS0ID_DELETESUBSCRIPTIONSREQUEST_ENCODING_DEFAULTBINARY 847 // Object -#define UA_NS0ID_DELETESUBSCRIPTIONSRESPONSE 848 // DataType -#define UA_NS0ID_DELETESUBSCRIPTIONSRESPONSE_ENCODING_DEFAULTXML 849 // Object -#define UA_NS0ID_DELETESUBSCRIPTIONSRESPONSE_ENCODING_DEFAULTBINARY 850 // Object -#define UA_NS0ID_REDUNDANCYSUPPORT 851 // DataType -#define UA_NS0ID_SERVERSTATE 852 // DataType -#define UA_NS0ID_REDUNDANTSERVERDATATYPE 853 // DataType -#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSDATATYPE 856 // DataType -#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYDATATYPE 859 // DataType -#define UA_NS0ID_SERVERSTATUSDATATYPE 862 // DataType -#define UA_NS0ID_SESSIONDIAGNOSTICSDATATYPE 865 // DataType -#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSDATATYPE 868 // DataType -#define UA_NS0ID_SERVICECOUNTERDATATYPE 871 // DataType -#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSDATATYPE 874 // DataType -#define UA_NS0ID_MODELCHANGESTRUCTUREDATATYPE 877 // DataType -#define UA_NS0ID_RANGE 884 // DataType -#define UA_NS0ID_RANGE_ENCODING_DEFAULTXML 885 // Object -#define UA_NS0ID_RANGE_ENCODING_DEFAULTBINARY 886 // Object -#define UA_NS0ID_EUINFORMATION 887 // DataType -#define UA_NS0ID_EUINFORMATION_ENCODING_DEFAULTXML 888 // Object -#define UA_NS0ID_EUINFORMATION_ENCODING_DEFAULTBINARY 889 // Object -#define UA_NS0ID_EXCEPTIONDEVIATIONFORMAT 890 // DataType -#define UA_NS0ID_ANNOTATION 891 // DataType -#define UA_NS0ID_ANNOTATION_ENCODING_DEFAULTXML 892 // Object -#define UA_NS0ID_ANNOTATION_ENCODING_DEFAULTBINARY 893 // Object -#define UA_NS0ID_PROGRAMDIAGNOSTICDATATYPE 894 // DataType -#define UA_NS0ID_SEMANTICCHANGESTRUCTUREDATATYPE 897 // DataType -#define UA_NS0ID_EVENTNOTIFICATIONLIST 914 // DataType -#define UA_NS0ID_EVENTNOTIFICATIONLIST_ENCODING_DEFAULTXML 915 // Object -#define UA_NS0ID_EVENTNOTIFICATIONLIST_ENCODING_DEFAULTBINARY 916 // Object -#define UA_NS0ID_EVENTFIELDLIST 917 // DataType -#define UA_NS0ID_EVENTFIELDLIST_ENCODING_DEFAULTXML 918 // Object -#define UA_NS0ID_EVENTFIELDLIST_ENCODING_DEFAULTBINARY 919 // Object -#define UA_NS0ID_HISTORYEVENTFIELDLIST 920 // DataType -#define UA_NS0ID_HISTORYEVENTFIELDLIST_ENCODING_DEFAULTXML 921 // Object -#define UA_NS0ID_HISTORYEVENTFIELDLIST_ENCODING_DEFAULTBINARY 922 // Object -#define UA_NS0ID_ISSUEDIDENTITYTOKEN 938 // DataType -#define UA_NS0ID_ISSUEDIDENTITYTOKEN_ENCODING_DEFAULTXML 939 // Object -#define UA_NS0ID_ISSUEDIDENTITYTOKEN_ENCODING_DEFAULTBINARY 940 // Object -#define UA_NS0ID_NOTIFICATIONDATA 945 // DataType -#define UA_NS0ID_NOTIFICATIONDATA_ENCODING_DEFAULTXML 946 // Object -#define UA_NS0ID_NOTIFICATIONDATA_ENCODING_DEFAULTBINARY 947 // Object -#define UA_NS0ID_AGGREGATECONFIGURATION 948 // DataType -#define UA_NS0ID_AGGREGATECONFIGURATION_ENCODING_DEFAULTXML 949 // Object -#define UA_NS0ID_AGGREGATECONFIGURATION_ENCODING_DEFAULTBINARY 950 // Object -#define UA_NS0ID_IMAGEBMP 2000 // DataType -#define UA_NS0ID_IMAGEGIF 2001 // DataType -#define UA_NS0ID_IMAGEJPG 2002 // DataType -#define UA_NS0ID_IMAGEPNG 2003 // DataType -#define UA_NS0ID_SERVERTYPE 2004 // ObjectType -#define UA_NS0ID_SERVERCAPABILITIESTYPE 2013 // ObjectType -#define UA_NS0ID_SERVERDIAGNOSTICSTYPE 2020 // ObjectType -#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE 2026 // ObjectType -#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE 2029 // ObjectType -#define UA_NS0ID_VENDORSERVERINFOTYPE 2033 // ObjectType -#define UA_NS0ID_SERVERREDUNDANCYTYPE 2034 // ObjectType -#define UA_NS0ID_TRANSPARENTREDUNDANCYTYPE 2036 // ObjectType -#define UA_NS0ID_NONTRANSPARENTREDUNDANCYTYPE 2039 // ObjectType -#define UA_NS0ID_BASEEVENTTYPE 2041 // ObjectType -#define UA_NS0ID_AUDITEVENTTYPE 2052 // ObjectType -#define UA_NS0ID_AUDITSECURITYEVENTTYPE 2058 // ObjectType -#define UA_NS0ID_AUDITCHANNELEVENTTYPE 2059 // ObjectType -#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE 2060 // ObjectType -#define UA_NS0ID_AUDITSESSIONEVENTTYPE 2069 // ObjectType -#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE 2071 // ObjectType -#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE 2075 // ObjectType -#define UA_NS0ID_AUDITCANCELEVENTTYPE 2078 // ObjectType -#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE 2080 // ObjectType -#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE 2082 // ObjectType -#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE 2085 // ObjectType -#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE 2086 // ObjectType -#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE 2087 // ObjectType -#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE 2088 // ObjectType -#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE 2089 // ObjectType -#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE 2090 // ObjectType -#define UA_NS0ID_AUDITADDNODESEVENTTYPE 2091 // ObjectType -#define UA_NS0ID_AUDITDELETENODESEVENTTYPE 2093 // ObjectType -#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE 2095 // ObjectType -#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE 2097 // ObjectType -#define UA_NS0ID_AUDITUPDATEEVENTTYPE 2099 // ObjectType -#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE 2100 // ObjectType -#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE 2104 // ObjectType -#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE 2127 // ObjectType -#define UA_NS0ID_SYSTEMEVENTTYPE 2130 // ObjectType -#define UA_NS0ID_DEVICEFAILUREEVENTTYPE 2131 // ObjectType -#define UA_NS0ID_BASEMODELCHANGEEVENTTYPE 2132 // ObjectType -#define UA_NS0ID_GENERALMODELCHANGEEVENTTYPE 2133 // ObjectType -#define UA_NS0ID_SERVERVENDORCAPABILITYTYPE 2137 // VariableType -#define UA_NS0ID_SERVERSTATUSTYPE 2138 // VariableType -#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE 2150 // VariableType -#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSARRAYTYPE 2164 // VariableType -#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSTYPE 2165 // VariableType -#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE 2171 // VariableType -#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE 2172 // VariableType -#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE 2196 // VariableType -#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE 2197 // VariableType -#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSARRAYTYPE 2243 // VariableType -#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSTYPE 2244 // VariableType -#define UA_NS0ID_SERVER 2253 // Object -#define UA_NS0ID_SERVER_SERVERARRAY 2254 // Variable -#define UA_NS0ID_SERVER_NAMESPACEARRAY 2255 // Variable -#define UA_NS0ID_SERVER_SERVERSTATUS 2256 // Variable -#define UA_NS0ID_SERVER_SERVERSTATUS_STARTTIME 2257 // Variable -#define UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME 2258 // Variable -#define UA_NS0ID_SERVER_SERVERSTATUS_STATE 2259 // Variable -#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO 2260 // Variable -#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME 2261 // Variable -#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI 2262 // Variable -#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME 2263 // Variable -#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION 2264 // Variable -#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER 2265 // Variable -#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE 2266 // Variable -#define UA_NS0ID_SERVER_SERVICELEVEL 2267 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES 2268 // Object -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_SERVERPROFILEARRAY 2269 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_LOCALEIDARRAY 2271 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MINSUPPORTEDSAMPLERATE 2272 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS 2274 // Object -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY 2275 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SERVERVIEWCOUNT 2276 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_CURRENTSESSIONCOUNT 2277 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_CUMULATEDSESSIONCOUNT 2278 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SECURITYREJECTEDSESSIONCOUNT 2279 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SESSIONTIMEOUTCOUNT 2281 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SESSIONABORTCOUNT 2282 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_PUBLISHINGINTERVALCOUNT 2284 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_CURRENTSUBSCRIPTIONCOUNT 2285 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_CUMULATEDSUBSCRIPTIONCOUNT 2286 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SECURITYREJECTEDREQUESTSCOUNT 2287 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_REJECTEDREQUESTSCOUNT 2288 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SAMPLINGINTERVALDIAGNOSTICSARRAY 2289 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SUBSCRIPTIONDIAGNOSTICSARRAY 2290 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_ENABLEDFLAG 2294 // Variable -#define UA_NS0ID_SERVER_VENDORSERVERINFO 2295 // Object -#define UA_NS0ID_SERVER_SERVERREDUNDANCY 2296 // Object -#define UA_NS0ID_STATEMACHINETYPE 2299 // ObjectType -#define UA_NS0ID_STATETYPE 2307 // ObjectType -#define UA_NS0ID_INITIALSTATETYPE 2309 // ObjectType -#define UA_NS0ID_TRANSITIONTYPE 2310 // ObjectType -#define UA_NS0ID_TRANSITIONEVENTTYPE 2311 // ObjectType -#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE 2315 // ObjectType -#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE 2318 // ObjectType -#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE 2330 // ObjectType -#define UA_NS0ID_AGGREGATEFUNCTIONTYPE 2340 // ObjectType -#define UA_NS0ID_AGGREGATEFUNCTION_INTERPOLATIVE 2341 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_AVERAGE 2342 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_TIMEAVERAGE 2343 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_TOTAL 2344 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_MINIMUM 2346 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_MAXIMUM 2347 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_MINIMUMACTUALTIME 2348 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_MAXIMUMACTUALTIME 2349 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_RANGE 2350 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_ANNOTATIONCOUNT 2351 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_COUNT 2352 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_NUMBEROFTRANSITIONS 2355 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_START 2357 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_END 2358 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_DELTA 2359 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_DURATIONGOOD 2360 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_DURATIONBAD 2361 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_PERCENTGOOD 2362 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_PERCENTBAD 2363 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_WORSTQUALITY 2364 // Object -#define UA_NS0ID_DATAITEMTYPE 2365 // VariableType -#define UA_NS0ID_ANALOGITEMTYPE 2368 // VariableType -#define UA_NS0ID_DISCRETEITEMTYPE 2372 // VariableType -#define UA_NS0ID_TWOSTATEDISCRETETYPE 2373 // VariableType -#define UA_NS0ID_MULTISTATEDISCRETETYPE 2376 // VariableType -#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE 2378 // ObjectType -#define UA_NS0ID_PROGRAMDIAGNOSTICTYPE 2380 // VariableType -#define UA_NS0ID_PROGRAMSTATEMACHINETYPE 2391 // ObjectType -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBROWSECONTINUATIONPOINTS 2735 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXQUERYCONTINUATIONPOINTS 2736 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXHISTORYCONTINUATIONPOINTS 2737 // Variable -#define UA_NS0ID_SEMANTICCHANGEEVENTTYPE 2738 // ObjectType -#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE 2748 // ObjectType -#define UA_NS0ID_STATEVARIABLETYPE 2755 // VariableType -#define UA_NS0ID_FINITESTATEVARIABLETYPE 2760 // VariableType -#define UA_NS0ID_TRANSITIONVARIABLETYPE 2762 // VariableType -#define UA_NS0ID_FINITETRANSITIONVARIABLETYPE 2767 // VariableType -#define UA_NS0ID_FINITESTATEMACHINETYPE 2771 // ObjectType -#define UA_NS0ID_CONDITIONTYPE 2782 // ObjectType -#define UA_NS0ID_REFRESHSTARTEVENTTYPE 2787 // ObjectType -#define UA_NS0ID_REFRESHENDEVENTTYPE 2788 // ObjectType -#define UA_NS0ID_REFRESHREQUIREDEVENTTYPE 2789 // ObjectType -#define UA_NS0ID_AUDITCONDITIONEVENTTYPE 2790 // ObjectType -#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE 2803 // ObjectType -#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE 2829 // ObjectType -#define UA_NS0ID_DIALOGCONDITIONTYPE 2830 // ObjectType -#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE 2881 // ObjectType -#define UA_NS0ID_ALARMCONDITIONTYPE 2915 // ObjectType -#define UA_NS0ID_SHELVEDSTATEMACHINETYPE 2929 // ObjectType -#define UA_NS0ID_LIMITALARMTYPE 2955 // ObjectType -#define UA_NS0ID_SERVER_SERVERSTATUS_SECONDSTILLSHUTDOWN 2992 // Variable -#define UA_NS0ID_SERVER_SERVERSTATUS_SHUTDOWNREASON 2993 // Variable -#define UA_NS0ID_SERVER_AUDITING 2994 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES 2996 // Object -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_AGGREGATEFUNCTIONS 2997 // Object -#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE 2999 // ObjectType -#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE 3006 // ObjectType -#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE 3012 // ObjectType -#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE 3014 // ObjectType -#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE 3019 // ObjectType -#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE 3022 // ObjectType -#define UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE 3035 // ObjectType -#define UA_NS0ID_EVENTTYPESFOLDER 3048 // Object -#define UA_NS0ID_BUILDINFOTYPE 3051 // VariableType -#define UA_NS0ID_DEFAULTBINARY 3062 // Object -#define UA_NS0ID_DEFAULTXML 3063 // Object -#define UA_NS0ID_ALWAYSGENERATESEVENT 3065 // ReferenceType -#define UA_NS0ID_ICON 3067 // Variable -#define UA_NS0ID_NODEVERSION 3068 // Variable -#define UA_NS0ID_LOCALTIME 3069 // Variable -#define UA_NS0ID_ALLOWNULLS 3070 // Variable -#define UA_NS0ID_ENUMVALUES 3071 // Variable -#define UA_NS0ID_INPUTARGUMENTS 3072 // Variable -#define UA_NS0ID_OUTPUTARGUMENTS 3073 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_SOFTWARECERTIFICATES 3704 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_REJECTEDSESSIONCOUNT 3705 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SESSIONSDIAGNOSTICSSUMMARY 3706 // Object -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SESSIONSDIAGNOSTICSSUMMARY_SESSIONDIAGNOSTICSARRAY 3707 // Variable -#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SESSIONSDIAGNOSTICSSUMMARY_SESSIONSECURITYDIAGNOSTICSARRAY 3708 // Variable -#define UA_NS0ID_SERVER_SERVERREDUNDANCY_REDUNDANCYSUPPORT 3709 // Variable -#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE 3806 // ObjectType -#define UA_NS0ID_ADDCOMMENTMETHODTYPE 3863 // Method -#define UA_NS0ID_TIMEDSHELVEMETHODTYPE 6102 // Method -#define UA_NS0ID_ENUMVALUETYPE 7594 // DataType -#define UA_NS0ID_MESSAGESECURITYMODE_ENUMSTRINGS 7595 // Variable -#define UA_NS0ID_BROWSEDIRECTION_ENUMSTRINGS 7603 // Variable -#define UA_NS0ID_FILTEROPERATOR_ENUMSTRINGS 7605 // Variable -#define UA_NS0ID_TIMESTAMPSTORETURN_ENUMSTRINGS 7606 // Variable -#define UA_NS0ID_MONITORINGMODE_ENUMSTRINGS 7608 // Variable -#define UA_NS0ID_DATACHANGETRIGGER_ENUMSTRINGS 7609 // Variable -#define UA_NS0ID_REDUNDANCYSUPPORT_ENUMSTRINGS 7611 // Variable -#define UA_NS0ID_SERVERSTATE_ENUMSTRINGS 7612 // Variable -#define UA_NS0ID_EXCEPTIONDEVIATIONFORMAT_ENUMSTRINGS 7614 // Variable -#define UA_NS0ID_TIMEZONEDATATYPE 8912 // DataType -#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE 8927 // ObjectType -#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE 8944 // ObjectType -#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE 8961 // ObjectType -#define UA_NS0ID_TWOSTATEVARIABLETYPE 8995 // VariableType -#define UA_NS0ID_CONDITIONVARIABLETYPE 9002 // VariableType -#define UA_NS0ID_HASTRUESUBSTATE 9004 // ReferenceType -#define UA_NS0ID_HASFALSESUBSTATE 9005 // ReferenceType -#define UA_NS0ID_HASCONDITION 9006 // ReferenceType -#define UA_NS0ID_CONDITIONREFRESHMETHODTYPE 9007 // Method -#define UA_NS0ID_DIALOGRESPONSEMETHODTYPE 9031 // Method -#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE 9318 // ObjectType -#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE 9341 // ObjectType -#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE 9482 // ObjectType -#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE 9623 // ObjectType -#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE 9764 // ObjectType -#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE 9906 // ObjectType -#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE 10060 // ObjectType -#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE 10214 // ObjectType -#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE 10368 // ObjectType -#define UA_NS0ID_DISCRETEALARMTYPE 10523 // ObjectType -#define UA_NS0ID_OFFNORMALALARMTYPE 10637 // ObjectType -#define UA_NS0ID_TRIPALARMTYPE 10751 // ObjectType -#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE 11093 // ObjectType -#define UA_NS0ID_BASECONDITIONCLASSTYPE 11163 // ObjectType -#define UA_NS0ID_PROCESSCONDITIONCLASSTYPE 11164 // ObjectType -#define UA_NS0ID_MAINTENANCECONDITIONCLASSTYPE 11165 // ObjectType -#define UA_NS0ID_SYSTEMCONDITIONCLASSTYPE 11166 // ObjectType -#define UA_NS0ID_AGGREGATECONFIGURATIONTYPE 11187 // ObjectType -#define UA_NS0ID_HISTORYSERVERCAPABILITIES 11192 // Object -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_ACCESSHISTORYDATACAPABILITY 11193 // Variable -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTDATACAPABILITY 11196 // Variable -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_REPLACEDATACAPABILITY 11197 // Variable -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_UPDATEDATACAPABILITY 11198 // Variable -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_DELETERAWCAPABILITY 11199 // Variable -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_DELETEATTIMECAPABILITY 11200 // Variable -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_AGGREGATEFUNCTIONS 11201 // Object -#define UA_NS0ID_HACONFIGURATION 11202 // Object -#define UA_NS0ID_HACONFIGURATION_AGGREGATECONFIGURATION 11203 // Object -#define UA_NS0ID_HACONFIGURATION_AGGREGATECONFIGURATION_TREATUNCERTAINASBAD 11204 // Variable -#define UA_NS0ID_HACONFIGURATION_AGGREGATECONFIGURATION_PERCENTDATABAD 11205 // Variable -#define UA_NS0ID_HACONFIGURATION_AGGREGATECONFIGURATION_PERCENTDATAGOOD 11206 // Variable -#define UA_NS0ID_HACONFIGURATION_AGGREGATECONFIGURATION_USESLOPEDEXTRAPOLATION 11207 // Variable -#define UA_NS0ID_HACONFIGURATION_STEPPED 11208 // Variable -#define UA_NS0ID_HACONFIGURATION_DEFINITION 11209 // Variable -#define UA_NS0ID_HACONFIGURATION_MAXTIMEINTERVAL 11210 // Variable -#define UA_NS0ID_HACONFIGURATION_MINTIMEINTERVAL 11211 // Variable -#define UA_NS0ID_HACONFIGURATION_EXCEPTIONDEVIATION 11212 // Variable -#define UA_NS0ID_HACONFIGURATION_EXCEPTIONDEVIATIONFORMAT 11213 // Variable -#define UA_NS0ID_ANNOTATIONS 11214 // Variable -#define UA_NS0ID_HISTORICALEVENTFILTER 11215 // Variable -#define UA_NS0ID_MODIFICATIONINFO 11216 // DataType -#define UA_NS0ID_HISTORYMODIFIEDDATA 11217 // DataType -#define UA_NS0ID_MODIFICATIONINFO_ENCODING_DEFAULTXML 11218 // Object -#define UA_NS0ID_HISTORYMODIFIEDDATA_ENCODING_DEFAULTXML 11219 // Object -#define UA_NS0ID_MODIFICATIONINFO_ENCODING_DEFAULTBINARY 11226 // Object -#define UA_NS0ID_HISTORYMODIFIEDDATA_ENCODING_DEFAULTBINARY 11227 // Object -#define UA_NS0ID_HISTORYUPDATETYPE 11234 // DataType -#define UA_NS0ID_MULTISTATEVALUEDISCRETETYPE 11238 // VariableType -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_ACCESSHISTORYEVENTSCAPABILITY 11242 // Variable -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_MAXRETURNDATAVALUES 11273 // Variable -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_MAXRETURNEVENTVALUES 11274 // Variable -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTANNOTATIONCAPABILITY 11275 // Variable -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTEVENTCAPABILITY 11281 // Variable -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_REPLACEEVENTCAPABILITY 11282 // Variable -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_UPDATEEVENTCAPABILITY 11283 // Variable -#define UA_NS0ID_AGGREGATEFUNCTION_TIMEAVERAGE2 11285 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_MINIMUM2 11286 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_MAXIMUM2 11287 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_RANGE2 11288 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_WORSTQUALITY2 11292 // Object -#define UA_NS0ID_PERFORMUPDATETYPE 11293 // DataType -#define UA_NS0ID_UPDATESTRUCTUREDATADETAILS 11295 // DataType -#define UA_NS0ID_UPDATESTRUCTUREDATADETAILS_ENCODING_DEFAULTXML 11296 // Object -#define UA_NS0ID_UPDATESTRUCTUREDATADETAILS_ENCODING_DEFAULTBINARY 11300 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_TOTAL2 11304 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_MINIMUMACTUALTIME2 11305 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_MAXIMUMACTUALTIME2 11306 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_DURATIONINSTATEZERO 11307 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_DURATIONINSTATENONZERO 11308 // Object -#define UA_NS0ID_SERVER_SERVERREDUNDANCY_CURRENTSERVERID 11312 // Variable -#define UA_NS0ID_SERVER_SERVERREDUNDANCY_REDUNDANTSERVERARRAY 11313 // Variable -#define UA_NS0ID_SERVER_SERVERREDUNDANCY_SERVERURIARRAY 11314 // Variable -#define UA_NS0ID_AGGREGATEFUNCTION_STANDARDDEVIATIONSAMPLE 11426 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_STANDARDDEVIATIONPOPULATION 11427 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_VARIANCESAMPLE 11428 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_VARIANCEPOPULATION 11429 // Object -#define UA_NS0ID_ENUMSTRINGS 11432 // Variable -#define UA_NS0ID_VALUEASTEXT 11433 // Variable -#define UA_NS0ID_PROGRESSEVENTTYPE 11436 // ObjectType -#define UA_NS0ID_SYSTEMSTATUSCHANGEEVENTTYPE 11446 // ObjectType -#define UA_NS0ID_OPTIONSETTYPE 11487 // VariableType -#define UA_NS0ID_SERVER_GETMONITOREDITEMS 11492 // Method -#define UA_NS0ID_SERVER_GETMONITOREDITEMS_INPUTARGUMENTS 11493 // Variable -#define UA_NS0ID_SERVER_GETMONITOREDITEMS_OUTPUTARGUMENTS 11494 // Variable -#define UA_NS0ID_GETMONITOREDITEMSMETHODTYPE 11495 // Method -#define UA_NS0ID_MAXSTRINGLENGTH 11498 // Variable -#define UA_NS0ID_HISTORYSERVERCAPABILITIES_DELETEEVENTCAPABILITY 11502 // Variable -#define UA_NS0ID_HACONFIGURATION_STARTOFARCHIVE 11503 // Variable -#define UA_NS0ID_HACONFIGURATION_STARTOFONLINEARCHIVE 11504 // Variable -#define UA_NS0ID_AGGREGATEFUNCTION_STARTBOUND 11505 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_ENDBOUND 11506 // Object -#define UA_NS0ID_AGGREGATEFUNCTION_DELTABOUNDS 11507 // Object -#define UA_NS0ID_MODELLINGRULE_OPTIONALPLACEHOLDER 11508 // Object -#define UA_NS0ID_MODELLINGRULE_OPTIONALPLACEHOLDER_NAMINGRULE 11509 // Variable -#define UA_NS0ID_MODELLINGRULE_MANDATORYPLACEHOLDER 11510 // Object -#define UA_NS0ID_MODELLINGRULE_MANDATORYPLACEHOLDER_NAMINGRULE 11511 // Variable -#define UA_NS0ID_MAXARRAYLENGTH 11512 // Variable -#define UA_NS0ID_ENGINEERINGUNITS 11513 // Variable -#define UA_NS0ID_OPERATIONLIMITSTYPE 11564 // ObjectType -#define UA_NS0ID_FILETYPE 11575 // ObjectType -#define UA_NS0ID_ADDRESSSPACEFILETYPE 11595 // ObjectType -#define UA_NS0ID_NAMESPACEMETADATATYPE 11616 // ObjectType -#define UA_NS0ID_NAMESPACESTYPE 11645 // ObjectType -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXARRAYLENGTH 11702 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXSTRINGLENGTH 11703 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS 11704 // Object -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERREAD 11705 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERWRITE 11707 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERMETHODCALL 11709 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERBROWSE 11710 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERREGISTERNODES 11711 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERTRANSLATEBROWSEPATHSTONODEIDS 11712 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERNODEMANAGEMENT 11713 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXMONITOREDITEMSPERCALL 11714 // Variable -#define UA_NS0ID_SERVER_NAMESPACES 11715 // Object -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE 11716 // Object -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_SIZE 11717 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_OPENCOUNT 11720 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_OPEN 11721 // Method -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_OPEN_INPUTARGUMENTS 11722 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_OPEN_OUTPUTARGUMENTS 11723 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_CLOSE 11724 // Method -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_CLOSE_INPUTARGUMENTS 11725 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_READ 11726 // Method -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_READ_INPUTARGUMENTS 11727 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_READ_OUTPUTARGUMENTS 11728 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_WRITE 11729 // Method -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_WRITE_INPUTARGUMENTS 11730 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_GETPOSITION 11731 // Method -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_GETPOSITION_INPUTARGUMENTS 11732 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_GETPOSITION_OUTPUTARGUMENTS 11733 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_SETPOSITION 11734 // Method -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_SETPOSITION_INPUTARGUMENTS 11735 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_EXPORTNAMESPACE 11736 // Method -#define UA_NS0ID_BITFIELDMASKDATATYPE 11737 // DataType -#define UA_NS0ID_OPENMETHODTYPE 11738 // Method -#define UA_NS0ID_CLOSEMETHODTYPE 11741 // Method -#define UA_NS0ID_READMETHODTYPE 11743 // Method -#define UA_NS0ID_WRITEMETHODTYPE 11746 // Method -#define UA_NS0ID_GETPOSITIONMETHODTYPE 11748 // Method -#define UA_NS0ID_SETPOSITIONMETHODTYPE 11751 // Method -#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE 11753 // ObjectType -#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE 11856 // ObjectType -#define UA_NS0ID_HACONFIGURATION_AGGREGATEFUNCTIONS 11877 // Object -#define UA_NS0ID_NODECLASS_ENUMVALUES 11878 // Variable -#define UA_NS0ID_INSTANCENODE 11879 // DataType -#define UA_NS0ID_TYPENODE 11880 // DataType -#define UA_NS0ID_NODEATTRIBUTESMASK_ENUMVALUES 11881 // Variable -#define UA_NS0ID_ATTRIBUTEWRITEMASK_ENUMVALUES 11882 // Variable -#define UA_NS0ID_BROWSERESULTMASK_ENUMVALUES 11883 // Variable -#define UA_NS0ID_INSTANCENODE_ENCODING_DEFAULTXML 11887 // Object -#define UA_NS0ID_TYPENODE_ENCODING_DEFAULTXML 11888 // Object -#define UA_NS0ID_INSTANCENODE_ENCODING_DEFAULTBINARY 11889 // Object -#define UA_NS0ID_TYPENODE_ENCODING_DEFAULTBINARY 11890 // Object -#define UA_NS0ID_OPENFILEMODE 11939 // DataType -#define UA_NS0ID_OPENFILEMODE_ENUMVALUES 11940 // Variable -#define UA_NS0ID_MODELCHANGESTRUCTUREVERBMASK 11941 // DataType -#define UA_NS0ID_MODELCHANGESTRUCTUREVERBMASK_ENUMVALUES 11942 // Variable -#define UA_NS0ID_ENDPOINTURLLISTDATATYPE 11943 // DataType -#define UA_NS0ID_NETWORKGROUPDATATYPE 11944 // DataType -#define UA_NS0ID_NONTRANSPARENTNETWORKREDUNDANCYTYPE 11945 // ObjectType -#define UA_NS0ID_ARRAYITEMTYPE 12021 // VariableType -#define UA_NS0ID_YARRAYITEMTYPE 12029 // VariableType -#define UA_NS0ID_XYARRAYITEMTYPE 12038 // VariableType -#define UA_NS0ID_IMAGEITEMTYPE 12047 // VariableType -#define UA_NS0ID_CUBEITEMTYPE 12057 // VariableType -#define UA_NS0ID_NDIMENSIONARRAYITEMTYPE 12068 // VariableType -#define UA_NS0ID_AXISSCALEENUMERATION 12077 // DataType -#define UA_NS0ID_AXISSCALEENUMERATION_ENUMSTRINGS 12078 // Variable -#define UA_NS0ID_AXISINFORMATION 12079 // DataType -#define UA_NS0ID_XVTYPE 12080 // DataType -#define UA_NS0ID_AXISINFORMATION_ENCODING_DEFAULTXML 12081 // Object -#define UA_NS0ID_AXISINFORMATION_ENCODING_DEFAULTBINARY 12089 // Object -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYREADDATA 12165 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYREADEVENTS 12166 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEDATA 12167 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEEVENTS 12168 // Variable -#define UA_NS0ID_VIEWVERSION 12170 // Variable -#define UA_NS0ID_COMPLEXNUMBERTYPE 12171 // DataType -#define UA_NS0ID_DOUBLECOMPLEXNUMBERTYPE 12172 // DataType -#define UA_NS0ID_SERVERONNETWORK 12189 // DataType -#define UA_NS0ID_FINDSERVERSONNETWORKREQUEST 12190 // DataType -#define UA_NS0ID_FINDSERVERSONNETWORKRESPONSE 12191 // DataType -#define UA_NS0ID_REGISTERSERVER2REQUEST 12193 // DataType -#define UA_NS0ID_REGISTERSERVER2RESPONSE 12194 // DataType -#define UA_NS0ID_SERVERONNETWORK_ENCODING_DEFAULTXML 12195 // Object -#define UA_NS0ID_FINDSERVERSONNETWORKREQUEST_ENCODING_DEFAULTXML 12196 // Object -#define UA_NS0ID_FINDSERVERSONNETWORKRESPONSE_ENCODING_DEFAULTXML 12197 // Object -#define UA_NS0ID_REGISTERSERVER2REQUEST_ENCODING_DEFAULTXML 12199 // Object -#define UA_NS0ID_REGISTERSERVER2RESPONSE_ENCODING_DEFAULTXML 12200 // Object -#define UA_NS0ID_SERVERONNETWORK_ENCODING_DEFAULTBINARY 12207 // Object -#define UA_NS0ID_FINDSERVERSONNETWORKREQUEST_ENCODING_DEFAULTBINARY 12208 // Object -#define UA_NS0ID_FINDSERVERSONNETWORKRESPONSE_ENCODING_DEFAULTBINARY 12209 // Object -#define UA_NS0ID_REGISTERSERVER2REQUEST_ENCODING_DEFAULTBINARY 12211 // Object -#define UA_NS0ID_REGISTERSERVER2RESPONSE_ENCODING_DEFAULTBINARY 12212 // Object -#define UA_NS0ID_OPENWITHMASKSMETHODTYPE 12513 // Method -#define UA_NS0ID_CLOSEANDUPDATEMETHODTYPE 12516 // Method -#define UA_NS0ID_ADDCERTIFICATEMETHODTYPE 12518 // Method -#define UA_NS0ID_REMOVECERTIFICATEMETHODTYPE 12520 // Method -#define UA_NS0ID_TRUSTLISTTYPE 12522 // ObjectType -#define UA_NS0ID_TRUSTLISTMASKS 12552 // DataType -#define UA_NS0ID_TRUSTLISTMASKS_ENUMVALUES 12553 // Variable -#define UA_NS0ID_TRUSTLISTDATATYPE 12554 // DataType -#define UA_NS0ID_CERTIFICATEGROUPTYPE 12555 // ObjectType -#define UA_NS0ID_CERTIFICATETYPE 12556 // ObjectType -#define UA_NS0ID_APPLICATIONCERTIFICATETYPE 12557 // ObjectType -#define UA_NS0ID_HTTPSCERTIFICATETYPE 12558 // ObjectType -#define UA_NS0ID_RSAMINAPPLICATIONCERTIFICATETYPE 12559 // ObjectType -#define UA_NS0ID_RSASHA256APPLICATIONCERTIFICATETYPE 12560 // ObjectType -#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE 12561 // ObjectType -#define UA_NS0ID_UPDATECERTIFICATEMETHODTYPE 12578 // Method -#define UA_NS0ID_SERVERCONFIGURATIONTYPE 12581 // ObjectType -#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE 12620 // ObjectType -#define UA_NS0ID_SERVERCONFIGURATION 12637 // Object -#define UA_NS0ID_SERVERCONFIGURATION_SUPPORTEDPRIVATEKEYFORMATS 12639 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_MAXTRUSTLISTSIZE 12640 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_MULTICASTDNSENABLED 12641 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST 12642 // Object -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_SIZE 12643 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENCOUNT 12646 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPEN 12647 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPEN_INPUTARGUMENTS 12648 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPEN_OUTPUTARGUMENTS 12649 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSE 12650 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSE_INPUTARGUMENTS 12651 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_READ 12652 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_READ_INPUTARGUMENTS 12653 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_READ_OUTPUTARGUMENTS 12654 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_WRITE 12655 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_WRITE_INPUTARGUMENTS 12656 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_GETPOSITION 12657 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 12658 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 12659 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_SETPOSITION 12660 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 12661 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_LASTUPDATETIME 12662 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENWITHMASKS 12663 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 12664 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 12665 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSEANDUPDATE 12666 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 12667 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_ADDCERTIFICATE 12668 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 12669 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_REMOVECERTIFICATE 12670 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 12671 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_WRITABLE 12696 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_USERWRITABLE 12697 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_SERVERCAPABILITIES 12710 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CREATESIGNINGREQUEST 12737 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CREATESIGNINGREQUEST_INPUTARGUMENTS 12738 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CREATESIGNINGREQUEST_OUTPUTARGUMENTS 12739 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_APPLYCHANGES 12740 // Method -#define UA_NS0ID_CREATESIGNINGREQUESTMETHODTYPE 12741 // Method -#define UA_NS0ID_OPTIONSETVALUES 12745 // Variable -#define UA_NS0ID_SERVER_SETSUBSCRIPTIONDURABLE 12749 // Method -#define UA_NS0ID_SERVER_SETSUBSCRIPTIONDURABLE_INPUTARGUMENTS 12750 // Variable -#define UA_NS0ID_SERVER_SETSUBSCRIPTIONDURABLE_OUTPUTARGUMENTS 12751 // Variable -#define UA_NS0ID_SETSUBSCRIPTIONDURABLEMETHODTYPE 12752 // Method -#define UA_NS0ID_OPTIONSET 12755 // DataType -#define UA_NS0ID_UNION 12756 // DataType -#define UA_NS0ID_OPTIONSET_ENCODING_DEFAULTXML 12757 // Object -#define UA_NS0ID_UNION_ENCODING_DEFAULTXML 12758 // Object -#define UA_NS0ID_OPTIONSET_ENCODING_DEFAULTBINARY 12765 // Object -#define UA_NS0ID_UNION_ENCODING_DEFAULTBINARY 12766 // Object -#define UA_NS0ID_GETREJECTEDLISTMETHODTYPE 12773 // Method -#define UA_NS0ID_SERVERCONFIGURATION_GETREJECTEDLIST 12777 // Method -#define UA_NS0ID_SERVERCONFIGURATION_GETREJECTEDLIST_OUTPUTARGUMENTS 12778 // Variable -#define UA_NS0ID_SERVER_RESENDDATA 12873 // Method -#define UA_NS0ID_SERVER_RESENDDATA_INPUTARGUMENTS 12874 // Variable -#define UA_NS0ID_RESENDDATAMETHODTYPE 12875 // Method -#define UA_NS0ID_NORMALIZEDSTRING 12877 // DataType -#define UA_NS0ID_DECIMALSTRING 12878 // DataType -#define UA_NS0ID_DURATIONSTRING 12879 // DataType -#define UA_NS0ID_TIMESTRING 12880 // DataType -#define UA_NS0ID_DATESTRING 12881 // DataType -#define UA_NS0ID_SERVER_ESTIMATEDRETURNTIME 12885 // Variable -#define UA_NS0ID_SERVER_REQUESTSERVERSTATECHANGE 12886 // Method -#define UA_NS0ID_SERVER_REQUESTSERVERSTATECHANGE_INPUTARGUMENTS 12887 // Variable -#define UA_NS0ID_REQUESTSERVERSTATECHANGEMETHODTYPE 12888 // Method -#define UA_NS0ID_DISCOVERYCONFIGURATION 12890 // DataType -#define UA_NS0ID_MDNSDISCOVERYCONFIGURATION 12891 // DataType -#define UA_NS0ID_DISCOVERYCONFIGURATION_ENCODING_DEFAULTXML 12892 // Object -#define UA_NS0ID_MDNSDISCOVERYCONFIGURATION_ENCODING_DEFAULTXML 12893 // Object -#define UA_NS0ID_DISCOVERYCONFIGURATION_ENCODING_DEFAULTBINARY 12900 // Object -#define UA_NS0ID_MDNSDISCOVERYCONFIGURATION_ENCODING_DEFAULTBINARY 12901 // Object -#define UA_NS0ID_MAXBYTESTRINGLENGTH 12908 // Variable -#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBYTESTRINGLENGTH 12911 // Variable -#define UA_NS0ID_CONDITIONREFRESH2METHODTYPE 12914 // Method -#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE 13225 // ObjectType -#define UA_NS0ID_CREATEDIRECTORYMETHODTYPE 13342 // Method -#define UA_NS0ID_CREATEFILEMETHODTYPE 13345 // Method -#define UA_NS0ID_DELETEFILEMETHODTYPE 13348 // Method -#define UA_NS0ID_MOVEORCOPYMETHODTYPE 13350 // Method -#define UA_NS0ID_FILEDIRECTORYTYPE 13353 // ObjectType -#define UA_NS0ID_SERVER_NAMESPACES_ADDRESSSPACEFILE_MIMETYPE 13402 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_UPDATECERTIFICATE 13737 // Method -#define UA_NS0ID_SERVERCONFIGURATION_UPDATECERTIFICATE_INPUTARGUMENTS 13738 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_UPDATECERTIFICATE_OUTPUTARGUMENTS 13739 // Variable -#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE 13813 // ObjectType -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS 14053 // Object -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP 14088 // Object -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST 14089 // Object -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_SIZE 14090 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_WRITABLE 14091 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_USERWRITABLE 14092 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPENCOUNT 14093 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_MIMETYPE 14094 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPEN 14095 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPEN_INPUTARGUMENTS 14096 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPEN_OUTPUTARGUMENTS 14097 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSE 14098 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSE_INPUTARGUMENTS 14099 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_READ 14100 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_READ_INPUTARGUMENTS 14101 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_READ_OUTPUTARGUMENTS 14102 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_WRITE 14103 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_WRITE_INPUTARGUMENTS 14104 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_GETPOSITION 14105 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 14106 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 14107 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_SETPOSITION 14108 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 14109 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_LASTUPDATETIME 14110 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPENWITHMASKS 14111 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 14112 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 14113 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSEANDUPDATE 14114 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 14115 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 14116 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_ADDCERTIFICATE 14117 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 14118 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_REMOVECERTIFICATE 14119 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 14120 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_CERTIFICATETYPES 14121 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP 14122 // Object -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST 14123 // Object -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_SIZE 14124 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_WRITABLE 14125 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_USERWRITABLE 14126 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENCOUNT 14127 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_MIMETYPE 14128 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPEN 14129 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPEN_INPUTARGUMENTS 14130 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPEN_OUTPUTARGUMENTS 14131 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSE 14132 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSE_INPUTARGUMENTS 14133 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_READ 14134 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_READ_INPUTARGUMENTS 14135 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_READ_OUTPUTARGUMENTS 14136 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_WRITE 14137 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_WRITE_INPUTARGUMENTS 14138 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_GETPOSITION 14139 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 14140 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 14141 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_SETPOSITION 14142 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 14143 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_LASTUPDATETIME 14144 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENWITHMASKS 14145 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 14146 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 14147 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSEANDUPDATE 14148 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 14149 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 14150 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_ADDCERTIFICATE 14151 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 14152 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_REMOVECERTIFICATE 14153 // Method -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 14154 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_CERTIFICATETYPES 14155 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP 14156 // Object -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_WRITABLE 14157 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_USERWRITABLE 14158 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_MIMETYPE 14159 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 14160 // Variable -#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_CERTIFICATETYPES 14161 // Variable -#define UA_NS0ID_SERVER_SERVERREDUNDANCY_SERVERNETWORKGROUPS 14415 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI 15182 // Object -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEURI 15183 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEVERSION 15184 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEPUBLICATIONDATE 15185 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_ISNAMESPACESUBSET 15186 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_STATICNODEIDTYPES 15187 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_STATICNUMERICNODEIDRANGE 15188 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_STATICSTRINGNODEIDPATTERN 15189 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE 15190 // Object -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_SIZE 15191 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_WRITABLE 15192 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_USERWRITABLE 15193 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_OPENCOUNT 15194 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_MIMETYPE 15195 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_OPEN 15196 // Method -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_OPEN_INPUTARGUMENTS 15197 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_OPEN_OUTPUTARGUMENTS 15198 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_CLOSE 15199 // Method -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_CLOSE_INPUTARGUMENTS 15200 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_READ 15201 // Method -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_READ_INPUTARGUMENTS 15202 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_READ_OUTPUTARGUMENTS 15203 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_WRITE 15204 // Method -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_WRITE_INPUTARGUMENTS 15205 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_GETPOSITION 15206 // Method -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_GETPOSITION_INPUTARGUMENTS 15207 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_GETPOSITION_OUTPUTARGUMENTS 15208 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_SETPOSITION 15209 // Method -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_SETPOSITION_INPUTARGUMENTS 15210 // Variable -#define UA_NS0ID_SERVER_NAMESPACES_OPCUANAMESPACEURI_NAMESPACEFILE_EXPORTNAMESPACE 15211 // Method -#define UA_NS0ID_HASMODELPARENT 50 // ReferenceType - -#define UA_VALUERANK_SCALAR_OR_ONE_DIMENSION -3 -#define UA_VALUERANK_ANY -2 -#define UA_VALUERANK_SCALAR -1 -#define UA_VALUERANK_ONE_OR_MORE_DIMENSIONS 0 -#define UA_VALUERANK_ONE_DIMENSION 1 -#define UA_VALUERANK_TWO_DIMENSIONS 2 -#define UA_VALUERANK_THREE_DIMENSIONS 3 + * Internal Attributes + * ------------------- + * These attributes are only defined if the macro UA_INTERNAL is defined. That + * way public methods can be annotated (e.g. to warn for unused results) but + * warnings are only triggered for internal code. */ -#ifdef __cplusplus -} // extern "C" +#if defined(UA_INTERNAL) && (defined(__GNUC__) || defined(__clang__)) +# define UA_INTERNAL_DEPRECATED _Pragma ("GCC warning \"Macro is deprecated for internal use\"") +#else +# define UA_INTERNAL_DEPRECATED #endif +#if defined(UA_INTERNAL) && (defined(__GNUC__) || defined(__clang__)) +# define UA_INTERNAL_FUNC_ATTR_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#else +# define UA_INTERNAL_FUNC_ATTR_WARN_UNUSED_RESULT +#endif -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_types.h" ***********************************/ - -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. +/** + * Detect Endianness and IEEE 754 floating point + * --------------------------------------------- + * Integers and floating point numbers are transmitted in little-endian (IEEE + * 754 for floating point) encoding. If the target architecture uses the same + * format, numeral datatypes can be memcpy'd (overlayed) on the network buffer. + * Otherwise, a slow default encoding routine is used that works for every + * architecture. * - * Copyright 2014 (c) Leon Urbas - * Copyright 2014, 2016-2017 (c) Florian Palm - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2015-2016 (c) Sten Grüner - * Copyright 2015-2016 (c) Chris Iatrou - * Copyright 2015 (c) Nick Goossens - * Copyright 2015-2016 (c) Oleksiy Vasylyev - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA - */ - - -#ifdef __cplusplus -extern "C" { + * Integer Endianness + * ^^^^^^^^^^^^^^^^^^ + * The definition ``UA_LITTLE_ENDIAN`` is true when the integer representation + * of the target architecture is little-endian. */ +#if defined(_WIN32) +# define UA_LITTLE_ENDIAN 1 +#elif defined(__i386__) || defined(__x86_64__) || defined(__amd64__) +# define UA_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ + (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) +# define UA_LITTLE_ENDIAN 1 +#elif defined(__linux__) /* Linux (including Android) */ +# include +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define UA_LITTLE_ENDIAN 1 +# endif +#elif defined(__OpenBSD__) /* OpenBSD */ +# include +# if BYTE_ORDER == LITTLE_ENDIAN +# define UA_LITTLE_ENDIAN 1 +# endif +#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) /* Other BSD */ +# include +# if _BYTE_ORDER == _LITTLE_ENDIAN +# define UA_LITTLE_ENDIAN 1 +# endif +#elif defined(__APPLE__) /* Apple (MacOS, iOS) */ +# include +# if defined(__LITTLE_ENDIAN__) +# define UA_LITTLE_ENDIAN 1 +# endif +#elif defined(__QNX__) || defined(__QNXNTO__) /* QNX */ +# include +# if defined(__LITTLEENDIAN__) +# define UA_LITTLE_ENDIAN 1 +# endif +#elif defined(_OS9000) /* OS-9 */ +# if defined(_LIL_END) +# define UA_LITTLE_ENDIAN 1 +# endif +#endif +#ifndef UA_LITTLE_ENDIAN +# define UA_LITTLE_ENDIAN 0 #endif - -#define UA_BUILTIN_TYPES_COUNT 25U +/* Can the integers be memcpy'd onto the network buffer? Add additional checks + * here. Some platforms (e.g. QNX) have sizeof(bool) > 1. Manually disable + * overlayed integer encoding if that is the case. */ +#if (UA_LITTLE_ENDIAN == 1) +UA_STATIC_ASSERT(sizeof(bool) == 1, cannot_overlay_integers_with_large_bool); +# define UA_BINARY_OVERLAYABLE_INTEGER 1 +#else +# define UA_BINARY_OVERLAYABLE_INTEGER 0 +#endif /** - * .. _types: - * - * Data Types - * ========== - * - * The OPC UA protocol defines 25 builtin data types and three ways of combining - * them into higher-order types: arrays, structures and unions. In open62541, - * only the builtin data types are defined manually. All other data types are - * generated from standard XML definitions. Their exact definitions can be - * looked up at https://opcfoundation.org/UA/schemas/Opc.Ua.Types.bsd.xml. - * - * For users that are new to open62541, take a look at the :ref:`tutorial for - * working with data types` before diving into the - * implementation details. - * - * Builtin Types - * ------------- - * - * Boolean - * ^^^^^^^ - * A two-state logical value (true or false). */ -typedef bool UA_Boolean; -#define UA_TRUE true -#define UA_FALSE false + * Float Endianness + * ^^^^^^^^^^^^^^^^ + * The definition ``UA_FLOAT_IEEE754`` is set to true when the floating point + * number representation of the target architecture is IEEE 754. The definition + * ``UA_FLOAT_LITTLE_ENDIAN`` is set to true when the floating point number + * representation is in little-endian encoding. */ -/** - * SByte - * ^^^^^ - * An integer value between -128 and 127. */ -typedef int8_t UA_SByte; -#define UA_SBYTE_MIN (-128) -#define UA_SBYTE_MAX 127 +#if defined(_WIN32) +# define UA_FLOAT_IEEE754 1 +#elif defined(__i386__) || defined(__x86_64__) || defined(__amd64__) || \ + defined(__ia64__) || defined(__powerpc__) || defined(__sparc__) || \ + defined(__arm__) +# define UA_FLOAT_IEEE754 1 +#elif defined(__STDC_IEC_559__) +# define UA_FLOAT_IEEE754 1 +#else +# define UA_FLOAT_IEEE754 0 +#endif -/** - * Byte - * ^^^^ - * An integer value between 0 and 255. */ -typedef uint8_t UA_Byte; -#define UA_BYTE_MIN 0 -#define UA_BYTE_MAX 255 +/* Wikipedia says (https://en.wikipedia.org/wiki/Endianness): Although the + * ubiquitous x86 processors of today use little-endian storage for all types of + * data (integer, floating point, BCD), there are a number of hardware + * architectures where floating-point numbers are represented in big-endian form + * while integers are represented in little-endian form. */ +#if defined(_WIN32) +# define UA_FLOAT_LITTLE_ENDIAN 1 +#elif defined(__i386__) || defined(__x86_64__) || defined(__amd64__) +# define UA_FLOAT_LITTLE_ENDIAN 1 +#elif defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ + (__FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__) /* Defined only in GCC */ +# define UA_FLOAT_LITTLE_ENDIAN 1 +#elif defined(__FLOAT_WORD_ORDER) && defined(__LITTLE_ENDIAN) && \ + (__FLOAT_WORD_ORDER == __LITTLE_ENDIAN) /* Defined only in GCC */ +# define UA_FLOAT_LITTLE_ENDIAN 1 +#endif +#ifndef UA_FLOAT_LITTLE_ENDIAN +# define UA_FLOAT_LITTLE_ENDIAN 0 +#endif -/** - * Int16 - * ^^^^^ - * An integer value between -32 768 and 32 767. */ -typedef int16_t UA_Int16; -#define UA_INT16_MIN (-32768) -#define UA_INT16_MAX 32767 +/* Only if the floating points are litle-endian **and** in IEEE 754 format can + * we memcpy directly onto the network buffer. */ +#if (UA_FLOAT_IEEE754 == 1) && (UA_FLOAT_LITTLE_ENDIAN == 1) +# define UA_BINARY_OVERLAYABLE_FLOAT 1 +#else +# define UA_BINARY_OVERLAYABLE_FLOAT 0 +#endif -/** - * UInt16 - * ^^^^^^ - * An integer value between 0 and 65 535. */ -typedef uint16_t UA_UInt16; -#define UA_UINT16_MIN 0 -#define UA_UINT16_MAX 65535 -/** - * Int32 - * ^^^^^ - * An integer value between -2 147 483 648 and 2 147 483 647. */ -typedef int32_t UA_Int32; -#define UA_INT32_MIN (-2147483648) -#define UA_INT32_MAX 2147483647 +/* Atomic Operations + * ----------------- + * Atomic operations that synchronize across processor cores (for + * multithreading). Only the inline-functions defined next are used. Replace + * with architecture-specific operations if necessary. */ +#ifndef UA_ENABLE_MULTITHREADING +# define UA_atomic_sync() +#else +# ifdef _MSC_VER /* Visual Studio */ +# define UA_atomic_sync() _ReadWriteBarrier() +# else /* GCC/Clang */ +# define UA_atomic_sync() __sync_synchronize() +# endif +#endif -/** - * UInt32 - * ^^^^^^ - * An integer value between 0 and 4 294 967 295. */ -typedef uint32_t UA_UInt32; -#define UA_UINT32_MIN 0 -#define UA_UINT32_MAX 4294967295 +static UA_INLINE void * +UA_atomic_xchg(void * volatile * addr, void *newptr) { +#ifndef UA_ENABLE_MULTITHREADING + void *old = *addr; + *addr = newptr; + return old; +#else + # ifdef _MSC_VER /* Visual Studio */ + return _InterlockedExchangePointer(addr, newptr); +# else /* GCC/Clang */ + return __sync_lock_test_and_set(addr, newptr); +# endif +#endif +} -/** - * Int64 - * ^^^^^ - * An integer value between -9 223 372 036 854 775 808 and - * 9 223 372 036 854 775 807. */ -typedef int64_t UA_Int64; -#define UA_INT64_MIN ((int64_t)-9223372036854775808) -#define UA_INT64_MAX (int64_t)9223372036854775807 +static UA_INLINE void * +UA_atomic_cmpxchg(void * volatile * addr, void *expected, void *newptr) { +#ifndef UA_ENABLE_MULTITHREADING + void *old = *addr; + if(old == expected) { + *addr = newptr; + } + return old; +#else + # ifdef _MSC_VER /* Visual Studio */ + return _InterlockedCompareExchangePointer(addr, expected, newptr); +# else /* GCC/Clang */ + return __sync_val_compare_and_swap(addr, expected, newptr); +# endif +#endif +} -/** - * UInt64 - * ^^^^^^ - * An integer value between 0 and 18 446 744 073 709 551 615. */ -typedef uint64_t UA_UInt64; -#define UA_UINT64_MIN (int64_t)0 -#define UA_UINT64_MAX (int64_t)18446744073709551615 +static UA_INLINE uint32_t +UA_atomic_addUInt32(volatile uint32_t *addr, uint32_t increase) { +#ifndef UA_ENABLE_MULTITHREADING + *addr += increase; + return *addr; +#else + # ifdef _MSC_VER /* Visual Studio */ + return _InterlockedExchangeAdd(addr, increase) + increase; +# else /* GCC/Clang */ + return __sync_add_and_fetch(addr, increase); +# endif +#endif +} -/** - * Float - * ^^^^^ - * An IEEE single precision (32 bit) floating point value. */ -typedef float UA_Float; +static UA_INLINE size_t +UA_atomic_addSize(volatile size_t *addr, size_t increase) { +#ifndef UA_ENABLE_MULTITHREADING + *addr += increase; + return *addr; +#else + # ifdef _MSC_VER /* Visual Studio */ + return _InterlockedExchangeAdd(addr, increase) + increase; +# else /* GCC/Clang */ + return __sync_add_and_fetch(addr, increase); +# endif +#endif +} -/** - * Double - * ^^^^^^ - * An IEEE double precision (64 bit) floating point value. */ -typedef double UA_Double; +static UA_INLINE uint32_t +UA_atomic_subUInt32(volatile uint32_t *addr, uint32_t decrease) { +#ifndef UA_ENABLE_MULTITHREADING + *addr -= decrease; + return *addr; +#else + # ifdef _MSC_VER /* Visual Studio */ + return _InterlockedExchangeSub(addr, decrease) - decrease; +# else /* GCC/Clang */ + return __sync_sub_and_fetch(addr, decrease); +# endif +#endif +} + +static UA_INLINE size_t +UA_atomic_subSize(volatile size_t *addr, size_t decrease) { +#ifndef UA_ENABLE_MULTITHREADING + *addr -= decrease; + return *addr; +#else + # ifdef _MSC_VER /* Visual Studio */ + return _InterlockedExchangeSub(addr, decrease) - decrease; +# else /* GCC/Clang */ + return __sync_sub_and_fetch(addr, decrease); +# endif +#endif +} + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/statuscodes.h" ***********************************/ + +/*--------------------------------------------------------- + * Autogenerated -- do not modify + * Generated from /Users/jelena/Desktop/open62541/tools/schema/StatusCode.csv with script /Users/jelena/Desktop/open62541/tools/generate_statuscode_descriptions.py + *-------------------------------------------------------*/ /** - * .. _statuscode: + * .. _statuscodes: * - * StatusCode - * ^^^^^^^^^^ - * A numeric identifier for a error or condition that is associated with a value - * or an operation. See the section :ref:`statuscodes` for the meaning of a - * specific code. */ -typedef uint32_t UA_StatusCode; + * StatusCodes + * ----------- + * StatusCodes are extensively used in the OPC UA protocol and in the open62541 + * API. They are represented by the :ref:`statuscode` data type. The following + * definitions are autogenerated from the ``Opc.Ua.StatusCodes.csv`` file provided + * with the OPC UA standard. */ -/* Returns the human-readable name of the StatusCode. If no matching StatusCode - * is found, a default string for "Unknown" is returned. This feature might be - * disabled to create a smaller binary with the - * UA_ENABLE_STATUSCODE_DESCRIPTIONS build-flag. Then the function returns an - * empty string for every StatusCode. */ -UA_EXPORT const char * -UA_StatusCode_name(UA_StatusCode code); +/* These StatusCodes are manually generated. */ +#define UA_STATUSCODE_GOOD 0x00 +#define UA_STATUSCODE_INFOTYPE_DATAVALUE 0x00000400 +#define UA_STATUSCODE_INFOBITS_OVERFLOW 0x00000080 -/** - * String - * ^^^^^^ - * A sequence of Unicode characters. Strings are just an array of UA_Byte. */ -typedef struct { - size_t length; /* The length of the string */ - UA_Byte *data; /* The content (not null-terminated) */ -} UA_String; +/* An unexpected error occurred. */ +#define UA_STATUSCODE_BADUNEXPECTEDERROR 0x80010000 -/* Copies the content on the heap. Returns a null-string when alloc fails */ -UA_String UA_EXPORT UA_String_fromChars(char const src[]) UA_FUNC_ATTR_WARN_UNUSED_RESULT; +/* An internal error occurred as a result of a programming or configuration error. */ +#define UA_STATUSCODE_BADINTERNALERROR 0x80020000 -UA_Boolean UA_EXPORT UA_String_equal(const UA_String *s1, const UA_String *s2); +/* Not enough memory to complete the operation. */ +#define UA_STATUSCODE_BADOUTOFMEMORY 0x80030000 -UA_EXPORT extern const UA_String UA_STRING_NULL; +/* An operating system resource is not available. */ +#define UA_STATUSCODE_BADRESOURCEUNAVAILABLE 0x80040000 -/** - * ``UA_STRING`` returns a string pointing to the original char-array. - * ``UA_STRING_ALLOC`` is shorthand for ``UA_String_fromChars`` and makes a copy - * of the char-array. */ -static UA_INLINE UA_String -UA_STRING(char *chars) { - UA_String str; str.length = strlen(chars); - str.data = (UA_Byte*)chars; return str; -} +/* A low level communication error occurred. */ +#define UA_STATUSCODE_BADCOMMUNICATIONERROR 0x80050000 -#define UA_STRING_ALLOC(CHARS) UA_String_fromChars(CHARS) +/* Encoding halted because of invalid data in the objects being serialized. */ +#define UA_STATUSCODE_BADENCODINGERROR 0x80060000 -/* Define strings at compile time (in ROM) */ -#define UA_STRING_STATIC(CHARS) {sizeof(CHARS)-1, (UA_Byte*)CHARS} +/* Decoding halted because of invalid data in the stream. */ +#define UA_STATUSCODE_BADDECODINGERROR 0x80070000 -/** - * .. _datetime: - * - * DateTime - * ^^^^^^^^ - * An instance in time. A DateTime value is encoded as a 64-bit signed integer - * which represents the number of 100 nanosecond intervals since January 1, 1601 - * (UTC). - * - * The methods providing an interface to the system clock are provided by a - * "plugin" that is statically linked with the library. */ +/* The message encoding/decoding limits imposed by the stack have been exceeded. */ +#define UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED 0x80080000 -typedef int64_t UA_DateTime; +/* The request message size exceeds limits set by the server. */ +#define UA_STATUSCODE_BADREQUESTTOOLARGE 0x80B80000 -/* Multiples to convert durations to DateTime */ -#define UA_DATETIME_USEC 10LL -#define UA_DATETIME_MSEC (UA_DATETIME_USEC * 1000LL) -#define UA_DATETIME_SEC (UA_DATETIME_MSEC * 1000LL) +/* The response message size exceeds limits set by the client. */ +#define UA_STATUSCODE_BADRESPONSETOOLARGE 0x80B90000 -/* The current time in UTC time */ -UA_DateTime UA_EXPORT UA_DateTime_now(void); +/* An unrecognized response was received from the server. */ +#define UA_STATUSCODE_BADUNKNOWNRESPONSE 0x80090000 -/* Offset between local time and UTC time */ -UA_Int64 UA_EXPORT UA_DateTime_localTimeUtcOffset(void); +/* The operation timed out. */ +#define UA_STATUSCODE_BADTIMEOUT 0x800A0000 -/* CPU clock invariant to system time changes. Use only to measure durations, - * not absolute time. */ -UA_DateTime UA_EXPORT UA_DateTime_nowMonotonic(void); +/* The server does not support the requested service. */ +#define UA_STATUSCODE_BADSERVICEUNSUPPORTED 0x800B0000 -/* Represents a Datetime as a structure */ -typedef struct UA_DateTimeStruct { - UA_UInt16 nanoSec; - UA_UInt16 microSec; - UA_UInt16 milliSec; - UA_UInt16 sec; - UA_UInt16 min; - UA_UInt16 hour; - UA_UInt16 day; - UA_UInt16 month; - UA_UInt16 year; -} UA_DateTimeStruct; +/* The operation was cancelled because the application is shutting down. */ +#define UA_STATUSCODE_BADSHUTDOWN 0x800C0000 -UA_DateTimeStruct UA_EXPORT UA_DateTime_toStruct(UA_DateTime t); +/* The operation could not complete because the client is not connected to the server. */ +#define UA_STATUSCODE_BADSERVERNOTCONNECTED 0x800D0000 -/* The C99 standard (7.23.1) says: "The range and precision of times - * representable in clock_t and time_t are implementation-defined." On most - * systems, time_t is a 4 or 8 byte integer counting seconds since the UTC Unix - * epoch. The following methods are used for conversion. */ +/* The server has stopped and cannot process any requests. */ +#define UA_STATUSCODE_BADSERVERHALTED 0x800E0000 -/* Datetime of 1 Jan 1970 00:00 */ -#define UA_DATETIME_UNIX_EPOCH (11644473600LL * UA_DATETIME_SEC) +/* There was nothing to do because the client passed a list of operations with no elements. */ +#define UA_STATUSCODE_BADNOTHINGTODO 0x800F0000 -static UA_INLINE UA_Int64 -UA_DateTime_toUnixTime(UA_DateTime date) { - return (date - UA_DATETIME_UNIX_EPOCH) / UA_DATETIME_SEC; -} +/* The request could not be processed because it specified too many operations. */ +#define UA_STATUSCODE_BADTOOMANYOPERATIONS 0x80100000 -static UA_INLINE UA_DateTime -UA_DateTime_fromUnixTime(UA_Int64 unixDate) { - return (unixDate * UA_DATETIME_SEC) + UA_DATETIME_UNIX_EPOCH; -} +/* The request could not be processed because there are too many monitored items in the subscription. */ +#define UA_STATUSCODE_BADTOOMANYMONITOREDITEMS 0x80DB0000 -/** - * Guid - * ^^^^ - * A 16 byte value that can be used as a globally unique identifier. */ -typedef struct { - UA_UInt32 data1; - UA_UInt16 data2; - UA_UInt16 data3; - UA_Byte data4[8]; -} UA_Guid; +/* The extension object cannot be (de)serialized because the data type id is not recognized. */ +#define UA_STATUSCODE_BADDATATYPEIDUNKNOWN 0x80110000 -UA_Boolean UA_EXPORT UA_Guid_equal(const UA_Guid *g1, const UA_Guid *g2); +/* The certificate provided as a parameter is not valid. */ +#define UA_STATUSCODE_BADCERTIFICATEINVALID 0x80120000 -UA_EXPORT extern const UA_Guid UA_GUID_NULL; +/* An error occurred verifying security. */ +#define UA_STATUSCODE_BADSECURITYCHECKSFAILED 0x80130000 -/** - * ByteString - * ^^^^^^^^^^ - * A sequence of octets. */ -typedef UA_String UA_ByteString; +/* The certificate does not meet the requirements of the security policy. */ +#define UA_STATUSCODE_BADCERTIFICATEPOLICYCHECKFAILED 0x81140000 -static UA_INLINE UA_Boolean -UA_ByteString_equal(const UA_ByteString *string1, - const UA_ByteString *string2) { - return UA_String_equal((const UA_String*)string1, - (const UA_String*)string2); -} +/* The certificate has expired or is not yet valid. */ +#define UA_STATUSCODE_BADCERTIFICATETIMEINVALID 0x80140000 -/* Allocates memory of size length for the bytestring. - * The content is not set to zero. */ -UA_StatusCode UA_EXPORT -UA_ByteString_allocBuffer(UA_ByteString *bs, size_t length); +/* An issuer certificate has expired or is not yet valid. */ +#define UA_STATUSCODE_BADCERTIFICATEISSUERTIMEINVALID 0x80150000 -UA_EXPORT extern const UA_ByteString UA_BYTESTRING_NULL; +/* The HostName used to connect to a server does not match a HostName in the certificate. */ +#define UA_STATUSCODE_BADCERTIFICATEHOSTNAMEINVALID 0x80160000 -static UA_INLINE UA_ByteString -UA_BYTESTRING(char *chars) { - UA_ByteString str; str.length = strlen(chars); - str.data = (UA_Byte*)chars; return str; -} +/* The URI specified in the ApplicationDescription does not match the URI in the certificate. */ +#define UA_STATUSCODE_BADCERTIFICATEURIINVALID 0x80170000 -static UA_INLINE UA_ByteString -UA_BYTESTRING_ALLOC(const char *chars) { - UA_String str = UA_String_fromChars(chars); UA_ByteString bstr; - bstr.length = str.length; bstr.data = str.data; return bstr; -} +/* The certificate may not be used for the requested operation. */ +#define UA_STATUSCODE_BADCERTIFICATEUSENOTALLOWED 0x80180000 -/** - * XmlElement - * ^^^^^^^^^^ - * An XML element. */ -typedef UA_String UA_XmlElement; +/* The issuer certificate may not be used for the requested operation. */ +#define UA_STATUSCODE_BADCERTIFICATEISSUERUSENOTALLOWED 0x80190000 -/** - * .. _nodeid: - * - * NodeId - * ^^^^^^ - * An identifier for a node in the address space of an OPC UA Server. */ -enum UA_NodeIdType { - UA_NODEIDTYPE_NUMERIC = 0, /* In the binary encoding, this can also - become 1 or 2 (2byte and 4byte encoding of - small numeric nodeids) */ - UA_NODEIDTYPE_STRING = 3, - UA_NODEIDTYPE_GUID = 4, - UA_NODEIDTYPE_BYTESTRING = 5 -}; +/* The certificate is not trusted. */ +#define UA_STATUSCODE_BADCERTIFICATEUNTRUSTED 0x801A0000 -typedef struct { - UA_UInt16 namespaceIndex; - enum UA_NodeIdType identifierType; - union { - UA_UInt32 numeric; - UA_String string; - UA_Guid guid; - UA_ByteString byteString; - } identifier; -} UA_NodeId; +/* It was not possible to determine if the certificate has been revoked. */ +#define UA_STATUSCODE_BADCERTIFICATEREVOCATIONUNKNOWN 0x801B0000 -UA_EXPORT extern const UA_NodeId UA_NODEID_NULL; +/* It was not possible to determine if the issuer certificate has been revoked. */ +#define UA_STATUSCODE_BADCERTIFICATEISSUERREVOCATIONUNKNOWN 0x801C0000 -UA_Boolean UA_EXPORT UA_NodeId_isNull(const UA_NodeId *p); +/* The certificate has been revoked. */ +#define UA_STATUSCODE_BADCERTIFICATEREVOKED 0x801D0000 -UA_Boolean UA_EXPORT UA_NodeId_equal(const UA_NodeId *n1, const UA_NodeId *n2); +/* The issuer certificate has been revoked. */ +#define UA_STATUSCODE_BADCERTIFICATEISSUERREVOKED 0x801E0000 -/* Returns a non-cryptographic hash for the NodeId */ -UA_UInt32 UA_EXPORT UA_NodeId_hash(const UA_NodeId *n); +/* The certificate chain is incomplete. */ +#define UA_STATUSCODE_BADCERTIFICATECHAININCOMPLETE 0x810D0000 -/** The following functions are shorthand for creating NodeIds. */ -static UA_INLINE UA_NodeId -UA_NODEID_NUMERIC(UA_UInt16 nsIndex, UA_UInt32 identifier) { - UA_NodeId id; id.namespaceIndex = nsIndex; - id.identifierType = UA_NODEIDTYPE_NUMERIC; - id.identifier.numeric = identifier; return id; -} +/* User does not have permission to perform the requested operation. */ +#define UA_STATUSCODE_BADUSERACCESSDENIED 0x801F0000 -static UA_INLINE UA_NodeId -UA_NODEID_STRING(UA_UInt16 nsIndex, char *chars) { - UA_NodeId id; id.namespaceIndex = nsIndex; - id.identifierType = UA_NODEIDTYPE_STRING; - id.identifier.string = UA_STRING(chars); return id; -} +/* The user identity token is not valid. */ +#define UA_STATUSCODE_BADIDENTITYTOKENINVALID 0x80200000 -static UA_INLINE UA_NodeId -UA_NODEID_STRING_ALLOC(UA_UInt16 nsIndex, const char *chars) { - UA_NodeId id; id.namespaceIndex = nsIndex; - id.identifierType = UA_NODEIDTYPE_STRING; - id.identifier.string = UA_STRING_ALLOC(chars); return id; -} +/* The user identity token is valid but the server has rejected it. */ +#define UA_STATUSCODE_BADIDENTITYTOKENREJECTED 0x80210000 -static UA_INLINE UA_NodeId -UA_NODEID_GUID(UA_UInt16 nsIndex, UA_Guid guid) { - UA_NodeId id; id.namespaceIndex = nsIndex; - id.identifierType = UA_NODEIDTYPE_GUID; - id.identifier.guid = guid; return id; -} +/* The specified secure channel is no longer valid. */ +#define UA_STATUSCODE_BADSECURECHANNELIDINVALID 0x80220000 -static UA_INLINE UA_NodeId -UA_NODEID_BYTESTRING(UA_UInt16 nsIndex, char *chars) { - UA_NodeId id; id.namespaceIndex = nsIndex; - id.identifierType = UA_NODEIDTYPE_BYTESTRING; - id.identifier.byteString = UA_BYTESTRING(chars); return id; -} +/* The timestamp is outside the range allowed by the server. */ +#define UA_STATUSCODE_BADINVALIDTIMESTAMP 0x80230000 -static UA_INLINE UA_NodeId -UA_NODEID_BYTESTRING_ALLOC(UA_UInt16 nsIndex, const char *chars) { - UA_NodeId id; id.namespaceIndex = nsIndex; - id.identifierType = UA_NODEIDTYPE_BYTESTRING; - id.identifier.byteString = UA_BYTESTRING_ALLOC(chars); return id; -} +/* The nonce does appear to be not a random value or it is not the correct length. */ +#define UA_STATUSCODE_BADNONCEINVALID 0x80240000 -/** - * ExpandedNodeId - * ^^^^^^^^^^^^^^ - * A NodeId that allows the namespace URI to be specified instead of an index. */ -typedef struct { - UA_NodeId nodeId; - UA_String namespaceUri; - UA_UInt32 serverIndex; -} UA_ExpandedNodeId; +/* The session id is not valid. */ +#define UA_STATUSCODE_BADSESSIONIDINVALID 0x80250000 -UA_Boolean UA_EXPORT UA_ExpandedNodeId_equal(const UA_ExpandedNodeId *n1, - const UA_ExpandedNodeId *n2); +/* The session was closed by the client. */ +#define UA_STATUSCODE_BADSESSIONCLOSED 0x80260000 -UA_EXPORT extern const UA_ExpandedNodeId UA_EXPANDEDNODEID_NULL; +/* The session cannot be used because ActivateSession has not been called. */ +#define UA_STATUSCODE_BADSESSIONNOTACTIVATED 0x80270000 -/** The following functions are shorthand for creating ExpandedNodeIds. */ -static UA_INLINE UA_ExpandedNodeId -UA_EXPANDEDNODEID_NUMERIC(UA_UInt16 nsIndex, UA_UInt32 identifier) { - UA_ExpandedNodeId id; id.nodeId = UA_NODEID_NUMERIC(nsIndex, identifier); - id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id; -} +/* The subscription id is not valid. */ +#define UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID 0x80280000 -static UA_INLINE UA_ExpandedNodeId -UA_EXPANDEDNODEID_STRING(UA_UInt16 nsIndex, char *chars) { - UA_ExpandedNodeId id; id.nodeId = UA_NODEID_STRING(nsIndex, chars); - id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id; -} +/* The header for the request is missing or invalid. */ +#define UA_STATUSCODE_BADREQUESTHEADERINVALID 0x802A0000 -static UA_INLINE UA_ExpandedNodeId -UA_EXPANDEDNODEID_STRING_ALLOC(UA_UInt16 nsIndex, const char *chars) { - UA_ExpandedNodeId id; id.nodeId = UA_NODEID_STRING_ALLOC(nsIndex, chars); - id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id; -} +/* The timestamps to return parameter is invalid. */ +#define UA_STATUSCODE_BADTIMESTAMPSTORETURNINVALID 0x802B0000 -static UA_INLINE UA_ExpandedNodeId -UA_EXPANDEDNODEID_STRING_GUID(UA_UInt16 nsIndex, UA_Guid guid) { - UA_ExpandedNodeId id; id.nodeId = UA_NODEID_GUID(nsIndex, guid); - id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id; -} +/* The request was cancelled by the client. */ +#define UA_STATUSCODE_BADREQUESTCANCELLEDBYCLIENT 0x802C0000 -static UA_INLINE UA_ExpandedNodeId -UA_EXPANDEDNODEID_BYTESTRING(UA_UInt16 nsIndex, char *chars) { - UA_ExpandedNodeId id; id.nodeId = UA_NODEID_BYTESTRING(nsIndex, chars); - id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id; -} +/* Too many arguments were provided. */ +#define UA_STATUSCODE_BADTOOMANYARGUMENTS 0x80E50000 -static UA_INLINE UA_ExpandedNodeId -UA_EXPANDEDNODEID_BYTESTRING_ALLOC(UA_UInt16 nsIndex, const char *chars) { - UA_ExpandedNodeId id; id.nodeId = UA_NODEID_BYTESTRING_ALLOC(nsIndex, chars); - id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id; -} +/* The server requires a license to operate in general or to perform a service or operation */ +#define UA_STATUSCODE_BADLICENSEEXPIRED 0x810E0000 -/** - * .. _qualifiedname: - * - * QualifiedName - * ^^^^^^^^^^^^^ - * A name qualified by a namespace. */ -typedef struct { - UA_UInt16 namespaceIndex; - UA_String name; -} UA_QualifiedName; +/* The server has limits on number of allowed operations / objects */ +#define UA_STATUSCODE_BADLICENSELIMITSEXCEEDED 0x810F0000 -static UA_INLINE UA_Boolean -UA_QualifiedName_isNull(const UA_QualifiedName *q) { - return (q->namespaceIndex == 0 && q->name.length == 0); -} +/* The server does not have a license which is required to operate in general or to perform a service or operation. */ +#define UA_STATUSCODE_BADLICENSENOTAVAILABLE 0x81100000 -static UA_INLINE UA_QualifiedName -UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { - UA_QualifiedName qn; qn.namespaceIndex = nsIndex; - qn.name = UA_STRING(chars); return qn; -} +/* The subscription was transferred to another session. */ +#define UA_STATUSCODE_GOODSUBSCRIPTIONTRANSFERRED 0x002D0000 -static UA_INLINE UA_QualifiedName -UA_QUALIFIEDNAME_ALLOC(UA_UInt16 nsIndex, const char *chars) { - UA_QualifiedName qn; qn.namespaceIndex = nsIndex; - qn.name = UA_STRING_ALLOC(chars); return qn; -} +/* The processing will complete asynchronously. */ +#define UA_STATUSCODE_GOODCOMPLETESASYNCHRONOUSLY 0x002E0000 -UA_Boolean UA_EXPORT -UA_QualifiedName_equal(const UA_QualifiedName *qn1, - const UA_QualifiedName *qn2); +/* Sampling has slowed down due to resource limitations. */ +#define UA_STATUSCODE_GOODOVERLOAD 0x002F0000 -/** - * LocalizedText - * ^^^^^^^^^^^^^ - * Human readable text with an optional locale identifier. */ -typedef struct { - UA_String locale; - UA_String text; -} UA_LocalizedText; +/* The value written was accepted but was clamped. */ +#define UA_STATUSCODE_GOODCLAMPED 0x00300000 -static UA_INLINE UA_LocalizedText -UA_LOCALIZEDTEXT(char *locale, char *text) { - UA_LocalizedText lt; lt.locale = UA_STRING(locale); - lt.text = UA_STRING(text); return lt; -} +/* Communication with the data source is defined */ +#define UA_STATUSCODE_BADNOCOMMUNICATION 0x80310000 -static UA_INLINE UA_LocalizedText -UA_LOCALIZEDTEXT_ALLOC(const char *locale, const char *text) { - UA_LocalizedText lt; lt.locale = UA_STRING_ALLOC(locale); - lt.text = UA_STRING_ALLOC(text); return lt; -} +/* Waiting for the server to obtain values from the underlying data source. */ +#define UA_STATUSCODE_BADWAITINGFORINITIALDATA 0x80320000 -/** - * .. _numericrange: - * - * NumericRange - * ^^^^^^^^^^^^ - * - * NumericRanges are used to indicate subsets of a (multidimensional) array. - * They no official data type in the OPC UA standard and are transmitted only - * with a string encoding, such as "1:2,0:3,5". The colon separates min/max - * index and the comma separates dimensions. A single value indicates a range - * with a single element (min==max). */ -typedef struct { - UA_UInt32 min; - UA_UInt32 max; -} UA_NumericRangeDimension; +/* The syntax of the node id is not valid. */ +#define UA_STATUSCODE_BADNODEIDINVALID 0x80330000 -typedef struct { - size_t dimensionsSize; - UA_NumericRangeDimension *dimensions; -} UA_NumericRange; +/* The node id refers to a node that does not exist in the server address space. */ +#define UA_STATUSCODE_BADNODEIDUNKNOWN 0x80340000 -/** - * .. _variant: - * - * Variant - * ^^^^^^^ - * - * Variants may contain values of any type together with a description of the - * content. See the section on :ref:`generic-types` on how types are described. - * The standard mandates that variants contain built-in data types only. If the - * value is not of a builtin type, it is wrapped into an :ref:`extensionobject`. - * open62541 hides this wrapping transparently in the encoding layer. If the - * data type is unknown to the receiver, the variant contains the original - * ExtensionObject in binary or XML encoding. - * - * Variants may contain a scalar value or an array. For details on the handling - * of arrays, see the section on :ref:`array-handling`. Array variants can have - * an additional dimensionality (matrix, 3-tensor, ...) defined in an array of - * dimension lengths. The actual values are kept in an array of dimensions one. - * For users who work with higher-dimensions arrays directly, keep in mind that - * dimensions of higher rank are serialized first (the highest rank dimension - * has stride 1 and elements follow each other directly). Usually it is simplest - * to interact with higher-dimensional arrays via ``UA_NumericRange`` - * descriptions (see :ref:`array-handling`). - * - * To differentiate between scalar / array variants, the following definition is - * used. ``UA_Variant_isScalar`` provides simplified access to these checks. - * - * - ``arrayLength == 0 && data == NULL``: undefined array of length -1 - * - ``arrayLength == 0 && data == UA_EMPTY_ARRAY_SENTINEL``: array of length 0 - * - ``arrayLength == 0 && data > UA_EMPTY_ARRAY_SENTINEL``: scalar value - * - ``arrayLength > 0``: array of the given length - * - * Variants can also be *empty*. Then, the pointer to the type description is - * ``NULL``. */ -/* Forward declaration. See the section on Generic Type Handling */ -struct UA_DataType; -typedef struct UA_DataType UA_DataType; +/* The attribute is not supported for the specified Node. */ +#define UA_STATUSCODE_BADATTRIBUTEIDINVALID 0x80350000 -#define UA_EMPTY_ARRAY_SENTINEL ((void*)0x01) +/* The syntax of the index range parameter is invalid. */ +#define UA_STATUSCODE_BADINDEXRANGEINVALID 0x80360000 -typedef enum { - UA_VARIANT_DATA, /* The data has the same lifecycle as the - variant */ - UA_VARIANT_DATA_NODELETE /* The data is "borrowed" by the variant and - shall not be deleted at the end of the - variant's lifecycle. */ -} UA_VariantStorageType; +/* No data exists within the range of indexes specified. */ +#define UA_STATUSCODE_BADINDEXRANGENODATA 0x80370000 -typedef struct { - const UA_DataType *type; /* The data type description */ - UA_VariantStorageType storageType; - size_t arrayLength; /* The number of elements in the data array */ - void *data; /* Points to the scalar or array data */ - size_t arrayDimensionsSize; /* The number of dimensions */ - UA_UInt32 *arrayDimensions; /* The length of each dimension */ -} UA_Variant; +/* The data encoding is invalid. */ +#define UA_STATUSCODE_BADDATAENCODINGINVALID 0x80380000 -/* Returns true if the variant has no value defined (contains neither an array - * nor a scalar value). - * - * @param v The variant - * @return Is the variant empty */ -static UA_INLINE UA_Boolean -UA_Variant_isEmpty(const UA_Variant *v) { - return v->type == NULL; -} +/* The server does not support the requested data encoding for the node. */ +#define UA_STATUSCODE_BADDATAENCODINGUNSUPPORTED 0x80390000 -/* Returns true if the variant contains a scalar value. Note that empty variants - * contain an array of length -1 (undefined). - * - * @param v The variant - * @return Does the variant contain a scalar value */ -static UA_INLINE UA_Boolean -UA_Variant_isScalar(const UA_Variant *v) { - return (v->arrayLength == 0 && v->data > UA_EMPTY_ARRAY_SENTINEL); -} +/* The access level does not allow reading or subscribing to the Node. */ +#define UA_STATUSCODE_BADNOTREADABLE 0x803A0000 -/* Returns true if the variant contains a scalar value of the given type. - * - * @param v The variant - * @param type The data type - * @return Does the variant contain a scalar value of the given type */ -static UA_INLINE UA_Boolean -UA_Variant_hasScalarType(const UA_Variant *v, const UA_DataType *type) { - return UA_Variant_isScalar(v) && type == v->type; -} +/* The access level does not allow writing to the Node. */ +#define UA_STATUSCODE_BADNOTWRITABLE 0x803B0000 -/* Returns true if the variant contains an array of the given type. - * - * @param v The variant - * @param type The data type - * @return Does the variant contain an array of the given type */ -static UA_INLINE UA_Boolean -UA_Variant_hasArrayType(const UA_Variant *v, const UA_DataType *type) { - return (!UA_Variant_isScalar(v)) && type == v->type; -} +/* The value was out of range. */ +#define UA_STATUSCODE_BADOUTOFRANGE 0x803C0000 -/* Set the variant to a scalar value that already resides in memory. The value - * takes on the lifecycle of the variant and is deleted with it. - * - * @param v The variant - * @param p A pointer to the value data - * @param type The datatype of the value in question */ -void UA_EXPORT -UA_Variant_setScalar(UA_Variant *v, void * UA_RESTRICT p, - const UA_DataType *type); +/* The requested operation is not supported. */ +#define UA_STATUSCODE_BADNOTSUPPORTED 0x803D0000 -/* Set the variant to a scalar value that is copied from an existing variable. - * @param v The variant - * @param p A pointer to the value data - * @param type The datatype of the value - * @return Indicates whether the operation succeeded or returns an error code */ -UA_StatusCode UA_EXPORT -UA_Variant_setScalarCopy(UA_Variant *v, const void *p, - const UA_DataType *type); +/* A requested item was not found or a search operation ended without success. */ +#define UA_STATUSCODE_BADNOTFOUND 0x803E0000 -/* Set the variant to an array that already resides in memory. The array takes - * on the lifecycle of the variant and is deleted with it. - * - * @param v The variant - * @param array A pointer to the array data - * @param arraySize The size of the array - * @param type The datatype of the array */ -void UA_EXPORT -UA_Variant_setArray(UA_Variant *v, void * UA_RESTRICT array, - size_t arraySize, const UA_DataType *type); +/* The object cannot be used because it has been deleted. */ +#define UA_STATUSCODE_BADOBJECTDELETED 0x803F0000 -/* Set the variant to an array that is copied from an existing array. - * - * @param v The variant - * @param array A pointer to the array data - * @param arraySize The size of the array - * @param type The datatype of the array - * @return Indicates whether the operation succeeded or returns an error code */ -UA_StatusCode UA_EXPORT -UA_Variant_setArrayCopy(UA_Variant *v, const void *array, - size_t arraySize, const UA_DataType *type); +/* Requested operation is not implemented. */ +#define UA_STATUSCODE_BADNOTIMPLEMENTED 0x80400000 -/* Copy the variant, but use only a subset of the (multidimensional) array into - * a variant. Returns an error code if the variant is not an array or if the - * indicated range does not fit. - * - * @param src The source variant - * @param dst The target variant - * @param range The range of the copied data - * @return Returns UA_STATUSCODE_GOOD or an error code */ -UA_StatusCode UA_EXPORT -UA_Variant_copyRange(const UA_Variant *src, UA_Variant *dst, - const UA_NumericRange range); +/* The monitoring mode is invalid. */ +#define UA_STATUSCODE_BADMONITORINGMODEINVALID 0x80410000 -/* Insert a range of data into an existing variant. The data array can't be - * reused afterwards if it contains types without a fixed size (e.g. strings) - * since the members are moved into the variant and take on its lifecycle. - * - * @param v The variant - * @param dataArray The data array. The type must match the variant - * @param dataArraySize The length of the data array. This is checked to match - * the range size. - * @param range The range of where the new data is inserted - * @return Returns UA_STATUSCODE_GOOD or an error code */ -UA_StatusCode UA_EXPORT -UA_Variant_setRange(UA_Variant *v, void * UA_RESTRICT array, - size_t arraySize, const UA_NumericRange range); +/* The monitoring item id does not refer to a valid monitored item. */ +#define UA_STATUSCODE_BADMONITOREDITEMIDINVALID 0x80420000 -/* Deep-copy a range of data into an existing variant. - * - * @param v The variant - * @param dataArray The data array. The type must match the variant - * @param dataArraySize The length of the data array. This is checked to match - * the range size. - * @param range The range of where the new data is inserted - * @return Returns UA_STATUSCODE_GOOD or an error code */ -UA_StatusCode UA_EXPORT -UA_Variant_setRangeCopy(UA_Variant *v, const void *array, - size_t arraySize, const UA_NumericRange range); +/* The monitored item filter parameter is not valid. */ +#define UA_STATUSCODE_BADMONITOREDITEMFILTERINVALID 0x80430000 -/** - * .. _extensionobject: - * - * ExtensionObject - * ^^^^^^^^^^^^^^^ - * - * ExtensionObjects may contain scalars of any data type. Even those that are - * unknown to the receiver. See the section on :ref:`generic-types` on how types - * are described. If the received data type is unknown, the encoded string and - * target NodeId is stored instead of the decoded value. */ -typedef enum { - UA_EXTENSIONOBJECT_ENCODED_NOBODY = 0, - UA_EXTENSIONOBJECT_ENCODED_BYTESTRING = 1, - UA_EXTENSIONOBJECT_ENCODED_XML = 2, - UA_EXTENSIONOBJECT_DECODED = 3, - UA_EXTENSIONOBJECT_DECODED_NODELETE = 4 /* Don't delete the content - together with the - ExtensionObject */ -} UA_ExtensionObjectEncoding; +/* The server does not support the requested monitored item filter. */ +#define UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED 0x80440000 -typedef struct { - UA_ExtensionObjectEncoding encoding; - union { - struct { - UA_NodeId typeId; /* The nodeid of the datatype */ - UA_ByteString body; /* The bytestring of the encoded data */ - } encoded; - struct { - const UA_DataType *type; - void *data; - } decoded; - } content; -} UA_ExtensionObject; +/* A monitoring filter cannot be used in combination with the attribute specified. */ +#define UA_STATUSCODE_BADFILTERNOTALLOWED 0x80450000 -/** - * .. _datavalue: - * - * DataValue - * ^^^^^^^^^ - * A data value with an associated status code and timestamps. */ -typedef struct { - UA_Boolean hasValue : 1; - UA_Boolean hasStatus : 1; - UA_Boolean hasSourceTimestamp : 1; - UA_Boolean hasServerTimestamp : 1; - UA_Boolean hasSourcePicoseconds : 1; - UA_Boolean hasServerPicoseconds : 1; - UA_Variant value; - UA_StatusCode status; - UA_DateTime sourceTimestamp; - UA_UInt16 sourcePicoseconds; - UA_DateTime serverTimestamp; - UA_UInt16 serverPicoseconds; -} UA_DataValue; +/* A mandatory structured parameter was missing or null. */ +#define UA_STATUSCODE_BADSTRUCTUREMISSING 0x80460000 -/** - * DiagnosticInfo - * ^^^^^^^^^^^^^^ - * A structure that contains detailed error and diagnostic information - * associated with a StatusCode. */ -typedef struct UA_DiagnosticInfo { - UA_Boolean hasSymbolicId : 1; - UA_Boolean hasNamespaceUri : 1; - UA_Boolean hasLocalizedText : 1; - UA_Boolean hasLocale : 1; - UA_Boolean hasAdditionalInfo : 1; - UA_Boolean hasInnerStatusCode : 1; - UA_Boolean hasInnerDiagnosticInfo : 1; - UA_Int32 symbolicId; - UA_Int32 namespaceUri; - UA_Int32 localizedText; - UA_Int32 locale; - UA_String additionalInfo; - UA_StatusCode innerStatusCode; - struct UA_DiagnosticInfo *innerDiagnosticInfo; -} UA_DiagnosticInfo; +/* The event filter is not valid. */ +#define UA_STATUSCODE_BADEVENTFILTERINVALID 0x80470000 -/** - * .. _generic-types: - * - * Generic Type Handling - * --------------------- - * - * All information about a (builtin/structured) data type is stored in a - * ``UA_DataType``. The array ``UA_TYPES`` contains the description of all - * standard-defined types. This type description is used for the following - * generic operations that work on all types: - * - * - ``void T_init(T *ptr)``: Initialize the data type. This is synonymous with - * zeroing out the memory, i.e. ``memset(ptr, 0, sizeof(T))``. - * - ``T* T_new()``: Allocate and return the memory for the data type. The - * value is already initialized. - * - ``UA_StatusCode T_copy(const T *src, T *dst)``: Copy the content of the - * data type. Returns ``UA_STATUSCODE_GOOD`` or - * ``UA_STATUSCODE_BADOUTOFMEMORY``. - * - ``void T_deleteMembers(T *ptr)``: Delete the dynamically allocated content - * of the data type and perform a ``T_init`` to reset the type. - * - ``void T_delete(T *ptr)``: Delete the content of the data type and the - * memory for the data type itself. - * - * Specializations, such as ``UA_Int32_new()`` are derived from the generic - * type operations as static inline functions. */ +/* The content filter is not valid. */ +#define UA_STATUSCODE_BADCONTENTFILTERINVALID 0x80480000 -typedef struct { -#ifdef UA_ENABLE_TYPENAMES - const char *memberName; -#endif - UA_UInt16 memberTypeIndex; /* Index of the member in the array of data - types */ - UA_Byte padding; /* How much padding is there before this - member element? For arrays this is the - padding before the size_t length member. - (No padding between size_t and the - following ptr.) */ - UA_Boolean namespaceZero : 1; /* The type of the member is defined in - namespace zero. In this implementation, - types from custom namespace may contain - members from the same namespace or - namespace zero only.*/ - UA_Boolean isArray : 1; /* The member is an array */ -} UA_DataTypeMember; +/* An unrecognized operator was provided in a filter. */ +#define UA_STATUSCODE_BADFILTEROPERATORINVALID 0x80C10000 -struct UA_DataType { -#ifdef UA_ENABLE_TYPENAMES - 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 */ - UA_Byte membersSize; /* How many members does the type have? */ - UA_Boolean builtin : 1; /* The type is "builtin" and has dedicated de- - and encoding functions */ - UA_Boolean pointerFree : 1; /* The type (and its members) contains no - pointers that need to be freed */ - UA_Boolean overlayable : 1; /* The type has the identical memory layout in - memory and on the binary stream. */ - UA_UInt16 binaryEncodingId; /* NodeId of datatype when encoded as binary */ - //UA_UInt16 xmlEncodingId; /* NodeId of datatype when encoded as XML */ - UA_DataTypeMember *members; -}; +/* A valid operator was provided */ +#define UA_STATUSCODE_BADFILTEROPERATORUNSUPPORTED 0x80C20000 -/* Test if the data type is a numeric builtin data type. This includes Boolean, - * integers and floating point numbers. Not included are DateTime and - * StatusCode. */ -UA_Boolean -isDataTypeNumeric(const UA_DataType *type); +/* The number of operands provided for the filter operator was less then expected for the operand provided. */ +#define UA_STATUSCODE_BADFILTEROPERANDCOUNTMISMATCH 0x80C30000 -/* The following is used to exclude type names in the definition of UA_DataType - * structures if the feature is disabled. */ -#ifdef UA_ENABLE_TYPENAMES -# define UA_TYPENAME(name) name, -#else -# define UA_TYPENAME(name) -#endif +/* The operand used in a content filter is not valid. */ +#define UA_STATUSCODE_BADFILTEROPERANDINVALID 0x80490000 -/** - * Builtin data types can be accessed as UA_TYPES[UA_TYPES_XXX], where XXX is - * the name of the data type. If only the NodeId of a type is known, use the - * following method to retrieve the data type description. */ +/* The referenced element is not a valid element in the content filter. */ +#define UA_STATUSCODE_BADFILTERELEMENTINVALID 0x80C40000 -/* Returns the data type description for the type's identifier or NULL if no - * matching data type was found. */ -const UA_DataType UA_EXPORT * -UA_findDataType(const UA_NodeId *typeId); +/* The referenced literal is not a valid value. */ +#define UA_STATUSCODE_BADFILTERLITERALINVALID 0x80C50000 -/** The following functions are used for generic handling of data types. */ +/* The continuation point provide is longer valid. */ +#define UA_STATUSCODE_BADCONTINUATIONPOINTINVALID 0x804A0000 -/* Allocates and initializes a variable of type dataType - * - * @param type The datatype description - * @return Returns the memory location of the variable or NULL if no - * memory could be allocated */ -void UA_EXPORT * UA_new(const UA_DataType *type) UA_FUNC_ATTR_MALLOC; +/* The operation could not be processed because all continuation points have been allocated. */ +#define UA_STATUSCODE_BADNOCONTINUATIONPOINTS 0x804B0000 -/* Initializes a variable to default values - * - * @param p The memory location of the variable - * @param type The datatype description */ -static UA_INLINE void -UA_init(void *p, const UA_DataType *type) { - memset(p, 0, type->memSize); -} +/* The reference type id does not refer to a valid reference type node. */ +#define UA_STATUSCODE_BADREFERENCETYPEIDINVALID 0x804C0000 -/* Copies the content of two variables. If copying fails (e.g. because no memory - * was available for an array), then dst is emptied and initialized to prevent - * memory leaks. - * - * @param src The memory location of the source variable - * @param dst The memory location of the destination variable - * @param type The datatype description - * @return Indicates whether the operation succeeded or returns an error code */ -UA_StatusCode UA_EXPORT -UA_copy(const void *src, void *dst, const UA_DataType *type); +/* The browse direction is not valid. */ +#define UA_STATUSCODE_BADBROWSEDIRECTIONINVALID 0x804D0000 -/* Deletes the dynamically allocated content of a variable (e.g. resets all - * arrays to undefined arrays). Afterwards, the variable can be safely deleted - * without causing memory leaks. But the variable is not initialized and may - * contain old data that is not memory-relevant. - * - * @param p The memory location of the variable - * @param type The datatype description of the variable */ -void UA_EXPORT UA_deleteMembers(void *p, const UA_DataType *type); +/* The node is not part of the view. */ +#define UA_STATUSCODE_BADNODENOTINVIEW 0x804E0000 -/* Frees a variable and all of its content. - * - * @param p The memory location of the variable - * @param type The datatype description of the variable */ -void UA_EXPORT UA_delete(void *p, const UA_DataType *type); +/* The number was not accepted because of a numeric overflow. */ +#define UA_STATUSCODE_BADNUMERICOVERFLOW 0x81120000 + +/* The ServerUri is not a valid URI. */ +#define UA_STATUSCODE_BADSERVERURIINVALID 0x804F0000 + +/* No ServerName was specified. */ +#define UA_STATUSCODE_BADSERVERNAMEMISSING 0x80500000 + +/* No DiscoveryUrl was specified. */ +#define UA_STATUSCODE_BADDISCOVERYURLMISSING 0x80510000 + +/* The semaphore file specified by the client is not valid. */ +#define UA_STATUSCODE_BADSEMPAHOREFILEMISSING 0x80520000 + +/* The security token request type is not valid. */ +#define UA_STATUSCODE_BADREQUESTTYPEINVALID 0x80530000 + +/* The security mode does not meet the requirements set by the server. */ +#define UA_STATUSCODE_BADSECURITYMODEREJECTED 0x80540000 + +/* The security policy does not meet the requirements set by the server. */ +#define UA_STATUSCODE_BADSECURITYPOLICYREJECTED 0x80550000 + +/* The server has reached its maximum number of sessions. */ +#define UA_STATUSCODE_BADTOOMANYSESSIONS 0x80560000 + +/* The user token signature is missing or invalid. */ +#define UA_STATUSCODE_BADUSERSIGNATUREINVALID 0x80570000 + +/* The signature generated with the client certificate is missing or invalid. */ +#define UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID 0x80580000 + +/* The client did not provide at least one software certificate that is valid and meets the profile requirements for the server. */ +#define UA_STATUSCODE_BADNOVALIDCERTIFICATES 0x80590000 + +/* The server does not support changing the user identity assigned to the session. */ +#define UA_STATUSCODE_BADIDENTITYCHANGENOTSUPPORTED 0x80C60000 + +/* The request was cancelled by the client with the Cancel service. */ +#define UA_STATUSCODE_BADREQUESTCANCELLEDBYREQUEST 0x805A0000 + +/* The parent node id does not to refer to a valid node. */ +#define UA_STATUSCODE_BADPARENTNODEIDINVALID 0x805B0000 + +/* The reference could not be created because it violates constraints imposed by the data model. */ +#define UA_STATUSCODE_BADREFERENCENOTALLOWED 0x805C0000 + +/* The requested node id was reject because it was either invalid or server does not allow node ids to be specified by the client. */ +#define UA_STATUSCODE_BADNODEIDREJECTED 0x805D0000 + +/* The requested node id is already used by another node. */ +#define UA_STATUSCODE_BADNODEIDEXISTS 0x805E0000 + +/* The node class is not valid. */ +#define UA_STATUSCODE_BADNODECLASSINVALID 0x805F0000 + +/* The browse name is invalid. */ +#define UA_STATUSCODE_BADBROWSENAMEINVALID 0x80600000 + +/* The browse name is not unique among nodes that share the same relationship with the parent. */ +#define UA_STATUSCODE_BADBROWSENAMEDUPLICATED 0x80610000 + +/* The node attributes are not valid for the node class. */ +#define UA_STATUSCODE_BADNODEATTRIBUTESINVALID 0x80620000 + +/* The type definition node id does not reference an appropriate type node. */ +#define UA_STATUSCODE_BADTYPEDEFINITIONINVALID 0x80630000 + +/* The source node id does not reference a valid node. */ +#define UA_STATUSCODE_BADSOURCENODEIDINVALID 0x80640000 + +/* The target node id does not reference a valid node. */ +#define UA_STATUSCODE_BADTARGETNODEIDINVALID 0x80650000 + +/* The reference type between the nodes is already defined. */ +#define UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED 0x80660000 + +/* The server does not allow this type of self reference on this node. */ +#define UA_STATUSCODE_BADINVALIDSELFREFERENCE 0x80670000 + +/* The reference type is not valid for a reference to a remote server. */ +#define UA_STATUSCODE_BADREFERENCELOCALONLY 0x80680000 + +/* The server will not allow the node to be deleted. */ +#define UA_STATUSCODE_BADNODELETERIGHTS 0x80690000 + +/* The server was not able to delete all target references. */ +#define UA_STATUSCODE_UNCERTAINREFERENCENOTDELETED 0x40BC0000 + +/* The server index is not valid. */ +#define UA_STATUSCODE_BADSERVERINDEXINVALID 0x806A0000 + +/* The view id does not refer to a valid view node. */ +#define UA_STATUSCODE_BADVIEWIDUNKNOWN 0x806B0000 + +/* The view timestamp is not available or not supported. */ +#define UA_STATUSCODE_BADVIEWTIMESTAMPINVALID 0x80C90000 + +/* The view parameters are not consistent with each other. */ +#define UA_STATUSCODE_BADVIEWPARAMETERMISMATCH 0x80CA0000 + +/* The view version is not available or not supported. */ +#define UA_STATUSCODE_BADVIEWVERSIONINVALID 0x80CB0000 + +/* The list of references may not be complete because the underlying system is not available. */ +#define UA_STATUSCODE_UNCERTAINNOTALLNODESAVAILABLE 0x40C00000 + +/* The server should have followed a reference to a node in a remote server but did not. The result set may be incomplete. */ +#define UA_STATUSCODE_GOODRESULTSMAYBEINCOMPLETE 0x00BA0000 + +/* The provided Nodeid was not a type definition nodeid. */ +#define UA_STATUSCODE_BADNOTTYPEDEFINITION 0x80C80000 + +/* One of the references to follow in the relative path references to a node in the address space in another server. */ +#define UA_STATUSCODE_UNCERTAINREFERENCEOUTOFSERVER 0x406C0000 + +/* The requested operation has too many matches to return. */ +#define UA_STATUSCODE_BADTOOMANYMATCHES 0x806D0000 + +/* The requested operation requires too many resources in the server. */ +#define UA_STATUSCODE_BADQUERYTOOCOMPLEX 0x806E0000 + +/* The requested operation has no match to return. */ +#define UA_STATUSCODE_BADNOMATCH 0x806F0000 + +/* The max age parameter is invalid. */ +#define UA_STATUSCODE_BADMAXAGEINVALID 0x80700000 + +/* The operation is not permitted over the current secure channel. */ +#define UA_STATUSCODE_BADSECURITYMODEINSUFFICIENT 0x80E60000 + +/* The history details parameter is not valid. */ +#define UA_STATUSCODE_BADHISTORYOPERATIONINVALID 0x80710000 + +/* The server does not support the requested operation. */ +#define UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED 0x80720000 + +/* The defined timestamp to return was invalid. */ +#define UA_STATUSCODE_BADINVALIDTIMESTAMPARGUMENT 0x80BD0000 + +/* The server does not support writing the combination of value */ +#define UA_STATUSCODE_BADWRITENOTSUPPORTED 0x80730000 + +/* The value supplied for the attribute is not of the same type as the attribute's value. */ +#define UA_STATUSCODE_BADTYPEMISMATCH 0x80740000 + +/* The method id does not refer to a method for the specified object. */ +#define UA_STATUSCODE_BADMETHODINVALID 0x80750000 + +/* The client did not specify all of the input arguments for the method. */ +#define UA_STATUSCODE_BADARGUMENTSMISSING 0x80760000 + +/* The executable attribute does not allow the execution of the method. */ +#define UA_STATUSCODE_BADNOTEXECUTABLE 0x81110000 + +/* The server has reached its maximum number of subscriptions. */ +#define UA_STATUSCODE_BADTOOMANYSUBSCRIPTIONS 0x80770000 + +/* The server has reached the maximum number of queued publish requests. */ +#define UA_STATUSCODE_BADTOOMANYPUBLISHREQUESTS 0x80780000 + +/* There is no subscription available for this session. */ +#define UA_STATUSCODE_BADNOSUBSCRIPTION 0x80790000 + +/* The sequence number is unknown to the server. */ +#define UA_STATUSCODE_BADSEQUENCENUMBERUNKNOWN 0x807A0000 + +/* The requested notification message is no longer available. */ +#define UA_STATUSCODE_BADMESSAGENOTAVAILABLE 0x807B0000 + +/* The client of the current session does not support one or more Profiles that are necessary for the subscription. */ +#define UA_STATUSCODE_BADINSUFFICIENTCLIENTPROFILE 0x807C0000 + +/* The sub-state machine is not currently active. */ +#define UA_STATUSCODE_BADSTATENOTACTIVE 0x80BF0000 + +/* An equivalent rule already exists. */ +#define UA_STATUSCODE_BADALREADYEXISTS 0x81150000 + +/* The server cannot process the request because it is too busy. */ +#define UA_STATUSCODE_BADTCPSERVERTOOBUSY 0x807D0000 + +/* The type of the message specified in the header invalid. */ +#define UA_STATUSCODE_BADTCPMESSAGETYPEINVALID 0x807E0000 + +/* The SecureChannelId and/or TokenId are not currently in use. */ +#define UA_STATUSCODE_BADTCPSECURECHANNELUNKNOWN 0x807F0000 + +/* The size of the message specified in the header is too large. */ +#define UA_STATUSCODE_BADTCPMESSAGETOOLARGE 0x80800000 + +/* There are not enough resources to process the request. */ +#define UA_STATUSCODE_BADTCPNOTENOUGHRESOURCES 0x80810000 + +/* An internal error occurred. */ +#define UA_STATUSCODE_BADTCPINTERNALERROR 0x80820000 + +/* The server does not recognize the QueryString specified. */ +#define UA_STATUSCODE_BADTCPENDPOINTURLINVALID 0x80830000 + +/* The request could not be sent because of a network interruption. */ +#define UA_STATUSCODE_BADREQUESTINTERRUPTED 0x80840000 + +/* Timeout occurred while processing the request. */ +#define UA_STATUSCODE_BADREQUESTTIMEOUT 0x80850000 + +/* The secure channel has been closed. */ +#define UA_STATUSCODE_BADSECURECHANNELCLOSED 0x80860000 + +/* The token has expired or is not recognized. */ +#define UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN 0x80870000 + +/* The sequence number is not valid. */ +#define UA_STATUSCODE_BADSEQUENCENUMBERINVALID 0x80880000 + +/* The applications do not have compatible protocol versions. */ +#define UA_STATUSCODE_BADPROTOCOLVERSIONUNSUPPORTED 0x80BE0000 + +/* There is a problem with the configuration that affects the usefulness of the value. */ +#define UA_STATUSCODE_BADCONFIGURATIONERROR 0x80890000 + +/* The variable should receive its value from another variable */ +#define UA_STATUSCODE_BADNOTCONNECTED 0x808A0000 + +/* There has been a failure in the device/data source that generates the value that has affected the value. */ +#define UA_STATUSCODE_BADDEVICEFAILURE 0x808B0000 + +/* There has been a failure in the sensor from which the value is derived by the device/data source. */ +#define UA_STATUSCODE_BADSENSORFAILURE 0x808C0000 + +/* The source of the data is not operational. */ +#define UA_STATUSCODE_BADOUTOFSERVICE 0x808D0000 + +/* The deadband filter is not valid. */ +#define UA_STATUSCODE_BADDEADBANDFILTERINVALID 0x808E0000 + +/* Communication to the data source has failed. The variable value is the last value that had a good quality. */ +#define UA_STATUSCODE_UNCERTAINNOCOMMUNICATIONLASTUSABLEVALUE 0x408F0000 + +/* Whatever was updating this value has stopped doing so. */ +#define UA_STATUSCODE_UNCERTAINLASTUSABLEVALUE 0x40900000 + +/* The value is an operational value that was manually overwritten. */ +#define UA_STATUSCODE_UNCERTAINSUBSTITUTEVALUE 0x40910000 + +/* The value is an initial value for a variable that normally receives its value from another variable. */ +#define UA_STATUSCODE_UNCERTAININITIALVALUE 0x40920000 + +/* The value is at one of the sensor limits. */ +#define UA_STATUSCODE_UNCERTAINSENSORNOTACCURATE 0x40930000 + +/* The value is outside of the range of values defined for this parameter. */ +#define UA_STATUSCODE_UNCERTAINENGINEERINGUNITSEXCEEDED 0x40940000 + +/* The value is derived from multiple sources and has less than the required number of Good sources. */ +#define UA_STATUSCODE_UNCERTAINSUBNORMAL 0x40950000 + +/* The value has been overridden. */ +#define UA_STATUSCODE_GOODLOCALOVERRIDE 0x00960000 + +/* This Condition refresh failed */ +#define UA_STATUSCODE_BADREFRESHINPROGRESS 0x80970000 + +/* This condition has already been disabled. */ +#define UA_STATUSCODE_BADCONDITIONALREADYDISABLED 0x80980000 + +/* This condition has already been enabled. */ +#define UA_STATUSCODE_BADCONDITIONALREADYENABLED 0x80CC0000 + +/* Property not available */ +#define UA_STATUSCODE_BADCONDITIONDISABLED 0x80990000 + +/* The specified event id is not recognized. */ +#define UA_STATUSCODE_BADEVENTIDUNKNOWN 0x809A0000 + +/* The event cannot be acknowledged. */ +#define UA_STATUSCODE_BADEVENTNOTACKNOWLEDGEABLE 0x80BB0000 + +/* The dialog condition is not active. */ +#define UA_STATUSCODE_BADDIALOGNOTACTIVE 0x80CD0000 + +/* The response is not valid for the dialog. */ +#define UA_STATUSCODE_BADDIALOGRESPONSEINVALID 0x80CE0000 + +/* The condition branch has already been acknowledged. */ +#define UA_STATUSCODE_BADCONDITIONBRANCHALREADYACKED 0x80CF0000 + +/* The condition branch has already been confirmed. */ +#define UA_STATUSCODE_BADCONDITIONBRANCHALREADYCONFIRMED 0x80D00000 + +/* The condition has already been shelved. */ +#define UA_STATUSCODE_BADCONDITIONALREADYSHELVED 0x80D10000 + +/* The condition is not currently shelved. */ +#define UA_STATUSCODE_BADCONDITIONNOTSHELVED 0x80D20000 + +/* The shelving time not within an acceptable range. */ +#define UA_STATUSCODE_BADSHELVINGTIMEOUTOFRANGE 0x80D30000 + +/* No data exists for the requested time range or event filter. */ +#define UA_STATUSCODE_BADNODATA 0x809B0000 + +/* No data found to provide upper or lower bound value. */ +#define UA_STATUSCODE_BADBOUNDNOTFOUND 0x80D70000 + +/* The server cannot retrieve a bound for the variable. */ +#define UA_STATUSCODE_BADBOUNDNOTSUPPORTED 0x80D80000 + +/* Data is missing due to collection started/stopped/lost. */ +#define UA_STATUSCODE_BADDATALOST 0x809D0000 + +/* Expected data is unavailable for the requested time range due to an un-mounted volume */ +#define UA_STATUSCODE_BADDATAUNAVAILABLE 0x809E0000 + +/* The data or event was not successfully inserted because a matching entry exists. */ +#define UA_STATUSCODE_BADENTRYEXISTS 0x809F0000 + +/* The data or event was not successfully updated because no matching entry exists. */ +#define UA_STATUSCODE_BADNOENTRYEXISTS 0x80A00000 + +/* The client requested history using a timestamp format the server does not support (i.e requested ServerTimestamp when server only supports SourceTimestamp). */ +#define UA_STATUSCODE_BADTIMESTAMPNOTSUPPORTED 0x80A10000 + +/* The data or event was successfully inserted into the historical database. */ +#define UA_STATUSCODE_GOODENTRYINSERTED 0x00A20000 + +/* The data or event field was successfully replaced in the historical database. */ +#define UA_STATUSCODE_GOODENTRYREPLACED 0x00A30000 + +/* The value is derived from multiple values and has less than the required number of Good values. */ +#define UA_STATUSCODE_UNCERTAINDATASUBNORMAL 0x40A40000 + +/* No data exists for the requested time range or event filter. */ +#define UA_STATUSCODE_GOODNODATA 0x00A50000 + +/* The data or event field was successfully replaced in the historical database. */ +#define UA_STATUSCODE_GOODMOREDATA 0x00A60000 + +/* The requested number of Aggregates does not match the requested number of NodeIds. */ +#define UA_STATUSCODE_BADAGGREGATELISTMISMATCH 0x80D40000 + +/* The requested Aggregate is not support by the server. */ +#define UA_STATUSCODE_BADAGGREGATENOTSUPPORTED 0x80D50000 + +/* The aggregate value could not be derived due to invalid data inputs. */ +#define UA_STATUSCODE_BADAGGREGATEINVALIDINPUTS 0x80D60000 + +/* The aggregate configuration is not valid for specified node. */ +#define UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED 0x80DA0000 + +/* The request specifies fields which are not valid for the EventType or cannot be saved by the historian. */ +#define UA_STATUSCODE_GOODDATAIGNORED 0x00D90000 + +/* The request was rejected by the server because it did not meet the criteria set by the server. */ +#define UA_STATUSCODE_BADREQUESTNOTALLOWED 0x80E40000 + +/* The request has not been processed by the server yet. */ +#define UA_STATUSCODE_BADREQUESTNOTCOMPLETE 0x81130000 + +/* The value does not come from the real source and has been edited by the server. */ +#define UA_STATUSCODE_GOODEDITED 0x00DC0000 + +/* There was an error in execution of these post-actions. */ +#define UA_STATUSCODE_GOODPOSTACTIONFAILED 0x00DD0000 + +/* The related EngineeringUnit has been changed but the Variable Value is still provided based on the previous unit. */ +#define UA_STATUSCODE_UNCERTAINDOMINANTVALUECHANGED 0x40DE0000 + +/* A dependent value has been changed but the change has not been applied to the device. */ +#define UA_STATUSCODE_GOODDEPENDENTVALUECHANGED 0x00E00000 + +/* The related EngineeringUnit has been changed but this change has not been applied to the device. The Variable Value is still dependent on the previous unit but its status is currently Bad. */ +#define UA_STATUSCODE_BADDOMINANTVALUECHANGED 0x80E10000 + +/* A dependent value has been changed but the change has not been applied to the device. The quality of the dominant variable is uncertain. */ +#define UA_STATUSCODE_UNCERTAINDEPENDENTVALUECHANGED 0x40E20000 + +/* A dependent value has been changed but the change has not been applied to the device. The quality of the dominant variable is Bad. */ +#define UA_STATUSCODE_BADDEPENDENTVALUECHANGED 0x80E30000 + +/* The communication layer has raised an event. */ +#define UA_STATUSCODE_GOODCOMMUNICATIONEVENT 0x00A70000 + +/* The system is shutting down. */ +#define UA_STATUSCODE_GOODSHUTDOWNEVENT 0x00A80000 + +/* The operation is not finished and needs to be called again. */ +#define UA_STATUSCODE_GOODCALLAGAIN 0x00A90000 + +/* A non-critical timeout occurred. */ +#define UA_STATUSCODE_GOODNONCRITICALTIMEOUT 0x00AA0000 + +/* One or more arguments are invalid. */ +#define UA_STATUSCODE_BADINVALIDARGUMENT 0x80AB0000 + +/* Could not establish a network connection to remote server. */ +#define UA_STATUSCODE_BADCONNECTIONREJECTED 0x80AC0000 + +/* The server has disconnected from the client. */ +#define UA_STATUSCODE_BADDISCONNECT 0x80AD0000 + +/* The network connection has been closed. */ +#define UA_STATUSCODE_BADCONNECTIONCLOSED 0x80AE0000 + +/* The operation cannot be completed because the object is closed */ +#define UA_STATUSCODE_BADINVALIDSTATE 0x80AF0000 + +/* Cannot move beyond end of the stream. */ +#define UA_STATUSCODE_BADENDOFSTREAM 0x80B00000 + +/* No data is currently available for reading from a non-blocking stream. */ +#define UA_STATUSCODE_BADNODATAAVAILABLE 0x80B10000 + +/* The asynchronous operation is waiting for a response. */ +#define UA_STATUSCODE_BADWAITINGFORRESPONSE 0x80B20000 + +/* The asynchronous operation was abandoned by the caller. */ +#define UA_STATUSCODE_BADOPERATIONABANDONED 0x80B30000 + +/* The stream did not return all data requested (possibly because it is a non-blocking stream). */ +#define UA_STATUSCODE_BADEXPECTEDSTREAMTOBLOCK 0x80B40000 + +/* Non blocking behaviour is required and the operation would block. */ +#define UA_STATUSCODE_BADWOULDBLOCK 0x80B50000 + +/* A value had an invalid syntax. */ +#define UA_STATUSCODE_BADSYNTAXERROR 0x80B60000 + +/* The operation could not be finished because all available connections are in use. */ +#define UA_STATUSCODE_BADMAXCONNECTIONSREACHED 0x80B70000 + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/nodeids.h" ***********************************/ + +/*--------------------------------------------------------- + * Autogenerated -- do not modify + * Generated from /Users/jelena/Desktop/open62541/tools/schema/NodeIds.csv with script /Users/jelena/Desktop/open62541/tools/generate_nodeid_header.py + *-------------------------------------------------------*/ + +#ifndef UA_NODEIDS_NS0_H_ +#define UA_NODEIDS_NS0_H_ /** - * .. _array-handling: + * Namespace Zero NodeIds + * ---------------------- + * Numeric identifiers of standard-defined nodes in namespace zero. The + * following definitions are autogenerated from the ``/Users/jelena/Desktop/open62541/tools/schema/NodeIds.csv`` file */ + +#define UA_NS0ID_BOOLEAN 1 /* DataType */ +#define UA_NS0ID_SBYTE 2 /* DataType */ +#define UA_NS0ID_BYTE 3 /* DataType */ +#define UA_NS0ID_INT16 4 /* DataType */ +#define UA_NS0ID_UINT16 5 /* DataType */ +#define UA_NS0ID_INT32 6 /* DataType */ +#define UA_NS0ID_UINT32 7 /* DataType */ +#define UA_NS0ID_INT64 8 /* DataType */ +#define UA_NS0ID_UINT64 9 /* DataType */ +#define UA_NS0ID_FLOAT 10 /* DataType */ +#define UA_NS0ID_DOUBLE 11 /* DataType */ +#define UA_NS0ID_STRING 12 /* DataType */ +#define UA_NS0ID_DATETIME 13 /* DataType */ +#define UA_NS0ID_GUID 14 /* DataType */ +#define UA_NS0ID_BYTESTRING 15 /* DataType */ +#define UA_NS0ID_XMLELEMENT 16 /* DataType */ +#define UA_NS0ID_NODEID 17 /* DataType */ +#define UA_NS0ID_EXPANDEDNODEID 18 /* DataType */ +#define UA_NS0ID_STATUSCODE 19 /* DataType */ +#define UA_NS0ID_QUALIFIEDNAME 20 /* DataType */ +#define UA_NS0ID_LOCALIZEDTEXT 21 /* DataType */ +#define UA_NS0ID_STRUCTURE 22 /* DataType */ +#define UA_NS0ID_DATAVALUE 23 /* DataType */ +#define UA_NS0ID_BASEDATATYPE 24 /* DataType */ +#define UA_NS0ID_DIAGNOSTICINFO 25 /* DataType */ +#define UA_NS0ID_NUMBER 26 /* DataType */ +#define UA_NS0ID_INTEGER 27 /* DataType */ +#define UA_NS0ID_UINTEGER 28 /* DataType */ +#define UA_NS0ID_ENUMERATION 29 /* DataType */ +#define UA_NS0ID_IMAGE 30 /* DataType */ +#define UA_NS0ID_REFERENCES 31 /* ReferenceType */ +#define UA_NS0ID_NONHIERARCHICALREFERENCES 32 /* ReferenceType */ +#define UA_NS0ID_HIERARCHICALREFERENCES 33 /* ReferenceType */ +#define UA_NS0ID_HASCHILD 34 /* ReferenceType */ +#define UA_NS0ID_ORGANIZES 35 /* ReferenceType */ +#define UA_NS0ID_HASEVENTSOURCE 36 /* ReferenceType */ +#define UA_NS0ID_HASMODELLINGRULE 37 /* ReferenceType */ +#define UA_NS0ID_HASENCODING 38 /* ReferenceType */ +#define UA_NS0ID_HASDESCRIPTION 39 /* ReferenceType */ +#define UA_NS0ID_HASTYPEDEFINITION 40 /* ReferenceType */ +#define UA_NS0ID_GENERATESEVENT 41 /* ReferenceType */ +#define UA_NS0ID_AGGREGATES 44 /* ReferenceType */ +#define UA_NS0ID_HASSUBTYPE 45 /* ReferenceType */ +#define UA_NS0ID_HASPROPERTY 46 /* ReferenceType */ +#define UA_NS0ID_HASCOMPONENT 47 /* ReferenceType */ +#define UA_NS0ID_HASNOTIFIER 48 /* ReferenceType */ +#define UA_NS0ID_HASORDEREDCOMPONENT 49 /* ReferenceType */ +#define UA_NS0ID_DECIMAL 50 /* DataType */ +#define UA_NS0ID_FROMSTATE 51 /* ReferenceType */ +#define UA_NS0ID_TOSTATE 52 /* ReferenceType */ +#define UA_NS0ID_HASCAUSE 53 /* ReferenceType */ +#define UA_NS0ID_HASEFFECT 54 /* ReferenceType */ +#define UA_NS0ID_HASHISTORICALCONFIGURATION 56 /* ReferenceType */ +#define UA_NS0ID_BASEOBJECTTYPE 58 /* ObjectType */ +#define UA_NS0ID_FOLDERTYPE 61 /* ObjectType */ +#define UA_NS0ID_BASEVARIABLETYPE 62 /* VariableType */ +#define UA_NS0ID_BASEDATAVARIABLETYPE 63 /* VariableType */ +#define UA_NS0ID_PROPERTYTYPE 68 /* VariableType */ +#define UA_NS0ID_DATATYPEDESCRIPTIONTYPE 69 /* VariableType */ +#define UA_NS0ID_DATATYPEDICTIONARYTYPE 72 /* VariableType */ +#define UA_NS0ID_DATATYPESYSTEMTYPE 75 /* ObjectType */ +#define UA_NS0ID_DATATYPEENCODINGTYPE 76 /* ObjectType */ +#define UA_NS0ID_MODELLINGRULETYPE 77 /* ObjectType */ +#define UA_NS0ID_MODELLINGRULE_MANDATORY 78 /* Object */ +#define UA_NS0ID_MODELLINGRULE_MANDATORYSHARED 79 /* Object */ +#define UA_NS0ID_MODELLINGRULE_OPTIONAL 80 /* Object */ +#define UA_NS0ID_MODELLINGRULE_EXPOSESITSARRAY 83 /* Object */ +#define UA_NS0ID_ROOTFOLDER 84 /* Object */ +#define UA_NS0ID_OBJECTSFOLDER 85 /* Object */ +#define UA_NS0ID_TYPESFOLDER 86 /* Object */ +#define UA_NS0ID_VIEWSFOLDER 87 /* Object */ +#define UA_NS0ID_OBJECTTYPESFOLDER 88 /* Object */ +#define UA_NS0ID_VARIABLETYPESFOLDER 89 /* Object */ +#define UA_NS0ID_DATATYPESFOLDER 90 /* Object */ +#define UA_NS0ID_REFERENCETYPESFOLDER 91 /* Object */ +#define UA_NS0ID_XMLSCHEMA_TYPESYSTEM 92 /* Object */ +#define UA_NS0ID_OPCBINARYSCHEMA_TYPESYSTEM 93 /* Object */ +#define UA_NS0ID_PERMISSIONTYPE 94 /* DataType */ +#define UA_NS0ID_ACCESSRESTRICTIONTYPE 95 /* DataType */ +#define UA_NS0ID_ROLEPERMISSIONTYPE 96 /* DataType */ +#define UA_NS0ID_DATATYPEDEFINITION 97 /* DataType */ +#define UA_NS0ID_STRUCTURETYPE 98 /* DataType */ +#define UA_NS0ID_STRUCTUREDEFINITION 99 /* DataType */ +#define UA_NS0ID_ENUMDEFINITION 100 /* DataType */ +#define UA_NS0ID_STRUCTUREFIELD 101 /* DataType */ +#define UA_NS0ID_ENUMFIELD 102 /* DataType */ +#define UA_NS0ID_DATATYPEDESCRIPTIONTYPE_DATATYPEVERSION 104 /* Variable */ +#define UA_NS0ID_DATATYPEDESCRIPTIONTYPE_DICTIONARYFRAGMENT 105 /* Variable */ +#define UA_NS0ID_DATATYPEDICTIONARYTYPE_DATATYPEVERSION 106 /* Variable */ +#define UA_NS0ID_DATATYPEDICTIONARYTYPE_NAMESPACEURI 107 /* Variable */ +#define UA_NS0ID_MODELLINGRULETYPE_NAMINGRULE 111 /* Variable */ +#define UA_NS0ID_MODELLINGRULE_MANDATORY_NAMINGRULE 112 /* Variable */ +#define UA_NS0ID_MODELLINGRULE_OPTIONAL_NAMINGRULE 113 /* Variable */ +#define UA_NS0ID_MODELLINGRULE_EXPOSESITSARRAY_NAMINGRULE 114 /* Variable */ +#define UA_NS0ID_MODELLINGRULE_MANDATORYSHARED_NAMINGRULE 116 /* Variable */ +#define UA_NS0ID_HASSUBSTATEMACHINE 117 /* ReferenceType */ +#define UA_NS0ID_NAMINGRULETYPE 120 /* DataType */ +#define UA_NS0ID_DATATYPEDEFINITION_ENCODING_DEFAULTBINARY 121 /* Object */ +#define UA_NS0ID_STRUCTUREDEFINITION_ENCODING_DEFAULTBINARY 122 /* Object */ +#define UA_NS0ID_ENUMDEFINITION_ENCODING_DEFAULTBINARY 123 /* Object */ +#define UA_NS0ID_DATASETMETADATATYPE_ENCODING_DEFAULTBINARY 124 /* Object */ +#define UA_NS0ID_DATATYPEDESCRIPTION_ENCODING_DEFAULTBINARY 125 /* Object */ +#define UA_NS0ID_STRUCTUREDESCRIPTION_ENCODING_DEFAULTBINARY 126 /* Object */ +#define UA_NS0ID_ENUMDESCRIPTION_ENCODING_DEFAULTBINARY 127 /* Object */ +#define UA_NS0ID_ROLEPERMISSIONTYPE_ENCODING_DEFAULTBINARY 128 /* Object */ +#define UA_NS0ID_HASARGUMENTDESCRIPTION 129 /* ReferenceType */ +#define UA_NS0ID_HASOPTIONALINPUTARGUMENTDESCRIPTION 131 /* ReferenceType */ +#define UA_NS0ID_IDTYPE 256 /* DataType */ +#define UA_NS0ID_NODECLASS 257 /* DataType */ +#define UA_NS0ID_NODE 258 /* DataType */ +#define UA_NS0ID_NODE_ENCODING_DEFAULTXML 259 /* Object */ +#define UA_NS0ID_NODE_ENCODING_DEFAULTBINARY 260 /* Object */ +#define UA_NS0ID_OBJECTNODE 261 /* DataType */ +#define UA_NS0ID_OBJECTNODE_ENCODING_DEFAULTXML 262 /* Object */ +#define UA_NS0ID_OBJECTNODE_ENCODING_DEFAULTBINARY 263 /* Object */ +#define UA_NS0ID_OBJECTTYPENODE 264 /* DataType */ +#define UA_NS0ID_OBJECTTYPENODE_ENCODING_DEFAULTXML 265 /* Object */ +#define UA_NS0ID_OBJECTTYPENODE_ENCODING_DEFAULTBINARY 266 /* Object */ +#define UA_NS0ID_VARIABLENODE 267 /* DataType */ +#define UA_NS0ID_VARIABLENODE_ENCODING_DEFAULTXML 268 /* Object */ +#define UA_NS0ID_VARIABLENODE_ENCODING_DEFAULTBINARY 269 /* Object */ +#define UA_NS0ID_VARIABLETYPENODE 270 /* DataType */ +#define UA_NS0ID_VARIABLETYPENODE_ENCODING_DEFAULTXML 271 /* Object */ +#define UA_NS0ID_VARIABLETYPENODE_ENCODING_DEFAULTBINARY 272 /* Object */ +#define UA_NS0ID_REFERENCETYPENODE 273 /* DataType */ +#define UA_NS0ID_REFERENCETYPENODE_ENCODING_DEFAULTXML 274 /* Object */ +#define UA_NS0ID_REFERENCETYPENODE_ENCODING_DEFAULTBINARY 275 /* Object */ +#define UA_NS0ID_METHODNODE 276 /* DataType */ +#define UA_NS0ID_METHODNODE_ENCODING_DEFAULTXML 277 /* Object */ +#define UA_NS0ID_METHODNODE_ENCODING_DEFAULTBINARY 278 /* Object */ +#define UA_NS0ID_VIEWNODE 279 /* DataType */ +#define UA_NS0ID_VIEWNODE_ENCODING_DEFAULTXML 280 /* Object */ +#define UA_NS0ID_VIEWNODE_ENCODING_DEFAULTBINARY 281 /* Object */ +#define UA_NS0ID_DATATYPENODE 282 /* DataType */ +#define UA_NS0ID_DATATYPENODE_ENCODING_DEFAULTXML 283 /* Object */ +#define UA_NS0ID_DATATYPENODE_ENCODING_DEFAULTBINARY 284 /* Object */ +#define UA_NS0ID_REFERENCENODE 285 /* DataType */ +#define UA_NS0ID_REFERENCENODE_ENCODING_DEFAULTXML 286 /* Object */ +#define UA_NS0ID_REFERENCENODE_ENCODING_DEFAULTBINARY 287 /* Object */ +#define UA_NS0ID_INTEGERID 288 /* DataType */ +#define UA_NS0ID_COUNTER 289 /* DataType */ +#define UA_NS0ID_DURATION 290 /* DataType */ +#define UA_NS0ID_NUMERICRANGE 291 /* DataType */ +#define UA_NS0ID_TIME 292 /* DataType */ +#define UA_NS0ID_DATE 293 /* DataType */ +#define UA_NS0ID_UTCTIME 294 /* DataType */ +#define UA_NS0ID_LOCALEID 295 /* DataType */ +#define UA_NS0ID_ARGUMENT 296 /* DataType */ +#define UA_NS0ID_ARGUMENT_ENCODING_DEFAULTXML 297 /* Object */ +#define UA_NS0ID_ARGUMENT_ENCODING_DEFAULTBINARY 298 /* Object */ +#define UA_NS0ID_STATUSRESULT 299 /* DataType */ +#define UA_NS0ID_STATUSRESULT_ENCODING_DEFAULTXML 300 /* Object */ +#define UA_NS0ID_STATUSRESULT_ENCODING_DEFAULTBINARY 301 /* Object */ +#define UA_NS0ID_MESSAGESECURITYMODE 302 /* DataType */ +#define UA_NS0ID_USERTOKENTYPE 303 /* DataType */ +#define UA_NS0ID_USERTOKENPOLICY 304 /* DataType */ +#define UA_NS0ID_USERTOKENPOLICY_ENCODING_DEFAULTXML 305 /* Object */ +#define UA_NS0ID_USERTOKENPOLICY_ENCODING_DEFAULTBINARY 306 /* Object */ +#define UA_NS0ID_APPLICATIONTYPE 307 /* DataType */ +#define UA_NS0ID_APPLICATIONDESCRIPTION 308 /* DataType */ +#define UA_NS0ID_APPLICATIONDESCRIPTION_ENCODING_DEFAULTXML 309 /* Object */ +#define UA_NS0ID_APPLICATIONDESCRIPTION_ENCODING_DEFAULTBINARY 310 /* Object */ +#define UA_NS0ID_APPLICATIONINSTANCECERTIFICATE 311 /* DataType */ +#define UA_NS0ID_ENDPOINTDESCRIPTION 312 /* DataType */ +#define UA_NS0ID_ENDPOINTDESCRIPTION_ENCODING_DEFAULTXML 313 /* Object */ +#define UA_NS0ID_ENDPOINTDESCRIPTION_ENCODING_DEFAULTBINARY 314 /* Object */ +#define UA_NS0ID_SECURITYTOKENREQUESTTYPE 315 /* DataType */ +#define UA_NS0ID_USERIDENTITYTOKEN 316 /* DataType */ +#define UA_NS0ID_USERIDENTITYTOKEN_ENCODING_DEFAULTXML 317 /* Object */ +#define UA_NS0ID_USERIDENTITYTOKEN_ENCODING_DEFAULTBINARY 318 /* Object */ +#define UA_NS0ID_ANONYMOUSIDENTITYTOKEN 319 /* DataType */ +#define UA_NS0ID_ANONYMOUSIDENTITYTOKEN_ENCODING_DEFAULTXML 320 /* Object */ +#define UA_NS0ID_ANONYMOUSIDENTITYTOKEN_ENCODING_DEFAULTBINARY 321 /* Object */ +#define UA_NS0ID_USERNAMEIDENTITYTOKEN 322 /* DataType */ +#define UA_NS0ID_USERNAMEIDENTITYTOKEN_ENCODING_DEFAULTXML 323 /* Object */ +#define UA_NS0ID_USERNAMEIDENTITYTOKEN_ENCODING_DEFAULTBINARY 324 /* Object */ +#define UA_NS0ID_X509IDENTITYTOKEN 325 /* DataType */ +#define UA_NS0ID_X509IDENTITYTOKEN_ENCODING_DEFAULTXML 326 /* Object */ +#define UA_NS0ID_X509IDENTITYTOKEN_ENCODING_DEFAULTBINARY 327 /* Object */ +#define UA_NS0ID_ENDPOINTCONFIGURATION 331 /* DataType */ +#define UA_NS0ID_ENDPOINTCONFIGURATION_ENCODING_DEFAULTXML 332 /* Object */ +#define UA_NS0ID_ENDPOINTCONFIGURATION_ENCODING_DEFAULTBINARY 333 /* Object */ +#define UA_NS0ID_BUILDINFO 338 /* DataType */ +#define UA_NS0ID_BUILDINFO_ENCODING_DEFAULTXML 339 /* Object */ +#define UA_NS0ID_BUILDINFO_ENCODING_DEFAULTBINARY 340 /* Object */ +#define UA_NS0ID_SIGNEDSOFTWARECERTIFICATE 344 /* DataType */ +#define UA_NS0ID_SIGNEDSOFTWARECERTIFICATE_ENCODING_DEFAULTXML 345 /* Object */ +#define UA_NS0ID_SIGNEDSOFTWARECERTIFICATE_ENCODING_DEFAULTBINARY 346 /* Object */ +#define UA_NS0ID_ATTRIBUTEWRITEMASK 347 /* DataType */ +#define UA_NS0ID_NODEATTRIBUTESMASK 348 /* DataType */ +#define UA_NS0ID_NODEATTRIBUTES 349 /* DataType */ +#define UA_NS0ID_NODEATTRIBUTES_ENCODING_DEFAULTXML 350 /* Object */ +#define UA_NS0ID_NODEATTRIBUTES_ENCODING_DEFAULTBINARY 351 /* Object */ +#define UA_NS0ID_OBJECTATTRIBUTES 352 /* DataType */ +#define UA_NS0ID_OBJECTATTRIBUTES_ENCODING_DEFAULTXML 353 /* Object */ +#define UA_NS0ID_OBJECTATTRIBUTES_ENCODING_DEFAULTBINARY 354 /* Object */ +#define UA_NS0ID_VARIABLEATTRIBUTES 355 /* DataType */ +#define UA_NS0ID_VARIABLEATTRIBUTES_ENCODING_DEFAULTXML 356 /* Object */ +#define UA_NS0ID_VARIABLEATTRIBUTES_ENCODING_DEFAULTBINARY 357 /* Object */ +#define UA_NS0ID_METHODATTRIBUTES 358 /* DataType */ +#define UA_NS0ID_METHODATTRIBUTES_ENCODING_DEFAULTXML 359 /* Object */ +#define UA_NS0ID_METHODATTRIBUTES_ENCODING_DEFAULTBINARY 360 /* Object */ +#define UA_NS0ID_OBJECTTYPEATTRIBUTES 361 /* DataType */ +#define UA_NS0ID_OBJECTTYPEATTRIBUTES_ENCODING_DEFAULTXML 362 /* Object */ +#define UA_NS0ID_OBJECTTYPEATTRIBUTES_ENCODING_DEFAULTBINARY 363 /* Object */ +#define UA_NS0ID_VARIABLETYPEATTRIBUTES 364 /* DataType */ +#define UA_NS0ID_VARIABLETYPEATTRIBUTES_ENCODING_DEFAULTXML 365 /* Object */ +#define UA_NS0ID_VARIABLETYPEATTRIBUTES_ENCODING_DEFAULTBINARY 366 /* Object */ +#define UA_NS0ID_REFERENCETYPEATTRIBUTES 367 /* DataType */ +#define UA_NS0ID_REFERENCETYPEATTRIBUTES_ENCODING_DEFAULTXML 368 /* Object */ +#define UA_NS0ID_REFERENCETYPEATTRIBUTES_ENCODING_DEFAULTBINARY 369 /* Object */ +#define UA_NS0ID_DATATYPEATTRIBUTES 370 /* DataType */ +#define UA_NS0ID_DATATYPEATTRIBUTES_ENCODING_DEFAULTXML 371 /* Object */ +#define UA_NS0ID_DATATYPEATTRIBUTES_ENCODING_DEFAULTBINARY 372 /* Object */ +#define UA_NS0ID_VIEWATTRIBUTES 373 /* DataType */ +#define UA_NS0ID_VIEWATTRIBUTES_ENCODING_DEFAULTXML 374 /* Object */ +#define UA_NS0ID_VIEWATTRIBUTES_ENCODING_DEFAULTBINARY 375 /* Object */ +#define UA_NS0ID_ADDNODESITEM 376 /* DataType */ +#define UA_NS0ID_ADDNODESITEM_ENCODING_DEFAULTXML 377 /* Object */ +#define UA_NS0ID_ADDNODESITEM_ENCODING_DEFAULTBINARY 378 /* Object */ +#define UA_NS0ID_ADDREFERENCESITEM 379 /* DataType */ +#define UA_NS0ID_ADDREFERENCESITEM_ENCODING_DEFAULTXML 380 /* Object */ +#define UA_NS0ID_ADDREFERENCESITEM_ENCODING_DEFAULTBINARY 381 /* Object */ +#define UA_NS0ID_DELETENODESITEM 382 /* DataType */ +#define UA_NS0ID_DELETENODESITEM_ENCODING_DEFAULTXML 383 /* Object */ +#define UA_NS0ID_DELETENODESITEM_ENCODING_DEFAULTBINARY 384 /* Object */ +#define UA_NS0ID_DELETEREFERENCESITEM 385 /* DataType */ +#define UA_NS0ID_DELETEREFERENCESITEM_ENCODING_DEFAULTXML 386 /* Object */ +#define UA_NS0ID_DELETEREFERENCESITEM_ENCODING_DEFAULTBINARY 387 /* Object */ +#define UA_NS0ID_SESSIONAUTHENTICATIONTOKEN 388 /* DataType */ +#define UA_NS0ID_REQUESTHEADER 389 /* DataType */ +#define UA_NS0ID_REQUESTHEADER_ENCODING_DEFAULTXML 390 /* Object */ +#define UA_NS0ID_REQUESTHEADER_ENCODING_DEFAULTBINARY 391 /* Object */ +#define UA_NS0ID_RESPONSEHEADER 392 /* DataType */ +#define UA_NS0ID_RESPONSEHEADER_ENCODING_DEFAULTXML 393 /* Object */ +#define UA_NS0ID_RESPONSEHEADER_ENCODING_DEFAULTBINARY 394 /* Object */ +#define UA_NS0ID_SERVICEFAULT 395 /* DataType */ +#define UA_NS0ID_SERVICEFAULT_ENCODING_DEFAULTXML 396 /* Object */ +#define UA_NS0ID_SERVICEFAULT_ENCODING_DEFAULTBINARY 397 /* Object */ +#define UA_NS0ID_FINDSERVERSREQUEST 420 /* DataType */ +#define UA_NS0ID_FINDSERVERSREQUEST_ENCODING_DEFAULTXML 421 /* Object */ +#define UA_NS0ID_FINDSERVERSREQUEST_ENCODING_DEFAULTBINARY 422 /* Object */ +#define UA_NS0ID_FINDSERVERSRESPONSE 423 /* DataType */ +#define UA_NS0ID_FINDSERVERSRESPONSE_ENCODING_DEFAULTXML 424 /* Object */ +#define UA_NS0ID_FINDSERVERSRESPONSE_ENCODING_DEFAULTBINARY 425 /* Object */ +#define UA_NS0ID_GETENDPOINTSREQUEST 426 /* DataType */ +#define UA_NS0ID_GETENDPOINTSREQUEST_ENCODING_DEFAULTXML 427 /* Object */ +#define UA_NS0ID_GETENDPOINTSREQUEST_ENCODING_DEFAULTBINARY 428 /* Object */ +#define UA_NS0ID_GETENDPOINTSRESPONSE 429 /* DataType */ +#define UA_NS0ID_GETENDPOINTSRESPONSE_ENCODING_DEFAULTXML 430 /* Object */ +#define UA_NS0ID_GETENDPOINTSRESPONSE_ENCODING_DEFAULTBINARY 431 /* Object */ +#define UA_NS0ID_REGISTEREDSERVER 432 /* DataType */ +#define UA_NS0ID_REGISTEREDSERVER_ENCODING_DEFAULTXML 433 /* Object */ +#define UA_NS0ID_REGISTEREDSERVER_ENCODING_DEFAULTBINARY 434 /* Object */ +#define UA_NS0ID_REGISTERSERVERREQUEST 435 /* DataType */ +#define UA_NS0ID_REGISTERSERVERREQUEST_ENCODING_DEFAULTXML 436 /* Object */ +#define UA_NS0ID_REGISTERSERVERREQUEST_ENCODING_DEFAULTBINARY 437 /* Object */ +#define UA_NS0ID_REGISTERSERVERRESPONSE 438 /* DataType */ +#define UA_NS0ID_REGISTERSERVERRESPONSE_ENCODING_DEFAULTXML 439 /* Object */ +#define UA_NS0ID_REGISTERSERVERRESPONSE_ENCODING_DEFAULTBINARY 440 /* Object */ +#define UA_NS0ID_CHANNELSECURITYTOKEN 441 /* DataType */ +#define UA_NS0ID_CHANNELSECURITYTOKEN_ENCODING_DEFAULTXML 442 /* Object */ +#define UA_NS0ID_CHANNELSECURITYTOKEN_ENCODING_DEFAULTBINARY 443 /* Object */ +#define UA_NS0ID_OPENSECURECHANNELREQUEST 444 /* DataType */ +#define UA_NS0ID_OPENSECURECHANNELREQUEST_ENCODING_DEFAULTXML 445 /* Object */ +#define UA_NS0ID_OPENSECURECHANNELREQUEST_ENCODING_DEFAULTBINARY 446 /* Object */ +#define UA_NS0ID_OPENSECURECHANNELRESPONSE 447 /* DataType */ +#define UA_NS0ID_OPENSECURECHANNELRESPONSE_ENCODING_DEFAULTXML 448 /* Object */ +#define UA_NS0ID_OPENSECURECHANNELRESPONSE_ENCODING_DEFAULTBINARY 449 /* Object */ +#define UA_NS0ID_CLOSESECURECHANNELREQUEST 450 /* DataType */ +#define UA_NS0ID_CLOSESECURECHANNELREQUEST_ENCODING_DEFAULTXML 451 /* Object */ +#define UA_NS0ID_CLOSESECURECHANNELREQUEST_ENCODING_DEFAULTBINARY 452 /* Object */ +#define UA_NS0ID_CLOSESECURECHANNELRESPONSE 453 /* DataType */ +#define UA_NS0ID_CLOSESECURECHANNELRESPONSE_ENCODING_DEFAULTXML 454 /* Object */ +#define UA_NS0ID_CLOSESECURECHANNELRESPONSE_ENCODING_DEFAULTBINARY 455 /* Object */ +#define UA_NS0ID_SIGNATUREDATA 456 /* DataType */ +#define UA_NS0ID_SIGNATUREDATA_ENCODING_DEFAULTXML 457 /* Object */ +#define UA_NS0ID_SIGNATUREDATA_ENCODING_DEFAULTBINARY 458 /* Object */ +#define UA_NS0ID_CREATESESSIONREQUEST 459 /* DataType */ +#define UA_NS0ID_CREATESESSIONREQUEST_ENCODING_DEFAULTXML 460 /* Object */ +#define UA_NS0ID_CREATESESSIONREQUEST_ENCODING_DEFAULTBINARY 461 /* Object */ +#define UA_NS0ID_CREATESESSIONRESPONSE 462 /* DataType */ +#define UA_NS0ID_CREATESESSIONRESPONSE_ENCODING_DEFAULTXML 463 /* Object */ +#define UA_NS0ID_CREATESESSIONRESPONSE_ENCODING_DEFAULTBINARY 464 /* Object */ +#define UA_NS0ID_ACTIVATESESSIONREQUEST 465 /* DataType */ +#define UA_NS0ID_ACTIVATESESSIONREQUEST_ENCODING_DEFAULTXML 466 /* Object */ +#define UA_NS0ID_ACTIVATESESSIONREQUEST_ENCODING_DEFAULTBINARY 467 /* Object */ +#define UA_NS0ID_ACTIVATESESSIONRESPONSE 468 /* DataType */ +#define UA_NS0ID_ACTIVATESESSIONRESPONSE_ENCODING_DEFAULTXML 469 /* Object */ +#define UA_NS0ID_ACTIVATESESSIONRESPONSE_ENCODING_DEFAULTBINARY 470 /* Object */ +#define UA_NS0ID_CLOSESESSIONREQUEST 471 /* DataType */ +#define UA_NS0ID_CLOSESESSIONREQUEST_ENCODING_DEFAULTXML 472 /* Object */ +#define UA_NS0ID_CLOSESESSIONREQUEST_ENCODING_DEFAULTBINARY 473 /* Object */ +#define UA_NS0ID_CLOSESESSIONRESPONSE 474 /* DataType */ +#define UA_NS0ID_CLOSESESSIONRESPONSE_ENCODING_DEFAULTXML 475 /* Object */ +#define UA_NS0ID_CLOSESESSIONRESPONSE_ENCODING_DEFAULTBINARY 476 /* Object */ +#define UA_NS0ID_CANCELREQUEST 477 /* DataType */ +#define UA_NS0ID_CANCELREQUEST_ENCODING_DEFAULTXML 478 /* Object */ +#define UA_NS0ID_CANCELREQUEST_ENCODING_DEFAULTBINARY 479 /* Object */ +#define UA_NS0ID_CANCELRESPONSE 480 /* DataType */ +#define UA_NS0ID_CANCELRESPONSE_ENCODING_DEFAULTXML 481 /* Object */ +#define UA_NS0ID_CANCELRESPONSE_ENCODING_DEFAULTBINARY 482 /* Object */ +#define UA_NS0ID_ADDNODESRESULT 483 /* DataType */ +#define UA_NS0ID_ADDNODESRESULT_ENCODING_DEFAULTXML 484 /* Object */ +#define UA_NS0ID_ADDNODESRESULT_ENCODING_DEFAULTBINARY 485 /* Object */ +#define UA_NS0ID_ADDNODESREQUEST 486 /* DataType */ +#define UA_NS0ID_ADDNODESREQUEST_ENCODING_DEFAULTXML 487 /* Object */ +#define UA_NS0ID_ADDNODESREQUEST_ENCODING_DEFAULTBINARY 488 /* Object */ +#define UA_NS0ID_ADDNODESRESPONSE 489 /* DataType */ +#define UA_NS0ID_ADDNODESRESPONSE_ENCODING_DEFAULTXML 490 /* Object */ +#define UA_NS0ID_ADDNODESRESPONSE_ENCODING_DEFAULTBINARY 491 /* Object */ +#define UA_NS0ID_ADDREFERENCESREQUEST 492 /* DataType */ +#define UA_NS0ID_ADDREFERENCESREQUEST_ENCODING_DEFAULTXML 493 /* Object */ +#define UA_NS0ID_ADDREFERENCESREQUEST_ENCODING_DEFAULTBINARY 494 /* Object */ +#define UA_NS0ID_ADDREFERENCESRESPONSE 495 /* DataType */ +#define UA_NS0ID_ADDREFERENCESRESPONSE_ENCODING_DEFAULTXML 496 /* Object */ +#define UA_NS0ID_ADDREFERENCESRESPONSE_ENCODING_DEFAULTBINARY 497 /* Object */ +#define UA_NS0ID_DELETENODESREQUEST 498 /* DataType */ +#define UA_NS0ID_DELETENODESREQUEST_ENCODING_DEFAULTXML 499 /* Object */ +#define UA_NS0ID_DELETENODESREQUEST_ENCODING_DEFAULTBINARY 500 /* Object */ +#define UA_NS0ID_DELETENODESRESPONSE 501 /* DataType */ +#define UA_NS0ID_DELETENODESRESPONSE_ENCODING_DEFAULTXML 502 /* Object */ +#define UA_NS0ID_DELETENODESRESPONSE_ENCODING_DEFAULTBINARY 503 /* Object */ +#define UA_NS0ID_DELETEREFERENCESREQUEST 504 /* DataType */ +#define UA_NS0ID_DELETEREFERENCESREQUEST_ENCODING_DEFAULTXML 505 /* Object */ +#define UA_NS0ID_DELETEREFERENCESREQUEST_ENCODING_DEFAULTBINARY 506 /* Object */ +#define UA_NS0ID_DELETEREFERENCESRESPONSE 507 /* DataType */ +#define UA_NS0ID_DELETEREFERENCESRESPONSE_ENCODING_DEFAULTXML 508 /* Object */ +#define UA_NS0ID_DELETEREFERENCESRESPONSE_ENCODING_DEFAULTBINARY 509 /* Object */ +#define UA_NS0ID_BROWSEDIRECTION 510 /* DataType */ +#define UA_NS0ID_VIEWDESCRIPTION 511 /* DataType */ +#define UA_NS0ID_VIEWDESCRIPTION_ENCODING_DEFAULTXML 512 /* Object */ +#define UA_NS0ID_VIEWDESCRIPTION_ENCODING_DEFAULTBINARY 513 /* Object */ +#define UA_NS0ID_BROWSEDESCRIPTION 514 /* DataType */ +#define UA_NS0ID_BROWSEDESCRIPTION_ENCODING_DEFAULTXML 515 /* Object */ +#define UA_NS0ID_BROWSEDESCRIPTION_ENCODING_DEFAULTBINARY 516 /* Object */ +#define UA_NS0ID_BROWSERESULTMASK 517 /* DataType */ +#define UA_NS0ID_REFERENCEDESCRIPTION 518 /* DataType */ +#define UA_NS0ID_REFERENCEDESCRIPTION_ENCODING_DEFAULTXML 519 /* Object */ +#define UA_NS0ID_REFERENCEDESCRIPTION_ENCODING_DEFAULTBINARY 520 /* Object */ +#define UA_NS0ID_CONTINUATIONPOINT 521 /* DataType */ +#define UA_NS0ID_BROWSERESULT 522 /* DataType */ +#define UA_NS0ID_BROWSERESULT_ENCODING_DEFAULTXML 523 /* Object */ +#define UA_NS0ID_BROWSERESULT_ENCODING_DEFAULTBINARY 524 /* Object */ +#define UA_NS0ID_BROWSEREQUEST 525 /* DataType */ +#define UA_NS0ID_BROWSEREQUEST_ENCODING_DEFAULTXML 526 /* Object */ +#define UA_NS0ID_BROWSEREQUEST_ENCODING_DEFAULTBINARY 527 /* Object */ +#define UA_NS0ID_BROWSERESPONSE 528 /* DataType */ +#define UA_NS0ID_BROWSERESPONSE_ENCODING_DEFAULTXML 529 /* Object */ +#define UA_NS0ID_BROWSERESPONSE_ENCODING_DEFAULTBINARY 530 /* Object */ +#define UA_NS0ID_BROWSENEXTREQUEST 531 /* DataType */ +#define UA_NS0ID_BROWSENEXTREQUEST_ENCODING_DEFAULTXML 532 /* Object */ +#define UA_NS0ID_BROWSENEXTREQUEST_ENCODING_DEFAULTBINARY 533 /* Object */ +#define UA_NS0ID_BROWSENEXTRESPONSE 534 /* DataType */ +#define UA_NS0ID_BROWSENEXTRESPONSE_ENCODING_DEFAULTXML 535 /* Object */ +#define UA_NS0ID_BROWSENEXTRESPONSE_ENCODING_DEFAULTBINARY 536 /* Object */ +#define UA_NS0ID_RELATIVEPATHELEMENT 537 /* DataType */ +#define UA_NS0ID_RELATIVEPATHELEMENT_ENCODING_DEFAULTXML 538 /* Object */ +#define UA_NS0ID_RELATIVEPATHELEMENT_ENCODING_DEFAULTBINARY 539 /* Object */ +#define UA_NS0ID_RELATIVEPATH 540 /* DataType */ +#define UA_NS0ID_RELATIVEPATH_ENCODING_DEFAULTXML 541 /* Object */ +#define UA_NS0ID_RELATIVEPATH_ENCODING_DEFAULTBINARY 542 /* Object */ +#define UA_NS0ID_BROWSEPATH 543 /* DataType */ +#define UA_NS0ID_BROWSEPATH_ENCODING_DEFAULTXML 544 /* Object */ +#define UA_NS0ID_BROWSEPATH_ENCODING_DEFAULTBINARY 545 /* Object */ +#define UA_NS0ID_BROWSEPATHTARGET 546 /* DataType */ +#define UA_NS0ID_BROWSEPATHTARGET_ENCODING_DEFAULTXML 547 /* Object */ +#define UA_NS0ID_BROWSEPATHTARGET_ENCODING_DEFAULTBINARY 548 /* Object */ +#define UA_NS0ID_BROWSEPATHRESULT 549 /* DataType */ +#define UA_NS0ID_BROWSEPATHRESULT_ENCODING_DEFAULTXML 550 /* Object */ +#define UA_NS0ID_BROWSEPATHRESULT_ENCODING_DEFAULTBINARY 551 /* Object */ +#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSREQUEST 552 /* DataType */ +#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSREQUEST_ENCODING_DEFAULTXML 553 /* Object */ +#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSREQUEST_ENCODING_DEFAULTBINARY 554 /* Object */ +#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE 555 /* DataType */ +#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE_ENCODING_DEFAULTXML 556 /* Object */ +#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE_ENCODING_DEFAULTBINARY 557 /* Object */ +#define UA_NS0ID_REGISTERNODESREQUEST 558 /* DataType */ +#define UA_NS0ID_REGISTERNODESREQUEST_ENCODING_DEFAULTXML 559 /* Object */ +#define UA_NS0ID_REGISTERNODESREQUEST_ENCODING_DEFAULTBINARY 560 /* Object */ +#define UA_NS0ID_REGISTERNODESRESPONSE 561 /* DataType */ +#define UA_NS0ID_REGISTERNODESRESPONSE_ENCODING_DEFAULTXML 562 /* Object */ +#define UA_NS0ID_REGISTERNODESRESPONSE_ENCODING_DEFAULTBINARY 563 /* Object */ +#define UA_NS0ID_UNREGISTERNODESREQUEST 564 /* DataType */ +#define UA_NS0ID_UNREGISTERNODESREQUEST_ENCODING_DEFAULTXML 565 /* Object */ +#define UA_NS0ID_UNREGISTERNODESREQUEST_ENCODING_DEFAULTBINARY 566 /* Object */ +#define UA_NS0ID_UNREGISTERNODESRESPONSE 567 /* DataType */ +#define UA_NS0ID_UNREGISTERNODESRESPONSE_ENCODING_DEFAULTXML 568 /* Object */ +#define UA_NS0ID_UNREGISTERNODESRESPONSE_ENCODING_DEFAULTBINARY 569 /* Object */ +#define UA_NS0ID_QUERYDATADESCRIPTION 570 /* DataType */ +#define UA_NS0ID_QUERYDATADESCRIPTION_ENCODING_DEFAULTXML 571 /* Object */ +#define UA_NS0ID_QUERYDATADESCRIPTION_ENCODING_DEFAULTBINARY 572 /* Object */ +#define UA_NS0ID_NODETYPEDESCRIPTION 573 /* DataType */ +#define UA_NS0ID_NODETYPEDESCRIPTION_ENCODING_DEFAULTXML 574 /* Object */ +#define UA_NS0ID_NODETYPEDESCRIPTION_ENCODING_DEFAULTBINARY 575 /* Object */ +#define UA_NS0ID_FILTEROPERATOR 576 /* DataType */ +#define UA_NS0ID_QUERYDATASET 577 /* DataType */ +#define UA_NS0ID_QUERYDATASET_ENCODING_DEFAULTXML 578 /* Object */ +#define UA_NS0ID_QUERYDATASET_ENCODING_DEFAULTBINARY 579 /* Object */ +#define UA_NS0ID_NODEREFERENCE 580 /* DataType */ +#define UA_NS0ID_NODEREFERENCE_ENCODING_DEFAULTXML 581 /* Object */ +#define UA_NS0ID_NODEREFERENCE_ENCODING_DEFAULTBINARY 582 /* Object */ +#define UA_NS0ID_CONTENTFILTERELEMENT 583 /* DataType */ +#define UA_NS0ID_CONTENTFILTERELEMENT_ENCODING_DEFAULTXML 584 /* Object */ +#define UA_NS0ID_CONTENTFILTERELEMENT_ENCODING_DEFAULTBINARY 585 /* Object */ +#define UA_NS0ID_CONTENTFILTER 586 /* DataType */ +#define UA_NS0ID_CONTENTFILTER_ENCODING_DEFAULTXML 587 /* Object */ +#define UA_NS0ID_CONTENTFILTER_ENCODING_DEFAULTBINARY 588 /* Object */ +#define UA_NS0ID_FILTEROPERAND 589 /* DataType */ +#define UA_NS0ID_FILTEROPERAND_ENCODING_DEFAULTXML 590 /* Object */ +#define UA_NS0ID_FILTEROPERAND_ENCODING_DEFAULTBINARY 591 /* Object */ +#define UA_NS0ID_ELEMENTOPERAND 592 /* DataType */ +#define UA_NS0ID_ELEMENTOPERAND_ENCODING_DEFAULTXML 593 /* Object */ +#define UA_NS0ID_ELEMENTOPERAND_ENCODING_DEFAULTBINARY 594 /* Object */ +#define UA_NS0ID_LITERALOPERAND 595 /* DataType */ +#define UA_NS0ID_LITERALOPERAND_ENCODING_DEFAULTXML 596 /* Object */ +#define UA_NS0ID_LITERALOPERAND_ENCODING_DEFAULTBINARY 597 /* Object */ +#define UA_NS0ID_ATTRIBUTEOPERAND 598 /* DataType */ +#define UA_NS0ID_ATTRIBUTEOPERAND_ENCODING_DEFAULTXML 599 /* Object */ +#define UA_NS0ID_ATTRIBUTEOPERAND_ENCODING_DEFAULTBINARY 600 /* Object */ +#define UA_NS0ID_SIMPLEATTRIBUTEOPERAND 601 /* DataType */ +#define UA_NS0ID_SIMPLEATTRIBUTEOPERAND_ENCODING_DEFAULTXML 602 /* Object */ +#define UA_NS0ID_SIMPLEATTRIBUTEOPERAND_ENCODING_DEFAULTBINARY 603 /* Object */ +#define UA_NS0ID_CONTENTFILTERELEMENTRESULT 604 /* DataType */ +#define UA_NS0ID_CONTENTFILTERELEMENTRESULT_ENCODING_DEFAULTXML 605 /* Object */ +#define UA_NS0ID_CONTENTFILTERELEMENTRESULT_ENCODING_DEFAULTBINARY 606 /* Object */ +#define UA_NS0ID_CONTENTFILTERRESULT 607 /* DataType */ +#define UA_NS0ID_CONTENTFILTERRESULT_ENCODING_DEFAULTXML 608 /* Object */ +#define UA_NS0ID_CONTENTFILTERRESULT_ENCODING_DEFAULTBINARY 609 /* Object */ +#define UA_NS0ID_PARSINGRESULT 610 /* DataType */ +#define UA_NS0ID_PARSINGRESULT_ENCODING_DEFAULTXML 611 /* Object */ +#define UA_NS0ID_PARSINGRESULT_ENCODING_DEFAULTBINARY 612 /* Object */ +#define UA_NS0ID_QUERYFIRSTREQUEST 613 /* DataType */ +#define UA_NS0ID_QUERYFIRSTREQUEST_ENCODING_DEFAULTXML 614 /* Object */ +#define UA_NS0ID_QUERYFIRSTREQUEST_ENCODING_DEFAULTBINARY 615 /* Object */ +#define UA_NS0ID_QUERYFIRSTRESPONSE 616 /* DataType */ +#define UA_NS0ID_QUERYFIRSTRESPONSE_ENCODING_DEFAULTXML 617 /* Object */ +#define UA_NS0ID_QUERYFIRSTRESPONSE_ENCODING_DEFAULTBINARY 618 /* Object */ +#define UA_NS0ID_QUERYNEXTREQUEST 619 /* DataType */ +#define UA_NS0ID_QUERYNEXTREQUEST_ENCODING_DEFAULTXML 620 /* Object */ +#define UA_NS0ID_QUERYNEXTREQUEST_ENCODING_DEFAULTBINARY 621 /* Object */ +#define UA_NS0ID_QUERYNEXTRESPONSE 622 /* DataType */ +#define UA_NS0ID_QUERYNEXTRESPONSE_ENCODING_DEFAULTXML 623 /* Object */ +#define UA_NS0ID_QUERYNEXTRESPONSE_ENCODING_DEFAULTBINARY 624 /* Object */ +#define UA_NS0ID_TIMESTAMPSTORETURN 625 /* DataType */ +#define UA_NS0ID_READVALUEID 626 /* DataType */ +#define UA_NS0ID_READVALUEID_ENCODING_DEFAULTXML 627 /* Object */ +#define UA_NS0ID_READVALUEID_ENCODING_DEFAULTBINARY 628 /* Object */ +#define UA_NS0ID_READREQUEST 629 /* DataType */ +#define UA_NS0ID_READREQUEST_ENCODING_DEFAULTXML 630 /* Object */ +#define UA_NS0ID_READREQUEST_ENCODING_DEFAULTBINARY 631 /* Object */ +#define UA_NS0ID_READRESPONSE 632 /* DataType */ +#define UA_NS0ID_READRESPONSE_ENCODING_DEFAULTXML 633 /* Object */ +#define UA_NS0ID_READRESPONSE_ENCODING_DEFAULTBINARY 634 /* Object */ +#define UA_NS0ID_HISTORYREADVALUEID 635 /* DataType */ +#define UA_NS0ID_HISTORYREADVALUEID_ENCODING_DEFAULTXML 636 /* Object */ +#define UA_NS0ID_HISTORYREADVALUEID_ENCODING_DEFAULTBINARY 637 /* Object */ +#define UA_NS0ID_HISTORYREADRESULT 638 /* DataType */ +#define UA_NS0ID_HISTORYREADRESULT_ENCODING_DEFAULTXML 639 /* Object */ +#define UA_NS0ID_HISTORYREADRESULT_ENCODING_DEFAULTBINARY 640 /* Object */ +#define UA_NS0ID_HISTORYREADDETAILS 641 /* DataType */ +#define UA_NS0ID_HISTORYREADDETAILS_ENCODING_DEFAULTXML 642 /* Object */ +#define UA_NS0ID_HISTORYREADDETAILS_ENCODING_DEFAULTBINARY 643 /* Object */ +#define UA_NS0ID_READEVENTDETAILS 644 /* DataType */ +#define UA_NS0ID_READEVENTDETAILS_ENCODING_DEFAULTXML 645 /* Object */ +#define UA_NS0ID_READEVENTDETAILS_ENCODING_DEFAULTBINARY 646 /* Object */ +#define UA_NS0ID_READRAWMODIFIEDDETAILS 647 /* DataType */ +#define UA_NS0ID_READRAWMODIFIEDDETAILS_ENCODING_DEFAULTXML 648 /* Object */ +#define UA_NS0ID_READRAWMODIFIEDDETAILS_ENCODING_DEFAULTBINARY 649 /* Object */ +#define UA_NS0ID_READPROCESSEDDETAILS 650 /* DataType */ +#define UA_NS0ID_READPROCESSEDDETAILS_ENCODING_DEFAULTXML 651 /* Object */ +#define UA_NS0ID_READPROCESSEDDETAILS_ENCODING_DEFAULTBINARY 652 /* Object */ +#define UA_NS0ID_READATTIMEDETAILS 653 /* DataType */ +#define UA_NS0ID_READATTIMEDETAILS_ENCODING_DEFAULTXML 654 /* Object */ +#define UA_NS0ID_READATTIMEDETAILS_ENCODING_DEFAULTBINARY 655 /* Object */ +#define UA_NS0ID_HISTORYDATA 656 /* DataType */ +#define UA_NS0ID_HISTORYDATA_ENCODING_DEFAULTXML 657 /* Object */ +#define UA_NS0ID_HISTORYDATA_ENCODING_DEFAULTBINARY 658 /* Object */ +#define UA_NS0ID_HISTORYEVENT 659 /* DataType */ +#define UA_NS0ID_HISTORYEVENT_ENCODING_DEFAULTXML 660 /* Object */ +#define UA_NS0ID_HISTORYEVENT_ENCODING_DEFAULTBINARY 661 /* Object */ +#define UA_NS0ID_HISTORYREADREQUEST 662 /* DataType */ +#define UA_NS0ID_HISTORYREADREQUEST_ENCODING_DEFAULTXML 663 /* Object */ +#define UA_NS0ID_HISTORYREADREQUEST_ENCODING_DEFAULTBINARY 664 /* Object */ +#define UA_NS0ID_HISTORYREADRESPONSE 665 /* DataType */ +#define UA_NS0ID_HISTORYREADRESPONSE_ENCODING_DEFAULTXML 666 /* Object */ +#define UA_NS0ID_HISTORYREADRESPONSE_ENCODING_DEFAULTBINARY 667 /* Object */ +#define UA_NS0ID_WRITEVALUE 668 /* DataType */ +#define UA_NS0ID_WRITEVALUE_ENCODING_DEFAULTXML 669 /* Object */ +#define UA_NS0ID_WRITEVALUE_ENCODING_DEFAULTBINARY 670 /* Object */ +#define UA_NS0ID_WRITEREQUEST 671 /* DataType */ +#define UA_NS0ID_WRITEREQUEST_ENCODING_DEFAULTXML 672 /* Object */ +#define UA_NS0ID_WRITEREQUEST_ENCODING_DEFAULTBINARY 673 /* Object */ +#define UA_NS0ID_WRITERESPONSE 674 /* DataType */ +#define UA_NS0ID_WRITERESPONSE_ENCODING_DEFAULTXML 675 /* Object */ +#define UA_NS0ID_WRITERESPONSE_ENCODING_DEFAULTBINARY 676 /* Object */ +#define UA_NS0ID_HISTORYUPDATEDETAILS 677 /* DataType */ +#define UA_NS0ID_HISTORYUPDATEDETAILS_ENCODING_DEFAULTXML 678 /* Object */ +#define UA_NS0ID_HISTORYUPDATEDETAILS_ENCODING_DEFAULTBINARY 679 /* Object */ +#define UA_NS0ID_UPDATEDATADETAILS 680 /* DataType */ +#define UA_NS0ID_UPDATEDATADETAILS_ENCODING_DEFAULTXML 681 /* Object */ +#define UA_NS0ID_UPDATEDATADETAILS_ENCODING_DEFAULTBINARY 682 /* Object */ +#define UA_NS0ID_UPDATEEVENTDETAILS 683 /* DataType */ +#define UA_NS0ID_UPDATEEVENTDETAILS_ENCODING_DEFAULTXML 684 /* Object */ +#define UA_NS0ID_UPDATEEVENTDETAILS_ENCODING_DEFAULTBINARY 685 /* Object */ +#define UA_NS0ID_DELETERAWMODIFIEDDETAILS 686 /* DataType */ +#define UA_NS0ID_DELETERAWMODIFIEDDETAILS_ENCODING_DEFAULTXML 687 /* Object */ +#define UA_NS0ID_DELETERAWMODIFIEDDETAILS_ENCODING_DEFAULTBINARY 688 /* Object */ +#define UA_NS0ID_DELETEATTIMEDETAILS 689 /* DataType */ +#define UA_NS0ID_DELETEATTIMEDETAILS_ENCODING_DEFAULTXML 690 /* Object */ +#define UA_NS0ID_DELETEATTIMEDETAILS_ENCODING_DEFAULTBINARY 691 /* Object */ +#define UA_NS0ID_DELETEEVENTDETAILS 692 /* DataType */ +#define UA_NS0ID_DELETEEVENTDETAILS_ENCODING_DEFAULTXML 693 /* Object */ +#define UA_NS0ID_DELETEEVENTDETAILS_ENCODING_DEFAULTBINARY 694 /* Object */ +#define UA_NS0ID_HISTORYUPDATERESULT 695 /* DataType */ +#define UA_NS0ID_HISTORYUPDATERESULT_ENCODING_DEFAULTXML 696 /* Object */ +#define UA_NS0ID_HISTORYUPDATERESULT_ENCODING_DEFAULTBINARY 697 /* Object */ +#define UA_NS0ID_HISTORYUPDATEREQUEST 698 /* DataType */ +#define UA_NS0ID_HISTORYUPDATEREQUEST_ENCODING_DEFAULTXML 699 /* Object */ +#define UA_NS0ID_HISTORYUPDATEREQUEST_ENCODING_DEFAULTBINARY 700 /* Object */ +#define UA_NS0ID_HISTORYUPDATERESPONSE 701 /* DataType */ +#define UA_NS0ID_HISTORYUPDATERESPONSE_ENCODING_DEFAULTXML 702 /* Object */ +#define UA_NS0ID_HISTORYUPDATERESPONSE_ENCODING_DEFAULTBINARY 703 /* Object */ +#define UA_NS0ID_CALLMETHODREQUEST 704 /* DataType */ +#define UA_NS0ID_CALLMETHODREQUEST_ENCODING_DEFAULTXML 705 /* Object */ +#define UA_NS0ID_CALLMETHODREQUEST_ENCODING_DEFAULTBINARY 706 /* Object */ +#define UA_NS0ID_CALLMETHODRESULT 707 /* DataType */ +#define UA_NS0ID_CALLMETHODRESULT_ENCODING_DEFAULTXML 708 /* Object */ +#define UA_NS0ID_CALLMETHODRESULT_ENCODING_DEFAULTBINARY 709 /* Object */ +#define UA_NS0ID_CALLREQUEST 710 /* DataType */ +#define UA_NS0ID_CALLREQUEST_ENCODING_DEFAULTXML 711 /* Object */ +#define UA_NS0ID_CALLREQUEST_ENCODING_DEFAULTBINARY 712 /* Object */ +#define UA_NS0ID_CALLRESPONSE 713 /* DataType */ +#define UA_NS0ID_CALLRESPONSE_ENCODING_DEFAULTXML 714 /* Object */ +#define UA_NS0ID_CALLRESPONSE_ENCODING_DEFAULTBINARY 715 /* Object */ +#define UA_NS0ID_MONITORINGMODE 716 /* DataType */ +#define UA_NS0ID_DATACHANGETRIGGER 717 /* DataType */ +#define UA_NS0ID_DEADBANDTYPE 718 /* DataType */ +#define UA_NS0ID_MONITORINGFILTER 719 /* DataType */ +#define UA_NS0ID_MONITORINGFILTER_ENCODING_DEFAULTXML 720 /* Object */ +#define UA_NS0ID_MONITORINGFILTER_ENCODING_DEFAULTBINARY 721 /* Object */ +#define UA_NS0ID_DATACHANGEFILTER 722 /* DataType */ +#define UA_NS0ID_DATACHANGEFILTER_ENCODING_DEFAULTXML 723 /* Object */ +#define UA_NS0ID_DATACHANGEFILTER_ENCODING_DEFAULTBINARY 724 /* Object */ +#define UA_NS0ID_EVENTFILTER 725 /* DataType */ +#define UA_NS0ID_EVENTFILTER_ENCODING_DEFAULTXML 726 /* Object */ +#define UA_NS0ID_EVENTFILTER_ENCODING_DEFAULTBINARY 727 /* Object */ +#define UA_NS0ID_AGGREGATEFILTER 728 /* DataType */ +#define UA_NS0ID_AGGREGATEFILTER_ENCODING_DEFAULTXML 729 /* Object */ +#define UA_NS0ID_AGGREGATEFILTER_ENCODING_DEFAULTBINARY 730 /* Object */ +#define UA_NS0ID_MONITORINGFILTERRESULT 731 /* DataType */ +#define UA_NS0ID_MONITORINGFILTERRESULT_ENCODING_DEFAULTXML 732 /* Object */ +#define UA_NS0ID_MONITORINGFILTERRESULT_ENCODING_DEFAULTBINARY 733 /* Object */ +#define UA_NS0ID_EVENTFILTERRESULT 734 /* DataType */ +#define UA_NS0ID_EVENTFILTERRESULT_ENCODING_DEFAULTXML 735 /* Object */ +#define UA_NS0ID_EVENTFILTERRESULT_ENCODING_DEFAULTBINARY 736 /* Object */ +#define UA_NS0ID_AGGREGATEFILTERRESULT 737 /* DataType */ +#define UA_NS0ID_AGGREGATEFILTERRESULT_ENCODING_DEFAULTXML 738 /* Object */ +#define UA_NS0ID_AGGREGATEFILTERRESULT_ENCODING_DEFAULTBINARY 739 /* Object */ +#define UA_NS0ID_MONITORINGPARAMETERS 740 /* DataType */ +#define UA_NS0ID_MONITORINGPARAMETERS_ENCODING_DEFAULTXML 741 /* Object */ +#define UA_NS0ID_MONITORINGPARAMETERS_ENCODING_DEFAULTBINARY 742 /* Object */ +#define UA_NS0ID_MONITOREDITEMCREATEREQUEST 743 /* DataType */ +#define UA_NS0ID_MONITOREDITEMCREATEREQUEST_ENCODING_DEFAULTXML 744 /* Object */ +#define UA_NS0ID_MONITOREDITEMCREATEREQUEST_ENCODING_DEFAULTBINARY 745 /* Object */ +#define UA_NS0ID_MONITOREDITEMCREATERESULT 746 /* DataType */ +#define UA_NS0ID_MONITOREDITEMCREATERESULT_ENCODING_DEFAULTXML 747 /* Object */ +#define UA_NS0ID_MONITOREDITEMCREATERESULT_ENCODING_DEFAULTBINARY 748 /* Object */ +#define UA_NS0ID_CREATEMONITOREDITEMSREQUEST 749 /* DataType */ +#define UA_NS0ID_CREATEMONITOREDITEMSREQUEST_ENCODING_DEFAULTXML 750 /* Object */ +#define UA_NS0ID_CREATEMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY 751 /* Object */ +#define UA_NS0ID_CREATEMONITOREDITEMSRESPONSE 752 /* DataType */ +#define UA_NS0ID_CREATEMONITOREDITEMSRESPONSE_ENCODING_DEFAULTXML 753 /* Object */ +#define UA_NS0ID_CREATEMONITOREDITEMSRESPONSE_ENCODING_DEFAULTBINARY 754 /* Object */ +#define UA_NS0ID_MONITOREDITEMMODIFYREQUEST 755 /* DataType */ +#define UA_NS0ID_MONITOREDITEMMODIFYREQUEST_ENCODING_DEFAULTXML 756 /* Object */ +#define UA_NS0ID_MONITOREDITEMMODIFYREQUEST_ENCODING_DEFAULTBINARY 757 /* Object */ +#define UA_NS0ID_MONITOREDITEMMODIFYRESULT 758 /* DataType */ +#define UA_NS0ID_MONITOREDITEMMODIFYRESULT_ENCODING_DEFAULTXML 759 /* Object */ +#define UA_NS0ID_MONITOREDITEMMODIFYRESULT_ENCODING_DEFAULTBINARY 760 /* Object */ +#define UA_NS0ID_MODIFYMONITOREDITEMSREQUEST 761 /* DataType */ +#define UA_NS0ID_MODIFYMONITOREDITEMSREQUEST_ENCODING_DEFAULTXML 762 /* Object */ +#define UA_NS0ID_MODIFYMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY 763 /* Object */ +#define UA_NS0ID_MODIFYMONITOREDITEMSRESPONSE 764 /* DataType */ +#define UA_NS0ID_MODIFYMONITOREDITEMSRESPONSE_ENCODING_DEFAULTXML 765 /* Object */ +#define UA_NS0ID_MODIFYMONITOREDITEMSRESPONSE_ENCODING_DEFAULTBINARY 766 /* Object */ +#define UA_NS0ID_SETMONITORINGMODEREQUEST 767 /* DataType */ +#define UA_NS0ID_SETMONITORINGMODEREQUEST_ENCODING_DEFAULTXML 768 /* Object */ +#define UA_NS0ID_SETMONITORINGMODEREQUEST_ENCODING_DEFAULTBINARY 769 /* Object */ +#define UA_NS0ID_SETMONITORINGMODERESPONSE 770 /* DataType */ +#define UA_NS0ID_SETMONITORINGMODERESPONSE_ENCODING_DEFAULTXML 771 /* Object */ +#define UA_NS0ID_SETMONITORINGMODERESPONSE_ENCODING_DEFAULTBINARY 772 /* Object */ +#define UA_NS0ID_SETTRIGGERINGREQUEST 773 /* DataType */ +#define UA_NS0ID_SETTRIGGERINGREQUEST_ENCODING_DEFAULTXML 774 /* Object */ +#define UA_NS0ID_SETTRIGGERINGREQUEST_ENCODING_DEFAULTBINARY 775 /* Object */ +#define UA_NS0ID_SETTRIGGERINGRESPONSE 776 /* DataType */ +#define UA_NS0ID_SETTRIGGERINGRESPONSE_ENCODING_DEFAULTXML 777 /* Object */ +#define UA_NS0ID_SETTRIGGERINGRESPONSE_ENCODING_DEFAULTBINARY 778 /* Object */ +#define UA_NS0ID_DELETEMONITOREDITEMSREQUEST 779 /* DataType */ +#define UA_NS0ID_DELETEMONITOREDITEMSREQUEST_ENCODING_DEFAULTXML 780 /* Object */ +#define UA_NS0ID_DELETEMONITOREDITEMSREQUEST_ENCODING_DEFAULTBINARY 781 /* Object */ +#define UA_NS0ID_DELETEMONITOREDITEMSRESPONSE 782 /* DataType */ +#define UA_NS0ID_DELETEMONITOREDITEMSRESPONSE_ENCODING_DEFAULTXML 783 /* Object */ +#define UA_NS0ID_DELETEMONITOREDITEMSRESPONSE_ENCODING_DEFAULTBINARY 784 /* Object */ +#define UA_NS0ID_CREATESUBSCRIPTIONREQUEST 785 /* DataType */ +#define UA_NS0ID_CREATESUBSCRIPTIONREQUEST_ENCODING_DEFAULTXML 786 /* Object */ +#define UA_NS0ID_CREATESUBSCRIPTIONREQUEST_ENCODING_DEFAULTBINARY 787 /* Object */ +#define UA_NS0ID_CREATESUBSCRIPTIONRESPONSE 788 /* DataType */ +#define UA_NS0ID_CREATESUBSCRIPTIONRESPONSE_ENCODING_DEFAULTXML 789 /* Object */ +#define UA_NS0ID_CREATESUBSCRIPTIONRESPONSE_ENCODING_DEFAULTBINARY 790 /* Object */ +#define UA_NS0ID_MODIFYSUBSCRIPTIONREQUEST 791 /* DataType */ +#define UA_NS0ID_MODIFYSUBSCRIPTIONREQUEST_ENCODING_DEFAULTXML 792 /* Object */ +#define UA_NS0ID_MODIFYSUBSCRIPTIONREQUEST_ENCODING_DEFAULTBINARY 793 /* Object */ +#define UA_NS0ID_MODIFYSUBSCRIPTIONRESPONSE 794 /* DataType */ +#define UA_NS0ID_MODIFYSUBSCRIPTIONRESPONSE_ENCODING_DEFAULTXML 795 /* Object */ +#define UA_NS0ID_MODIFYSUBSCRIPTIONRESPONSE_ENCODING_DEFAULTBINARY 796 /* Object */ +#define UA_NS0ID_SETPUBLISHINGMODEREQUEST 797 /* DataType */ +#define UA_NS0ID_SETPUBLISHINGMODEREQUEST_ENCODING_DEFAULTXML 798 /* Object */ +#define UA_NS0ID_SETPUBLISHINGMODEREQUEST_ENCODING_DEFAULTBINARY 799 /* Object */ +#define UA_NS0ID_SETPUBLISHINGMODERESPONSE 800 /* DataType */ +#define UA_NS0ID_SETPUBLISHINGMODERESPONSE_ENCODING_DEFAULTXML 801 /* Object */ +#define UA_NS0ID_SETPUBLISHINGMODERESPONSE_ENCODING_DEFAULTBINARY 802 /* Object */ +#define UA_NS0ID_NOTIFICATIONMESSAGE 803 /* DataType */ +#define UA_NS0ID_NOTIFICATIONMESSAGE_ENCODING_DEFAULTXML 804 /* Object */ +#define UA_NS0ID_NOTIFICATIONMESSAGE_ENCODING_DEFAULTBINARY 805 /* Object */ +#define UA_NS0ID_MONITOREDITEMNOTIFICATION 806 /* DataType */ +#define UA_NS0ID_MONITOREDITEMNOTIFICATION_ENCODING_DEFAULTXML 807 /* Object */ +#define UA_NS0ID_MONITOREDITEMNOTIFICATION_ENCODING_DEFAULTBINARY 808 /* Object */ +#define UA_NS0ID_DATACHANGENOTIFICATION 809 /* DataType */ +#define UA_NS0ID_DATACHANGENOTIFICATION_ENCODING_DEFAULTXML 810 /* Object */ +#define UA_NS0ID_DATACHANGENOTIFICATION_ENCODING_DEFAULTBINARY 811 /* Object */ +#define UA_NS0ID_STATUSCHANGENOTIFICATION 818 /* DataType */ +#define UA_NS0ID_STATUSCHANGENOTIFICATION_ENCODING_DEFAULTXML 819 /* Object */ +#define UA_NS0ID_STATUSCHANGENOTIFICATION_ENCODING_DEFAULTBINARY 820 /* Object */ +#define UA_NS0ID_SUBSCRIPTIONACKNOWLEDGEMENT 821 /* DataType */ +#define UA_NS0ID_SUBSCRIPTIONACKNOWLEDGEMENT_ENCODING_DEFAULTXML 822 /* Object */ +#define UA_NS0ID_SUBSCRIPTIONACKNOWLEDGEMENT_ENCODING_DEFAULTBINARY 823 /* Object */ +#define UA_NS0ID_PUBLISHREQUEST 824 /* DataType */ +#define UA_NS0ID_PUBLISHREQUEST_ENCODING_DEFAULTXML 825 /* Object */ +#define UA_NS0ID_PUBLISHREQUEST_ENCODING_DEFAULTBINARY 826 /* Object */ +#define UA_NS0ID_PUBLISHRESPONSE 827 /* DataType */ +#define UA_NS0ID_PUBLISHRESPONSE_ENCODING_DEFAULTXML 828 /* Object */ +#define UA_NS0ID_PUBLISHRESPONSE_ENCODING_DEFAULTBINARY 829 /* Object */ +#define UA_NS0ID_REPUBLISHREQUEST 830 /* DataType */ +#define UA_NS0ID_REPUBLISHREQUEST_ENCODING_DEFAULTXML 831 /* Object */ +#define UA_NS0ID_REPUBLISHREQUEST_ENCODING_DEFAULTBINARY 832 /* Object */ +#define UA_NS0ID_REPUBLISHRESPONSE 833 /* DataType */ +#define UA_NS0ID_REPUBLISHRESPONSE_ENCODING_DEFAULTXML 834 /* Object */ +#define UA_NS0ID_REPUBLISHRESPONSE_ENCODING_DEFAULTBINARY 835 /* Object */ +#define UA_NS0ID_TRANSFERRESULT 836 /* DataType */ +#define UA_NS0ID_TRANSFERRESULT_ENCODING_DEFAULTXML 837 /* Object */ +#define UA_NS0ID_TRANSFERRESULT_ENCODING_DEFAULTBINARY 838 /* Object */ +#define UA_NS0ID_TRANSFERSUBSCRIPTIONSREQUEST 839 /* DataType */ +#define UA_NS0ID_TRANSFERSUBSCRIPTIONSREQUEST_ENCODING_DEFAULTXML 840 /* Object */ +#define UA_NS0ID_TRANSFERSUBSCRIPTIONSREQUEST_ENCODING_DEFAULTBINARY 841 /* Object */ +#define UA_NS0ID_TRANSFERSUBSCRIPTIONSRESPONSE 842 /* DataType */ +#define UA_NS0ID_TRANSFERSUBSCRIPTIONSRESPONSE_ENCODING_DEFAULTXML 843 /* Object */ +#define UA_NS0ID_TRANSFERSUBSCRIPTIONSRESPONSE_ENCODING_DEFAULTBINARY 844 /* Object */ +#define UA_NS0ID_DELETESUBSCRIPTIONSREQUEST 845 /* DataType */ +#define UA_NS0ID_DELETESUBSCRIPTIONSREQUEST_ENCODING_DEFAULTXML 846 /* Object */ +#define UA_NS0ID_DELETESUBSCRIPTIONSREQUEST_ENCODING_DEFAULTBINARY 847 /* Object */ +#define UA_NS0ID_DELETESUBSCRIPTIONSRESPONSE 848 /* DataType */ +#define UA_NS0ID_DELETESUBSCRIPTIONSRESPONSE_ENCODING_DEFAULTXML 849 /* Object */ +#define UA_NS0ID_DELETESUBSCRIPTIONSRESPONSE_ENCODING_DEFAULTBINARY 850 /* Object */ +#define UA_NS0ID_REDUNDANCYSUPPORT 851 /* DataType */ +#define UA_NS0ID_SERVERSTATE 852 /* DataType */ +#define UA_NS0ID_REDUNDANTSERVERDATATYPE 853 /* DataType */ +#define UA_NS0ID_REDUNDANTSERVERDATATYPE_ENCODING_DEFAULTXML 854 /* Object */ +#define UA_NS0ID_REDUNDANTSERVERDATATYPE_ENCODING_DEFAULTBINARY 855 /* Object */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSDATATYPE 856 /* DataType */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSDATATYPE_ENCODING_DEFAULTXML 857 /* Object */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSDATATYPE_ENCODING_DEFAULTBINARY 858 /* Object */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYDATATYPE 859 /* DataType */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYDATATYPE_ENCODING_DEFAULTXML 860 /* Object */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYDATATYPE_ENCODING_DEFAULTBINARY 861 /* Object */ +#define UA_NS0ID_SERVERSTATUSDATATYPE 862 /* DataType */ +#define UA_NS0ID_SERVERSTATUSDATATYPE_ENCODING_DEFAULTXML 863 /* Object */ +#define UA_NS0ID_SERVERSTATUSDATATYPE_ENCODING_DEFAULTBINARY 864 /* Object */ +#define UA_NS0ID_SESSIONDIAGNOSTICSDATATYPE 865 /* DataType */ +#define UA_NS0ID_SESSIONDIAGNOSTICSDATATYPE_ENCODING_DEFAULTXML 866 /* Object */ +#define UA_NS0ID_SESSIONDIAGNOSTICSDATATYPE_ENCODING_DEFAULTBINARY 867 /* Object */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSDATATYPE 868 /* DataType */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSDATATYPE_ENCODING_DEFAULTXML 869 /* Object */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSDATATYPE_ENCODING_DEFAULTBINARY 870 /* Object */ +#define UA_NS0ID_SERVICECOUNTERDATATYPE 871 /* DataType */ +#define UA_NS0ID_SERVICECOUNTERDATATYPE_ENCODING_DEFAULTXML 872 /* Object */ +#define UA_NS0ID_SERVICECOUNTERDATATYPE_ENCODING_DEFAULTBINARY 873 /* Object */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSDATATYPE 874 /* DataType */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSDATATYPE_ENCODING_DEFAULTXML 875 /* Object */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSDATATYPE_ENCODING_DEFAULTBINARY 876 /* Object */ +#define UA_NS0ID_MODELCHANGESTRUCTUREDATATYPE 877 /* DataType */ +#define UA_NS0ID_MODELCHANGESTRUCTUREDATATYPE_ENCODING_DEFAULTXML 878 /* Object */ +#define UA_NS0ID_MODELCHANGESTRUCTUREDATATYPE_ENCODING_DEFAULTBINARY 879 /* Object */ +#define UA_NS0ID_RANGE 884 /* DataType */ +#define UA_NS0ID_RANGE_ENCODING_DEFAULTXML 885 /* Object */ +#define UA_NS0ID_RANGE_ENCODING_DEFAULTBINARY 886 /* Object */ +#define UA_NS0ID_EUINFORMATION 887 /* DataType */ +#define UA_NS0ID_EUINFORMATION_ENCODING_DEFAULTXML 888 /* Object */ +#define UA_NS0ID_EUINFORMATION_ENCODING_DEFAULTBINARY 889 /* Object */ +#define UA_NS0ID_EXCEPTIONDEVIATIONFORMAT 890 /* DataType */ +#define UA_NS0ID_ANNOTATION 891 /* DataType */ +#define UA_NS0ID_ANNOTATION_ENCODING_DEFAULTXML 892 /* Object */ +#define UA_NS0ID_ANNOTATION_ENCODING_DEFAULTBINARY 893 /* Object */ +#define UA_NS0ID_PROGRAMDIAGNOSTICDATATYPE 894 /* DataType */ +#define UA_NS0ID_PROGRAMDIAGNOSTICDATATYPE_ENCODING_DEFAULTXML 895 /* Object */ +#define UA_NS0ID_PROGRAMDIAGNOSTICDATATYPE_ENCODING_DEFAULTBINARY 896 /* Object */ +#define UA_NS0ID_SEMANTICCHANGESTRUCTUREDATATYPE 897 /* DataType */ +#define UA_NS0ID_SEMANTICCHANGESTRUCTUREDATATYPE_ENCODING_DEFAULTXML 898 /* Object */ +#define UA_NS0ID_SEMANTICCHANGESTRUCTUREDATATYPE_ENCODING_DEFAULTBINARY 899 /* Object */ +#define UA_NS0ID_EVENTNOTIFICATIONLIST 914 /* DataType */ +#define UA_NS0ID_EVENTNOTIFICATIONLIST_ENCODING_DEFAULTXML 915 /* Object */ +#define UA_NS0ID_EVENTNOTIFICATIONLIST_ENCODING_DEFAULTBINARY 916 /* Object */ +#define UA_NS0ID_EVENTFIELDLIST 917 /* DataType */ +#define UA_NS0ID_EVENTFIELDLIST_ENCODING_DEFAULTXML 918 /* Object */ +#define UA_NS0ID_EVENTFIELDLIST_ENCODING_DEFAULTBINARY 919 /* Object */ +#define UA_NS0ID_HISTORYEVENTFIELDLIST 920 /* DataType */ +#define UA_NS0ID_HISTORYEVENTFIELDLIST_ENCODING_DEFAULTXML 921 /* Object */ +#define UA_NS0ID_HISTORYEVENTFIELDLIST_ENCODING_DEFAULTBINARY 922 /* Object */ +#define UA_NS0ID_ISSUEDIDENTITYTOKEN 938 /* DataType */ +#define UA_NS0ID_ISSUEDIDENTITYTOKEN_ENCODING_DEFAULTXML 939 /* Object */ +#define UA_NS0ID_ISSUEDIDENTITYTOKEN_ENCODING_DEFAULTBINARY 940 /* Object */ +#define UA_NS0ID_NOTIFICATIONDATA 945 /* DataType */ +#define UA_NS0ID_NOTIFICATIONDATA_ENCODING_DEFAULTXML 946 /* Object */ +#define UA_NS0ID_NOTIFICATIONDATA_ENCODING_DEFAULTBINARY 947 /* Object */ +#define UA_NS0ID_AGGREGATECONFIGURATION 948 /* DataType */ +#define UA_NS0ID_AGGREGATECONFIGURATION_ENCODING_DEFAULTXML 949 /* Object */ +#define UA_NS0ID_AGGREGATECONFIGURATION_ENCODING_DEFAULTBINARY 950 /* Object */ +#define UA_NS0ID_IMAGEBMP 2000 /* DataType */ +#define UA_NS0ID_IMAGEGIF 2001 /* DataType */ +#define UA_NS0ID_IMAGEJPG 2002 /* DataType */ +#define UA_NS0ID_IMAGEPNG 2003 /* DataType */ +#define UA_NS0ID_SERVERTYPE 2004 /* ObjectType */ +#define UA_NS0ID_SERVERTYPE_SERVERARRAY 2005 /* Variable */ +#define UA_NS0ID_SERVERTYPE_NAMESPACEARRAY 2006 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERSTATUS 2007 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVICELEVEL 2008 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES 2009 /* Object */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS 2010 /* Object */ +#define UA_NS0ID_SERVERTYPE_VENDORSERVERINFO 2011 /* Object */ +#define UA_NS0ID_SERVERTYPE_SERVERREDUNDANCY 2012 /* Object */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE 2013 /* ObjectType */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_SERVERPROFILEARRAY 2014 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_LOCALEIDARRAY 2016 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_MINSUPPORTEDSAMPLERATE 2017 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_MODELLINGRULES 2019 /* Object */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE 2020 /* ObjectType */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SERVERDIAGNOSTICSSUMMARY 2021 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SAMPLINGINTERVALDIAGNOSTICSARRAY 2022 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SUBSCRIPTIONDIAGNOSTICSARRAY 2023 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_ENABLEDFLAG 2025 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE 2026 /* ObjectType */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_SESSIONDIAGNOSTICSARRAY 2027 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_SESSIONSECURITYDIAGNOSTICSARRAY 2028 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE 2029 /* ObjectType */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS 2030 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONSECURITYDIAGNOSTICS 2031 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SUBSCRIPTIONDIAGNOSTICSARRAY 2032 /* Variable */ +#define UA_NS0ID_VENDORSERVERINFOTYPE 2033 /* ObjectType */ +#define UA_NS0ID_SERVERREDUNDANCYTYPE 2034 /* ObjectType */ +#define UA_NS0ID_SERVERREDUNDANCYTYPE_REDUNDANCYSUPPORT 2035 /* Variable */ +#define UA_NS0ID_TRANSPARENTREDUNDANCYTYPE 2036 /* ObjectType */ +#define UA_NS0ID_TRANSPARENTREDUNDANCYTYPE_CURRENTSERVERID 2037 /* Variable */ +#define UA_NS0ID_TRANSPARENTREDUNDANCYTYPE_REDUNDANTSERVERARRAY 2038 /* Variable */ +#define UA_NS0ID_NONTRANSPARENTREDUNDANCYTYPE 2039 /* ObjectType */ +#define UA_NS0ID_NONTRANSPARENTREDUNDANCYTYPE_SERVERURIARRAY 2040 /* Variable */ +#define UA_NS0ID_BASEEVENTTYPE 2041 /* ObjectType */ +#define UA_NS0ID_BASEEVENTTYPE_EVENTID 2042 /* Variable */ +#define UA_NS0ID_BASEEVENTTYPE_EVENTTYPE 2043 /* Variable */ +#define UA_NS0ID_BASEEVENTTYPE_SOURCENODE 2044 /* Variable */ +#define UA_NS0ID_BASEEVENTTYPE_SOURCENAME 2045 /* Variable */ +#define UA_NS0ID_BASEEVENTTYPE_TIME 2046 /* Variable */ +#define UA_NS0ID_BASEEVENTTYPE_RECEIVETIME 2047 /* Variable */ +#define UA_NS0ID_BASEEVENTTYPE_MESSAGE 2050 /* Variable */ +#define UA_NS0ID_BASEEVENTTYPE_SEVERITY 2051 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE 2052 /* ObjectType */ +#define UA_NS0ID_AUDITEVENTTYPE_ACTIONTIMESTAMP 2053 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE_STATUS 2054 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE_SERVERID 2055 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE_CLIENTAUDITENTRYID 2056 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE_CLIENTUSERID 2057 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE 2058 /* ObjectType */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE 2059 /* ObjectType */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE 2060 /* ObjectType */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_CLIENTCERTIFICATE 2061 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_REQUESTTYPE 2062 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_SECURITYPOLICYURI 2063 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_SECURITYMODE 2065 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_REQUESTEDLIFETIME 2066 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE 2069 /* ObjectType */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_SESSIONID 2070 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE 2071 /* ObjectType */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_SECURECHANNELID 2072 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_CLIENTCERTIFICATE 2073 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_REVISEDSESSIONTIMEOUT 2074 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE 2075 /* ObjectType */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_CLIENTSOFTWARECERTIFICATES 2076 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_USERIDENTITYTOKEN 2077 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE 2078 /* ObjectType */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_REQUESTHANDLE 2079 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE 2080 /* ObjectType */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_CERTIFICATE 2081 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE 2082 /* ObjectType */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_INVALIDHOSTNAME 2083 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_INVALIDURI 2084 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE 2085 /* ObjectType */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE 2086 /* ObjectType */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE 2087 /* ObjectType */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE 2088 /* ObjectType */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE 2089 /* ObjectType */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE 2090 /* ObjectType */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE 2091 /* ObjectType */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_NODESTOADD 2092 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE 2093 /* ObjectType */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_NODESTODELETE 2094 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE 2095 /* ObjectType */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_REFERENCESTOADD 2096 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE 2097 /* ObjectType */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_REFERENCESTODELETE 2098 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE 2099 /* ObjectType */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE 2100 /* ObjectType */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_INDEXRANGE 2101 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_OLDVALUE 2102 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_NEWVALUE 2103 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE 2104 /* ObjectType */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE 2127 /* ObjectType */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_METHODID 2128 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_INPUTARGUMENTS 2129 /* Variable */ +#define UA_NS0ID_SYSTEMEVENTTYPE 2130 /* ObjectType */ +#define UA_NS0ID_DEVICEFAILUREEVENTTYPE 2131 /* ObjectType */ +#define UA_NS0ID_BASEMODELCHANGEEVENTTYPE 2132 /* ObjectType */ +#define UA_NS0ID_GENERALMODELCHANGEEVENTTYPE 2133 /* ObjectType */ +#define UA_NS0ID_GENERALMODELCHANGEEVENTTYPE_CHANGES 2134 /* Variable */ +#define UA_NS0ID_SERVERVENDORCAPABILITYTYPE 2137 /* VariableType */ +#define UA_NS0ID_SERVERSTATUSTYPE 2138 /* VariableType */ +#define UA_NS0ID_SERVERSTATUSTYPE_STARTTIME 2139 /* Variable */ +#define UA_NS0ID_SERVERSTATUSTYPE_CURRENTTIME 2140 /* Variable */ +#define UA_NS0ID_SERVERSTATUSTYPE_STATE 2141 /* Variable */ +#define UA_NS0ID_SERVERSTATUSTYPE_BUILDINFO 2142 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE 2150 /* VariableType */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE_SERVERVIEWCOUNT 2151 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE_CURRENTSESSIONCOUNT 2152 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE_CUMULATEDSESSIONCOUNT 2153 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE_SECURITYREJECTEDSESSIONCOUNT 2154 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE_REJECTEDSESSIONCOUNT 2155 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE_SESSIONTIMEOUTCOUNT 2156 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE_SESSIONABORTCOUNT 2157 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE_PUBLISHINGINTERVALCOUNT 2159 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE_CURRENTSUBSCRIPTIONCOUNT 2160 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE_CUMULATEDSUBSCRIPTIONCOUNT 2161 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE_SECURITYREJECTEDREQUESTSCOUNT 2162 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYTYPE_REJECTEDREQUESTSCOUNT 2163 /* Variable */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSARRAYTYPE 2164 /* VariableType */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSTYPE 2165 /* VariableType */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSTYPE_SAMPLINGINTERVAL 2166 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE 2171 /* VariableType */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE 2172 /* VariableType */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_SESSIONID 2173 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_SUBSCRIPTIONID 2174 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_PRIORITY 2175 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_PUBLISHINGINTERVAL 2176 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_MAXKEEPALIVECOUNT 2177 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_MAXNOTIFICATIONSPERPUBLISH 2179 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_PUBLISHINGENABLED 2180 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_MODIFYCOUNT 2181 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_ENABLECOUNT 2182 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_DISABLECOUNT 2183 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_REPUBLISHREQUESTCOUNT 2184 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_REPUBLISHMESSAGEREQUESTCOUNT 2185 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_REPUBLISHMESSAGECOUNT 2186 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_TRANSFERREQUESTCOUNT 2187 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_TRANSFERREDTOALTCLIENTCOUNT 2188 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_TRANSFERREDTOSAMECLIENTCOUNT 2189 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_PUBLISHREQUESTCOUNT 2190 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_DATACHANGENOTIFICATIONSCOUNT 2191 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_NOTIFICATIONSCOUNT 2193 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE 2196 /* VariableType */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE 2197 /* VariableType */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_SESSIONID 2198 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_SESSIONNAME 2199 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_CLIENTDESCRIPTION 2200 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_SERVERURI 2201 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_ENDPOINTURL 2202 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_LOCALEIDS 2203 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_ACTUALSESSIONTIMEOUT 2204 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_CLIENTCONNECTIONTIME 2205 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_CLIENTLASTCONTACTTIME 2206 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_CURRENTSUBSCRIPTIONSCOUNT 2207 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_CURRENTMONITOREDITEMSCOUNT 2208 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_CURRENTPUBLISHREQUESTSINQUEUE 2209 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_READCOUNT 2217 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_HISTORYREADCOUNT 2218 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_WRITECOUNT 2219 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_HISTORYUPDATECOUNT 2220 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_CALLCOUNT 2221 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_CREATEMONITOREDITEMSCOUNT 2222 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_MODIFYMONITOREDITEMSCOUNT 2223 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_SETMONITORINGMODECOUNT 2224 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_SETTRIGGERINGCOUNT 2225 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_DELETEMONITOREDITEMSCOUNT 2226 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_CREATESUBSCRIPTIONCOUNT 2227 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_MODIFYSUBSCRIPTIONCOUNT 2228 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_SETPUBLISHINGMODECOUNT 2229 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_PUBLISHCOUNT 2230 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_REPUBLISHCOUNT 2231 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_TRANSFERSUBSCRIPTIONSCOUNT 2232 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_DELETESUBSCRIPTIONSCOUNT 2233 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_ADDNODESCOUNT 2234 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_ADDREFERENCESCOUNT 2235 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_DELETENODESCOUNT 2236 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_DELETEREFERENCESCOUNT 2237 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_BROWSECOUNT 2238 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_BROWSENEXTCOUNT 2239 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_TRANSLATEBROWSEPATHSTONODEIDSCOUNT 2240 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_QUERYFIRSTCOUNT 2241 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_QUERYNEXTCOUNT 2242 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSARRAYTYPE 2243 /* VariableType */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSTYPE 2244 /* VariableType */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSTYPE_SESSIONID 2245 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSTYPE_CLIENTUSERIDOFSESSION 2246 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSTYPE_CLIENTUSERIDHISTORY 2247 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSTYPE_AUTHENTICATIONMECHANISM 2248 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSTYPE_ENCODING 2249 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSTYPE_TRANSPORTPROTOCOL 2250 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSTYPE_SECURITYMODE 2251 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSTYPE_SECURITYPOLICYURI 2252 /* Variable */ +#define UA_NS0ID_SERVER 2253 /* Object */ +#define UA_NS0ID_SERVER_SERVERARRAY 2254 /* Variable */ +#define UA_NS0ID_SERVER_NAMESPACEARRAY 2255 /* Variable */ +#define UA_NS0ID_SERVER_SERVERSTATUS 2256 /* Variable */ +#define UA_NS0ID_SERVER_SERVERSTATUS_STARTTIME 2257 /* Variable */ +#define UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME 2258 /* Variable */ +#define UA_NS0ID_SERVER_SERVERSTATUS_STATE 2259 /* Variable */ +#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO 2260 /* Variable */ +#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME 2261 /* Variable */ +#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI 2262 /* Variable */ +#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME 2263 /* Variable */ +#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION 2264 /* Variable */ +#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER 2265 /* Variable */ +#define UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE 2266 /* Variable */ +#define UA_NS0ID_SERVER_SERVICELEVEL 2267 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES 2268 /* Object */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_SERVERPROFILEARRAY 2269 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_LOCALEIDARRAY 2271 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MINSUPPORTEDSAMPLERATE 2272 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS 2274 /* Object */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY 2275 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SERVERVIEWCOUNT 2276 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_CURRENTSESSIONCOUNT 2277 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_CUMULATEDSESSIONCOUNT 2278 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SECURITYREJECTEDSESSIONCOUNT 2279 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SESSIONTIMEOUTCOUNT 2281 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SESSIONABORTCOUNT 2282 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_PUBLISHINGINTERVALCOUNT 2284 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_CURRENTSUBSCRIPTIONCOUNT 2285 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_CUMULATEDSUBSCRIPTIONCOUNT 2286 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SECURITYREJECTEDREQUESTSCOUNT 2287 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_REJECTEDREQUESTSCOUNT 2288 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SAMPLINGINTERVALDIAGNOSTICSARRAY 2289 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SUBSCRIPTIONDIAGNOSTICSARRAY 2290 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_ENABLEDFLAG 2294 /* Variable */ +#define UA_NS0ID_SERVER_VENDORSERVERINFO 2295 /* Object */ +#define UA_NS0ID_SERVER_SERVERREDUNDANCY 2296 /* Object */ +#define UA_NS0ID_STATEMACHINETYPE 2299 /* ObjectType */ +#define UA_NS0ID_STATETYPE 2307 /* ObjectType */ +#define UA_NS0ID_STATETYPE_STATENUMBER 2308 /* Variable */ +#define UA_NS0ID_INITIALSTATETYPE 2309 /* ObjectType */ +#define UA_NS0ID_TRANSITIONTYPE 2310 /* ObjectType */ +#define UA_NS0ID_TRANSITIONEVENTTYPE 2311 /* ObjectType */ +#define UA_NS0ID_TRANSITIONTYPE_TRANSITIONNUMBER 2312 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE 2315 /* ObjectType */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE 2318 /* ObjectType */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_STEPPED 2323 /* Variable */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_DEFINITION 2324 /* Variable */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_MAXTIMEINTERVAL 2325 /* Variable */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_MINTIMEINTERVAL 2326 /* Variable */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_EXCEPTIONDEVIATION 2327 /* Variable */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_EXCEPTIONDEVIATIONFORMAT 2328 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE 2330 /* ObjectType */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_ACCESSHISTORYDATACAPABILITY 2331 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_ACCESSHISTORYEVENTSCAPABILITY 2332 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_INSERTDATACAPABILITY 2334 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_REPLACEDATACAPABILITY 2335 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_UPDATEDATACAPABILITY 2336 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_DELETERAWCAPABILITY 2337 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_DELETEATTIMECAPABILITY 2338 /* Variable */ +#define UA_NS0ID_AGGREGATEFUNCTIONTYPE 2340 /* ObjectType */ +#define UA_NS0ID_AGGREGATEFUNCTION_INTERPOLATIVE 2341 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_AVERAGE 2342 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_TIMEAVERAGE 2343 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_TOTAL 2344 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_MINIMUM 2346 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_MAXIMUM 2347 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_MINIMUMACTUALTIME 2348 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_MAXIMUMACTUALTIME 2349 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_RANGE 2350 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_ANNOTATIONCOUNT 2351 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_COUNT 2352 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_NUMBEROFTRANSITIONS 2355 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_START 2357 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_END 2358 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_DELTA 2359 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_DURATIONGOOD 2360 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_DURATIONBAD 2361 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_PERCENTGOOD 2362 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_PERCENTBAD 2363 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_WORSTQUALITY 2364 /* Object */ +#define UA_NS0ID_DATAITEMTYPE 2365 /* VariableType */ +#define UA_NS0ID_DATAITEMTYPE_DEFINITION 2366 /* Variable */ +#define UA_NS0ID_DATAITEMTYPE_VALUEPRECISION 2367 /* Variable */ +#define UA_NS0ID_ANALOGITEMTYPE 2368 /* VariableType */ +#define UA_NS0ID_ANALOGITEMTYPE_EURANGE 2369 /* Variable */ +#define UA_NS0ID_ANALOGITEMTYPE_INSTRUMENTRANGE 2370 /* Variable */ +#define UA_NS0ID_ANALOGITEMTYPE_ENGINEERINGUNITS 2371 /* Variable */ +#define UA_NS0ID_DISCRETEITEMTYPE 2372 /* VariableType */ +#define UA_NS0ID_TWOSTATEDISCRETETYPE 2373 /* VariableType */ +#define UA_NS0ID_TWOSTATEDISCRETETYPE_FALSESTATE 2374 /* Variable */ +#define UA_NS0ID_TWOSTATEDISCRETETYPE_TRUESTATE 2375 /* Variable */ +#define UA_NS0ID_MULTISTATEDISCRETETYPE 2376 /* VariableType */ +#define UA_NS0ID_MULTISTATEDISCRETETYPE_ENUMSTRINGS 2377 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE 2378 /* ObjectType */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_INTERMEDIATERESULT 2379 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTICTYPE 2380 /* VariableType */ +#define UA_NS0ID_PROGRAMDIAGNOSTICTYPE_CREATESESSIONID 2381 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTICTYPE_CREATECLIENTNAME 2382 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTICTYPE_INVOCATIONCREATIONTIME 2383 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTICTYPE_LASTTRANSITIONTIME 2384 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTICTYPE_LASTMETHODCALL 2385 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTICTYPE_LASTMETHODSESSIONID 2386 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTICTYPE_LASTMETHODINPUTARGUMENTS 2387 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTICTYPE_LASTMETHODOUTPUTARGUMENTS 2388 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTICTYPE_LASTMETHODCALLTIME 2389 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTICTYPE_LASTMETHODRETURNSTATUS 2390 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE 2391 /* ObjectType */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_CREATABLE 2392 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_DELETABLE 2393 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_AUTODELETE 2394 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_RECYCLECOUNT 2395 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_INSTANCECOUNT 2396 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_MAXINSTANCECOUNT 2397 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_MAXRECYCLECOUNT 2398 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_PROGRAMDIAGNOSTIC 2399 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_READY 2400 /* Object */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_READY_STATENUMBER 2401 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_RUNNING 2402 /* Object */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_RUNNING_STATENUMBER 2403 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_SUSPENDED 2404 /* Object */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_SUSPENDED_STATENUMBER 2405 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_HALTED 2406 /* Object */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_HALTED_STATENUMBER 2407 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_HALTEDTOREADY 2408 /* Object */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_HALTEDTOREADY_TRANSITIONNUMBER 2409 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_READYTORUNNING 2410 /* Object */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_READYTORUNNING_TRANSITIONNUMBER 2411 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_RUNNINGTOHALTED 2412 /* Object */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_RUNNINGTOHALTED_TRANSITIONNUMBER 2413 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_RUNNINGTOREADY 2414 /* Object */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_RUNNINGTOREADY_TRANSITIONNUMBER 2415 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_RUNNINGTOSUSPENDED 2416 /* Object */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_RUNNINGTOSUSPENDED_TRANSITIONNUMBER 2417 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_SUSPENDEDTORUNNING 2418 /* Object */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_SUSPENDEDTORUNNING_TRANSITIONNUMBER 2419 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_SUSPENDEDTOHALTED 2420 /* Object */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_SUSPENDEDTOHALTED_TRANSITIONNUMBER 2421 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_SUSPENDEDTOREADY 2422 /* Object */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_SUSPENDEDTOREADY_TRANSITIONNUMBER 2423 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_READYTOHALTED 2424 /* Object */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_READYTOHALTED_TRANSITIONNUMBER 2425 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_START 2426 /* Method */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_SUSPEND 2427 /* Method */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_RESUME 2428 /* Method */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_HALT 2429 /* Method */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_RESET 2430 /* Method */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_REGISTERNODESCOUNT 2730 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_UNREGISTERNODESCOUNT 2731 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_MAXBROWSECONTINUATIONPOINTS 2732 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_MAXQUERYCONTINUATIONPOINTS 2733 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_MAXHISTORYCONTINUATIONPOINTS 2734 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBROWSECONTINUATIONPOINTS 2735 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXQUERYCONTINUATIONPOINTS 2736 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXHISTORYCONTINUATIONPOINTS 2737 /* Variable */ +#define UA_NS0ID_SEMANTICCHANGEEVENTTYPE 2738 /* ObjectType */ +#define UA_NS0ID_SEMANTICCHANGEEVENTTYPE_CHANGES 2739 /* Variable */ +#define UA_NS0ID_SERVERTYPE_AUDITING 2742 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SESSIONSDIAGNOSTICSSUMMARY 2744 /* Object */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_SECURECHANNELID 2745 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_CLIENTCERTIFICATETHUMBPRINT 2746 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_CLIENTCERTIFICATETHUMBPRINT 2747 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE 2748 /* ObjectType */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_ENDPOINTURL 2749 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_ATTRIBUTEID 2750 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_PARAMETERDATATYPEID 2751 /* Variable */ +#define UA_NS0ID_SERVERSTATUSTYPE_SECONDSTILLSHUTDOWN 2752 /* Variable */ +#define UA_NS0ID_SERVERSTATUSTYPE_SHUTDOWNREASON 2753 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_AGGREGATEFUNCTIONS 2754 /* Object */ +#define UA_NS0ID_STATEVARIABLETYPE 2755 /* VariableType */ +#define UA_NS0ID_STATEVARIABLETYPE_ID 2756 /* Variable */ +#define UA_NS0ID_STATEVARIABLETYPE_NAME 2757 /* Variable */ +#define UA_NS0ID_STATEVARIABLETYPE_NUMBER 2758 /* Variable */ +#define UA_NS0ID_STATEVARIABLETYPE_EFFECTIVEDISPLAYNAME 2759 /* Variable */ +#define UA_NS0ID_FINITESTATEVARIABLETYPE 2760 /* VariableType */ +#define UA_NS0ID_FINITESTATEVARIABLETYPE_ID 2761 /* Variable */ +#define UA_NS0ID_TRANSITIONVARIABLETYPE 2762 /* VariableType */ +#define UA_NS0ID_TRANSITIONVARIABLETYPE_ID 2763 /* Variable */ +#define UA_NS0ID_TRANSITIONVARIABLETYPE_NAME 2764 /* Variable */ +#define UA_NS0ID_TRANSITIONVARIABLETYPE_NUMBER 2765 /* Variable */ +#define UA_NS0ID_TRANSITIONVARIABLETYPE_TRANSITIONTIME 2766 /* Variable */ +#define UA_NS0ID_FINITETRANSITIONVARIABLETYPE 2767 /* VariableType */ +#define UA_NS0ID_FINITETRANSITIONVARIABLETYPE_ID 2768 /* Variable */ +#define UA_NS0ID_STATEMACHINETYPE_CURRENTSTATE 2769 /* Variable */ +#define UA_NS0ID_STATEMACHINETYPE_LASTTRANSITION 2770 /* Variable */ +#define UA_NS0ID_FINITESTATEMACHINETYPE 2771 /* ObjectType */ +#define UA_NS0ID_FINITESTATEMACHINETYPE_CURRENTSTATE 2772 /* Variable */ +#define UA_NS0ID_FINITESTATEMACHINETYPE_LASTTRANSITION 2773 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_TRANSITION 2774 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_FROMSTATE 2775 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_TOSTATE 2776 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_OLDSTATEID 2777 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_NEWSTATEID 2778 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE 2782 /* ObjectType */ +#define UA_NS0ID_REFRESHSTARTEVENTTYPE 2787 /* ObjectType */ +#define UA_NS0ID_REFRESHENDEVENTTYPE 2788 /* ObjectType */ +#define UA_NS0ID_REFRESHREQUIREDEVENTTYPE 2789 /* ObjectType */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE 2790 /* ObjectType */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE 2803 /* ObjectType */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE 2829 /* ObjectType */ +#define UA_NS0ID_DIALOGCONDITIONTYPE 2830 /* ObjectType */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_PROMPT 2831 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE 2881 /* ObjectType */ +#define UA_NS0ID_ALARMCONDITIONTYPE 2915 /* ObjectType */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE 2929 /* ObjectType */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_UNSHELVED 2930 /* Object */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_TIMEDSHELVED 2932 /* Object */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_ONESHOTSHELVED 2933 /* Object */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_UNSHELVEDTOTIMEDSHELVED 2935 /* Object */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_UNSHELVEDTOONESHOTSHELVED 2936 /* Object */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_TIMEDSHELVEDTOUNSHELVED 2940 /* Object */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_TIMEDSHELVEDTOONESHOTSHELVED 2942 /* Object */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_ONESHOTSHELVEDTOUNSHELVED 2943 /* Object */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_ONESHOTSHELVEDTOTIMEDSHELVED 2945 /* Object */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_UNSHELVE 2947 /* Method */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_ONESHOTSHELVE 2948 /* Method */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_TIMEDSHELVE 2949 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE 2955 /* ObjectType */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_TIMEDSHELVE_INPUTARGUMENTS 2991 /* Variable */ +#define UA_NS0ID_SERVER_SERVERSTATUS_SECONDSTILLSHUTDOWN 2992 /* Variable */ +#define UA_NS0ID_SERVER_SERVERSTATUS_SHUTDOWNREASON 2993 /* Variable */ +#define UA_NS0ID_SERVER_AUDITING 2994 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES 2996 /* Object */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_AGGREGATEFUNCTIONS 2997 /* Object */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_EVENTNOTIFICATIONSCOUNT 2998 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE 2999 /* ObjectType */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_FILTER 3003 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE 3006 /* ObjectType */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE 3012 /* ObjectType */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE 3014 /* ObjectType */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_ISDELETEMODIFIED 3015 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_STARTTIME 3016 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_ENDTIME 3017 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE 3019 /* ObjectType */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_REQTIMES 3020 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_OLDVALUES 3021 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE 3022 /* ObjectType */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_EVENTIDS 3023 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_OLDVALUES 3024 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_UPDATEDNODE 3025 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_UPDATEDNODE 3026 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_UPDATEDNODE 3027 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_PERFORMINSERTREPLACE 3028 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_NEWVALUES 3029 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_OLDVALUES 3030 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_PERFORMINSERTREPLACE 3031 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_NEWVALUES 3032 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_OLDVALUES 3033 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_OLDVALUES 3034 /* Variable */ +#define UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE 3035 /* ObjectType */ +#define UA_NS0ID_EVENTTYPESFOLDER 3048 /* Object */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_SOFTWARECERTIFICATES 3049 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_MAXRESPONSEMESSAGESIZE 3050 /* Variable */ +#define UA_NS0ID_BUILDINFOTYPE 3051 /* VariableType */ +#define UA_NS0ID_BUILDINFOTYPE_PRODUCTURI 3052 /* Variable */ +#define UA_NS0ID_BUILDINFOTYPE_MANUFACTURERNAME 3053 /* Variable */ +#define UA_NS0ID_BUILDINFOTYPE_PRODUCTNAME 3054 /* Variable */ +#define UA_NS0ID_BUILDINFOTYPE_SOFTWAREVERSION 3055 /* Variable */ +#define UA_NS0ID_BUILDINFOTYPE_BUILDNUMBER 3056 /* Variable */ +#define UA_NS0ID_BUILDINFOTYPE_BUILDDATE 3057 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSTYPE_CLIENTCERTIFICATE 3058 /* Variable */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_AGGREGATECONFIGURATION 3059 /* Object */ +#define UA_NS0ID_DEFAULTBINARY 3062 /* Object */ +#define UA_NS0ID_DEFAULTXML 3063 /* Object */ +#define UA_NS0ID_ALWAYSGENERATESEVENT 3065 /* ReferenceType */ +#define UA_NS0ID_ICON 3067 /* Variable */ +#define UA_NS0ID_NODEVERSION 3068 /* Variable */ +#define UA_NS0ID_LOCALTIME 3069 /* Variable */ +#define UA_NS0ID_ALLOWNULLS 3070 /* Variable */ +#define UA_NS0ID_ENUMVALUES 3071 /* Variable */ +#define UA_NS0ID_INPUTARGUMENTS 3072 /* Variable */ +#define UA_NS0ID_OUTPUTARGUMENTS 3073 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERSTATUS_STARTTIME 3074 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERSTATUS_CURRENTTIME 3075 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERSTATUS_STATE 3076 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERSTATUS_BUILDINFO 3077 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERSTATUS_BUILDINFO_PRODUCTURI 3078 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME 3079 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERSTATUS_BUILDINFO_PRODUCTNAME 3080 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION 3081 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERSTATUS_BUILDINFO_BUILDNUMBER 3082 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERSTATUS_BUILDINFO_BUILDDATE 3083 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERSTATUS_SECONDSTILLSHUTDOWN 3084 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERSTATUS_SHUTDOWNREASON 3085 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_SERVERPROFILEARRAY 3086 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_LOCALEIDARRAY 3087 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_MINSUPPORTEDSAMPLERATE 3088 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_MAXBROWSECONTINUATIONPOINTS 3089 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_MAXQUERYCONTINUATIONPOINTS 3090 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_MAXHISTORYCONTINUATIONPOINTS 3091 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_SOFTWARECERTIFICATES 3092 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_MODELLINGRULES 3093 /* Object */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_AGGREGATEFUNCTIONS 3094 /* Object */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY 3095 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SERVERVIEWCOUNT 3096 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_CURRENTSESSIONCOUNT 3097 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_CUMULATEDSESSIONCOUNT 3098 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SECURITYREJECTEDSESSIONCOUNT 3099 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_REJECTEDSESSIONCOUNT 3100 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SESSIONTIMEOUTCOUNT 3101 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SESSIONABORTCOUNT 3102 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_PUBLISHINGINTERVALCOUNT 3104 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_CURRENTSUBSCRIPTIONCOUNT 3105 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_CUMULATEDSUBSCRIPTIONCOUNT 3106 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_SECURITYREJECTEDREQUESTSCOUNT 3107 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_REJECTEDREQUESTSCOUNT 3108 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SAMPLINGINTERVALDIAGNOSTICSARRAY 3109 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SUBSCRIPTIONDIAGNOSTICSARRAY 3110 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SESSIONSDIAGNOSTICSSUMMARY 3111 /* Object */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SESSIONSDIAGNOSTICSSUMMARY_SESSIONDIAGNOSTICSARRAY 3112 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_SESSIONSDIAGNOSTICSSUMMARY_SESSIONSECURITYDIAGNOSTICSARRAY 3113 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERDIAGNOSTICS_ENABLEDFLAG 3114 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERREDUNDANCY_REDUNDANCYSUPPORT 3115 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SERVERDIAGNOSTICSSUMMARY_SERVERVIEWCOUNT 3116 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SERVERDIAGNOSTICSSUMMARY_CURRENTSESSIONCOUNT 3117 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SERVERDIAGNOSTICSSUMMARY_CUMULATEDSESSIONCOUNT 3118 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SERVERDIAGNOSTICSSUMMARY_SECURITYREJECTEDSESSIONCOUNT 3119 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SERVERDIAGNOSTICSSUMMARY_REJECTEDSESSIONCOUNT 3120 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SERVERDIAGNOSTICSSUMMARY_SESSIONTIMEOUTCOUNT 3121 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SERVERDIAGNOSTICSSUMMARY_SESSIONABORTCOUNT 3122 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SERVERDIAGNOSTICSSUMMARY_PUBLISHINGINTERVALCOUNT 3124 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SERVERDIAGNOSTICSSUMMARY_CURRENTSUBSCRIPTIONCOUNT 3125 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SERVERDIAGNOSTICSSUMMARY_CUMULATEDSUBSCRIPTIONCOUNT 3126 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SERVERDIAGNOSTICSSUMMARY_SECURITYREJECTEDREQUESTSCOUNT 3127 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SERVERDIAGNOSTICSSUMMARY_REJECTEDREQUESTSCOUNT 3128 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SESSIONSDIAGNOSTICSSUMMARY_SESSIONDIAGNOSTICSARRAY 3129 /* Variable */ +#define UA_NS0ID_SERVERDIAGNOSTICSTYPE_SESSIONSDIAGNOSTICSSUMMARY_SESSIONSECURITYDIAGNOSTICSARRAY 3130 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_SESSIONID 3131 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_SESSIONNAME 3132 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_CLIENTDESCRIPTION 3133 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_SERVERURI 3134 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_ENDPOINTURL 3135 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_LOCALEIDS 3136 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_ACTUALSESSIONTIMEOUT 3137 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_MAXRESPONSEMESSAGESIZE 3138 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_CLIENTCONNECTIONTIME 3139 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_CLIENTLASTCONTACTTIME 3140 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_CURRENTSUBSCRIPTIONSCOUNT 3141 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_CURRENTMONITOREDITEMSCOUNT 3142 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_CURRENTPUBLISHREQUESTSINQUEUE 3143 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_READCOUNT 3151 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_HISTORYREADCOUNT 3152 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_WRITECOUNT 3153 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_HISTORYUPDATECOUNT 3154 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_CALLCOUNT 3155 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_CREATEMONITOREDITEMSCOUNT 3156 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_MODIFYMONITOREDITEMSCOUNT 3157 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_SETMONITORINGMODECOUNT 3158 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_SETTRIGGERINGCOUNT 3159 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_DELETEMONITOREDITEMSCOUNT 3160 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_CREATESUBSCRIPTIONCOUNT 3161 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_MODIFYSUBSCRIPTIONCOUNT 3162 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_SETPUBLISHINGMODECOUNT 3163 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_PUBLISHCOUNT 3164 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_REPUBLISHCOUNT 3165 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_TRANSFERSUBSCRIPTIONSCOUNT 3166 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_DELETESUBSCRIPTIONSCOUNT 3167 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_ADDNODESCOUNT 3168 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_ADDREFERENCESCOUNT 3169 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_DELETENODESCOUNT 3170 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_DELETEREFERENCESCOUNT 3171 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_BROWSECOUNT 3172 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_BROWSENEXTCOUNT 3173 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_TRANSLATEBROWSEPATHSTONODEIDSCOUNT 3174 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_QUERYFIRSTCOUNT 3175 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_QUERYNEXTCOUNT 3176 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_REGISTERNODESCOUNT 3177 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_UNREGISTERNODESCOUNT 3178 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONSECURITYDIAGNOSTICS_SESSIONID 3179 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONSECURITYDIAGNOSTICS_CLIENTUSERIDOFSESSION 3180 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONSECURITYDIAGNOSTICS_CLIENTUSERIDHISTORY 3181 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONSECURITYDIAGNOSTICS_AUTHENTICATIONMECHANISM 3182 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONSECURITYDIAGNOSTICS_ENCODING 3183 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONSECURITYDIAGNOSTICS_TRANSPORTPROTOCOL 3184 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONSECURITYDIAGNOSTICS_SECURITYMODE 3185 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONSECURITYDIAGNOSTICS_SECURITYPOLICYURI 3186 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONSECURITYDIAGNOSTICS_CLIENTCERTIFICATE 3187 /* Variable */ +#define UA_NS0ID_TRANSPARENTREDUNDANCYTYPE_REDUNDANCYSUPPORT 3188 /* Variable */ +#define UA_NS0ID_NONTRANSPARENTREDUNDANCYTYPE_REDUNDANCYSUPPORT 3189 /* Variable */ +#define UA_NS0ID_BASEEVENTTYPE_LOCALTIME 3190 /* Variable */ +#define UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE_EVENTID 3191 /* Variable */ +#define UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE_EVENTTYPE 3192 /* Variable */ +#define UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE_SOURCENODE 3193 /* Variable */ +#define UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE_SOURCENAME 3194 /* Variable */ +#define UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE_TIME 3195 /* Variable */ +#define UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE_RECEIVETIME 3196 /* Variable */ +#define UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE_LOCALTIME 3197 /* Variable */ +#define UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE_MESSAGE 3198 /* Variable */ +#define UA_NS0ID_EVENTQUEUEOVERFLOWEVENTTYPE_SEVERITY 3199 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE_EVENTID 3200 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE_EVENTTYPE 3201 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE_SOURCENODE 3202 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE_SOURCENAME 3203 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE_TIME 3204 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE_RECEIVETIME 3205 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE_LOCALTIME 3206 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE_MESSAGE 3207 /* Variable */ +#define UA_NS0ID_AUDITEVENTTYPE_SEVERITY 3208 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_EVENTID 3209 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_EVENTTYPE 3210 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_SOURCENODE 3211 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_SOURCENAME 3212 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_TIME 3213 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_RECEIVETIME 3214 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_LOCALTIME 3215 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_MESSAGE 3216 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_SEVERITY 3217 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_ACTIONTIMESTAMP 3218 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_STATUS 3219 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_SERVERID 3220 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_CLIENTAUDITENTRYID 3221 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_CLIENTUSERID 3222 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_EVENTID 3223 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_EVENTTYPE 3224 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_SOURCENODE 3225 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_SOURCENAME 3226 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_TIME 3227 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_RECEIVETIME 3228 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_LOCALTIME 3229 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_MESSAGE 3230 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_SEVERITY 3231 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_ACTIONTIMESTAMP 3232 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_STATUS 3233 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_SERVERID 3234 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_CLIENTAUDITENTRYID 3235 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_CLIENTUSERID 3236 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_EVENTID 3237 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_EVENTTYPE 3238 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_SOURCENODE 3239 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_SOURCENAME 3240 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_TIME 3241 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_RECEIVETIME 3242 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_LOCALTIME 3243 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_MESSAGE 3244 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_SEVERITY 3245 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_ACTIONTIMESTAMP 3246 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_STATUS 3247 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_SERVERID 3248 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_CLIENTAUDITENTRYID 3249 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_CLIENTUSERID 3250 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_SECURECHANNELID 3251 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_EVENTID 3252 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_EVENTTYPE 3253 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_SOURCENODE 3254 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_SOURCENAME 3255 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_TIME 3256 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_RECEIVETIME 3257 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_LOCALTIME 3258 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_MESSAGE 3259 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_SEVERITY 3260 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_ACTIONTIMESTAMP 3261 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_STATUS 3262 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_SERVERID 3263 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_CLIENTAUDITENTRYID 3264 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_CLIENTUSERID 3265 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_EVENTID 3266 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_EVENTTYPE 3267 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_SOURCENODE 3268 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_SOURCENAME 3269 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_TIME 3270 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_RECEIVETIME 3271 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_LOCALTIME 3272 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_MESSAGE 3273 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_SEVERITY 3274 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_ACTIONTIMESTAMP 3275 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_STATUS 3276 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_SERVERID 3277 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_CLIENTAUDITENTRYID 3278 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_CLIENTUSERID 3279 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_EVENTID 3281 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_EVENTTYPE 3282 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_SOURCENODE 3283 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_SOURCENAME 3284 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_TIME 3285 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_RECEIVETIME 3286 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_LOCALTIME 3287 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_MESSAGE 3288 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_SEVERITY 3289 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_ACTIONTIMESTAMP 3290 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_STATUS 3291 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_SERVERID 3292 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_CLIENTAUDITENTRYID 3293 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_CLIENTUSERID 3294 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_SECURECHANNELID 3296 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_CLIENTCERTIFICATE 3297 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_CLIENTCERTIFICATETHUMBPRINT 3298 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_REVISEDSESSIONTIMEOUT 3299 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_EVENTID 3300 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_EVENTTYPE 3301 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_SOURCENODE 3302 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_SOURCENAME 3303 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_TIME 3304 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_RECEIVETIME 3305 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_LOCALTIME 3306 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_MESSAGE 3307 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_SEVERITY 3308 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_ACTIONTIMESTAMP 3309 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_STATUS 3310 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_SERVERID 3311 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_CLIENTAUDITENTRYID 3312 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_CLIENTUSERID 3313 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_SESSIONID 3314 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_EVENTID 3315 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_EVENTTYPE 3316 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_SOURCENODE 3317 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_SOURCENAME 3318 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_TIME 3319 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_RECEIVETIME 3320 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_LOCALTIME 3321 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_MESSAGE 3322 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_SEVERITY 3323 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_ACTIONTIMESTAMP 3324 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_STATUS 3325 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_SERVERID 3326 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_CLIENTAUDITENTRYID 3327 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_CLIENTUSERID 3328 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_SESSIONID 3329 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_EVENTID 3330 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_EVENTTYPE 3331 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_SOURCENODE 3332 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_SOURCENAME 3333 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_TIME 3334 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_RECEIVETIME 3335 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_LOCALTIME 3336 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_MESSAGE 3337 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_SEVERITY 3338 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_ACTIONTIMESTAMP 3339 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_STATUS 3340 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_SERVERID 3341 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_CLIENTAUDITENTRYID 3342 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_CLIENTUSERID 3343 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_EVENTID 3344 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_EVENTTYPE 3345 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_SOURCENODE 3346 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_SOURCENAME 3347 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_TIME 3348 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_RECEIVETIME 3349 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_LOCALTIME 3350 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_MESSAGE 3351 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_SEVERITY 3352 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_ACTIONTIMESTAMP 3353 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_STATUS 3354 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_SERVERID 3355 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_CLIENTAUDITENTRYID 3356 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_CLIENTUSERID 3357 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_CERTIFICATE 3358 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_EVENTID 3359 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_EVENTTYPE 3360 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_SOURCENODE 3361 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_SOURCENAME 3362 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_TIME 3363 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_RECEIVETIME 3364 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_LOCALTIME 3365 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_MESSAGE 3366 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_SEVERITY 3367 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_ACTIONTIMESTAMP 3368 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_STATUS 3369 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_SERVERID 3370 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_CLIENTAUDITENTRYID 3371 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_CLIENTUSERID 3372 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_CERTIFICATE 3373 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_EVENTID 3374 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_EVENTTYPE 3375 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_SOURCENODE 3376 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_SOURCENAME 3377 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_TIME 3378 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_RECEIVETIME 3379 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_LOCALTIME 3380 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_MESSAGE 3381 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_SEVERITY 3382 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_ACTIONTIMESTAMP 3383 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_STATUS 3384 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_SERVERID 3385 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_CLIENTAUDITENTRYID 3386 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_CLIENTUSERID 3387 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_CERTIFICATE 3388 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_EVENTID 3389 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_EVENTTYPE 3390 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_SOURCENODE 3391 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_SOURCENAME 3392 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_TIME 3393 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_RECEIVETIME 3394 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_LOCALTIME 3395 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_MESSAGE 3396 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_SEVERITY 3397 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_ACTIONTIMESTAMP 3398 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_STATUS 3399 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_SERVERID 3400 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_CLIENTAUDITENTRYID 3401 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_CLIENTUSERID 3402 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_CERTIFICATE 3403 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_EVENTID 3404 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_EVENTTYPE 3405 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_SOURCENODE 3406 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_SOURCENAME 3407 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_TIME 3408 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_RECEIVETIME 3409 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_LOCALTIME 3410 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_MESSAGE 3411 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_SEVERITY 3412 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_ACTIONTIMESTAMP 3413 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_STATUS 3414 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_SERVERID 3415 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_CLIENTAUDITENTRYID 3416 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_CLIENTUSERID 3417 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_CERTIFICATE 3418 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_EVENTID 3419 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_EVENTTYPE 3420 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_SOURCENODE 3421 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_SOURCENAME 3422 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_TIME 3423 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_RECEIVETIME 3424 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_LOCALTIME 3425 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_MESSAGE 3426 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_SEVERITY 3427 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_ACTIONTIMESTAMP 3428 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_STATUS 3429 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_SERVERID 3430 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_CLIENTAUDITENTRYID 3431 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_CLIENTUSERID 3432 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_CERTIFICATE 3433 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_EVENTID 3434 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_EVENTTYPE 3435 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_SOURCENODE 3436 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_SOURCENAME 3437 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_TIME 3438 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_RECEIVETIME 3439 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_LOCALTIME 3440 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_MESSAGE 3441 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_SEVERITY 3442 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_ACTIONTIMESTAMP 3443 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_STATUS 3444 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_SERVERID 3445 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_CLIENTAUDITENTRYID 3446 /* Variable */ +#define UA_NS0ID_AUDITNODEMANAGEMENTEVENTTYPE_CLIENTUSERID 3447 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_EVENTID 3448 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_EVENTTYPE 3449 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_SOURCENODE 3450 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_SOURCENAME 3451 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_TIME 3452 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_RECEIVETIME 3453 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_LOCALTIME 3454 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_MESSAGE 3455 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_SEVERITY 3456 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_ACTIONTIMESTAMP 3457 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_STATUS 3458 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_SERVERID 3459 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_CLIENTAUDITENTRYID 3460 /* Variable */ +#define UA_NS0ID_AUDITADDNODESEVENTTYPE_CLIENTUSERID 3461 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_EVENTID 3462 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_EVENTTYPE 3463 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_SOURCENODE 3464 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_SOURCENAME 3465 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_TIME 3466 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_RECEIVETIME 3467 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_LOCALTIME 3468 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_MESSAGE 3469 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_SEVERITY 3470 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_ACTIONTIMESTAMP 3471 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_STATUS 3472 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_SERVERID 3473 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_CLIENTAUDITENTRYID 3474 /* Variable */ +#define UA_NS0ID_AUDITDELETENODESEVENTTYPE_CLIENTUSERID 3475 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_EVENTID 3476 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_EVENTTYPE 3477 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_SOURCENODE 3478 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_SOURCENAME 3479 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_TIME 3480 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_RECEIVETIME 3481 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_LOCALTIME 3482 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_MESSAGE 3483 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_SEVERITY 3484 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_ACTIONTIMESTAMP 3485 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_STATUS 3486 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_SERVERID 3487 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_CLIENTAUDITENTRYID 3488 /* Variable */ +#define UA_NS0ID_AUDITADDREFERENCESEVENTTYPE_CLIENTUSERID 3489 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_EVENTID 3490 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_EVENTTYPE 3491 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_SOURCENODE 3492 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_SOURCENAME 3493 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_TIME 3494 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_RECEIVETIME 3495 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_LOCALTIME 3496 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_MESSAGE 3497 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_SEVERITY 3498 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_ACTIONTIMESTAMP 3499 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_STATUS 3500 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_SERVERID 3501 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_CLIENTAUDITENTRYID 3502 /* Variable */ +#define UA_NS0ID_AUDITDELETEREFERENCESEVENTTYPE_CLIENTUSERID 3503 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_EVENTID 3504 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_EVENTTYPE 3505 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_SOURCENODE 3506 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_SOURCENAME 3507 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_TIME 3508 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_RECEIVETIME 3509 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_LOCALTIME 3510 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_MESSAGE 3511 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_SEVERITY 3512 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_ACTIONTIMESTAMP 3513 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_STATUS 3514 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_SERVERID 3515 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_CLIENTAUDITENTRYID 3516 /* Variable */ +#define UA_NS0ID_AUDITUPDATEEVENTTYPE_CLIENTUSERID 3517 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_EVENTID 3518 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_EVENTTYPE 3519 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_SOURCENODE 3520 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_SOURCENAME 3521 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_TIME 3522 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_RECEIVETIME 3523 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_LOCALTIME 3524 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_MESSAGE 3525 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_SEVERITY 3526 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_ACTIONTIMESTAMP 3527 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_STATUS 3528 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_SERVERID 3529 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_CLIENTAUDITENTRYID 3530 /* Variable */ +#define UA_NS0ID_AUDITWRITEUPDATEEVENTTYPE_CLIENTUSERID 3531 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_EVENTID 3532 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_EVENTTYPE 3533 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_SOURCENODE 3534 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_SOURCENAME 3535 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_TIME 3536 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_RECEIVETIME 3537 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_LOCALTIME 3538 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_MESSAGE 3539 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_SEVERITY 3540 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_ACTIONTIMESTAMP 3541 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_STATUS 3542 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_SERVERID 3543 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_CLIENTAUDITENTRYID 3544 /* Variable */ +#define UA_NS0ID_AUDITHISTORYUPDATEEVENTTYPE_CLIENTUSERID 3545 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_EVENTID 3546 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_EVENTTYPE 3547 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_SOURCENODE 3548 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_SOURCENAME 3549 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_TIME 3550 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_RECEIVETIME 3551 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_LOCALTIME 3552 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_MESSAGE 3553 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_SEVERITY 3554 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_ACTIONTIMESTAMP 3555 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_STATUS 3556 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_SERVERID 3557 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_CLIENTAUDITENTRYID 3558 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_CLIENTUSERID 3559 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTUPDATEEVENTTYPE_PARAMETERDATATYPEID 3560 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_EVENTID 3561 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_EVENTTYPE 3562 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_SOURCENODE 3563 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_SOURCENAME 3564 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_TIME 3565 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_RECEIVETIME 3566 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_LOCALTIME 3567 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_MESSAGE 3568 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_SEVERITY 3569 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_ACTIONTIMESTAMP 3570 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_STATUS 3571 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_SERVERID 3572 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_CLIENTAUDITENTRYID 3573 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_CLIENTUSERID 3574 /* Variable */ +#define UA_NS0ID_AUDITHISTORYVALUEUPDATEEVENTTYPE_PARAMETERDATATYPEID 3575 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_EVENTID 3576 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_EVENTTYPE 3577 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_SOURCENODE 3578 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_SOURCENAME 3579 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_TIME 3580 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_RECEIVETIME 3581 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_LOCALTIME 3582 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_MESSAGE 3583 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_SEVERITY 3584 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_ACTIONTIMESTAMP 3585 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_STATUS 3586 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_SERVERID 3587 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_CLIENTAUDITENTRYID 3588 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_CLIENTUSERID 3589 /* Variable */ +#define UA_NS0ID_AUDITHISTORYDELETEEVENTTYPE_PARAMETERDATATYPEID 3590 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_EVENTID 3591 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_EVENTTYPE 3592 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_SOURCENODE 3593 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_SOURCENAME 3594 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_TIME 3595 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_RECEIVETIME 3596 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_LOCALTIME 3597 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_MESSAGE 3598 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_SEVERITY 3599 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_ACTIONTIMESTAMP 3600 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_STATUS 3601 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_SERVERID 3602 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_CLIENTAUDITENTRYID 3603 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_CLIENTUSERID 3604 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_PARAMETERDATATYPEID 3605 /* Variable */ +#define UA_NS0ID_AUDITHISTORYRAWMODIFYDELETEEVENTTYPE_UPDATEDNODE 3606 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_EVENTID 3607 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_EVENTTYPE 3608 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_SOURCENODE 3609 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_SOURCENAME 3610 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_TIME 3611 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_RECEIVETIME 3612 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_LOCALTIME 3613 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_MESSAGE 3614 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_SEVERITY 3615 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_ACTIONTIMESTAMP 3616 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_STATUS 3617 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_SERVERID 3618 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_CLIENTAUDITENTRYID 3619 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_CLIENTUSERID 3620 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_PARAMETERDATATYPEID 3621 /* Variable */ +#define UA_NS0ID_AUDITHISTORYATTIMEDELETEEVENTTYPE_UPDATEDNODE 3622 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_EVENTID 3623 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_EVENTTYPE 3624 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_SOURCENODE 3625 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_SOURCENAME 3626 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_TIME 3627 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_RECEIVETIME 3628 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_LOCALTIME 3629 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_MESSAGE 3630 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_SEVERITY 3631 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_ACTIONTIMESTAMP 3632 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_STATUS 3633 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_SERVERID 3634 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_CLIENTAUDITENTRYID 3635 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_CLIENTUSERID 3636 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_PARAMETERDATATYPEID 3637 /* Variable */ +#define UA_NS0ID_AUDITHISTORYEVENTDELETEEVENTTYPE_UPDATEDNODE 3638 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_EVENTID 3639 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_EVENTTYPE 3640 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_SOURCENODE 3641 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_SOURCENAME 3642 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_TIME 3643 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_RECEIVETIME 3644 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_LOCALTIME 3645 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_MESSAGE 3646 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_SEVERITY 3647 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_ACTIONTIMESTAMP 3648 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_STATUS 3649 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_SERVERID 3650 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_CLIENTAUDITENTRYID 3651 /* Variable */ +#define UA_NS0ID_AUDITUPDATEMETHODEVENTTYPE_CLIENTUSERID 3652 /* Variable */ +#define UA_NS0ID_SYSTEMEVENTTYPE_EVENTID 3653 /* Variable */ +#define UA_NS0ID_SYSTEMEVENTTYPE_EVENTTYPE 3654 /* Variable */ +#define UA_NS0ID_SYSTEMEVENTTYPE_SOURCENODE 3655 /* Variable */ +#define UA_NS0ID_SYSTEMEVENTTYPE_SOURCENAME 3656 /* Variable */ +#define UA_NS0ID_SYSTEMEVENTTYPE_TIME 3657 /* Variable */ +#define UA_NS0ID_SYSTEMEVENTTYPE_RECEIVETIME 3658 /* Variable */ +#define UA_NS0ID_SYSTEMEVENTTYPE_LOCALTIME 3659 /* Variable */ +#define UA_NS0ID_SYSTEMEVENTTYPE_MESSAGE 3660 /* Variable */ +#define UA_NS0ID_SYSTEMEVENTTYPE_SEVERITY 3661 /* Variable */ +#define UA_NS0ID_DEVICEFAILUREEVENTTYPE_EVENTID 3662 /* Variable */ +#define UA_NS0ID_DEVICEFAILUREEVENTTYPE_EVENTTYPE 3663 /* Variable */ +#define UA_NS0ID_DEVICEFAILUREEVENTTYPE_SOURCENODE 3664 /* Variable */ +#define UA_NS0ID_DEVICEFAILUREEVENTTYPE_SOURCENAME 3665 /* Variable */ +#define UA_NS0ID_DEVICEFAILUREEVENTTYPE_TIME 3666 /* Variable */ +#define UA_NS0ID_DEVICEFAILUREEVENTTYPE_RECEIVETIME 3667 /* Variable */ +#define UA_NS0ID_DEVICEFAILUREEVENTTYPE_LOCALTIME 3668 /* Variable */ +#define UA_NS0ID_DEVICEFAILUREEVENTTYPE_MESSAGE 3669 /* Variable */ +#define UA_NS0ID_DEVICEFAILUREEVENTTYPE_SEVERITY 3670 /* Variable */ +#define UA_NS0ID_BASEMODELCHANGEEVENTTYPE_EVENTID 3671 /* Variable */ +#define UA_NS0ID_BASEMODELCHANGEEVENTTYPE_EVENTTYPE 3672 /* Variable */ +#define UA_NS0ID_BASEMODELCHANGEEVENTTYPE_SOURCENODE 3673 /* Variable */ +#define UA_NS0ID_BASEMODELCHANGEEVENTTYPE_SOURCENAME 3674 /* Variable */ +#define UA_NS0ID_BASEMODELCHANGEEVENTTYPE_TIME 3675 /* Variable */ +#define UA_NS0ID_BASEMODELCHANGEEVENTTYPE_RECEIVETIME 3676 /* Variable */ +#define UA_NS0ID_BASEMODELCHANGEEVENTTYPE_LOCALTIME 3677 /* Variable */ +#define UA_NS0ID_BASEMODELCHANGEEVENTTYPE_MESSAGE 3678 /* Variable */ +#define UA_NS0ID_BASEMODELCHANGEEVENTTYPE_SEVERITY 3679 /* Variable */ +#define UA_NS0ID_GENERALMODELCHANGEEVENTTYPE_EVENTID 3680 /* Variable */ +#define UA_NS0ID_GENERALMODELCHANGEEVENTTYPE_EVENTTYPE 3681 /* Variable */ +#define UA_NS0ID_GENERALMODELCHANGEEVENTTYPE_SOURCENODE 3682 /* Variable */ +#define UA_NS0ID_GENERALMODELCHANGEEVENTTYPE_SOURCENAME 3683 /* Variable */ +#define UA_NS0ID_GENERALMODELCHANGEEVENTTYPE_TIME 3684 /* Variable */ +#define UA_NS0ID_GENERALMODELCHANGEEVENTTYPE_RECEIVETIME 3685 /* Variable */ +#define UA_NS0ID_GENERALMODELCHANGEEVENTTYPE_LOCALTIME 3686 /* Variable */ +#define UA_NS0ID_GENERALMODELCHANGEEVENTTYPE_MESSAGE 3687 /* Variable */ +#define UA_NS0ID_GENERALMODELCHANGEEVENTTYPE_SEVERITY 3688 /* Variable */ +#define UA_NS0ID_SEMANTICCHANGEEVENTTYPE_EVENTID 3689 /* Variable */ +#define UA_NS0ID_SEMANTICCHANGEEVENTTYPE_EVENTTYPE 3690 /* Variable */ +#define UA_NS0ID_SEMANTICCHANGEEVENTTYPE_SOURCENODE 3691 /* Variable */ +#define UA_NS0ID_SEMANTICCHANGEEVENTTYPE_SOURCENAME 3692 /* Variable */ +#define UA_NS0ID_SEMANTICCHANGEEVENTTYPE_TIME 3693 /* Variable */ +#define UA_NS0ID_SEMANTICCHANGEEVENTTYPE_RECEIVETIME 3694 /* Variable */ +#define UA_NS0ID_SEMANTICCHANGEEVENTTYPE_LOCALTIME 3695 /* Variable */ +#define UA_NS0ID_SEMANTICCHANGEEVENTTYPE_MESSAGE 3696 /* Variable */ +#define UA_NS0ID_SEMANTICCHANGEEVENTTYPE_SEVERITY 3697 /* Variable */ +#define UA_NS0ID_SERVERSTATUSTYPE_BUILDINFO_PRODUCTURI 3698 /* Variable */ +#define UA_NS0ID_SERVERSTATUSTYPE_BUILDINFO_MANUFACTURERNAME 3699 /* Variable */ +#define UA_NS0ID_SERVERSTATUSTYPE_BUILDINFO_PRODUCTNAME 3700 /* Variable */ +#define UA_NS0ID_SERVERSTATUSTYPE_BUILDINFO_SOFTWAREVERSION 3701 /* Variable */ +#define UA_NS0ID_SERVERSTATUSTYPE_BUILDINFO_BUILDNUMBER 3702 /* Variable */ +#define UA_NS0ID_SERVERSTATUSTYPE_BUILDINFO_BUILDDATE 3703 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_SOFTWARECERTIFICATES 3704 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY_REJECTEDSESSIONCOUNT 3705 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SESSIONSDIAGNOSTICSSUMMARY 3706 /* Object */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SESSIONSDIAGNOSTICSSUMMARY_SESSIONDIAGNOSTICSARRAY 3707 /* Variable */ +#define UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SESSIONSDIAGNOSTICSSUMMARY_SESSIONSECURITYDIAGNOSTICSARRAY 3708 /* Variable */ +#define UA_NS0ID_SERVER_SERVERREDUNDANCY_REDUNDANCYSUPPORT 3709 /* Variable */ +#define UA_NS0ID_FINITESTATEVARIABLETYPE_NAME 3714 /* Variable */ +#define UA_NS0ID_FINITESTATEVARIABLETYPE_NUMBER 3715 /* Variable */ +#define UA_NS0ID_FINITESTATEVARIABLETYPE_EFFECTIVEDISPLAYNAME 3716 /* Variable */ +#define UA_NS0ID_FINITETRANSITIONVARIABLETYPE_NAME 3717 /* Variable */ +#define UA_NS0ID_FINITETRANSITIONVARIABLETYPE_NUMBER 3718 /* Variable */ +#define UA_NS0ID_FINITETRANSITIONVARIABLETYPE_TRANSITIONTIME 3719 /* Variable */ +#define UA_NS0ID_STATEMACHINETYPE_CURRENTSTATE_ID 3720 /* Variable */ +#define UA_NS0ID_STATEMACHINETYPE_CURRENTSTATE_NAME 3721 /* Variable */ +#define UA_NS0ID_STATEMACHINETYPE_CURRENTSTATE_NUMBER 3722 /* Variable */ +#define UA_NS0ID_STATEMACHINETYPE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 3723 /* Variable */ +#define UA_NS0ID_STATEMACHINETYPE_LASTTRANSITION_ID 3724 /* Variable */ +#define UA_NS0ID_STATEMACHINETYPE_LASTTRANSITION_NAME 3725 /* Variable */ +#define UA_NS0ID_STATEMACHINETYPE_LASTTRANSITION_NUMBER 3726 /* Variable */ +#define UA_NS0ID_STATEMACHINETYPE_LASTTRANSITION_TRANSITIONTIME 3727 /* Variable */ +#define UA_NS0ID_FINITESTATEMACHINETYPE_CURRENTSTATE_ID 3728 /* Variable */ +#define UA_NS0ID_FINITESTATEMACHINETYPE_CURRENTSTATE_NAME 3729 /* Variable */ +#define UA_NS0ID_FINITESTATEMACHINETYPE_CURRENTSTATE_NUMBER 3730 /* Variable */ +#define UA_NS0ID_FINITESTATEMACHINETYPE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 3731 /* Variable */ +#define UA_NS0ID_FINITESTATEMACHINETYPE_LASTTRANSITION_ID 3732 /* Variable */ +#define UA_NS0ID_FINITESTATEMACHINETYPE_LASTTRANSITION_NAME 3733 /* Variable */ +#define UA_NS0ID_FINITESTATEMACHINETYPE_LASTTRANSITION_NUMBER 3734 /* Variable */ +#define UA_NS0ID_FINITESTATEMACHINETYPE_LASTTRANSITION_TRANSITIONTIME 3735 /* Variable */ +#define UA_NS0ID_INITIALSTATETYPE_STATENUMBER 3736 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_EVENTID 3737 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_EVENTTYPE 3738 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_SOURCENODE 3739 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_SOURCENAME 3740 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_TIME 3741 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_RECEIVETIME 3742 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_LOCALTIME 3743 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_MESSAGE 3744 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_SEVERITY 3745 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_FROMSTATE_ID 3746 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_FROMSTATE_NAME 3747 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_FROMSTATE_NUMBER 3748 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_FROMSTATE_EFFECTIVEDISPLAYNAME 3749 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_TOSTATE_ID 3750 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_TOSTATE_NAME 3751 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_TOSTATE_NUMBER 3752 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_TOSTATE_EFFECTIVEDISPLAYNAME 3753 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_TRANSITION_ID 3754 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_TRANSITION_NAME 3755 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_TRANSITION_NUMBER 3756 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_TRANSITION_TRANSITIONTIME 3757 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_EVENTID 3758 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_EVENTTYPE 3759 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_SOURCENODE 3760 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_SOURCENAME 3761 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_TIME 3762 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_RECEIVETIME 3763 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_LOCALTIME 3764 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_MESSAGE 3765 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_SEVERITY 3766 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_ACTIONTIMESTAMP 3767 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_STATUS 3768 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_SERVERID 3769 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_CLIENTAUDITENTRYID 3770 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_CLIENTUSERID 3771 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_METHODID 3772 /* Variable */ +#define UA_NS0ID_AUDITUPDATESTATEEVENTTYPE_INPUTARGUMENTS 3773 /* Variable */ +#define UA_NS0ID_ANALOGITEMTYPE_DEFINITION 3774 /* Variable */ +#define UA_NS0ID_ANALOGITEMTYPE_VALUEPRECISION 3775 /* Variable */ +#define UA_NS0ID_DISCRETEITEMTYPE_DEFINITION 3776 /* Variable */ +#define UA_NS0ID_DISCRETEITEMTYPE_VALUEPRECISION 3777 /* Variable */ +#define UA_NS0ID_TWOSTATEDISCRETETYPE_DEFINITION 3778 /* Variable */ +#define UA_NS0ID_TWOSTATEDISCRETETYPE_VALUEPRECISION 3779 /* Variable */ +#define UA_NS0ID_MULTISTATEDISCRETETYPE_DEFINITION 3780 /* Variable */ +#define UA_NS0ID_MULTISTATEDISCRETETYPE_VALUEPRECISION 3781 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_EVENTID 3782 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_EVENTTYPE 3783 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_SOURCENODE 3784 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_SOURCENAME 3785 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_TIME 3786 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_RECEIVETIME 3787 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_LOCALTIME 3788 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_MESSAGE 3789 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_SEVERITY 3790 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_FROMSTATE 3791 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_FROMSTATE_ID 3792 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_FROMSTATE_NAME 3793 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_FROMSTATE_NUMBER 3794 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_FROMSTATE_EFFECTIVEDISPLAYNAME 3795 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_TOSTATE 3796 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_TOSTATE_ID 3797 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_TOSTATE_NAME 3798 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_TOSTATE_NUMBER 3799 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_TOSTATE_EFFECTIVEDISPLAYNAME 3800 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_TRANSITION 3801 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_TRANSITION_ID 3802 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_TRANSITION_NAME 3803 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_TRANSITION_NUMBER 3804 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_TRANSITION_TRANSITIONTIME 3805 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE 3806 /* ObjectType */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_EVENTID 3807 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_EVENTTYPE 3808 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_SOURCENODE 3809 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_SOURCENAME 3810 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_TIME 3811 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_RECEIVETIME 3812 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_LOCALTIME 3813 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_MESSAGE 3814 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_SEVERITY 3815 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_ACTIONTIMESTAMP 3816 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_STATUS 3817 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_SERVERID 3818 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_CLIENTAUDITENTRYID 3819 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_CLIENTUSERID 3820 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_METHODID 3821 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_INPUTARGUMENTS 3822 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_OLDSTATEID 3823 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_NEWSTATEID 3824 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_TRANSITION 3825 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_TRANSITION_ID 3826 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_TRANSITION_NAME 3827 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_TRANSITION_NUMBER 3828 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_TRANSITION_TRANSITIONTIME 3829 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_CURRENTSTATE 3830 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_CURRENTSTATE_ID 3831 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_CURRENTSTATE_NAME 3832 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_CURRENTSTATE_NUMBER 3833 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 3834 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_LASTTRANSITION 3835 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_LASTTRANSITION_ID 3836 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_LASTTRANSITION_NAME 3837 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_LASTTRANSITION_NUMBER 3838 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_LASTTRANSITION_TRANSITIONTIME 3839 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_PROGRAMDIAGNOSTIC_CREATESESSIONID 3840 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_PROGRAMDIAGNOSTIC_CREATECLIENTNAME 3841 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_PROGRAMDIAGNOSTIC_INVOCATIONCREATIONTIME 3842 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_PROGRAMDIAGNOSTIC_LASTTRANSITIONTIME 3843 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_PROGRAMDIAGNOSTIC_LASTMETHODCALL 3844 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_PROGRAMDIAGNOSTIC_LASTMETHODSESSIONID 3845 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_PROGRAMDIAGNOSTIC_LASTMETHODINPUTARGUMENTS 3846 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_PROGRAMDIAGNOSTIC_LASTMETHODOUTPUTARGUMENTS 3847 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_PROGRAMDIAGNOSTIC_LASTMETHODCALLTIME 3848 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_PROGRAMDIAGNOSTIC_LASTMETHODRETURNSTATUS 3849 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_FINALRESULTDATA 3850 /* Object */ +#define UA_NS0ID_ADDCOMMENTMETHODTYPE 3863 /* Method */ +#define UA_NS0ID_ADDCOMMENTMETHODTYPE_INPUTARGUMENTS 3864 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_EVENTID 3865 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_EVENTTYPE 3866 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_SOURCENODE 3867 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_SOURCENAME 3868 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_TIME 3869 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_RECEIVETIME 3870 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_LOCALTIME 3871 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_MESSAGE 3872 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_SEVERITY 3873 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_RETAIN 3874 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_CONDITIONREFRESH 3875 /* Method */ +#define UA_NS0ID_CONDITIONTYPE_CONDITIONREFRESH_INPUTARGUMENTS 3876 /* Variable */ +#define UA_NS0ID_REFRESHSTARTEVENTTYPE_EVENTID 3969 /* Variable */ +#define UA_NS0ID_REFRESHSTARTEVENTTYPE_EVENTTYPE 3970 /* Variable */ +#define UA_NS0ID_REFRESHSTARTEVENTTYPE_SOURCENODE 3971 /* Variable */ +#define UA_NS0ID_REFRESHSTARTEVENTTYPE_SOURCENAME 3972 /* Variable */ +#define UA_NS0ID_REFRESHSTARTEVENTTYPE_TIME 3973 /* Variable */ +#define UA_NS0ID_REFRESHSTARTEVENTTYPE_RECEIVETIME 3974 /* Variable */ +#define UA_NS0ID_REFRESHSTARTEVENTTYPE_LOCALTIME 3975 /* Variable */ +#define UA_NS0ID_REFRESHSTARTEVENTTYPE_MESSAGE 3976 /* Variable */ +#define UA_NS0ID_REFRESHSTARTEVENTTYPE_SEVERITY 3977 /* Variable */ +#define UA_NS0ID_REFRESHENDEVENTTYPE_EVENTID 3978 /* Variable */ +#define UA_NS0ID_REFRESHENDEVENTTYPE_EVENTTYPE 3979 /* Variable */ +#define UA_NS0ID_REFRESHENDEVENTTYPE_SOURCENODE 3980 /* Variable */ +#define UA_NS0ID_REFRESHENDEVENTTYPE_SOURCENAME 3981 /* Variable */ +#define UA_NS0ID_REFRESHENDEVENTTYPE_TIME 3982 /* Variable */ +#define UA_NS0ID_REFRESHENDEVENTTYPE_RECEIVETIME 3983 /* Variable */ +#define UA_NS0ID_REFRESHENDEVENTTYPE_LOCALTIME 3984 /* Variable */ +#define UA_NS0ID_REFRESHENDEVENTTYPE_MESSAGE 3985 /* Variable */ +#define UA_NS0ID_REFRESHENDEVENTTYPE_SEVERITY 3986 /* Variable */ +#define UA_NS0ID_REFRESHREQUIREDEVENTTYPE_EVENTID 3987 /* Variable */ +#define UA_NS0ID_REFRESHREQUIREDEVENTTYPE_EVENTTYPE 3988 /* Variable */ +#define UA_NS0ID_REFRESHREQUIREDEVENTTYPE_SOURCENODE 3989 /* Variable */ +#define UA_NS0ID_REFRESHREQUIREDEVENTTYPE_SOURCENAME 3990 /* Variable */ +#define UA_NS0ID_REFRESHREQUIREDEVENTTYPE_TIME 3991 /* Variable */ +#define UA_NS0ID_REFRESHREQUIREDEVENTTYPE_RECEIVETIME 3992 /* Variable */ +#define UA_NS0ID_REFRESHREQUIREDEVENTTYPE_LOCALTIME 3993 /* Variable */ +#define UA_NS0ID_REFRESHREQUIREDEVENTTYPE_MESSAGE 3994 /* Variable */ +#define UA_NS0ID_REFRESHREQUIREDEVENTTYPE_SEVERITY 3995 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_EVENTID 3996 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_EVENTTYPE 3997 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_SOURCENODE 3998 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_SOURCENAME 3999 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_TIME 4000 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_RECEIVETIME 4001 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_LOCALTIME 4002 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_MESSAGE 4003 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_SEVERITY 4004 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_ACTIONTIMESTAMP 4005 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_STATUS 4006 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_SERVERID 4007 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_CLIENTAUDITENTRYID 4008 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_CLIENTUSERID 4009 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_METHODID 4010 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONEVENTTYPE_INPUTARGUMENTS 4011 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_EVENTID 4106 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_EVENTTYPE 4107 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_SOURCENODE 4108 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_SOURCENAME 4109 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_TIME 4110 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_RECEIVETIME 4111 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_LOCALTIME 4112 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_MESSAGE 4113 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_SEVERITY 4114 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_ACTIONTIMESTAMP 4115 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_STATUS 4116 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_SERVERID 4117 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_CLIENTAUDITENTRYID 4118 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_CLIENTUSERID 4119 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_METHODID 4120 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONENABLEEVENTTYPE_INPUTARGUMENTS 4121 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_EVENTID 4170 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_EVENTTYPE 4171 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_SOURCENODE 4172 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_SOURCENAME 4173 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_TIME 4174 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_RECEIVETIME 4175 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_LOCALTIME 4176 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_MESSAGE 4177 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_SEVERITY 4178 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_ACTIONTIMESTAMP 4179 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_STATUS 4180 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_SERVERID 4181 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_CLIENTAUDITENTRYID 4182 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_CLIENTUSERID 4183 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_METHODID 4184 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_INPUTARGUMENTS 4185 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_EVENTID 4188 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_EVENTTYPE 4189 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_SOURCENODE 4190 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_SOURCENAME 4191 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_TIME 4192 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_RECEIVETIME 4193 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_LOCALTIME 4194 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_MESSAGE 4195 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_SEVERITY 4196 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_RETAIN 4197 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_CONDITIONREFRESH 4198 /* Method */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_CONDITIONREFRESH_INPUTARGUMENTS 4199 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_EVENTID 5113 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_EVENTTYPE 5114 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_SOURCENODE 5115 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_SOURCENAME 5116 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_TIME 5117 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_RECEIVETIME 5118 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_LOCALTIME 5119 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_MESSAGE 5120 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_SEVERITY 5121 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_RETAIN 5122 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONDITIONREFRESH 5123 /* Method */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONDITIONREFRESH_INPUTARGUMENTS 5124 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_EVENTID 5540 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_EVENTTYPE 5541 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SOURCENODE 5542 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SOURCENAME 5543 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_TIME 5544 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_RECEIVETIME 5545 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_LOCALTIME 5546 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_MESSAGE 5547 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SEVERITY 5548 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_RETAIN 5549 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONDITIONREFRESH 5550 /* Method */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONDITIONREFRESH_INPUTARGUMENTS 5551 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_CURRENTSTATE 6088 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_CURRENTSTATE_ID 6089 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_CURRENTSTATE_NAME 6090 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_CURRENTSTATE_NUMBER 6091 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 6092 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_LASTTRANSITION 6093 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_LASTTRANSITION_ID 6094 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_LASTTRANSITION_NAME 6095 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_LASTTRANSITION_NUMBER 6096 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_LASTTRANSITION_TRANSITIONTIME 6097 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_UNSHELVED_STATENUMBER 6098 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_TIMEDSHELVED_STATENUMBER 6100 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_ONESHOTSHELVED_STATENUMBER 6101 /* Variable */ +#define UA_NS0ID_TIMEDSHELVEMETHODTYPE 6102 /* Method */ +#define UA_NS0ID_TIMEDSHELVEMETHODTYPE_INPUTARGUMENTS 6103 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_EVENTID 6116 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_EVENTTYPE 6117 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SOURCENODE 6118 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SOURCENAME 6119 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_TIME 6120 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_RECEIVETIME 6121 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_LOCALTIME 6122 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_MESSAGE 6123 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SEVERITY 6124 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_RETAIN 6125 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONDITIONREFRESH 6126 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 6127 /* Variable */ +#define UA_NS0ID_IDTYPE_ENUMSTRINGS 7591 /* Variable */ +#define UA_NS0ID_ENUMVALUETYPE 7594 /* DataType */ +#define UA_NS0ID_MESSAGESECURITYMODE_ENUMSTRINGS 7595 /* Variable */ +#define UA_NS0ID_USERTOKENTYPE_ENUMSTRINGS 7596 /* Variable */ +#define UA_NS0ID_APPLICATIONTYPE_ENUMSTRINGS 7597 /* Variable */ +#define UA_NS0ID_SECURITYTOKENREQUESTTYPE_ENUMSTRINGS 7598 /* Variable */ +#define UA_NS0ID_BROWSEDIRECTION_ENUMSTRINGS 7603 /* Variable */ +#define UA_NS0ID_FILTEROPERATOR_ENUMSTRINGS 7605 /* Variable */ +#define UA_NS0ID_TIMESTAMPSTORETURN_ENUMSTRINGS 7606 /* Variable */ +#define UA_NS0ID_MONITORINGMODE_ENUMSTRINGS 7608 /* Variable */ +#define UA_NS0ID_DATACHANGETRIGGER_ENUMSTRINGS 7609 /* Variable */ +#define UA_NS0ID_DEADBANDTYPE_ENUMSTRINGS 7610 /* Variable */ +#define UA_NS0ID_REDUNDANCYSUPPORT_ENUMSTRINGS 7611 /* Variable */ +#define UA_NS0ID_SERVERSTATE_ENUMSTRINGS 7612 /* Variable */ +#define UA_NS0ID_EXCEPTIONDEVIATIONFORMAT_ENUMSTRINGS 7614 /* Variable */ +#define UA_NS0ID_ENUMVALUETYPE_ENCODING_DEFAULTXML 7616 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA 7617 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATATYPEVERSION 7618 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_NAMESPACEURI 7619 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ARGUMENT 7650 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ARGUMENT_DATATYPEVERSION 7651 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ARGUMENT_DICTIONARYFRAGMENT 7652 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENUMVALUETYPE 7656 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENUMVALUETYPE_DATATYPEVERSION 7657 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENUMVALUETYPE_DICTIONARYFRAGMENT 7658 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_STATUSRESULT 7659 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_STATUSRESULT_DATATYPEVERSION 7660 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_STATUSRESULT_DICTIONARYFRAGMENT 7661 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_USERTOKENPOLICY 7662 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_USERTOKENPOLICY_DATATYPEVERSION 7663 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_USERTOKENPOLICY_DICTIONARYFRAGMENT 7664 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_APPLICATIONDESCRIPTION 7665 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_APPLICATIONDESCRIPTION_DATATYPEVERSION 7666 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_APPLICATIONDESCRIPTION_DICTIONARYFRAGMENT 7667 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENDPOINTDESCRIPTION 7668 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENDPOINTDESCRIPTION_DATATYPEVERSION 7669 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENDPOINTDESCRIPTION_DICTIONARYFRAGMENT 7670 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_USERIDENTITYTOKEN 7671 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_USERIDENTITYTOKEN_DATATYPEVERSION 7672 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_USERIDENTITYTOKEN_DICTIONARYFRAGMENT 7673 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ANONYMOUSIDENTITYTOKEN 7674 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ANONYMOUSIDENTITYTOKEN_DATATYPEVERSION 7675 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ANONYMOUSIDENTITYTOKEN_DICTIONARYFRAGMENT 7676 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_USERNAMEIDENTITYTOKEN 7677 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_USERNAMEIDENTITYTOKEN_DATATYPEVERSION 7678 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_USERNAMEIDENTITYTOKEN_DICTIONARYFRAGMENT 7679 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_X509IDENTITYTOKEN 7680 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_X509IDENTITYTOKEN_DATATYPEVERSION 7681 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_X509IDENTITYTOKEN_DICTIONARYFRAGMENT 7682 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ISSUEDIDENTITYTOKEN 7683 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ISSUEDIDENTITYTOKEN_DATATYPEVERSION 7684 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ISSUEDIDENTITYTOKEN_DICTIONARYFRAGMENT 7685 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENDPOINTCONFIGURATION 7686 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENDPOINTCONFIGURATION_DATATYPEVERSION 7687 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENDPOINTCONFIGURATION_DICTIONARYFRAGMENT 7688 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BUILDINFO 7692 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BUILDINFO_DATATYPEVERSION 7693 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BUILDINFO_DICTIONARYFRAGMENT 7694 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SIGNEDSOFTWARECERTIFICATE 7698 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SIGNEDSOFTWARECERTIFICATE_DATATYPEVERSION 7699 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SIGNEDSOFTWARECERTIFICATE_DICTIONARYFRAGMENT 7700 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ADDNODESITEM 7728 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ADDNODESITEM_DATATYPEVERSION 7729 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ADDNODESITEM_DICTIONARYFRAGMENT 7730 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ADDREFERENCESITEM 7731 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ADDREFERENCESITEM_DATATYPEVERSION 7732 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ADDREFERENCESITEM_DICTIONARYFRAGMENT 7733 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DELETENODESITEM 7734 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DELETENODESITEM_DATATYPEVERSION 7735 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DELETENODESITEM_DICTIONARYFRAGMENT 7736 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DELETEREFERENCESITEM 7737 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DELETEREFERENCESITEM_DATATYPEVERSION 7738 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DELETEREFERENCESITEM_DICTIONARYFRAGMENT 7739 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_REGISTEREDSERVER 7782 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_REGISTEREDSERVER_DATATYPEVERSION 7783 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_REGISTEREDSERVER_DICTIONARYFRAGMENT 7784 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_CONTENTFILTERELEMENT 7929 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_CONTENTFILTERELEMENT_DATATYPEVERSION 7930 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_CONTENTFILTERELEMENT_DICTIONARYFRAGMENT 7931 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_CONTENTFILTER 7932 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_CONTENTFILTER_DATATYPEVERSION 7933 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_CONTENTFILTER_DICTIONARYFRAGMENT 7934 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_FILTEROPERAND 7935 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_FILTEROPERAND_DATATYPEVERSION 7936 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_FILTEROPERAND_DICTIONARYFRAGMENT 7937 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ELEMENTOPERAND 7938 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ELEMENTOPERAND_DATATYPEVERSION 7939 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ELEMENTOPERAND_DICTIONARYFRAGMENT 7940 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_LITERALOPERAND 7941 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_LITERALOPERAND_DATATYPEVERSION 7942 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_LITERALOPERAND_DICTIONARYFRAGMENT 7943 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ATTRIBUTEOPERAND 7944 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ATTRIBUTEOPERAND_DATATYPEVERSION 7945 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ATTRIBUTEOPERAND_DICTIONARYFRAGMENT 7946 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SIMPLEATTRIBUTEOPERAND 7947 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SIMPLEATTRIBUTEOPERAND_DATATYPEVERSION 7948 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SIMPLEATTRIBUTEOPERAND_DICTIONARYFRAGMENT 7949 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_HISTORYEVENT 8004 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_HISTORYEVENT_DATATYPEVERSION 8005 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_HISTORYEVENT_DICTIONARYFRAGMENT 8006 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_MONITORINGFILTER 8067 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_MONITORINGFILTER_DATATYPEVERSION 8068 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_MONITORINGFILTER_DICTIONARYFRAGMENT 8069 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_EVENTFILTER 8073 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_EVENTFILTER_DATATYPEVERSION 8074 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_EVENTFILTER_DICTIONARYFRAGMENT 8075 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_AGGREGATECONFIGURATION 8076 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_AGGREGATECONFIGURATION_DATATYPEVERSION 8077 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_AGGREGATECONFIGURATION_DICTIONARYFRAGMENT 8078 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_HISTORYEVENTFIELDLIST 8172 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_HISTORYEVENTFIELDLIST_DATATYPEVERSION 8173 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_HISTORYEVENTFIELDLIST_DICTIONARYFRAGMENT 8174 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_REDUNDANTSERVERDATATYPE 8208 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_REDUNDANTSERVERDATATYPE_DATATYPEVERSION 8209 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_REDUNDANTSERVERDATATYPE_DICTIONARYFRAGMENT 8210 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SAMPLINGINTERVALDIAGNOSTICSDATATYPE 8211 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SAMPLINGINTERVALDIAGNOSTICSDATATYPE_DATATYPEVERSION 8212 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SAMPLINGINTERVALDIAGNOSTICSDATATYPE_DICTIONARYFRAGMENT 8213 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SERVERDIAGNOSTICSSUMMARYDATATYPE 8214 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SERVERDIAGNOSTICSSUMMARYDATATYPE_DATATYPEVERSION 8215 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SERVERDIAGNOSTICSSUMMARYDATATYPE_DICTIONARYFRAGMENT 8216 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SERVERSTATUSDATATYPE 8217 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SERVERSTATUSDATATYPE_DATATYPEVERSION 8218 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SERVERSTATUSDATATYPE_DICTIONARYFRAGMENT 8219 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SESSIONDIAGNOSTICSDATATYPE 8220 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SESSIONDIAGNOSTICSDATATYPE_DATATYPEVERSION 8221 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SESSIONDIAGNOSTICSDATATYPE_DICTIONARYFRAGMENT 8222 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SESSIONSECURITYDIAGNOSTICSDATATYPE 8223 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SESSIONSECURITYDIAGNOSTICSDATATYPE_DATATYPEVERSION 8224 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SESSIONSECURITYDIAGNOSTICSDATATYPE_DICTIONARYFRAGMENT 8225 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SERVICECOUNTERDATATYPE 8226 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SERVICECOUNTERDATATYPE_DATATYPEVERSION 8227 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SERVICECOUNTERDATATYPE_DICTIONARYFRAGMENT 8228 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SUBSCRIPTIONDIAGNOSTICSDATATYPE 8229 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SUBSCRIPTIONDIAGNOSTICSDATATYPE_DATATYPEVERSION 8230 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SUBSCRIPTIONDIAGNOSTICSDATATYPE_DICTIONARYFRAGMENT 8231 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_MODELCHANGESTRUCTUREDATATYPE 8232 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_MODELCHANGESTRUCTUREDATATYPE_DATATYPEVERSION 8233 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_MODELCHANGESTRUCTUREDATATYPE_DICTIONARYFRAGMENT 8234 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SEMANTICCHANGESTRUCTUREDATATYPE 8235 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SEMANTICCHANGESTRUCTUREDATATYPE_DATATYPEVERSION 8236 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SEMANTICCHANGESTRUCTUREDATATYPE_DICTIONARYFRAGMENT 8237 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_RANGE 8238 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_RANGE_DATATYPEVERSION 8239 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_RANGE_DICTIONARYFRAGMENT 8240 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_EUINFORMATION 8241 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_EUINFORMATION_DATATYPEVERSION 8242 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_EUINFORMATION_DICTIONARYFRAGMENT 8243 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ANNOTATION 8244 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ANNOTATION_DATATYPEVERSION 8245 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ANNOTATION_DICTIONARYFRAGMENT 8246 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PROGRAMDIAGNOSTICDATATYPE 8247 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PROGRAMDIAGNOSTICDATATYPE_DATATYPEVERSION 8248 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PROGRAMDIAGNOSTICDATATYPE_DICTIONARYFRAGMENT 8249 /* Variable */ +#define UA_NS0ID_ENUMVALUETYPE_ENCODING_DEFAULTBINARY 8251 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA 8252 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATATYPEVERSION 8253 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_NAMESPACEURI 8254 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ARGUMENT 8285 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ARGUMENT_DATATYPEVERSION 8286 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ARGUMENT_DICTIONARYFRAGMENT 8287 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENUMVALUETYPE 8291 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENUMVALUETYPE_DATATYPEVERSION 8292 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENUMVALUETYPE_DICTIONARYFRAGMENT 8293 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_STATUSRESULT 8294 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_STATUSRESULT_DATATYPEVERSION 8295 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_STATUSRESULT_DICTIONARYFRAGMENT 8296 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_USERTOKENPOLICY 8297 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_USERTOKENPOLICY_DATATYPEVERSION 8298 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_USERTOKENPOLICY_DICTIONARYFRAGMENT 8299 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_APPLICATIONDESCRIPTION 8300 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_APPLICATIONDESCRIPTION_DATATYPEVERSION 8301 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_APPLICATIONDESCRIPTION_DICTIONARYFRAGMENT 8302 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENDPOINTDESCRIPTION 8303 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENDPOINTDESCRIPTION_DATATYPEVERSION 8304 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENDPOINTDESCRIPTION_DICTIONARYFRAGMENT 8305 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_USERIDENTITYTOKEN 8306 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_USERIDENTITYTOKEN_DATATYPEVERSION 8307 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_USERIDENTITYTOKEN_DICTIONARYFRAGMENT 8308 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ANONYMOUSIDENTITYTOKEN 8309 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ANONYMOUSIDENTITYTOKEN_DATATYPEVERSION 8310 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ANONYMOUSIDENTITYTOKEN_DICTIONARYFRAGMENT 8311 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_USERNAMEIDENTITYTOKEN 8312 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_USERNAMEIDENTITYTOKEN_DATATYPEVERSION 8313 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_USERNAMEIDENTITYTOKEN_DICTIONARYFRAGMENT 8314 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_X509IDENTITYTOKEN 8315 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_X509IDENTITYTOKEN_DATATYPEVERSION 8316 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_X509IDENTITYTOKEN_DICTIONARYFRAGMENT 8317 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ISSUEDIDENTITYTOKEN 8318 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ISSUEDIDENTITYTOKEN_DATATYPEVERSION 8319 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ISSUEDIDENTITYTOKEN_DICTIONARYFRAGMENT 8320 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENDPOINTCONFIGURATION 8321 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENDPOINTCONFIGURATION_DATATYPEVERSION 8322 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENDPOINTCONFIGURATION_DICTIONARYFRAGMENT 8323 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BUILDINFO 8327 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BUILDINFO_DATATYPEVERSION 8328 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BUILDINFO_DICTIONARYFRAGMENT 8329 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SIGNEDSOFTWARECERTIFICATE 8333 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SIGNEDSOFTWARECERTIFICATE_DATATYPEVERSION 8334 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SIGNEDSOFTWARECERTIFICATE_DICTIONARYFRAGMENT 8335 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ADDNODESITEM 8363 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ADDNODESITEM_DATATYPEVERSION 8364 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ADDNODESITEM_DICTIONARYFRAGMENT 8365 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ADDREFERENCESITEM 8366 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ADDREFERENCESITEM_DATATYPEVERSION 8367 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ADDREFERENCESITEM_DICTIONARYFRAGMENT 8368 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DELETENODESITEM 8369 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DELETENODESITEM_DATATYPEVERSION 8370 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DELETENODESITEM_DICTIONARYFRAGMENT 8371 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DELETEREFERENCESITEM 8372 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DELETEREFERENCESITEM_DATATYPEVERSION 8373 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DELETEREFERENCESITEM_DICTIONARYFRAGMENT 8374 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_REGISTEREDSERVER 8417 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_REGISTEREDSERVER_DATATYPEVERSION 8418 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_REGISTEREDSERVER_DICTIONARYFRAGMENT 8419 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_CONTENTFILTERELEMENT 8564 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_CONTENTFILTERELEMENT_DATATYPEVERSION 8565 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_CONTENTFILTERELEMENT_DICTIONARYFRAGMENT 8566 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_CONTENTFILTER 8567 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_CONTENTFILTER_DATATYPEVERSION 8568 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_CONTENTFILTER_DICTIONARYFRAGMENT 8569 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_FILTEROPERAND 8570 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_FILTEROPERAND_DATATYPEVERSION 8571 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_FILTEROPERAND_DICTIONARYFRAGMENT 8572 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ELEMENTOPERAND 8573 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ELEMENTOPERAND_DATATYPEVERSION 8574 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ELEMENTOPERAND_DICTIONARYFRAGMENT 8575 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_LITERALOPERAND 8576 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_LITERALOPERAND_DATATYPEVERSION 8577 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_LITERALOPERAND_DICTIONARYFRAGMENT 8578 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ATTRIBUTEOPERAND 8579 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ATTRIBUTEOPERAND_DATATYPEVERSION 8580 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ATTRIBUTEOPERAND_DICTIONARYFRAGMENT 8581 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SIMPLEATTRIBUTEOPERAND 8582 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SIMPLEATTRIBUTEOPERAND_DATATYPEVERSION 8583 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SIMPLEATTRIBUTEOPERAND_DICTIONARYFRAGMENT 8584 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_HISTORYEVENT 8639 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_HISTORYEVENT_DATATYPEVERSION 8640 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_HISTORYEVENT_DICTIONARYFRAGMENT 8641 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_MONITORINGFILTER 8702 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_MONITORINGFILTER_DATATYPEVERSION 8703 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_MONITORINGFILTER_DICTIONARYFRAGMENT 8704 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_EVENTFILTER 8708 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_EVENTFILTER_DATATYPEVERSION 8709 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_EVENTFILTER_DICTIONARYFRAGMENT 8710 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_AGGREGATECONFIGURATION 8711 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_AGGREGATECONFIGURATION_DATATYPEVERSION 8712 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_AGGREGATECONFIGURATION_DICTIONARYFRAGMENT 8713 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_HISTORYEVENTFIELDLIST 8807 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_HISTORYEVENTFIELDLIST_DATATYPEVERSION 8808 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_HISTORYEVENTFIELDLIST_DICTIONARYFRAGMENT 8809 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_REDUNDANTSERVERDATATYPE 8843 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_REDUNDANTSERVERDATATYPE_DATATYPEVERSION 8844 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_REDUNDANTSERVERDATATYPE_DICTIONARYFRAGMENT 8845 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SAMPLINGINTERVALDIAGNOSTICSDATATYPE 8846 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SAMPLINGINTERVALDIAGNOSTICSDATATYPE_DATATYPEVERSION 8847 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SAMPLINGINTERVALDIAGNOSTICSDATATYPE_DICTIONARYFRAGMENT 8848 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SERVERDIAGNOSTICSSUMMARYDATATYPE 8849 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SERVERDIAGNOSTICSSUMMARYDATATYPE_DATATYPEVERSION 8850 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SERVERDIAGNOSTICSSUMMARYDATATYPE_DICTIONARYFRAGMENT 8851 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SERVERSTATUSDATATYPE 8852 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SERVERSTATUSDATATYPE_DATATYPEVERSION 8853 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SERVERSTATUSDATATYPE_DICTIONARYFRAGMENT 8854 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SESSIONDIAGNOSTICSDATATYPE 8855 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SESSIONDIAGNOSTICSDATATYPE_DATATYPEVERSION 8856 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SESSIONDIAGNOSTICSDATATYPE_DICTIONARYFRAGMENT 8857 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SESSIONSECURITYDIAGNOSTICSDATATYPE 8858 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SESSIONSECURITYDIAGNOSTICSDATATYPE_DATATYPEVERSION 8859 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SESSIONSECURITYDIAGNOSTICSDATATYPE_DICTIONARYFRAGMENT 8860 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SERVICECOUNTERDATATYPE 8861 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SERVICECOUNTERDATATYPE_DATATYPEVERSION 8862 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SERVICECOUNTERDATATYPE_DICTIONARYFRAGMENT 8863 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SUBSCRIPTIONDIAGNOSTICSDATATYPE 8864 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SUBSCRIPTIONDIAGNOSTICSDATATYPE_DATATYPEVERSION 8865 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SUBSCRIPTIONDIAGNOSTICSDATATYPE_DICTIONARYFRAGMENT 8866 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_MODELCHANGESTRUCTUREDATATYPE 8867 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_MODELCHANGESTRUCTUREDATATYPE_DATATYPEVERSION 8868 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_MODELCHANGESTRUCTUREDATATYPE_DICTIONARYFRAGMENT 8869 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SEMANTICCHANGESTRUCTUREDATATYPE 8870 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SEMANTICCHANGESTRUCTUREDATATYPE_DATATYPEVERSION 8871 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SEMANTICCHANGESTRUCTUREDATATYPE_DICTIONARYFRAGMENT 8872 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_RANGE 8873 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_RANGE_DATATYPEVERSION 8874 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_RANGE_DICTIONARYFRAGMENT 8875 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_EUINFORMATION 8876 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_EUINFORMATION_DATATYPEVERSION 8877 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_EUINFORMATION_DICTIONARYFRAGMENT 8878 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ANNOTATION 8879 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ANNOTATION_DATATYPEVERSION 8880 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ANNOTATION_DICTIONARYFRAGMENT 8881 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PROGRAMDIAGNOSTICDATATYPE 8882 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PROGRAMDIAGNOSTICDATATYPE_DATATYPEVERSION 8883 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PROGRAMDIAGNOSTICDATATYPE_DICTIONARYFRAGMENT 8884 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_MAXLIFETIMECOUNT 8888 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_LATEPUBLISHREQUESTCOUNT 8889 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_CURRENTKEEPALIVECOUNT 8890 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_CURRENTLIFETIMECOUNT 8891 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_UNACKNOWLEDGEDMESSAGECOUNT 8892 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_DISCARDEDMESSAGECOUNT 8893 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_MONITOREDITEMCOUNT 8894 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_DISABLEDMONITOREDITEMCOUNT 8895 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_MONITORINGQUEUEOVERFLOWCOUNT 8896 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_NEXTSEQUENCENUMBER 8897 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_TOTALREQUESTCOUNT 8898 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_TOTALREQUESTCOUNT 8900 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSTYPE_EVENTQUEUEOVERFLOWCOUNT 8902 /* Variable */ +#define UA_NS0ID_TIMEZONEDATATYPE 8912 /* DataType */ +#define UA_NS0ID_TIMEZONEDATATYPE_ENCODING_DEFAULTXML 8913 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_TIMEZONEDATATYPE 8914 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_TIMEZONEDATATYPE_DATATYPEVERSION 8915 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_TIMEZONEDATATYPE_DICTIONARYFRAGMENT 8916 /* Variable */ +#define UA_NS0ID_TIMEZONEDATATYPE_ENCODING_DEFAULTBINARY 8917 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_TIMEZONEDATATYPE 8918 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_TIMEZONEDATATYPE_DATATYPEVERSION 8919 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_TIMEZONEDATATYPE_DICTIONARYFRAGMENT 8920 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE 8927 /* ObjectType */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_EVENTID 8928 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_EVENTTYPE 8929 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_SOURCENODE 8930 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_SOURCENAME 8931 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_TIME 8932 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_RECEIVETIME 8933 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_LOCALTIME 8934 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_MESSAGE 8935 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_SEVERITY 8936 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_ACTIONTIMESTAMP 8937 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_STATUS 8938 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_SERVERID 8939 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_CLIENTAUDITENTRYID 8940 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_CLIENTUSERID 8941 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_METHODID 8942 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_INPUTARGUMENTS 8943 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE 8944 /* ObjectType */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_EVENTID 8945 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_EVENTTYPE 8946 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_SOURCENODE 8947 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_SOURCENAME 8948 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_TIME 8949 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_RECEIVETIME 8950 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_LOCALTIME 8951 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_MESSAGE 8952 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_SEVERITY 8953 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_ACTIONTIMESTAMP 8954 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_STATUS 8955 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_SERVERID 8956 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_CLIENTAUDITENTRYID 8957 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_CLIENTUSERID 8958 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_METHODID 8959 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_INPUTARGUMENTS 8960 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE 8961 /* ObjectType */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_EVENTID 8962 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_EVENTTYPE 8963 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_SOURCENODE 8964 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_SOURCENAME 8965 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_TIME 8966 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_RECEIVETIME 8967 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_LOCALTIME 8968 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_MESSAGE 8969 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_SEVERITY 8970 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_ACTIONTIMESTAMP 8971 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_STATUS 8972 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_SERVERID 8973 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_CLIENTAUDITENTRYID 8974 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_CLIENTUSERID 8975 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_METHODID 8976 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_INPUTARGUMENTS 8977 /* Variable */ +#define UA_NS0ID_TWOSTATEVARIABLETYPE 8995 /* VariableType */ +#define UA_NS0ID_TWOSTATEVARIABLETYPE_ID 8996 /* Variable */ +#define UA_NS0ID_TWOSTATEVARIABLETYPE_NAME 8997 /* Variable */ +#define UA_NS0ID_TWOSTATEVARIABLETYPE_NUMBER 8998 /* Variable */ +#define UA_NS0ID_TWOSTATEVARIABLETYPE_EFFECTIVEDISPLAYNAME 8999 /* Variable */ +#define UA_NS0ID_TWOSTATEVARIABLETYPE_TRANSITIONTIME 9000 /* Variable */ +#define UA_NS0ID_TWOSTATEVARIABLETYPE_EFFECTIVETRANSITIONTIME 9001 /* Variable */ +#define UA_NS0ID_CONDITIONVARIABLETYPE 9002 /* VariableType */ +#define UA_NS0ID_CONDITIONVARIABLETYPE_SOURCETIMESTAMP 9003 /* Variable */ +#define UA_NS0ID_HASTRUESUBSTATE 9004 /* ReferenceType */ +#define UA_NS0ID_HASFALSESUBSTATE 9005 /* ReferenceType */ +#define UA_NS0ID_HASCONDITION 9006 /* ReferenceType */ +#define UA_NS0ID_CONDITIONREFRESHMETHODTYPE 9007 /* Method */ +#define UA_NS0ID_CONDITIONREFRESHMETHODTYPE_INPUTARGUMENTS 9008 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_CONDITIONNAME 9009 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_BRANCHID 9010 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_ENABLEDSTATE 9011 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_ENABLEDSTATE_ID 9012 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_ENABLEDSTATE_NAME 9013 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_ENABLEDSTATE_NUMBER 9014 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 9015 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_ENABLEDSTATE_TRANSITIONTIME 9016 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 9017 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_ENABLEDSTATE_TRUESTATE 9018 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_ENABLEDSTATE_FALSESTATE 9019 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_QUALITY 9020 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_QUALITY_SOURCETIMESTAMP 9021 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_LASTSEVERITY 9022 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_LASTSEVERITY_SOURCETIMESTAMP 9023 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_COMMENT 9024 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_COMMENT_SOURCETIMESTAMP 9025 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_CLIENTUSERID 9026 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_ENABLE 9027 /* Method */ +#define UA_NS0ID_CONDITIONTYPE_DISABLE 9028 /* Method */ +#define UA_NS0ID_CONDITIONTYPE_ADDCOMMENT 9029 /* Method */ +#define UA_NS0ID_CONDITIONTYPE_ADDCOMMENT_INPUTARGUMENTS 9030 /* Variable */ +#define UA_NS0ID_DIALOGRESPONSEMETHODTYPE 9031 /* Method */ +#define UA_NS0ID_DIALOGRESPONSEMETHODTYPE_INPUTARGUMENTS 9032 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_CONDITIONNAME 9033 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_BRANCHID 9034 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_ENABLEDSTATE 9035 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_ENABLEDSTATE_ID 9036 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_ENABLEDSTATE_NAME 9037 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_ENABLEDSTATE_NUMBER 9038 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 9039 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_ENABLEDSTATE_TRANSITIONTIME 9040 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 9041 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_ENABLEDSTATE_TRUESTATE 9042 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_ENABLEDSTATE_FALSESTATE 9043 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_QUALITY 9044 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_QUALITY_SOURCETIMESTAMP 9045 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_LASTSEVERITY 9046 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_LASTSEVERITY_SOURCETIMESTAMP 9047 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_COMMENT 9048 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_COMMENT_SOURCETIMESTAMP 9049 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_CLIENTUSERID 9050 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_ENABLE 9051 /* Method */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_DISABLE 9052 /* Method */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_ADDCOMMENT 9053 /* Method */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_ADDCOMMENT_INPUTARGUMENTS 9054 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_DIALOGSTATE 9055 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_DIALOGSTATE_ID 9056 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_DIALOGSTATE_NAME 9057 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_DIALOGSTATE_NUMBER 9058 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_DIALOGSTATE_EFFECTIVEDISPLAYNAME 9059 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_DIALOGSTATE_TRANSITIONTIME 9060 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_DIALOGSTATE_EFFECTIVETRANSITIONTIME 9061 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_DIALOGSTATE_TRUESTATE 9062 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_DIALOGSTATE_FALSESTATE 9063 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_RESPONSEOPTIONSET 9064 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_DEFAULTRESPONSE 9065 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_OKRESPONSE 9066 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_CANCELRESPONSE 9067 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_LASTRESPONSE 9068 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_RESPOND 9069 /* Method */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_RESPOND_INPUTARGUMENTS 9070 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONDITIONNAME 9071 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_BRANCHID 9072 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ENABLEDSTATE 9073 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ENABLEDSTATE_ID 9074 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ENABLEDSTATE_NAME 9075 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ENABLEDSTATE_NUMBER 9076 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 9077 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ENABLEDSTATE_TRANSITIONTIME 9078 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 9079 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ENABLEDSTATE_TRUESTATE 9080 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ENABLEDSTATE_FALSESTATE 9081 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_QUALITY 9082 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_QUALITY_SOURCETIMESTAMP 9083 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_LASTSEVERITY 9084 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_LASTSEVERITY_SOURCETIMESTAMP 9085 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_COMMENT 9086 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_COMMENT_SOURCETIMESTAMP 9087 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CLIENTUSERID 9088 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ENABLE 9089 /* Method */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_DISABLE 9090 /* Method */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ADDCOMMENT 9091 /* Method */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ADDCOMMENT_INPUTARGUMENTS 9092 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ACKEDSTATE 9093 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ACKEDSTATE_ID 9094 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ACKEDSTATE_NAME 9095 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ACKEDSTATE_NUMBER 9096 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 9097 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ACKEDSTATE_TRANSITIONTIME 9098 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 9099 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ACKEDSTATE_TRUESTATE 9100 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ACKEDSTATE_FALSESTATE 9101 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONFIRMEDSTATE 9102 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONFIRMEDSTATE_ID 9103 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONFIRMEDSTATE_NAME 9104 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONFIRMEDSTATE_NUMBER 9105 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 9106 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONFIRMEDSTATE_TRANSITIONTIME 9107 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 9108 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONFIRMEDSTATE_TRUESTATE 9109 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONFIRMEDSTATE_FALSESTATE 9110 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ACKNOWLEDGE 9111 /* Method */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_ACKNOWLEDGE_INPUTARGUMENTS 9112 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONFIRM 9113 /* Method */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONFIRM_INPUTARGUMENTS 9114 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_UNSHELVETIME 9115 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONDITIONNAME 9116 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_BRANCHID 9117 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ENABLEDSTATE 9118 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ENABLEDSTATE_ID 9119 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ENABLEDSTATE_NAME 9120 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ENABLEDSTATE_NUMBER 9121 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 9122 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ENABLEDSTATE_TRANSITIONTIME 9123 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 9124 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ENABLEDSTATE_TRUESTATE 9125 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ENABLEDSTATE_FALSESTATE 9126 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_QUALITY 9127 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_QUALITY_SOURCETIMESTAMP 9128 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_LASTSEVERITY 9129 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_LASTSEVERITY_SOURCETIMESTAMP 9130 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_COMMENT 9131 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_COMMENT_SOURCETIMESTAMP 9132 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CLIENTUSERID 9133 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ENABLE 9134 /* Method */ +#define UA_NS0ID_ALARMCONDITIONTYPE_DISABLE 9135 /* Method */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ADDCOMMENT 9136 /* Method */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ADDCOMMENT_INPUTARGUMENTS 9137 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACKEDSTATE 9138 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACKEDSTATE_ID 9139 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACKEDSTATE_NAME 9140 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACKEDSTATE_NUMBER 9141 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 9142 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACKEDSTATE_TRANSITIONTIME 9143 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 9144 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACKEDSTATE_TRUESTATE 9145 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACKEDSTATE_FALSESTATE 9146 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONFIRMEDSTATE 9147 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONFIRMEDSTATE_ID 9148 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONFIRMEDSTATE_NAME 9149 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONFIRMEDSTATE_NUMBER 9150 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 9151 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONFIRMEDSTATE_TRANSITIONTIME 9152 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 9153 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONFIRMEDSTATE_TRUESTATE 9154 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONFIRMEDSTATE_FALSESTATE 9155 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACKNOWLEDGE 9156 /* Method */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACKNOWLEDGE_INPUTARGUMENTS 9157 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONFIRM 9158 /* Method */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONFIRM_INPUTARGUMENTS 9159 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACTIVESTATE 9160 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACTIVESTATE_ID 9161 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACTIVESTATE_NAME 9162 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACTIVESTATE_NUMBER 9163 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 9164 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACTIVESTATE_TRANSITIONTIME 9165 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 9166 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACTIVESTATE_TRUESTATE 9167 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ACTIVESTATE_FALSESTATE 9168 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SUPPRESSEDSTATE 9169 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SUPPRESSEDSTATE_ID 9170 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SUPPRESSEDSTATE_NAME 9171 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SUPPRESSEDSTATE_NUMBER 9172 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 9173 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 9174 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 9175 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SUPPRESSEDSTATE_TRUESTATE 9176 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SUPPRESSEDSTATE_FALSESTATE 9177 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE 9178 /* Object */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_CURRENTSTATE 9179 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_CURRENTSTATE_ID 9180 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 9181 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 9182 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 9183 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_LASTTRANSITION 9184 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_LASTTRANSITION_ID 9185 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 9186 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 9187 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 9188 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_UNSHELVETIME 9189 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_UNSHELVE 9211 /* Method */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_ONESHOTSHELVE 9212 /* Method */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_TIMEDSHELVE 9213 /* Method */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 9214 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SUPPRESSEDORSHELVED 9215 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_MAXTIMESHELVED 9216 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONDITIONNAME 9217 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_BRANCHID 9218 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ENABLEDSTATE 9219 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ENABLEDSTATE_ID 9220 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ENABLEDSTATE_NAME 9221 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ENABLEDSTATE_NUMBER 9222 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 9223 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 9224 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 9225 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ENABLEDSTATE_TRUESTATE 9226 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ENABLEDSTATE_FALSESTATE 9227 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_QUALITY 9228 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_QUALITY_SOURCETIMESTAMP 9229 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_LASTSEVERITY 9230 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 9231 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_COMMENT 9232 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_COMMENT_SOURCETIMESTAMP 9233 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CLIENTUSERID 9234 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ENABLE 9235 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_DISABLE 9236 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_ADDCOMMENT 9237 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 9238 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACKEDSTATE 9239 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACKEDSTATE_ID 9240 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACKEDSTATE_NAME 9241 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACKEDSTATE_NUMBER 9242 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 9243 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACKEDSTATE_TRANSITIONTIME 9244 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 9245 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACKEDSTATE_TRUESTATE 9246 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACKEDSTATE_FALSESTATE 9247 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONFIRMEDSTATE 9248 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONFIRMEDSTATE_ID 9249 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONFIRMEDSTATE_NAME 9250 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONFIRMEDSTATE_NUMBER 9251 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 9252 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 9253 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 9254 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONFIRMEDSTATE_TRUESTATE 9255 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONFIRMEDSTATE_FALSESTATE 9256 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACKNOWLEDGE 9257 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 9258 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONFIRM 9259 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_CONFIRM_INPUTARGUMENTS 9260 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACTIVESTATE 9261 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACTIVESTATE_ID 9262 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACTIVESTATE_NAME 9263 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACTIVESTATE_NUMBER 9264 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 9265 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACTIVESTATE_TRANSITIONTIME 9266 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 9267 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACTIVESTATE_TRUESTATE 9268 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ACTIVESTATE_FALSESTATE 9269 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SUPPRESSEDSTATE 9270 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SUPPRESSEDSTATE_ID 9271 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SUPPRESSEDSTATE_NAME 9272 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SUPPRESSEDSTATE_NUMBER 9273 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 9274 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 9275 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 9276 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 9277 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 9278 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE 9279 /* Object */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE 9280 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 9281 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 9282 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 9283 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 9284 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION 9285 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 9286 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 9287 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 9288 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 9289 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_UNSHELVETIME 9290 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_UNSHELVE 9312 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 9313 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 9314 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 9315 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SUPPRESSEDORSHELVED 9316 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_MAXTIMESHELVED 9317 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE 9318 /* ObjectType */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_CURRENTSTATE 9319 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_CURRENTSTATE_ID 9320 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_CURRENTSTATE_NAME 9321 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_CURRENTSTATE_NUMBER 9322 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 9323 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LASTTRANSITION 9324 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LASTTRANSITION_ID 9325 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LASTTRANSITION_NAME 9326 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LASTTRANSITION_NUMBER 9327 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LASTTRANSITION_TRANSITIONTIME 9328 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_HIGHHIGH 9329 /* Object */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_HIGHHIGH_STATENUMBER 9330 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_HIGH 9331 /* Object */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_HIGH_STATENUMBER 9332 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LOW 9333 /* Object */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LOW_STATENUMBER 9334 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LOWLOW 9335 /* Object */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LOWLOW_STATENUMBER 9336 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LOWLOWTOLOW 9337 /* Object */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LOWTOLOWLOW 9338 /* Object */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_HIGHHIGHTOHIGH 9339 /* Object */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_HIGHTOHIGHHIGH 9340 /* Object */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE 9341 /* ObjectType */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_EVENTID 9342 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_EVENTTYPE 9343 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SOURCENODE 9344 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SOURCENAME 9345 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_TIME 9346 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_RECEIVETIME 9347 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LOCALTIME 9348 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_MESSAGE 9349 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SEVERITY 9350 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONDITIONNAME 9351 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_BRANCHID 9352 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_RETAIN 9353 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ENABLEDSTATE 9354 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_ID 9355 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_NAME 9356 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_NUMBER 9357 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 9358 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 9359 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 9360 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_TRUESTATE 9361 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_FALSESTATE 9362 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_QUALITY 9363 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_QUALITY_SOURCETIMESTAMP 9364 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LASTSEVERITY 9365 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 9366 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_COMMENT 9367 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_COMMENT_SOURCETIMESTAMP 9368 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CLIENTUSERID 9369 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ENABLE 9370 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_DISABLE 9371 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ADDCOMMENT 9372 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 9373 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONDITIONREFRESH 9374 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 9375 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACKEDSTATE 9376 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACKEDSTATE_ID 9377 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACKEDSTATE_NAME 9378 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACKEDSTATE_NUMBER 9379 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 9380 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACKEDSTATE_TRANSITIONTIME 9381 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 9382 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACKEDSTATE_TRUESTATE 9383 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACKEDSTATE_FALSESTATE 9384 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE 9385 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_ID 9386 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_NAME 9387 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_NUMBER 9388 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 9389 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 9390 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 9391 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_TRUESTATE 9392 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_FALSESTATE 9393 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACKNOWLEDGE 9394 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 9395 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONFIRM 9396 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONFIRM_INPUTARGUMENTS 9397 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACTIVESTATE 9398 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACTIVESTATE_ID 9399 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACTIVESTATE_NAME 9400 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACTIVESTATE_NUMBER 9401 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 9402 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACTIVESTATE_TRANSITIONTIME 9403 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 9404 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACTIVESTATE_TRUESTATE 9405 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ACTIVESTATE_FALSESTATE 9406 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE 9407 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_ID 9408 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_NAME 9409 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_NUMBER 9410 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 9411 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 9412 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 9413 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 9414 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 9415 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE 9416 /* Object */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE 9417 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 9418 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 9419 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 9420 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 9421 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION 9422 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 9423 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 9424 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 9425 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 9426 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_UNSHELVETIME 9427 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_UNSHELVE 9449 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 9450 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 9451 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 9452 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SUPPRESSEDORSHELVED 9453 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_MAXTIMESHELVED 9454 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE 9455 /* Object */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE_CURRENTSTATE 9456 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE_CURRENTSTATE_ID 9457 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE_CURRENTSTATE_NAME 9458 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE_CURRENTSTATE_NUMBER 9459 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 9460 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE_LASTTRANSITION 9461 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE_LASTTRANSITION_ID 9462 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE_LASTTRANSITION_NAME 9463 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE_LASTTRANSITION_NUMBER 9464 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE_LASTTRANSITION_TRANSITIONTIME 9465 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_HIGHHIGHLIMIT 9478 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_HIGHLIMIT 9479 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LOWLIMIT 9480 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LOWLOWLIMIT 9481 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE 9482 /* ObjectType */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_EVENTID 9483 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_EVENTTYPE 9484 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SOURCENODE 9485 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SOURCENAME 9486 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_TIME 9487 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_RECEIVETIME 9488 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LOCALTIME 9489 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_MESSAGE 9490 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SEVERITY 9491 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONDITIONNAME 9492 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_BRANCHID 9493 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_RETAIN 9494 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ENABLEDSTATE 9495 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_ID 9496 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_NAME 9497 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_NUMBER 9498 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 9499 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 9500 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 9501 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_TRUESTATE 9502 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_FALSESTATE 9503 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_QUALITY 9504 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_QUALITY_SOURCETIMESTAMP 9505 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LASTSEVERITY 9506 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 9507 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_COMMENT 9508 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_COMMENT_SOURCETIMESTAMP 9509 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CLIENTUSERID 9510 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ENABLE 9511 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_DISABLE 9512 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ADDCOMMENT 9513 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 9514 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONDITIONREFRESH 9515 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 9516 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACKEDSTATE 9517 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACKEDSTATE_ID 9518 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACKEDSTATE_NAME 9519 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACKEDSTATE_NUMBER 9520 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 9521 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACKEDSTATE_TRANSITIONTIME 9522 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 9523 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACKEDSTATE_TRUESTATE 9524 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACKEDSTATE_FALSESTATE 9525 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE 9526 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_ID 9527 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_NAME 9528 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_NUMBER 9529 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 9530 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 9531 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 9532 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_TRUESTATE 9533 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_FALSESTATE 9534 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACKNOWLEDGE 9535 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 9536 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONFIRM 9537 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONFIRM_INPUTARGUMENTS 9538 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACTIVESTATE 9539 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACTIVESTATE_ID 9540 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACTIVESTATE_NAME 9541 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACTIVESTATE_NUMBER 9542 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 9543 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACTIVESTATE_TRANSITIONTIME 9544 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 9545 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACTIVESTATE_TRUESTATE 9546 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ACTIVESTATE_FALSESTATE 9547 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE 9548 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_ID 9549 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_NAME 9550 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_NUMBER 9551 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 9552 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 9553 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 9554 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 9555 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 9556 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE 9557 /* Object */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_CURRENTSTATE 9558 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 9559 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 9560 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 9561 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 9562 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_LASTTRANSITION 9563 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 9564 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 9565 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 9566 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 9567 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_UNSHELVETIME 9568 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_UNSHELVE 9590 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 9591 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 9592 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 9593 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SUPPRESSEDORSHELVED 9594 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_MAXTIMESHELVED 9595 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE 9596 /* Object */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE_CURRENTSTATE 9597 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE_CURRENTSTATE_ID 9598 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE_CURRENTSTATE_NAME 9599 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE_CURRENTSTATE_NUMBER 9600 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 9601 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE_LASTTRANSITION 9602 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE_LASTTRANSITION_ID 9603 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE_LASTTRANSITION_NAME 9604 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE_LASTTRANSITION_NUMBER 9605 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE_LASTTRANSITION_TRANSITIONTIME 9606 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_HIGHHIGHLIMIT 9619 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_HIGHLIMIT 9620 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LOWLIMIT 9621 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LOWLOWLIMIT 9622 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE 9623 /* ObjectType */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_EVENTID 9624 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_EVENTTYPE 9625 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SOURCENODE 9626 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SOURCENAME 9627 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_TIME 9628 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_RECEIVETIME 9629 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LOCALTIME 9630 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_MESSAGE 9631 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SEVERITY 9632 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONNAME 9633 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_BRANCHID 9634 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_RETAIN 9635 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE 9636 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_ID 9637 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_NAME 9638 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_NUMBER 9639 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 9640 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 9641 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 9642 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_TRUESTATE 9643 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_FALSESTATE 9644 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_QUALITY 9645 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_QUALITY_SOURCETIMESTAMP 9646 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LASTSEVERITY 9647 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 9648 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_COMMENT 9649 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_COMMENT_SOURCETIMESTAMP 9650 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CLIENTUSERID 9651 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ENABLE 9652 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_DISABLE 9653 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ADDCOMMENT 9654 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 9655 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONREFRESH 9656 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 9657 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE 9658 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_ID 9659 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_NAME 9660 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_NUMBER 9661 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 9662 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_TRANSITIONTIME 9663 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 9664 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_TRUESTATE 9665 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_FALSESTATE 9666 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE 9667 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_ID 9668 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_NAME 9669 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_NUMBER 9670 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 9671 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 9672 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 9673 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_TRUESTATE 9674 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_FALSESTATE 9675 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACKNOWLEDGE 9676 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 9677 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRM 9678 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRM_INPUTARGUMENTS 9679 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE 9680 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_ID 9681 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_NAME 9682 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_NUMBER 9683 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 9684 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_TRANSITIONTIME 9685 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 9686 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_TRUESTATE 9687 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_FALSESTATE 9688 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE 9689 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_ID 9690 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_NAME 9691 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_NUMBER 9692 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 9693 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 9694 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 9695 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 9696 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 9697 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE 9698 /* Object */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_CURRENTSTATE 9699 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 9700 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 9701 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 9702 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 9703 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_LASTTRANSITION 9704 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 9705 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 9706 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 9707 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 9708 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_UNSHELVETIME 9709 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_UNSHELVE 9731 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 9732 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 9733 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 9734 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDORSHELVED 9735 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_MAXTIMESHELVED 9736 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE 9737 /* Object */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE_CURRENTSTATE 9738 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE_CURRENTSTATE_ID 9739 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE_CURRENTSTATE_NAME 9740 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE_CURRENTSTATE_NUMBER 9741 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 9742 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE_LASTTRANSITION 9743 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE_LASTTRANSITION_ID 9744 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE_LASTTRANSITION_NAME 9745 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE_LASTTRANSITION_NUMBER 9746 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE_LASTTRANSITION_TRANSITIONTIME 9747 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_HIGHHIGHLIMIT 9760 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_HIGHLIMIT 9761 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LOWLIMIT 9762 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LOWLOWLIMIT 9763 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE 9764 /* ObjectType */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_EVENTID 9765 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_EVENTTYPE 9766 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SOURCENODE 9767 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SOURCENAME 9768 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_TIME 9769 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_RECEIVETIME 9770 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LOCALTIME 9771 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_MESSAGE 9772 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SEVERITY 9773 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONDITIONNAME 9774 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_BRANCHID 9775 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_RETAIN 9776 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE 9777 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_ID 9778 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_NAME 9779 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_NUMBER 9780 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 9781 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 9782 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 9783 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_TRUESTATE 9784 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_FALSESTATE 9785 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_QUALITY 9786 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_QUALITY_SOURCETIMESTAMP 9787 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LASTSEVERITY 9788 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 9789 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_COMMENT 9790 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_COMMENT_SOURCETIMESTAMP 9791 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CLIENTUSERID 9792 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ENABLE 9793 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_DISABLE 9794 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ADDCOMMENT 9795 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 9796 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONDITIONREFRESH 9797 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 9798 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE 9799 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_ID 9800 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_NAME 9801 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_NUMBER 9802 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 9803 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_TRANSITIONTIME 9804 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 9805 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_TRUESTATE 9806 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_FALSESTATE 9807 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE 9808 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_ID 9809 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_NAME 9810 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_NUMBER 9811 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 9812 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 9813 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 9814 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_TRUESTATE 9815 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_FALSESTATE 9816 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACKNOWLEDGE 9817 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 9818 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONFIRM 9819 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONFIRM_INPUTARGUMENTS 9820 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE 9821 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_ID 9822 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_NAME 9823 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_NUMBER 9824 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 9825 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_TRANSITIONTIME 9826 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 9827 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_TRUESTATE 9828 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_FALSESTATE 9829 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE 9830 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_ID 9831 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_NAME 9832 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_NUMBER 9833 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 9834 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 9835 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 9836 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 9837 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 9838 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE 9839 /* Object */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE 9840 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 9841 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 9842 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 9843 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 9844 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION 9845 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 9846 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 9847 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 9848 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 9849 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_UNSHELVETIME 9850 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_UNSHELVE 9872 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 9873 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 9874 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 9875 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDORSHELVED 9876 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_MAXTIMESHELVED 9877 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE 9878 /* Object */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE_CURRENTSTATE 9879 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE_CURRENTSTATE_ID 9880 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE_CURRENTSTATE_NAME 9881 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE_CURRENTSTATE_NUMBER 9882 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 9883 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE_LASTTRANSITION 9884 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE_LASTTRANSITION_ID 9885 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE_LASTTRANSITION_NAME 9886 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE_LASTTRANSITION_NUMBER 9887 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE_LASTTRANSITION_TRANSITIONTIME 9888 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_HIGHHIGHLIMIT 9901 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_HIGHLIMIT 9902 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LOWLIMIT 9903 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LOWLOWLIMIT 9904 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SETPOINTNODE 9905 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE 9906 /* ObjectType */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_EVENTID 9907 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_EVENTTYPE 9908 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SOURCENODE 9909 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SOURCENAME 9910 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_TIME 9911 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_RECEIVETIME 9912 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOCALTIME 9913 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_MESSAGE 9914 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SEVERITY 9915 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONDITIONNAME 9916 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_BRANCHID 9917 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_RETAIN 9918 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ENABLEDSTATE 9919 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_ID 9920 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_NAME 9921 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_NUMBER 9922 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 9923 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 9924 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 9925 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_TRUESTATE 9926 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ENABLEDSTATE_FALSESTATE 9927 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_QUALITY 9928 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_QUALITY_SOURCETIMESTAMP 9929 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LASTSEVERITY 9930 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 9931 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_COMMENT 9932 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_COMMENT_SOURCETIMESTAMP 9933 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CLIENTUSERID 9934 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ENABLE 9935 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_DISABLE 9936 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ADDCOMMENT 9937 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 9938 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONDITIONREFRESH 9939 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 9940 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACKEDSTATE 9941 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACKEDSTATE_ID 9942 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACKEDSTATE_NAME 9943 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACKEDSTATE_NUMBER 9944 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 9945 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACKEDSTATE_TRANSITIONTIME 9946 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 9947 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACKEDSTATE_TRUESTATE 9948 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACKEDSTATE_FALSESTATE 9949 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE 9950 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_ID 9951 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_NAME 9952 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_NUMBER 9953 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 9954 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 9955 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 9956 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_TRUESTATE 9957 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONFIRMEDSTATE_FALSESTATE 9958 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACKNOWLEDGE 9959 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 9960 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONFIRM 9961 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONFIRM_INPUTARGUMENTS 9962 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACTIVESTATE 9963 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACTIVESTATE_ID 9964 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACTIVESTATE_NAME 9965 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACTIVESTATE_NUMBER 9966 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 9967 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACTIVESTATE_TRANSITIONTIME 9968 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 9969 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACTIVESTATE_TRUESTATE 9970 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ACTIVESTATE_FALSESTATE 9971 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE 9972 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_ID 9973 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_NAME 9974 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_NUMBER 9975 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 9976 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 9977 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 9978 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 9979 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 9980 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE 9981 /* Object */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE 9982 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 9983 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 9984 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 9985 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 9986 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION 9987 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 9988 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 9989 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 9990 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 9991 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_UNSHELVETIME 9992 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_UNSHELVE 10014 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 10015 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 10016 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 10017 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SUPPRESSEDORSHELVED 10018 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_MAXTIMESHELVED 10019 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHHIGHSTATE 10020 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHHIGHSTATE_ID 10021 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHHIGHSTATE_NAME 10022 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHHIGHSTATE_NUMBER 10023 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHHIGHSTATE_EFFECTIVEDISPLAYNAME 10024 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHHIGHSTATE_TRANSITIONTIME 10025 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHHIGHSTATE_EFFECTIVETRANSITIONTIME 10026 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHHIGHSTATE_TRUESTATE 10027 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHHIGHSTATE_FALSESTATE 10028 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHSTATE 10029 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHSTATE_ID 10030 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHSTATE_NAME 10031 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHSTATE_NUMBER 10032 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHSTATE_EFFECTIVEDISPLAYNAME 10033 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHSTATE_TRANSITIONTIME 10034 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHSTATE_EFFECTIVETRANSITIONTIME 10035 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHSTATE_TRUESTATE 10036 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHSTATE_FALSESTATE 10037 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWSTATE 10038 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWSTATE_ID 10039 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWSTATE_NAME 10040 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWSTATE_NUMBER 10041 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWSTATE_EFFECTIVEDISPLAYNAME 10042 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWSTATE_TRANSITIONTIME 10043 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWSTATE_EFFECTIVETRANSITIONTIME 10044 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWSTATE_TRUESTATE 10045 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWSTATE_FALSESTATE 10046 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWLOWSTATE 10047 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWLOWSTATE_ID 10048 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWLOWSTATE_NAME 10049 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWLOWSTATE_NUMBER 10050 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWLOWSTATE_EFFECTIVEDISPLAYNAME 10051 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWLOWSTATE_TRANSITIONTIME 10052 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWLOWSTATE_EFFECTIVETRANSITIONTIME 10053 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWLOWSTATE_TRUESTATE 10054 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWLOWSTATE_FALSESTATE 10055 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHHIGHLIMIT 10056 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_HIGHLIMIT 10057 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWLIMIT 10058 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LOWLOWLIMIT 10059 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE 10060 /* ObjectType */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_EVENTID 10061 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_EVENTTYPE 10062 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SOURCENODE 10063 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SOURCENAME 10064 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_TIME 10065 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_RECEIVETIME 10066 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOCALTIME 10067 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_MESSAGE 10068 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SEVERITY 10069 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONDITIONNAME 10070 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_BRANCHID 10071 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_RETAIN 10072 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ENABLEDSTATE 10073 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_ID 10074 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_NAME 10075 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_NUMBER 10076 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 10077 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 10078 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 10079 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_TRUESTATE 10080 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ENABLEDSTATE_FALSESTATE 10081 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_QUALITY 10082 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_QUALITY_SOURCETIMESTAMP 10083 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LASTSEVERITY 10084 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 10085 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_COMMENT 10086 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_COMMENT_SOURCETIMESTAMP 10087 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CLIENTUSERID 10088 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ENABLE 10089 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_DISABLE 10090 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ADDCOMMENT 10091 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 10092 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONDITIONREFRESH 10093 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 10094 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACKEDSTATE 10095 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACKEDSTATE_ID 10096 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACKEDSTATE_NAME 10097 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACKEDSTATE_NUMBER 10098 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 10099 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACKEDSTATE_TRANSITIONTIME 10100 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 10101 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACKEDSTATE_TRUESTATE 10102 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACKEDSTATE_FALSESTATE 10103 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE 10104 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_ID 10105 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_NAME 10106 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_NUMBER 10107 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 10108 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 10109 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 10110 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_TRUESTATE 10111 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONFIRMEDSTATE_FALSESTATE 10112 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACKNOWLEDGE 10113 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 10114 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONFIRM 10115 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONFIRM_INPUTARGUMENTS 10116 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACTIVESTATE 10117 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACTIVESTATE_ID 10118 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACTIVESTATE_NAME 10119 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACTIVESTATE_NUMBER 10120 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 10121 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACTIVESTATE_TRANSITIONTIME 10122 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 10123 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACTIVESTATE_TRUESTATE 10124 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ACTIVESTATE_FALSESTATE 10125 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE 10126 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_ID 10127 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_NAME 10128 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_NUMBER 10129 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 10130 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 10131 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 10132 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 10133 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 10134 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE 10135 /* Object */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_CURRENTSTATE 10136 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 10137 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 10138 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 10139 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 10140 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_LASTTRANSITION 10141 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 10142 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 10143 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 10144 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 10145 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_UNSHELVETIME 10146 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_UNSHELVE 10168 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 10169 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 10170 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 10171 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SUPPRESSEDORSHELVED 10172 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_MAXTIMESHELVED 10173 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHHIGHSTATE 10174 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHHIGHSTATE_ID 10175 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHHIGHSTATE_NAME 10176 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHHIGHSTATE_NUMBER 10177 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHHIGHSTATE_EFFECTIVEDISPLAYNAME 10178 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHHIGHSTATE_TRANSITIONTIME 10179 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHHIGHSTATE_EFFECTIVETRANSITIONTIME 10180 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHHIGHSTATE_TRUESTATE 10181 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHHIGHSTATE_FALSESTATE 10182 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHSTATE 10183 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHSTATE_ID 10184 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHSTATE_NAME 10185 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHSTATE_NUMBER 10186 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHSTATE_EFFECTIVEDISPLAYNAME 10187 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHSTATE_TRANSITIONTIME 10188 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHSTATE_EFFECTIVETRANSITIONTIME 10189 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHSTATE_TRUESTATE 10190 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHSTATE_FALSESTATE 10191 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWSTATE 10192 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWSTATE_ID 10193 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWSTATE_NAME 10194 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWSTATE_NUMBER 10195 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWSTATE_EFFECTIVEDISPLAYNAME 10196 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWSTATE_TRANSITIONTIME 10197 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWSTATE_EFFECTIVETRANSITIONTIME 10198 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWSTATE_TRUESTATE 10199 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWSTATE_FALSESTATE 10200 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWLOWSTATE 10201 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWLOWSTATE_ID 10202 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWLOWSTATE_NAME 10203 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWLOWSTATE_NUMBER 10204 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWLOWSTATE_EFFECTIVEDISPLAYNAME 10205 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWLOWSTATE_TRANSITIONTIME 10206 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWLOWSTATE_EFFECTIVETRANSITIONTIME 10207 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWLOWSTATE_TRUESTATE 10208 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWLOWSTATE_FALSESTATE 10209 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHHIGHLIMIT 10210 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_HIGHLIMIT 10211 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWLIMIT 10212 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LOWLOWLIMIT 10213 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE 10214 /* ObjectType */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_EVENTID 10215 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_EVENTTYPE 10216 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SOURCENODE 10217 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SOURCENAME 10218 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_TIME 10219 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_RECEIVETIME 10220 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOCALTIME 10221 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_MESSAGE 10222 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SEVERITY 10223 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONNAME 10224 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_BRANCHID 10225 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_RETAIN 10226 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE 10227 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_ID 10228 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_NAME 10229 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_NUMBER 10230 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 10231 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 10232 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 10233 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_TRUESTATE 10234 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ENABLEDSTATE_FALSESTATE 10235 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_QUALITY 10236 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_QUALITY_SOURCETIMESTAMP 10237 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LASTSEVERITY 10238 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 10239 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_COMMENT 10240 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_COMMENT_SOURCETIMESTAMP 10241 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CLIENTUSERID 10242 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ENABLE 10243 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_DISABLE 10244 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ADDCOMMENT 10245 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 10246 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONREFRESH 10247 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 10248 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE 10249 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_ID 10250 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_NAME 10251 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_NUMBER 10252 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 10253 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_TRANSITIONTIME 10254 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 10255 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_TRUESTATE 10256 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACKEDSTATE_FALSESTATE 10257 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE 10258 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_ID 10259 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_NAME 10260 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_NUMBER 10261 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 10262 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 10263 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 10264 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_TRUESTATE 10265 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRMEDSTATE_FALSESTATE 10266 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACKNOWLEDGE 10267 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 10268 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRM 10269 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONFIRM_INPUTARGUMENTS 10270 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE 10271 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_ID 10272 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_NAME 10273 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_NUMBER 10274 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 10275 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_TRANSITIONTIME 10276 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 10277 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_TRUESTATE 10278 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ACTIVESTATE_FALSESTATE 10279 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE 10280 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_ID 10281 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_NAME 10282 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_NUMBER 10283 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 10284 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 10285 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 10286 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 10287 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 10288 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE 10289 /* Object */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_CURRENTSTATE 10290 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 10291 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 10292 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 10293 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 10294 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_LASTTRANSITION 10295 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 10296 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 10297 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 10298 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 10299 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_UNSHELVETIME 10300 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_UNSHELVE 10322 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 10323 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 10324 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 10325 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESSEDORSHELVED 10326 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_MAXTIMESHELVED 10327 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHHIGHSTATE 10328 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHHIGHSTATE_ID 10329 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHHIGHSTATE_NAME 10330 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHHIGHSTATE_NUMBER 10331 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHHIGHSTATE_EFFECTIVEDISPLAYNAME 10332 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHHIGHSTATE_TRANSITIONTIME 10333 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHHIGHSTATE_EFFECTIVETRANSITIONTIME 10334 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHHIGHSTATE_TRUESTATE 10335 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHHIGHSTATE_FALSESTATE 10336 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHSTATE 10337 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHSTATE_ID 10338 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHSTATE_NAME 10339 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHSTATE_NUMBER 10340 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHSTATE_EFFECTIVEDISPLAYNAME 10341 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHSTATE_TRANSITIONTIME 10342 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHSTATE_EFFECTIVETRANSITIONTIME 10343 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHSTATE_TRUESTATE 10344 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHSTATE_FALSESTATE 10345 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWSTATE 10346 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWSTATE_ID 10347 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWSTATE_NAME 10348 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWSTATE_NUMBER 10349 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWSTATE_EFFECTIVEDISPLAYNAME 10350 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWSTATE_TRANSITIONTIME 10351 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWSTATE_EFFECTIVETRANSITIONTIME 10352 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWSTATE_TRUESTATE 10353 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWSTATE_FALSESTATE 10354 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWLOWSTATE 10355 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWLOWSTATE_ID 10356 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWLOWSTATE_NAME 10357 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWLOWSTATE_NUMBER 10358 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWLOWSTATE_EFFECTIVEDISPLAYNAME 10359 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWLOWSTATE_TRANSITIONTIME 10360 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWLOWSTATE_EFFECTIVETRANSITIONTIME 10361 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWLOWSTATE_TRUESTATE 10362 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWLOWSTATE_FALSESTATE 10363 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHHIGHLIMIT 10364 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_HIGHLIMIT 10365 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWLIMIT 10366 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LOWLOWLIMIT 10367 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE 10368 /* ObjectType */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_EVENTID 10369 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_EVENTTYPE 10370 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SOURCENODE 10371 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SOURCENAME 10372 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_TIME 10373 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_RECEIVETIME 10374 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOCALTIME 10375 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_MESSAGE 10376 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SEVERITY 10377 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONDITIONNAME 10378 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_BRANCHID 10379 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_RETAIN 10380 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE 10381 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_ID 10382 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_NAME 10383 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_NUMBER 10384 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 10385 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 10386 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 10387 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_TRUESTATE 10388 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ENABLEDSTATE_FALSESTATE 10389 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_QUALITY 10390 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_QUALITY_SOURCETIMESTAMP 10391 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LASTSEVERITY 10392 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 10393 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_COMMENT 10394 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_COMMENT_SOURCETIMESTAMP 10395 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CLIENTUSERID 10396 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ENABLE 10397 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_DISABLE 10398 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ADDCOMMENT 10399 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 10400 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONDITIONREFRESH 10401 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 10402 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE 10403 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_ID 10404 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_NAME 10405 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_NUMBER 10406 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 10407 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_TRANSITIONTIME 10408 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 10409 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_TRUESTATE 10410 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACKEDSTATE_FALSESTATE 10411 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE 10412 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_ID 10413 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_NAME 10414 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_NUMBER 10415 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 10416 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 10417 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 10418 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_TRUESTATE 10419 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONFIRMEDSTATE_FALSESTATE 10420 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACKNOWLEDGE 10421 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 10422 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONFIRM 10423 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONFIRM_INPUTARGUMENTS 10424 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE 10425 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_ID 10426 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_NAME 10427 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_NUMBER 10428 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 10429 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_TRANSITIONTIME 10430 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 10431 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_TRUESTATE 10432 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ACTIVESTATE_FALSESTATE 10433 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE 10434 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_ID 10435 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_NAME 10436 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_NUMBER 10437 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 10438 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 10439 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 10440 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 10441 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 10442 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE 10443 /* Object */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE 10444 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 10445 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 10446 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 10447 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 10448 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION 10449 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 10450 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 10451 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 10452 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 10453 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_UNSHELVETIME 10454 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_UNSHELVE 10476 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 10477 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 10478 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 10479 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SUPPRESSEDORSHELVED 10480 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_MAXTIMESHELVED 10481 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHHIGHSTATE 10482 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHHIGHSTATE_ID 10483 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHHIGHSTATE_NAME 10484 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHHIGHSTATE_NUMBER 10485 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHHIGHSTATE_EFFECTIVEDISPLAYNAME 10486 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHHIGHSTATE_TRANSITIONTIME 10487 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHHIGHSTATE_EFFECTIVETRANSITIONTIME 10488 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHHIGHSTATE_TRUESTATE 10489 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHHIGHSTATE_FALSESTATE 10490 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHSTATE 10491 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHSTATE_ID 10492 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHSTATE_NAME 10493 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHSTATE_NUMBER 10494 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHSTATE_EFFECTIVEDISPLAYNAME 10495 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHSTATE_TRANSITIONTIME 10496 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHSTATE_EFFECTIVETRANSITIONTIME 10497 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHSTATE_TRUESTATE 10498 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHSTATE_FALSESTATE 10499 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWSTATE 10500 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWSTATE_ID 10501 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWSTATE_NAME 10502 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWSTATE_NUMBER 10503 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWSTATE_EFFECTIVEDISPLAYNAME 10504 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWSTATE_TRANSITIONTIME 10505 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWSTATE_EFFECTIVETRANSITIONTIME 10506 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWSTATE_TRUESTATE 10507 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWSTATE_FALSESTATE 10508 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWLOWSTATE 10509 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWLOWSTATE_ID 10510 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWLOWSTATE_NAME 10511 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWLOWSTATE_NUMBER 10512 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWLOWSTATE_EFFECTIVEDISPLAYNAME 10513 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWLOWSTATE_TRANSITIONTIME 10514 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWLOWSTATE_EFFECTIVETRANSITIONTIME 10515 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWLOWSTATE_TRUESTATE 10516 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWLOWSTATE_FALSESTATE 10517 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHHIGHLIMIT 10518 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_HIGHLIMIT 10519 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWLIMIT 10520 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LOWLOWLIMIT 10521 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SETPOINTNODE 10522 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE 10523 /* ObjectType */ +#define UA_NS0ID_DISCRETEALARMTYPE_EVENTID 10524 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_EVENTTYPE 10525 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SOURCENODE 10526 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SOURCENAME 10527 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_TIME 10528 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_RECEIVETIME 10529 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_LOCALTIME 10530 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_MESSAGE 10531 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SEVERITY 10532 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONDITIONNAME 10533 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_BRANCHID 10534 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_RETAIN 10535 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ENABLEDSTATE 10536 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ENABLEDSTATE_ID 10537 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ENABLEDSTATE_NAME 10538 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ENABLEDSTATE_NUMBER 10539 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 10540 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 10541 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 10542 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ENABLEDSTATE_TRUESTATE 10543 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ENABLEDSTATE_FALSESTATE 10544 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_QUALITY 10545 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_QUALITY_SOURCETIMESTAMP 10546 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_LASTSEVERITY 10547 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 10548 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_COMMENT 10549 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_COMMENT_SOURCETIMESTAMP 10550 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CLIENTUSERID 10551 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ENABLE 10552 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_DISABLE 10553 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_ADDCOMMENT 10554 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 10555 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONDITIONREFRESH 10556 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 10557 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACKEDSTATE 10558 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACKEDSTATE_ID 10559 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACKEDSTATE_NAME 10560 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACKEDSTATE_NUMBER 10561 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 10562 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACKEDSTATE_TRANSITIONTIME 10563 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 10564 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACKEDSTATE_TRUESTATE 10565 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACKEDSTATE_FALSESTATE 10566 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONFIRMEDSTATE 10567 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONFIRMEDSTATE_ID 10568 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONFIRMEDSTATE_NAME 10569 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONFIRMEDSTATE_NUMBER 10570 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 10571 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 10572 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 10573 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONFIRMEDSTATE_TRUESTATE 10574 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONFIRMEDSTATE_FALSESTATE 10575 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACKNOWLEDGE 10576 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 10577 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONFIRM 10578 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONFIRM_INPUTARGUMENTS 10579 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACTIVESTATE 10580 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACTIVESTATE_ID 10581 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACTIVESTATE_NAME 10582 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACTIVESTATE_NUMBER 10583 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 10584 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACTIVESTATE_TRANSITIONTIME 10585 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 10586 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACTIVESTATE_TRUESTATE 10587 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ACTIVESTATE_FALSESTATE 10588 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SUPPRESSEDSTATE 10589 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SUPPRESSEDSTATE_ID 10590 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SUPPRESSEDSTATE_NAME 10591 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SUPPRESSEDSTATE_NUMBER 10592 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 10593 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 10594 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 10595 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 10596 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 10597 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE 10598 /* Object */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_CURRENTSTATE 10599 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 10600 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 10601 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 10602 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 10603 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_LASTTRANSITION 10604 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 10605 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 10606 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 10607 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 10608 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_UNSHELVETIME 10609 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_UNSHELVE 10631 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 10632 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 10633 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 10634 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SUPPRESSEDORSHELVED 10635 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_MAXTIMESHELVED 10636 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE 10637 /* ObjectType */ +#define UA_NS0ID_OFFNORMALALARMTYPE_EVENTID 10638 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_EVENTTYPE 10639 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SOURCENODE 10640 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SOURCENAME 10641 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_TIME 10642 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_RECEIVETIME 10643 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_LOCALTIME 10644 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_MESSAGE 10645 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SEVERITY 10646 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONDITIONNAME 10647 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_BRANCHID 10648 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_RETAIN 10649 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ENABLEDSTATE 10650 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ENABLEDSTATE_ID 10651 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ENABLEDSTATE_NAME 10652 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ENABLEDSTATE_NUMBER 10653 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 10654 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 10655 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 10656 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ENABLEDSTATE_TRUESTATE 10657 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ENABLEDSTATE_FALSESTATE 10658 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_QUALITY 10659 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_QUALITY_SOURCETIMESTAMP 10660 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_LASTSEVERITY 10661 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 10662 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_COMMENT 10663 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_COMMENT_SOURCETIMESTAMP 10664 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CLIENTUSERID 10665 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ENABLE 10666 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_DISABLE 10667 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ADDCOMMENT 10668 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 10669 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONDITIONREFRESH 10670 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 10671 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACKEDSTATE 10672 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACKEDSTATE_ID 10673 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACKEDSTATE_NAME 10674 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACKEDSTATE_NUMBER 10675 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 10676 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACKEDSTATE_TRANSITIONTIME 10677 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 10678 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACKEDSTATE_TRUESTATE 10679 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACKEDSTATE_FALSESTATE 10680 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONFIRMEDSTATE 10681 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONFIRMEDSTATE_ID 10682 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONFIRMEDSTATE_NAME 10683 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONFIRMEDSTATE_NUMBER 10684 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 10685 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 10686 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 10687 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONFIRMEDSTATE_TRUESTATE 10688 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONFIRMEDSTATE_FALSESTATE 10689 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACKNOWLEDGE 10690 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 10691 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONFIRM 10692 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONFIRM_INPUTARGUMENTS 10693 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACTIVESTATE 10694 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACTIVESTATE_ID 10695 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACTIVESTATE_NAME 10696 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACTIVESTATE_NUMBER 10697 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 10698 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACTIVESTATE_TRANSITIONTIME 10699 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 10700 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACTIVESTATE_TRUESTATE 10701 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ACTIVESTATE_FALSESTATE 10702 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SUPPRESSEDSTATE 10703 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SUPPRESSEDSTATE_ID 10704 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SUPPRESSEDSTATE_NAME 10705 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SUPPRESSEDSTATE_NUMBER 10706 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 10707 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 10708 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 10709 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 10710 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 10711 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE 10712 /* Object */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_CURRENTSTATE 10713 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 10714 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 10715 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 10716 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 10717 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_LASTTRANSITION 10718 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 10719 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 10720 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 10721 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 10722 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_UNSHELVETIME 10723 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_UNSHELVE 10745 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 10746 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 10747 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 10748 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SUPPRESSEDORSHELVED 10749 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_MAXTIMESHELVED 10750 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE 10751 /* ObjectType */ +#define UA_NS0ID_TRIPALARMTYPE_EVENTID 10752 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_EVENTTYPE 10753 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SOURCENODE 10754 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SOURCENAME 10755 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_TIME 10756 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_RECEIVETIME 10757 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_LOCALTIME 10758 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_MESSAGE 10759 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SEVERITY 10760 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONDITIONNAME 10761 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_BRANCHID 10762 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_RETAIN 10763 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ENABLEDSTATE 10764 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ENABLEDSTATE_ID 10765 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ENABLEDSTATE_NAME 10766 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ENABLEDSTATE_NUMBER 10767 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 10768 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 10769 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 10770 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ENABLEDSTATE_TRUESTATE 10771 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ENABLEDSTATE_FALSESTATE 10772 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_QUALITY 10773 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_QUALITY_SOURCETIMESTAMP 10774 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_LASTSEVERITY 10775 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 10776 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_COMMENT 10777 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_COMMENT_SOURCETIMESTAMP 10778 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CLIENTUSERID 10779 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ENABLE 10780 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_DISABLE 10781 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_ADDCOMMENT 10782 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 10783 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONDITIONREFRESH 10784 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 10785 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACKEDSTATE 10786 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACKEDSTATE_ID 10787 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACKEDSTATE_NAME 10788 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACKEDSTATE_NUMBER 10789 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 10790 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACKEDSTATE_TRANSITIONTIME 10791 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 10792 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACKEDSTATE_TRUESTATE 10793 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACKEDSTATE_FALSESTATE 10794 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONFIRMEDSTATE 10795 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONFIRMEDSTATE_ID 10796 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONFIRMEDSTATE_NAME 10797 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONFIRMEDSTATE_NUMBER 10798 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 10799 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 10800 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 10801 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONFIRMEDSTATE_TRUESTATE 10802 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONFIRMEDSTATE_FALSESTATE 10803 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACKNOWLEDGE 10804 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 10805 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONFIRM 10806 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_CONFIRM_INPUTARGUMENTS 10807 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACTIVESTATE 10808 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACTIVESTATE_ID 10809 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACTIVESTATE_NAME 10810 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACTIVESTATE_NUMBER 10811 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 10812 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACTIVESTATE_TRANSITIONTIME 10813 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 10814 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACTIVESTATE_TRUESTATE 10815 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_ACTIVESTATE_FALSESTATE 10816 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SUPPRESSEDSTATE 10817 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SUPPRESSEDSTATE_ID 10818 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SUPPRESSEDSTATE_NAME 10819 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SUPPRESSEDSTATE_NUMBER 10820 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 10821 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 10822 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 10823 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 10824 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 10825 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE 10826 /* Object */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_CURRENTSTATE 10827 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 10828 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 10829 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 10830 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 10831 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_LASTTRANSITION 10832 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 10833 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 10834 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 10835 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 10836 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_UNSHELVETIME 10837 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_UNSHELVE 10859 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 10860 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 10861 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 10862 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SUPPRESSEDORSHELVED 10863 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_MAXTIMESHELVED 10864 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE 11093 /* ObjectType */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_EVENTID 11094 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_EVENTTYPE 11095 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_SOURCENODE 11096 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_SOURCENAME 11097 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_TIME 11098 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_RECEIVETIME 11099 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_LOCALTIME 11100 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_MESSAGE 11101 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_SEVERITY 11102 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_ACTIONTIMESTAMP 11103 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_STATUS 11104 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_SERVERID 11105 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_CLIENTAUDITENTRYID 11106 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_CLIENTUSERID 11107 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_METHODID 11108 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_INPUTARGUMENTS 11109 /* Variable */ +#define UA_NS0ID_TWOSTATEVARIABLETYPE_TRUESTATE 11110 /* Variable */ +#define UA_NS0ID_TWOSTATEVARIABLETYPE_FALSESTATE 11111 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_CONDITIONCLASSID 11112 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_CONDITIONCLASSNAME 11113 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_CONDITIONCLASSID 11114 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_CONDITIONCLASSNAME 11115 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONDITIONCLASSID 11116 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONDITIONCLASSNAME 11117 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONDITIONCLASSID 11118 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONDITIONCLASSNAME 11119 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_INPUTNODE 11120 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONDITIONCLASSID 11121 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONDITIONCLASSNAME 11122 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_INPUTNODE 11123 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_HIGHHIGHLIMIT 11124 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_HIGHLIMIT 11125 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_LOWLIMIT 11126 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_LOWLOWLIMIT 11127 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONDITIONCLASSID 11128 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONDITIONCLASSNAME 11129 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_INPUTNODE 11130 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONDITIONCLASSID 11131 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONDITIONCLASSNAME 11132 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_INPUTNODE 11133 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONCLASSID 11134 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONCLASSNAME 11135 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_INPUTNODE 11136 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONDITIONCLASSID 11137 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONDITIONCLASSNAME 11138 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_INPUTNODE 11139 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONDITIONCLASSID 11140 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONDITIONCLASSNAME 11141 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_INPUTNODE 11142 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONDITIONCLASSID 11143 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONDITIONCLASSNAME 11144 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_INPUTNODE 11145 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONCLASSID 11146 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONCLASSNAME 11147 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_INPUTNODE 11148 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONDITIONCLASSID 11149 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONDITIONCLASSNAME 11150 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_INPUTNODE 11151 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONDITIONCLASSID 11152 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONDITIONCLASSNAME 11153 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_INPUTNODE 11154 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONDITIONCLASSID 11155 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONDITIONCLASSNAME 11156 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_INPUTNODE 11157 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_NORMALSTATE 11158 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONDITIONCLASSID 11159 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONDITIONCLASSNAME 11160 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_INPUTNODE 11161 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_NORMALSTATE 11162 /* Variable */ +#define UA_NS0ID_BASECONDITIONCLASSTYPE 11163 /* ObjectType */ +#define UA_NS0ID_PROCESSCONDITIONCLASSTYPE 11164 /* ObjectType */ +#define UA_NS0ID_MAINTENANCECONDITIONCLASSTYPE 11165 /* ObjectType */ +#define UA_NS0ID_SYSTEMCONDITIONCLASSTYPE 11166 /* ObjectType */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_AGGREGATECONFIGURATION_TREATUNCERTAINASBAD 11168 /* Variable */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_AGGREGATECONFIGURATION_PERCENTDATABAD 11169 /* Variable */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_AGGREGATECONFIGURATION_PERCENTDATAGOOD 11170 /* Variable */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_AGGREGATECONFIGURATION_USESLOPEDEXTRAPOLATION 11171 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_AGGREGATEFUNCTIONS 11172 /* Object */ +#define UA_NS0ID_AGGREGATECONFIGURATIONTYPE 11187 /* ObjectType */ +#define UA_NS0ID_AGGREGATECONFIGURATIONTYPE_TREATUNCERTAINASBAD 11188 /* Variable */ +#define UA_NS0ID_AGGREGATECONFIGURATIONTYPE_PERCENTDATABAD 11189 /* Variable */ +#define UA_NS0ID_AGGREGATECONFIGURATIONTYPE_PERCENTDATAGOOD 11190 /* Variable */ +#define UA_NS0ID_AGGREGATECONFIGURATIONTYPE_USESLOPEDEXTRAPOLATION 11191 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES 11192 /* Object */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_ACCESSHISTORYDATACAPABILITY 11193 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTDATACAPABILITY 11196 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_REPLACEDATACAPABILITY 11197 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_UPDATEDATACAPABILITY 11198 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_DELETERAWCAPABILITY 11199 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_DELETEATTIMECAPABILITY 11200 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_AGGREGATEFUNCTIONS 11201 /* Object */ +#define UA_NS0ID_HACONFIGURATION 11202 /* Object */ +#define UA_NS0ID_HACONFIGURATION_AGGREGATECONFIGURATION 11203 /* Object */ +#define UA_NS0ID_HACONFIGURATION_AGGREGATECONFIGURATION_TREATUNCERTAINASBAD 11204 /* Variable */ +#define UA_NS0ID_HACONFIGURATION_AGGREGATECONFIGURATION_PERCENTDATABAD 11205 /* Variable */ +#define UA_NS0ID_HACONFIGURATION_AGGREGATECONFIGURATION_PERCENTDATAGOOD 11206 /* Variable */ +#define UA_NS0ID_HACONFIGURATION_AGGREGATECONFIGURATION_USESLOPEDEXTRAPOLATION 11207 /* Variable */ +#define UA_NS0ID_HACONFIGURATION_STEPPED 11208 /* Variable */ +#define UA_NS0ID_HACONFIGURATION_DEFINITION 11209 /* Variable */ +#define UA_NS0ID_HACONFIGURATION_MAXTIMEINTERVAL 11210 /* Variable */ +#define UA_NS0ID_HACONFIGURATION_MINTIMEINTERVAL 11211 /* Variable */ +#define UA_NS0ID_HACONFIGURATION_EXCEPTIONDEVIATION 11212 /* Variable */ +#define UA_NS0ID_HACONFIGURATION_EXCEPTIONDEVIATIONFORMAT 11213 /* Variable */ +#define UA_NS0ID_ANNOTATIONS 11214 /* Variable */ +#define UA_NS0ID_HISTORICALEVENTFILTER 11215 /* Variable */ +#define UA_NS0ID_MODIFICATIONINFO 11216 /* DataType */ +#define UA_NS0ID_HISTORYMODIFIEDDATA 11217 /* DataType */ +#define UA_NS0ID_MODIFICATIONINFO_ENCODING_DEFAULTXML 11218 /* Object */ +#define UA_NS0ID_HISTORYMODIFIEDDATA_ENCODING_DEFAULTXML 11219 /* Object */ +#define UA_NS0ID_MODIFICATIONINFO_ENCODING_DEFAULTBINARY 11226 /* Object */ +#define UA_NS0ID_HISTORYMODIFIEDDATA_ENCODING_DEFAULTBINARY 11227 /* Object */ +#define UA_NS0ID_HISTORYUPDATETYPE 11234 /* DataType */ +#define UA_NS0ID_MULTISTATEVALUEDISCRETETYPE 11238 /* VariableType */ +#define UA_NS0ID_MULTISTATEVALUEDISCRETETYPE_DEFINITION 11239 /* Variable */ +#define UA_NS0ID_MULTISTATEVALUEDISCRETETYPE_VALUEPRECISION 11240 /* Variable */ +#define UA_NS0ID_MULTISTATEVALUEDISCRETETYPE_ENUMVALUES 11241 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_ACCESSHISTORYEVENTSCAPABILITY 11242 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_MAXRETURNDATAVALUES 11268 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_MAXRETURNEVENTVALUES 11269 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_INSERTANNOTATIONCAPABILITY 11270 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_MAXRETURNDATAVALUES 11273 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_MAXRETURNEVENTVALUES 11274 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTANNOTATIONCAPABILITY 11275 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_INSERTEVENTCAPABILITY 11278 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_REPLACEEVENTCAPABILITY 11279 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_UPDATEEVENTCAPABILITY 11280 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTEVENTCAPABILITY 11281 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_REPLACEEVENTCAPABILITY 11282 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_UPDATEEVENTCAPABILITY 11283 /* Variable */ +#define UA_NS0ID_AGGREGATEFUNCTION_TIMEAVERAGE2 11285 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_MINIMUM2 11286 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_MAXIMUM2 11287 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_RANGE2 11288 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_WORSTQUALITY2 11292 /* Object */ +#define UA_NS0ID_PERFORMUPDATETYPE 11293 /* DataType */ +#define UA_NS0ID_UPDATESTRUCTUREDATADETAILS 11295 /* DataType */ +#define UA_NS0ID_UPDATESTRUCTUREDATADETAILS_ENCODING_DEFAULTXML 11296 /* Object */ +#define UA_NS0ID_UPDATESTRUCTUREDATADETAILS_ENCODING_DEFAULTBINARY 11300 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_TOTAL2 11304 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_MINIMUMACTUALTIME2 11305 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_MAXIMUMACTUALTIME2 11306 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_DURATIONINSTATEZERO 11307 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_DURATIONINSTATENONZERO 11308 /* Object */ +#define UA_NS0ID_SERVER_SERVERREDUNDANCY_CURRENTSERVERID 11312 /* Variable */ +#define UA_NS0ID_SERVER_SERVERREDUNDANCY_REDUNDANTSERVERARRAY 11313 /* Variable */ +#define UA_NS0ID_SERVER_SERVERREDUNDANCY_SERVERURIARRAY 11314 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_UNSHELVEDTOTIMEDSHELVED_TRANSITIONNUMBER 11322 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_UNSHELVEDTOONESHOTSHELVED_TRANSITIONNUMBER 11323 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_TIMEDSHELVEDTOUNSHELVED_TRANSITIONNUMBER 11324 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_TIMEDSHELVEDTOONESHOTSHELVED_TRANSITIONNUMBER 11325 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_ONESHOTSHELVEDTOUNSHELVED_TRANSITIONNUMBER 11326 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_ONESHOTSHELVEDTOTIMEDSHELVED_TRANSITIONNUMBER 11327 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LOWLOWTOLOW_TRANSITIONNUMBER 11340 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LOWTOLOWLOW_TRANSITIONNUMBER 11341 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_HIGHHIGHTOHIGH_TRANSITIONNUMBER 11342 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_HIGHTOHIGHHIGH_TRANSITIONNUMBER 11343 /* Variable */ +#define UA_NS0ID_AGGREGATEFUNCTION_STANDARDDEVIATIONSAMPLE 11426 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_STANDARDDEVIATIONPOPULATION 11427 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_VARIANCESAMPLE 11428 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_VARIANCEPOPULATION 11429 /* Object */ +#define UA_NS0ID_ENUMSTRINGS 11432 /* Variable */ +#define UA_NS0ID_VALUEASTEXT 11433 /* Variable */ +#define UA_NS0ID_PROGRESSEVENTTYPE 11436 /* ObjectType */ +#define UA_NS0ID_PROGRESSEVENTTYPE_EVENTID 11437 /* Variable */ +#define UA_NS0ID_PROGRESSEVENTTYPE_EVENTTYPE 11438 /* Variable */ +#define UA_NS0ID_PROGRESSEVENTTYPE_SOURCENODE 11439 /* Variable */ +#define UA_NS0ID_PROGRESSEVENTTYPE_SOURCENAME 11440 /* Variable */ +#define UA_NS0ID_PROGRESSEVENTTYPE_TIME 11441 /* Variable */ +#define UA_NS0ID_PROGRESSEVENTTYPE_RECEIVETIME 11442 /* Variable */ +#define UA_NS0ID_PROGRESSEVENTTYPE_LOCALTIME 11443 /* Variable */ +#define UA_NS0ID_PROGRESSEVENTTYPE_MESSAGE 11444 /* Variable */ +#define UA_NS0ID_PROGRESSEVENTTYPE_SEVERITY 11445 /* Variable */ +#define UA_NS0ID_SYSTEMSTATUSCHANGEEVENTTYPE 11446 /* ObjectType */ +#define UA_NS0ID_SYSTEMSTATUSCHANGEEVENTTYPE_EVENTID 11447 /* Variable */ +#define UA_NS0ID_SYSTEMSTATUSCHANGEEVENTTYPE_EVENTTYPE 11448 /* Variable */ +#define UA_NS0ID_SYSTEMSTATUSCHANGEEVENTTYPE_SOURCENODE 11449 /* Variable */ +#define UA_NS0ID_SYSTEMSTATUSCHANGEEVENTTYPE_SOURCENAME 11450 /* Variable */ +#define UA_NS0ID_SYSTEMSTATUSCHANGEEVENTTYPE_TIME 11451 /* Variable */ +#define UA_NS0ID_SYSTEMSTATUSCHANGEEVENTTYPE_RECEIVETIME 11452 /* Variable */ +#define UA_NS0ID_SYSTEMSTATUSCHANGEEVENTTYPE_LOCALTIME 11453 /* Variable */ +#define UA_NS0ID_SYSTEMSTATUSCHANGEEVENTTYPE_MESSAGE 11454 /* Variable */ +#define UA_NS0ID_SYSTEMSTATUSCHANGEEVENTTYPE_SEVERITY 11455 /* Variable */ +#define UA_NS0ID_TRANSITIONVARIABLETYPE_EFFECTIVETRANSITIONTIME 11456 /* Variable */ +#define UA_NS0ID_FINITETRANSITIONVARIABLETYPE_EFFECTIVETRANSITIONTIME 11457 /* Variable */ +#define UA_NS0ID_STATEMACHINETYPE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11458 /* Variable */ +#define UA_NS0ID_FINITESTATEMACHINETYPE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11459 /* Variable */ +#define UA_NS0ID_TRANSITIONEVENTTYPE_TRANSITION_EFFECTIVETRANSITIONTIME 11460 /* Variable */ +#define UA_NS0ID_MULTISTATEVALUEDISCRETETYPE_VALUEASTEXT 11461 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONEVENTTYPE_TRANSITION_EFFECTIVETRANSITIONTIME 11462 /* Variable */ +#define UA_NS0ID_PROGRAMTRANSITIONAUDITEVENTTYPE_TRANSITION_EFFECTIVETRANSITIONTIME 11463 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11464 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11465 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11466 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11467 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11468 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11469 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11470 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11471 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11472 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11473 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11474 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11475 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11476 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11477 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11478 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11479 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11480 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11481 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11482 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11483 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_SECURECHANNELID 11485 /* Variable */ +#define UA_NS0ID_OPTIONSETTYPE 11487 /* VariableType */ +#define UA_NS0ID_OPTIONSETTYPE_OPTIONSETVALUES 11488 /* Variable */ +#define UA_NS0ID_SERVERTYPE_GETMONITOREDITEMS 11489 /* Method */ +#define UA_NS0ID_SERVERTYPE_GETMONITOREDITEMS_INPUTARGUMENTS 11490 /* Variable */ +#define UA_NS0ID_SERVERTYPE_GETMONITOREDITEMS_OUTPUTARGUMENTS 11491 /* Variable */ +#define UA_NS0ID_SERVER_GETMONITOREDITEMS 11492 /* Method */ +#define UA_NS0ID_SERVER_GETMONITOREDITEMS_INPUTARGUMENTS 11493 /* Variable */ +#define UA_NS0ID_SERVER_GETMONITOREDITEMS_OUTPUTARGUMENTS 11494 /* Variable */ +#define UA_NS0ID_GETMONITOREDITEMSMETHODTYPE 11495 /* Method */ +#define UA_NS0ID_GETMONITOREDITEMSMETHODTYPE_INPUTARGUMENTS 11496 /* Variable */ +#define UA_NS0ID_GETMONITOREDITEMSMETHODTYPE_OUTPUTARGUMENTS 11497 /* Variable */ +#define UA_NS0ID_MAXSTRINGLENGTH 11498 /* Variable */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_STARTOFARCHIVE 11499 /* Variable */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_STARTOFONLINEARCHIVE 11500 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIESTYPE_DELETEEVENTCAPABILITY 11501 /* Variable */ +#define UA_NS0ID_HISTORYSERVERCAPABILITIES_DELETEEVENTCAPABILITY 11502 /* Variable */ +#define UA_NS0ID_HACONFIGURATION_STARTOFARCHIVE 11503 /* Variable */ +#define UA_NS0ID_HACONFIGURATION_STARTOFONLINEARCHIVE 11504 /* Variable */ +#define UA_NS0ID_AGGREGATEFUNCTION_STARTBOUND 11505 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_ENDBOUND 11506 /* Object */ +#define UA_NS0ID_AGGREGATEFUNCTION_DELTABOUNDS 11507 /* Object */ +#define UA_NS0ID_MODELLINGRULE_OPTIONALPLACEHOLDER 11508 /* Object */ +#define UA_NS0ID_MODELLINGRULE_OPTIONALPLACEHOLDER_NAMINGRULE 11509 /* Variable */ +#define UA_NS0ID_MODELLINGRULE_MANDATORYPLACEHOLDER 11510 /* Object */ +#define UA_NS0ID_MODELLINGRULE_MANDATORYPLACEHOLDER_NAMINGRULE 11511 /* Variable */ +#define UA_NS0ID_MAXARRAYLENGTH 11512 /* Variable */ +#define UA_NS0ID_ENGINEERINGUNITS 11513 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_MAXARRAYLENGTH 11514 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_MAXSTRINGLENGTH 11515 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_OPERATIONLIMITS 11516 /* Object */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERREAD 11517 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERWRITE 11519 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERMETHODCALL 11521 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERBROWSE 11522 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERREGISTERNODES 11523 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERTRANSLATEBROWSEPATHSTONODEIDS 11524 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERNODEMANAGEMENT 11525 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_OPERATIONLIMITS_MAXMONITOREDITEMSPERCALL 11526 /* Variable */ +#define UA_NS0ID_SERVERTYPE_NAMESPACES 11527 /* Object */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_MAXARRAYLENGTH 11549 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_MAXSTRINGLENGTH 11550 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_OPERATIONLIMITS 11551 /* Object */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_OPERATIONLIMITS_MAXNODESPERREAD 11552 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_OPERATIONLIMITS_MAXNODESPERWRITE 11554 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_OPERATIONLIMITS_MAXNODESPERMETHODCALL 11556 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_OPERATIONLIMITS_MAXNODESPERBROWSE 11557 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_OPERATIONLIMITS_MAXNODESPERREGISTERNODES 11558 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_OPERATIONLIMITS_MAXNODESPERTRANSLATEBROWSEPATHSTONODEIDS 11559 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_OPERATIONLIMITS_MAXNODESPERNODEMANAGEMENT 11560 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_OPERATIONLIMITS_MAXMONITOREDITEMSPERCALL 11561 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_VENDORCAPABILITY_PLACEHOLDER 11562 /* Variable */ +#define UA_NS0ID_OPERATIONLIMITSTYPE 11564 /* ObjectType */ +#define UA_NS0ID_OPERATIONLIMITSTYPE_MAXNODESPERREAD 11565 /* Variable */ +#define UA_NS0ID_OPERATIONLIMITSTYPE_MAXNODESPERWRITE 11567 /* Variable */ +#define UA_NS0ID_OPERATIONLIMITSTYPE_MAXNODESPERMETHODCALL 11569 /* Variable */ +#define UA_NS0ID_OPERATIONLIMITSTYPE_MAXNODESPERBROWSE 11570 /* Variable */ +#define UA_NS0ID_OPERATIONLIMITSTYPE_MAXNODESPERREGISTERNODES 11571 /* Variable */ +#define UA_NS0ID_OPERATIONLIMITSTYPE_MAXNODESPERTRANSLATEBROWSEPATHSTONODEIDS 11572 /* Variable */ +#define UA_NS0ID_OPERATIONLIMITSTYPE_MAXNODESPERNODEMANAGEMENT 11573 /* Variable */ +#define UA_NS0ID_OPERATIONLIMITSTYPE_MAXMONITOREDITEMSPERCALL 11574 /* Variable */ +#define UA_NS0ID_FILETYPE 11575 /* ObjectType */ +#define UA_NS0ID_FILETYPE_SIZE 11576 /* Variable */ +#define UA_NS0ID_FILETYPE_OPENCOUNT 11579 /* Variable */ +#define UA_NS0ID_FILETYPE_OPEN 11580 /* Method */ +#define UA_NS0ID_FILETYPE_OPEN_INPUTARGUMENTS 11581 /* Variable */ +#define UA_NS0ID_FILETYPE_OPEN_OUTPUTARGUMENTS 11582 /* Variable */ +#define UA_NS0ID_FILETYPE_CLOSE 11583 /* Method */ +#define UA_NS0ID_FILETYPE_CLOSE_INPUTARGUMENTS 11584 /* Variable */ +#define UA_NS0ID_FILETYPE_READ 11585 /* Method */ +#define UA_NS0ID_FILETYPE_READ_INPUTARGUMENTS 11586 /* Variable */ +#define UA_NS0ID_FILETYPE_READ_OUTPUTARGUMENTS 11587 /* Variable */ +#define UA_NS0ID_FILETYPE_WRITE 11588 /* Method */ +#define UA_NS0ID_FILETYPE_WRITE_INPUTARGUMENTS 11589 /* Variable */ +#define UA_NS0ID_FILETYPE_GETPOSITION 11590 /* Method */ +#define UA_NS0ID_FILETYPE_GETPOSITION_INPUTARGUMENTS 11591 /* Variable */ +#define UA_NS0ID_FILETYPE_GETPOSITION_OUTPUTARGUMENTS 11592 /* Variable */ +#define UA_NS0ID_FILETYPE_SETPOSITION 11593 /* Method */ +#define UA_NS0ID_FILETYPE_SETPOSITION_INPUTARGUMENTS 11594 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE 11595 /* ObjectType */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_SIZE 11596 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_OPENCOUNT 11599 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_OPEN 11600 /* Method */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_OPEN_INPUTARGUMENTS 11601 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_OPEN_OUTPUTARGUMENTS 11602 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_CLOSE 11603 /* Method */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_CLOSE_INPUTARGUMENTS 11604 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_READ 11605 /* Method */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_READ_INPUTARGUMENTS 11606 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_READ_OUTPUTARGUMENTS 11607 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_WRITE 11608 /* Method */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_WRITE_INPUTARGUMENTS 11609 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_GETPOSITION 11610 /* Method */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_GETPOSITION_INPUTARGUMENTS 11611 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_GETPOSITION_OUTPUTARGUMENTS 11612 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_SETPOSITION 11613 /* Method */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_SETPOSITION_INPUTARGUMENTS 11614 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_EXPORTNAMESPACE 11615 /* Method */ +#define UA_NS0ID_NAMESPACEMETADATATYPE 11616 /* ObjectType */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEURI 11617 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEVERSION 11618 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEPUBLICATIONDATE 11619 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_ISNAMESPACESUBSET 11620 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_STATICNODEIDTYPES 11621 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_STATICNUMERICNODEIDRANGE 11622 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_STATICSTRINGNODEIDPATTERN 11623 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE 11624 /* Object */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_SIZE 11625 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_OPENCOUNT 11628 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_OPEN 11629 /* Method */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_OPEN_INPUTARGUMENTS 11630 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_OPEN_OUTPUTARGUMENTS 11631 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_CLOSE 11632 /* Method */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_CLOSE_INPUTARGUMENTS 11633 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_READ 11634 /* Method */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_READ_INPUTARGUMENTS 11635 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_READ_OUTPUTARGUMENTS 11636 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_WRITE 11637 /* Method */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_WRITE_INPUTARGUMENTS 11638 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_GETPOSITION 11639 /* Method */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_GETPOSITION_INPUTARGUMENTS 11640 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_GETPOSITION_OUTPUTARGUMENTS 11641 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_SETPOSITION 11642 /* Method */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_SETPOSITION_INPUTARGUMENTS 11643 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_EXPORTNAMESPACE 11644 /* Method */ +#define UA_NS0ID_NAMESPACESTYPE 11645 /* ObjectType */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER 11646 /* Object */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEURI 11647 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEVERSION 11648 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEPUBLICATIONDATE 11649 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_ISNAMESPACESUBSET 11650 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_STATICNODEIDTYPES 11651 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_STATICNUMERICNODEIDRANGE 11652 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_STATICSTRINGNODEIDPATTERN 11653 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE 11654 /* Object */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_SIZE 11655 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_OPENCOUNT 11658 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_OPEN 11659 /* Method */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_OPEN_INPUTARGUMENTS 11660 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_OPEN_OUTPUTARGUMENTS 11661 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_CLOSE 11662 /* Method */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_CLOSE_INPUTARGUMENTS 11663 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_READ 11664 /* Method */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_READ_INPUTARGUMENTS 11665 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_READ_OUTPUTARGUMENTS 11666 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_WRITE 11667 /* Method */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_WRITE_INPUTARGUMENTS 11668 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_GETPOSITION 11669 /* Method */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_GETPOSITION_INPUTARGUMENTS 11670 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_GETPOSITION_OUTPUTARGUMENTS 11671 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_SETPOSITION 11672 /* Method */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_SETPOSITION_INPUTARGUMENTS 11673 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_EXPORTNAMESPACE 11674 /* Method */ +#define UA_NS0ID_SYSTEMSTATUSCHANGEEVENTTYPE_SYSTEMSTATE 11696 /* Variable */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSTYPE_SAMPLEDMONITOREDITEMSCOUNT 11697 /* Variable */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSTYPE_MAXSAMPLEDMONITOREDITEMSCOUNT 11698 /* Variable */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSTYPE_DISABLEDMONITOREDITEMSSAMPLINGCOUNT 11699 /* Variable */ +#define UA_NS0ID_OPTIONSETTYPE_BITMASK 11701 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXARRAYLENGTH 11702 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXSTRINGLENGTH 11703 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS 11704 /* Object */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERREAD 11705 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERWRITE 11707 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERMETHODCALL 11709 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERBROWSE 11710 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERREGISTERNODES 11711 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERTRANSLATEBROWSEPATHSTONODEIDS 11712 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERNODEMANAGEMENT 11713 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXMONITOREDITEMSPERCALL 11714 /* Variable */ +#define UA_NS0ID_SERVER_NAMESPACES 11715 /* Object */ +#define UA_NS0ID_BITFIELDMASKDATATYPE 11737 /* DataType */ +#define UA_NS0ID_OPENMETHODTYPE 11738 /* Method */ +#define UA_NS0ID_OPENMETHODTYPE_INPUTARGUMENTS 11739 /* Variable */ +#define UA_NS0ID_OPENMETHODTYPE_OUTPUTARGUMENTS 11740 /* Variable */ +#define UA_NS0ID_CLOSEMETHODTYPE 11741 /* Method */ +#define UA_NS0ID_CLOSEMETHODTYPE_INPUTARGUMENTS 11742 /* Variable */ +#define UA_NS0ID_READMETHODTYPE 11743 /* Method */ +#define UA_NS0ID_READMETHODTYPE_INPUTARGUMENTS 11744 /* Variable */ +#define UA_NS0ID_READMETHODTYPE_OUTPUTARGUMENTS 11745 /* Variable */ +#define UA_NS0ID_WRITEMETHODTYPE 11746 /* Method */ +#define UA_NS0ID_WRITEMETHODTYPE_INPUTARGUMENTS 11747 /* Variable */ +#define UA_NS0ID_GETPOSITIONMETHODTYPE 11748 /* Method */ +#define UA_NS0ID_GETPOSITIONMETHODTYPE_INPUTARGUMENTS 11749 /* Variable */ +#define UA_NS0ID_GETPOSITIONMETHODTYPE_OUTPUTARGUMENTS 11750 /* Variable */ +#define UA_NS0ID_SETPOSITIONMETHODTYPE 11751 /* Method */ +#define UA_NS0ID_SETPOSITIONMETHODTYPE_INPUTARGUMENTS 11752 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE 11753 /* ObjectType */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_EVENTID 11754 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_EVENTTYPE 11755 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SOURCENODE 11756 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SOURCENAME 11757 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_TIME 11758 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_RECEIVETIME 11759 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_LOCALTIME 11760 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_MESSAGE 11761 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SEVERITY 11762 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONDITIONCLASSID 11763 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONDITIONCLASSNAME 11764 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONDITIONNAME 11765 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_BRANCHID 11766 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_RETAIN 11767 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ENABLEDSTATE 11768 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ENABLEDSTATE_ID 11769 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ENABLEDSTATE_NAME 11770 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ENABLEDSTATE_NUMBER 11771 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 11772 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 11773 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 11774 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ENABLEDSTATE_TRUESTATE 11775 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ENABLEDSTATE_FALSESTATE 11776 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_QUALITY 11777 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_QUALITY_SOURCETIMESTAMP 11778 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_LASTSEVERITY 11779 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 11780 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_COMMENT 11781 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_COMMENT_SOURCETIMESTAMP 11782 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CLIENTUSERID 11783 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_DISABLE 11784 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ENABLE 11785 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ADDCOMMENT 11786 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 11787 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONDITIONREFRESH 11788 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 11789 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACKEDSTATE 11790 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACKEDSTATE_ID 11791 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACKEDSTATE_NAME 11792 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACKEDSTATE_NUMBER 11793 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 11794 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACKEDSTATE_TRANSITIONTIME 11795 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 11796 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACKEDSTATE_TRUESTATE 11797 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACKEDSTATE_FALSESTATE 11798 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONFIRMEDSTATE 11799 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONFIRMEDSTATE_ID 11800 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONFIRMEDSTATE_NAME 11801 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONFIRMEDSTATE_NUMBER 11802 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 11803 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 11804 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 11805 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONFIRMEDSTATE_TRUESTATE 11806 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONFIRMEDSTATE_FALSESTATE 11807 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACKNOWLEDGE 11808 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 11809 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONFIRM 11810 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONFIRM_INPUTARGUMENTS 11811 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACTIVESTATE 11812 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACTIVESTATE_ID 11813 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACTIVESTATE_NAME 11814 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACTIVESTATE_NUMBER 11815 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 11816 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACTIVESTATE_TRANSITIONTIME 11817 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 11818 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACTIVESTATE_TRUESTATE 11819 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ACTIVESTATE_FALSESTATE 11820 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_INPUTNODE 11821 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SUPPRESSEDSTATE 11822 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SUPPRESSEDSTATE_ID 11823 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SUPPRESSEDSTATE_NAME 11824 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SUPPRESSEDSTATE_NUMBER 11825 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 11826 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 11827 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 11828 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 11829 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 11830 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE 11831 /* Object */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_CURRENTSTATE 11832 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 11833 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 11834 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 11835 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 11836 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_LASTTRANSITION 11837 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 11838 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 11839 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 11840 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 11841 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 11842 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_UNSHELVETIME 11843 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_UNSHELVE 11844 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 11845 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 11846 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 11847 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SUPPRESSEDORSHELVED 11848 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_MAXTIMESHELVED 11849 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_NORMALSTATE 11850 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_COMMENT 11851 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESPONDEVENTTYPE_SELECTEDRESPONSE 11852 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_COMMENT 11853 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_COMMENT 11854 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSHELVINGEVENTTYPE_SHELVINGTIME 11855 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE 11856 /* ObjectType */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_EVENTID 11857 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_EVENTTYPE 11858 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_SOURCENODE 11859 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_SOURCENAME 11860 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_TIME 11861 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_RECEIVETIME 11862 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_LOCALTIME 11863 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_MESSAGE 11864 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_SEVERITY 11865 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_ACTIONTIMESTAMP 11866 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_STATUS 11867 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_SERVERID 11868 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_CLIENTAUDITENTRYID 11869 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_CLIENTUSERID 11870 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_METHODID 11871 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_INPUTARGUMENTS 11872 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_OLDSTATEID 11873 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_NEWSTATEID 11874 /* Variable */ +#define UA_NS0ID_AUDITPROGRAMTRANSITIONEVENTTYPE_TRANSITIONNUMBER 11875 /* Variable */ +#define UA_NS0ID_HISTORICALDATACONFIGURATIONTYPE_AGGREGATEFUNCTIONS 11876 /* Object */ +#define UA_NS0ID_HACONFIGURATION_AGGREGATEFUNCTIONS 11877 /* Object */ +#define UA_NS0ID_NODECLASS_ENUMVALUES 11878 /* Variable */ +#define UA_NS0ID_INSTANCENODE 11879 /* DataType */ +#define UA_NS0ID_TYPENODE 11880 /* DataType */ +#define UA_NS0ID_NODEATTRIBUTESMASK_ENUMVALUES 11881 /* Variable */ +#define UA_NS0ID_BROWSERESULTMASK_ENUMVALUES 11883 /* Variable */ +#define UA_NS0ID_HISTORYUPDATETYPE_ENUMVALUES 11884 /* Variable */ +#define UA_NS0ID_PERFORMUPDATETYPE_ENUMVALUES 11885 /* Variable */ +#define UA_NS0ID_INSTANCENODE_ENCODING_DEFAULTXML 11887 /* Object */ +#define UA_NS0ID_TYPENODE_ENCODING_DEFAULTXML 11888 /* Object */ +#define UA_NS0ID_INSTANCENODE_ENCODING_DEFAULTBINARY 11889 /* Object */ +#define UA_NS0ID_TYPENODE_ENCODING_DEFAULTBINARY 11890 /* Object */ +#define UA_NS0ID_SESSIONDIAGNOSTICSOBJECTTYPE_SESSIONDIAGNOSTICS_UNAUTHORIZEDREQUESTCOUNT 11891 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSVARIABLETYPE_UNAUTHORIZEDREQUESTCOUNT 11892 /* Variable */ +#define UA_NS0ID_OPENFILEMODE 11939 /* DataType */ +#define UA_NS0ID_OPENFILEMODE_ENUMVALUES 11940 /* Variable */ +#define UA_NS0ID_MODELCHANGESTRUCTUREVERBMASK 11941 /* DataType */ +#define UA_NS0ID_MODELCHANGESTRUCTUREVERBMASK_ENUMVALUES 11942 /* Variable */ +#define UA_NS0ID_ENDPOINTURLLISTDATATYPE 11943 /* DataType */ +#define UA_NS0ID_NETWORKGROUPDATATYPE 11944 /* DataType */ +#define UA_NS0ID_NONTRANSPARENTNETWORKREDUNDANCYTYPE 11945 /* ObjectType */ +#define UA_NS0ID_NONTRANSPARENTNETWORKREDUNDANCYTYPE_REDUNDANCYSUPPORT 11946 /* Variable */ +#define UA_NS0ID_NONTRANSPARENTNETWORKREDUNDANCYTYPE_SERVERURIARRAY 11947 /* Variable */ +#define UA_NS0ID_NONTRANSPARENTNETWORKREDUNDANCYTYPE_SERVERNETWORKGROUPS 11948 /* Variable */ +#define UA_NS0ID_ENDPOINTURLLISTDATATYPE_ENCODING_DEFAULTXML 11949 /* Object */ +#define UA_NS0ID_NETWORKGROUPDATATYPE_ENCODING_DEFAULTXML 11950 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENDPOINTURLLISTDATATYPE 11951 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENDPOINTURLLISTDATATYPE_DATATYPEVERSION 11952 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENDPOINTURLLISTDATATYPE_DICTIONARYFRAGMENT 11953 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_NETWORKGROUPDATATYPE 11954 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_NETWORKGROUPDATATYPE_DATATYPEVERSION 11955 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_NETWORKGROUPDATATYPE_DICTIONARYFRAGMENT 11956 /* Variable */ +#define UA_NS0ID_ENDPOINTURLLISTDATATYPE_ENCODING_DEFAULTBINARY 11957 /* Object */ +#define UA_NS0ID_NETWORKGROUPDATATYPE_ENCODING_DEFAULTBINARY 11958 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENDPOINTURLLISTDATATYPE 11959 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENDPOINTURLLISTDATATYPE_DATATYPEVERSION 11960 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENDPOINTURLLISTDATATYPE_DICTIONARYFRAGMENT 11961 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_NETWORKGROUPDATATYPE 11962 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_NETWORKGROUPDATATYPE_DATATYPEVERSION 11963 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_NETWORKGROUPDATATYPE_DICTIONARYFRAGMENT 11964 /* Variable */ +#define UA_NS0ID_ARRAYITEMTYPE 12021 /* VariableType */ +#define UA_NS0ID_ARRAYITEMTYPE_DEFINITION 12022 /* Variable */ +#define UA_NS0ID_ARRAYITEMTYPE_VALUEPRECISION 12023 /* Variable */ +#define UA_NS0ID_ARRAYITEMTYPE_INSTRUMENTRANGE 12024 /* Variable */ +#define UA_NS0ID_ARRAYITEMTYPE_EURANGE 12025 /* Variable */ +#define UA_NS0ID_ARRAYITEMTYPE_ENGINEERINGUNITS 12026 /* Variable */ +#define UA_NS0ID_ARRAYITEMTYPE_TITLE 12027 /* Variable */ +#define UA_NS0ID_ARRAYITEMTYPE_AXISSCALETYPE 12028 /* Variable */ +#define UA_NS0ID_YARRAYITEMTYPE 12029 /* VariableType */ +#define UA_NS0ID_YARRAYITEMTYPE_DEFINITION 12030 /* Variable */ +#define UA_NS0ID_YARRAYITEMTYPE_VALUEPRECISION 12031 /* Variable */ +#define UA_NS0ID_YARRAYITEMTYPE_INSTRUMENTRANGE 12032 /* Variable */ +#define UA_NS0ID_YARRAYITEMTYPE_EURANGE 12033 /* Variable */ +#define UA_NS0ID_YARRAYITEMTYPE_ENGINEERINGUNITS 12034 /* Variable */ +#define UA_NS0ID_YARRAYITEMTYPE_TITLE 12035 /* Variable */ +#define UA_NS0ID_YARRAYITEMTYPE_AXISSCALETYPE 12036 /* Variable */ +#define UA_NS0ID_YARRAYITEMTYPE_XAXISDEFINITION 12037 /* Variable */ +#define UA_NS0ID_XYARRAYITEMTYPE 12038 /* VariableType */ +#define UA_NS0ID_XYARRAYITEMTYPE_DEFINITION 12039 /* Variable */ +#define UA_NS0ID_XYARRAYITEMTYPE_VALUEPRECISION 12040 /* Variable */ +#define UA_NS0ID_XYARRAYITEMTYPE_INSTRUMENTRANGE 12041 /* Variable */ +#define UA_NS0ID_XYARRAYITEMTYPE_EURANGE 12042 /* Variable */ +#define UA_NS0ID_XYARRAYITEMTYPE_ENGINEERINGUNITS 12043 /* Variable */ +#define UA_NS0ID_XYARRAYITEMTYPE_TITLE 12044 /* Variable */ +#define UA_NS0ID_XYARRAYITEMTYPE_AXISSCALETYPE 12045 /* Variable */ +#define UA_NS0ID_XYARRAYITEMTYPE_XAXISDEFINITION 12046 /* Variable */ +#define UA_NS0ID_IMAGEITEMTYPE 12047 /* VariableType */ +#define UA_NS0ID_IMAGEITEMTYPE_DEFINITION 12048 /* Variable */ +#define UA_NS0ID_IMAGEITEMTYPE_VALUEPRECISION 12049 /* Variable */ +#define UA_NS0ID_IMAGEITEMTYPE_INSTRUMENTRANGE 12050 /* Variable */ +#define UA_NS0ID_IMAGEITEMTYPE_EURANGE 12051 /* Variable */ +#define UA_NS0ID_IMAGEITEMTYPE_ENGINEERINGUNITS 12052 /* Variable */ +#define UA_NS0ID_IMAGEITEMTYPE_TITLE 12053 /* Variable */ +#define UA_NS0ID_IMAGEITEMTYPE_AXISSCALETYPE 12054 /* Variable */ +#define UA_NS0ID_IMAGEITEMTYPE_XAXISDEFINITION 12055 /* Variable */ +#define UA_NS0ID_IMAGEITEMTYPE_YAXISDEFINITION 12056 /* Variable */ +#define UA_NS0ID_CUBEITEMTYPE 12057 /* VariableType */ +#define UA_NS0ID_CUBEITEMTYPE_DEFINITION 12058 /* Variable */ +#define UA_NS0ID_CUBEITEMTYPE_VALUEPRECISION 12059 /* Variable */ +#define UA_NS0ID_CUBEITEMTYPE_INSTRUMENTRANGE 12060 /* Variable */ +#define UA_NS0ID_CUBEITEMTYPE_EURANGE 12061 /* Variable */ +#define UA_NS0ID_CUBEITEMTYPE_ENGINEERINGUNITS 12062 /* Variable */ +#define UA_NS0ID_CUBEITEMTYPE_TITLE 12063 /* Variable */ +#define UA_NS0ID_CUBEITEMTYPE_AXISSCALETYPE 12064 /* Variable */ +#define UA_NS0ID_CUBEITEMTYPE_XAXISDEFINITION 12065 /* Variable */ +#define UA_NS0ID_CUBEITEMTYPE_YAXISDEFINITION 12066 /* Variable */ +#define UA_NS0ID_CUBEITEMTYPE_ZAXISDEFINITION 12067 /* Variable */ +#define UA_NS0ID_NDIMENSIONARRAYITEMTYPE 12068 /* VariableType */ +#define UA_NS0ID_NDIMENSIONARRAYITEMTYPE_DEFINITION 12069 /* Variable */ +#define UA_NS0ID_NDIMENSIONARRAYITEMTYPE_VALUEPRECISION 12070 /* Variable */ +#define UA_NS0ID_NDIMENSIONARRAYITEMTYPE_INSTRUMENTRANGE 12071 /* Variable */ +#define UA_NS0ID_NDIMENSIONARRAYITEMTYPE_EURANGE 12072 /* Variable */ +#define UA_NS0ID_NDIMENSIONARRAYITEMTYPE_ENGINEERINGUNITS 12073 /* Variable */ +#define UA_NS0ID_NDIMENSIONARRAYITEMTYPE_TITLE 12074 /* Variable */ +#define UA_NS0ID_NDIMENSIONARRAYITEMTYPE_AXISSCALETYPE 12075 /* Variable */ +#define UA_NS0ID_NDIMENSIONARRAYITEMTYPE_AXISDEFINITION 12076 /* Variable */ +#define UA_NS0ID_AXISSCALEENUMERATION 12077 /* DataType */ +#define UA_NS0ID_AXISSCALEENUMERATION_ENUMSTRINGS 12078 /* Variable */ +#define UA_NS0ID_AXISINFORMATION 12079 /* DataType */ +#define UA_NS0ID_XVTYPE 12080 /* DataType */ +#define UA_NS0ID_AXISINFORMATION_ENCODING_DEFAULTXML 12081 /* Object */ +#define UA_NS0ID_XVTYPE_ENCODING_DEFAULTXML 12082 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_AXISINFORMATION 12083 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_AXISINFORMATION_DATATYPEVERSION 12084 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_AXISINFORMATION_DICTIONARYFRAGMENT 12085 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_XVTYPE 12086 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_XVTYPE_DATATYPEVERSION 12087 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_XVTYPE_DICTIONARYFRAGMENT 12088 /* Variable */ +#define UA_NS0ID_AXISINFORMATION_ENCODING_DEFAULTBINARY 12089 /* Object */ +#define UA_NS0ID_XVTYPE_ENCODING_DEFAULTBINARY 12090 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_AXISINFORMATION 12091 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_AXISINFORMATION_DATATYPEVERSION 12092 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_AXISINFORMATION_DICTIONARYFRAGMENT 12093 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_XVTYPE 12094 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_XVTYPE_DATATYPEVERSION 12095 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_XVTYPE_DICTIONARYFRAGMENT 12096 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER 12097 /* Object */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS 12098 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_SESSIONID 12099 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_SESSIONNAME 12100 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_CLIENTDESCRIPTION 12101 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_SERVERURI 12102 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_ENDPOINTURL 12103 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_LOCALEIDS 12104 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_ACTUALSESSIONTIMEOUT 12105 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_MAXRESPONSEMESSAGESIZE 12106 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_CLIENTCONNECTIONTIME 12107 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_CLIENTLASTCONTACTTIME 12108 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_CURRENTSUBSCRIPTIONSCOUNT 12109 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_CURRENTMONITOREDITEMSCOUNT 12110 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_CURRENTPUBLISHREQUESTSINQUEUE 12111 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_TOTALREQUESTCOUNT 12112 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_UNAUTHORIZEDREQUESTCOUNT 12113 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_READCOUNT 12114 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_HISTORYREADCOUNT 12115 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_WRITECOUNT 12116 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_HISTORYUPDATECOUNT 12117 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_CALLCOUNT 12118 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_CREATEMONITOREDITEMSCOUNT 12119 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_MODIFYMONITOREDITEMSCOUNT 12120 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_SETMONITORINGMODECOUNT 12121 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_SETTRIGGERINGCOUNT 12122 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_DELETEMONITOREDITEMSCOUNT 12123 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_CREATESUBSCRIPTIONCOUNT 12124 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_MODIFYSUBSCRIPTIONCOUNT 12125 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_SETPUBLISHINGMODECOUNT 12126 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_PUBLISHCOUNT 12127 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_REPUBLISHCOUNT 12128 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_TRANSFERSUBSCRIPTIONSCOUNT 12129 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_DELETESUBSCRIPTIONSCOUNT 12130 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_ADDNODESCOUNT 12131 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_ADDREFERENCESCOUNT 12132 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_DELETENODESCOUNT 12133 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_DELETEREFERENCESCOUNT 12134 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_BROWSECOUNT 12135 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_BROWSENEXTCOUNT 12136 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_TRANSLATEBROWSEPATHSTONODEIDSCOUNT 12137 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_QUERYFIRSTCOUNT 12138 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_QUERYNEXTCOUNT 12139 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_REGISTERNODESCOUNT 12140 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONDIAGNOSTICS_UNREGISTERNODESCOUNT 12141 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONSECURITYDIAGNOSTICS 12142 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONSECURITYDIAGNOSTICS_SESSIONID 12143 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONSECURITYDIAGNOSTICS_CLIENTUSERIDOFSESSION 12144 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONSECURITYDIAGNOSTICS_CLIENTUSERIDHISTORY 12145 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONSECURITYDIAGNOSTICS_AUTHENTICATIONMECHANISM 12146 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONSECURITYDIAGNOSTICS_ENCODING 12147 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONSECURITYDIAGNOSTICS_TRANSPORTPROTOCOL 12148 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONSECURITYDIAGNOSTICS_SECURITYMODE 12149 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONSECURITYDIAGNOSTICS_SECURITYPOLICYURI 12150 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SESSIONSECURITYDIAGNOSTICS_CLIENTCERTIFICATE 12151 /* Variable */ +#define UA_NS0ID_SESSIONSDIAGNOSTICSSUMMARYTYPE_CLIENTNAME_PLACEHOLDER_SUBSCRIPTIONDIAGNOSTICSARRAY 12152 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYREADDATA 12153 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYREADEVENTS 12154 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEDATA 12155 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEEVENTS 12156 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_OPERATIONLIMITS_MAXNODESPERHISTORYREADDATA 12157 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_OPERATIONLIMITS_MAXNODESPERHISTORYREADEVENTS 12158 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEDATA 12159 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEEVENTS 12160 /* Variable */ +#define UA_NS0ID_OPERATIONLIMITSTYPE_MAXNODESPERHISTORYREADDATA 12161 /* Variable */ +#define UA_NS0ID_OPERATIONLIMITSTYPE_MAXNODESPERHISTORYREADEVENTS 12162 /* Variable */ +#define UA_NS0ID_OPERATIONLIMITSTYPE_MAXNODESPERHISTORYUPDATEDATA 12163 /* Variable */ +#define UA_NS0ID_OPERATIONLIMITSTYPE_MAXNODESPERHISTORYUPDATEEVENTS 12164 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYREADDATA 12165 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYREADEVENTS 12166 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEDATA 12167 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEEVENTS 12168 /* Variable */ +#define UA_NS0ID_NAMINGRULETYPE_ENUMVALUES 12169 /* Variable */ +#define UA_NS0ID_VIEWVERSION 12170 /* Variable */ +#define UA_NS0ID_COMPLEXNUMBERTYPE 12171 /* DataType */ +#define UA_NS0ID_DOUBLECOMPLEXNUMBERTYPE 12172 /* DataType */ +#define UA_NS0ID_COMPLEXNUMBERTYPE_ENCODING_DEFAULTXML 12173 /* Object */ +#define UA_NS0ID_DOUBLECOMPLEXNUMBERTYPE_ENCODING_DEFAULTXML 12174 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_COMPLEXNUMBERTYPE 12175 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_COMPLEXNUMBERTYPE_DATATYPEVERSION 12176 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_COMPLEXNUMBERTYPE_DICTIONARYFRAGMENT 12177 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DOUBLECOMPLEXNUMBERTYPE 12178 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DOUBLECOMPLEXNUMBERTYPE_DATATYPEVERSION 12179 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DOUBLECOMPLEXNUMBERTYPE_DICTIONARYFRAGMENT 12180 /* Variable */ +#define UA_NS0ID_COMPLEXNUMBERTYPE_ENCODING_DEFAULTBINARY 12181 /* Object */ +#define UA_NS0ID_DOUBLECOMPLEXNUMBERTYPE_ENCODING_DEFAULTBINARY 12182 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_COMPLEXNUMBERTYPE 12183 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_COMPLEXNUMBERTYPE_DATATYPEVERSION 12184 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_COMPLEXNUMBERTYPE_DICTIONARYFRAGMENT 12185 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DOUBLECOMPLEXNUMBERTYPE 12186 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DOUBLECOMPLEXNUMBERTYPE_DATATYPEVERSION 12187 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DOUBLECOMPLEXNUMBERTYPE_DICTIONARYFRAGMENT 12188 /* Variable */ +#define UA_NS0ID_SERVERONNETWORK 12189 /* DataType */ +#define UA_NS0ID_FINDSERVERSONNETWORKREQUEST 12190 /* DataType */ +#define UA_NS0ID_FINDSERVERSONNETWORKRESPONSE 12191 /* DataType */ +#define UA_NS0ID_REGISTERSERVER2REQUEST 12193 /* DataType */ +#define UA_NS0ID_REGISTERSERVER2RESPONSE 12194 /* DataType */ +#define UA_NS0ID_SERVERONNETWORK_ENCODING_DEFAULTXML 12195 /* Object */ +#define UA_NS0ID_FINDSERVERSONNETWORKREQUEST_ENCODING_DEFAULTXML 12196 /* Object */ +#define UA_NS0ID_FINDSERVERSONNETWORKRESPONSE_ENCODING_DEFAULTXML 12197 /* Object */ +#define UA_NS0ID_REGISTERSERVER2REQUEST_ENCODING_DEFAULTXML 12199 /* Object */ +#define UA_NS0ID_REGISTERSERVER2RESPONSE_ENCODING_DEFAULTXML 12200 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SERVERONNETWORK 12201 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SERVERONNETWORK_DATATYPEVERSION 12202 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SERVERONNETWORK_DICTIONARYFRAGMENT 12203 /* Variable */ +#define UA_NS0ID_SERVERONNETWORK_ENCODING_DEFAULTBINARY 12207 /* Object */ +#define UA_NS0ID_FINDSERVERSONNETWORKREQUEST_ENCODING_DEFAULTBINARY 12208 /* Object */ +#define UA_NS0ID_FINDSERVERSONNETWORKRESPONSE_ENCODING_DEFAULTBINARY 12209 /* Object */ +#define UA_NS0ID_REGISTERSERVER2REQUEST_ENCODING_DEFAULTBINARY 12211 /* Object */ +#define UA_NS0ID_REGISTERSERVER2RESPONSE_ENCODING_DEFAULTBINARY 12212 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SERVERONNETWORK 12213 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SERVERONNETWORK_DATATYPEVERSION 12214 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SERVERONNETWORK_DICTIONARYFRAGMENT 12215 /* Variable */ +#define UA_NS0ID_PROGRESSEVENTTYPE_CONTEXT 12502 /* Variable */ +#define UA_NS0ID_PROGRESSEVENTTYPE_PROGRESS 12503 /* Variable */ +#define UA_NS0ID_OPENWITHMASKSMETHODTYPE 12513 /* Method */ +#define UA_NS0ID_OPENWITHMASKSMETHODTYPE_INPUTARGUMENTS 12514 /* Variable */ +#define UA_NS0ID_OPENWITHMASKSMETHODTYPE_OUTPUTARGUMENTS 12515 /* Variable */ +#define UA_NS0ID_CLOSEANDUPDATEMETHODTYPE 12516 /* Method */ +#define UA_NS0ID_CLOSEANDUPDATEMETHODTYPE_OUTPUTARGUMENTS 12517 /* Variable */ +#define UA_NS0ID_ADDCERTIFICATEMETHODTYPE 12518 /* Method */ +#define UA_NS0ID_ADDCERTIFICATEMETHODTYPE_INPUTARGUMENTS 12519 /* Variable */ +#define UA_NS0ID_REMOVECERTIFICATEMETHODTYPE 12520 /* Method */ +#define UA_NS0ID_REMOVECERTIFICATEMETHODTYPE_INPUTARGUMENTS 12521 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE 12522 /* ObjectType */ +#define UA_NS0ID_TRUSTLISTTYPE_SIZE 12523 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_OPENCOUNT 12526 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_OPEN 12527 /* Method */ +#define UA_NS0ID_TRUSTLISTTYPE_OPEN_INPUTARGUMENTS 12528 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_OPEN_OUTPUTARGUMENTS 12529 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_CLOSE 12530 /* Method */ +#define UA_NS0ID_TRUSTLISTTYPE_CLOSE_INPUTARGUMENTS 12531 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_READ 12532 /* Method */ +#define UA_NS0ID_TRUSTLISTTYPE_READ_INPUTARGUMENTS 12533 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_READ_OUTPUTARGUMENTS 12534 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_WRITE 12535 /* Method */ +#define UA_NS0ID_TRUSTLISTTYPE_WRITE_INPUTARGUMENTS 12536 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_GETPOSITION 12537 /* Method */ +#define UA_NS0ID_TRUSTLISTTYPE_GETPOSITION_INPUTARGUMENTS 12538 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_GETPOSITION_OUTPUTARGUMENTS 12539 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_SETPOSITION 12540 /* Method */ +#define UA_NS0ID_TRUSTLISTTYPE_SETPOSITION_INPUTARGUMENTS 12541 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_LASTUPDATETIME 12542 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_OPENWITHMASKS 12543 /* Method */ +#define UA_NS0ID_TRUSTLISTTYPE_OPENWITHMASKS_INPUTARGUMENTS 12544 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_OPENWITHMASKS_OUTPUTARGUMENTS 12545 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_CLOSEANDUPDATE 12546 /* Method */ +#define UA_NS0ID_TRUSTLISTTYPE_CLOSEANDUPDATE_OUTPUTARGUMENTS 12547 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_ADDCERTIFICATE 12548 /* Method */ +#define UA_NS0ID_TRUSTLISTTYPE_ADDCERTIFICATE_INPUTARGUMENTS 12549 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_REMOVECERTIFICATE 12550 /* Method */ +#define UA_NS0ID_TRUSTLISTTYPE_REMOVECERTIFICATE_INPUTARGUMENTS 12551 /* Variable */ +#define UA_NS0ID_TRUSTLISTMASKS 12552 /* DataType */ +#define UA_NS0ID_TRUSTLISTMASKS_ENUMVALUES 12553 /* Variable */ +#define UA_NS0ID_TRUSTLISTDATATYPE 12554 /* DataType */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE 12555 /* ObjectType */ +#define UA_NS0ID_CERTIFICATETYPE 12556 /* ObjectType */ +#define UA_NS0ID_APPLICATIONCERTIFICATETYPE 12557 /* ObjectType */ +#define UA_NS0ID_HTTPSCERTIFICATETYPE 12558 /* ObjectType */ +#define UA_NS0ID_RSAMINAPPLICATIONCERTIFICATETYPE 12559 /* ObjectType */ +#define UA_NS0ID_RSASHA256APPLICATIONCERTIFICATETYPE 12560 /* ObjectType */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE 12561 /* ObjectType */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_EVENTID 12562 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_EVENTTYPE 12563 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_SOURCENODE 12564 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_SOURCENAME 12565 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_TIME 12566 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_RECEIVETIME 12567 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_LOCALTIME 12568 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_MESSAGE 12569 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_SEVERITY 12570 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_ACTIONTIMESTAMP 12571 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_STATUS 12572 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_SERVERID 12573 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_CLIENTAUDITENTRYID 12574 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_CLIENTUSERID 12575 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_METHODID 12576 /* Variable */ +#define UA_NS0ID_TRUSTLISTUPDATEDAUDITEVENTTYPE_INPUTARGUMENTS 12577 /* Variable */ +#define UA_NS0ID_UPDATECERTIFICATEMETHODTYPE 12578 /* Method */ +#define UA_NS0ID_UPDATECERTIFICATEMETHODTYPE_INPUTARGUMENTS 12579 /* Variable */ +#define UA_NS0ID_UPDATECERTIFICATEMETHODTYPE_OUTPUTARGUMENTS 12580 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE 12581 /* ObjectType */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_SUPPORTEDPRIVATEKEYFORMATS 12583 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_MAXTRUSTLISTSIZE 12584 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_MULTICASTDNSENABLED 12585 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_UPDATECERTIFICATE 12616 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_UPDATECERTIFICATE_INPUTARGUMENTS 12617 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_UPDATECERTIFICATE_OUTPUTARGUMENTS 12618 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE 12620 /* ObjectType */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_EVENTID 12621 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_EVENTTYPE 12622 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_SOURCENODE 12623 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_SOURCENAME 12624 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_TIME 12625 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_RECEIVETIME 12626 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_LOCALTIME 12627 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_MESSAGE 12628 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_SEVERITY 12629 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_ACTIONTIMESTAMP 12630 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_STATUS 12631 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_SERVERID 12632 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_CLIENTAUDITENTRYID 12633 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_CLIENTUSERID 12634 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_METHODID 12635 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_INPUTARGUMENTS 12636 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION 12637 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATION_SUPPORTEDPRIVATEKEYFORMATS 12639 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_MAXTRUSTLISTSIZE 12640 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_MULTICASTDNSENABLED 12641 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST 12642 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_SIZE 12643 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENCOUNT 12646 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPEN 12647 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPEN_INPUTARGUMENTS 12648 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPEN_OUTPUTARGUMENTS 12649 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSE 12650 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSE_INPUTARGUMENTS 12651 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_READ 12652 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_READ_INPUTARGUMENTS 12653 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_READ_OUTPUTARGUMENTS 12654 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_WRITE 12655 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_WRITE_INPUTARGUMENTS 12656 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_GETPOSITION 12657 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 12658 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 12659 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_SETPOSITION 12660 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 12661 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_LASTUPDATETIME 12662 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENWITHMASKS 12663 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 12664 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 12665 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSEANDUPDATE 12666 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 12667 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_ADDCERTIFICATE 12668 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 12669 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_REMOVECERTIFICATE 12670 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 12671 /* Variable */ +#define UA_NS0ID_TRUSTLISTDATATYPE_ENCODING_DEFAULTXML 12676 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_TRUSTLISTDATATYPE 12677 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_TRUSTLISTDATATYPE_DATATYPEVERSION 12678 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_TRUSTLISTDATATYPE_DICTIONARYFRAGMENT 12679 /* Variable */ +#define UA_NS0ID_TRUSTLISTDATATYPE_ENCODING_DEFAULTBINARY 12680 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_TRUSTLISTDATATYPE 12681 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_TRUSTLISTDATATYPE_DATATYPEVERSION 12682 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_TRUSTLISTDATATYPE_DICTIONARYFRAGMENT 12683 /* Variable */ +#define UA_NS0ID_FILETYPE_WRITABLE 12686 /* Variable */ +#define UA_NS0ID_FILETYPE_USERWRITABLE 12687 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_WRITABLE 12688 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_USERWRITABLE 12689 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_WRITABLE 12690 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_USERWRITABLE 12691 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_WRITABLE 12692 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_USERWRITABLE 12693 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_WRITABLE 12698 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_USERWRITABLE 12699 /* Variable */ +#define UA_NS0ID_CLOSEANDUPDATEMETHODTYPE_INPUTARGUMENTS 12704 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_CLOSEANDUPDATE_INPUTARGUMENTS 12705 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_SERVERCAPABILITIES 12708 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_SERVERCAPABILITIES 12710 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_RELATIVEPATHELEMENT 12712 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_RELATIVEPATHELEMENT_DATATYPEVERSION 12713 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_RELATIVEPATHELEMENT_DICTIONARYFRAGMENT 12714 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_RELATIVEPATH 12715 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_RELATIVEPATH_DATATYPEVERSION 12716 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_RELATIVEPATH_DICTIONARYFRAGMENT 12717 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_RELATIVEPATHELEMENT 12718 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_RELATIVEPATHELEMENT_DATATYPEVERSION 12719 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_RELATIVEPATHELEMENT_DICTIONARYFRAGMENT 12720 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_RELATIVEPATH 12721 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_RELATIVEPATH_DATATYPEVERSION 12722 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_RELATIVEPATH_DICTIONARYFRAGMENT 12723 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CREATESIGNINGREQUEST 12731 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CREATESIGNINGREQUEST_INPUTARGUMENTS 12732 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CREATESIGNINGREQUEST_OUTPUTARGUMENTS 12733 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_APPLYCHANGES 12734 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CREATESIGNINGREQUEST 12737 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CREATESIGNINGREQUEST_INPUTARGUMENTS 12738 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CREATESIGNINGREQUEST_OUTPUTARGUMENTS 12739 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_APPLYCHANGES 12740 /* Method */ +#define UA_NS0ID_CREATESIGNINGREQUESTMETHODTYPE 12741 /* Method */ +#define UA_NS0ID_CREATESIGNINGREQUESTMETHODTYPE_INPUTARGUMENTS 12742 /* Variable */ +#define UA_NS0ID_CREATESIGNINGREQUESTMETHODTYPE_OUTPUTARGUMENTS 12743 /* Variable */ +#define UA_NS0ID_OPTIONSETVALUES 12745 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SETSUBSCRIPTIONDURABLE 12746 /* Method */ +#define UA_NS0ID_SERVERTYPE_SETSUBSCRIPTIONDURABLE_INPUTARGUMENTS 12747 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SETSUBSCRIPTIONDURABLE_OUTPUTARGUMENTS 12748 /* Variable */ +#define UA_NS0ID_SERVER_SETSUBSCRIPTIONDURABLE 12749 /* Method */ +#define UA_NS0ID_SERVER_SETSUBSCRIPTIONDURABLE_INPUTARGUMENTS 12750 /* Variable */ +#define UA_NS0ID_SERVER_SETSUBSCRIPTIONDURABLE_OUTPUTARGUMENTS 12751 /* Variable */ +#define UA_NS0ID_SETSUBSCRIPTIONDURABLEMETHODTYPE 12752 /* Method */ +#define UA_NS0ID_SETSUBSCRIPTIONDURABLEMETHODTYPE_INPUTARGUMENTS 12753 /* Variable */ +#define UA_NS0ID_SETSUBSCRIPTIONDURABLEMETHODTYPE_OUTPUTARGUMENTS 12754 /* Variable */ +#define UA_NS0ID_OPTIONSET 12755 /* DataType */ +#define UA_NS0ID_UNION 12756 /* DataType */ +#define UA_NS0ID_OPTIONSET_ENCODING_DEFAULTXML 12757 /* Object */ +#define UA_NS0ID_UNION_ENCODING_DEFAULTXML 12758 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_OPTIONSET 12759 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_OPTIONSET_DATATYPEVERSION 12760 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_OPTIONSET_DICTIONARYFRAGMENT 12761 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UNION 12762 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UNION_DATATYPEVERSION 12763 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UNION_DICTIONARYFRAGMENT 12764 /* Variable */ +#define UA_NS0ID_OPTIONSET_ENCODING_DEFAULTBINARY 12765 /* Object */ +#define UA_NS0ID_UNION_ENCODING_DEFAULTBINARY 12766 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_OPTIONSET 12767 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_OPTIONSET_DATATYPEVERSION 12768 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_OPTIONSET_DICTIONARYFRAGMENT 12769 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UNION 12770 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UNION_DATATYPEVERSION 12771 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UNION_DICTIONARYFRAGMENT 12772 /* Variable */ +#define UA_NS0ID_GETREJECTEDLISTMETHODTYPE 12773 /* Method */ +#define UA_NS0ID_GETREJECTEDLISTMETHODTYPE_OUTPUTARGUMENTS 12774 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_GETREJECTEDLIST 12775 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_GETREJECTEDLIST_OUTPUTARGUMENTS 12776 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_GETREJECTEDLIST 12777 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_GETREJECTEDLIST_OUTPUTARGUMENTS 12778 /* Variable */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSARRAYTYPE_SAMPLINGINTERVALDIAGNOSTICS 12779 /* Variable */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSARRAYTYPE_SAMPLINGINTERVALDIAGNOSTICS_SAMPLINGINTERVAL 12780 /* Variable */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSARRAYTYPE_SAMPLINGINTERVALDIAGNOSTICS_SAMPLEDMONITOREDITEMSCOUNT 12781 /* Variable */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSARRAYTYPE_SAMPLINGINTERVALDIAGNOSTICS_MAXSAMPLEDMONITOREDITEMSCOUNT 12782 /* Variable */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSARRAYTYPE_SAMPLINGINTERVALDIAGNOSTICS_DISABLEDMONITOREDITEMSSAMPLINGCOUNT 12783 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS 12784 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_SESSIONID 12785 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_SUBSCRIPTIONID 12786 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_PRIORITY 12787 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_PUBLISHINGINTERVAL 12788 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_MAXKEEPALIVECOUNT 12789 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_MAXLIFETIMECOUNT 12790 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_MAXNOTIFICATIONSPERPUBLISH 12791 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_PUBLISHINGENABLED 12792 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_MODIFYCOUNT 12793 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_ENABLECOUNT 12794 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_DISABLECOUNT 12795 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_REPUBLISHREQUESTCOUNT 12796 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_REPUBLISHMESSAGEREQUESTCOUNT 12797 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_REPUBLISHMESSAGECOUNT 12798 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_TRANSFERREQUESTCOUNT 12799 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_TRANSFERREDTOALTCLIENTCOUNT 12800 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_TRANSFERREDTOSAMECLIENTCOUNT 12801 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_PUBLISHREQUESTCOUNT 12802 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_DATACHANGENOTIFICATIONSCOUNT 12803 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_EVENTNOTIFICATIONSCOUNT 12804 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_NOTIFICATIONSCOUNT 12805 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_LATEPUBLISHREQUESTCOUNT 12806 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_CURRENTKEEPALIVECOUNT 12807 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_CURRENTLIFETIMECOUNT 12808 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_UNACKNOWLEDGEDMESSAGECOUNT 12809 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_DISCARDEDMESSAGECOUNT 12810 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_MONITOREDITEMCOUNT 12811 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_DISABLEDMONITOREDITEMCOUNT 12812 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_MONITORINGQUEUEOVERFLOWCOUNT 12813 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_NEXTSEQUENCENUMBER 12814 /* Variable */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSARRAYTYPE_SUBSCRIPTIONDIAGNOSTICS_EVENTQUEUEOVERFLOWCOUNT 12815 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS 12816 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_SESSIONID 12817 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_SESSIONNAME 12818 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_CLIENTDESCRIPTION 12819 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_SERVERURI 12820 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_ENDPOINTURL 12821 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_LOCALEIDS 12822 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_ACTUALSESSIONTIMEOUT 12823 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_MAXRESPONSEMESSAGESIZE 12824 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_CLIENTCONNECTIONTIME 12825 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_CLIENTLASTCONTACTTIME 12826 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_CURRENTSUBSCRIPTIONSCOUNT 12827 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_CURRENTMONITOREDITEMSCOUNT 12828 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_CURRENTPUBLISHREQUESTSINQUEUE 12829 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_TOTALREQUESTCOUNT 12830 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_UNAUTHORIZEDREQUESTCOUNT 12831 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_READCOUNT 12832 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_HISTORYREADCOUNT 12833 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_WRITECOUNT 12834 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_HISTORYUPDATECOUNT 12835 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_CALLCOUNT 12836 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_CREATEMONITOREDITEMSCOUNT 12837 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_MODIFYMONITOREDITEMSCOUNT 12838 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_SETMONITORINGMODECOUNT 12839 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_SETTRIGGERINGCOUNT 12840 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_DELETEMONITOREDITEMSCOUNT 12841 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_CREATESUBSCRIPTIONCOUNT 12842 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_MODIFYSUBSCRIPTIONCOUNT 12843 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_SETPUBLISHINGMODECOUNT 12844 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_PUBLISHCOUNT 12845 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_REPUBLISHCOUNT 12846 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_TRANSFERSUBSCRIPTIONSCOUNT 12847 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_DELETESUBSCRIPTIONSCOUNT 12848 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_ADDNODESCOUNT 12849 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_ADDREFERENCESCOUNT 12850 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_DELETENODESCOUNT 12851 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_DELETEREFERENCESCOUNT 12852 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_BROWSECOUNT 12853 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_BROWSENEXTCOUNT 12854 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_TRANSLATEBROWSEPATHSTONODEIDSCOUNT 12855 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_QUERYFIRSTCOUNT 12856 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_QUERYNEXTCOUNT 12857 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_REGISTERNODESCOUNT 12858 /* Variable */ +#define UA_NS0ID_SESSIONDIAGNOSTICSARRAYTYPE_SESSIONDIAGNOSTICS_UNREGISTERNODESCOUNT 12859 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSARRAYTYPE_SESSIONSECURITYDIAGNOSTICS 12860 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSARRAYTYPE_SESSIONSECURITYDIAGNOSTICS_SESSIONID 12861 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSARRAYTYPE_SESSIONSECURITYDIAGNOSTICS_CLIENTUSERIDOFSESSION 12862 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSARRAYTYPE_SESSIONSECURITYDIAGNOSTICS_CLIENTUSERIDHISTORY 12863 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSARRAYTYPE_SESSIONSECURITYDIAGNOSTICS_AUTHENTICATIONMECHANISM 12864 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSARRAYTYPE_SESSIONSECURITYDIAGNOSTICS_ENCODING 12865 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSARRAYTYPE_SESSIONSECURITYDIAGNOSTICS_TRANSPORTPROTOCOL 12866 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSARRAYTYPE_SESSIONSECURITYDIAGNOSTICS_SECURITYMODE 12867 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSARRAYTYPE_SESSIONSECURITYDIAGNOSTICS_SECURITYPOLICYURI 12868 /* Variable */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSARRAYTYPE_SESSIONSECURITYDIAGNOSTICS_CLIENTCERTIFICATE 12869 /* Variable */ +#define UA_NS0ID_SERVERTYPE_RESENDDATA 12871 /* Method */ +#define UA_NS0ID_SERVERTYPE_RESENDDATA_INPUTARGUMENTS 12872 /* Variable */ +#define UA_NS0ID_SERVER_RESENDDATA 12873 /* Method */ +#define UA_NS0ID_SERVER_RESENDDATA_INPUTARGUMENTS 12874 /* Variable */ +#define UA_NS0ID_RESENDDATAMETHODTYPE 12875 /* Method */ +#define UA_NS0ID_RESENDDATAMETHODTYPE_INPUTARGUMENTS 12876 /* Variable */ +#define UA_NS0ID_NORMALIZEDSTRING 12877 /* DataType */ +#define UA_NS0ID_DECIMALSTRING 12878 /* DataType */ +#define UA_NS0ID_DURATIONSTRING 12879 /* DataType */ +#define UA_NS0ID_TIMESTRING 12880 /* DataType */ +#define UA_NS0ID_DATESTRING 12881 /* DataType */ +#define UA_NS0ID_SERVERTYPE_ESTIMATEDRETURNTIME 12882 /* Variable */ +#define UA_NS0ID_SERVERTYPE_REQUESTSERVERSTATECHANGE 12883 /* Method */ +#define UA_NS0ID_SERVERTYPE_REQUESTSERVERSTATECHANGE_INPUTARGUMENTS 12884 /* Variable */ +#define UA_NS0ID_SERVER_ESTIMATEDRETURNTIME 12885 /* Variable */ +#define UA_NS0ID_SERVER_REQUESTSERVERSTATECHANGE 12886 /* Method */ +#define UA_NS0ID_SERVER_REQUESTSERVERSTATECHANGE_INPUTARGUMENTS 12887 /* Variable */ +#define UA_NS0ID_REQUESTSERVERSTATECHANGEMETHODTYPE 12888 /* Method */ +#define UA_NS0ID_REQUESTSERVERSTATECHANGEMETHODTYPE_INPUTARGUMENTS 12889 /* Variable */ +#define UA_NS0ID_DISCOVERYCONFIGURATION 12890 /* DataType */ +#define UA_NS0ID_MDNSDISCOVERYCONFIGURATION 12891 /* DataType */ +#define UA_NS0ID_DISCOVERYCONFIGURATION_ENCODING_DEFAULTXML 12892 /* Object */ +#define UA_NS0ID_MDNSDISCOVERYCONFIGURATION_ENCODING_DEFAULTXML 12893 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DISCOVERYCONFIGURATION 12894 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DISCOVERYCONFIGURATION_DATATYPEVERSION 12895 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DISCOVERYCONFIGURATION_DICTIONARYFRAGMENT 12896 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_MDNSDISCOVERYCONFIGURATION 12897 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_MDNSDISCOVERYCONFIGURATION_DATATYPEVERSION 12898 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_MDNSDISCOVERYCONFIGURATION_DICTIONARYFRAGMENT 12899 /* Variable */ +#define UA_NS0ID_DISCOVERYCONFIGURATION_ENCODING_DEFAULTBINARY 12900 /* Object */ +#define UA_NS0ID_MDNSDISCOVERYCONFIGURATION_ENCODING_DEFAULTBINARY 12901 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DISCOVERYCONFIGURATION 12902 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DISCOVERYCONFIGURATION_DATATYPEVERSION 12903 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DISCOVERYCONFIGURATION_DICTIONARYFRAGMENT 12904 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_MDNSDISCOVERYCONFIGURATION 12905 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_MDNSDISCOVERYCONFIGURATION_DATATYPEVERSION 12906 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_MDNSDISCOVERYCONFIGURATION_DICTIONARYFRAGMENT 12907 /* Variable */ +#define UA_NS0ID_MAXBYTESTRINGLENGTH 12908 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_MAXBYTESTRINGLENGTH 12909 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_MAXBYTESTRINGLENGTH 12910 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBYTESTRINGLENGTH 12911 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_CONDITIONREFRESH2 12912 /* Method */ +#define UA_NS0ID_CONDITIONTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 12913 /* Variable */ +#define UA_NS0ID_CONDITIONREFRESH2METHODTYPE 12914 /* Method */ +#define UA_NS0ID_CONDITIONREFRESH2METHODTYPE_INPUTARGUMENTS 12915 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_CONDITIONREFRESH2 12916 /* Method */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 12917 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONDITIONREFRESH2 12918 /* Method */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 12919 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONDITIONREFRESH2 12984 /* Method */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 12985 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONDITIONREFRESH2 12986 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 12987 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONDITIONREFRESH2 12988 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 12989 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONDITIONREFRESH2 12990 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 12991 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONDITIONREFRESH2 12992 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 12993 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONDITIONREFRESH2 12994 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 12995 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONDITIONREFRESH2 12996 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 12997 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONDITIONREFRESH2 12998 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 12999 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONREFRESH2 13000 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 13001 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONREFRESH2 13002 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 13003 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONDITIONREFRESH2 13004 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 13005 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONDITIONREFRESH2 13006 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 13007 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONDITIONREFRESH2 13008 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 13009 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONDITIONREFRESH2 13010 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 13011 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE 13225 /* ObjectType */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_EVENTID 13226 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_EVENTTYPE 13227 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SOURCENODE 13228 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SOURCENAME 13229 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_TIME 13230 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_RECEIVETIME 13231 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_LOCALTIME 13232 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_MESSAGE 13233 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SEVERITY 13234 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONDITIONCLASSID 13235 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONDITIONCLASSNAME 13236 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONDITIONNAME 13237 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_BRANCHID 13238 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_RETAIN 13239 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ENABLEDSTATE 13240 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ENABLEDSTATE_ID 13241 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ENABLEDSTATE_NAME 13242 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ENABLEDSTATE_NUMBER 13243 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 13244 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 13245 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 13246 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ENABLEDSTATE_TRUESTATE 13247 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ENABLEDSTATE_FALSESTATE 13248 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_QUALITY 13249 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_QUALITY_SOURCETIMESTAMP 13250 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_LASTSEVERITY 13251 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 13252 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_COMMENT 13253 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_COMMENT_SOURCETIMESTAMP 13254 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CLIENTUSERID 13255 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_DISABLE 13256 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ENABLE 13257 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ADDCOMMENT 13258 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 13259 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONDITIONREFRESH 13260 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 13261 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONDITIONREFRESH2 13262 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 13263 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACKEDSTATE 13264 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACKEDSTATE_ID 13265 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACKEDSTATE_NAME 13266 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACKEDSTATE_NUMBER 13267 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 13268 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACKEDSTATE_TRANSITIONTIME 13269 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 13270 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACKEDSTATE_TRUESTATE 13271 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACKEDSTATE_FALSESTATE 13272 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONFIRMEDSTATE 13273 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONFIRMEDSTATE_ID 13274 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONFIRMEDSTATE_NAME 13275 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONFIRMEDSTATE_NUMBER 13276 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 13277 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 13278 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 13279 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONFIRMEDSTATE_TRUESTATE 13280 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONFIRMEDSTATE_FALSESTATE 13281 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACKNOWLEDGE 13282 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 13283 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONFIRM 13284 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONFIRM_INPUTARGUMENTS 13285 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACTIVESTATE 13286 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACTIVESTATE_ID 13287 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACTIVESTATE_NAME 13288 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACTIVESTATE_NUMBER 13289 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 13290 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACTIVESTATE_TRANSITIONTIME 13291 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 13292 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACTIVESTATE_TRUESTATE 13293 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ACTIVESTATE_FALSESTATE 13294 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_INPUTNODE 13295 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SUPPRESSEDSTATE 13296 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SUPPRESSEDSTATE_ID 13297 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SUPPRESSEDSTATE_NAME 13298 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SUPPRESSEDSTATE_NUMBER 13299 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 13300 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 13301 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 13302 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 13303 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 13304 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE 13305 /* Object */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE 13306 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 13307 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 13308 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 13309 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 13310 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION 13311 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 13312 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 13313 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 13314 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 13315 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 13316 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_UNSHELVETIME 13317 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_UNSHELVE 13318 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 13319 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 13320 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 13321 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SUPPRESSEDORSHELVED 13322 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_MAXTIMESHELVED 13323 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_NORMALSTATE 13324 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_EXPIRATIONDATE 13325 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CERTIFICATETYPE 13326 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CERTIFICATE 13327 /* Variable */ +#define UA_NS0ID_FILETYPE_MIMETYPE 13341 /* Variable */ +#define UA_NS0ID_CREATEDIRECTORYMETHODTYPE 13342 /* Method */ +#define UA_NS0ID_CREATEDIRECTORYMETHODTYPE_INPUTARGUMENTS 13343 /* Variable */ +#define UA_NS0ID_CREATEDIRECTORYMETHODTYPE_OUTPUTARGUMENTS 13344 /* Variable */ +#define UA_NS0ID_CREATEFILEMETHODTYPE 13345 /* Method */ +#define UA_NS0ID_CREATEFILEMETHODTYPE_INPUTARGUMENTS 13346 /* Variable */ +#define UA_NS0ID_CREATEFILEMETHODTYPE_OUTPUTARGUMENTS 13347 /* Variable */ +#define UA_NS0ID_DELETEFILEMETHODTYPE 13348 /* Method */ +#define UA_NS0ID_DELETEFILEMETHODTYPE_INPUTARGUMENTS 13349 /* Variable */ +#define UA_NS0ID_MOVEORCOPYMETHODTYPE 13350 /* Method */ +#define UA_NS0ID_MOVEORCOPYMETHODTYPE_INPUTARGUMENTS 13351 /* Variable */ +#define UA_NS0ID_MOVEORCOPYMETHODTYPE_OUTPUTARGUMENTS 13352 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE 13353 /* ObjectType */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILEDIRECTORYNAME_PLACEHOLDER 13354 /* Object */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILEDIRECTORYNAME_PLACEHOLDER_CREATEDIRECTORY 13355 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILEDIRECTORYNAME_PLACEHOLDER_CREATEDIRECTORY_INPUTARGUMENTS 13356 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILEDIRECTORYNAME_PLACEHOLDER_CREATEDIRECTORY_OUTPUTARGUMENTS 13357 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILEDIRECTORYNAME_PLACEHOLDER_CREATEFILE 13358 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILEDIRECTORYNAME_PLACEHOLDER_CREATEFILE_INPUTARGUMENTS 13359 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILEDIRECTORYNAME_PLACEHOLDER_CREATEFILE_OUTPUTARGUMENTS 13360 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILEDIRECTORYNAME_PLACEHOLDER_MOVEORCOPY 13363 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILEDIRECTORYNAME_PLACEHOLDER_MOVEORCOPY_INPUTARGUMENTS 13364 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILEDIRECTORYNAME_PLACEHOLDER_MOVEORCOPY_OUTPUTARGUMENTS 13365 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER 13366 /* Object */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_SIZE 13367 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_WRITABLE 13368 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_USERWRITABLE 13369 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_OPENCOUNT 13370 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_MIMETYPE 13371 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_OPEN 13372 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_OPEN_INPUTARGUMENTS 13373 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_OPEN_OUTPUTARGUMENTS 13374 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_CLOSE 13375 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_CLOSE_INPUTARGUMENTS 13376 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_READ 13377 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_READ_INPUTARGUMENTS 13378 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_READ_OUTPUTARGUMENTS 13379 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_WRITE 13380 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_WRITE_INPUTARGUMENTS 13381 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_GETPOSITION 13382 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_GETPOSITION_INPUTARGUMENTS 13383 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_GETPOSITION_OUTPUTARGUMENTS 13384 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_SETPOSITION 13385 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILENAME_PLACEHOLDER_SETPOSITION_INPUTARGUMENTS 13386 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_CREATEDIRECTORY 13387 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_CREATEDIRECTORY_INPUTARGUMENTS 13388 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_CREATEDIRECTORY_OUTPUTARGUMENTS 13389 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_CREATEFILE 13390 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_CREATEFILE_INPUTARGUMENTS 13391 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_CREATEFILE_OUTPUTARGUMENTS 13392 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_DELETEFILESYSTEMOBJECT 13393 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_DELETEFILESYSTEMOBJECT_INPUTARGUMENTS 13394 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_MOVEORCOPY 13395 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_MOVEORCOPY_INPUTARGUMENTS 13396 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_MOVEORCOPY_OUTPUTARGUMENTS 13397 /* Variable */ +#define UA_NS0ID_ADDRESSSPACEFILETYPE_MIMETYPE 13398 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_NAMESPACEFILE_MIMETYPE 13399 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_NAMESPACEFILE_MIMETYPE 13400 /* Variable */ +#define UA_NS0ID_TRUSTLISTTYPE_MIMETYPE 13403 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST 13599 /* Object */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_SIZE 13600 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_WRITABLE 13601 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_USERWRITABLE 13602 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_OPENCOUNT 13603 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_MIMETYPE 13604 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_OPEN 13605 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_OPEN_INPUTARGUMENTS 13606 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_OPEN_OUTPUTARGUMENTS 13607 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_CLOSE 13608 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_CLOSE_INPUTARGUMENTS 13609 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_READ 13610 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_READ_INPUTARGUMENTS 13611 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_READ_OUTPUTARGUMENTS 13612 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_WRITE 13613 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_WRITE_INPUTARGUMENTS 13614 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_GETPOSITION 13615 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 13616 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 13617 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_SETPOSITION 13618 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 13619 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_LASTUPDATETIME 13620 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_OPENWITHMASKS 13621 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 13622 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 13623 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_CLOSEANDUPDATE 13624 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 13625 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 13626 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_ADDCERTIFICATE 13627 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 13628 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_REMOVECERTIFICATE 13629 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 13630 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPTYPE_CERTIFICATETYPES 13631 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_CERTIFICATEGROUP 13735 /* Variable */ +#define UA_NS0ID_CERTIFICATEUPDATEDAUDITEVENTTYPE_CERTIFICATETYPE 13736 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_UPDATECERTIFICATE 13737 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_UPDATECERTIFICATE_INPUTARGUMENTS 13738 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_UPDATECERTIFICATE_OUTPUTARGUMENTS 13739 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE 13813 /* ObjectType */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP 13814 /* Object */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST 13815 /* Object */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_SIZE 13816 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_WRITABLE 13817 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_USERWRITABLE 13818 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENCOUNT 13819 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_MIMETYPE 13820 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPEN 13821 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPEN_INPUTARGUMENTS 13822 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPEN_OUTPUTARGUMENTS 13823 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSE 13824 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSE_INPUTARGUMENTS 13825 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_READ 13826 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_READ_INPUTARGUMENTS 13827 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_READ_OUTPUTARGUMENTS 13828 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_WRITE 13829 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_WRITE_INPUTARGUMENTS 13830 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_GETPOSITION 13831 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 13832 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 13833 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_SETPOSITION 13834 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 13835 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_LASTUPDATETIME 13836 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENWITHMASKS 13837 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 13838 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 13839 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSEANDUPDATE 13840 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 13841 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 13842 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_ADDCERTIFICATE 13843 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 13844 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_REMOVECERTIFICATE 13845 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 13846 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTAPPLICATIONGROUP_CERTIFICATETYPES 13847 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP 13848 /* Object */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST 13849 /* Object */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_SIZE 13850 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_WRITABLE 13851 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_USERWRITABLE 13852 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_OPENCOUNT 13853 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_MIMETYPE 13854 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_OPEN 13855 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_OPEN_INPUTARGUMENTS 13856 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_OPEN_OUTPUTARGUMENTS 13857 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSE 13858 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSE_INPUTARGUMENTS 13859 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_READ 13860 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_READ_INPUTARGUMENTS 13861 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_READ_OUTPUTARGUMENTS 13862 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_WRITE 13863 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_WRITE_INPUTARGUMENTS 13864 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_GETPOSITION 13865 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 13866 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 13867 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_SETPOSITION 13868 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 13869 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_LASTUPDATETIME 13870 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_OPENWITHMASKS 13871 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 13872 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 13873 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSEANDUPDATE 13874 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 13875 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 13876 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_ADDCERTIFICATE 13877 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 13878 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_REMOVECERTIFICATE 13879 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 13880 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTHTTPSGROUP_CERTIFICATETYPES 13881 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP 13882 /* Object */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST 13883 /* Object */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_SIZE 13884 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_WRITABLE 13885 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_USERWRITABLE 13886 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENCOUNT 13887 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_MIMETYPE 13888 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPEN 13889 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPEN_INPUTARGUMENTS 13890 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPEN_OUTPUTARGUMENTS 13891 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSE 13892 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSE_INPUTARGUMENTS 13893 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_READ 13894 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_READ_INPUTARGUMENTS 13895 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_READ_OUTPUTARGUMENTS 13896 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_WRITE 13897 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_WRITE_INPUTARGUMENTS 13898 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_GETPOSITION 13899 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 13900 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 13901 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_SETPOSITION 13902 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 13903 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_LASTUPDATETIME 13904 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENWITHMASKS 13905 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 13906 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 13907 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSEANDUPDATE 13908 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 13909 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 13910 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_ADDCERTIFICATE 13911 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 13912 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_REMOVECERTIFICATE 13913 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 13914 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_DEFAULTUSERTOKENGROUP_CERTIFICATETYPES 13915 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER 13916 /* Object */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST 13917 /* Object */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_SIZE 13918 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_WRITABLE 13919 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_USERWRITABLE 13920 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_OPENCOUNT 13921 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_MIMETYPE 13922 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_OPEN 13923 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_OPEN_INPUTARGUMENTS 13924 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_OPEN_OUTPUTARGUMENTS 13925 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_CLOSE 13926 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_CLOSE_INPUTARGUMENTS 13927 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_READ 13928 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_READ_INPUTARGUMENTS 13929 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_READ_OUTPUTARGUMENTS 13930 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_WRITE 13931 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_WRITE_INPUTARGUMENTS 13932 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_GETPOSITION 13933 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 13934 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 13935 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_SETPOSITION 13936 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 13937 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_LASTUPDATETIME 13938 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_OPENWITHMASKS 13939 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 13940 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 13941 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_CLOSEANDUPDATE 13942 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 13943 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 13944 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_ADDCERTIFICATE 13945 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 13946 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_REMOVECERTIFICATE 13947 /* Method */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 13948 /* Variable */ +#define UA_NS0ID_CERTIFICATEGROUPFOLDERTYPE_ADDITIONALGROUP_PLACEHOLDER_CERTIFICATETYPES 13949 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS 13950 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP 13951 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST 13952 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_SIZE 13953 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_WRITABLE 13954 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_USERWRITABLE 13955 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENCOUNT 13956 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_MIMETYPE 13957 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPEN 13958 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPEN_INPUTARGUMENTS 13959 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPEN_OUTPUTARGUMENTS 13960 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSE 13961 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSE_INPUTARGUMENTS 13962 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_READ 13963 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_READ_INPUTARGUMENTS 13964 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_READ_OUTPUTARGUMENTS 13965 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_WRITE 13966 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_WRITE_INPUTARGUMENTS 13967 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_GETPOSITION 13968 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 13969 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 13970 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_SETPOSITION 13971 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 13972 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_LASTUPDATETIME 13973 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENWITHMASKS 13974 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 13975 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 13976 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSEANDUPDATE 13977 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 13978 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 13979 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_ADDCERTIFICATE 13980 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 13981 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_REMOVECERTIFICATE 13982 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 13983 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_CERTIFICATETYPES 13984 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP 13985 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST 13986 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_SIZE 13987 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_WRITABLE 13988 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_USERWRITABLE 13989 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPENCOUNT 13990 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_MIMETYPE 13991 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPEN 13992 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPEN_INPUTARGUMENTS 13993 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPEN_OUTPUTARGUMENTS 13994 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSE 13995 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSE_INPUTARGUMENTS 13996 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_READ 13997 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_READ_INPUTARGUMENTS 13998 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_READ_OUTPUTARGUMENTS 13999 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_WRITE 14000 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_WRITE_INPUTARGUMENTS 14001 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_GETPOSITION 14002 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 14003 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 14004 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_SETPOSITION 14005 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 14006 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_LASTUPDATETIME 14007 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPENWITHMASKS 14008 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 14009 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 14010 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSEANDUPDATE 14011 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 14012 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 14013 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_ADDCERTIFICATE 14014 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 14015 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_REMOVECERTIFICATE 14016 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 14017 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_CERTIFICATETYPES 14018 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP 14019 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST 14020 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_SIZE 14021 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_WRITABLE 14022 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_USERWRITABLE 14023 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENCOUNT 14024 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_MIMETYPE 14025 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPEN 14026 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPEN_INPUTARGUMENTS 14027 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPEN_OUTPUTARGUMENTS 14028 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSE 14029 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSE_INPUTARGUMENTS 14030 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_READ 14031 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_READ_INPUTARGUMENTS 14032 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_READ_OUTPUTARGUMENTS 14033 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_WRITE 14034 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_WRITE_INPUTARGUMENTS 14035 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_GETPOSITION 14036 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 14037 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 14038 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_SETPOSITION 14039 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 14040 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_LASTUPDATETIME 14041 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENWITHMASKS 14042 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 14043 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 14044 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSEANDUPDATE 14045 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 14046 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 14047 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_ADDCERTIFICATE 14048 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 14049 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_REMOVECERTIFICATE 14050 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 14051 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATIONTYPE_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_CERTIFICATETYPES 14052 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS 14053 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP 14088 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST 14089 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_SIZE 14090 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_WRITABLE 14091 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_USERWRITABLE 14092 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPENCOUNT 14093 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_MIMETYPE 14094 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPEN 14095 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPEN_INPUTARGUMENTS 14096 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPEN_OUTPUTARGUMENTS 14097 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSE 14098 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSE_INPUTARGUMENTS 14099 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_READ 14100 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_READ_INPUTARGUMENTS 14101 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_READ_OUTPUTARGUMENTS 14102 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_WRITE 14103 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_WRITE_INPUTARGUMENTS 14104 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_GETPOSITION 14105 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 14106 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 14107 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_SETPOSITION 14108 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 14109 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_LASTUPDATETIME 14110 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPENWITHMASKS 14111 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 14112 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 14113 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSEANDUPDATE 14114 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 14115 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 14116 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_ADDCERTIFICATE 14117 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 14118 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_REMOVECERTIFICATE 14119 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 14120 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTHTTPSGROUP_CERTIFICATETYPES 14121 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP 14122 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST 14123 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_SIZE 14124 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_WRITABLE 14125 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_USERWRITABLE 14126 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENCOUNT 14127 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_MIMETYPE 14128 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPEN 14129 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPEN_INPUTARGUMENTS 14130 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPEN_OUTPUTARGUMENTS 14131 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSE 14132 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSE_INPUTARGUMENTS 14133 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_READ 14134 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_READ_INPUTARGUMENTS 14135 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_READ_OUTPUTARGUMENTS 14136 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_WRITE 14137 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_WRITE_INPUTARGUMENTS 14138 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_GETPOSITION 14139 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_GETPOSITION_INPUTARGUMENTS 14140 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_GETPOSITION_OUTPUTARGUMENTS 14141 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_SETPOSITION 14142 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_SETPOSITION_INPUTARGUMENTS 14143 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_LASTUPDATETIME 14144 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENWITHMASKS 14145 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENWITHMASKS_INPUTARGUMENTS 14146 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_OPENWITHMASKS_OUTPUTARGUMENTS 14147 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSEANDUPDATE 14148 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 14149 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_CLOSEANDUPDATE_OUTPUTARGUMENTS 14150 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_ADDCERTIFICATE 14151 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_ADDCERTIFICATE_INPUTARGUMENTS 14152 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_REMOVECERTIFICATE 14153 /* Method */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_TRUSTLIST_REMOVECERTIFICATE_INPUTARGUMENTS 14154 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTUSERTOKENGROUP_CERTIFICATETYPES 14155 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP 14156 /* Object */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_WRITABLE 14157 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_USERWRITABLE 14158 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_MIMETYPE 14159 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_TRUSTLIST_CLOSEANDUPDATE_INPUTARGUMENTS 14160 /* Variable */ +#define UA_NS0ID_SERVERCONFIGURATION_CERTIFICATEGROUPS_DEFAULTAPPLICATIONGROUP_CERTIFICATETYPES 14161 /* Variable */ +#define UA_NS0ID_REMOVECONNECTIONMETHODTYPE 14183 /* Method */ +#define UA_NS0ID_REMOVECONNECTIONMETHODTYPE_INPUTARGUMENTS 14184 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE 14209 /* ObjectType */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDRESS 14221 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_REMOVEGROUP 14225 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_REMOVEGROUP_INPUTARGUMENTS 14226 /* Variable */ +#define UA_NS0ID_PUBSUBGROUPTYPE 14232 /* ObjectType */ +#define UA_NS0ID_PUBLISHEDVARIABLEDATATYPE 14273 /* DataType */ +#define UA_NS0ID_PUBLISHEDVARIABLEDATATYPE_ENCODING_DEFAULTXML 14319 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDVARIABLEDATATYPE 14320 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDVARIABLEDATATYPE_DATATYPEVERSION 14321 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDVARIABLEDATATYPE_DICTIONARYFRAGMENT 14322 /* Variable */ +#define UA_NS0ID_PUBLISHEDVARIABLEDATATYPE_ENCODING_DEFAULTBINARY 14323 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDVARIABLEDATATYPE 14324 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDVARIABLEDATATYPE_DATATYPEVERSION 14325 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDVARIABLEDATATYPE_DICTIONARYFRAGMENT 14326 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_SESSIONID 14413 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_SESSIONID 14414 /* Variable */ +#define UA_NS0ID_SERVER_SERVERREDUNDANCY_SERVERNETWORKGROUPS 14415 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE 14416 /* ObjectType */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER 14417 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_PUBLISHERID 14418 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_STATUS 14419 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_STATUS_STATE 14420 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_STATUS_ENABLE 14421 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_STATUS_DISABLE 14422 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_ADDRESS 14423 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_REMOVEGROUP 14424 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_REMOVEGROUP_INPUTARGUMENTS 14425 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_REMOVECONNECTION 14432 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_REMOVECONNECTION_INPUTARGUMENTS 14433 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS 14434 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDPUBLISHEDDATAITEMS 14435 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDPUBLISHEDDATAITEMS_INPUTARGUMENTS 14436 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDPUBLISHEDDATAITEMS_OUTPUTARGUMENTS 14437 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDPUBLISHEDEVENTS 14438 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDPUBLISHEDEVENTS_INPUTARGUMENTS 14439 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDPUBLISHEDEVENTS_OUTPUTARGUMENTS 14440 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_REMOVEPUBLISHEDDATASET 14441 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_REMOVEPUBLISHEDDATASET_INPUTARGUMENTS 14442 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE 14443 /* Object */ +#define UA_NS0ID_HASPUBSUBCONNECTION 14476 /* ReferenceType */ +#define UA_NS0ID_DATASETFOLDERTYPE 14477 /* ObjectType */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER 14478 /* Object */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDPUBLISHEDDATAITEMS 14479 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDPUBLISHEDDATAITEMS_INPUTARGUMENTS 14480 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDPUBLISHEDDATAITEMS_OUTPUTARGUMENTS 14481 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDPUBLISHEDEVENTS 14482 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDPUBLISHEDEVENTS_INPUTARGUMENTS 14483 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDPUBLISHEDEVENTS_OUTPUTARGUMENTS 14484 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_REMOVEPUBLISHEDDATASET 14485 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_REMOVEPUBLISHEDDATASET_INPUTARGUMENTS 14486 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_PUBLISHEDDATASETNAME_PLACEHOLDER 14487 /* Object */ +#define UA_NS0ID_DATASETFOLDERTYPE_PUBLISHEDDATASETNAME_PLACEHOLDER_CONFIGURATIONVERSION 14489 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMS 14493 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMS_INPUTARGUMENTS 14494 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMS_OUTPUTARGUMENTS 14495 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDEVENTS 14496 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDEVENTS_INPUTARGUMENTS 14497 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDEVENTS_OUTPUTARGUMENTS 14498 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_REMOVEPUBLISHEDDATASET 14499 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_REMOVEPUBLISHEDDATASET_INPUTARGUMENTS 14500 /* Variable */ +#define UA_NS0ID_ADDPUBLISHEDDATAITEMSMETHODTYPE 14501 /* Method */ +#define UA_NS0ID_ADDPUBLISHEDDATAITEMSMETHODTYPE_INPUTARGUMENTS 14502 /* Variable */ +#define UA_NS0ID_ADDPUBLISHEDDATAITEMSMETHODTYPE_OUTPUTARGUMENTS 14503 /* Variable */ +#define UA_NS0ID_ADDPUBLISHEDEVENTSMETHODTYPE 14504 /* Method */ +#define UA_NS0ID_ADDPUBLISHEDEVENTSMETHODTYPE_INPUTARGUMENTS 14505 /* Variable */ +#define UA_NS0ID_ADDPUBLISHEDEVENTSMETHODTYPE_OUTPUTARGUMENTS 14506 /* Variable */ +#define UA_NS0ID_REMOVEPUBLISHEDDATASETMETHODTYPE 14507 /* Method */ +#define UA_NS0ID_REMOVEPUBLISHEDDATASETMETHODTYPE_INPUTARGUMENTS 14508 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE 14509 /* ObjectType */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_CONFIGURATIONVERSION 14519 /* Variable */ +#define UA_NS0ID_DATASETMETADATATYPE 14523 /* DataType */ +#define UA_NS0ID_FIELDMETADATA 14524 /* DataType */ +#define UA_NS0ID_DATATYPEDESCRIPTION 14525 /* DataType */ +#define UA_NS0ID_STRUCTURETYPE_ENUMSTRINGS 14528 /* Variable */ +#define UA_NS0ID_KEYVALUEPAIR 14533 /* DataType */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE 14534 /* ObjectType */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_CONFIGURATIONVERSION 14544 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_PUBLISHEDDATA 14548 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_ADDVARIABLES 14555 /* Method */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_ADDVARIABLES_INPUTARGUMENTS 14556 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_ADDVARIABLES_OUTPUTARGUMENTS 14557 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_REMOVEVARIABLES 14558 /* Method */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_REMOVEVARIABLES_INPUTARGUMENTS 14559 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_REMOVEVARIABLES_OUTPUTARGUMENTS 14560 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSADDVARIABLESMETHODTYPE 14564 /* Method */ +#define UA_NS0ID_PUBLISHEDDATAITEMSADDVARIABLESMETHODTYPE_INPUTARGUMENTS 14565 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSADDVARIABLESMETHODTYPE_OUTPUTARGUMENTS 14566 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSREMOVEVARIABLESMETHODTYPE 14567 /* Method */ +#define UA_NS0ID_PUBLISHEDDATAITEMSREMOVEVARIABLESMETHODTYPE_INPUTARGUMENTS 14568 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSREMOVEVARIABLESMETHODTYPE_OUTPUTARGUMENTS 14569 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE 14572 /* ObjectType */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_CONFIGURATIONVERSION 14582 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_PUBSUBEVENTNOTIFIER 14586 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_SELECTEDFIELDS 14587 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_FILTER 14588 /* Variable */ +#define UA_NS0ID_CONFIGURATIONVERSIONDATATYPE 14593 /* DataType */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_PUBLISHERID 14595 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_STATUS 14600 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_STATUS_STATE 14601 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_STATUS_ENABLE 14602 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_STATUS_DISABLE 14603 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPEREMOVEGROUPMETHODTYPE 14604 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPEREMOVEGROUPMETHODTYPE_INPUTARGUMENTS 14605 /* Variable */ +#define UA_NS0ID_PUBSUBGROUPTYPEREMOVEWRITERMETHODTYPE 14623 /* Method */ +#define UA_NS0ID_PUBSUBGROUPTYPEREMOVEWRITERMETHODTYPE_INPUTARGUMENTS 14624 /* Variable */ +#define UA_NS0ID_PUBSUBGROUPTYPEREMOVEREADERMETHODTYPE 14625 /* Method */ +#define UA_NS0ID_PUBSUBGROUPTYPEREMOVEREADERMETHODTYPE_INPUTARGUMENTS 14626 /* Variable */ +#define UA_NS0ID_PUBSUBSTATUSTYPE 14643 /* ObjectType */ +#define UA_NS0ID_PUBSUBSTATUSTYPE_STATE 14644 /* Variable */ +#define UA_NS0ID_PUBSUBSTATUSTYPE_ENABLE 14645 /* Method */ +#define UA_NS0ID_PUBSUBSTATUSTYPE_DISABLE 14646 /* Method */ +#define UA_NS0ID_PUBSUBSTATE 14647 /* DataType */ +#define UA_NS0ID_PUBSUBSTATE_ENUMSTRINGS 14648 /* Variable */ +#define UA_NS0ID_FIELDTARGETDATATYPE 14744 /* DataType */ +#define UA_NS0ID_DATASETMETADATATYPE_ENCODING_DEFAULTXML 14794 /* Object */ +#define UA_NS0ID_FIELDMETADATA_ENCODING_DEFAULTXML 14795 /* Object */ +#define UA_NS0ID_DATATYPEDESCRIPTION_ENCODING_DEFAULTXML 14796 /* Object */ +#define UA_NS0ID_DATATYPEDEFINITION_ENCODING_DEFAULTXML 14797 /* Object */ +#define UA_NS0ID_STRUCTUREDEFINITION_ENCODING_DEFAULTXML 14798 /* Object */ +#define UA_NS0ID_ENUMDEFINITION_ENCODING_DEFAULTXML 14799 /* Object */ +#define UA_NS0ID_STRUCTUREFIELD_ENCODING_DEFAULTXML 14800 /* Object */ +#define UA_NS0ID_ENUMFIELD_ENCODING_DEFAULTXML 14801 /* Object */ +#define UA_NS0ID_KEYVALUEPAIR_ENCODING_DEFAULTXML 14802 /* Object */ +#define UA_NS0ID_CONFIGURATIONVERSIONDATATYPE_ENCODING_DEFAULTXML 14803 /* Object */ +#define UA_NS0ID_FIELDTARGETDATATYPE_ENCODING_DEFAULTXML 14804 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETMETADATATYPE 14805 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETMETADATATYPE_DATATYPEVERSION 14806 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETMETADATATYPE_DICTIONARYFRAGMENT 14807 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_FIELDMETADATA 14808 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_FIELDMETADATA_DATATYPEVERSION 14809 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_FIELDMETADATA_DICTIONARYFRAGMENT 14810 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATATYPEDESCRIPTION 14811 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATATYPEDESCRIPTION_DATATYPEVERSION 14812 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATATYPEDESCRIPTION_DICTIONARYFRAGMENT 14813 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENUMFIELD 14826 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENUMFIELD_DATATYPEVERSION 14827 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENUMFIELD_DICTIONARYFRAGMENT 14828 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_KEYVALUEPAIR 14829 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_KEYVALUEPAIR_DATATYPEVERSION 14830 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_KEYVALUEPAIR_DICTIONARYFRAGMENT 14831 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_CONFIGURATIONVERSIONDATATYPE 14832 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_CONFIGURATIONVERSIONDATATYPE_DATATYPEVERSION 14833 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_CONFIGURATIONVERSIONDATATYPE_DICTIONARYFRAGMENT 14834 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_FIELDTARGETDATATYPE 14835 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_FIELDTARGETDATATYPE_DATATYPEVERSION 14836 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_FIELDTARGETDATATYPE_DICTIONARYFRAGMENT 14837 /* Variable */ +#define UA_NS0ID_FIELDMETADATA_ENCODING_DEFAULTBINARY 14839 /* Object */ +#define UA_NS0ID_STRUCTUREFIELD_ENCODING_DEFAULTBINARY 14844 /* Object */ +#define UA_NS0ID_ENUMFIELD_ENCODING_DEFAULTBINARY 14845 /* Object */ +#define UA_NS0ID_KEYVALUEPAIR_ENCODING_DEFAULTBINARY 14846 /* Object */ +#define UA_NS0ID_CONFIGURATIONVERSIONDATATYPE_ENCODING_DEFAULTBINARY 14847 /* Object */ +#define UA_NS0ID_FIELDTARGETDATATYPE_ENCODING_DEFAULTBINARY 14848 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETMETADATATYPE 14849 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETMETADATATYPE_DATATYPEVERSION 14850 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETMETADATATYPE_DICTIONARYFRAGMENT 14851 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_FIELDMETADATA 14852 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_FIELDMETADATA_DATATYPEVERSION 14853 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_FIELDMETADATA_DICTIONARYFRAGMENT 14854 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATATYPEDESCRIPTION 14855 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATATYPEDESCRIPTION_DATATYPEVERSION 14856 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATATYPEDESCRIPTION_DICTIONARYFRAGMENT 14857 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENUMFIELD 14870 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENUMFIELD_DATATYPEVERSION 14871 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENUMFIELD_DICTIONARYFRAGMENT 14872 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_KEYVALUEPAIR 14873 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_KEYVALUEPAIR_DATATYPEVERSION 14874 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_KEYVALUEPAIR_DICTIONARYFRAGMENT 14875 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_CONFIGURATIONVERSIONDATATYPE 14876 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_CONFIGURATIONVERSIONDATATYPE_DATATYPEVERSION 14877 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_CONFIGURATIONVERSIONDATATYPE_DICTIONARYFRAGMENT 14878 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_FIELDTARGETDATATYPE_DATATYPEVERSION 14880 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_FIELDTARGETDATATYPE_DICTIONARYFRAGMENT 14881 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_EXPIRATIONLIMIT 14900 /* Variable */ +#define UA_NS0ID_DATASETTOWRITER 14936 /* ReferenceType */ +#define UA_NS0ID_DATATYPEDICTIONARYTYPE_DEPRECATED 15001 /* Variable */ +#define UA_NS0ID_MAXCHARACTERS 15002 /* Variable */ +#define UA_NS0ID_SERVERTYPE_URISVERSION 15003 /* Variable */ +#define UA_NS0ID_SERVER_URISVERSION 15004 /* Variable */ +#define UA_NS0ID_SIMPLETYPEDESCRIPTION 15005 /* DataType */ +#define UA_NS0ID_UABINARYFILEDATATYPE 15006 /* DataType */ +#define UA_NS0ID_BROKERCONNECTIONTRANSPORTDATATYPE 15007 /* DataType */ +#define UA_NS0ID_BROKERTRANSPORTQUALITYOFSERVICE 15008 /* DataType */ +#define UA_NS0ID_BROKERTRANSPORTQUALITYOFSERVICE_ENUMSTRINGS 15009 /* Variable */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_SECURITYGROUPNAME_PLACEHOLDER_KEYLIFETIME 15010 /* Variable */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_SECURITYGROUPNAME_PLACEHOLDER_SECURITYPOLICYURI 15011 /* Variable */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_SECURITYGROUPNAME_PLACEHOLDER_MAXFUTUREKEYCOUNT 15012 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE 15013 /* ObjectType */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_EVENTID 15014 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_EVENTTYPE 15015 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_SOURCENODE 15016 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_SOURCENAME 15017 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_TIME 15018 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_RECEIVETIME 15019 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_LOCALTIME 15020 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_MESSAGE 15021 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_SEVERITY 15022 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_ACTIONTIMESTAMP 15023 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_STATUS 15024 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_SERVERID 15025 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_CLIENTAUDITENTRYID 15026 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_CLIENTUSERID 15027 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_METHODID 15028 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONRESETEVENTTYPE_INPUTARGUMENTS 15029 /* Variable */ +#define UA_NS0ID_PERMISSIONTYPE_OPTIONSETVALUES 15030 /* Variable */ +#define UA_NS0ID_ACCESSLEVELTYPE 15031 /* DataType */ +#define UA_NS0ID_ACCESSLEVELTYPE_OPTIONSETVALUES 15032 /* Variable */ +#define UA_NS0ID_EVENTNOTIFIERTYPE 15033 /* DataType */ +#define UA_NS0ID_EVENTNOTIFIERTYPE_OPTIONSETVALUES 15034 /* Variable */ +#define UA_NS0ID_ACCESSRESTRICTIONTYPE_OPTIONSETVALUES 15035 /* Variable */ +#define UA_NS0ID_ATTRIBUTEWRITEMASK_OPTIONSETVALUES 15036 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DEPRECATED 15037 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_PROGRAMDIAGNOSTIC_LASTMETHODINPUTVALUES 15038 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DEPRECATED 15039 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_PROGRAMDIAGNOSTIC_LASTMETHODOUTPUTVALUES 15040 /* Variable */ +#define UA_NS0ID_KEYVALUEPAIR_ENCODING_DEFAULTJSON 15041 /* Object */ +#define UA_NS0ID_IDENTITYMAPPINGRULETYPE_ENCODING_DEFAULTJSON 15042 /* Object */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_SECURITYGROUPNAME_PLACEHOLDER_MAXPASTKEYCOUNT 15043 /* Variable */ +#define UA_NS0ID_TRUSTLISTDATATYPE_ENCODING_DEFAULTJSON 15044 /* Object */ +#define UA_NS0ID_DECIMALDATATYPE_ENCODING_DEFAULTJSON 15045 /* Object */ +#define UA_NS0ID_SECURITYGROUPTYPE_KEYLIFETIME 15046 /* Variable */ +#define UA_NS0ID_SECURITYGROUPTYPE_SECURITYPOLICYURI 15047 /* Variable */ +#define UA_NS0ID_SECURITYGROUPTYPE_MAXFUTUREKEYCOUNT 15048 /* Variable */ +#define UA_NS0ID_CONFIGURATIONVERSIONDATATYPE_ENCODING_DEFAULTJSON 15049 /* Object */ +#define UA_NS0ID_DATASETMETADATATYPE_ENCODING_DEFAULTJSON 15050 /* Object */ +#define UA_NS0ID_FIELDMETADATA_ENCODING_DEFAULTJSON 15051 /* Object */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_MODIFYFIELDSELECTION 15052 /* Method */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_MODIFYFIELDSELECTION_INPUTARGUMENTS 15053 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPEMODIFYFIELDSELECTIONMETHODTYPE 15054 /* Method */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPEMODIFYFIELDSELECTIONMETHODTYPE_INPUTARGUMENTS 15055 /* Variable */ +#define UA_NS0ID_SECURITYGROUPTYPE_MAXPASTKEYCOUNT 15056 /* Variable */ +#define UA_NS0ID_DATATYPEDESCRIPTION_ENCODING_DEFAULTJSON 15057 /* Object */ +#define UA_NS0ID_STRUCTUREDESCRIPTION_ENCODING_DEFAULTJSON 15058 /* Object */ +#define UA_NS0ID_ENUMDESCRIPTION_ENCODING_DEFAULTJSON 15059 /* Object */ +#define UA_NS0ID_PUBLISHEDVARIABLEDATATYPE_ENCODING_DEFAULTJSON 15060 /* Object */ +#define UA_NS0ID_FIELDTARGETDATATYPE_ENCODING_DEFAULTJSON 15061 /* Object */ +#define UA_NS0ID_ROLEPERMISSIONTYPE_ENCODING_DEFAULTJSON 15062 /* Object */ +#define UA_NS0ID_DATATYPEDEFINITION_ENCODING_DEFAULTJSON 15063 /* Object */ +#define UA_NS0ID_DATAGRAMCONNECTIONTRANSPORTTYPE 15064 /* ObjectType */ +#define UA_NS0ID_STRUCTUREFIELD_ENCODING_DEFAULTJSON 15065 /* Object */ +#define UA_NS0ID_STRUCTUREDEFINITION_ENCODING_DEFAULTJSON 15066 /* Object */ +#define UA_NS0ID_ENUMDEFINITION_ENCODING_DEFAULTJSON 15067 /* Object */ +#define UA_NS0ID_NODE_ENCODING_DEFAULTJSON 15068 /* Object */ +#define UA_NS0ID_INSTANCENODE_ENCODING_DEFAULTJSON 15069 /* Object */ +#define UA_NS0ID_TYPENODE_ENCODING_DEFAULTJSON 15070 /* Object */ +#define UA_NS0ID_OBJECTNODE_ENCODING_DEFAULTJSON 15071 /* Object */ +#define UA_NS0ID_DATAGRAMCONNECTIONTRANSPORTTYPE_DISCOVERYADDRESS 15072 /* Object */ +#define UA_NS0ID_OBJECTTYPENODE_ENCODING_DEFAULTJSON 15073 /* Object */ +#define UA_NS0ID_VARIABLENODE_ENCODING_DEFAULTJSON 15074 /* Object */ +#define UA_NS0ID_VARIABLETYPENODE_ENCODING_DEFAULTJSON 15075 /* Object */ +#define UA_NS0ID_REFERENCETYPENODE_ENCODING_DEFAULTJSON 15076 /* Object */ +#define UA_NS0ID_METHODNODE_ENCODING_DEFAULTJSON 15077 /* Object */ +#define UA_NS0ID_VIEWNODE_ENCODING_DEFAULTJSON 15078 /* Object */ +#define UA_NS0ID_DATATYPENODE_ENCODING_DEFAULTJSON 15079 /* Object */ +#define UA_NS0ID_REFERENCENODE_ENCODING_DEFAULTJSON 15080 /* Object */ +#define UA_NS0ID_ARGUMENT_ENCODING_DEFAULTJSON 15081 /* Object */ +#define UA_NS0ID_ENUMVALUETYPE_ENCODING_DEFAULTJSON 15082 /* Object */ +#define UA_NS0ID_ENUMFIELD_ENCODING_DEFAULTJSON 15083 /* Object */ +#define UA_NS0ID_OPTIONSET_ENCODING_DEFAULTJSON 15084 /* Object */ +#define UA_NS0ID_UNION_ENCODING_DEFAULTJSON 15085 /* Object */ +#define UA_NS0ID_TIMEZONEDATATYPE_ENCODING_DEFAULTJSON 15086 /* Object */ +#define UA_NS0ID_APPLICATIONDESCRIPTION_ENCODING_DEFAULTJSON 15087 /* Object */ +#define UA_NS0ID_REQUESTHEADER_ENCODING_DEFAULTJSON 15088 /* Object */ +#define UA_NS0ID_RESPONSEHEADER_ENCODING_DEFAULTJSON 15089 /* Object */ +#define UA_NS0ID_SERVICEFAULT_ENCODING_DEFAULTJSON 15090 /* Object */ +#define UA_NS0ID_SESSIONLESSINVOKEREQUESTTYPE_ENCODING_DEFAULTJSON 15091 /* Object */ +#define UA_NS0ID_SESSIONLESSINVOKERESPONSETYPE_ENCODING_DEFAULTJSON 15092 /* Object */ +#define UA_NS0ID_FINDSERVERSREQUEST_ENCODING_DEFAULTJSON 15093 /* Object */ +#define UA_NS0ID_FINDSERVERSRESPONSE_ENCODING_DEFAULTJSON 15094 /* Object */ +#define UA_NS0ID_SERVERONNETWORK_ENCODING_DEFAULTJSON 15095 /* Object */ +#define UA_NS0ID_FINDSERVERSONNETWORKREQUEST_ENCODING_DEFAULTJSON 15096 /* Object */ +#define UA_NS0ID_FINDSERVERSONNETWORKRESPONSE_ENCODING_DEFAULTJSON 15097 /* Object */ +#define UA_NS0ID_USERTOKENPOLICY_ENCODING_DEFAULTJSON 15098 /* Object */ +#define UA_NS0ID_ENDPOINTDESCRIPTION_ENCODING_DEFAULTJSON 15099 /* Object */ +#define UA_NS0ID_GETENDPOINTSREQUEST_ENCODING_DEFAULTJSON 15100 /* Object */ +#define UA_NS0ID_GETENDPOINTSRESPONSE_ENCODING_DEFAULTJSON 15101 /* Object */ +#define UA_NS0ID_REGISTEREDSERVER_ENCODING_DEFAULTJSON 15102 /* Object */ +#define UA_NS0ID_REGISTERSERVERREQUEST_ENCODING_DEFAULTJSON 15103 /* Object */ +#define UA_NS0ID_REGISTERSERVERRESPONSE_ENCODING_DEFAULTJSON 15104 /* Object */ +#define UA_NS0ID_DISCOVERYCONFIGURATION_ENCODING_DEFAULTJSON 15105 /* Object */ +#define UA_NS0ID_MDNSDISCOVERYCONFIGURATION_ENCODING_DEFAULTJSON 15106 /* Object */ +#define UA_NS0ID_REGISTERSERVER2REQUEST_ENCODING_DEFAULTJSON 15107 /* Object */ +#define UA_NS0ID_SUBSCRIBEDDATASETTYPE 15108 /* ObjectType */ +#define UA_NS0ID_CHOICESTATETYPE 15109 /* ObjectType */ +#define UA_NS0ID_CHOICESTATETYPE_STATENUMBER 15110 /* Variable */ +#define UA_NS0ID_TARGETVARIABLESTYPE 15111 /* ObjectType */ +#define UA_NS0ID_HASGUARD 15112 /* ReferenceType */ +#define UA_NS0ID_GUARDVARIABLETYPE 15113 /* VariableType */ +#define UA_NS0ID_TARGETVARIABLESTYPE_TARGETVARIABLES 15114 /* Variable */ +#define UA_NS0ID_TARGETVARIABLESTYPE_ADDTARGETVARIABLES 15115 /* Method */ +#define UA_NS0ID_TARGETVARIABLESTYPE_ADDTARGETVARIABLES_INPUTARGUMENTS 15116 /* Variable */ +#define UA_NS0ID_TARGETVARIABLESTYPE_ADDTARGETVARIABLES_OUTPUTARGUMENTS 15117 /* Variable */ +#define UA_NS0ID_TARGETVARIABLESTYPE_REMOVETARGETVARIABLES 15118 /* Method */ +#define UA_NS0ID_TARGETVARIABLESTYPE_REMOVETARGETVARIABLES_INPUTARGUMENTS 15119 /* Variable */ +#define UA_NS0ID_TARGETVARIABLESTYPE_REMOVETARGETVARIABLES_OUTPUTARGUMENTS 15120 /* Variable */ +#define UA_NS0ID_TARGETVARIABLESTYPEADDTARGETVARIABLESMETHODTYPE 15121 /* Method */ +#define UA_NS0ID_TARGETVARIABLESTYPEADDTARGETVARIABLESMETHODTYPE_INPUTARGUMENTS 15122 /* Variable */ +#define UA_NS0ID_TARGETVARIABLESTYPEADDTARGETVARIABLESMETHODTYPE_OUTPUTARGUMENTS 15123 /* Variable */ +#define UA_NS0ID_TARGETVARIABLESTYPEREMOVETARGETVARIABLESMETHODTYPE 15124 /* Method */ +#define UA_NS0ID_TARGETVARIABLESTYPEREMOVETARGETVARIABLESMETHODTYPE_INPUTARGUMENTS 15125 /* Variable */ +#define UA_NS0ID_TARGETVARIABLESTYPEREMOVETARGETVARIABLESMETHODTYPE_OUTPUTARGUMENTS 15126 /* Variable */ +#define UA_NS0ID_SUBSCRIBEDDATASETMIRRORTYPE 15127 /* ObjectType */ +#define UA_NS0ID_EXPRESSIONGUARDVARIABLETYPE 15128 /* VariableType */ +#define UA_NS0ID_EXPRESSIONGUARDVARIABLETYPE_EXPRESSION 15129 /* Variable */ +#define UA_NS0ID_REGISTERSERVER2RESPONSE_ENCODING_DEFAULTJSON 15130 /* Object */ +#define UA_NS0ID_CHANNELSECURITYTOKEN_ENCODING_DEFAULTJSON 15131 /* Object */ +#define UA_NS0ID_OPENSECURECHANNELREQUEST_ENCODING_DEFAULTJSON 15132 /* Object */ +#define UA_NS0ID_OPENSECURECHANNELRESPONSE_ENCODING_DEFAULTJSON 15133 /* Object */ +#define UA_NS0ID_CLOSESECURECHANNELREQUEST_ENCODING_DEFAULTJSON 15134 /* Object */ +#define UA_NS0ID_CLOSESECURECHANNELRESPONSE_ENCODING_DEFAULTJSON 15135 /* Object */ +#define UA_NS0ID_SIGNEDSOFTWARECERTIFICATE_ENCODING_DEFAULTJSON 15136 /* Object */ +#define UA_NS0ID_SIGNATUREDATA_ENCODING_DEFAULTJSON 15137 /* Object */ +#define UA_NS0ID_CREATESESSIONREQUEST_ENCODING_DEFAULTJSON 15138 /* Object */ +#define UA_NS0ID_CREATESESSIONRESPONSE_ENCODING_DEFAULTJSON 15139 /* Object */ +#define UA_NS0ID_USERIDENTITYTOKEN_ENCODING_DEFAULTJSON 15140 /* Object */ +#define UA_NS0ID_ANONYMOUSIDENTITYTOKEN_ENCODING_DEFAULTJSON 15141 /* Object */ +#define UA_NS0ID_USERNAMEIDENTITYTOKEN_ENCODING_DEFAULTJSON 15142 /* Object */ +#define UA_NS0ID_X509IDENTITYTOKEN_ENCODING_DEFAULTJSON 15143 /* Object */ +#define UA_NS0ID_ISSUEDIDENTITYTOKEN_ENCODING_DEFAULTJSON 15144 /* Object */ +#define UA_NS0ID_ACTIVATESESSIONREQUEST_ENCODING_DEFAULTJSON 15145 /* Object */ +#define UA_NS0ID_ACTIVATESESSIONRESPONSE_ENCODING_DEFAULTJSON 15146 /* Object */ +#define UA_NS0ID_CLOSESESSIONREQUEST_ENCODING_DEFAULTJSON 15147 /* Object */ +#define UA_NS0ID_CLOSESESSIONRESPONSE_ENCODING_DEFAULTJSON 15148 /* Object */ +#define UA_NS0ID_CANCELREQUEST_ENCODING_DEFAULTJSON 15149 /* Object */ +#define UA_NS0ID_CANCELRESPONSE_ENCODING_DEFAULTJSON 15150 /* Object */ +#define UA_NS0ID_NODEATTRIBUTES_ENCODING_DEFAULTJSON 15151 /* Object */ +#define UA_NS0ID_OBJECTATTRIBUTES_ENCODING_DEFAULTJSON 15152 /* Object */ +#define UA_NS0ID_VARIABLEATTRIBUTES_ENCODING_DEFAULTJSON 15153 /* Object */ +#define UA_NS0ID_DATAGRAMCONNECTIONTRANSPORTTYPE_DISCOVERYADDRESS_NETWORKINTERFACE 15154 /* Variable */ +#define UA_NS0ID_BROKERCONNECTIONTRANSPORTTYPE 15155 /* ObjectType */ +#define UA_NS0ID_BROKERCONNECTIONTRANSPORTTYPE_RESOURCEURI 15156 /* Variable */ +#define UA_NS0ID_METHODATTRIBUTES_ENCODING_DEFAULTJSON 15157 /* Object */ +#define UA_NS0ID_OBJECTTYPEATTRIBUTES_ENCODING_DEFAULTJSON 15158 /* Object */ +#define UA_NS0ID_VARIABLETYPEATTRIBUTES_ENCODING_DEFAULTJSON 15159 /* Object */ +#define UA_NS0ID_REFERENCETYPEATTRIBUTES_ENCODING_DEFAULTJSON 15160 /* Object */ +#define UA_NS0ID_DATATYPEATTRIBUTES_ENCODING_DEFAULTJSON 15161 /* Object */ +#define UA_NS0ID_VIEWATTRIBUTES_ENCODING_DEFAULTJSON 15162 /* Object */ +#define UA_NS0ID_GENERICATTRIBUTEVALUE_ENCODING_DEFAULTJSON 15163 /* Object */ +#define UA_NS0ID_GENERICATTRIBUTES_ENCODING_DEFAULTJSON 15164 /* Object */ +#define UA_NS0ID_ADDNODESITEM_ENCODING_DEFAULTJSON 15165 /* Object */ +#define UA_NS0ID_ADDNODESRESULT_ENCODING_DEFAULTJSON 15166 /* Object */ +#define UA_NS0ID_ADDNODESREQUEST_ENCODING_DEFAULTJSON 15167 /* Object */ +#define UA_NS0ID_ADDNODESRESPONSE_ENCODING_DEFAULTJSON 15168 /* Object */ +#define UA_NS0ID_ADDREFERENCESITEM_ENCODING_DEFAULTJSON 15169 /* Object */ +#define UA_NS0ID_ADDREFERENCESREQUEST_ENCODING_DEFAULTJSON 15170 /* Object */ +#define UA_NS0ID_ADDREFERENCESRESPONSE_ENCODING_DEFAULTJSON 15171 /* Object */ +#define UA_NS0ID_DELETENODESITEM_ENCODING_DEFAULTJSON 15172 /* Object */ +#define UA_NS0ID_DELETENODESREQUEST_ENCODING_DEFAULTJSON 15173 /* Object */ +#define UA_NS0ID_DELETENODESRESPONSE_ENCODING_DEFAULTJSON 15174 /* Object */ +#define UA_NS0ID_DELETEREFERENCESITEM_ENCODING_DEFAULTJSON 15175 /* Object */ +#define UA_NS0ID_DELETEREFERENCESREQUEST_ENCODING_DEFAULTJSON 15176 /* Object */ +#define UA_NS0ID_DELETEREFERENCESRESPONSE_ENCODING_DEFAULTJSON 15177 /* Object */ +#define UA_NS0ID_BROKERCONNECTIONTRANSPORTTYPE_AUTHENTICATIONPROFILEURI 15178 /* Variable */ +#define UA_NS0ID_VIEWDESCRIPTION_ENCODING_DEFAULTJSON 15179 /* Object */ +#define UA_NS0ID_BROWSEDESCRIPTION_ENCODING_DEFAULTJSON 15180 /* Object */ +#define UA_NS0ID_USERCREDENTIALCERTIFICATETYPE 15181 /* ObjectType */ +#define UA_NS0ID_REFERENCEDESCRIPTION_ENCODING_DEFAULTJSON 15182 /* Object */ +#define UA_NS0ID_BROWSERESULT_ENCODING_DEFAULTJSON 15183 /* Object */ +#define UA_NS0ID_BROWSEREQUEST_ENCODING_DEFAULTJSON 15184 /* Object */ +#define UA_NS0ID_BROWSERESPONSE_ENCODING_DEFAULTJSON 15185 /* Object */ +#define UA_NS0ID_BROWSENEXTREQUEST_ENCODING_DEFAULTJSON 15186 /* Object */ +#define UA_NS0ID_BROWSENEXTRESPONSE_ENCODING_DEFAULTJSON 15187 /* Object */ +#define UA_NS0ID_RELATIVEPATHELEMENT_ENCODING_DEFAULTJSON 15188 /* Object */ +#define UA_NS0ID_RELATIVEPATH_ENCODING_DEFAULTJSON 15189 /* Object */ +#define UA_NS0ID_BROWSEPATH_ENCODING_DEFAULTJSON 15190 /* Object */ +#define UA_NS0ID_BROWSEPATHTARGET_ENCODING_DEFAULTJSON 15191 /* Object */ +#define UA_NS0ID_BROWSEPATHRESULT_ENCODING_DEFAULTJSON 15192 /* Object */ +#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSREQUEST_ENCODING_DEFAULTJSON 15193 /* Object */ +#define UA_NS0ID_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE_ENCODING_DEFAULTJSON 15194 /* Object */ +#define UA_NS0ID_REGISTERNODESREQUEST_ENCODING_DEFAULTJSON 15195 /* Object */ +#define UA_NS0ID_REGISTERNODESRESPONSE_ENCODING_DEFAULTJSON 15196 /* Object */ +#define UA_NS0ID_UNREGISTERNODESREQUEST_ENCODING_DEFAULTJSON 15197 /* Object */ +#define UA_NS0ID_UNREGISTERNODESRESPONSE_ENCODING_DEFAULTJSON 15198 /* Object */ +#define UA_NS0ID_ENDPOINTCONFIGURATION_ENCODING_DEFAULTJSON 15199 /* Object */ +#define UA_NS0ID_QUERYDATADESCRIPTION_ENCODING_DEFAULTJSON 15200 /* Object */ +#define UA_NS0ID_NODETYPEDESCRIPTION_ENCODING_DEFAULTJSON 15201 /* Object */ +#define UA_NS0ID_QUERYDATASET_ENCODING_DEFAULTJSON 15202 /* Object */ +#define UA_NS0ID_NODEREFERENCE_ENCODING_DEFAULTJSON 15203 /* Object */ +#define UA_NS0ID_CONTENTFILTERELEMENT_ENCODING_DEFAULTJSON 15204 /* Object */ +#define UA_NS0ID_CONTENTFILTER_ENCODING_DEFAULTJSON 15205 /* Object */ +#define UA_NS0ID_FILTEROPERAND_ENCODING_DEFAULTJSON 15206 /* Object */ +#define UA_NS0ID_ELEMENTOPERAND_ENCODING_DEFAULTJSON 15207 /* Object */ +#define UA_NS0ID_LITERALOPERAND_ENCODING_DEFAULTJSON 15208 /* Object */ +#define UA_NS0ID_ATTRIBUTEOPERAND_ENCODING_DEFAULTJSON 15209 /* Object */ +#define UA_NS0ID_SIMPLEATTRIBUTEOPERAND_ENCODING_DEFAULTJSON 15210 /* Object */ +#define UA_NS0ID_CONTENTFILTERELEMENTRESULT_ENCODING_DEFAULTJSON 15211 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_GETSECURITYKEYS 15212 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_GETSECURITYKEYS_INPUTARGUMENTS 15213 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_GETSECURITYKEYS_OUTPUTARGUMENTS 15214 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_GETSECURITYKEYS 15215 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_GETSECURITYKEYS_INPUTARGUMENTS 15216 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_GETSECURITYKEYS_OUTPUTARGUMENTS 15217 /* Variable */ +#define UA_NS0ID_GETSECURITYKEYSMETHODTYPE 15218 /* Method */ +#define UA_NS0ID_GETSECURITYKEYSMETHODTYPE_INPUTARGUMENTS 15219 /* Variable */ +#define UA_NS0ID_GETSECURITYKEYSMETHODTYPE_OUTPUTARGUMENTS 15220 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_PUBLISHEDDATASETNAME_PLACEHOLDER_DATASETMETADATA 15221 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER 15222 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS 15223 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS_STATE 15224 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS_ENABLE 15225 /* Method */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS_DISABLE 15226 /* Method */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_TRANSPORTSETTINGS 15227 /* Object */ +#define UA_NS0ID_CONTENTFILTERRESULT_ENCODING_DEFAULTJSON 15228 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETMETADATA 15229 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER 15230 /* Object */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS 15231 /* Object */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS_STATE 15232 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS_ENABLE 15233 /* Method */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS_DISABLE 15234 /* Method */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_TRANSPORTSETTINGS 15235 /* Object */ +#define UA_NS0ID_PARSINGRESULT_ENCODING_DEFAULTJSON 15236 /* Object */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETMETADATA 15237 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER 15238 /* Object */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS 15239 /* Object */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS_STATE 15240 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS_ENABLE 15241 /* Method */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS_DISABLE 15242 /* Method */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_TRANSPORTSETTINGS 15243 /* Object */ +#define UA_NS0ID_QUERYFIRSTREQUEST_ENCODING_DEFAULTJSON 15244 /* Object */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETMETADATA 15245 /* Variable */ +#define UA_NS0ID_BROKERWRITERGROUPTRANSPORTTYPE_RESOURCEURI 15246 /* Variable */ +#define UA_NS0ID_BROKERWRITERGROUPTRANSPORTTYPE_AUTHENTICATIONPROFILEURI 15247 /* Variable */ +#define UA_NS0ID_CREATECREDENTIALMETHODTYPE 15248 /* Method */ +#define UA_NS0ID_BROKERWRITERGROUPTRANSPORTTYPE_REQUESTEDDELIVERYGUARANTEE 15249 /* Variable */ +#define UA_NS0ID_BROKERDATASETWRITERTRANSPORTTYPE_RESOURCEURI 15250 /* Variable */ +#define UA_NS0ID_BROKERDATASETWRITERTRANSPORTTYPE_AUTHENTICATIONPROFILEURI 15251 /* Variable */ +#define UA_NS0ID_QUERYFIRSTRESPONSE_ENCODING_DEFAULTJSON 15252 /* Object */ +#define UA_NS0ID_CREATECREDENTIALMETHODTYPE_INPUTARGUMENTS 15253 /* Variable */ +#define UA_NS0ID_QUERYNEXTREQUEST_ENCODING_DEFAULTJSON 15254 /* Object */ +#define UA_NS0ID_QUERYNEXTRESPONSE_ENCODING_DEFAULTJSON 15255 /* Object */ +#define UA_NS0ID_READVALUEID_ENCODING_DEFAULTJSON 15256 /* Object */ +#define UA_NS0ID_READREQUEST_ENCODING_DEFAULTJSON 15257 /* Object */ +#define UA_NS0ID_READRESPONSE_ENCODING_DEFAULTJSON 15258 /* Object */ +#define UA_NS0ID_HISTORYREADVALUEID_ENCODING_DEFAULTJSON 15259 /* Object */ +#define UA_NS0ID_HISTORYREADRESULT_ENCODING_DEFAULTJSON 15260 /* Object */ +#define UA_NS0ID_HISTORYREADDETAILS_ENCODING_DEFAULTJSON 15261 /* Object */ +#define UA_NS0ID_READEVENTDETAILS_ENCODING_DEFAULTJSON 15262 /* Object */ +#define UA_NS0ID_READRAWMODIFIEDDETAILS_ENCODING_DEFAULTJSON 15263 /* Object */ +#define UA_NS0ID_READPROCESSEDDETAILS_ENCODING_DEFAULTJSON 15264 /* Object */ +#define UA_NS0ID_PUBSUBGROUPTYPE_STATUS 15265 /* Object */ +#define UA_NS0ID_PUBSUBGROUPTYPE_STATUS_STATE 15266 /* Variable */ +#define UA_NS0ID_PUBSUBGROUPTYPE_STATUS_ENABLE 15267 /* Method */ +#define UA_NS0ID_PUBSUBGROUPTYPE_STATUS_DISABLE 15268 /* Method */ +#define UA_NS0ID_READATTIMEDETAILS_ENCODING_DEFAULTJSON 15269 /* Object */ +#define UA_NS0ID_HISTORYDATA_ENCODING_DEFAULTJSON 15270 /* Object */ +#define UA_NS0ID_MODIFICATIONINFO_ENCODING_DEFAULTJSON 15271 /* Object */ +#define UA_NS0ID_HISTORYMODIFIEDDATA_ENCODING_DEFAULTJSON 15272 /* Object */ +#define UA_NS0ID_HISTORYEVENT_ENCODING_DEFAULTJSON 15273 /* Object */ +#define UA_NS0ID_HISTORYREADREQUEST_ENCODING_DEFAULTJSON 15274 /* Object */ +#define UA_NS0ID_HISTORYREADRESPONSE_ENCODING_DEFAULTJSON 15275 /* Object */ +#define UA_NS0ID_WRITEVALUE_ENCODING_DEFAULTJSON 15276 /* Object */ +#define UA_NS0ID_WRITEREQUEST_ENCODING_DEFAULTJSON 15277 /* Object */ +#define UA_NS0ID_WRITERESPONSE_ENCODING_DEFAULTJSON 15278 /* Object */ +#define UA_NS0ID_HISTORYUPDATEDETAILS_ENCODING_DEFAULTJSON 15279 /* Object */ +#define UA_NS0ID_UPDATEDATADETAILS_ENCODING_DEFAULTJSON 15280 /* Object */ +#define UA_NS0ID_UPDATESTRUCTUREDATADETAILS_ENCODING_DEFAULTJSON 15281 /* Object */ +#define UA_NS0ID_UPDATEEVENTDETAILS_ENCODING_DEFAULTJSON 15282 /* Object */ +#define UA_NS0ID_DELETERAWMODIFIEDDETAILS_ENCODING_DEFAULTJSON 15283 /* Object */ +#define UA_NS0ID_DELETEATTIMEDETAILS_ENCODING_DEFAULTJSON 15284 /* Object */ +#define UA_NS0ID_DELETEEVENTDETAILS_ENCODING_DEFAULTJSON 15285 /* Object */ +#define UA_NS0ID_HISTORYUPDATERESULT_ENCODING_DEFAULTJSON 15286 /* Object */ +#define UA_NS0ID_HISTORYUPDATEREQUEST_ENCODING_DEFAULTJSON 15287 /* Object */ +#define UA_NS0ID_HISTORYUPDATERESPONSE_ENCODING_DEFAULTJSON 15288 /* Object */ +#define UA_NS0ID_CALLMETHODREQUEST_ENCODING_DEFAULTJSON 15289 /* Object */ +#define UA_NS0ID_CALLMETHODRESULT_ENCODING_DEFAULTJSON 15290 /* Object */ +#define UA_NS0ID_CALLREQUEST_ENCODING_DEFAULTJSON 15291 /* Object */ +#define UA_NS0ID_CALLRESPONSE_ENCODING_DEFAULTJSON 15292 /* Object */ +#define UA_NS0ID_MONITORINGFILTER_ENCODING_DEFAULTJSON 15293 /* Object */ +#define UA_NS0ID_DATACHANGEFILTER_ENCODING_DEFAULTJSON 15294 /* Object */ +#define UA_NS0ID_EVENTFILTER_ENCODING_DEFAULTJSON 15295 /* Object */ +#define UA_NS0ID_HASDATASETWRITER 15296 /* ReferenceType */ +#define UA_NS0ID_HASDATASETREADER 15297 /* ReferenceType */ +#define UA_NS0ID_DATASETWRITERTYPE 15298 /* ObjectType */ +#define UA_NS0ID_DATASETWRITERTYPE_STATUS 15299 /* Object */ +#define UA_NS0ID_DATASETWRITERTYPE_STATUS_STATE 15300 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_STATUS_ENABLE 15301 /* Method */ +#define UA_NS0ID_DATASETWRITERTYPE_STATUS_DISABLE 15302 /* Method */ +#define UA_NS0ID_DATASETWRITERTYPE_TRANSPORTSETTINGS 15303 /* Object */ +#define UA_NS0ID_AGGREGATECONFIGURATION_ENCODING_DEFAULTJSON 15304 /* Object */ +#define UA_NS0ID_DATASETWRITERTRANSPORTTYPE 15305 /* ObjectType */ +#define UA_NS0ID_DATASETREADERTYPE 15306 /* ObjectType */ +#define UA_NS0ID_DATASETREADERTYPE_STATUS 15307 /* Object */ +#define UA_NS0ID_DATASETREADERTYPE_STATUS_STATE 15308 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_STATUS_ENABLE 15309 /* Method */ +#define UA_NS0ID_DATASETREADERTYPE_STATUS_DISABLE 15310 /* Method */ +#define UA_NS0ID_DATASETREADERTYPE_TRANSPORTSETTINGS 15311 /* Object */ +#define UA_NS0ID_AGGREGATEFILTER_ENCODING_DEFAULTJSON 15312 /* Object */ +#define UA_NS0ID_MONITORINGFILTERRESULT_ENCODING_DEFAULTJSON 15313 /* Object */ +#define UA_NS0ID_EVENTFILTERRESULT_ENCODING_DEFAULTJSON 15314 /* Object */ +#define UA_NS0ID_AGGREGATEFILTERRESULT_ENCODING_DEFAULTJSON 15315 /* Object */ +#define UA_NS0ID_DATASETREADERTYPE_SUBSCRIBEDDATASET 15316 /* Object */ +#define UA_NS0ID_ELSEGUARDVARIABLETYPE 15317 /* VariableType */ +#define UA_NS0ID_BASEANALOGTYPE 15318 /* VariableType */ +#define UA_NS0ID_DATASETREADERTRANSPORTTYPE 15319 /* ObjectType */ +#define UA_NS0ID_MONITORINGPARAMETERS_ENCODING_DEFAULTJSON 15320 /* Object */ +#define UA_NS0ID_MONITOREDITEMCREATEREQUEST_ENCODING_DEFAULTJSON 15321 /* Object */ +#define UA_NS0ID_MONITOREDITEMCREATERESULT_ENCODING_DEFAULTJSON 15322 /* Object */ +#define UA_NS0ID_CREATEMONITOREDITEMSREQUEST_ENCODING_DEFAULTJSON 15323 /* Object */ +#define UA_NS0ID_CREATEMONITOREDITEMSRESPONSE_ENCODING_DEFAULTJSON 15324 /* Object */ +#define UA_NS0ID_MONITOREDITEMMODIFYREQUEST_ENCODING_DEFAULTJSON 15325 /* Object */ +#define UA_NS0ID_MONITOREDITEMMODIFYRESULT_ENCODING_DEFAULTJSON 15326 /* Object */ +#define UA_NS0ID_MODIFYMONITOREDITEMSREQUEST_ENCODING_DEFAULTJSON 15327 /* Object */ +#define UA_NS0ID_MODIFYMONITOREDITEMSRESPONSE_ENCODING_DEFAULTJSON 15328 /* Object */ +#define UA_NS0ID_SETMONITORINGMODEREQUEST_ENCODING_DEFAULTJSON 15329 /* Object */ +#define UA_NS0ID_BROKERDATASETWRITERTRANSPORTTYPE_REQUESTEDDELIVERYGUARANTEE 15330 /* Variable */ +#define UA_NS0ID_SETMONITORINGMODERESPONSE_ENCODING_DEFAULTJSON 15331 /* Object */ +#define UA_NS0ID_SETTRIGGERINGREQUEST_ENCODING_DEFAULTJSON 15332 /* Object */ +#define UA_NS0ID_SETTRIGGERINGRESPONSE_ENCODING_DEFAULTJSON 15333 /* Object */ +#define UA_NS0ID_BROKERDATASETREADERTRANSPORTTYPE_RESOURCEURI 15334 /* Variable */ +#define UA_NS0ID_DELETEMONITOREDITEMSREQUEST_ENCODING_DEFAULTJSON 15335 /* Object */ +#define UA_NS0ID_DELETEMONITOREDITEMSRESPONSE_ENCODING_DEFAULTJSON 15336 /* Object */ +#define UA_NS0ID_CREATESUBSCRIPTIONREQUEST_ENCODING_DEFAULTJSON 15337 /* Object */ +#define UA_NS0ID_CREATESUBSCRIPTIONRESPONSE_ENCODING_DEFAULTJSON 15338 /* Object */ +#define UA_NS0ID_MODIFYSUBSCRIPTIONREQUEST_ENCODING_DEFAULTJSON 15339 /* Object */ +#define UA_NS0ID_MODIFYSUBSCRIPTIONRESPONSE_ENCODING_DEFAULTJSON 15340 /* Object */ +#define UA_NS0ID_SETPUBLISHINGMODEREQUEST_ENCODING_DEFAULTJSON 15341 /* Object */ +#define UA_NS0ID_SETPUBLISHINGMODERESPONSE_ENCODING_DEFAULTJSON 15342 /* Object */ +#define UA_NS0ID_NOTIFICATIONMESSAGE_ENCODING_DEFAULTJSON 15343 /* Object */ +#define UA_NS0ID_NOTIFICATIONDATA_ENCODING_DEFAULTJSON 15344 /* Object */ +#define UA_NS0ID_DATACHANGENOTIFICATION_ENCODING_DEFAULTJSON 15345 /* Object */ +#define UA_NS0ID_MONITOREDITEMNOTIFICATION_ENCODING_DEFAULTJSON 15346 /* Object */ +#define UA_NS0ID_EVENTNOTIFICATIONLIST_ENCODING_DEFAULTJSON 15347 /* Object */ +#define UA_NS0ID_EVENTFIELDLIST_ENCODING_DEFAULTJSON 15348 /* Object */ +#define UA_NS0ID_HISTORYEVENTFIELDLIST_ENCODING_DEFAULTJSON 15349 /* Object */ +#define UA_NS0ID_STATUSCHANGENOTIFICATION_ENCODING_DEFAULTJSON 15350 /* Object */ +#define UA_NS0ID_SUBSCRIPTIONACKNOWLEDGEMENT_ENCODING_DEFAULTJSON 15351 /* Object */ +#define UA_NS0ID_PUBLISHREQUEST_ENCODING_DEFAULTJSON 15352 /* Object */ +#define UA_NS0ID_PUBLISHRESPONSE_ENCODING_DEFAULTJSON 15353 /* Object */ +#define UA_NS0ID_REPUBLISHREQUEST_ENCODING_DEFAULTJSON 15354 /* Object */ +#define UA_NS0ID_REPUBLISHRESPONSE_ENCODING_DEFAULTJSON 15355 /* Object */ +#define UA_NS0ID_TRANSFERRESULT_ENCODING_DEFAULTJSON 15356 /* Object */ +#define UA_NS0ID_TRANSFERSUBSCRIPTIONSREQUEST_ENCODING_DEFAULTJSON 15357 /* Object */ +#define UA_NS0ID_TRANSFERSUBSCRIPTIONSRESPONSE_ENCODING_DEFAULTJSON 15358 /* Object */ +#define UA_NS0ID_DELETESUBSCRIPTIONSREQUEST_ENCODING_DEFAULTJSON 15359 /* Object */ +#define UA_NS0ID_DELETESUBSCRIPTIONSRESPONSE_ENCODING_DEFAULTJSON 15360 /* Object */ +#define UA_NS0ID_BUILDINFO_ENCODING_DEFAULTJSON 15361 /* Object */ +#define UA_NS0ID_REDUNDANTSERVERDATATYPE_ENCODING_DEFAULTJSON 15362 /* Object */ +#define UA_NS0ID_ENDPOINTURLLISTDATATYPE_ENCODING_DEFAULTJSON 15363 /* Object */ +#define UA_NS0ID_NETWORKGROUPDATATYPE_ENCODING_DEFAULTJSON 15364 /* Object */ +#define UA_NS0ID_SAMPLINGINTERVALDIAGNOSTICSDATATYPE_ENCODING_DEFAULTJSON 15365 /* Object */ +#define UA_NS0ID_SERVERDIAGNOSTICSSUMMARYDATATYPE_ENCODING_DEFAULTJSON 15366 /* Object */ +#define UA_NS0ID_SERVERSTATUSDATATYPE_ENCODING_DEFAULTJSON 15367 /* Object */ +#define UA_NS0ID_SESSIONDIAGNOSTICSDATATYPE_ENCODING_DEFAULTJSON 15368 /* Object */ +#define UA_NS0ID_SESSIONSECURITYDIAGNOSTICSDATATYPE_ENCODING_DEFAULTJSON 15369 /* Object */ +#define UA_NS0ID_SERVICECOUNTERDATATYPE_ENCODING_DEFAULTJSON 15370 /* Object */ +#define UA_NS0ID_STATUSRESULT_ENCODING_DEFAULTJSON 15371 /* Object */ +#define UA_NS0ID_SUBSCRIPTIONDIAGNOSTICSDATATYPE_ENCODING_DEFAULTJSON 15372 /* Object */ +#define UA_NS0ID_MODELCHANGESTRUCTUREDATATYPE_ENCODING_DEFAULTJSON 15373 /* Object */ +#define UA_NS0ID_SEMANTICCHANGESTRUCTUREDATATYPE_ENCODING_DEFAULTJSON 15374 /* Object */ +#define UA_NS0ID_RANGE_ENCODING_DEFAULTJSON 15375 /* Object */ +#define UA_NS0ID_EUINFORMATION_ENCODING_DEFAULTJSON 15376 /* Object */ +#define UA_NS0ID_COMPLEXNUMBERTYPE_ENCODING_DEFAULTJSON 15377 /* Object */ +#define UA_NS0ID_DOUBLECOMPLEXNUMBERTYPE_ENCODING_DEFAULTJSON 15378 /* Object */ +#define UA_NS0ID_AXISINFORMATION_ENCODING_DEFAULTJSON 15379 /* Object */ +#define UA_NS0ID_XVTYPE_ENCODING_DEFAULTJSON 15380 /* Object */ +#define UA_NS0ID_PROGRAMDIAGNOSTICDATATYPE_ENCODING_DEFAULTJSON 15381 /* Object */ +#define UA_NS0ID_ANNOTATION_ENCODING_DEFAULTJSON 15382 /* Object */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2TYPE 15383 /* VariableType */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2TYPE_CREATESESSIONID 15384 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2TYPE_CREATECLIENTNAME 15385 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2TYPE_INVOCATIONCREATIONTIME 15386 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2TYPE_LASTTRANSITIONTIME 15387 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2TYPE_LASTMETHODCALL 15388 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2TYPE_LASTMETHODSESSIONID 15389 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2TYPE_LASTMETHODINPUTARGUMENTS 15390 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2TYPE_LASTMETHODOUTPUTARGUMENTS 15391 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2TYPE_LASTMETHODINPUTVALUES 15392 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2TYPE_LASTMETHODOUTPUTVALUES 15393 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2TYPE_LASTMETHODCALLTIME 15394 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2TYPE_LASTMETHODRETURNSTATUS 15395 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2DATATYPE 15396 /* DataType */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2DATATYPE_ENCODING_DEFAULTBINARY 15397 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PROGRAMDIAGNOSTIC2DATATYPE 15398 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PROGRAMDIAGNOSTIC2DATATYPE_DATATYPEVERSION 15399 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PROGRAMDIAGNOSTIC2DATATYPE_DICTIONARYFRAGMENT 15400 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2DATATYPE_ENCODING_DEFAULTXML 15401 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PROGRAMDIAGNOSTIC2DATATYPE 15402 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PROGRAMDIAGNOSTIC2DATATYPE_DATATYPEVERSION 15403 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PROGRAMDIAGNOSTIC2DATATYPE_DICTIONARYFRAGMENT 15404 /* Variable */ +#define UA_NS0ID_PROGRAMDIAGNOSTIC2DATATYPE_ENCODING_DEFAULTJSON 15405 /* Object */ +#define UA_NS0ID_ACCESSLEVELEXTYPE 15406 /* DataType */ +#define UA_NS0ID_ACCESSLEVELEXTYPE_OPTIONSETVALUES 15407 /* Variable */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_APPLICATIONSEXCLUDE 15408 /* Variable */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_ENDPOINTSEXCLUDE 15409 /* Variable */ +#define UA_NS0ID_ROLETYPE_APPLICATIONSEXCLUDE 15410 /* Variable */ +#define UA_NS0ID_ROLETYPE_ENDPOINTSEXCLUDE 15411 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_APPLICATIONSEXCLUDE 15412 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_ENDPOINTSEXCLUDE 15413 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_APPLICATIONSEXCLUDE 15414 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_ENDPOINTSEXCLUDE 15415 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_APPLICATIONSEXCLUDE 15416 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_ENDPOINTSEXCLUDE 15417 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_APPLICATIONSEXCLUDE 15418 /* Variable */ +#define UA_NS0ID_BROKERDATASETREADERTRANSPORTTYPE_AUTHENTICATIONPROFILEURI 15419 /* Variable */ +#define UA_NS0ID_BROKERDATASETREADERTRANSPORTTYPE_REQUESTEDDELIVERYGUARANTEE 15420 /* Variable */ +#define UA_NS0ID_SIMPLETYPEDESCRIPTION_ENCODING_DEFAULTBINARY 15421 /* Object */ +#define UA_NS0ID_UABINARYFILEDATATYPE_ENCODING_DEFAULTBINARY 15422 /* Object */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_ENDPOINTSEXCLUDE 15423 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_APPLICATIONSEXCLUDE 15424 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_ENDPOINTSEXCLUDE 15425 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_APPLICATIONSEXCLUDE 15426 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_ENDPOINTSEXCLUDE 15427 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_APPLICATIONSEXCLUDE 15428 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_ENDPOINTSEXCLUDE 15429 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_APPLICATIONSEXCLUDE 15430 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_GETSECURITYGROUP 15431 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_GETSECURITYGROUP_INPUTARGUMENTS 15432 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_GETSECURITYGROUP_OUTPUTARGUMENTS 15433 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_SECURITYGROUPS 15434 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_SECURITYGROUPS_ADDSECURITYGROUP 15435 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_SECURITYGROUPS_ADDSECURITYGROUP_INPUTARGUMENTS 15436 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_SECURITYGROUPS_ADDSECURITYGROUP_OUTPUTARGUMENTS 15437 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_SECURITYGROUPS_REMOVESECURITYGROUP 15438 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_SECURITYGROUPS_REMOVESECURITYGROUP_INPUTARGUMENTS 15439 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_GETSECURITYGROUP 15440 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_GETSECURITYGROUP_INPUTARGUMENTS 15441 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_GETSECURITYGROUP_OUTPUTARGUMENTS 15442 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_SECURITYGROUPS 15443 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_SECURITYGROUPS_ADDSECURITYGROUP 15444 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_SECURITYGROUPS_ADDSECURITYGROUP_INPUTARGUMENTS 15445 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_SECURITYGROUPS_ADDSECURITYGROUP_OUTPUTARGUMENTS 15446 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_SECURITYGROUPS_REMOVESECURITYGROUP 15447 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_SECURITYGROUPS_REMOVESECURITYGROUP_INPUTARGUMENTS 15448 /* Variable */ +#define UA_NS0ID_GETSECURITYGROUPMETHODTYPE 15449 /* Method */ +#define UA_NS0ID_GETSECURITYGROUPMETHODTYPE_INPUTARGUMENTS 15450 /* Variable */ +#define UA_NS0ID_GETSECURITYGROUPMETHODTYPE_OUTPUTARGUMENTS 15451 /* Variable */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE 15452 /* ObjectType */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_SECURITYGROUPFOLDERNAME_PLACEHOLDER 15453 /* Object */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_SECURITYGROUPFOLDERNAME_PLACEHOLDER_ADDSECURITYGROUP 15454 /* Method */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_SECURITYGROUPFOLDERNAME_PLACEHOLDER_ADDSECURITYGROUP_INPUTARGUMENTS 15455 /* Variable */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_SECURITYGROUPFOLDERNAME_PLACEHOLDER_ADDSECURITYGROUP_OUTPUTARGUMENTS 15456 /* Variable */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_SECURITYGROUPFOLDERNAME_PLACEHOLDER_REMOVESECURITYGROUP 15457 /* Method */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_SECURITYGROUPFOLDERNAME_PLACEHOLDER_REMOVESECURITYGROUP_INPUTARGUMENTS 15458 /* Variable */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_SECURITYGROUPNAME_PLACEHOLDER 15459 /* Object */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_SECURITYGROUPNAME_PLACEHOLDER_SECURITYGROUPID 15460 /* Variable */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_ADDSECURITYGROUP 15461 /* Method */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_ADDSECURITYGROUP_INPUTARGUMENTS 15462 /* Variable */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_ADDSECURITYGROUP_OUTPUTARGUMENTS 15463 /* Variable */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_REMOVESECURITYGROUP 15464 /* Method */ +#define UA_NS0ID_SECURITYGROUPFOLDERTYPE_REMOVESECURITYGROUP_INPUTARGUMENTS 15465 /* Variable */ +#define UA_NS0ID_ADDSECURITYGROUPMETHODTYPE 15466 /* Method */ +#define UA_NS0ID_ADDSECURITYGROUPMETHODTYPE_INPUTARGUMENTS 15467 /* Variable */ +#define UA_NS0ID_ADDSECURITYGROUPMETHODTYPE_OUTPUTARGUMENTS 15468 /* Variable */ +#define UA_NS0ID_REMOVESECURITYGROUPMETHODTYPE 15469 /* Method */ +#define UA_NS0ID_REMOVESECURITYGROUPMETHODTYPE_INPUTARGUMENTS 15470 /* Variable */ +#define UA_NS0ID_SECURITYGROUPTYPE 15471 /* ObjectType */ +#define UA_NS0ID_SECURITYGROUPTYPE_SECURITYGROUPID 15472 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_PUBLISHEDDATASETNAME_PLACEHOLDER_EXTENSIONFIELDS 15473 /* Object */ +#define UA_NS0ID_DATASETFOLDERTYPE_PUBLISHEDDATASETNAME_PLACEHOLDER_EXTENSIONFIELDS_ADDEXTENSIONFIELD 15474 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_PUBLISHEDDATASETNAME_PLACEHOLDER_EXTENSIONFIELDS_ADDEXTENSIONFIELD_INPUTARGUMENTS 15475 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_PUBLISHEDDATASETNAME_PLACEHOLDER_EXTENSIONFIELDS_ADDEXTENSIONFIELD_OUTPUTARGUMENTS 15476 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_PUBLISHEDDATASETNAME_PLACEHOLDER_EXTENSIONFIELDS_REMOVEEXTENSIONFIELD 15477 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_PUBLISHEDDATASETNAME_PLACEHOLDER_EXTENSIONFIELDS_REMOVEEXTENSIONFIELD_INPUTARGUMENTS 15478 /* Variable */ +#define UA_NS0ID_BROKERCONNECTIONTRANSPORTDATATYPE_ENCODING_DEFAULTBINARY 15479 /* Object */ +#define UA_NS0ID_WRITERGROUPDATATYPE 15480 /* DataType */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_EXTENSIONFIELDS 15481 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_EXTENSIONFIELDS_ADDEXTENSIONFIELD 15482 /* Method */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_EXTENSIONFIELDS_ADDEXTENSIONFIELD_INPUTARGUMENTS 15483 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_EXTENSIONFIELDS_ADDEXTENSIONFIELD_OUTPUTARGUMENTS 15484 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_EXTENSIONFIELDS_REMOVEEXTENSIONFIELD 15485 /* Method */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_EXTENSIONFIELDS_REMOVEEXTENSIONFIELD_INPUTARGUMENTS 15486 /* Variable */ +#define UA_NS0ID_STRUCTUREDESCRIPTION 15487 /* DataType */ +#define UA_NS0ID_ENUMDESCRIPTION 15488 /* DataType */ +#define UA_NS0ID_EXTENSIONFIELDSTYPE 15489 /* ObjectType */ +#define UA_NS0ID_EXTENSIONFIELDSTYPE_EXTENSIONFIELDNAME_PLACEHOLDER 15490 /* Variable */ +#define UA_NS0ID_EXTENSIONFIELDSTYPE_ADDEXTENSIONFIELD 15491 /* Method */ +#define UA_NS0ID_EXTENSIONFIELDSTYPE_ADDEXTENSIONFIELD_INPUTARGUMENTS 15492 /* Variable */ +#define UA_NS0ID_EXTENSIONFIELDSTYPE_ADDEXTENSIONFIELD_OUTPUTARGUMENTS 15493 /* Variable */ +#define UA_NS0ID_EXTENSIONFIELDSTYPE_REMOVEEXTENSIONFIELD 15494 /* Method */ +#define UA_NS0ID_EXTENSIONFIELDSTYPE_REMOVEEXTENSIONFIELD_INPUTARGUMENTS 15495 /* Variable */ +#define UA_NS0ID_ADDEXTENSIONFIELDMETHODTYPE 15496 /* Method */ +#define UA_NS0ID_ADDEXTENSIONFIELDMETHODTYPE_INPUTARGUMENTS 15497 /* Variable */ +#define UA_NS0ID_ADDEXTENSIONFIELDMETHODTYPE_OUTPUTARGUMENTS 15498 /* Variable */ +#define UA_NS0ID_REMOVEEXTENSIONFIELDMETHODTYPE 15499 /* Method */ +#define UA_NS0ID_REMOVEEXTENSIONFIELDMETHODTYPE_INPUTARGUMENTS 15500 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SIMPLETYPEDESCRIPTION 15501 /* Variable */ +#define UA_NS0ID_NETWORKADDRESSDATATYPE 15502 /* DataType */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_EXTENSIONFIELDS 15503 /* Object */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_EXTENSIONFIELDS_ADDEXTENSIONFIELD 15504 /* Method */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_EXTENSIONFIELDS_ADDEXTENSIONFIELD_INPUTARGUMENTS 15505 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_EXTENSIONFIELDS_ADDEXTENSIONFIELD_OUTPUTARGUMENTS 15506 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_EXTENSIONFIELDS_REMOVEEXTENSIONFIELD 15507 /* Method */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_EXTENSIONFIELDS_REMOVEEXTENSIONFIELD_INPUTARGUMENTS 15508 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SIMPLETYPEDESCRIPTION_DATATYPEVERSION 15509 /* Variable */ +#define UA_NS0ID_NETWORKADDRESSURLDATATYPE 15510 /* DataType */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_EXTENSIONFIELDS 15511 /* Object */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_EXTENSIONFIELDS_ADDEXTENSIONFIELD 15512 /* Method */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_EXTENSIONFIELDS_ADDEXTENSIONFIELD_INPUTARGUMENTS 15513 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_EXTENSIONFIELDS_ADDEXTENSIONFIELD_OUTPUTARGUMENTS 15514 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_EXTENSIONFIELDS_REMOVEEXTENSIONFIELD 15515 /* Method */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_EXTENSIONFIELDS_REMOVEEXTENSIONFIELD_INPUTARGUMENTS 15516 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_MODIFYFIELDSELECTION_OUTPUTARGUMENTS 15517 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPEMODIFYFIELDSELECTIONMETHODTYPE_OUTPUTARGUMENTS 15518 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SIMPLETYPEDESCRIPTION_DICTIONARYFRAGMENT 15519 /* Variable */ +#define UA_NS0ID_READERGROUPDATATYPE 15520 /* DataType */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UABINARYFILEDATATYPE 15521 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UABINARYFILEDATATYPE_DATATYPEVERSION 15522 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UABINARYFILEDATATYPE_DICTIONARYFRAGMENT 15523 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BROKERCONNECTIONTRANSPORTDATATYPE 15524 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BROKERCONNECTIONTRANSPORTDATATYPE_DATATYPEVERSION 15525 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BROKERCONNECTIONTRANSPORTDATATYPE_DICTIONARYFRAGMENT 15526 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_ENDPOINTSEXCLUDE 15527 /* Variable */ +#define UA_NS0ID_ENDPOINTTYPE 15528 /* DataType */ +#define UA_NS0ID_SIMPLETYPEDESCRIPTION_ENCODING_DEFAULTXML 15529 /* Object */ +#define UA_NS0ID_PUBSUBCONFIGURATIONDATATYPE 15530 /* DataType */ +#define UA_NS0ID_UABINARYFILEDATATYPE_ENCODING_DEFAULTXML 15531 /* Object */ +#define UA_NS0ID_DATAGRAMWRITERGROUPTRANSPORTDATATYPE 15532 /* DataType */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_ADDRESS_NETWORKINTERFACE 15533 /* Variable */ +#define UA_NS0ID_DATATYPESCHEMAHEADER 15534 /* DataType */ +#define UA_NS0ID_PUBSUBSTATUSEVENTTYPE 15535 /* ObjectType */ +#define UA_NS0ID_PUBSUBSTATUSEVENTTYPE_EVENTID 15536 /* Variable */ +#define UA_NS0ID_PUBSUBSTATUSEVENTTYPE_EVENTTYPE 15537 /* Variable */ +#define UA_NS0ID_PUBSUBSTATUSEVENTTYPE_SOURCENODE 15538 /* Variable */ +#define UA_NS0ID_PUBSUBSTATUSEVENTTYPE_SOURCENAME 15539 /* Variable */ +#define UA_NS0ID_PUBSUBSTATUSEVENTTYPE_TIME 15540 /* Variable */ +#define UA_NS0ID_PUBSUBSTATUSEVENTTYPE_RECEIVETIME 15541 /* Variable */ +#define UA_NS0ID_PUBSUBSTATUSEVENTTYPE_LOCALTIME 15542 /* Variable */ +#define UA_NS0ID_PUBSUBSTATUSEVENTTYPE_MESSAGE 15543 /* Variable */ +#define UA_NS0ID_PUBSUBSTATUSEVENTTYPE_SEVERITY 15544 /* Variable */ +#define UA_NS0ID_PUBSUBSTATUSEVENTTYPE_CONNECTIONID 15545 /* Variable */ +#define UA_NS0ID_PUBSUBSTATUSEVENTTYPE_GROUPID 15546 /* Variable */ +#define UA_NS0ID_PUBSUBSTATUSEVENTTYPE_STATE 15547 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE 15548 /* ObjectType */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_EVENTID 15549 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_EVENTTYPE 15550 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_SOURCENODE 15551 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_SOURCENAME 15552 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_TIME 15553 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_RECEIVETIME 15554 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_LOCALTIME 15555 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_MESSAGE 15556 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_SEVERITY 15557 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_CONNECTIONID 15558 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_GROUPID 15559 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_STATE 15560 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_ACTUAL 15561 /* Variable */ +#define UA_NS0ID_PUBSUBTRANSPORTLIMITSEXCEEDEVENTTYPE_MAXIMUM 15562 /* Variable */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE 15563 /* ObjectType */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE_EVENTID 15564 /* Variable */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE_EVENTTYPE 15565 /* Variable */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE_SOURCENODE 15566 /* Variable */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE_SOURCENAME 15567 /* Variable */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE_TIME 15568 /* Variable */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE_RECEIVETIME 15569 /* Variable */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE_LOCALTIME 15570 /* Variable */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE_MESSAGE 15571 /* Variable */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE_SEVERITY 15572 /* Variable */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE_CONNECTIONID 15573 /* Variable */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE_GROUPID 15574 /* Variable */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE_STATE 15575 /* Variable */ +#define UA_NS0ID_PUBSUBCOMMUNICATIONFAILUREEVENTTYPE_ERROR 15576 /* Variable */ +#define UA_NS0ID_DATASETFIELDFLAGS_OPTIONSETVALUES 15577 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETDATATYPE 15578 /* DataType */ +#define UA_NS0ID_BROKERCONNECTIONTRANSPORTDATATYPE_ENCODING_DEFAULTXML 15579 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETSOURCEDATATYPE 15580 /* DataType */ +#define UA_NS0ID_PUBLISHEDDATAITEMSDATATYPE 15581 /* DataType */ +#define UA_NS0ID_PUBLISHEDEVENTSDATATYPE 15582 /* DataType */ +#define UA_NS0ID_DATASETFIELDCONTENTMASK 15583 /* DataType */ +#define UA_NS0ID_DATASETFIELDCONTENTMASK_OPTIONSETVALUES 15584 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SIMPLETYPEDESCRIPTION 15585 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SIMPLETYPEDESCRIPTION_DATATYPEVERSION 15586 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SIMPLETYPEDESCRIPTION_DICTIONARYFRAGMENT 15587 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UABINARYFILEDATATYPE 15588 /* Variable */ +#define UA_NS0ID_STRUCTUREDESCRIPTION_ENCODING_DEFAULTXML 15589 /* Object */ +#define UA_NS0ID_ENUMDESCRIPTION_ENCODING_DEFAULTXML 15590 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_STRUCTUREDESCRIPTION 15591 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_STRUCTUREDESCRIPTION_DATATYPEVERSION 15592 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_STRUCTUREDESCRIPTION_DICTIONARYFRAGMENT 15593 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENUMDESCRIPTION 15594 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENUMDESCRIPTION_DATATYPEVERSION 15595 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENUMDESCRIPTION_DICTIONARYFRAGMENT 15596 /* Variable */ +#define UA_NS0ID_DATASETWRITERDATATYPE 15597 /* DataType */ +#define UA_NS0ID_DATASETWRITERTRANSPORTDATATYPE 15598 /* DataType */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_STRUCTUREDESCRIPTION 15599 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_STRUCTUREDESCRIPTION_DATATYPEVERSION 15600 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_STRUCTUREDESCRIPTION_DICTIONARYFRAGMENT 15601 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENUMDESCRIPTION 15602 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENUMDESCRIPTION_DATATYPEVERSION 15603 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENUMDESCRIPTION_DICTIONARYFRAGMENT 15604 /* Variable */ +#define UA_NS0ID_DATASETWRITERMESSAGEDATATYPE 15605 /* DataType */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_ROLESET 15606 /* Object */ +#define UA_NS0ID_ROLESETTYPE 15607 /* ObjectType */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER 15608 /* Object */ +#define UA_NS0ID_PUBSUBGROUPDATATYPE 15609 /* DataType */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UABINARYFILEDATATYPE_DATATYPEVERSION 15610 /* Variable */ +#define UA_NS0ID_WRITERGROUPTRANSPORTDATATYPE 15611 /* DataType */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_ADDIDENTITY 15612 /* Method */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_ADDIDENTITY_INPUTARGUMENTS 15613 /* Variable */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_REMOVEIDENTITY 15614 /* Method */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_REMOVEIDENTITY_INPUTARGUMENTS 15615 /* Variable */ +#define UA_NS0ID_WRITERGROUPMESSAGEDATATYPE 15616 /* DataType */ +#define UA_NS0ID_PUBSUBCONNECTIONDATATYPE 15617 /* DataType */ +#define UA_NS0ID_CONNECTIONTRANSPORTDATATYPE 15618 /* DataType */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UABINARYFILEDATATYPE_DICTIONARYFRAGMENT 15619 /* Variable */ +#define UA_NS0ID_ROLETYPE 15620 /* ObjectType */ +#define UA_NS0ID_READERGROUPTRANSPORTDATATYPE 15621 /* DataType */ +#define UA_NS0ID_READERGROUPMESSAGEDATATYPE 15622 /* DataType */ +#define UA_NS0ID_DATASETREADERDATATYPE 15623 /* DataType */ +#define UA_NS0ID_ROLETYPE_ADDIDENTITY 15624 /* Method */ +#define UA_NS0ID_ROLETYPE_ADDIDENTITY_INPUTARGUMENTS 15625 /* Variable */ +#define UA_NS0ID_ROLETYPE_REMOVEIDENTITY 15626 /* Method */ +#define UA_NS0ID_ROLETYPE_REMOVEIDENTITY_INPUTARGUMENTS 15627 /* Variable */ +#define UA_NS0ID_DATASETREADERTRANSPORTDATATYPE 15628 /* DataType */ +#define UA_NS0ID_DATASETREADERMESSAGEDATATYPE 15629 /* DataType */ +#define UA_NS0ID_SUBSCRIBEDDATASETDATATYPE 15630 /* DataType */ +#define UA_NS0ID_TARGETVARIABLESDATATYPE 15631 /* DataType */ +#define UA_NS0ID_IDENTITYCRITERIATYPE 15632 /* DataType */ +#define UA_NS0ID_IDENTITYCRITERIATYPE_ENUMVALUES 15633 /* Variable */ +#define UA_NS0ID_IDENTITYMAPPINGRULETYPE 15634 /* DataType */ +#define UA_NS0ID_SUBSCRIBEDDATASETMIRRORDATATYPE 15635 /* DataType */ +#define UA_NS0ID_ADDIDENTITYMETHODTYPE 15636 /* Method */ +#define UA_NS0ID_ADDIDENTITYMETHODTYPE_INPUTARGUMENTS 15637 /* Variable */ +#define UA_NS0ID_REMOVEIDENTITYMETHODTYPE 15638 /* Method */ +#define UA_NS0ID_REMOVEIDENTITYMETHODTYPE_INPUTARGUMENTS 15639 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BROKERCONNECTIONTRANSPORTDATATYPE 15640 /* Variable */ +#define UA_NS0ID_DATASETORDERINGTYPE_ENUMSTRINGS 15641 /* Variable */ +#define UA_NS0ID_UADPNETWORKMESSAGECONTENTMASK 15642 /* DataType */ +#define UA_NS0ID_UADPNETWORKMESSAGECONTENTMASK_OPTIONSETVALUES 15643 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS 15644 /* Object */ +#define UA_NS0ID_UADPWRITERGROUPMESSAGEDATATYPE 15645 /* DataType */ +#define UA_NS0ID_UADPDATASETMESSAGECONTENTMASK 15646 /* DataType */ +#define UA_NS0ID_UADPDATASETMESSAGECONTENTMASK_OPTIONSETVALUES 15647 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_ADDIDENTITY 15648 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_ADDIDENTITY_INPUTARGUMENTS 15649 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_REMOVEIDENTITY 15650 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_REMOVEIDENTITY_INPUTARGUMENTS 15651 /* Variable */ +#define UA_NS0ID_UADPDATASETWRITERMESSAGEDATATYPE 15652 /* DataType */ +#define UA_NS0ID_UADPDATASETREADERMESSAGEDATATYPE 15653 /* DataType */ +#define UA_NS0ID_JSONNETWORKMESSAGECONTENTMASK 15654 /* DataType */ +#define UA_NS0ID_JSONNETWORKMESSAGECONTENTMASK_OPTIONSETVALUES 15655 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER 15656 /* Object */ +#define UA_NS0ID_JSONWRITERGROUPMESSAGEDATATYPE 15657 /* DataType */ +#define UA_NS0ID_JSONDATASETMESSAGECONTENTMASK 15658 /* DataType */ +#define UA_NS0ID_JSONDATASETMESSAGECONTENTMASK_OPTIONSETVALUES 15659 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_ADDIDENTITY 15660 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_ADDIDENTITY_INPUTARGUMENTS 15661 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_REMOVEIDENTITY 15662 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_REMOVEIDENTITY_INPUTARGUMENTS 15663 /* Variable */ +#define UA_NS0ID_JSONDATASETWRITERMESSAGEDATATYPE 15664 /* DataType */ +#define UA_NS0ID_JSONDATASETREADERMESSAGEDATATYPE 15665 /* DataType */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BROKERCONNECTIONTRANSPORTDATATYPE_DATATYPEVERSION 15666 /* Variable */ +#define UA_NS0ID_BROKERWRITERGROUPTRANSPORTDATATYPE 15667 /* DataType */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER 15668 /* Object */ +#define UA_NS0ID_BROKERDATASETWRITERTRANSPORTDATATYPE 15669 /* DataType */ +#define UA_NS0ID_BROKERDATASETREADERTRANSPORTDATATYPE 15670 /* DataType */ +#define UA_NS0ID_ENDPOINTTYPE_ENCODING_DEFAULTBINARY 15671 /* Object */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_ADDIDENTITY 15672 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_ADDIDENTITY_INPUTARGUMENTS 15673 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_REMOVEIDENTITY 15674 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_REMOVEIDENTITY_INPUTARGUMENTS 15675 /* Variable */ +#define UA_NS0ID_DATATYPESCHEMAHEADER_ENCODING_DEFAULTBINARY 15676 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETDATATYPE_ENCODING_DEFAULTBINARY 15677 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETSOURCEDATATYPE_ENCODING_DEFAULTBINARY 15678 /* Object */ +#define UA_NS0ID_PUBLISHEDDATAITEMSDATATYPE_ENCODING_DEFAULTBINARY 15679 /* Object */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR 15680 /* Object */ +#define UA_NS0ID_PUBLISHEDEVENTSDATATYPE_ENCODING_DEFAULTBINARY 15681 /* Object */ +#define UA_NS0ID_DATASETWRITERDATATYPE_ENCODING_DEFAULTBINARY 15682 /* Object */ +#define UA_NS0ID_DATASETWRITERTRANSPORTDATATYPE_ENCODING_DEFAULTBINARY 15683 /* Object */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_ADDIDENTITY 15684 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_ADDIDENTITY_INPUTARGUMENTS 15685 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_REMOVEIDENTITY 15686 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_REMOVEIDENTITY_INPUTARGUMENTS 15687 /* Variable */ +#define UA_NS0ID_DATASETWRITERMESSAGEDATATYPE_ENCODING_DEFAULTBINARY 15688 /* Object */ +#define UA_NS0ID_PUBSUBGROUPDATATYPE_ENCODING_DEFAULTBINARY 15689 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BROKERCONNECTIONTRANSPORTDATATYPE_DICTIONARYFRAGMENT 15690 /* Variable */ +#define UA_NS0ID_WRITERGROUPTRANSPORTDATATYPE_ENCODING_DEFAULTBINARY 15691 /* Object */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR 15692 /* Object */ +#define UA_NS0ID_WRITERGROUPMESSAGEDATATYPE_ENCODING_DEFAULTBINARY 15693 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONDATATYPE_ENCODING_DEFAULTBINARY 15694 /* Object */ +#define UA_NS0ID_CONNECTIONTRANSPORTDATATYPE_ENCODING_DEFAULTBINARY 15695 /* Object */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_ADDIDENTITY 15696 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_ADDIDENTITY_INPUTARGUMENTS 15697 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_REMOVEIDENTITY 15698 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_REMOVEIDENTITY_INPUTARGUMENTS 15699 /* Variable */ +#define UA_NS0ID_SIMPLETYPEDESCRIPTION_ENCODING_DEFAULTJSON 15700 /* Object */ +#define UA_NS0ID_READERGROUPTRANSPORTDATATYPE_ENCODING_DEFAULTBINARY 15701 /* Object */ +#define UA_NS0ID_READERGROUPMESSAGEDATATYPE_ENCODING_DEFAULTBINARY 15702 /* Object */ +#define UA_NS0ID_DATASETREADERDATATYPE_ENCODING_DEFAULTBINARY 15703 /* Object */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN 15704 /* Object */ +#define UA_NS0ID_DATASETREADERTRANSPORTDATATYPE_ENCODING_DEFAULTBINARY 15705 /* Object */ +#define UA_NS0ID_DATASETREADERMESSAGEDATATYPE_ENCODING_DEFAULTBINARY 15706 /* Object */ +#define UA_NS0ID_SUBSCRIBEDDATASETDATATYPE_ENCODING_DEFAULTBINARY 15707 /* Object */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_ADDIDENTITY 15708 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_ADDIDENTITY_INPUTARGUMENTS 15709 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_REMOVEIDENTITY 15710 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_REMOVEIDENTITY_INPUTARGUMENTS 15711 /* Variable */ +#define UA_NS0ID_TARGETVARIABLESDATATYPE_ENCODING_DEFAULTBINARY 15712 /* Object */ +#define UA_NS0ID_SUBSCRIBEDDATASETMIRRORDATATYPE_ENCODING_DEFAULTBINARY 15713 /* Object */ +#define UA_NS0ID_UABINARYFILEDATATYPE_ENCODING_DEFAULTJSON 15714 /* Object */ +#define UA_NS0ID_UADPWRITERGROUPMESSAGEDATATYPE_ENCODING_DEFAULTBINARY 15715 /* Object */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN 15716 /* Object */ +#define UA_NS0ID_UADPDATASETWRITERMESSAGEDATATYPE_ENCODING_DEFAULTBINARY 15717 /* Object */ +#define UA_NS0ID_UADPDATASETREADERMESSAGEDATATYPE_ENCODING_DEFAULTBINARY 15718 /* Object */ +#define UA_NS0ID_JSONWRITERGROUPMESSAGEDATATYPE_ENCODING_DEFAULTBINARY 15719 /* Object */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_ADDIDENTITY 15720 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_ADDIDENTITY_INPUTARGUMENTS 15721 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_REMOVEIDENTITY 15722 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_REMOVEIDENTITY_INPUTARGUMENTS 15723 /* Variable */ +#define UA_NS0ID_JSONDATASETWRITERMESSAGEDATATYPE_ENCODING_DEFAULTBINARY 15724 /* Object */ +#define UA_NS0ID_JSONDATASETREADERMESSAGEDATATYPE_ENCODING_DEFAULTBINARY 15725 /* Object */ +#define UA_NS0ID_BROKERCONNECTIONTRANSPORTDATATYPE_ENCODING_DEFAULTJSON 15726 /* Object */ +#define UA_NS0ID_BROKERWRITERGROUPTRANSPORTDATATYPE_ENCODING_DEFAULTBINARY 15727 /* Object */ +#define UA_NS0ID_IDENTITYMAPPINGRULETYPE_ENCODING_DEFAULTXML 15728 /* Object */ +#define UA_NS0ID_BROKERDATASETWRITERTRANSPORTDATATYPE_ENCODING_DEFAULTBINARY 15729 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_IDENTITYMAPPINGRULETYPE 15730 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_IDENTITYMAPPINGRULETYPE_DATATYPEVERSION 15731 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_IDENTITYMAPPINGRULETYPE_DICTIONARYFRAGMENT 15732 /* Variable */ +#define UA_NS0ID_BROKERDATASETREADERTRANSPORTDATATYPE_ENCODING_DEFAULTBINARY 15733 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENDPOINTTYPE 15734 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENDPOINTTYPE_DATATYPEVERSION 15735 /* Variable */ +#define UA_NS0ID_IDENTITYMAPPINGRULETYPE_ENCODING_DEFAULTBINARY 15736 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENDPOINTTYPE_DICTIONARYFRAGMENT 15737 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_IDENTITYMAPPINGRULETYPE 15738 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_IDENTITYMAPPINGRULETYPE_DATATYPEVERSION 15739 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_IDENTITYMAPPINGRULETYPE_DICTIONARYFRAGMENT 15740 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATATYPESCHEMAHEADER 15741 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATATYPESCHEMAHEADER_DATATYPEVERSION 15742 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATATYPESCHEMAHEADER_DICTIONARYFRAGMENT 15743 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE 15744 /* ObjectType */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_CLIENTPROCESSINGTIMEOUT 15745 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_GENERATEFILEFORREAD 15746 /* Method */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_GENERATEFILEFORREAD_INPUTARGUMENTS 15747 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_GENERATEFILEFORREAD_OUTPUTARGUMENTS 15748 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_GENERATEFILEFORWRITE 15749 /* Method */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_GENERATEFILEFORWRITE_OUTPUTARGUMENTS 15750 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_CLOSEANDCOMMIT 15751 /* Method */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_CLOSEANDCOMMIT_INPUTARGUMENTS 15752 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_CLOSEANDCOMMIT_OUTPUTARGUMENTS 15753 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER 15754 /* Object */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_CURRENTSTATE 15755 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_CURRENTSTATE_ID 15756 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_CURRENTSTATE_NAME 15757 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_CURRENTSTATE_NUMBER 15758 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_CURRENTSTATE_EFFECTIVEDISPLAYNAME 15759 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_LASTTRANSITION 15760 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_LASTTRANSITION_ID 15761 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_LASTTRANSITION_NAME 15762 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_LASTTRANSITION_NUMBER 15763 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_LASTTRANSITION_TRANSITIONTIME 15764 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_LASTTRANSITION_EFFECTIVETRANSITIONTIME 15765 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDDATASETDATATYPE 15766 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDDATASETDATATYPE_DATATYPEVERSION 15767 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDDATASETDATATYPE_DICTIONARYFRAGMENT 15768 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDDATASETSOURCEDATATYPE 15769 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDDATASETSOURCEDATATYPE_DATATYPEVERSION 15770 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDDATASETSOURCEDATATYPE_DICTIONARYFRAGMENT 15771 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDDATAITEMSDATATYPE 15772 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDDATAITEMSDATATYPE_DATATYPEVERSION 15773 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDDATAITEMSDATATYPE_DICTIONARYFRAGMENT 15774 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDEVENTSDATATYPE 15775 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDEVENTSDATATYPE_DATATYPEVERSION 15776 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBLISHEDEVENTSDATATYPE_DICTIONARYFRAGMENT 15777 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETWRITERDATATYPE 15778 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETWRITERDATATYPE_DATATYPEVERSION 15779 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETWRITERDATATYPE_DICTIONARYFRAGMENT 15780 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETWRITERTRANSPORTDATATYPE 15781 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETWRITERTRANSPORTDATATYPE_DATATYPEVERSION 15782 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETWRITERTRANSPORTDATATYPE_DICTIONARYFRAGMENT 15783 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETWRITERMESSAGEDATATYPE 15784 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETWRITERMESSAGEDATATYPE_DATATYPEVERSION 15785 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETWRITERMESSAGEDATATYPE_DICTIONARYFRAGMENT 15786 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBSUBGROUPDATATYPE 15787 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBSUBGROUPDATATYPE_DATATYPEVERSION 15788 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBSUBGROUPDATATYPE_DICTIONARYFRAGMENT 15789 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER 15790 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_PUBLISHERID 15791 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_TRANSPORTPROFILEURI 15792 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_WRITERGROUPTRANSPORTDATATYPE 15793 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_RESET 15794 /* Method */ +#define UA_NS0ID_GENERATEFILEFORREADMETHODTYPE 15795 /* Method */ +#define UA_NS0ID_GENERATEFILEFORREADMETHODTYPE_INPUTARGUMENTS 15796 /* Variable */ +#define UA_NS0ID_GENERATEFILEFORREADMETHODTYPE_OUTPUTARGUMENTS 15797 /* Variable */ +#define UA_NS0ID_GENERATEFILEFORWRITEMETHODTYPE 15798 /* Method */ +#define UA_NS0ID_GENERATEFILEFORWRITEMETHODTYPE_OUTPUTARGUMENTS 15799 /* Variable */ +#define UA_NS0ID_CLOSEANDCOMMITMETHODTYPE 15800 /* Method */ +#define UA_NS0ID_CLOSEANDCOMMITMETHODTYPE_INPUTARGUMENTS 15801 /* Variable */ +#define UA_NS0ID_CLOSEANDCOMMITMETHODTYPE_OUTPUTARGUMENTS 15802 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE 15803 /* ObjectType */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_CURRENTSTATE 15804 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_CURRENTSTATE_ID 15805 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_CURRENTSTATE_NAME 15806 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_CURRENTSTATE_NUMBER 15807 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 15808 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_LASTTRANSITION 15809 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_LASTTRANSITION_ID 15810 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_LASTTRANSITION_NAME 15811 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_LASTTRANSITION_NUMBER 15812 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_LASTTRANSITION_TRANSITIONTIME 15813 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 15814 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_IDLE 15815 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_IDLE_STATENUMBER 15816 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_READPREPARE 15817 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_READPREPARE_STATENUMBER 15818 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_READTRANSFER 15819 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_READTRANSFER_STATENUMBER 15820 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_APPLYWRITE 15821 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_APPLYWRITE_STATENUMBER 15822 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_ERROR 15823 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_ERROR_STATENUMBER 15824 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_IDLETOREADPREPARE 15825 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_IDLETOREADPREPARE_TRANSITIONNUMBER 15826 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_READPREPARETOREADTRANSFER 15827 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_READPREPARETOREADTRANSFER_TRANSITIONNUMBER 15828 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_READTRANSFERTOIDLE 15829 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_READTRANSFERTOIDLE_TRANSITIONNUMBER 15830 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_IDLETOAPPLYWRITE 15831 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_IDLETOAPPLYWRITE_TRANSITIONNUMBER 15832 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_APPLYWRITETOIDLE 15833 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_APPLYWRITETOIDLE_TRANSITIONNUMBER 15834 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_READPREPARETOERROR 15835 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_READPREPARETOERROR_TRANSITIONNUMBER 15836 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_READTRANSFERTOERROR 15837 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_READTRANSFERTOERROR_TRANSITIONNUMBER 15838 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_APPLYWRITETOERROR 15839 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_APPLYWRITETOERROR_TRANSITIONNUMBER 15840 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_ERRORTOIDLE 15841 /* Object */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_ERRORTOIDLE_TRANSITIONNUMBER 15842 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_RESET 15843 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_STATUS 15844 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_STATUS_STATE 15845 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_STATUS_ENABLE 15846 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_STATUS_DISABLE 15847 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_TRANSPORTPROFILEURI_SELECTIONS 15848 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_TRANSPORTPROFILEURI_SELECTIONDESCRIPTIONS 15849 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_TRANSPORTPROFILEURI_RESTRICTTOLIST 15850 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_ADDRESS 15851 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_WRITERGROUPTRANSPORTDATATYPE_DATATYPEVERSION 15852 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_WRITERGROUPTRANSPORTDATATYPE_DICTIONARYFRAGMENT 15853 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_WRITERGROUPMESSAGEDATATYPE 15854 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_WRITERGROUPMESSAGEDATATYPE_DATATYPEVERSION 15855 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_WRITERGROUPMESSAGEDATATYPE_DICTIONARYFRAGMENT 15856 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBSUBCONNECTIONDATATYPE 15857 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBSUBCONNECTIONDATATYPE_DATATYPEVERSION 15858 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBSUBCONNECTIONDATATYPE_DICTIONARYFRAGMENT 15859 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_CONNECTIONTRANSPORTDATATYPE 15860 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_CONNECTIONTRANSPORTDATATYPE_DATATYPEVERSION 15861 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_CONNECTIONTRANSPORTDATATYPE_DICTIONARYFRAGMENT 15862 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_ADDRESS_NETWORKINTERFACE 15863 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_TRANSPORTSETTINGS 15864 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_STATUS 15865 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_READERGROUPTRANSPORTDATATYPE 15866 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_READERGROUPTRANSPORTDATATYPE_DATATYPEVERSION 15867 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_READERGROUPTRANSPORTDATATYPE_DICTIONARYFRAGMENT 15868 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_READERGROUPMESSAGEDATATYPE 15869 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_READERGROUPMESSAGEDATATYPE_DATATYPEVERSION 15870 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_READERGROUPMESSAGEDATATYPE_DICTIONARYFRAGMENT 15871 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETREADERDATATYPE 15872 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETREADERDATATYPE_DATATYPEVERSION 15873 /* Variable */ +#define UA_NS0ID_OVERRIDEVALUEHANDLING 15874 /* DataType */ +#define UA_NS0ID_OVERRIDEVALUEHANDLING_ENUMSTRINGS 15875 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETREADERDATATYPE_DICTIONARYFRAGMENT 15876 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETREADERTRANSPORTDATATYPE 15877 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETREADERTRANSPORTDATATYPE_DATATYPEVERSION 15878 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETREADERTRANSPORTDATATYPE_DICTIONARYFRAGMENT 15879 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETREADERMESSAGEDATATYPE 15880 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETREADERMESSAGEDATATYPE_DATATYPEVERSION 15881 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATASETREADERMESSAGEDATATYPE_DICTIONARYFRAGMENT 15882 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SUBSCRIBEDDATASETDATATYPE 15883 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SUBSCRIBEDDATASETDATATYPE_DATATYPEVERSION 15884 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SUBSCRIBEDDATASETDATATYPE_DICTIONARYFRAGMENT 15885 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_TARGETVARIABLESDATATYPE 15886 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_TARGETVARIABLESDATATYPE_DATATYPEVERSION 15887 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_TARGETVARIABLESDATATYPE_DICTIONARYFRAGMENT 15888 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SUBSCRIBEDDATASETMIRRORDATATYPE 15889 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SUBSCRIBEDDATASETMIRRORDATATYPE_DATATYPEVERSION 15890 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_SUBSCRIBEDDATASETMIRRORDATATYPE_DICTIONARYFRAGMENT 15891 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_STATUS_STATE 15892 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_STATUS_ENABLE 15893 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_STATUS_DISABLE 15894 /* Method */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UADPWRITERGROUPMESSAGEDATATYPE 15895 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UADPWRITERGROUPMESSAGEDATATYPE_DATATYPEVERSION 15896 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UADPWRITERGROUPMESSAGEDATATYPE_DICTIONARYFRAGMENT 15897 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UADPDATASETWRITERMESSAGEDATATYPE 15898 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UADPDATASETWRITERMESSAGEDATATYPE_DATATYPEVERSION 15899 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UADPDATASETWRITERMESSAGEDATATYPE_DICTIONARYFRAGMENT 15900 /* Variable */ +#define UA_NS0ID_SESSIONLESSINVOKEREQUESTTYPE 15901 /* DataType */ +#define UA_NS0ID_SESSIONLESSINVOKEREQUESTTYPE_ENCODING_DEFAULTXML 15902 /* Object */ +#define UA_NS0ID_SESSIONLESSINVOKEREQUESTTYPE_ENCODING_DEFAULTBINARY 15903 /* Object */ +#define UA_NS0ID_DATASETFIELDFLAGS 15904 /* DataType */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_TRANSPORTSETTINGS 15905 /* Object */ +#define UA_NS0ID_PUBSUBKEYSERVICETYPE 15906 /* ObjectType */ +#define UA_NS0ID_PUBSUBKEYSERVICETYPE_GETSECURITYKEYS 15907 /* Method */ +#define UA_NS0ID_PUBSUBKEYSERVICETYPE_GETSECURITYKEYS_INPUTARGUMENTS 15908 /* Variable */ +#define UA_NS0ID_PUBSUBKEYSERVICETYPE_GETSECURITYKEYS_OUTPUTARGUMENTS 15909 /* Variable */ +#define UA_NS0ID_PUBSUBKEYSERVICETYPE_GETSECURITYGROUP 15910 /* Method */ +#define UA_NS0ID_PUBSUBKEYSERVICETYPE_GETSECURITYGROUP_INPUTARGUMENTS 15911 /* Variable */ +#define UA_NS0ID_PUBSUBKEYSERVICETYPE_GETSECURITYGROUP_OUTPUTARGUMENTS 15912 /* Variable */ +#define UA_NS0ID_PUBSUBKEYSERVICETYPE_SECURITYGROUPS 15913 /* Object */ +#define UA_NS0ID_PUBSUBKEYSERVICETYPE_SECURITYGROUPS_ADDSECURITYGROUP 15914 /* Method */ +#define UA_NS0ID_PUBSUBKEYSERVICETYPE_SECURITYGROUPS_ADDSECURITYGROUP_INPUTARGUMENTS 15915 /* Variable */ +#define UA_NS0ID_PUBSUBKEYSERVICETYPE_SECURITYGROUPS_ADDSECURITYGROUP_OUTPUTARGUMENTS 15916 /* Variable */ +#define UA_NS0ID_PUBSUBKEYSERVICETYPE_SECURITYGROUPS_REMOVESECURITYGROUP 15917 /* Method */ +#define UA_NS0ID_PUBSUBKEYSERVICETYPE_SECURITYGROUPS_REMOVESECURITYGROUP_INPUTARGUMENTS 15918 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UADPDATASETREADERMESSAGEDATATYPE 15919 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UADPDATASETREADERMESSAGEDATATYPE_DATATYPEVERSION 15920 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_UADPDATASETREADERMESSAGEDATATYPE_DICTIONARYFRAGMENT 15921 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_JSONWRITERGROUPMESSAGEDATATYPE 15922 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_JSONWRITERGROUPMESSAGEDATATYPE_DATATYPEVERSION 15923 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_JSONWRITERGROUPMESSAGEDATATYPE_DICTIONARYFRAGMENT 15924 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_JSONDATASETWRITERMESSAGEDATATYPE 15925 /* Variable */ +#define UA_NS0ID_PUBSUBGROUPTYPE_SECURITYMODE 15926 /* Variable */ +#define UA_NS0ID_PUBSUBGROUPTYPE_SECURITYGROUPID 15927 /* Variable */ +#define UA_NS0ID_PUBSUBGROUPTYPE_SECURITYKEYSERVICES 15928 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_JSONDATASETWRITERMESSAGEDATATYPE_DATATYPEVERSION 15929 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_JSONDATASETWRITERMESSAGEDATATYPE_DICTIONARYFRAGMENT 15930 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_JSONDATASETREADERMESSAGEDATATYPE 15931 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_SECURITYMODE 15932 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_SECURITYGROUPID 15933 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_SECURITYKEYSERVICES 15934 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_JSONDATASETREADERMESSAGEDATATYPE_DATATYPEVERSION 15935 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_JSONDATASETREADERMESSAGEDATATYPE_DICTIONARYFRAGMENT 15936 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS 15937 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_DIAGNOSTICSLEVEL 15938 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION 15939 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BROKERWRITERGROUPTRANSPORTDATATYPE 15940 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BROKERWRITERGROUPTRANSPORTDATATYPE_DATATYPEVERSION 15941 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BROKERWRITERGROUPTRANSPORTDATATYPE_DICTIONARYFRAGMENT 15942 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BROKERDATASETWRITERTRANSPORTDATATYPE 15943 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BROKERDATASETWRITERTRANSPORTDATATYPE_DATATYPEVERSION 15944 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BROKERDATASETWRITERTRANSPORTDATATYPE_DICTIONARYFRAGMENT 15945 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BROKERDATASETREADERTRANSPORTDATATYPE 15946 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BROKERDATASETREADERTRANSPORTDATATYPE_DATATYPEVERSION 15947 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_BROKERDATASETREADERTRANSPORTDATATYPE_DICTIONARYFRAGMENT 15948 /* Variable */ +#define UA_NS0ID_ENDPOINTTYPE_ENCODING_DEFAULTXML 15949 /* Object */ +#define UA_NS0ID_DATATYPESCHEMAHEADER_ENCODING_DEFAULTXML 15950 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETDATATYPE_ENCODING_DEFAULTXML 15951 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETSOURCEDATATYPE_ENCODING_DEFAULTXML 15952 /* Object */ +#define UA_NS0ID_PUBLISHEDDATAITEMSDATATYPE_ENCODING_DEFAULTXML 15953 /* Object */ +#define UA_NS0ID_PUBLISHEDEVENTSDATATYPE_ENCODING_DEFAULTXML 15954 /* Object */ +#define UA_NS0ID_DATASETWRITERDATATYPE_ENCODING_DEFAULTXML 15955 /* Object */ +#define UA_NS0ID_DATASETWRITERTRANSPORTDATATYPE_ENCODING_DEFAULTXML 15956 /* Object */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA 15957 /* Object */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEURI 15958 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEVERSION 15959 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEPUBLICATIONDATE 15960 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_ISNAMESPACESUBSET 15961 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_STATICNODEIDTYPES 15962 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_STATICNUMERICNODEIDRANGE 15963 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_STATICSTRINGNODEIDPATTERN 15964 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE 15965 /* Object */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_SIZE 15966 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_WRITABLE 15967 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_USERWRITABLE 15968 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_OPENCOUNT 15969 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_MIMETYPE 15970 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_OPEN 15971 /* Method */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_OPEN_INPUTARGUMENTS 15972 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_OPEN_OUTPUTARGUMENTS 15973 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_CLOSE 15974 /* Method */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_CLOSE_INPUTARGUMENTS 15975 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_READ 15976 /* Method */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_READ_INPUTARGUMENTS 15977 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_READ_OUTPUTARGUMENTS 15978 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_WRITE 15979 /* Method */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_WRITE_INPUTARGUMENTS 15980 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_GETPOSITION 15981 /* Method */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_GETPOSITION_INPUTARGUMENTS 15982 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_GETPOSITION_OUTPUTARGUMENTS 15983 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_SETPOSITION 15984 /* Method */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_SETPOSITION_INPUTARGUMENTS 15985 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_NAMESPACEFILE_EXPORTNAMESPACE 15986 /* Method */ +#define UA_NS0ID_DATASETWRITERMESSAGEDATATYPE_ENCODING_DEFAULTXML 15987 /* Object */ +#define UA_NS0ID_PUBSUBGROUPDATATYPE_ENCODING_DEFAULTXML 15988 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 15989 /* Variable */ +#define UA_NS0ID_WRITERGROUPTRANSPORTDATATYPE_ENCODING_DEFAULTXML 15990 /* Object */ +#define UA_NS0ID_WRITERGROUPMESSAGEDATATYPE_ENCODING_DEFAULTXML 15991 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONDATATYPE_ENCODING_DEFAULTXML 15992 /* Object */ +#define UA_NS0ID_CONNECTIONTRANSPORTDATATYPE_ENCODING_DEFAULTXML 15993 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 15994 /* Variable */ +#define UA_NS0ID_READERGROUPTRANSPORTDATATYPE_ENCODING_DEFAULTXML 15995 /* Object */ +#define UA_NS0ID_READERGROUPMESSAGEDATATYPE_ENCODING_DEFAULTXML 15996 /* Object */ +#define UA_NS0ID_ROLESETTYPE_ADDROLE 15997 /* Method */ +#define UA_NS0ID_ROLESETTYPE_ADDROLE_INPUTARGUMENTS 15998 /* Variable */ +#define UA_NS0ID_ROLESETTYPE_ADDROLE_OUTPUTARGUMENTS 15999 /* Variable */ +#define UA_NS0ID_ROLESETTYPE_REMOVEROLE 16000 /* Method */ +#define UA_NS0ID_ROLESETTYPE_REMOVEROLE_INPUTARGUMENTS 16001 /* Variable */ +#define UA_NS0ID_ADDROLEMETHODTYPE 16002 /* Method */ +#define UA_NS0ID_ADDROLEMETHODTYPE_INPUTARGUMENTS 16003 /* Variable */ +#define UA_NS0ID_ADDROLEMETHODTYPE_OUTPUTARGUMENTS 16004 /* Variable */ +#define UA_NS0ID_REMOVEROLEMETHODTYPE 16005 /* Method */ +#define UA_NS0ID_REMOVEROLEMETHODTYPE_INPUTARGUMENTS 16006 /* Variable */ +#define UA_NS0ID_DATASETREADERDATATYPE_ENCODING_DEFAULTXML 16007 /* Object */ +#define UA_NS0ID_DATASETREADERTRANSPORTDATATYPE_ENCODING_DEFAULTXML 16008 /* Object */ +#define UA_NS0ID_DATASETREADERMESSAGEDATATYPE_ENCODING_DEFAULTXML 16009 /* Object */ +#define UA_NS0ID_SUBSCRIBEDDATASETDATATYPE_ENCODING_DEFAULTXML 16010 /* Object */ +#define UA_NS0ID_TARGETVARIABLESDATATYPE_ENCODING_DEFAULTXML 16011 /* Object */ +#define UA_NS0ID_SUBSCRIBEDDATASETMIRRORDATATYPE_ENCODING_DEFAULTXML 16012 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 16013 /* Variable */ +#define UA_NS0ID_UADPWRITERGROUPMESSAGEDATATYPE_ENCODING_DEFAULTXML 16014 /* Object */ +#define UA_NS0ID_UADPDATASETWRITERMESSAGEDATATYPE_ENCODING_DEFAULTXML 16015 /* Object */ +#define UA_NS0ID_UADPDATASETREADERMESSAGEDATATYPE_ENCODING_DEFAULTXML 16016 /* Object */ +#define UA_NS0ID_JSONWRITERGROUPMESSAGEDATATYPE_ENCODING_DEFAULTXML 16017 /* Object */ +#define UA_NS0ID_JSONDATASETWRITERMESSAGEDATATYPE_ENCODING_DEFAULTXML 16018 /* Object */ +#define UA_NS0ID_JSONDATASETREADERMESSAGEDATATYPE_ENCODING_DEFAULTXML 16019 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 16020 /* Variable */ +#define UA_NS0ID_BROKERWRITERGROUPTRANSPORTDATATYPE_ENCODING_DEFAULTXML 16021 /* Object */ +#define UA_NS0ID_BROKERDATASETWRITERTRANSPORTDATATYPE_ENCODING_DEFAULTXML 16022 /* Object */ +#define UA_NS0ID_BROKERDATASETREADERTRANSPORTDATATYPE_ENCODING_DEFAULTXML 16023 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENDPOINTTYPE 16024 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENDPOINTTYPE_DATATYPEVERSION 16025 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENDPOINTTYPE_DICTIONARYFRAGMENT 16026 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATATYPESCHEMAHEADER 16027 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATATYPESCHEMAHEADER_DATATYPEVERSION 16028 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATATYPESCHEMAHEADER_DICTIONARYFRAGMENT 16029 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDDATASETDATATYPE 16030 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDDATASETDATATYPE_DATATYPEVERSION 16031 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDDATASETDATATYPE_DICTIONARYFRAGMENT 16032 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDDATASETSOURCEDATATYPE 16033 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDDATASETSOURCEDATATYPE_DATATYPEVERSION 16034 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDDATASETSOURCEDATATYPE_DICTIONARYFRAGMENT 16035 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER 16036 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDDATAITEMSDATATYPE 16037 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDDATAITEMSDATATYPE_DATATYPEVERSION 16038 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDDATAITEMSDATATYPE_DICTIONARYFRAGMENT 16039 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDEVENTSDATATYPE 16040 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_ADDIDENTITY 16041 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_ADDIDENTITY_INPUTARGUMENTS 16042 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_REMOVEIDENTITY 16043 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_REMOVEIDENTITY_INPUTARGUMENTS 16044 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDEVENTSDATATYPE_DATATYPEVERSION 16045 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBLISHEDEVENTSDATATYPE_DICTIONARYFRAGMENT 16046 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETWRITERDATATYPE 16047 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETWRITERDATATYPE_DATATYPEVERSION 16048 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETWRITERDATATYPE_DICTIONARYFRAGMENT 16049 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETWRITERTRANSPORTDATATYPE 16050 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETWRITERTRANSPORTDATATYPE_DATATYPEVERSION 16051 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETWRITERTRANSPORTDATATYPE_DICTIONARYFRAGMENT 16052 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETWRITERMESSAGEDATATYPE 16053 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETWRITERMESSAGEDATATYPE_DATATYPEVERSION 16054 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETWRITERMESSAGEDATATYPE_DICTIONARYFRAGMENT 16055 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBSUBGROUPDATATYPE 16056 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBSUBGROUPDATATYPE_DATATYPEVERSION 16057 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBSUBGROUPDATATYPE_DICTIONARYFRAGMENT 16058 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR 16059 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_ACTIVE 16060 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 16061 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_WRITERGROUPTRANSPORTDATATYPE 16062 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_WRITERGROUPTRANSPORTDATATYPE_DATATYPEVERSION 16063 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_WRITERGROUPTRANSPORTDATATYPE_DICTIONARYFRAGMENT 16064 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_WRITERGROUPMESSAGEDATATYPE 16065 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_WRITERGROUPMESSAGEDATATYPE_DATATYPEVERSION 16066 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_WRITERGROUPMESSAGEDATATYPE_DICTIONARYFRAGMENT 16067 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBSUBCONNECTIONDATATYPE 16068 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBSUBCONNECTIONDATATYPE_DATATYPEVERSION 16069 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBSUBCONNECTIONDATATYPE_DICTIONARYFRAGMENT 16070 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_CONNECTIONTRANSPORTDATATYPE 16071 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_CONNECTIONTRANSPORTDATATYPE_DATATYPEVERSION 16072 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_CONNECTIONTRANSPORTDATATYPE_DICTIONARYFRAGMENT 16073 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 16074 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 16075 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_RESET 16076 /* Method */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_READERGROUPTRANSPORTDATATYPE 16077 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_READERGROUPTRANSPORTDATATYPE_DATATYPEVERSION 16078 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_READERGROUPTRANSPORTDATATYPE_DICTIONARYFRAGMENT 16079 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_READERGROUPMESSAGEDATATYPE 16080 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_READERGROUPMESSAGEDATATYPE_DATATYPEVERSION 16081 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_READERGROUPMESSAGEDATATYPE_DICTIONARYFRAGMENT 16082 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETREADERDATATYPE 16083 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETREADERDATATYPE_DATATYPEVERSION 16084 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETREADERDATATYPE_DICTIONARYFRAGMENT 16085 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETREADERTRANSPORTDATATYPE 16086 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETREADERTRANSPORTDATATYPE_DATATYPEVERSION 16087 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETREADERTRANSPORTDATATYPE_DICTIONARYFRAGMENT 16088 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETREADERMESSAGEDATATYPE 16089 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETREADERMESSAGEDATATYPE_DATATYPEVERSION 16090 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATASETREADERMESSAGEDATATYPE_DICTIONARYFRAGMENT 16091 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SUBSCRIBEDDATASETDATATYPE 16092 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SUBSCRIBEDDATASETDATATYPE_DATATYPEVERSION 16093 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SUBSCRIBEDDATASETDATATYPE_DICTIONARYFRAGMENT 16094 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_TARGETVARIABLESDATATYPE 16095 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_TARGETVARIABLESDATATYPE_DATATYPEVERSION 16096 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_TARGETVARIABLESDATATYPE_DICTIONARYFRAGMENT 16097 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SUBSCRIBEDDATASETMIRRORDATATYPE 16098 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SUBSCRIBEDDATASETMIRRORDATATYPE_DATATYPEVERSION 16099 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_SUBSCRIBEDDATASETMIRRORDATATYPE_DICTIONARYFRAGMENT 16100 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_SUBERROR 16101 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS 16102 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR 16103 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UADPWRITERGROUPMESSAGEDATATYPE 16104 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UADPWRITERGROUPMESSAGEDATATYPE_DATATYPEVERSION 16105 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UADPWRITERGROUPMESSAGEDATATYPE_DICTIONARYFRAGMENT 16106 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UADPDATASETWRITERMESSAGEDATATYPE 16107 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UADPDATASETWRITERMESSAGEDATATYPE_DATATYPEVERSION 16108 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UADPDATASETWRITERMESSAGEDATATYPE_DICTIONARYFRAGMENT 16109 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UADPDATASETREADERMESSAGEDATATYPE 16110 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UADPDATASETREADERMESSAGEDATATYPE_DATATYPEVERSION 16111 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_UADPDATASETREADERMESSAGEDATATYPE_DICTIONARYFRAGMENT 16112 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_JSONWRITERGROUPMESSAGEDATATYPE 16113 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_JSONWRITERGROUPMESSAGEDATATYPE_DATATYPEVERSION 16114 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_JSONWRITERGROUPMESSAGEDATATYPE_DICTIONARYFRAGMENT 16115 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_JSONDATASETWRITERMESSAGEDATATYPE 16116 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_JSONDATASETWRITERMESSAGEDATATYPE_DATATYPEVERSION 16117 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_JSONDATASETWRITERMESSAGEDATATYPE_DICTIONARYFRAGMENT 16118 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_JSONDATASETREADERMESSAGEDATATYPE 16119 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_JSONDATASETREADERMESSAGEDATATYPE_DATATYPEVERSION 16120 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_JSONDATASETREADERMESSAGEDATATYPE_DICTIONARYFRAGMENT 16121 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 16122 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 16123 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 16124 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BROKERWRITERGROUPTRANSPORTDATATYPE 16125 /* Variable */ +#define UA_NS0ID_ROLEPERMISSIONTYPE_ENCODING_DEFAULTXML 16126 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ROLEPERMISSIONTYPE 16127 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ROLEPERMISSIONTYPE_DATATYPEVERSION 16128 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ROLEPERMISSIONTYPE_DICTIONARYFRAGMENT 16129 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BROKERWRITERGROUPTRANSPORTDATATYPE_DATATYPEVERSION 16130 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ROLEPERMISSIONTYPE 16131 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ROLEPERMISSIONTYPE_DATATYPEVERSION 16132 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ROLEPERMISSIONTYPE_DICTIONARYFRAGMENT 16133 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_DEFAULTROLEPERMISSIONS 16134 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_DEFAULTUSERROLEPERMISSIONS 16135 /* Variable */ +#define UA_NS0ID_OPCUANAMESPACEMETADATA_DEFAULTACCESSRESTRICTIONS 16136 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_DEFAULTROLEPERMISSIONS 16137 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_DEFAULTUSERROLEPERMISSIONS 16138 /* Variable */ +#define UA_NS0ID_NAMESPACEMETADATATYPE_DEFAULTACCESSRESTRICTIONS 16139 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_DEFAULTROLEPERMISSIONS 16140 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_DEFAULTUSERROLEPERMISSIONS 16141 /* Variable */ +#define UA_NS0ID_NAMESPACESTYPE_NAMESPACEIDENTIFIER_PLACEHOLDER_DEFAULTACCESSRESTRICTIONS 16142 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BROKERWRITERGROUPTRANSPORTDATATYPE_DICTIONARYFRAGMENT 16143 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BROKERDATASETWRITERTRANSPORTDATATYPE 16144 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BROKERDATASETWRITERTRANSPORTDATATYPE_DATATYPEVERSION 16145 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BROKERDATASETWRITERTRANSPORTDATATYPE_DICTIONARYFRAGMENT 16146 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BROKERDATASETREADERTRANSPORTDATATYPE 16147 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BROKERDATASETREADERTRANSPORTDATATYPE_DATATYPEVERSION 16148 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_BROKERDATASETREADERTRANSPORTDATATYPE_DICTIONARYFRAGMENT 16149 /* Variable */ +#define UA_NS0ID_ENDPOINTTYPE_ENCODING_DEFAULTJSON 16150 /* Object */ +#define UA_NS0ID_DATATYPESCHEMAHEADER_ENCODING_DEFAULTJSON 16151 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETDATATYPE_ENCODING_DEFAULTJSON 16152 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETSOURCEDATATYPE_ENCODING_DEFAULTJSON 16153 /* Object */ +#define UA_NS0ID_PUBLISHEDDATAITEMSDATATYPE_ENCODING_DEFAULTJSON 16154 /* Object */ +#define UA_NS0ID_PUBLISHEDEVENTSDATATYPE_ENCODING_DEFAULTJSON 16155 /* Object */ +#define UA_NS0ID_DATASETWRITERDATATYPE_ENCODING_DEFAULTJSON 16156 /* Object */ +#define UA_NS0ID_DATASETWRITERTRANSPORTDATATYPE_ENCODING_DEFAULTJSON 16157 /* Object */ +#define UA_NS0ID_DATASETWRITERMESSAGEDATATYPE_ENCODING_DEFAULTJSON 16158 /* Object */ +#define UA_NS0ID_PUBSUBGROUPDATATYPE_ENCODING_DEFAULTJSON 16159 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 16160 /* Variable */ +#define UA_NS0ID_WRITERGROUPTRANSPORTDATATYPE_ENCODING_DEFAULTJSON 16161 /* Object */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_IDENTITIES 16162 /* Variable */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_APPLICATIONS 16163 /* Variable */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_ENDPOINTS 16164 /* Variable */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_ADDAPPLICATION 16165 /* Method */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_ADDAPPLICATION_INPUTARGUMENTS 16166 /* Variable */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_REMOVEAPPLICATION 16167 /* Method */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_REMOVEAPPLICATION_INPUTARGUMENTS 16168 /* Variable */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_ADDENDPOINT 16169 /* Method */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_ADDENDPOINT_INPUTARGUMENTS 16170 /* Variable */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_REMOVEENDPOINT 16171 /* Method */ +#define UA_NS0ID_ROLESETTYPE_ROLENAME_PLACEHOLDER_REMOVEENDPOINT_INPUTARGUMENTS 16172 /* Variable */ +#define UA_NS0ID_ROLETYPE_IDENTITIES 16173 /* Variable */ +#define UA_NS0ID_ROLETYPE_APPLICATIONS 16174 /* Variable */ +#define UA_NS0ID_ROLETYPE_ENDPOINTS 16175 /* Variable */ +#define UA_NS0ID_ROLETYPE_ADDAPPLICATION 16176 /* Method */ +#define UA_NS0ID_ROLETYPE_ADDAPPLICATION_INPUTARGUMENTS 16177 /* Variable */ +#define UA_NS0ID_ROLETYPE_REMOVEAPPLICATION 16178 /* Method */ +#define UA_NS0ID_ROLETYPE_REMOVEAPPLICATION_INPUTARGUMENTS 16179 /* Variable */ +#define UA_NS0ID_ROLETYPE_ADDENDPOINT 16180 /* Method */ +#define UA_NS0ID_ROLETYPE_ADDENDPOINT_INPUTARGUMENTS 16181 /* Variable */ +#define UA_NS0ID_ROLETYPE_REMOVEENDPOINT 16182 /* Method */ +#define UA_NS0ID_ROLETYPE_REMOVEENDPOINT_INPUTARGUMENTS 16183 /* Variable */ +#define UA_NS0ID_ADDAPPLICATIONMETHODTYPE 16184 /* Method */ +#define UA_NS0ID_ADDAPPLICATIONMETHODTYPE_INPUTARGUMENTS 16185 /* Variable */ +#define UA_NS0ID_REMOVEAPPLICATIONMETHODTYPE 16186 /* Method */ +#define UA_NS0ID_REMOVEAPPLICATIONMETHODTYPE_INPUTARGUMENTS 16187 /* Variable */ +#define UA_NS0ID_ADDENDPOINTMETHODTYPE 16188 /* Method */ +#define UA_NS0ID_ADDENDPOINTMETHODTYPE_INPUTARGUMENTS 16189 /* Variable */ +#define UA_NS0ID_REMOVEENDPOINTMETHODTYPE 16190 /* Method */ +#define UA_NS0ID_REMOVEENDPOINTMETHODTYPE_INPUTARGUMENTS 16191 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_IDENTITIES 16192 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_APPLICATIONS 16193 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_ENDPOINTS 16194 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_ADDAPPLICATION 16195 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_ADDAPPLICATION_INPUTARGUMENTS 16196 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_REMOVEAPPLICATION 16197 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_REMOVEAPPLICATION_INPUTARGUMENTS 16198 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_ADDENDPOINT 16199 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_ADDENDPOINT_INPUTARGUMENTS 16200 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_REMOVEENDPOINT 16201 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_ANONYMOUS_REMOVEENDPOINT_INPUTARGUMENTS 16202 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_IDENTITIES 16203 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_APPLICATIONS 16204 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_ENDPOINTS 16205 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_ADDAPPLICATION 16206 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_ADDAPPLICATION_INPUTARGUMENTS 16207 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_REMOVEAPPLICATION 16208 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_REMOVEAPPLICATION_INPUTARGUMENTS 16209 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_ADDENDPOINT 16210 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_ADDENDPOINT_INPUTARGUMENTS 16211 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_REMOVEENDPOINT 16212 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_AUTHENTICATEDUSER_REMOVEENDPOINT_INPUTARGUMENTS 16213 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_IDENTITIES 16214 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_APPLICATIONS 16215 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_ENDPOINTS 16216 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_ADDAPPLICATION 16217 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_ADDAPPLICATION_INPUTARGUMENTS 16218 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_REMOVEAPPLICATION 16219 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_REMOVEAPPLICATION_INPUTARGUMENTS 16220 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_ADDENDPOINT 16221 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_ADDENDPOINT_INPUTARGUMENTS 16222 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_REMOVEENDPOINT 16223 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_OBSERVER_REMOVEENDPOINT_INPUTARGUMENTS 16224 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_IDENTITIES 16225 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_APPLICATIONS 16226 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_ENDPOINTS 16227 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_ADDAPPLICATION 16228 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_ADDAPPLICATION_INPUTARGUMENTS 16229 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_REMOVEAPPLICATION 16230 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_REMOVEAPPLICATION_INPUTARGUMENTS 16231 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_ADDENDPOINT 16232 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_ADDENDPOINT_INPUTARGUMENTS 16233 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_REMOVEENDPOINT 16234 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_OPERATOR_REMOVEENDPOINT_INPUTARGUMENTS 16235 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_IDENTITIES 16236 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_APPLICATIONS 16237 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_ENDPOINTS 16238 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_ADDAPPLICATION 16239 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_ADDAPPLICATION_INPUTARGUMENTS 16240 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_REMOVEAPPLICATION 16241 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_REMOVEAPPLICATION_INPUTARGUMENTS 16242 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_ADDENDPOINT 16243 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_ADDENDPOINT_INPUTARGUMENTS 16244 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_REMOVEENDPOINT 16245 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_ENGINEER_REMOVEENDPOINT_INPUTARGUMENTS 16246 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_IDENTITIES 16247 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_APPLICATIONS 16248 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_ENDPOINTS 16249 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_ADDAPPLICATION 16250 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_ADDAPPLICATION_INPUTARGUMENTS 16251 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_REMOVEAPPLICATION 16252 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_REMOVEAPPLICATION_INPUTARGUMENTS 16253 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_ADDENDPOINT 16254 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_ADDENDPOINT_INPUTARGUMENTS 16255 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_REMOVEENDPOINT 16256 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_SUPERVISOR_REMOVEENDPOINT_INPUTARGUMENTS 16257 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_IDENTITIES 16258 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_APPLICATIONS 16259 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_ENDPOINTS 16260 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_ADDAPPLICATION 16261 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_ADDAPPLICATION_INPUTARGUMENTS 16262 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_REMOVEAPPLICATION 16263 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_REMOVEAPPLICATION_INPUTARGUMENTS 16264 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_ADDENDPOINT 16265 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_ADDENDPOINT_INPUTARGUMENTS 16266 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_REMOVEENDPOINT 16267 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_SECURITYADMIN_REMOVEENDPOINT_INPUTARGUMENTS 16268 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_IDENTITIES 16269 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_APPLICATIONS 16270 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_ENDPOINTS 16271 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_ADDAPPLICATION 16272 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_ADDAPPLICATION_INPUTARGUMENTS 16273 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_REMOVEAPPLICATION 16274 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_REMOVEAPPLICATION_INPUTARGUMENTS 16275 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_ADDENDPOINT 16276 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_ADDENDPOINT_INPUTARGUMENTS 16277 /* Variable */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_REMOVEENDPOINT 16278 /* Method */ +#define UA_NS0ID_WELLKNOWNROLE_CONFIGUREADMIN_REMOVEENDPOINT_INPUTARGUMENTS 16279 /* Variable */ +#define UA_NS0ID_WRITERGROUPMESSAGEDATATYPE_ENCODING_DEFAULTJSON 16280 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONDATATYPE_ENCODING_DEFAULTJSON 16281 /* Object */ +#define UA_NS0ID_CONNECTIONTRANSPORTDATATYPE_ENCODING_DEFAULTJSON 16282 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 16283 /* Variable */ +#define UA_NS0ID_READERGROUPTRANSPORTDATATYPE_ENCODING_DEFAULTJSON 16284 /* Object */ +#define UA_NS0ID_READERGROUPMESSAGEDATATYPE_ENCODING_DEFAULTJSON 16285 /* Object */ +#define UA_NS0ID_DATASETREADERDATATYPE_ENCODING_DEFAULTJSON 16286 /* Object */ +#define UA_NS0ID_DATASETREADERTRANSPORTDATATYPE_ENCODING_DEFAULTJSON 16287 /* Object */ +#define UA_NS0ID_DATASETREADERMESSAGEDATATYPE_ENCODING_DEFAULTJSON 16288 /* Object */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_ROLESET 16289 /* Object */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_ROLESET_ADDROLE 16290 /* Method */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_ROLESET_ADDROLE_INPUTARGUMENTS 16291 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_ROLESET_ADDROLE_OUTPUTARGUMENTS 16292 /* Variable */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_ROLESET_REMOVEROLE 16293 /* Method */ +#define UA_NS0ID_SERVERTYPE_SERVERCAPABILITIES_ROLESET_REMOVEROLE_INPUTARGUMENTS 16294 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_ROLESET 16295 /* Object */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_ROLESET_ADDROLE 16296 /* Method */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_ROLESET_ADDROLE_INPUTARGUMENTS 16297 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_ROLESET_ADDROLE_OUTPUTARGUMENTS 16298 /* Variable */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_ROLESET_REMOVEROLE 16299 /* Method */ +#define UA_NS0ID_SERVERCAPABILITIESTYPE_ROLESET_REMOVEROLE_INPUTARGUMENTS 16300 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_ROLESET_ADDROLE 16301 /* Method */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_ROLESET_ADDROLE_INPUTARGUMENTS 16302 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_ROLESET_ADDROLE_OUTPUTARGUMENTS 16303 /* Variable */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_ROLESET_REMOVEROLE 16304 /* Method */ +#define UA_NS0ID_SERVER_SERVERCAPABILITIES_ROLESET_REMOVEROLE_INPUTARGUMENTS 16305 /* Variable */ +#define UA_NS0ID_DEFAULTINPUTVALUES 16306 /* Variable */ +#define UA_NS0ID_AUDIODATATYPE 16307 /* DataType */ +#define UA_NS0ID_SUBSCRIBEDDATASETDATATYPE_ENCODING_DEFAULTJSON 16308 /* Object */ +#define UA_NS0ID_SELECTIONLISTTYPE 16309 /* VariableType */ +#define UA_NS0ID_TARGETVARIABLESDATATYPE_ENCODING_DEFAULTJSON 16310 /* Object */ +#define UA_NS0ID_SUBSCRIBEDDATASETMIRRORDATATYPE_ENCODING_DEFAULTJSON 16311 /* Object */ +#define UA_NS0ID_SELECTIONLISTTYPE_RESTRICTTOLIST 16312 /* Variable */ +#define UA_NS0ID_ADDITIONALPARAMETERSTYPE 16313 /* DataType */ +#define UA_NS0ID_FILESYSTEM 16314 /* Object */ +#define UA_NS0ID_FILESYSTEM_FILEDIRECTORYNAME_PLACEHOLDER 16315 /* Object */ +#define UA_NS0ID_FILESYSTEM_FILEDIRECTORYNAME_PLACEHOLDER_CREATEDIRECTORY 16316 /* Method */ +#define UA_NS0ID_FILESYSTEM_FILEDIRECTORYNAME_PLACEHOLDER_CREATEDIRECTORY_INPUTARGUMENTS 16317 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILEDIRECTORYNAME_PLACEHOLDER_CREATEDIRECTORY_OUTPUTARGUMENTS 16318 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILEDIRECTORYNAME_PLACEHOLDER_CREATEFILE 16319 /* Method */ +#define UA_NS0ID_FILESYSTEM_FILEDIRECTORYNAME_PLACEHOLDER_CREATEFILE_INPUTARGUMENTS 16320 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILEDIRECTORYNAME_PLACEHOLDER_CREATEFILE_OUTPUTARGUMENTS 16321 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 16322 /* Variable */ +#define UA_NS0ID_UADPWRITERGROUPMESSAGEDATATYPE_ENCODING_DEFAULTJSON 16323 /* Object */ +#define UA_NS0ID_FILESYSTEM_FILEDIRECTORYNAME_PLACEHOLDER_MOVEORCOPY 16324 /* Method */ +#define UA_NS0ID_FILESYSTEM_FILEDIRECTORYNAME_PLACEHOLDER_MOVEORCOPY_INPUTARGUMENTS 16325 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILEDIRECTORYNAME_PLACEHOLDER_MOVEORCOPY_OUTPUTARGUMENTS 16326 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER 16327 /* Object */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_SIZE 16328 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_WRITABLE 16329 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_USERWRITABLE 16330 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_OPENCOUNT 16331 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_MIMETYPE 16332 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_OPEN 16333 /* Method */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_OPEN_INPUTARGUMENTS 16334 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_OPEN_OUTPUTARGUMENTS 16335 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_CLOSE 16336 /* Method */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_CLOSE_INPUTARGUMENTS 16337 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_READ 16338 /* Method */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_READ_INPUTARGUMENTS 16339 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_READ_OUTPUTARGUMENTS 16340 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_WRITE 16341 /* Method */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_WRITE_INPUTARGUMENTS 16342 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_GETPOSITION 16343 /* Method */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_GETPOSITION_INPUTARGUMENTS 16344 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_GETPOSITION_OUTPUTARGUMENTS 16345 /* Variable */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_SETPOSITION 16346 /* Method */ +#define UA_NS0ID_FILESYSTEM_FILENAME_PLACEHOLDER_SETPOSITION_INPUTARGUMENTS 16347 /* Variable */ +#define UA_NS0ID_FILESYSTEM_CREATEDIRECTORY 16348 /* Method */ +#define UA_NS0ID_FILESYSTEM_CREATEDIRECTORY_INPUTARGUMENTS 16349 /* Variable */ +#define UA_NS0ID_FILESYSTEM_CREATEDIRECTORY_OUTPUTARGUMENTS 16350 /* Variable */ +#define UA_NS0ID_FILESYSTEM_CREATEFILE 16351 /* Method */ +#define UA_NS0ID_FILESYSTEM_CREATEFILE_INPUTARGUMENTS 16352 /* Variable */ +#define UA_NS0ID_FILESYSTEM_CREATEFILE_OUTPUTARGUMENTS 16353 /* Variable */ +#define UA_NS0ID_FILESYSTEM_DELETEFILESYSTEMOBJECT 16354 /* Method */ +#define UA_NS0ID_FILESYSTEM_DELETEFILESYSTEMOBJECT_INPUTARGUMENTS 16355 /* Variable */ +#define UA_NS0ID_FILESYSTEM_MOVEORCOPY 16356 /* Method */ +#define UA_NS0ID_FILESYSTEM_MOVEORCOPY_INPUTARGUMENTS 16357 /* Variable */ +#define UA_NS0ID_FILESYSTEM_MOVEORCOPY_OUTPUTARGUMENTS 16358 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_GENERATEFILEFORWRITE_INPUTARGUMENTS 16359 /* Variable */ +#define UA_NS0ID_GENERATEFILEFORWRITEMETHODTYPE_INPUTARGUMENTS 16360 /* Variable */ +#define UA_NS0ID_HASALARMSUPPRESSIONGROUP 16361 /* ReferenceType */ +#define UA_NS0ID_ALARMGROUPMEMBER 16362 /* ReferenceType */ +#define UA_NS0ID_CONDITIONTYPE_CONDITIONSUBCLASSID 16363 /* Variable */ +#define UA_NS0ID_CONDITIONTYPE_CONDITIONSUBCLASSNAME 16364 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_CONDITIONSUBCLASSID 16365 /* Variable */ +#define UA_NS0ID_DIALOGCONDITIONTYPE_CONDITIONSUBCLASSNAME 16366 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONDITIONSUBCLASSID 16367 /* Variable */ +#define UA_NS0ID_ACKNOWLEDGEABLECONDITIONTYPE_CONDITIONSUBCLASSNAME 16368 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONDITIONSUBCLASSID 16369 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_CONDITIONSUBCLASSNAME 16370 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_OUTOFSERVICESTATE 16371 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_OUTOFSERVICESTATE_ID 16372 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_OUTOFSERVICESTATE_NAME 16373 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_OUTOFSERVICESTATE_NUMBER 16374 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16375 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 16376 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16377 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_OUTOFSERVICESTATE_TRUESTATE 16378 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_OUTOFSERVICESTATE_FALSESTATE 16379 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SILENCESTATE 16380 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SILENCESTATE_ID 16381 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SILENCESTATE_NAME 16382 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SILENCESTATE_NUMBER 16383 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 16384 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SILENCESTATE_TRANSITIONTIME 16385 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 16386 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SILENCESTATE_TRUESTATE 16387 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SILENCESTATE_FALSESTATE 16388 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_AUDIBLEENABLED 16389 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_AUDIBLESOUND 16390 /* Variable */ +#define UA_NS0ID_UADPDATASETWRITERMESSAGEDATATYPE_ENCODING_DEFAULTJSON 16391 /* Object */ +#define UA_NS0ID_UADPDATASETREADERMESSAGEDATATYPE_ENCODING_DEFAULTJSON 16392 /* Object */ +#define UA_NS0ID_JSONWRITERGROUPMESSAGEDATATYPE_ENCODING_DEFAULTJSON 16393 /* Object */ +#define UA_NS0ID_JSONDATASETWRITERMESSAGEDATATYPE_ENCODING_DEFAULTJSON 16394 /* Object */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ONDELAY 16395 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_OFFDELAY 16396 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_FIRSTINGROUPFLAG 16397 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_FIRSTINGROUP 16398 /* Object */ +#define UA_NS0ID_ALARMCONDITIONTYPE_ALARMGROUP_PLACEHOLDER 16399 /* Object */ +#define UA_NS0ID_ALARMCONDITIONTYPE_REALARMTIME 16400 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_REALARMREPEATCOUNT 16401 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SILENCE 16402 /* Method */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SUPPRESS 16403 /* Method */ +#define UA_NS0ID_JSONDATASETREADERMESSAGEDATATYPE_ENCODING_DEFAULTJSON 16404 /* Object */ +#define UA_NS0ID_ALARMGROUPTYPE 16405 /* ObjectType */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER 16406 /* Object */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_EVENTID 16407 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_EVENTTYPE 16408 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SOURCENODE 16409 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SOURCENAME 16410 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_TIME 16411 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_RECEIVETIME 16412 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_LOCALTIME 16413 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_MESSAGE 16414 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SEVERITY 16415 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONDITIONCLASSID 16416 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONDITIONCLASSNAME 16417 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONDITIONSUBCLASSID 16418 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONDITIONSUBCLASSNAME 16419 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONDITIONNAME 16420 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_BRANCHID 16421 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_RETAIN 16422 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ENABLEDSTATE 16423 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ENABLEDSTATE_ID 16424 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ENABLEDSTATE_NAME 16425 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ENABLEDSTATE_NUMBER 16426 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 16427 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ENABLEDSTATE_TRANSITIONTIME 16428 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 16429 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ENABLEDSTATE_TRUESTATE 16430 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ENABLEDSTATE_FALSESTATE 16431 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_QUALITY 16432 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_QUALITY_SOURCETIMESTAMP 16433 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_LASTSEVERITY 16434 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_LASTSEVERITY_SOURCETIMESTAMP 16435 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_COMMENT 16436 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_COMMENT_SOURCETIMESTAMP 16437 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CLIENTUSERID 16438 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_DISABLE 16439 /* Method */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ENABLE 16440 /* Method */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ADDCOMMENT 16441 /* Method */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ADDCOMMENT_INPUTARGUMENTS 16442 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACKEDSTATE 16443 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACKEDSTATE_ID 16444 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACKEDSTATE_NAME 16445 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACKEDSTATE_NUMBER 16446 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACKEDSTATE_EFFECTIVEDISPLAYNAME 16447 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACKEDSTATE_TRANSITIONTIME 16448 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACKEDSTATE_EFFECTIVETRANSITIONTIME 16449 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACKEDSTATE_TRUESTATE 16450 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACKEDSTATE_FALSESTATE 16451 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONFIRMEDSTATE 16452 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONFIRMEDSTATE_ID 16453 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONFIRMEDSTATE_NAME 16454 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONFIRMEDSTATE_NUMBER 16455 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 16456 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONFIRMEDSTATE_TRANSITIONTIME 16457 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 16458 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONFIRMEDSTATE_TRUESTATE 16459 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONFIRMEDSTATE_FALSESTATE 16460 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACKNOWLEDGE 16461 /* Method */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACKNOWLEDGE_INPUTARGUMENTS 16462 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONFIRM 16463 /* Method */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_CONFIRM_INPUTARGUMENTS 16464 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACTIVESTATE 16465 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACTIVESTATE_ID 16466 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACTIVESTATE_NAME 16467 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACTIVESTATE_NUMBER 16468 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACTIVESTATE_EFFECTIVEDISPLAYNAME 16469 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACTIVESTATE_TRANSITIONTIME 16470 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACTIVESTATE_EFFECTIVETRANSITIONTIME 16471 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACTIVESTATE_TRUESTATE 16472 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ACTIVESTATE_FALSESTATE 16473 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_INPUTNODE 16474 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SUPPRESSEDSTATE 16475 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SUPPRESSEDSTATE_ID 16476 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SUPPRESSEDSTATE_NAME 16477 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SUPPRESSEDSTATE_NUMBER 16478 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 16479 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SUPPRESSEDSTATE_TRANSITIONTIME 16480 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 16481 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SUPPRESSEDSTATE_TRUESTATE 16482 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SUPPRESSEDSTATE_FALSESTATE 16483 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_OUTOFSERVICESTATE 16484 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_OUTOFSERVICESTATE_ID 16485 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_OUTOFSERVICESTATE_NAME 16486 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_OUTOFSERVICESTATE_NUMBER 16487 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16488 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_OUTOFSERVICESTATE_TRANSITIONTIME 16489 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16490 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_OUTOFSERVICESTATE_TRUESTATE 16491 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_OUTOFSERVICESTATE_FALSESTATE 16492 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SILENCESTATE 16493 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SILENCESTATE_ID 16494 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SILENCESTATE_NAME 16495 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SILENCESTATE_NUMBER 16496 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SILENCESTATE_EFFECTIVEDISPLAYNAME 16497 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SILENCESTATE_TRANSITIONTIME 16498 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SILENCESTATE_EFFECTIVETRANSITIONTIME 16499 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SILENCESTATE_TRUESTATE 16500 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SILENCESTATE_FALSESTATE 16501 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE 16502 /* Object */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_CURRENTSTATE 16503 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_CURRENTSTATE_ID 16504 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_CURRENTSTATE_NAME 16505 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_CURRENTSTATE_NUMBER 16506 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 16507 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_LASTTRANSITION 16508 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_LASTTRANSITION_ID 16509 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_LASTTRANSITION_NAME 16510 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_LASTTRANSITION_NUMBER 16511 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 16512 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 16513 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_UNSHELVETIME 16514 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_UNSHELVE 16515 /* Method */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_ONESHOTSHELVE 16516 /* Method */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_TIMEDSHELVE 16517 /* Method */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 16518 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SUPPRESSEDORSHELVED 16519 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_MAXTIMESHELVED 16520 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_AUDIBLEENABLED 16521 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_AUDIBLESOUND 16522 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 16523 /* Variable */ +#define UA_NS0ID_BROKERWRITERGROUPTRANSPORTDATATYPE_ENCODING_DEFAULTJSON 16524 /* Object */ +#define UA_NS0ID_BROKERDATASETWRITERTRANSPORTDATATYPE_ENCODING_DEFAULTJSON 16525 /* Object */ +#define UA_NS0ID_BROKERDATASETREADERTRANSPORTDATATYPE_ENCODING_DEFAULTJSON 16526 /* Object */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_ONDELAY 16527 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_OFFDELAY 16528 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_FIRSTINGROUPFLAG 16529 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_FIRSTINGROUP 16530 /* Object */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_REALARMTIME 16531 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_REALARMREPEATCOUNT 16532 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SILENCE 16533 /* Method */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SUPPRESS 16534 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_ADDWRITERGROUP 16535 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_CONDITIONSUBCLASSID 16536 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_CONDITIONSUBCLASSNAME 16537 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_OUTOFSERVICESTATE 16538 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_OUTOFSERVICESTATE_ID 16539 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_OUTOFSERVICESTATE_NAME 16540 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_OUTOFSERVICESTATE_NUMBER 16541 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16542 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 16543 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16544 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 16545 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 16546 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SILENCESTATE 16547 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SILENCESTATE_ID 16548 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SILENCESTATE_NAME 16549 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SILENCESTATE_NUMBER 16550 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 16551 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SILENCESTATE_TRANSITIONTIME 16552 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 16553 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SILENCESTATE_TRUESTATE 16554 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SILENCESTATE_FALSESTATE 16555 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_AUDIBLEENABLED 16556 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_AUDIBLESOUND 16557 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_ADDWRITERGROUP_INPUTARGUMENTS 16558 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_ADDWRITERGROUP_OUTPUTARGUMENTS 16559 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_ADDREADERGROUP 16560 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_ADDREADERGROUP_INPUTARGUMENTS 16561 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_ONDELAY 16562 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_OFFDELAY 16563 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_FIRSTINGROUPFLAG 16564 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_FIRSTINGROUP 16565 /* Object */ +#define UA_NS0ID_LIMITALARMTYPE_ALARMGROUP_PLACEHOLDER 16566 /* Object */ +#define UA_NS0ID_LIMITALARMTYPE_REALARMTIME 16567 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_REALARMREPEATCOUNT 16568 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SILENCE 16569 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_SUPPRESS 16570 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_ADDREADERGROUP_OUTPUTARGUMENTS 16571 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_BASEHIGHHIGHLIMIT 16572 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_BASEHIGHLIMIT 16573 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_BASELOWLIMIT 16574 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_BASELOWLOWLIMIT 16575 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONDITIONSUBCLASSID 16576 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_CONDITIONSUBCLASSNAME 16577 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE 16578 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_ID 16579 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_NAME 16580 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_NUMBER 16581 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16582 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 16583 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16584 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 16585 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 16586 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SILENCESTATE 16587 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SILENCESTATE_ID 16588 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SILENCESTATE_NAME 16589 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SILENCESTATE_NUMBER 16590 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 16591 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SILENCESTATE_TRANSITIONTIME 16592 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 16593 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SILENCESTATE_TRUESTATE 16594 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SILENCESTATE_FALSESTATE 16595 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_AUDIBLEENABLED 16596 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_AUDIBLESOUND 16597 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_ADDCONNECTION 16598 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_ADDCONNECTION_INPUTARGUMENTS 16599 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_ADDCONNECTION_OUTPUTARGUMENTS 16600 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDPUBLISHEDDATAITEMSTEMPLATE 16601 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ONDELAY 16602 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_OFFDELAY 16603 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_FIRSTINGROUPFLAG 16604 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_FIRSTINGROUP 16605 /* Object */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_ALARMGROUP_PLACEHOLDER 16606 /* Object */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_REALARMTIME 16607 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_REALARMREPEATCOUNT 16608 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SILENCE 16609 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SUPPRESS 16610 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDPUBLISHEDDATAITEMSTEMPLATE_INPUTARGUMENTS 16611 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_BASEHIGHHIGHLIMIT 16612 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_BASEHIGHLIMIT 16613 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_BASELOWLIMIT 16614 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_BASELOWLOWLIMIT 16615 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONDITIONSUBCLASSID 16616 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_CONDITIONSUBCLASSNAME 16617 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE 16618 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_ID 16619 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_NAME 16620 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_NUMBER 16621 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16622 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 16623 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16624 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 16625 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 16626 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SILENCESTATE 16627 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SILENCESTATE_ID 16628 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SILENCESTATE_NAME 16629 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SILENCESTATE_NUMBER 16630 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 16631 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SILENCESTATE_TRANSITIONTIME 16632 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 16633 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SILENCESTATE_TRUESTATE 16634 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SILENCESTATE_FALSESTATE 16635 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_AUDIBLEENABLED 16636 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_AUDIBLESOUND 16637 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDPUBLISHEDDATAITEMSTEMPLATE_OUTPUTARGUMENTS 16638 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDPUBLISHEDEVENTSTEMPLATE 16639 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDPUBLISHEDEVENTSTEMPLATE_INPUTARGUMENTS 16640 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDPUBLISHEDEVENTSTEMPLATE_OUTPUTARGUMENTS 16641 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ONDELAY 16642 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_OFFDELAY 16643 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_FIRSTINGROUPFLAG 16644 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_FIRSTINGROUP 16645 /* Object */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_ALARMGROUP_PLACEHOLDER 16646 /* Object */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_REALARMTIME 16647 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_REALARMREPEATCOUNT 16648 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SILENCE 16649 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SUPPRESS 16650 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDDATASETFOLDER 16651 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_BASEHIGHHIGHLIMIT 16652 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_BASEHIGHLIMIT 16653 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_BASELOWLIMIT 16654 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_BASELOWLOWLIMIT 16655 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONDITIONSUBCLASSID 16656 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_CONDITIONSUBCLASSNAME 16657 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE 16658 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_ID 16659 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_NAME 16660 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_NUMBER 16661 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16662 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 16663 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16664 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 16665 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 16666 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SILENCESTATE 16667 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SILENCESTATE_ID 16668 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SILENCESTATE_NAME 16669 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SILENCESTATE_NUMBER 16670 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 16671 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SILENCESTATE_TRANSITIONTIME 16672 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 16673 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SILENCESTATE_TRUESTATE 16674 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SILENCESTATE_FALSESTATE 16675 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_AUDIBLEENABLED 16676 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_AUDIBLESOUND 16677 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDDATASETFOLDER_INPUTARGUMENTS 16678 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_ADDDATASETFOLDER_OUTPUTARGUMENTS 16679 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_REMOVEDATASETFOLDER 16680 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_PUBLISHEDDATASETS_REMOVEDATASETFOLDER_INPUTARGUMENTS 16681 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ONDELAY 16682 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_OFFDELAY 16683 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_FIRSTINGROUPFLAG 16684 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_FIRSTINGROUP 16685 /* Object */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_ALARMGROUP_PLACEHOLDER 16686 /* Object */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_REALARMTIME 16687 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_REALARMREPEATCOUNT 16688 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SILENCE 16689 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SUPPRESS 16690 /* Method */ +#define UA_NS0ID_ADDCONNECTIONMETHODTYPE 16691 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_BASEHIGHHIGHLIMIT 16692 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_BASEHIGHLIMIT 16693 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_BASELOWLIMIT 16694 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_BASELOWLOWLIMIT 16695 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONDITIONSUBCLASSID 16696 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_CONDITIONSUBCLASSNAME 16697 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE 16698 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_ID 16699 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_NAME 16700 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_NUMBER 16701 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16702 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 16703 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16704 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 16705 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 16706 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SILENCESTATE 16707 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SILENCESTATE_ID 16708 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SILENCESTATE_NAME 16709 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SILENCESTATE_NUMBER 16710 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 16711 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SILENCESTATE_TRANSITIONTIME 16712 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 16713 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SILENCESTATE_TRUESTATE 16714 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SILENCESTATE_FALSESTATE 16715 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_AUDIBLEENABLED 16716 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_AUDIBLESOUND 16717 /* Variable */ +#define UA_NS0ID_ADDCONNECTIONMETHODTYPE_INPUTARGUMENTS 16718 /* Variable */ +#define UA_NS0ID_ADDCONNECTIONMETHODTYPE_OUTPUTARGUMENTS 16719 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DATASETWRITERID 16720 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DATASETFIELDCONTENTMASK 16721 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ONDELAY 16722 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_OFFDELAY 16723 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_FIRSTINGROUPFLAG 16724 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_FIRSTINGROUP 16725 /* Object */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_ALARMGROUP_PLACEHOLDER 16726 /* Object */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_REALARMTIME 16727 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_REALARMREPEATCOUNT 16728 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SILENCE 16729 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SUPPRESS 16730 /* Method */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_KEYFRAMECOUNT 16731 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_BASEHIGHHIGHLIMIT 16732 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_BASEHIGHLIMIT 16733 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_BASELOWLIMIT 16734 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_BASELOWLOWLIMIT 16735 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONDITIONSUBCLASSID 16736 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_CONDITIONSUBCLASSNAME 16737 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE 16738 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_ID 16739 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_NAME 16740 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_NUMBER 16741 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16742 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 16743 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16744 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 16745 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 16746 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE 16747 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_ID 16748 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_NAME 16749 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_NUMBER 16750 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 16751 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_TRANSITIONTIME 16752 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 16753 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_TRUESTATE 16754 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_FALSESTATE 16755 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_AUDIBLEENABLED 16756 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_AUDIBLESOUND 16757 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_MESSAGESETTINGS 16758 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETCLASSID 16759 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DATASETWRITERID 16760 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DATASETFIELDCONTENTMASK 16761 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ONDELAY 16762 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_OFFDELAY 16763 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_FIRSTINGROUPFLAG 16764 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_FIRSTINGROUP 16765 /* Object */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_ALARMGROUP_PLACEHOLDER 16766 /* Object */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_REALARMTIME 16767 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_REALARMREPEATCOUNT 16768 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SILENCE 16769 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SUPPRESS 16770 /* Method */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_KEYFRAMECOUNT 16771 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_BASEHIGHHIGHLIMIT 16772 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_BASEHIGHLIMIT 16773 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_BASELOWLIMIT 16774 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_BASELOWLOWLIMIT 16775 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_BASESETPOINTNODE 16776 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONDITIONSUBCLASSID 16777 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_CONDITIONSUBCLASSNAME 16778 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE 16779 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_ID 16780 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_NAME 16781 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_NUMBER 16782 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16783 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 16784 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16785 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 16786 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 16787 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE 16788 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_ID 16789 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_NAME 16790 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_NUMBER 16791 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 16792 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_TRANSITIONTIME 16793 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 16794 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_TRUESTATE 16795 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SILENCESTATE_FALSESTATE 16796 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_AUDIBLEENABLED 16797 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_AUDIBLESOUND 16798 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_MESSAGESETTINGS 16799 /* Object */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETCLASSID 16800 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DATASETWRITERID 16801 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DATASETFIELDCONTENTMASK 16802 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ONDELAY 16803 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_OFFDELAY 16804 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_FIRSTINGROUPFLAG 16805 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_FIRSTINGROUP 16806 /* Object */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_ALARMGROUP_PLACEHOLDER 16807 /* Object */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_REALARMTIME 16808 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_REALARMREPEATCOUNT 16809 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SILENCE 16810 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SUPPRESS 16811 /* Method */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_KEYFRAMECOUNT 16812 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_BASEHIGHHIGHLIMIT 16813 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_BASEHIGHLIMIT 16814 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_BASELOWLIMIT 16815 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_BASELOWLOWLIMIT 16816 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_BASESETPOINTNODE 16817 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONSUBCLASSID 16818 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONSUBCLASSNAME 16819 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE 16820 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_ID 16821 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_NAME 16822 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_NUMBER 16823 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16824 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 16825 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16826 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 16827 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 16828 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE 16829 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_ID 16830 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_NAME 16831 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_NUMBER 16832 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 16833 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_TRANSITIONTIME 16834 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 16835 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_TRUESTATE 16836 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_FALSESTATE 16837 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_AUDIBLEENABLED 16838 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_AUDIBLESOUND 16839 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_MESSAGESETTINGS 16840 /* Object */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETCLASSID 16841 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDPUBLISHEDDATAITEMSTEMPLATE 16842 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDPUBLISHEDDATAITEMSTEMPLATE_INPUTARGUMENTS 16843 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ONDELAY 16844 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_OFFDELAY 16845 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_FIRSTINGROUPFLAG 16846 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_FIRSTINGROUP 16847 /* Object */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ALARMGROUP_PLACEHOLDER 16848 /* Object */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_REALARMTIME 16849 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_REALARMREPEATCOUNT 16850 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SILENCE 16851 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESS 16852 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDPUBLISHEDDATAITEMSTEMPLATE_OUTPUTARGUMENTS 16853 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_BASEHIGHHIGHLIMIT 16854 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_BASEHIGHLIMIT 16855 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_BASELOWLIMIT 16856 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_BASELOWLOWLIMIT 16857 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_ENGINEERINGUNITS 16858 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONSUBCLASSID 16859 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_CONDITIONSUBCLASSNAME 16860 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE 16861 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_ID 16862 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_NAME 16863 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_NUMBER 16864 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16865 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 16866 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16867 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 16868 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 16869 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE 16870 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_ID 16871 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_NAME 16872 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_NUMBER 16873 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 16874 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_TRANSITIONTIME 16875 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 16876 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_TRUESTATE 16877 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SILENCESTATE_FALSESTATE 16878 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_AUDIBLEENABLED 16879 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_AUDIBLESOUND 16880 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDPUBLISHEDEVENTSTEMPLATE 16881 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDPUBLISHEDEVENTSTEMPLATE_INPUTARGUMENTS 16882 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDPUBLISHEDEVENTSTEMPLATE_OUTPUTARGUMENTS 16883 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDDATASETFOLDER 16884 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ONDELAY 16885 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_OFFDELAY 16886 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_FIRSTINGROUPFLAG 16887 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_FIRSTINGROUP 16888 /* Object */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ALARMGROUP_PLACEHOLDER 16889 /* Object */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_REALARMTIME 16890 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_REALARMREPEATCOUNT 16891 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SILENCE 16892 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SUPPRESS 16893 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDDATASETFOLDER_INPUTARGUMENTS 16894 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_BASEHIGHHIGHLIMIT 16895 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_BASEHIGHLIMIT 16896 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_BASELOWLIMIT 16897 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_BASELOWLOWLIMIT 16898 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_ENGINEERINGUNITS 16899 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONDITIONSUBCLASSID 16900 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_CONDITIONSUBCLASSNAME 16901 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_OUTOFSERVICESTATE 16902 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_OUTOFSERVICESTATE_ID 16903 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_OUTOFSERVICESTATE_NAME 16904 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_OUTOFSERVICESTATE_NUMBER 16905 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16906 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 16907 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16908 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 16909 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 16910 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SILENCESTATE 16911 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SILENCESTATE_ID 16912 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SILENCESTATE_NAME 16913 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SILENCESTATE_NUMBER 16914 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 16915 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SILENCESTATE_TRANSITIONTIME 16916 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 16917 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SILENCESTATE_TRUESTATE 16918 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SILENCESTATE_FALSESTATE 16919 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_AUDIBLEENABLED 16920 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_AUDIBLESOUND 16921 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_ADDDATASETFOLDER_OUTPUTARGUMENTS 16922 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_REMOVEDATASETFOLDER 16923 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_DATASETFOLDERNAME_PLACEHOLDER_REMOVEDATASETFOLDER_INPUTARGUMENTS 16924 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_PUBLISHEDDATASETNAME_PLACEHOLDER_DATASETCLASSID 16925 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_ONDELAY 16926 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_OFFDELAY 16927 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_FIRSTINGROUPFLAG 16928 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_FIRSTINGROUP 16929 /* Object */ +#define UA_NS0ID_DISCRETEALARMTYPE_ALARMGROUP_PLACEHOLDER 16930 /* Object */ +#define UA_NS0ID_DISCRETEALARMTYPE_REALARMTIME 16931 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_REALARMREPEATCOUNT 16932 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SILENCE 16933 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_SUPPRESS 16934 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMSTEMPLATE 16935 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONDITIONSUBCLASSID 16936 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_CONDITIONSUBCLASSNAME 16937 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_OUTOFSERVICESTATE 16938 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_OUTOFSERVICESTATE_ID 16939 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_OUTOFSERVICESTATE_NAME 16940 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_OUTOFSERVICESTATE_NUMBER 16941 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16942 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 16943 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16944 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 16945 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 16946 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SILENCESTATE 16947 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SILENCESTATE_ID 16948 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SILENCESTATE_NAME 16949 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SILENCESTATE_NUMBER 16950 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 16951 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SILENCESTATE_TRANSITIONTIME 16952 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 16953 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SILENCESTATE_TRUESTATE 16954 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SILENCESTATE_FALSESTATE 16955 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_AUDIBLEENABLED 16956 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_AUDIBLESOUND 16957 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMSTEMPLATE_INPUTARGUMENTS 16958 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDDATAITEMSTEMPLATE_OUTPUTARGUMENTS 16959 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDEVENTSTEMPLATE 16960 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDEVENTSTEMPLATE_INPUTARGUMENTS 16961 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ONDELAY 16962 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_OFFDELAY 16963 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_FIRSTINGROUPFLAG 16964 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_FIRSTINGROUP 16965 /* Object */ +#define UA_NS0ID_OFFNORMALALARMTYPE_ALARMGROUP_PLACEHOLDER 16966 /* Object */ +#define UA_NS0ID_OFFNORMALALARMTYPE_REALARMTIME 16967 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_REALARMREPEATCOUNT 16968 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SILENCE 16969 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SUPPRESS 16970 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDPUBLISHEDEVENTSTEMPLATE_OUTPUTARGUMENTS 16971 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONDITIONSUBCLASSID 16972 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_CONDITIONSUBCLASSNAME 16973 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_OUTOFSERVICESTATE 16974 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_OUTOFSERVICESTATE_ID 16975 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_OUTOFSERVICESTATE_NAME 16976 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_OUTOFSERVICESTATE_NUMBER 16977 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 16978 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 16979 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 16980 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 16981 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 16982 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SILENCESTATE 16983 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SILENCESTATE_ID 16984 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SILENCESTATE_NAME 16985 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SILENCESTATE_NUMBER 16986 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 16987 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SILENCESTATE_TRANSITIONTIME 16988 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 16989 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SILENCESTATE_TRUESTATE 16990 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SILENCESTATE_FALSESTATE 16991 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_AUDIBLEENABLED 16992 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_AUDIBLESOUND 16993 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDDATASETFOLDER 16994 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDDATASETFOLDER_INPUTARGUMENTS 16995 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_ADDDATASETFOLDER_OUTPUTARGUMENTS 16996 /* Variable */ +#define UA_NS0ID_DATASETFOLDERTYPE_REMOVEDATASETFOLDER 16997 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ONDELAY 16998 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_OFFDELAY 16999 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_FIRSTINGROUPFLAG 17000 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_FIRSTINGROUP 17001 /* Object */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_ALARMGROUP_PLACEHOLDER 17002 /* Object */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_REALARMTIME 17003 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_REALARMREPEATCOUNT 17004 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SILENCE 17005 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SUPPRESS 17006 /* Method */ +#define UA_NS0ID_DATASETFOLDERTYPE_REMOVEDATASETFOLDER_INPUTARGUMENTS 17007 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONDITIONSUBCLASSID 17008 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_CONDITIONSUBCLASSNAME 17009 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_OUTOFSERVICESTATE 17010 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_OUTOFSERVICESTATE_ID 17011 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_OUTOFSERVICESTATE_NAME 17012 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_OUTOFSERVICESTATE_NUMBER 17013 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 17014 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 17015 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 17016 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 17017 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 17018 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SILENCESTATE 17019 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SILENCESTATE_ID 17020 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SILENCESTATE_NAME 17021 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SILENCESTATE_NUMBER 17022 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 17023 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SILENCESTATE_TRANSITIONTIME 17024 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 17025 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SILENCESTATE_TRUESTATE 17026 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SILENCESTATE_FALSESTATE 17027 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_AUDIBLEENABLED 17028 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_AUDIBLESOUND 17029 /* Variable */ +#define UA_NS0ID_ADDPUBLISHEDDATAITEMSTEMPLATEMETHODTYPE 17030 /* Method */ +#define UA_NS0ID_ADDPUBLISHEDDATAITEMSTEMPLATEMETHODTYPE_INPUTARGUMENTS 17031 /* Variable */ +#define UA_NS0ID_ADDPUBLISHEDDATAITEMSTEMPLATEMETHODTYPE_OUTPUTARGUMENTS 17032 /* Variable */ +#define UA_NS0ID_ADDPUBLISHEDEVENTSTEMPLATEMETHODTYPE 17033 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_ONDELAY 17034 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_OFFDELAY 17035 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_FIRSTINGROUPFLAG 17036 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_FIRSTINGROUP 17037 /* Object */ +#define UA_NS0ID_TRIPALARMTYPE_ALARMGROUP_PLACEHOLDER 17038 /* Object */ +#define UA_NS0ID_TRIPALARMTYPE_REALARMTIME 17039 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_REALARMREPEATCOUNT 17040 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SILENCE 17041 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_SUPPRESS 17042 /* Method */ +#define UA_NS0ID_ADDPUBLISHEDEVENTSTEMPLATEMETHODTYPE_INPUTARGUMENTS 17043 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONDITIONSUBCLASSID 17044 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_CONDITIONSUBCLASSNAME 17045 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_OUTOFSERVICESTATE 17046 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_OUTOFSERVICESTATE_ID 17047 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_OUTOFSERVICESTATE_NAME 17048 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_OUTOFSERVICESTATE_NUMBER 17049 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 17050 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 17051 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 17052 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 17053 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 17054 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SILENCESTATE 17055 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SILENCESTATE_ID 17056 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SILENCESTATE_NAME 17057 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SILENCESTATE_NUMBER 17058 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 17059 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SILENCESTATE_TRANSITIONTIME 17060 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 17061 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SILENCESTATE_TRUESTATE 17062 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SILENCESTATE_FALSESTATE 17063 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_AUDIBLEENABLED 17064 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_AUDIBLESOUND 17065 /* Variable */ +#define UA_NS0ID_ADDPUBLISHEDEVENTSTEMPLATEMETHODTYPE_OUTPUTARGUMENTS 17066 /* Variable */ +#define UA_NS0ID_ADDDATASETFOLDERMETHODTYPE 17067 /* Method */ +#define UA_NS0ID_ADDDATASETFOLDERMETHODTYPE_INPUTARGUMENTS 17068 /* Variable */ +#define UA_NS0ID_ADDDATASETFOLDERMETHODTYPE_OUTPUTARGUMENTS 17069 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ONDELAY 17070 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_OFFDELAY 17071 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_FIRSTINGROUPFLAG 17072 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_FIRSTINGROUP 17073 /* Object */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_ALARMGROUP_PLACEHOLDER 17074 /* Object */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_REALARMTIME 17075 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_REALARMREPEATCOUNT 17076 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SILENCE 17077 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SUPPRESS 17078 /* Method */ +#define UA_NS0ID_REMOVEDATASETFOLDERMETHODTYPE 17079 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE 17080 /* ObjectType */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_EVENTID 17081 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_EVENTTYPE 17082 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SOURCENODE 17083 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SOURCENAME 17084 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_TIME 17085 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_RECEIVETIME 17086 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_LOCALTIME 17087 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_MESSAGE 17088 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SEVERITY 17089 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONDITIONCLASSID 17090 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONDITIONCLASSNAME 17091 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONDITIONSUBCLASSID 17092 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONDITIONSUBCLASSNAME 17093 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONDITIONNAME 17094 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_BRANCHID 17095 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_RETAIN 17096 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ENABLEDSTATE 17097 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ENABLEDSTATE_ID 17098 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ENABLEDSTATE_NAME 17099 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ENABLEDSTATE_NUMBER 17100 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 17101 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 17102 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 17103 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ENABLEDSTATE_TRUESTATE 17104 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ENABLEDSTATE_FALSESTATE 17105 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_QUALITY 17106 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_QUALITY_SOURCETIMESTAMP 17107 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_LASTSEVERITY 17108 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 17109 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_COMMENT 17110 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_COMMENT_SOURCETIMESTAMP 17111 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CLIENTUSERID 17112 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_DISABLE 17113 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ENABLE 17114 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ADDCOMMENT 17115 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 17116 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONDITIONREFRESH 17117 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 17118 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONDITIONREFRESH2 17119 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 17120 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACKEDSTATE 17121 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACKEDSTATE_ID 17122 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACKEDSTATE_NAME 17123 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACKEDSTATE_NUMBER 17124 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 17125 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACKEDSTATE_TRANSITIONTIME 17126 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 17127 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACKEDSTATE_TRUESTATE 17128 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACKEDSTATE_FALSESTATE 17129 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONFIRMEDSTATE 17130 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONFIRMEDSTATE_ID 17131 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONFIRMEDSTATE_NAME 17132 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONFIRMEDSTATE_NUMBER 17133 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 17134 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 17135 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 17136 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONFIRMEDSTATE_TRUESTATE 17137 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONFIRMEDSTATE_FALSESTATE 17138 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACKNOWLEDGE 17139 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 17140 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONFIRM 17141 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_CONFIRM_INPUTARGUMENTS 17142 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACTIVESTATE 17143 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACTIVESTATE_ID 17144 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACTIVESTATE_NAME 17145 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACTIVESTATE_NUMBER 17146 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 17147 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACTIVESTATE_TRANSITIONTIME 17148 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 17149 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACTIVESTATE_TRUESTATE 17150 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ACTIVESTATE_FALSESTATE 17151 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_INPUTNODE 17152 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SUPPRESSEDSTATE 17153 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SUPPRESSEDSTATE_ID 17154 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SUPPRESSEDSTATE_NAME 17155 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SUPPRESSEDSTATE_NUMBER 17156 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 17157 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 17158 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 17159 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 17160 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 17161 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_OUTOFSERVICESTATE 17162 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_OUTOFSERVICESTATE_ID 17163 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_OUTOFSERVICESTATE_NAME 17164 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_OUTOFSERVICESTATE_NUMBER 17165 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 17166 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 17167 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 17168 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 17169 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 17170 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SILENCESTATE 17171 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SILENCESTATE_ID 17172 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SILENCESTATE_NAME 17173 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SILENCESTATE_NUMBER 17174 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 17175 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SILENCESTATE_TRANSITIONTIME 17176 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 17177 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SILENCESTATE_TRUESTATE 17178 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SILENCESTATE_FALSESTATE 17179 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE 17180 /* Object */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_CURRENTSTATE 17181 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 17182 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 17183 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 17184 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 17185 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_LASTTRANSITION 17186 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 17187 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 17188 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 17189 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 17190 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 17191 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_UNSHELVETIME 17192 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_UNSHELVE 17193 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 17194 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 17195 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 17196 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SUPPRESSEDORSHELVED 17197 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_MAXTIMESHELVED 17198 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_AUDIBLEENABLED 17199 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_AUDIBLESOUND 17200 /* Variable */ +#define UA_NS0ID_REMOVEDATASETFOLDERMETHODTYPE_INPUTARGUMENTS 17201 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDRESS_NETWORKINTERFACE 17202 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_TRANSPORTSETTINGS 17203 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_MAXNETWORKMESSAGESIZE 17204 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ONDELAY 17205 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_OFFDELAY 17206 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_FIRSTINGROUPFLAG 17207 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_FIRSTINGROUP 17208 /* Object */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_ALARMGROUP_PLACEHOLDER 17209 /* Object */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_REALARMTIME 17210 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_REALARMREPEATCOUNT 17211 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SILENCE 17212 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SUPPRESS 17213 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_WRITERGROUPID 17214 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_TARGETVALUENODE 17215 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_EXPECTEDTIME 17216 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_TOLERANCE 17217 /* Variable */ +#define UA_NS0ID_SAFETYCONDITIONCLASSTYPE 17218 /* ObjectType */ +#define UA_NS0ID_HIGHLYMANAGEDALARMCONDITIONCLASSTYPE 17219 /* ObjectType */ +#define UA_NS0ID_TRAININGCONDITIONCLASSTYPE 17220 /* ObjectType */ +#define UA_NS0ID_TESTINGCONDITIONSUBCLASSTYPE 17221 /* ObjectType */ +#define UA_NS0ID_AUDITCONDITIONCOMMENTEVENTTYPE_CONDITIONEVENTID 17222 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONACKNOWLEDGEEVENTTYPE_CONDITIONEVENTID 17223 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONCONFIRMEVENTTYPE_CONDITIONEVENTID 17224 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE 17225 /* ObjectType */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_EVENTID 17226 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_EVENTTYPE 17227 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_SOURCENODE 17228 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_SOURCENAME 17229 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_TIME 17230 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_RECEIVETIME 17231 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_LOCALTIME 17232 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_MESSAGE 17233 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_SEVERITY 17234 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_ACTIONTIMESTAMP 17235 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_STATUS 17236 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_SERVERID 17237 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_CLIENTAUDITENTRYID 17238 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_CLIENTUSERID 17239 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_METHODID 17240 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSUPPRESSIONEVENTTYPE_INPUTARGUMENTS 17241 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE 17242 /* ObjectType */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_EVENTID 17243 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_EVENTTYPE 17244 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_SOURCENODE 17245 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_SOURCENAME 17246 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_TIME 17247 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_RECEIVETIME 17248 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_LOCALTIME 17249 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_MESSAGE 17250 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_SEVERITY 17251 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_ACTIONTIMESTAMP 17252 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_STATUS 17253 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_SERVERID 17254 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_CLIENTAUDITENTRYID 17255 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_CLIENTUSERID 17256 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_METHODID 17257 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONSILENCEEVENTTYPE_INPUTARGUMENTS 17258 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE 17259 /* ObjectType */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_EVENTID 17260 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_EVENTTYPE 17261 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_SOURCENODE 17262 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_SOURCENAME 17263 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_TIME 17264 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_RECEIVETIME 17265 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_LOCALTIME 17266 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_MESSAGE 17267 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_SEVERITY 17268 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_ACTIONTIMESTAMP 17269 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_STATUS 17270 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_SERVERID 17271 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_CLIENTAUDITENTRYID 17272 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_CLIENTUSERID 17273 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_METHODID 17274 /* Variable */ +#define UA_NS0ID_AUDITCONDITIONOUTOFSERVICEEVENTTYPE_INPUTARGUMENTS 17275 /* Variable */ +#define UA_NS0ID_HASEFFECTDISABLE 17276 /* ReferenceType */ +#define UA_NS0ID_ALARMRATEVARIABLETYPE 17277 /* VariableType */ +#define UA_NS0ID_ALARMRATEVARIABLETYPE_RATE 17278 /* Variable */ +#define UA_NS0ID_ALARMMETRICSTYPE 17279 /* ObjectType */ +#define UA_NS0ID_ALARMMETRICSTYPE_ALARMCOUNT 17280 /* Variable */ +#define UA_NS0ID_ALARMMETRICSTYPE_MAXIMUMACTIVESTATE 17281 /* Variable */ +#define UA_NS0ID_ALARMMETRICSTYPE_MAXIMUMUNACK 17282 /* Variable */ +#define UA_NS0ID_ALARMMETRICSTYPE_MAXIMUMREALARMCOUNT 17283 /* Variable */ +#define UA_NS0ID_ALARMMETRICSTYPE_CURRENTALARMRATE 17284 /* Variable */ +#define UA_NS0ID_ALARMMETRICSTYPE_CURRENTALARMRATE_RATE 17285 /* Variable */ +#define UA_NS0ID_ALARMMETRICSTYPE_MAXIMUMALARMRATE 17286 /* Variable */ +#define UA_NS0ID_ALARMMETRICSTYPE_MAXIMUMALARMRATE_RATE 17287 /* Variable */ +#define UA_NS0ID_ALARMMETRICSTYPE_AVERAGEALARMRATE 17288 /* Variable */ +#define UA_NS0ID_ALARMMETRICSTYPE_AVERAGEALARMRATE_RATE 17289 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_TRANSPORTSETTINGS 17290 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_MESSAGESETTINGS 17291 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_TRANSPORTPROFILEURI 17292 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_ADDDATASETWRITER 17293 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_ADDDATASETWRITER_INPUTARGUMENTS 17294 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_TRANSPORTPROFILEURI_RESTRICTTOLIST 17295 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_SETSECURITYKEYS 17296 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_SETSECURITYKEYS_INPUTARGUMENTS 17297 /* Variable */ +#define UA_NS0ID_SETSECURITYKEYSMETHODTYPE 17298 /* Method */ +#define UA_NS0ID_SETSECURITYKEYSMETHODTYPE_INPUTARGUMENTS 17299 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 17300 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_ADDDATASETWRITER_OUTPUTARGUMENTS 17301 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_MAXNETWORKMESSAGESIZE 17302 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 17303 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 17304 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 17305 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_TRANSPORTPROFILEURI 17306 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_TRANSPORTSETTINGS 17307 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_MESSAGESETTINGS 17308 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_TRANSPORTPROFILEURI_RESTRICTTOLIST 17309 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER 17310 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_SECURITYMODE 17311 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_SECURITYGROUPID 17312 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_SECURITYKEYSERVICES 17313 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_STATUS 17314 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_STATUS_STATE 17315 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_STATUS_ENABLE 17316 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_STATUS_DISABLE 17317 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_PUBLISHINGINTERVAL 17318 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_KEEPALIVETIME 17319 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 17320 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_PRIORITY 17321 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_LOCALEIDS 17322 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_REMOVEDATASETWRITER 17323 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_REMOVEDATASETWRITER_INPUTARGUMENTS 17324 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER 17325 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_SECURITYMODE 17326 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_SECURITYGROUPID 17327 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_SECURITYKEYSERVICES 17328 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_STATUS 17329 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_STATUS_STATE 17330 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_STATUS_ENABLE 17331 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_STATUS_DISABLE 17332 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_REMOVEDATASETREADER 17333 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_REMOVEDATASETREADER_INPUTARGUMENTS 17334 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 17335 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 17336 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 17337 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 17338 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 17339 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 17340 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 17341 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 17342 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 17343 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 17344 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 17345 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 17346 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 17347 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 17348 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 17349 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 17350 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 17351 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES 17352 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_RESOLVEDADDRESS 17353 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_RESOLVEDADDRESS_DIAGNOSTICSLEVEL 17354 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_ADDDATASETREADER 17355 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_ADDWRITERGROUP 17356 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_ADDWRITERGROUP_INPUTARGUMENTS 17357 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_ADDWRITERGROUP_OUTPUTARGUMENTS 17358 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_ADDREADERGROUP 17359 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_ADDREADERGROUP_INPUTARGUMENTS 17360 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_ADDREADERGROUP_OUTPUTARGUMENTS 17361 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_REMOVEGROUP 17362 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_REMOVEGROUP_INPUTARGUMENTS 17363 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_SETSECURITYKEYS 17364 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_SETSECURITYKEYS_INPUTARGUMENTS 17365 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_ADDCONNECTION 17366 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_ADDCONNECTION_INPUTARGUMENTS 17367 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_ADDCONNECTION_OUTPUTARGUMENTS 17368 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_REMOVECONNECTION 17369 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_REMOVECONNECTION_INPUTARGUMENTS 17370 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS 17371 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDPUBLISHEDDATAITEMS 17372 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDPUBLISHEDDATAITEMS_INPUTARGUMENTS 17373 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDPUBLISHEDDATAITEMS_OUTPUTARGUMENTS 17374 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDPUBLISHEDEVENTS 17375 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDPUBLISHEDEVENTS_INPUTARGUMENTS 17376 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDPUBLISHEDEVENTS_OUTPUTARGUMENTS 17377 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDPUBLISHEDDATAITEMSTEMPLATE 17378 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDPUBLISHEDDATAITEMSTEMPLATE_INPUTARGUMENTS 17379 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDPUBLISHEDDATAITEMSTEMPLATE_OUTPUTARGUMENTS 17380 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDPUBLISHEDEVENTSTEMPLATE 17381 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDPUBLISHEDEVENTSTEMPLATE_INPUTARGUMENTS 17382 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDPUBLISHEDEVENTSTEMPLATE_OUTPUTARGUMENTS 17383 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_REMOVEPUBLISHEDDATASET 17384 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_REMOVEPUBLISHEDDATASET_INPUTARGUMENTS 17385 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_CREATETARGETVARIABLES 17386 /* Method */ +#define UA_NS0ID_DATASETREADERTYPE_CREATETARGETVARIABLES_INPUTARGUMENTS 17387 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_CREATETARGETVARIABLES_OUTPUTARGUMENTS 17388 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_CREATEDATASETMIRROR 17389 /* Method */ +#define UA_NS0ID_DATASETREADERTYPE_CREATEDATASETMIRROR_INPUTARGUMENTS 17390 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_CREATEDATASETMIRROR_OUTPUTARGUMENTS 17391 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPECREATETARGETVARIABLESMETHODTYPE 17392 /* Method */ +#define UA_NS0ID_DATASETREADERTYPECREATETARGETVARIABLESMETHODTYPE_INPUTARGUMENTS 17393 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPECREATETARGETVARIABLESMETHODTYPE_OUTPUTARGUMENTS 17394 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPECREATEDATASETMIRRORMETHODTYPE 17395 /* Method */ +#define UA_NS0ID_DATASETREADERTYPECREATEDATASETMIRRORMETHODTYPE_INPUTARGUMENTS 17396 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPECREATEDATASETMIRRORMETHODTYPE_OUTPUTARGUMENTS 17397 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDDATASETFOLDER 17398 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_ADDDATASETREADER_INPUTARGUMENTS 17399 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_ADDDATASETREADER_OUTPUTARGUMENTS 17400 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDDATASETFOLDER_INPUTARGUMENTS 17401 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_ADDDATASETFOLDER_OUTPUTARGUMENTS 17402 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_REMOVEDATASETFOLDER 17403 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_PUBLISHEDDATASETS_REMOVEDATASETFOLDER_INPUTARGUMENTS 17404 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_STATUS 17405 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_STATUS_STATE 17406 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_STATUS_ENABLE 17407 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_STATUS_DISABLE 17408 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS 17409 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_DIAGNOSTICSLEVEL 17410 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_TOTALINFORMATION 17411 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 17412 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 17413 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 17414 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 17415 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_TOTALERROR 17416 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_TOTALERROR_ACTIVE 17417 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 17418 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 17419 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 17420 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_RESET 17421 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_SUBERROR 17422 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS 17423 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEERROR 17424 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 17425 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 17426 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDWRITERGROUP 17427 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDWRITERGROUP_INPUTARGUMENTS 17428 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 17429 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 17430 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 17431 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 17432 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 17433 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 17434 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 17435 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 17436 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 17437 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 17438 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 17439 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 17440 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 17441 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 17442 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 17443 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 17444 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 17445 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 17446 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 17447 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 17448 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 17449 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 17450 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 17451 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 17452 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 17453 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 17454 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 17455 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDWRITERGROUP_OUTPUTARGUMENTS 17456 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_LIVEVALUES 17457 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETWRITERS 17458 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETWRITERS_DIAGNOSTICSLEVEL 17459 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETREADERS 17460 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETREADERS_DIAGNOSTICSLEVEL 17461 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETWRITERS 17462 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETWRITERS_DIAGNOSTICSLEVEL 17463 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETREADERS 17464 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDREADERGROUP 17465 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETREADERS_DIAGNOSTICSLEVEL 17466 /* Variable */ +#define UA_NS0ID_DATAGRAMCONNECTIONTRANSPORTDATATYPE 17467 /* DataType */ +#define UA_NS0ID_DATAGRAMCONNECTIONTRANSPORTDATATYPE_ENCODING_DEFAULTBINARY 17468 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATAGRAMCONNECTIONTRANSPORTDATATYPE 17469 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATAGRAMCONNECTIONTRANSPORTDATATYPE_DATATYPEVERSION 17470 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATAGRAMCONNECTIONTRANSPORTDATATYPE_DICTIONARYFRAGMENT 17471 /* Variable */ +#define UA_NS0ID_DATAGRAMCONNECTIONTRANSPORTDATATYPE_ENCODING_DEFAULTXML 17472 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATAGRAMCONNECTIONTRANSPORTDATATYPE 17473 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATAGRAMCONNECTIONTRANSPORTDATATYPE_DATATYPEVERSION 17474 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATAGRAMCONNECTIONTRANSPORTDATATYPE_DICTIONARYFRAGMENT 17475 /* Variable */ +#define UA_NS0ID_DATAGRAMCONNECTIONTRANSPORTDATATYPE_ENCODING_DEFAULTJSON 17476 /* Object */ +#define UA_NS0ID_UADPDATASETREADERMESSAGETYPE_DATASETOFFSET 17477 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_CONNECTIONPROPERTIES 17478 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_SUPPORTEDTRANSPORTPROFILES 17479 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_CONNECTIONPROPERTIES 17480 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_SUPPORTEDTRANSPORTPROFILES 17481 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DATASETWRITERPROPERTIES 17482 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DATASETWRITERPROPERTIES 17483 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DATASETWRITERPROPERTIES 17484 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_CONNECTIONPROPERTIES 17485 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_GROUPPROPERTIES 17486 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_GROUPPROPERTIES 17487 /* Variable */ +#define UA_NS0ID_PUBSUBGROUPTYPE_GROUPPROPERTIES 17488 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_GROUPPROPERTIES 17489 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DATASETWRITERPROPERTIES 17490 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_GROUPPROPERTIES 17491 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DATASETREADERPROPERTIES 17492 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DATASETWRITERPROPERTIES 17493 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DATASETREADERPROPERTIES 17494 /* Variable */ +#define UA_NS0ID_CREATECREDENTIALMETHODTYPE_OUTPUTARGUMENTS 17495 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE 17496 /* ObjectType */ +#define UA_NS0ID_ANALOGUNITTYPE 17497 /* VariableType */ +#define UA_NS0ID_ANALOGUNITTYPE_DEFINITION 17498 /* Variable */ +#define UA_NS0ID_ANALOGUNITTYPE_VALUEPRECISION 17499 /* Variable */ +#define UA_NS0ID_ANALOGUNITTYPE_INSTRUMENTRANGE 17500 /* Variable */ +#define UA_NS0ID_ANALOGUNITTYPE_EURANGE 17501 /* Variable */ +#define UA_NS0ID_ANALOGUNITTYPE_ENGINEERINGUNITS 17502 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_ADDRESS_NETWORKINTERFACE_SELECTIONS 17503 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_ADDRESS_NETWORKINTERFACE_SELECTIONDESCRIPTIONS 17504 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_ADDRESS_NETWORKINTERFACE_RESTRICTTOLIST 17505 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_ADDRESS_NETWORKINTERFACE_SELECTIONS 17506 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDREADERGROUP_INPUTARGUMENTS 17507 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDREADERGROUP_OUTPUTARGUMENTS 17508 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_ADDRESS_NETWORKINTERFACE_SELECTIONDESCRIPTIONS 17509 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBE_CONNECTIONNAME_PLACEHOLDER_ADDRESS_NETWORKINTERFACE_RESTRICTTOLIST 17510 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_SERVICENAME_PLACEHOLDER 17511 /* Object */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_SERVICENAME_PLACEHOLDER_RESOURCEURI 17512 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_SERVICENAME_PLACEHOLDER_PROFILEURI 17513 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_SERVICENAME_PLACEHOLDER_ENDPOINTURLS 17514 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_SERVICENAME_PLACEHOLDER_SERVICESTATUS 17515 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_SERVICENAME_PLACEHOLDER_GETENCRYPTINGKEY 17516 /* Method */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_SERVICENAME_PLACEHOLDER_GETENCRYPTINGKEY_INPUTARGUMENTS 17517 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_SERVICENAME_PLACEHOLDER_GETENCRYPTINGKEY_OUTPUTARGUMENTS 17518 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_SERVICENAME_PLACEHOLDER_UPDATECREDENTIAL 17519 /* Method */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_SERVICENAME_PLACEHOLDER_UPDATECREDENTIAL_INPUTARGUMENTS 17520 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_SERVICENAME_PLACEHOLDER_DELETECREDENTIAL 17521 /* Method */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_CREATECREDENTIAL 17522 /* Method */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_CREATECREDENTIAL_INPUTARGUMENTS 17523 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONFOLDERTYPE_CREATECREDENTIAL_OUTPUTARGUMENTS 17524 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_SERVICENAME_PLACEHOLDER_GETENCRYPTINGKEY 17525 /* Method */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_SERVICENAME_PLACEHOLDER_GETENCRYPTINGKEY_INPUTARGUMENTS 17526 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_SERVICENAME_PLACEHOLDER_GETENCRYPTINGKEY_OUTPUTARGUMENTS 17527 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_CREATECREDENTIAL 17528 /* Method */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_CREATECREDENTIAL_INPUTARGUMENTS 17529 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_CREATECREDENTIAL_OUTPUTARGUMENTS 17530 /* Variable */ +#define UA_NS0ID_GETENCRYPTINGKEYMETHODTYPE 17531 /* Method */ +#define UA_NS0ID_GETENCRYPTINGKEYMETHODTYPE_INPUTARGUMENTS 17532 /* Variable */ +#define UA_NS0ID_GETENCRYPTINGKEYMETHODTYPE_OUTPUTARGUMENTS 17533 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONTYPE_GETENCRYPTINGKEY 17534 /* Method */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONTYPE_GETENCRYPTINGKEY_INPUTARGUMENTS 17535 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONTYPE_GETENCRYPTINGKEY_OUTPUTARGUMENTS 17536 /* Variable */ +#define UA_NS0ID_ADDITIONALPARAMETERSTYPE_ENCODING_DEFAULTBINARY 17537 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ADDITIONALPARAMETERSTYPE 17538 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ADDITIONALPARAMETERSTYPE_DATATYPEVERSION 17539 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ADDITIONALPARAMETERSTYPE_DICTIONARYFRAGMENT 17540 /* Variable */ +#define UA_NS0ID_ADDITIONALPARAMETERSTYPE_ENCODING_DEFAULTXML 17541 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ADDITIONALPARAMETERSTYPE 17542 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ADDITIONALPARAMETERSTYPE_DATATYPEVERSION 17543 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ADDITIONALPARAMETERSTYPE_DICTIONARYFRAGMENT 17544 /* Variable */ +#define UA_NS0ID_RSAENCRYPTEDSECRET 17545 /* DataType */ +#define UA_NS0ID_ECCENCRYPTEDSECRET 17546 /* DataType */ +#define UA_NS0ID_ADDITIONALPARAMETERSTYPE_ENCODING_DEFAULTJSON 17547 /* Object */ +#define UA_NS0ID_EPHEMERALKEYTYPE 17548 /* DataType */ +#define UA_NS0ID_EPHEMERALKEYTYPE_ENCODING_DEFAULTBINARY 17549 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_EPHEMERALKEYTYPE 17550 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_EPHEMERALKEYTYPE_DATATYPEVERSION 17551 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_EPHEMERALKEYTYPE_DICTIONARYFRAGMENT 17552 /* Variable */ +#define UA_NS0ID_EPHEMERALKEYTYPE_ENCODING_DEFAULTXML 17553 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_EPHEMERALKEYTYPE 17554 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_EPHEMERALKEYTYPE_DATATYPEVERSION 17555 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_EPHEMERALKEYTYPE_DICTIONARYFRAGMENT 17556 /* Variable */ +#define UA_NS0ID_EPHEMERALKEYTYPE_ENCODING_DEFAULTJSON 17557 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_HEADERLAYOUTURI 17558 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_HEADERLAYOUTURI 17559 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_KEYFRAMECOUNT 17560 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPEADDWRITERGROUPMETHODTYPE 17561 /* Method */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_HEADERLAYOUTURI 17562 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_KEYFRAMECOUNT 17563 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_HEADERLAYOUTURI 17564 /* Variable */ +#define UA_NS0ID_BASEANALOGTYPE_DEFINITION 17565 /* Variable */ +#define UA_NS0ID_BASEANALOGTYPE_VALUEPRECISION 17566 /* Variable */ +#define UA_NS0ID_BASEANALOGTYPE_INSTRUMENTRANGE 17567 /* Variable */ +#define UA_NS0ID_BASEANALOGTYPE_EURANGE 17568 /* Variable */ +#define UA_NS0ID_BASEANALOGTYPE_ENGINEERINGUNITS 17569 /* Variable */ +#define UA_NS0ID_ANALOGUNITRANGETYPE 17570 /* VariableType */ +#define UA_NS0ID_ANALOGUNITRANGETYPE_DEFINITION 17571 /* Variable */ +#define UA_NS0ID_ANALOGUNITRANGETYPE_VALUEPRECISION 17572 /* Variable */ +#define UA_NS0ID_ANALOGUNITRANGETYPE_INSTRUMENTRANGE 17573 /* Variable */ +#define UA_NS0ID_ANALOGUNITRANGETYPE_EURANGE 17574 /* Variable */ +#define UA_NS0ID_ANALOGUNITRANGETYPE_ENGINEERINGUNITS 17575 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDRESS_NETWORKINTERFACE_SELECTIONS 17576 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDRESS_NETWORKINTERFACE_SELECTIONDESCRIPTIONS 17577 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_ADDRESS_NETWORKINTERFACE_RESTRICTTOLIST 17578 /* Variable */ +#define UA_NS0ID_DATAGRAMCONNECTIONTRANSPORTTYPE_DISCOVERYADDRESS_NETWORKINTERFACE_SELECTIONS 17579 /* Variable */ +#define UA_NS0ID_DATAGRAMCONNECTIONTRANSPORTTYPE_DISCOVERYADDRESS_NETWORKINTERFACE_SELECTIONDESCRIPTIONS 17580 /* Variable */ +#define UA_NS0ID_DATAGRAMCONNECTIONTRANSPORTTYPE_DISCOVERYADDRESS_NETWORKINTERFACE_RESTRICTTOLIST 17581 /* Variable */ +#define UA_NS0ID_NETWORKADDRESSTYPE_NETWORKINTERFACE_SELECTIONS 17582 /* Variable */ +#define UA_NS0ID_NETWORKADDRESSTYPE_NETWORKINTERFACE_SELECTIONDESCRIPTIONS 17583 /* Variable */ +#define UA_NS0ID_NETWORKADDRESSTYPE_NETWORKINTERFACE_RESTRICTTOLIST 17584 /* Variable */ +#define UA_NS0ID_NETWORKADDRESSURLTYPE_NETWORKINTERFACE_SELECTIONS 17585 /* Variable */ +#define UA_NS0ID_NETWORKADDRESSURLTYPE_NETWORKINTERFACE_SELECTIONDESCRIPTIONS 17586 /* Variable */ +#define UA_NS0ID_NETWORKADDRESSURLTYPE_NETWORKINTERFACE_RESTRICTTOLIST 17587 /* Variable */ +#define UA_NS0ID_INDEX 17588 /* DataType */ +#define UA_NS0ID_DICTIONARYENTRYTYPE 17589 /* ObjectType */ +#define UA_NS0ID_DICTIONARYENTRYTYPE_DICTIONARYENTRYNAME_PLACEHOLDER 17590 /* Object */ +#define UA_NS0ID_DICTIONARYFOLDERTYPE 17591 /* ObjectType */ +#define UA_NS0ID_DICTIONARYFOLDERTYPE_DICTIONARYFOLDERNAME_PLACEHOLDER 17592 /* Object */ +#define UA_NS0ID_DICTIONARYFOLDERTYPE_DICTIONARYENTRYNAME_PLACEHOLDER 17593 /* Object */ +#define UA_NS0ID_DICTIONARIES 17594 /* Object */ +#define UA_NS0ID_DICTIONARIES_DICTIONARYFOLDERNAME_PLACEHOLDER 17595 /* Object */ +#define UA_NS0ID_DICTIONARIES_DICTIONARYENTRYNAME_PLACEHOLDER 17596 /* Object */ +#define UA_NS0ID_HASDICTIONARYENTRY 17597 /* ReferenceType */ +#define UA_NS0ID_IRDIDICTIONARYENTRYTYPE 17598 /* ObjectType */ +#define UA_NS0ID_IRDIDICTIONARYENTRYTYPE_DICTIONARYENTRYNAME_PLACEHOLDER 17599 /* Object */ +#define UA_NS0ID_URIDICTIONARYENTRYTYPE 17600 /* ObjectType */ +#define UA_NS0ID_URIDICTIONARYENTRYTYPE_DICTIONARYENTRYNAME_PLACEHOLDER 17601 /* Object */ +#define UA_NS0ID_BASEINTERFACETYPE 17602 /* ObjectType */ +#define UA_NS0ID_HASINTERFACE 17603 /* ReferenceType */ +#define UA_NS0ID_HASADDIN 17604 /* ReferenceType */ +#define UA_NS0ID_DEFAULTINSTANCEBROWSENAME 17605 /* Variable */ +#define UA_NS0ID_GENERICATTRIBUTEVALUE 17606 /* DataType */ +#define UA_NS0ID_GENERICATTRIBUTES 17607 /* DataType */ +#define UA_NS0ID_GENERICATTRIBUTEVALUE_ENCODING_DEFAULTXML 17608 /* Object */ +#define UA_NS0ID_GENERICATTRIBUTES_ENCODING_DEFAULTXML 17609 /* Object */ +#define UA_NS0ID_GENERICATTRIBUTEVALUE_ENCODING_DEFAULTBINARY 17610 /* Object */ +#define UA_NS0ID_GENERICATTRIBUTES_ENCODING_DEFAULTBINARY 17611 /* Object */ +#define UA_NS0ID_SERVERTYPE_LOCALTIME 17612 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPEADDWRITERGROUPMETHODTYPE_INPUTARGUMENTS 17613 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPEADDWRITERGROUPMETHODTYPE_OUTPUTARGUMENTS 17614 /* Variable */ +#define UA_NS0ID_AUDITSECURITYEVENTTYPE_STATUSCODEID 17615 /* Variable */ +#define UA_NS0ID_AUDITCHANNELEVENTTYPE_STATUSCODEID 17616 /* Variable */ +#define UA_NS0ID_AUDITOPENSECURECHANNELEVENTTYPE_STATUSCODEID 17617 /* Variable */ +#define UA_NS0ID_AUDITSESSIONEVENTTYPE_STATUSCODEID 17618 /* Variable */ +#define UA_NS0ID_AUDITCREATESESSIONEVENTTYPE_STATUSCODEID 17619 /* Variable */ +#define UA_NS0ID_AUDITURLMISMATCHEVENTTYPE_STATUSCODEID 17620 /* Variable */ +#define UA_NS0ID_AUDITACTIVATESESSIONEVENTTYPE_STATUSCODEID 17621 /* Variable */ +#define UA_NS0ID_AUDITCANCELEVENTTYPE_STATUSCODEID 17622 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEVENTTYPE_STATUSCODEID 17623 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEDATAMISMATCHEVENTTYPE_STATUSCODEID 17624 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEEXPIREDEVENTTYPE_STATUSCODEID 17625 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEINVALIDEVENTTYPE_STATUSCODEID 17626 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEUNTRUSTEDEVENTTYPE_STATUSCODEID 17627 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEREVOKEDEVENTTYPE_STATUSCODEID 17628 /* Variable */ +#define UA_NS0ID_AUDITCERTIFICATEMISMATCHEVENTTYPE_STATUSCODEID 17629 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONADDREADERGROUPGROUPMETHODTYPE 17630 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONADDREADERGROUPGROUPMETHODTYPE_INPUTARGUMENTS 17631 /* Variable */ +#define UA_NS0ID_SELECTIONLISTTYPE_SELECTIONS 17632 /* Variable */ +#define UA_NS0ID_SELECTIONLISTTYPE_SELECTIONDESCRIPTIONS 17633 /* Variable */ +#define UA_NS0ID_SERVER_LOCALTIME 17634 /* Variable */ +#define UA_NS0ID_FINITESTATEMACHINETYPE_AVAILABLESTATES 17635 /* Variable */ +#define UA_NS0ID_FINITESTATEMACHINETYPE_AVAILABLETRANSITIONS 17636 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_AVAILABLESTATES 17637 /* Variable */ +#define UA_NS0ID_TEMPORARYFILETRANSFERTYPE_TRANSFERSTATE_PLACEHOLDER_AVAILABLETRANSITIONS 17638 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_AVAILABLESTATES 17639 /* Variable */ +#define UA_NS0ID_FILETRANSFERSTATEMACHINETYPE_AVAILABLETRANSITIONS 17640 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE 17641 /* ObjectType */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_EVENTID 17642 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_EVENTTYPE 17643 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_SOURCENODE 17644 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_SOURCENAME 17645 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_TIME 17646 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_RECEIVETIME 17647 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_LOCALTIME 17648 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_MESSAGE 17649 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_SEVERITY 17650 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_ACTIONTIMESTAMP 17651 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_STATUS 17652 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_SERVERID 17653 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_CLIENTAUDITENTRYID 17654 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_CLIENTUSERID 17655 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_METHODID 17656 /* Variable */ +#define UA_NS0ID_ROLEMAPPINGRULECHANGEDAUDITEVENTTYPE_INPUTARGUMENTS 17657 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_AVAILABLESTATES 17658 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17659 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_AVAILABLESTATES 17660 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_SHELVINGSTATE_AVAILABLETRANSITIONS 17661 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_AVAILABLESTATES 17662 /* Variable */ +#define UA_NS0ID_SHELVEDSTATEMACHINETYPE_AVAILABLETRANSITIONS 17663 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17664 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17665 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_AVAILABLESTATES 17666 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITSTATEMACHINETYPE_AVAILABLETRANSITIONS 17667 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17668 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17669 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE_AVAILABLESTATES 17670 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LIMITSTATE_AVAILABLETRANSITIONS 17671 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17672 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17673 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17674 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17675 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17676 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17677 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE_AVAILABLESTATES 17678 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LIMITSTATE_AVAILABLETRANSITIONS 17679 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17680 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17681 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17682 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17683 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE_AVAILABLESTATES 17684 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LIMITSTATE_AVAILABLETRANSITIONS 17685 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17686 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17687 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17688 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17689 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE_AVAILABLESTATES 17690 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LIMITSTATE_AVAILABLETRANSITIONS 17691 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17692 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17693 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17694 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17695 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17696 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17697 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17698 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17699 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17700 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17701 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 17702 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 17703 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_AVAILABLESTATES 17704 /* Variable */ +#define UA_NS0ID_PROGRAMSTATEMACHINETYPE_AVAILABLETRANSITIONS 17705 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_TRANSPORTPROFILEURI_SELECTIONS 17706 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_TRANSPORTPROFILEURI_SELECTIONDESCRIPTIONS 17707 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_TRANSPORTPROFILEURI_SELECTIONS 17710 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_TRANSPORTPROFILEURI_SELECTIONDESCRIPTIONS 17711 /* Variable */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILEDIRECTORYNAME_PLACEHOLDER_DELETEFILESYSTEMOBJECT 17718 /* Method */ +#define UA_NS0ID_FILEDIRECTORYTYPE_FILEDIRECTORYNAME_PLACEHOLDER_DELETEFILESYSTEMOBJECT_INPUTARGUMENTS 17719 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONADDREADERGROUPGROUPMETHODTYPE_OUTPUTARGUMENTS 17720 /* Variable */ +#define UA_NS0ID_CONNECTIONTRANSPORTTYPE 17721 /* ObjectType */ +#define UA_NS0ID_FILESYSTEM_FILEDIRECTORYNAME_PLACEHOLDER_DELETEFILESYSTEMOBJECT 17722 /* Method */ +#define UA_NS0ID_FILESYSTEM_FILEDIRECTORYNAME_PLACEHOLDER_DELETEFILESYSTEMOBJECT_INPUTARGUMENTS 17723 /* Variable */ +#define UA_NS0ID_PUBSUBGROUPTYPE_MAXNETWORKMESSAGESIZE 17724 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE 17725 /* ObjectType */ +#define UA_NS0ID_WRITERGROUPTYPE_SECURITYMODE 17726 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_SECURITYGROUPID 17727 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_SECURITYKEYSERVICES 17728 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_MAXNETWORKMESSAGESIZE 17729 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_STATUS 17730 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_STATUS_STATE 17731 /* Variable */ +#define UA_NS0ID_AUTHORIZATIONSERVICES 17732 /* Object */ +#define UA_NS0ID_AUTHORIZATIONSERVICES_SERVICENAME_PLACEHOLDER 17733 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_STATUS_ENABLE 17734 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_STATUS_DISABLE 17735 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_WRITERGROUPID 17736 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_PUBLISHINGINTERVAL 17737 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_KEEPALIVETIME 17738 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_PRIORITY 17739 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_LOCALEIDS 17740 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_TRANSPORTSETTINGS 17741 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_MESSAGESETTINGS 17742 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER 17743 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DATASETWRITERID 17744 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DATASETFIELDCONTENTMASK 17745 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_KEYFRAMECOUNT 17746 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_TRANSPORTSETTINGS 17747 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_MESSAGESETTINGS 17748 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS 17749 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS_STATE 17750 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS_ENABLE 17751 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_STATUS_DISABLE 17752 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS 17753 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_DIAGNOSTICSLEVEL 17754 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION 17755 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 17756 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 17757 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 17758 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 17759 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR 17760 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_ACTIVE 17761 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 17762 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 17763 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 17764 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_RESET 17765 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_SUBERROR 17766 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS 17767 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR 17768 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 17769 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 17770 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 17771 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 17772 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 17773 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 17774 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 17775 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 17776 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 17777 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 17778 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 17779 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 17780 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 17781 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 17782 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 17783 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 17784 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 17785 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 17786 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 17787 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 17788 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 17789 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 17790 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 17791 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 17792 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 17793 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 17794 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 17795 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 17796 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 17797 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES 17798 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES 17799 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_ACTIVE 17800 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_CLASSIFICATION 17801 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_DIAGNOSTICSLEVEL 17802 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_TIMEFIRSTCHANGE 17803 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER 17804 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER_DIAGNOSTICSLEVEL 17805 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_STATUSCODE 17806 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_STATUSCODE_DIAGNOSTICSLEVEL 17807 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MAJORVERSION 17808 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MAJORVERSION_DIAGNOSTICSLEVEL 17809 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MINORVERSION 17810 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MINORVERSION_DIAGNOSTICSLEVEL 17811 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS 17812 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_DIAGNOSTICSLEVEL 17813 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_TOTALINFORMATION 17814 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 17815 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 17816 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 17817 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 17818 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_TOTALERROR 17819 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_TOTALERROR_ACTIVE 17820 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 17821 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 17822 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 17823 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_RESET 17824 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_SUBERROR 17825 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS 17826 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEERROR 17827 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 17828 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 17829 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 17830 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 17831 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 17832 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 17833 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 17834 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 17835 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 17836 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 17837 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 17838 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 17839 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 17840 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 17841 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 17842 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 17843 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 17844 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 17845 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 17846 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 17847 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 17848 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 17849 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 17850 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 17851 /* Variable */ +#define UA_NS0ID_AUTHORIZATIONSERVICECONFIGURATIONTYPE 17852 /* ObjectType */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 17853 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 17854 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 17855 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 17856 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 17857 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_LIVEVALUES 17858 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_SENTNETWORKMESSAGES 17859 /* Variable */ +#define UA_NS0ID_AUTHORIZATIONSERVICECONFIGURATIONTYPE_SERVICECERTIFICATE 17860 /* Variable */ +#define UA_NS0ID_DECIMALDATATYPE 17861 /* DataType */ +#define UA_NS0ID_DECIMALDATATYPE_ENCODING_DEFAULTXML 17862 /* Object */ +#define UA_NS0ID_DECIMALDATATYPE_ENCODING_DEFAULTBINARY 17863 /* Object */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_SENTNETWORKMESSAGES_ACTIVE 17864 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_AUDIBLESOUND_LISTID 17865 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_AUDIBLESOUND_AGENCYID 17866 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_AUDIBLESOUND_VERSIONID 17867 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_UNSUPPRESS 17868 /* Method */ +#define UA_NS0ID_ALARMCONDITIONTYPE_REMOVEFROMSERVICE 17869 /* Method */ +#define UA_NS0ID_ALARMCONDITIONTYPE_PLACEINSERVICE 17870 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_SENTNETWORKMESSAGES_CLASSIFICATION 17871 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_SENTNETWORKMESSAGES_DIAGNOSTICSLEVEL 17872 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_SENTNETWORKMESSAGES_TIMEFIRSTCHANGE 17873 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_FAILEDTRANSMISSIONS 17874 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_UNSUPPRESS 17875 /* Method */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_REMOVEFROMSERVICE 17876 /* Method */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_PLACEINSERVICE 17877 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_FAILEDTRANSMISSIONS_ACTIVE 17878 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_AUDIBLESOUND_LISTID 17879 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_AUDIBLESOUND_AGENCYID 17880 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_AUDIBLESOUND_VERSIONID 17881 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_UNSUPPRESS 17882 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_REMOVEFROMSERVICE 17883 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_PLACEINSERVICE 17884 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_FAILEDTRANSMISSIONS_CLASSIFICATION 17885 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_AUDIBLESOUND_LISTID 17886 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_AUDIBLESOUND_AGENCYID 17887 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_AUDIBLESOUND_VERSIONID 17888 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_UNSUPPRESS 17889 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_REMOVEFROMSERVICE 17890 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_PLACEINSERVICE 17891 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_FAILEDTRANSMISSIONS_DIAGNOSTICSLEVEL 17892 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_AUDIBLESOUND_LISTID 17893 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_AUDIBLESOUND_AGENCYID 17894 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_AUDIBLESOUND_VERSIONID 17895 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_UNSUPPRESS 17896 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_REMOVEFROMSERVICE 17897 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_PLACEINSERVICE 17898 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_FAILEDTRANSMISSIONS_TIMEFIRSTCHANGE 17899 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_ENCRYPTIONERRORS 17900 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_ENCRYPTIONERRORS_ACTIVE 17901 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_ENCRYPTIONERRORS_CLASSIFICATION 17902 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_ENCRYPTIONERRORS_DIAGNOSTICSLEVEL 17903 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_REMOVEFROMSERVICE 17904 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_PLACEINSERVICE 17905 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_COUNTERS_ENCRYPTIONERRORS_TIMEFIRSTCHANGE 17906 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_AUDIBLESOUND_LISTID 17907 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_AUDIBLESOUND_AGENCYID 17908 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_AUDIBLESOUND_VERSIONID 17909 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_UNSUPPRESS 17910 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_REMOVEFROMSERVICE 17911 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_PLACEINSERVICE 17912 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETWRITERS 17913 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_AUDIBLESOUND_LISTID 17914 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_AUDIBLESOUND_AGENCYID 17915 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_AUDIBLESOUND_VERSIONID 17916 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_UNSUPPRESS 17917 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_REMOVEFROMSERVICE 17918 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_PLACEINSERVICE 17919 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETWRITERS_DIAGNOSTICSLEVEL 17920 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_AUDIBLESOUND_LISTID 17921 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_AUDIBLESOUND_AGENCYID 17922 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_AUDIBLESOUND_VERSIONID 17923 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_UNSUPPRESS 17924 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_REMOVEFROMSERVICE 17925 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_PLACEINSERVICE 17926 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETWRITERS 17927 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_AUDIBLESOUND_LISTID 17928 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_AUDIBLESOUND_AGENCYID 17929 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_AUDIBLESOUND_VERSIONID 17930 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_UNSUPPRESS 17931 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_REMOVEFROMSERVICE 17932 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_PLACEINSERVICE 17933 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETWRITERS_DIAGNOSTICSLEVEL 17934 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_AUDIBLESOUND_LISTID 17935 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_AUDIBLESOUND_AGENCYID 17936 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_AUDIBLESOUND_VERSIONID 17937 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_UNSUPPRESS 17938 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_REMOVEFROMSERVICE 17939 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_PLACEINSERVICE 17940 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_LIVEVALUES_SECURITYTOKENID 17941 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_AUDIBLESOUND_LISTID 17942 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_AUDIBLESOUND_AGENCYID 17943 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_AUDIBLESOUND_VERSIONID 17944 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_UNSUPPRESS 17945 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_REMOVEFROMSERVICE 17946 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_PLACEINSERVICE 17947 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_LIVEVALUES_SECURITYTOKENID_DIAGNOSTICSLEVEL 17948 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_AUDIBLESOUND_LISTID 17949 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_AUDIBLESOUND_AGENCYID 17950 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_AUDIBLESOUND_VERSIONID 17951 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_UNSUPPRESS 17952 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_REMOVEFROMSERVICE 17953 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_PLACEINSERVICE 17954 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_LIVEVALUES_TIMETONEXTTOKENID 17955 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_AUDIBLESOUND_LISTID 17956 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_AUDIBLESOUND_AGENCYID 17957 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_AUDIBLESOUND_VERSIONID 17958 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_UNSUPPRESS 17959 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_REMOVEFROMSERVICE 17960 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_PLACEINSERVICE 17961 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_DIAGNOSTICS_LIVEVALUES_TIMETONEXTTOKENID_DIAGNOSTICSLEVEL 17962 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_AUDIBLESOUND_LISTID 17963 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_AUDIBLESOUND_AGENCYID 17964 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_AUDIBLESOUND_VERSIONID 17965 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_UNSUPPRESS 17966 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_REMOVEFROMSERVICE 17967 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_PLACEINSERVICE 17968 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_ADDDATASETWRITER 17969 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_AUDIBLESOUND_LISTID 17970 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_AUDIBLESOUND_AGENCYID 17971 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_AUDIBLESOUND_VERSIONID 17972 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_UNSUPPRESS 17973 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_REMOVEFROMSERVICE 17974 /* Method */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_PLACEINSERVICE 17975 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_ADDDATASETWRITER_INPUTARGUMENTS 17976 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_AUDIBLESOUND_LISTID 17977 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_AUDIBLESOUND_AGENCYID 17978 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_AUDIBLESOUND_VERSIONID 17979 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_UNSUPPRESS 17980 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_REMOVEFROMSERVICE 17981 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_PLACEINSERVICE 17982 /* Method */ +#define UA_NS0ID_HASEFFECTENABLE 17983 /* ReferenceType */ +#define UA_NS0ID_HASEFFECTSUPPRESSED 17984 /* ReferenceType */ +#define UA_NS0ID_HASEFFECTUNSUPPRESSED 17985 /* ReferenceType */ +#define UA_NS0ID_AUDIOVARIABLETYPE 17986 /* VariableType */ +#define UA_NS0ID_WRITERGROUPTYPE_ADDDATASETWRITER_OUTPUTARGUMENTS 17987 /* Variable */ +#define UA_NS0ID_AUDIOVARIABLETYPE_LISTID 17988 /* Variable */ +#define UA_NS0ID_AUDIOVARIABLETYPE_AGENCYID 17989 /* Variable */ +#define UA_NS0ID_AUDIOVARIABLETYPE_VERSIONID 17990 /* Variable */ +#define UA_NS0ID_ALARMMETRICSTYPE_STARTTIME 17991 /* Variable */ +#define UA_NS0ID_WRITERGROUPTYPE_REMOVEDATASETWRITER 17992 /* Method */ +#define UA_NS0ID_WRITERGROUPTYPE_REMOVEDATASETWRITER_INPUTARGUMENTS 17993 /* Variable */ +#define UA_NS0ID_PUBSUBGROUPTYPEADDWRITERRMETHODTYPE 17994 /* Method */ +#define UA_NS0ID_PUBSUBGROUPTYPEADDWRITERRMETHODTYPE_INPUTARGUMENTS 17995 /* Variable */ +#define UA_NS0ID_PUBSUBGROUPTYPEADDWRITERRMETHODTYPE_OUTPUTARGUMENTS 17996 /* Variable */ +#define UA_NS0ID_WRITERGROUPTRANSPORTTYPE 17997 /* ObjectType */ +#define UA_NS0ID_WRITERGROUPMESSAGETYPE 17998 /* ObjectType */ +#define UA_NS0ID_READERGROUPTYPE 17999 /* ObjectType */ +#define UA_NS0ID_READERGROUPTYPE_SECURITYMODE 18000 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONTYPE 18001 /* ObjectType */ +#define UA_NS0ID_READERGROUPTYPE_SECURITYGROUPID 18002 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_SECURITYKEYSERVICES 18003 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONTYPE_ENDPOINTURLS 18004 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONTYPE_SERVICESTATUS 18005 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONTYPE_UPDATECREDENTIAL 18006 /* Method */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONTYPE_UPDATECREDENTIAL_INPUTARGUMENTS 18007 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONTYPE_DELETECREDENTIAL 18008 /* Method */ +#define UA_NS0ID_KEYCREDENTIALUPDATEMETHODTYPE 18009 /* Method */ +#define UA_NS0ID_KEYCREDENTIALUPDATEMETHODTYPE_INPUTARGUMENTS 18010 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE 18011 /* ObjectType */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_EVENTID 18012 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_EVENTTYPE 18013 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_SOURCENODE 18014 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_SOURCENAME 18015 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_TIME 18016 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_RECEIVETIME 18017 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_LOCALTIME 18018 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_MESSAGE 18019 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_SEVERITY 18020 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_ACTIONTIMESTAMP 18021 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_STATUS 18022 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_SERVERID 18023 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_CLIENTAUDITENTRYID 18024 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_CLIENTUSERID 18025 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_METHODID 18026 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_INPUTARGUMENTS 18027 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALAUDITEVENTTYPE_RESOURCEURI 18028 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE 18029 /* ObjectType */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_EVENTID 18030 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_EVENTTYPE 18031 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_SOURCENODE 18032 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_SOURCENAME 18033 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_TIME 18034 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_RECEIVETIME 18035 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_LOCALTIME 18036 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_MESSAGE 18037 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_SEVERITY 18038 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_ACTIONTIMESTAMP 18039 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_STATUS 18040 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_SERVERID 18041 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_CLIENTAUDITENTRYID 18042 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_CLIENTUSERID 18043 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_METHODID 18044 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_INPUTARGUMENTS 18045 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALUPDATEDAUDITEVENTTYPE_RESOURCEURI 18046 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE 18047 /* ObjectType */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_EVENTID 18048 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_EVENTTYPE 18049 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_SOURCENODE 18050 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_SOURCENAME 18051 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_TIME 18052 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_RECEIVETIME 18053 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_LOCALTIME 18054 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_MESSAGE 18055 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_SEVERITY 18056 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_ACTIONTIMESTAMP 18057 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_STATUS 18058 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_SERVERID 18059 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_CLIENTAUDITENTRYID 18060 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_CLIENTUSERID 18061 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_METHODID 18062 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_INPUTARGUMENTS 18063 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALDELETEDAUDITEVENTTYPE_RESOURCEURI 18064 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_MAXNETWORKMESSAGESIZE 18065 /* Variable */ +#define UA_NS0ID_AUTHORIZATIONSERVICES_SERVICENAME_PLACEHOLDER_SERVICECERTIFICATE 18066 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_STATUS 18067 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_STATUS_STATE 18068 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONTYPE_RESOURCEURI 18069 /* Variable */ +#define UA_NS0ID_AUTHORIZATIONSERVICES_SERVICENAME_PLACEHOLDER_SERVICEURI 18070 /* Variable */ +#define UA_NS0ID_AUTHORIZATIONSERVICES_SERVICENAME_PLACEHOLDER_ISSUERENDPOINTURL 18071 /* Variable */ +#define UA_NS0ID_AUTHORIZATIONSERVICECONFIGURATIONTYPE_SERVICEURI 18072 /* Variable */ +#define UA_NS0ID_AUTHORIZATIONSERVICECONFIGURATIONTYPE_ISSUERENDPOINTURL 18073 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_STATUS_ENABLE 18074 /* Method */ +#define UA_NS0ID_READERGROUPTYPE_STATUS_DISABLE 18075 /* Method */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER 18076 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_PUBLISHERID 18077 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_WRITERGROUPID 18078 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DATASETWRITERID 18079 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DATASETMETADATA 18080 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DATASETFIELDCONTENTMASK 18081 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_MESSAGERECEIVETIMEOUT 18082 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_SECURITYMODE 18083 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_SECURITYGROUPID 18084 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_SECURITYKEYSERVICES 18085 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_TRANSPORTSETTINGS 18086 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_MESSAGESETTINGS 18087 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_STATUS 18088 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_STATUS_STATE 18089 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_STATUS_ENABLE 18090 /* Method */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_STATUS_DISABLE 18091 /* Method */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS 18092 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_DIAGNOSTICSLEVEL 18093 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION 18094 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 18095 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 18096 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 18097 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 18098 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR 18099 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_ACTIVE 18100 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 18101 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 18102 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 18103 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_RESET 18104 /* Method */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_SUBERROR 18105 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS 18106 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR 18107 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 18108 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 18109 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 18110 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 18111 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 18112 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 18113 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 18114 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 18115 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 18116 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 18117 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 18118 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 18119 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 18120 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 18121 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 18122 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 18123 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 18124 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 18125 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 18126 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 18127 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 18128 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 18129 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 18130 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 18131 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 18132 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 18133 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 18134 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 18135 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 18136 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES 18137 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES 18138 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_ACTIVE 18139 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_CLASSIFICATION 18140 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_DIAGNOSTICSLEVEL 18141 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_TIMEFIRSTCHANGE 18142 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS 18143 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_ACTIVE 18144 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_CLASSIFICATION 18145 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_DIAGNOSTICSLEVEL 18146 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_TIMEFIRSTCHANGE 18147 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER 18148 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER_DIAGNOSTICSLEVEL 18149 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_STATUSCODE 18150 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_STATUSCODE_DIAGNOSTICSLEVEL 18151 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MAJORVERSION 18152 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MAJORVERSION_DIAGNOSTICSLEVEL 18153 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MINORVERSION 18154 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION 18155 /* Object */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_SERVICENAME_PLACEHOLDER 18156 /* Object */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_SERVICENAME_PLACEHOLDER_RESOURCEURI 18157 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MINORVERSION_DIAGNOSTICSLEVEL 18158 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_SERVICENAME_PLACEHOLDER_ENDPOINTURLS 18159 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_SERVICENAME_PLACEHOLDER_SERVICESTATUS 18160 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_SERVICENAME_PLACEHOLDER_UPDATECREDENTIAL 18161 /* Method */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_SERVICENAME_PLACEHOLDER_UPDATECREDENTIAL_INPUTARGUMENTS 18162 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_SERVICENAME_PLACEHOLDER_DELETECREDENTIAL 18163 /* Method */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATION_SERVICENAME_PLACEHOLDER_PROFILEURI 18164 /* Variable */ +#define UA_NS0ID_KEYCREDENTIALCONFIGURATIONTYPE_PROFILEURI 18165 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATATYPEDEFINITION 18166 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATATYPEDEFINITION_DATATYPEVERSION 18167 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATATYPEDEFINITION_DICTIONARYFRAGMENT 18168 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_STRUCTUREFIELD 18169 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_STRUCTUREFIELD_DATATYPEVERSION 18170 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_STRUCTUREFIELD_DICTIONARYFRAGMENT 18171 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_STRUCTUREDEFINITION 18172 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_STRUCTUREDEFINITION_DATATYPEVERSION 18173 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_STRUCTUREDEFINITION_DICTIONARYFRAGMENT 18174 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENUMDEFINITION 18175 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENUMDEFINITION_DATATYPEVERSION 18176 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_ENUMDEFINITION_DICTIONARYFRAGMENT 18177 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATATYPEDEFINITION 18178 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATATYPEDEFINITION_DATATYPEVERSION 18179 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATATYPEDEFINITION_DICTIONARYFRAGMENT 18180 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_STRUCTUREFIELD 18181 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_STRUCTUREFIELD_DATATYPEVERSION 18182 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_STRUCTUREFIELD_DICTIONARYFRAGMENT 18183 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_STRUCTUREDEFINITION 18184 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_STRUCTUREDEFINITION_DATATYPEVERSION 18185 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_STRUCTUREDEFINITION_DICTIONARYFRAGMENT 18186 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENUMDEFINITION 18187 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENUMDEFINITION_DATATYPEVERSION 18188 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_ENUMDEFINITION_DICTIONARYFRAGMENT 18189 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_LATCHEDSTATE 18190 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_LATCHEDSTATE_ID 18191 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_LATCHEDSTATE_NAME 18192 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_LATCHEDSTATE_NUMBER 18193 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18194 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_LATCHEDSTATE_TRANSITIONTIME 18195 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18196 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_LATCHEDSTATE_TRUESTATE 18197 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_LATCHEDSTATE_FALSESTATE 18198 /* Variable */ +#define UA_NS0ID_ALARMCONDITIONTYPE_RESET 18199 /* Method */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_AUDIBLESOUND_LISTID 18200 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_AUDIBLESOUND_AGENCYID 18201 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_AUDIBLESOUND_VERSIONID 18202 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_LATCHEDSTATE 18203 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_LATCHEDSTATE_ID 18204 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_LATCHEDSTATE_NAME 18205 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_LATCHEDSTATE_NUMBER 18206 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18207 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_LATCHEDSTATE_TRANSITIONTIME 18208 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18209 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_LATCHEDSTATE_TRUESTATE 18210 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_LATCHEDSTATE_FALSESTATE 18211 /* Variable */ +#define UA_NS0ID_ALARMGROUPTYPE_ALARMCONDITIONINSTANCE_PLACEHOLDER_RESET 18212 /* Method */ +#define UA_NS0ID_LIMITALARMTYPE_LATCHEDSTATE 18213 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_LATCHEDSTATE_ID 18214 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_LATCHEDSTATE_NAME 18215 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_LATCHEDSTATE_NUMBER 18216 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18217 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18218 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18219 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_LATCHEDSTATE_TRUESTATE 18220 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_LATCHEDSTATE_FALSESTATE 18221 /* Variable */ +#define UA_NS0ID_LIMITALARMTYPE_RESET 18222 /* Method */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LATCHEDSTATE 18223 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_ID 18224 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_NAME 18225 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_NUMBER 18226 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18227 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18228 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18229 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_TRUESTATE 18230 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_FALSESTATE 18231 /* Variable */ +#define UA_NS0ID_EXCLUSIVELIMITALARMTYPE_RESET 18232 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LATCHEDSTATE 18233 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_ID 18234 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_NAME 18235 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_NUMBER 18236 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18237 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18238 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18239 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_TRUESTATE 18240 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_LATCHEDSTATE_FALSESTATE 18241 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELIMITALARMTYPE_RESET 18242 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_AUDIBLESOUND_LISTID 18243 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_AUDIBLESOUND_AGENCYID 18244 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_AUDIBLESOUND_VERSIONID 18245 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LATCHEDSTATE 18246 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_ID 18247 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_NAME 18248 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_NUMBER 18249 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18250 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18251 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18252 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_TRUESTATE 18253 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_FALSESTATE 18254 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_UNSUPPRESS 18255 /* Method */ +#define UA_NS0ID_NONEXCLUSIVELEVELALARMTYPE_RESET 18256 /* Method */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LATCHEDSTATE 18257 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_ID 18258 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_NAME 18259 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_NUMBER 18260 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18261 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18262 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18263 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_TRUESTATE 18264 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_LATCHEDSTATE_FALSESTATE 18265 /* Variable */ +#define UA_NS0ID_EXCLUSIVELEVELALARMTYPE_RESET 18266 /* Method */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE 18267 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_ID 18268 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_NAME 18269 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_NUMBER 18270 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18271 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18272 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18273 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_TRUESTATE 18274 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_FALSESTATE 18275 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVEDEVIATIONALARMTYPE_RESET 18276 /* Method */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE 18277 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_ID 18278 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_NAME 18279 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_NUMBER 18280 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18281 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18282 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18283 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_TRUESTATE 18284 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_FALSESTATE 18285 /* Variable */ +#define UA_NS0ID_NONEXCLUSIVERATEOFCHANGEALARMTYPE_RESET 18286 /* Method */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE 18287 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_ID 18288 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_NAME 18289 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_NUMBER 18290 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18291 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18292 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18293 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_TRUESTATE 18294 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_LATCHEDSTATE_FALSESTATE 18295 /* Variable */ +#define UA_NS0ID_EXCLUSIVEDEVIATIONALARMTYPE_RESET 18296 /* Method */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE 18297 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_ID 18298 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_NAME 18299 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_NUMBER 18300 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18301 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18302 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18303 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_TRUESTATE 18304 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_LATCHEDSTATE_FALSESTATE 18305 /* Variable */ +#define UA_NS0ID_EXCLUSIVERATEOFCHANGEALARMTYPE_RESET 18306 /* Method */ +#define UA_NS0ID_DISCRETEALARMTYPE_LATCHEDSTATE 18307 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_LATCHEDSTATE_ID 18308 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_LATCHEDSTATE_NAME 18309 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_LATCHEDSTATE_NUMBER 18310 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18311 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18312 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18313 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_LATCHEDSTATE_TRUESTATE 18314 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_LATCHEDSTATE_FALSESTATE 18315 /* Variable */ +#define UA_NS0ID_DISCRETEALARMTYPE_RESET 18316 /* Method */ +#define UA_NS0ID_OFFNORMALALARMTYPE_LATCHEDSTATE 18317 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_LATCHEDSTATE_ID 18318 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_LATCHEDSTATE_NAME 18319 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_LATCHEDSTATE_NUMBER 18320 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18321 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18322 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18323 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_LATCHEDSTATE_TRUESTATE 18324 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_LATCHEDSTATE_FALSESTATE 18325 /* Variable */ +#define UA_NS0ID_OFFNORMALALARMTYPE_RESET 18326 /* Method */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_LATCHEDSTATE 18327 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_LATCHEDSTATE_ID 18328 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_LATCHEDSTATE_NAME 18329 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_LATCHEDSTATE_NUMBER 18330 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18331 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18332 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18333 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_LATCHEDSTATE_TRUESTATE 18334 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_LATCHEDSTATE_FALSESTATE 18335 /* Variable */ +#define UA_NS0ID_SYSTEMOFFNORMALALARMTYPE_RESET 18336 /* Method */ +#define UA_NS0ID_TRIPALARMTYPE_LATCHEDSTATE 18337 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_LATCHEDSTATE_ID 18338 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_LATCHEDSTATE_NAME 18339 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_LATCHEDSTATE_NUMBER 18340 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18341 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18342 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18343 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_LATCHEDSTATE_TRUESTATE 18344 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_LATCHEDSTATE_FALSESTATE 18345 /* Variable */ +#define UA_NS0ID_TRIPALARMTYPE_RESET 18346 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE 18347 /* ObjectType */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_EVENTID 18348 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_EVENTTYPE 18349 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SOURCENODE 18350 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SOURCENAME 18351 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_TIME 18352 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_RECEIVETIME 18353 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_LOCALTIME 18354 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_MESSAGE 18355 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SEVERITY 18356 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONDITIONCLASSID 18357 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONDITIONCLASSNAME 18358 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONDITIONSUBCLASSID 18359 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONDITIONSUBCLASSNAME 18360 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONDITIONNAME 18361 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_BRANCHID 18362 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_RETAIN 18363 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ENABLEDSTATE 18364 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ENABLEDSTATE_ID 18365 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ENABLEDSTATE_NAME 18366 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ENABLEDSTATE_NUMBER 18367 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 18368 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 18369 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 18370 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ENABLEDSTATE_TRUESTATE 18371 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ENABLEDSTATE_FALSESTATE 18372 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_QUALITY 18373 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_QUALITY_SOURCETIMESTAMP 18374 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_LASTSEVERITY 18375 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 18376 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_COMMENT 18377 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_COMMENT_SOURCETIMESTAMP 18378 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CLIENTUSERID 18379 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_DISABLE 18380 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ENABLE 18381 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ADDCOMMENT 18382 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 18383 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONDITIONREFRESH 18384 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 18385 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONDITIONREFRESH2 18386 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 18387 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACKEDSTATE 18388 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACKEDSTATE_ID 18389 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACKEDSTATE_NAME 18390 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACKEDSTATE_NUMBER 18391 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 18392 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACKEDSTATE_TRANSITIONTIME 18393 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 18394 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACKEDSTATE_TRUESTATE 18395 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACKEDSTATE_FALSESTATE 18396 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONFIRMEDSTATE 18397 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_ID 18398 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_NAME 18399 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_NUMBER 18400 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 18401 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 18402 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 18403 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_TRUESTATE 18404 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_FALSESTATE 18405 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACKNOWLEDGE 18406 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 18407 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONFIRM 18408 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_CONFIRM_INPUTARGUMENTS 18409 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACTIVESTATE 18410 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACTIVESTATE_ID 18411 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACTIVESTATE_NAME 18412 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACTIVESTATE_NUMBER 18413 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 18414 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACTIVESTATE_TRANSITIONTIME 18415 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 18416 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACTIVESTATE_TRUESTATE 18417 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ACTIVESTATE_FALSESTATE 18418 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_INPUTNODE 18419 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE 18420 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_ID 18421 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_NAME 18422 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_NUMBER 18423 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 18424 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 18425 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 18426 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 18427 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 18428 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE 18429 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_ID 18430 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_NAME 18431 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_NUMBER 18432 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 18433 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 18434 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 18435 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 18436 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 18437 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE 18438 /* Object */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_CURRENTSTATE 18439 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 18440 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 18441 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 18442 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 18443 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_LASTTRANSITION 18444 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 18445 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 18446 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 18447 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 18448 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 18449 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 18450 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 18451 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_UNSHELVETIME 18452 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 18453 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 18454 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_UNSHELVE 18455 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 18456 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SUPPRESSEDORSHELVED 18457 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_MAXTIMESHELVED 18458 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_AUDIBLEENABLED 18459 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_AUDIBLESOUND 18460 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_AUDIBLESOUND_LISTID 18461 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_AUDIBLESOUND_AGENCYID 18462 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_AUDIBLESOUND_VERSIONID 18463 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SILENCESTATE 18464 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SILENCESTATE_ID 18465 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SILENCESTATE_NAME 18466 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SILENCESTATE_NUMBER 18467 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 18468 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SILENCESTATE_TRANSITIONTIME 18469 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 18470 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SILENCESTATE_TRUESTATE 18471 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SILENCESTATE_FALSESTATE 18472 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ONDELAY 18473 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_OFFDELAY 18474 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_FIRSTINGROUPFLAG 18475 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_FIRSTINGROUP 18476 /* Object */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_LATCHEDSTATE 18477 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_LATCHEDSTATE_ID 18478 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_LATCHEDSTATE_NAME 18479 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_LATCHEDSTATE_NUMBER 18480 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18481 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18482 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18483 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_LATCHEDSTATE_TRUESTATE 18484 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_LATCHEDSTATE_FALSESTATE 18485 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_ALARMGROUP_PLACEHOLDER 18486 /* Object */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_REALARMTIME 18487 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_REALARMREPEATCOUNT 18488 /* Variable */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SILENCE 18489 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_SUPPRESS 18490 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_UNSUPPRESS 18491 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_REMOVEFROMSERVICE 18492 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_PLACEINSERVICE 18493 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_RESET 18494 /* Method */ +#define UA_NS0ID_INSTRUMENTDIAGNOSTICALARMTYPE_NORMALSTATE 18495 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE 18496 /* ObjectType */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_EVENTID 18497 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_EVENTTYPE 18498 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SOURCENODE 18499 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SOURCENAME 18500 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_TIME 18501 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_RECEIVETIME 18502 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_LOCALTIME 18503 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_MESSAGE 18504 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SEVERITY 18505 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONDITIONCLASSID 18506 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONDITIONCLASSNAME 18507 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONDITIONSUBCLASSID 18508 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONDITIONSUBCLASSNAME 18509 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONDITIONNAME 18510 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_BRANCHID 18511 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_RETAIN 18512 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ENABLEDSTATE 18513 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ENABLEDSTATE_ID 18514 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ENABLEDSTATE_NAME 18515 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ENABLEDSTATE_NUMBER 18516 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ENABLEDSTATE_EFFECTIVEDISPLAYNAME 18517 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ENABLEDSTATE_TRANSITIONTIME 18518 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ENABLEDSTATE_EFFECTIVETRANSITIONTIME 18519 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ENABLEDSTATE_TRUESTATE 18520 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ENABLEDSTATE_FALSESTATE 18521 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_QUALITY 18522 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_QUALITY_SOURCETIMESTAMP 18523 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_LASTSEVERITY 18524 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_LASTSEVERITY_SOURCETIMESTAMP 18525 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_COMMENT 18526 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_COMMENT_SOURCETIMESTAMP 18527 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CLIENTUSERID 18528 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_DISABLE 18529 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ENABLE 18530 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ADDCOMMENT 18531 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ADDCOMMENT_INPUTARGUMENTS 18532 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONDITIONREFRESH 18533 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONDITIONREFRESH_INPUTARGUMENTS 18534 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONDITIONREFRESH2 18535 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONDITIONREFRESH2_INPUTARGUMENTS 18536 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACKEDSTATE 18537 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACKEDSTATE_ID 18538 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACKEDSTATE_NAME 18539 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACKEDSTATE_NUMBER 18540 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACKEDSTATE_EFFECTIVEDISPLAYNAME 18541 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACKEDSTATE_TRANSITIONTIME 18542 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACKEDSTATE_EFFECTIVETRANSITIONTIME 18543 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACKEDSTATE_TRUESTATE 18544 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACKEDSTATE_FALSESTATE 18545 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONFIRMEDSTATE 18546 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_ID 18547 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_NAME 18548 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_NUMBER 18549 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_EFFECTIVEDISPLAYNAME 18550 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_TRANSITIONTIME 18551 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_EFFECTIVETRANSITIONTIME 18552 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_TRUESTATE 18553 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONFIRMEDSTATE_FALSESTATE 18554 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACKNOWLEDGE 18555 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACKNOWLEDGE_INPUTARGUMENTS 18556 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONFIRM 18557 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_CONFIRM_INPUTARGUMENTS 18558 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACTIVESTATE 18559 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACTIVESTATE_ID 18560 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACTIVESTATE_NAME 18561 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACTIVESTATE_NUMBER 18562 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACTIVESTATE_EFFECTIVEDISPLAYNAME 18563 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACTIVESTATE_TRANSITIONTIME 18564 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACTIVESTATE_EFFECTIVETRANSITIONTIME 18565 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACTIVESTATE_TRUESTATE 18566 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ACTIVESTATE_FALSESTATE 18567 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_INPUTNODE 18568 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE 18569 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_ID 18570 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_NAME 18571 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_NUMBER 18572 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_EFFECTIVEDISPLAYNAME 18573 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_TRANSITIONTIME 18574 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_EFFECTIVETRANSITIONTIME 18575 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_TRUESTATE 18576 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SUPPRESSEDSTATE_FALSESTATE 18577 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE 18578 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_ID 18579 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_NAME 18580 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_NUMBER 18581 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_EFFECTIVEDISPLAYNAME 18582 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_TRANSITIONTIME 18583 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_EFFECTIVETRANSITIONTIME 18584 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_TRUESTATE 18585 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_OUTOFSERVICESTATE_FALSESTATE 18586 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE 18587 /* Object */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_CURRENTSTATE 18588 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_CURRENTSTATE_ID 18589 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NAME 18590 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_CURRENTSTATE_NUMBER 18591 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_CURRENTSTATE_EFFECTIVEDISPLAYNAME 18592 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_LASTTRANSITION 18593 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_LASTTRANSITION_ID 18594 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NAME 18595 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_LASTTRANSITION_NUMBER 18596 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_LASTTRANSITION_TRANSITIONTIME 18597 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_LASTTRANSITION_EFFECTIVETRANSITIONTIME 18598 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_AVAILABLESTATES 18599 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_AVAILABLETRANSITIONS 18600 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_UNSHELVETIME 18601 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_TIMEDSHELVE 18602 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_TIMEDSHELVE_INPUTARGUMENTS 18603 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_UNSHELVE 18604 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SHELVINGSTATE_ONESHOTSHELVE 18605 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SUPPRESSEDORSHELVED 18606 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_MAXTIMESHELVED 18607 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_AUDIBLEENABLED 18608 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_AUDIBLESOUND 18609 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_AUDIBLESOUND_LISTID 18610 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_AUDIBLESOUND_AGENCYID 18611 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_AUDIBLESOUND_VERSIONID 18612 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SILENCESTATE 18613 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SILENCESTATE_ID 18614 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SILENCESTATE_NAME 18615 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SILENCESTATE_NUMBER 18616 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SILENCESTATE_EFFECTIVEDISPLAYNAME 18617 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SILENCESTATE_TRANSITIONTIME 18618 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SILENCESTATE_EFFECTIVETRANSITIONTIME 18619 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SILENCESTATE_TRUESTATE 18620 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SILENCESTATE_FALSESTATE 18621 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ONDELAY 18622 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_OFFDELAY 18623 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_FIRSTINGROUPFLAG 18624 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_FIRSTINGROUP 18625 /* Object */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_LATCHEDSTATE 18626 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_LATCHEDSTATE_ID 18627 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_LATCHEDSTATE_NAME 18628 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_LATCHEDSTATE_NUMBER 18629 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18630 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18631 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18632 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_LATCHEDSTATE_TRUESTATE 18633 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_LATCHEDSTATE_FALSESTATE 18634 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_ALARMGROUP_PLACEHOLDER 18635 /* Object */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_REALARMTIME 18636 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_REALARMREPEATCOUNT 18637 /* Variable */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SILENCE 18638 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_SUPPRESS 18639 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_UNSUPPRESS 18640 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_REMOVEFROMSERVICE 18641 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_PLACEINSERVICE 18642 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_RESET 18643 /* Method */ +#define UA_NS0ID_SYSTEMDIAGNOSTICALARMTYPE_NORMALSTATE 18644 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_LATCHEDSTATE 18645 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_LATCHEDSTATE_ID 18646 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_LATCHEDSTATE_NAME 18647 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_LATCHEDSTATE_NUMBER 18648 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18649 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18650 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18651 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_LATCHEDSTATE_TRUESTATE 18652 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_LATCHEDSTATE_FALSESTATE 18653 /* Variable */ +#define UA_NS0ID_CERTIFICATEEXPIRATIONALARMTYPE_RESET 18654 /* Method */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_LATCHEDSTATE 18655 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_LATCHEDSTATE_ID 18656 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_LATCHEDSTATE_NAME 18657 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_LATCHEDSTATE_NUMBER 18658 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_LATCHEDSTATE_EFFECTIVEDISPLAYNAME 18659 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_LATCHEDSTATE_TRANSITIONTIME 18660 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_LATCHEDSTATE_EFFECTIVETRANSITIONTIME 18661 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_LATCHEDSTATE_TRUESTATE 18662 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_LATCHEDSTATE_FALSESTATE 18663 /* Variable */ +#define UA_NS0ID_DISCREPANCYALARMTYPE_RESET 18664 /* Method */ +#define UA_NS0ID_STATISTICALCONDITIONCLASSTYPE 18665 /* ObjectType */ +#define UA_NS0ID_ALARMMETRICSTYPE_RESET 18666 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS 18667 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_DIAGNOSTICSLEVEL 18668 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION 18669 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 18670 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 18671 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 18672 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 18673 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR 18674 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_ACTIVE 18675 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 18676 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 18677 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 18678 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_RESET 18679 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_SUBERROR 18680 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS 18681 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR 18682 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 18683 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 18684 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 18685 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 18686 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 18687 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 18688 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 18689 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 18690 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 18691 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 18692 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 18693 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 18694 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 18695 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 18696 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 18697 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 18698 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 18699 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 18700 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 18701 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 18702 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 18703 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 18704 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 18705 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 18706 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 18707 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 18708 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 18709 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 18710 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 18711 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES 18712 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_RESOLVEDADDRESS 18713 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_CONNECTIONNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_RESOLVEDADDRESS_DIAGNOSTICSLEVEL 18714 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS 18715 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_DIAGNOSTICSLEVEL 18716 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_TOTALINFORMATION 18717 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 18718 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 18719 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 18720 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 18721 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_TOTALERROR 18722 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_TOTALERROR_ACTIVE 18723 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 18724 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 18725 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 18726 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_RESET 18727 /* Method */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_SUBERROR 18728 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS 18729 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEERROR 18730 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 18731 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 18732 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 18733 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 18734 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 18735 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 18736 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 18737 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 18738 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 18739 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 18740 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 18741 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 18742 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 18743 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 18744 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 18745 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 18746 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 18747 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 18748 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 18749 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 18750 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 18751 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 18752 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 18753 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 18754 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 18755 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 18756 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 18757 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 18758 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 18759 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_LIVEVALUES 18760 /* Object */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETWRITERS 18761 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETWRITERS_DIAGNOSTICSLEVEL 18762 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETREADERS 18763 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETREADERS_DIAGNOSTICSLEVEL 18764 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETWRITERS 18765 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETWRITERS_DIAGNOSTICSLEVEL 18766 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETREADERS 18767 /* Variable */ +#define UA_NS0ID_PUBLISHSUBSCRIBETYPE_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETREADERS_DIAGNOSTICSLEVEL 18768 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS 18871 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_DIAGNOSTICSLEVEL 18872 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION 18873 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 18874 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 18875 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 18876 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 18877 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR 18878 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_ACTIVE 18879 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 18880 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 18881 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 18882 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_RESET 18883 /* Method */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_SUBERROR 18884 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS 18885 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR 18886 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 18887 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 18888 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 18889 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 18890 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 18891 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 18892 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 18893 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 18894 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 18895 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 18896 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 18897 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 18898 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 18899 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 18900 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 18901 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 18902 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 18903 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 18904 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 18905 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 18906 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 18907 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 18908 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 18909 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 18910 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 18911 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 18912 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 18913 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 18914 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 18915 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES 18916 /* Object */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES 18917 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_ACTIVE 18918 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_CLASSIFICATION 18919 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_DIAGNOSTICSLEVEL 18920 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_TIMEFIRSTCHANGE 18921 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER 18922 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER_DIAGNOSTICSLEVEL 18923 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_STATUSCODE 18924 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_STATUSCODE_DIAGNOSTICSLEVEL 18925 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MAJORVERSION 18926 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MAJORVERSION_DIAGNOSTICSLEVEL 18927 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MINORVERSION 18928 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATASETTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MINORVERSION_DIAGNOSTICSLEVEL 18929 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS 18930 /* Object */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_DIAGNOSTICSLEVEL 18931 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION 18932 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 18933 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 18934 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 18935 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 18936 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR 18937 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_ACTIVE 18938 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 18939 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 18940 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 18941 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_RESET 18942 /* Method */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_SUBERROR 18943 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS 18944 /* Object */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR 18945 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 18946 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 18947 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 18948 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 18949 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 18950 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 18951 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 18952 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 18953 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 18954 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 18955 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 18956 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 18957 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 18958 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 18959 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 18960 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 18961 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 18962 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 18963 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 18964 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 18965 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 18966 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 18967 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 18968 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 18969 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 18970 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 18971 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 18972 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 18973 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 18974 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES 18975 /* Object */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES 18976 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_ACTIVE 18977 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_CLASSIFICATION 18978 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_DIAGNOSTICSLEVEL 18979 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_TIMEFIRSTCHANGE 18980 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER 18981 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER_DIAGNOSTICSLEVEL 18982 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_STATUSCODE 18983 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_STATUSCODE_DIAGNOSTICSLEVEL 18984 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MAJORVERSION 18985 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MAJORVERSION_DIAGNOSTICSLEVEL 18986 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MINORVERSION 18987 /* Variable */ +#define UA_NS0ID_PUBLISHEDDATAITEMSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MINORVERSION_DIAGNOSTICSLEVEL 18988 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS 18989 /* Object */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_DIAGNOSTICSLEVEL 18990 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION 18991 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 18992 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 18993 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 18994 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 18995 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR 18996 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_ACTIVE 18997 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 18998 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 18999 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 19000 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_RESET 19001 /* Method */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_SUBERROR 19002 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS 19003 /* Object */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR 19004 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 19005 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 19006 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 19007 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 19008 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 19009 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 19010 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 19011 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 19012 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 19013 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 19014 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 19015 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 19016 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 19017 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 19018 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 19019 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 19020 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 19021 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 19022 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 19023 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 19024 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 19025 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 19026 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 19027 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 19028 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 19029 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 19030 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 19031 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 19032 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 19033 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES 19034 /* Object */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES 19035 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_ACTIVE 19036 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_CLASSIFICATION 19037 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_DIAGNOSTICSLEVEL 19038 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_TIMEFIRSTCHANGE 19039 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER 19040 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER_DIAGNOSTICSLEVEL 19041 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_STATUSCODE 19042 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_STATUSCODE_DIAGNOSTICSLEVEL 19043 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MAJORVERSION 19044 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MAJORVERSION_DIAGNOSTICSLEVEL 19045 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MINORVERSION 19046 /* Variable */ +#define UA_NS0ID_PUBLISHEDEVENTSTYPE_DATASETWRITERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_MINORVERSION_DIAGNOSTICSLEVEL 19047 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS 19107 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_DIAGNOSTICSLEVEL 19108 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION 19109 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 19110 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 19111 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 19112 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 19113 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR 19114 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_ACTIVE 19115 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 19116 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 19117 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 19118 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_RESET 19119 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_SUBERROR 19120 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS 19121 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR 19122 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 19123 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 19124 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 19125 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 19126 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 19127 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 19128 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 19129 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 19130 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 19131 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 19132 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 19133 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 19134 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 19135 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 19136 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 19137 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 19138 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 19139 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 19140 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 19141 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 19142 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 19143 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 19144 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 19145 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 19146 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 19147 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 19148 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 19149 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 19150 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 19151 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES 19152 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_SENTNETWORKMESSAGES 19153 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_SENTNETWORKMESSAGES_ACTIVE 19154 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_SENTNETWORKMESSAGES_CLASSIFICATION 19155 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_SENTNETWORKMESSAGES_DIAGNOSTICSLEVEL 19156 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_SENTNETWORKMESSAGES_TIMEFIRSTCHANGE 19157 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDTRANSMISSIONS 19158 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDTRANSMISSIONS_ACTIVE 19159 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDTRANSMISSIONS_CLASSIFICATION 19160 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDTRANSMISSIONS_DIAGNOSTICSLEVEL 19161 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_FAILEDTRANSMISSIONS_TIMEFIRSTCHANGE 19162 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_ENCRYPTIONERRORS 19163 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_ENCRYPTIONERRORS_ACTIVE 19164 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_ENCRYPTIONERRORS_CLASSIFICATION 19165 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_ENCRYPTIONERRORS_DIAGNOSTICSLEVEL 19166 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_ENCRYPTIONERRORS_TIMEFIRSTCHANGE 19167 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETWRITERS 19168 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETWRITERS_DIAGNOSTICSLEVEL 19169 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETWRITERS 19170 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETWRITERS_DIAGNOSTICSLEVEL 19171 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_SECURITYTOKENID 19172 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_SECURITYTOKENID_DIAGNOSTICSLEVEL 19173 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_TIMETONEXTTOKENID 19174 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_WRITERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_TIMETONEXTTOKENID_DIAGNOSTICSLEVEL 19175 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS 19176 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_DIAGNOSTICSLEVEL 19177 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION 19178 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 19179 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 19180 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 19181 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 19182 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR 19183 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_ACTIVE 19184 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 19185 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 19186 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 19187 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_RESET 19188 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_SUBERROR 19189 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS 19190 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR 19191 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 19192 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 19193 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 19194 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 19195 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 19196 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 19197 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 19198 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 19199 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 19200 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 19201 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 19202 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 19203 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 19204 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 19205 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 19206 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 19207 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 19208 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 19209 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 19210 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 19211 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 19212 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 19213 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 19214 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 19215 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 19216 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 19217 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 19218 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 19219 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 19220 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES 19221 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_RECEIVEDNETWORKMESSAGES 19222 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_RECEIVEDNETWORKMESSAGES_ACTIVE 19223 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_RECEIVEDNETWORKMESSAGES_CLASSIFICATION 19224 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_RECEIVEDNETWORKMESSAGES_DIAGNOSTICSLEVEL 19225 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_RECEIVEDNETWORKMESSAGES_TIMEFIRSTCHANGE 19226 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES 19227 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES_ACTIVE 19228 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES_CLASSIFICATION 19229 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES_DIAGNOSTICSLEVEL 19230 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES_TIMEFIRSTCHANGE 19231 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS 19232 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_ACTIVE 19233 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_CLASSIFICATION 19234 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_DIAGNOSTICSLEVEL 19235 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_TIMEFIRSTCHANGE 19236 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETREADERS 19237 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETREADERS_DIAGNOSTICSLEVEL 19238 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETREADERS 19239 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_READERGROUPNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETREADERS_DIAGNOSTICSLEVEL 19240 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS 19241 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_DIAGNOSTICSLEVEL 19242 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_TOTALINFORMATION 19243 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 19244 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 19245 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 19246 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 19247 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_TOTALERROR 19248 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_TOTALERROR_ACTIVE 19249 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 19250 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 19251 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 19252 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_RESET 19253 /* Method */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_SUBERROR 19254 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS 19255 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEERROR 19256 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 19257 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 19258 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 19259 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 19260 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 19261 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 19262 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 19263 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 19264 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 19265 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 19266 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 19267 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 19268 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 19269 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 19270 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 19271 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 19272 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 19273 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 19274 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 19275 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 19276 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 19277 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 19278 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 19279 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 19280 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 19281 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 19282 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 19283 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 19284 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 19285 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_LIVEVALUES 19286 /* Object */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_LIVEVALUES_RESOLVEDADDRESS 19287 /* Variable */ +#define UA_NS0ID_PUBSUBCONNECTIONTYPE_DIAGNOSTICS_LIVEVALUES_RESOLVEDADDRESS_DIAGNOSTICSLEVEL 19288 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS 19550 /* Object */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_DIAGNOSTICSLEVEL 19551 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_TOTALINFORMATION 19552 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 19553 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 19554 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 19555 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 19556 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_TOTALERROR 19557 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_TOTALERROR_ACTIVE 19558 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 19559 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 19560 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 19561 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_RESET 19562 /* Method */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_SUBERROR 19563 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS 19564 /* Object */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEERROR 19565 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 19566 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 19567 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 19568 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 19569 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 19570 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 19571 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 19572 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 19573 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 19574 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 19575 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 19576 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 19577 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 19578 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 19579 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 19580 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 19581 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 19582 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 19583 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 19584 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 19585 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 19586 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 19587 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 19588 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 19589 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 19590 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 19591 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 19592 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 19593 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 19594 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_LIVEVALUES 19595 /* Object */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES 19596 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_ACTIVE 19597 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_CLASSIFICATION 19598 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_DIAGNOSTICSLEVEL 19599 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_TIMEFIRSTCHANGE 19600 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER 19601 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER_DIAGNOSTICSLEVEL 19602 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_LIVEVALUES_STATUSCODE 19603 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_LIVEVALUES_STATUSCODE_DIAGNOSTICSLEVEL 19604 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_LIVEVALUES_MAJORVERSION 19605 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_LIVEVALUES_MAJORVERSION_DIAGNOSTICSLEVEL 19606 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_LIVEVALUES_MINORVERSION 19607 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DIAGNOSTICS_LIVEVALUES_MINORVERSION_DIAGNOSTICSLEVEL 19608 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS 19609 /* Object */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_DIAGNOSTICSLEVEL 19610 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_TOTALINFORMATION 19611 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 19612 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 19613 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 19614 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 19615 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_TOTALERROR 19616 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_TOTALERROR_ACTIVE 19617 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 19618 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 19619 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 19620 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_RESET 19621 /* Method */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_SUBERROR 19622 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS 19623 /* Object */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEERROR 19624 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 19625 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 19626 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 19627 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 19628 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 19629 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 19630 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 19631 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 19632 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 19633 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 19634 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 19635 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 19636 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 19637 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 19638 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 19639 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 19640 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 19641 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 19642 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 19643 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 19644 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 19645 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 19646 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 19647 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 19648 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 19649 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 19650 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 19651 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 19652 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 19653 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_LIVEVALUES 19654 /* Object */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES 19655 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_ACTIVE 19656 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_CLASSIFICATION 19657 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_DIAGNOSTICSLEVEL 19658 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_FAILEDDATASETMESSAGES_TIMEFIRSTCHANGE 19659 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS 19660 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_ACTIVE 19661 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_CLASSIFICATION 19662 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_DIAGNOSTICSLEVEL 19663 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_TIMEFIRSTCHANGE 19664 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER 19665 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_LIVEVALUES_MESSAGESEQUENCENUMBER_DIAGNOSTICSLEVEL 19666 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_LIVEVALUES_STATUSCODE 19667 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_LIVEVALUES_STATUSCODE_DIAGNOSTICSLEVEL 19668 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_LIVEVALUES_MAJORVERSION 19669 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_LIVEVALUES_MAJORVERSION_DIAGNOSTICSLEVEL 19670 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_LIVEVALUES_MINORVERSION 19671 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_LIVEVALUES_MINORVERSION_DIAGNOSTICSLEVEL 19672 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_LIVEVALUES_SECURITYTOKENID 19673 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_LIVEVALUES_SECURITYTOKENID_DIAGNOSTICSLEVEL 19674 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_LIVEVALUES_TIMETONEXTTOKENID 19675 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DIAGNOSTICS_LIVEVALUES_TIMETONEXTTOKENID_DIAGNOSTICSLEVEL 19676 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE 19677 /* ObjectType */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_DIAGNOSTICSLEVEL 19678 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_TOTALINFORMATION 19679 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_TOTALINFORMATION_ACTIVE 19680 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_TOTALINFORMATION_CLASSIFICATION 19681 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_TOTALINFORMATION_DIAGNOSTICSLEVEL 19682 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_TOTALINFORMATION_TIMEFIRSTCHANGE 19683 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_TOTALERROR 19684 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_TOTALERROR_ACTIVE 19685 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_TOTALERROR_CLASSIFICATION 19686 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_TOTALERROR_DIAGNOSTICSLEVEL 19687 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_TOTALERROR_TIMEFIRSTCHANGE 19688 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_RESET 19689 /* Method */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_SUBERROR 19690 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS 19691 /* Object */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEERROR 19692 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEERROR_ACTIVE 19693 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEERROR_CLASSIFICATION 19694 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 19695 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 19696 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALBYMETHOD 19697 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 19698 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 19699 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 19700 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 19701 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALBYPARENT 19702 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 19703 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 19704 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 19705 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 19706 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALFROMERROR 19707 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 19708 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 19709 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 19710 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 19711 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEPAUSEDBYPARENT 19712 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 19713 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 19714 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 19715 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 19716 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEDISABLEDBYMETHOD 19717 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 19718 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 19719 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 19720 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 19721 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSTYPE_LIVEVALUES 19722 /* Object */ +#define UA_NS0ID_DIAGNOSTICSLEVEL 19723 /* DataType */ +#define UA_NS0ID_DIAGNOSTICSLEVEL_ENUMSTRINGS 19724 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCOUNTERTYPE 19725 /* VariableType */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCOUNTERTYPE_ACTIVE 19726 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCOUNTERTYPE_CLASSIFICATION 19727 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCOUNTERTYPE_DIAGNOSTICSLEVEL 19728 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCOUNTERTYPE_TIMEFIRSTCHANGE 19729 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCOUNTERCLASSIFICATION 19730 /* DataType */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCOUNTERCLASSIFICATION_ENUMSTRINGS 19731 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE 19732 /* ObjectType */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_DIAGNOSTICSLEVEL 19733 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_TOTALINFORMATION 19734 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_TOTALINFORMATION_ACTIVE 19735 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_TOTALINFORMATION_CLASSIFICATION 19736 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_TOTALINFORMATION_DIAGNOSTICSLEVEL 19737 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_TOTALINFORMATION_TIMEFIRSTCHANGE 19738 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_TOTALERROR 19739 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_TOTALERROR_ACTIVE 19740 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_TOTALERROR_CLASSIFICATION 19741 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_TOTALERROR_DIAGNOSTICSLEVEL 19742 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_TOTALERROR_TIMEFIRSTCHANGE 19743 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_RESET 19744 /* Method */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_SUBERROR 19745 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS 19746 /* Object */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEERROR 19747 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEERROR_ACTIVE 19748 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEERROR_CLASSIFICATION 19749 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 19750 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 19751 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALBYMETHOD 19752 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 19753 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 19754 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 19755 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 19756 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALBYPARENT 19757 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 19758 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 19759 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 19760 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 19761 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALFROMERROR 19762 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 19763 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 19764 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 19765 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 19766 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEPAUSEDBYPARENT 19767 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 19768 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 19769 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 19770 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 19771 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEDISABLEDBYMETHOD 19772 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 19773 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 19774 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 19775 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 19776 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_LIVEVALUES 19777 /* Object */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_LIVEVALUES_CONFIGUREDDATASETWRITERS 19778 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_LIVEVALUES_CONFIGUREDDATASETWRITERS_DIAGNOSTICSLEVEL 19779 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_LIVEVALUES_CONFIGUREDDATASETREADERS 19780 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_LIVEVALUES_CONFIGUREDDATASETREADERS_DIAGNOSTICSLEVEL 19781 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_LIVEVALUES_OPERATIONALDATASETWRITERS 19782 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_LIVEVALUES_OPERATIONALDATASETWRITERS_DIAGNOSTICSLEVEL 19783 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_LIVEVALUES_OPERATIONALDATASETREADERS 19784 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSROOTTYPE_LIVEVALUES_OPERATIONALDATASETREADERS_DIAGNOSTICSLEVEL 19785 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE 19786 /* ObjectType */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_DIAGNOSTICSLEVEL 19787 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_TOTALINFORMATION 19788 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_TOTALINFORMATION_ACTIVE 19789 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_TOTALINFORMATION_CLASSIFICATION 19790 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_TOTALINFORMATION_DIAGNOSTICSLEVEL 19791 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_TOTALINFORMATION_TIMEFIRSTCHANGE 19792 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_TOTALERROR 19793 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_TOTALERROR_ACTIVE 19794 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_TOTALERROR_CLASSIFICATION 19795 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_TOTALERROR_DIAGNOSTICSLEVEL 19796 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_TOTALERROR_TIMEFIRSTCHANGE 19797 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_RESET 19798 /* Method */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_SUBERROR 19799 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS 19800 /* Object */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEERROR 19801 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEERROR_ACTIVE 19802 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEERROR_CLASSIFICATION 19803 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 19804 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 19805 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALBYMETHOD 19806 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 19807 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 19808 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 19809 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 19810 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALBYPARENT 19811 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 19812 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 19813 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 19814 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 19815 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALFROMERROR 19816 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 19817 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 19818 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 19819 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 19820 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEPAUSEDBYPARENT 19821 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 19822 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 19823 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 19824 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 19825 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEDISABLEDBYMETHOD 19826 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 19827 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 19828 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 19829 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 19830 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_LIVEVALUES 19831 /* Object */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_LIVEVALUES_RESOLVEDADDRESS 19832 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSCONNECTIONTYPE_LIVEVALUES_RESOLVEDADDRESS_DIAGNOSTICSLEVEL 19833 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE 19834 /* ObjectType */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_DIAGNOSTICSLEVEL 19835 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_TOTALINFORMATION 19836 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_TOTALINFORMATION_ACTIVE 19837 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_TOTALINFORMATION_CLASSIFICATION 19838 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_TOTALINFORMATION_DIAGNOSTICSLEVEL 19839 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_TOTALINFORMATION_TIMEFIRSTCHANGE 19840 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_TOTALERROR 19841 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_TOTALERROR_ACTIVE 19842 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_TOTALERROR_CLASSIFICATION 19843 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_TOTALERROR_DIAGNOSTICSLEVEL 19844 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_TOTALERROR_TIMEFIRSTCHANGE 19845 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_RESET 19846 /* Method */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_SUBERROR 19847 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS 19848 /* Object */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEERROR 19849 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEERROR_ACTIVE 19850 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEERROR_CLASSIFICATION 19851 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 19852 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 19853 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALBYMETHOD 19854 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 19855 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 19856 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 19857 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 19858 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALBYPARENT 19859 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 19860 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 19861 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 19862 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 19863 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALFROMERROR 19864 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 19865 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 19866 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 19867 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 19868 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEPAUSEDBYPARENT 19869 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 19870 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 19871 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 19872 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 19873 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEDISABLEDBYMETHOD 19874 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 19875 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 19876 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 19877 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 19878 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_LIVEVALUES 19879 /* Object */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_SENTNETWORKMESSAGES 19880 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_SENTNETWORKMESSAGES_ACTIVE 19881 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_SENTNETWORKMESSAGES_CLASSIFICATION 19882 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_SENTNETWORKMESSAGES_DIAGNOSTICSLEVEL 19883 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_SENTNETWORKMESSAGES_TIMEFIRSTCHANGE 19884 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_FAILEDTRANSMISSIONS 19885 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_FAILEDTRANSMISSIONS_ACTIVE 19886 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_FAILEDTRANSMISSIONS_CLASSIFICATION 19887 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_FAILEDTRANSMISSIONS_DIAGNOSTICSLEVEL 19888 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_FAILEDTRANSMISSIONS_TIMEFIRSTCHANGE 19889 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_ENCRYPTIONERRORS 19890 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_ENCRYPTIONERRORS_ACTIVE 19891 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_ENCRYPTIONERRORS_CLASSIFICATION 19892 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_ENCRYPTIONERRORS_DIAGNOSTICSLEVEL 19893 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_COUNTERS_ENCRYPTIONERRORS_TIMEFIRSTCHANGE 19894 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_LIVEVALUES_CONFIGUREDDATASETWRITERS 19895 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_LIVEVALUES_CONFIGUREDDATASETWRITERS_DIAGNOSTICSLEVEL 19896 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_LIVEVALUES_OPERATIONALDATASETWRITERS 19897 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_LIVEVALUES_OPERATIONALDATASETWRITERS_DIAGNOSTICSLEVEL 19898 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_LIVEVALUES_SECURITYTOKENID 19899 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_LIVEVALUES_SECURITYTOKENID_DIAGNOSTICSLEVEL 19900 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_LIVEVALUES_TIMETONEXTTOKENID 19901 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSWRITERGROUPTYPE_LIVEVALUES_TIMETONEXTTOKENID_DIAGNOSTICSLEVEL 19902 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE 19903 /* ObjectType */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_DIAGNOSTICSLEVEL 19904 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_TOTALINFORMATION 19905 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_TOTALINFORMATION_ACTIVE 19906 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_TOTALINFORMATION_CLASSIFICATION 19907 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_TOTALINFORMATION_DIAGNOSTICSLEVEL 19908 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_TOTALINFORMATION_TIMEFIRSTCHANGE 19909 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_TOTALERROR 19910 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_TOTALERROR_ACTIVE 19911 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_TOTALERROR_CLASSIFICATION 19912 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_TOTALERROR_DIAGNOSTICSLEVEL 19913 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_TOTALERROR_TIMEFIRSTCHANGE 19914 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_RESET 19915 /* Method */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_SUBERROR 19916 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS 19917 /* Object */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEERROR 19918 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEERROR_ACTIVE 19919 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEERROR_CLASSIFICATION 19920 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 19921 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 19922 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALBYMETHOD 19923 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 19924 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 19925 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 19926 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 19927 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALBYPARENT 19928 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 19929 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 19930 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 19931 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 19932 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALFROMERROR 19933 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 19934 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 19935 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 19936 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 19937 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEPAUSEDBYPARENT 19938 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 19939 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 19940 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 19941 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 19942 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEDISABLEDBYMETHOD 19943 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 19944 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 19945 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 19946 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 19947 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_LIVEVALUES 19948 /* Object */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_RECEIVEDNETWORKMESSAGES 19949 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_RECEIVEDNETWORKMESSAGES_ACTIVE 19950 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_RECEIVEDNETWORKMESSAGES_CLASSIFICATION 19951 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_RECEIVEDNETWORKMESSAGES_DIAGNOSTICSLEVEL 19952 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_RECEIVEDNETWORKMESSAGES_TIMEFIRSTCHANGE 19953 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES 19954 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES_ACTIVE 19955 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES_CLASSIFICATION 19956 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES_DIAGNOSTICSLEVEL 19957 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES_TIMEFIRSTCHANGE 19958 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_DECRYPTIONERRORS 19959 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_DECRYPTIONERRORS_ACTIVE 19960 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_DECRYPTIONERRORS_CLASSIFICATION 19961 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_DECRYPTIONERRORS_DIAGNOSTICSLEVEL 19962 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_COUNTERS_DECRYPTIONERRORS_TIMEFIRSTCHANGE 19963 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_LIVEVALUES_CONFIGUREDDATASETREADERS 19964 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_LIVEVALUES_CONFIGUREDDATASETREADERS_DIAGNOSTICSLEVEL 19965 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_LIVEVALUES_OPERATIONALDATASETREADERS 19966 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSREADERGROUPTYPE_LIVEVALUES_OPERATIONALDATASETREADERS_DIAGNOSTICSLEVEL 19967 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE 19968 /* ObjectType */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_DIAGNOSTICSLEVEL 19969 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_TOTALINFORMATION 19970 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_TOTALINFORMATION_ACTIVE 19971 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_TOTALINFORMATION_CLASSIFICATION 19972 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_TOTALINFORMATION_DIAGNOSTICSLEVEL 19973 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_TOTALINFORMATION_TIMEFIRSTCHANGE 19974 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_TOTALERROR 19975 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_TOTALERROR_ACTIVE 19976 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_TOTALERROR_CLASSIFICATION 19977 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_TOTALERROR_DIAGNOSTICSLEVEL 19978 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_TOTALERROR_TIMEFIRSTCHANGE 19979 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_RESET 19980 /* Method */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_SUBERROR 19981 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS 19982 /* Object */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEERROR 19983 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEERROR_ACTIVE 19984 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEERROR_CLASSIFICATION 19985 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 19986 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 19987 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALBYMETHOD 19988 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 19989 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 19990 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 19991 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 19992 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALBYPARENT 19993 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 19994 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 19995 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 19996 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 19997 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALFROMERROR 19998 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 19999 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 20000 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 20001 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 20002 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEPAUSEDBYPARENT 20003 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 20004 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 20005 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 20006 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 20007 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEDISABLEDBYMETHOD 20008 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 20009 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 20010 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 20011 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 20012 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_LIVEVALUES 20013 /* Object */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_FAILEDDATASETMESSAGES 20014 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_FAILEDDATASETMESSAGES_ACTIVE 20015 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_FAILEDDATASETMESSAGES_CLASSIFICATION 20016 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_FAILEDDATASETMESSAGES_DIAGNOSTICSLEVEL 20017 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_COUNTERS_FAILEDDATASETMESSAGES_TIMEFIRSTCHANGE 20018 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_LIVEVALUES_MESSAGESEQUENCENUMBER 20019 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_LIVEVALUES_MESSAGESEQUENCENUMBER_DIAGNOSTICSLEVEL 20020 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_LIVEVALUES_STATUSCODE 20021 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_LIVEVALUES_STATUSCODE_DIAGNOSTICSLEVEL 20022 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_LIVEVALUES_MAJORVERSION 20023 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_LIVEVALUES_MAJORVERSION_DIAGNOSTICSLEVEL 20024 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_LIVEVALUES_MINORVERSION 20025 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETWRITERTYPE_LIVEVALUES_MINORVERSION_DIAGNOSTICSLEVEL 20026 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE 20027 /* ObjectType */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_DIAGNOSTICSLEVEL 20028 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_TOTALINFORMATION 20029 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_TOTALINFORMATION_ACTIVE 20030 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_TOTALINFORMATION_CLASSIFICATION 20031 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_TOTALINFORMATION_DIAGNOSTICSLEVEL 20032 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_TOTALINFORMATION_TIMEFIRSTCHANGE 20033 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_TOTALERROR 20034 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_TOTALERROR_ACTIVE 20035 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_TOTALERROR_CLASSIFICATION 20036 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_TOTALERROR_DIAGNOSTICSLEVEL 20037 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_TOTALERROR_TIMEFIRSTCHANGE 20038 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_RESET 20039 /* Method */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_SUBERROR 20040 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS 20041 /* Object */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEERROR 20042 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEERROR_ACTIVE 20043 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEERROR_CLASSIFICATION 20044 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 20045 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 20046 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALBYMETHOD 20047 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 20048 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 20049 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 20050 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 20051 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALBYPARENT 20052 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 20053 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 20054 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 20055 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 20056 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALFROMERROR 20057 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 20058 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 20059 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 20060 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 20061 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEPAUSEDBYPARENT 20062 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 20063 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 20064 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 20065 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 20066 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEDISABLEDBYMETHOD 20067 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 20068 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 20069 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 20070 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 20071 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_LIVEVALUES 20072 /* Object */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_FAILEDDATASETMESSAGES 20073 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_FAILEDDATASETMESSAGES_ACTIVE 20074 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_FAILEDDATASETMESSAGES_CLASSIFICATION 20075 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_FAILEDDATASETMESSAGES_DIAGNOSTICSLEVEL 20076 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_FAILEDDATASETMESSAGES_TIMEFIRSTCHANGE 20077 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_DECRYPTIONERRORS 20078 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_DECRYPTIONERRORS_ACTIVE 20079 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_DECRYPTIONERRORS_CLASSIFICATION 20080 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_DECRYPTIONERRORS_DIAGNOSTICSLEVEL 20081 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_COUNTERS_DECRYPTIONERRORS_TIMEFIRSTCHANGE 20082 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_LIVEVALUES_MESSAGESEQUENCENUMBER 20083 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_LIVEVALUES_MESSAGESEQUENCENUMBER_DIAGNOSTICSLEVEL 20084 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_LIVEVALUES_STATUSCODE 20085 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_LIVEVALUES_STATUSCODE_DIAGNOSTICSLEVEL 20086 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_LIVEVALUES_MAJORVERSION 20087 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_LIVEVALUES_MAJORVERSION_DIAGNOSTICSLEVEL 20088 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_LIVEVALUES_MINORVERSION 20089 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_LIVEVALUES_MINORVERSION_DIAGNOSTICSLEVEL 20090 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_LIVEVALUES_SECURITYTOKENID 20091 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_LIVEVALUES_SECURITYTOKENID_DIAGNOSTICSLEVEL 20092 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_LIVEVALUES_TIMETONEXTTOKENID 20093 /* Variable */ +#define UA_NS0ID_PUBSUBDIAGNOSTICSDATASETREADERTYPE_LIVEVALUES_TIMETONEXTTOKENID_DIAGNOSTICSLEVEL 20094 /* Variable */ +#define UA_NS0ID_DATASETORDERINGTYPE 20408 /* DataType */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_SECURITYTOKENID 20409 /* Variable */ +#define UA_NS0ID_VERSIONTIME 20998 /* DataType */ +#define UA_NS0ID_SESSIONLESSINVOKERESPONSETYPE 20999 /* DataType */ +#define UA_NS0ID_SESSIONLESSINVOKERESPONSETYPE_ENCODING_DEFAULTXML 21000 /* Object */ +#define UA_NS0ID_SESSIONLESSINVOKERESPONSETYPE_ENCODING_DEFAULTBINARY 21001 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_FIELDTARGETDATATYPE 21002 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_SECURITYTOKENID_DIAGNOSTICSLEVEL 21003 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_TIMETONEXTTOKENID 21004 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_DIAGNOSTICS_LIVEVALUES_TIMETONEXTTOKENID_DIAGNOSTICSLEVEL 21005 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_SUBSCRIBEDDATASET 21006 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_CREATETARGETVARIABLES 21009 /* Method */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_CREATETARGETVARIABLES_INPUTARGUMENTS 21010 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_CREATETARGETVARIABLES_OUTPUTARGUMENTS 21011 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_CREATEDATASETMIRROR 21012 /* Method */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_CREATEDATASETMIRROR_INPUTARGUMENTS 21013 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DATASETREADERNAME_PLACEHOLDER_CREATEDATASETMIRROR_OUTPUTARGUMENTS 21014 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS 21015 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_DIAGNOSTICSLEVEL 21016 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_TOTALINFORMATION 21017 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_TOTALINFORMATION_ACTIVE 21018 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_TOTALINFORMATION_CLASSIFICATION 21019 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_TOTALINFORMATION_DIAGNOSTICSLEVEL 21020 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_TOTALINFORMATION_TIMEFIRSTCHANGE 21021 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_TOTALERROR 21022 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_TOTALERROR_ACTIVE 21023 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_TOTALERROR_CLASSIFICATION 21024 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_TOTALERROR_DIAGNOSTICSLEVEL 21025 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_TOTALERROR_TIMEFIRSTCHANGE 21026 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_RESET 21027 /* Method */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_SUBERROR 21028 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS 21029 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEERROR 21030 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_ACTIVE 21031 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_CLASSIFICATION 21032 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_DIAGNOSTICSLEVEL 21033 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEERROR_TIMEFIRSTCHANGE 21034 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD 21035 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_ACTIVE 21036 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_CLASSIFICATION 21037 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_DIAGNOSTICSLEVEL 21038 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYMETHOD_TIMEFIRSTCHANGE 21039 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT 21040 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_ACTIVE 21041 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_CLASSIFICATION 21042 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_DIAGNOSTICSLEVEL 21043 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALBYPARENT_TIMEFIRSTCHANGE 21044 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR 21045 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_ACTIVE 21046 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_CLASSIFICATION 21047 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_DIAGNOSTICSLEVEL 21048 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEOPERATIONALFROMERROR_TIMEFIRSTCHANGE 21049 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT 21050 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_ACTIVE 21051 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_CLASSIFICATION 21052 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_DIAGNOSTICSLEVEL 21053 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEPAUSEDBYPARENT_TIMEFIRSTCHANGE 21054 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD 21055 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_ACTIVE 21056 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_CLASSIFICATION 21057 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_DIAGNOSTICSLEVEL 21058 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_STATEDISABLEDBYMETHOD_TIMEFIRSTCHANGE 21059 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_LIVEVALUES 21060 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_RECEIVEDNETWORKMESSAGES 21061 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_RECEIVEDNETWORKMESSAGES_ACTIVE 21062 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_RECEIVEDNETWORKMESSAGES_CLASSIFICATION 21063 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_RECEIVEDNETWORKMESSAGES_DIAGNOSTICSLEVEL 21064 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_RECEIVEDNETWORKMESSAGES_TIMEFIRSTCHANGE 21065 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES 21066 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES_ACTIVE 21067 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES_CLASSIFICATION 21068 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES_DIAGNOSTICSLEVEL 21069 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_RECEIVEDINVALIDNETWORKMESSAGES_TIMEFIRSTCHANGE 21070 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS 21071 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_ACTIVE 21072 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_CLASSIFICATION 21073 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_DIAGNOSTICSLEVEL 21074 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_COUNTERS_DECRYPTIONERRORS_TIMEFIRSTCHANGE 21075 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETREADERS 21076 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_LIVEVALUES_CONFIGUREDDATASETREADERS_DIAGNOSTICSLEVEL 21077 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETREADERS 21078 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_DIAGNOSTICS_LIVEVALUES_OPERATIONALDATASETREADERS_DIAGNOSTICSLEVEL 21079 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_TRANSPORTSETTINGS 21080 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_MESSAGESETTINGS 21081 /* Object */ +#define UA_NS0ID_READERGROUPTYPE_ADDDATASETREADER 21082 /* Method */ +#define UA_NS0ID_READERGROUPTYPE_ADDDATASETREADER_INPUTARGUMENTS 21083 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_ADDDATASETREADER_OUTPUTARGUMENTS 21084 /* Variable */ +#define UA_NS0ID_READERGROUPTYPE_REMOVEDATASETREADER 21085 /* Method */ +#define UA_NS0ID_READERGROUPTYPE_REMOVEDATASETREADER_INPUTARGUMENTS 21086 /* Variable */ +#define UA_NS0ID_PUBSUBGROUPTYPEADDREADERMETHODTYPE 21087 /* Method */ +#define UA_NS0ID_PUBSUBGROUPTYPEADDREADERMETHODTYPE_INPUTARGUMENTS 21088 /* Variable */ +#define UA_NS0ID_PUBSUBGROUPTYPEADDREADERMETHODTYPE_OUTPUTARGUMENTS 21089 /* Variable */ +#define UA_NS0ID_READERGROUPTRANSPORTTYPE 21090 /* ObjectType */ +#define UA_NS0ID_READERGROUPMESSAGETYPE 21091 /* ObjectType */ +#define UA_NS0ID_DATASETWRITERTYPE_DATASETWRITERID 21092 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_DATASETFIELDCONTENTMASK 21093 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_KEYFRAMECOUNT 21094 /* Variable */ +#define UA_NS0ID_DATASETWRITERTYPE_MESSAGESETTINGS 21095 /* Object */ +#define UA_NS0ID_DATASETWRITERMESSAGETYPE 21096 /* ObjectType */ +#define UA_NS0ID_DATASETREADERTYPE_PUBLISHERID 21097 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_WRITERGROUPID 21098 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DATASETWRITERID 21099 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DATASETMETADATA 21100 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_DATASETFIELDCONTENTMASK 21101 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_MESSAGERECEIVETIMEOUT 21102 /* Variable */ +#define UA_NS0ID_DATASETREADERTYPE_MESSAGESETTINGS 21103 /* Object */ +#define UA_NS0ID_DATASETREADERMESSAGETYPE 21104 /* ObjectType */ +#define UA_NS0ID_UADPWRITERGROUPMESSAGETYPE 21105 /* ObjectType */ +#define UA_NS0ID_UADPWRITERGROUPMESSAGETYPE_GROUPVERSION 21106 /* Variable */ +#define UA_NS0ID_UADPWRITERGROUPMESSAGETYPE_DATASETORDERING 21107 /* Variable */ +#define UA_NS0ID_UADPWRITERGROUPMESSAGETYPE_NETWORKMESSAGECONTENTMASK 21108 /* Variable */ +#define UA_NS0ID_UADPWRITERGROUPMESSAGETYPE_SAMPLINGOFFSET 21109 /* Variable */ +#define UA_NS0ID_UADPWRITERGROUPMESSAGETYPE_PUBLISHINGOFFSET 21110 /* Variable */ +#define UA_NS0ID_UADPDATASETWRITERMESSAGETYPE 21111 /* ObjectType */ +#define UA_NS0ID_UADPDATASETWRITERMESSAGETYPE_DATASETMESSAGECONTENTMASK 21112 /* Variable */ +#define UA_NS0ID_UADPDATASETWRITERMESSAGETYPE_CONFIGUREDSIZE 21113 /* Variable */ +#define UA_NS0ID_UADPDATASETWRITERMESSAGETYPE_NETWORKMESSAGENUMBER 21114 /* Variable */ +#define UA_NS0ID_UADPDATASETWRITERMESSAGETYPE_DATASETOFFSET 21115 /* Variable */ +#define UA_NS0ID_UADPDATASETREADERMESSAGETYPE 21116 /* ObjectType */ +#define UA_NS0ID_UADPDATASETREADERMESSAGETYPE_GROUPVERSION 21117 /* Variable */ +#define UA_NS0ID_UADPDATASETREADERMESSAGETYPE_NETWORKMESSAGENUMBER 21119 /* Variable */ +#define UA_NS0ID_UADPDATASETREADERMESSAGETYPE_DATASETCLASSID 21120 /* Variable */ +#define UA_NS0ID_UADPDATASETREADERMESSAGETYPE_NETWORKMESSAGECONTENTMASK 21121 /* Variable */ +#define UA_NS0ID_UADPDATASETREADERMESSAGETYPE_DATASETMESSAGECONTENTMASK 21122 /* Variable */ +#define UA_NS0ID_UADPDATASETREADERMESSAGETYPE_PUBLISHINGINTERVAL 21123 /* Variable */ +#define UA_NS0ID_UADPDATASETREADERMESSAGETYPE_PROCESSINGOFFSET 21124 /* Variable */ +#define UA_NS0ID_UADPDATASETREADERMESSAGETYPE_RECEIVEOFFSET 21125 /* Variable */ +#define UA_NS0ID_JSONWRITERGROUPMESSAGETYPE 21126 /* ObjectType */ +#define UA_NS0ID_JSONWRITERGROUPMESSAGETYPE_NETWORKMESSAGECONTENTMASK 21127 /* Variable */ +#define UA_NS0ID_JSONDATASETWRITERMESSAGETYPE 21128 /* ObjectType */ +#define UA_NS0ID_JSONDATASETWRITERMESSAGETYPE_DATASETMESSAGECONTENTMASK 21129 /* Variable */ +#define UA_NS0ID_JSONDATASETREADERMESSAGETYPE 21130 /* ObjectType */ +#define UA_NS0ID_JSONDATASETREADERMESSAGETYPE_NETWORKMESSAGECONTENTMASK 21131 /* Variable */ +#define UA_NS0ID_JSONDATASETREADERMESSAGETYPE_DATASETMESSAGECONTENTMASK 21132 /* Variable */ +#define UA_NS0ID_DATAGRAMWRITERGROUPTRANSPORTTYPE 21133 /* ObjectType */ +#define UA_NS0ID_DATAGRAMWRITERGROUPTRANSPORTTYPE_MESSAGEREPEATCOUNT 21134 /* Variable */ +#define UA_NS0ID_DATAGRAMWRITERGROUPTRANSPORTTYPE_MESSAGEREPEATDELAY 21135 /* Variable */ +#define UA_NS0ID_BROKERWRITERGROUPTRANSPORTTYPE 21136 /* ObjectType */ +#define UA_NS0ID_BROKERWRITERGROUPTRANSPORTTYPE_QUEUENAME 21137 /* Variable */ +#define UA_NS0ID_BROKERDATASETWRITERTRANSPORTTYPE 21138 /* ObjectType */ +#define UA_NS0ID_BROKERDATASETWRITERTRANSPORTTYPE_QUEUENAME 21139 /* Variable */ +#define UA_NS0ID_BROKERDATASETWRITERTRANSPORTTYPE_METADATAQUEUENAME 21140 /* Variable */ +#define UA_NS0ID_BROKERDATASETWRITERTRANSPORTTYPE_METADATAUPDATETIME 21141 /* Variable */ +#define UA_NS0ID_BROKERDATASETREADERTRANSPORTTYPE 21142 /* ObjectType */ +#define UA_NS0ID_BROKERDATASETREADERTRANSPORTTYPE_QUEUENAME 21143 /* Variable */ +#define UA_NS0ID_BROKERDATASETREADERTRANSPORTTYPE_METADATAQUEUENAME 21144 /* Variable */ +#define UA_NS0ID_NETWORKADDRESSTYPE 21145 /* ObjectType */ +#define UA_NS0ID_NETWORKADDRESSTYPE_NETWORKINTERFACE 21146 /* Variable */ +#define UA_NS0ID_NETWORKADDRESSURLTYPE 21147 /* ObjectType */ +#define UA_NS0ID_NETWORKADDRESSURLTYPE_NETWORKINTERFACE 21148 /* Variable */ +#define UA_NS0ID_NETWORKADDRESSURLTYPE_URL 21149 /* Variable */ +#define UA_NS0ID_WRITERGROUPDATATYPE_ENCODING_DEFAULTBINARY 21150 /* Object */ +#define UA_NS0ID_NETWORKADDRESSDATATYPE_ENCODING_DEFAULTBINARY 21151 /* Object */ +#define UA_NS0ID_NETWORKADDRESSURLDATATYPE_ENCODING_DEFAULTBINARY 21152 /* Object */ +#define UA_NS0ID_READERGROUPDATATYPE_ENCODING_DEFAULTBINARY 21153 /* Object */ +#define UA_NS0ID_PUBSUBCONFIGURATIONDATATYPE_ENCODING_DEFAULTBINARY 21154 /* Object */ +#define UA_NS0ID_DATAGRAMWRITERGROUPTRANSPORTDATATYPE_ENCODING_DEFAULTBINARY 21155 /* Object */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_WRITERGROUPDATATYPE 21156 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_WRITERGROUPDATATYPE_DATATYPEVERSION 21157 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_WRITERGROUPDATATYPE_DICTIONARYFRAGMENT 21158 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_NETWORKADDRESSDATATYPE 21159 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_NETWORKADDRESSDATATYPE_DATATYPEVERSION 21160 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_NETWORKADDRESSDATATYPE_DICTIONARYFRAGMENT 21161 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_NETWORKADDRESSURLDATATYPE 21162 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_NETWORKADDRESSURLDATATYPE_DATATYPEVERSION 21163 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_NETWORKADDRESSURLDATATYPE_DICTIONARYFRAGMENT 21164 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_READERGROUPDATATYPE 21165 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_READERGROUPDATATYPE_DATATYPEVERSION 21166 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_READERGROUPDATATYPE_DICTIONARYFRAGMENT 21167 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBSUBCONFIGURATIONDATATYPE 21168 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBSUBCONFIGURATIONDATATYPE_DATATYPEVERSION 21169 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_PUBSUBCONFIGURATIONDATATYPE_DICTIONARYFRAGMENT 21170 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATAGRAMWRITERGROUPTRANSPORTDATATYPE 21171 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATAGRAMWRITERGROUPTRANSPORTDATATYPE_DATATYPEVERSION 21172 /* Variable */ +#define UA_NS0ID_OPCUA_BINARYSCHEMA_DATAGRAMWRITERGROUPTRANSPORTDATATYPE_DICTIONARYFRAGMENT 21173 /* Variable */ +#define UA_NS0ID_WRITERGROUPDATATYPE_ENCODING_DEFAULTXML 21174 /* Object */ +#define UA_NS0ID_NETWORKADDRESSDATATYPE_ENCODING_DEFAULTXML 21175 /* Object */ +#define UA_NS0ID_NETWORKADDRESSURLDATATYPE_ENCODING_DEFAULTXML 21176 /* Object */ +#define UA_NS0ID_READERGROUPDATATYPE_ENCODING_DEFAULTXML 21177 /* Object */ +#define UA_NS0ID_PUBSUBCONFIGURATIONDATATYPE_ENCODING_DEFAULTXML 21178 /* Object */ +#define UA_NS0ID_DATAGRAMWRITERGROUPTRANSPORTDATATYPE_ENCODING_DEFAULTXML 21179 /* Object */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_WRITERGROUPDATATYPE 21180 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_WRITERGROUPDATATYPE_DATATYPEVERSION 21181 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_WRITERGROUPDATATYPE_DICTIONARYFRAGMENT 21182 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_NETWORKADDRESSDATATYPE 21183 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_NETWORKADDRESSDATATYPE_DATATYPEVERSION 21184 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_NETWORKADDRESSDATATYPE_DICTIONARYFRAGMENT 21185 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_NETWORKADDRESSURLDATATYPE 21186 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_NETWORKADDRESSURLDATATYPE_DATATYPEVERSION 21187 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_NETWORKADDRESSURLDATATYPE_DICTIONARYFRAGMENT 21188 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_READERGROUPDATATYPE 21189 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_READERGROUPDATATYPE_DATATYPEVERSION 21190 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_READERGROUPDATATYPE_DICTIONARYFRAGMENT 21191 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBSUBCONFIGURATIONDATATYPE 21192 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBSUBCONFIGURATIONDATATYPE_DATATYPEVERSION 21193 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_PUBSUBCONFIGURATIONDATATYPE_DICTIONARYFRAGMENT 21194 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATAGRAMWRITERGROUPTRANSPORTDATATYPE 21195 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATAGRAMWRITERGROUPTRANSPORTDATATYPE_DATATYPEVERSION 21196 /* Variable */ +#define UA_NS0ID_OPCUA_XMLSCHEMA_DATAGRAMWRITERGROUPTRANSPORTDATATYPE_DICTIONARYFRAGMENT 21197 /* Variable */ +#define UA_NS0ID_WRITERGROUPDATATYPE_ENCODING_DEFAULTJSON 21198 /* Object */ +#define UA_NS0ID_NETWORKADDRESSDATATYPE_ENCODING_DEFAULTJSON 21199 /* Object */ +#define UA_NS0ID_NETWORKADDRESSURLDATATYPE_ENCODING_DEFAULTJSON 21200 /* Object */ +#define UA_NS0ID_READERGROUPDATATYPE_ENCODING_DEFAULTJSON 21201 /* Object */ +#define UA_NS0ID_PUBSUBCONFIGURATIONDATATYPE_ENCODING_DEFAULTJSON 21202 /* Object */ +#define UA_NS0ID_DATAGRAMWRITERGROUPTRANSPORTDATATYPE_ENCODING_DEFAULTJSON 21203 /* Object */ +#endif /* UA_NODEIDS_NS0_H_ */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/constants.h" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Array handling - * -------------- - * In OPC UA, arrays can have a length of zero or more with the usual meaning. - * In addition, arrays can be undefined. Then, they don't even have a length. In - * the binary encoding, this is indicated by an array of length -1. + * Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2016 (c) Sten Grüner + * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Florian Palm + */ + + + +_UA_BEGIN_DECLS + +/** + * Standard-Defined Constants + * ========================== + * This section contains numerical and string constants that are defined in the + * OPC UA standard. * - * In open62541 however, we use ``size_t`` for array lengths. An undefined array - * has length 0 and the data pointer is ``NULL``. An array of length 0 also has - * length 0 but a data pointer ``UA_EMPTY_ARRAY_SENTINEL``. */ -/* Allocates and initializes an array of variables of a specific type + * .. _attribute-id: * - * @param size The requested array length - * @param type The datatype description - * @return Returns the memory location of the variable or NULL if no memory - could be allocated */ -void UA_EXPORT * UA_Array_new(size_t size, const UA_DataType *type) UA_FUNC_ATTR_MALLOC; + * Attribute Id + * ------------ + * Every node in an OPC UA information model contains attributes depending on + * the node type. Possible attributes are as follows: */ -/* Allocates and copies an array - * - * @param src The memory location of the source array - * @param size The size of the array - * @param dst The location of the pointer to the new array - * @param type The datatype of the array members - * @return Returns UA_STATUSCODE_GOOD or UA_STATUSCODE_BADOUTOFMEMORY */ -UA_StatusCode UA_EXPORT -UA_Array_copy(const void *src, size_t size, void **dst, - const UA_DataType *type) UA_FUNC_ATTR_WARN_UNUSED_RESULT; +typedef enum { + UA_ATTRIBUTEID_NODEID = 1, + UA_ATTRIBUTEID_NODECLASS = 2, + UA_ATTRIBUTEID_BROWSENAME = 3, + UA_ATTRIBUTEID_DISPLAYNAME = 4, + UA_ATTRIBUTEID_DESCRIPTION = 5, + UA_ATTRIBUTEID_WRITEMASK = 6, + UA_ATTRIBUTEID_USERWRITEMASK = 7, + UA_ATTRIBUTEID_ISABSTRACT = 8, + UA_ATTRIBUTEID_SYMMETRIC = 9, + UA_ATTRIBUTEID_INVERSENAME = 10, + UA_ATTRIBUTEID_CONTAINSNOLOOPS = 11, + UA_ATTRIBUTEID_EVENTNOTIFIER = 12, + UA_ATTRIBUTEID_VALUE = 13, + UA_ATTRIBUTEID_DATATYPE = 14, + UA_ATTRIBUTEID_VALUERANK = 15, + UA_ATTRIBUTEID_ARRAYDIMENSIONS = 16, + UA_ATTRIBUTEID_ACCESSLEVEL = 17, + UA_ATTRIBUTEID_USERACCESSLEVEL = 18, + UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL = 19, + UA_ATTRIBUTEID_HISTORIZING = 20, + UA_ATTRIBUTEID_EXECUTABLE = 21, + UA_ATTRIBUTEID_USEREXECUTABLE = 22 +} UA_AttributeId; -/* Deletes an array. +/** + * Access Level Masks + * ------------------ + * The access level to a node is given by the following constants that are ANDed + * with the overall access level. */ + +#define UA_ACCESSLEVELMASK_READ (0x01u << 0u) +#define UA_ACCESSLEVELMASK_WRITE (0x01u << 1u) +#define UA_ACCESSLEVELMASK_HISTORYREAD (0x01u << 2u) +#define UA_ACCESSLEVELMASK_HISTORYWRITE (0x01u << 3u) +#define UA_ACCESSLEVELMASK_SEMANTICCHANGE (0x01u << 4u) +#define UA_ACCESSLEVELMASK_STATUSWRITE (0x01u << 5u) +#define UA_ACCESSLEVELMASK_TIMESTAMPWRITE (0x01u << 6u) + +/** + * Write Masks + * ----------- + * The write mask and user write mask is given by the following constants that + * are ANDed for the overall write mask. Part 3: 5.2.7 Table 2 */ + +#define UA_WRITEMASK_ACCESSLEVEL (0x01u << 0u) +#define UA_WRITEMASK_ARRRAYDIMENSIONS (0x01u << 1u) +#define UA_WRITEMASK_BROWSENAME (0x01u << 2u) +#define UA_WRITEMASK_CONTAINSNOLOOPS (0x01u << 3u) +#define UA_WRITEMASK_DATATYPE (0x01u << 4u) +#define UA_WRITEMASK_DESCRIPTION (0x01u << 5u) +#define UA_WRITEMASK_DISPLAYNAME (0x01u << 6u) +#define UA_WRITEMASK_EVENTNOTIFIER (0x01u << 7u) +#define UA_WRITEMASK_EXECUTABLE (0x01u << 8u) +#define UA_WRITEMASK_HISTORIZING (0x01u << 9u) +#define UA_WRITEMASK_INVERSENAME (0x01u << 10u) +#define UA_WRITEMASK_ISABSTRACT (0x01u << 11u) +#define UA_WRITEMASK_MINIMUMSAMPLINGINTERVAL (0x01u << 12u) +#define UA_WRITEMASK_NODECLASS (0x01u << 13u) +#define UA_WRITEMASK_NODEID (0x01u << 14u) +#define UA_WRITEMASK_SYMMETRIC (0x01u << 15u) +#define UA_WRITEMASK_USERACCESSLEVEL (0x01u << 16u) +#define UA_WRITEMASK_USEREXECUTABLE (0x01u << 17u) +#define UA_WRITEMASK_USERWRITEMASK (0x01u << 18u) +#define UA_WRITEMASK_VALUERANK (0x01u << 19u) +#define UA_WRITEMASK_WRITEMASK (0x01u << 20u) +#define UA_WRITEMASK_VALUEFORVARIABLETYPE (0x01u << 21u) + +/** + * ValueRanks + * ---------- + * The following are the most common ValueRanks used for Variables, + * VariableTypes and method arguments. ValueRanks higher than 3 are valid as + * well (but less common). */ + +#define UA_VALUERANK_SCALAR_OR_ONE_DIMENSION -3 +#define UA_VALUERANK_ANY -2 +#define UA_VALUERANK_SCALAR -1 +#define UA_VALUERANK_ONE_OR_MORE_DIMENSIONS 0 +#define UA_VALUERANK_ONE_DIMENSION 1 +#define UA_VALUERANK_TWO_DIMENSIONS 2 +#define UA_VALUERANK_THREE_DIMENSIONS 3 + +/** + * Internal Constants + * ================== * - * @param p The memory location of the array - * @param size The size of the array - * @param type The datatype of the array members */ -void UA_EXPORT UA_Array_delete(void *p, size_t size, const UA_DataType *type); + * Rule Handling + * ------------- + * + * The RuleHanding settings define how error cases that result from rules in the + * OPC UA specification shall be handled. The rule handling can be softened, + * e.g. to workaround misbehaving implementations or to mitigate the impact of + * additional rules that are introduced in later versions of the OPC UA + * specification. */ +typedef enum { + UA_RULEHANDLING_DEFAULT = 0, + UA_RULEHANDLING_ABORT, /* Abort the operation and return an error code */ + UA_RULEHANDLING_WARN, /* Print a message in the logs and continue */ + UA_RULEHANDLING_ACCEPT, /* Continue and disregard the broken rule */ +} UA_RuleHandling; /** - * Random Number Generator - * ----------------------- - * If UA_ENABLE_MULTITHREADING is defined, then the seed is stored in thread + * Order + * ----- + * + * The Order enum is used to establish an absolute ordering between elements. + */ + +typedef enum { + UA_ORDER_LESS = -1, + UA_ORDER_EQ = 0, + UA_ORDER_MORE = 1 +} UA_Order; + +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/types.h" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2014 (c) Leon Urbas + * Copyright 2014, 2016-2017 (c) Florian Palm + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2015-2016 (c) Sten Grüner + * Copyright 2015-2016 (c) Chris Iatrou + * Copyright 2015 (c) Nick Goossens + * Copyright 2015-2016 (c) Oleksiy Vasylyev + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA + */ + + + +_UA_BEGIN_DECLS + +#define UA_BUILTIN_TYPES_COUNT 25U + +/** + * .. _types: + * + * Data Types + * ========== + * + * The OPC UA protocol defines 25 builtin data types and three ways of combining + * them into higher-order types: arrays, structures and unions. In open62541, + * only the builtin data types are defined manually. All other data types are + * generated from standard XML definitions. Their exact definitions can be + * looked up at https://opcfoundation.org/UA/schemas/Opc.Ua.Types.bsd. + * + * For users that are new to open62541, take a look at the :ref:`tutorial for + * working with data types` before diving into the + * implementation details. + * + * Builtin Types + * ------------- + * + * Boolean + * ^^^^^^^ + * A two-state logical value (true or false). */ +typedef bool UA_Boolean; +#define UA_TRUE true UA_INTERNAL_DEPRECATED +#define UA_FALSE false UA_INTERNAL_DEPRECATED + +/** + * SByte + * ^^^^^ + * An integer value between -128 and 127. */ +typedef int8_t UA_SByte; +#define UA_SBYTE_MIN (-128) +#define UA_SBYTE_MAX 127 + +/** + * Byte + * ^^^^ + * An integer value between 0 and 255. */ +typedef uint8_t UA_Byte; +#define UA_BYTE_MIN 0 +#define UA_BYTE_MAX 255 + +/** + * Int16 + * ^^^^^ + * An integer value between -32 768 and 32 767. */ +typedef int16_t UA_Int16; +#define UA_INT16_MIN (-32768) +#define UA_INT16_MAX 32767 + +/** + * UInt16 + * ^^^^^^ + * An integer value between 0 and 65 535. */ +typedef uint16_t UA_UInt16; +#define UA_UINT16_MIN 0 +#define UA_UINT16_MAX 65535 + +/** + * Int32 + * ^^^^^ + * An integer value between -2 147 483 648 and 2 147 483 647. */ +typedef int32_t UA_Int32; +#define UA_INT32_MIN (-2147483648) +#define UA_INT32_MAX 2147483647 + +/** + * UInt32 + * ^^^^^^ + * An integer value between 0 and 4 294 967 295. */ +typedef uint32_t UA_UInt32; +#define UA_UINT32_MIN 0 +#define UA_UINT32_MAX 4294967295 + +/** + * Int64 + * ^^^^^ + * An integer value between -9 223 372 036 854 775 808 and + * 9 223 372 036 854 775 807. */ +typedef int64_t UA_Int64; +#define UA_INT64_MAX (int64_t)9223372036854775807LL +#define UA_INT64_MIN ((int64_t)-UA_INT64_MAX-1LL) + +/** + * UInt64 + * ^^^^^^ + * An integer value between 0 and 18 446 744 073 709 551 615. */ +typedef uint64_t UA_UInt64; +#define UA_UINT64_MIN (uint64_t)0 +#define UA_UINT64_MAX (uint64_t)18446744073709551615ULL + +/** + * Float + * ^^^^^ + * An IEEE single precision (32 bit) floating point value. */ +typedef float UA_Float; + +/** + * Double + * ^^^^^^ + * An IEEE double precision (64 bit) floating point value. */ +typedef double UA_Double; + +/** + * .. _statuscode: + * + * StatusCode + * ^^^^^^^^^^ + * A numeric identifier for a error or condition that is associated with a value + * or an operation. See the section :ref:`statuscodes` for the meaning of a + * specific code. */ +typedef uint32_t UA_StatusCode; + +/* Returns the human-readable name of the StatusCode. If no matching StatusCode + * is found, a default string for "Unknown" is returned. This feature might be + * disabled to create a smaller binary with the + * UA_ENABLE_STATUSCODE_DESCRIPTIONS build-flag. Then the function returns an + * empty string for every StatusCode. */ +UA_EXPORT const char * +UA_StatusCode_name(UA_StatusCode code); + +/** + * String + * ^^^^^^ + * A sequence of Unicode characters. Strings are just an array of UA_Byte. */ +typedef struct { + size_t length; /* The length of the string */ + UA_Byte *data; /* The content (not null-terminated) */ +} UA_String; + +/* Copies the content on the heap. Returns a null-string when alloc fails */ +UA_String UA_EXPORT UA_String_fromChars(const char *src) UA_FUNC_ATTR_WARN_UNUSED_RESULT; + +UA_Boolean UA_EXPORT UA_String_equal(const UA_String *s1, const UA_String *s2); + +UA_EXPORT extern const UA_String UA_STRING_NULL; + +/** + * ``UA_STRING`` returns a string pointing to the original char-array. + * ``UA_STRING_ALLOC`` is shorthand for ``UA_String_fromChars`` and makes a copy + * of the char-array. */ +static UA_INLINE UA_String +UA_STRING(char *chars) { + UA_String s; s.length = 0; s.data = NULL; + if(!chars) + return s; + s.length = strlen(chars); s.data = (UA_Byte*)chars; return s; +} + +#define UA_STRING_ALLOC(CHARS) UA_String_fromChars(CHARS) + +/* Define strings at compile time (in ROM) */ +#define UA_STRING_STATIC(CHARS) {sizeof(CHARS)-1, (UA_Byte*)CHARS} + +/** + * .. _datetime: + * + * DateTime + * ^^^^^^^^ + * An instance in time. A DateTime value is encoded as a 64-bit signed integer + * which represents the number of 100 nanosecond intervals since January 1, 1601 + * (UTC). + * + * The methods providing an interface to the system clock are architecture- + * specific. Usually, they provide a UTC clock that includes leap seconds. The + * OPC UA standard allows the use of International Atomic Time (TAI) for the + * DateTime instead. But this is still unusual and not implemented for most + * SDKs. Currently (2019), UTC and TAI are 37 seconds apart due to leap + * seconds. */ + +typedef int64_t UA_DateTime; + +/* Multiples to convert durations to DateTime */ +#define UA_DATETIME_USEC 10LL +#define UA_DATETIME_MSEC (UA_DATETIME_USEC * 1000LL) +#define UA_DATETIME_SEC (UA_DATETIME_MSEC * 1000LL) + +/* The current time in UTC time */ +UA_DateTime UA_EXPORT UA_DateTime_now(void); + +/* Offset between local time and UTC time */ +UA_Int64 UA_EXPORT UA_DateTime_localTimeUtcOffset(void); + +/* CPU clock invariant to system time changes. Use only to measure durations, + * not absolute time. */ +UA_DateTime UA_EXPORT UA_DateTime_nowMonotonic(void); + +/* Represents a Datetime as a structure */ +typedef struct UA_DateTimeStruct { + UA_UInt16 nanoSec; + UA_UInt16 microSec; + UA_UInt16 milliSec; + UA_UInt16 sec; + UA_UInt16 min; + UA_UInt16 hour; + UA_UInt16 day; /* From 1 to 31 */ + UA_UInt16 month; /* From 1 to 12 */ + UA_UInt16 year; +} UA_DateTimeStruct; + +UA_DateTimeStruct UA_EXPORT UA_DateTime_toStruct(UA_DateTime t); + +/* The C99 standard (7.23.1) says: "The range and precision of times + * representable in clock_t and time_t are implementation-defined." On most + * systems, time_t is a 4 or 8 byte integer counting seconds since the UTC Unix + * epoch. The following methods are used for conversion. */ + +/* Datetime of 1 Jan 1970 00:00 */ +#define UA_DATETIME_UNIX_EPOCH (11644473600LL * UA_DATETIME_SEC) + +static UA_INLINE UA_Int64 +UA_DateTime_toUnixTime(UA_DateTime date) { + return (date - UA_DATETIME_UNIX_EPOCH) / UA_DATETIME_SEC; +} + +static UA_INLINE UA_DateTime +UA_DateTime_fromUnixTime(UA_Int64 unixDate) { + return (unixDate * UA_DATETIME_SEC) + UA_DATETIME_UNIX_EPOCH; +} + +/** + * Guid + * ^^^^ + * A 16 byte value that can be used as a globally unique identifier. */ +typedef struct { + UA_UInt32 data1; + UA_UInt16 data2; + UA_UInt16 data3; + UA_Byte data4[8]; +} UA_Guid; + +UA_Boolean UA_EXPORT UA_Guid_equal(const UA_Guid *g1, const UA_Guid *g2); + +UA_EXPORT extern const UA_Guid UA_GUID_NULL; + +/** + * ByteString + * ^^^^^^^^^^ + * A sequence of octets. */ +typedef UA_String UA_ByteString; + +static UA_INLINE UA_Boolean +UA_ByteString_equal(const UA_ByteString *string1, + const UA_ByteString *string2) { + return UA_String_equal((const UA_String*)string1, + (const UA_String*)string2); +} + +/* Allocates memory of size length for the bytestring. + * The content is not set to zero. */ +UA_StatusCode UA_EXPORT +UA_ByteString_allocBuffer(UA_ByteString *bs, size_t length); + +UA_EXPORT extern const UA_ByteString UA_BYTESTRING_NULL; + +static UA_INLINE UA_ByteString +UA_BYTESTRING(char *chars) { + UA_ByteString bs; bs.length = 0; bs.data = NULL; + if(!chars) + return bs; + bs.length = strlen(chars); bs.data = (UA_Byte*)chars; return bs; +} + +static UA_INLINE UA_ByteString +UA_BYTESTRING_ALLOC(const char *chars) { + UA_String str = UA_String_fromChars(chars); UA_ByteString bstr; + bstr.length = str.length; bstr.data = str.data; return bstr; +} + +/** + * XmlElement + * ^^^^^^^^^^ + * An XML element. */ +typedef UA_String UA_XmlElement; + +/** + * .. _nodeid: + * + * NodeId + * ^^^^^^ + * An identifier for a node in the address space of an OPC UA Server. */ +enum UA_NodeIdType { + UA_NODEIDTYPE_NUMERIC = 0, /* In the binary encoding, this can also + * become 1 or 2 (two-byte and four-byte + * encoding of small numeric nodeids) */ + UA_NODEIDTYPE_STRING = 3, + UA_NODEIDTYPE_GUID = 4, + UA_NODEIDTYPE_BYTESTRING = 5 +}; + +typedef struct { + UA_UInt16 namespaceIndex; + enum UA_NodeIdType identifierType; + union { + UA_UInt32 numeric; + UA_String string; + UA_Guid guid; + UA_ByteString byteString; + } identifier; +} UA_NodeId; + +UA_EXPORT extern const UA_NodeId UA_NODEID_NULL; + +UA_Boolean UA_EXPORT UA_NodeId_isNull(const UA_NodeId *p); + +UA_Order UA_EXPORT UA_NodeId_order(const UA_NodeId *n1, const UA_NodeId *n2); + +static UA_INLINE UA_Boolean +UA_NodeId_equal(const UA_NodeId *n1, const UA_NodeId *n2) { + return (UA_NodeId_order(n1, n2) == UA_ORDER_EQ); +} + +/* Returns a non-cryptographic hash for the NodeId */ +UA_UInt32 UA_EXPORT UA_NodeId_hash(const UA_NodeId *n); + +/** The following functions are shorthand for creating NodeIds. */ +static UA_INLINE UA_NodeId +UA_NODEID_NUMERIC(UA_UInt16 nsIndex, UA_UInt32 identifier) { + UA_NodeId id; id.namespaceIndex = nsIndex; + id.identifierType = UA_NODEIDTYPE_NUMERIC; + id.identifier.numeric = identifier; return id; +} + +static UA_INLINE UA_NodeId +UA_NODEID_STRING(UA_UInt16 nsIndex, char *chars) { + UA_NodeId id; id.namespaceIndex = nsIndex; + id.identifierType = UA_NODEIDTYPE_STRING; + id.identifier.string = UA_STRING(chars); return id; +} + +static UA_INLINE UA_NodeId +UA_NODEID_STRING_ALLOC(UA_UInt16 nsIndex, const char *chars) { + UA_NodeId id; id.namespaceIndex = nsIndex; + id.identifierType = UA_NODEIDTYPE_STRING; + id.identifier.string = UA_STRING_ALLOC(chars); return id; +} + +static UA_INLINE UA_NodeId +UA_NODEID_GUID(UA_UInt16 nsIndex, UA_Guid guid) { + UA_NodeId id; id.namespaceIndex = nsIndex; + id.identifierType = UA_NODEIDTYPE_GUID; + id.identifier.guid = guid; return id; +} + +static UA_INLINE UA_NodeId +UA_NODEID_BYTESTRING(UA_UInt16 nsIndex, char *chars) { + UA_NodeId id; id.namespaceIndex = nsIndex; + id.identifierType = UA_NODEIDTYPE_BYTESTRING; + id.identifier.byteString = UA_BYTESTRING(chars); return id; +} + +static UA_INLINE UA_NodeId +UA_NODEID_BYTESTRING_ALLOC(UA_UInt16 nsIndex, const char *chars) { + UA_NodeId id; id.namespaceIndex = nsIndex; + id.identifierType = UA_NODEIDTYPE_BYTESTRING; + id.identifier.byteString = UA_BYTESTRING_ALLOC(chars); return id; +} + +/** + * ExpandedNodeId + * ^^^^^^^^^^^^^^ + * A NodeId that allows the namespace URI to be specified instead of an index. */ +typedef struct { + UA_NodeId nodeId; + UA_String namespaceUri; + UA_UInt32 serverIndex; +} UA_ExpandedNodeId; + +UA_EXPORT extern const UA_ExpandedNodeId UA_EXPANDEDNODEID_NULL; + +UA_Order UA_EXPORT +UA_ExpandedNodeId_order(const UA_ExpandedNodeId *n1, const UA_ExpandedNodeId *n2); + +static UA_INLINE UA_Boolean +UA_ExpandedNodeId_equal(const UA_ExpandedNodeId *n1, const UA_ExpandedNodeId *n2) { + return (UA_ExpandedNodeId_order(n1, n2) == UA_ORDER_EQ); +} + +/* Returns a non-cryptographic hash for the NodeId */ +UA_UInt32 UA_EXPORT UA_ExpandedNodeId_hash(const UA_ExpandedNodeId *n); + +/** The following functions are shorthand for creating ExpandedNodeIds. */ +static UA_INLINE UA_ExpandedNodeId +UA_EXPANDEDNODEID_NUMERIC(UA_UInt16 nsIndex, UA_UInt32 identifier) { + UA_ExpandedNodeId id; id.nodeId = UA_NODEID_NUMERIC(nsIndex, identifier); + id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id; +} + +static UA_INLINE UA_ExpandedNodeId +UA_EXPANDEDNODEID_STRING(UA_UInt16 nsIndex, char *chars) { + UA_ExpandedNodeId id; id.nodeId = UA_NODEID_STRING(nsIndex, chars); + id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id; +} + +static UA_INLINE UA_ExpandedNodeId +UA_EXPANDEDNODEID_STRING_ALLOC(UA_UInt16 nsIndex, const char *chars) { + UA_ExpandedNodeId id; id.nodeId = UA_NODEID_STRING_ALLOC(nsIndex, chars); + id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id; +} + +static UA_INLINE UA_ExpandedNodeId +UA_EXPANDEDNODEID_STRING_GUID(UA_UInt16 nsIndex, UA_Guid guid) { + UA_ExpandedNodeId id; id.nodeId = UA_NODEID_GUID(nsIndex, guid); + id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id; +} + +static UA_INLINE UA_ExpandedNodeId +UA_EXPANDEDNODEID_BYTESTRING(UA_UInt16 nsIndex, char *chars) { + UA_ExpandedNodeId id; id.nodeId = UA_NODEID_BYTESTRING(nsIndex, chars); + id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id; +} + +static UA_INLINE UA_ExpandedNodeId +UA_EXPANDEDNODEID_BYTESTRING_ALLOC(UA_UInt16 nsIndex, const char *chars) { + UA_ExpandedNodeId id; id.nodeId = UA_NODEID_BYTESTRING_ALLOC(nsIndex, chars); + id.serverIndex = 0; id.namespaceUri = UA_STRING_NULL; return id; +} + +/** + * .. _qualifiedname: + * + * QualifiedName + * ^^^^^^^^^^^^^ + * A name qualified by a namespace. */ +typedef struct { + UA_UInt16 namespaceIndex; + UA_String name; +} UA_QualifiedName; + +static UA_INLINE UA_Boolean +UA_QualifiedName_isNull(const UA_QualifiedName *q) { + return (q->namespaceIndex == 0 && q->name.length == 0); +} + +static UA_INLINE UA_QualifiedName +UA_QUALIFIEDNAME(UA_UInt16 nsIndex, char *chars) { + UA_QualifiedName qn; qn.namespaceIndex = nsIndex; + qn.name = UA_STRING(chars); return qn; +} + +static UA_INLINE UA_QualifiedName +UA_QUALIFIEDNAME_ALLOC(UA_UInt16 nsIndex, const char *chars) { + UA_QualifiedName qn; qn.namespaceIndex = nsIndex; + qn.name = UA_STRING_ALLOC(chars); return qn; +} + +UA_Boolean UA_EXPORT +UA_QualifiedName_equal(const UA_QualifiedName *qn1, + const UA_QualifiedName *qn2); + +/** + * LocalizedText + * ^^^^^^^^^^^^^ + * Human readable text with an optional locale identifier. */ +typedef struct { + UA_String locale; + UA_String text; +} UA_LocalizedText; + +static UA_INLINE UA_LocalizedText +UA_LOCALIZEDTEXT(char *locale, char *text) { + UA_LocalizedText lt; lt.locale = UA_STRING(locale); + lt.text = UA_STRING(text); return lt; +} + +static UA_INLINE UA_LocalizedText +UA_LOCALIZEDTEXT_ALLOC(const char *locale, const char *text) { + UA_LocalizedText lt; lt.locale = UA_STRING_ALLOC(locale); + lt.text = UA_STRING_ALLOC(text); return lt; +} + +/** + * .. _numericrange: + * + * NumericRange + * ^^^^^^^^^^^^ + * + * NumericRanges are used to indicate subsets of a (multidimensional) array. + * They no official data type in the OPC UA standard and are transmitted only + * with a string encoding, such as "1:2,0:3,5". The colon separates min/max + * index and the comma separates dimensions. A single value indicates a range + * with a single element (min==max). */ +typedef struct { + UA_UInt32 min; + UA_UInt32 max; +} UA_NumericRangeDimension; + +typedef struct { + size_t dimensionsSize; + UA_NumericRangeDimension *dimensions; +} UA_NumericRange; + +UA_StatusCode UA_EXPORT +UA_NumericRange_parseFromString(UA_NumericRange *range, const UA_String *str); + + +/** + * .. _variant: + * + * Variant + * ^^^^^^^ + * + * Variants may contain values of any type together with a description of the + * content. See the section on :ref:`generic-types` on how types are described. + * The standard mandates that variants contain built-in data types only. If the + * value is not of a builtin type, it is wrapped into an :ref:`extensionobject`. + * open62541 hides this wrapping transparently in the encoding layer. If the + * data type is unknown to the receiver, the variant contains the original + * ExtensionObject in binary or XML encoding. + * + * Variants may contain a scalar value or an array. For details on the handling + * of arrays, see the section on :ref:`array-handling`. Array variants can have + * an additional dimensionality (matrix, 3-tensor, ...) defined in an array of + * dimension lengths. The actual values are kept in an array of dimensions one. + * For users who work with higher-dimensions arrays directly, keep in mind that + * dimensions of higher rank are serialized first (the highest rank dimension + * has stride 1 and elements follow each other directly). Usually it is simplest + * to interact with higher-dimensional arrays via ``UA_NumericRange`` + * descriptions (see :ref:`array-handling`). + * + * To differentiate between scalar / array variants, the following definition is + * used. ``UA_Variant_isScalar`` provides simplified access to these checks. + * + * - ``arrayLength == 0 && data == NULL``: undefined array of length -1 + * - ``arrayLength == 0 && data == UA_EMPTY_ARRAY_SENTINEL``: array of length 0 + * - ``arrayLength == 0 && data > UA_EMPTY_ARRAY_SENTINEL``: scalar value + * - ``arrayLength > 0``: array of the given length + * + * Variants can also be *empty*. Then, the pointer to the type description is + * ``NULL``. */ +/* Forward declaration. See the section on Generic Type Handling */ +struct UA_DataType; +typedef struct UA_DataType UA_DataType; + +#define UA_EMPTY_ARRAY_SENTINEL ((void*)0x01) + +typedef enum { + UA_VARIANT_DATA, /* The data has the same lifecycle as the + variant */ + UA_VARIANT_DATA_NODELETE /* The data is "borrowed" by the variant and + shall not be deleted at the end of the + variant's lifecycle. */ +} UA_VariantStorageType; + +typedef struct { + const UA_DataType *type; /* The data type description */ + UA_VariantStorageType storageType; + size_t arrayLength; /* The number of elements in the data array */ + void *data; /* Points to the scalar or array data */ + size_t arrayDimensionsSize; /* The number of dimensions */ + UA_UInt32 *arrayDimensions; /* The length of each dimension */ +} UA_Variant; + +/* Returns true if the variant has no value defined (contains neither an array + * nor a scalar value). + * + * @param v The variant + * @return Is the variant empty */ +static UA_INLINE UA_Boolean +UA_Variant_isEmpty(const UA_Variant *v) { + return v->type == NULL; +} + +/* Returns true if the variant contains a scalar value. Note that empty variants + * contain an array of length -1 (undefined). + * + * @param v The variant + * @return Does the variant contain a scalar value */ +static UA_INLINE UA_Boolean +UA_Variant_isScalar(const UA_Variant *v) { + return (v->arrayLength == 0 && v->data > UA_EMPTY_ARRAY_SENTINEL); +} + +/* Returns true if the variant contains a scalar value of the given type. + * + * @param v The variant + * @param type The data type + * @return Does the variant contain a scalar value of the given type */ +static UA_INLINE UA_Boolean +UA_Variant_hasScalarType(const UA_Variant *v, const UA_DataType *type) { + return UA_Variant_isScalar(v) && type == v->type; +} + +/* Returns true if the variant contains an array of the given type. + * + * @param v The variant + * @param type The data type + * @return Does the variant contain an array of the given type */ +static UA_INLINE UA_Boolean +UA_Variant_hasArrayType(const UA_Variant *v, const UA_DataType *type) { + return (!UA_Variant_isScalar(v)) && type == v->type; +} + +/* Set the variant to a scalar value that already resides in memory. The value + * takes on the lifecycle of the variant and is deleted with it. + * + * @param v The variant + * @param p A pointer to the value data + * @param type The datatype of the value in question */ +void UA_EXPORT +UA_Variant_setScalar(UA_Variant *v, void * UA_RESTRICT p, + const UA_DataType *type); + +/* Set the variant to a scalar value that is copied from an existing variable. + * @param v The variant + * @param p A pointer to the value data + * @param type The datatype of the value + * @return Indicates whether the operation succeeded or returns an error code */ +UA_StatusCode UA_EXPORT +UA_Variant_setScalarCopy(UA_Variant *v, const void *p, + const UA_DataType *type); + +/* Set the variant to an array that already resides in memory. The array takes + * on the lifecycle of the variant and is deleted with it. + * + * @param v The variant + * @param array A pointer to the array data + * @param arraySize The size of the array + * @param type The datatype of the array */ +void UA_EXPORT +UA_Variant_setArray(UA_Variant *v, void * UA_RESTRICT array, + size_t arraySize, const UA_DataType *type); + +/* Set the variant to an array that is copied from an existing array. + * + * @param v The variant + * @param array A pointer to the array data + * @param arraySize The size of the array + * @param type The datatype of the array + * @return Indicates whether the operation succeeded or returns an error code */ +UA_StatusCode UA_EXPORT +UA_Variant_setArrayCopy(UA_Variant *v, const void *array, + size_t arraySize, const UA_DataType *type); + +/* Copy the variant, but use only a subset of the (multidimensional) array into + * a variant. Returns an error code if the variant is not an array or if the + * indicated range does not fit. + * + * @param src The source variant + * @param dst The target variant + * @param range The range of the copied data + * @return Returns UA_STATUSCODE_GOOD or an error code */ +UA_StatusCode UA_EXPORT +UA_Variant_copyRange(const UA_Variant *src, UA_Variant *dst, + const UA_NumericRange range); + +/* Insert a range of data into an existing variant. The data array can't be + * reused afterwards if it contains types without a fixed size (e.g. strings) + * since the members are moved into the variant and take on its lifecycle. + * + * @param v The variant + * @param dataArray The data array. The type must match the variant + * @param dataArraySize The length of the data array. This is checked to match + * the range size. + * @param range The range of where the new data is inserted + * @return Returns UA_STATUSCODE_GOOD or an error code */ +UA_StatusCode UA_EXPORT +UA_Variant_setRange(UA_Variant *v, void * UA_RESTRICT array, + size_t arraySize, const UA_NumericRange range); + +/* Deep-copy a range of data into an existing variant. + * + * @param v The variant + * @param dataArray The data array. The type must match the variant + * @param dataArraySize The length of the data array. This is checked to match + * the range size. + * @param range The range of where the new data is inserted + * @return Returns UA_STATUSCODE_GOOD or an error code */ +UA_StatusCode UA_EXPORT +UA_Variant_setRangeCopy(UA_Variant *v, const void *array, + size_t arraySize, const UA_NumericRange range); + +/** + * .. _extensionobject: + * + * ExtensionObject + * ^^^^^^^^^^^^^^^ + * + * ExtensionObjects may contain scalars of any data type. Even those that are + * unknown to the receiver. See the section on :ref:`generic-types` on how types + * are described. If the received data type is unknown, the encoded string and + * target NodeId is stored instead of the decoded value. */ +typedef enum { + UA_EXTENSIONOBJECT_ENCODED_NOBODY = 0, + UA_EXTENSIONOBJECT_ENCODED_BYTESTRING = 1, + UA_EXTENSIONOBJECT_ENCODED_XML = 2, + UA_EXTENSIONOBJECT_DECODED = 3, + UA_EXTENSIONOBJECT_DECODED_NODELETE = 4 /* Don't delete the content + together with the + ExtensionObject */ +} UA_ExtensionObjectEncoding; + +typedef struct { + UA_ExtensionObjectEncoding encoding; + union { + struct { + UA_NodeId typeId; /* The nodeid of the datatype */ + UA_ByteString body; /* The bytestring of the encoded data */ + } encoded; + struct { + const UA_DataType *type; + void *data; + } decoded; + } content; +} UA_ExtensionObject; + +/** + * .. _datavalue: + * + * DataValue + * ^^^^^^^^^ + * A data value with an associated status code and timestamps. */ +typedef struct { + UA_Variant value; + UA_DateTime sourceTimestamp; + UA_DateTime serverTimestamp; + UA_UInt16 sourcePicoseconds; + UA_UInt16 serverPicoseconds; + UA_StatusCode status; + UA_Boolean hasValue : 1; + UA_Boolean hasStatus : 1; + UA_Boolean hasSourceTimestamp : 1; + UA_Boolean hasServerTimestamp : 1; + UA_Boolean hasSourcePicoseconds : 1; + UA_Boolean hasServerPicoseconds : 1; +} UA_DataValue; + +/** + * DiagnosticInfo + * ^^^^^^^^^^^^^^ + * A structure that contains detailed error and diagnostic information + * associated with a StatusCode. */ +typedef struct UA_DiagnosticInfo { + UA_Boolean hasSymbolicId : 1; + UA_Boolean hasNamespaceUri : 1; + UA_Boolean hasLocalizedText : 1; + UA_Boolean hasLocale : 1; + UA_Boolean hasAdditionalInfo : 1; + UA_Boolean hasInnerStatusCode : 1; + UA_Boolean hasInnerDiagnosticInfo : 1; + UA_Int32 symbolicId; + UA_Int32 namespaceUri; + UA_Int32 localizedText; + UA_Int32 locale; + UA_String additionalInfo; + UA_StatusCode innerStatusCode; + struct UA_DiagnosticInfo *innerDiagnosticInfo; +} UA_DiagnosticInfo; + +/** + * .. _generic-types: + * + * Generic Type Handling + * --------------------- + * + * All information about a (builtin/structured) data type is stored in a + * ``UA_DataType``. The array ``UA_TYPES`` contains the description of all + * standard-defined types. This type description is used for the following + * generic operations that work on all types: + * + * - ``void T_init(T *ptr)``: Initialize the data type. This is synonymous with + * zeroing out the memory, i.e. ``memset(ptr, 0, sizeof(T))``. + * - ``T* T_new()``: Allocate and return the memory for the data type. The + * value is already initialized. + * - ``UA_StatusCode T_copy(const T *src, T *dst)``: Copy the content of the + * data type. Returns ``UA_STATUSCODE_GOOD`` or + * ``UA_STATUSCODE_BADOUTOFMEMORY``. + * - ``void T_clear(T *ptr)``: Delete the dynamically allocated content + * of the data type and perform a ``T_init`` to reset the type. + * - ``void T_delete(T *ptr)``: Delete the content of the data type and the + * memory for the data type itself. + * + * Specializations, such as ``UA_Int32_new()`` are derived from the generic + * type operations as static inline functions. */ + +typedef struct { +#ifdef UA_ENABLE_TYPENAMES + const char *memberName; +#endif + UA_UInt16 memberTypeIndex; /* Index of the member in the array of data + types */ + UA_Byte padding; /* How much padding is there before this + member element? For arrays this is the + padding before the size_t length member. + (No padding between size_t and the + following ptr.) */ + UA_Boolean namespaceZero : 1; /* The type of the member is defined in + namespace zero. In this implementation, + types from custom namespace may contain + members from the same namespace or + namespace zero only.*/ + UA_Boolean isArray : 1; /* The member is an array */ +} UA_DataTypeMember; + +/* The DataType "kind" is an internal type classification. It is used to + * dispatch handling to the correct routines. */ +#define UA_DATATYPEKINDS 31 +typedef enum { + UA_DATATYPEKIND_BOOLEAN = 0, + UA_DATATYPEKIND_SBYTE = 1, + UA_DATATYPEKIND_BYTE = 2, + UA_DATATYPEKIND_INT16 = 3, + UA_DATATYPEKIND_UINT16 = 4, + UA_DATATYPEKIND_INT32 = 5, + UA_DATATYPEKIND_UINT32 = 6, + UA_DATATYPEKIND_INT64 = 7, + UA_DATATYPEKIND_UINT64 = 8, + UA_DATATYPEKIND_FLOAT = 9, + UA_DATATYPEKIND_DOUBLE = 10, + UA_DATATYPEKIND_STRING = 11, + UA_DATATYPEKIND_DATETIME = 12, + UA_DATATYPEKIND_GUID = 13, + UA_DATATYPEKIND_BYTESTRING = 14, + UA_DATATYPEKIND_XMLELEMENT = 15, + UA_DATATYPEKIND_NODEID = 16, + UA_DATATYPEKIND_EXPANDEDNODEID = 17, + UA_DATATYPEKIND_STATUSCODE = 18, + UA_DATATYPEKIND_QUALIFIEDNAME = 19, + UA_DATATYPEKIND_LOCALIZEDTEXT = 20, + UA_DATATYPEKIND_EXTENSIONOBJECT = 21, + UA_DATATYPEKIND_DATAVALUE = 22, + UA_DATATYPEKIND_VARIANT = 23, + UA_DATATYPEKIND_DIAGNOSTICINFO = 24, + UA_DATATYPEKIND_DECIMAL = 25, + UA_DATATYPEKIND_ENUM = 26, + UA_DATATYPEKIND_STRUCTURE = 27, + UA_DATATYPEKIND_OPTSTRUCT = 28, /* struct with optional fields */ + UA_DATATYPEKIND_UNION = 29, + UA_DATATYPEKIND_BITFIELDCLUSTER = 30 /* bitfields + padding */ +} UA_DataTypeKind; + +struct UA_DataType { +#ifdef UA_ENABLE_TYPENAMES + 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 */ + UA_UInt32 typeKind : 6; /* Dispatch index for the handling routines */ + UA_UInt32 pointerFree : 1; /* The type (and its members) contains no + * pointers that need to be freed */ + UA_UInt32 overlayable : 1; /* The type has the identical memory layout + * in memory and on the binary stream. */ + UA_UInt32 membersSize : 8; /* How many members does the type have? */ + UA_UInt32 binaryEncodingId : 16; /* NodeId of datatype when encoded as binary */ + //UA_UInt16 xmlEncodingId; /* NodeId of datatype when encoded as XML */ + UA_DataTypeMember *members; +}; + +/* Test if the data type is a numeric builtin data type. This includes Boolean, + * integers and floating point numbers. Not included are DateTime and + * StatusCode. */ +UA_Boolean +UA_DataType_isNumeric(const UA_DataType *type); + +/** + * Builtin data types can be accessed as UA_TYPES[UA_TYPES_XXX], where XXX is + * the name of the data type. If only the NodeId of a type is known, use the + * following method to retrieve the data type description. */ + +/* Returns the data type description for the type's identifier or NULL if no + * matching data type was found. */ +const UA_DataType UA_EXPORT * +UA_findDataType(const UA_NodeId *typeId); + +/** The following functions are used for generic handling of data types. */ + +/* Allocates and initializes a variable of type dataType + * + * @param type The datatype description + * @return Returns the memory location of the variable or NULL if no + * memory could be allocated */ +void UA_EXPORT * UA_new(const UA_DataType *type) UA_FUNC_ATTR_MALLOC; + +/* Initializes a variable to default values + * + * @param p The memory location of the variable + * @param type The datatype description */ +static UA_INLINE void +UA_init(void *p, const UA_DataType *type) { + memset(p, 0, type->memSize); +} + +/* Copies the content of two variables. If copying fails (e.g. because no memory + * was available for an array), then dst is emptied and initialized to prevent + * memory leaks. + * + * @param src The memory location of the source variable + * @param dst The memory location of the destination variable + * @param type The datatype description + * @return Indicates whether the operation succeeded or returns an error code */ +UA_StatusCode UA_EXPORT +UA_copy(const void *src, void *dst, const UA_DataType *type); + +/* Deletes the dynamically allocated content of a variable (e.g. resets all + * arrays to undefined arrays). Afterwards, the variable can be safely deleted + * without causing memory leaks. But the variable is not initialized and may + * contain old data that is not memory-relevant. + * + * @param p The memory location of the variable + * @param type The datatype description of the variable */ +void UA_EXPORT UA_clear(void *p, const UA_DataType *type); + +#define UA_deleteMembers(p, type) UA_clear(p, type) + +/* Frees a variable and all of its content. + * + * @param p The memory location of the variable + * @param type The datatype description of the variable */ +void UA_EXPORT UA_delete(void *p, const UA_DataType *type); + +/** + * .. _array-handling: + * + * Array handling + * -------------- + * In OPC UA, arrays can have a length of zero or more with the usual meaning. + * In addition, arrays can be undefined. Then, they don't even have a length. In + * the binary encoding, this is indicated by an array of length -1. + * + * In open62541 however, we use ``size_t`` for array lengths. An undefined array + * has length 0 and the data pointer is ``NULL``. An array of length 0 also has + * length 0 but a data pointer ``UA_EMPTY_ARRAY_SENTINEL``. */ + +/* Allocates and initializes an array of variables of a specific type + * + * @param size The requested array length + * @param type The datatype description + * @return Returns the memory location of the variable or NULL if no memory + could be allocated */ +void UA_EXPORT * +UA_Array_new(size_t size, const UA_DataType *type) UA_FUNC_ATTR_MALLOC; + +/* Allocates and copies an array + * + * @param src The memory location of the source array + * @param size The size of the array + * @param dst The location of the pointer to the new array + * @param type The datatype of the array members + * @return Returns UA_STATUSCODE_GOOD or UA_STATUSCODE_BADOUTOFMEMORY */ +UA_StatusCode UA_EXPORT +UA_Array_copy(const void *src, size_t size, void **dst, + const UA_DataType *type) UA_FUNC_ATTR_WARN_UNUSED_RESULT; + +/* Deletes an array. + * + * @param p The memory location of the array + * @param size The size of the array + * @param type The datatype of the array members */ +void UA_EXPORT UA_Array_delete(void *p, size_t size, const UA_DataType *type); + +/** + * Random Number Generator + * ----------------------- + * If UA_ENABLE_MULTITHREADING is defined, then the seed is stored in thread * local storage. The seed is initialized for every thread in the * server/client. */ void UA_EXPORT UA_random_seed(UA_UInt64 seed); UA_UInt32 UA_EXPORT UA_UInt32_random(void); /* no cryptographic entropy */ UA_Guid UA_EXPORT UA_Guid_random(void); /* no cryptographic entropy */ -/** - * .. _generated-types: - * - * Generated Data Type Definitions - * ------------------------------- - * - * The following data types were auto-generated from a definition in XML format. - * - * .. toctree:: - * - * types_generated */ +/** + * .. _generated-types: + * + * Generated Data Type Definitions + * ------------------------------- + * + * The following data types were auto-generated from a definition in XML format. + */ + +/* The following is used to exclude type names in the definition of UA_DataType + * structures if the feature is disabled. */ +#ifdef UA_ENABLE_TYPENAMES +# define UA_TYPENAME(name) name, +#else +# define UA_TYPENAME(name) +#endif + +/* Datatype arrays with custom type definitions can be added in a linked list to + * the client or server configuration. Datatype members can point to types in + * the same array via the ``memberTypeIndex``. If ``namespaceZero`` is set to + * true, the member datatype is looked up in the array of builtin datatypes + * instead. */ +typedef struct UA_DataTypeArray { + const struct UA_DataTypeArray *next; + const size_t typesSize; + const UA_DataType *types; +} UA_DataTypeArray; + +/** + * + * .. toctree:: + * + * types_generated */ + +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/types_generated.h" ***********************************/ + +/* Generated from Opc.Ua.Types.bsd with script /Users/jelena/Desktop/open62541/tools/generate_datatypes.py + * on host Jelena-2.local by user jelena at 2025-09-11 03:30:41 */ + + +#ifdef UA_ENABLE_AMALGAMATION +#else + +#endif + +_UA_BEGIN_DECLS + + +/** + * Every type is assigned an index in an array containing the type descriptions. + * These descriptions are used during type handling (copying, deletion, + * binary encoding, ...). */ +#define UA_TYPES_COUNT 224 +extern UA_EXPORT const UA_DataType UA_TYPES[UA_TYPES_COUNT]; + +/** + * Boolean + * ^^^^^^^ + */ +#define UA_TYPES_BOOLEAN 0 + +/** + * SByte + * ^^^^^ + */ +#define UA_TYPES_SBYTE 1 + +/** + * Byte + * ^^^^ + */ +#define UA_TYPES_BYTE 2 + +/** + * Int16 + * ^^^^^ + */ +#define UA_TYPES_INT16 3 + +/** + * UInt16 + * ^^^^^^ + */ +#define UA_TYPES_UINT16 4 + +/** + * Int32 + * ^^^^^ + */ +#define UA_TYPES_INT32 5 + +/** + * UInt32 + * ^^^^^^ + */ +#define UA_TYPES_UINT32 6 + +/** + * Int64 + * ^^^^^ + */ +#define UA_TYPES_INT64 7 + +/** + * UInt64 + * ^^^^^^ + */ +#define UA_TYPES_UINT64 8 + +/** + * Float + * ^^^^^ + */ +#define UA_TYPES_FLOAT 9 + +/** + * Double + * ^^^^^^ + */ +#define UA_TYPES_DOUBLE 10 + +/** + * String + * ^^^^^^ + */ +#define UA_TYPES_STRING 11 + +/** + * DateTime + * ^^^^^^^^ + */ +#define UA_TYPES_DATETIME 12 + +/** + * Guid + * ^^^^ + */ +#define UA_TYPES_GUID 13 + +/** + * ByteString + * ^^^^^^^^^^ + */ +#define UA_TYPES_BYTESTRING 14 + +/** + * XmlElement + * ^^^^^^^^^^ + */ +#define UA_TYPES_XMLELEMENT 15 + +/** + * NodeId + * ^^^^^^ + */ +#define UA_TYPES_NODEID 16 + +/** + * ExpandedNodeId + * ^^^^^^^^^^^^^^ + */ +#define UA_TYPES_EXPANDEDNODEID 17 + +/** + * StatusCode + * ^^^^^^^^^^ + */ +#define UA_TYPES_STATUSCODE 18 + +/** + * QualifiedName + * ^^^^^^^^^^^^^ + */ +#define UA_TYPES_QUALIFIEDNAME 19 + +/** + * LocalizedText + * ^^^^^^^^^^^^^ + */ +#define UA_TYPES_LOCALIZEDTEXT 20 + +/** + * ExtensionObject + * ^^^^^^^^^^^^^^^ + */ +#define UA_TYPES_EXTENSIONOBJECT 21 + +/** + * DataValue + * ^^^^^^^^^ + */ +#define UA_TYPES_DATAVALUE 22 + +/** + * Variant + * ^^^^^^^ + */ +#define UA_TYPES_VARIANT 23 + +/** + * DiagnosticInfo + * ^^^^^^^^^^^^^^ + */ +#define UA_TYPES_DIAGNOSTICINFO 24 + +/** + * KeyValuePair + * ^^^^^^^^^^^^ + */ +typedef struct { + UA_QualifiedName key; + UA_Variant value; +} UA_KeyValuePair; + +#define UA_TYPES_KEYVALUEPAIR 25 + +/** + * SimpleTypeDescription + * ^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_NodeId dataTypeId; + UA_QualifiedName name; + UA_NodeId baseDataType; + UA_Byte builtInType; +} UA_SimpleTypeDescription; + +#define UA_TYPES_SIMPLETYPEDESCRIPTION 26 + +/** + * PubSubState + * ^^^^^^^^^^^ + */ +typedef enum { + UA_PUBSUBSTATE_DISABLED = 0, + UA_PUBSUBSTATE_PAUSED = 1, + UA_PUBSUBSTATE_OPERATIONAL = 2, + UA_PUBSUBSTATE_ERROR = 3, + __UA_PUBSUBSTATE_FORCE32BIT = 0x7fffffff +} UA_PubSubState; +UA_STATIC_ASSERT(sizeof(UA_PubSubState) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_PUBSUBSTATE 27 + +/** + * DataSetFieldFlags + * ^^^^^^^^^^^^^^^^^ + */ +typedef enum { + UA_DATASETFIELDFLAGS_NONE = 0, + UA_DATASETFIELDFLAGS_PROMOTEDFIELD = 1, + __UA_DATASETFIELDFLAGS_FORCE32BIT = 0x7fffffff +} UA_DataSetFieldFlags; +UA_STATIC_ASSERT(sizeof(UA_DataSetFieldFlags) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_DATASETFIELDFLAGS 28 + +/** + * ConfigurationVersionDataType + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_UInt32 majorVersion; + UA_UInt32 minorVersion; +} UA_ConfigurationVersionDataType; + +#define UA_TYPES_CONFIGURATIONVERSIONDATATYPE 29 + +/** + * PublishedVariableDataType + * ^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_NodeId publishedVariable; + UA_UInt32 attributeId; + UA_Double samplingIntervalHint; + UA_UInt32 deadbandType; + UA_Double deadbandValue; + UA_String indexRange; + UA_Variant substituteValue; + size_t metaDataPropertiesSize; + UA_QualifiedName *metaDataProperties; +} UA_PublishedVariableDataType; + +#define UA_TYPES_PUBLISHEDVARIABLEDATATYPE 30 + +/** + * DataSetFieldContentMask + * ^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef enum { + UA_DATASETFIELDCONTENTMASK_NONE = 0, + UA_DATASETFIELDCONTENTMASK_STATUSCODE = 1, + UA_DATASETFIELDCONTENTMASK_SOURCETIMESTAMP = 2, + UA_DATASETFIELDCONTENTMASK_SERVERTIMESTAMP = 4, + UA_DATASETFIELDCONTENTMASK_SOURCEPICOSECONDS = 8, + UA_DATASETFIELDCONTENTMASK_SERVERPICOSECONDS = 16, + UA_DATASETFIELDCONTENTMASK_RAWDATA = 32, + __UA_DATASETFIELDCONTENTMASK_FORCE32BIT = 0x7fffffff +} UA_DataSetFieldContentMask; +UA_STATIC_ASSERT(sizeof(UA_DataSetFieldContentMask) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_DATASETFIELDCONTENTMASK 31 + +/** + * DataSetWriterDataType + * ^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_String name; + UA_Boolean enabled; + UA_UInt16 dataSetWriterId; + UA_DataSetFieldContentMask dataSetFieldContentMask; + UA_UInt32 keyFrameCount; + UA_String dataSetName; + size_t dataSetWriterPropertiesSize; + UA_KeyValuePair *dataSetWriterProperties; + UA_ExtensionObject transportSettings; + UA_ExtensionObject messageSettings; +} UA_DataSetWriterDataType; + +#define UA_TYPES_DATASETWRITERDATATYPE 32 + +/** + * NetworkAddressUrlDataType + * ^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_String networkInterface; + UA_String url; +} UA_NetworkAddressUrlDataType; + +#define UA_TYPES_NETWORKADDRESSURLDATATYPE 33 + +/** + * OverrideValueHandling + * ^^^^^^^^^^^^^^^^^^^^^ + */ +typedef enum { + UA_OVERRIDEVALUEHANDLING_DISABLED = 0, + UA_OVERRIDEVALUEHANDLING_LASTUSABLEVALUE = 1, + UA_OVERRIDEVALUEHANDLING_OVERRIDEVALUE = 2, + __UA_OVERRIDEVALUEHANDLING_FORCE32BIT = 0x7fffffff +} UA_OverrideValueHandling; +UA_STATIC_ASSERT(sizeof(UA_OverrideValueHandling) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_OVERRIDEVALUEHANDLING 34 + +/** + * DataSetOrderingType + * ^^^^^^^^^^^^^^^^^^^ + */ +typedef enum { + UA_DATASETORDERINGTYPE_UNDEFINED = 0, + UA_DATASETORDERINGTYPE_ASCENDINGWRITERID = 1, + UA_DATASETORDERINGTYPE_ASCENDINGWRITERIDSINGLE = 2, + __UA_DATASETORDERINGTYPE_FORCE32BIT = 0x7fffffff +} UA_DataSetOrderingType; +UA_STATIC_ASSERT(sizeof(UA_DataSetOrderingType) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_DATASETORDERINGTYPE 35 + +/** + * UadpNetworkMessageContentMask + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef enum { + UA_UADPNETWORKMESSAGECONTENTMASK_NONE = 0, + UA_UADPNETWORKMESSAGECONTENTMASK_PUBLISHERID = 1, + UA_UADPNETWORKMESSAGECONTENTMASK_GROUPHEADER = 2, + UA_UADPNETWORKMESSAGECONTENTMASK_WRITERGROUPID = 4, + UA_UADPNETWORKMESSAGECONTENTMASK_GROUPVERSION = 8, + UA_UADPNETWORKMESSAGECONTENTMASK_NETWORKMESSAGENUMBER = 16, + UA_UADPNETWORKMESSAGECONTENTMASK_SEQUENCENUMBER = 32, + UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER = 64, + UA_UADPNETWORKMESSAGECONTENTMASK_TIMESTAMP = 128, + UA_UADPNETWORKMESSAGECONTENTMASK_PICOSECONDS = 256, + UA_UADPNETWORKMESSAGECONTENTMASK_DATASETCLASSID = 512, + UA_UADPNETWORKMESSAGECONTENTMASK_PROMOTEDFIELDS = 1024, + __UA_UADPNETWORKMESSAGECONTENTMASK_FORCE32BIT = 0x7fffffff +} UA_UadpNetworkMessageContentMask; +UA_STATIC_ASSERT(sizeof(UA_UadpNetworkMessageContentMask) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_UADPNETWORKMESSAGECONTENTMASK 36 + +/** + * UadpWriterGroupMessageDataType + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_UInt32 groupVersion; + UA_DataSetOrderingType dataSetOrdering; + UA_UadpNetworkMessageContentMask networkMessageContentMask; + UA_Double samplingOffset; + size_t publishingOffsetSize; + UA_Double *publishingOffset; +} UA_UadpWriterGroupMessageDataType; + +#define UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE 37 + +/** + * UadpDataSetMessageContentMask + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef enum { + UA_UADPDATASETMESSAGECONTENTMASK_NONE = 0, + UA_UADPDATASETMESSAGECONTENTMASK_TIMESTAMP = 1, + UA_UADPDATASETMESSAGECONTENTMASK_PICOSECONDS = 2, + UA_UADPDATASETMESSAGECONTENTMASK_STATUS = 4, + UA_UADPDATASETMESSAGECONTENTMASK_MAJORVERSION = 8, + UA_UADPDATASETMESSAGECONTENTMASK_MINORVERSION = 16, + UA_UADPDATASETMESSAGECONTENTMASK_SEQUENCENUMBER = 32, + __UA_UADPDATASETMESSAGECONTENTMASK_FORCE32BIT = 0x7fffffff +} UA_UadpDataSetMessageContentMask; +UA_STATIC_ASSERT(sizeof(UA_UadpDataSetMessageContentMask) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_UADPDATASETMESSAGECONTENTMASK 38 + +/** + * UadpDataSetWriterMessageDataType + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_UadpDataSetMessageContentMask dataSetMessageContentMask; + UA_UInt16 configuredSize; + UA_UInt16 networkMessageNumber; + UA_UInt16 dataSetOffset; +} UA_UadpDataSetWriterMessageDataType; + +#define UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE 39 + +/** + * UadpDataSetReaderMessageDataType + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_UInt32 groupVersion; + UA_UInt16 networkMessageNumber; + UA_UInt16 dataSetOffset; + UA_Guid dataSetClassId; + UA_UadpNetworkMessageContentMask networkMessageContentMask; + UA_UadpDataSetMessageContentMask dataSetMessageContentMask; + UA_Double publishingInterval; + UA_Double receiveOffset; + UA_Double processingOffset; +} UA_UadpDataSetReaderMessageDataType; + +#define UA_TYPES_UADPDATASETREADERMESSAGEDATATYPE 40 + +/** + * JsonNetworkMessageContentMask + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef enum { + UA_JSONNETWORKMESSAGECONTENTMASK_NONE = 0, + UA_JSONNETWORKMESSAGECONTENTMASK_NETWORKMESSAGEHEADER = 1, + UA_JSONNETWORKMESSAGECONTENTMASK_DATASETMESSAGEHEADER = 2, + UA_JSONNETWORKMESSAGECONTENTMASK_SINGLEDATASETMESSAGE = 4, + UA_JSONNETWORKMESSAGECONTENTMASK_PUBLISHERID = 8, + UA_JSONNETWORKMESSAGECONTENTMASK_DATASETCLASSID = 16, + UA_JSONNETWORKMESSAGECONTENTMASK_REPLYTO = 32, + __UA_JSONNETWORKMESSAGECONTENTMASK_FORCE32BIT = 0x7fffffff +} UA_JsonNetworkMessageContentMask; +UA_STATIC_ASSERT(sizeof(UA_JsonNetworkMessageContentMask) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_JSONNETWORKMESSAGECONTENTMASK 41 + +/** + * JsonDataSetMessageContentMask + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef enum { + UA_JSONDATASETMESSAGECONTENTMASK_NONE = 0, + UA_JSONDATASETMESSAGECONTENTMASK_DATASETWRITERID = 1, + UA_JSONDATASETMESSAGECONTENTMASK_METADATAVERSION = 2, + UA_JSONDATASETMESSAGECONTENTMASK_SEQUENCENUMBER = 4, + UA_JSONDATASETMESSAGECONTENTMASK_TIMESTAMP = 8, + UA_JSONDATASETMESSAGECONTENTMASK_STATUS = 16, + __UA_JSONDATASETMESSAGECONTENTMASK_FORCE32BIT = 0x7fffffff +} UA_JsonDataSetMessageContentMask; +UA_STATIC_ASSERT(sizeof(UA_JsonDataSetMessageContentMask) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_JSONDATASETMESSAGECONTENTMASK 42 + +/** + * JsonDataSetWriterMessageDataType + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_JsonDataSetMessageContentMask dataSetMessageContentMask; +} UA_JsonDataSetWriterMessageDataType; + +#define UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE 43 + +/** + * BrokerConnectionTransportDataType + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_String resourceUri; + UA_String authenticationProfileUri; +} UA_BrokerConnectionTransportDataType; + +#define UA_TYPES_BROKERCONNECTIONTRANSPORTDATATYPE 44 + +/** + * BrokerTransportQualityOfService + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef enum { + UA_BROKERTRANSPORTQUALITYOFSERVICE_NOTSPECIFIED = 0, + UA_BROKERTRANSPORTQUALITYOFSERVICE_BESTEFFORT = 1, + UA_BROKERTRANSPORTQUALITYOFSERVICE_ATLEASTONCE = 2, + UA_BROKERTRANSPORTQUALITYOFSERVICE_ATMOSTONCE = 3, + UA_BROKERTRANSPORTQUALITYOFSERVICE_EXACTLYONCE = 4, + __UA_BROKERTRANSPORTQUALITYOFSERVICE_FORCE32BIT = 0x7fffffff +} UA_BrokerTransportQualityOfService; +UA_STATIC_ASSERT(sizeof(UA_BrokerTransportQualityOfService) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_BROKERTRANSPORTQUALITYOFSERVICE 45 + +/** + * BrokerWriterGroupTransportDataType + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_String queueName; + UA_String resourceUri; + UA_String authenticationProfileUri; + UA_BrokerTransportQualityOfService requestedDeliveryGuarantee; +} UA_BrokerWriterGroupTransportDataType; + +#define UA_TYPES_BROKERWRITERGROUPTRANSPORTDATATYPE 46 + +/** + * BrokerDataSetWriterTransportDataType + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_String queueName; + UA_String resourceUri; + UA_String authenticationProfileUri; + UA_BrokerTransportQualityOfService requestedDeliveryGuarantee; + UA_String metaDataQueueName; + UA_Double metaDataUpdateTime; +} UA_BrokerDataSetWriterTransportDataType; + +#define UA_TYPES_BROKERDATASETWRITERTRANSPORTDATATYPE 47 + +/** + * NodeClass + * ^^^^^^^^^ + * A mask specifying the class of the node. */ +typedef enum { + UA_NODECLASS_UNSPECIFIED = 0, + UA_NODECLASS_OBJECT = 1, + UA_NODECLASS_VARIABLE = 2, + UA_NODECLASS_METHOD = 4, + UA_NODECLASS_OBJECTTYPE = 8, + UA_NODECLASS_VARIABLETYPE = 16, + UA_NODECLASS_REFERENCETYPE = 32, + UA_NODECLASS_DATATYPE = 64, + UA_NODECLASS_VIEW = 128, + __UA_NODECLASS_FORCE32BIT = 0x7fffffff +} UA_NodeClass; +UA_STATIC_ASSERT(sizeof(UA_NodeClass) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_NODECLASS 48 + +/** + * StructureType + * ^^^^^^^^^^^^^ + */ +typedef enum { + UA_STRUCTURETYPE_STRUCTURE = 0, + UA_STRUCTURETYPE_STRUCTUREWITHOPTIONALFIELDS = 1, + UA_STRUCTURETYPE_UNION = 2, + __UA_STRUCTURETYPE_FORCE32BIT = 0x7fffffff +} UA_StructureType; +UA_STATIC_ASSERT(sizeof(UA_StructureType) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_STRUCTURETYPE 49 + +/** + * StructureField + * ^^^^^^^^^^^^^^ + */ +typedef struct { + UA_String name; + UA_LocalizedText description; + UA_NodeId dataType; + UA_Int32 valueRank; + size_t arrayDimensionsSize; + UA_UInt32 *arrayDimensions; + UA_UInt32 maxStringLength; + UA_Boolean isOptional; +} UA_StructureField; + +#define UA_TYPES_STRUCTUREFIELD 50 + +/** + * StructureDefinition + * ^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_NodeId defaultEncodingId; + UA_NodeId baseDataType; + UA_StructureType structureType; + size_t fieldsSize; + UA_StructureField *fields; +} UA_StructureDefinition; + +#define UA_TYPES_STRUCTUREDEFINITION 51 + +/** + * Argument + * ^^^^^^^^ + * An argument for a method. */ +typedef struct { + UA_String name; + UA_NodeId dataType; + UA_Int32 valueRank; + size_t arrayDimensionsSize; + UA_UInt32 *arrayDimensions; + UA_LocalizedText description; +} UA_Argument; + +#define UA_TYPES_ARGUMENT 52 + +/** + * EnumValueType + * ^^^^^^^^^^^^^ + * A mapping between a value of an enumerated type and a name and description. */ +typedef struct { + UA_Int64 value; + UA_LocalizedText displayName; + UA_LocalizedText description; +} UA_EnumValueType; + +#define UA_TYPES_ENUMVALUETYPE 53 + +/** + * EnumField + * ^^^^^^^^^ + */ +typedef struct { + UA_Int64 value; + UA_LocalizedText displayName; + UA_LocalizedText description; + UA_String name; +} UA_EnumField; + +#define UA_TYPES_ENUMFIELD 54 + +/** + * Duration + * ^^^^^^^^ + * A period of time measured in milliseconds. */ +typedef UA_Double UA_Duration; + +#define UA_TYPES_DURATION 55 + +/** + * UtcTime + * ^^^^^^^ + * A date/time value specified in Universal Coordinated Time (UTC). */ +typedef UA_DateTime UA_UtcTime; + +#define UA_TYPES_UTCTIME 56 + +/** + * LocaleId + * ^^^^^^^^ + * An identifier for a user locale. */ +typedef UA_String UA_LocaleId; + +#define UA_TYPES_LOCALEID 57 + +/** + * ApplicationType + * ^^^^^^^^^^^^^^^ + * The types of applications. */ +typedef enum { + UA_APPLICATIONTYPE_SERVER = 0, + UA_APPLICATIONTYPE_CLIENT = 1, + UA_APPLICATIONTYPE_CLIENTANDSERVER = 2, + UA_APPLICATIONTYPE_DISCOVERYSERVER = 3, + __UA_APPLICATIONTYPE_FORCE32BIT = 0x7fffffff +} UA_ApplicationType; +UA_STATIC_ASSERT(sizeof(UA_ApplicationType) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_APPLICATIONTYPE 58 + +/** + * ApplicationDescription + * ^^^^^^^^^^^^^^^^^^^^^^ + * Describes an application and how to find it. */ +typedef struct { + UA_String applicationUri; + UA_String productUri; + UA_LocalizedText applicationName; + UA_ApplicationType applicationType; + UA_String gatewayServerUri; + UA_String discoveryProfileUri; + size_t discoveryUrlsSize; + UA_String *discoveryUrls; +} UA_ApplicationDescription; + +#define UA_TYPES_APPLICATIONDESCRIPTION 59 + +/** + * RequestHeader + * ^^^^^^^^^^^^^ + * The header passed with every server request. */ +typedef struct { + UA_NodeId authenticationToken; + UA_DateTime timestamp; + UA_UInt32 requestHandle; + UA_UInt32 returnDiagnostics; + UA_String auditEntryId; + UA_UInt32 timeoutHint; + UA_ExtensionObject additionalHeader; +} UA_RequestHeader; + +#define UA_TYPES_REQUESTHEADER 60 + +/** + * ResponseHeader + * ^^^^^^^^^^^^^^ + * The header passed with every server response. */ +typedef struct { + UA_DateTime timestamp; + UA_UInt32 requestHandle; + UA_StatusCode serviceResult; + UA_DiagnosticInfo serviceDiagnostics; + size_t stringTableSize; + UA_String *stringTable; + UA_ExtensionObject additionalHeader; +} UA_ResponseHeader; + +#define UA_TYPES_RESPONSEHEADER 61 + +/** + * ServiceFault + * ^^^^^^^^^^^^ + * The response returned by all services when there is a service level error. */ +typedef struct { + UA_ResponseHeader responseHeader; +} UA_ServiceFault; + +#define UA_TYPES_SERVICEFAULT 62 + +/** + * FindServersRequest + * ^^^^^^^^^^^^^^^^^^ + * Finds the servers known to the discovery server. */ +typedef struct { + UA_RequestHeader requestHeader; + UA_String endpointUrl; + size_t localeIdsSize; + UA_String *localeIds; + size_t serverUrisSize; + UA_String *serverUris; +} UA_FindServersRequest; + +#define UA_TYPES_FINDSERVERSREQUEST 63 + +/** + * FindServersResponse + * ^^^^^^^^^^^^^^^^^^^ + * Finds the servers known to the discovery server. */ +typedef struct { + UA_ResponseHeader responseHeader; + size_t serversSize; + UA_ApplicationDescription *servers; +} UA_FindServersResponse; + +#define UA_TYPES_FINDSERVERSRESPONSE 64 + +/** + * ServerOnNetwork + * ^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_UInt32 recordId; + UA_String serverName; + UA_String discoveryUrl; + size_t serverCapabilitiesSize; + UA_String *serverCapabilities; +} UA_ServerOnNetwork; + +#define UA_TYPES_SERVERONNETWORK 65 + +/** + * FindServersOnNetworkRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_RequestHeader requestHeader; + UA_UInt32 startingRecordId; + UA_UInt32 maxRecordsToReturn; + size_t serverCapabilityFilterSize; + UA_String *serverCapabilityFilter; +} UA_FindServersOnNetworkRequest; + +#define UA_TYPES_FINDSERVERSONNETWORKREQUEST 66 + +/** + * FindServersOnNetworkResponse + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_ResponseHeader responseHeader; + UA_DateTime lastCounterResetTime; + size_t serversSize; + UA_ServerOnNetwork *servers; +} UA_FindServersOnNetworkResponse; + +#define UA_TYPES_FINDSERVERSONNETWORKRESPONSE 67 + +/** + * MessageSecurityMode + * ^^^^^^^^^^^^^^^^^^^ + * The type of security to use on a message. */ +typedef enum { + UA_MESSAGESECURITYMODE_INVALID = 0, + UA_MESSAGESECURITYMODE_NONE = 1, + UA_MESSAGESECURITYMODE_SIGN = 2, + UA_MESSAGESECURITYMODE_SIGNANDENCRYPT = 3, + __UA_MESSAGESECURITYMODE_FORCE32BIT = 0x7fffffff +} UA_MessageSecurityMode; +UA_STATIC_ASSERT(sizeof(UA_MessageSecurityMode) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_MESSAGESECURITYMODE 68 + +/** + * UserTokenType + * ^^^^^^^^^^^^^ + * The possible user token types. */ +typedef enum { + UA_USERTOKENTYPE_ANONYMOUS = 0, + UA_USERTOKENTYPE_USERNAME = 1, + UA_USERTOKENTYPE_CERTIFICATE = 2, + UA_USERTOKENTYPE_ISSUEDTOKEN = 3, + __UA_USERTOKENTYPE_FORCE32BIT = 0x7fffffff +} UA_UserTokenType; +UA_STATIC_ASSERT(sizeof(UA_UserTokenType) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_USERTOKENTYPE 69 + +/** + * UserTokenPolicy + * ^^^^^^^^^^^^^^^ + * Describes a user token that can be used with a server. */ +typedef struct { + UA_String policyId; + UA_UserTokenType tokenType; + UA_String issuedTokenType; + UA_String issuerEndpointUrl; + UA_String securityPolicyUri; +} UA_UserTokenPolicy; + +#define UA_TYPES_USERTOKENPOLICY 70 + +/** + * EndpointDescription + * ^^^^^^^^^^^^^^^^^^^ + * The description of a endpoint that can be used to access a server. */ +typedef struct { + UA_String endpointUrl; + UA_ApplicationDescription server; + UA_ByteString serverCertificate; + UA_MessageSecurityMode securityMode; + UA_String securityPolicyUri; + size_t userIdentityTokensSize; + UA_UserTokenPolicy *userIdentityTokens; + UA_String transportProfileUri; + UA_Byte securityLevel; +} UA_EndpointDescription; + +#define UA_TYPES_ENDPOINTDESCRIPTION 71 + +/** + * GetEndpointsRequest + * ^^^^^^^^^^^^^^^^^^^ + * Gets the endpoints used by the server. */ +typedef struct { + UA_RequestHeader requestHeader; + UA_String endpointUrl; + size_t localeIdsSize; + UA_String *localeIds; + size_t profileUrisSize; + UA_String *profileUris; +} UA_GetEndpointsRequest; + +#define UA_TYPES_GETENDPOINTSREQUEST 72 + +/** + * GetEndpointsResponse + * ^^^^^^^^^^^^^^^^^^^^ + * Gets the endpoints used by the server. */ +typedef struct { + UA_ResponseHeader responseHeader; + size_t endpointsSize; + UA_EndpointDescription *endpoints; +} UA_GetEndpointsResponse; + +#define UA_TYPES_GETENDPOINTSRESPONSE 73 + +/** + * RegisteredServer + * ^^^^^^^^^^^^^^^^ + * The information required to register a server with a discovery server. */ +typedef struct { + UA_String serverUri; + UA_String productUri; + size_t serverNamesSize; + UA_LocalizedText *serverNames; + UA_ApplicationType serverType; + UA_String gatewayServerUri; + size_t discoveryUrlsSize; + UA_String *discoveryUrls; + UA_String semaphoreFilePath; + UA_Boolean isOnline; +} UA_RegisteredServer; + +#define UA_TYPES_REGISTEREDSERVER 74 + +/** + * RegisterServerRequest + * ^^^^^^^^^^^^^^^^^^^^^ + * Registers a server with the discovery server. */ +typedef struct { + UA_RequestHeader requestHeader; + UA_RegisteredServer server; +} UA_RegisterServerRequest; + +#define UA_TYPES_REGISTERSERVERREQUEST 75 + +/** + * RegisterServerResponse + * ^^^^^^^^^^^^^^^^^^^^^^ + * Registers a server with the discovery server. */ +typedef struct { + UA_ResponseHeader responseHeader; +} UA_RegisterServerResponse; + +#define UA_TYPES_REGISTERSERVERRESPONSE 76 + +/** + * DiscoveryConfiguration + * ^^^^^^^^^^^^^^^^^^^^^^ + * A base type for discovery configuration information. */ +typedef void * UA_DiscoveryConfiguration; + +#define UA_TYPES_DISCOVERYCONFIGURATION 77 + +/** + * MdnsDiscoveryConfiguration + * ^^^^^^^^^^^^^^^^^^^^^^^^^^ + * The discovery information needed for mDNS registration. */ +typedef struct { + UA_String mdnsServerName; + size_t serverCapabilitiesSize; + UA_String *serverCapabilities; +} UA_MdnsDiscoveryConfiguration; + +#define UA_TYPES_MDNSDISCOVERYCONFIGURATION 78 + +/** + * RegisterServer2Request + * ^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_RequestHeader requestHeader; + UA_RegisteredServer server; + size_t discoveryConfigurationSize; + UA_ExtensionObject *discoveryConfiguration; +} UA_RegisterServer2Request; + +#define UA_TYPES_REGISTERSERVER2REQUEST 79 + +/** + * RegisterServer2Response + * ^^^^^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_ResponseHeader responseHeader; + size_t configurationResultsSize; + UA_StatusCode *configurationResults; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_RegisterServer2Response; + +#define UA_TYPES_REGISTERSERVER2RESPONSE 80 + +/** + * SecurityTokenRequestType + * ^^^^^^^^^^^^^^^^^^^^^^^^ + * Indicates whether a token if being created or renewed. */ +typedef enum { + UA_SECURITYTOKENREQUESTTYPE_ISSUE = 0, + UA_SECURITYTOKENREQUESTTYPE_RENEW = 1, + __UA_SECURITYTOKENREQUESTTYPE_FORCE32BIT = 0x7fffffff +} UA_SecurityTokenRequestType; +UA_STATIC_ASSERT(sizeof(UA_SecurityTokenRequestType) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_SECURITYTOKENREQUESTTYPE 81 + +/** + * ChannelSecurityToken + * ^^^^^^^^^^^^^^^^^^^^ + * The token that identifies a set of keys for an active secure channel. */ +typedef struct { + UA_UInt32 channelId; + UA_UInt32 tokenId; + UA_DateTime createdAt; + UA_UInt32 revisedLifetime; +} UA_ChannelSecurityToken; + +#define UA_TYPES_CHANNELSECURITYTOKEN 82 + +/** + * OpenSecureChannelRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^ + * Creates a secure channel with a server. */ +typedef struct { + UA_RequestHeader requestHeader; + UA_UInt32 clientProtocolVersion; + UA_SecurityTokenRequestType requestType; + UA_MessageSecurityMode securityMode; + UA_ByteString clientNonce; + UA_UInt32 requestedLifetime; +} UA_OpenSecureChannelRequest; + +#define UA_TYPES_OPENSECURECHANNELREQUEST 83 + +/** + * OpenSecureChannelResponse + * ^^^^^^^^^^^^^^^^^^^^^^^^^ + * Creates a secure channel with a server. */ +typedef struct { + UA_ResponseHeader responseHeader; + UA_UInt32 serverProtocolVersion; + UA_ChannelSecurityToken securityToken; + UA_ByteString serverNonce; +} UA_OpenSecureChannelResponse; + +#define UA_TYPES_OPENSECURECHANNELRESPONSE 84 + +/** + * CloseSecureChannelRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^^ + * Closes a secure channel. */ +typedef struct { + UA_RequestHeader requestHeader; +} UA_CloseSecureChannelRequest; + +#define UA_TYPES_CLOSESECURECHANNELREQUEST 85 + +/** + * CloseSecureChannelResponse + * ^^^^^^^^^^^^^^^^^^^^^^^^^^ + * Closes a secure channel. */ +typedef struct { + UA_ResponseHeader responseHeader; +} UA_CloseSecureChannelResponse; + +#define UA_TYPES_CLOSESECURECHANNELRESPONSE 86 + +/** + * SignedSoftwareCertificate + * ^^^^^^^^^^^^^^^^^^^^^^^^^ + * A software certificate with a digital signature. */ +typedef struct { + UA_ByteString certificateData; + UA_ByteString signature; +} UA_SignedSoftwareCertificate; + +#define UA_TYPES_SIGNEDSOFTWARECERTIFICATE 87 + +/** + * SignatureData + * ^^^^^^^^^^^^^ + * A digital signature. */ +typedef struct { + UA_String algorithm; + UA_ByteString signature; +} UA_SignatureData; + +#define UA_TYPES_SIGNATUREDATA 88 + +/** + * CreateSessionRequest + * ^^^^^^^^^^^^^^^^^^^^ + * Creates a new session with the server. */ +typedef struct { + UA_RequestHeader requestHeader; + UA_ApplicationDescription clientDescription; + UA_String serverUri; + UA_String endpointUrl; + UA_String sessionName; + UA_ByteString clientNonce; + UA_ByteString clientCertificate; + UA_Double requestedSessionTimeout; + UA_UInt32 maxResponseMessageSize; +} UA_CreateSessionRequest; + +#define UA_TYPES_CREATESESSIONREQUEST 89 + +/** + * CreateSessionResponse + * ^^^^^^^^^^^^^^^^^^^^^ + * Creates a new session with the server. */ +typedef struct { + UA_ResponseHeader responseHeader; + UA_NodeId sessionId; + UA_NodeId authenticationToken; + UA_Double revisedSessionTimeout; + UA_ByteString serverNonce; + UA_ByteString serverCertificate; + size_t serverEndpointsSize; + UA_EndpointDescription *serverEndpoints; + size_t serverSoftwareCertificatesSize; + UA_SignedSoftwareCertificate *serverSoftwareCertificates; + UA_SignatureData serverSignature; + UA_UInt32 maxRequestMessageSize; +} UA_CreateSessionResponse; + +#define UA_TYPES_CREATESESSIONRESPONSE 90 + +/** + * UserIdentityToken + * ^^^^^^^^^^^^^^^^^ + * A base type for a user identity token. */ +typedef struct { + UA_String policyId; +} UA_UserIdentityToken; + +#define UA_TYPES_USERIDENTITYTOKEN 91 + +/** + * AnonymousIdentityToken + * ^^^^^^^^^^^^^^^^^^^^^^ + * A token representing an anonymous user. */ +typedef struct { + UA_String policyId; +} UA_AnonymousIdentityToken; + +#define UA_TYPES_ANONYMOUSIDENTITYTOKEN 92 + +/** + * UserNameIdentityToken + * ^^^^^^^^^^^^^^^^^^^^^ + * A token representing a user identified by a user name and password. */ +typedef struct { + UA_String policyId; + UA_String userName; + UA_ByteString password; + UA_String encryptionAlgorithm; +} UA_UserNameIdentityToken; + +#define UA_TYPES_USERNAMEIDENTITYTOKEN 93 + +/** + * X509IdentityToken + * ^^^^^^^^^^^^^^^^^ + * A token representing a user identified by an X509 certificate. */ +typedef struct { + UA_String policyId; + UA_ByteString certificateData; +} UA_X509IdentityToken; + +#define UA_TYPES_X509IDENTITYTOKEN 94 + +/** + * IssuedIdentityToken + * ^^^^^^^^^^^^^^^^^^^ + * A token representing a user identified by a WS-Security XML token. */ +typedef struct { + UA_String policyId; + UA_ByteString tokenData; + UA_String encryptionAlgorithm; +} UA_IssuedIdentityToken; + +#define UA_TYPES_ISSUEDIDENTITYTOKEN 95 + +/** + * ActivateSessionRequest + * ^^^^^^^^^^^^^^^^^^^^^^ + * Activates a session with the server. */ +typedef struct { + UA_RequestHeader requestHeader; + UA_SignatureData clientSignature; + size_t clientSoftwareCertificatesSize; + UA_SignedSoftwareCertificate *clientSoftwareCertificates; + size_t localeIdsSize; + UA_String *localeIds; + UA_ExtensionObject userIdentityToken; + UA_SignatureData userTokenSignature; +} UA_ActivateSessionRequest; + +#define UA_TYPES_ACTIVATESESSIONREQUEST 96 + +/** + * ActivateSessionResponse + * ^^^^^^^^^^^^^^^^^^^^^^^ + * Activates a session with the server. */ +typedef struct { + UA_ResponseHeader responseHeader; + UA_ByteString serverNonce; + size_t resultsSize; + UA_StatusCode *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_ActivateSessionResponse; + +#define UA_TYPES_ACTIVATESESSIONRESPONSE 97 + +/** + * CloseSessionRequest + * ^^^^^^^^^^^^^^^^^^^ + * Closes a session with the server. */ +typedef struct { + UA_RequestHeader requestHeader; + UA_Boolean deleteSubscriptions; +} UA_CloseSessionRequest; + +#define UA_TYPES_CLOSESESSIONREQUEST 98 + +/** + * CloseSessionResponse + * ^^^^^^^^^^^^^^^^^^^^ + * Closes a session with the server. */ +typedef struct { + UA_ResponseHeader responseHeader; +} UA_CloseSessionResponse; + +#define UA_TYPES_CLOSESESSIONRESPONSE 99 + +/** + * NodeAttributesMask + * ^^^^^^^^^^^^^^^^^^ + * The bits used to specify default attributes for a new node. */ +typedef enum { + UA_NODEATTRIBUTESMASK_NONE = 0, + UA_NODEATTRIBUTESMASK_ACCESSLEVEL = 1, + UA_NODEATTRIBUTESMASK_ARRAYDIMENSIONS = 2, + UA_NODEATTRIBUTESMASK_BROWSENAME = 4, + UA_NODEATTRIBUTESMASK_CONTAINSNOLOOPS = 8, + UA_NODEATTRIBUTESMASK_DATATYPE = 16, + UA_NODEATTRIBUTESMASK_DESCRIPTION = 32, + UA_NODEATTRIBUTESMASK_DISPLAYNAME = 64, + UA_NODEATTRIBUTESMASK_EVENTNOTIFIER = 128, + UA_NODEATTRIBUTESMASK_EXECUTABLE = 256, + UA_NODEATTRIBUTESMASK_HISTORIZING = 512, + UA_NODEATTRIBUTESMASK_INVERSENAME = 1024, + UA_NODEATTRIBUTESMASK_ISABSTRACT = 2048, + UA_NODEATTRIBUTESMASK_MINIMUMSAMPLINGINTERVAL = 4096, + UA_NODEATTRIBUTESMASK_NODECLASS = 8192, + UA_NODEATTRIBUTESMASK_NODEID = 16384, + UA_NODEATTRIBUTESMASK_SYMMETRIC = 32768, + UA_NODEATTRIBUTESMASK_USERACCESSLEVEL = 65536, + UA_NODEATTRIBUTESMASK_USEREXECUTABLE = 131072, + UA_NODEATTRIBUTESMASK_USERWRITEMASK = 262144, + UA_NODEATTRIBUTESMASK_VALUERANK = 524288, + UA_NODEATTRIBUTESMASK_WRITEMASK = 1048576, + UA_NODEATTRIBUTESMASK_VALUE = 2097152, + UA_NODEATTRIBUTESMASK_DATATYPEDEFINITION = 4194304, + UA_NODEATTRIBUTESMASK_ROLEPERMISSIONS = 8388608, + UA_NODEATTRIBUTESMASK_ACCESSRESTRICTIONS = 16777216, + UA_NODEATTRIBUTESMASK_ALL = 33554431, + UA_NODEATTRIBUTESMASK_BASENODE = 26501220, + UA_NODEATTRIBUTESMASK_OBJECT = 26501348, + UA_NODEATTRIBUTESMASK_OBJECTTYPE = 26503268, + UA_NODEATTRIBUTESMASK_VARIABLE = 26571383, + UA_NODEATTRIBUTESMASK_VARIABLETYPE = 28600438, + UA_NODEATTRIBUTESMASK_METHOD = 26632548, + UA_NODEATTRIBUTESMASK_REFERENCETYPE = 26537060, + UA_NODEATTRIBUTESMASK_VIEW = 26501356, + __UA_NODEATTRIBUTESMASK_FORCE32BIT = 0x7fffffff +} UA_NodeAttributesMask; +UA_STATIC_ASSERT(sizeof(UA_NodeAttributesMask) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_NODEATTRIBUTESMASK 100 /** - * Deprecated Data Types API - * ------------------------- - * The following definitions are deprecated and will be removed in future - * releases of open62541. */ - + * NodeAttributes + * ^^^^^^^^^^^^^^ + * The base attributes for all nodes. */ typedef struct { - UA_StatusCode code; /* The numeric value of the StatusCode */ - const char* name; /* The symbolic name */ - const char* explanation; /* Short message explaining the StatusCode */ -} UA_StatusCodeDescription; + UA_UInt32 specifiedAttributes; + UA_LocalizedText displayName; + UA_LocalizedText description; + UA_UInt32 writeMask; + UA_UInt32 userWriteMask; +} UA_NodeAttributes; -UA_EXPORT extern const UA_StatusCodeDescription statusCodeExplanation_default; +#define UA_TYPES_NODEATTRIBUTES 101 -UA_DEPRECATED static UA_INLINE const UA_StatusCodeDescription * -UA_StatusCode_description(UA_StatusCode code) { - return &statusCodeExplanation_default; -} +/** + * ObjectAttributes + * ^^^^^^^^^^^^^^^^ + * The attributes for an object node. */ +typedef struct { + UA_UInt32 specifiedAttributes; + UA_LocalizedText displayName; + UA_LocalizedText description; + UA_UInt32 writeMask; + UA_UInt32 userWriteMask; + UA_Byte eventNotifier; +} UA_ObjectAttributes; -UA_DEPRECATED static UA_INLINE const char * -UA_StatusCode_explanation(UA_StatusCode code) { - return statusCodeExplanation_default.name; -} +#define UA_TYPES_OBJECTATTRIBUTES 102 -UA_DEPRECATED UA_String -UA_DateTime_toString(UA_DateTime t); +/** + * VariableAttributes + * ^^^^^^^^^^^^^^^^^^ + * The attributes for a variable node. */ +typedef struct { + UA_UInt32 specifiedAttributes; + UA_LocalizedText displayName; + UA_LocalizedText description; + UA_UInt32 writeMask; + UA_UInt32 userWriteMask; + UA_Variant value; + UA_NodeId dataType; + UA_Int32 valueRank; + size_t arrayDimensionsSize; + UA_UInt32 *arrayDimensions; + UA_Byte accessLevel; + UA_Byte userAccessLevel; + UA_Double minimumSamplingInterval; + UA_Boolean historizing; +} UA_VariableAttributes; -/* The old DateTime conversion macros */ -UA_DEPRECATED static UA_INLINE double -deprecatedDateTimeMultiple(double multiple) { - return multiple; -} +#define UA_TYPES_VARIABLEATTRIBUTES 103 -#define UA_USEC_TO_DATETIME deprecatedDateTimeMultiple((UA_Double)UA_DATETIME_USEC) -#define UA_MSEC_TO_DATETIME deprecatedDateTimeMultiple((UA_Double)UA_DATETIME_MSEC) -#define UA_SEC_TO_DATETIME deprecatedDateTimeMultiple((UA_Double)UA_DATETIME_SEC) -#define UA_DATETIME_TO_USEC deprecatedDateTimeMultiple(1.0 / ((UA_Double)UA_DATETIME_USEC)) -#define UA_DATETIME_TO_MSEC deprecatedDateTimeMultiple(1.0 / ((UA_Double)UA_DATETIME_MSEC)) -#define UA_DATETIME_TO_SEC deprecatedDateTimeMultiple(1.0 / ((UA_Double)UA_DATETIME_SEC)) +/** + * MethodAttributes + * ^^^^^^^^^^^^^^^^ + * The attributes for a method node. */ +typedef struct { + UA_UInt32 specifiedAttributes; + UA_LocalizedText displayName; + UA_LocalizedText description; + UA_UInt32 writeMask; + UA_UInt32 userWriteMask; + UA_Boolean executable; + UA_Boolean userExecutable; +} UA_MethodAttributes; -#ifdef __cplusplus -} // extern "C" -#endif +#define UA_TYPES_METHODATTRIBUTES 104 +/** + * ObjectTypeAttributes + * ^^^^^^^^^^^^^^^^^^^^ + * The attributes for an object type node. */ +typedef struct { + UA_UInt32 specifiedAttributes; + UA_LocalizedText displayName; + UA_LocalizedText description; + UA_UInt32 writeMask; + UA_UInt32 userWriteMask; + UA_Boolean isAbstract; +} UA_ObjectTypeAttributes; -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/build/src_generated/ua_types_generated.h" ***********************************/ +#define UA_TYPES_OBJECTTYPEATTRIBUTES 105 -/* Generated from Opc.Ua.Types.bsd with script /home/travis/build/open62541/open62541/tools/generate_datatypes.py - * on host travis-job-193db498-e14a-4886-911f-7172c9e50b7a by user travis at 2018-12-19 02:29:43 */ +/** + * VariableTypeAttributes + * ^^^^^^^^^^^^^^^^^^^^^^ + * The attributes for a variable type node. */ +typedef struct { + UA_UInt32 specifiedAttributes; + UA_LocalizedText displayName; + UA_LocalizedText description; + UA_UInt32 writeMask; + UA_UInt32 userWriteMask; + UA_Variant value; + UA_NodeId dataType; + UA_Int32 valueRank; + size_t arrayDimensionsSize; + UA_UInt32 *arrayDimensions; + UA_Boolean isAbstract; +} UA_VariableTypeAttributes; +#define UA_TYPES_VARIABLETYPEATTRIBUTES 106 -#ifdef __cplusplus -extern "C" { -#endif +/** + * ReferenceTypeAttributes + * ^^^^^^^^^^^^^^^^^^^^^^^ + * The attributes for a reference type node. */ +typedef struct { + UA_UInt32 specifiedAttributes; + UA_LocalizedText displayName; + UA_LocalizedText description; + UA_UInt32 writeMask; + UA_UInt32 userWriteMask; + UA_Boolean isAbstract; + UA_Boolean symmetric; + UA_LocalizedText inverseName; +} UA_ReferenceTypeAttributes; -#ifdef UA_NO_AMALGAMATION +#define UA_TYPES_REFERENCETYPEATTRIBUTES 107 -#else -#endif +/** + * DataTypeAttributes + * ^^^^^^^^^^^^^^^^^^ + * The attributes for a data type node. */ +typedef struct { + UA_UInt32 specifiedAttributes; + UA_LocalizedText displayName; + UA_LocalizedText description; + UA_UInt32 writeMask; + UA_UInt32 userWriteMask; + UA_Boolean isAbstract; +} UA_DataTypeAttributes; +#define UA_TYPES_DATATYPEATTRIBUTES 108 /** - * Every type is assigned an index in an array containing the type descriptions. - * These descriptions are used during type handling (copying, deletion, - * binary encoding, ...). */ -#define UA_TYPES_COUNT 199 -extern UA_EXPORT const UA_DataType UA_TYPES[UA_TYPES_COUNT]; + * ViewAttributes + * ^^^^^^^^^^^^^^ + * The attributes for a view node. */ +typedef struct { + UA_UInt32 specifiedAttributes; + UA_LocalizedText displayName; + UA_LocalizedText description; + UA_UInt32 writeMask; + UA_UInt32 userWriteMask; + UA_Boolean containsNoLoops; + UA_Byte eventNotifier; +} UA_ViewAttributes; -/** - * Boolean - * ^^^^^^^ - */ -#define UA_TYPES_BOOLEAN 0 +#define UA_TYPES_VIEWATTRIBUTES 109 /** - * SByte - * ^^^^^ - */ -#define UA_TYPES_SBYTE 1 + * AddNodesItem + * ^^^^^^^^^^^^ + * A request to add a node to the server address space. */ +typedef struct { + UA_ExpandedNodeId parentNodeId; + UA_NodeId referenceTypeId; + UA_ExpandedNodeId requestedNewNodeId; + UA_QualifiedName browseName; + UA_NodeClass nodeClass; + UA_ExtensionObject nodeAttributes; + UA_ExpandedNodeId typeDefinition; +} UA_AddNodesItem; -/** - * Byte - * ^^^^ - */ -#define UA_TYPES_BYTE 2 +#define UA_TYPES_ADDNODESITEM 110 /** - * Int16 - * ^^^^^ - */ -#define UA_TYPES_INT16 3 + * AddNodesResult + * ^^^^^^^^^^^^^^ + * A result of an add node operation. */ +typedef struct { + UA_StatusCode statusCode; + UA_NodeId addedNodeId; +} UA_AddNodesResult; -/** - * UInt16 - * ^^^^^^ - */ -#define UA_TYPES_UINT16 4 +#define UA_TYPES_ADDNODESRESULT 111 /** - * Int32 - * ^^^^^ - */ -#define UA_TYPES_INT32 5 + * AddNodesRequest + * ^^^^^^^^^^^^^^^ + * Adds one or more nodes to the server address space. */ +typedef struct { + UA_RequestHeader requestHeader; + size_t nodesToAddSize; + UA_AddNodesItem *nodesToAdd; +} UA_AddNodesRequest; -/** - * UInt32 - * ^^^^^^ - */ -#define UA_TYPES_UINT32 6 +#define UA_TYPES_ADDNODESREQUEST 112 /** - * Int64 - * ^^^^^ - */ -#define UA_TYPES_INT64 7 + * AddNodesResponse + * ^^^^^^^^^^^^^^^^ + * Adds one or more nodes to the server address space. */ +typedef struct { + UA_ResponseHeader responseHeader; + size_t resultsSize; + UA_AddNodesResult *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_AddNodesResponse; -/** - * UInt64 - * ^^^^^^ - */ -#define UA_TYPES_UINT64 8 +#define UA_TYPES_ADDNODESRESPONSE 113 /** - * Float - * ^^^^^ - */ -#define UA_TYPES_FLOAT 9 + * AddReferencesItem + * ^^^^^^^^^^^^^^^^^ + * A request to add a reference to the server address space. */ +typedef struct { + UA_NodeId sourceNodeId; + UA_NodeId referenceTypeId; + UA_Boolean isForward; + UA_String targetServerUri; + UA_ExpandedNodeId targetNodeId; + UA_NodeClass targetNodeClass; +} UA_AddReferencesItem; -/** - * Double - * ^^^^^^ - */ -#define UA_TYPES_DOUBLE 10 +#define UA_TYPES_ADDREFERENCESITEM 114 /** - * String - * ^^^^^^ - */ -#define UA_TYPES_STRING 11 + * AddReferencesRequest + * ^^^^^^^^^^^^^^^^^^^^ + * Adds one or more references to the server address space. */ +typedef struct { + UA_RequestHeader requestHeader; + size_t referencesToAddSize; + UA_AddReferencesItem *referencesToAdd; +} UA_AddReferencesRequest; -/** - * DateTime - * ^^^^^^^^ - */ -#define UA_TYPES_DATETIME 12 +#define UA_TYPES_ADDREFERENCESREQUEST 115 /** - * Guid - * ^^^^ - */ -#define UA_TYPES_GUID 13 + * AddReferencesResponse + * ^^^^^^^^^^^^^^^^^^^^^ + * Adds one or more references to the server address space. */ +typedef struct { + UA_ResponseHeader responseHeader; + size_t resultsSize; + UA_StatusCode *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_AddReferencesResponse; -/** - * ByteString - * ^^^^^^^^^^ - */ -#define UA_TYPES_BYTESTRING 14 +#define UA_TYPES_ADDREFERENCESRESPONSE 116 /** - * XmlElement - * ^^^^^^^^^^ - */ -#define UA_TYPES_XMLELEMENT 15 + * DeleteNodesItem + * ^^^^^^^^^^^^^^^ + * A request to delete a node to the server address space. */ +typedef struct { + UA_NodeId nodeId; + UA_Boolean deleteTargetReferences; +} UA_DeleteNodesItem; -/** - * NodeId - * ^^^^^^ - */ -#define UA_TYPES_NODEID 16 +#define UA_TYPES_DELETENODESITEM 117 /** - * ExpandedNodeId - * ^^^^^^^^^^^^^^ - */ -#define UA_TYPES_EXPANDEDNODEID 17 + * DeleteNodesRequest + * ^^^^^^^^^^^^^^^^^^ + * Delete one or more nodes from the server address space. */ +typedef struct { + UA_RequestHeader requestHeader; + size_t nodesToDeleteSize; + UA_DeleteNodesItem *nodesToDelete; +} UA_DeleteNodesRequest; -/** - * StatusCode - * ^^^^^^^^^^ - */ -#define UA_TYPES_STATUSCODE 18 +#define UA_TYPES_DELETENODESREQUEST 118 /** - * QualifiedName - * ^^^^^^^^^^^^^ - */ -#define UA_TYPES_QUALIFIEDNAME 19 + * DeleteNodesResponse + * ^^^^^^^^^^^^^^^^^^^ + * Delete one or more nodes from the server address space. */ +typedef struct { + UA_ResponseHeader responseHeader; + size_t resultsSize; + UA_StatusCode *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_DeleteNodesResponse; -/** - * LocalizedText - * ^^^^^^^^^^^^^ - */ -#define UA_TYPES_LOCALIZEDTEXT 20 +#define UA_TYPES_DELETENODESRESPONSE 119 /** - * ExtensionObject - * ^^^^^^^^^^^^^^^ - */ -#define UA_TYPES_EXTENSIONOBJECT 21 + * DeleteReferencesItem + * ^^^^^^^^^^^^^^^^^^^^ + * A request to delete a node from the server address space. */ +typedef struct { + UA_NodeId sourceNodeId; + UA_NodeId referenceTypeId; + UA_Boolean isForward; + UA_ExpandedNodeId targetNodeId; + UA_Boolean deleteBidirectional; +} UA_DeleteReferencesItem; -/** - * DataValue - * ^^^^^^^^^ - */ -#define UA_TYPES_DATAVALUE 22 +#define UA_TYPES_DELETEREFERENCESITEM 120 /** - * Variant - * ^^^^^^^ - */ -#define UA_TYPES_VARIANT 23 + * DeleteReferencesRequest + * ^^^^^^^^^^^^^^^^^^^^^^^ + * Delete one or more references from the server address space. */ +typedef struct { + UA_RequestHeader requestHeader; + size_t referencesToDeleteSize; + UA_DeleteReferencesItem *referencesToDelete; +} UA_DeleteReferencesRequest; -/** - * DiagnosticInfo - * ^^^^^^^^^^^^^^ - */ -#define UA_TYPES_DIAGNOSTICINFO 24 +#define UA_TYPES_DELETEREFERENCESREQUEST 121 /** - * SignedSoftwareCertificate - * ^^^^^^^^^^^^^^^^^^^^^^^^^ - * A software certificate with a digital signature. */ + * DeleteReferencesResponse + * ^^^^^^^^^^^^^^^^^^^^^^^^ + * Delete one or more references from the server address space. */ typedef struct { - UA_ByteString certificateData; - UA_ByteString signature; -} UA_SignedSoftwareCertificate; + UA_ResponseHeader responseHeader; + size_t resultsSize; + UA_StatusCode *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_DeleteReferencesResponse; -#define UA_TYPES_SIGNEDSOFTWARECERTIFICATE 25 +#define UA_TYPES_DELETEREFERENCESRESPONSE 122 /** - * SemanticChangeStructureDataType - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - */ + * BrowseDirection + * ^^^^^^^^^^^^^^^ + * The directions of the references to return. */ +typedef enum { + UA_BROWSEDIRECTION_FORWARD = 0, + UA_BROWSEDIRECTION_INVERSE = 1, + UA_BROWSEDIRECTION_BOTH = 2, + UA_BROWSEDIRECTION_INVALID = 3, + __UA_BROWSEDIRECTION_FORCE32BIT = 0x7fffffff +} UA_BrowseDirection; +UA_STATIC_ASSERT(sizeof(UA_BrowseDirection) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_BROWSEDIRECTION 123 + +/** + * ViewDescription + * ^^^^^^^^^^^^^^^ + * The view to browse. */ typedef struct { - UA_NodeId affected; - UA_NodeId affectedType; -} UA_SemanticChangeStructureDataType; + UA_NodeId viewId; + UA_DateTime timestamp; + UA_UInt32 viewVersion; +} UA_ViewDescription; -#define UA_TYPES_SEMANTICCHANGESTRUCTUREDATATYPE 26 +#define UA_TYPES_VIEWDESCRIPTION 124 /** - * StatusChangeNotification - * ^^^^^^^^^^^^^^^^^^^^^^^^ - */ + * BrowseDescription + * ^^^^^^^^^^^^^^^^^ + * A request to browse the the references from a node. */ typedef struct { - UA_StatusCode status; - UA_DiagnosticInfo diagnosticInfo; -} UA_StatusChangeNotification; + UA_NodeId nodeId; + UA_BrowseDirection browseDirection; + UA_NodeId referenceTypeId; + UA_Boolean includeSubtypes; + UA_UInt32 nodeClassMask; + UA_UInt32 resultMask; +} UA_BrowseDescription; -#define UA_TYPES_STATUSCHANGENOTIFICATION 27 +#define UA_TYPES_BROWSEDESCRIPTION 125 /** - * BrowsePathTarget + * BrowseResultMask * ^^^^^^^^^^^^^^^^ - * The target of the translated path. */ -typedef struct { - UA_ExpandedNodeId targetId; - UA_UInt32 remainingPathIndex; -} UA_BrowsePathTarget; + * A bit mask which specifies what should be returned in a browse response. */ +typedef enum { + UA_BROWSERESULTMASK_NONE = 0, + UA_BROWSERESULTMASK_REFERENCETYPEID = 1, + UA_BROWSERESULTMASK_ISFORWARD = 2, + UA_BROWSERESULTMASK_NODECLASS = 4, + UA_BROWSERESULTMASK_BROWSENAME = 8, + UA_BROWSERESULTMASK_DISPLAYNAME = 16, + UA_BROWSERESULTMASK_TYPEDEFINITION = 32, + UA_BROWSERESULTMASK_ALL = 63, + UA_BROWSERESULTMASK_REFERENCETYPEINFO = 3, + UA_BROWSERESULTMASK_TARGETINFO = 60, + __UA_BROWSERESULTMASK_FORCE32BIT = 0x7fffffff +} UA_BrowseResultMask; +UA_STATIC_ASSERT(sizeof(UA_BrowseResultMask) == sizeof(UA_Int32), enum_must_be_32bit); -#define UA_TYPES_BROWSEPATHTARGET 28 +#define UA_TYPES_BROWSERESULTMASK 126 /** - * ViewAttributes - * ^^^^^^^^^^^^^^ - * The attributes for a view node. */ + * ReferenceDescription + * ^^^^^^^^^^^^^^^^^^^^ + * The description of a reference. */ typedef struct { - UA_UInt32 specifiedAttributes; + UA_NodeId referenceTypeId; + UA_Boolean isForward; + UA_ExpandedNodeId nodeId; + UA_QualifiedName browseName; UA_LocalizedText displayName; - UA_LocalizedText description; - UA_UInt32 writeMask; - UA_UInt32 userWriteMask; - UA_Boolean containsNoLoops; - UA_Byte eventNotifier; -} UA_ViewAttributes; + UA_NodeClass nodeClass; + UA_ExpandedNodeId typeDefinition; +} UA_ReferenceDescription; -#define UA_TYPES_VIEWATTRIBUTES 29 +#define UA_TYPES_REFERENCEDESCRIPTION 127 /** - * RequestHeader - * ^^^^^^^^^^^^^ - * The header passed with every server request. */ + * BrowseResult + * ^^^^^^^^^^^^ + * The result of a browse operation. */ typedef struct { - UA_NodeId authenticationToken; - UA_DateTime timestamp; - UA_UInt32 requestHandle; - UA_UInt32 returnDiagnostics; - UA_String auditEntryId; - UA_UInt32 timeoutHint; - UA_ExtensionObject additionalHeader; -} UA_RequestHeader; + UA_StatusCode statusCode; + UA_ByteString continuationPoint; + size_t referencesSize; + UA_ReferenceDescription *references; +} UA_BrowseResult; -#define UA_TYPES_REQUESTHEADER 30 +#define UA_TYPES_BROWSERESULT 128 /** - * MonitoredItemModifyResult - * ^^^^^^^^^^^^^^^^^^^^^^^^^ - */ + * BrowseRequest + * ^^^^^^^^^^^^^ + * Browse the references for one or more nodes from the server address space. */ typedef struct { - UA_StatusCode statusCode; - UA_Double revisedSamplingInterval; - UA_UInt32 revisedQueueSize; - UA_ExtensionObject filterResult; -} UA_MonitoredItemModifyResult; + UA_RequestHeader requestHeader; + UA_ViewDescription view; + UA_UInt32 requestedMaxReferencesPerNode; + size_t nodesToBrowseSize; + UA_BrowseDescription *nodesToBrowse; +} UA_BrowseRequest; -#define UA_TYPES_MONITOREDITEMMODIFYRESULT 31 +#define UA_TYPES_BROWSEREQUEST 129 /** - * ElementOperand + * BrowseResponse * ^^^^^^^^^^^^^^ - */ + * Browse the references for one or more nodes from the server address space. */ typedef struct { - UA_UInt32 index; -} UA_ElementOperand; + UA_ResponseHeader responseHeader; + size_t resultsSize; + UA_BrowseResult *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_BrowseResponse; -#define UA_TYPES_ELEMENTOPERAND 32 +#define UA_TYPES_BROWSERESPONSE 130 /** - * CloseSecureChannelRequest - * ^^^^^^^^^^^^^^^^^^^^^^^^^ - * Closes a secure channel. */ + * BrowseNextRequest + * ^^^^^^^^^^^^^^^^^ + * Continues one or more browse operations. */ typedef struct { UA_RequestHeader requestHeader; -} UA_CloseSecureChannelRequest; + UA_Boolean releaseContinuationPoints; + size_t continuationPointsSize; + UA_ByteString *continuationPoints; +} UA_BrowseNextRequest; -#define UA_TYPES_CLOSESECURECHANNELREQUEST 33 +#define UA_TYPES_BROWSENEXTREQUEST 131 /** - * AddNodesResult - * ^^^^^^^^^^^^^^ - * A result of an add node operation. */ + * BrowseNextResponse + * ^^^^^^^^^^^^^^^^^^ + * Continues one or more browse operations. */ typedef struct { - UA_StatusCode statusCode; - UA_NodeId addedNodeId; -} UA_AddNodesResult; + UA_ResponseHeader responseHeader; + size_t resultsSize; + UA_BrowseResult *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_BrowseNextResponse; -#define UA_TYPES_ADDNODESRESULT 34 +#define UA_TYPES_BROWSENEXTRESPONSE 132 /** - * VariableAttributes - * ^^^^^^^^^^^^^^^^^^ - * The attributes for a variable node. */ + * RelativePathElement + * ^^^^^^^^^^^^^^^^^^^ + * An element in a relative path. */ typedef struct { - UA_UInt32 specifiedAttributes; - UA_LocalizedText displayName; - UA_LocalizedText description; - UA_UInt32 writeMask; - UA_UInt32 userWriteMask; - UA_Variant value; - UA_NodeId dataType; - UA_Int32 valueRank; - size_t arrayDimensionsSize; - UA_UInt32 *arrayDimensions; - UA_Byte accessLevel; - UA_Byte userAccessLevel; - UA_Double minimumSamplingInterval; - UA_Boolean historizing; -} UA_VariableAttributes; + UA_NodeId referenceTypeId; + UA_Boolean isInverse; + UA_Boolean includeSubtypes; + UA_QualifiedName targetName; +} UA_RelativePathElement; -#define UA_TYPES_VARIABLEATTRIBUTES 35 +#define UA_TYPES_RELATIVEPATHELEMENT 133 /** - * NotificationMessage - * ^^^^^^^^^^^^^^^^^^^ - */ + * RelativePath + * ^^^^^^^^^^^^ + * A relative path constructed from reference types and browse names. */ typedef struct { - UA_UInt32 sequenceNumber; - UA_DateTime publishTime; - size_t notificationDataSize; - UA_ExtensionObject *notificationData; -} UA_NotificationMessage; + size_t elementsSize; + UA_RelativePathElement *elements; +} UA_RelativePath; -#define UA_TYPES_NOTIFICATIONMESSAGE 36 +#define UA_TYPES_RELATIVEPATH 134 /** - * FindServersOnNetworkRequest - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - */ + * BrowsePath + * ^^^^^^^^^^ + * A request to translate a path into a node id. */ typedef struct { - UA_RequestHeader requestHeader; - UA_UInt32 startingRecordId; - UA_UInt32 maxRecordsToReturn; - size_t serverCapabilityFilterSize; - UA_String *serverCapabilityFilter; -} UA_FindServersOnNetworkRequest; + UA_NodeId startingNode; + UA_RelativePath relativePath; +} UA_BrowsePath; -#define UA_TYPES_FINDSERVERSONNETWORKREQUEST 37 +#define UA_TYPES_BROWSEPATH 135 /** - * EventFieldList - * ^^^^^^^^^^^^^^ - */ + * BrowsePathTarget + * ^^^^^^^^^^^^^^^^ + * The target of the translated path. */ typedef struct { - UA_UInt32 clientHandle; - size_t eventFieldsSize; - UA_Variant *eventFields; -} UA_EventFieldList; + UA_ExpandedNodeId targetId; + UA_UInt32 remainingPathIndex; +} UA_BrowsePathTarget; -#define UA_TYPES_EVENTFIELDLIST 38 +#define UA_TYPES_BROWSEPATHTARGET 136 /** - * MonitoringMode - * ^^^^^^^^^^^^^^ - */ -typedef enum { - UA_MONITORINGMODE_DISABLED = 0, - UA_MONITORINGMODE_SAMPLING = 1, - UA_MONITORINGMODE_REPORTING = 2, - __UA_MONITORINGMODE_FORCE32BIT = 0x7fffffff -} UA_MonitoringMode; -UA_STATIC_ASSERT(sizeof(UA_MonitoringMode) == sizeof(UA_Int32), enum_must_be_32bit); + * BrowsePathResult + * ^^^^^^^^^^^^^^^^ + * The result of a translate opearation. */ +typedef struct { + UA_StatusCode statusCode; + size_t targetsSize; + UA_BrowsePathTarget *targets; +} UA_BrowsePathResult; -#define UA_TYPES_MONITORINGMODE 39 +#define UA_TYPES_BROWSEPATHRESULT 137 /** - * MdnsDiscoveryConfiguration - * ^^^^^^^^^^^^^^^^^^^^^^^^^^ - * The discovery information needed for mDNS registration. */ + * TranslateBrowsePathsToNodeIdsRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * Translates one or more paths in the server address space. */ typedef struct { - UA_String mdnsServerName; - size_t serverCapabilitiesSize; - UA_String *serverCapabilities; -} UA_MdnsDiscoveryConfiguration; + UA_RequestHeader requestHeader; + size_t browsePathsSize; + UA_BrowsePath *browsePaths; +} UA_TranslateBrowsePathsToNodeIdsRequest; -#define UA_TYPES_MDNSDISCOVERYCONFIGURATION 40 +#define UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST 138 /** - * CallMethodResult - * ^^^^^^^^^^^^^^^^ - */ + * TranslateBrowsePathsToNodeIdsResponse + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * Translates one or more paths in the server address space. */ typedef struct { - UA_StatusCode statusCode; - size_t inputArgumentResultsSize; - UA_StatusCode *inputArgumentResults; - size_t inputArgumentDiagnosticInfosSize; - UA_DiagnosticInfo *inputArgumentDiagnosticInfos; - size_t outputArgumentsSize; - UA_Variant *outputArguments; -} UA_CallMethodResult; + UA_ResponseHeader responseHeader; + size_t resultsSize; + UA_BrowsePathResult *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_TranslateBrowsePathsToNodeIdsResponse; -#define UA_TYPES_CALLMETHODRESULT 41 +#define UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE 139 /** - * ParsingResult - * ^^^^^^^^^^^^^ - */ + * RegisterNodesRequest + * ^^^^^^^^^^^^^^^^^^^^ + * Registers one or more nodes for repeated use within a session. */ typedef struct { - UA_StatusCode statusCode; - size_t dataStatusCodesSize; - UA_StatusCode *dataStatusCodes; - size_t dataDiagnosticInfosSize; - UA_DiagnosticInfo *dataDiagnosticInfos; -} UA_ParsingResult; + UA_RequestHeader requestHeader; + size_t nodesToRegisterSize; + UA_NodeId *nodesToRegister; +} UA_RegisterNodesRequest; -#define UA_TYPES_PARSINGRESULT 42 +#define UA_TYPES_REGISTERNODESREQUEST 140 /** - * RelativePathElement - * ^^^^^^^^^^^^^^^^^^^ - * An element in a relative path. */ + * RegisterNodesResponse + * ^^^^^^^^^^^^^^^^^^^^^ + * Registers one or more nodes for repeated use within a session. */ typedef struct { - UA_NodeId referenceTypeId; - UA_Boolean isInverse; - UA_Boolean includeSubtypes; - UA_QualifiedName targetName; -} UA_RelativePathElement; + UA_ResponseHeader responseHeader; + size_t registeredNodeIdsSize; + UA_NodeId *registeredNodeIds; +} UA_RegisterNodesResponse; -#define UA_TYPES_RELATIVEPATHELEMENT 43 +#define UA_TYPES_REGISTERNODESRESPONSE 141 /** - * BrowseDirection - * ^^^^^^^^^^^^^^^ - * The directions of the references to return. */ -typedef enum { - UA_BROWSEDIRECTION_FORWARD = 0, - UA_BROWSEDIRECTION_INVERSE = 1, - UA_BROWSEDIRECTION_BOTH = 2, - UA_BROWSEDIRECTION_INVALID = 3, - __UA_BROWSEDIRECTION_FORCE32BIT = 0x7fffffff -} UA_BrowseDirection; -UA_STATIC_ASSERT(sizeof(UA_BrowseDirection) == sizeof(UA_Int32), enum_must_be_32bit); + * UnregisterNodesRequest + * ^^^^^^^^^^^^^^^^^^^^^^ + * Unregisters one or more previously registered nodes. */ +typedef struct { + UA_RequestHeader requestHeader; + size_t nodesToUnregisterSize; + UA_NodeId *nodesToUnregister; +} UA_UnregisterNodesRequest; -#define UA_TYPES_BROWSEDIRECTION 44 +#define UA_TYPES_UNREGISTERNODESREQUEST 142 /** - * CallMethodRequest - * ^^^^^^^^^^^^^^^^^ - */ + * UnregisterNodesResponse + * ^^^^^^^^^^^^^^^^^^^^^^^ + * Unregisters one or more previously registered nodes. */ typedef struct { - UA_NodeId objectId; - UA_NodeId methodId; - size_t inputArgumentsSize; - UA_Variant *inputArguments; -} UA_CallMethodRequest; + UA_ResponseHeader responseHeader; +} UA_UnregisterNodesResponse; -#define UA_TYPES_CALLMETHODREQUEST 45 +#define UA_TYPES_UNREGISTERNODESRESPONSE 143 /** - * RedundancySupport - * ^^^^^^^^^^^^^^^^^ + * FilterOperator + * ^^^^^^^^^^^^^^ */ typedef enum { - UA_REDUNDANCYSUPPORT_NONE = 0, - UA_REDUNDANCYSUPPORT_COLD = 1, - UA_REDUNDANCYSUPPORT_WARM = 2, - UA_REDUNDANCYSUPPORT_HOT = 3, - UA_REDUNDANCYSUPPORT_TRANSPARENT = 4, - UA_REDUNDANCYSUPPORT_HOTANDMIRRORED = 5, - __UA_REDUNDANCYSUPPORT_FORCE32BIT = 0x7fffffff -} UA_RedundancySupport; -UA_STATIC_ASSERT(sizeof(UA_RedundancySupport) == sizeof(UA_Int32), enum_must_be_32bit); + UA_FILTEROPERATOR_EQUALS = 0, + UA_FILTEROPERATOR_ISNULL = 1, + UA_FILTEROPERATOR_GREATERTHAN = 2, + UA_FILTEROPERATOR_LESSTHAN = 3, + UA_FILTEROPERATOR_GREATERTHANOREQUAL = 4, + UA_FILTEROPERATOR_LESSTHANOREQUAL = 5, + UA_FILTEROPERATOR_LIKE = 6, + UA_FILTEROPERATOR_NOT = 7, + UA_FILTEROPERATOR_BETWEEN = 8, + UA_FILTEROPERATOR_INLIST = 9, + UA_FILTEROPERATOR_AND = 10, + UA_FILTEROPERATOR_OR = 11, + UA_FILTEROPERATOR_CAST = 12, + UA_FILTEROPERATOR_INVIEW = 13, + UA_FILTEROPERATOR_OFTYPE = 14, + UA_FILTEROPERATOR_RELATEDTO = 15, + UA_FILTEROPERATOR_BITWISEAND = 16, + UA_FILTEROPERATOR_BITWISEOR = 17, + __UA_FILTEROPERATOR_FORCE32BIT = 0x7fffffff +} UA_FilterOperator; +UA_STATIC_ASSERT(sizeof(UA_FilterOperator) == sizeof(UA_Int32), enum_must_be_32bit); -#define UA_TYPES_REDUNDANCYSUPPORT 46 +#define UA_TYPES_FILTEROPERATOR 144 /** - * EventNotificationList - * ^^^^^^^^^^^^^^^^^^^^^ + * ContentFilterElement + * ^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - size_t eventsSize; - UA_EventFieldList *events; -} UA_EventNotificationList; + UA_FilterOperator filterOperator; + size_t filterOperandsSize; + UA_ExtensionObject *filterOperands; +} UA_ContentFilterElement; -#define UA_TYPES_EVENTNOTIFICATIONLIST 47 +#define UA_TYPES_CONTENTFILTERELEMENT 145 /** - * UnregisterNodesRequest - * ^^^^^^^^^^^^^^^^^^^^^^ - * Unregisters one or more previously registered nodes. */ + * ContentFilter + * ^^^^^^^^^^^^^ + */ typedef struct { - UA_RequestHeader requestHeader; - size_t nodesToUnregisterSize; - UA_NodeId *nodesToUnregister; -} UA_UnregisterNodesRequest; + size_t elementsSize; + UA_ContentFilterElement *elements; +} UA_ContentFilter; -#define UA_TYPES_UNREGISTERNODESREQUEST 48 +#define UA_TYPES_CONTENTFILTER 146 /** - * ContentFilterElementResult - * ^^^^^^^^^^^^^^^^^^^^^^^^^^ + * FilterOperand + * ^^^^^^^^^^^^^ */ -typedef struct { - UA_StatusCode statusCode; - size_t operandStatusCodesSize; - UA_StatusCode *operandStatusCodes; - size_t operandDiagnosticInfosSize; - UA_DiagnosticInfo *operandDiagnosticInfos; -} UA_ContentFilterElementResult; +typedef void * UA_FilterOperand; -#define UA_TYPES_CONTENTFILTERELEMENTRESULT 49 +#define UA_TYPES_FILTEROPERAND 147 /** - * SimpleAttributeOperand - * ^^^^^^^^^^^^^^^^^^^^^^ + * ElementOperand + * ^^^^^^^^^^^^^^ */ typedef struct { - UA_NodeId typeDefinitionId; - size_t browsePathSize; - UA_QualifiedName *browsePath; - UA_UInt32 attributeId; - UA_String indexRange; -} UA_SimpleAttributeOperand; + UA_UInt32 index; +} UA_ElementOperand; -#define UA_TYPES_SIMPLEATTRIBUTEOPERAND 50 +#define UA_TYPES_ELEMENTOPERAND 148 /** * LiteralOperand @@ -3755,57 +15759,62 @@ typedef struct { UA_Variant value; } UA_LiteralOperand; -#define UA_TYPES_LITERALOPERAND 51 +#define UA_TYPES_LITERALOPERAND 149 /** - * QueryDataSet - * ^^^^^^^^^^^^ + * AttributeOperand + * ^^^^^^^^^^^^^^^^ */ typedef struct { - UA_ExpandedNodeId nodeId; - UA_ExpandedNodeId typeDefinitionNode; - size_t valuesSize; - UA_Variant *values; -} UA_QueryDataSet; + UA_NodeId nodeId; + UA_String alias; + UA_RelativePath browsePath; + UA_UInt32 attributeId; + UA_String indexRange; +} UA_AttributeOperand; -#define UA_TYPES_QUERYDATASET 52 +#define UA_TYPES_ATTRIBUTEOPERAND 150 /** - * AnonymousIdentityToken + * SimpleAttributeOperand * ^^^^^^^^^^^^^^^^^^^^^^ - * A token representing an anonymous user. */ + */ typedef struct { - UA_String policyId; -} UA_AnonymousIdentityToken; + UA_NodeId typeDefinitionId; + size_t browsePathSize; + UA_QualifiedName *browsePath; + UA_UInt32 attributeId; + UA_String indexRange; +} UA_SimpleAttributeOperand; -#define UA_TYPES_ANONYMOUSIDENTITYTOKEN 53 +#define UA_TYPES_SIMPLEATTRIBUTEOPERAND 151 /** - * SetPublishingModeRequest - * ^^^^^^^^^^^^^^^^^^^^^^^^ + * ContentFilterElementResult + * ^^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_RequestHeader requestHeader; - UA_Boolean publishingEnabled; - size_t subscriptionIdsSize; - UA_UInt32 *subscriptionIds; -} UA_SetPublishingModeRequest; + UA_StatusCode statusCode; + size_t operandStatusCodesSize; + UA_StatusCode *operandStatusCodes; + size_t operandDiagnosticInfosSize; + UA_DiagnosticInfo *operandDiagnosticInfos; +} UA_ContentFilterElementResult; -#define UA_TYPES_SETPUBLISHINGMODEREQUEST 54 +#define UA_TYPES_CONTENTFILTERELEMENTRESULT 152 /** - * MonitoredItemCreateResult - * ^^^^^^^^^^^^^^^^^^^^^^^^^ + * ContentFilterResult + * ^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_StatusCode statusCode; - UA_UInt32 monitoredItemId; - UA_Double revisedSamplingInterval; - UA_UInt32 revisedQueueSize; - UA_ExtensionObject filterResult; -} UA_MonitoredItemCreateResult; + size_t elementResultsSize; + UA_ContentFilterElementResult *elementResults; + size_t elementDiagnosticInfosSize; + UA_DiagnosticInfo *elementDiagnosticInfos; +} UA_ContentFilterResult; -#define UA_TYPES_MONITOREDITEMCREATERESULT 55 +#define UA_TYPES_CONTENTFILTERRESULT 153 /** * TimestampsToReturn @@ -3821,49 +15830,48 @@ typedef enum { } UA_TimestampsToReturn; UA_STATIC_ASSERT(sizeof(UA_TimestampsToReturn) == sizeof(UA_Int32), enum_must_be_32bit); -#define UA_TYPES_TIMESTAMPSTORETURN 56 +#define UA_TYPES_TIMESTAMPSTORETURN 154 /** - * CallRequest + * ReadValueId * ^^^^^^^^^^^ */ typedef struct { - UA_RequestHeader requestHeader; - size_t methodsToCallSize; - UA_CallMethodRequest *methodsToCall; -} UA_CallRequest; + UA_NodeId nodeId; + UA_UInt32 attributeId; + UA_String indexRange; + UA_QualifiedName dataEncoding; +} UA_ReadValueId; -#define UA_TYPES_CALLREQUEST 57 +#define UA_TYPES_READVALUEID 155 /** - * MethodAttributes - * ^^^^^^^^^^^^^^^^ - * The attributes for a method node. */ + * ReadRequest + * ^^^^^^^^^^^ + */ typedef struct { - UA_UInt32 specifiedAttributes; - UA_LocalizedText displayName; - UA_LocalizedText description; - UA_UInt32 writeMask; - UA_UInt32 userWriteMask; - UA_Boolean executable; - UA_Boolean userExecutable; -} UA_MethodAttributes; + UA_RequestHeader requestHeader; + UA_Double maxAge; + UA_TimestampsToReturn timestampsToReturn; + size_t nodesToReadSize; + UA_ReadValueId *nodesToRead; +} UA_ReadRequest; -#define UA_TYPES_METHODATTRIBUTES 58 +#define UA_TYPES_READREQUEST 156 /** - * DeleteReferencesItem - * ^^^^^^^^^^^^^^^^^^^^ - * A request to delete a node from the server address space. */ + * ReadResponse + * ^^^^^^^^^^^^ + */ typedef struct { - UA_NodeId sourceNodeId; - UA_NodeId referenceTypeId; - UA_Boolean isForward; - UA_ExpandedNodeId targetNodeId; - UA_Boolean deleteBidirectional; -} UA_DeleteReferencesItem; + UA_ResponseHeader responseHeader; + size_t resultsSize; + UA_DataValue *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_ReadResponse; -#define UA_TYPES_DELETEREFERENCESITEM 59 +#define UA_TYPES_READRESPONSE 157 /** * WriteValue @@ -3876,199 +15884,102 @@ typedef struct { UA_DataValue value; } UA_WriteValue; -#define UA_TYPES_WRITEVALUE 60 - -/** - * NodeAttributesMask - * ^^^^^^^^^^^^^^^^^^ - * The bits used to specify default attributes for a new node. */ -typedef enum { - UA_NODEATTRIBUTESMASK_NONE = 0, - UA_NODEATTRIBUTESMASK_ACCESSLEVEL = 1, - UA_NODEATTRIBUTESMASK_ARRAYDIMENSIONS = 2, - UA_NODEATTRIBUTESMASK_BROWSENAME = 4, - UA_NODEATTRIBUTESMASK_CONTAINSNOLOOPS = 8, - UA_NODEATTRIBUTESMASK_DATATYPE = 16, - UA_NODEATTRIBUTESMASK_DESCRIPTION = 32, - UA_NODEATTRIBUTESMASK_DISPLAYNAME = 64, - UA_NODEATTRIBUTESMASK_EVENTNOTIFIER = 128, - UA_NODEATTRIBUTESMASK_EXECUTABLE = 256, - UA_NODEATTRIBUTESMASK_HISTORIZING = 512, - UA_NODEATTRIBUTESMASK_INVERSENAME = 1024, - UA_NODEATTRIBUTESMASK_ISABSTRACT = 2048, - UA_NODEATTRIBUTESMASK_MINIMUMSAMPLINGINTERVAL = 4096, - UA_NODEATTRIBUTESMASK_NODECLASS = 8192, - UA_NODEATTRIBUTESMASK_NODEID = 16384, - UA_NODEATTRIBUTESMASK_SYMMETRIC = 32768, - UA_NODEATTRIBUTESMASK_USERACCESSLEVEL = 65536, - UA_NODEATTRIBUTESMASK_USEREXECUTABLE = 131072, - UA_NODEATTRIBUTESMASK_USERWRITEMASK = 262144, - UA_NODEATTRIBUTESMASK_VALUERANK = 524288, - UA_NODEATTRIBUTESMASK_WRITEMASK = 1048576, - UA_NODEATTRIBUTESMASK_VALUE = 2097152, - UA_NODEATTRIBUTESMASK_DATATYPEDEFINITION = 4194304, - UA_NODEATTRIBUTESMASK_ROLEPERMISSIONS = 8388608, - UA_NODEATTRIBUTESMASK_ACCESSRESTRICTIONS = 16777216, - UA_NODEATTRIBUTESMASK_ALL = 33554431, - UA_NODEATTRIBUTESMASK_BASENODE = 26501220, - UA_NODEATTRIBUTESMASK_OBJECT = 26501348, - UA_NODEATTRIBUTESMASK_OBJECTTYPE = 26503268, - UA_NODEATTRIBUTESMASK_VARIABLE = 26571383, - UA_NODEATTRIBUTESMASK_VARIABLETYPE = 28600438, - UA_NODEATTRIBUTESMASK_METHOD = 26632548, - UA_NODEATTRIBUTESMASK_REFERENCETYPE = 26537060, - UA_NODEATTRIBUTESMASK_VIEW = 26501356, - __UA_NODEATTRIBUTESMASK_FORCE32BIT = 0x7fffffff -} UA_NodeAttributesMask; -UA_STATIC_ASSERT(sizeof(UA_NodeAttributesMask) == sizeof(UA_Int32), enum_must_be_32bit); - -#define UA_TYPES_NODEATTRIBUTESMASK 61 - -/** - * MessageSecurityMode - * ^^^^^^^^^^^^^^^^^^^ - * The type of security to use on a message. */ -typedef enum { - UA_MESSAGESECURITYMODE_INVALID = 0, - UA_MESSAGESECURITYMODE_NONE = 1, - UA_MESSAGESECURITYMODE_SIGN = 2, - UA_MESSAGESECURITYMODE_SIGNANDENCRYPT = 3, - __UA_MESSAGESECURITYMODE_FORCE32BIT = 0x7fffffff -} UA_MessageSecurityMode; -UA_STATIC_ASSERT(sizeof(UA_MessageSecurityMode) == sizeof(UA_Int32), enum_must_be_32bit); - -#define UA_TYPES_MESSAGESECURITYMODE 62 +#define UA_TYPES_WRITEVALUE 158 /** - * MonitoringParameters - * ^^^^^^^^^^^^^^^^^^^^ + * WriteRequest + * ^^^^^^^^^^^^ */ typedef struct { - UA_UInt32 clientHandle; - UA_Double samplingInterval; - UA_ExtensionObject filter; - UA_UInt32 queueSize; - UA_Boolean discardOldest; -} UA_MonitoringParameters; + UA_RequestHeader requestHeader; + size_t nodesToWriteSize; + UA_WriteValue *nodesToWrite; +} UA_WriteRequest; -#define UA_TYPES_MONITORINGPARAMETERS 63 +#define UA_TYPES_WRITEREQUEST 159 /** - * ReferenceNode + * WriteResponse * ^^^^^^^^^^^^^ - * Specifies a reference which belongs to a node. */ -typedef struct { - UA_NodeId referenceTypeId; - UA_Boolean isInverse; - UA_ExpandedNodeId targetId; -} UA_ReferenceNode; - -#define UA_TYPES_REFERENCENODE 64 - -/** - * Argument - * ^^^^^^^^ - * An argument for a method. */ -typedef struct { - UA_String name; - UA_NodeId dataType; - UA_Int32 valueRank; - size_t arrayDimensionsSize; - UA_UInt32 *arrayDimensions; - UA_LocalizedText description; -} UA_Argument; - -#define UA_TYPES_ARGUMENT 65 - -/** - * ChannelSecurityToken - * ^^^^^^^^^^^^^^^^^^^^ - * The token that identifies a set of keys for an active secure channel. */ + */ typedef struct { - UA_UInt32 channelId; - UA_UInt32 tokenId; - UA_DateTime createdAt; - UA_UInt32 revisedLifetime; -} UA_ChannelSecurityToken; + UA_ResponseHeader responseHeader; + size_t resultsSize; + UA_StatusCode *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_WriteResponse; -#define UA_TYPES_CHANNELSECURITYTOKEN 66 +#define UA_TYPES_WRITERESPONSE 160 /** - * UserIdentityToken + * CallMethodRequest * ^^^^^^^^^^^^^^^^^ - * A base type for a user identity token. */ + */ typedef struct { - UA_String policyId; -} UA_UserIdentityToken; + UA_NodeId objectId; + UA_NodeId methodId; + size_t inputArgumentsSize; + UA_Variant *inputArguments; +} UA_CallMethodRequest; -#define UA_TYPES_USERIDENTITYTOKEN 67 +#define UA_TYPES_CALLMETHODREQUEST 161 /** - * SignatureData - * ^^^^^^^^^^^^^ - * A digital signature. */ + * CallMethodResult + * ^^^^^^^^^^^^^^^^ + */ typedef struct { - UA_String algorithm; - UA_ByteString signature; -} UA_SignatureData; + UA_StatusCode statusCode; + size_t inputArgumentResultsSize; + UA_StatusCode *inputArgumentResults; + size_t inputArgumentDiagnosticInfosSize; + UA_DiagnosticInfo *inputArgumentDiagnosticInfos; + size_t outputArgumentsSize; + UA_Variant *outputArguments; +} UA_CallMethodResult; -#define UA_TYPES_SIGNATUREDATA 68 +#define UA_TYPES_CALLMETHODRESULT 162 /** - * ObjectTypeAttributes - * ^^^^^^^^^^^^^^^^^^^^ - * The attributes for an object type node. */ + * CallRequest + * ^^^^^^^^^^^ + */ typedef struct { - UA_UInt32 specifiedAttributes; - UA_LocalizedText displayName; - UA_LocalizedText description; - UA_UInt32 writeMask; - UA_UInt32 userWriteMask; - UA_Boolean isAbstract; -} UA_ObjectTypeAttributes; + UA_RequestHeader requestHeader; + size_t methodsToCallSize; + UA_CallMethodRequest *methodsToCall; +} UA_CallRequest; -#define UA_TYPES_OBJECTTYPEATTRIBUTES 69 +#define UA_TYPES_CALLREQUEST 163 /** - * DeadbandType + * CallResponse * ^^^^^^^^^^^^ */ -typedef enum { - UA_DEADBANDTYPE_NONE = 0, - UA_DEADBANDTYPE_ABSOLUTE = 1, - UA_DEADBANDTYPE_PERCENT = 2, - __UA_DEADBANDTYPE_FORCE32BIT = 0x7fffffff -} UA_DeadbandType; -UA_STATIC_ASSERT(sizeof(UA_DeadbandType) == sizeof(UA_Int32), enum_must_be_32bit); - -#define UA_TYPES_DEADBANDTYPE 70 - -/** - * SecurityTokenRequestType - * ^^^^^^^^^^^^^^^^^^^^^^^^ - * Indicates whether a token if being created or renewed. */ -typedef enum { - UA_SECURITYTOKENREQUESTTYPE_ISSUE = 0, - UA_SECURITYTOKENREQUESTTYPE_RENEW = 1, - __UA_SECURITYTOKENREQUESTTYPE_FORCE32BIT = 0x7fffffff -} UA_SecurityTokenRequestType; -UA_STATIC_ASSERT(sizeof(UA_SecurityTokenRequestType) == sizeof(UA_Int32), enum_must_be_32bit); +typedef struct { + UA_ResponseHeader responseHeader; + size_t resultsSize; + UA_CallMethodResult *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_CallResponse; -#define UA_TYPES_SECURITYTOKENREQUESTTYPE 71 +#define UA_TYPES_CALLRESPONSE 164 /** - * NodeAttributes + * MonitoringMode * ^^^^^^^^^^^^^^ - * The base attributes for all nodes. */ -typedef struct { - UA_UInt32 specifiedAttributes; - UA_LocalizedText displayName; - UA_LocalizedText description; - UA_UInt32 writeMask; - UA_UInt32 userWriteMask; -} UA_NodeAttributes; + */ +typedef enum { + UA_MONITORINGMODE_DISABLED = 0, + UA_MONITORINGMODE_SAMPLING = 1, + UA_MONITORINGMODE_REPORTING = 2, + __UA_MONITORINGMODE_FORCE32BIT = 0x7fffffff +} UA_MonitoringMode; +UA_STATIC_ASSERT(sizeof(UA_MonitoringMode) == sizeof(UA_Int32), enum_must_be_32bit); -#define UA_TYPES_NODEATTRIBUTES 72 +#define UA_TYPES_MONITORINGMODE 165 /** * DataChangeTrigger @@ -4082,575 +15993,509 @@ typedef enum { } UA_DataChangeTrigger; UA_STATIC_ASSERT(sizeof(UA_DataChangeTrigger) == sizeof(UA_Int32), enum_must_be_32bit); -#define UA_TYPES_DATACHANGETRIGGER 73 +#define UA_TYPES_DATACHANGETRIGGER 166 /** - * BuildInfo - * ^^^^^^^^^ + * DeadbandType + * ^^^^^^^^^^^^ */ -typedef struct { - UA_String productUri; - UA_String manufacturerName; - UA_String productName; - UA_String softwareVersion; - UA_String buildNumber; - UA_DateTime buildDate; -} UA_BuildInfo; +typedef enum { + UA_DEADBANDTYPE_NONE = 0, + UA_DEADBANDTYPE_ABSOLUTE = 1, + UA_DEADBANDTYPE_PERCENT = 2, + __UA_DEADBANDTYPE_FORCE32BIT = 0x7fffffff +} UA_DeadbandType; +UA_STATIC_ASSERT(sizeof(UA_DeadbandType) == sizeof(UA_Int32), enum_must_be_32bit); -#define UA_TYPES_BUILDINFO 74 +#define UA_TYPES_DEADBANDTYPE 167 /** - * NodeClass - * ^^^^^^^^^ - * A mask specifying the class of the node. */ -typedef enum { - UA_NODECLASS_UNSPECIFIED = 0, - UA_NODECLASS_OBJECT = 1, - UA_NODECLASS_VARIABLE = 2, - UA_NODECLASS_METHOD = 4, - UA_NODECLASS_OBJECTTYPE = 8, - UA_NODECLASS_VARIABLETYPE = 16, - UA_NODECLASS_REFERENCETYPE = 32, - UA_NODECLASS_DATATYPE = 64, - UA_NODECLASS_VIEW = 128, - __UA_NODECLASS_FORCE32BIT = 0x7fffffff -} UA_NodeClass; -UA_STATIC_ASSERT(sizeof(UA_NodeClass) == sizeof(UA_Int32), enum_must_be_32bit); + * DataChangeFilter + * ^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_DataChangeTrigger trigger; + UA_UInt32 deadbandType; + UA_Double deadbandValue; +} UA_DataChangeFilter; -#define UA_TYPES_NODECLASS 75 +#define UA_TYPES_DATACHANGEFILTER 168 /** - * SubscriptionDiagnosticsDataType - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * EventFilter + * ^^^^^^^^^^^ */ typedef struct { - UA_NodeId sessionId; - UA_UInt32 subscriptionId; - UA_Byte priority; - UA_Double publishingInterval; - UA_UInt32 maxKeepAliveCount; - UA_UInt32 maxLifetimeCount; - UA_UInt32 maxNotificationsPerPublish; - UA_Boolean publishingEnabled; - UA_UInt32 modifyCount; - UA_UInt32 enableCount; - UA_UInt32 disableCount; - UA_UInt32 republishRequestCount; - UA_UInt32 republishMessageRequestCount; - UA_UInt32 republishMessageCount; - UA_UInt32 transferRequestCount; - UA_UInt32 transferredToAltClientCount; - UA_UInt32 transferredToSameClientCount; - UA_UInt32 publishRequestCount; - UA_UInt32 dataChangeNotificationsCount; - UA_UInt32 eventNotificationsCount; - UA_UInt32 notificationsCount; - UA_UInt32 latePublishRequestCount; - UA_UInt32 currentKeepAliveCount; - UA_UInt32 currentLifetimeCount; - UA_UInt32 unacknowledgedMessageCount; - UA_UInt32 discardedMessageCount; - UA_UInt32 monitoredItemCount; - UA_UInt32 disabledMonitoredItemCount; - UA_UInt32 monitoringQueueOverflowCount; - UA_UInt32 nextSequenceNumber; - UA_UInt32 eventQueueOverFlowCount; -} UA_SubscriptionDiagnosticsDataType; - -#define UA_TYPES_SUBSCRIPTIONDIAGNOSTICSDATATYPE 76 + size_t selectClausesSize; + UA_SimpleAttributeOperand *selectClauses; + UA_ContentFilter whereClause; +} UA_EventFilter; + +#define UA_TYPES_EVENTFILTER 169 /** - * FilterOperand - * ^^^^^^^^^^^^^ + * AggregateConfiguration + * ^^^^^^^^^^^^^^^^^^^^^^ */ -typedef void * UA_FilterOperand; +typedef struct { + UA_Boolean useServerCapabilitiesDefaults; + UA_Boolean treatUncertainAsBad; + UA_Byte percentDataBad; + UA_Byte percentDataGood; + UA_Boolean useSlopedExtrapolation; +} UA_AggregateConfiguration; -#define UA_TYPES_FILTEROPERAND 77 +#define UA_TYPES_AGGREGATECONFIGURATION 170 /** - * MonitoredItemNotification - * ^^^^^^^^^^^^^^^^^^^^^^^^^ + * AggregateFilter + * ^^^^^^^^^^^^^^^ */ typedef struct { - UA_UInt32 clientHandle; - UA_DataValue value; -} UA_MonitoredItemNotification; + UA_DateTime startTime; + UA_NodeId aggregateType; + UA_Double processingInterval; + UA_AggregateConfiguration aggregateConfiguration; +} UA_AggregateFilter; -#define UA_TYPES_MONITOREDITEMNOTIFICATION 78 +#define UA_TYPES_AGGREGATEFILTER 171 /** - * DeleteNodesItem - * ^^^^^^^^^^^^^^^ - * A request to delete a node to the server address space. */ + * EventFilterResult + * ^^^^^^^^^^^^^^^^^ + */ typedef struct { - UA_NodeId nodeId; - UA_Boolean deleteTargetReferences; -} UA_DeleteNodesItem; + size_t selectClauseResultsSize; + UA_StatusCode *selectClauseResults; + size_t selectClauseDiagnosticInfosSize; + UA_DiagnosticInfo *selectClauseDiagnosticInfos; + UA_ContentFilterResult whereClauseResult; +} UA_EventFilterResult; -#define UA_TYPES_DELETENODESITEM 79 +#define UA_TYPES_EVENTFILTERRESULT 172 /** - * DeleteSubscriptionsRequest - * ^^^^^^^^^^^^^^^^^^^^^^^^^^ + * MonitoringParameters + * ^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_RequestHeader requestHeader; - size_t subscriptionIdsSize; - UA_UInt32 *subscriptionIds; -} UA_DeleteSubscriptionsRequest; + UA_UInt32 clientHandle; + UA_Double samplingInterval; + UA_ExtensionObject filter; + UA_UInt32 queueSize; + UA_Boolean discardOldest; +} UA_MonitoringParameters; -#define UA_TYPES_DELETESUBSCRIPTIONSREQUEST 80 +#define UA_TYPES_MONITORINGPARAMETERS 173 /** - * SubscriptionAcknowledgement - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * MonitoredItemCreateRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_UInt32 subscriptionId; - UA_UInt32 sequenceNumber; -} UA_SubscriptionAcknowledgement; + UA_ReadValueId itemToMonitor; + UA_MonitoringMode monitoringMode; + UA_MonitoringParameters requestedParameters; +} UA_MonitoredItemCreateRequest; -#define UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT 81 +#define UA_TYPES_MONITOREDITEMCREATEREQUEST 174 /** - * ReadValueId - * ^^^^^^^^^^^ + * MonitoredItemCreateResult + * ^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_NodeId nodeId; - UA_UInt32 attributeId; - UA_String indexRange; - UA_QualifiedName dataEncoding; -} UA_ReadValueId; + UA_StatusCode statusCode; + UA_UInt32 monitoredItemId; + UA_Double revisedSamplingInterval; + UA_UInt32 revisedQueueSize; + UA_ExtensionObject filterResult; +} UA_MonitoredItemCreateResult; -#define UA_TYPES_READVALUEID 82 +#define UA_TYPES_MONITOREDITEMCREATERESULT 175 /** - * DataTypeAttributes - * ^^^^^^^^^^^^^^^^^^ - * The attributes for a data type node. */ + * CreateMonitoredItemsRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ typedef struct { - UA_UInt32 specifiedAttributes; - UA_LocalizedText displayName; - UA_LocalizedText description; - UA_UInt32 writeMask; - UA_UInt32 userWriteMask; - UA_Boolean isAbstract; -} UA_DataTypeAttributes; + UA_RequestHeader requestHeader; + UA_UInt32 subscriptionId; + UA_TimestampsToReturn timestampsToReturn; + size_t itemsToCreateSize; + UA_MonitoredItemCreateRequest *itemsToCreate; +} UA_CreateMonitoredItemsRequest; -#define UA_TYPES_DATATYPEATTRIBUTES 83 +#define UA_TYPES_CREATEMONITOREDITEMSREQUEST 176 /** - * ResponseHeader - * ^^^^^^^^^^^^^^ - * The header passed with every server response. */ + * CreateMonitoredItemsResponse + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ typedef struct { - UA_DateTime timestamp; - UA_UInt32 requestHandle; - UA_StatusCode serviceResult; - UA_DiagnosticInfo serviceDiagnostics; - size_t stringTableSize; - UA_String *stringTable; - UA_ExtensionObject additionalHeader; -} UA_ResponseHeader; + UA_ResponseHeader responseHeader; + size_t resultsSize; + UA_MonitoredItemCreateResult *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_CreateMonitoredItemsResponse; -#define UA_TYPES_RESPONSEHEADER 84 +#define UA_TYPES_CREATEMONITOREDITEMSRESPONSE 177 /** - * DeleteMonitoredItemsRequest - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * MonitoredItemModifyRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_RequestHeader requestHeader; - UA_UInt32 subscriptionId; - size_t monitoredItemIdsSize; - UA_UInt32 *monitoredItemIds; -} UA_DeleteMonitoredItemsRequest; + UA_UInt32 monitoredItemId; + UA_MonitoringParameters requestedParameters; +} UA_MonitoredItemModifyRequest; -#define UA_TYPES_DELETEMONITOREDITEMSREQUEST 85 +#define UA_TYPES_MONITOREDITEMMODIFYREQUEST 178 /** - * ViewDescription - * ^^^^^^^^^^^^^^^ - * The view to browse. */ + * MonitoredItemModifyResult + * ^^^^^^^^^^^^^^^^^^^^^^^^^ + */ typedef struct { - UA_NodeId viewId; - UA_DateTime timestamp; - UA_UInt32 viewVersion; -} UA_ViewDescription; + UA_StatusCode statusCode; + UA_Double revisedSamplingInterval; + UA_UInt32 revisedQueueSize; + UA_ExtensionObject filterResult; +} UA_MonitoredItemModifyResult; -#define UA_TYPES_VIEWDESCRIPTION 86 +#define UA_TYPES_MONITOREDITEMMODIFYRESULT 179 /** - * ServerOnNetwork - * ^^^^^^^^^^^^^^^ + * ModifyMonitoredItemsRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_UInt32 recordId; - UA_String serverName; - UA_String discoveryUrl; - size_t serverCapabilitiesSize; - UA_String *serverCapabilities; -} UA_ServerOnNetwork; + UA_RequestHeader requestHeader; + UA_UInt32 subscriptionId; + UA_TimestampsToReturn timestampsToReturn; + size_t itemsToModifySize; + UA_MonitoredItemModifyRequest *itemsToModify; +} UA_ModifyMonitoredItemsRequest; -#define UA_TYPES_SERVERONNETWORK 87 +#define UA_TYPES_MODIFYMONITOREDITEMSREQUEST 180 /** - * DeleteMonitoredItemsResponse + * ModifyMonitoredItemsResponse * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { UA_ResponseHeader responseHeader; size_t resultsSize; - UA_StatusCode *results; + UA_MonitoredItemModifyResult *results; size_t diagnosticInfosSize; UA_DiagnosticInfo *diagnosticInfos; -} UA_DeleteMonitoredItemsResponse; +} UA_ModifyMonitoredItemsResponse; -#define UA_TYPES_DELETEMONITOREDITEMSRESPONSE 88 +#define UA_TYPES_MODIFYMONITOREDITEMSRESPONSE 181 /** - * FindServersOnNetworkResponse - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * SetMonitoringModeRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_ResponseHeader responseHeader; - UA_DateTime lastCounterResetTime; - size_t serversSize; - UA_ServerOnNetwork *servers; -} UA_FindServersOnNetworkResponse; + UA_RequestHeader requestHeader; + UA_UInt32 subscriptionId; + UA_MonitoringMode monitoringMode; + size_t monitoredItemIdsSize; + UA_UInt32 *monitoredItemIds; +} UA_SetMonitoringModeRequest; -#define UA_TYPES_FINDSERVERSONNETWORKRESPONSE 89 +#define UA_TYPES_SETMONITORINGMODEREQUEST 182 /** - * RelativePath - * ^^^^^^^^^^^^ - * A relative path constructed from reference types and browse names. */ + * SetMonitoringModeResponse + * ^^^^^^^^^^^^^^^^^^^^^^^^^ + */ typedef struct { - size_t elementsSize; - UA_RelativePathElement *elements; -} UA_RelativePath; + UA_ResponseHeader responseHeader; + size_t resultsSize; + UA_StatusCode *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_SetMonitoringModeResponse; -#define UA_TYPES_RELATIVEPATH 90 +#define UA_TYPES_SETMONITORINGMODERESPONSE 183 /** - * RegisterNodesRequest + * SetTriggeringRequest * ^^^^^^^^^^^^^^^^^^^^ - * Registers one or more nodes for repeated use within a session. */ + */ typedef struct { UA_RequestHeader requestHeader; - size_t nodesToRegisterSize; - UA_NodeId *nodesToRegister; -} UA_RegisterNodesRequest; + UA_UInt32 subscriptionId; + UA_UInt32 triggeringItemId; + size_t linksToAddSize; + UA_UInt32 *linksToAdd; + size_t linksToRemoveSize; + UA_UInt32 *linksToRemove; +} UA_SetTriggeringRequest; -#define UA_TYPES_REGISTERNODESREQUEST 91 +#define UA_TYPES_SETTRIGGERINGREQUEST 184 /** - * AggregateConfiguration - * ^^^^^^^^^^^^^^^^^^^^^^ + * SetTriggeringResponse + * ^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_Boolean useServerCapabilitiesDefaults; - UA_Boolean treatUncertainAsBad; - UA_Byte percentDataBad; - UA_Byte percentDataGood; - UA_Boolean useSlopedExtrapolation; -} UA_AggregateConfiguration; + UA_ResponseHeader responseHeader; + size_t addResultsSize; + UA_StatusCode *addResults; + size_t addDiagnosticInfosSize; + UA_DiagnosticInfo *addDiagnosticInfos; + size_t removeResultsSize; + UA_StatusCode *removeResults; + size_t removeDiagnosticInfosSize; + UA_DiagnosticInfo *removeDiagnosticInfos; +} UA_SetTriggeringResponse; -#define UA_TYPES_AGGREGATECONFIGURATION 92 +#define UA_TYPES_SETTRIGGERINGRESPONSE 185 /** - * DeleteNodesRequest - * ^^^^^^^^^^^^^^^^^^ - * Delete one or more nodes from the server address space. */ + * DeleteMonitoredItemsRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ typedef struct { UA_RequestHeader requestHeader; - size_t nodesToDeleteSize; - UA_DeleteNodesItem *nodesToDelete; -} UA_DeleteNodesRequest; + UA_UInt32 subscriptionId; + size_t monitoredItemIdsSize; + UA_UInt32 *monitoredItemIds; +} UA_DeleteMonitoredItemsRequest; -#define UA_TYPES_DELETENODESREQUEST 93 +#define UA_TYPES_DELETEMONITOREDITEMSREQUEST 186 /** - * PublishResponse - * ^^^^^^^^^^^^^^^ + * DeleteMonitoredItemsResponse + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { UA_ResponseHeader responseHeader; - UA_UInt32 subscriptionId; - size_t availableSequenceNumbersSize; - UA_UInt32 *availableSequenceNumbers; - UA_Boolean moreNotifications; - UA_NotificationMessage notificationMessage; size_t resultsSize; UA_StatusCode *results; size_t diagnosticInfosSize; UA_DiagnosticInfo *diagnosticInfos; -} UA_PublishResponse; +} UA_DeleteMonitoredItemsResponse; -#define UA_TYPES_PUBLISHRESPONSE 94 +#define UA_TYPES_DELETEMONITOREDITEMSRESPONSE 187 /** - * MonitoredItemModifyRequest - * ^^^^^^^^^^^^^^^^^^^^^^^^^^ + * CreateSubscriptionRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_UInt32 monitoredItemId; - UA_MonitoringParameters requestedParameters; -} UA_MonitoredItemModifyRequest; + UA_RequestHeader requestHeader; + UA_Double requestedPublishingInterval; + UA_UInt32 requestedLifetimeCount; + UA_UInt32 requestedMaxKeepAliveCount; + UA_UInt32 maxNotificationsPerPublish; + UA_Boolean publishingEnabled; + UA_Byte priority; +} UA_CreateSubscriptionRequest; -#define UA_TYPES_MONITOREDITEMMODIFYREQUEST 95 +#define UA_TYPES_CREATESUBSCRIPTIONREQUEST 188 /** - * ServiceCounterDataType - * ^^^^^^^^^^^^^^^^^^^^^^ + * CreateSubscriptionResponse + * ^^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_UInt32 totalCount; - UA_UInt32 errorCount; -} UA_ServiceCounterDataType; + UA_ResponseHeader responseHeader; + UA_UInt32 subscriptionId; + UA_Double revisedPublishingInterval; + UA_UInt32 revisedLifetimeCount; + UA_UInt32 revisedMaxKeepAliveCount; +} UA_CreateSubscriptionResponse; -#define UA_TYPES_SERVICECOUNTERDATATYPE 96 +#define UA_TYPES_CREATESUBSCRIPTIONRESPONSE 189 /** - * ModelChangeStructureDataType - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * ModifySubscriptionRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_NodeId affected; - UA_NodeId affectedType; - UA_Byte verb; -} UA_ModelChangeStructureDataType; + UA_RequestHeader requestHeader; + UA_UInt32 subscriptionId; + UA_Double requestedPublishingInterval; + UA_UInt32 requestedLifetimeCount; + UA_UInt32 requestedMaxKeepAliveCount; + UA_UInt32 maxNotificationsPerPublish; + UA_Byte priority; +} UA_ModifySubscriptionRequest; -#define UA_TYPES_MODELCHANGESTRUCTUREDATATYPE 97 +#define UA_TYPES_MODIFYSUBSCRIPTIONREQUEST 190 /** - * UserNameIdentityToken - * ^^^^^^^^^^^^^^^^^^^^^ - * A token representing a user identified by a user name and password. */ + * ModifySubscriptionResponse + * ^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ typedef struct { - UA_String policyId; - UA_String userName; - UA_ByteString password; - UA_String encryptionAlgorithm; -} UA_UserNameIdentityToken; - -#define UA_TYPES_USERNAMEIDENTITYTOKEN 98 - -/** - * IdType - * ^^^^^^ - * The type of identifier used in a node id. */ -typedef enum { - UA_IDTYPE_NUMERIC = 0, - UA_IDTYPE_STRING = 1, - UA_IDTYPE_GUID = 2, - UA_IDTYPE_OPAQUE = 3, - __UA_IDTYPE_FORCE32BIT = 0x7fffffff -} UA_IdType; -UA_STATIC_ASSERT(sizeof(UA_IdType) == sizeof(UA_Int32), enum_must_be_32bit); - -#define UA_TYPES_IDTYPE 99 - -/** - * UserTokenType - * ^^^^^^^^^^^^^ - * The possible user token types. */ -typedef enum { - UA_USERTOKENTYPE_ANONYMOUS = 0, - UA_USERTOKENTYPE_USERNAME = 1, - UA_USERTOKENTYPE_CERTIFICATE = 2, - UA_USERTOKENTYPE_ISSUEDTOKEN = 3, - __UA_USERTOKENTYPE_FORCE32BIT = 0x7fffffff -} UA_UserTokenType; -UA_STATIC_ASSERT(sizeof(UA_UserTokenType) == sizeof(UA_Int32), enum_must_be_32bit); + UA_ResponseHeader responseHeader; + UA_Double revisedPublishingInterval; + UA_UInt32 revisedLifetimeCount; + UA_UInt32 revisedMaxKeepAliveCount; +} UA_ModifySubscriptionResponse; -#define UA_TYPES_USERTOKENTYPE 100 +#define UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE 191 /** - * SetTriggeringResponse - * ^^^^^^^^^^^^^^^^^^^^^ + * SetPublishingModeRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_ResponseHeader responseHeader; - size_t addResultsSize; - UA_StatusCode *addResults; - size_t addDiagnosticInfosSize; - UA_DiagnosticInfo *addDiagnosticInfos; - size_t removeResultsSize; - UA_StatusCode *removeResults; - size_t removeDiagnosticInfosSize; - UA_DiagnosticInfo *removeDiagnosticInfos; -} UA_SetTriggeringResponse; + UA_RequestHeader requestHeader; + UA_Boolean publishingEnabled; + size_t subscriptionIdsSize; + UA_UInt32 *subscriptionIds; +} UA_SetPublishingModeRequest; -#define UA_TYPES_SETTRIGGERINGRESPONSE 101 +#define UA_TYPES_SETPUBLISHINGMODEREQUEST 192 /** - * TimeZoneDataType - * ^^^^^^^^^^^^^^^^ + * SetPublishingModeResponse + * ^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_Int16 offset; - UA_Boolean daylightSavingInOffset; -} UA_TimeZoneDataType; + UA_ResponseHeader responseHeader; + size_t resultsSize; + UA_StatusCode *results; + size_t diagnosticInfosSize; + UA_DiagnosticInfo *diagnosticInfos; +} UA_SetPublishingModeResponse; -#define UA_TYPES_TIMEZONEDATATYPE 102 +#define UA_TYPES_SETPUBLISHINGMODERESPONSE 193 /** - * ActivateSessionRequest - * ^^^^^^^^^^^^^^^^^^^^^^ - * Activates a session with the server. */ + * NotificationMessage + * ^^^^^^^^^^^^^^^^^^^ + */ typedef struct { - UA_RequestHeader requestHeader; - UA_SignatureData clientSignature; - size_t clientSoftwareCertificatesSize; - UA_SignedSoftwareCertificate *clientSoftwareCertificates; - size_t localeIdsSize; - UA_String *localeIds; - UA_ExtensionObject userIdentityToken; - UA_SignatureData userTokenSignature; -} UA_ActivateSessionRequest; + UA_UInt32 sequenceNumber; + UA_DateTime publishTime; + size_t notificationDataSize; + UA_ExtensionObject *notificationData; +} UA_NotificationMessage; -#define UA_TYPES_ACTIVATESESSIONREQUEST 103 +#define UA_TYPES_NOTIFICATIONMESSAGE 194 /** - * OpenSecureChannelResponse + * MonitoredItemNotification * ^^^^^^^^^^^^^^^^^^^^^^^^^ - * Creates a secure channel with a server. */ + */ typedef struct { - UA_ResponseHeader responseHeader; - UA_UInt32 serverProtocolVersion; - UA_ChannelSecurityToken securityToken; - UA_ByteString serverNonce; -} UA_OpenSecureChannelResponse; + UA_UInt32 clientHandle; + UA_DataValue value; +} UA_MonitoredItemNotification; -#define UA_TYPES_OPENSECURECHANNELRESPONSE 104 +#define UA_TYPES_MONITOREDITEMNOTIFICATION 195 /** - * ApplicationType - * ^^^^^^^^^^^^^^^ - * The types of applications. */ -typedef enum { - UA_APPLICATIONTYPE_SERVER = 0, - UA_APPLICATIONTYPE_CLIENT = 1, - UA_APPLICATIONTYPE_CLIENTANDSERVER = 2, - UA_APPLICATIONTYPE_DISCOVERYSERVER = 3, - __UA_APPLICATIONTYPE_FORCE32BIT = 0x7fffffff -} UA_ApplicationType; -UA_STATIC_ASSERT(sizeof(UA_ApplicationType) == sizeof(UA_Int32), enum_must_be_32bit); + * EventFieldList + * ^^^^^^^^^^^^^^ + */ +typedef struct { + UA_UInt32 clientHandle; + size_t eventFieldsSize; + UA_Variant *eventFields; +} UA_EventFieldList; -#define UA_TYPES_APPLICATIONTYPE 105 +#define UA_TYPES_EVENTFIELDLIST 196 /** - * ServerState - * ^^^^^^^^^^^ + * StatusChangeNotification + * ^^^^^^^^^^^^^^^^^^^^^^^^ */ -typedef enum { - UA_SERVERSTATE_RUNNING = 0, - UA_SERVERSTATE_FAILED = 1, - UA_SERVERSTATE_NOCONFIGURATION = 2, - UA_SERVERSTATE_SUSPENDED = 3, - UA_SERVERSTATE_SHUTDOWN = 4, - UA_SERVERSTATE_TEST = 5, - UA_SERVERSTATE_COMMUNICATIONFAULT = 6, - UA_SERVERSTATE_UNKNOWN = 7, - __UA_SERVERSTATE_FORCE32BIT = 0x7fffffff -} UA_ServerState; -UA_STATIC_ASSERT(sizeof(UA_ServerState) == sizeof(UA_Int32), enum_must_be_32bit); +typedef struct { + UA_StatusCode status; + UA_DiagnosticInfo diagnosticInfo; +} UA_StatusChangeNotification; -#define UA_TYPES_SERVERSTATE 106 +#define UA_TYPES_STATUSCHANGENOTIFICATION 197 /** - * QueryNextResponse - * ^^^^^^^^^^^^^^^^^ + * SubscriptionAcknowledgement + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_ResponseHeader responseHeader; - size_t queryDataSetsSize; - UA_QueryDataSet *queryDataSets; - UA_ByteString revisedContinuationPoint; -} UA_QueryNextResponse; + UA_UInt32 subscriptionId; + UA_UInt32 sequenceNumber; +} UA_SubscriptionAcknowledgement; -#define UA_TYPES_QUERYNEXTRESPONSE 107 +#define UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT 198 /** - * DiscoveryConfiguration - * ^^^^^^^^^^^^^^^^^^^^^^ - * A base type for discovery configuration information. */ -typedef void * UA_DiscoveryConfiguration; + * PublishRequest + * ^^^^^^^^^^^^^^ + */ +typedef struct { + UA_RequestHeader requestHeader; + size_t subscriptionAcknowledgementsSize; + UA_SubscriptionAcknowledgement *subscriptionAcknowledgements; +} UA_PublishRequest; -#define UA_TYPES_DISCOVERYCONFIGURATION 108 +#define UA_TYPES_PUBLISHREQUEST 199 /** - * ActivateSessionResponse - * ^^^^^^^^^^^^^^^^^^^^^^^ - * Activates a session with the server. */ + * PublishResponse + * ^^^^^^^^^^^^^^^ + */ typedef struct { UA_ResponseHeader responseHeader; - UA_ByteString serverNonce; + UA_UInt32 subscriptionId; + size_t availableSequenceNumbersSize; + UA_UInt32 *availableSequenceNumbers; + UA_Boolean moreNotifications; + UA_NotificationMessage notificationMessage; size_t resultsSize; UA_StatusCode *results; size_t diagnosticInfosSize; UA_DiagnosticInfo *diagnosticInfos; -} UA_ActivateSessionResponse; +} UA_PublishResponse; -#define UA_TYPES_ACTIVATESESSIONRESPONSE 109 +#define UA_TYPES_PUBLISHRESPONSE 200 /** - * EndpointUrlListDataType - * ^^^^^^^^^^^^^^^^^^^^^^^ + * RepublishRequest + * ^^^^^^^^^^^^^^^^ */ typedef struct { - size_t endpointUrlListSize; - UA_String *endpointUrlList; -} UA_EndpointUrlListDataType; + UA_RequestHeader requestHeader; + UA_UInt32 subscriptionId; + UA_UInt32 retransmitSequenceNumber; +} UA_RepublishRequest; -#define UA_TYPES_ENDPOINTURLLISTDATATYPE 110 +#define UA_TYPES_REPUBLISHREQUEST 201 /** - * FilterOperator - * ^^^^^^^^^^^^^^ + * RepublishResponse + * ^^^^^^^^^^^^^^^^^ */ -typedef enum { - UA_FILTEROPERATOR_EQUALS = 0, - UA_FILTEROPERATOR_ISNULL = 1, - UA_FILTEROPERATOR_GREATERTHAN = 2, - UA_FILTEROPERATOR_LESSTHAN = 3, - UA_FILTEROPERATOR_GREATERTHANOREQUAL = 4, - UA_FILTEROPERATOR_LESSTHANOREQUAL = 5, - UA_FILTEROPERATOR_LIKE = 6, - UA_FILTEROPERATOR_NOT = 7, - UA_FILTEROPERATOR_BETWEEN = 8, - UA_FILTEROPERATOR_INLIST = 9, - UA_FILTEROPERATOR_AND = 10, - UA_FILTEROPERATOR_OR = 11, - UA_FILTEROPERATOR_CAST = 12, - UA_FILTEROPERATOR_INVIEW = 13, - UA_FILTEROPERATOR_OFTYPE = 14, - UA_FILTEROPERATOR_RELATEDTO = 15, - UA_FILTEROPERATOR_BITWISEAND = 16, - UA_FILTEROPERATOR_BITWISEOR = 17, - __UA_FILTEROPERATOR_FORCE32BIT = 0x7fffffff -} UA_FilterOperator; -UA_STATIC_ASSERT(sizeof(UA_FilterOperator) == sizeof(UA_Int32), enum_must_be_32bit); +typedef struct { + UA_ResponseHeader responseHeader; + UA_NotificationMessage notificationMessage; +} UA_RepublishResponse; -#define UA_TYPES_FILTEROPERATOR 111 +#define UA_TYPES_REPUBLISHRESPONSE 202 /** - * QueryNextRequest - * ^^^^^^^^^^^^^^^^ + * DeleteSubscriptionsRequest + * ^^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { UA_RequestHeader requestHeader; - UA_Boolean releaseContinuationPoint; - UA_ByteString continuationPoint; -} UA_QueryNextRequest; + size_t subscriptionIdsSize; + UA_UInt32 *subscriptionIds; +} UA_DeleteSubscriptionsRequest; -#define UA_TYPES_QUERYNEXTREQUEST 112 +#define UA_TYPES_DELETESUBSCRIPTIONSREQUEST 203 /** - * WriteResponse - * ^^^^^^^^^^^^^ + * DeleteSubscriptionsResponse + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { UA_ResponseHeader responseHeader; @@ -4658,2045 +16503,2248 @@ typedef struct { UA_StatusCode *results; size_t diagnosticInfosSize; UA_DiagnosticInfo *diagnosticInfos; -} UA_WriteResponse; +} UA_DeleteSubscriptionsResponse; -#define UA_TYPES_WRITERESPONSE 113 +#define UA_TYPES_DELETESUBSCRIPTIONSRESPONSE 204 /** - * BrowseNextRequest + * BuildInfo + * ^^^^^^^^^ + */ +typedef struct { + UA_String productUri; + UA_String manufacturerName; + UA_String productName; + UA_String softwareVersion; + UA_String buildNumber; + UA_DateTime buildDate; +} UA_BuildInfo; + +#define UA_TYPES_BUILDINFO 205 + +/** + * RedundancySupport * ^^^^^^^^^^^^^^^^^ - * Continues one or more browse operations. */ + */ +typedef enum { + UA_REDUNDANCYSUPPORT_NONE = 0, + UA_REDUNDANCYSUPPORT_COLD = 1, + UA_REDUNDANCYSUPPORT_WARM = 2, + UA_REDUNDANCYSUPPORT_HOT = 3, + UA_REDUNDANCYSUPPORT_TRANSPARENT = 4, + UA_REDUNDANCYSUPPORT_HOTANDMIRRORED = 5, + __UA_REDUNDANCYSUPPORT_FORCE32BIT = 0x7fffffff +} UA_RedundancySupport; +UA_STATIC_ASSERT(sizeof(UA_RedundancySupport) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_REDUNDANCYSUPPORT 206 + +/** + * ServerState + * ^^^^^^^^^^^ + */ +typedef enum { + UA_SERVERSTATE_RUNNING = 0, + UA_SERVERSTATE_FAILED = 1, + UA_SERVERSTATE_NOCONFIGURATION = 2, + UA_SERVERSTATE_SUSPENDED = 3, + UA_SERVERSTATE_SHUTDOWN = 4, + UA_SERVERSTATE_TEST = 5, + UA_SERVERSTATE_COMMUNICATIONFAULT = 6, + UA_SERVERSTATE_UNKNOWN = 7, + __UA_SERVERSTATE_FORCE32BIT = 0x7fffffff +} UA_ServerState; +UA_STATIC_ASSERT(sizeof(UA_ServerState) == sizeof(UA_Int32), enum_must_be_32bit); + +#define UA_TYPES_SERVERSTATE 207 + +/** + * ServerDiagnosticsSummaryDataType + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ typedef struct { - UA_RequestHeader requestHeader; - UA_Boolean releaseContinuationPoints; - size_t continuationPointsSize; - UA_ByteString *continuationPoints; -} UA_BrowseNextRequest; + UA_UInt32 serverViewCount; + UA_UInt32 currentSessionCount; + UA_UInt32 cumulatedSessionCount; + UA_UInt32 securityRejectedSessionCount; + UA_UInt32 rejectedSessionCount; + UA_UInt32 sessionTimeoutCount; + UA_UInt32 sessionAbortCount; + UA_UInt32 currentSubscriptionCount; + UA_UInt32 cumulatedSubscriptionCount; + UA_UInt32 publishingIntervalCount; + UA_UInt32 securityRejectedRequestsCount; + UA_UInt32 rejectedRequestsCount; +} UA_ServerDiagnosticsSummaryDataType; -#define UA_TYPES_BROWSENEXTREQUEST 114 +#define UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE 208 /** - * CreateSubscriptionRequest - * ^^^^^^^^^^^^^^^^^^^^^^^^^ + * ServerStatusDataType + * ^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_RequestHeader requestHeader; - UA_Double requestedPublishingInterval; - UA_UInt32 requestedLifetimeCount; - UA_UInt32 requestedMaxKeepAliveCount; - UA_UInt32 maxNotificationsPerPublish; - UA_Boolean publishingEnabled; - UA_Byte priority; -} UA_CreateSubscriptionRequest; + UA_DateTime startTime; + UA_DateTime currentTime; + UA_ServerState state; + UA_BuildInfo buildInfo; + UA_UInt32 secondsTillShutdown; + UA_LocalizedText shutdownReason; +} UA_ServerStatusDataType; -#define UA_TYPES_CREATESUBSCRIPTIONREQUEST 115 +#define UA_TYPES_SERVERSTATUSDATATYPE 209 /** - * VariableTypeAttributes - * ^^^^^^^^^^^^^^^^^^^^^^ - * The attributes for a variable type node. */ + * Range + * ^^^^^ + */ typedef struct { - UA_UInt32 specifiedAttributes; - UA_LocalizedText displayName; - UA_LocalizedText description; - UA_UInt32 writeMask; - UA_UInt32 userWriteMask; - UA_Variant value; - UA_NodeId dataType; - UA_Int32 valueRank; - size_t arrayDimensionsSize; - UA_UInt32 *arrayDimensions; - UA_Boolean isAbstract; -} UA_VariableTypeAttributes; + UA_Double low; + UA_Double high; +} UA_Range; -#define UA_TYPES_VARIABLETYPEATTRIBUTES 116 +#define UA_TYPES_RANGE 210 /** - * BrowsePathResult - * ^^^^^^^^^^^^^^^^ - * The result of a translate opearation. */ + * StructureDescription + * ^^^^^^^^^^^^^^^^^^^^ + */ typedef struct { - UA_StatusCode statusCode; - size_t targetsSize; - UA_BrowsePathTarget *targets; -} UA_BrowsePathResult; + UA_NodeId dataTypeId; + UA_QualifiedName name; + UA_StructureDefinition structureDefinition; +} UA_StructureDescription; -#define UA_TYPES_BROWSEPATHRESULT 117 +#define UA_TYPES_STRUCTUREDESCRIPTION 211 /** - * ModifySubscriptionResponse - * ^^^^^^^^^^^^^^^^^^^^^^^^^^ + * FieldMetaData + * ^^^^^^^^^^^^^ */ typedef struct { - UA_ResponseHeader responseHeader; - UA_Double revisedPublishingInterval; - UA_UInt32 revisedLifetimeCount; - UA_UInt32 revisedMaxKeepAliveCount; -} UA_ModifySubscriptionResponse; + UA_String name; + UA_LocalizedText description; + UA_DataSetFieldFlags fieldFlags; + UA_Byte builtInType; + UA_NodeId dataType; + UA_Int32 valueRank; + size_t arrayDimensionsSize; + UA_UInt32 *arrayDimensions; + UA_UInt32 maxStringLength; + UA_Guid dataSetFieldId; + size_t propertiesSize; + UA_KeyValuePair *properties; +} UA_FieldMetaData; -#define UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE 118 +#define UA_TYPES_FIELDMETADATA 212 /** - * RedundantServerDataType - * ^^^^^^^^^^^^^^^^^^^^^^^ + * WriterGroupDataType + * ^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_String serverId; - UA_Byte serviceLevel; - UA_ServerState serverState; -} UA_RedundantServerDataType; + UA_String name; + UA_Boolean enabled; + UA_MessageSecurityMode securityMode; + UA_String securityGroupId; + size_t securityKeyServicesSize; + UA_EndpointDescription *securityKeyServices; + UA_UInt32 maxNetworkMessageSize; + size_t groupPropertiesSize; + UA_KeyValuePair *groupProperties; + UA_UInt16 writerGroupId; + UA_Double publishingInterval; + UA_Double keepAliveTime; + UA_Byte priority; + size_t localeIdsSize; + UA_String *localeIds; + UA_String headerLayoutUri; + UA_ExtensionObject transportSettings; + UA_ExtensionObject messageSettings; + size_t dataSetWritersSize; + UA_DataSetWriterDataType *dataSetWriters; +} UA_WriterGroupDataType; -#define UA_TYPES_REDUNDANTSERVERDATATYPE 119 +#define UA_TYPES_WRITERGROUPDATATYPE 213 /** - * RegisterNodesResponse - * ^^^^^^^^^^^^^^^^^^^^^ - * Registers one or more nodes for repeated use within a session. */ + * FieldTargetDataType + * ^^^^^^^^^^^^^^^^^^^ + */ typedef struct { - UA_ResponseHeader responseHeader; - size_t registeredNodeIdsSize; - UA_NodeId *registeredNodeIds; -} UA_RegisterNodesResponse; + UA_Guid dataSetFieldId; + UA_String receiverIndexRange; + UA_NodeId targetNodeId; + UA_UInt32 attributeId; + UA_String writeIndexRange; + UA_OverrideValueHandling overrideValueHandling; + UA_Variant overrideValue; +} UA_FieldTargetDataType; -#define UA_TYPES_REGISTERNODESRESPONSE 120 +#define UA_TYPES_FIELDTARGETDATATYPE 214 /** - * CloseSessionRequest - * ^^^^^^^^^^^^^^^^^^^ - * Closes a session with the server. */ + * EnumDefinition + * ^^^^^^^^^^^^^^ + */ typedef struct { - UA_RequestHeader requestHeader; - UA_Boolean deleteSubscriptions; -} UA_CloseSessionRequest; + size_t fieldsSize; + UA_EnumField *fields; +} UA_EnumDefinition; -#define UA_TYPES_CLOSESESSIONREQUEST 121 +#define UA_TYPES_ENUMDEFINITION 215 /** - * ModifyMonitoredItemsResponse - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * DataChangeNotification + * ^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_MonitoredItemModifyResult *results; + size_t monitoredItemsSize; + UA_MonitoredItemNotification *monitoredItems; size_t diagnosticInfosSize; UA_DiagnosticInfo *diagnosticInfos; -} UA_ModifyMonitoredItemsResponse; +} UA_DataChangeNotification; -#define UA_TYPES_MODIFYMONITOREDITEMSRESPONSE 122 +#define UA_TYPES_DATACHANGENOTIFICATION 216 /** - * ModifySubscriptionRequest - * ^^^^^^^^^^^^^^^^^^^^^^^^^ + * EventNotificationList + * ^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_RequestHeader requestHeader; - UA_UInt32 subscriptionId; - UA_Double requestedPublishingInterval; - UA_UInt32 requestedLifetimeCount; - UA_UInt32 requestedMaxKeepAliveCount; - UA_UInt32 maxNotificationsPerPublish; - UA_Byte priority; -} UA_ModifySubscriptionRequest; + size_t eventsSize; + UA_EventFieldList *events; +} UA_EventNotificationList; -#define UA_TYPES_MODIFYSUBSCRIPTIONREQUEST 123 +#define UA_TYPES_EVENTNOTIFICATIONLIST 217 /** - * ServerDiagnosticsSummaryDataType - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * EnumDescription + * ^^^^^^^^^^^^^^^ */ typedef struct { - UA_UInt32 serverViewCount; - UA_UInt32 currentSessionCount; - UA_UInt32 cumulatedSessionCount; - UA_UInt32 securityRejectedSessionCount; - UA_UInt32 rejectedSessionCount; - UA_UInt32 sessionTimeoutCount; - UA_UInt32 sessionAbortCount; - UA_UInt32 currentSubscriptionCount; - UA_UInt32 cumulatedSubscriptionCount; - UA_UInt32 publishingIntervalCount; - UA_UInt32 securityRejectedRequestsCount; - UA_UInt32 rejectedRequestsCount; -} UA_ServerDiagnosticsSummaryDataType; + UA_NodeId dataTypeId; + UA_QualifiedName name; + UA_EnumDefinition enumDefinition; + UA_Byte builtInType; +} UA_EnumDescription; -#define UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE 124 +#define UA_TYPES_ENUMDESCRIPTION 218 /** - * UserTokenPolicy - * ^^^^^^^^^^^^^^^ - * Describes a user token that can be used with a server. */ + * DataSetMetaDataType + * ^^^^^^^^^^^^^^^^^^^ + */ typedef struct { - UA_String policyId; - UA_UserTokenType tokenType; - UA_String issuedTokenType; - UA_String issuerEndpointUrl; - UA_String securityPolicyUri; -} UA_UserTokenPolicy; + size_t namespacesSize; + UA_String *namespaces; + size_t structureDataTypesSize; + UA_StructureDescription *structureDataTypes; + size_t enumDataTypesSize; + UA_EnumDescription *enumDataTypes; + size_t simpleDataTypesSize; + UA_SimpleTypeDescription *simpleDataTypes; + UA_String name; + UA_LocalizedText description; + size_t fieldsSize; + UA_FieldMetaData *fields; + UA_Guid dataSetClassId; + UA_ConfigurationVersionDataType configurationVersion; +} UA_DataSetMetaDataType; -#define UA_TYPES_USERTOKENPOLICY 125 +#define UA_TYPES_DATASETMETADATATYPE 219 /** - * ReferenceTypeAttributes - * ^^^^^^^^^^^^^^^^^^^^^^^ - * The attributes for a reference type node. */ + * DataSetReaderDataType + * ^^^^^^^^^^^^^^^^^^^^^ + */ typedef struct { - UA_UInt32 specifiedAttributes; - UA_LocalizedText displayName; - UA_LocalizedText description; - UA_UInt32 writeMask; - UA_UInt32 userWriteMask; - UA_Boolean isAbstract; - UA_Boolean symmetric; - UA_LocalizedText inverseName; -} UA_ReferenceTypeAttributes; + UA_String name; + UA_Boolean enabled; + UA_Variant publisherId; + UA_UInt16 writerGroupId; + UA_UInt16 dataSetWriterId; + UA_DataSetMetaDataType dataSetMetaData; + UA_DataSetFieldContentMask dataSetFieldContentMask; + UA_Double messageReceiveTimeout; + UA_UInt32 keyFrameCount; + UA_String headerLayoutUri; + UA_MessageSecurityMode securityMode; + UA_String securityGroupId; + size_t securityKeyServicesSize; + UA_EndpointDescription *securityKeyServices; + size_t dataSetReaderPropertiesSize; + UA_KeyValuePair *dataSetReaderProperties; + UA_ExtensionObject transportSettings; + UA_ExtensionObject messageSettings; + UA_ExtensionObject subscribedDataSet; +} UA_DataSetReaderDataType; -#define UA_TYPES_REFERENCETYPEATTRIBUTES 126 +#define UA_TYPES_DATASETREADERDATATYPE 220 /** - * BrowsePath - * ^^^^^^^^^^ - * A request to translate a path into a node id. */ + * TargetVariablesDataType + * ^^^^^^^^^^^^^^^^^^^^^^^ + */ typedef struct { - UA_NodeId startingNode; - UA_RelativePath relativePath; -} UA_BrowsePath; + size_t targetVariablesSize; + UA_FieldTargetDataType *targetVariables; +} UA_TargetVariablesDataType; -#define UA_TYPES_BROWSEPATH 127 +#define UA_TYPES_TARGETVARIABLESDATATYPE 221 /** - * SetMonitoringModeRequest + * ReaderGroupDataType + * ^^^^^^^^^^^^^^^^^^^ + */ +typedef struct { + UA_String name; + UA_Boolean enabled; + UA_MessageSecurityMode securityMode; + UA_String securityGroupId; + size_t securityKeyServicesSize; + UA_EndpointDescription *securityKeyServices; + UA_UInt32 maxNetworkMessageSize; + size_t groupPropertiesSize; + UA_KeyValuePair *groupProperties; + UA_ExtensionObject transportSettings; + UA_ExtensionObject messageSettings; + size_t dataSetReadersSize; + UA_DataSetReaderDataType *dataSetReaders; +} UA_ReaderGroupDataType; + +#define UA_TYPES_READERGROUPDATATYPE 222 + +/** + * PubSubConnectionDataType * ^^^^^^^^^^^^^^^^^^^^^^^^ */ typedef struct { - UA_RequestHeader requestHeader; - UA_UInt32 subscriptionId; - UA_MonitoringMode monitoringMode; - size_t monitoredItemIdsSize; - UA_UInt32 *monitoredItemIds; -} UA_SetMonitoringModeRequest; + UA_String name; + UA_Boolean enabled; + UA_Variant publisherId; + UA_String transportProfileUri; + UA_ExtensionObject address; + size_t connectionPropertiesSize; + UA_KeyValuePair *connectionProperties; + UA_ExtensionObject transportSettings; + size_t writerGroupsSize; + UA_WriterGroupDataType *writerGroups; + size_t readerGroupsSize; + UA_ReaderGroupDataType *readerGroups; +} UA_PubSubConnectionDataType; + +#define UA_TYPES_PUBSUBCONNECTIONDATATYPE 223 + + +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/build/src_generated/open62541/types_generated_handling.h" ***********************************/ + +/* Generated from Opc.Ua.Types.bsd with script /Users/jelena/Desktop/open62541/tools/generate_datatypes.py + * on host Jelena-2.local by user jelena at 2025-09-11 03:30:41 */ + + + +_UA_BEGIN_DECLS + +#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wmissing-field-initializers" +# pragma GCC diagnostic ignored "-Wmissing-braces" +#endif + + +/* Boolean */ +static UA_INLINE void +UA_Boolean_init(UA_Boolean *p) { + memset(p, 0, sizeof(UA_Boolean)); +} + +static UA_INLINE UA_Boolean * +UA_Boolean_new(void) { + return (UA_Boolean*)UA_new(&UA_TYPES[UA_TYPES_BOOLEAN]); +} + +static UA_INLINE UA_StatusCode +UA_Boolean_copy(const UA_Boolean *src, UA_Boolean *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} + +static UA_INLINE void +UA_Boolean_deleteMembers(UA_Boolean *p) { + memset(p, 0, sizeof(UA_Boolean)); +} + +static UA_INLINE void +UA_Boolean_clear(UA_Boolean *p) { + memset(p, 0, sizeof(UA_Boolean)); +} + +static UA_INLINE void +UA_Boolean_delete(UA_Boolean *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BOOLEAN]); +} + +/* SByte */ +static UA_INLINE void +UA_SByte_init(UA_SByte *p) { + memset(p, 0, sizeof(UA_SByte)); +} + +static UA_INLINE UA_SByte * +UA_SByte_new(void) { + return (UA_SByte*)UA_new(&UA_TYPES[UA_TYPES_SBYTE]); +} + +static UA_INLINE UA_StatusCode +UA_SByte_copy(const UA_SByte *src, UA_SByte *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} + +static UA_INLINE void +UA_SByte_deleteMembers(UA_SByte *p) { + memset(p, 0, sizeof(UA_SByte)); +} + +static UA_INLINE void +UA_SByte_clear(UA_SByte *p) { + memset(p, 0, sizeof(UA_SByte)); +} + +static UA_INLINE void +UA_SByte_delete(UA_SByte *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SBYTE]); +} + +/* Byte */ +static UA_INLINE void +UA_Byte_init(UA_Byte *p) { + memset(p, 0, sizeof(UA_Byte)); +} + +static UA_INLINE UA_Byte * +UA_Byte_new(void) { + return (UA_Byte*)UA_new(&UA_TYPES[UA_TYPES_BYTE]); +} + +static UA_INLINE UA_StatusCode +UA_Byte_copy(const UA_Byte *src, UA_Byte *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} -#define UA_TYPES_SETMONITORINGMODEREQUEST 128 +static UA_INLINE void +UA_Byte_deleteMembers(UA_Byte *p) { + memset(p, 0, sizeof(UA_Byte)); +} + +static UA_INLINE void +UA_Byte_clear(UA_Byte *p) { + memset(p, 0, sizeof(UA_Byte)); +} + +static UA_INLINE void +UA_Byte_delete(UA_Byte *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BYTE]); +} + +/* Int16 */ +static UA_INLINE void +UA_Int16_init(UA_Int16 *p) { + memset(p, 0, sizeof(UA_Int16)); +} + +static UA_INLINE UA_Int16 * +UA_Int16_new(void) { + return (UA_Int16*)UA_new(&UA_TYPES[UA_TYPES_INT16]); +} + +static UA_INLINE UA_StatusCode +UA_Int16_copy(const UA_Int16 *src, UA_Int16 *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} + +static UA_INLINE void +UA_Int16_deleteMembers(UA_Int16 *p) { + memset(p, 0, sizeof(UA_Int16)); +} -/** - * UnregisterNodesResponse - * ^^^^^^^^^^^^^^^^^^^^^^^ - * Unregisters one or more previously registered nodes. */ -typedef struct { - UA_ResponseHeader responseHeader; -} UA_UnregisterNodesResponse; +static UA_INLINE void +UA_Int16_clear(UA_Int16 *p) { + memset(p, 0, sizeof(UA_Int16)); +} -#define UA_TYPES_UNREGISTERNODESRESPONSE 129 +static UA_INLINE void +UA_Int16_delete(UA_Int16 *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_INT16]); +} -/** - * WriteRequest - * ^^^^^^^^^^^^ - */ -typedef struct { - UA_RequestHeader requestHeader; - size_t nodesToWriteSize; - UA_WriteValue *nodesToWrite; -} UA_WriteRequest; +/* UInt16 */ +static UA_INLINE void +UA_UInt16_init(UA_UInt16 *p) { + memset(p, 0, sizeof(UA_UInt16)); +} -#define UA_TYPES_WRITEREQUEST 130 +static UA_INLINE UA_UInt16 * +UA_UInt16_new(void) { + return (UA_UInt16*)UA_new(&UA_TYPES[UA_TYPES_UINT16]); +} -/** - * ObjectAttributes - * ^^^^^^^^^^^^^^^^ - * The attributes for an object node. */ -typedef struct { - UA_UInt32 specifiedAttributes; - UA_LocalizedText displayName; - UA_LocalizedText description; - UA_UInt32 writeMask; - UA_UInt32 userWriteMask; - UA_Byte eventNotifier; -} UA_ObjectAttributes; +static UA_INLINE UA_StatusCode +UA_UInt16_copy(const UA_UInt16 *src, UA_UInt16 *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} -#define UA_TYPES_OBJECTATTRIBUTES 131 +static UA_INLINE void +UA_UInt16_deleteMembers(UA_UInt16 *p) { + memset(p, 0, sizeof(UA_UInt16)); +} -/** - * BrowseResultMask - * ^^^^^^^^^^^^^^^^ - * A bit mask which specifies what should be returned in a browse response. */ -typedef enum { - UA_BROWSERESULTMASK_NONE = 0, - UA_BROWSERESULTMASK_REFERENCETYPEID = 1, - UA_BROWSERESULTMASK_ISFORWARD = 2, - UA_BROWSERESULTMASK_NODECLASS = 4, - UA_BROWSERESULTMASK_BROWSENAME = 8, - UA_BROWSERESULTMASK_DISPLAYNAME = 16, - UA_BROWSERESULTMASK_TYPEDEFINITION = 32, - UA_BROWSERESULTMASK_ALL = 63, - UA_BROWSERESULTMASK_REFERENCETYPEINFO = 3, - UA_BROWSERESULTMASK_TARGETINFO = 60, - __UA_BROWSERESULTMASK_FORCE32BIT = 0x7fffffff -} UA_BrowseResultMask; -UA_STATIC_ASSERT(sizeof(UA_BrowseResultMask) == sizeof(UA_Int32), enum_must_be_32bit); +static UA_INLINE void +UA_UInt16_clear(UA_UInt16 *p) { + memset(p, 0, sizeof(UA_UInt16)); +} -#define UA_TYPES_BROWSERESULTMASK 132 +static UA_INLINE void +UA_UInt16_delete(UA_UInt16 *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_UINT16]); +} -/** - * BrowseDescription - * ^^^^^^^^^^^^^^^^^ - * A request to browse the the references from a node. */ -typedef struct { - UA_NodeId nodeId; - UA_BrowseDirection browseDirection; - UA_NodeId referenceTypeId; - UA_Boolean includeSubtypes; - UA_UInt32 nodeClassMask; - UA_UInt32 resultMask; -} UA_BrowseDescription; +/* Int32 */ +static UA_INLINE void +UA_Int32_init(UA_Int32 *p) { + memset(p, 0, sizeof(UA_Int32)); +} -#define UA_TYPES_BROWSEDESCRIPTION 133 +static UA_INLINE UA_Int32 * +UA_Int32_new(void) { + return (UA_Int32*)UA_new(&UA_TYPES[UA_TYPES_INT32]); +} -/** - * SetTriggeringRequest - * ^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_RequestHeader requestHeader; - UA_UInt32 subscriptionId; - UA_UInt32 triggeringItemId; - size_t linksToAddSize; - UA_UInt32 *linksToAdd; - size_t linksToRemoveSize; - UA_UInt32 *linksToRemove; -} UA_SetTriggeringRequest; +static UA_INLINE UA_StatusCode +UA_Int32_copy(const UA_Int32 *src, UA_Int32 *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} -#define UA_TYPES_SETTRIGGERINGREQUEST 134 +static UA_INLINE void +UA_Int32_deleteMembers(UA_Int32 *p) { + memset(p, 0, sizeof(UA_Int32)); +} -/** - * SessionSecurityDiagnosticsDataType - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_NodeId sessionId; - UA_String clientUserIdOfSession; - size_t clientUserIdHistorySize; - UA_String *clientUserIdHistory; - UA_String authenticationMechanism; - UA_String encoding; - UA_String transportProtocol; - UA_MessageSecurityMode securityMode; - UA_String securityPolicyUri; - UA_ByteString clientCertificate; -} UA_SessionSecurityDiagnosticsDataType; +static UA_INLINE void +UA_Int32_clear(UA_Int32 *p) { + memset(p, 0, sizeof(UA_Int32)); +} -#define UA_TYPES_SESSIONSECURITYDIAGNOSTICSDATATYPE 135 +static UA_INLINE void +UA_Int32_delete(UA_Int32 *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_INT32]); +} -/** - * RepublishRequest - * ^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_RequestHeader requestHeader; - UA_UInt32 subscriptionId; - UA_UInt32 retransmitSequenceNumber; -} UA_RepublishRequest; +/* UInt32 */ +static UA_INLINE void +UA_UInt32_init(UA_UInt32 *p) { + memset(p, 0, sizeof(UA_UInt32)); +} -#define UA_TYPES_REPUBLISHREQUEST 136 +static UA_INLINE UA_UInt32 * +UA_UInt32_new(void) { + return (UA_UInt32*)UA_new(&UA_TYPES[UA_TYPES_UINT32]); +} -/** - * GetEndpointsRequest - * ^^^^^^^^^^^^^^^^^^^ - * Gets the endpoints used by the server. */ -typedef struct { - UA_RequestHeader requestHeader; - UA_String endpointUrl; - size_t localeIdsSize; - UA_String *localeIds; - size_t profileUrisSize; - UA_String *profileUris; -} UA_GetEndpointsRequest; +static UA_INLINE UA_StatusCode +UA_UInt32_copy(const UA_UInt32 *src, UA_UInt32 *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} -#define UA_TYPES_GETENDPOINTSREQUEST 137 +static UA_INLINE void +UA_UInt32_deleteMembers(UA_UInt32 *p) { + memset(p, 0, sizeof(UA_UInt32)); +} -/** - * PublishRequest - * ^^^^^^^^^^^^^^ - */ -typedef struct { - UA_RequestHeader requestHeader; - size_t subscriptionAcknowledgementsSize; - UA_SubscriptionAcknowledgement *subscriptionAcknowledgements; -} UA_PublishRequest; +static UA_INLINE void +UA_UInt32_clear(UA_UInt32 *p) { + memset(p, 0, sizeof(UA_UInt32)); +} -#define UA_TYPES_PUBLISHREQUEST 138 +static UA_INLINE void +UA_UInt32_delete(UA_UInt32 *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_UINT32]); +} -/** - * DeleteSubscriptionsResponse - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_StatusCode *results; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_DeleteSubscriptionsResponse; +/* Int64 */ +static UA_INLINE void +UA_Int64_init(UA_Int64 *p) { + memset(p, 0, sizeof(UA_Int64)); +} -#define UA_TYPES_DELETESUBSCRIPTIONSRESPONSE 139 +static UA_INLINE UA_Int64 * +UA_Int64_new(void) { + return (UA_Int64*)UA_new(&UA_TYPES[UA_TYPES_INT64]); +} -/** - * AddNodesResponse - * ^^^^^^^^^^^^^^^^ - * Adds one or more nodes to the server address space. */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_AddNodesResult *results; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_AddNodesResponse; +static UA_INLINE UA_StatusCode +UA_Int64_copy(const UA_Int64 *src, UA_Int64 *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} -#define UA_TYPES_ADDNODESRESPONSE 140 +static UA_INLINE void +UA_Int64_deleteMembers(UA_Int64 *p) { + memset(p, 0, sizeof(UA_Int64)); +} -/** - * DataChangeNotification - * ^^^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - size_t monitoredItemsSize; - UA_MonitoredItemNotification *monitoredItems; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_DataChangeNotification; +static UA_INLINE void +UA_Int64_clear(UA_Int64 *p) { + memset(p, 0, sizeof(UA_Int64)); +} -#define UA_TYPES_DATACHANGENOTIFICATION 141 +static UA_INLINE void +UA_Int64_delete(UA_Int64 *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_INT64]); +} -/** - * CloseSecureChannelResponse - * ^^^^^^^^^^^^^^^^^^^^^^^^^^ - * Closes a secure channel. */ -typedef struct { - UA_ResponseHeader responseHeader; -} UA_CloseSecureChannelResponse; +/* UInt64 */ +static UA_INLINE void +UA_UInt64_init(UA_UInt64 *p) { + memset(p, 0, sizeof(UA_UInt64)); +} -#define UA_TYPES_CLOSESECURECHANNELRESPONSE 142 +static UA_INLINE UA_UInt64 * +UA_UInt64_new(void) { + return (UA_UInt64*)UA_new(&UA_TYPES[UA_TYPES_UINT64]); +} -/** - * ModifyMonitoredItemsRequest - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_RequestHeader requestHeader; - UA_UInt32 subscriptionId; - UA_TimestampsToReturn timestampsToReturn; - size_t itemsToModifySize; - UA_MonitoredItemModifyRequest *itemsToModify; -} UA_ModifyMonitoredItemsRequest; +static UA_INLINE UA_StatusCode +UA_UInt64_copy(const UA_UInt64 *src, UA_UInt64 *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} -#define UA_TYPES_MODIFYMONITOREDITEMSREQUEST 143 +static UA_INLINE void +UA_UInt64_deleteMembers(UA_UInt64 *p) { + memset(p, 0, sizeof(UA_UInt64)); +} -/** - * SetMonitoringModeResponse - * ^^^^^^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_StatusCode *results; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_SetMonitoringModeResponse; +static UA_INLINE void +UA_UInt64_clear(UA_UInt64 *p) { + memset(p, 0, sizeof(UA_UInt64)); +} -#define UA_TYPES_SETMONITORINGMODERESPONSE 144 +static UA_INLINE void +UA_UInt64_delete(UA_UInt64 *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_UINT64]); +} -/** - * FindServersRequest - * ^^^^^^^^^^^^^^^^^^ - * Finds the servers known to the discovery server. */ -typedef struct { - UA_RequestHeader requestHeader; - UA_String endpointUrl; - size_t localeIdsSize; - UA_String *localeIds; - size_t serverUrisSize; - UA_String *serverUris; -} UA_FindServersRequest; +/* Float */ +static UA_INLINE void +UA_Float_init(UA_Float *p) { + memset(p, 0, sizeof(UA_Float)); +} -#define UA_TYPES_FINDSERVERSREQUEST 145 +static UA_INLINE UA_Float * +UA_Float_new(void) { + return (UA_Float*)UA_new(&UA_TYPES[UA_TYPES_FLOAT]); +} -/** - * ReferenceDescription - * ^^^^^^^^^^^^^^^^^^^^ - * The description of a reference. */ -typedef struct { - UA_NodeId referenceTypeId; - UA_Boolean isForward; - UA_ExpandedNodeId nodeId; - UA_QualifiedName browseName; - UA_LocalizedText displayName; - UA_NodeClass nodeClass; - UA_ExpandedNodeId typeDefinition; -} UA_ReferenceDescription; +static UA_INLINE UA_StatusCode +UA_Float_copy(const UA_Float *src, UA_Float *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} -#define UA_TYPES_REFERENCEDESCRIPTION 146 +static UA_INLINE void +UA_Float_deleteMembers(UA_Float *p) { + memset(p, 0, sizeof(UA_Float)); +} -/** - * SetPublishingModeResponse - * ^^^^^^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_StatusCode *results; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_SetPublishingModeResponse; +static UA_INLINE void +UA_Float_clear(UA_Float *p) { + memset(p, 0, sizeof(UA_Float)); +} -#define UA_TYPES_SETPUBLISHINGMODERESPONSE 147 +static UA_INLINE void +UA_Float_delete(UA_Float *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_FLOAT]); +} -/** - * ContentFilterResult - * ^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - size_t elementResultsSize; - UA_ContentFilterElementResult *elementResults; - size_t elementDiagnosticInfosSize; - UA_DiagnosticInfo *elementDiagnosticInfos; -} UA_ContentFilterResult; +/* Double */ +static UA_INLINE void +UA_Double_init(UA_Double *p) { + memset(p, 0, sizeof(UA_Double)); +} -#define UA_TYPES_CONTENTFILTERRESULT 148 +static UA_INLINE UA_Double * +UA_Double_new(void) { + return (UA_Double*)UA_new(&UA_TYPES[UA_TYPES_DOUBLE]); +} -/** - * RegisterServerResponse - * ^^^^^^^^^^^^^^^^^^^^^^ - * Registers a server with the discovery server. */ -typedef struct { - UA_ResponseHeader responseHeader; -} UA_RegisterServerResponse; +static UA_INLINE UA_StatusCode +UA_Double_copy(const UA_Double *src, UA_Double *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} -#define UA_TYPES_REGISTERSERVERRESPONSE 149 +static UA_INLINE void +UA_Double_deleteMembers(UA_Double *p) { + memset(p, 0, sizeof(UA_Double)); +} -/** - * AddReferencesItem - * ^^^^^^^^^^^^^^^^^ - * A request to add a reference to the server address space. */ -typedef struct { - UA_NodeId sourceNodeId; - UA_NodeId referenceTypeId; - UA_Boolean isForward; - UA_String targetServerUri; - UA_ExpandedNodeId targetNodeId; - UA_NodeClass targetNodeClass; -} UA_AddReferencesItem; +static UA_INLINE void +UA_Double_clear(UA_Double *p) { + memset(p, 0, sizeof(UA_Double)); +} -#define UA_TYPES_ADDREFERENCESITEM 150 +static UA_INLINE void +UA_Double_delete(UA_Double *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DOUBLE]); +} -/** - * QueryDataDescription - * ^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_RelativePath relativePath; - UA_UInt32 attributeId; - UA_String indexRange; -} UA_QueryDataDescription; +/* String */ +static UA_INLINE void +UA_String_init(UA_String *p) { + memset(p, 0, sizeof(UA_String)); +} -#define UA_TYPES_QUERYDATADESCRIPTION 151 +static UA_INLINE UA_String * +UA_String_new(void) { + return (UA_String*)UA_new(&UA_TYPES[UA_TYPES_STRING]); +} -/** - * CreateSubscriptionResponse - * ^^^^^^^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_ResponseHeader responseHeader; - UA_UInt32 subscriptionId; - UA_Double revisedPublishingInterval; - UA_UInt32 revisedLifetimeCount; - UA_UInt32 revisedMaxKeepAliveCount; -} UA_CreateSubscriptionResponse; +static UA_INLINE UA_StatusCode +UA_String_copy(const UA_String *src, UA_String *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_STRING]); +} -#define UA_TYPES_CREATESUBSCRIPTIONRESPONSE 152 +static UA_INLINE void +UA_String_deleteMembers(UA_String *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_STRING]); +} -/** - * NetworkGroupDataType - * ^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_String serverUri; - size_t networkPathsSize; - UA_EndpointUrlListDataType *networkPaths; -} UA_NetworkGroupDataType; +static UA_INLINE void +UA_String_clear(UA_String *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_STRING]); +} -#define UA_TYPES_NETWORKGROUPDATATYPE 153 +static UA_INLINE void +UA_String_delete(UA_String *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_STRING]); +} -/** - * DeleteReferencesResponse - * ^^^^^^^^^^^^^^^^^^^^^^^^ - * Delete one or more references from the server address space. */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_StatusCode *results; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_DeleteReferencesResponse; +/* DateTime */ +static UA_INLINE void +UA_DateTime_init(UA_DateTime *p) { + memset(p, 0, sizeof(UA_DateTime)); +} -#define UA_TYPES_DELETEREFERENCESRESPONSE 154 +static UA_INLINE UA_DateTime * +UA_DateTime_new(void) { + return (UA_DateTime*)UA_new(&UA_TYPES[UA_TYPES_DATETIME]); +} -/** - * CreateMonitoredItemsResponse - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_MonitoredItemCreateResult *results; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_CreateMonitoredItemsResponse; +static UA_INLINE UA_StatusCode +UA_DateTime_copy(const UA_DateTime *src, UA_DateTime *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} -#define UA_TYPES_CREATEMONITOREDITEMSRESPONSE 155 +static UA_INLINE void +UA_DateTime_deleteMembers(UA_DateTime *p) { + memset(p, 0, sizeof(UA_DateTime)); +} -/** - * CallResponse - * ^^^^^^^^^^^^ - */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_CallMethodResult *results; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_CallResponse; +static UA_INLINE void +UA_DateTime_clear(UA_DateTime *p) { + memset(p, 0, sizeof(UA_DateTime)); +} + +static UA_INLINE void +UA_DateTime_delete(UA_DateTime *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DATETIME]); +} -#define UA_TYPES_CALLRESPONSE 156 +/* Guid */ +static UA_INLINE void +UA_Guid_init(UA_Guid *p) { + memset(p, 0, sizeof(UA_Guid)); +} -/** - * DeleteNodesResponse - * ^^^^^^^^^^^^^^^^^^^ - * Delete one or more nodes from the server address space. */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_StatusCode *results; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_DeleteNodesResponse; +static UA_INLINE UA_Guid * +UA_Guid_new(void) { + return (UA_Guid*)UA_new(&UA_TYPES[UA_TYPES_GUID]); +} -#define UA_TYPES_DELETENODESRESPONSE 157 +static UA_INLINE UA_StatusCode +UA_Guid_copy(const UA_Guid *src, UA_Guid *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} -/** - * RepublishResponse - * ^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_ResponseHeader responseHeader; - UA_NotificationMessage notificationMessage; -} UA_RepublishResponse; +static UA_INLINE void +UA_Guid_deleteMembers(UA_Guid *p) { + memset(p, 0, sizeof(UA_Guid)); +} -#define UA_TYPES_REPUBLISHRESPONSE 158 +static UA_INLINE void +UA_Guid_clear(UA_Guid *p) { + memset(p, 0, sizeof(UA_Guid)); +} -/** - * MonitoredItemCreateRequest - * ^^^^^^^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_ReadValueId itemToMonitor; - UA_MonitoringMode monitoringMode; - UA_MonitoringParameters requestedParameters; -} UA_MonitoredItemCreateRequest; +static UA_INLINE void +UA_Guid_delete(UA_Guid *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_GUID]); +} -#define UA_TYPES_MONITOREDITEMCREATEREQUEST 159 +/* ByteString */ +static UA_INLINE void +UA_ByteString_init(UA_ByteString *p) { + memset(p, 0, sizeof(UA_ByteString)); +} -/** - * DeleteReferencesRequest - * ^^^^^^^^^^^^^^^^^^^^^^^ - * Delete one or more references from the server address space. */ -typedef struct { - UA_RequestHeader requestHeader; - size_t referencesToDeleteSize; - UA_DeleteReferencesItem *referencesToDelete; -} UA_DeleteReferencesRequest; +static UA_INLINE UA_ByteString * +UA_ByteString_new(void) { + return (UA_ByteString*)UA_new(&UA_TYPES[UA_TYPES_BYTESTRING]); +} -#define UA_TYPES_DELETEREFERENCESREQUEST 160 +static UA_INLINE UA_StatusCode +UA_ByteString_copy(const UA_ByteString *src, UA_ByteString *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BYTESTRING]); +} -/** - * ReadResponse - * ^^^^^^^^^^^^ - */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_DataValue *results; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_ReadResponse; +static UA_INLINE void +UA_ByteString_deleteMembers(UA_ByteString *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BYTESTRING]); +} -#define UA_TYPES_READRESPONSE 161 +static UA_INLINE void +UA_ByteString_clear(UA_ByteString *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BYTESTRING]); +} -/** - * AddReferencesRequest - * ^^^^^^^^^^^^^^^^^^^^ - * Adds one or more references to the server address space. */ -typedef struct { - UA_RequestHeader requestHeader; - size_t referencesToAddSize; - UA_AddReferencesItem *referencesToAdd; -} UA_AddReferencesRequest; +static UA_INLINE void +UA_ByteString_delete(UA_ByteString *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BYTESTRING]); +} -#define UA_TYPES_ADDREFERENCESREQUEST 162 +/* XmlElement */ +static UA_INLINE void +UA_XmlElement_init(UA_XmlElement *p) { + memset(p, 0, sizeof(UA_XmlElement)); +} -/** - * ReadRequest - * ^^^^^^^^^^^ - */ -typedef struct { - UA_RequestHeader requestHeader; - UA_Double maxAge; - UA_TimestampsToReturn timestampsToReturn; - size_t nodesToReadSize; - UA_ReadValueId *nodesToRead; -} UA_ReadRequest; +static UA_INLINE UA_XmlElement * +UA_XmlElement_new(void) { + return (UA_XmlElement*)UA_new(&UA_TYPES[UA_TYPES_XMLELEMENT]); +} + +static UA_INLINE UA_StatusCode +UA_XmlElement_copy(const UA_XmlElement *src, UA_XmlElement *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_XMLELEMENT]); +} -#define UA_TYPES_READREQUEST 163 +static UA_INLINE void +UA_XmlElement_deleteMembers(UA_XmlElement *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_XMLELEMENT]); +} -/** - * OpenSecureChannelRequest - * ^^^^^^^^^^^^^^^^^^^^^^^^ - * Creates a secure channel with a server. */ -typedef struct { - UA_RequestHeader requestHeader; - UA_UInt32 clientProtocolVersion; - UA_SecurityTokenRequestType requestType; - UA_MessageSecurityMode securityMode; - UA_ByteString clientNonce; - UA_UInt32 requestedLifetime; -} UA_OpenSecureChannelRequest; +static UA_INLINE void +UA_XmlElement_clear(UA_XmlElement *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_XMLELEMENT]); +} -#define UA_TYPES_OPENSECURECHANNELREQUEST 164 +static UA_INLINE void +UA_XmlElement_delete(UA_XmlElement *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_XMLELEMENT]); +} -/** - * RegisterServer2Response - * ^^^^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t configurationResultsSize; - UA_StatusCode *configurationResults; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_RegisterServer2Response; +/* NodeId */ +static UA_INLINE void +UA_NodeId_init(UA_NodeId *p) { + memset(p, 0, sizeof(UA_NodeId)); +} -#define UA_TYPES_REGISTERSERVER2RESPONSE 165 +static UA_INLINE UA_NodeId * +UA_NodeId_new(void) { + return (UA_NodeId*)UA_new(&UA_TYPES[UA_TYPES_NODEID]); +} -/** - * AddNodesItem - * ^^^^^^^^^^^^ - * A request to add a node to the server address space. */ -typedef struct { - UA_ExpandedNodeId parentNodeId; - UA_NodeId referenceTypeId; - UA_ExpandedNodeId requestedNewNodeId; - UA_QualifiedName browseName; - UA_NodeClass nodeClass; - UA_ExtensionObject nodeAttributes; - UA_ExpandedNodeId typeDefinition; -} UA_AddNodesItem; +static UA_INLINE UA_StatusCode +UA_NodeId_copy(const UA_NodeId *src, UA_NodeId *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_NODEID]); +} -#define UA_TYPES_ADDNODESITEM 166 +static UA_INLINE void +UA_NodeId_deleteMembers(UA_NodeId *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_NODEID]); +} -/** - * NodeTypeDescription - * ^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_ExpandedNodeId typeDefinitionNode; - UA_Boolean includeSubTypes; - size_t dataToReturnSize; - UA_QueryDataDescription *dataToReturn; -} UA_NodeTypeDescription; +static UA_INLINE void +UA_NodeId_clear(UA_NodeId *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_NODEID]); +} -#define UA_TYPES_NODETYPEDESCRIPTION 167 +static UA_INLINE void +UA_NodeId_delete(UA_NodeId *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_NODEID]); +} -/** - * ServerStatusDataType - * ^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_DateTime startTime; - UA_DateTime currentTime; - UA_ServerState state; - UA_BuildInfo buildInfo; - UA_UInt32 secondsTillShutdown; - UA_LocalizedText shutdownReason; -} UA_ServerStatusDataType; +/* ExpandedNodeId */ +static UA_INLINE void +UA_ExpandedNodeId_init(UA_ExpandedNodeId *p) { + memset(p, 0, sizeof(UA_ExpandedNodeId)); +} -#define UA_TYPES_SERVERSTATUSDATATYPE 168 +static UA_INLINE UA_ExpandedNodeId * +UA_ExpandedNodeId_new(void) { + return (UA_ExpandedNodeId*)UA_new(&UA_TYPES[UA_TYPES_EXPANDEDNODEID]); +} -/** - * AttributeOperand - * ^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_NodeId nodeId; - UA_String alias; - UA_RelativePath browsePath; - UA_UInt32 attributeId; - UA_String indexRange; -} UA_AttributeOperand; +static UA_INLINE UA_StatusCode +UA_ExpandedNodeId_copy(const UA_ExpandedNodeId *src, UA_ExpandedNodeId *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); +} + +static UA_INLINE void +UA_ExpandedNodeId_deleteMembers(UA_ExpandedNodeId *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); +} -#define UA_TYPES_ATTRIBUTEOPERAND 169 +static UA_INLINE void +UA_ExpandedNodeId_clear(UA_ExpandedNodeId *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); +} -/** - * AddReferencesResponse - * ^^^^^^^^^^^^^^^^^^^^^ - * Adds one or more references to the server address space. */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_StatusCode *results; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_AddReferencesResponse; +static UA_INLINE void +UA_ExpandedNodeId_delete(UA_ExpandedNodeId *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); +} -#define UA_TYPES_ADDREFERENCESRESPONSE 170 +/* StatusCode */ +static UA_INLINE void +UA_StatusCode_init(UA_StatusCode *p) { + memset(p, 0, sizeof(UA_StatusCode)); +} -/** - * EventFilterResult - * ^^^^^^^^^^^^^^^^^ - */ -typedef struct { - size_t selectClauseResultsSize; - UA_StatusCode *selectClauseResults; - size_t selectClauseDiagnosticInfosSize; - UA_DiagnosticInfo *selectClauseDiagnosticInfos; - UA_ContentFilterResult whereClauseResult; -} UA_EventFilterResult; +static UA_INLINE UA_StatusCode * +UA_StatusCode_new(void) { + return (UA_StatusCode*)UA_new(&UA_TYPES[UA_TYPES_STATUSCODE]); +} -#define UA_TYPES_EVENTFILTERRESULT 171 +static UA_INLINE UA_StatusCode +UA_StatusCode_copy(const UA_StatusCode *src, UA_StatusCode *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} -/** - * TranslateBrowsePathsToNodeIdsResponse - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - * Translates one or more paths in the server address space. */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_BrowsePathResult *results; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_TranslateBrowsePathsToNodeIdsResponse; +static UA_INLINE void +UA_StatusCode_deleteMembers(UA_StatusCode *p) { + memset(p, 0, sizeof(UA_StatusCode)); +} -#define UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE 172 +static UA_INLINE void +UA_StatusCode_clear(UA_StatusCode *p) { + memset(p, 0, sizeof(UA_StatusCode)); +} -/** - * DataChangeFilter - * ^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_DataChangeTrigger trigger; - UA_UInt32 deadbandType; - UA_Double deadbandValue; -} UA_DataChangeFilter; +static UA_INLINE void +UA_StatusCode_delete(UA_StatusCode *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_STATUSCODE]); +} -#define UA_TYPES_DATACHANGEFILTER 173 +/* QualifiedName */ +static UA_INLINE void +UA_QualifiedName_init(UA_QualifiedName *p) { + memset(p, 0, sizeof(UA_QualifiedName)); +} -/** - * ContentFilterElement - * ^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_FilterOperator filterOperator; - size_t filterOperandsSize; - UA_ExtensionObject *filterOperands; -} UA_ContentFilterElement; +static UA_INLINE UA_QualifiedName * +UA_QualifiedName_new(void) { + return (UA_QualifiedName*)UA_new(&UA_TYPES[UA_TYPES_QUALIFIEDNAME]); +} -#define UA_TYPES_CONTENTFILTERELEMENT 174 +static UA_INLINE UA_StatusCode +UA_QualifiedName_copy(const UA_QualifiedName *src, UA_QualifiedName *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]); +} -/** - * TranslateBrowsePathsToNodeIdsRequest - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - * Translates one or more paths in the server address space. */ -typedef struct { - UA_RequestHeader requestHeader; - size_t browsePathsSize; - UA_BrowsePath *browsePaths; -} UA_TranslateBrowsePathsToNodeIdsRequest; +static UA_INLINE void +UA_QualifiedName_deleteMembers(UA_QualifiedName *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]); +} -#define UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST 175 +static UA_INLINE void +UA_QualifiedName_clear(UA_QualifiedName *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]); +} -/** - * CloseSessionResponse - * ^^^^^^^^^^^^^^^^^^^^ - * Closes a session with the server. */ -typedef struct { - UA_ResponseHeader responseHeader; -} UA_CloseSessionResponse; +static UA_INLINE void +UA_QualifiedName_delete(UA_QualifiedName *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]); +} -#define UA_TYPES_CLOSESESSIONRESPONSE 176 +/* LocalizedText */ +static UA_INLINE void +UA_LocalizedText_init(UA_LocalizedText *p) { + memset(p, 0, sizeof(UA_LocalizedText)); +} -/** - * ApplicationDescription - * ^^^^^^^^^^^^^^^^^^^^^^ - * Describes an application and how to find it. */ -typedef struct { - UA_String applicationUri; - UA_String productUri; - UA_LocalizedText applicationName; - UA_ApplicationType applicationType; - UA_String gatewayServerUri; - UA_String discoveryProfileUri; - size_t discoveryUrlsSize; - UA_String *discoveryUrls; -} UA_ApplicationDescription; +static UA_INLINE UA_LocalizedText * +UA_LocalizedText_new(void) { + return (UA_LocalizedText*)UA_new(&UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); +} + +static UA_INLINE UA_StatusCode +UA_LocalizedText_copy(const UA_LocalizedText *src, UA_LocalizedText *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); +} -#define UA_TYPES_APPLICATIONDESCRIPTION 177 +static UA_INLINE void +UA_LocalizedText_deleteMembers(UA_LocalizedText *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); +} -/** - * SessionDiagnosticsDataType - * ^^^^^^^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_NodeId sessionId; - UA_String sessionName; - UA_ApplicationDescription clientDescription; - UA_String serverUri; - UA_String endpointUrl; - size_t localeIdsSize; - UA_String *localeIds; - UA_Double actualSessionTimeout; - UA_UInt32 maxResponseMessageSize; - UA_DateTime clientConnectionTime; - UA_DateTime clientLastContactTime; - UA_UInt32 currentSubscriptionsCount; - UA_UInt32 currentMonitoredItemsCount; - UA_UInt32 currentPublishRequestsInQueue; - UA_ServiceCounterDataType totalRequestCount; - UA_UInt32 unauthorizedRequestCount; - UA_ServiceCounterDataType readCount; - UA_ServiceCounterDataType historyReadCount; - UA_ServiceCounterDataType writeCount; - UA_ServiceCounterDataType historyUpdateCount; - UA_ServiceCounterDataType callCount; - UA_ServiceCounterDataType createMonitoredItemsCount; - UA_ServiceCounterDataType modifyMonitoredItemsCount; - UA_ServiceCounterDataType setMonitoringModeCount; - UA_ServiceCounterDataType setTriggeringCount; - UA_ServiceCounterDataType deleteMonitoredItemsCount; - UA_ServiceCounterDataType createSubscriptionCount; - UA_ServiceCounterDataType modifySubscriptionCount; - UA_ServiceCounterDataType setPublishingModeCount; - UA_ServiceCounterDataType publishCount; - UA_ServiceCounterDataType republishCount; - UA_ServiceCounterDataType transferSubscriptionsCount; - UA_ServiceCounterDataType deleteSubscriptionsCount; - UA_ServiceCounterDataType addNodesCount; - UA_ServiceCounterDataType addReferencesCount; - UA_ServiceCounterDataType deleteNodesCount; - UA_ServiceCounterDataType deleteReferencesCount; - UA_ServiceCounterDataType browseCount; - UA_ServiceCounterDataType browseNextCount; - UA_ServiceCounterDataType translateBrowsePathsToNodeIdsCount; - UA_ServiceCounterDataType queryFirstCount; - UA_ServiceCounterDataType queryNextCount; - UA_ServiceCounterDataType registerNodesCount; - UA_ServiceCounterDataType unregisterNodesCount; -} UA_SessionDiagnosticsDataType; - -#define UA_TYPES_SESSIONDIAGNOSTICSDATATYPE 178 +static UA_INLINE void +UA_LocalizedText_clear(UA_LocalizedText *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); +} -/** - * ServiceFault - * ^^^^^^^^^^^^ - * The response returned by all services when there is a service level error. */ -typedef struct { - UA_ResponseHeader responseHeader; -} UA_ServiceFault; +static UA_INLINE void +UA_LocalizedText_delete(UA_LocalizedText *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); +} -#define UA_TYPES_SERVICEFAULT 179 +/* ExtensionObject */ +static UA_INLINE void +UA_ExtensionObject_init(UA_ExtensionObject *p) { + memset(p, 0, sizeof(UA_ExtensionObject)); +} -/** - * RegisteredServer - * ^^^^^^^^^^^^^^^^ - * The information required to register a server with a discovery server. */ -typedef struct { - UA_String serverUri; - UA_String productUri; - size_t serverNamesSize; - UA_LocalizedText *serverNames; - UA_ApplicationType serverType; - UA_String gatewayServerUri; - size_t discoveryUrlsSize; - UA_String *discoveryUrls; - UA_String semaphoreFilePath; - UA_Boolean isOnline; -} UA_RegisteredServer; +static UA_INLINE UA_ExtensionObject * +UA_ExtensionObject_new(void) { + return (UA_ExtensionObject*)UA_new(&UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); +} -#define UA_TYPES_REGISTEREDSERVER 180 +static UA_INLINE UA_StatusCode +UA_ExtensionObject_copy(const UA_ExtensionObject *src, UA_ExtensionObject *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); +} -/** - * AggregateFilter - * ^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_DateTime startTime; - UA_NodeId aggregateType; - UA_Double processingInterval; - UA_AggregateConfiguration aggregateConfiguration; -} UA_AggregateFilter; +static UA_INLINE void +UA_ExtensionObject_deleteMembers(UA_ExtensionObject *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); +} -#define UA_TYPES_AGGREGATEFILTER 181 +static UA_INLINE void +UA_ExtensionObject_clear(UA_ExtensionObject *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); +} -/** - * RegisterServerRequest - * ^^^^^^^^^^^^^^^^^^^^^ - * Registers a server with the discovery server. */ -typedef struct { - UA_RequestHeader requestHeader; - UA_RegisteredServer server; -} UA_RegisterServerRequest; +static UA_INLINE void +UA_ExtensionObject_delete(UA_ExtensionObject *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); +} -#define UA_TYPES_REGISTERSERVERREQUEST 182 +/* DataValue */ +static UA_INLINE void +UA_DataValue_init(UA_DataValue *p) { + memset(p, 0, sizeof(UA_DataValue)); +} -/** - * EndpointDescription - * ^^^^^^^^^^^^^^^^^^^ - * The description of a endpoint that can be used to access a server. */ -typedef struct { - UA_String endpointUrl; - UA_ApplicationDescription server; - UA_ByteString serverCertificate; - UA_MessageSecurityMode securityMode; - UA_String securityPolicyUri; - size_t userIdentityTokensSize; - UA_UserTokenPolicy *userIdentityTokens; - UA_String transportProfileUri; - UA_Byte securityLevel; -} UA_EndpointDescription; +static UA_INLINE UA_DataValue * +UA_DataValue_new(void) { + return (UA_DataValue*)UA_new(&UA_TYPES[UA_TYPES_DATAVALUE]); +} -#define UA_TYPES_ENDPOINTDESCRIPTION 183 +static UA_INLINE UA_StatusCode +UA_DataValue_copy(const UA_DataValue *src, UA_DataValue *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DATAVALUE]); +} -/** - * CreateMonitoredItemsRequest - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_RequestHeader requestHeader; - UA_UInt32 subscriptionId; - UA_TimestampsToReturn timestampsToReturn; - size_t itemsToCreateSize; - UA_MonitoredItemCreateRequest *itemsToCreate; -} UA_CreateMonitoredItemsRequest; +static UA_INLINE void +UA_DataValue_deleteMembers(UA_DataValue *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DATAVALUE]); +} -#define UA_TYPES_CREATEMONITOREDITEMSREQUEST 184 +static UA_INLINE void +UA_DataValue_clear(UA_DataValue *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DATAVALUE]); +} -/** - * ContentFilter - * ^^^^^^^^^^^^^ - */ -typedef struct { - size_t elementsSize; - UA_ContentFilterElement *elements; -} UA_ContentFilter; +static UA_INLINE void +UA_DataValue_delete(UA_DataValue *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DATAVALUE]); +} -#define UA_TYPES_CONTENTFILTER 185 +/* Variant */ +static UA_INLINE void +UA_Variant_init(UA_Variant *p) { + memset(p, 0, sizeof(UA_Variant)); +} -/** - * QueryFirstResponse - * ^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t queryDataSetsSize; - UA_QueryDataSet *queryDataSets; - UA_ByteString continuationPoint; - size_t parsingResultsSize; - UA_ParsingResult *parsingResults; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; - UA_ContentFilterResult filterResult; -} UA_QueryFirstResponse; +static UA_INLINE UA_Variant * +UA_Variant_new(void) { + return (UA_Variant*)UA_new(&UA_TYPES[UA_TYPES_VARIANT]); +} -#define UA_TYPES_QUERYFIRSTRESPONSE 186 +static UA_INLINE UA_StatusCode +UA_Variant_copy(const UA_Variant *src, UA_Variant *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_VARIANT]); +} -/** - * AddNodesRequest - * ^^^^^^^^^^^^^^^ - * Adds one or more nodes to the server address space. */ -typedef struct { - UA_RequestHeader requestHeader; - size_t nodesToAddSize; - UA_AddNodesItem *nodesToAdd; -} UA_AddNodesRequest; +static UA_INLINE void +UA_Variant_deleteMembers(UA_Variant *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_VARIANT]); +} -#define UA_TYPES_ADDNODESREQUEST 187 +static UA_INLINE void +UA_Variant_clear(UA_Variant *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_VARIANT]); +} -/** - * BrowseRequest - * ^^^^^^^^^^^^^ - * Browse the references for one or more nodes from the server address space. */ -typedef struct { - UA_RequestHeader requestHeader; - UA_ViewDescription view; - UA_UInt32 requestedMaxReferencesPerNode; - size_t nodesToBrowseSize; - UA_BrowseDescription *nodesToBrowse; -} UA_BrowseRequest; +static UA_INLINE void +UA_Variant_delete(UA_Variant *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_VARIANT]); +} -#define UA_TYPES_BROWSEREQUEST 188 +/* DiagnosticInfo */ +static UA_INLINE void +UA_DiagnosticInfo_init(UA_DiagnosticInfo *p) { + memset(p, 0, sizeof(UA_DiagnosticInfo)); +} -/** - * BrowseResult - * ^^^^^^^^^^^^ - * The result of a browse operation. */ -typedef struct { - UA_StatusCode statusCode; - UA_ByteString continuationPoint; - size_t referencesSize; - UA_ReferenceDescription *references; -} UA_BrowseResult; +static UA_INLINE UA_DiagnosticInfo * +UA_DiagnosticInfo_new(void) { + return (UA_DiagnosticInfo*)UA_new(&UA_TYPES[UA_TYPES_DIAGNOSTICINFO]); +} -#define UA_TYPES_BROWSERESULT 189 +static UA_INLINE UA_StatusCode +UA_DiagnosticInfo_copy(const UA_DiagnosticInfo *src, UA_DiagnosticInfo *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]); +} -/** - * RegisterServer2Request - * ^^^^^^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_RequestHeader requestHeader; - UA_RegisteredServer server; - size_t discoveryConfigurationSize; - UA_ExtensionObject *discoveryConfiguration; -} UA_RegisterServer2Request; +static UA_INLINE void +UA_DiagnosticInfo_deleteMembers(UA_DiagnosticInfo *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]); +} -#define UA_TYPES_REGISTERSERVER2REQUEST 190 +static UA_INLINE void +UA_DiagnosticInfo_clear(UA_DiagnosticInfo *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]); +} -/** - * CreateSessionRequest - * ^^^^^^^^^^^^^^^^^^^^ - * Creates a new session with the server. */ -typedef struct { - UA_RequestHeader requestHeader; - UA_ApplicationDescription clientDescription; - UA_String serverUri; - UA_String endpointUrl; - UA_String sessionName; - UA_ByteString clientNonce; - UA_ByteString clientCertificate; - UA_Double requestedSessionTimeout; - UA_UInt32 maxResponseMessageSize; -} UA_CreateSessionRequest; +static UA_INLINE void +UA_DiagnosticInfo_delete(UA_DiagnosticInfo *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]); +} -#define UA_TYPES_CREATESESSIONREQUEST 191 +/* KeyValuePair */ +static UA_INLINE void +UA_KeyValuePair_init(UA_KeyValuePair *p) { + memset(p, 0, sizeof(UA_KeyValuePair)); +} -/** - * EventFilter - * ^^^^^^^^^^^ - */ -typedef struct { - size_t selectClausesSize; - UA_SimpleAttributeOperand *selectClauses; - UA_ContentFilter whereClause; -} UA_EventFilter; +static UA_INLINE UA_KeyValuePair * +UA_KeyValuePair_new(void) { + return (UA_KeyValuePair*)UA_new(&UA_TYPES[UA_TYPES_KEYVALUEPAIR]); +} -#define UA_TYPES_EVENTFILTER 192 +static UA_INLINE UA_StatusCode +UA_KeyValuePair_copy(const UA_KeyValuePair *src, UA_KeyValuePair *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_KEYVALUEPAIR]); +} -/** - * GetEndpointsResponse - * ^^^^^^^^^^^^^^^^^^^^ - * Gets the endpoints used by the server. */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t endpointsSize; - UA_EndpointDescription *endpoints; -} UA_GetEndpointsResponse; +static UA_INLINE void +UA_KeyValuePair_deleteMembers(UA_KeyValuePair *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_KEYVALUEPAIR]); +} -#define UA_TYPES_GETENDPOINTSRESPONSE 193 +static UA_INLINE void +UA_KeyValuePair_clear(UA_KeyValuePair *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_KEYVALUEPAIR]); +} -/** - * FindServersResponse - * ^^^^^^^^^^^^^^^^^^^ - * Finds the servers known to the discovery server. */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t serversSize; - UA_ApplicationDescription *servers; -} UA_FindServersResponse; +static UA_INLINE void +UA_KeyValuePair_delete(UA_KeyValuePair *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_KEYVALUEPAIR]); +} -#define UA_TYPES_FINDSERVERSRESPONSE 194 +/* SimpleTypeDescription */ +static UA_INLINE void +UA_SimpleTypeDescription_init(UA_SimpleTypeDescription *p) { + memset(p, 0, sizeof(UA_SimpleTypeDescription)); +} -/** - * BrowseNextResponse - * ^^^^^^^^^^^^^^^^^^ - * Continues one or more browse operations. */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_BrowseResult *results; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_BrowseNextResponse; +static UA_INLINE UA_SimpleTypeDescription * +UA_SimpleTypeDescription_new(void) { + return (UA_SimpleTypeDescription*)UA_new(&UA_TYPES[UA_TYPES_SIMPLETYPEDESCRIPTION]); +} -#define UA_TYPES_BROWSENEXTRESPONSE 195 +static UA_INLINE UA_StatusCode +UA_SimpleTypeDescription_copy(const UA_SimpleTypeDescription *src, UA_SimpleTypeDescription *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SIMPLETYPEDESCRIPTION]); +} -/** - * BrowseResponse - * ^^^^^^^^^^^^^^ - * Browse the references for one or more nodes from the server address space. */ -typedef struct { - UA_ResponseHeader responseHeader; - size_t resultsSize; - UA_BrowseResult *results; - size_t diagnosticInfosSize; - UA_DiagnosticInfo *diagnosticInfos; -} UA_BrowseResponse; +static UA_INLINE void +UA_SimpleTypeDescription_deleteMembers(UA_SimpleTypeDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SIMPLETYPEDESCRIPTION]); +} -#define UA_TYPES_BROWSERESPONSE 196 +static UA_INLINE void +UA_SimpleTypeDescription_clear(UA_SimpleTypeDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SIMPLETYPEDESCRIPTION]); +} -/** - * CreateSessionResponse - * ^^^^^^^^^^^^^^^^^^^^^ - * Creates a new session with the server. */ -typedef struct { - UA_ResponseHeader responseHeader; - UA_NodeId sessionId; - UA_NodeId authenticationToken; - UA_Double revisedSessionTimeout; - UA_ByteString serverNonce; - UA_ByteString serverCertificate; - size_t serverEndpointsSize; - UA_EndpointDescription *serverEndpoints; - size_t serverSoftwareCertificatesSize; - UA_SignedSoftwareCertificate *serverSoftwareCertificates; - UA_SignatureData serverSignature; - UA_UInt32 maxRequestMessageSize; -} UA_CreateSessionResponse; +static UA_INLINE void +UA_SimpleTypeDescription_delete(UA_SimpleTypeDescription *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SIMPLETYPEDESCRIPTION]); +} -#define UA_TYPES_CREATESESSIONRESPONSE 197 +/* PubSubState */ +static UA_INLINE void +UA_PubSubState_init(UA_PubSubState *p) { + memset(p, 0, sizeof(UA_PubSubState)); +} -/** - * QueryFirstRequest - * ^^^^^^^^^^^^^^^^^ - */ -typedef struct { - UA_RequestHeader requestHeader; - UA_ViewDescription view; - size_t nodeTypesSize; - UA_NodeTypeDescription *nodeTypes; - UA_ContentFilter filter; - UA_UInt32 maxDataSetsToReturn; - UA_UInt32 maxReferencesToReturn; -} UA_QueryFirstRequest; +static UA_INLINE UA_PubSubState * +UA_PubSubState_new(void) { + return (UA_PubSubState*)UA_new(&UA_TYPES[UA_TYPES_PUBSUBSTATE]); +} -#define UA_TYPES_QUERYFIRSTREQUEST 198 +static UA_INLINE UA_StatusCode +UA_PubSubState_copy(const UA_PubSubState *src, UA_PubSubState *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} -/** - * UtcTime - * ^^^^^^^ - * A date/time value specified in Universal Coordinated Time (UTC). */ -typedef UA_DateTime UA_UtcTime; +static UA_INLINE void +UA_PubSubState_deleteMembers(UA_PubSubState *p) { + memset(p, 0, sizeof(UA_PubSubState)); +} -#define UA_TYPES_UTCTIME UA_TYPES_DATETIME +static UA_INLINE void +UA_PubSubState_clear(UA_PubSubState *p) { + memset(p, 0, sizeof(UA_PubSubState)); +} -/** - * LocaleId - * ^^^^^^^^ - * An identifier for a user locale. */ -typedef UA_String UA_LocaleId; +static UA_INLINE void +UA_PubSubState_delete(UA_PubSubState *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_PUBSUBSTATE]); +} -#define UA_TYPES_LOCALEID UA_TYPES_STRING +/* DataSetFieldFlags */ +static UA_INLINE void +UA_DataSetFieldFlags_init(UA_DataSetFieldFlags *p) { + memset(p, 0, sizeof(UA_DataSetFieldFlags)); +} -/** - * Duration - * ^^^^^^^^ - * A period of time measured in milliseconds. */ -typedef UA_Double UA_Duration; +static UA_INLINE UA_DataSetFieldFlags * +UA_DataSetFieldFlags_new(void) { + return (UA_DataSetFieldFlags*)UA_new(&UA_TYPES[UA_TYPES_DATASETFIELDFLAGS]); +} -#define UA_TYPES_DURATION UA_TYPES_DOUBLE +static UA_INLINE UA_StatusCode +UA_DataSetFieldFlags_copy(const UA_DataSetFieldFlags *src, UA_DataSetFieldFlags *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} -#ifdef __cplusplus -} // extern "C" -#endif +static UA_INLINE void +UA_DataSetFieldFlags_deleteMembers(UA_DataSetFieldFlags *p) { + memset(p, 0, sizeof(UA_DataSetFieldFlags)); +} +static UA_INLINE void +UA_DataSetFieldFlags_clear(UA_DataSetFieldFlags *p) { + memset(p, 0, sizeof(UA_DataSetFieldFlags)); +} -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/build/src_generated/ua_types_generated_handling.h" ***********************************/ +static UA_INLINE void +UA_DataSetFieldFlags_delete(UA_DataSetFieldFlags *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DATASETFIELDFLAGS]); +} -/* Generated from Opc.Ua.Types.bsd with script /home/travis/build/open62541/open62541/tools/generate_datatypes.py - * on host travis-job-193db498-e14a-4886-911f-7172c9e50b7a by user travis at 2018-12-19 02:29:43 */ +/* ConfigurationVersionDataType */ +static UA_INLINE void +UA_ConfigurationVersionDataType_init(UA_ConfigurationVersionDataType *p) { + memset(p, 0, sizeof(UA_ConfigurationVersionDataType)); +} +static UA_INLINE UA_ConfigurationVersionDataType * +UA_ConfigurationVersionDataType_new(void) { + return (UA_ConfigurationVersionDataType*)UA_new(&UA_TYPES[UA_TYPES_CONFIGURATIONVERSIONDATATYPE]); +} -#ifdef __cplusplus -extern "C" { -#endif +static UA_INLINE UA_StatusCode +UA_ConfigurationVersionDataType_copy(const UA_ConfigurationVersionDataType *src, UA_ConfigurationVersionDataType *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} +static UA_INLINE void +UA_ConfigurationVersionDataType_deleteMembers(UA_ConfigurationVersionDataType *p) { + memset(p, 0, sizeof(UA_ConfigurationVersionDataType)); +} -#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6 -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wmissing-field-initializers" -# pragma GCC diagnostic ignored "-Wmissing-braces" -#endif +static UA_INLINE void +UA_ConfigurationVersionDataType_clear(UA_ConfigurationVersionDataType *p) { + memset(p, 0, sizeof(UA_ConfigurationVersionDataType)); +} +static UA_INLINE void +UA_ConfigurationVersionDataType_delete(UA_ConfigurationVersionDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CONFIGURATIONVERSIONDATATYPE]); +} -/* Boolean */ +/* PublishedVariableDataType */ static UA_INLINE void -UA_Boolean_init(UA_Boolean *p) { - memset(p, 0, sizeof(UA_Boolean)); +UA_PublishedVariableDataType_init(UA_PublishedVariableDataType *p) { + memset(p, 0, sizeof(UA_PublishedVariableDataType)); } -static UA_INLINE UA_Boolean * -UA_Boolean_new(void) { - return (UA_Boolean*)UA_new(&UA_TYPES[UA_TYPES_BOOLEAN]); +static UA_INLINE UA_PublishedVariableDataType * +UA_PublishedVariableDataType_new(void) { + return (UA_PublishedVariableDataType*)UA_new(&UA_TYPES[UA_TYPES_PUBLISHEDVARIABLEDATATYPE]); } static UA_INLINE UA_StatusCode -UA_Boolean_copy(const UA_Boolean *src, UA_Boolean *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_PublishedVariableDataType_copy(const UA_PublishedVariableDataType *src, UA_PublishedVariableDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_PUBLISHEDVARIABLEDATATYPE]); } static UA_INLINE void -UA_Boolean_deleteMembers(UA_Boolean *p) { } +UA_PublishedVariableDataType_deleteMembers(UA_PublishedVariableDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_PUBLISHEDVARIABLEDATATYPE]); +} static UA_INLINE void -UA_Boolean_delete(UA_Boolean *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BOOLEAN]); +UA_PublishedVariableDataType_clear(UA_PublishedVariableDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_PUBLISHEDVARIABLEDATATYPE]); } -/* SByte */ static UA_INLINE void -UA_SByte_init(UA_SByte *p) { - memset(p, 0, sizeof(UA_SByte)); +UA_PublishedVariableDataType_delete(UA_PublishedVariableDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_PUBLISHEDVARIABLEDATATYPE]); } -static UA_INLINE UA_SByte * -UA_SByte_new(void) { - return (UA_SByte*)UA_new(&UA_TYPES[UA_TYPES_SBYTE]); +/* DataSetFieldContentMask */ +static UA_INLINE void +UA_DataSetFieldContentMask_init(UA_DataSetFieldContentMask *p) { + memset(p, 0, sizeof(UA_DataSetFieldContentMask)); +} + +static UA_INLINE UA_DataSetFieldContentMask * +UA_DataSetFieldContentMask_new(void) { + return (UA_DataSetFieldContentMask*)UA_new(&UA_TYPES[UA_TYPES_DATASETFIELDCONTENTMASK]); } static UA_INLINE UA_StatusCode -UA_SByte_copy(const UA_SByte *src, UA_SByte *dst) { +UA_DataSetFieldContentMask_copy(const UA_DataSetFieldContentMask *src, UA_DataSetFieldContentMask *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_SByte_deleteMembers(UA_SByte *p) { } +UA_DataSetFieldContentMask_deleteMembers(UA_DataSetFieldContentMask *p) { + memset(p, 0, sizeof(UA_DataSetFieldContentMask)); +} static UA_INLINE void -UA_SByte_delete(UA_SByte *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SBYTE]); +UA_DataSetFieldContentMask_clear(UA_DataSetFieldContentMask *p) { + memset(p, 0, sizeof(UA_DataSetFieldContentMask)); } -/* Byte */ static UA_INLINE void -UA_Byte_init(UA_Byte *p) { - memset(p, 0, sizeof(UA_Byte)); +UA_DataSetFieldContentMask_delete(UA_DataSetFieldContentMask *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DATASETFIELDCONTENTMASK]); } -static UA_INLINE UA_Byte * -UA_Byte_new(void) { - return (UA_Byte*)UA_new(&UA_TYPES[UA_TYPES_BYTE]); +/* DataSetWriterDataType */ +static UA_INLINE void +UA_DataSetWriterDataType_init(UA_DataSetWriterDataType *p) { + memset(p, 0, sizeof(UA_DataSetWriterDataType)); +} + +static UA_INLINE UA_DataSetWriterDataType * +UA_DataSetWriterDataType_new(void) { + return (UA_DataSetWriterDataType*)UA_new(&UA_TYPES[UA_TYPES_DATASETWRITERDATATYPE]); } static UA_INLINE UA_StatusCode -UA_Byte_copy(const UA_Byte *src, UA_Byte *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_DataSetWriterDataType_copy(const UA_DataSetWriterDataType *src, UA_DataSetWriterDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DATASETWRITERDATATYPE]); } static UA_INLINE void -UA_Byte_deleteMembers(UA_Byte *p) { } +UA_DataSetWriterDataType_deleteMembers(UA_DataSetWriterDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DATASETWRITERDATATYPE]); +} static UA_INLINE void -UA_Byte_delete(UA_Byte *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BYTE]); +UA_DataSetWriterDataType_clear(UA_DataSetWriterDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DATASETWRITERDATATYPE]); } -/* Int16 */ static UA_INLINE void -UA_Int16_init(UA_Int16 *p) { - memset(p, 0, sizeof(UA_Int16)); +UA_DataSetWriterDataType_delete(UA_DataSetWriterDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DATASETWRITERDATATYPE]); } -static UA_INLINE UA_Int16 * -UA_Int16_new(void) { - return (UA_Int16*)UA_new(&UA_TYPES[UA_TYPES_INT16]); +/* NetworkAddressUrlDataType */ +static UA_INLINE void +UA_NetworkAddressUrlDataType_init(UA_NetworkAddressUrlDataType *p) { + memset(p, 0, sizeof(UA_NetworkAddressUrlDataType)); +} + +static UA_INLINE UA_NetworkAddressUrlDataType * +UA_NetworkAddressUrlDataType_new(void) { + return (UA_NetworkAddressUrlDataType*)UA_new(&UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]); } static UA_INLINE UA_StatusCode -UA_Int16_copy(const UA_Int16 *src, UA_Int16 *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_NetworkAddressUrlDataType_copy(const UA_NetworkAddressUrlDataType *src, UA_NetworkAddressUrlDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]); +} + +static UA_INLINE void +UA_NetworkAddressUrlDataType_deleteMembers(UA_NetworkAddressUrlDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]); } static UA_INLINE void -UA_Int16_deleteMembers(UA_Int16 *p) { } +UA_NetworkAddressUrlDataType_clear(UA_NetworkAddressUrlDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]); +} static UA_INLINE void -UA_Int16_delete(UA_Int16 *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_INT16]); +UA_NetworkAddressUrlDataType_delete(UA_NetworkAddressUrlDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]); } -/* UInt16 */ +/* OverrideValueHandling */ static UA_INLINE void -UA_UInt16_init(UA_UInt16 *p) { - memset(p, 0, sizeof(UA_UInt16)); +UA_OverrideValueHandling_init(UA_OverrideValueHandling *p) { + memset(p, 0, sizeof(UA_OverrideValueHandling)); } -static UA_INLINE UA_UInt16 * -UA_UInt16_new(void) { - return (UA_UInt16*)UA_new(&UA_TYPES[UA_TYPES_UINT16]); +static UA_INLINE UA_OverrideValueHandling * +UA_OverrideValueHandling_new(void) { + return (UA_OverrideValueHandling*)UA_new(&UA_TYPES[UA_TYPES_OVERRIDEVALUEHANDLING]); } static UA_INLINE UA_StatusCode -UA_UInt16_copy(const UA_UInt16 *src, UA_UInt16 *dst) { +UA_OverrideValueHandling_copy(const UA_OverrideValueHandling *src, UA_OverrideValueHandling *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_UInt16_deleteMembers(UA_UInt16 *p) { } +UA_OverrideValueHandling_deleteMembers(UA_OverrideValueHandling *p) { + memset(p, 0, sizeof(UA_OverrideValueHandling)); +} static UA_INLINE void -UA_UInt16_delete(UA_UInt16 *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_UINT16]); +UA_OverrideValueHandling_clear(UA_OverrideValueHandling *p) { + memset(p, 0, sizeof(UA_OverrideValueHandling)); } -/* Int32 */ static UA_INLINE void -UA_Int32_init(UA_Int32 *p) { - memset(p, 0, sizeof(UA_Int32)); +UA_OverrideValueHandling_delete(UA_OverrideValueHandling *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_OVERRIDEVALUEHANDLING]); } -static UA_INLINE UA_Int32 * -UA_Int32_new(void) { - return (UA_Int32*)UA_new(&UA_TYPES[UA_TYPES_INT32]); +/* DataSetOrderingType */ +static UA_INLINE void +UA_DataSetOrderingType_init(UA_DataSetOrderingType *p) { + memset(p, 0, sizeof(UA_DataSetOrderingType)); +} + +static UA_INLINE UA_DataSetOrderingType * +UA_DataSetOrderingType_new(void) { + return (UA_DataSetOrderingType*)UA_new(&UA_TYPES[UA_TYPES_DATASETORDERINGTYPE]); } static UA_INLINE UA_StatusCode -UA_Int32_copy(const UA_Int32 *src, UA_Int32 *dst) { +UA_DataSetOrderingType_copy(const UA_DataSetOrderingType *src, UA_DataSetOrderingType *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_Int32_deleteMembers(UA_Int32 *p) { } +UA_DataSetOrderingType_deleteMembers(UA_DataSetOrderingType *p) { + memset(p, 0, sizeof(UA_DataSetOrderingType)); +} static UA_INLINE void -UA_Int32_delete(UA_Int32 *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_INT32]); +UA_DataSetOrderingType_clear(UA_DataSetOrderingType *p) { + memset(p, 0, sizeof(UA_DataSetOrderingType)); } -/* UInt32 */ static UA_INLINE void -UA_UInt32_init(UA_UInt32 *p) { - memset(p, 0, sizeof(UA_UInt32)); +UA_DataSetOrderingType_delete(UA_DataSetOrderingType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DATASETORDERINGTYPE]); } -static UA_INLINE UA_UInt32 * -UA_UInt32_new(void) { - return (UA_UInt32*)UA_new(&UA_TYPES[UA_TYPES_UINT32]); +/* UadpNetworkMessageContentMask */ +static UA_INLINE void +UA_UadpNetworkMessageContentMask_init(UA_UadpNetworkMessageContentMask *p) { + memset(p, 0, sizeof(UA_UadpNetworkMessageContentMask)); +} + +static UA_INLINE UA_UadpNetworkMessageContentMask * +UA_UadpNetworkMessageContentMask_new(void) { + return (UA_UadpNetworkMessageContentMask*)UA_new(&UA_TYPES[UA_TYPES_UADPNETWORKMESSAGECONTENTMASK]); } static UA_INLINE UA_StatusCode -UA_UInt32_copy(const UA_UInt32 *src, UA_UInt32 *dst) { +UA_UadpNetworkMessageContentMask_copy(const UA_UadpNetworkMessageContentMask *src, UA_UadpNetworkMessageContentMask *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_UInt32_deleteMembers(UA_UInt32 *p) { } +UA_UadpNetworkMessageContentMask_deleteMembers(UA_UadpNetworkMessageContentMask *p) { + memset(p, 0, sizeof(UA_UadpNetworkMessageContentMask)); +} static UA_INLINE void -UA_UInt32_delete(UA_UInt32 *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_UINT32]); +UA_UadpNetworkMessageContentMask_clear(UA_UadpNetworkMessageContentMask *p) { + memset(p, 0, sizeof(UA_UadpNetworkMessageContentMask)); } -/* Int64 */ static UA_INLINE void -UA_Int64_init(UA_Int64 *p) { - memset(p, 0, sizeof(UA_Int64)); +UA_UadpNetworkMessageContentMask_delete(UA_UadpNetworkMessageContentMask *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_UADPNETWORKMESSAGECONTENTMASK]); } -static UA_INLINE UA_Int64 * -UA_Int64_new(void) { - return (UA_Int64*)UA_new(&UA_TYPES[UA_TYPES_INT64]); +/* UadpWriterGroupMessageDataType */ +static UA_INLINE void +UA_UadpWriterGroupMessageDataType_init(UA_UadpWriterGroupMessageDataType *p) { + memset(p, 0, sizeof(UA_UadpWriterGroupMessageDataType)); +} + +static UA_INLINE UA_UadpWriterGroupMessageDataType * +UA_UadpWriterGroupMessageDataType_new(void) { + return (UA_UadpWriterGroupMessageDataType*)UA_new(&UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE]); } static UA_INLINE UA_StatusCode -UA_Int64_copy(const UA_Int64 *src, UA_Int64 *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_UadpWriterGroupMessageDataType_copy(const UA_UadpWriterGroupMessageDataType *src, UA_UadpWriterGroupMessageDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE]); } static UA_INLINE void -UA_Int64_deleteMembers(UA_Int64 *p) { } +UA_UadpWriterGroupMessageDataType_deleteMembers(UA_UadpWriterGroupMessageDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE]); +} static UA_INLINE void -UA_Int64_delete(UA_Int64 *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_INT64]); +UA_UadpWriterGroupMessageDataType_clear(UA_UadpWriterGroupMessageDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE]); } -/* UInt64 */ static UA_INLINE void -UA_UInt64_init(UA_UInt64 *p) { - memset(p, 0, sizeof(UA_UInt64)); +UA_UadpWriterGroupMessageDataType_delete(UA_UadpWriterGroupMessageDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE]); } -static UA_INLINE UA_UInt64 * -UA_UInt64_new(void) { - return (UA_UInt64*)UA_new(&UA_TYPES[UA_TYPES_UINT64]); +/* UadpDataSetMessageContentMask */ +static UA_INLINE void +UA_UadpDataSetMessageContentMask_init(UA_UadpDataSetMessageContentMask *p) { + memset(p, 0, sizeof(UA_UadpDataSetMessageContentMask)); +} + +static UA_INLINE UA_UadpDataSetMessageContentMask * +UA_UadpDataSetMessageContentMask_new(void) { + return (UA_UadpDataSetMessageContentMask*)UA_new(&UA_TYPES[UA_TYPES_UADPDATASETMESSAGECONTENTMASK]); } static UA_INLINE UA_StatusCode -UA_UInt64_copy(const UA_UInt64 *src, UA_UInt64 *dst) { +UA_UadpDataSetMessageContentMask_copy(const UA_UadpDataSetMessageContentMask *src, UA_UadpDataSetMessageContentMask *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_UInt64_deleteMembers(UA_UInt64 *p) { } +UA_UadpDataSetMessageContentMask_deleteMembers(UA_UadpDataSetMessageContentMask *p) { + memset(p, 0, sizeof(UA_UadpDataSetMessageContentMask)); +} static UA_INLINE void -UA_UInt64_delete(UA_UInt64 *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_UINT64]); +UA_UadpDataSetMessageContentMask_clear(UA_UadpDataSetMessageContentMask *p) { + memset(p, 0, sizeof(UA_UadpDataSetMessageContentMask)); } -/* Float */ static UA_INLINE void -UA_Float_init(UA_Float *p) { - memset(p, 0, sizeof(UA_Float)); +UA_UadpDataSetMessageContentMask_delete(UA_UadpDataSetMessageContentMask *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_UADPDATASETMESSAGECONTENTMASK]); } -static UA_INLINE UA_Float * -UA_Float_new(void) { - return (UA_Float*)UA_new(&UA_TYPES[UA_TYPES_FLOAT]); +/* UadpDataSetWriterMessageDataType */ +static UA_INLINE void +UA_UadpDataSetWriterMessageDataType_init(UA_UadpDataSetWriterMessageDataType *p) { + memset(p, 0, sizeof(UA_UadpDataSetWriterMessageDataType)); +} + +static UA_INLINE UA_UadpDataSetWriterMessageDataType * +UA_UadpDataSetWriterMessageDataType_new(void) { + return (UA_UadpDataSetWriterMessageDataType*)UA_new(&UA_TYPES[UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE]); } static UA_INLINE UA_StatusCode -UA_Float_copy(const UA_Float *src, UA_Float *dst) { +UA_UadpDataSetWriterMessageDataType_copy(const UA_UadpDataSetWriterMessageDataType *src, UA_UadpDataSetWriterMessageDataType *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_Float_deleteMembers(UA_Float *p) { } +UA_UadpDataSetWriterMessageDataType_deleteMembers(UA_UadpDataSetWriterMessageDataType *p) { + memset(p, 0, sizeof(UA_UadpDataSetWriterMessageDataType)); +} + +static UA_INLINE void +UA_UadpDataSetWriterMessageDataType_clear(UA_UadpDataSetWriterMessageDataType *p) { + memset(p, 0, sizeof(UA_UadpDataSetWriterMessageDataType)); +} static UA_INLINE void -UA_Float_delete(UA_Float *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_FLOAT]); +UA_UadpDataSetWriterMessageDataType_delete(UA_UadpDataSetWriterMessageDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_UADPDATASETWRITERMESSAGEDATATYPE]); } -/* Double */ +/* UadpDataSetReaderMessageDataType */ static UA_INLINE void -UA_Double_init(UA_Double *p) { - memset(p, 0, sizeof(UA_Double)); +UA_UadpDataSetReaderMessageDataType_init(UA_UadpDataSetReaderMessageDataType *p) { + memset(p, 0, sizeof(UA_UadpDataSetReaderMessageDataType)); } -static UA_INLINE UA_Double * -UA_Double_new(void) { - return (UA_Double*)UA_new(&UA_TYPES[UA_TYPES_DOUBLE]); +static UA_INLINE UA_UadpDataSetReaderMessageDataType * +UA_UadpDataSetReaderMessageDataType_new(void) { + return (UA_UadpDataSetReaderMessageDataType*)UA_new(&UA_TYPES[UA_TYPES_UADPDATASETREADERMESSAGEDATATYPE]); } static UA_INLINE UA_StatusCode -UA_Double_copy(const UA_Double *src, UA_Double *dst) { +UA_UadpDataSetReaderMessageDataType_copy(const UA_UadpDataSetReaderMessageDataType *src, UA_UadpDataSetReaderMessageDataType *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_Double_deleteMembers(UA_Double *p) { } +UA_UadpDataSetReaderMessageDataType_deleteMembers(UA_UadpDataSetReaderMessageDataType *p) { + memset(p, 0, sizeof(UA_UadpDataSetReaderMessageDataType)); +} static UA_INLINE void -UA_Double_delete(UA_Double *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DOUBLE]); +UA_UadpDataSetReaderMessageDataType_clear(UA_UadpDataSetReaderMessageDataType *p) { + memset(p, 0, sizeof(UA_UadpDataSetReaderMessageDataType)); } -/* String */ static UA_INLINE void -UA_String_init(UA_String *p) { - memset(p, 0, sizeof(UA_String)); +UA_UadpDataSetReaderMessageDataType_delete(UA_UadpDataSetReaderMessageDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_UADPDATASETREADERMESSAGEDATATYPE]); } -static UA_INLINE UA_String * -UA_String_new(void) { - return (UA_String*)UA_new(&UA_TYPES[UA_TYPES_STRING]); +/* JsonNetworkMessageContentMask */ +static UA_INLINE void +UA_JsonNetworkMessageContentMask_init(UA_JsonNetworkMessageContentMask *p) { + memset(p, 0, sizeof(UA_JsonNetworkMessageContentMask)); +} + +static UA_INLINE UA_JsonNetworkMessageContentMask * +UA_JsonNetworkMessageContentMask_new(void) { + return (UA_JsonNetworkMessageContentMask*)UA_new(&UA_TYPES[UA_TYPES_JSONNETWORKMESSAGECONTENTMASK]); } static UA_INLINE UA_StatusCode -UA_String_copy(const UA_String *src, UA_String *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_STRING]); +UA_JsonNetworkMessageContentMask_copy(const UA_JsonNetworkMessageContentMask *src, UA_JsonNetworkMessageContentMask *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_String_deleteMembers(UA_String *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_STRING]); +UA_JsonNetworkMessageContentMask_deleteMembers(UA_JsonNetworkMessageContentMask *p) { + memset(p, 0, sizeof(UA_JsonNetworkMessageContentMask)); } static UA_INLINE void -UA_String_delete(UA_String *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_STRING]); +UA_JsonNetworkMessageContentMask_clear(UA_JsonNetworkMessageContentMask *p) { + memset(p, 0, sizeof(UA_JsonNetworkMessageContentMask)); } -/* DateTime */ static UA_INLINE void -UA_DateTime_init(UA_DateTime *p) { - memset(p, 0, sizeof(UA_DateTime)); +UA_JsonNetworkMessageContentMask_delete(UA_JsonNetworkMessageContentMask *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_JSONNETWORKMESSAGECONTENTMASK]); } -static UA_INLINE UA_DateTime * -UA_DateTime_new(void) { - return (UA_DateTime*)UA_new(&UA_TYPES[UA_TYPES_DATETIME]); +/* JsonDataSetMessageContentMask */ +static UA_INLINE void +UA_JsonDataSetMessageContentMask_init(UA_JsonDataSetMessageContentMask *p) { + memset(p, 0, sizeof(UA_JsonDataSetMessageContentMask)); +} + +static UA_INLINE UA_JsonDataSetMessageContentMask * +UA_JsonDataSetMessageContentMask_new(void) { + return (UA_JsonDataSetMessageContentMask*)UA_new(&UA_TYPES[UA_TYPES_JSONDATASETMESSAGECONTENTMASK]); } static UA_INLINE UA_StatusCode -UA_DateTime_copy(const UA_DateTime *src, UA_DateTime *dst) { +UA_JsonDataSetMessageContentMask_copy(const UA_JsonDataSetMessageContentMask *src, UA_JsonDataSetMessageContentMask *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_DateTime_deleteMembers(UA_DateTime *p) { } +UA_JsonDataSetMessageContentMask_deleteMembers(UA_JsonDataSetMessageContentMask *p) { + memset(p, 0, sizeof(UA_JsonDataSetMessageContentMask)); +} static UA_INLINE void -UA_DateTime_delete(UA_DateTime *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DATETIME]); +UA_JsonDataSetMessageContentMask_clear(UA_JsonDataSetMessageContentMask *p) { + memset(p, 0, sizeof(UA_JsonDataSetMessageContentMask)); } -/* Guid */ static UA_INLINE void -UA_Guid_init(UA_Guid *p) { - memset(p, 0, sizeof(UA_Guid)); +UA_JsonDataSetMessageContentMask_delete(UA_JsonDataSetMessageContentMask *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_JSONDATASETMESSAGECONTENTMASK]); } -static UA_INLINE UA_Guid * -UA_Guid_new(void) { - return (UA_Guid*)UA_new(&UA_TYPES[UA_TYPES_GUID]); +/* JsonDataSetWriterMessageDataType */ +static UA_INLINE void +UA_JsonDataSetWriterMessageDataType_init(UA_JsonDataSetWriterMessageDataType *p) { + memset(p, 0, sizeof(UA_JsonDataSetWriterMessageDataType)); +} + +static UA_INLINE UA_JsonDataSetWriterMessageDataType * +UA_JsonDataSetWriterMessageDataType_new(void) { + return (UA_JsonDataSetWriterMessageDataType*)UA_new(&UA_TYPES[UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE]); } static UA_INLINE UA_StatusCode -UA_Guid_copy(const UA_Guid *src, UA_Guid *dst) { +UA_JsonDataSetWriterMessageDataType_copy(const UA_JsonDataSetWriterMessageDataType *src, UA_JsonDataSetWriterMessageDataType *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_Guid_deleteMembers(UA_Guid *p) { } +UA_JsonDataSetWriterMessageDataType_deleteMembers(UA_JsonDataSetWriterMessageDataType *p) { + memset(p, 0, sizeof(UA_JsonDataSetWriterMessageDataType)); +} static UA_INLINE void -UA_Guid_delete(UA_Guid *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_GUID]); +UA_JsonDataSetWriterMessageDataType_clear(UA_JsonDataSetWriterMessageDataType *p) { + memset(p, 0, sizeof(UA_JsonDataSetWriterMessageDataType)); } -/* ByteString */ static UA_INLINE void -UA_ByteString_init(UA_ByteString *p) { - memset(p, 0, sizeof(UA_ByteString)); +UA_JsonDataSetWriterMessageDataType_delete(UA_JsonDataSetWriterMessageDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_JSONDATASETWRITERMESSAGEDATATYPE]); } -static UA_INLINE UA_ByteString * -UA_ByteString_new(void) { - return (UA_ByteString*)UA_new(&UA_TYPES[UA_TYPES_BYTESTRING]); +/* BrokerConnectionTransportDataType */ +static UA_INLINE void +UA_BrokerConnectionTransportDataType_init(UA_BrokerConnectionTransportDataType *p) { + memset(p, 0, sizeof(UA_BrokerConnectionTransportDataType)); +} + +static UA_INLINE UA_BrokerConnectionTransportDataType * +UA_BrokerConnectionTransportDataType_new(void) { + return (UA_BrokerConnectionTransportDataType*)UA_new(&UA_TYPES[UA_TYPES_BROKERCONNECTIONTRANSPORTDATATYPE]); } static UA_INLINE UA_StatusCode -UA_ByteString_copy(const UA_ByteString *src, UA_ByteString *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BYTESTRING]); +UA_BrokerConnectionTransportDataType_copy(const UA_BrokerConnectionTransportDataType *src, UA_BrokerConnectionTransportDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROKERCONNECTIONTRANSPORTDATATYPE]); } static UA_INLINE void -UA_ByteString_deleteMembers(UA_ByteString *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_BYTESTRING]); +UA_BrokerConnectionTransportDataType_deleteMembers(UA_BrokerConnectionTransportDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROKERCONNECTIONTRANSPORTDATATYPE]); } static UA_INLINE void -UA_ByteString_delete(UA_ByteString *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BYTESTRING]); +UA_BrokerConnectionTransportDataType_clear(UA_BrokerConnectionTransportDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROKERCONNECTIONTRANSPORTDATATYPE]); } -/* XmlElement */ static UA_INLINE void -UA_XmlElement_init(UA_XmlElement *p) { - memset(p, 0, sizeof(UA_XmlElement)); +UA_BrokerConnectionTransportDataType_delete(UA_BrokerConnectionTransportDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROKERCONNECTIONTRANSPORTDATATYPE]); } -static UA_INLINE UA_XmlElement * -UA_XmlElement_new(void) { - return (UA_XmlElement*)UA_new(&UA_TYPES[UA_TYPES_XMLELEMENT]); +/* BrokerTransportQualityOfService */ +static UA_INLINE void +UA_BrokerTransportQualityOfService_init(UA_BrokerTransportQualityOfService *p) { + memset(p, 0, sizeof(UA_BrokerTransportQualityOfService)); +} + +static UA_INLINE UA_BrokerTransportQualityOfService * +UA_BrokerTransportQualityOfService_new(void) { + return (UA_BrokerTransportQualityOfService*)UA_new(&UA_TYPES[UA_TYPES_BROKERTRANSPORTQUALITYOFSERVICE]); } static UA_INLINE UA_StatusCode -UA_XmlElement_copy(const UA_XmlElement *src, UA_XmlElement *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_XMLELEMENT]); +UA_BrokerTransportQualityOfService_copy(const UA_BrokerTransportQualityOfService *src, UA_BrokerTransportQualityOfService *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_XmlElement_deleteMembers(UA_XmlElement *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_XMLELEMENT]); +UA_BrokerTransportQualityOfService_deleteMembers(UA_BrokerTransportQualityOfService *p) { + memset(p, 0, sizeof(UA_BrokerTransportQualityOfService)); } static UA_INLINE void -UA_XmlElement_delete(UA_XmlElement *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_XMLELEMENT]); +UA_BrokerTransportQualityOfService_clear(UA_BrokerTransportQualityOfService *p) { + memset(p, 0, sizeof(UA_BrokerTransportQualityOfService)); } -/* NodeId */ static UA_INLINE void -UA_NodeId_init(UA_NodeId *p) { - memset(p, 0, sizeof(UA_NodeId)); +UA_BrokerTransportQualityOfService_delete(UA_BrokerTransportQualityOfService *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROKERTRANSPORTQUALITYOFSERVICE]); } -static UA_INLINE UA_NodeId * -UA_NodeId_new(void) { - return (UA_NodeId*)UA_new(&UA_TYPES[UA_TYPES_NODEID]); +/* BrokerWriterGroupTransportDataType */ +static UA_INLINE void +UA_BrokerWriterGroupTransportDataType_init(UA_BrokerWriterGroupTransportDataType *p) { + memset(p, 0, sizeof(UA_BrokerWriterGroupTransportDataType)); +} + +static UA_INLINE UA_BrokerWriterGroupTransportDataType * +UA_BrokerWriterGroupTransportDataType_new(void) { + return (UA_BrokerWriterGroupTransportDataType*)UA_new(&UA_TYPES[UA_TYPES_BROKERWRITERGROUPTRANSPORTDATATYPE]); } static UA_INLINE UA_StatusCode -UA_NodeId_copy(const UA_NodeId *src, UA_NodeId *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_NODEID]); +UA_BrokerWriterGroupTransportDataType_copy(const UA_BrokerWriterGroupTransportDataType *src, UA_BrokerWriterGroupTransportDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROKERWRITERGROUPTRANSPORTDATATYPE]); } static UA_INLINE void -UA_NodeId_deleteMembers(UA_NodeId *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_NODEID]); +UA_BrokerWriterGroupTransportDataType_deleteMembers(UA_BrokerWriterGroupTransportDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROKERWRITERGROUPTRANSPORTDATATYPE]); } static UA_INLINE void -UA_NodeId_delete(UA_NodeId *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_NODEID]); +UA_BrokerWriterGroupTransportDataType_clear(UA_BrokerWriterGroupTransportDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROKERWRITERGROUPTRANSPORTDATATYPE]); } -/* ExpandedNodeId */ static UA_INLINE void -UA_ExpandedNodeId_init(UA_ExpandedNodeId *p) { - memset(p, 0, sizeof(UA_ExpandedNodeId)); +UA_BrokerWriterGroupTransportDataType_delete(UA_BrokerWriterGroupTransportDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROKERWRITERGROUPTRANSPORTDATATYPE]); } -static UA_INLINE UA_ExpandedNodeId * -UA_ExpandedNodeId_new(void) { - return (UA_ExpandedNodeId*)UA_new(&UA_TYPES[UA_TYPES_EXPANDEDNODEID]); +/* BrokerDataSetWriterTransportDataType */ +static UA_INLINE void +UA_BrokerDataSetWriterTransportDataType_init(UA_BrokerDataSetWriterTransportDataType *p) { + memset(p, 0, sizeof(UA_BrokerDataSetWriterTransportDataType)); +} + +static UA_INLINE UA_BrokerDataSetWriterTransportDataType * +UA_BrokerDataSetWriterTransportDataType_new(void) { + return (UA_BrokerDataSetWriterTransportDataType*)UA_new(&UA_TYPES[UA_TYPES_BROKERDATASETWRITERTRANSPORTDATATYPE]); } static UA_INLINE UA_StatusCode -UA_ExpandedNodeId_copy(const UA_ExpandedNodeId *src, UA_ExpandedNodeId *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); +UA_BrokerDataSetWriterTransportDataType_copy(const UA_BrokerDataSetWriterTransportDataType *src, UA_BrokerDataSetWriterTransportDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROKERDATASETWRITERTRANSPORTDATATYPE]); } static UA_INLINE void -UA_ExpandedNodeId_deleteMembers(UA_ExpandedNodeId *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); +UA_BrokerDataSetWriterTransportDataType_deleteMembers(UA_BrokerDataSetWriterTransportDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROKERDATASETWRITERTRANSPORTDATATYPE]); } static UA_INLINE void -UA_ExpandedNodeId_delete(UA_ExpandedNodeId *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); +UA_BrokerDataSetWriterTransportDataType_clear(UA_BrokerDataSetWriterTransportDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROKERDATASETWRITERTRANSPORTDATATYPE]); } -/* StatusCode */ static UA_INLINE void -UA_StatusCode_init(UA_StatusCode *p) { - memset(p, 0, sizeof(UA_StatusCode)); +UA_BrokerDataSetWriterTransportDataType_delete(UA_BrokerDataSetWriterTransportDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROKERDATASETWRITERTRANSPORTDATATYPE]); } -static UA_INLINE UA_StatusCode * -UA_StatusCode_new(void) { - return (UA_StatusCode*)UA_new(&UA_TYPES[UA_TYPES_STATUSCODE]); +/* NodeClass */ +static UA_INLINE void +UA_NodeClass_init(UA_NodeClass *p) { + memset(p, 0, sizeof(UA_NodeClass)); +} + +static UA_INLINE UA_NodeClass * +UA_NodeClass_new(void) { + return (UA_NodeClass*)UA_new(&UA_TYPES[UA_TYPES_NODECLASS]); } static UA_INLINE UA_StatusCode -UA_StatusCode_copy(const UA_StatusCode *src, UA_StatusCode *dst) { +UA_NodeClass_copy(const UA_NodeClass *src, UA_NodeClass *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_StatusCode_deleteMembers(UA_StatusCode *p) { } +UA_NodeClass_deleteMembers(UA_NodeClass *p) { + memset(p, 0, sizeof(UA_NodeClass)); +} static UA_INLINE void -UA_StatusCode_delete(UA_StatusCode *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_STATUSCODE]); +UA_NodeClass_clear(UA_NodeClass *p) { + memset(p, 0, sizeof(UA_NodeClass)); } -/* QualifiedName */ static UA_INLINE void -UA_QualifiedName_init(UA_QualifiedName *p) { - memset(p, 0, sizeof(UA_QualifiedName)); +UA_NodeClass_delete(UA_NodeClass *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_NODECLASS]); } -static UA_INLINE UA_QualifiedName * -UA_QualifiedName_new(void) { - return (UA_QualifiedName*)UA_new(&UA_TYPES[UA_TYPES_QUALIFIEDNAME]); +/* StructureType */ +static UA_INLINE void +UA_StructureType_init(UA_StructureType *p) { + memset(p, 0, sizeof(UA_StructureType)); +} + +static UA_INLINE UA_StructureType * +UA_StructureType_new(void) { + return (UA_StructureType*)UA_new(&UA_TYPES[UA_TYPES_STRUCTURETYPE]); } static UA_INLINE UA_StatusCode -UA_QualifiedName_copy(const UA_QualifiedName *src, UA_QualifiedName *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]); +UA_StructureType_copy(const UA_StructureType *src, UA_StructureType *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_QualifiedName_deleteMembers(UA_QualifiedName *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]); +UA_StructureType_deleteMembers(UA_StructureType *p) { + memset(p, 0, sizeof(UA_StructureType)); } static UA_INLINE void -UA_QualifiedName_delete(UA_QualifiedName *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]); +UA_StructureType_clear(UA_StructureType *p) { + memset(p, 0, sizeof(UA_StructureType)); } -/* LocalizedText */ static UA_INLINE void -UA_LocalizedText_init(UA_LocalizedText *p) { - memset(p, 0, sizeof(UA_LocalizedText)); +UA_StructureType_delete(UA_StructureType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_STRUCTURETYPE]); } -static UA_INLINE UA_LocalizedText * -UA_LocalizedText_new(void) { - return (UA_LocalizedText*)UA_new(&UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); +/* StructureField */ +static UA_INLINE void +UA_StructureField_init(UA_StructureField *p) { + memset(p, 0, sizeof(UA_StructureField)); +} + +static UA_INLINE UA_StructureField * +UA_StructureField_new(void) { + return (UA_StructureField*)UA_new(&UA_TYPES[UA_TYPES_STRUCTUREFIELD]); } static UA_INLINE UA_StatusCode -UA_LocalizedText_copy(const UA_LocalizedText *src, UA_LocalizedText *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); +UA_StructureField_copy(const UA_StructureField *src, UA_StructureField *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_STRUCTUREFIELD]); } static UA_INLINE void -UA_LocalizedText_deleteMembers(UA_LocalizedText *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); +UA_StructureField_deleteMembers(UA_StructureField *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_STRUCTUREFIELD]); } static UA_INLINE void -UA_LocalizedText_delete(UA_LocalizedText *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); +UA_StructureField_clear(UA_StructureField *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_STRUCTUREFIELD]); } -/* ExtensionObject */ static UA_INLINE void -UA_ExtensionObject_init(UA_ExtensionObject *p) { - memset(p, 0, sizeof(UA_ExtensionObject)); +UA_StructureField_delete(UA_StructureField *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_STRUCTUREFIELD]); } -static UA_INLINE UA_ExtensionObject * -UA_ExtensionObject_new(void) { - return (UA_ExtensionObject*)UA_new(&UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); +/* StructureDefinition */ +static UA_INLINE void +UA_StructureDefinition_init(UA_StructureDefinition *p) { + memset(p, 0, sizeof(UA_StructureDefinition)); +} + +static UA_INLINE UA_StructureDefinition * +UA_StructureDefinition_new(void) { + return (UA_StructureDefinition*)UA_new(&UA_TYPES[UA_TYPES_STRUCTUREDEFINITION]); } static UA_INLINE UA_StatusCode -UA_ExtensionObject_copy(const UA_ExtensionObject *src, UA_ExtensionObject *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); +UA_StructureDefinition_copy(const UA_StructureDefinition *src, UA_StructureDefinition *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_STRUCTUREDEFINITION]); } static UA_INLINE void -UA_ExtensionObject_deleteMembers(UA_ExtensionObject *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); +UA_StructureDefinition_deleteMembers(UA_StructureDefinition *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_STRUCTUREDEFINITION]); } static UA_INLINE void -UA_ExtensionObject_delete(UA_ExtensionObject *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); +UA_StructureDefinition_clear(UA_StructureDefinition *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_STRUCTUREDEFINITION]); } -/* DataValue */ static UA_INLINE void -UA_DataValue_init(UA_DataValue *p) { - memset(p, 0, sizeof(UA_DataValue)); +UA_StructureDefinition_delete(UA_StructureDefinition *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_STRUCTUREDEFINITION]); } -static UA_INLINE UA_DataValue * -UA_DataValue_new(void) { - return (UA_DataValue*)UA_new(&UA_TYPES[UA_TYPES_DATAVALUE]); +/* Argument */ +static UA_INLINE void +UA_Argument_init(UA_Argument *p) { + memset(p, 0, sizeof(UA_Argument)); +} + +static UA_INLINE UA_Argument * +UA_Argument_new(void) { + return (UA_Argument*)UA_new(&UA_TYPES[UA_TYPES_ARGUMENT]); } static UA_INLINE UA_StatusCode -UA_DataValue_copy(const UA_DataValue *src, UA_DataValue *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DATAVALUE]); +UA_Argument_copy(const UA_Argument *src, UA_Argument *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ARGUMENT]); } static UA_INLINE void -UA_DataValue_deleteMembers(UA_DataValue *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DATAVALUE]); +UA_Argument_deleteMembers(UA_Argument *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ARGUMENT]); } static UA_INLINE void -UA_DataValue_delete(UA_DataValue *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DATAVALUE]); +UA_Argument_clear(UA_Argument *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ARGUMENT]); } -/* Variant */ static UA_INLINE void -UA_Variant_init(UA_Variant *p) { - memset(p, 0, sizeof(UA_Variant)); +UA_Argument_delete(UA_Argument *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ARGUMENT]); } -static UA_INLINE UA_Variant * -UA_Variant_new(void) { - return (UA_Variant*)UA_new(&UA_TYPES[UA_TYPES_VARIANT]); +/* EnumValueType */ +static UA_INLINE void +UA_EnumValueType_init(UA_EnumValueType *p) { + memset(p, 0, sizeof(UA_EnumValueType)); +} + +static UA_INLINE UA_EnumValueType * +UA_EnumValueType_new(void) { + return (UA_EnumValueType*)UA_new(&UA_TYPES[UA_TYPES_ENUMVALUETYPE]); } static UA_INLINE UA_StatusCode -UA_Variant_copy(const UA_Variant *src, UA_Variant *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_VARIANT]); +UA_EnumValueType_copy(const UA_EnumValueType *src, UA_EnumValueType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ENUMVALUETYPE]); } static UA_INLINE void -UA_Variant_deleteMembers(UA_Variant *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_VARIANT]); +UA_EnumValueType_deleteMembers(UA_EnumValueType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ENUMVALUETYPE]); } static UA_INLINE void -UA_Variant_delete(UA_Variant *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_VARIANT]); +UA_EnumValueType_clear(UA_EnumValueType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ENUMVALUETYPE]); } -/* DiagnosticInfo */ static UA_INLINE void -UA_DiagnosticInfo_init(UA_DiagnosticInfo *p) { - memset(p, 0, sizeof(UA_DiagnosticInfo)); +UA_EnumValueType_delete(UA_EnumValueType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ENUMVALUETYPE]); } -static UA_INLINE UA_DiagnosticInfo * -UA_DiagnosticInfo_new(void) { - return (UA_DiagnosticInfo*)UA_new(&UA_TYPES[UA_TYPES_DIAGNOSTICINFO]); +/* EnumField */ +static UA_INLINE void +UA_EnumField_init(UA_EnumField *p) { + memset(p, 0, sizeof(UA_EnumField)); +} + +static UA_INLINE UA_EnumField * +UA_EnumField_new(void) { + return (UA_EnumField*)UA_new(&UA_TYPES[UA_TYPES_ENUMFIELD]); } static UA_INLINE UA_StatusCode -UA_DiagnosticInfo_copy(const UA_DiagnosticInfo *src, UA_DiagnosticInfo *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]); +UA_EnumField_copy(const UA_EnumField *src, UA_EnumField *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ENUMFIELD]); } static UA_INLINE void -UA_DiagnosticInfo_deleteMembers(UA_DiagnosticInfo *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]); +UA_EnumField_deleteMembers(UA_EnumField *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ENUMFIELD]); } static UA_INLINE void -UA_DiagnosticInfo_delete(UA_DiagnosticInfo *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]); +UA_EnumField_clear(UA_EnumField *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ENUMFIELD]); } -/* SignedSoftwareCertificate */ static UA_INLINE void -UA_SignedSoftwareCertificate_init(UA_SignedSoftwareCertificate *p) { - memset(p, 0, sizeof(UA_SignedSoftwareCertificate)); +UA_EnumField_delete(UA_EnumField *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ENUMFIELD]); } -static UA_INLINE UA_SignedSoftwareCertificate * -UA_SignedSoftwareCertificate_new(void) { - return (UA_SignedSoftwareCertificate*)UA_new(&UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE]); +/* Duration */ +static UA_INLINE void +UA_Duration_init(UA_Duration *p) { + memset(p, 0, sizeof(UA_Duration)); +} + +static UA_INLINE UA_Duration * +UA_Duration_new(void) { + return (UA_Duration*)UA_new(&UA_TYPES[UA_TYPES_DURATION]); } static UA_INLINE UA_StatusCode -UA_SignedSoftwareCertificate_copy(const UA_SignedSoftwareCertificate *src, UA_SignedSoftwareCertificate *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE]); +UA_Duration_copy(const UA_Duration *src, UA_Duration *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DURATION]); } static UA_INLINE void -UA_SignedSoftwareCertificate_deleteMembers(UA_SignedSoftwareCertificate *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE]); +UA_Duration_deleteMembers(UA_Duration *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DURATION]); } static UA_INLINE void -UA_SignedSoftwareCertificate_delete(UA_SignedSoftwareCertificate *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE]); +UA_Duration_clear(UA_Duration *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DURATION]); +} + +static UA_INLINE void +UA_Duration_delete(UA_Duration *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DURATION]); } -/* SemanticChangeStructureDataType */ +/* UtcTime */ static UA_INLINE void -UA_SemanticChangeStructureDataType_init(UA_SemanticChangeStructureDataType *p) { - memset(p, 0, sizeof(UA_SemanticChangeStructureDataType)); +UA_UtcTime_init(UA_UtcTime *p) { + memset(p, 0, sizeof(UA_UtcTime)); } -static UA_INLINE UA_SemanticChangeStructureDataType * -UA_SemanticChangeStructureDataType_new(void) { - return (UA_SemanticChangeStructureDataType*)UA_new(&UA_TYPES[UA_TYPES_SEMANTICCHANGESTRUCTUREDATATYPE]); +static UA_INLINE UA_UtcTime * +UA_UtcTime_new(void) { + return (UA_UtcTime*)UA_new(&UA_TYPES[UA_TYPES_UTCTIME]); } static UA_INLINE UA_StatusCode -UA_SemanticChangeStructureDataType_copy(const UA_SemanticChangeStructureDataType *src, UA_SemanticChangeStructureDataType *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SEMANTICCHANGESTRUCTUREDATATYPE]); +UA_UtcTime_copy(const UA_UtcTime *src, UA_UtcTime *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_UTCTIME]); } static UA_INLINE void -UA_SemanticChangeStructureDataType_deleteMembers(UA_SemanticChangeStructureDataType *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SEMANTICCHANGESTRUCTUREDATATYPE]); +UA_UtcTime_deleteMembers(UA_UtcTime *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_UTCTIME]); } static UA_INLINE void -UA_SemanticChangeStructureDataType_delete(UA_SemanticChangeStructureDataType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SEMANTICCHANGESTRUCTUREDATATYPE]); +UA_UtcTime_clear(UA_UtcTime *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_UTCTIME]); } -/* StatusChangeNotification */ static UA_INLINE void -UA_StatusChangeNotification_init(UA_StatusChangeNotification *p) { - memset(p, 0, sizeof(UA_StatusChangeNotification)); +UA_UtcTime_delete(UA_UtcTime *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_UTCTIME]); } -static UA_INLINE UA_StatusChangeNotification * -UA_StatusChangeNotification_new(void) { - return (UA_StatusChangeNotification*)UA_new(&UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]); +/* LocaleId */ +static UA_INLINE void +UA_LocaleId_init(UA_LocaleId *p) { + memset(p, 0, sizeof(UA_LocaleId)); +} + +static UA_INLINE UA_LocaleId * +UA_LocaleId_new(void) { + return (UA_LocaleId*)UA_new(&UA_TYPES[UA_TYPES_LOCALEID]); } static UA_INLINE UA_StatusCode -UA_StatusChangeNotification_copy(const UA_StatusChangeNotification *src, UA_StatusChangeNotification *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]); +UA_LocaleId_copy(const UA_LocaleId *src, UA_LocaleId *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_LOCALEID]); } static UA_INLINE void -UA_StatusChangeNotification_deleteMembers(UA_StatusChangeNotification *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]); +UA_LocaleId_deleteMembers(UA_LocaleId *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_LOCALEID]); } static UA_INLINE void -UA_StatusChangeNotification_delete(UA_StatusChangeNotification *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]); +UA_LocaleId_clear(UA_LocaleId *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_LOCALEID]); } -/* BrowsePathTarget */ static UA_INLINE void -UA_BrowsePathTarget_init(UA_BrowsePathTarget *p) { - memset(p, 0, sizeof(UA_BrowsePathTarget)); +UA_LocaleId_delete(UA_LocaleId *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_LOCALEID]); } -static UA_INLINE UA_BrowsePathTarget * -UA_BrowsePathTarget_new(void) { - return (UA_BrowsePathTarget*)UA_new(&UA_TYPES[UA_TYPES_BROWSEPATHTARGET]); +/* ApplicationType */ +static UA_INLINE void +UA_ApplicationType_init(UA_ApplicationType *p) { + memset(p, 0, sizeof(UA_ApplicationType)); +} + +static UA_INLINE UA_ApplicationType * +UA_ApplicationType_new(void) { + return (UA_ApplicationType*)UA_new(&UA_TYPES[UA_TYPES_APPLICATIONTYPE]); } static UA_INLINE UA_StatusCode -UA_BrowsePathTarget_copy(const UA_BrowsePathTarget *src, UA_BrowsePathTarget *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET]); +UA_ApplicationType_copy(const UA_ApplicationType *src, UA_ApplicationType *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_BrowsePathTarget_deleteMembers(UA_BrowsePathTarget *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET]); +UA_ApplicationType_deleteMembers(UA_ApplicationType *p) { + memset(p, 0, sizeof(UA_ApplicationType)); } static UA_INLINE void -UA_BrowsePathTarget_delete(UA_BrowsePathTarget *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET]); +UA_ApplicationType_clear(UA_ApplicationType *p) { + memset(p, 0, sizeof(UA_ApplicationType)); } -/* ViewAttributes */ static UA_INLINE void -UA_ViewAttributes_init(UA_ViewAttributes *p) { - memset(p, 0, sizeof(UA_ViewAttributes)); +UA_ApplicationType_delete(UA_ApplicationType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_APPLICATIONTYPE]); } -static UA_INLINE UA_ViewAttributes * -UA_ViewAttributes_new(void) { - return (UA_ViewAttributes*)UA_new(&UA_TYPES[UA_TYPES_VIEWATTRIBUTES]); +/* ApplicationDescription */ +static UA_INLINE void +UA_ApplicationDescription_init(UA_ApplicationDescription *p) { + memset(p, 0, sizeof(UA_ApplicationDescription)); +} + +static UA_INLINE UA_ApplicationDescription * +UA_ApplicationDescription_new(void) { + return (UA_ApplicationDescription*)UA_new(&UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]); } static UA_INLINE UA_StatusCode -UA_ViewAttributes_copy(const UA_ViewAttributes *src, UA_ViewAttributes *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES]); +UA_ApplicationDescription_copy(const UA_ApplicationDescription *src, UA_ApplicationDescription *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]); } static UA_INLINE void -UA_ViewAttributes_deleteMembers(UA_ViewAttributes *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES]); +UA_ApplicationDescription_deleteMembers(UA_ApplicationDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]); } static UA_INLINE void -UA_ViewAttributes_delete(UA_ViewAttributes *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES]); +UA_ApplicationDescription_clear(UA_ApplicationDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]); +} + +static UA_INLINE void +UA_ApplicationDescription_delete(UA_ApplicationDescription *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]); } /* RequestHeader */ @@ -6716,1069 +18764,1264 @@ UA_RequestHeader_copy(const UA_RequestHeader *src, UA_RequestHeader *dst) { } static UA_INLINE void -UA_RequestHeader_deleteMembers(UA_RequestHeader *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REQUESTHEADER]); +UA_RequestHeader_deleteMembers(UA_RequestHeader *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REQUESTHEADER]); +} + +static UA_INLINE void +UA_RequestHeader_clear(UA_RequestHeader *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REQUESTHEADER]); +} + +static UA_INLINE void +UA_RequestHeader_delete(UA_RequestHeader *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_REQUESTHEADER]); +} + +/* ResponseHeader */ +static UA_INLINE void +UA_ResponseHeader_init(UA_ResponseHeader *p) { + memset(p, 0, sizeof(UA_ResponseHeader)); +} + +static UA_INLINE UA_ResponseHeader * +UA_ResponseHeader_new(void) { + return (UA_ResponseHeader*)UA_new(&UA_TYPES[UA_TYPES_RESPONSEHEADER]); +} + +static UA_INLINE UA_StatusCode +UA_ResponseHeader_copy(const UA_ResponseHeader *src, UA_ResponseHeader *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_RESPONSEHEADER]); +} + +static UA_INLINE void +UA_ResponseHeader_deleteMembers(UA_ResponseHeader *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_RESPONSEHEADER]); +} + +static UA_INLINE void +UA_ResponseHeader_clear(UA_ResponseHeader *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_RESPONSEHEADER]); } static UA_INLINE void -UA_RequestHeader_delete(UA_RequestHeader *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REQUESTHEADER]); +UA_ResponseHeader_delete(UA_ResponseHeader *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_RESPONSEHEADER]); } -/* MonitoredItemModifyResult */ +/* ServiceFault */ static UA_INLINE void -UA_MonitoredItemModifyResult_init(UA_MonitoredItemModifyResult *p) { - memset(p, 0, sizeof(UA_MonitoredItemModifyResult)); +UA_ServiceFault_init(UA_ServiceFault *p) { + memset(p, 0, sizeof(UA_ServiceFault)); } -static UA_INLINE UA_MonitoredItemModifyResult * -UA_MonitoredItemModifyResult_new(void) { - return (UA_MonitoredItemModifyResult*)UA_new(&UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]); +static UA_INLINE UA_ServiceFault * +UA_ServiceFault_new(void) { + return (UA_ServiceFault*)UA_new(&UA_TYPES[UA_TYPES_SERVICEFAULT]); } static UA_INLINE UA_StatusCode -UA_MonitoredItemModifyResult_copy(const UA_MonitoredItemModifyResult *src, UA_MonitoredItemModifyResult *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]); +UA_ServiceFault_copy(const UA_ServiceFault *src, UA_ServiceFault *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SERVICEFAULT]); } static UA_INLINE void -UA_MonitoredItemModifyResult_deleteMembers(UA_MonitoredItemModifyResult *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]); +UA_ServiceFault_deleteMembers(UA_ServiceFault *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SERVICEFAULT]); } static UA_INLINE void -UA_MonitoredItemModifyResult_delete(UA_MonitoredItemModifyResult *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]); +UA_ServiceFault_clear(UA_ServiceFault *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SERVICEFAULT]); } -/* ElementOperand */ static UA_INLINE void -UA_ElementOperand_init(UA_ElementOperand *p) { - memset(p, 0, sizeof(UA_ElementOperand)); +UA_ServiceFault_delete(UA_ServiceFault *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SERVICEFAULT]); } -static UA_INLINE UA_ElementOperand * -UA_ElementOperand_new(void) { - return (UA_ElementOperand*)UA_new(&UA_TYPES[UA_TYPES_ELEMENTOPERAND]); +/* FindServersRequest */ +static UA_INLINE void +UA_FindServersRequest_init(UA_FindServersRequest *p) { + memset(p, 0, sizeof(UA_FindServersRequest)); +} + +static UA_INLINE UA_FindServersRequest * +UA_FindServersRequest_new(void) { + return (UA_FindServersRequest*)UA_new(&UA_TYPES[UA_TYPES_FINDSERVERSREQUEST]); } static UA_INLINE UA_StatusCode -UA_ElementOperand_copy(const UA_ElementOperand *src, UA_ElementOperand *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_FindServersRequest_copy(const UA_FindServersRequest *src, UA_FindServersRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST]); } static UA_INLINE void -UA_ElementOperand_deleteMembers(UA_ElementOperand *p) { } +UA_FindServersRequest_deleteMembers(UA_FindServersRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST]); +} static UA_INLINE void -UA_ElementOperand_delete(UA_ElementOperand *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ELEMENTOPERAND]); +UA_FindServersRequest_clear(UA_FindServersRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST]); } -/* CloseSecureChannelRequest */ static UA_INLINE void -UA_CloseSecureChannelRequest_init(UA_CloseSecureChannelRequest *p) { - memset(p, 0, sizeof(UA_CloseSecureChannelRequest)); +UA_FindServersRequest_delete(UA_FindServersRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST]); } -static UA_INLINE UA_CloseSecureChannelRequest * -UA_CloseSecureChannelRequest_new(void) { - return (UA_CloseSecureChannelRequest*)UA_new(&UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); +/* FindServersResponse */ +static UA_INLINE void +UA_FindServersResponse_init(UA_FindServersResponse *p) { + memset(p, 0, sizeof(UA_FindServersResponse)); +} + +static UA_INLINE UA_FindServersResponse * +UA_FindServersResponse_new(void) { + return (UA_FindServersResponse*)UA_new(&UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); } static UA_INLINE UA_StatusCode -UA_CloseSecureChannelRequest_copy(const UA_CloseSecureChannelRequest *src, UA_CloseSecureChannelRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); +UA_FindServersResponse_copy(const UA_FindServersResponse *src, UA_FindServersResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); } static UA_INLINE void -UA_CloseSecureChannelRequest_deleteMembers(UA_CloseSecureChannelRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); +UA_FindServersResponse_deleteMembers(UA_FindServersResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); } static UA_INLINE void -UA_CloseSecureChannelRequest_delete(UA_CloseSecureChannelRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); +UA_FindServersResponse_clear(UA_FindServersResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); } -/* AddNodesResult */ static UA_INLINE void -UA_AddNodesResult_init(UA_AddNodesResult *p) { - memset(p, 0, sizeof(UA_AddNodesResult)); +UA_FindServersResponse_delete(UA_FindServersResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); } -static UA_INLINE UA_AddNodesResult * -UA_AddNodesResult_new(void) { - return (UA_AddNodesResult*)UA_new(&UA_TYPES[UA_TYPES_ADDNODESRESULT]); +/* ServerOnNetwork */ +static UA_INLINE void +UA_ServerOnNetwork_init(UA_ServerOnNetwork *p) { + memset(p, 0, sizeof(UA_ServerOnNetwork)); +} + +static UA_INLINE UA_ServerOnNetwork * +UA_ServerOnNetwork_new(void) { + return (UA_ServerOnNetwork*)UA_new(&UA_TYPES[UA_TYPES_SERVERONNETWORK]); } static UA_INLINE UA_StatusCode -UA_AddNodesResult_copy(const UA_AddNodesResult *src, UA_AddNodesResult *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDNODESRESULT]); +UA_ServerOnNetwork_copy(const UA_ServerOnNetwork *src, UA_ServerOnNetwork *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SERVERONNETWORK]); } static UA_INLINE void -UA_AddNodesResult_deleteMembers(UA_AddNodesResult *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ADDNODESRESULT]); +UA_ServerOnNetwork_deleteMembers(UA_ServerOnNetwork *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SERVERONNETWORK]); } static UA_INLINE void -UA_AddNodesResult_delete(UA_AddNodesResult *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ADDNODESRESULT]); +UA_ServerOnNetwork_clear(UA_ServerOnNetwork *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SERVERONNETWORK]); } -/* VariableAttributes */ static UA_INLINE void -UA_VariableAttributes_init(UA_VariableAttributes *p) { - memset(p, 0, sizeof(UA_VariableAttributes)); +UA_ServerOnNetwork_delete(UA_ServerOnNetwork *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SERVERONNETWORK]); } -static UA_INLINE UA_VariableAttributes * -UA_VariableAttributes_new(void) { - return (UA_VariableAttributes*)UA_new(&UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]); +/* FindServersOnNetworkRequest */ +static UA_INLINE void +UA_FindServersOnNetworkRequest_init(UA_FindServersOnNetworkRequest *p) { + memset(p, 0, sizeof(UA_FindServersOnNetworkRequest)); +} + +static UA_INLINE UA_FindServersOnNetworkRequest * +UA_FindServersOnNetworkRequest_new(void) { + return (UA_FindServersOnNetworkRequest*)UA_new(&UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST]); } static UA_INLINE UA_StatusCode -UA_VariableAttributes_copy(const UA_VariableAttributes *src, UA_VariableAttributes *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]); +UA_FindServersOnNetworkRequest_copy(const UA_FindServersOnNetworkRequest *src, UA_FindServersOnNetworkRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST]); } static UA_INLINE void -UA_VariableAttributes_deleteMembers(UA_VariableAttributes *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]); +UA_FindServersOnNetworkRequest_deleteMembers(UA_FindServersOnNetworkRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST]); } static UA_INLINE void -UA_VariableAttributes_delete(UA_VariableAttributes *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]); +UA_FindServersOnNetworkRequest_clear(UA_FindServersOnNetworkRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST]); } -/* NotificationMessage */ static UA_INLINE void -UA_NotificationMessage_init(UA_NotificationMessage *p) { - memset(p, 0, sizeof(UA_NotificationMessage)); +UA_FindServersOnNetworkRequest_delete(UA_FindServersOnNetworkRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST]); } -static UA_INLINE UA_NotificationMessage * -UA_NotificationMessage_new(void) { - return (UA_NotificationMessage*)UA_new(&UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE]); +/* FindServersOnNetworkResponse */ +static UA_INLINE void +UA_FindServersOnNetworkResponse_init(UA_FindServersOnNetworkResponse *p) { + memset(p, 0, sizeof(UA_FindServersOnNetworkResponse)); +} + +static UA_INLINE UA_FindServersOnNetworkResponse * +UA_FindServersOnNetworkResponse_new(void) { + return (UA_FindServersOnNetworkResponse*)UA_new(&UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]); } static UA_INLINE UA_StatusCode -UA_NotificationMessage_copy(const UA_NotificationMessage *src, UA_NotificationMessage *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE]); +UA_FindServersOnNetworkResponse_copy(const UA_FindServersOnNetworkResponse *src, UA_FindServersOnNetworkResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]); } static UA_INLINE void -UA_NotificationMessage_deleteMembers(UA_NotificationMessage *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE]); +UA_FindServersOnNetworkResponse_deleteMembers(UA_FindServersOnNetworkResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]); } static UA_INLINE void -UA_NotificationMessage_delete(UA_NotificationMessage *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE]); +UA_FindServersOnNetworkResponse_clear(UA_FindServersOnNetworkResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]); } -/* FindServersOnNetworkRequest */ static UA_INLINE void -UA_FindServersOnNetworkRequest_init(UA_FindServersOnNetworkRequest *p) { - memset(p, 0, sizeof(UA_FindServersOnNetworkRequest)); +UA_FindServersOnNetworkResponse_delete(UA_FindServersOnNetworkResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]); } -static UA_INLINE UA_FindServersOnNetworkRequest * -UA_FindServersOnNetworkRequest_new(void) { - return (UA_FindServersOnNetworkRequest*)UA_new(&UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST]); +/* MessageSecurityMode */ +static UA_INLINE void +UA_MessageSecurityMode_init(UA_MessageSecurityMode *p) { + memset(p, 0, sizeof(UA_MessageSecurityMode)); +} + +static UA_INLINE UA_MessageSecurityMode * +UA_MessageSecurityMode_new(void) { + return (UA_MessageSecurityMode*)UA_new(&UA_TYPES[UA_TYPES_MESSAGESECURITYMODE]); } static UA_INLINE UA_StatusCode -UA_FindServersOnNetworkRequest_copy(const UA_FindServersOnNetworkRequest *src, UA_FindServersOnNetworkRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST]); +UA_MessageSecurityMode_copy(const UA_MessageSecurityMode *src, UA_MessageSecurityMode *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_FindServersOnNetworkRequest_deleteMembers(UA_FindServersOnNetworkRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST]); +UA_MessageSecurityMode_deleteMembers(UA_MessageSecurityMode *p) { + memset(p, 0, sizeof(UA_MessageSecurityMode)); } static UA_INLINE void -UA_FindServersOnNetworkRequest_delete(UA_FindServersOnNetworkRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST]); +UA_MessageSecurityMode_clear(UA_MessageSecurityMode *p) { + memset(p, 0, sizeof(UA_MessageSecurityMode)); } -/* EventFieldList */ static UA_INLINE void -UA_EventFieldList_init(UA_EventFieldList *p) { - memset(p, 0, sizeof(UA_EventFieldList)); +UA_MessageSecurityMode_delete(UA_MessageSecurityMode *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_MESSAGESECURITYMODE]); } -static UA_INLINE UA_EventFieldList * -UA_EventFieldList_new(void) { - return (UA_EventFieldList*)UA_new(&UA_TYPES[UA_TYPES_EVENTFIELDLIST]); +/* UserTokenType */ +static UA_INLINE void +UA_UserTokenType_init(UA_UserTokenType *p) { + memset(p, 0, sizeof(UA_UserTokenType)); +} + +static UA_INLINE UA_UserTokenType * +UA_UserTokenType_new(void) { + return (UA_UserTokenType*)UA_new(&UA_TYPES[UA_TYPES_USERTOKENTYPE]); } static UA_INLINE UA_StatusCode -UA_EventFieldList_copy(const UA_EventFieldList *src, UA_EventFieldList *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_EVENTFIELDLIST]); +UA_UserTokenType_copy(const UA_UserTokenType *src, UA_UserTokenType *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_EventFieldList_deleteMembers(UA_EventFieldList *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_EVENTFIELDLIST]); +UA_UserTokenType_deleteMembers(UA_UserTokenType *p) { + memset(p, 0, sizeof(UA_UserTokenType)); } static UA_INLINE void -UA_EventFieldList_delete(UA_EventFieldList *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_EVENTFIELDLIST]); +UA_UserTokenType_clear(UA_UserTokenType *p) { + memset(p, 0, sizeof(UA_UserTokenType)); } -/* MonitoringMode */ static UA_INLINE void -UA_MonitoringMode_init(UA_MonitoringMode *p) { - memset(p, 0, sizeof(UA_MonitoringMode)); +UA_UserTokenType_delete(UA_UserTokenType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_USERTOKENTYPE]); } -static UA_INLINE UA_MonitoringMode * -UA_MonitoringMode_new(void) { - return (UA_MonitoringMode*)UA_new(&UA_TYPES[UA_TYPES_MONITORINGMODE]); +/* UserTokenPolicy */ +static UA_INLINE void +UA_UserTokenPolicy_init(UA_UserTokenPolicy *p) { + memset(p, 0, sizeof(UA_UserTokenPolicy)); +} + +static UA_INLINE UA_UserTokenPolicy * +UA_UserTokenPolicy_new(void) { + return (UA_UserTokenPolicy*)UA_new(&UA_TYPES[UA_TYPES_USERTOKENPOLICY]); } static UA_INLINE UA_StatusCode -UA_MonitoringMode_copy(const UA_MonitoringMode *src, UA_MonitoringMode *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_UserTokenPolicy_copy(const UA_UserTokenPolicy *src, UA_UserTokenPolicy *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); } static UA_INLINE void -UA_MonitoringMode_deleteMembers(UA_MonitoringMode *p) { } +UA_UserTokenPolicy_deleteMembers(UA_UserTokenPolicy *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); +} static UA_INLINE void -UA_MonitoringMode_delete(UA_MonitoringMode *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MONITORINGMODE]); +UA_UserTokenPolicy_clear(UA_UserTokenPolicy *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); } -/* MdnsDiscoveryConfiguration */ static UA_INLINE void -UA_MdnsDiscoveryConfiguration_init(UA_MdnsDiscoveryConfiguration *p) { - memset(p, 0, sizeof(UA_MdnsDiscoveryConfiguration)); +UA_UserTokenPolicy_delete(UA_UserTokenPolicy *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); } -static UA_INLINE UA_MdnsDiscoveryConfiguration * -UA_MdnsDiscoveryConfiguration_new(void) { - return (UA_MdnsDiscoveryConfiguration*)UA_new(&UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION]); +/* EndpointDescription */ +static UA_INLINE void +UA_EndpointDescription_init(UA_EndpointDescription *p) { + memset(p, 0, sizeof(UA_EndpointDescription)); +} + +static UA_INLINE UA_EndpointDescription * +UA_EndpointDescription_new(void) { + return (UA_EndpointDescription*)UA_new(&UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); } static UA_INLINE UA_StatusCode -UA_MdnsDiscoveryConfiguration_copy(const UA_MdnsDiscoveryConfiguration *src, UA_MdnsDiscoveryConfiguration *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION]); +UA_EndpointDescription_copy(const UA_EndpointDescription *src, UA_EndpointDescription *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); +} + +static UA_INLINE void +UA_EndpointDescription_deleteMembers(UA_EndpointDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); } static UA_INLINE void -UA_MdnsDiscoveryConfiguration_deleteMembers(UA_MdnsDiscoveryConfiguration *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION]); +UA_EndpointDescription_clear(UA_EndpointDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); } static UA_INLINE void -UA_MdnsDiscoveryConfiguration_delete(UA_MdnsDiscoveryConfiguration *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION]); +UA_EndpointDescription_delete(UA_EndpointDescription *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); } -/* CallMethodResult */ +/* GetEndpointsRequest */ static UA_INLINE void -UA_CallMethodResult_init(UA_CallMethodResult *p) { - memset(p, 0, sizeof(UA_CallMethodResult)); +UA_GetEndpointsRequest_init(UA_GetEndpointsRequest *p) { + memset(p, 0, sizeof(UA_GetEndpointsRequest)); } -static UA_INLINE UA_CallMethodResult * -UA_CallMethodResult_new(void) { - return (UA_CallMethodResult*)UA_new(&UA_TYPES[UA_TYPES_CALLMETHODRESULT]); +static UA_INLINE UA_GetEndpointsRequest * +UA_GetEndpointsRequest_new(void) { + return (UA_GetEndpointsRequest*)UA_new(&UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST]); } static UA_INLINE UA_StatusCode -UA_CallMethodResult_copy(const UA_CallMethodResult *src, UA_CallMethodResult *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CALLMETHODRESULT]); +UA_GetEndpointsRequest_copy(const UA_GetEndpointsRequest *src, UA_GetEndpointsRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST]); } static UA_INLINE void -UA_CallMethodResult_deleteMembers(UA_CallMethodResult *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CALLMETHODRESULT]); +UA_GetEndpointsRequest_deleteMembers(UA_GetEndpointsRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST]); } static UA_INLINE void -UA_CallMethodResult_delete(UA_CallMethodResult *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CALLMETHODRESULT]); +UA_GetEndpointsRequest_clear(UA_GetEndpointsRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST]); +} + +static UA_INLINE void +UA_GetEndpointsRequest_delete(UA_GetEndpointsRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST]); } -/* ParsingResult */ +/* GetEndpointsResponse */ static UA_INLINE void -UA_ParsingResult_init(UA_ParsingResult *p) { - memset(p, 0, sizeof(UA_ParsingResult)); +UA_GetEndpointsResponse_init(UA_GetEndpointsResponse *p) { + memset(p, 0, sizeof(UA_GetEndpointsResponse)); } -static UA_INLINE UA_ParsingResult * -UA_ParsingResult_new(void) { - return (UA_ParsingResult*)UA_new(&UA_TYPES[UA_TYPES_PARSINGRESULT]); +static UA_INLINE UA_GetEndpointsResponse * +UA_GetEndpointsResponse_new(void) { + return (UA_GetEndpointsResponse*)UA_new(&UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]); } static UA_INLINE UA_StatusCode -UA_ParsingResult_copy(const UA_ParsingResult *src, UA_ParsingResult *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_PARSINGRESULT]); +UA_GetEndpointsResponse_copy(const UA_GetEndpointsResponse *src, UA_GetEndpointsResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]); } static UA_INLINE void -UA_ParsingResult_deleteMembers(UA_ParsingResult *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_PARSINGRESULT]); +UA_GetEndpointsResponse_deleteMembers(UA_GetEndpointsResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]); } static UA_INLINE void -UA_ParsingResult_delete(UA_ParsingResult *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_PARSINGRESULT]); +UA_GetEndpointsResponse_clear(UA_GetEndpointsResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]); } -/* RelativePathElement */ static UA_INLINE void -UA_RelativePathElement_init(UA_RelativePathElement *p) { - memset(p, 0, sizeof(UA_RelativePathElement)); +UA_GetEndpointsResponse_delete(UA_GetEndpointsResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]); } -static UA_INLINE UA_RelativePathElement * -UA_RelativePathElement_new(void) { - return (UA_RelativePathElement*)UA_new(&UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]); +/* RegisteredServer */ +static UA_INLINE void +UA_RegisteredServer_init(UA_RegisteredServer *p) { + memset(p, 0, sizeof(UA_RegisteredServer)); +} + +static UA_INLINE UA_RegisteredServer * +UA_RegisteredServer_new(void) { + return (UA_RegisteredServer*)UA_new(&UA_TYPES[UA_TYPES_REGISTEREDSERVER]); } static UA_INLINE UA_StatusCode -UA_RelativePathElement_copy(const UA_RelativePathElement *src, UA_RelativePathElement *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]); +UA_RegisteredServer_copy(const UA_RegisteredServer *src, UA_RegisteredServer *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTEREDSERVER]); } static UA_INLINE void -UA_RelativePathElement_deleteMembers(UA_RelativePathElement *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]); +UA_RegisteredServer_deleteMembers(UA_RegisteredServer *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTEREDSERVER]); } static UA_INLINE void -UA_RelativePathElement_delete(UA_RelativePathElement *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]); +UA_RegisteredServer_clear(UA_RegisteredServer *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTEREDSERVER]); } -/* BrowseDirection */ static UA_INLINE void -UA_BrowseDirection_init(UA_BrowseDirection *p) { - memset(p, 0, sizeof(UA_BrowseDirection)); +UA_RegisteredServer_delete(UA_RegisteredServer *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_REGISTEREDSERVER]); } -static UA_INLINE UA_BrowseDirection * -UA_BrowseDirection_new(void) { - return (UA_BrowseDirection*)UA_new(&UA_TYPES[UA_TYPES_BROWSEDIRECTION]); +/* RegisterServerRequest */ +static UA_INLINE void +UA_RegisterServerRequest_init(UA_RegisterServerRequest *p) { + memset(p, 0, sizeof(UA_RegisterServerRequest)); +} + +static UA_INLINE UA_RegisterServerRequest * +UA_RegisterServerRequest_new(void) { + return (UA_RegisterServerRequest*)UA_new(&UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST]); } static UA_INLINE UA_StatusCode -UA_BrowseDirection_copy(const UA_BrowseDirection *src, UA_BrowseDirection *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_RegisterServerRequest_copy(const UA_RegisterServerRequest *src, UA_RegisterServerRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST]); } static UA_INLINE void -UA_BrowseDirection_deleteMembers(UA_BrowseDirection *p) { } +UA_RegisterServerRequest_deleteMembers(UA_RegisterServerRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST]); +} static UA_INLINE void -UA_BrowseDirection_delete(UA_BrowseDirection *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BROWSEDIRECTION]); +UA_RegisterServerRequest_clear(UA_RegisterServerRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST]); } -/* CallMethodRequest */ static UA_INLINE void -UA_CallMethodRequest_init(UA_CallMethodRequest *p) { - memset(p, 0, sizeof(UA_CallMethodRequest)); +UA_RegisterServerRequest_delete(UA_RegisterServerRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST]); } -static UA_INLINE UA_CallMethodRequest * -UA_CallMethodRequest_new(void) { - return (UA_CallMethodRequest*)UA_new(&UA_TYPES[UA_TYPES_CALLMETHODREQUEST]); +/* RegisterServerResponse */ +static UA_INLINE void +UA_RegisterServerResponse_init(UA_RegisterServerResponse *p) { + memset(p, 0, sizeof(UA_RegisterServerResponse)); +} + +static UA_INLINE UA_RegisterServerResponse * +UA_RegisterServerResponse_new(void) { + return (UA_RegisterServerResponse*)UA_new(&UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]); } static UA_INLINE UA_StatusCode -UA_CallMethodRequest_copy(const UA_CallMethodRequest *src, UA_CallMethodRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST]); +UA_RegisterServerResponse_copy(const UA_RegisterServerResponse *src, UA_RegisterServerResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]); } static UA_INLINE void -UA_CallMethodRequest_deleteMembers(UA_CallMethodRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST]); +UA_RegisterServerResponse_deleteMembers(UA_RegisterServerResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]); } static UA_INLINE void -UA_CallMethodRequest_delete(UA_CallMethodRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST]); +UA_RegisterServerResponse_clear(UA_RegisterServerResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]); } -/* RedundancySupport */ static UA_INLINE void -UA_RedundancySupport_init(UA_RedundancySupport *p) { - memset(p, 0, sizeof(UA_RedundancySupport)); +UA_RegisterServerResponse_delete(UA_RegisterServerResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]); } -static UA_INLINE UA_RedundancySupport * -UA_RedundancySupport_new(void) { - return (UA_RedundancySupport*)UA_new(&UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT]); +/* DiscoveryConfiguration */ +static UA_INLINE void +UA_DiscoveryConfiguration_init(UA_DiscoveryConfiguration *p) { + memset(p, 0, sizeof(UA_DiscoveryConfiguration)); +} + +static UA_INLINE UA_DiscoveryConfiguration * +UA_DiscoveryConfiguration_new(void) { + return (UA_DiscoveryConfiguration*)UA_new(&UA_TYPES[UA_TYPES_DISCOVERYCONFIGURATION]); } static UA_INLINE UA_StatusCode -UA_RedundancySupport_copy(const UA_RedundancySupport *src, UA_RedundancySupport *dst) { +UA_DiscoveryConfiguration_copy(const UA_DiscoveryConfiguration *src, UA_DiscoveryConfiguration *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_RedundancySupport_deleteMembers(UA_RedundancySupport *p) { } - -static UA_INLINE void -UA_RedundancySupport_delete(UA_RedundancySupport *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT]); +UA_DiscoveryConfiguration_deleteMembers(UA_DiscoveryConfiguration *p) { + memset(p, 0, sizeof(UA_DiscoveryConfiguration)); } -/* EventNotificationList */ static UA_INLINE void -UA_EventNotificationList_init(UA_EventNotificationList *p) { - memset(p, 0, sizeof(UA_EventNotificationList)); -} - -static UA_INLINE UA_EventNotificationList * -UA_EventNotificationList_new(void) { - return (UA_EventNotificationList*)UA_new(&UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]); -} - -static UA_INLINE UA_StatusCode -UA_EventNotificationList_copy(const UA_EventNotificationList *src, UA_EventNotificationList *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]); +UA_DiscoveryConfiguration_clear(UA_DiscoveryConfiguration *p) { + memset(p, 0, sizeof(UA_DiscoveryConfiguration)); } static UA_INLINE void -UA_EventNotificationList_deleteMembers(UA_EventNotificationList *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]); +UA_DiscoveryConfiguration_delete(UA_DiscoveryConfiguration *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DISCOVERYCONFIGURATION]); } +/* MdnsDiscoveryConfiguration */ static UA_INLINE void -UA_EventNotificationList_delete(UA_EventNotificationList *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]); +UA_MdnsDiscoveryConfiguration_init(UA_MdnsDiscoveryConfiguration *p) { + memset(p, 0, sizeof(UA_MdnsDiscoveryConfiguration)); } -/* UnregisterNodesRequest */ -static UA_INLINE void -UA_UnregisterNodesRequest_init(UA_UnregisterNodesRequest *p) { - memset(p, 0, sizeof(UA_UnregisterNodesRequest)); +static UA_INLINE UA_MdnsDiscoveryConfiguration * +UA_MdnsDiscoveryConfiguration_new(void) { + return (UA_MdnsDiscoveryConfiguration*)UA_new(&UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION]); } -static UA_INLINE UA_UnregisterNodesRequest * -UA_UnregisterNodesRequest_new(void) { - return (UA_UnregisterNodesRequest*)UA_new(&UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST]); +static UA_INLINE UA_StatusCode +UA_MdnsDiscoveryConfiguration_copy(const UA_MdnsDiscoveryConfiguration *src, UA_MdnsDiscoveryConfiguration *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION]); } -static UA_INLINE UA_StatusCode -UA_UnregisterNodesRequest_copy(const UA_UnregisterNodesRequest *src, UA_UnregisterNodesRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST]); +static UA_INLINE void +UA_MdnsDiscoveryConfiguration_deleteMembers(UA_MdnsDiscoveryConfiguration *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION]); } static UA_INLINE void -UA_UnregisterNodesRequest_deleteMembers(UA_UnregisterNodesRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST]); +UA_MdnsDiscoveryConfiguration_clear(UA_MdnsDiscoveryConfiguration *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION]); } static UA_INLINE void -UA_UnregisterNodesRequest_delete(UA_UnregisterNodesRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST]); +UA_MdnsDiscoveryConfiguration_delete(UA_MdnsDiscoveryConfiguration *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION]); } -/* ContentFilterElementResult */ +/* RegisterServer2Request */ static UA_INLINE void -UA_ContentFilterElementResult_init(UA_ContentFilterElementResult *p) { - memset(p, 0, sizeof(UA_ContentFilterElementResult)); +UA_RegisterServer2Request_init(UA_RegisterServer2Request *p) { + memset(p, 0, sizeof(UA_RegisterServer2Request)); } -static UA_INLINE UA_ContentFilterElementResult * -UA_ContentFilterElementResult_new(void) { - return (UA_ContentFilterElementResult*)UA_new(&UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT]); +static UA_INLINE UA_RegisterServer2Request * +UA_RegisterServer2Request_new(void) { + return (UA_RegisterServer2Request*)UA_new(&UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST]); } static UA_INLINE UA_StatusCode -UA_ContentFilterElementResult_copy(const UA_ContentFilterElementResult *src, UA_ContentFilterElementResult *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT]); +UA_RegisterServer2Request_copy(const UA_RegisterServer2Request *src, UA_RegisterServer2Request *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST]); } static UA_INLINE void -UA_ContentFilterElementResult_deleteMembers(UA_ContentFilterElementResult *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT]); +UA_RegisterServer2Request_deleteMembers(UA_RegisterServer2Request *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST]); } static UA_INLINE void -UA_ContentFilterElementResult_delete(UA_ContentFilterElementResult *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT]); +UA_RegisterServer2Request_clear(UA_RegisterServer2Request *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST]); } -/* SimpleAttributeOperand */ static UA_INLINE void -UA_SimpleAttributeOperand_init(UA_SimpleAttributeOperand *p) { - memset(p, 0, sizeof(UA_SimpleAttributeOperand)); +UA_RegisterServer2Request_delete(UA_RegisterServer2Request *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST]); } -static UA_INLINE UA_SimpleAttributeOperand * -UA_SimpleAttributeOperand_new(void) { - return (UA_SimpleAttributeOperand*)UA_new(&UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]); +/* RegisterServer2Response */ +static UA_INLINE void +UA_RegisterServer2Response_init(UA_RegisterServer2Response *p) { + memset(p, 0, sizeof(UA_RegisterServer2Response)); +} + +static UA_INLINE UA_RegisterServer2Response * +UA_RegisterServer2Response_new(void) { + return (UA_RegisterServer2Response*)UA_new(&UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]); } static UA_INLINE UA_StatusCode -UA_SimpleAttributeOperand_copy(const UA_SimpleAttributeOperand *src, UA_SimpleAttributeOperand *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]); +UA_RegisterServer2Response_copy(const UA_RegisterServer2Response *src, UA_RegisterServer2Response *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]); } static UA_INLINE void -UA_SimpleAttributeOperand_deleteMembers(UA_SimpleAttributeOperand *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]); +UA_RegisterServer2Response_deleteMembers(UA_RegisterServer2Response *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]); } static UA_INLINE void -UA_SimpleAttributeOperand_delete(UA_SimpleAttributeOperand *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]); +UA_RegisterServer2Response_clear(UA_RegisterServer2Response *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]); } -/* LiteralOperand */ static UA_INLINE void -UA_LiteralOperand_init(UA_LiteralOperand *p) { - memset(p, 0, sizeof(UA_LiteralOperand)); +UA_RegisterServer2Response_delete(UA_RegisterServer2Response *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]); } -static UA_INLINE UA_LiteralOperand * -UA_LiteralOperand_new(void) { - return (UA_LiteralOperand*)UA_new(&UA_TYPES[UA_TYPES_LITERALOPERAND]); +/* SecurityTokenRequestType */ +static UA_INLINE void +UA_SecurityTokenRequestType_init(UA_SecurityTokenRequestType *p) { + memset(p, 0, sizeof(UA_SecurityTokenRequestType)); +} + +static UA_INLINE UA_SecurityTokenRequestType * +UA_SecurityTokenRequestType_new(void) { + return (UA_SecurityTokenRequestType*)UA_new(&UA_TYPES[UA_TYPES_SECURITYTOKENREQUESTTYPE]); } static UA_INLINE UA_StatusCode -UA_LiteralOperand_copy(const UA_LiteralOperand *src, UA_LiteralOperand *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_LITERALOPERAND]); +UA_SecurityTokenRequestType_copy(const UA_SecurityTokenRequestType *src, UA_SecurityTokenRequestType *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} + +static UA_INLINE void +UA_SecurityTokenRequestType_deleteMembers(UA_SecurityTokenRequestType *p) { + memset(p, 0, sizeof(UA_SecurityTokenRequestType)); } static UA_INLINE void -UA_LiteralOperand_deleteMembers(UA_LiteralOperand *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_LITERALOPERAND]); +UA_SecurityTokenRequestType_clear(UA_SecurityTokenRequestType *p) { + memset(p, 0, sizeof(UA_SecurityTokenRequestType)); } static UA_INLINE void -UA_LiteralOperand_delete(UA_LiteralOperand *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_LITERALOPERAND]); +UA_SecurityTokenRequestType_delete(UA_SecurityTokenRequestType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SECURITYTOKENREQUESTTYPE]); } -/* QueryDataSet */ +/* ChannelSecurityToken */ static UA_INLINE void -UA_QueryDataSet_init(UA_QueryDataSet *p) { - memset(p, 0, sizeof(UA_QueryDataSet)); +UA_ChannelSecurityToken_init(UA_ChannelSecurityToken *p) { + memset(p, 0, sizeof(UA_ChannelSecurityToken)); } -static UA_INLINE UA_QueryDataSet * -UA_QueryDataSet_new(void) { - return (UA_QueryDataSet*)UA_new(&UA_TYPES[UA_TYPES_QUERYDATASET]); +static UA_INLINE UA_ChannelSecurityToken * +UA_ChannelSecurityToken_new(void) { + return (UA_ChannelSecurityToken*)UA_new(&UA_TYPES[UA_TYPES_CHANNELSECURITYTOKEN]); } static UA_INLINE UA_StatusCode -UA_QueryDataSet_copy(const UA_QueryDataSet *src, UA_QueryDataSet *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_QUERYDATASET]); +UA_ChannelSecurityToken_copy(const UA_ChannelSecurityToken *src, UA_ChannelSecurityToken *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_QueryDataSet_deleteMembers(UA_QueryDataSet *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_QUERYDATASET]); +UA_ChannelSecurityToken_deleteMembers(UA_ChannelSecurityToken *p) { + memset(p, 0, sizeof(UA_ChannelSecurityToken)); } static UA_INLINE void -UA_QueryDataSet_delete(UA_QueryDataSet *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_QUERYDATASET]); +UA_ChannelSecurityToken_clear(UA_ChannelSecurityToken *p) { + memset(p, 0, sizeof(UA_ChannelSecurityToken)); } -/* AnonymousIdentityToken */ static UA_INLINE void -UA_AnonymousIdentityToken_init(UA_AnonymousIdentityToken *p) { - memset(p, 0, sizeof(UA_AnonymousIdentityToken)); +UA_ChannelSecurityToken_delete(UA_ChannelSecurityToken *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CHANNELSECURITYTOKEN]); } -static UA_INLINE UA_AnonymousIdentityToken * -UA_AnonymousIdentityToken_new(void) { - return (UA_AnonymousIdentityToken*)UA_new(&UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]); +/* OpenSecureChannelRequest */ +static UA_INLINE void +UA_OpenSecureChannelRequest_init(UA_OpenSecureChannelRequest *p) { + memset(p, 0, sizeof(UA_OpenSecureChannelRequest)); } -static UA_INLINE UA_StatusCode -UA_AnonymousIdentityToken_copy(const UA_AnonymousIdentityToken *src, UA_AnonymousIdentityToken *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]); +static UA_INLINE UA_OpenSecureChannelRequest * +UA_OpenSecureChannelRequest_new(void) { + return (UA_OpenSecureChannelRequest*)UA_new(&UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); } -static UA_INLINE void -UA_AnonymousIdentityToken_deleteMembers(UA_AnonymousIdentityToken *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]); +static UA_INLINE UA_StatusCode +UA_OpenSecureChannelRequest_copy(const UA_OpenSecureChannelRequest *src, UA_OpenSecureChannelRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); } static UA_INLINE void -UA_AnonymousIdentityToken_delete(UA_AnonymousIdentityToken *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]); +UA_OpenSecureChannelRequest_deleteMembers(UA_OpenSecureChannelRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); } -/* SetPublishingModeRequest */ static UA_INLINE void -UA_SetPublishingModeRequest_init(UA_SetPublishingModeRequest *p) { - memset(p, 0, sizeof(UA_SetPublishingModeRequest)); -} - -static UA_INLINE UA_SetPublishingModeRequest * -UA_SetPublishingModeRequest_new(void) { - return (UA_SetPublishingModeRequest*)UA_new(&UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST]); -} - -static UA_INLINE UA_StatusCode -UA_SetPublishingModeRequest_copy(const UA_SetPublishingModeRequest *src, UA_SetPublishingModeRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST]); +UA_OpenSecureChannelRequest_clear(UA_OpenSecureChannelRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); } static UA_INLINE void -UA_SetPublishingModeRequest_deleteMembers(UA_SetPublishingModeRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST]); +UA_OpenSecureChannelRequest_delete(UA_OpenSecureChannelRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); } +/* OpenSecureChannelResponse */ static UA_INLINE void -UA_SetPublishingModeRequest_delete(UA_SetPublishingModeRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST]); +UA_OpenSecureChannelResponse_init(UA_OpenSecureChannelResponse *p) { + memset(p, 0, sizeof(UA_OpenSecureChannelResponse)); } -/* MonitoredItemCreateResult */ -static UA_INLINE void -UA_MonitoredItemCreateResult_init(UA_MonitoredItemCreateResult *p) { - memset(p, 0, sizeof(UA_MonitoredItemCreateResult)); +static UA_INLINE UA_OpenSecureChannelResponse * +UA_OpenSecureChannelResponse_new(void) { + return (UA_OpenSecureChannelResponse*)UA_new(&UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]); } -static UA_INLINE UA_MonitoredItemCreateResult * -UA_MonitoredItemCreateResult_new(void) { - return (UA_MonitoredItemCreateResult*)UA_new(&UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]); +static UA_INLINE UA_StatusCode +UA_OpenSecureChannelResponse_copy(const UA_OpenSecureChannelResponse *src, UA_OpenSecureChannelResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]); } -static UA_INLINE UA_StatusCode -UA_MonitoredItemCreateResult_copy(const UA_MonitoredItemCreateResult *src, UA_MonitoredItemCreateResult *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]); +static UA_INLINE void +UA_OpenSecureChannelResponse_deleteMembers(UA_OpenSecureChannelResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]); } static UA_INLINE void -UA_MonitoredItemCreateResult_deleteMembers(UA_MonitoredItemCreateResult *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]); +UA_OpenSecureChannelResponse_clear(UA_OpenSecureChannelResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]); } static UA_INLINE void -UA_MonitoredItemCreateResult_delete(UA_MonitoredItemCreateResult *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]); +UA_OpenSecureChannelResponse_delete(UA_OpenSecureChannelResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]); } -/* TimestampsToReturn */ +/* CloseSecureChannelRequest */ static UA_INLINE void -UA_TimestampsToReturn_init(UA_TimestampsToReturn *p) { - memset(p, 0, sizeof(UA_TimestampsToReturn)); +UA_CloseSecureChannelRequest_init(UA_CloseSecureChannelRequest *p) { + memset(p, 0, sizeof(UA_CloseSecureChannelRequest)); } -static UA_INLINE UA_TimestampsToReturn * -UA_TimestampsToReturn_new(void) { - return (UA_TimestampsToReturn*)UA_new(&UA_TYPES[UA_TYPES_TIMESTAMPSTORETURN]); +static UA_INLINE UA_CloseSecureChannelRequest * +UA_CloseSecureChannelRequest_new(void) { + return (UA_CloseSecureChannelRequest*)UA_new(&UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); } static UA_INLINE UA_StatusCode -UA_TimestampsToReturn_copy(const UA_TimestampsToReturn *src, UA_TimestampsToReturn *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_CloseSecureChannelRequest_copy(const UA_CloseSecureChannelRequest *src, UA_CloseSecureChannelRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); } static UA_INLINE void -UA_TimestampsToReturn_deleteMembers(UA_TimestampsToReturn *p) { } +UA_CloseSecureChannelRequest_deleteMembers(UA_CloseSecureChannelRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); +} static UA_INLINE void -UA_TimestampsToReturn_delete(UA_TimestampsToReturn *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_TIMESTAMPSTORETURN]); +UA_CloseSecureChannelRequest_clear(UA_CloseSecureChannelRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); } -/* CallRequest */ static UA_INLINE void -UA_CallRequest_init(UA_CallRequest *p) { - memset(p, 0, sizeof(UA_CallRequest)); +UA_CloseSecureChannelRequest_delete(UA_CloseSecureChannelRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); } -static UA_INLINE UA_CallRequest * -UA_CallRequest_new(void) { - return (UA_CallRequest*)UA_new(&UA_TYPES[UA_TYPES_CALLREQUEST]); +/* CloseSecureChannelResponse */ +static UA_INLINE void +UA_CloseSecureChannelResponse_init(UA_CloseSecureChannelResponse *p) { + memset(p, 0, sizeof(UA_CloseSecureChannelResponse)); +} + +static UA_INLINE UA_CloseSecureChannelResponse * +UA_CloseSecureChannelResponse_new(void) { + return (UA_CloseSecureChannelResponse*)UA_new(&UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE]); } static UA_INLINE UA_StatusCode -UA_CallRequest_copy(const UA_CallRequest *src, UA_CallRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CALLREQUEST]); +UA_CloseSecureChannelResponse_copy(const UA_CloseSecureChannelResponse *src, UA_CloseSecureChannelResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE]); } static UA_INLINE void -UA_CallRequest_deleteMembers(UA_CallRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CALLREQUEST]); +UA_CloseSecureChannelResponse_deleteMembers(UA_CloseSecureChannelResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE]); } static UA_INLINE void -UA_CallRequest_delete(UA_CallRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CALLREQUEST]); +UA_CloseSecureChannelResponse_clear(UA_CloseSecureChannelResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE]); } -/* MethodAttributes */ static UA_INLINE void -UA_MethodAttributes_init(UA_MethodAttributes *p) { - memset(p, 0, sizeof(UA_MethodAttributes)); +UA_CloseSecureChannelResponse_delete(UA_CloseSecureChannelResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE]); } -static UA_INLINE UA_MethodAttributes * -UA_MethodAttributes_new(void) { - return (UA_MethodAttributes*)UA_new(&UA_TYPES[UA_TYPES_METHODATTRIBUTES]); +/* SignedSoftwareCertificate */ +static UA_INLINE void +UA_SignedSoftwareCertificate_init(UA_SignedSoftwareCertificate *p) { + memset(p, 0, sizeof(UA_SignedSoftwareCertificate)); +} + +static UA_INLINE UA_SignedSoftwareCertificate * +UA_SignedSoftwareCertificate_new(void) { + return (UA_SignedSoftwareCertificate*)UA_new(&UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE]); } static UA_INLINE UA_StatusCode -UA_MethodAttributes_copy(const UA_MethodAttributes *src, UA_MethodAttributes *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_METHODATTRIBUTES]); +UA_SignedSoftwareCertificate_copy(const UA_SignedSoftwareCertificate *src, UA_SignedSoftwareCertificate *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE]); } static UA_INLINE void -UA_MethodAttributes_deleteMembers(UA_MethodAttributes *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_METHODATTRIBUTES]); +UA_SignedSoftwareCertificate_deleteMembers(UA_SignedSoftwareCertificate *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE]); } static UA_INLINE void -UA_MethodAttributes_delete(UA_MethodAttributes *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_METHODATTRIBUTES]); +UA_SignedSoftwareCertificate_clear(UA_SignedSoftwareCertificate *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE]); } -/* DeleteReferencesItem */ static UA_INLINE void -UA_DeleteReferencesItem_init(UA_DeleteReferencesItem *p) { - memset(p, 0, sizeof(UA_DeleteReferencesItem)); +UA_SignedSoftwareCertificate_delete(UA_SignedSoftwareCertificate *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE]); } -static UA_INLINE UA_DeleteReferencesItem * -UA_DeleteReferencesItem_new(void) { - return (UA_DeleteReferencesItem*)UA_new(&UA_TYPES[UA_TYPES_DELETEREFERENCESITEM]); +/* SignatureData */ +static UA_INLINE void +UA_SignatureData_init(UA_SignatureData *p) { + memset(p, 0, sizeof(UA_SignatureData)); +} + +static UA_INLINE UA_SignatureData * +UA_SignatureData_new(void) { + return (UA_SignatureData*)UA_new(&UA_TYPES[UA_TYPES_SIGNATUREDATA]); } static UA_INLINE UA_StatusCode -UA_DeleteReferencesItem_copy(const UA_DeleteReferencesItem *src, UA_DeleteReferencesItem *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM]); +UA_SignatureData_copy(const UA_SignatureData *src, UA_SignatureData *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SIGNATUREDATA]); } static UA_INLINE void -UA_DeleteReferencesItem_deleteMembers(UA_DeleteReferencesItem *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM]); +UA_SignatureData_deleteMembers(UA_SignatureData *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SIGNATUREDATA]); } static UA_INLINE void -UA_DeleteReferencesItem_delete(UA_DeleteReferencesItem *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM]); +UA_SignatureData_clear(UA_SignatureData *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SIGNATUREDATA]); } -/* WriteValue */ static UA_INLINE void -UA_WriteValue_init(UA_WriteValue *p) { - memset(p, 0, sizeof(UA_WriteValue)); +UA_SignatureData_delete(UA_SignatureData *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SIGNATUREDATA]); } -static UA_INLINE UA_WriteValue * -UA_WriteValue_new(void) { - return (UA_WriteValue*)UA_new(&UA_TYPES[UA_TYPES_WRITEVALUE]); +/* CreateSessionRequest */ +static UA_INLINE void +UA_CreateSessionRequest_init(UA_CreateSessionRequest *p) { + memset(p, 0, sizeof(UA_CreateSessionRequest)); +} + +static UA_INLINE UA_CreateSessionRequest * +UA_CreateSessionRequest_new(void) { + return (UA_CreateSessionRequest*)UA_new(&UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]); } static UA_INLINE UA_StatusCode -UA_WriteValue_copy(const UA_WriteValue *src, UA_WriteValue *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_WRITEVALUE]); +UA_CreateSessionRequest_copy(const UA_CreateSessionRequest *src, UA_CreateSessionRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]); } static UA_INLINE void -UA_WriteValue_deleteMembers(UA_WriteValue *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_WRITEVALUE]); +UA_CreateSessionRequest_deleteMembers(UA_CreateSessionRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]); } static UA_INLINE void -UA_WriteValue_delete(UA_WriteValue *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_WRITEVALUE]); +UA_CreateSessionRequest_clear(UA_CreateSessionRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]); } -/* NodeAttributesMask */ static UA_INLINE void -UA_NodeAttributesMask_init(UA_NodeAttributesMask *p) { - memset(p, 0, sizeof(UA_NodeAttributesMask)); +UA_CreateSessionRequest_delete(UA_CreateSessionRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]); } -static UA_INLINE UA_NodeAttributesMask * -UA_NodeAttributesMask_new(void) { - return (UA_NodeAttributesMask*)UA_new(&UA_TYPES[UA_TYPES_NODEATTRIBUTESMASK]); +/* CreateSessionResponse */ +static UA_INLINE void +UA_CreateSessionResponse_init(UA_CreateSessionResponse *p) { + memset(p, 0, sizeof(UA_CreateSessionResponse)); +} + +static UA_INLINE UA_CreateSessionResponse * +UA_CreateSessionResponse_new(void) { + return (UA_CreateSessionResponse*)UA_new(&UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]); } static UA_INLINE UA_StatusCode -UA_NodeAttributesMask_copy(const UA_NodeAttributesMask *src, UA_NodeAttributesMask *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_CreateSessionResponse_copy(const UA_CreateSessionResponse *src, UA_CreateSessionResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]); } static UA_INLINE void -UA_NodeAttributesMask_deleteMembers(UA_NodeAttributesMask *p) { } +UA_CreateSessionResponse_deleteMembers(UA_CreateSessionResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]); +} static UA_INLINE void -UA_NodeAttributesMask_delete(UA_NodeAttributesMask *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_NODEATTRIBUTESMASK]); +UA_CreateSessionResponse_clear(UA_CreateSessionResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]); } -/* MessageSecurityMode */ static UA_INLINE void -UA_MessageSecurityMode_init(UA_MessageSecurityMode *p) { - memset(p, 0, sizeof(UA_MessageSecurityMode)); +UA_CreateSessionResponse_delete(UA_CreateSessionResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]); } -static UA_INLINE UA_MessageSecurityMode * -UA_MessageSecurityMode_new(void) { - return (UA_MessageSecurityMode*)UA_new(&UA_TYPES[UA_TYPES_MESSAGESECURITYMODE]); +/* UserIdentityToken */ +static UA_INLINE void +UA_UserIdentityToken_init(UA_UserIdentityToken *p) { + memset(p, 0, sizeof(UA_UserIdentityToken)); +} + +static UA_INLINE UA_UserIdentityToken * +UA_UserIdentityToken_new(void) { + return (UA_UserIdentityToken*)UA_new(&UA_TYPES[UA_TYPES_USERIDENTITYTOKEN]); } static UA_INLINE UA_StatusCode -UA_MessageSecurityMode_copy(const UA_MessageSecurityMode *src, UA_MessageSecurityMode *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_UserIdentityToken_copy(const UA_UserIdentityToken *src, UA_UserIdentityToken *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN]); } static UA_INLINE void -UA_MessageSecurityMode_deleteMembers(UA_MessageSecurityMode *p) { } +UA_UserIdentityToken_deleteMembers(UA_UserIdentityToken *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN]); +} static UA_INLINE void -UA_MessageSecurityMode_delete(UA_MessageSecurityMode *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MESSAGESECURITYMODE]); +UA_UserIdentityToken_clear(UA_UserIdentityToken *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN]); } -/* MonitoringParameters */ static UA_INLINE void -UA_MonitoringParameters_init(UA_MonitoringParameters *p) { - memset(p, 0, sizeof(UA_MonitoringParameters)); +UA_UserIdentityToken_delete(UA_UserIdentityToken *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN]); } -static UA_INLINE UA_MonitoringParameters * -UA_MonitoringParameters_new(void) { - return (UA_MonitoringParameters*)UA_new(&UA_TYPES[UA_TYPES_MONITORINGPARAMETERS]); +/* AnonymousIdentityToken */ +static UA_INLINE void +UA_AnonymousIdentityToken_init(UA_AnonymousIdentityToken *p) { + memset(p, 0, sizeof(UA_AnonymousIdentityToken)); +} + +static UA_INLINE UA_AnonymousIdentityToken * +UA_AnonymousIdentityToken_new(void) { + return (UA_AnonymousIdentityToken*)UA_new(&UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]); } static UA_INLINE UA_StatusCode -UA_MonitoringParameters_copy(const UA_MonitoringParameters *src, UA_MonitoringParameters *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS]); +UA_AnonymousIdentityToken_copy(const UA_AnonymousIdentityToken *src, UA_AnonymousIdentityToken *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]); } static UA_INLINE void -UA_MonitoringParameters_deleteMembers(UA_MonitoringParameters *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS]); +UA_AnonymousIdentityToken_deleteMembers(UA_AnonymousIdentityToken *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]); } static UA_INLINE void -UA_MonitoringParameters_delete(UA_MonitoringParameters *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS]); +UA_AnonymousIdentityToken_clear(UA_AnonymousIdentityToken *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]); +} + +static UA_INLINE void +UA_AnonymousIdentityToken_delete(UA_AnonymousIdentityToken *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]); } -/* ReferenceNode */ +/* UserNameIdentityToken */ static UA_INLINE void -UA_ReferenceNode_init(UA_ReferenceNode *p) { - memset(p, 0, sizeof(UA_ReferenceNode)); +UA_UserNameIdentityToken_init(UA_UserNameIdentityToken *p) { + memset(p, 0, sizeof(UA_UserNameIdentityToken)); } -static UA_INLINE UA_ReferenceNode * -UA_ReferenceNode_new(void) { - return (UA_ReferenceNode*)UA_new(&UA_TYPES[UA_TYPES_REFERENCENODE]); +static UA_INLINE UA_UserNameIdentityToken * +UA_UserNameIdentityToken_new(void) { + return (UA_UserNameIdentityToken*)UA_new(&UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]); } static UA_INLINE UA_StatusCode -UA_ReferenceNode_copy(const UA_ReferenceNode *src, UA_ReferenceNode *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REFERENCENODE]); +UA_UserNameIdentityToken_copy(const UA_UserNameIdentityToken *src, UA_UserNameIdentityToken *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]); } static UA_INLINE void -UA_ReferenceNode_deleteMembers(UA_ReferenceNode *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REFERENCENODE]); +UA_UserNameIdentityToken_deleteMembers(UA_UserNameIdentityToken *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]); } static UA_INLINE void -UA_ReferenceNode_delete(UA_ReferenceNode *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REFERENCENODE]); +UA_UserNameIdentityToken_clear(UA_UserNameIdentityToken *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]); } -/* Argument */ static UA_INLINE void -UA_Argument_init(UA_Argument *p) { - memset(p, 0, sizeof(UA_Argument)); +UA_UserNameIdentityToken_delete(UA_UserNameIdentityToken *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]); } -static UA_INLINE UA_Argument * -UA_Argument_new(void) { - return (UA_Argument*)UA_new(&UA_TYPES[UA_TYPES_ARGUMENT]); +/* X509IdentityToken */ +static UA_INLINE void +UA_X509IdentityToken_init(UA_X509IdentityToken *p) { + memset(p, 0, sizeof(UA_X509IdentityToken)); +} + +static UA_INLINE UA_X509IdentityToken * +UA_X509IdentityToken_new(void) { + return (UA_X509IdentityToken*)UA_new(&UA_TYPES[UA_TYPES_X509IDENTITYTOKEN]); } static UA_INLINE UA_StatusCode -UA_Argument_copy(const UA_Argument *src, UA_Argument *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ARGUMENT]); +UA_X509IdentityToken_copy(const UA_X509IdentityToken *src, UA_X509IdentityToken *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN]); } static UA_INLINE void -UA_Argument_deleteMembers(UA_Argument *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ARGUMENT]); +UA_X509IdentityToken_deleteMembers(UA_X509IdentityToken *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN]); } static UA_INLINE void -UA_Argument_delete(UA_Argument *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ARGUMENT]); +UA_X509IdentityToken_clear(UA_X509IdentityToken *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN]); } -/* ChannelSecurityToken */ static UA_INLINE void -UA_ChannelSecurityToken_init(UA_ChannelSecurityToken *p) { - memset(p, 0, sizeof(UA_ChannelSecurityToken)); +UA_X509IdentityToken_delete(UA_X509IdentityToken *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN]); } -static UA_INLINE UA_ChannelSecurityToken * -UA_ChannelSecurityToken_new(void) { - return (UA_ChannelSecurityToken*)UA_new(&UA_TYPES[UA_TYPES_CHANNELSECURITYTOKEN]); +/* IssuedIdentityToken */ +static UA_INLINE void +UA_IssuedIdentityToken_init(UA_IssuedIdentityToken *p) { + memset(p, 0, sizeof(UA_IssuedIdentityToken)); +} + +static UA_INLINE UA_IssuedIdentityToken * +UA_IssuedIdentityToken_new(void) { + return (UA_IssuedIdentityToken*)UA_new(&UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN]); } static UA_INLINE UA_StatusCode -UA_ChannelSecurityToken_copy(const UA_ChannelSecurityToken *src, UA_ChannelSecurityToken *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_IssuedIdentityToken_copy(const UA_IssuedIdentityToken *src, UA_IssuedIdentityToken *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN]); } static UA_INLINE void -UA_ChannelSecurityToken_deleteMembers(UA_ChannelSecurityToken *p) { } +UA_IssuedIdentityToken_deleteMembers(UA_IssuedIdentityToken *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN]); +} static UA_INLINE void -UA_ChannelSecurityToken_delete(UA_ChannelSecurityToken *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CHANNELSECURITYTOKEN]); +UA_IssuedIdentityToken_clear(UA_IssuedIdentityToken *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN]); } -/* UserIdentityToken */ static UA_INLINE void -UA_UserIdentityToken_init(UA_UserIdentityToken *p) { - memset(p, 0, sizeof(UA_UserIdentityToken)); +UA_IssuedIdentityToken_delete(UA_IssuedIdentityToken *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN]); } -static UA_INLINE UA_UserIdentityToken * -UA_UserIdentityToken_new(void) { - return (UA_UserIdentityToken*)UA_new(&UA_TYPES[UA_TYPES_USERIDENTITYTOKEN]); +/* ActivateSessionRequest */ +static UA_INLINE void +UA_ActivateSessionRequest_init(UA_ActivateSessionRequest *p) { + memset(p, 0, sizeof(UA_ActivateSessionRequest)); +} + +static UA_INLINE UA_ActivateSessionRequest * +UA_ActivateSessionRequest_new(void) { + return (UA_ActivateSessionRequest*)UA_new(&UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]); } static UA_INLINE UA_StatusCode -UA_UserIdentityToken_copy(const UA_UserIdentityToken *src, UA_UserIdentityToken *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN]); +UA_ActivateSessionRequest_copy(const UA_ActivateSessionRequest *src, UA_ActivateSessionRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]); } static UA_INLINE void -UA_UserIdentityToken_deleteMembers(UA_UserIdentityToken *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN]); +UA_ActivateSessionRequest_deleteMembers(UA_ActivateSessionRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]); } static UA_INLINE void -UA_UserIdentityToken_delete(UA_UserIdentityToken *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN]); +UA_ActivateSessionRequest_clear(UA_ActivateSessionRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]); } -/* SignatureData */ static UA_INLINE void -UA_SignatureData_init(UA_SignatureData *p) { - memset(p, 0, sizeof(UA_SignatureData)); +UA_ActivateSessionRequest_delete(UA_ActivateSessionRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]); } -static UA_INLINE UA_SignatureData * -UA_SignatureData_new(void) { - return (UA_SignatureData*)UA_new(&UA_TYPES[UA_TYPES_SIGNATUREDATA]); +/* ActivateSessionResponse */ +static UA_INLINE void +UA_ActivateSessionResponse_init(UA_ActivateSessionResponse *p) { + memset(p, 0, sizeof(UA_ActivateSessionResponse)); +} + +static UA_INLINE UA_ActivateSessionResponse * +UA_ActivateSessionResponse_new(void) { + return (UA_ActivateSessionResponse*)UA_new(&UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]); } static UA_INLINE UA_StatusCode -UA_SignatureData_copy(const UA_SignatureData *src, UA_SignatureData *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SIGNATUREDATA]); +UA_ActivateSessionResponse_copy(const UA_ActivateSessionResponse *src, UA_ActivateSessionResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]); } static UA_INLINE void -UA_SignatureData_deleteMembers(UA_SignatureData *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SIGNATUREDATA]); +UA_ActivateSessionResponse_deleteMembers(UA_ActivateSessionResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]); } static UA_INLINE void -UA_SignatureData_delete(UA_SignatureData *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SIGNATUREDATA]); +UA_ActivateSessionResponse_clear(UA_ActivateSessionResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]); } -/* ObjectTypeAttributes */ static UA_INLINE void -UA_ObjectTypeAttributes_init(UA_ObjectTypeAttributes *p) { - memset(p, 0, sizeof(UA_ObjectTypeAttributes)); +UA_ActivateSessionResponse_delete(UA_ActivateSessionResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]); } -static UA_INLINE UA_ObjectTypeAttributes * -UA_ObjectTypeAttributes_new(void) { - return (UA_ObjectTypeAttributes*)UA_new(&UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); +/* CloseSessionRequest */ +static UA_INLINE void +UA_CloseSessionRequest_init(UA_CloseSessionRequest *p) { + memset(p, 0, sizeof(UA_CloseSessionRequest)); +} + +static UA_INLINE UA_CloseSessionRequest * +UA_CloseSessionRequest_new(void) { + return (UA_CloseSessionRequest*)UA_new(&UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]); } static UA_INLINE UA_StatusCode -UA_ObjectTypeAttributes_copy(const UA_ObjectTypeAttributes *src, UA_ObjectTypeAttributes *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); +UA_CloseSessionRequest_copy(const UA_CloseSessionRequest *src, UA_CloseSessionRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]); } static UA_INLINE void -UA_ObjectTypeAttributes_deleteMembers(UA_ObjectTypeAttributes *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); +UA_CloseSessionRequest_deleteMembers(UA_CloseSessionRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]); } static UA_INLINE void -UA_ObjectTypeAttributes_delete(UA_ObjectTypeAttributes *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); +UA_CloseSessionRequest_clear(UA_CloseSessionRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]); } -/* DeadbandType */ static UA_INLINE void -UA_DeadbandType_init(UA_DeadbandType *p) { - memset(p, 0, sizeof(UA_DeadbandType)); +UA_CloseSessionRequest_delete(UA_CloseSessionRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]); } -static UA_INLINE UA_DeadbandType * -UA_DeadbandType_new(void) { - return (UA_DeadbandType*)UA_new(&UA_TYPES[UA_TYPES_DEADBANDTYPE]); +/* CloseSessionResponse */ +static UA_INLINE void +UA_CloseSessionResponse_init(UA_CloseSessionResponse *p) { + memset(p, 0, sizeof(UA_CloseSessionResponse)); +} + +static UA_INLINE UA_CloseSessionResponse * +UA_CloseSessionResponse_new(void) { + return (UA_CloseSessionResponse*)UA_new(&UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]); } static UA_INLINE UA_StatusCode -UA_DeadbandType_copy(const UA_DeadbandType *src, UA_DeadbandType *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_CloseSessionResponse_copy(const UA_CloseSessionResponse *src, UA_CloseSessionResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]); } static UA_INLINE void -UA_DeadbandType_deleteMembers(UA_DeadbandType *p) { } +UA_CloseSessionResponse_deleteMembers(UA_CloseSessionResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]); +} static UA_INLINE void -UA_DeadbandType_delete(UA_DeadbandType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DEADBANDTYPE]); +UA_CloseSessionResponse_clear(UA_CloseSessionResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]); } -/* SecurityTokenRequestType */ static UA_INLINE void -UA_SecurityTokenRequestType_init(UA_SecurityTokenRequestType *p) { - memset(p, 0, sizeof(UA_SecurityTokenRequestType)); +UA_CloseSessionResponse_delete(UA_CloseSessionResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]); } -static UA_INLINE UA_SecurityTokenRequestType * -UA_SecurityTokenRequestType_new(void) { - return (UA_SecurityTokenRequestType*)UA_new(&UA_TYPES[UA_TYPES_SECURITYTOKENREQUESTTYPE]); +/* NodeAttributesMask */ +static UA_INLINE void +UA_NodeAttributesMask_init(UA_NodeAttributesMask *p) { + memset(p, 0, sizeof(UA_NodeAttributesMask)); +} + +static UA_INLINE UA_NodeAttributesMask * +UA_NodeAttributesMask_new(void) { + return (UA_NodeAttributesMask*)UA_new(&UA_TYPES[UA_TYPES_NODEATTRIBUTESMASK]); } static UA_INLINE UA_StatusCode -UA_SecurityTokenRequestType_copy(const UA_SecurityTokenRequestType *src, UA_SecurityTokenRequestType *dst) { +UA_NodeAttributesMask_copy(const UA_NodeAttributesMask *src, UA_NodeAttributesMask *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_SecurityTokenRequestType_deleteMembers(UA_SecurityTokenRequestType *p) { } +UA_NodeAttributesMask_deleteMembers(UA_NodeAttributesMask *p) { + memset(p, 0, sizeof(UA_NodeAttributesMask)); +} static UA_INLINE void -UA_SecurityTokenRequestType_delete(UA_SecurityTokenRequestType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SECURITYTOKENREQUESTTYPE]); +UA_NodeAttributesMask_clear(UA_NodeAttributesMask *p) { + memset(p, 0, sizeof(UA_NodeAttributesMask)); +} + +static UA_INLINE void +UA_NodeAttributesMask_delete(UA_NodeAttributesMask *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_NODEATTRIBUTESMASK]); } /* NodeAttributes */ @@ -7799,7 +20042,12 @@ UA_NodeAttributes_copy(const UA_NodeAttributes *src, UA_NodeAttributes *dst) { static UA_INLINE void UA_NodeAttributes_deleteMembers(UA_NodeAttributes *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_NODEATTRIBUTES]); + UA_clear(p, &UA_TYPES[UA_TYPES_NODEATTRIBUTES]); +} + +static UA_INLINE void +UA_NodeAttributes_clear(UA_NodeAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_NODEATTRIBUTES]); } static UA_INLINE void @@ -7807,1472 +20055,1777 @@ UA_NodeAttributes_delete(UA_NodeAttributes *p) { UA_delete(p, &UA_TYPES[UA_TYPES_NODEATTRIBUTES]); } -/* DataChangeTrigger */ +/* ObjectAttributes */ static UA_INLINE void -UA_DataChangeTrigger_init(UA_DataChangeTrigger *p) { - memset(p, 0, sizeof(UA_DataChangeTrigger)); +UA_ObjectAttributes_init(UA_ObjectAttributes *p) { + memset(p, 0, sizeof(UA_ObjectAttributes)); } -static UA_INLINE UA_DataChangeTrigger * -UA_DataChangeTrigger_new(void) { - return (UA_DataChangeTrigger*)UA_new(&UA_TYPES[UA_TYPES_DATACHANGETRIGGER]); +static UA_INLINE UA_ObjectAttributes * +UA_ObjectAttributes_new(void) { + return (UA_ObjectAttributes*)UA_new(&UA_TYPES[UA_TYPES_OBJECTATTRIBUTES]); } static UA_INLINE UA_StatusCode -UA_DataChangeTrigger_copy(const UA_DataChangeTrigger *src, UA_DataChangeTrigger *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_ObjectAttributes_copy(const UA_ObjectAttributes *src, UA_ObjectAttributes *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES]); +} + +static UA_INLINE void +UA_ObjectAttributes_deleteMembers(UA_ObjectAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES]); +} + +static UA_INLINE void +UA_ObjectAttributes_clear(UA_ObjectAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES]); +} + +static UA_INLINE void +UA_ObjectAttributes_delete(UA_ObjectAttributes *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES]); +} + +/* VariableAttributes */ +static UA_INLINE void +UA_VariableAttributes_init(UA_VariableAttributes *p) { + memset(p, 0, sizeof(UA_VariableAttributes)); +} + +static UA_INLINE UA_VariableAttributes * +UA_VariableAttributes_new(void) { + return (UA_VariableAttributes*)UA_new(&UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]); +} + +static UA_INLINE UA_StatusCode +UA_VariableAttributes_copy(const UA_VariableAttributes *src, UA_VariableAttributes *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]); +} + +static UA_INLINE void +UA_VariableAttributes_deleteMembers(UA_VariableAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]); } static UA_INLINE void -UA_DataChangeTrigger_deleteMembers(UA_DataChangeTrigger *p) { } +UA_VariableAttributes_clear(UA_VariableAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]); +} static UA_INLINE void -UA_DataChangeTrigger_delete(UA_DataChangeTrigger *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DATACHANGETRIGGER]); +UA_VariableAttributes_delete(UA_VariableAttributes *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]); } -/* BuildInfo */ +/* MethodAttributes */ static UA_INLINE void -UA_BuildInfo_init(UA_BuildInfo *p) { - memset(p, 0, sizeof(UA_BuildInfo)); +UA_MethodAttributes_init(UA_MethodAttributes *p) { + memset(p, 0, sizeof(UA_MethodAttributes)); } -static UA_INLINE UA_BuildInfo * -UA_BuildInfo_new(void) { - return (UA_BuildInfo*)UA_new(&UA_TYPES[UA_TYPES_BUILDINFO]); +static UA_INLINE UA_MethodAttributes * +UA_MethodAttributes_new(void) { + return (UA_MethodAttributes*)UA_new(&UA_TYPES[UA_TYPES_METHODATTRIBUTES]); } static UA_INLINE UA_StatusCode -UA_BuildInfo_copy(const UA_BuildInfo *src, UA_BuildInfo *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BUILDINFO]); +UA_MethodAttributes_copy(const UA_MethodAttributes *src, UA_MethodAttributes *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_METHODATTRIBUTES]); } static UA_INLINE void -UA_BuildInfo_deleteMembers(UA_BuildInfo *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_BUILDINFO]); +UA_MethodAttributes_deleteMembers(UA_MethodAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_METHODATTRIBUTES]); } static UA_INLINE void -UA_BuildInfo_delete(UA_BuildInfo *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BUILDINFO]); +UA_MethodAttributes_clear(UA_MethodAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_METHODATTRIBUTES]); } -/* NodeClass */ static UA_INLINE void -UA_NodeClass_init(UA_NodeClass *p) { - memset(p, 0, sizeof(UA_NodeClass)); +UA_MethodAttributes_delete(UA_MethodAttributes *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_METHODATTRIBUTES]); } -static UA_INLINE UA_NodeClass * -UA_NodeClass_new(void) { - return (UA_NodeClass*)UA_new(&UA_TYPES[UA_TYPES_NODECLASS]); +/* ObjectTypeAttributes */ +static UA_INLINE void +UA_ObjectTypeAttributes_init(UA_ObjectTypeAttributes *p) { + memset(p, 0, sizeof(UA_ObjectTypeAttributes)); +} + +static UA_INLINE UA_ObjectTypeAttributes * +UA_ObjectTypeAttributes_new(void) { + return (UA_ObjectTypeAttributes*)UA_new(&UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); } static UA_INLINE UA_StatusCode -UA_NodeClass_copy(const UA_NodeClass *src, UA_NodeClass *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_ObjectTypeAttributes_copy(const UA_ObjectTypeAttributes *src, UA_ObjectTypeAttributes *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); +} + +static UA_INLINE void +UA_ObjectTypeAttributes_deleteMembers(UA_ObjectTypeAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); } static UA_INLINE void -UA_NodeClass_deleteMembers(UA_NodeClass *p) { } +UA_ObjectTypeAttributes_clear(UA_ObjectTypeAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); +} static UA_INLINE void -UA_NodeClass_delete(UA_NodeClass *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_NODECLASS]); +UA_ObjectTypeAttributes_delete(UA_ObjectTypeAttributes *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); } -/* SubscriptionDiagnosticsDataType */ +/* VariableTypeAttributes */ static UA_INLINE void -UA_SubscriptionDiagnosticsDataType_init(UA_SubscriptionDiagnosticsDataType *p) { - memset(p, 0, sizeof(UA_SubscriptionDiagnosticsDataType)); +UA_VariableTypeAttributes_init(UA_VariableTypeAttributes *p) { + memset(p, 0, sizeof(UA_VariableTypeAttributes)); } -static UA_INLINE UA_SubscriptionDiagnosticsDataType * -UA_SubscriptionDiagnosticsDataType_new(void) { - return (UA_SubscriptionDiagnosticsDataType*)UA_new(&UA_TYPES[UA_TYPES_SUBSCRIPTIONDIAGNOSTICSDATATYPE]); +static UA_INLINE UA_VariableTypeAttributes * +UA_VariableTypeAttributes_new(void) { + return (UA_VariableTypeAttributes*)UA_new(&UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); } static UA_INLINE UA_StatusCode -UA_SubscriptionDiagnosticsDataType_copy(const UA_SubscriptionDiagnosticsDataType *src, UA_SubscriptionDiagnosticsDataType *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SUBSCRIPTIONDIAGNOSTICSDATATYPE]); +UA_VariableTypeAttributes_copy(const UA_VariableTypeAttributes *src, UA_VariableTypeAttributes *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); +} + +static UA_INLINE void +UA_VariableTypeAttributes_deleteMembers(UA_VariableTypeAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); } static UA_INLINE void -UA_SubscriptionDiagnosticsDataType_deleteMembers(UA_SubscriptionDiagnosticsDataType *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SUBSCRIPTIONDIAGNOSTICSDATATYPE]); +UA_VariableTypeAttributes_clear(UA_VariableTypeAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); } static UA_INLINE void -UA_SubscriptionDiagnosticsDataType_delete(UA_SubscriptionDiagnosticsDataType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SUBSCRIPTIONDIAGNOSTICSDATATYPE]); +UA_VariableTypeAttributes_delete(UA_VariableTypeAttributes *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); } -/* FilterOperand */ +/* ReferenceTypeAttributes */ static UA_INLINE void -UA_FilterOperand_init(UA_FilterOperand *p) { - memset(p, 0, sizeof(UA_FilterOperand)); +UA_ReferenceTypeAttributes_init(UA_ReferenceTypeAttributes *p) { + memset(p, 0, sizeof(UA_ReferenceTypeAttributes)); } -static UA_INLINE UA_FilterOperand * -UA_FilterOperand_new(void) { - return (UA_FilterOperand*)UA_new(&UA_TYPES[UA_TYPES_FILTEROPERAND]); +static UA_INLINE UA_ReferenceTypeAttributes * +UA_ReferenceTypeAttributes_new(void) { + return (UA_ReferenceTypeAttributes*)UA_new(&UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); } static UA_INLINE UA_StatusCode -UA_FilterOperand_copy(const UA_FilterOperand *src, UA_FilterOperand *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_ReferenceTypeAttributes_copy(const UA_ReferenceTypeAttributes *src, UA_ReferenceTypeAttributes *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); } static UA_INLINE void -UA_FilterOperand_deleteMembers(UA_FilterOperand *p) { } +UA_ReferenceTypeAttributes_deleteMembers(UA_ReferenceTypeAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); +} static UA_INLINE void -UA_FilterOperand_delete(UA_FilterOperand *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_FILTEROPERAND]); +UA_ReferenceTypeAttributes_clear(UA_ReferenceTypeAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); } -/* MonitoredItemNotification */ static UA_INLINE void -UA_MonitoredItemNotification_init(UA_MonitoredItemNotification *p) { - memset(p, 0, sizeof(UA_MonitoredItemNotification)); +UA_ReferenceTypeAttributes_delete(UA_ReferenceTypeAttributes *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); } -static UA_INLINE UA_MonitoredItemNotification * -UA_MonitoredItemNotification_new(void) { - return (UA_MonitoredItemNotification*)UA_new(&UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]); +/* DataTypeAttributes */ +static UA_INLINE void +UA_DataTypeAttributes_init(UA_DataTypeAttributes *p) { + memset(p, 0, sizeof(UA_DataTypeAttributes)); +} + +static UA_INLINE UA_DataTypeAttributes * +UA_DataTypeAttributes_new(void) { + return (UA_DataTypeAttributes*)UA_new(&UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); } static UA_INLINE UA_StatusCode -UA_MonitoredItemNotification_copy(const UA_MonitoredItemNotification *src, UA_MonitoredItemNotification *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]); +UA_DataTypeAttributes_copy(const UA_DataTypeAttributes *src, UA_DataTypeAttributes *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); } static UA_INLINE void -UA_MonitoredItemNotification_deleteMembers(UA_MonitoredItemNotification *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]); +UA_DataTypeAttributes_deleteMembers(UA_DataTypeAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); } static UA_INLINE void -UA_MonitoredItemNotification_delete(UA_MonitoredItemNotification *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]); +UA_DataTypeAttributes_clear(UA_DataTypeAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); } -/* DeleteNodesItem */ static UA_INLINE void -UA_DeleteNodesItem_init(UA_DeleteNodesItem *p) { - memset(p, 0, sizeof(UA_DeleteNodesItem)); +UA_DataTypeAttributes_delete(UA_DataTypeAttributes *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); } -static UA_INLINE UA_DeleteNodesItem * -UA_DeleteNodesItem_new(void) { - return (UA_DeleteNodesItem*)UA_new(&UA_TYPES[UA_TYPES_DELETENODESITEM]); +/* ViewAttributes */ +static UA_INLINE void +UA_ViewAttributes_init(UA_ViewAttributes *p) { + memset(p, 0, sizeof(UA_ViewAttributes)); +} + +static UA_INLINE UA_ViewAttributes * +UA_ViewAttributes_new(void) { + return (UA_ViewAttributes*)UA_new(&UA_TYPES[UA_TYPES_VIEWATTRIBUTES]); } static UA_INLINE UA_StatusCode -UA_DeleteNodesItem_copy(const UA_DeleteNodesItem *src, UA_DeleteNodesItem *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETENODESITEM]); +UA_ViewAttributes_copy(const UA_ViewAttributes *src, UA_ViewAttributes *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES]); } static UA_INLINE void -UA_DeleteNodesItem_deleteMembers(UA_DeleteNodesItem *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DELETENODESITEM]); +UA_ViewAttributes_deleteMembers(UA_ViewAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES]); } static UA_INLINE void -UA_DeleteNodesItem_delete(UA_DeleteNodesItem *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DELETENODESITEM]); +UA_ViewAttributes_clear(UA_ViewAttributes *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES]); } -/* DeleteSubscriptionsRequest */ static UA_INLINE void -UA_DeleteSubscriptionsRequest_init(UA_DeleteSubscriptionsRequest *p) { - memset(p, 0, sizeof(UA_DeleteSubscriptionsRequest)); +UA_ViewAttributes_delete(UA_ViewAttributes *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES]); } -static UA_INLINE UA_DeleteSubscriptionsRequest * -UA_DeleteSubscriptionsRequest_new(void) { - return (UA_DeleteSubscriptionsRequest*)UA_new(&UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST]); +/* AddNodesItem */ +static UA_INLINE void +UA_AddNodesItem_init(UA_AddNodesItem *p) { + memset(p, 0, sizeof(UA_AddNodesItem)); +} + +static UA_INLINE UA_AddNodesItem * +UA_AddNodesItem_new(void) { + return (UA_AddNodesItem*)UA_new(&UA_TYPES[UA_TYPES_ADDNODESITEM]); } static UA_INLINE UA_StatusCode -UA_DeleteSubscriptionsRequest_copy(const UA_DeleteSubscriptionsRequest *src, UA_DeleteSubscriptionsRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST]); +UA_AddNodesItem_copy(const UA_AddNodesItem *src, UA_AddNodesItem *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDNODESITEM]); } static UA_INLINE void -UA_DeleteSubscriptionsRequest_deleteMembers(UA_DeleteSubscriptionsRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST]); +UA_AddNodesItem_deleteMembers(UA_AddNodesItem *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDNODESITEM]); } static UA_INLINE void -UA_DeleteSubscriptionsRequest_delete(UA_DeleteSubscriptionsRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST]); +UA_AddNodesItem_clear(UA_AddNodesItem *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDNODESITEM]); } -/* SubscriptionAcknowledgement */ static UA_INLINE void -UA_SubscriptionAcknowledgement_init(UA_SubscriptionAcknowledgement *p) { - memset(p, 0, sizeof(UA_SubscriptionAcknowledgement)); +UA_AddNodesItem_delete(UA_AddNodesItem *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ADDNODESITEM]); } -static UA_INLINE UA_SubscriptionAcknowledgement * -UA_SubscriptionAcknowledgement_new(void) { - return (UA_SubscriptionAcknowledgement*)UA_new(&UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT]); +/* AddNodesResult */ +static UA_INLINE void +UA_AddNodesResult_init(UA_AddNodesResult *p) { + memset(p, 0, sizeof(UA_AddNodesResult)); +} + +static UA_INLINE UA_AddNodesResult * +UA_AddNodesResult_new(void) { + return (UA_AddNodesResult*)UA_new(&UA_TYPES[UA_TYPES_ADDNODESRESULT]); } static UA_INLINE UA_StatusCode -UA_SubscriptionAcknowledgement_copy(const UA_SubscriptionAcknowledgement *src, UA_SubscriptionAcknowledgement *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_AddNodesResult_copy(const UA_AddNodesResult *src, UA_AddNodesResult *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDNODESRESULT]); } static UA_INLINE void -UA_SubscriptionAcknowledgement_deleteMembers(UA_SubscriptionAcknowledgement *p) { } +UA_AddNodesResult_deleteMembers(UA_AddNodesResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDNODESRESULT]); +} static UA_INLINE void -UA_SubscriptionAcknowledgement_delete(UA_SubscriptionAcknowledgement *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT]); +UA_AddNodesResult_clear(UA_AddNodesResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDNODESRESULT]); } -/* ReadValueId */ static UA_INLINE void -UA_ReadValueId_init(UA_ReadValueId *p) { - memset(p, 0, sizeof(UA_ReadValueId)); +UA_AddNodesResult_delete(UA_AddNodesResult *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ADDNODESRESULT]); } -static UA_INLINE UA_ReadValueId * -UA_ReadValueId_new(void) { - return (UA_ReadValueId*)UA_new(&UA_TYPES[UA_TYPES_READVALUEID]); +/* AddNodesRequest */ +static UA_INLINE void +UA_AddNodesRequest_init(UA_AddNodesRequest *p) { + memset(p, 0, sizeof(UA_AddNodesRequest)); +} + +static UA_INLINE UA_AddNodesRequest * +UA_AddNodesRequest_new(void) { + return (UA_AddNodesRequest*)UA_new(&UA_TYPES[UA_TYPES_ADDNODESREQUEST]); } static UA_INLINE UA_StatusCode -UA_ReadValueId_copy(const UA_ReadValueId *src, UA_ReadValueId *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_READVALUEID]); +UA_AddNodesRequest_copy(const UA_AddNodesRequest *src, UA_AddNodesRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDNODESREQUEST]); } static UA_INLINE void -UA_ReadValueId_deleteMembers(UA_ReadValueId *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_READVALUEID]); +UA_AddNodesRequest_deleteMembers(UA_AddNodesRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDNODESREQUEST]); } static UA_INLINE void -UA_ReadValueId_delete(UA_ReadValueId *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_READVALUEID]); +UA_AddNodesRequest_clear(UA_AddNodesRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDNODESREQUEST]); } -/* DataTypeAttributes */ static UA_INLINE void -UA_DataTypeAttributes_init(UA_DataTypeAttributes *p) { - memset(p, 0, sizeof(UA_DataTypeAttributes)); +UA_AddNodesRequest_delete(UA_AddNodesRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ADDNODESREQUEST]); } -static UA_INLINE UA_DataTypeAttributes * -UA_DataTypeAttributes_new(void) { - return (UA_DataTypeAttributes*)UA_new(&UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); +/* AddNodesResponse */ +static UA_INLINE void +UA_AddNodesResponse_init(UA_AddNodesResponse *p) { + memset(p, 0, sizeof(UA_AddNodesResponse)); +} + +static UA_INLINE UA_AddNodesResponse * +UA_AddNodesResponse_new(void) { + return (UA_AddNodesResponse*)UA_new(&UA_TYPES[UA_TYPES_ADDNODESRESPONSE]); } static UA_INLINE UA_StatusCode -UA_DataTypeAttributes_copy(const UA_DataTypeAttributes *src, UA_DataTypeAttributes *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); +UA_AddNodesResponse_copy(const UA_AddNodesResponse *src, UA_AddNodesResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE]); } static UA_INLINE void -UA_DataTypeAttributes_deleteMembers(UA_DataTypeAttributes *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); +UA_AddNodesResponse_deleteMembers(UA_AddNodesResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE]); } static UA_INLINE void -UA_DataTypeAttributes_delete(UA_DataTypeAttributes *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); +UA_AddNodesResponse_clear(UA_AddNodesResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE]); } -/* ResponseHeader */ static UA_INLINE void -UA_ResponseHeader_init(UA_ResponseHeader *p) { - memset(p, 0, sizeof(UA_ResponseHeader)); +UA_AddNodesResponse_delete(UA_AddNodesResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE]); +} + +/* AddReferencesItem */ +static UA_INLINE void +UA_AddReferencesItem_init(UA_AddReferencesItem *p) { + memset(p, 0, sizeof(UA_AddReferencesItem)); +} + +static UA_INLINE UA_AddReferencesItem * +UA_AddReferencesItem_new(void) { + return (UA_AddReferencesItem*)UA_new(&UA_TYPES[UA_TYPES_ADDREFERENCESITEM]); } -static UA_INLINE UA_ResponseHeader * -UA_ResponseHeader_new(void) { - return (UA_ResponseHeader*)UA_new(&UA_TYPES[UA_TYPES_RESPONSEHEADER]); +static UA_INLINE UA_StatusCode +UA_AddReferencesItem_copy(const UA_AddReferencesItem *src, UA_AddReferencesItem *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM]); } -static UA_INLINE UA_StatusCode -UA_ResponseHeader_copy(const UA_ResponseHeader *src, UA_ResponseHeader *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_RESPONSEHEADER]); +static UA_INLINE void +UA_AddReferencesItem_deleteMembers(UA_AddReferencesItem *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM]); } static UA_INLINE void -UA_ResponseHeader_deleteMembers(UA_ResponseHeader *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_RESPONSEHEADER]); +UA_AddReferencesItem_clear(UA_AddReferencesItem *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM]); } static UA_INLINE void -UA_ResponseHeader_delete(UA_ResponseHeader *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_RESPONSEHEADER]); +UA_AddReferencesItem_delete(UA_AddReferencesItem *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM]); } -/* DeleteMonitoredItemsRequest */ +/* AddReferencesRequest */ static UA_INLINE void -UA_DeleteMonitoredItemsRequest_init(UA_DeleteMonitoredItemsRequest *p) { - memset(p, 0, sizeof(UA_DeleteMonitoredItemsRequest)); +UA_AddReferencesRequest_init(UA_AddReferencesRequest *p) { + memset(p, 0, sizeof(UA_AddReferencesRequest)); } -static UA_INLINE UA_DeleteMonitoredItemsRequest * -UA_DeleteMonitoredItemsRequest_new(void) { - return (UA_DeleteMonitoredItemsRequest*)UA_new(&UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST]); +static UA_INLINE UA_AddReferencesRequest * +UA_AddReferencesRequest_new(void) { + return (UA_AddReferencesRequest*)UA_new(&UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST]); } static UA_INLINE UA_StatusCode -UA_DeleteMonitoredItemsRequest_copy(const UA_DeleteMonitoredItemsRequest *src, UA_DeleteMonitoredItemsRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST]); +UA_AddReferencesRequest_copy(const UA_AddReferencesRequest *src, UA_AddReferencesRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST]); } static UA_INLINE void -UA_DeleteMonitoredItemsRequest_deleteMembers(UA_DeleteMonitoredItemsRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST]); +UA_AddReferencesRequest_deleteMembers(UA_AddReferencesRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST]); } static UA_INLINE void -UA_DeleteMonitoredItemsRequest_delete(UA_DeleteMonitoredItemsRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST]); +UA_AddReferencesRequest_clear(UA_AddReferencesRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST]); } -/* ViewDescription */ static UA_INLINE void -UA_ViewDescription_init(UA_ViewDescription *p) { - memset(p, 0, sizeof(UA_ViewDescription)); +UA_AddReferencesRequest_delete(UA_AddReferencesRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST]); } -static UA_INLINE UA_ViewDescription * -UA_ViewDescription_new(void) { - return (UA_ViewDescription*)UA_new(&UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); +/* AddReferencesResponse */ +static UA_INLINE void +UA_AddReferencesResponse_init(UA_AddReferencesResponse *p) { + memset(p, 0, sizeof(UA_AddReferencesResponse)); +} + +static UA_INLINE UA_AddReferencesResponse * +UA_AddReferencesResponse_new(void) { + return (UA_AddReferencesResponse*)UA_new(&UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]); } static UA_INLINE UA_StatusCode -UA_ViewDescription_copy(const UA_ViewDescription *src, UA_ViewDescription *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); +UA_AddReferencesResponse_copy(const UA_AddReferencesResponse *src, UA_AddReferencesResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]); } static UA_INLINE void -UA_ViewDescription_deleteMembers(UA_ViewDescription *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); +UA_AddReferencesResponse_deleteMembers(UA_AddReferencesResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]); } static UA_INLINE void -UA_ViewDescription_delete(UA_ViewDescription *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); +UA_AddReferencesResponse_clear(UA_AddReferencesResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]); } -/* ServerOnNetwork */ static UA_INLINE void -UA_ServerOnNetwork_init(UA_ServerOnNetwork *p) { - memset(p, 0, sizeof(UA_ServerOnNetwork)); +UA_AddReferencesResponse_delete(UA_AddReferencesResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]); } -static UA_INLINE UA_ServerOnNetwork * -UA_ServerOnNetwork_new(void) { - return (UA_ServerOnNetwork*)UA_new(&UA_TYPES[UA_TYPES_SERVERONNETWORK]); +/* DeleteNodesItem */ +static UA_INLINE void +UA_DeleteNodesItem_init(UA_DeleteNodesItem *p) { + memset(p, 0, sizeof(UA_DeleteNodesItem)); +} + +static UA_INLINE UA_DeleteNodesItem * +UA_DeleteNodesItem_new(void) { + return (UA_DeleteNodesItem*)UA_new(&UA_TYPES[UA_TYPES_DELETENODESITEM]); } static UA_INLINE UA_StatusCode -UA_ServerOnNetwork_copy(const UA_ServerOnNetwork *src, UA_ServerOnNetwork *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SERVERONNETWORK]); +UA_DeleteNodesItem_copy(const UA_DeleteNodesItem *src, UA_DeleteNodesItem *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETENODESITEM]); } static UA_INLINE void -UA_ServerOnNetwork_deleteMembers(UA_ServerOnNetwork *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SERVERONNETWORK]); +UA_DeleteNodesItem_deleteMembers(UA_DeleteNodesItem *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETENODESITEM]); } static UA_INLINE void -UA_ServerOnNetwork_delete(UA_ServerOnNetwork *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SERVERONNETWORK]); +UA_DeleteNodesItem_clear(UA_DeleteNodesItem *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETENODESITEM]); } -/* DeleteMonitoredItemsResponse */ static UA_INLINE void -UA_DeleteMonitoredItemsResponse_init(UA_DeleteMonitoredItemsResponse *p) { - memset(p, 0, sizeof(UA_DeleteMonitoredItemsResponse)); +UA_DeleteNodesItem_delete(UA_DeleteNodesItem *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DELETENODESITEM]); } -static UA_INLINE UA_DeleteMonitoredItemsResponse * -UA_DeleteMonitoredItemsResponse_new(void) { - return (UA_DeleteMonitoredItemsResponse*)UA_new(&UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]); +/* DeleteNodesRequest */ +static UA_INLINE void +UA_DeleteNodesRequest_init(UA_DeleteNodesRequest *p) { + memset(p, 0, sizeof(UA_DeleteNodesRequest)); +} + +static UA_INLINE UA_DeleteNodesRequest * +UA_DeleteNodesRequest_new(void) { + return (UA_DeleteNodesRequest*)UA_new(&UA_TYPES[UA_TYPES_DELETENODESREQUEST]); } static UA_INLINE UA_StatusCode -UA_DeleteMonitoredItemsResponse_copy(const UA_DeleteMonitoredItemsResponse *src, UA_DeleteMonitoredItemsResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]); +UA_DeleteNodesRequest_copy(const UA_DeleteNodesRequest *src, UA_DeleteNodesRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETENODESREQUEST]); } static UA_INLINE void -UA_DeleteMonitoredItemsResponse_deleteMembers(UA_DeleteMonitoredItemsResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]); +UA_DeleteNodesRequest_deleteMembers(UA_DeleteNodesRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETENODESREQUEST]); } static UA_INLINE void -UA_DeleteMonitoredItemsResponse_delete(UA_DeleteMonitoredItemsResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]); +UA_DeleteNodesRequest_clear(UA_DeleteNodesRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETENODESREQUEST]); } -/* FindServersOnNetworkResponse */ static UA_INLINE void -UA_FindServersOnNetworkResponse_init(UA_FindServersOnNetworkResponse *p) { - memset(p, 0, sizeof(UA_FindServersOnNetworkResponse)); +UA_DeleteNodesRequest_delete(UA_DeleteNodesRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DELETENODESREQUEST]); } -static UA_INLINE UA_FindServersOnNetworkResponse * -UA_FindServersOnNetworkResponse_new(void) { - return (UA_FindServersOnNetworkResponse*)UA_new(&UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]); +/* DeleteNodesResponse */ +static UA_INLINE void +UA_DeleteNodesResponse_init(UA_DeleteNodesResponse *p) { + memset(p, 0, sizeof(UA_DeleteNodesResponse)); +} + +static UA_INLINE UA_DeleteNodesResponse * +UA_DeleteNodesResponse_new(void) { + return (UA_DeleteNodesResponse*)UA_new(&UA_TYPES[UA_TYPES_DELETENODESRESPONSE]); } static UA_INLINE UA_StatusCode -UA_FindServersOnNetworkResponse_copy(const UA_FindServersOnNetworkResponse *src, UA_FindServersOnNetworkResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]); +UA_DeleteNodesResponse_copy(const UA_DeleteNodesResponse *src, UA_DeleteNodesResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE]); } static UA_INLINE void -UA_FindServersOnNetworkResponse_deleteMembers(UA_FindServersOnNetworkResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]); +UA_DeleteNodesResponse_deleteMembers(UA_DeleteNodesResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE]); } static UA_INLINE void -UA_FindServersOnNetworkResponse_delete(UA_FindServersOnNetworkResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]); +UA_DeleteNodesResponse_clear(UA_DeleteNodesResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE]); } -/* RelativePath */ static UA_INLINE void -UA_RelativePath_init(UA_RelativePath *p) { - memset(p, 0, sizeof(UA_RelativePath)); +UA_DeleteNodesResponse_delete(UA_DeleteNodesResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE]); } -static UA_INLINE UA_RelativePath * -UA_RelativePath_new(void) { - return (UA_RelativePath*)UA_new(&UA_TYPES[UA_TYPES_RELATIVEPATH]); +/* DeleteReferencesItem */ +static UA_INLINE void +UA_DeleteReferencesItem_init(UA_DeleteReferencesItem *p) { + memset(p, 0, sizeof(UA_DeleteReferencesItem)); +} + +static UA_INLINE UA_DeleteReferencesItem * +UA_DeleteReferencesItem_new(void) { + return (UA_DeleteReferencesItem*)UA_new(&UA_TYPES[UA_TYPES_DELETEREFERENCESITEM]); } static UA_INLINE UA_StatusCode -UA_RelativePath_copy(const UA_RelativePath *src, UA_RelativePath *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_RELATIVEPATH]); +UA_DeleteReferencesItem_copy(const UA_DeleteReferencesItem *src, UA_DeleteReferencesItem *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM]); } static UA_INLINE void -UA_RelativePath_deleteMembers(UA_RelativePath *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_RELATIVEPATH]); +UA_DeleteReferencesItem_deleteMembers(UA_DeleteReferencesItem *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM]); } static UA_INLINE void -UA_RelativePath_delete(UA_RelativePath *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_RELATIVEPATH]); +UA_DeleteReferencesItem_clear(UA_DeleteReferencesItem *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM]); } -/* RegisterNodesRequest */ static UA_INLINE void -UA_RegisterNodesRequest_init(UA_RegisterNodesRequest *p) { - memset(p, 0, sizeof(UA_RegisterNodesRequest)); +UA_DeleteReferencesItem_delete(UA_DeleteReferencesItem *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM]); } -static UA_INLINE UA_RegisterNodesRequest * -UA_RegisterNodesRequest_new(void) { - return (UA_RegisterNodesRequest*)UA_new(&UA_TYPES[UA_TYPES_REGISTERNODESREQUEST]); +/* DeleteReferencesRequest */ +static UA_INLINE void +UA_DeleteReferencesRequest_init(UA_DeleteReferencesRequest *p) { + memset(p, 0, sizeof(UA_DeleteReferencesRequest)); +} + +static UA_INLINE UA_DeleteReferencesRequest * +UA_DeleteReferencesRequest_new(void) { + return (UA_DeleteReferencesRequest*)UA_new(&UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST]); } static UA_INLINE UA_StatusCode -UA_RegisterNodesRequest_copy(const UA_RegisterNodesRequest *src, UA_RegisterNodesRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST]); +UA_DeleteReferencesRequest_copy(const UA_DeleteReferencesRequest *src, UA_DeleteReferencesRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST]); } static UA_INLINE void -UA_RegisterNodesRequest_deleteMembers(UA_RegisterNodesRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST]); +UA_DeleteReferencesRequest_deleteMembers(UA_DeleteReferencesRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST]); } static UA_INLINE void -UA_RegisterNodesRequest_delete(UA_RegisterNodesRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST]); +UA_DeleteReferencesRequest_clear(UA_DeleteReferencesRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST]); } -/* AggregateConfiguration */ static UA_INLINE void -UA_AggregateConfiguration_init(UA_AggregateConfiguration *p) { - memset(p, 0, sizeof(UA_AggregateConfiguration)); +UA_DeleteReferencesRequest_delete(UA_DeleteReferencesRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST]); } -static UA_INLINE UA_AggregateConfiguration * -UA_AggregateConfiguration_new(void) { - return (UA_AggregateConfiguration*)UA_new(&UA_TYPES[UA_TYPES_AGGREGATECONFIGURATION]); +/* DeleteReferencesResponse */ +static UA_INLINE void +UA_DeleteReferencesResponse_init(UA_DeleteReferencesResponse *p) { + memset(p, 0, sizeof(UA_DeleteReferencesResponse)); +} + +static UA_INLINE UA_DeleteReferencesResponse * +UA_DeleteReferencesResponse_new(void) { + return (UA_DeleteReferencesResponse*)UA_new(&UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]); } static UA_INLINE UA_StatusCode -UA_AggregateConfiguration_copy(const UA_AggregateConfiguration *src, UA_AggregateConfiguration *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_DeleteReferencesResponse_copy(const UA_DeleteReferencesResponse *src, UA_DeleteReferencesResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]); } static UA_INLINE void -UA_AggregateConfiguration_deleteMembers(UA_AggregateConfiguration *p) { } +UA_DeleteReferencesResponse_deleteMembers(UA_DeleteReferencesResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]); +} static UA_INLINE void -UA_AggregateConfiguration_delete(UA_AggregateConfiguration *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_AGGREGATECONFIGURATION]); +UA_DeleteReferencesResponse_clear(UA_DeleteReferencesResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]); } -/* DeleteNodesRequest */ static UA_INLINE void -UA_DeleteNodesRequest_init(UA_DeleteNodesRequest *p) { - memset(p, 0, sizeof(UA_DeleteNodesRequest)); +UA_DeleteReferencesResponse_delete(UA_DeleteReferencesResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]); } -static UA_INLINE UA_DeleteNodesRequest * -UA_DeleteNodesRequest_new(void) { - return (UA_DeleteNodesRequest*)UA_new(&UA_TYPES[UA_TYPES_DELETENODESREQUEST]); +/* BrowseDirection */ +static UA_INLINE void +UA_BrowseDirection_init(UA_BrowseDirection *p) { + memset(p, 0, sizeof(UA_BrowseDirection)); +} + +static UA_INLINE UA_BrowseDirection * +UA_BrowseDirection_new(void) { + return (UA_BrowseDirection*)UA_new(&UA_TYPES[UA_TYPES_BROWSEDIRECTION]); } static UA_INLINE UA_StatusCode -UA_DeleteNodesRequest_copy(const UA_DeleteNodesRequest *src, UA_DeleteNodesRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETENODESREQUEST]); +UA_BrowseDirection_copy(const UA_BrowseDirection *src, UA_BrowseDirection *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_DeleteNodesRequest_deleteMembers(UA_DeleteNodesRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DELETENODESREQUEST]); +UA_BrowseDirection_deleteMembers(UA_BrowseDirection *p) { + memset(p, 0, sizeof(UA_BrowseDirection)); } static UA_INLINE void -UA_DeleteNodesRequest_delete(UA_DeleteNodesRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DELETENODESREQUEST]); +UA_BrowseDirection_clear(UA_BrowseDirection *p) { + memset(p, 0, sizeof(UA_BrowseDirection)); } -/* PublishResponse */ static UA_INLINE void -UA_PublishResponse_init(UA_PublishResponse *p) { - memset(p, 0, sizeof(UA_PublishResponse)); +UA_BrowseDirection_delete(UA_BrowseDirection *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROWSEDIRECTION]); } -static UA_INLINE UA_PublishResponse * -UA_PublishResponse_new(void) { - return (UA_PublishResponse*)UA_new(&UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); +/* ViewDescription */ +static UA_INLINE void +UA_ViewDescription_init(UA_ViewDescription *p) { + memset(p, 0, sizeof(UA_ViewDescription)); +} + +static UA_INLINE UA_ViewDescription * +UA_ViewDescription_new(void) { + return (UA_ViewDescription*)UA_new(&UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); } static UA_INLINE UA_StatusCode -UA_PublishResponse_copy(const UA_PublishResponse *src, UA_PublishResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); +UA_ViewDescription_copy(const UA_ViewDescription *src, UA_ViewDescription *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); } static UA_INLINE void -UA_PublishResponse_deleteMembers(UA_PublishResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); +UA_ViewDescription_deleteMembers(UA_ViewDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); } static UA_INLINE void -UA_PublishResponse_delete(UA_PublishResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); +UA_ViewDescription_clear(UA_ViewDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); } -/* MonitoredItemModifyRequest */ static UA_INLINE void -UA_MonitoredItemModifyRequest_init(UA_MonitoredItemModifyRequest *p) { - memset(p, 0, sizeof(UA_MonitoredItemModifyRequest)); +UA_ViewDescription_delete(UA_ViewDescription *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); } -static UA_INLINE UA_MonitoredItemModifyRequest * -UA_MonitoredItemModifyRequest_new(void) { - return (UA_MonitoredItemModifyRequest*)UA_new(&UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST]); +/* BrowseDescription */ +static UA_INLINE void +UA_BrowseDescription_init(UA_BrowseDescription *p) { + memset(p, 0, sizeof(UA_BrowseDescription)); +} + +static UA_INLINE UA_BrowseDescription * +UA_BrowseDescription_new(void) { + return (UA_BrowseDescription*)UA_new(&UA_TYPES[UA_TYPES_BROWSEDESCRIPTION]); } static UA_INLINE UA_StatusCode -UA_MonitoredItemModifyRequest_copy(const UA_MonitoredItemModifyRequest *src, UA_MonitoredItemModifyRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST]); +UA_BrowseDescription_copy(const UA_BrowseDescription *src, UA_BrowseDescription *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION]); } static UA_INLINE void -UA_MonitoredItemModifyRequest_deleteMembers(UA_MonitoredItemModifyRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST]); +UA_BrowseDescription_deleteMembers(UA_BrowseDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION]); } static UA_INLINE void -UA_MonitoredItemModifyRequest_delete(UA_MonitoredItemModifyRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST]); +UA_BrowseDescription_clear(UA_BrowseDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION]); +} + +static UA_INLINE void +UA_BrowseDescription_delete(UA_BrowseDescription *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION]); } -/* ServiceCounterDataType */ +/* BrowseResultMask */ static UA_INLINE void -UA_ServiceCounterDataType_init(UA_ServiceCounterDataType *p) { - memset(p, 0, sizeof(UA_ServiceCounterDataType)); +UA_BrowseResultMask_init(UA_BrowseResultMask *p) { + memset(p, 0, sizeof(UA_BrowseResultMask)); } -static UA_INLINE UA_ServiceCounterDataType * -UA_ServiceCounterDataType_new(void) { - return (UA_ServiceCounterDataType*)UA_new(&UA_TYPES[UA_TYPES_SERVICECOUNTERDATATYPE]); +static UA_INLINE UA_BrowseResultMask * +UA_BrowseResultMask_new(void) { + return (UA_BrowseResultMask*)UA_new(&UA_TYPES[UA_TYPES_BROWSERESULTMASK]); } static UA_INLINE UA_StatusCode -UA_ServiceCounterDataType_copy(const UA_ServiceCounterDataType *src, UA_ServiceCounterDataType *dst) { +UA_BrowseResultMask_copy(const UA_BrowseResultMask *src, UA_BrowseResultMask *dst) { *dst = *src; return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_ServiceCounterDataType_deleteMembers(UA_ServiceCounterDataType *p) { } - -static UA_INLINE void -UA_ServiceCounterDataType_delete(UA_ServiceCounterDataType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SERVICECOUNTERDATATYPE]); +UA_BrowseResultMask_deleteMembers(UA_BrowseResultMask *p) { + memset(p, 0, sizeof(UA_BrowseResultMask)); } -/* ModelChangeStructureDataType */ static UA_INLINE void -UA_ModelChangeStructureDataType_init(UA_ModelChangeStructureDataType *p) { - memset(p, 0, sizeof(UA_ModelChangeStructureDataType)); -} - -static UA_INLINE UA_ModelChangeStructureDataType * -UA_ModelChangeStructureDataType_new(void) { - return (UA_ModelChangeStructureDataType*)UA_new(&UA_TYPES[UA_TYPES_MODELCHANGESTRUCTUREDATATYPE]); -} - -static UA_INLINE UA_StatusCode -UA_ModelChangeStructureDataType_copy(const UA_ModelChangeStructureDataType *src, UA_ModelChangeStructureDataType *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MODELCHANGESTRUCTUREDATATYPE]); +UA_BrowseResultMask_clear(UA_BrowseResultMask *p) { + memset(p, 0, sizeof(UA_BrowseResultMask)); } static UA_INLINE void -UA_ModelChangeStructureDataType_deleteMembers(UA_ModelChangeStructureDataType *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_MODELCHANGESTRUCTUREDATATYPE]); +UA_BrowseResultMask_delete(UA_BrowseResultMask *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROWSERESULTMASK]); } +/* ReferenceDescription */ static UA_INLINE void -UA_ModelChangeStructureDataType_delete(UA_ModelChangeStructureDataType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MODELCHANGESTRUCTUREDATATYPE]); +UA_ReferenceDescription_init(UA_ReferenceDescription *p) { + memset(p, 0, sizeof(UA_ReferenceDescription)); } -/* UserNameIdentityToken */ -static UA_INLINE void -UA_UserNameIdentityToken_init(UA_UserNameIdentityToken *p) { - memset(p, 0, sizeof(UA_UserNameIdentityToken)); +static UA_INLINE UA_ReferenceDescription * +UA_ReferenceDescription_new(void) { + return (UA_ReferenceDescription*)UA_new(&UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); } -static UA_INLINE UA_UserNameIdentityToken * -UA_UserNameIdentityToken_new(void) { - return (UA_UserNameIdentityToken*)UA_new(&UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]); +static UA_INLINE UA_StatusCode +UA_ReferenceDescription_copy(const UA_ReferenceDescription *src, UA_ReferenceDescription *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); } -static UA_INLINE UA_StatusCode -UA_UserNameIdentityToken_copy(const UA_UserNameIdentityToken *src, UA_UserNameIdentityToken *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]); +static UA_INLINE void +UA_ReferenceDescription_deleteMembers(UA_ReferenceDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); } static UA_INLINE void -UA_UserNameIdentityToken_deleteMembers(UA_UserNameIdentityToken *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]); +UA_ReferenceDescription_clear(UA_ReferenceDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); } static UA_INLINE void -UA_UserNameIdentityToken_delete(UA_UserNameIdentityToken *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]); +UA_ReferenceDescription_delete(UA_ReferenceDescription *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); } -/* IdType */ +/* BrowseResult */ static UA_INLINE void -UA_IdType_init(UA_IdType *p) { - memset(p, 0, sizeof(UA_IdType)); +UA_BrowseResult_init(UA_BrowseResult *p) { + memset(p, 0, sizeof(UA_BrowseResult)); } -static UA_INLINE UA_IdType * -UA_IdType_new(void) { - return (UA_IdType*)UA_new(&UA_TYPES[UA_TYPES_IDTYPE]); +static UA_INLINE UA_BrowseResult * +UA_BrowseResult_new(void) { + return (UA_BrowseResult*)UA_new(&UA_TYPES[UA_TYPES_BROWSERESULT]); } static UA_INLINE UA_StatusCode -UA_IdType_copy(const UA_IdType *src, UA_IdType *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_BrowseResult_copy(const UA_BrowseResult *src, UA_BrowseResult *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSERESULT]); } static UA_INLINE void -UA_IdType_deleteMembers(UA_IdType *p) { } +UA_BrowseResult_deleteMembers(UA_BrowseResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSERESULT]); +} static UA_INLINE void -UA_IdType_delete(UA_IdType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_IDTYPE]); +UA_BrowseResult_clear(UA_BrowseResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSERESULT]); } -/* UserTokenType */ static UA_INLINE void -UA_UserTokenType_init(UA_UserTokenType *p) { - memset(p, 0, sizeof(UA_UserTokenType)); +UA_BrowseResult_delete(UA_BrowseResult *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROWSERESULT]); } -static UA_INLINE UA_UserTokenType * -UA_UserTokenType_new(void) { - return (UA_UserTokenType*)UA_new(&UA_TYPES[UA_TYPES_USERTOKENTYPE]); +/* BrowseRequest */ +static UA_INLINE void +UA_BrowseRequest_init(UA_BrowseRequest *p) { + memset(p, 0, sizeof(UA_BrowseRequest)); +} + +static UA_INLINE UA_BrowseRequest * +UA_BrowseRequest_new(void) { + return (UA_BrowseRequest*)UA_new(&UA_TYPES[UA_TYPES_BROWSEREQUEST]); } static UA_INLINE UA_StatusCode -UA_UserTokenType_copy(const UA_UserTokenType *src, UA_UserTokenType *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_BrowseRequest_copy(const UA_BrowseRequest *src, UA_BrowseRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSEREQUEST]); } static UA_INLINE void -UA_UserTokenType_deleteMembers(UA_UserTokenType *p) { } +UA_BrowseRequest_deleteMembers(UA_BrowseRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSEREQUEST]); +} static UA_INLINE void -UA_UserTokenType_delete(UA_UserTokenType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_USERTOKENTYPE]); +UA_BrowseRequest_clear(UA_BrowseRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSEREQUEST]); } -/* SetTriggeringResponse */ static UA_INLINE void -UA_SetTriggeringResponse_init(UA_SetTriggeringResponse *p) { - memset(p, 0, sizeof(UA_SetTriggeringResponse)); +UA_BrowseRequest_delete(UA_BrowseRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROWSEREQUEST]); } -static UA_INLINE UA_SetTriggeringResponse * -UA_SetTriggeringResponse_new(void) { - return (UA_SetTriggeringResponse*)UA_new(&UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE]); +/* BrowseResponse */ +static UA_INLINE void +UA_BrowseResponse_init(UA_BrowseResponse *p) { + memset(p, 0, sizeof(UA_BrowseResponse)); +} + +static UA_INLINE UA_BrowseResponse * +UA_BrowseResponse_new(void) { + return (UA_BrowseResponse*)UA_new(&UA_TYPES[UA_TYPES_BROWSERESPONSE]); } static UA_INLINE UA_StatusCode -UA_SetTriggeringResponse_copy(const UA_SetTriggeringResponse *src, UA_SetTriggeringResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE]); +UA_BrowseResponse_copy(const UA_BrowseResponse *src, UA_BrowseResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSERESPONSE]); } static UA_INLINE void -UA_SetTriggeringResponse_deleteMembers(UA_SetTriggeringResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE]); +UA_BrowseResponse_deleteMembers(UA_BrowseResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSERESPONSE]); } static UA_INLINE void -UA_SetTriggeringResponse_delete(UA_SetTriggeringResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE]); +UA_BrowseResponse_clear(UA_BrowseResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSERESPONSE]); +} + +static UA_INLINE void +UA_BrowseResponse_delete(UA_BrowseResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROWSERESPONSE]); } -/* TimeZoneDataType */ +/* BrowseNextRequest */ static UA_INLINE void -UA_TimeZoneDataType_init(UA_TimeZoneDataType *p) { - memset(p, 0, sizeof(UA_TimeZoneDataType)); +UA_BrowseNextRequest_init(UA_BrowseNextRequest *p) { + memset(p, 0, sizeof(UA_BrowseNextRequest)); } -static UA_INLINE UA_TimeZoneDataType * -UA_TimeZoneDataType_new(void) { - return (UA_TimeZoneDataType*)UA_new(&UA_TYPES[UA_TYPES_TIMEZONEDATATYPE]); +static UA_INLINE UA_BrowseNextRequest * +UA_BrowseNextRequest_new(void) { + return (UA_BrowseNextRequest*)UA_new(&UA_TYPES[UA_TYPES_BROWSENEXTREQUEST]); } static UA_INLINE UA_StatusCode -UA_TimeZoneDataType_copy(const UA_TimeZoneDataType *src, UA_TimeZoneDataType *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_BrowseNextRequest_copy(const UA_BrowseNextRequest *src, UA_BrowseNextRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST]); } static UA_INLINE void -UA_TimeZoneDataType_deleteMembers(UA_TimeZoneDataType *p) { } +UA_BrowseNextRequest_deleteMembers(UA_BrowseNextRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST]); +} static UA_INLINE void -UA_TimeZoneDataType_delete(UA_TimeZoneDataType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_TIMEZONEDATATYPE]); +UA_BrowseNextRequest_clear(UA_BrowseNextRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST]); } -/* ActivateSessionRequest */ static UA_INLINE void -UA_ActivateSessionRequest_init(UA_ActivateSessionRequest *p) { - memset(p, 0, sizeof(UA_ActivateSessionRequest)); +UA_BrowseNextRequest_delete(UA_BrowseNextRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST]); } -static UA_INLINE UA_ActivateSessionRequest * -UA_ActivateSessionRequest_new(void) { - return (UA_ActivateSessionRequest*)UA_new(&UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]); +/* BrowseNextResponse */ +static UA_INLINE void +UA_BrowseNextResponse_init(UA_BrowseNextResponse *p) { + memset(p, 0, sizeof(UA_BrowseNextResponse)); +} + +static UA_INLINE UA_BrowseNextResponse * +UA_BrowseNextResponse_new(void) { + return (UA_BrowseNextResponse*)UA_new(&UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]); } static UA_INLINE UA_StatusCode -UA_ActivateSessionRequest_copy(const UA_ActivateSessionRequest *src, UA_ActivateSessionRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]); +UA_BrowseNextResponse_copy(const UA_BrowseNextResponse *src, UA_BrowseNextResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]); } static UA_INLINE void -UA_ActivateSessionRequest_deleteMembers(UA_ActivateSessionRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]); +UA_BrowseNextResponse_deleteMembers(UA_BrowseNextResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]); } static UA_INLINE void -UA_ActivateSessionRequest_delete(UA_ActivateSessionRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]); +UA_BrowseNextResponse_clear(UA_BrowseNextResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]); } -/* OpenSecureChannelResponse */ static UA_INLINE void -UA_OpenSecureChannelResponse_init(UA_OpenSecureChannelResponse *p) { - memset(p, 0, sizeof(UA_OpenSecureChannelResponse)); +UA_BrowseNextResponse_delete(UA_BrowseNextResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]); } -static UA_INLINE UA_OpenSecureChannelResponse * -UA_OpenSecureChannelResponse_new(void) { - return (UA_OpenSecureChannelResponse*)UA_new(&UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]); +/* RelativePathElement */ +static UA_INLINE void +UA_RelativePathElement_init(UA_RelativePathElement *p) { + memset(p, 0, sizeof(UA_RelativePathElement)); +} + +static UA_INLINE UA_RelativePathElement * +UA_RelativePathElement_new(void) { + return (UA_RelativePathElement*)UA_new(&UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]); } static UA_INLINE UA_StatusCode -UA_OpenSecureChannelResponse_copy(const UA_OpenSecureChannelResponse *src, UA_OpenSecureChannelResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]); +UA_RelativePathElement_copy(const UA_RelativePathElement *src, UA_RelativePathElement *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]); } static UA_INLINE void -UA_OpenSecureChannelResponse_deleteMembers(UA_OpenSecureChannelResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]); +UA_RelativePathElement_deleteMembers(UA_RelativePathElement *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]); } static UA_INLINE void -UA_OpenSecureChannelResponse_delete(UA_OpenSecureChannelResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]); +UA_RelativePathElement_clear(UA_RelativePathElement *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]); } -/* ApplicationType */ static UA_INLINE void -UA_ApplicationType_init(UA_ApplicationType *p) { - memset(p, 0, sizeof(UA_ApplicationType)); +UA_RelativePathElement_delete(UA_RelativePathElement *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]); } -static UA_INLINE UA_ApplicationType * -UA_ApplicationType_new(void) { - return (UA_ApplicationType*)UA_new(&UA_TYPES[UA_TYPES_APPLICATIONTYPE]); +/* RelativePath */ +static UA_INLINE void +UA_RelativePath_init(UA_RelativePath *p) { + memset(p, 0, sizeof(UA_RelativePath)); +} + +static UA_INLINE UA_RelativePath * +UA_RelativePath_new(void) { + return (UA_RelativePath*)UA_new(&UA_TYPES[UA_TYPES_RELATIVEPATH]); } static UA_INLINE UA_StatusCode -UA_ApplicationType_copy(const UA_ApplicationType *src, UA_ApplicationType *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_RelativePath_copy(const UA_RelativePath *src, UA_RelativePath *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_RELATIVEPATH]); } static UA_INLINE void -UA_ApplicationType_deleteMembers(UA_ApplicationType *p) { } +UA_RelativePath_deleteMembers(UA_RelativePath *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_RELATIVEPATH]); +} static UA_INLINE void -UA_ApplicationType_delete(UA_ApplicationType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_APPLICATIONTYPE]); +UA_RelativePath_clear(UA_RelativePath *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_RELATIVEPATH]); } -/* ServerState */ static UA_INLINE void -UA_ServerState_init(UA_ServerState *p) { - memset(p, 0, sizeof(UA_ServerState)); +UA_RelativePath_delete(UA_RelativePath *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_RELATIVEPATH]); } -static UA_INLINE UA_ServerState * -UA_ServerState_new(void) { - return (UA_ServerState*)UA_new(&UA_TYPES[UA_TYPES_SERVERSTATE]); +/* BrowsePath */ +static UA_INLINE void +UA_BrowsePath_init(UA_BrowsePath *p) { + memset(p, 0, sizeof(UA_BrowsePath)); +} + +static UA_INLINE UA_BrowsePath * +UA_BrowsePath_new(void) { + return (UA_BrowsePath*)UA_new(&UA_TYPES[UA_TYPES_BROWSEPATH]); } static UA_INLINE UA_StatusCode -UA_ServerState_copy(const UA_ServerState *src, UA_ServerState *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_BrowsePath_copy(const UA_BrowsePath *src, UA_BrowsePath *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSEPATH]); } static UA_INLINE void -UA_ServerState_deleteMembers(UA_ServerState *p) { } +UA_BrowsePath_deleteMembers(UA_BrowsePath *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSEPATH]); +} static UA_INLINE void -UA_ServerState_delete(UA_ServerState *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SERVERSTATE]); +UA_BrowsePath_clear(UA_BrowsePath *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSEPATH]); +} + +static UA_INLINE void +UA_BrowsePath_delete(UA_BrowsePath *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROWSEPATH]); } -/* QueryNextResponse */ +/* BrowsePathTarget */ static UA_INLINE void -UA_QueryNextResponse_init(UA_QueryNextResponse *p) { - memset(p, 0, sizeof(UA_QueryNextResponse)); +UA_BrowsePathTarget_init(UA_BrowsePathTarget *p) { + memset(p, 0, sizeof(UA_BrowsePathTarget)); } -static UA_INLINE UA_QueryNextResponse * -UA_QueryNextResponse_new(void) { - return (UA_QueryNextResponse*)UA_new(&UA_TYPES[UA_TYPES_QUERYNEXTRESPONSE]); +static UA_INLINE UA_BrowsePathTarget * +UA_BrowsePathTarget_new(void) { + return (UA_BrowsePathTarget*)UA_new(&UA_TYPES[UA_TYPES_BROWSEPATHTARGET]); } static UA_INLINE UA_StatusCode -UA_QueryNextResponse_copy(const UA_QueryNextResponse *src, UA_QueryNextResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_QUERYNEXTRESPONSE]); +UA_BrowsePathTarget_copy(const UA_BrowsePathTarget *src, UA_BrowsePathTarget *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET]); } static UA_INLINE void -UA_QueryNextResponse_deleteMembers(UA_QueryNextResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_QUERYNEXTRESPONSE]); +UA_BrowsePathTarget_deleteMembers(UA_BrowsePathTarget *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET]); } static UA_INLINE void -UA_QueryNextResponse_delete(UA_QueryNextResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_QUERYNEXTRESPONSE]); +UA_BrowsePathTarget_clear(UA_BrowsePathTarget *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET]); } -/* DiscoveryConfiguration */ static UA_INLINE void -UA_DiscoveryConfiguration_init(UA_DiscoveryConfiguration *p) { - memset(p, 0, sizeof(UA_DiscoveryConfiguration)); +UA_BrowsePathTarget_delete(UA_BrowsePathTarget *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET]); } -static UA_INLINE UA_DiscoveryConfiguration * -UA_DiscoveryConfiguration_new(void) { - return (UA_DiscoveryConfiguration*)UA_new(&UA_TYPES[UA_TYPES_DISCOVERYCONFIGURATION]); +/* BrowsePathResult */ +static UA_INLINE void +UA_BrowsePathResult_init(UA_BrowsePathResult *p) { + memset(p, 0, sizeof(UA_BrowsePathResult)); +} + +static UA_INLINE UA_BrowsePathResult * +UA_BrowsePathResult_new(void) { + return (UA_BrowsePathResult*)UA_new(&UA_TYPES[UA_TYPES_BROWSEPATHRESULT]); } static UA_INLINE UA_StatusCode -UA_DiscoveryConfiguration_copy(const UA_DiscoveryConfiguration *src, UA_DiscoveryConfiguration *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_BrowsePathResult_copy(const UA_BrowsePathResult *src, UA_BrowsePathResult *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT]); } static UA_INLINE void -UA_DiscoveryConfiguration_deleteMembers(UA_DiscoveryConfiguration *p) { } +UA_BrowsePathResult_deleteMembers(UA_BrowsePathResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT]); +} static UA_INLINE void -UA_DiscoveryConfiguration_delete(UA_DiscoveryConfiguration *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DISCOVERYCONFIGURATION]); +UA_BrowsePathResult_clear(UA_BrowsePathResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT]); } -/* ActivateSessionResponse */ static UA_INLINE void -UA_ActivateSessionResponse_init(UA_ActivateSessionResponse *p) { - memset(p, 0, sizeof(UA_ActivateSessionResponse)); +UA_BrowsePathResult_delete(UA_BrowsePathResult *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT]); } -static UA_INLINE UA_ActivateSessionResponse * -UA_ActivateSessionResponse_new(void) { - return (UA_ActivateSessionResponse*)UA_new(&UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]); +/* TranslateBrowsePathsToNodeIdsRequest */ +static UA_INLINE void +UA_TranslateBrowsePathsToNodeIdsRequest_init(UA_TranslateBrowsePathsToNodeIdsRequest *p) { + memset(p, 0, sizeof(UA_TranslateBrowsePathsToNodeIdsRequest)); +} + +static UA_INLINE UA_TranslateBrowsePathsToNodeIdsRequest * +UA_TranslateBrowsePathsToNodeIdsRequest_new(void) { + return (UA_TranslateBrowsePathsToNodeIdsRequest*)UA_new(&UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST]); } static UA_INLINE UA_StatusCode -UA_ActivateSessionResponse_copy(const UA_ActivateSessionResponse *src, UA_ActivateSessionResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]); +UA_TranslateBrowsePathsToNodeIdsRequest_copy(const UA_TranslateBrowsePathsToNodeIdsRequest *src, UA_TranslateBrowsePathsToNodeIdsRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST]); } static UA_INLINE void -UA_ActivateSessionResponse_deleteMembers(UA_ActivateSessionResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]); +UA_TranslateBrowsePathsToNodeIdsRequest_deleteMembers(UA_TranslateBrowsePathsToNodeIdsRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST]); } static UA_INLINE void -UA_ActivateSessionResponse_delete(UA_ActivateSessionResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]); +UA_TranslateBrowsePathsToNodeIdsRequest_clear(UA_TranslateBrowsePathsToNodeIdsRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST]); +} + +static UA_INLINE void +UA_TranslateBrowsePathsToNodeIdsRequest_delete(UA_TranslateBrowsePathsToNodeIdsRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST]); } -/* EndpointUrlListDataType */ +/* TranslateBrowsePathsToNodeIdsResponse */ static UA_INLINE void -UA_EndpointUrlListDataType_init(UA_EndpointUrlListDataType *p) { - memset(p, 0, sizeof(UA_EndpointUrlListDataType)); +UA_TranslateBrowsePathsToNodeIdsResponse_init(UA_TranslateBrowsePathsToNodeIdsResponse *p) { + memset(p, 0, sizeof(UA_TranslateBrowsePathsToNodeIdsResponse)); } -static UA_INLINE UA_EndpointUrlListDataType * -UA_EndpointUrlListDataType_new(void) { - return (UA_EndpointUrlListDataType*)UA_new(&UA_TYPES[UA_TYPES_ENDPOINTURLLISTDATATYPE]); +static UA_INLINE UA_TranslateBrowsePathsToNodeIdsResponse * +UA_TranslateBrowsePathsToNodeIdsResponse_new(void) { + return (UA_TranslateBrowsePathsToNodeIdsResponse*)UA_new(&UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]); } static UA_INLINE UA_StatusCode -UA_EndpointUrlListDataType_copy(const UA_EndpointUrlListDataType *src, UA_EndpointUrlListDataType *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ENDPOINTURLLISTDATATYPE]); +UA_TranslateBrowsePathsToNodeIdsResponse_copy(const UA_TranslateBrowsePathsToNodeIdsResponse *src, UA_TranslateBrowsePathsToNodeIdsResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]); } static UA_INLINE void -UA_EndpointUrlListDataType_deleteMembers(UA_EndpointUrlListDataType *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ENDPOINTURLLISTDATATYPE]); +UA_TranslateBrowsePathsToNodeIdsResponse_deleteMembers(UA_TranslateBrowsePathsToNodeIdsResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]); } static UA_INLINE void -UA_EndpointUrlListDataType_delete(UA_EndpointUrlListDataType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ENDPOINTURLLISTDATATYPE]); +UA_TranslateBrowsePathsToNodeIdsResponse_clear(UA_TranslateBrowsePathsToNodeIdsResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]); } -/* FilterOperator */ static UA_INLINE void -UA_FilterOperator_init(UA_FilterOperator *p) { - memset(p, 0, sizeof(UA_FilterOperator)); +UA_TranslateBrowsePathsToNodeIdsResponse_delete(UA_TranslateBrowsePathsToNodeIdsResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]); } -static UA_INLINE UA_FilterOperator * -UA_FilterOperator_new(void) { - return (UA_FilterOperator*)UA_new(&UA_TYPES[UA_TYPES_FILTEROPERATOR]); +/* RegisterNodesRequest */ +static UA_INLINE void +UA_RegisterNodesRequest_init(UA_RegisterNodesRequest *p) { + memset(p, 0, sizeof(UA_RegisterNodesRequest)); +} + +static UA_INLINE UA_RegisterNodesRequest * +UA_RegisterNodesRequest_new(void) { + return (UA_RegisterNodesRequest*)UA_new(&UA_TYPES[UA_TYPES_REGISTERNODESREQUEST]); } static UA_INLINE UA_StatusCode -UA_FilterOperator_copy(const UA_FilterOperator *src, UA_FilterOperator *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_RegisterNodesRequest_copy(const UA_RegisterNodesRequest *src, UA_RegisterNodesRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST]); +} + +static UA_INLINE void +UA_RegisterNodesRequest_deleteMembers(UA_RegisterNodesRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST]); } static UA_INLINE void -UA_FilterOperator_deleteMembers(UA_FilterOperator *p) { } +UA_RegisterNodesRequest_clear(UA_RegisterNodesRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST]); +} static UA_INLINE void -UA_FilterOperator_delete(UA_FilterOperator *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_FILTEROPERATOR]); +UA_RegisterNodesRequest_delete(UA_RegisterNodesRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST]); } -/* QueryNextRequest */ +/* RegisterNodesResponse */ static UA_INLINE void -UA_QueryNextRequest_init(UA_QueryNextRequest *p) { - memset(p, 0, sizeof(UA_QueryNextRequest)); +UA_RegisterNodesResponse_init(UA_RegisterNodesResponse *p) { + memset(p, 0, sizeof(UA_RegisterNodesResponse)); } -static UA_INLINE UA_QueryNextRequest * -UA_QueryNextRequest_new(void) { - return (UA_QueryNextRequest*)UA_new(&UA_TYPES[UA_TYPES_QUERYNEXTREQUEST]); +static UA_INLINE UA_RegisterNodesResponse * +UA_RegisterNodesResponse_new(void) { + return (UA_RegisterNodesResponse*)UA_new(&UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]); } static UA_INLINE UA_StatusCode -UA_QueryNextRequest_copy(const UA_QueryNextRequest *src, UA_QueryNextRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_QUERYNEXTREQUEST]); +UA_RegisterNodesResponse_copy(const UA_RegisterNodesResponse *src, UA_RegisterNodesResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]); +} + +static UA_INLINE void +UA_RegisterNodesResponse_deleteMembers(UA_RegisterNodesResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]); } static UA_INLINE void -UA_QueryNextRequest_deleteMembers(UA_QueryNextRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_QUERYNEXTREQUEST]); +UA_RegisterNodesResponse_clear(UA_RegisterNodesResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]); } static UA_INLINE void -UA_QueryNextRequest_delete(UA_QueryNextRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_QUERYNEXTREQUEST]); +UA_RegisterNodesResponse_delete(UA_RegisterNodesResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]); } -/* WriteResponse */ +/* UnregisterNodesRequest */ static UA_INLINE void -UA_WriteResponse_init(UA_WriteResponse *p) { - memset(p, 0, sizeof(UA_WriteResponse)); +UA_UnregisterNodesRequest_init(UA_UnregisterNodesRequest *p) { + memset(p, 0, sizeof(UA_UnregisterNodesRequest)); } -static UA_INLINE UA_WriteResponse * -UA_WriteResponse_new(void) { - return (UA_WriteResponse*)UA_new(&UA_TYPES[UA_TYPES_WRITERESPONSE]); +static UA_INLINE UA_UnregisterNodesRequest * +UA_UnregisterNodesRequest_new(void) { + return (UA_UnregisterNodesRequest*)UA_new(&UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST]); } static UA_INLINE UA_StatusCode -UA_WriteResponse_copy(const UA_WriteResponse *src, UA_WriteResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_WRITERESPONSE]); +UA_UnregisterNodesRequest_copy(const UA_UnregisterNodesRequest *src, UA_UnregisterNodesRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST]); } static UA_INLINE void -UA_WriteResponse_deleteMembers(UA_WriteResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_WRITERESPONSE]); +UA_UnregisterNodesRequest_deleteMembers(UA_UnregisterNodesRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST]); } static UA_INLINE void -UA_WriteResponse_delete(UA_WriteResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_WRITERESPONSE]); +UA_UnregisterNodesRequest_clear(UA_UnregisterNodesRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST]); } -/* BrowseNextRequest */ static UA_INLINE void -UA_BrowseNextRequest_init(UA_BrowseNextRequest *p) { - memset(p, 0, sizeof(UA_BrowseNextRequest)); +UA_UnregisterNodesRequest_delete(UA_UnregisterNodesRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST]); } -static UA_INLINE UA_BrowseNextRequest * -UA_BrowseNextRequest_new(void) { - return (UA_BrowseNextRequest*)UA_new(&UA_TYPES[UA_TYPES_BROWSENEXTREQUEST]); +/* UnregisterNodesResponse */ +static UA_INLINE void +UA_UnregisterNodesResponse_init(UA_UnregisterNodesResponse *p) { + memset(p, 0, sizeof(UA_UnregisterNodesResponse)); +} + +static UA_INLINE UA_UnregisterNodesResponse * +UA_UnregisterNodesResponse_new(void) { + return (UA_UnregisterNodesResponse*)UA_new(&UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]); } static UA_INLINE UA_StatusCode -UA_BrowseNextRequest_copy(const UA_BrowseNextRequest *src, UA_BrowseNextRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST]); +UA_UnregisterNodesResponse_copy(const UA_UnregisterNodesResponse *src, UA_UnregisterNodesResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]); } static UA_INLINE void -UA_BrowseNextRequest_deleteMembers(UA_BrowseNextRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST]); +UA_UnregisterNodesResponse_deleteMembers(UA_UnregisterNodesResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]); } static UA_INLINE void -UA_BrowseNextRequest_delete(UA_BrowseNextRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST]); +UA_UnregisterNodesResponse_clear(UA_UnregisterNodesResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]); } -/* CreateSubscriptionRequest */ static UA_INLINE void -UA_CreateSubscriptionRequest_init(UA_CreateSubscriptionRequest *p) { - memset(p, 0, sizeof(UA_CreateSubscriptionRequest)); +UA_UnregisterNodesResponse_delete(UA_UnregisterNodesResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]); } -static UA_INLINE UA_CreateSubscriptionRequest * -UA_CreateSubscriptionRequest_new(void) { - return (UA_CreateSubscriptionRequest*)UA_new(&UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST]); +/* FilterOperator */ +static UA_INLINE void +UA_FilterOperator_init(UA_FilterOperator *p) { + memset(p, 0, sizeof(UA_FilterOperator)); +} + +static UA_INLINE UA_FilterOperator * +UA_FilterOperator_new(void) { + return (UA_FilterOperator*)UA_new(&UA_TYPES[UA_TYPES_FILTEROPERATOR]); } static UA_INLINE UA_StatusCode -UA_CreateSubscriptionRequest_copy(const UA_CreateSubscriptionRequest *src, UA_CreateSubscriptionRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST]); +UA_FilterOperator_copy(const UA_FilterOperator *src, UA_FilterOperator *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_CreateSubscriptionRequest_deleteMembers(UA_CreateSubscriptionRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST]); +UA_FilterOperator_deleteMembers(UA_FilterOperator *p) { + memset(p, 0, sizeof(UA_FilterOperator)); } static UA_INLINE void -UA_CreateSubscriptionRequest_delete(UA_CreateSubscriptionRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST]); +UA_FilterOperator_clear(UA_FilterOperator *p) { + memset(p, 0, sizeof(UA_FilterOperator)); } -/* VariableTypeAttributes */ static UA_INLINE void -UA_VariableTypeAttributes_init(UA_VariableTypeAttributes *p) { - memset(p, 0, sizeof(UA_VariableTypeAttributes)); +UA_FilterOperator_delete(UA_FilterOperator *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_FILTEROPERATOR]); } -static UA_INLINE UA_VariableTypeAttributes * -UA_VariableTypeAttributes_new(void) { - return (UA_VariableTypeAttributes*)UA_new(&UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); +/* ContentFilterElement */ +static UA_INLINE void +UA_ContentFilterElement_init(UA_ContentFilterElement *p) { + memset(p, 0, sizeof(UA_ContentFilterElement)); +} + +static UA_INLINE UA_ContentFilterElement * +UA_ContentFilterElement_new(void) { + return (UA_ContentFilterElement*)UA_new(&UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT]); } static UA_INLINE UA_StatusCode -UA_VariableTypeAttributes_copy(const UA_VariableTypeAttributes *src, UA_VariableTypeAttributes *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); +UA_ContentFilterElement_copy(const UA_ContentFilterElement *src, UA_ContentFilterElement *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT]); } static UA_INLINE void -UA_VariableTypeAttributes_deleteMembers(UA_VariableTypeAttributes *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); +UA_ContentFilterElement_deleteMembers(UA_ContentFilterElement *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT]); } static UA_INLINE void -UA_VariableTypeAttributes_delete(UA_VariableTypeAttributes *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); +UA_ContentFilterElement_clear(UA_ContentFilterElement *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT]); } -/* BrowsePathResult */ static UA_INLINE void -UA_BrowsePathResult_init(UA_BrowsePathResult *p) { - memset(p, 0, sizeof(UA_BrowsePathResult)); +UA_ContentFilterElement_delete(UA_ContentFilterElement *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT]); } -static UA_INLINE UA_BrowsePathResult * -UA_BrowsePathResult_new(void) { - return (UA_BrowsePathResult*)UA_new(&UA_TYPES[UA_TYPES_BROWSEPATHRESULT]); +/* ContentFilter */ +static UA_INLINE void +UA_ContentFilter_init(UA_ContentFilter *p) { + memset(p, 0, sizeof(UA_ContentFilter)); +} + +static UA_INLINE UA_ContentFilter * +UA_ContentFilter_new(void) { + return (UA_ContentFilter*)UA_new(&UA_TYPES[UA_TYPES_CONTENTFILTER]); } static UA_INLINE UA_StatusCode -UA_BrowsePathResult_copy(const UA_BrowsePathResult *src, UA_BrowsePathResult *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT]); +UA_ContentFilter_copy(const UA_ContentFilter *src, UA_ContentFilter *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CONTENTFILTER]); } static UA_INLINE void -UA_BrowsePathResult_deleteMembers(UA_BrowsePathResult *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT]); +UA_ContentFilter_deleteMembers(UA_ContentFilter *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CONTENTFILTER]); +} + +static UA_INLINE void +UA_ContentFilter_clear(UA_ContentFilter *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CONTENTFILTER]); } static UA_INLINE void -UA_BrowsePathResult_delete(UA_BrowsePathResult *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT]); +UA_ContentFilter_delete(UA_ContentFilter *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CONTENTFILTER]); } -/* ModifySubscriptionResponse */ +/* FilterOperand */ static UA_INLINE void -UA_ModifySubscriptionResponse_init(UA_ModifySubscriptionResponse *p) { - memset(p, 0, sizeof(UA_ModifySubscriptionResponse)); +UA_FilterOperand_init(UA_FilterOperand *p) { + memset(p, 0, sizeof(UA_FilterOperand)); } -static UA_INLINE UA_ModifySubscriptionResponse * -UA_ModifySubscriptionResponse_new(void) { - return (UA_ModifySubscriptionResponse*)UA_new(&UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]); +static UA_INLINE UA_FilterOperand * +UA_FilterOperand_new(void) { + return (UA_FilterOperand*)UA_new(&UA_TYPES[UA_TYPES_FILTEROPERAND]); } static UA_INLINE UA_StatusCode -UA_ModifySubscriptionResponse_copy(const UA_ModifySubscriptionResponse *src, UA_ModifySubscriptionResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]); +UA_FilterOperand_copy(const UA_FilterOperand *src, UA_FilterOperand *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_ModifySubscriptionResponse_deleteMembers(UA_ModifySubscriptionResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]); +UA_FilterOperand_deleteMembers(UA_FilterOperand *p) { + memset(p, 0, sizeof(UA_FilterOperand)); } static UA_INLINE void -UA_ModifySubscriptionResponse_delete(UA_ModifySubscriptionResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]); +UA_FilterOperand_clear(UA_FilterOperand *p) { + memset(p, 0, sizeof(UA_FilterOperand)); +} + +static UA_INLINE void +UA_FilterOperand_delete(UA_FilterOperand *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_FILTEROPERAND]); } -/* RedundantServerDataType */ +/* ElementOperand */ static UA_INLINE void -UA_RedundantServerDataType_init(UA_RedundantServerDataType *p) { - memset(p, 0, sizeof(UA_RedundantServerDataType)); +UA_ElementOperand_init(UA_ElementOperand *p) { + memset(p, 0, sizeof(UA_ElementOperand)); } -static UA_INLINE UA_RedundantServerDataType * -UA_RedundantServerDataType_new(void) { - return (UA_RedundantServerDataType*)UA_new(&UA_TYPES[UA_TYPES_REDUNDANTSERVERDATATYPE]); +static UA_INLINE UA_ElementOperand * +UA_ElementOperand_new(void) { + return (UA_ElementOperand*)UA_new(&UA_TYPES[UA_TYPES_ELEMENTOPERAND]); } static UA_INLINE UA_StatusCode -UA_RedundantServerDataType_copy(const UA_RedundantServerDataType *src, UA_RedundantServerDataType *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REDUNDANTSERVERDATATYPE]); +UA_ElementOperand_copy(const UA_ElementOperand *src, UA_ElementOperand *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_RedundantServerDataType_deleteMembers(UA_RedundantServerDataType *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REDUNDANTSERVERDATATYPE]); +UA_ElementOperand_deleteMembers(UA_ElementOperand *p) { + memset(p, 0, sizeof(UA_ElementOperand)); } static UA_INLINE void -UA_RedundantServerDataType_delete(UA_RedundantServerDataType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REDUNDANTSERVERDATATYPE]); +UA_ElementOperand_clear(UA_ElementOperand *p) { + memset(p, 0, sizeof(UA_ElementOperand)); } -/* RegisterNodesResponse */ static UA_INLINE void -UA_RegisterNodesResponse_init(UA_RegisterNodesResponse *p) { - memset(p, 0, sizeof(UA_RegisterNodesResponse)); +UA_ElementOperand_delete(UA_ElementOperand *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ELEMENTOPERAND]); } -static UA_INLINE UA_RegisterNodesResponse * -UA_RegisterNodesResponse_new(void) { - return (UA_RegisterNodesResponse*)UA_new(&UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]); +/* LiteralOperand */ +static UA_INLINE void +UA_LiteralOperand_init(UA_LiteralOperand *p) { + memset(p, 0, sizeof(UA_LiteralOperand)); +} + +static UA_INLINE UA_LiteralOperand * +UA_LiteralOperand_new(void) { + return (UA_LiteralOperand*)UA_new(&UA_TYPES[UA_TYPES_LITERALOPERAND]); } static UA_INLINE UA_StatusCode -UA_RegisterNodesResponse_copy(const UA_RegisterNodesResponse *src, UA_RegisterNodesResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]); +UA_LiteralOperand_copy(const UA_LiteralOperand *src, UA_LiteralOperand *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_LITERALOPERAND]); } static UA_INLINE void -UA_RegisterNodesResponse_deleteMembers(UA_RegisterNodesResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]); +UA_LiteralOperand_deleteMembers(UA_LiteralOperand *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_LITERALOPERAND]); } static UA_INLINE void -UA_RegisterNodesResponse_delete(UA_RegisterNodesResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]); +UA_LiteralOperand_clear(UA_LiteralOperand *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_LITERALOPERAND]); } -/* CloseSessionRequest */ static UA_INLINE void -UA_CloseSessionRequest_init(UA_CloseSessionRequest *p) { - memset(p, 0, sizeof(UA_CloseSessionRequest)); +UA_LiteralOperand_delete(UA_LiteralOperand *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_LITERALOPERAND]); } -static UA_INLINE UA_CloseSessionRequest * -UA_CloseSessionRequest_new(void) { - return (UA_CloseSessionRequest*)UA_new(&UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]); +/* AttributeOperand */ +static UA_INLINE void +UA_AttributeOperand_init(UA_AttributeOperand *p) { + memset(p, 0, sizeof(UA_AttributeOperand)); +} + +static UA_INLINE UA_AttributeOperand * +UA_AttributeOperand_new(void) { + return (UA_AttributeOperand*)UA_new(&UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND]); } static UA_INLINE UA_StatusCode -UA_CloseSessionRequest_copy(const UA_CloseSessionRequest *src, UA_CloseSessionRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]); +UA_AttributeOperand_copy(const UA_AttributeOperand *src, UA_AttributeOperand *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND]); } static UA_INLINE void -UA_CloseSessionRequest_deleteMembers(UA_CloseSessionRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]); +UA_AttributeOperand_deleteMembers(UA_AttributeOperand *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND]); } static UA_INLINE void -UA_CloseSessionRequest_delete(UA_CloseSessionRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]); +UA_AttributeOperand_clear(UA_AttributeOperand *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND]); } -/* ModifyMonitoredItemsResponse */ static UA_INLINE void -UA_ModifyMonitoredItemsResponse_init(UA_ModifyMonitoredItemsResponse *p) { - memset(p, 0, sizeof(UA_ModifyMonitoredItemsResponse)); +UA_AttributeOperand_delete(UA_AttributeOperand *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND]); } -static UA_INLINE UA_ModifyMonitoredItemsResponse * -UA_ModifyMonitoredItemsResponse_new(void) { - return (UA_ModifyMonitoredItemsResponse*)UA_new(&UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]); +/* SimpleAttributeOperand */ +static UA_INLINE void +UA_SimpleAttributeOperand_init(UA_SimpleAttributeOperand *p) { + memset(p, 0, sizeof(UA_SimpleAttributeOperand)); +} + +static UA_INLINE UA_SimpleAttributeOperand * +UA_SimpleAttributeOperand_new(void) { + return (UA_SimpleAttributeOperand*)UA_new(&UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]); } static UA_INLINE UA_StatusCode -UA_ModifyMonitoredItemsResponse_copy(const UA_ModifyMonitoredItemsResponse *src, UA_ModifyMonitoredItemsResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]); +UA_SimpleAttributeOperand_copy(const UA_SimpleAttributeOperand *src, UA_SimpleAttributeOperand *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]); } static UA_INLINE void -UA_ModifyMonitoredItemsResponse_deleteMembers(UA_ModifyMonitoredItemsResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]); +UA_SimpleAttributeOperand_deleteMembers(UA_SimpleAttributeOperand *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]); } static UA_INLINE void -UA_ModifyMonitoredItemsResponse_delete(UA_ModifyMonitoredItemsResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]); +UA_SimpleAttributeOperand_clear(UA_SimpleAttributeOperand *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]); } -/* ModifySubscriptionRequest */ static UA_INLINE void -UA_ModifySubscriptionRequest_init(UA_ModifySubscriptionRequest *p) { - memset(p, 0, sizeof(UA_ModifySubscriptionRequest)); +UA_SimpleAttributeOperand_delete(UA_SimpleAttributeOperand *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]); } -static UA_INLINE UA_ModifySubscriptionRequest * -UA_ModifySubscriptionRequest_new(void) { - return (UA_ModifySubscriptionRequest*)UA_new(&UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST]); +/* ContentFilterElementResult */ +static UA_INLINE void +UA_ContentFilterElementResult_init(UA_ContentFilterElementResult *p) { + memset(p, 0, sizeof(UA_ContentFilterElementResult)); +} + +static UA_INLINE UA_ContentFilterElementResult * +UA_ContentFilterElementResult_new(void) { + return (UA_ContentFilterElementResult*)UA_new(&UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT]); } static UA_INLINE UA_StatusCode -UA_ModifySubscriptionRequest_copy(const UA_ModifySubscriptionRequest *src, UA_ModifySubscriptionRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST]); +UA_ContentFilterElementResult_copy(const UA_ContentFilterElementResult *src, UA_ContentFilterElementResult *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT]); } static UA_INLINE void -UA_ModifySubscriptionRequest_deleteMembers(UA_ModifySubscriptionRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST]); +UA_ContentFilterElementResult_deleteMembers(UA_ContentFilterElementResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT]); } static UA_INLINE void -UA_ModifySubscriptionRequest_delete(UA_ModifySubscriptionRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST]); +UA_ContentFilterElementResult_clear(UA_ContentFilterElementResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT]); } -/* ServerDiagnosticsSummaryDataType */ static UA_INLINE void -UA_ServerDiagnosticsSummaryDataType_init(UA_ServerDiagnosticsSummaryDataType *p) { - memset(p, 0, sizeof(UA_ServerDiagnosticsSummaryDataType)); +UA_ContentFilterElementResult_delete(UA_ContentFilterElementResult *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT]); } -static UA_INLINE UA_ServerDiagnosticsSummaryDataType * -UA_ServerDiagnosticsSummaryDataType_new(void) { - return (UA_ServerDiagnosticsSummaryDataType*)UA_new(&UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE]); +/* ContentFilterResult */ +static UA_INLINE void +UA_ContentFilterResult_init(UA_ContentFilterResult *p) { + memset(p, 0, sizeof(UA_ContentFilterResult)); +} + +static UA_INLINE UA_ContentFilterResult * +UA_ContentFilterResult_new(void) { + return (UA_ContentFilterResult*)UA_new(&UA_TYPES[UA_TYPES_CONTENTFILTERRESULT]); } static UA_INLINE UA_StatusCode -UA_ServerDiagnosticsSummaryDataType_copy(const UA_ServerDiagnosticsSummaryDataType *src, UA_ServerDiagnosticsSummaryDataType *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_ContentFilterResult_copy(const UA_ContentFilterResult *src, UA_ContentFilterResult *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT]); } static UA_INLINE void -UA_ServerDiagnosticsSummaryDataType_deleteMembers(UA_ServerDiagnosticsSummaryDataType *p) { } +UA_ContentFilterResult_deleteMembers(UA_ContentFilterResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT]); +} static UA_INLINE void -UA_ServerDiagnosticsSummaryDataType_delete(UA_ServerDiagnosticsSummaryDataType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE]); +UA_ContentFilterResult_clear(UA_ContentFilterResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT]); } -/* UserTokenPolicy */ static UA_INLINE void -UA_UserTokenPolicy_init(UA_UserTokenPolicy *p) { - memset(p, 0, sizeof(UA_UserTokenPolicy)); +UA_ContentFilterResult_delete(UA_ContentFilterResult *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT]); } -static UA_INLINE UA_UserTokenPolicy * -UA_UserTokenPolicy_new(void) { - return (UA_UserTokenPolicy*)UA_new(&UA_TYPES[UA_TYPES_USERTOKENPOLICY]); +/* TimestampsToReturn */ +static UA_INLINE void +UA_TimestampsToReturn_init(UA_TimestampsToReturn *p) { + memset(p, 0, sizeof(UA_TimestampsToReturn)); +} + +static UA_INLINE UA_TimestampsToReturn * +UA_TimestampsToReturn_new(void) { + return (UA_TimestampsToReturn*)UA_new(&UA_TYPES[UA_TYPES_TIMESTAMPSTORETURN]); } static UA_INLINE UA_StatusCode -UA_UserTokenPolicy_copy(const UA_UserTokenPolicy *src, UA_UserTokenPolicy *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); +UA_TimestampsToReturn_copy(const UA_TimestampsToReturn *src, UA_TimestampsToReturn *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_UserTokenPolicy_deleteMembers(UA_UserTokenPolicy *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); +UA_TimestampsToReturn_deleteMembers(UA_TimestampsToReturn *p) { + memset(p, 0, sizeof(UA_TimestampsToReturn)); } static UA_INLINE void -UA_UserTokenPolicy_delete(UA_UserTokenPolicy *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); +UA_TimestampsToReturn_clear(UA_TimestampsToReturn *p) { + memset(p, 0, sizeof(UA_TimestampsToReturn)); } -/* ReferenceTypeAttributes */ static UA_INLINE void -UA_ReferenceTypeAttributes_init(UA_ReferenceTypeAttributes *p) { - memset(p, 0, sizeof(UA_ReferenceTypeAttributes)); +UA_TimestampsToReturn_delete(UA_TimestampsToReturn *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_TIMESTAMPSTORETURN]); } -static UA_INLINE UA_ReferenceTypeAttributes * -UA_ReferenceTypeAttributes_new(void) { - return (UA_ReferenceTypeAttributes*)UA_new(&UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); +/* ReadValueId */ +static UA_INLINE void +UA_ReadValueId_init(UA_ReadValueId *p) { + memset(p, 0, sizeof(UA_ReadValueId)); +} + +static UA_INLINE UA_ReadValueId * +UA_ReadValueId_new(void) { + return (UA_ReadValueId*)UA_new(&UA_TYPES[UA_TYPES_READVALUEID]); } static UA_INLINE UA_StatusCode -UA_ReferenceTypeAttributes_copy(const UA_ReferenceTypeAttributes *src, UA_ReferenceTypeAttributes *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); +UA_ReadValueId_copy(const UA_ReadValueId *src, UA_ReadValueId *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_READVALUEID]); } static UA_INLINE void -UA_ReferenceTypeAttributes_deleteMembers(UA_ReferenceTypeAttributes *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); +UA_ReadValueId_deleteMembers(UA_ReadValueId *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_READVALUEID]); } static UA_INLINE void -UA_ReferenceTypeAttributes_delete(UA_ReferenceTypeAttributes *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); +UA_ReadValueId_clear(UA_ReadValueId *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_READVALUEID]); } -/* BrowsePath */ static UA_INLINE void -UA_BrowsePath_init(UA_BrowsePath *p) { - memset(p, 0, sizeof(UA_BrowsePath)); +UA_ReadValueId_delete(UA_ReadValueId *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_READVALUEID]); } -static UA_INLINE UA_BrowsePath * -UA_BrowsePath_new(void) { - return (UA_BrowsePath*)UA_new(&UA_TYPES[UA_TYPES_BROWSEPATH]); +/* ReadRequest */ +static UA_INLINE void +UA_ReadRequest_init(UA_ReadRequest *p) { + memset(p, 0, sizeof(UA_ReadRequest)); +} + +static UA_INLINE UA_ReadRequest * +UA_ReadRequest_new(void) { + return (UA_ReadRequest*)UA_new(&UA_TYPES[UA_TYPES_READREQUEST]); } static UA_INLINE UA_StatusCode -UA_BrowsePath_copy(const UA_BrowsePath *src, UA_BrowsePath *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSEPATH]); +UA_ReadRequest_copy(const UA_ReadRequest *src, UA_ReadRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_READREQUEST]); } static UA_INLINE void -UA_BrowsePath_deleteMembers(UA_BrowsePath *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_BROWSEPATH]); +UA_ReadRequest_deleteMembers(UA_ReadRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_READREQUEST]); } static UA_INLINE void -UA_BrowsePath_delete(UA_BrowsePath *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BROWSEPATH]); +UA_ReadRequest_clear(UA_ReadRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_READREQUEST]); } -/* SetMonitoringModeRequest */ static UA_INLINE void -UA_SetMonitoringModeRequest_init(UA_SetMonitoringModeRequest *p) { - memset(p, 0, sizeof(UA_SetMonitoringModeRequest)); +UA_ReadRequest_delete(UA_ReadRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_READREQUEST]); +} + +/* ReadResponse */ +static UA_INLINE void +UA_ReadResponse_init(UA_ReadResponse *p) { + memset(p, 0, sizeof(UA_ReadResponse)); } -static UA_INLINE UA_SetMonitoringModeRequest * -UA_SetMonitoringModeRequest_new(void) { - return (UA_SetMonitoringModeRequest*)UA_new(&UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST]); +static UA_INLINE UA_ReadResponse * +UA_ReadResponse_new(void) { + return (UA_ReadResponse*)UA_new(&UA_TYPES[UA_TYPES_READRESPONSE]); } static UA_INLINE UA_StatusCode -UA_SetMonitoringModeRequest_copy(const UA_SetMonitoringModeRequest *src, UA_SetMonitoringModeRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST]); +UA_ReadResponse_copy(const UA_ReadResponse *src, UA_ReadResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_READRESPONSE]); } static UA_INLINE void -UA_SetMonitoringModeRequest_deleteMembers(UA_SetMonitoringModeRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST]); +UA_ReadResponse_deleteMembers(UA_ReadResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_READRESPONSE]); } static UA_INLINE void -UA_SetMonitoringModeRequest_delete(UA_SetMonitoringModeRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST]); +UA_ReadResponse_clear(UA_ReadResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_READRESPONSE]); } -/* UnregisterNodesResponse */ static UA_INLINE void -UA_UnregisterNodesResponse_init(UA_UnregisterNodesResponse *p) { - memset(p, 0, sizeof(UA_UnregisterNodesResponse)); +UA_ReadResponse_delete(UA_ReadResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_READRESPONSE]); } -static UA_INLINE UA_UnregisterNodesResponse * -UA_UnregisterNodesResponse_new(void) { - return (UA_UnregisterNodesResponse*)UA_new(&UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]); +/* WriteValue */ +static UA_INLINE void +UA_WriteValue_init(UA_WriteValue *p) { + memset(p, 0, sizeof(UA_WriteValue)); +} + +static UA_INLINE UA_WriteValue * +UA_WriteValue_new(void) { + return (UA_WriteValue*)UA_new(&UA_TYPES[UA_TYPES_WRITEVALUE]); } static UA_INLINE UA_StatusCode -UA_UnregisterNodesResponse_copy(const UA_UnregisterNodesResponse *src, UA_UnregisterNodesResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]); +UA_WriteValue_copy(const UA_WriteValue *src, UA_WriteValue *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_WRITEVALUE]); } static UA_INLINE void -UA_UnregisterNodesResponse_deleteMembers(UA_UnregisterNodesResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]); +UA_WriteValue_deleteMembers(UA_WriteValue *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_WRITEVALUE]); } static UA_INLINE void -UA_UnregisterNodesResponse_delete(UA_UnregisterNodesResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]); +UA_WriteValue_clear(UA_WriteValue *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_WRITEVALUE]); +} + +static UA_INLINE void +UA_WriteValue_delete(UA_WriteValue *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_WRITEVALUE]); } /* WriteRequest */ @@ -9293,7 +21846,12 @@ UA_WriteRequest_copy(const UA_WriteRequest *src, UA_WriteRequest *dst) { static UA_INLINE void UA_WriteRequest_deleteMembers(UA_WriteRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_WRITEREQUEST]); + UA_clear(p, &UA_TYPES[UA_TYPES_WRITEREQUEST]); +} + +static UA_INLINE void +UA_WriteRequest_clear(UA_WriteRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_WRITEREQUEST]); } static UA_INLINE void @@ -9301,1788 +21859,2138 @@ UA_WriteRequest_delete(UA_WriteRequest *p) { UA_delete(p, &UA_TYPES[UA_TYPES_WRITEREQUEST]); } -/* ObjectAttributes */ +/* WriteResponse */ static UA_INLINE void -UA_ObjectAttributes_init(UA_ObjectAttributes *p) { - memset(p, 0, sizeof(UA_ObjectAttributes)); +UA_WriteResponse_init(UA_WriteResponse *p) { + memset(p, 0, sizeof(UA_WriteResponse)); } -static UA_INLINE UA_ObjectAttributes * -UA_ObjectAttributes_new(void) { - return (UA_ObjectAttributes*)UA_new(&UA_TYPES[UA_TYPES_OBJECTATTRIBUTES]); +static UA_INLINE UA_WriteResponse * +UA_WriteResponse_new(void) { + return (UA_WriteResponse*)UA_new(&UA_TYPES[UA_TYPES_WRITERESPONSE]); } static UA_INLINE UA_StatusCode -UA_ObjectAttributes_copy(const UA_ObjectAttributes *src, UA_ObjectAttributes *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES]); -} - -static UA_INLINE void -UA_ObjectAttributes_deleteMembers(UA_ObjectAttributes *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES]); +UA_WriteResponse_copy(const UA_WriteResponse *src, UA_WriteResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_WRITERESPONSE]); } static UA_INLINE void -UA_ObjectAttributes_delete(UA_ObjectAttributes *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES]); +UA_WriteResponse_deleteMembers(UA_WriteResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_WRITERESPONSE]); } -/* BrowseResultMask */ static UA_INLINE void -UA_BrowseResultMask_init(UA_BrowseResultMask *p) { - memset(p, 0, sizeof(UA_BrowseResultMask)); -} - -static UA_INLINE UA_BrowseResultMask * -UA_BrowseResultMask_new(void) { - return (UA_BrowseResultMask*)UA_new(&UA_TYPES[UA_TYPES_BROWSERESULTMASK]); -} - -static UA_INLINE UA_StatusCode -UA_BrowseResultMask_copy(const UA_BrowseResultMask *src, UA_BrowseResultMask *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_WriteResponse_clear(UA_WriteResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_WRITERESPONSE]); } static UA_INLINE void -UA_BrowseResultMask_deleteMembers(UA_BrowseResultMask *p) { } - -static UA_INLINE void -UA_BrowseResultMask_delete(UA_BrowseResultMask *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BROWSERESULTMASK]); +UA_WriteResponse_delete(UA_WriteResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_WRITERESPONSE]); } -/* BrowseDescription */ +/* CallMethodRequest */ static UA_INLINE void -UA_BrowseDescription_init(UA_BrowseDescription *p) { - memset(p, 0, sizeof(UA_BrowseDescription)); +UA_CallMethodRequest_init(UA_CallMethodRequest *p) { + memset(p, 0, sizeof(UA_CallMethodRequest)); } -static UA_INLINE UA_BrowseDescription * -UA_BrowseDescription_new(void) { - return (UA_BrowseDescription*)UA_new(&UA_TYPES[UA_TYPES_BROWSEDESCRIPTION]); +static UA_INLINE UA_CallMethodRequest * +UA_CallMethodRequest_new(void) { + return (UA_CallMethodRequest*)UA_new(&UA_TYPES[UA_TYPES_CALLMETHODREQUEST]); } static UA_INLINE UA_StatusCode -UA_BrowseDescription_copy(const UA_BrowseDescription *src, UA_BrowseDescription *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION]); -} - -static UA_INLINE void -UA_BrowseDescription_deleteMembers(UA_BrowseDescription *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION]); +UA_CallMethodRequest_copy(const UA_CallMethodRequest *src, UA_CallMethodRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST]); } static UA_INLINE void -UA_BrowseDescription_delete(UA_BrowseDescription *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION]); +UA_CallMethodRequest_deleteMembers(UA_CallMethodRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST]); } -/* SetTriggeringRequest */ static UA_INLINE void -UA_SetTriggeringRequest_init(UA_SetTriggeringRequest *p) { - memset(p, 0, sizeof(UA_SetTriggeringRequest)); -} - -static UA_INLINE UA_SetTriggeringRequest * -UA_SetTriggeringRequest_new(void) { - return (UA_SetTriggeringRequest*)UA_new(&UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST]); -} - -static UA_INLINE UA_StatusCode -UA_SetTriggeringRequest_copy(const UA_SetTriggeringRequest *src, UA_SetTriggeringRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST]); +UA_CallMethodRequest_clear(UA_CallMethodRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST]); } static UA_INLINE void -UA_SetTriggeringRequest_deleteMembers(UA_SetTriggeringRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST]); +UA_CallMethodRequest_delete(UA_CallMethodRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST]); } +/* CallMethodResult */ static UA_INLINE void -UA_SetTriggeringRequest_delete(UA_SetTriggeringRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST]); +UA_CallMethodResult_init(UA_CallMethodResult *p) { + memset(p, 0, sizeof(UA_CallMethodResult)); } -/* SessionSecurityDiagnosticsDataType */ -static UA_INLINE void -UA_SessionSecurityDiagnosticsDataType_init(UA_SessionSecurityDiagnosticsDataType *p) { - memset(p, 0, sizeof(UA_SessionSecurityDiagnosticsDataType)); +static UA_INLINE UA_CallMethodResult * +UA_CallMethodResult_new(void) { + return (UA_CallMethodResult*)UA_new(&UA_TYPES[UA_TYPES_CALLMETHODRESULT]); } -static UA_INLINE UA_SessionSecurityDiagnosticsDataType * -UA_SessionSecurityDiagnosticsDataType_new(void) { - return (UA_SessionSecurityDiagnosticsDataType*)UA_new(&UA_TYPES[UA_TYPES_SESSIONSECURITYDIAGNOSTICSDATATYPE]); +static UA_INLINE UA_StatusCode +UA_CallMethodResult_copy(const UA_CallMethodResult *src, UA_CallMethodResult *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CALLMETHODRESULT]); } -static UA_INLINE UA_StatusCode -UA_SessionSecurityDiagnosticsDataType_copy(const UA_SessionSecurityDiagnosticsDataType *src, UA_SessionSecurityDiagnosticsDataType *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SESSIONSECURITYDIAGNOSTICSDATATYPE]); +static UA_INLINE void +UA_CallMethodResult_deleteMembers(UA_CallMethodResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CALLMETHODRESULT]); } static UA_INLINE void -UA_SessionSecurityDiagnosticsDataType_deleteMembers(UA_SessionSecurityDiagnosticsDataType *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SESSIONSECURITYDIAGNOSTICSDATATYPE]); +UA_CallMethodResult_clear(UA_CallMethodResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CALLMETHODRESULT]); } static UA_INLINE void -UA_SessionSecurityDiagnosticsDataType_delete(UA_SessionSecurityDiagnosticsDataType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SESSIONSECURITYDIAGNOSTICSDATATYPE]); +UA_CallMethodResult_delete(UA_CallMethodResult *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CALLMETHODRESULT]); } -/* RepublishRequest */ +/* CallRequest */ static UA_INLINE void -UA_RepublishRequest_init(UA_RepublishRequest *p) { - memset(p, 0, sizeof(UA_RepublishRequest)); +UA_CallRequest_init(UA_CallRequest *p) { + memset(p, 0, sizeof(UA_CallRequest)); } -static UA_INLINE UA_RepublishRequest * -UA_RepublishRequest_new(void) { - return (UA_RepublishRequest*)UA_new(&UA_TYPES[UA_TYPES_REPUBLISHREQUEST]); +static UA_INLINE UA_CallRequest * +UA_CallRequest_new(void) { + return (UA_CallRequest*)UA_new(&UA_TYPES[UA_TYPES_CALLREQUEST]); } static UA_INLINE UA_StatusCode -UA_RepublishRequest_copy(const UA_RepublishRequest *src, UA_RepublishRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST]); +UA_CallRequest_copy(const UA_CallRequest *src, UA_CallRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CALLREQUEST]); } static UA_INLINE void -UA_RepublishRequest_deleteMembers(UA_RepublishRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST]); +UA_CallRequest_deleteMembers(UA_CallRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CALLREQUEST]); } static UA_INLINE void -UA_RepublishRequest_delete(UA_RepublishRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST]); +UA_CallRequest_clear(UA_CallRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CALLREQUEST]); } -/* GetEndpointsRequest */ static UA_INLINE void -UA_GetEndpointsRequest_init(UA_GetEndpointsRequest *p) { - memset(p, 0, sizeof(UA_GetEndpointsRequest)); +UA_CallRequest_delete(UA_CallRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CALLREQUEST]); } -static UA_INLINE UA_GetEndpointsRequest * -UA_GetEndpointsRequest_new(void) { - return (UA_GetEndpointsRequest*)UA_new(&UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST]); +/* CallResponse */ +static UA_INLINE void +UA_CallResponse_init(UA_CallResponse *p) { + memset(p, 0, sizeof(UA_CallResponse)); } -static UA_INLINE UA_StatusCode -UA_GetEndpointsRequest_copy(const UA_GetEndpointsRequest *src, UA_GetEndpointsRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST]); +static UA_INLINE UA_CallResponse * +UA_CallResponse_new(void) { + return (UA_CallResponse*)UA_new(&UA_TYPES[UA_TYPES_CALLRESPONSE]); } -static UA_INLINE void -UA_GetEndpointsRequest_deleteMembers(UA_GetEndpointsRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST]); +static UA_INLINE UA_StatusCode +UA_CallResponse_copy(const UA_CallResponse *src, UA_CallResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CALLRESPONSE]); } static UA_INLINE void -UA_GetEndpointsRequest_delete(UA_GetEndpointsRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST]); +UA_CallResponse_deleteMembers(UA_CallResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CALLRESPONSE]); } -/* PublishRequest */ static UA_INLINE void -UA_PublishRequest_init(UA_PublishRequest *p) { - memset(p, 0, sizeof(UA_PublishRequest)); -} - -static UA_INLINE UA_PublishRequest * -UA_PublishRequest_new(void) { - return (UA_PublishRequest*)UA_new(&UA_TYPES[UA_TYPES_PUBLISHREQUEST]); -} - -static UA_INLINE UA_StatusCode -UA_PublishRequest_copy(const UA_PublishRequest *src, UA_PublishRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_PUBLISHREQUEST]); +UA_CallResponse_clear(UA_CallResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CALLRESPONSE]); } static UA_INLINE void -UA_PublishRequest_deleteMembers(UA_PublishRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_PUBLISHREQUEST]); +UA_CallResponse_delete(UA_CallResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CALLRESPONSE]); } +/* MonitoringMode */ static UA_INLINE void -UA_PublishRequest_delete(UA_PublishRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_PUBLISHREQUEST]); +UA_MonitoringMode_init(UA_MonitoringMode *p) { + memset(p, 0, sizeof(UA_MonitoringMode)); } -/* DeleteSubscriptionsResponse */ -static UA_INLINE void -UA_DeleteSubscriptionsResponse_init(UA_DeleteSubscriptionsResponse *p) { - memset(p, 0, sizeof(UA_DeleteSubscriptionsResponse)); +static UA_INLINE UA_MonitoringMode * +UA_MonitoringMode_new(void) { + return (UA_MonitoringMode*)UA_new(&UA_TYPES[UA_TYPES_MONITORINGMODE]); } -static UA_INLINE UA_DeleteSubscriptionsResponse * -UA_DeleteSubscriptionsResponse_new(void) { - return (UA_DeleteSubscriptionsResponse*)UA_new(&UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]); +static UA_INLINE UA_StatusCode +UA_MonitoringMode_copy(const UA_MonitoringMode *src, UA_MonitoringMode *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } -static UA_INLINE UA_StatusCode -UA_DeleteSubscriptionsResponse_copy(const UA_DeleteSubscriptionsResponse *src, UA_DeleteSubscriptionsResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]); +static UA_INLINE void +UA_MonitoringMode_deleteMembers(UA_MonitoringMode *p) { + memset(p, 0, sizeof(UA_MonitoringMode)); } static UA_INLINE void -UA_DeleteSubscriptionsResponse_deleteMembers(UA_DeleteSubscriptionsResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]); +UA_MonitoringMode_clear(UA_MonitoringMode *p) { + memset(p, 0, sizeof(UA_MonitoringMode)); } static UA_INLINE void -UA_DeleteSubscriptionsResponse_delete(UA_DeleteSubscriptionsResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]); +UA_MonitoringMode_delete(UA_MonitoringMode *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_MONITORINGMODE]); } -/* AddNodesResponse */ +/* DataChangeTrigger */ static UA_INLINE void -UA_AddNodesResponse_init(UA_AddNodesResponse *p) { - memset(p, 0, sizeof(UA_AddNodesResponse)); +UA_DataChangeTrigger_init(UA_DataChangeTrigger *p) { + memset(p, 0, sizeof(UA_DataChangeTrigger)); } -static UA_INLINE UA_AddNodesResponse * -UA_AddNodesResponse_new(void) { - return (UA_AddNodesResponse*)UA_new(&UA_TYPES[UA_TYPES_ADDNODESRESPONSE]); +static UA_INLINE UA_DataChangeTrigger * +UA_DataChangeTrigger_new(void) { + return (UA_DataChangeTrigger*)UA_new(&UA_TYPES[UA_TYPES_DATACHANGETRIGGER]); } static UA_INLINE UA_StatusCode -UA_AddNodesResponse_copy(const UA_AddNodesResponse *src, UA_AddNodesResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE]); +UA_DataChangeTrigger_copy(const UA_DataChangeTrigger *src, UA_DataChangeTrigger *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} + +static UA_INLINE void +UA_DataChangeTrigger_deleteMembers(UA_DataChangeTrigger *p) { + memset(p, 0, sizeof(UA_DataChangeTrigger)); } static UA_INLINE void -UA_AddNodesResponse_deleteMembers(UA_AddNodesResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE]); +UA_DataChangeTrigger_clear(UA_DataChangeTrigger *p) { + memset(p, 0, sizeof(UA_DataChangeTrigger)); } static UA_INLINE void -UA_AddNodesResponse_delete(UA_AddNodesResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE]); +UA_DataChangeTrigger_delete(UA_DataChangeTrigger *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DATACHANGETRIGGER]); } -/* DataChangeNotification */ +/* DeadbandType */ static UA_INLINE void -UA_DataChangeNotification_init(UA_DataChangeNotification *p) { - memset(p, 0, sizeof(UA_DataChangeNotification)); +UA_DeadbandType_init(UA_DeadbandType *p) { + memset(p, 0, sizeof(UA_DeadbandType)); } -static UA_INLINE UA_DataChangeNotification * -UA_DataChangeNotification_new(void) { - return (UA_DataChangeNotification*)UA_new(&UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]); +static UA_INLINE UA_DeadbandType * +UA_DeadbandType_new(void) { + return (UA_DeadbandType*)UA_new(&UA_TYPES[UA_TYPES_DEADBANDTYPE]); } static UA_INLINE UA_StatusCode -UA_DataChangeNotification_copy(const UA_DataChangeNotification *src, UA_DataChangeNotification *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]); +UA_DeadbandType_copy(const UA_DeadbandType *src, UA_DeadbandType *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_DataChangeNotification_deleteMembers(UA_DataChangeNotification *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]); +UA_DeadbandType_deleteMembers(UA_DeadbandType *p) { + memset(p, 0, sizeof(UA_DeadbandType)); } static UA_INLINE void -UA_DataChangeNotification_delete(UA_DataChangeNotification *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]); +UA_DeadbandType_clear(UA_DeadbandType *p) { + memset(p, 0, sizeof(UA_DeadbandType)); } -/* CloseSecureChannelResponse */ static UA_INLINE void -UA_CloseSecureChannelResponse_init(UA_CloseSecureChannelResponse *p) { - memset(p, 0, sizeof(UA_CloseSecureChannelResponse)); +UA_DeadbandType_delete(UA_DeadbandType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DEADBANDTYPE]); } -static UA_INLINE UA_CloseSecureChannelResponse * -UA_CloseSecureChannelResponse_new(void) { - return (UA_CloseSecureChannelResponse*)UA_new(&UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE]); +/* DataChangeFilter */ +static UA_INLINE void +UA_DataChangeFilter_init(UA_DataChangeFilter *p) { + memset(p, 0, sizeof(UA_DataChangeFilter)); +} + +static UA_INLINE UA_DataChangeFilter * +UA_DataChangeFilter_new(void) { + return (UA_DataChangeFilter*)UA_new(&UA_TYPES[UA_TYPES_DATACHANGEFILTER]); } static UA_INLINE UA_StatusCode -UA_CloseSecureChannelResponse_copy(const UA_CloseSecureChannelResponse *src, UA_CloseSecureChannelResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE]); +UA_DataChangeFilter_copy(const UA_DataChangeFilter *src, UA_DataChangeFilter *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_CloseSecureChannelResponse_deleteMembers(UA_CloseSecureChannelResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE]); +UA_DataChangeFilter_deleteMembers(UA_DataChangeFilter *p) { + memset(p, 0, sizeof(UA_DataChangeFilter)); } static UA_INLINE void -UA_CloseSecureChannelResponse_delete(UA_CloseSecureChannelResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE]); +UA_DataChangeFilter_clear(UA_DataChangeFilter *p) { + memset(p, 0, sizeof(UA_DataChangeFilter)); } -/* ModifyMonitoredItemsRequest */ static UA_INLINE void -UA_ModifyMonitoredItemsRequest_init(UA_ModifyMonitoredItemsRequest *p) { - memset(p, 0, sizeof(UA_ModifyMonitoredItemsRequest)); +UA_DataChangeFilter_delete(UA_DataChangeFilter *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DATACHANGEFILTER]); } -static UA_INLINE UA_ModifyMonitoredItemsRequest * -UA_ModifyMonitoredItemsRequest_new(void) { - return (UA_ModifyMonitoredItemsRequest*)UA_new(&UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST]); +/* EventFilter */ +static UA_INLINE void +UA_EventFilter_init(UA_EventFilter *p) { + memset(p, 0, sizeof(UA_EventFilter)); +} + +static UA_INLINE UA_EventFilter * +UA_EventFilter_new(void) { + return (UA_EventFilter*)UA_new(&UA_TYPES[UA_TYPES_EVENTFILTER]); } static UA_INLINE UA_StatusCode -UA_ModifyMonitoredItemsRequest_copy(const UA_ModifyMonitoredItemsRequest *src, UA_ModifyMonitoredItemsRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST]); +UA_EventFilter_copy(const UA_EventFilter *src, UA_EventFilter *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_EVENTFILTER]); } static UA_INLINE void -UA_ModifyMonitoredItemsRequest_deleteMembers(UA_ModifyMonitoredItemsRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST]); +UA_EventFilter_deleteMembers(UA_EventFilter *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_EVENTFILTER]); } static UA_INLINE void -UA_ModifyMonitoredItemsRequest_delete(UA_ModifyMonitoredItemsRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST]); +UA_EventFilter_clear(UA_EventFilter *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_EVENTFILTER]); } -/* SetMonitoringModeResponse */ static UA_INLINE void -UA_SetMonitoringModeResponse_init(UA_SetMonitoringModeResponse *p) { - memset(p, 0, sizeof(UA_SetMonitoringModeResponse)); +UA_EventFilter_delete(UA_EventFilter *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_EVENTFILTER]); } -static UA_INLINE UA_SetMonitoringModeResponse * -UA_SetMonitoringModeResponse_new(void) { - return (UA_SetMonitoringModeResponse*)UA_new(&UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]); +/* AggregateConfiguration */ +static UA_INLINE void +UA_AggregateConfiguration_init(UA_AggregateConfiguration *p) { + memset(p, 0, sizeof(UA_AggregateConfiguration)); +} + +static UA_INLINE UA_AggregateConfiguration * +UA_AggregateConfiguration_new(void) { + return (UA_AggregateConfiguration*)UA_new(&UA_TYPES[UA_TYPES_AGGREGATECONFIGURATION]); } static UA_INLINE UA_StatusCode -UA_SetMonitoringModeResponse_copy(const UA_SetMonitoringModeResponse *src, UA_SetMonitoringModeResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]); +UA_AggregateConfiguration_copy(const UA_AggregateConfiguration *src, UA_AggregateConfiguration *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_SetMonitoringModeResponse_deleteMembers(UA_SetMonitoringModeResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]); +UA_AggregateConfiguration_deleteMembers(UA_AggregateConfiguration *p) { + memset(p, 0, sizeof(UA_AggregateConfiguration)); } static UA_INLINE void -UA_SetMonitoringModeResponse_delete(UA_SetMonitoringModeResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]); +UA_AggregateConfiguration_clear(UA_AggregateConfiguration *p) { + memset(p, 0, sizeof(UA_AggregateConfiguration)); } -/* FindServersRequest */ static UA_INLINE void -UA_FindServersRequest_init(UA_FindServersRequest *p) { - memset(p, 0, sizeof(UA_FindServersRequest)); +UA_AggregateConfiguration_delete(UA_AggregateConfiguration *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_AGGREGATECONFIGURATION]); } -static UA_INLINE UA_FindServersRequest * -UA_FindServersRequest_new(void) { - return (UA_FindServersRequest*)UA_new(&UA_TYPES[UA_TYPES_FINDSERVERSREQUEST]); +/* AggregateFilter */ +static UA_INLINE void +UA_AggregateFilter_init(UA_AggregateFilter *p) { + memset(p, 0, sizeof(UA_AggregateFilter)); +} + +static UA_INLINE UA_AggregateFilter * +UA_AggregateFilter_new(void) { + return (UA_AggregateFilter*)UA_new(&UA_TYPES[UA_TYPES_AGGREGATEFILTER]); } static UA_INLINE UA_StatusCode -UA_FindServersRequest_copy(const UA_FindServersRequest *src, UA_FindServersRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST]); +UA_AggregateFilter_copy(const UA_AggregateFilter *src, UA_AggregateFilter *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_AGGREGATEFILTER]); } static UA_INLINE void -UA_FindServersRequest_deleteMembers(UA_FindServersRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST]); +UA_AggregateFilter_deleteMembers(UA_AggregateFilter *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_AGGREGATEFILTER]); } static UA_INLINE void -UA_FindServersRequest_delete(UA_FindServersRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST]); +UA_AggregateFilter_clear(UA_AggregateFilter *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_AGGREGATEFILTER]); } -/* ReferenceDescription */ static UA_INLINE void -UA_ReferenceDescription_init(UA_ReferenceDescription *p) { - memset(p, 0, sizeof(UA_ReferenceDescription)); +UA_AggregateFilter_delete(UA_AggregateFilter *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_AGGREGATEFILTER]); } -static UA_INLINE UA_ReferenceDescription * -UA_ReferenceDescription_new(void) { - return (UA_ReferenceDescription*)UA_new(&UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); +/* EventFilterResult */ +static UA_INLINE void +UA_EventFilterResult_init(UA_EventFilterResult *p) { + memset(p, 0, sizeof(UA_EventFilterResult)); +} + +static UA_INLINE UA_EventFilterResult * +UA_EventFilterResult_new(void) { + return (UA_EventFilterResult*)UA_new(&UA_TYPES[UA_TYPES_EVENTFILTERRESULT]); } static UA_INLINE UA_StatusCode -UA_ReferenceDescription_copy(const UA_ReferenceDescription *src, UA_ReferenceDescription *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); +UA_EventFilterResult_copy(const UA_EventFilterResult *src, UA_EventFilterResult *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT]); } static UA_INLINE void -UA_ReferenceDescription_deleteMembers(UA_ReferenceDescription *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); +UA_EventFilterResult_deleteMembers(UA_EventFilterResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT]); } static UA_INLINE void -UA_ReferenceDescription_delete(UA_ReferenceDescription *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); +UA_EventFilterResult_clear(UA_EventFilterResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT]); } -/* SetPublishingModeResponse */ static UA_INLINE void -UA_SetPublishingModeResponse_init(UA_SetPublishingModeResponse *p) { - memset(p, 0, sizeof(UA_SetPublishingModeResponse)); +UA_EventFilterResult_delete(UA_EventFilterResult *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT]); } -static UA_INLINE UA_SetPublishingModeResponse * -UA_SetPublishingModeResponse_new(void) { - return (UA_SetPublishingModeResponse*)UA_new(&UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]); +/* MonitoringParameters */ +static UA_INLINE void +UA_MonitoringParameters_init(UA_MonitoringParameters *p) { + memset(p, 0, sizeof(UA_MonitoringParameters)); +} + +static UA_INLINE UA_MonitoringParameters * +UA_MonitoringParameters_new(void) { + return (UA_MonitoringParameters*)UA_new(&UA_TYPES[UA_TYPES_MONITORINGPARAMETERS]); } static UA_INLINE UA_StatusCode -UA_SetPublishingModeResponse_copy(const UA_SetPublishingModeResponse *src, UA_SetPublishingModeResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]); +UA_MonitoringParameters_copy(const UA_MonitoringParameters *src, UA_MonitoringParameters *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS]); } static UA_INLINE void -UA_SetPublishingModeResponse_deleteMembers(UA_SetPublishingModeResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]); +UA_MonitoringParameters_deleteMembers(UA_MonitoringParameters *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS]); } static UA_INLINE void -UA_SetPublishingModeResponse_delete(UA_SetPublishingModeResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]); +UA_MonitoringParameters_clear(UA_MonitoringParameters *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS]); } -/* ContentFilterResult */ static UA_INLINE void -UA_ContentFilterResult_init(UA_ContentFilterResult *p) { - memset(p, 0, sizeof(UA_ContentFilterResult)); +UA_MonitoringParameters_delete(UA_MonitoringParameters *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS]); } -static UA_INLINE UA_ContentFilterResult * -UA_ContentFilterResult_new(void) { - return (UA_ContentFilterResult*)UA_new(&UA_TYPES[UA_TYPES_CONTENTFILTERRESULT]); +/* MonitoredItemCreateRequest */ +static UA_INLINE void +UA_MonitoredItemCreateRequest_init(UA_MonitoredItemCreateRequest *p) { + memset(p, 0, sizeof(UA_MonitoredItemCreateRequest)); +} + +static UA_INLINE UA_MonitoredItemCreateRequest * +UA_MonitoredItemCreateRequest_new(void) { + return (UA_MonitoredItemCreateRequest*)UA_new(&UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST]); } static UA_INLINE UA_StatusCode -UA_ContentFilterResult_copy(const UA_ContentFilterResult *src, UA_ContentFilterResult *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT]); +UA_MonitoredItemCreateRequest_copy(const UA_MonitoredItemCreateRequest *src, UA_MonitoredItemCreateRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST]); } static UA_INLINE void -UA_ContentFilterResult_deleteMembers(UA_ContentFilterResult *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT]); +UA_MonitoredItemCreateRequest_deleteMembers(UA_MonitoredItemCreateRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST]); } static UA_INLINE void -UA_ContentFilterResult_delete(UA_ContentFilterResult *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT]); +UA_MonitoredItemCreateRequest_clear(UA_MonitoredItemCreateRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST]); } -/* RegisterServerResponse */ static UA_INLINE void -UA_RegisterServerResponse_init(UA_RegisterServerResponse *p) { - memset(p, 0, sizeof(UA_RegisterServerResponse)); +UA_MonitoredItemCreateRequest_delete(UA_MonitoredItemCreateRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST]); } -static UA_INLINE UA_RegisterServerResponse * -UA_RegisterServerResponse_new(void) { - return (UA_RegisterServerResponse*)UA_new(&UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]); +/* MonitoredItemCreateResult */ +static UA_INLINE void +UA_MonitoredItemCreateResult_init(UA_MonitoredItemCreateResult *p) { + memset(p, 0, sizeof(UA_MonitoredItemCreateResult)); +} + +static UA_INLINE UA_MonitoredItemCreateResult * +UA_MonitoredItemCreateResult_new(void) { + return (UA_MonitoredItemCreateResult*)UA_new(&UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]); } static UA_INLINE UA_StatusCode -UA_RegisterServerResponse_copy(const UA_RegisterServerResponse *src, UA_RegisterServerResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]); +UA_MonitoredItemCreateResult_copy(const UA_MonitoredItemCreateResult *src, UA_MonitoredItemCreateResult *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]); } static UA_INLINE void -UA_RegisterServerResponse_deleteMembers(UA_RegisterServerResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]); +UA_MonitoredItemCreateResult_deleteMembers(UA_MonitoredItemCreateResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]); } static UA_INLINE void -UA_RegisterServerResponse_delete(UA_RegisterServerResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]); +UA_MonitoredItemCreateResult_clear(UA_MonitoredItemCreateResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]); } -/* AddReferencesItem */ static UA_INLINE void -UA_AddReferencesItem_init(UA_AddReferencesItem *p) { - memset(p, 0, sizeof(UA_AddReferencesItem)); +UA_MonitoredItemCreateResult_delete(UA_MonitoredItemCreateResult *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]); } -static UA_INLINE UA_AddReferencesItem * -UA_AddReferencesItem_new(void) { - return (UA_AddReferencesItem*)UA_new(&UA_TYPES[UA_TYPES_ADDREFERENCESITEM]); +/* CreateMonitoredItemsRequest */ +static UA_INLINE void +UA_CreateMonitoredItemsRequest_init(UA_CreateMonitoredItemsRequest *p) { + memset(p, 0, sizeof(UA_CreateMonitoredItemsRequest)); +} + +static UA_INLINE UA_CreateMonitoredItemsRequest * +UA_CreateMonitoredItemsRequest_new(void) { + return (UA_CreateMonitoredItemsRequest*)UA_new(&UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST]); } static UA_INLINE UA_StatusCode -UA_AddReferencesItem_copy(const UA_AddReferencesItem *src, UA_AddReferencesItem *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM]); +UA_CreateMonitoredItemsRequest_copy(const UA_CreateMonitoredItemsRequest *src, UA_CreateMonitoredItemsRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST]); } static UA_INLINE void -UA_AddReferencesItem_deleteMembers(UA_AddReferencesItem *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM]); +UA_CreateMonitoredItemsRequest_deleteMembers(UA_CreateMonitoredItemsRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST]); } static UA_INLINE void -UA_AddReferencesItem_delete(UA_AddReferencesItem *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM]); +UA_CreateMonitoredItemsRequest_clear(UA_CreateMonitoredItemsRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST]); +} + +static UA_INLINE void +UA_CreateMonitoredItemsRequest_delete(UA_CreateMonitoredItemsRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST]); } -/* QueryDataDescription */ +/* CreateMonitoredItemsResponse */ static UA_INLINE void -UA_QueryDataDescription_init(UA_QueryDataDescription *p) { - memset(p, 0, sizeof(UA_QueryDataDescription)); +UA_CreateMonitoredItemsResponse_init(UA_CreateMonitoredItemsResponse *p) { + memset(p, 0, sizeof(UA_CreateMonitoredItemsResponse)); } -static UA_INLINE UA_QueryDataDescription * -UA_QueryDataDescription_new(void) { - return (UA_QueryDataDescription*)UA_new(&UA_TYPES[UA_TYPES_QUERYDATADESCRIPTION]); +static UA_INLINE UA_CreateMonitoredItemsResponse * +UA_CreateMonitoredItemsResponse_new(void) { + return (UA_CreateMonitoredItemsResponse*)UA_new(&UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]); } static UA_INLINE UA_StatusCode -UA_QueryDataDescription_copy(const UA_QueryDataDescription *src, UA_QueryDataDescription *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_QUERYDATADESCRIPTION]); +UA_CreateMonitoredItemsResponse_copy(const UA_CreateMonitoredItemsResponse *src, UA_CreateMonitoredItemsResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]); } static UA_INLINE void -UA_QueryDataDescription_deleteMembers(UA_QueryDataDescription *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_QUERYDATADESCRIPTION]); +UA_CreateMonitoredItemsResponse_deleteMembers(UA_CreateMonitoredItemsResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]); } static UA_INLINE void -UA_QueryDataDescription_delete(UA_QueryDataDescription *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_QUERYDATADESCRIPTION]); +UA_CreateMonitoredItemsResponse_clear(UA_CreateMonitoredItemsResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]); } -/* CreateSubscriptionResponse */ static UA_INLINE void -UA_CreateSubscriptionResponse_init(UA_CreateSubscriptionResponse *p) { - memset(p, 0, sizeof(UA_CreateSubscriptionResponse)); +UA_CreateMonitoredItemsResponse_delete(UA_CreateMonitoredItemsResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]); } -static UA_INLINE UA_CreateSubscriptionResponse * -UA_CreateSubscriptionResponse_new(void) { - return (UA_CreateSubscriptionResponse*)UA_new(&UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]); +/* MonitoredItemModifyRequest */ +static UA_INLINE void +UA_MonitoredItemModifyRequest_init(UA_MonitoredItemModifyRequest *p) { + memset(p, 0, sizeof(UA_MonitoredItemModifyRequest)); +} + +static UA_INLINE UA_MonitoredItemModifyRequest * +UA_MonitoredItemModifyRequest_new(void) { + return (UA_MonitoredItemModifyRequest*)UA_new(&UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST]); } static UA_INLINE UA_StatusCode -UA_CreateSubscriptionResponse_copy(const UA_CreateSubscriptionResponse *src, UA_CreateSubscriptionResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]); +UA_MonitoredItemModifyRequest_copy(const UA_MonitoredItemModifyRequest *src, UA_MonitoredItemModifyRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST]); } static UA_INLINE void -UA_CreateSubscriptionResponse_deleteMembers(UA_CreateSubscriptionResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]); +UA_MonitoredItemModifyRequest_deleteMembers(UA_MonitoredItemModifyRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST]); } static UA_INLINE void -UA_CreateSubscriptionResponse_delete(UA_CreateSubscriptionResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]); +UA_MonitoredItemModifyRequest_clear(UA_MonitoredItemModifyRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST]); +} + +static UA_INLINE void +UA_MonitoredItemModifyRequest_delete(UA_MonitoredItemModifyRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST]); } -/* NetworkGroupDataType */ +/* MonitoredItemModifyResult */ static UA_INLINE void -UA_NetworkGroupDataType_init(UA_NetworkGroupDataType *p) { - memset(p, 0, sizeof(UA_NetworkGroupDataType)); +UA_MonitoredItemModifyResult_init(UA_MonitoredItemModifyResult *p) { + memset(p, 0, sizeof(UA_MonitoredItemModifyResult)); } -static UA_INLINE UA_NetworkGroupDataType * -UA_NetworkGroupDataType_new(void) { - return (UA_NetworkGroupDataType*)UA_new(&UA_TYPES[UA_TYPES_NETWORKGROUPDATATYPE]); +static UA_INLINE UA_MonitoredItemModifyResult * +UA_MonitoredItemModifyResult_new(void) { + return (UA_MonitoredItemModifyResult*)UA_new(&UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]); } static UA_INLINE UA_StatusCode -UA_NetworkGroupDataType_copy(const UA_NetworkGroupDataType *src, UA_NetworkGroupDataType *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_NETWORKGROUPDATATYPE]); +UA_MonitoredItemModifyResult_copy(const UA_MonitoredItemModifyResult *src, UA_MonitoredItemModifyResult *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]); } static UA_INLINE void -UA_NetworkGroupDataType_deleteMembers(UA_NetworkGroupDataType *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_NETWORKGROUPDATATYPE]); +UA_MonitoredItemModifyResult_deleteMembers(UA_MonitoredItemModifyResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]); } static UA_INLINE void -UA_NetworkGroupDataType_delete(UA_NetworkGroupDataType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_NETWORKGROUPDATATYPE]); +UA_MonitoredItemModifyResult_clear(UA_MonitoredItemModifyResult *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]); } -/* DeleteReferencesResponse */ static UA_INLINE void -UA_DeleteReferencesResponse_init(UA_DeleteReferencesResponse *p) { - memset(p, 0, sizeof(UA_DeleteReferencesResponse)); +UA_MonitoredItemModifyResult_delete(UA_MonitoredItemModifyResult *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]); } -static UA_INLINE UA_DeleteReferencesResponse * -UA_DeleteReferencesResponse_new(void) { - return (UA_DeleteReferencesResponse*)UA_new(&UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]); +/* ModifyMonitoredItemsRequest */ +static UA_INLINE void +UA_ModifyMonitoredItemsRequest_init(UA_ModifyMonitoredItemsRequest *p) { + memset(p, 0, sizeof(UA_ModifyMonitoredItemsRequest)); +} + +static UA_INLINE UA_ModifyMonitoredItemsRequest * +UA_ModifyMonitoredItemsRequest_new(void) { + return (UA_ModifyMonitoredItemsRequest*)UA_new(&UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST]); } static UA_INLINE UA_StatusCode -UA_DeleteReferencesResponse_copy(const UA_DeleteReferencesResponse *src, UA_DeleteReferencesResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]); +UA_ModifyMonitoredItemsRequest_copy(const UA_ModifyMonitoredItemsRequest *src, UA_ModifyMonitoredItemsRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST]); } static UA_INLINE void -UA_DeleteReferencesResponse_deleteMembers(UA_DeleteReferencesResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]); +UA_ModifyMonitoredItemsRequest_deleteMembers(UA_ModifyMonitoredItemsRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST]); } static UA_INLINE void -UA_DeleteReferencesResponse_delete(UA_DeleteReferencesResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]); +UA_ModifyMonitoredItemsRequest_clear(UA_ModifyMonitoredItemsRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST]); } -/* CreateMonitoredItemsResponse */ static UA_INLINE void -UA_CreateMonitoredItemsResponse_init(UA_CreateMonitoredItemsResponse *p) { - memset(p, 0, sizeof(UA_CreateMonitoredItemsResponse)); +UA_ModifyMonitoredItemsRequest_delete(UA_ModifyMonitoredItemsRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST]); } -static UA_INLINE UA_CreateMonitoredItemsResponse * -UA_CreateMonitoredItemsResponse_new(void) { - return (UA_CreateMonitoredItemsResponse*)UA_new(&UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]); +/* ModifyMonitoredItemsResponse */ +static UA_INLINE void +UA_ModifyMonitoredItemsResponse_init(UA_ModifyMonitoredItemsResponse *p) { + memset(p, 0, sizeof(UA_ModifyMonitoredItemsResponse)); +} + +static UA_INLINE UA_ModifyMonitoredItemsResponse * +UA_ModifyMonitoredItemsResponse_new(void) { + return (UA_ModifyMonitoredItemsResponse*)UA_new(&UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]); } static UA_INLINE UA_StatusCode -UA_CreateMonitoredItemsResponse_copy(const UA_CreateMonitoredItemsResponse *src, UA_CreateMonitoredItemsResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]); +UA_ModifyMonitoredItemsResponse_copy(const UA_ModifyMonitoredItemsResponse *src, UA_ModifyMonitoredItemsResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]); } static UA_INLINE void -UA_CreateMonitoredItemsResponse_deleteMembers(UA_CreateMonitoredItemsResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]); +UA_ModifyMonitoredItemsResponse_deleteMembers(UA_ModifyMonitoredItemsResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]); } static UA_INLINE void -UA_CreateMonitoredItemsResponse_delete(UA_CreateMonitoredItemsResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]); +UA_ModifyMonitoredItemsResponse_clear(UA_ModifyMonitoredItemsResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]); } -/* CallResponse */ static UA_INLINE void -UA_CallResponse_init(UA_CallResponse *p) { - memset(p, 0, sizeof(UA_CallResponse)); +UA_ModifyMonitoredItemsResponse_delete(UA_ModifyMonitoredItemsResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]); } -static UA_INLINE UA_CallResponse * -UA_CallResponse_new(void) { - return (UA_CallResponse*)UA_new(&UA_TYPES[UA_TYPES_CALLRESPONSE]); +/* SetMonitoringModeRequest */ +static UA_INLINE void +UA_SetMonitoringModeRequest_init(UA_SetMonitoringModeRequest *p) { + memset(p, 0, sizeof(UA_SetMonitoringModeRequest)); +} + +static UA_INLINE UA_SetMonitoringModeRequest * +UA_SetMonitoringModeRequest_new(void) { + return (UA_SetMonitoringModeRequest*)UA_new(&UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST]); } static UA_INLINE UA_StatusCode -UA_CallResponse_copy(const UA_CallResponse *src, UA_CallResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CALLRESPONSE]); +UA_SetMonitoringModeRequest_copy(const UA_SetMonitoringModeRequest *src, UA_SetMonitoringModeRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST]); } static UA_INLINE void -UA_CallResponse_deleteMembers(UA_CallResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CALLRESPONSE]); +UA_SetMonitoringModeRequest_deleteMembers(UA_SetMonitoringModeRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST]); } static UA_INLINE void -UA_CallResponse_delete(UA_CallResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CALLRESPONSE]); +UA_SetMonitoringModeRequest_clear(UA_SetMonitoringModeRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST]); } -/* DeleteNodesResponse */ static UA_INLINE void -UA_DeleteNodesResponse_init(UA_DeleteNodesResponse *p) { - memset(p, 0, sizeof(UA_DeleteNodesResponse)); +UA_SetMonitoringModeRequest_delete(UA_SetMonitoringModeRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST]); } -static UA_INLINE UA_DeleteNodesResponse * -UA_DeleteNodesResponse_new(void) { - return (UA_DeleteNodesResponse*)UA_new(&UA_TYPES[UA_TYPES_DELETENODESRESPONSE]); +/* SetMonitoringModeResponse */ +static UA_INLINE void +UA_SetMonitoringModeResponse_init(UA_SetMonitoringModeResponse *p) { + memset(p, 0, sizeof(UA_SetMonitoringModeResponse)); +} + +static UA_INLINE UA_SetMonitoringModeResponse * +UA_SetMonitoringModeResponse_new(void) { + return (UA_SetMonitoringModeResponse*)UA_new(&UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]); } static UA_INLINE UA_StatusCode -UA_DeleteNodesResponse_copy(const UA_DeleteNodesResponse *src, UA_DeleteNodesResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE]); +UA_SetMonitoringModeResponse_copy(const UA_SetMonitoringModeResponse *src, UA_SetMonitoringModeResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]); } static UA_INLINE void -UA_DeleteNodesResponse_deleteMembers(UA_DeleteNodesResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE]); +UA_SetMonitoringModeResponse_deleteMembers(UA_SetMonitoringModeResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]); } static UA_INLINE void -UA_DeleteNodesResponse_delete(UA_DeleteNodesResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE]); +UA_SetMonitoringModeResponse_clear(UA_SetMonitoringModeResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]); } -/* RepublishResponse */ static UA_INLINE void -UA_RepublishResponse_init(UA_RepublishResponse *p) { - memset(p, 0, sizeof(UA_RepublishResponse)); +UA_SetMonitoringModeResponse_delete(UA_SetMonitoringModeResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]); } -static UA_INLINE UA_RepublishResponse * -UA_RepublishResponse_new(void) { - return (UA_RepublishResponse*)UA_new(&UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]); +/* SetTriggeringRequest */ +static UA_INLINE void +UA_SetTriggeringRequest_init(UA_SetTriggeringRequest *p) { + memset(p, 0, sizeof(UA_SetTriggeringRequest)); +} + +static UA_INLINE UA_SetTriggeringRequest * +UA_SetTriggeringRequest_new(void) { + return (UA_SetTriggeringRequest*)UA_new(&UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST]); } static UA_INLINE UA_StatusCode -UA_RepublishResponse_copy(const UA_RepublishResponse *src, UA_RepublishResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]); +UA_SetTriggeringRequest_copy(const UA_SetTriggeringRequest *src, UA_SetTriggeringRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST]); } static UA_INLINE void -UA_RepublishResponse_deleteMembers(UA_RepublishResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]); +UA_SetTriggeringRequest_deleteMembers(UA_SetTriggeringRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST]); } static UA_INLINE void -UA_RepublishResponse_delete(UA_RepublishResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]); +UA_SetTriggeringRequest_clear(UA_SetTriggeringRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST]); } -/* MonitoredItemCreateRequest */ static UA_INLINE void -UA_MonitoredItemCreateRequest_init(UA_MonitoredItemCreateRequest *p) { - memset(p, 0, sizeof(UA_MonitoredItemCreateRequest)); +UA_SetTriggeringRequest_delete(UA_SetTriggeringRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST]); } -static UA_INLINE UA_MonitoredItemCreateRequest * -UA_MonitoredItemCreateRequest_new(void) { - return (UA_MonitoredItemCreateRequest*)UA_new(&UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST]); +/* SetTriggeringResponse */ +static UA_INLINE void +UA_SetTriggeringResponse_init(UA_SetTriggeringResponse *p) { + memset(p, 0, sizeof(UA_SetTriggeringResponse)); +} + +static UA_INLINE UA_SetTriggeringResponse * +UA_SetTriggeringResponse_new(void) { + return (UA_SetTriggeringResponse*)UA_new(&UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE]); } static UA_INLINE UA_StatusCode -UA_MonitoredItemCreateRequest_copy(const UA_MonitoredItemCreateRequest *src, UA_MonitoredItemCreateRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST]); +UA_SetTriggeringResponse_copy(const UA_SetTriggeringResponse *src, UA_SetTriggeringResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE]); } static UA_INLINE void -UA_MonitoredItemCreateRequest_deleteMembers(UA_MonitoredItemCreateRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST]); +UA_SetTriggeringResponse_deleteMembers(UA_SetTriggeringResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE]); } static UA_INLINE void -UA_MonitoredItemCreateRequest_delete(UA_MonitoredItemCreateRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST]); +UA_SetTriggeringResponse_clear(UA_SetTriggeringResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE]); } -/* DeleteReferencesRequest */ static UA_INLINE void -UA_DeleteReferencesRequest_init(UA_DeleteReferencesRequest *p) { - memset(p, 0, sizeof(UA_DeleteReferencesRequest)); +UA_SetTriggeringResponse_delete(UA_SetTriggeringResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE]); } -static UA_INLINE UA_DeleteReferencesRequest * -UA_DeleteReferencesRequest_new(void) { - return (UA_DeleteReferencesRequest*)UA_new(&UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST]); +/* DeleteMonitoredItemsRequest */ +static UA_INLINE void +UA_DeleteMonitoredItemsRequest_init(UA_DeleteMonitoredItemsRequest *p) { + memset(p, 0, sizeof(UA_DeleteMonitoredItemsRequest)); +} + +static UA_INLINE UA_DeleteMonitoredItemsRequest * +UA_DeleteMonitoredItemsRequest_new(void) { + return (UA_DeleteMonitoredItemsRequest*)UA_new(&UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST]); } static UA_INLINE UA_StatusCode -UA_DeleteReferencesRequest_copy(const UA_DeleteReferencesRequest *src, UA_DeleteReferencesRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST]); +UA_DeleteMonitoredItemsRequest_copy(const UA_DeleteMonitoredItemsRequest *src, UA_DeleteMonitoredItemsRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST]); } static UA_INLINE void -UA_DeleteReferencesRequest_deleteMembers(UA_DeleteReferencesRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST]); +UA_DeleteMonitoredItemsRequest_deleteMembers(UA_DeleteMonitoredItemsRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST]); } static UA_INLINE void -UA_DeleteReferencesRequest_delete(UA_DeleteReferencesRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST]); +UA_DeleteMonitoredItemsRequest_clear(UA_DeleteMonitoredItemsRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST]); } -/* ReadResponse */ static UA_INLINE void -UA_ReadResponse_init(UA_ReadResponse *p) { - memset(p, 0, sizeof(UA_ReadResponse)); +UA_DeleteMonitoredItemsRequest_delete(UA_DeleteMonitoredItemsRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST]); } -static UA_INLINE UA_ReadResponse * -UA_ReadResponse_new(void) { - return (UA_ReadResponse*)UA_new(&UA_TYPES[UA_TYPES_READRESPONSE]); +/* DeleteMonitoredItemsResponse */ +static UA_INLINE void +UA_DeleteMonitoredItemsResponse_init(UA_DeleteMonitoredItemsResponse *p) { + memset(p, 0, sizeof(UA_DeleteMonitoredItemsResponse)); +} + +static UA_INLINE UA_DeleteMonitoredItemsResponse * +UA_DeleteMonitoredItemsResponse_new(void) { + return (UA_DeleteMonitoredItemsResponse*)UA_new(&UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]); } static UA_INLINE UA_StatusCode -UA_ReadResponse_copy(const UA_ReadResponse *src, UA_ReadResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_READRESPONSE]); +UA_DeleteMonitoredItemsResponse_copy(const UA_DeleteMonitoredItemsResponse *src, UA_DeleteMonitoredItemsResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]); +} + +static UA_INLINE void +UA_DeleteMonitoredItemsResponse_deleteMembers(UA_DeleteMonitoredItemsResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]); } static UA_INLINE void -UA_ReadResponse_deleteMembers(UA_ReadResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_READRESPONSE]); +UA_DeleteMonitoredItemsResponse_clear(UA_DeleteMonitoredItemsResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]); } static UA_INLINE void -UA_ReadResponse_delete(UA_ReadResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_READRESPONSE]); +UA_DeleteMonitoredItemsResponse_delete(UA_DeleteMonitoredItemsResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]); } -/* AddReferencesRequest */ +/* CreateSubscriptionRequest */ static UA_INLINE void -UA_AddReferencesRequest_init(UA_AddReferencesRequest *p) { - memset(p, 0, sizeof(UA_AddReferencesRequest)); +UA_CreateSubscriptionRequest_init(UA_CreateSubscriptionRequest *p) { + memset(p, 0, sizeof(UA_CreateSubscriptionRequest)); } -static UA_INLINE UA_AddReferencesRequest * -UA_AddReferencesRequest_new(void) { - return (UA_AddReferencesRequest*)UA_new(&UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST]); +static UA_INLINE UA_CreateSubscriptionRequest * +UA_CreateSubscriptionRequest_new(void) { + return (UA_CreateSubscriptionRequest*)UA_new(&UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST]); } static UA_INLINE UA_StatusCode -UA_AddReferencesRequest_copy(const UA_AddReferencesRequest *src, UA_AddReferencesRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST]); +UA_CreateSubscriptionRequest_copy(const UA_CreateSubscriptionRequest *src, UA_CreateSubscriptionRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST]); } static UA_INLINE void -UA_AddReferencesRequest_deleteMembers(UA_AddReferencesRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST]); +UA_CreateSubscriptionRequest_deleteMembers(UA_CreateSubscriptionRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST]); } static UA_INLINE void -UA_AddReferencesRequest_delete(UA_AddReferencesRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST]); +UA_CreateSubscriptionRequest_clear(UA_CreateSubscriptionRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST]); } -/* ReadRequest */ static UA_INLINE void -UA_ReadRequest_init(UA_ReadRequest *p) { - memset(p, 0, sizeof(UA_ReadRequest)); +UA_CreateSubscriptionRequest_delete(UA_CreateSubscriptionRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST]); } -static UA_INLINE UA_ReadRequest * -UA_ReadRequest_new(void) { - return (UA_ReadRequest*)UA_new(&UA_TYPES[UA_TYPES_READREQUEST]); +/* CreateSubscriptionResponse */ +static UA_INLINE void +UA_CreateSubscriptionResponse_init(UA_CreateSubscriptionResponse *p) { + memset(p, 0, sizeof(UA_CreateSubscriptionResponse)); +} + +static UA_INLINE UA_CreateSubscriptionResponse * +UA_CreateSubscriptionResponse_new(void) { + return (UA_CreateSubscriptionResponse*)UA_new(&UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]); } static UA_INLINE UA_StatusCode -UA_ReadRequest_copy(const UA_ReadRequest *src, UA_ReadRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_READREQUEST]); +UA_CreateSubscriptionResponse_copy(const UA_CreateSubscriptionResponse *src, UA_CreateSubscriptionResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]); } static UA_INLINE void -UA_ReadRequest_deleteMembers(UA_ReadRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_READREQUEST]); +UA_CreateSubscriptionResponse_deleteMembers(UA_CreateSubscriptionResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]); } static UA_INLINE void -UA_ReadRequest_delete(UA_ReadRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_READREQUEST]); +UA_CreateSubscriptionResponse_clear(UA_CreateSubscriptionResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]); } -/* OpenSecureChannelRequest */ static UA_INLINE void -UA_OpenSecureChannelRequest_init(UA_OpenSecureChannelRequest *p) { - memset(p, 0, sizeof(UA_OpenSecureChannelRequest)); +UA_CreateSubscriptionResponse_delete(UA_CreateSubscriptionResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]); } -static UA_INLINE UA_OpenSecureChannelRequest * -UA_OpenSecureChannelRequest_new(void) { - return (UA_OpenSecureChannelRequest*)UA_new(&UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); +/* ModifySubscriptionRequest */ +static UA_INLINE void +UA_ModifySubscriptionRequest_init(UA_ModifySubscriptionRequest *p) { + memset(p, 0, sizeof(UA_ModifySubscriptionRequest)); +} + +static UA_INLINE UA_ModifySubscriptionRequest * +UA_ModifySubscriptionRequest_new(void) { + return (UA_ModifySubscriptionRequest*)UA_new(&UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST]); } static UA_INLINE UA_StatusCode -UA_OpenSecureChannelRequest_copy(const UA_OpenSecureChannelRequest *src, UA_OpenSecureChannelRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); +UA_ModifySubscriptionRequest_copy(const UA_ModifySubscriptionRequest *src, UA_ModifySubscriptionRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST]); } static UA_INLINE void -UA_OpenSecureChannelRequest_deleteMembers(UA_OpenSecureChannelRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); +UA_ModifySubscriptionRequest_deleteMembers(UA_ModifySubscriptionRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST]); } static UA_INLINE void -UA_OpenSecureChannelRequest_delete(UA_OpenSecureChannelRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); +UA_ModifySubscriptionRequest_clear(UA_ModifySubscriptionRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST]); } -/* RegisterServer2Response */ static UA_INLINE void -UA_RegisterServer2Response_init(UA_RegisterServer2Response *p) { - memset(p, 0, sizeof(UA_RegisterServer2Response)); +UA_ModifySubscriptionRequest_delete(UA_ModifySubscriptionRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST]); } -static UA_INLINE UA_RegisterServer2Response * -UA_RegisterServer2Response_new(void) { - return (UA_RegisterServer2Response*)UA_new(&UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]); +/* ModifySubscriptionResponse */ +static UA_INLINE void +UA_ModifySubscriptionResponse_init(UA_ModifySubscriptionResponse *p) { + memset(p, 0, sizeof(UA_ModifySubscriptionResponse)); +} + +static UA_INLINE UA_ModifySubscriptionResponse * +UA_ModifySubscriptionResponse_new(void) { + return (UA_ModifySubscriptionResponse*)UA_new(&UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]); } static UA_INLINE UA_StatusCode -UA_RegisterServer2Response_copy(const UA_RegisterServer2Response *src, UA_RegisterServer2Response *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]); +UA_ModifySubscriptionResponse_copy(const UA_ModifySubscriptionResponse *src, UA_ModifySubscriptionResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]); } static UA_INLINE void -UA_RegisterServer2Response_deleteMembers(UA_RegisterServer2Response *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]); +UA_ModifySubscriptionResponse_deleteMembers(UA_ModifySubscriptionResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]); } static UA_INLINE void -UA_RegisterServer2Response_delete(UA_RegisterServer2Response *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]); +UA_ModifySubscriptionResponse_clear(UA_ModifySubscriptionResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]); } -/* AddNodesItem */ static UA_INLINE void -UA_AddNodesItem_init(UA_AddNodesItem *p) { - memset(p, 0, sizeof(UA_AddNodesItem)); +UA_ModifySubscriptionResponse_delete(UA_ModifySubscriptionResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]); } -static UA_INLINE UA_AddNodesItem * -UA_AddNodesItem_new(void) { - return (UA_AddNodesItem*)UA_new(&UA_TYPES[UA_TYPES_ADDNODESITEM]); +/* SetPublishingModeRequest */ +static UA_INLINE void +UA_SetPublishingModeRequest_init(UA_SetPublishingModeRequest *p) { + memset(p, 0, sizeof(UA_SetPublishingModeRequest)); +} + +static UA_INLINE UA_SetPublishingModeRequest * +UA_SetPublishingModeRequest_new(void) { + return (UA_SetPublishingModeRequest*)UA_new(&UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST]); } static UA_INLINE UA_StatusCode -UA_AddNodesItem_copy(const UA_AddNodesItem *src, UA_AddNodesItem *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDNODESITEM]); +UA_SetPublishingModeRequest_copy(const UA_SetPublishingModeRequest *src, UA_SetPublishingModeRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST]); } static UA_INLINE void -UA_AddNodesItem_deleteMembers(UA_AddNodesItem *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ADDNODESITEM]); +UA_SetPublishingModeRequest_deleteMembers(UA_SetPublishingModeRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST]); } static UA_INLINE void -UA_AddNodesItem_delete(UA_AddNodesItem *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ADDNODESITEM]); +UA_SetPublishingModeRequest_clear(UA_SetPublishingModeRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST]); +} + +static UA_INLINE void +UA_SetPublishingModeRequest_delete(UA_SetPublishingModeRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST]); } -/* NodeTypeDescription */ +/* SetPublishingModeResponse */ static UA_INLINE void -UA_NodeTypeDescription_init(UA_NodeTypeDescription *p) { - memset(p, 0, sizeof(UA_NodeTypeDescription)); +UA_SetPublishingModeResponse_init(UA_SetPublishingModeResponse *p) { + memset(p, 0, sizeof(UA_SetPublishingModeResponse)); } -static UA_INLINE UA_NodeTypeDescription * -UA_NodeTypeDescription_new(void) { - return (UA_NodeTypeDescription*)UA_new(&UA_TYPES[UA_TYPES_NODETYPEDESCRIPTION]); +static UA_INLINE UA_SetPublishingModeResponse * +UA_SetPublishingModeResponse_new(void) { + return (UA_SetPublishingModeResponse*)UA_new(&UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]); } static UA_INLINE UA_StatusCode -UA_NodeTypeDescription_copy(const UA_NodeTypeDescription *src, UA_NodeTypeDescription *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_NODETYPEDESCRIPTION]); +UA_SetPublishingModeResponse_copy(const UA_SetPublishingModeResponse *src, UA_SetPublishingModeResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]); } static UA_INLINE void -UA_NodeTypeDescription_deleteMembers(UA_NodeTypeDescription *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_NODETYPEDESCRIPTION]); +UA_SetPublishingModeResponse_deleteMembers(UA_SetPublishingModeResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]); } static UA_INLINE void -UA_NodeTypeDescription_delete(UA_NodeTypeDescription *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_NODETYPEDESCRIPTION]); +UA_SetPublishingModeResponse_clear(UA_SetPublishingModeResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]); } -/* ServerStatusDataType */ static UA_INLINE void -UA_ServerStatusDataType_init(UA_ServerStatusDataType *p) { - memset(p, 0, sizeof(UA_ServerStatusDataType)); +UA_SetPublishingModeResponse_delete(UA_SetPublishingModeResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]); } -static UA_INLINE UA_ServerStatusDataType * -UA_ServerStatusDataType_new(void) { - return (UA_ServerStatusDataType*)UA_new(&UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]); +/* NotificationMessage */ +static UA_INLINE void +UA_NotificationMessage_init(UA_NotificationMessage *p) { + memset(p, 0, sizeof(UA_NotificationMessage)); +} + +static UA_INLINE UA_NotificationMessage * +UA_NotificationMessage_new(void) { + return (UA_NotificationMessage*)UA_new(&UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE]); } static UA_INLINE UA_StatusCode -UA_ServerStatusDataType_copy(const UA_ServerStatusDataType *src, UA_ServerStatusDataType *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]); +UA_NotificationMessage_copy(const UA_NotificationMessage *src, UA_NotificationMessage *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE]); } static UA_INLINE void -UA_ServerStatusDataType_deleteMembers(UA_ServerStatusDataType *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]); +UA_NotificationMessage_deleteMembers(UA_NotificationMessage *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE]); } static UA_INLINE void -UA_ServerStatusDataType_delete(UA_ServerStatusDataType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]); +UA_NotificationMessage_clear(UA_NotificationMessage *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE]); } -/* AttributeOperand */ static UA_INLINE void -UA_AttributeOperand_init(UA_AttributeOperand *p) { - memset(p, 0, sizeof(UA_AttributeOperand)); +UA_NotificationMessage_delete(UA_NotificationMessage *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE]); } -static UA_INLINE UA_AttributeOperand * -UA_AttributeOperand_new(void) { - return (UA_AttributeOperand*)UA_new(&UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND]); +/* MonitoredItemNotification */ +static UA_INLINE void +UA_MonitoredItemNotification_init(UA_MonitoredItemNotification *p) { + memset(p, 0, sizeof(UA_MonitoredItemNotification)); +} + +static UA_INLINE UA_MonitoredItemNotification * +UA_MonitoredItemNotification_new(void) { + return (UA_MonitoredItemNotification*)UA_new(&UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]); } static UA_INLINE UA_StatusCode -UA_AttributeOperand_copy(const UA_AttributeOperand *src, UA_AttributeOperand *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND]); +UA_MonitoredItemNotification_copy(const UA_MonitoredItemNotification *src, UA_MonitoredItemNotification *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]); } static UA_INLINE void -UA_AttributeOperand_deleteMembers(UA_AttributeOperand *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND]); +UA_MonitoredItemNotification_deleteMembers(UA_MonitoredItemNotification *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]); } static UA_INLINE void -UA_AttributeOperand_delete(UA_AttributeOperand *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND]); +UA_MonitoredItemNotification_clear(UA_MonitoredItemNotification *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]); } -/* AddReferencesResponse */ static UA_INLINE void -UA_AddReferencesResponse_init(UA_AddReferencesResponse *p) { - memset(p, 0, sizeof(UA_AddReferencesResponse)); +UA_MonitoredItemNotification_delete(UA_MonitoredItemNotification *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]); } -static UA_INLINE UA_AddReferencesResponse * -UA_AddReferencesResponse_new(void) { - return (UA_AddReferencesResponse*)UA_new(&UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]); +/* EventFieldList */ +static UA_INLINE void +UA_EventFieldList_init(UA_EventFieldList *p) { + memset(p, 0, sizeof(UA_EventFieldList)); +} + +static UA_INLINE UA_EventFieldList * +UA_EventFieldList_new(void) { + return (UA_EventFieldList*)UA_new(&UA_TYPES[UA_TYPES_EVENTFIELDLIST]); } static UA_INLINE UA_StatusCode -UA_AddReferencesResponse_copy(const UA_AddReferencesResponse *src, UA_AddReferencesResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]); +UA_EventFieldList_copy(const UA_EventFieldList *src, UA_EventFieldList *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_EVENTFIELDLIST]); } static UA_INLINE void -UA_AddReferencesResponse_deleteMembers(UA_AddReferencesResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]); +UA_EventFieldList_deleteMembers(UA_EventFieldList *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_EVENTFIELDLIST]); } static UA_INLINE void -UA_AddReferencesResponse_delete(UA_AddReferencesResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]); +UA_EventFieldList_clear(UA_EventFieldList *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_EVENTFIELDLIST]); } -/* EventFilterResult */ static UA_INLINE void -UA_EventFilterResult_init(UA_EventFilterResult *p) { - memset(p, 0, sizeof(UA_EventFilterResult)); +UA_EventFieldList_delete(UA_EventFieldList *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_EVENTFIELDLIST]); } -static UA_INLINE UA_EventFilterResult * -UA_EventFilterResult_new(void) { - return (UA_EventFilterResult*)UA_new(&UA_TYPES[UA_TYPES_EVENTFILTERRESULT]); +/* StatusChangeNotification */ +static UA_INLINE void +UA_StatusChangeNotification_init(UA_StatusChangeNotification *p) { + memset(p, 0, sizeof(UA_StatusChangeNotification)); +} + +static UA_INLINE UA_StatusChangeNotification * +UA_StatusChangeNotification_new(void) { + return (UA_StatusChangeNotification*)UA_new(&UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]); } static UA_INLINE UA_StatusCode -UA_EventFilterResult_copy(const UA_EventFilterResult *src, UA_EventFilterResult *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT]); +UA_StatusChangeNotification_copy(const UA_StatusChangeNotification *src, UA_StatusChangeNotification *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]); } static UA_INLINE void -UA_EventFilterResult_deleteMembers(UA_EventFilterResult *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT]); +UA_StatusChangeNotification_deleteMembers(UA_StatusChangeNotification *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]); } static UA_INLINE void -UA_EventFilterResult_delete(UA_EventFilterResult *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT]); +UA_StatusChangeNotification_clear(UA_StatusChangeNotification *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]); } -/* TranslateBrowsePathsToNodeIdsResponse */ static UA_INLINE void -UA_TranslateBrowsePathsToNodeIdsResponse_init(UA_TranslateBrowsePathsToNodeIdsResponse *p) { - memset(p, 0, sizeof(UA_TranslateBrowsePathsToNodeIdsResponse)); +UA_StatusChangeNotification_delete(UA_StatusChangeNotification *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]); +} + +/* SubscriptionAcknowledgement */ +static UA_INLINE void +UA_SubscriptionAcknowledgement_init(UA_SubscriptionAcknowledgement *p) { + memset(p, 0, sizeof(UA_SubscriptionAcknowledgement)); +} + +static UA_INLINE UA_SubscriptionAcknowledgement * +UA_SubscriptionAcknowledgement_new(void) { + return (UA_SubscriptionAcknowledgement*)UA_new(&UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT]); } -static UA_INLINE UA_TranslateBrowsePathsToNodeIdsResponse * -UA_TranslateBrowsePathsToNodeIdsResponse_new(void) { - return (UA_TranslateBrowsePathsToNodeIdsResponse*)UA_new(&UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]); +static UA_INLINE UA_StatusCode +UA_SubscriptionAcknowledgement_copy(const UA_SubscriptionAcknowledgement *src, UA_SubscriptionAcknowledgement *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } -static UA_INLINE UA_StatusCode -UA_TranslateBrowsePathsToNodeIdsResponse_copy(const UA_TranslateBrowsePathsToNodeIdsResponse *src, UA_TranslateBrowsePathsToNodeIdsResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]); +static UA_INLINE void +UA_SubscriptionAcknowledgement_deleteMembers(UA_SubscriptionAcknowledgement *p) { + memset(p, 0, sizeof(UA_SubscriptionAcknowledgement)); } static UA_INLINE void -UA_TranslateBrowsePathsToNodeIdsResponse_deleteMembers(UA_TranslateBrowsePathsToNodeIdsResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]); +UA_SubscriptionAcknowledgement_clear(UA_SubscriptionAcknowledgement *p) { + memset(p, 0, sizeof(UA_SubscriptionAcknowledgement)); } static UA_INLINE void -UA_TranslateBrowsePathsToNodeIdsResponse_delete(UA_TranslateBrowsePathsToNodeIdsResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]); +UA_SubscriptionAcknowledgement_delete(UA_SubscriptionAcknowledgement *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT]); } -/* DataChangeFilter */ +/* PublishRequest */ static UA_INLINE void -UA_DataChangeFilter_init(UA_DataChangeFilter *p) { - memset(p, 0, sizeof(UA_DataChangeFilter)); +UA_PublishRequest_init(UA_PublishRequest *p) { + memset(p, 0, sizeof(UA_PublishRequest)); } -static UA_INLINE UA_DataChangeFilter * -UA_DataChangeFilter_new(void) { - return (UA_DataChangeFilter*)UA_new(&UA_TYPES[UA_TYPES_DATACHANGEFILTER]); +static UA_INLINE UA_PublishRequest * +UA_PublishRequest_new(void) { + return (UA_PublishRequest*)UA_new(&UA_TYPES[UA_TYPES_PUBLISHREQUEST]); } static UA_INLINE UA_StatusCode -UA_DataChangeFilter_copy(const UA_DataChangeFilter *src, UA_DataChangeFilter *dst) { - *dst = *src; - return UA_STATUSCODE_GOOD; +UA_PublishRequest_copy(const UA_PublishRequest *src, UA_PublishRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_PUBLISHREQUEST]); } static UA_INLINE void -UA_DataChangeFilter_deleteMembers(UA_DataChangeFilter *p) { } +UA_PublishRequest_deleteMembers(UA_PublishRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_PUBLISHREQUEST]); +} static UA_INLINE void -UA_DataChangeFilter_delete(UA_DataChangeFilter *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_DATACHANGEFILTER]); +UA_PublishRequest_clear(UA_PublishRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_PUBLISHREQUEST]); } -/* ContentFilterElement */ static UA_INLINE void -UA_ContentFilterElement_init(UA_ContentFilterElement *p) { - memset(p, 0, sizeof(UA_ContentFilterElement)); +UA_PublishRequest_delete(UA_PublishRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_PUBLISHREQUEST]); } -static UA_INLINE UA_ContentFilterElement * -UA_ContentFilterElement_new(void) { - return (UA_ContentFilterElement*)UA_new(&UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT]); +/* PublishResponse */ +static UA_INLINE void +UA_PublishResponse_init(UA_PublishResponse *p) { + memset(p, 0, sizeof(UA_PublishResponse)); +} + +static UA_INLINE UA_PublishResponse * +UA_PublishResponse_new(void) { + return (UA_PublishResponse*)UA_new(&UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); } static UA_INLINE UA_StatusCode -UA_ContentFilterElement_copy(const UA_ContentFilterElement *src, UA_ContentFilterElement *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT]); +UA_PublishResponse_copy(const UA_PublishResponse *src, UA_PublishResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); } static UA_INLINE void -UA_ContentFilterElement_deleteMembers(UA_ContentFilterElement *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT]); +UA_PublishResponse_deleteMembers(UA_PublishResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); } static UA_INLINE void -UA_ContentFilterElement_delete(UA_ContentFilterElement *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT]); +UA_PublishResponse_clear(UA_PublishResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); } -/* TranslateBrowsePathsToNodeIdsRequest */ static UA_INLINE void -UA_TranslateBrowsePathsToNodeIdsRequest_init(UA_TranslateBrowsePathsToNodeIdsRequest *p) { - memset(p, 0, sizeof(UA_TranslateBrowsePathsToNodeIdsRequest)); +UA_PublishResponse_delete(UA_PublishResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); } -static UA_INLINE UA_TranslateBrowsePathsToNodeIdsRequest * -UA_TranslateBrowsePathsToNodeIdsRequest_new(void) { - return (UA_TranslateBrowsePathsToNodeIdsRequest*)UA_new(&UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST]); +/* RepublishRequest */ +static UA_INLINE void +UA_RepublishRequest_init(UA_RepublishRequest *p) { + memset(p, 0, sizeof(UA_RepublishRequest)); +} + +static UA_INLINE UA_RepublishRequest * +UA_RepublishRequest_new(void) { + return (UA_RepublishRequest*)UA_new(&UA_TYPES[UA_TYPES_REPUBLISHREQUEST]); } static UA_INLINE UA_StatusCode -UA_TranslateBrowsePathsToNodeIdsRequest_copy(const UA_TranslateBrowsePathsToNodeIdsRequest *src, UA_TranslateBrowsePathsToNodeIdsRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST]); +UA_RepublishRequest_copy(const UA_RepublishRequest *src, UA_RepublishRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST]); } static UA_INLINE void -UA_TranslateBrowsePathsToNodeIdsRequest_deleteMembers(UA_TranslateBrowsePathsToNodeIdsRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST]); +UA_RepublishRequest_deleteMembers(UA_RepublishRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST]); } static UA_INLINE void -UA_TranslateBrowsePathsToNodeIdsRequest_delete(UA_TranslateBrowsePathsToNodeIdsRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST]); +UA_RepublishRequest_clear(UA_RepublishRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST]); } -/* CloseSessionResponse */ static UA_INLINE void -UA_CloseSessionResponse_init(UA_CloseSessionResponse *p) { - memset(p, 0, sizeof(UA_CloseSessionResponse)); +UA_RepublishRequest_delete(UA_RepublishRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST]); } -static UA_INLINE UA_CloseSessionResponse * -UA_CloseSessionResponse_new(void) { - return (UA_CloseSessionResponse*)UA_new(&UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]); +/* RepublishResponse */ +static UA_INLINE void +UA_RepublishResponse_init(UA_RepublishResponse *p) { + memset(p, 0, sizeof(UA_RepublishResponse)); +} + +static UA_INLINE UA_RepublishResponse * +UA_RepublishResponse_new(void) { + return (UA_RepublishResponse*)UA_new(&UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]); } static UA_INLINE UA_StatusCode -UA_CloseSessionResponse_copy(const UA_CloseSessionResponse *src, UA_CloseSessionResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]); +UA_RepublishResponse_copy(const UA_RepublishResponse *src, UA_RepublishResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]); } static UA_INLINE void -UA_CloseSessionResponse_deleteMembers(UA_CloseSessionResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]); +UA_RepublishResponse_deleteMembers(UA_RepublishResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]); } static UA_INLINE void -UA_CloseSessionResponse_delete(UA_CloseSessionResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]); +UA_RepublishResponse_clear(UA_RepublishResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]); } -/* ApplicationDescription */ static UA_INLINE void -UA_ApplicationDescription_init(UA_ApplicationDescription *p) { - memset(p, 0, sizeof(UA_ApplicationDescription)); +UA_RepublishResponse_delete(UA_RepublishResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]); } -static UA_INLINE UA_ApplicationDescription * -UA_ApplicationDescription_new(void) { - return (UA_ApplicationDescription*)UA_new(&UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]); +/* DeleteSubscriptionsRequest */ +static UA_INLINE void +UA_DeleteSubscriptionsRequest_init(UA_DeleteSubscriptionsRequest *p) { + memset(p, 0, sizeof(UA_DeleteSubscriptionsRequest)); +} + +static UA_INLINE UA_DeleteSubscriptionsRequest * +UA_DeleteSubscriptionsRequest_new(void) { + return (UA_DeleteSubscriptionsRequest*)UA_new(&UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST]); } static UA_INLINE UA_StatusCode -UA_ApplicationDescription_copy(const UA_ApplicationDescription *src, UA_ApplicationDescription *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]); +UA_DeleteSubscriptionsRequest_copy(const UA_DeleteSubscriptionsRequest *src, UA_DeleteSubscriptionsRequest *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST]); } static UA_INLINE void -UA_ApplicationDescription_deleteMembers(UA_ApplicationDescription *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]); +UA_DeleteSubscriptionsRequest_deleteMembers(UA_DeleteSubscriptionsRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST]); } static UA_INLINE void -UA_ApplicationDescription_delete(UA_ApplicationDescription *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]); +UA_DeleteSubscriptionsRequest_clear(UA_DeleteSubscriptionsRequest *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST]); +} + +static UA_INLINE void +UA_DeleteSubscriptionsRequest_delete(UA_DeleteSubscriptionsRequest *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST]); } -/* SessionDiagnosticsDataType */ +/* DeleteSubscriptionsResponse */ static UA_INLINE void -UA_SessionDiagnosticsDataType_init(UA_SessionDiagnosticsDataType *p) { - memset(p, 0, sizeof(UA_SessionDiagnosticsDataType)); +UA_DeleteSubscriptionsResponse_init(UA_DeleteSubscriptionsResponse *p) { + memset(p, 0, sizeof(UA_DeleteSubscriptionsResponse)); } -static UA_INLINE UA_SessionDiagnosticsDataType * -UA_SessionDiagnosticsDataType_new(void) { - return (UA_SessionDiagnosticsDataType*)UA_new(&UA_TYPES[UA_TYPES_SESSIONDIAGNOSTICSDATATYPE]); +static UA_INLINE UA_DeleteSubscriptionsResponse * +UA_DeleteSubscriptionsResponse_new(void) { + return (UA_DeleteSubscriptionsResponse*)UA_new(&UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]); } static UA_INLINE UA_StatusCode -UA_SessionDiagnosticsDataType_copy(const UA_SessionDiagnosticsDataType *src, UA_SessionDiagnosticsDataType *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SESSIONDIAGNOSTICSDATATYPE]); +UA_DeleteSubscriptionsResponse_copy(const UA_DeleteSubscriptionsResponse *src, UA_DeleteSubscriptionsResponse *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]); } static UA_INLINE void -UA_SessionDiagnosticsDataType_deleteMembers(UA_SessionDiagnosticsDataType *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SESSIONDIAGNOSTICSDATATYPE]); +UA_DeleteSubscriptionsResponse_deleteMembers(UA_DeleteSubscriptionsResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]); } static UA_INLINE void -UA_SessionDiagnosticsDataType_delete(UA_SessionDiagnosticsDataType *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SESSIONDIAGNOSTICSDATATYPE]); +UA_DeleteSubscriptionsResponse_clear(UA_DeleteSubscriptionsResponse *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]); } -/* ServiceFault */ static UA_INLINE void -UA_ServiceFault_init(UA_ServiceFault *p) { - memset(p, 0, sizeof(UA_ServiceFault)); +UA_DeleteSubscriptionsResponse_delete(UA_DeleteSubscriptionsResponse *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]); } -static UA_INLINE UA_ServiceFault * -UA_ServiceFault_new(void) { - return (UA_ServiceFault*)UA_new(&UA_TYPES[UA_TYPES_SERVICEFAULT]); +/* BuildInfo */ +static UA_INLINE void +UA_BuildInfo_init(UA_BuildInfo *p) { + memset(p, 0, sizeof(UA_BuildInfo)); +} + +static UA_INLINE UA_BuildInfo * +UA_BuildInfo_new(void) { + return (UA_BuildInfo*)UA_new(&UA_TYPES[UA_TYPES_BUILDINFO]); } static UA_INLINE UA_StatusCode -UA_ServiceFault_copy(const UA_ServiceFault *src, UA_ServiceFault *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SERVICEFAULT]); +UA_BuildInfo_copy(const UA_BuildInfo *src, UA_BuildInfo *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BUILDINFO]); } static UA_INLINE void -UA_ServiceFault_deleteMembers(UA_ServiceFault *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_SERVICEFAULT]); +UA_BuildInfo_deleteMembers(UA_BuildInfo *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BUILDINFO]); } static UA_INLINE void -UA_ServiceFault_delete(UA_ServiceFault *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_SERVICEFAULT]); +UA_BuildInfo_clear(UA_BuildInfo *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_BUILDINFO]); } -/* RegisteredServer */ static UA_INLINE void -UA_RegisteredServer_init(UA_RegisteredServer *p) { - memset(p, 0, sizeof(UA_RegisteredServer)); +UA_BuildInfo_delete(UA_BuildInfo *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_BUILDINFO]); } -static UA_INLINE UA_RegisteredServer * -UA_RegisteredServer_new(void) { - return (UA_RegisteredServer*)UA_new(&UA_TYPES[UA_TYPES_REGISTEREDSERVER]); +/* RedundancySupport */ +static UA_INLINE void +UA_RedundancySupport_init(UA_RedundancySupport *p) { + memset(p, 0, sizeof(UA_RedundancySupport)); +} + +static UA_INLINE UA_RedundancySupport * +UA_RedundancySupport_new(void) { + return (UA_RedundancySupport*)UA_new(&UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT]); } static UA_INLINE UA_StatusCode -UA_RegisteredServer_copy(const UA_RegisteredServer *src, UA_RegisteredServer *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTEREDSERVER]); +UA_RedundancySupport_copy(const UA_RedundancySupport *src, UA_RedundancySupport *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_RegisteredServer_deleteMembers(UA_RegisteredServer *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REGISTEREDSERVER]); +UA_RedundancySupport_deleteMembers(UA_RedundancySupport *p) { + memset(p, 0, sizeof(UA_RedundancySupport)); } static UA_INLINE void -UA_RegisteredServer_delete(UA_RegisteredServer *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REGISTEREDSERVER]); +UA_RedundancySupport_clear(UA_RedundancySupport *p) { + memset(p, 0, sizeof(UA_RedundancySupport)); } -/* AggregateFilter */ static UA_INLINE void -UA_AggregateFilter_init(UA_AggregateFilter *p) { - memset(p, 0, sizeof(UA_AggregateFilter)); +UA_RedundancySupport_delete(UA_RedundancySupport *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT]); } -static UA_INLINE UA_AggregateFilter * -UA_AggregateFilter_new(void) { - return (UA_AggregateFilter*)UA_new(&UA_TYPES[UA_TYPES_AGGREGATEFILTER]); +/* ServerState */ +static UA_INLINE void +UA_ServerState_init(UA_ServerState *p) { + memset(p, 0, sizeof(UA_ServerState)); +} + +static UA_INLINE UA_ServerState * +UA_ServerState_new(void) { + return (UA_ServerState*)UA_new(&UA_TYPES[UA_TYPES_SERVERSTATE]); } static UA_INLINE UA_StatusCode -UA_AggregateFilter_copy(const UA_AggregateFilter *src, UA_AggregateFilter *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_AGGREGATEFILTER]); +UA_ServerState_copy(const UA_ServerState *src, UA_ServerState *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_AggregateFilter_deleteMembers(UA_AggregateFilter *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_AGGREGATEFILTER]); +UA_ServerState_deleteMembers(UA_ServerState *p) { + memset(p, 0, sizeof(UA_ServerState)); } static UA_INLINE void -UA_AggregateFilter_delete(UA_AggregateFilter *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_AGGREGATEFILTER]); +UA_ServerState_clear(UA_ServerState *p) { + memset(p, 0, sizeof(UA_ServerState)); } -/* RegisterServerRequest */ static UA_INLINE void -UA_RegisterServerRequest_init(UA_RegisterServerRequest *p) { - memset(p, 0, sizeof(UA_RegisterServerRequest)); +UA_ServerState_delete(UA_ServerState *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SERVERSTATE]); } -static UA_INLINE UA_RegisterServerRequest * -UA_RegisterServerRequest_new(void) { - return (UA_RegisterServerRequest*)UA_new(&UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST]); +/* ServerDiagnosticsSummaryDataType */ +static UA_INLINE void +UA_ServerDiagnosticsSummaryDataType_init(UA_ServerDiagnosticsSummaryDataType *p) { + memset(p, 0, sizeof(UA_ServerDiagnosticsSummaryDataType)); +} + +static UA_INLINE UA_ServerDiagnosticsSummaryDataType * +UA_ServerDiagnosticsSummaryDataType_new(void) { + return (UA_ServerDiagnosticsSummaryDataType*)UA_new(&UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE]); } static UA_INLINE UA_StatusCode -UA_RegisterServerRequest_copy(const UA_RegisterServerRequest *src, UA_RegisterServerRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST]); +UA_ServerDiagnosticsSummaryDataType_copy(const UA_ServerDiagnosticsSummaryDataType *src, UA_ServerDiagnosticsSummaryDataType *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; +} + +static UA_INLINE void +UA_ServerDiagnosticsSummaryDataType_deleteMembers(UA_ServerDiagnosticsSummaryDataType *p) { + memset(p, 0, sizeof(UA_ServerDiagnosticsSummaryDataType)); } static UA_INLINE void -UA_RegisterServerRequest_deleteMembers(UA_RegisterServerRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST]); +UA_ServerDiagnosticsSummaryDataType_clear(UA_ServerDiagnosticsSummaryDataType *p) { + memset(p, 0, sizeof(UA_ServerDiagnosticsSummaryDataType)); } static UA_INLINE void -UA_RegisterServerRequest_delete(UA_RegisterServerRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST]); +UA_ServerDiagnosticsSummaryDataType_delete(UA_ServerDiagnosticsSummaryDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE]); } -/* EndpointDescription */ +/* ServerStatusDataType */ static UA_INLINE void -UA_EndpointDescription_init(UA_EndpointDescription *p) { - memset(p, 0, sizeof(UA_EndpointDescription)); +UA_ServerStatusDataType_init(UA_ServerStatusDataType *p) { + memset(p, 0, sizeof(UA_ServerStatusDataType)); } -static UA_INLINE UA_EndpointDescription * -UA_EndpointDescription_new(void) { - return (UA_EndpointDescription*)UA_new(&UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); +static UA_INLINE UA_ServerStatusDataType * +UA_ServerStatusDataType_new(void) { + return (UA_ServerStatusDataType*)UA_new(&UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]); } static UA_INLINE UA_StatusCode -UA_EndpointDescription_copy(const UA_EndpointDescription *src, UA_EndpointDescription *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); +UA_ServerStatusDataType_copy(const UA_ServerStatusDataType *src, UA_ServerStatusDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]); } static UA_INLINE void -UA_EndpointDescription_deleteMembers(UA_EndpointDescription *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); +UA_ServerStatusDataType_deleteMembers(UA_ServerStatusDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]); } static UA_INLINE void -UA_EndpointDescription_delete(UA_EndpointDescription *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); +UA_ServerStatusDataType_clear(UA_ServerStatusDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]); } -/* CreateMonitoredItemsRequest */ static UA_INLINE void -UA_CreateMonitoredItemsRequest_init(UA_CreateMonitoredItemsRequest *p) { - memset(p, 0, sizeof(UA_CreateMonitoredItemsRequest)); +UA_ServerStatusDataType_delete(UA_ServerStatusDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]); } -static UA_INLINE UA_CreateMonitoredItemsRequest * -UA_CreateMonitoredItemsRequest_new(void) { - return (UA_CreateMonitoredItemsRequest*)UA_new(&UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST]); +/* Range */ +static UA_INLINE void +UA_Range_init(UA_Range *p) { + memset(p, 0, sizeof(UA_Range)); +} + +static UA_INLINE UA_Range * +UA_Range_new(void) { + return (UA_Range*)UA_new(&UA_TYPES[UA_TYPES_RANGE]); } static UA_INLINE UA_StatusCode -UA_CreateMonitoredItemsRequest_copy(const UA_CreateMonitoredItemsRequest *src, UA_CreateMonitoredItemsRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST]); +UA_Range_copy(const UA_Range *src, UA_Range *dst) { + *dst = *src; + return UA_STATUSCODE_GOOD; } static UA_INLINE void -UA_CreateMonitoredItemsRequest_deleteMembers(UA_CreateMonitoredItemsRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST]); +UA_Range_deleteMembers(UA_Range *p) { + memset(p, 0, sizeof(UA_Range)); } static UA_INLINE void -UA_CreateMonitoredItemsRequest_delete(UA_CreateMonitoredItemsRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST]); +UA_Range_clear(UA_Range *p) { + memset(p, 0, sizeof(UA_Range)); } -/* ContentFilter */ static UA_INLINE void -UA_ContentFilter_init(UA_ContentFilter *p) { - memset(p, 0, sizeof(UA_ContentFilter)); +UA_Range_delete(UA_Range *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_RANGE]); } -static UA_INLINE UA_ContentFilter * -UA_ContentFilter_new(void) { - return (UA_ContentFilter*)UA_new(&UA_TYPES[UA_TYPES_CONTENTFILTER]); +/* StructureDescription */ +static UA_INLINE void +UA_StructureDescription_init(UA_StructureDescription *p) { + memset(p, 0, sizeof(UA_StructureDescription)); +} + +static UA_INLINE UA_StructureDescription * +UA_StructureDescription_new(void) { + return (UA_StructureDescription*)UA_new(&UA_TYPES[UA_TYPES_STRUCTUREDESCRIPTION]); } static UA_INLINE UA_StatusCode -UA_ContentFilter_copy(const UA_ContentFilter *src, UA_ContentFilter *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CONTENTFILTER]); +UA_StructureDescription_copy(const UA_StructureDescription *src, UA_StructureDescription *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_STRUCTUREDESCRIPTION]); } static UA_INLINE void -UA_ContentFilter_deleteMembers(UA_ContentFilter *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CONTENTFILTER]); +UA_StructureDescription_deleteMembers(UA_StructureDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_STRUCTUREDESCRIPTION]); } static UA_INLINE void -UA_ContentFilter_delete(UA_ContentFilter *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CONTENTFILTER]); +UA_StructureDescription_clear(UA_StructureDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_STRUCTUREDESCRIPTION]); } -/* QueryFirstResponse */ static UA_INLINE void -UA_QueryFirstResponse_init(UA_QueryFirstResponse *p) { - memset(p, 0, sizeof(UA_QueryFirstResponse)); +UA_StructureDescription_delete(UA_StructureDescription *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_STRUCTUREDESCRIPTION]); } -static UA_INLINE UA_QueryFirstResponse * -UA_QueryFirstResponse_new(void) { - return (UA_QueryFirstResponse*)UA_new(&UA_TYPES[UA_TYPES_QUERYFIRSTRESPONSE]); +/* FieldMetaData */ +static UA_INLINE void +UA_FieldMetaData_init(UA_FieldMetaData *p) { + memset(p, 0, sizeof(UA_FieldMetaData)); +} + +static UA_INLINE UA_FieldMetaData * +UA_FieldMetaData_new(void) { + return (UA_FieldMetaData*)UA_new(&UA_TYPES[UA_TYPES_FIELDMETADATA]); } static UA_INLINE UA_StatusCode -UA_QueryFirstResponse_copy(const UA_QueryFirstResponse *src, UA_QueryFirstResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_QUERYFIRSTRESPONSE]); +UA_FieldMetaData_copy(const UA_FieldMetaData *src, UA_FieldMetaData *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_FIELDMETADATA]); } static UA_INLINE void -UA_QueryFirstResponse_deleteMembers(UA_QueryFirstResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_QUERYFIRSTRESPONSE]); +UA_FieldMetaData_deleteMembers(UA_FieldMetaData *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_FIELDMETADATA]); } static UA_INLINE void -UA_QueryFirstResponse_delete(UA_QueryFirstResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_QUERYFIRSTRESPONSE]); +UA_FieldMetaData_clear(UA_FieldMetaData *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_FIELDMETADATA]); } -/* AddNodesRequest */ static UA_INLINE void -UA_AddNodesRequest_init(UA_AddNodesRequest *p) { - memset(p, 0, sizeof(UA_AddNodesRequest)); +UA_FieldMetaData_delete(UA_FieldMetaData *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_FIELDMETADATA]); } -static UA_INLINE UA_AddNodesRequest * -UA_AddNodesRequest_new(void) { - return (UA_AddNodesRequest*)UA_new(&UA_TYPES[UA_TYPES_ADDNODESREQUEST]); +/* WriterGroupDataType */ +static UA_INLINE void +UA_WriterGroupDataType_init(UA_WriterGroupDataType *p) { + memset(p, 0, sizeof(UA_WriterGroupDataType)); +} + +static UA_INLINE UA_WriterGroupDataType * +UA_WriterGroupDataType_new(void) { + return (UA_WriterGroupDataType*)UA_new(&UA_TYPES[UA_TYPES_WRITERGROUPDATATYPE]); } static UA_INLINE UA_StatusCode -UA_AddNodesRequest_copy(const UA_AddNodesRequest *src, UA_AddNodesRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ADDNODESREQUEST]); +UA_WriterGroupDataType_copy(const UA_WriterGroupDataType *src, UA_WriterGroupDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_WRITERGROUPDATATYPE]); } static UA_INLINE void -UA_AddNodesRequest_deleteMembers(UA_AddNodesRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_ADDNODESREQUEST]); +UA_WriterGroupDataType_deleteMembers(UA_WriterGroupDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_WRITERGROUPDATATYPE]); } static UA_INLINE void -UA_AddNodesRequest_delete(UA_AddNodesRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_ADDNODESREQUEST]); +UA_WriterGroupDataType_clear(UA_WriterGroupDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_WRITERGROUPDATATYPE]); } -/* BrowseRequest */ static UA_INLINE void -UA_BrowseRequest_init(UA_BrowseRequest *p) { - memset(p, 0, sizeof(UA_BrowseRequest)); +UA_WriterGroupDataType_delete(UA_WriterGroupDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_WRITERGROUPDATATYPE]); } -static UA_INLINE UA_BrowseRequest * -UA_BrowseRequest_new(void) { - return (UA_BrowseRequest*)UA_new(&UA_TYPES[UA_TYPES_BROWSEREQUEST]); +/* FieldTargetDataType */ +static UA_INLINE void +UA_FieldTargetDataType_init(UA_FieldTargetDataType *p) { + memset(p, 0, sizeof(UA_FieldTargetDataType)); +} + +static UA_INLINE UA_FieldTargetDataType * +UA_FieldTargetDataType_new(void) { + return (UA_FieldTargetDataType*)UA_new(&UA_TYPES[UA_TYPES_FIELDTARGETDATATYPE]); } static UA_INLINE UA_StatusCode -UA_BrowseRequest_copy(const UA_BrowseRequest *src, UA_BrowseRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSEREQUEST]); +UA_FieldTargetDataType_copy(const UA_FieldTargetDataType *src, UA_FieldTargetDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_FIELDTARGETDATATYPE]); } static UA_INLINE void -UA_BrowseRequest_deleteMembers(UA_BrowseRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_BROWSEREQUEST]); +UA_FieldTargetDataType_deleteMembers(UA_FieldTargetDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_FIELDTARGETDATATYPE]); } static UA_INLINE void -UA_BrowseRequest_delete(UA_BrowseRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BROWSEREQUEST]); +UA_FieldTargetDataType_clear(UA_FieldTargetDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_FIELDTARGETDATATYPE]); } -/* BrowseResult */ static UA_INLINE void -UA_BrowseResult_init(UA_BrowseResult *p) { - memset(p, 0, sizeof(UA_BrowseResult)); +UA_FieldTargetDataType_delete(UA_FieldTargetDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_FIELDTARGETDATATYPE]); } -static UA_INLINE UA_BrowseResult * -UA_BrowseResult_new(void) { - return (UA_BrowseResult*)UA_new(&UA_TYPES[UA_TYPES_BROWSERESULT]); +/* EnumDefinition */ +static UA_INLINE void +UA_EnumDefinition_init(UA_EnumDefinition *p) { + memset(p, 0, sizeof(UA_EnumDefinition)); +} + +static UA_INLINE UA_EnumDefinition * +UA_EnumDefinition_new(void) { + return (UA_EnumDefinition*)UA_new(&UA_TYPES[UA_TYPES_ENUMDEFINITION]); } static UA_INLINE UA_StatusCode -UA_BrowseResult_copy(const UA_BrowseResult *src, UA_BrowseResult *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSERESULT]); +UA_EnumDefinition_copy(const UA_EnumDefinition *src, UA_EnumDefinition *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ENUMDEFINITION]); } static UA_INLINE void -UA_BrowseResult_deleteMembers(UA_BrowseResult *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_BROWSERESULT]); +UA_EnumDefinition_deleteMembers(UA_EnumDefinition *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ENUMDEFINITION]); } static UA_INLINE void -UA_BrowseResult_delete(UA_BrowseResult *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BROWSERESULT]); +UA_EnumDefinition_clear(UA_EnumDefinition *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ENUMDEFINITION]); } -/* RegisterServer2Request */ static UA_INLINE void -UA_RegisterServer2Request_init(UA_RegisterServer2Request *p) { - memset(p, 0, sizeof(UA_RegisterServer2Request)); +UA_EnumDefinition_delete(UA_EnumDefinition *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ENUMDEFINITION]); } -static UA_INLINE UA_RegisterServer2Request * -UA_RegisterServer2Request_new(void) { - return (UA_RegisterServer2Request*)UA_new(&UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST]); +/* DataChangeNotification */ +static UA_INLINE void +UA_DataChangeNotification_init(UA_DataChangeNotification *p) { + memset(p, 0, sizeof(UA_DataChangeNotification)); +} + +static UA_INLINE UA_DataChangeNotification * +UA_DataChangeNotification_new(void) { + return (UA_DataChangeNotification*)UA_new(&UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]); } static UA_INLINE UA_StatusCode -UA_RegisterServer2Request_copy(const UA_RegisterServer2Request *src, UA_RegisterServer2Request *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST]); +UA_DataChangeNotification_copy(const UA_DataChangeNotification *src, UA_DataChangeNotification *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]); } static UA_INLINE void -UA_RegisterServer2Request_deleteMembers(UA_RegisterServer2Request *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST]); +UA_DataChangeNotification_deleteMembers(UA_DataChangeNotification *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]); } static UA_INLINE void -UA_RegisterServer2Request_delete(UA_RegisterServer2Request *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST]); +UA_DataChangeNotification_clear(UA_DataChangeNotification *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]); } -/* CreateSessionRequest */ static UA_INLINE void -UA_CreateSessionRequest_init(UA_CreateSessionRequest *p) { - memset(p, 0, sizeof(UA_CreateSessionRequest)); +UA_DataChangeNotification_delete(UA_DataChangeNotification *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]); } -static UA_INLINE UA_CreateSessionRequest * -UA_CreateSessionRequest_new(void) { - return (UA_CreateSessionRequest*)UA_new(&UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]); +/* EventNotificationList */ +static UA_INLINE void +UA_EventNotificationList_init(UA_EventNotificationList *p) { + memset(p, 0, sizeof(UA_EventNotificationList)); +} + +static UA_INLINE UA_EventNotificationList * +UA_EventNotificationList_new(void) { + return (UA_EventNotificationList*)UA_new(&UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]); } static UA_INLINE UA_StatusCode -UA_CreateSessionRequest_copy(const UA_CreateSessionRequest *src, UA_CreateSessionRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]); +UA_EventNotificationList_copy(const UA_EventNotificationList *src, UA_EventNotificationList *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]); } static UA_INLINE void -UA_CreateSessionRequest_deleteMembers(UA_CreateSessionRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]); +UA_EventNotificationList_deleteMembers(UA_EventNotificationList *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]); } static UA_INLINE void -UA_CreateSessionRequest_delete(UA_CreateSessionRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]); +UA_EventNotificationList_clear(UA_EventNotificationList *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]); } -/* EventFilter */ static UA_INLINE void -UA_EventFilter_init(UA_EventFilter *p) { - memset(p, 0, sizeof(UA_EventFilter)); +UA_EventNotificationList_delete(UA_EventNotificationList *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]); } -static UA_INLINE UA_EventFilter * -UA_EventFilter_new(void) { - return (UA_EventFilter*)UA_new(&UA_TYPES[UA_TYPES_EVENTFILTER]); +/* EnumDescription */ +static UA_INLINE void +UA_EnumDescription_init(UA_EnumDescription *p) { + memset(p, 0, sizeof(UA_EnumDescription)); +} + +static UA_INLINE UA_EnumDescription * +UA_EnumDescription_new(void) { + return (UA_EnumDescription*)UA_new(&UA_TYPES[UA_TYPES_ENUMDESCRIPTION]); } static UA_INLINE UA_StatusCode -UA_EventFilter_copy(const UA_EventFilter *src, UA_EventFilter *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_EVENTFILTER]); +UA_EnumDescription_copy(const UA_EnumDescription *src, UA_EnumDescription *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_ENUMDESCRIPTION]); } static UA_INLINE void -UA_EventFilter_deleteMembers(UA_EventFilter *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_EVENTFILTER]); +UA_EnumDescription_deleteMembers(UA_EnumDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ENUMDESCRIPTION]); } static UA_INLINE void -UA_EventFilter_delete(UA_EventFilter *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_EVENTFILTER]); +UA_EnumDescription_clear(UA_EnumDescription *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_ENUMDESCRIPTION]); } -/* GetEndpointsResponse */ static UA_INLINE void -UA_GetEndpointsResponse_init(UA_GetEndpointsResponse *p) { - memset(p, 0, sizeof(UA_GetEndpointsResponse)); +UA_EnumDescription_delete(UA_EnumDescription *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_ENUMDESCRIPTION]); } -static UA_INLINE UA_GetEndpointsResponse * -UA_GetEndpointsResponse_new(void) { - return (UA_GetEndpointsResponse*)UA_new(&UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]); +/* DataSetMetaDataType */ +static UA_INLINE void +UA_DataSetMetaDataType_init(UA_DataSetMetaDataType *p) { + memset(p, 0, sizeof(UA_DataSetMetaDataType)); +} + +static UA_INLINE UA_DataSetMetaDataType * +UA_DataSetMetaDataType_new(void) { + return (UA_DataSetMetaDataType*)UA_new(&UA_TYPES[UA_TYPES_DATASETMETADATATYPE]); } static UA_INLINE UA_StatusCode -UA_GetEndpointsResponse_copy(const UA_GetEndpointsResponse *src, UA_GetEndpointsResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]); +UA_DataSetMetaDataType_copy(const UA_DataSetMetaDataType *src, UA_DataSetMetaDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DATASETMETADATATYPE]); } static UA_INLINE void -UA_GetEndpointsResponse_deleteMembers(UA_GetEndpointsResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]); +UA_DataSetMetaDataType_deleteMembers(UA_DataSetMetaDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DATASETMETADATATYPE]); } static UA_INLINE void -UA_GetEndpointsResponse_delete(UA_GetEndpointsResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]); +UA_DataSetMetaDataType_clear(UA_DataSetMetaDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DATASETMETADATATYPE]); } -/* FindServersResponse */ static UA_INLINE void -UA_FindServersResponse_init(UA_FindServersResponse *p) { - memset(p, 0, sizeof(UA_FindServersResponse)); +UA_DataSetMetaDataType_delete(UA_DataSetMetaDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DATASETMETADATATYPE]); } -static UA_INLINE UA_FindServersResponse * -UA_FindServersResponse_new(void) { - return (UA_FindServersResponse*)UA_new(&UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); +/* DataSetReaderDataType */ +static UA_INLINE void +UA_DataSetReaderDataType_init(UA_DataSetReaderDataType *p) { + memset(p, 0, sizeof(UA_DataSetReaderDataType)); +} + +static UA_INLINE UA_DataSetReaderDataType * +UA_DataSetReaderDataType_new(void) { + return (UA_DataSetReaderDataType*)UA_new(&UA_TYPES[UA_TYPES_DATASETREADERDATATYPE]); } static UA_INLINE UA_StatusCode -UA_FindServersResponse_copy(const UA_FindServersResponse *src, UA_FindServersResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); +UA_DataSetReaderDataType_copy(const UA_DataSetReaderDataType *src, UA_DataSetReaderDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_DATASETREADERDATATYPE]); } static UA_INLINE void -UA_FindServersResponse_deleteMembers(UA_FindServersResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); +UA_DataSetReaderDataType_deleteMembers(UA_DataSetReaderDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DATASETREADERDATATYPE]); } static UA_INLINE void -UA_FindServersResponse_delete(UA_FindServersResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); +UA_DataSetReaderDataType_clear(UA_DataSetReaderDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_DATASETREADERDATATYPE]); } -/* BrowseNextResponse */ static UA_INLINE void -UA_BrowseNextResponse_init(UA_BrowseNextResponse *p) { - memset(p, 0, sizeof(UA_BrowseNextResponse)); +UA_DataSetReaderDataType_delete(UA_DataSetReaderDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_DATASETREADERDATATYPE]); } -static UA_INLINE UA_BrowseNextResponse * -UA_BrowseNextResponse_new(void) { - return (UA_BrowseNextResponse*)UA_new(&UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]); +/* TargetVariablesDataType */ +static UA_INLINE void +UA_TargetVariablesDataType_init(UA_TargetVariablesDataType *p) { + memset(p, 0, sizeof(UA_TargetVariablesDataType)); +} + +static UA_INLINE UA_TargetVariablesDataType * +UA_TargetVariablesDataType_new(void) { + return (UA_TargetVariablesDataType*)UA_new(&UA_TYPES[UA_TYPES_TARGETVARIABLESDATATYPE]); } static UA_INLINE UA_StatusCode -UA_BrowseNextResponse_copy(const UA_BrowseNextResponse *src, UA_BrowseNextResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]); +UA_TargetVariablesDataType_copy(const UA_TargetVariablesDataType *src, UA_TargetVariablesDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_TARGETVARIABLESDATATYPE]); } static UA_INLINE void -UA_BrowseNextResponse_deleteMembers(UA_BrowseNextResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]); +UA_TargetVariablesDataType_deleteMembers(UA_TargetVariablesDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_TARGETVARIABLESDATATYPE]); } static UA_INLINE void -UA_BrowseNextResponse_delete(UA_BrowseNextResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]); +UA_TargetVariablesDataType_clear(UA_TargetVariablesDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_TARGETVARIABLESDATATYPE]); } -/* BrowseResponse */ static UA_INLINE void -UA_BrowseResponse_init(UA_BrowseResponse *p) { - memset(p, 0, sizeof(UA_BrowseResponse)); +UA_TargetVariablesDataType_delete(UA_TargetVariablesDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_TARGETVARIABLESDATATYPE]); } -static UA_INLINE UA_BrowseResponse * -UA_BrowseResponse_new(void) { - return (UA_BrowseResponse*)UA_new(&UA_TYPES[UA_TYPES_BROWSERESPONSE]); +/* ReaderGroupDataType */ +static UA_INLINE void +UA_ReaderGroupDataType_init(UA_ReaderGroupDataType *p) { + memset(p, 0, sizeof(UA_ReaderGroupDataType)); +} + +static UA_INLINE UA_ReaderGroupDataType * +UA_ReaderGroupDataType_new(void) { + return (UA_ReaderGroupDataType*)UA_new(&UA_TYPES[UA_TYPES_READERGROUPDATATYPE]); } static UA_INLINE UA_StatusCode -UA_BrowseResponse_copy(const UA_BrowseResponse *src, UA_BrowseResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_BROWSERESPONSE]); +UA_ReaderGroupDataType_copy(const UA_ReaderGroupDataType *src, UA_ReaderGroupDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_READERGROUPDATATYPE]); } static UA_INLINE void -UA_BrowseResponse_deleteMembers(UA_BrowseResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_BROWSERESPONSE]); +UA_ReaderGroupDataType_deleteMembers(UA_ReaderGroupDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_READERGROUPDATATYPE]); } static UA_INLINE void -UA_BrowseResponse_delete(UA_BrowseResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_BROWSERESPONSE]); +UA_ReaderGroupDataType_clear(UA_ReaderGroupDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_READERGROUPDATATYPE]); } -/* CreateSessionResponse */ static UA_INLINE void -UA_CreateSessionResponse_init(UA_CreateSessionResponse *p) { - memset(p, 0, sizeof(UA_CreateSessionResponse)); +UA_ReaderGroupDataType_delete(UA_ReaderGroupDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_READERGROUPDATATYPE]); } -static UA_INLINE UA_CreateSessionResponse * -UA_CreateSessionResponse_new(void) { - return (UA_CreateSessionResponse*)UA_new(&UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]); +/* PubSubConnectionDataType */ +static UA_INLINE void +UA_PubSubConnectionDataType_init(UA_PubSubConnectionDataType *p) { + memset(p, 0, sizeof(UA_PubSubConnectionDataType)); +} + +static UA_INLINE UA_PubSubConnectionDataType * +UA_PubSubConnectionDataType_new(void) { + return (UA_PubSubConnectionDataType*)UA_new(&UA_TYPES[UA_TYPES_PUBSUBCONNECTIONDATATYPE]); } static UA_INLINE UA_StatusCode -UA_CreateSessionResponse_copy(const UA_CreateSessionResponse *src, UA_CreateSessionResponse *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]); +UA_PubSubConnectionDataType_copy(const UA_PubSubConnectionDataType *src, UA_PubSubConnectionDataType *dst) { + return UA_copy(src, dst, &UA_TYPES[UA_TYPES_PUBSUBCONNECTIONDATATYPE]); } static UA_INLINE void -UA_CreateSessionResponse_deleteMembers(UA_CreateSessionResponse *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]); +UA_PubSubConnectionDataType_deleteMembers(UA_PubSubConnectionDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_PUBSUBCONNECTIONDATATYPE]); } static UA_INLINE void -UA_CreateSessionResponse_delete(UA_CreateSessionResponse *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]); +UA_PubSubConnectionDataType_clear(UA_PubSubConnectionDataType *p) { + UA_clear(p, &UA_TYPES[UA_TYPES_PUBSUBCONNECTIONDATATYPE]); +} + +static UA_INLINE void +UA_PubSubConnectionDataType_delete(UA_PubSubConnectionDataType *p) { + UA_delete(p, &UA_TYPES[UA_TYPES_PUBSUBCONNECTIONDATATYPE]); } -/* QueryFirstRequest */ -static UA_INLINE void -UA_QueryFirstRequest_init(UA_QueryFirstRequest *p) { - memset(p, 0, sizeof(UA_QueryFirstRequest)); -} +#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6 +# pragma GCC diagnostic pop +#endif + +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/util.h" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2018 (c) Stefan Profanter, fortiss GmbH + */ + -static UA_INLINE UA_QueryFirstRequest * -UA_QueryFirstRequest_new(void) { - return (UA_QueryFirstRequest*)UA_new(&UA_TYPES[UA_TYPES_QUERYFIRSTREQUEST]); -} -static UA_INLINE UA_StatusCode -UA_QueryFirstRequest_copy(const UA_QueryFirstRequest *src, UA_QueryFirstRequest *dst) { - return UA_copy(src, dst, &UA_TYPES[UA_TYPES_QUERYFIRSTREQUEST]); -} +_UA_BEGIN_DECLS -static UA_INLINE void -UA_QueryFirstRequest_deleteMembers(UA_QueryFirstRequest *p) { - UA_deleteMembers(p, &UA_TYPES[UA_TYPES_QUERYFIRSTREQUEST]); -} +/** + * Endpoint URL Parser + * ------------------- + * The endpoint URL parser is generally useful for the implementation of network + * layer plugins. */ -static UA_INLINE void -UA_QueryFirstRequest_delete(UA_QueryFirstRequest *p) { - UA_delete(p, &UA_TYPES[UA_TYPES_QUERYFIRSTREQUEST]); -} +/* Split the given endpoint url into hostname, port and path. All arguments must + * be non-NULL. EndpointUrls have the form "opc.tcp://hostname:port/path", port + * and path may be omitted (together with the prefix colon and slash). + * + * @param endpointUrl The endpoint URL. + * @param outHostname Set to the parsed hostname. The string points into the + * original endpointUrl, so no memory is allocated. If an IPv6 address is + * given, hostname contains e.g. '[2001:0db8:85a3::8a2e:0370:7334]' + * @param outPort Set to the port of the url or left unchanged. + * @param outPath Set to the path if one is present in the endpointUrl. + * Starting or trailing '/' are NOT included in the path. The string + * points into the original endpointUrl, so no memory is allocated. + * @return Returns UA_STATUSCODE_BADTCPENDPOINTURLINVALID if parsing failed. */ +UA_StatusCode UA_EXPORT +UA_parseEndpointUrl(const UA_String *endpointUrl, UA_String *outHostname, + UA_UInt16 *outPort, UA_String *outPath); -#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6 -# pragma GCC diagnostic pop +/* Split the given endpoint url into hostname, vid and pcp. All arguments must + * be non-NULL. EndpointUrls have the form "opc.eth://[:[.PCP]]". + * The host is a MAC address, an IP address or a registered name like a + * hostname. The format of a MAC address is six groups of hexadecimal digits, + * separated by hyphens (e.g. 01-23-45-67-89-ab). A system may also accept + * hostnames and/or IP addresses if it provides means to resolve it to a MAC + * address (e.g. DNS and Reverse-ARP). + * + * Note: currently only parsing MAC address is supported. + * + * @param endpointUrl The endpoint URL. + * @param vid Set to VLAN ID. + * @param pcp Set to Priority Code Point. + * @return Returns UA_STATUSCODE_BADINTERNALERROR if parsing failed. */ +UA_StatusCode UA_EXPORT +UA_parseEndpointUrlEthernet(const UA_String *endpointUrl, UA_String *target, + UA_UInt16 *vid, UA_Byte *pcp); + +/* Convert given byte string to a positive number. Returns the number of valid + * digits. Stops if a non-digit char is found and returns the number of digits + * up to that point. */ +size_t UA_EXPORT +UA_readNumber(UA_Byte *buf, size_t buflen, UA_UInt32 *number); + +/* Same as UA_ReadNumber but with a base parameter */ +size_t UA_EXPORT +UA_readNumberWithBase(const UA_Byte *buf, size_t buflen, + UA_UInt32 *number, UA_Byte base); + +#ifndef UA_MIN +#define UA_MIN(A,B) (A > B ? B : A) #endif -#ifdef __cplusplus -} // extern "C" +#ifndef UA_MAX +#define UA_MAX(A,B) (A > B ? A : B) #endif +/** + * Convenience macros for complex types + * ------------------------------------ */ +#define UA_PRINTF_GUID_FORMAT "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x" +#define UA_PRINTF_GUID_DATA(GUID) (GUID).data1, (GUID).data2, (GUID).data3, \ + (GUID).data4[0], (GUID).data4[1], (GUID).data4[2], (GUID).data4[3], \ + (GUID).data4[4], (GUID).data4[5], (GUID).data4[6], (GUID).data4[7] + +#define UA_PRINTF_STRING_FORMAT "\"%.*s\"" +#define UA_PRINTF_STRING_DATA(STRING) (int)(STRING).length, (STRING).data + +/** + * Helper functions for converting data types + * ------------------------------------ */ + +/* Converts a bytestring to the corresponding base64 encoded string + * representation. + * + * @param byteString the original byte string + * @param str the resulting base64 encoded byte string + * + * Returns UA_STATUSCODE_GOOD on success. */ +UA_StatusCode UA_EXPORT +UA_ByteString_toBase64String(const UA_ByteString *byteString, UA_String *str); + +/* Converts a node id to the corresponding string representation. + * It can be one of: + * - Numeric: ns=0;i=123 + * - String: ns=0;s=Some String + * - Guid: ns=0;g=A123456C-0ABC-1A2B-815F-687212AAEE1B + * - ByteString: ns=0;b=AA== */ +UA_StatusCode UA_EXPORT +UA_NodeId_toString(const UA_NodeId *nodeId, UA_String *nodeIdStr); + +/* Compare memory in constant time to mitigate timing attacks. + * Returns true if ptr1 and ptr2 are equal for length bytes. */ +static UA_INLINE UA_Boolean +UA_constantTimeEqual(const void *ptr1, const void *ptr2, size_t length) { + volatile const UA_Byte *a = (volatile const UA_Byte *)ptr1; + volatile const UA_Byte *b = (volatile const UA_Byte *)ptr2; + volatile UA_Byte c = 0; + for(size_t i = 0; i < length; ++i) { + UA_Byte x = a[i], y = b[i]; + c |= x ^ y; + } + return !c; +} + +_UA_END_DECLS + -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_server.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/server.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2014-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2015-2016 (c) Sten Grüner * Copyright 2014-2015, 2017 (c) Florian Palm * Copyright 2015-2016 (c) Chris Iatrou @@ -11091,18 +23999,17 @@ UA_QueryFirstRequest_delete(UA_QueryFirstRequest *p) { */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS +/* Forward declarations */ struct UA_ServerConfig; typedef struct UA_ServerConfig UA_ServerConfig; struct UA_Server; typedef struct UA_Server UA_Server; -struct UA_ClientConfig; +struct UA_Client; /** * .. _server: @@ -11117,9 +24024,18 @@ struct UA_ClientConfig; * Server Lifecycle * ---------------- */ -UA_Server UA_EXPORT * UA_Server_new(const UA_ServerConfig *config); +UA_Server UA_EXPORT * UA_Server_new(void); + +/* Makes a (shallow) copy of the config into the server object. + * The config content is cleared together with the server. */ +UA_Server UA_EXPORT * +UA_Server_newWithConfig(const UA_ServerConfig *config); + void UA_EXPORT UA_Server_delete(UA_Server *server); +UA_ServerConfig UA_EXPORT * +UA_Server_getConfig(UA_Server *server); + /* Runs the main loop of the server. In each iteration, this calls into the * networklayers to see if messages have arrived. * @@ -11128,7 +24044,7 @@ void UA_EXPORT UA_Server_delete(UA_Server *server); * Otherwise, the server shuts down. * @return Returns the statuscode of the UA_Server_run_shutdown method */ UA_StatusCode UA_EXPORT -UA_Server_run(UA_Server *server, volatile UA_Boolean *running); +UA_Server_run(UA_Server *server, const volatile UA_Boolean *running); /* The prologue part of UA_Server_run (no need to use if you call * UA_Server_run) */ @@ -11152,37 +24068,57 @@ UA_StatusCode UA_EXPORT UA_Server_run_shutdown(UA_Server *server); /** - * Repeated Callbacks - * ------------------ */ + * Timed Callbacks + * --------------- */ typedef void (*UA_ServerCallback)(UA_Server *server, void *data); +/* Add a callback for execution at a specified time. If the indicated time lies + * in the past, then the callback is executed at the next iteration of the + * server's main loop. + * + * @param server The server object. + * @param callback The callback that shall be added. + * @param data Data that is forwarded to the callback. + * @param date The timestamp for the execution time. + * @param callbackId Set to the identifier of the repeated callback . This can + * be used to cancel the callback later on. If the pointer is null, the + * identifier is not set. + * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code + * otherwise. */ +UA_StatusCode UA_EXPORT +UA_Server_addTimedCallback(UA_Server *server, UA_ServerCallback callback, + void *data, UA_DateTime date, UA_UInt64 *callbackId); + /* Add a callback for cyclic repetition to the server. * * @param server The server object. * @param callback The callback that shall be added. - * @param interval The callback shall be repeatedly executed with the given interval - * (in ms). The interval must be larger than 5ms. The first execution + * @param data Data that is forwarded to the callback. + * @param interval_ms The callback shall be repeatedly executed with the given + * interval (in ms). The interval must be positive. The first execution * occurs at now() + interval at the latest. - * @param callbackId Set to the identifier of the repeated callback . This can be used to cancel - * the callback later on. If the pointer is null, the identifier is not set. - * @return Upon success, UA_STATUSCODE_GOOD is returned. - * An error code otherwise. */ + * @param callbackId Set to the identifier of the repeated callback . This can + * be used to cancel the callback later on. If the pointer is null, the + * identifier is not set. + * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code + * otherwise. */ UA_StatusCode UA_EXPORT UA_Server_addRepeatedCallback(UA_Server *server, UA_ServerCallback callback, - void *data, UA_UInt32 interval, UA_UInt64 *callbackId); + void *data, UA_Double interval_ms, UA_UInt64 *callbackId); UA_StatusCode UA_EXPORT UA_Server_changeRepeatedCallbackInterval(UA_Server *server, UA_UInt64 callbackId, - UA_UInt32 interval); + UA_Double interval_ms); -/* Remove a repeated callback. +/* Remove a repeated callback. Does nothing if the callback is not found. * * @param server The server object. - * @param callbackId The id of the callback that shall be removed. - * @return Upon success, UA_STATUSCODE_GOOD is returned. - * An error code otherwise. */ -UA_StatusCode UA_EXPORT -UA_Server_removeRepeatedCallback(UA_Server *server, UA_UInt64 callbackId); + * @param callbackId The id of the callback */ +void UA_EXPORT +UA_Server_removeCallback(UA_Server *server, UA_UInt64 callbackId); + +#define UA_Server_removeRepeatedCallback(server, callbackId) \ + UA_Server_removeCallback(server, callbackId); /** * Reading and Writing Node Attributes @@ -11364,8 +24300,7 @@ UA_Server_readExecutable(UA_Server *server, const UA_NodeId nodeId, * - UserWriteMask * - UserAccessLevel * - UserExecutable - * - * Historizing is currently unsupported */ + */ /* Overwrite an attribute of a node. The specialized functions below provide a * more concise syntax. @@ -11460,7 +24395,7 @@ UA_Server_writeValueRank(UA_Server *server, const UA_NodeId nodeId, static UA_INLINE UA_StatusCode UA_Server_writeArrayDimensions(UA_Server *server, const UA_NodeId nodeId, const UA_Variant arrayDimensions) { - return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_VALUE, + return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_ARRAYDIMENSIONS, &UA_TYPES[UA_TYPES_VARIANT], &arrayDimensions); } @@ -11480,6 +24415,15 @@ UA_Server_writeMinimumSamplingInterval(UA_Server *server, const UA_NodeId nodeId &miniumSamplingInterval); } +static UA_INLINE UA_StatusCode +UA_Server_writeHistorizing(UA_Server *server, const UA_NodeId nodeId, + const UA_Boolean historizing) { + return __UA_Server_write(server, &nodeId, + UA_ATTRIBUTEID_HISTORIZING, + &UA_TYPES[UA_TYPES_BOOLEAN], + &historizing); +} + static UA_INLINE UA_StatusCode UA_Server_writeExecutable(UA_Server *server, const UA_NodeId nodeId, const UA_Boolean executable) { @@ -11489,18 +24433,41 @@ UA_Server_writeExecutable(UA_Server *server, const UA_NodeId nodeId, /** * Browsing * -------- */ + +/* Browse the references of a particular node. See the definition of + * BrowseDescription structure for details. */ UA_BrowseResult UA_EXPORT -UA_Server_browse(UA_Server *server, UA_UInt32 maxrefs, - const UA_BrowseDescription *descr); +UA_Server_browse(UA_Server *server, UA_UInt32 maxReferences, + const UA_BrowseDescription *bd); UA_BrowseResult UA_EXPORT UA_Server_browseNext(UA_Server *server, UA_Boolean releaseContinuationPoint, const UA_ByteString *continuationPoint); +/* Nonstandard version of the browse service that recurses into child nodes. + * Possible loops (that can occur for non-hierarchical references) are handled + * by adding every target node at most once to the results array. */ +UA_StatusCode UA_EXPORT +UA_Server_browseRecursive(UA_Server *server, const UA_BrowseDescription *bd, + size_t *resultsSize, UA_ExpandedNodeId **results); + UA_BrowsePathResult UA_EXPORT UA_Server_translateBrowsePathToNodeIds(UA_Server *server, const UA_BrowsePath *browsePath); +/* A simplified TranslateBrowsePathsToNodeIds based on the + * SimpleAttributeOperand type (Part 4, 7.4.4.5). + * + * This specifies a relative path using a list of BrowseNames instead of the + * RelativePath structure. The list of BrowseNames is equivalent to a + * RelativePath that specifies forward references which are subtypes of the + * HierarchicalReferences ReferenceType. All Nodes followed by the browsePath + * shall be of the NodeClass Object or Variable. */ +UA_BrowsePathResult UA_EXPORT +UA_Server_browseSimplifiedBrowsePath(UA_Server *server, const UA_NodeId origin, + size_t browsePathSize, + const UA_QualifiedName *browsePath); + #ifndef HAVE_NODEITER_CALLBACK #define HAVE_NODEITER_CALLBACK /* Iterate over all nodes referenced by parentNodeId by calling the callback @@ -11529,20 +24496,20 @@ UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId, * When the server shuts down you need to call unregister. * * @param server - * @param discoveryServerUrl if set to NULL, the default value - * 'opc.tcp://localhost:4840' will be used + * @param client the client which is used to call the RegisterServer. It must + * already be connected to the correct endpoint * @param semaphoreFilePath optional parameter pointing to semaphore file. */ UA_StatusCode UA_EXPORT -UA_Server_register_discovery(UA_Server *server, const char* discoveryServerUrl, +UA_Server_register_discovery(UA_Server *server, struct UA_Client *client, const char* semaphoreFilePath); /* Unregister the given server instance from the discovery server. * This should only be called when the server is shutting down. * @param server - * @param discoveryServerUrl if set to NULL, the default value - * 'opc.tcp://localhost:4840' will be used */ + * @param client the client which is used to call the RegisterServer. It must + * already be connected to the correct endpoint */ UA_StatusCode UA_EXPORT -UA_Server_unregister_discovery(UA_Server *server, const char* discoveryServerUrl); +UA_Server_unregister_discovery(UA_Server *server, struct UA_Client *client); /* Adds a periodic callback to register the server with the LDS (local discovery server) * periodically. The interval between each register call is given as second parameter. @@ -11559,15 +24526,19 @@ UA_Server_unregister_discovery(UA_Server *server, const char* discoveryServerUrl * periodic callback will be removed. * * @param server - * @param discoveryServerUrl if set to NULL, the default value - * 'opc.tcp://localhost:4840' will be used + * @param client the client which is used to call the RegisterServer. + * It must not yet be connected and will be connected for every register call + * to the given discoveryServerUrl. + * @param discoveryServerUrl where this server should register itself. + * The string will be copied internally. Therefore you can free it after calling this method. * @param intervalMs * @param delayFirstRegisterMs * @param periodicCallbackId */ UA_StatusCode UA_EXPORT -UA_Server_addPeriodicServerRegisterCallback(UA_Server *server, const char* discoveryServerUrl, - UA_UInt32 intervalMs, - UA_UInt32 delayFirstRegisterMs, +UA_Server_addPeriodicServerRegisterCallback(UA_Server *server, struct UA_Client *client, + const char* discoveryServerUrl, + UA_Double intervalMs, + UA_Double delayFirstRegisterMs, UA_UInt64 *periodicCallbackId); /* Callback for RegisterServer. Data is passed from the register call */ @@ -11575,8 +24546,9 @@ typedef void (*UA_Server_registerServerCallback)(const UA_RegisteredServer *regi void* data); /* Set the callback which is called if another server registeres or unregisters - * with this instance. If called multiple times, previous data will be - * overwritten. + * with this instance. This callback is called every time the server gets a register + * call. This especially means that for every periodic server register the callback will + * be called. * * @param server * @param cb the callback @@ -11680,7 +24652,50 @@ typedef struct { void (*destructor)(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, const UA_NodeId *nodeId, void *nodeContext); -} UA_GlobalNodeLifecycle; + + /* Can be NULL. Called during recursive node instantiation. While mandatory + * child nodes are automatically created if not already present, optional child + * nodes are not. This callback can be used to define whether an optional child + * node should be created. + * + * @param server The server executing the callback + * @param sessionId The identifier of the session + * @param sessionContext Additional data attached to the session in the + * access control layer + * @param sourceNodeId Source node from the type definition. If the new node + * shall be created, it will be a copy of this node. + * @param targetParentNodeId Parent of the potential new child node + * @param referenceTypeId Identifies the reference type which that the parent + * node has to the new node. + * @return Return UA_TRUE if the child node shall be instantiatet, + * UA_FALSE otherwise. */ + UA_Boolean (*createOptionalChild)(UA_Server *server, + const UA_NodeId *sessionId, + void *sessionContext, + const UA_NodeId *sourceNodeId, + const UA_NodeId *targetParentNodeId, + const UA_NodeId *referenceTypeId); + + /* Can be NULL. Called when a node is to be copied during recursive + * node instantiation. Allows definition of the NodeId for the new node. + * If the callback is set to NULL or the resulting NodeId is UA_NODEID_NULL, + * then a random NodeId will be generated. + * + * @param server The server executing the callback + * @param sessionId The identifier of the session + * @param sessionContext Additional data attached to the session in the + * access control layer + * @param sourceNodeId Source node of the copy operation + * @param targetParentNodeId Parent node of the new node + * @param referenceTypeId Identifies the reference type which that the parent + * node has to the new node. */ + UA_StatusCode (*generateChildNodeId)(UA_Server *server, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *sourceNodeId, + const UA_NodeId *targetParentNodeId, + const UA_NodeId *referenceTypeId, + UA_NodeId *targetNodeId); + } UA_GlobalNodeLifecycle; typedef struct { /* Can be NULL. May replace the nodeContext */ @@ -11738,21 +24753,25 @@ typedef struct { * memory being cleaned up. Don't forget to also set `value->hasValue` to * true to indicate the presence of a value. * - * @param handle An optional pointer to user-defined data for the - * specific data source - * @param nodeid Id of the read node + * @param server The server executing the callback + * @param sessionId The identifier of the session + * @param sessionContext Additional data attached to the session in the + * access control layer + * @param nodeId The identifier of the node being read from + * @param nodeContext Additional data attached to the node by the user * @param includeSourceTimeStamp If true, then the datasource is expected to * set the source timestamp in the returned value * @param range If not null, then the datasource shall return only a * selection of the (nonscalar) data. Set * UA_STATUSCODE_BADINDEXRANGEINVALID in the value if this does not - * apply. + * apply * @param value The (non-null) DataValue that is returned to the client. The * data source sets the read data, the result status and optionally a * sourcetimestamp. * @return Returns a status code for logging. Error codes intended for the * original caller are set in the value. If an error is returned, - * then no releasing of the value is done. */ + * then no releasing of the value is done + */ UA_StatusCode (*read)(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, const UA_NodeId *nodeId, void *nodeContext, UA_Boolean includeSourceTimeStamp, @@ -11761,13 +24780,23 @@ typedef struct { /* Write into a data source. This method pointer can be NULL if the * operation is unsupported. * - * @param handle An optional pointer to user-defined data for the - * specific data source - * @param nodeid Id of the node being written to - * @param data The data to be written into the data source - * @param range An optional data range. If the data source is scalar or does - * not support writing of ranges, then an error code is returned. - * @return Returns a status code that is returned to the user */ + * @param server The server executing the callback + * @param sessionId The identifier of the session + * @param sessionContext Additional data attached to the session in the + * access control layer + * @param nodeId The identifier of the node being written to + * @param nodeContext Additional data attached to the node by the user + * @param range If not NULL, then the datasource shall return only a + * selection of the (nonscalar) data. Set + * UA_STATUSCODE_BADINDEXRANGEINVALID in the value if this does not + * apply + * @param value The (non-NULL) DataValue that has been written by the client. + * The data source contains the written data, the result status and + * optionally a sourcetimestamp + * @return Returns a status code for logging. Error codes intended for the + * original caller are set in the value. If an error is returned, + * then no releasing of the value is done + */ UA_StatusCode (*write)(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, const UA_NodeId *nodeId, void *nodeContext, const UA_NumericRange *range, @@ -11826,13 +24855,69 @@ UA_Server_setVariableNode_valueCallback(UA_Server *server, const UA_NodeId nodeId, const UA_ValueCallback callback); +/** + * .. _local-monitoreditems: + * + * Local MonitoredItems + * ^^^^^^^^^^^^^^^^^^^^ + * + * MonitoredItems are used with the Subscription mechanism of OPC UA to + * transported notifications for data changes and events. MonitoredItems can + * also be registered locally. Notifications are then forwarded to a + * user-defined callback instead of a remote client. */ + +#ifdef UA_ENABLE_SUBSCRIPTIONS + +typedef void (*UA_Server_DataChangeNotificationCallback) + (UA_Server *server, UA_UInt32 monitoredItemId, void *monitoredItemContext, + const UA_NodeId *nodeId, void *nodeContext, UA_UInt32 attributeId, + const UA_DataValue *value); + +typedef void (*UA_Server_EventNotificationCallback) + (UA_Server *server, UA_UInt32 monId, void *monContext, + size_t nEventFields, const UA_Variant *eventFields); + +/* Create a local MonitoredItem with a sampling interval that detects data + * changes. + * + * @param server The server executing the MonitoredItem + * @timestampsToReturn Shall timestamps be added to the value for the callback? + * @item The parameters of the new MonitoredItem. Note that the attribute of the + * ReadValueId (the node that is monitored) can not be + * ``UA_ATTRIBUTEID_EVENTNOTIFIER``. A different callback type needs to be + * registered for event notifications. + * @monitoredItemContext A pointer that is forwarded with the callback + * @callback The callback that is executed on detected data changes + * + * @return Returns a description of the created MonitoredItem. The structure + * also contains a StatusCode (in case of an error) and the identifier of the + * new MonitoredItem. */ +UA_MonitoredItemCreateResult UA_EXPORT +UA_Server_createDataChangeMonitoredItem(UA_Server *server, + UA_TimestampsToReturn timestampsToReturn, + const UA_MonitoredItemCreateRequest item, + void *monitoredItemContext, + UA_Server_DataChangeNotificationCallback callback); + +/* UA_MonitoredItemCreateResult UA_EXPORT */ +/* UA_Server_createEventMonitoredItem(UA_Server *server, */ +/* UA_TimestampsToReturn timestampsToReturn, */ +/* const UA_MonitoredItemCreateRequest item, void *context, */ +/* UA_Server_EventNotificationCallback callback); */ + +UA_StatusCode UA_EXPORT +UA_Server_deleteMonitoredItem(UA_Server *server, UA_UInt32 monitoredItemId); + +#endif + /** * Method Callbacks * ^^^^^^^^^^^^^^^^ - * Method callbacks are set to `NULL` (not executable) when a method node is added - * over the network. In theory, it is possible to add a callback via - * ``UA_Server_setMethodNode_callback`` within the global constructor when adding - * methods over the network is really wanted. */ + * Method callbacks are set to `NULL` (not executable) when a method node is + * added over the network. In theory, it is possible to add a callback via + * ``UA_Server_setMethodNode_callback`` within the global constructor when + * adding methods over the network is really wanted. See the Section + * :ref:`object-interaction` for calling methods on an object. */ typedef UA_StatusCode (*UA_MethodCallback)(UA_Server *server, const UA_NodeId *sessionId, @@ -11843,14 +24928,57 @@ typedef UA_StatusCode UA_Variant *output); #ifdef UA_ENABLE_METHODCALLS - UA_StatusCode UA_EXPORT UA_Server_setMethodNode_callback(UA_Server *server, const UA_NodeId methodNodeId, UA_MethodCallback methodCallback); +#endif + +/** + * .. _object-interaction: + * + * Interacting with Objects + * ------------------------ + * Objects in the information model are represented as ObjectNodes. Some + * convenience functions are provided to simplify the interaction with objects. + */ + +/* Write an object property. The property is represented as a VariableNode with + * a ``HasProperty`` reference from the ObjectNode. The VariableNode is + * identified by its BrowseName. Writing the property sets the value attribute + * of the VariableNode. + * + * @param server The server object + * @param objectId The identifier of the object (node) + * @param propertyName The name of the property + * @param value The value to be set for the event attribute + * @return The StatusCode for setting the event attribute */ +UA_StatusCode UA_EXPORT +UA_Server_writeObjectProperty(UA_Server *server, const UA_NodeId objectId, + const UA_QualifiedName propertyName, + const UA_Variant value); + +/* Directly point to the scalar value instead of a variant */ +UA_StatusCode UA_EXPORT +UA_Server_writeObjectProperty_scalar(UA_Server *server, const UA_NodeId objectId, + const UA_QualifiedName propertyName, + const void *value, const UA_DataType *type); + +/* Read an object property. + * + * @param server The server object + * @param objectId The identifier of the object (node) + * @param propertyName The name of the property + * @param value Contains the property value after reading. Must not be NULL. + * @return The StatusCode for setting the event attribute */ +UA_StatusCode UA_EXPORT +UA_Server_readObjectProperty(UA_Server *server, const UA_NodeId objectId, + const UA_QualifiedName propertyName, + UA_Variant *value); + +#ifdef UA_ENABLE_METHODCALLS UA_CallMethodResult UA_EXPORT UA_Server_call(UA_Server *server, const UA_CallMethodRequest *request); - #endif /** @@ -12024,6 +25152,8 @@ UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_DataSource dataSource, void *nodeContext, UA_NodeId *outNewNodeId); +#ifdef UA_ENABLE_METHODCALLS + UA_StatusCode UA_EXPORT UA_Server_addMethodNodeEx(UA_Server *server, const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId, @@ -12053,6 +25183,8 @@ UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId, nodeContext, outNewNodeId); } +#endif + /** * The method pair UA_Server_addNode_begin and _finish splits the AddNodes @@ -12100,12 +25232,16 @@ UA_Server_addNode_begin(UA_Server *server, const UA_NodeClass nodeClass, UA_StatusCode UA_EXPORT UA_Server_addNode_finish(UA_Server *server, const UA_NodeId nodeId); +#ifdef UA_ENABLE_METHODCALLS + UA_StatusCode UA_EXPORT UA_Server_addMethodNode_finish(UA_Server *server, const UA_NodeId nodeId, UA_MethodCallback method, size_t inputArgumentsSize, const UA_Argument* inputArguments, size_t outputArgumentsSize, const UA_Argument* outputArguments); +#endif + /* Deletes a node and optionally all references leading to the node. */ UA_StatusCode UA_EXPORT UA_Server_deleteNode(UA_Server *server, const UA_NodeId nodeId, @@ -12125,84 +25261,126 @@ UA_Server_deleteReference(UA_Server *server, const UA_NodeId sourceNodeId, const UA_ExpandedNodeId targetNodeId, UA_Boolean deleteBidirectional); +/** + * .. _events: + * + * Events + * ------ + * The method ``UA_Server_createEvent`` creates an event and represents it as node. The node receives a unique `EventId` + * which is automatically added to the node. + * The method returns a `NodeId` to the object node which represents the event through ``outNodeId``. The `NodeId` can + * be used to set the attributes of the event. The generated `NodeId` is always numeric. ``outNodeId`` cannot be + * ``NULL``. + * + * Note: In order to see an event in UAExpert, the field `Time` must be given a value! + * + * The method ``UA_Server_triggerEvent`` "triggers" an event by adding it to all monitored items of the specified + * origin node and those of all its parents. Any filters specified by the monitored items are automatically applied. + * Using this method deletes the node generated by ``UA_Server_createEvent``. The `EventId` for the new event is + * generated automatically and is returned through ``outEventId``. ``NULL`` can be passed if the `EventId` is not + * needed. ``deleteEventNode`` specifies whether the node representation of the event should be deleted after invoking + * the method. This can be useful if events with the similar attributes are triggered frequently. ``UA_TRUE`` would + * cause the node to be deleted. */ +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + +/* The EventQueueOverflowEventType is defined as abstract, therefore we can not + * create an instance of that type directly, but need to create a subtype. The + * following is an arbitrary number which shall refer to our internal overflow + * type. This is already posted on the OPC Foundation bug tracker under the + * following link for clarification: + * https://opcfoundation-onlineapplications.org/mantis/view.php?id=4206 */ +# define UA_NS0ID_SIMPLEOVERFLOWEVENTTYPE 4035 + +/* Creates a node representation of an event + * + * @param server The server object + * @param eventType The type of the event for which a node should be created + * @param outNodeId The NodeId of the newly created node for the event + * @return The StatusCode of the UA_Server_createEvent method */ +UA_StatusCode UA_EXPORT +UA_Server_createEvent(UA_Server *server, const UA_NodeId eventType, + UA_NodeId *outNodeId); + +/* Triggers a node representation of an event by applying EventFilters and + adding the event to the appropriate queues. + * @param server The server object + * @param eventNodeId The NodeId of the node representation of the event which should be triggered + * @param outEvent the EventId of the new event + * @param deleteEventNode Specifies whether the node representation of the event should be deleted + * @return The StatusCode of the UA_Server_triggerEvent method */ +UA_StatusCode UA_EXPORT +UA_Server_triggerEvent(UA_Server *server, const UA_NodeId eventNodeId, const UA_NodeId originId, + UA_ByteString *outEventId, const UA_Boolean deleteEventNode); + +#endif /* UA_ENABLE_SUBSCRIPTIONS_EVENTS */ + +UA_StatusCode UA_EXPORT +UA_Server_updateCertificate(UA_Server *server, + const UA_ByteString *oldCertificate, + const UA_ByteString *newCertificate, + const UA_ByteString *newPrivateKey, + UA_Boolean closeSessions, + UA_Boolean closeSecureChannels); + /** * Utility Functions * ----------------- */ /* Add a new namespace to the server. Returns the index of the new namespace */ UA_UInt16 UA_EXPORT UA_Server_addNamespace(UA_Server *server, const char* name); -/** - * Deprecated Server API - * --------------------- - * This file contains outdated API definitions that are kept for backwards - * compatibility. Please switch to the new API, as the following definitions - * will be removed eventually. - * - * UA_Job API - * ^^^^^^^^^^ - * UA_Job was replaced since it unnecessarily exposed server internals to the - * end-user. Please use plain UA_ServerCallbacks instead. The following UA_Job - * definition contains just the fraction of the original struct that was useful - * to end-users. */ - -typedef enum { - UA_JOBTYPE_METHODCALL -} UA_JobType; - -typedef struct { - UA_JobType type; - union { - struct { - void *data; - UA_ServerCallback method; - } methodCall; - } job; -} UA_Job; +/* Get namespace by name from the server. */ +UA_StatusCode UA_EXPORT +UA_Server_getNamespaceByName(UA_Server *server, const UA_String namespaceUri, + size_t* foundIndex); -UA_DEPRECATED static UA_INLINE UA_StatusCode -UA_Server_addRepeatedJob(UA_Server *server, UA_Job job, - UA_UInt32 interval, UA_Guid *jobId) { - return UA_Server_addRepeatedCallback(server, job.job.methodCall.method, - job.job.methodCall.data, interval, - (UA_UInt64*)(uintptr_t)jobId); -} +#ifdef UA_ENABLE_HISTORIZING +UA_Boolean UA_EXPORT +UA_Server_AccessControl_allowHistoryUpdateUpdateData(UA_Server *server, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeId, + UA_PerformUpdateType performInsertReplace, + const UA_DataValue *value); -UA_DEPRECATED static UA_INLINE UA_StatusCode -UA_Server_removeRepeatedJob(UA_Server *server, UA_Guid jobId) { - return UA_Server_removeRepeatedCallback(server, - *(UA_UInt64*)(uintptr_t)&jobId); -} +UA_Boolean UA_EXPORT +UA_Server_AccessControl_allowHistoryUpdateDeleteRawModified(UA_Server *server, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeId, + UA_DateTime startTimestamp, + UA_DateTime endTimestamp, + bool isDeleteModified); +#endif // UA_ENABLE_HISTORIZING -#ifdef __cplusplus -} -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_plugin_log.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/plugin/log.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2017 (c) Stefan Profanter, fortiss GmbH */ -#ifdef __cplusplus -extern "C" { -#endif #include +_UA_BEGIN_DECLS + /** * Logging Plugin API * ================== * - * Servers and clients must define a logger in their configuration. The logger - * is just a function pointer. Every log-message consists of a log-level, a - * log-category and a string message content. The timestamp of the log-message - * is created within the logger. */ + * Servers and clients define a logger in their configuration. The logger is a + * plugin. A default plugin that logs to ``stdout`` is provided as an example. + * The logger plugin is stateful and can point to custom data. So it is possible + * to keep open file handlers in the logger context. + * + * Every log-message consists of a log-level, a log-category and a string + * message content. The timestamp of the log-message is created within the + * logger. */ typedef enum { UA_LOGLEVEL_TRACE, @@ -12223,101 +25401,101 @@ typedef enum { UA_LOGCATEGORY_SECURITYPOLICY } UA_LogCategory; -/** - * The message string and following varargs are formatted according to the rules - * of the printf command. Do not call the logger directly. Instead, make use of - * the convenience macros that take the minimum log-level defined in ua_config.h - * into account. */ +typedef struct { + /* Log a message. The message string and following varargs are formatted + * according to the rules of the printf command. Use the convenience macros + * below that take the minimum log-level defined in ua_config.h into + * account. */ + void (*log)(void *logContext, UA_LogLevel level, UA_LogCategory category, + const char *msg, va_list args); -typedef void (*UA_Logger)(UA_LogLevel level, UA_LogCategory category, - const char *msg, va_list args); + void *context; /* Logger state */ + + void (*clear)(void *context); /* Clean up the logger plugin */ +} UA_Logger; static UA_INLINE UA_FORMAT(3,4) void -UA_LOG_TRACE(UA_Logger logger, UA_LogCategory category, const char *msg, ...) { +UA_LOG_TRACE(const UA_Logger *logger, UA_LogCategory category, const char *msg, ...) { #if UA_LOGLEVEL <= 100 + if(!logger || !logger->log) + return; va_list args; va_start(args, msg); - logger(UA_LOGLEVEL_TRACE, category, msg, args); + logger->log(logger->context, UA_LOGLEVEL_TRACE, category, msg, args); va_end(args); #endif } static UA_INLINE UA_FORMAT(3,4) void -UA_LOG_DEBUG(UA_Logger logger, UA_LogCategory category, const char *msg, ...) { +UA_LOG_DEBUG(const UA_Logger *logger, UA_LogCategory category, const char *msg, ...) { #if UA_LOGLEVEL <= 200 + if(!logger || !logger->log) + return; va_list args; va_start(args, msg); - logger(UA_LOGLEVEL_DEBUG, category, msg, args); + logger->log(logger->context, UA_LOGLEVEL_DEBUG, category, msg, args); va_end(args); #endif } static UA_INLINE UA_FORMAT(3,4) void -UA_LOG_INFO(UA_Logger logger, UA_LogCategory category, const char *msg, ...) { +UA_LOG_INFO(const UA_Logger *logger, UA_LogCategory category, const char *msg, ...) { #if UA_LOGLEVEL <= 300 + if(!logger || !logger->log) + return; va_list args; va_start(args, msg); - logger(UA_LOGLEVEL_INFO, category, msg, args); + logger->log(logger->context, UA_LOGLEVEL_INFO, category, msg, args); va_end(args); #endif } static UA_INLINE UA_FORMAT(3,4) void -UA_LOG_WARNING(UA_Logger logger, UA_LogCategory category, const char *msg, ...) { +UA_LOG_WARNING(const UA_Logger *logger, UA_LogCategory category, const char *msg, ...) { #if UA_LOGLEVEL <= 400 + if(!logger || !logger->log) + return; va_list args; va_start(args, msg); - logger(UA_LOGLEVEL_WARNING, category, msg, args); + logger->log(logger->context, UA_LOGLEVEL_WARNING, category, msg, args); va_end(args); #endif } static UA_INLINE UA_FORMAT(3,4) void -UA_LOG_ERROR(UA_Logger logger, UA_LogCategory category, const char *msg, ...) { +UA_LOG_ERROR(const UA_Logger *logger, UA_LogCategory category, const char *msg, ...) { #if UA_LOGLEVEL <= 500 + if(!logger || !logger->log) + return; va_list args; va_start(args, msg); - logger(UA_LOGLEVEL_ERROR, category, msg, args); + logger->log(logger->context, UA_LOGLEVEL_ERROR, category, msg, args); va_end(args); #endif } static UA_INLINE UA_FORMAT(3,4) void -UA_LOG_FATAL(UA_Logger logger, UA_LogCategory category, const char *msg, ...) { +UA_LOG_FATAL(const UA_Logger *logger, UA_LogCategory category, const char *msg, ...) { #if UA_LOGLEVEL <= 600 + if(!logger || !logger->log) + return; va_list args; va_start(args, msg); - logger(UA_LOGLEVEL_FATAL, category, msg, args); + logger->log(logger->context, UA_LOGLEVEL_FATAL, category, msg, args); va_end(args); #endif } -/** - * Convenience macros for complex types - * ------------------------------------ */ -#define UA_PRINTF_GUID_FORMAT "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x" -#define UA_PRINTF_GUID_DATA(GUID) (GUID).data1, (GUID).data2, (GUID).data3, \ - (GUID).data4[0], (GUID).data4[1], (GUID).data4[2], (GUID).data4[3], \ - (GUID).data4[4], (GUID).data4[5], (GUID).data4[6], (GUID).data4[7] - -#define UA_PRINTF_STRING_FORMAT "\"%.*s\"" -#define UA_PRINTF_STRING_DATA(STRING) (int)(STRING).length, (STRING).data - - -#ifdef __cplusplus -} // extern "C" -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_plugin_network.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/plugin/network.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2017 (c) Stefan Profanter, fortiss GmbH */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS /* Forward declarations */ struct UA_Connection; @@ -12331,7 +25509,7 @@ typedef struct UA_ServerNetworkLayer UA_ServerNetworkLayer; /** * .. _networking: - * + * * Networking Plugin API * ===================== * @@ -12347,35 +25525,35 @@ typedef struct UA_ServerNetworkLayer UA_ServerNetworkLayer; typedef struct { UA_UInt32 protocolVersion; - UA_UInt32 sendBufferSize; UA_UInt32 recvBufferSize; - UA_UInt32 maxMessageSize; - UA_UInt32 maxChunkCount; + UA_UInt32 sendBufferSize; + UA_UInt32 maxMessageSize; /* Indicated by the remote side (0 = unbounded) */ + UA_UInt32 maxChunkCount; /* Indicated by the remote side (0 = unbounded) */ } UA_ConnectionConfig; typedef enum { - UA_CONNECTION_CLOSED, /* The socket has been closed and the connection - * will be deleted */ - UA_CONNECTION_OPENING, /* The socket is open, but the HEL/ACK handshake - * is not done */ - UA_CONNECTION_ESTABLISHED /* The socket is open and the connection - * configured */ + UA_CONNECTION_CLOSED, /* The socket has been closed and the connection + * will be deleted */ + UA_CONNECTION_OPENING, /* The socket is open, but the HEL/ACK handshake + * is not done */ + UA_CONNECTION_ESTABLISHED /* The socket is open and the connection + * configured */ + } UA_ConnectionState; struct UA_Connection { UA_ConnectionState state; - UA_ConnectionConfig localConf; - UA_ConnectionConfig remoteConf; - UA_SecureChannel *channel; /* The securechannel that is attached to - * this connection */ - UA_Int32 sockfd; /* Most connectivity solutions run on - * sockets. Having the socket id here - * simplifies the design. */ - UA_DateTime openingDate; /* The date the connection was created */ - void *handle; /* A pointer to internal data */ - UA_ByteString incompleteMessage; /* A half-received chunk (TCP is a - * streaming protocol) is stored here */ - + UA_ConnectionConfig config; + UA_SecureChannel *channel; /* The securechannel that is attached to + * this connection */ + UA_SOCKET sockfd; /* Most connectivity solutions run on + * sockets. Having the socket id here + * simplifies the design. */ + UA_DateTime openingDate; /* The date the connection was created */ + void *handle; /* A pointer to internal data */ + UA_ByteString incompleteChunk; /* A half-received chunk (TCP is a + * streaming protocol) is stored here */ + UA_UInt64 connectCallbackID; /* Callback Id, for the connect-loop */ /* Get a buffer for sending */ UA_StatusCode (*getSendBuffer)(UA_Connection *connection, size_t length, UA_ByteString *buf); @@ -12415,9 +25593,6 @@ struct UA_Connection { /* To be called only from within the server (and not the network layer). * Frees up the connection's memory. */ void (*free)(UA_Connection *connection); - - /* A message has not been processed yet */ - UA_Boolean pendingMessage; }; /* Cleans up half-received messages, and so on. Called from connection->free. */ @@ -12457,8 +25632,11 @@ UA_Server_removeConnection(UA_Server *server, UA_Connection *connection); struct UA_ServerNetworkLayer { void *handle; /* Internal data */ + UA_String discoveryUrl; + UA_ConnectionConfig localConnectionConfig; + /* Start listening on the networklayer. * * @param nl The network layer @@ -12472,7 +25650,7 @@ struct UA_ServerNetworkLayer { * * @param nl The network layer * @param server The server for processing the incoming packets and for - * closing connections. + * closing connections. * @param timeout The timeout during which an event must arrive in * milliseconds * @return A statuscode for the status of the network layer. */ @@ -12489,66 +25667,42 @@ struct UA_ServerNetworkLayer { void (*stop)(UA_ServerNetworkLayer *nl, UA_Server *server); /* Deletes the network layer context. Call only after stopping. */ - void (*deleteMembers)(UA_ServerNetworkLayer *nl); -}; - -/** - * Client Network Layer - * -------------------- - * The client has only a single connection used for sending and receiving binary - * messages. */ - -/* @param localConf the connection config for this client - * @param endpointUrl to where to connect - * @param timeout in ms until the connection try times out if remote not reachable - * @param logger the logger to use */ -typedef UA_Connection -(*UA_ConnectClientConnection)(UA_ConnectionConfig localConf, const char *endpointUrl, - const UA_UInt32 timeout, UA_Logger logger); - -/** - * Endpoint URL Parser - * ------------------- - * The endpoint URL parser is generally useful for the implementation of network - * layer plugins. */ - -/* Split the given endpoint url into hostname, port and path. All arguments must - * be non-NULL. EndpointUrls have the form "opc.tcp://hostname:port/path", port - * and path may be omitted (together with the prefix colon and slash). - * - * @param endpointUrl The endpoint URL. - * @param outHostname Set to the parsed hostname. The string points into the - * original endpointUrl, so no memory is allocated. If an IPv6 address is - * given, hostname contains e.g. '[2001:0db8:85a3::8a2e:0370:7334]' - * @param outPort Set to the port of the url or left unchanged. - * @param outPath Set to the path if one is present in the endpointUrl. - * Starting or trailing '/' are NOT included in the path. The string - * points into the original endpointUrl, so no memory is allocated. - * @return Returns UA_STATUSCODE_BADTCPENDPOINTURLINVALID if parsing failed. */ -UA_StatusCode UA_EXPORT -UA_parseEndpointUrl(const UA_String *endpointUrl, UA_String *outHostname, - UA_UInt16 *outPort, UA_String *outPath); + void (*deleteMembers)(UA_ServerNetworkLayer *nl); +}; -#ifdef __cplusplus -} // extern "C" -#endif +/** + * Client Network Layer + * -------------------- + * The client has only a single connection used for sending and receiving binary + * messages. */ + +/* @param config the connection config for this client + * @param endpointUrl to where to connect + * @param timeout in ms until the connection try times out if remote not reachable + * @param logger the logger to use */ +typedef UA_Connection +(*UA_ConnectClientConnection)(UA_ConnectionConfig config, UA_String endpointUrl, + UA_UInt32 timeout, UA_Logger *logger); +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_plugin_access_control.h" ***********************************/ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/plugin/accesscontrol.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2017 (c) Stefan Profanter, fortiss GmbH */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS + +struct UA_AccessControl; +typedef struct UA_AccessControl UA_AccessControl; /** * .. _access-control: @@ -12558,9 +25712,6 @@ extern "C" { * The access control callback is used to authenticate sessions and grant access * rights accordingly. */ -struct UA_AccessControl; -typedef struct UA_AccessControl UA_AccessControl; - struct UA_AccessControl { void *context; void (*deleteMembers)(UA_AccessControl *ac); @@ -12568,10 +25719,14 @@ struct UA_AccessControl { /* Supported login mechanisms. The server endpoints are created from here. */ size_t userTokenPoliciesSize; UA_UserTokenPolicy *userTokenPolicies; - - /* Authenticate a session. The session context is attached to the session and - * later passed into the node-based access control callbacks. */ + + /* Authenticate a session. The session context is attached to the session + * and later passed into the node-based access control callbacks. The new + * session is rejected if a StatusCode other than UA_STATUSCODE_GOOD is + * returned. */ UA_StatusCode (*activateSession)(UA_Server *server, UA_AccessControl *ac, + const UA_EndpointDescription *endpointDescription, + const UA_ByteString *secureChannelRemoteCertificate, const UA_NodeId *sessionId, const UA_ExtensionObject *userIdentityToken, void **sessionContext); @@ -12621,27 +25776,39 @@ struct UA_AccessControl { UA_Boolean (*allowDeleteReference)(UA_Server *server, UA_AccessControl *ac, const UA_NodeId *sessionId, void *sessionContext, const UA_DeleteReferencesItem *item); +#ifdef UA_ENABLE_HISTORIZING + /* Allow insert,replace,update of historical data */ + UA_Boolean (*allowHistoryUpdateUpdateData)(UA_Server *server, UA_AccessControl *ac, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeId, + UA_PerformUpdateType performInsertReplace, + const UA_DataValue *value); + + /* Allow delete of historical data */ + UA_Boolean (*allowHistoryUpdateDeleteRawModified)(UA_Server *server, UA_AccessControl *ac, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeId, + UA_DateTime startTimestamp, + UA_DateTime endTimestamp, + bool isDeleteModified); +#endif }; -#ifdef __cplusplus -} -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_plugin_pki.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/plugin/pki.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS /** * Public Key Infrastructure Integration @@ -12679,33 +25846,33 @@ struct UA_CertificateVerification { void (*deleteMembers)(UA_CertificateVerification *cv); }; -#ifdef __cplusplus -} -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_plugin_securitypolicy.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/plugin/securitypolicy.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2017 (c) Stefan Profanter, fortiss GmbH */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS -extern const UA_ByteString UA_SECURITY_POLICY_NONE_URI; +extern UA_EXPORT const UA_ByteString UA_SECURITY_POLICY_NONE_URI; struct UA_SecurityPolicy; typedef struct UA_SecurityPolicy UA_SecurityPolicy; +/** + * SecurityPolicy Interface Definition + * ----------------------------------- */ + typedef struct { UA_String uri; @@ -12854,14 +26021,10 @@ typedef struct { } UA_SecurityPolicyEncryptionAlgorithm; typedef struct { - /* - * The algorithm used to sign and verify certificates. - */ + /* The algorithm used to sign and verify certificates. */ UA_SecurityPolicySignatureAlgorithm signatureAlgorithm; - /* - * The algorithm used to encrypt and decrypt messages. - */ + /* The algorithm used to encrypt and decrypt messages. */ UA_SecurityPolicyEncryptionAlgorithm encryptionAlgorithm; } UA_SecurityPolicyCryptoModule; @@ -13034,44 +26197,869 @@ struct UA_SecurityPolicy { UA_SecurityPolicyChannelModule channelModule; UA_CertificateVerification *certificateVerification; - UA_Logger logger; + const UA_Logger *logger; + + /* Updates the ApplicationInstanceCertificate and the corresponding private + * key at runtime. */ + UA_StatusCode (*updateCertificateAndPrivateKey)(UA_SecurityPolicy *policy, + const UA_ByteString newCertificate, + const UA_ByteString newPrivateKey); /* Deletes the dynamic content of the policy */ void (*deleteMembers)(UA_SecurityPolicy *policy); }; +/* Gets the number of bytes that are needed by the encryption function in + * addition to the length of the plaintext message. This is needed, since + * most RSA encryption methods have their own padding mechanism included. + * This makes the encrypted message larger than the plainText, so we need to + * have enough room in the buffer for the overhead. + * + * @param securityPolicy the algorithms to use. + * @param channelContext the retrieve data from. + * @param maxEncryptionLength the maximum number of bytes that the data to + * encrypt can be. */ +size_t +UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(const UA_SecurityPolicy *securityPolicy, + const void *channelContext, + size_t maxEncryptionLength); + +/* Gets the a pointer to the context of a security policy supported by the + * server matched by the security policy uri. + * + * @param server the server context. + * @param securityPolicyUri the security policy to get the context of. */ +UA_SecurityPolicy * +UA_SecurityPolicy_getSecurityPolicyByUri(const UA_Server *server, + const UA_ByteString *securityPolicyUri); + +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/server_pubsub.h" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner) + * Copyright (c) 2019 Kalycito Infotech Private Limited + */ + +#ifndef UA_SERVER_PUBSUB_H +#define UA_SERVER_PUBSUB_H + + +_UA_BEGIN_DECLS + +#ifdef UA_ENABLE_PUBSUB + +/** + * .. _pubsub: + * + * Publish/Subscribe + * ================= + * + * Work in progress! + * This part will be a new chapter later. + * + * TODO: write general PubSub introduction + * + * The Publish/Subscribe (PubSub) extension for OPC UA enables fast and efficient + * 1:m communication. The PubSub extension is protocol agnostic and can be used + * with broker based protocols like MQTT and AMQP or brokerless implementations like UDP-Multicasting. + * + * The PubSub API uses the following scheme: + * + * 1. Create a configuration for the needed PubSub element. + * + * 2. Call the add[element] function and pass in the configuration. + * + * 3. The add[element] function returns the unique nodeId of the internally created element. + * + * Take a look on the PubSub Tutorials for mor details about the API usage.:: + * + * +-----------+ + * | UA_Server | + * +-----------+ + * | | + * | | + * | | + * | | +----------------------+ + * | +--> UA_PubSubConnection | UA_Server_addPubSubConnection + * | +----------------------+ + * | | | + * | | | +----------------+ + * | | +----> UA_WriterGroup | UA_PubSubConnection_addWriterGroup + * | | +----------------+ + * | | | + * | | | +------------------+ + * | | +----> UA_DataSetWriter | UA_WriterGroup_addDataSetWriter +-+ + * | | +------------------+ | + * | | | + * | | +----------------+ | r + * | +---------> UA_ReaderGroup | | e + * | +----------------+ | f + * | | + * | +---------------------------+ | + * +-------> UA_PubSubPublishedDataSet | UA_Server_addPublishedDataSet <-+ + * +---------------------------+ + * | + * | +-----------------+ + * +----> UA_DataSetField | UA_PublishedDataSet_addDataSetField + * +-----------------+ + * + * PubSub compile flags + * -------------------- + * + * **UA_ENABLE_PUBSUB** + * Enable the experimental OPC UA PubSub support. The option will include the PubSub UDP multicast plugin. Disabled by default. + * **UA_ENABLE_PUBSUB_DELTAFRAMES** + * The PubSub messages differentiate between keyframe (all published values contained) and deltaframe (only changed values contained) messages. + * Deltaframe messages creation consumes some additional ressources and can be disabled with this flag. Disabled by default. + * Compile the human-readable name of the StatusCodes into the binary. Disabled by default. + * **UA_ENABLE_PUBSUB_INFORMATIONMODEL** + * Enable the information model representation of the PubSub configuration. For more details take a look at the following section `PubSub Information Model Representation`. Disabled by default. + * + * PubSub Information Model Representation + * --------------------------------------- + * .. _pubsub_informationmodel: + * + * The complete PubSub configuration is available inside the information model. + * The entry point is the node 'PublishSubscribe, located under the Server node. + * The standard defines for PubSub no new Service set. The configuration can optionally + * done over methods inside the information model. The information model representation + * of the current PubSub configuration is generated automatically. This feature + * can enabled/disable by changing the UA_ENABLE_PUBSUB_INFORMATIONMODEL option. + * + * Connections + * ----------- + * The PubSub connections are the abstraction between the concrete transport protocol + * and the PubSub functionality. It is possible to create multiple connections with + * different transport protocols at runtime. + * + * Take a look on the PubSub Tutorials for mor details about the API usage. + */ + +typedef enum { + UA_PUBSUB_PUBLISHERID_NUMERIC, + UA_PUBSUB_PUBLISHERID_STRING +} UA_PublisherIdType; + +typedef struct { + UA_String name; + UA_Boolean enabled; + UA_PublisherIdType publisherIdType; + union { /* std: valid types UInt or String */ + UA_UInt32 numeric; + UA_String string; + } publisherId; + UA_String transportProfileUri; + UA_Variant address; + size_t connectionPropertiesSize; + UA_KeyValuePair *connectionProperties; + UA_Variant connectionTransportSettings; +} UA_PubSubConnectionConfig; + +UA_StatusCode UA_EXPORT +UA_Server_addPubSubConnection(UA_Server *server, + const UA_PubSubConnectionConfig *connectionConfig, + UA_NodeId *connectionIdentifier); + +/* Returns a deep copy of the config */ +UA_StatusCode UA_EXPORT +UA_Server_getPubSubConnectionConfig(UA_Server *server, + const UA_NodeId connection, + UA_PubSubConnectionConfig *config); + +/* Remove Connection, identified by the NodeId. Deletion of Connection + * removes all contained WriterGroups and Writers. */ +UA_StatusCode UA_EXPORT +UA_Server_removePubSubConnection(UA_Server *server, const UA_NodeId connection); + +/** + * PublishedDataSets + * ----------------- + * The PublishedDataSets (PDS) are containers for the published information. The + * PDS contain the published variables and meta informations. The metadata is + * commonly autogenerated or given as constant argument as part of the template + * functions. The template functions are standard defined and intended for + * configuration tools. You should normally create a empty PDS and call the + * functions to add new fields. */ + +/* The UA_PUBSUB_DATASET_PUBLISHEDITEMS has currently no additional members and + * thus no dedicated config structure. */ + +typedef enum { + UA_PUBSUB_DATASET_PUBLISHEDITEMS, + UA_PUBSUB_DATASET_PUBLISHEDEVENTS, + UA_PUBSUB_DATASET_PUBLISHEDITEMS_TEMPLATE, + UA_PUBSUB_DATASET_PUBLISHEDEVENTS_TEMPLATE, +} UA_PublishedDataSetType; + +typedef struct { + UA_DataSetMetaDataType metaData; + size_t variablesToAddSize; + UA_PublishedVariableDataType *variablesToAdd; +} UA_PublishedDataItemsTemplateConfig; + +typedef struct { + UA_NodeId eventNotfier; + UA_ContentFilter filter; +} UA_PublishedEventConfig; + +typedef struct { + UA_DataSetMetaDataType metaData; + UA_NodeId eventNotfier; + size_t selectedFieldsSize; + UA_SimpleAttributeOperand *selectedFields; + UA_ContentFilter filter; +} UA_PublishedEventTemplateConfig; + +/* Configuration structure for PublishedDataSet */ +typedef struct { + UA_String name; + UA_PublishedDataSetType publishedDataSetType; + union { + /* The UA_PUBSUB_DATASET_PUBLISHEDITEMS has currently no additional members + * and thus no dedicated config structure.*/ + UA_PublishedDataItemsTemplateConfig itemsTemplate; + UA_PublishedEventConfig event; + UA_PublishedEventTemplateConfig eventTemplate; + } config; +} UA_PublishedDataSetConfig; + +void UA_EXPORT +UA_PublishedDataSetConfig_deleteMembers(UA_PublishedDataSetConfig *pdsConfig); + +typedef struct { + UA_StatusCode addResult; + size_t fieldAddResultsSize; + UA_StatusCode *fieldAddResults; + UA_ConfigurationVersionDataType configurationVersion; +} UA_AddPublishedDataSetResult; + +UA_AddPublishedDataSetResult UA_EXPORT +UA_Server_addPublishedDataSet(UA_Server *server, + const UA_PublishedDataSetConfig *publishedDataSetConfig, + UA_NodeId *pdsIdentifier); + +/* Returns a deep copy of the config */ +UA_StatusCode UA_EXPORT +UA_Server_getPublishedDataSetConfig(UA_Server *server, const UA_NodeId pds, + UA_PublishedDataSetConfig *config); + +/* Remove PublishedDataSet, identified by the NodeId. Deletion of PDS removes + * all contained and linked PDS Fields. Connected WriterGroups will be also + * removed. */ +UA_StatusCode UA_EXPORT +UA_Server_removePublishedDataSet(UA_Server *server, const UA_NodeId pds); + +/** + * DataSetFields + * ------------- + * The description of published variables is named DataSetField. Each + * DataSetField contains the selection of one information model node. The + * DataSetField has additional parameters for the publishing, sampling and error + * handling process. */ + +typedef struct{ + UA_ConfigurationVersionDataType configurationVersion; + UA_String fieldNameAlias; + UA_Boolean promotedField; + UA_PublishedVariableDataType publishParameters; +} UA_DataSetVariableConfig; + +typedef enum { + UA_PUBSUB_DATASETFIELD_VARIABLE, + UA_PUBSUB_DATASETFIELD_EVENT +} UA_DataSetFieldType; + +typedef struct { + UA_DataSetFieldType dataSetFieldType; + union { + /* events need other config later */ + UA_DataSetVariableConfig variable; + } field; +} UA_DataSetFieldConfig; + +void UA_EXPORT +UA_DataSetFieldConfig_deleteMembers(UA_DataSetFieldConfig *dataSetFieldConfig); + +typedef struct { + UA_StatusCode result; + UA_ConfigurationVersionDataType configurationVersion; +} UA_DataSetFieldResult; + +UA_DataSetFieldResult UA_EXPORT +UA_Server_addDataSetField(UA_Server *server, + const UA_NodeId publishedDataSet, + const UA_DataSetFieldConfig *fieldConfig, + UA_NodeId *fieldIdentifier); + +/* Returns a deep copy of the config */ +UA_StatusCode UA_EXPORT +UA_Server_getDataSetFieldConfig(UA_Server *server, const UA_NodeId dsf, + UA_DataSetFieldConfig *config); + +UA_DataSetFieldResult UA_EXPORT +UA_Server_removeDataSetField(UA_Server *server, const UA_NodeId dsf); + +/** + * WriterGroup + * ----------- + * All WriterGroups are created within a PubSubConnection and automatically + * deleted if the connection is removed. The WriterGroup is primary used as + * container for :ref:`dsw` and network message settings. The WriterGroup can be + * imagined as producer of the network messages. The creation of network + * messages is controlled by parameters like the publish interval, which is e.g. + * contained in the WriterGroup. */ + +typedef enum { + UA_PUBSUB_ENCODING_BINARY, + UA_PUBSUB_ENCODING_JSON, + UA_PUBSUB_ENCODING_UADP +} UA_PubSubEncodingType; + +typedef struct { + UA_String name; + UA_Boolean enabled; + UA_UInt16 writerGroupId; + UA_Duration publishingInterval; + UA_Double keepAliveTime; + UA_Byte priority; + UA_MessageSecurityMode securityMode; + UA_ExtensionObject transportSettings; + UA_ExtensionObject messageSettings; + size_t groupPropertiesSize; + UA_KeyValuePair *groupProperties; + UA_PubSubEncodingType encodingMimeType; + + /* non std. config parameter. maximum count of embedded DataSetMessage in + * one NetworkMessage */ + UA_UInt16 maxEncapsulatedDataSetMessageCount; +} UA_WriterGroupConfig; + +void UA_EXPORT +UA_WriterGroupConfig_deleteMembers(UA_WriterGroupConfig *writerGroupConfig); + +/* Add a new WriterGroup to an existing Connection */ +UA_StatusCode UA_EXPORT +UA_Server_addWriterGroup(UA_Server *server, const UA_NodeId connection, + const UA_WriterGroupConfig *writerGroupConfig, + UA_NodeId *writerGroupIdentifier); + +/* Returns a deep copy of the config */ +UA_StatusCode UA_EXPORT +UA_Server_getWriterGroupConfig(UA_Server *server, const UA_NodeId writerGroup, + UA_WriterGroupConfig *config); + +UA_StatusCode UA_EXPORT +UA_Server_updateWriterGroupConfig(UA_Server *server, UA_NodeId writerGroupIdentifier, + const UA_WriterGroupConfig *config); + +UA_StatusCode UA_EXPORT +UA_Server_removeWriterGroup(UA_Server *server, const UA_NodeId writerGroup); + +/** + * .. _dsw: + * + * DataSetWriter + * ------------- + * The DataSetWriters are the glue between the WriterGroups and the + * PublishedDataSets. The DataSetWriter contain configuration parameters and + * flags which influence the creation of DataSet messages. These messages are + * encapsulated inside the network message. The DataSetWriter must be linked + * with an existing PublishedDataSet and be contained within a WriterGroup. */ + +typedef struct { + UA_String name; + UA_UInt16 dataSetWriterId; + UA_DataSetFieldContentMask dataSetFieldContentMask; + UA_UInt32 keyFrameCount; + UA_ExtensionObject messageSettings; + UA_String dataSetName; + size_t dataSetWriterPropertiesSize; + UA_KeyValuePair *dataSetWriterProperties; +} UA_DataSetWriterConfig; + +void UA_EXPORT +UA_DataSetWriterConfig_deleteMembers(UA_DataSetWriterConfig *pdsConfig); + +/* Add a new DataSetWriter to a existing WriterGroup. The DataSetWriter must be + * coupled with a PublishedDataSet on creation. + * + * Part 14, 7.1.5.2.1 defines: The link between the PublishedDataSet and + * DataSetWriter shall be created when an instance of the DataSetWriterType is + * created. */ +UA_StatusCode UA_EXPORT +UA_Server_addDataSetWriter(UA_Server *server, + const UA_NodeId writerGroup, const UA_NodeId dataSet, + const UA_DataSetWriterConfig *dataSetWriterConfig, + UA_NodeId *writerIdentifier); + +/* Returns a deep copy of the config */ +UA_StatusCode UA_EXPORT +UA_Server_getDataSetWriterConfig(UA_Server *server, const UA_NodeId dsw, + UA_DataSetWriterConfig *config); + +UA_StatusCode UA_EXPORT +UA_Server_removeDataSetWriter(UA_Server *server, const UA_NodeId dsw); + +/** + * DataSetReader + * ------------- + * DataSetReader can receive NetworkMessages with the DataSet + * of interest sent by the Publisher. DataSetReaders represent + * the configuration necessary to receive and process DataSetMessages + * on the Subscriber side */ + +/* Parameters for PubSubSecurity */ +typedef struct { + UA_Int32 securityMode; /* placeholder datatype 'MessageSecurityMode' */ + UA_String securityGroupId; + size_t keyServersSize; + UA_Int32 *keyServers; +} UA_PubSubSecurityParameters; + +/* Parameters for PubSub DataSetReader Configuration */ +typedef struct { + UA_String name; + UA_Variant publisherId; + UA_UInt16 writerGroupId; + UA_UInt16 dataSetWriterId; + UA_DataSetMetaDataType dataSetMetaData; + UA_DataSetFieldContentMask dataSetFieldContentMask; + UA_Double messageReceiveTimeout; + UA_PubSubSecurityParameters securityParameters; + UA_UadpDataSetReaderMessageDataType messageSettings; + UA_TargetVariablesDataType subscribedDataSetTarget; +} UA_DataSetReaderConfig; + +/* Update configuration to the dataSetReader */ +UA_StatusCode +UA_Server_DataSetReader_updateConfig(UA_Server *server, UA_NodeId dataSetReaderIdentifier, + UA_NodeId readerGroupIdentifier, const UA_DataSetReaderConfig *config); + +/* Get configuration of the dataSetReader */ +UA_StatusCode +UA_Server_DataSetReader_getConfig(UA_Server *server, UA_NodeId dataSetReaderIdentifier, + UA_DataSetReaderConfig *config); + +/* Return Status Code after creating TargetVariables in Subscriber AddressSpace + * TargetVariables define a list of variable mappings between received DataSet fields + * and the TargetVariables in the Subscriber AddressSpace */ +UA_StatusCode +UA_Server_DataSetReader_createTargetVariables(UA_Server *server, UA_NodeId dataSetReaderIdentifier, + UA_TargetVariablesDataType* targetVariables); + +/* To Do:Implementation of SubscribedDataSetMirrorType + * UA_StatusCode + * A_PubSubDataSetReader_createDataSetMirror(UA_Server *server, UA_NodeId dataSetReaderIdentifier, + * UA_SubscribedDataSetMirrorDataType* mirror) */ + +/** + * ReaderGroup + * ----------- + * All ReaderGroups are created within a PubSubConnection and automatically + * deleted if the connection is removed. */ + +/* ReaderGroup configuration */ +typedef struct { + UA_String name; + UA_PubSubSecurityParameters securityParameters; +} UA_ReaderGroupConfig; + +/* Add DataSetReader to the ReaderGroup */ +UA_StatusCode +UA_Server_addDataSetReader(UA_Server *server, UA_NodeId readerGroupIdentifier, + const UA_DataSetReaderConfig *dataSetReaderConfig, + UA_NodeId *readerIdentifier); + +/* Remove DataSetReader from ReaderGroup */ +UA_StatusCode +UA_Server_removeDataSetReader(UA_Server *server, UA_NodeId readerIdentifier); + +/* To Do: Update Configuration of ReaderGroup */ +UA_StatusCode +UA_Server_ReaderGroup_updateConfig(UA_Server *server, UA_NodeId readerGroupIdentifier, + const UA_ReaderGroupConfig *config); + +/* Get configuraiton of ReaderGroup */ +UA_StatusCode +UA_Server_ReaderGroup_getConfig(UA_Server *server, UA_NodeId readerGroupIdentifier, + UA_ReaderGroupConfig *config); + +/* Add ReaderGroup to the created connection */ +UA_StatusCode +UA_Server_addReaderGroup(UA_Server *server, UA_NodeId connectionIdentifier, + const UA_ReaderGroupConfig *readerGroupConfig, + UA_NodeId *readerGroupIdentifier); + +/* Remove ReaderGroup from connection */ +UA_StatusCode +UA_Server_removeReaderGroup(UA_Server *server, UA_NodeId groupIdentifier); + +#endif /* UA_ENABLE_PUBSUB */ + +_UA_END_DECLS + +#endif /* UA_SERVER_PUBSUB_H */ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/plugin/pubsub.h" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner) + */ + + + +_UA_BEGIN_DECLS + +#ifdef UA_ENABLE_PUBSUB + +/** + * .. _pubsub_connection: + * + * PubSub Connection Plugin API + * ============================ + * + * The PubSub Connection API is the interface between concrete network + * implementations and the internal pubsub code. + * + * The PubSub specification enables the creation of new connections on runtime. + * Wording: 'Connection' -> OPC UA standard 'highlevel' perspective, 'Channel' + * -> open62541 implementation 'lowlevel' perspective. A channel can be assigned + * with different network implementations like UDP, MQTT, AMQP. The channel + * provides basis services like send, regist, unregist, receive, close. */ + +typedef enum { + UA_PUBSUB_CHANNEL_RDY, + UA_PUBSUB_CHANNEL_PUB, + UA_PUBSUB_CHANNEL_SUB, + UA_PUBSUB_CHANNEL_PUB_SUB, + UA_PUBSUB_CHANNEL_ERROR, + UA_PUBSUB_CHANNEL_CLOSED +} UA_PubSubChannelState; + +struct UA_PubSubChannel; +typedef struct UA_PubSubChannel UA_PubSubChannel; + +/* Interface structure between network plugin and internal implementation */ +struct UA_PubSubChannel { + UA_UInt32 publisherId; /* unique identifier */ + UA_PubSubChannelState state; + UA_PubSubConnectionConfig *connectionConfig; /* link to parent connection config */ + UA_SOCKET sockfd; + void *handle; /* implementation specific data */ + /*@info for handle: each network implementation should provide an structure + * UA_PubSubChannelData[ImplementationName] This structure can be used by the + * network implementation to store network implementation specific data.*/ + + /* Sending out the content of the buf parameter */ + UA_StatusCode (*send)(UA_PubSubChannel *channel, UA_ExtensionObject *transportSettings, + const UA_ByteString *buf); + + /* Register to an specified message source, e.g. multicast group or topic. Callback is used for mqtt. */ + UA_StatusCode (*regist)(UA_PubSubChannel * channel, UA_ExtensionObject *transportSettings, + void (*callback)(UA_ByteString *encodedBuffer, UA_ByteString *topic)); + + /* Remove subscription to an specified message source, e.g. multicast group or topic */ + UA_StatusCode (*unregist)(UA_PubSubChannel * channel, UA_ExtensionObject *transportSettings); + + /* Receive messages. A regist to the message source is needed before. */ + UA_StatusCode (*receive)(UA_PubSubChannel * channel, UA_ByteString *, + UA_ExtensionObject *transportSettings, UA_UInt32 timeout); + + /* Closing the connection and implicit free of the channel structures. */ + UA_StatusCode (*close)(UA_PubSubChannel *channel); + + /* Giving the connection protocoll time to process inbound and outbound traffic. */ + UA_StatusCode (*yield)(UA_PubSubChannel *channel, UA_UInt16 timeout); +}; + +/** + * The UA_PubSubTransportLayer is used for the creation of new connections. + * Whenever on runtime a new connection is request, the internal PubSub + * implementation call * the 'createPubSubChannel' function. The + * 'transportProfileUri' contains the standard defined transport profile + * information and is used to identify the type of connections which can be + * created by the TransportLayer. The server config contains a list of + * UA_PubSubTransportLayer. Take a look in the tutorial_pubsub_connection to get + * informations about the TransportLayer handling. */ + typedef struct { - UA_SecurityPolicy securityPolicy; - UA_EndpointDescription endpointDescription; -} UA_Endpoint; + UA_String transportProfileUri; + UA_PubSubChannel *(*createPubSubChannel)(UA_PubSubConnectionConfig *connectionConfig); +} UA_PubSubTransportLayer; + +/** + * The UA_ServerConfig_addPubSubTransportLayer is used to add a transport layer + * to the server configuration. The list memory is allocated and will be freed + * with UA_PubSubManager_delete. + * + * .. note:: If the UA_String transportProfileUri was dynamically allocated + * the memory has to be freed when no longer required. + * + * .. note:: This has to be done before the server is started with UA_Server_run. */ +UA_StatusCode UA_EXPORT +UA_ServerConfig_addPubSubTransportLayer(UA_ServerConfig *config, + UA_PubSubTransportLayer *pubsubTransportLayer); + +#endif /* UA_ENABLE_PUBSUB */ + +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/deps/ziptree.h" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2018 (c) Julius Pfrommer + */ + + +#ifdef __cplusplus +extern "C" { +#endif -/* Gets the number of bytes that are needed by the encryption function in - * addition to the length of the plaintext message. This is needed, since - * most RSA encryption methods have their own padding mechanism included. - * This makes the encrypted message larger than the plainText, so we need to - * have enough room in the buffer for the overhead. +/* Reusable zip tree implementation. The style is inspired by the BSD + * sys/queue.h linked list definition. * - * @param securityPolicy the algorithms to use. - * @param channelContext the retrieve data from. - * @param maxEncryptionLength the maximum number of bytes that the data to - * encrypt can be. */ -size_t -UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(const UA_SecurityPolicy *securityPolicy, - const void *channelContext, - size_t maxEncryptionLength); + * Zip trees were developed in: Tarjan, R. E., Levy, C. C., and Timmel, S. "Zip + * Trees." arXiv preprint arXiv:1806.06726 (2018). + * + * The ZIP_ENTRY definitions are to be contained in the tree entries themselves. + * Use ZIP_PROTTYPE to define the signature of the zip tree and ZIP_IMPL (in a + * .c compilation unit) for the method implementations. + * + * Zip trees are a probabilistic data structure. Entries are assigned a + * (nonzero) rank k with probability 1/2^{k+1}. This header file does not assume + * a specific random number generator. So the rank must be given when an entry + * is inserted. A fast way (with a single call to a pseudo random generator) to + * compute the rank is with ZIP_FFS32(random()). The ZIP_FFS32 returns the least + * significant nonzero bit of a 32bit number. */ + +#define ZIP_HEAD(name, type) \ +struct name { \ + struct type *zip_root; \ +} + +#define ZIP_INIT(head) do { (head)->zip_root = NULL; } while (0) +#define ZIP_ROOT(head) (head)->zip_root +#define ZIP_EMPTY(head) (ZIP_ROOT(head) == NULL) + +#define ZIP_ENTRY(type) \ +struct { \ + struct type *zip_left; \ + struct type *zip_right; \ + unsigned char rank; \ +} + +#define ZIP_LEFT(elm, field) (elm)->field.zip_left +#define ZIP_RIGHT(elm, field) (elm)->field.zip_right +#define ZIP_RANK(elm, field) (elm)->field.rank + +/* Shortcuts */ +#define ZIP_INSERT(name, head, elm, rank) name##_ZIP_INSERT(head, elm, rank) +#define ZIP_REMOVE(name, head, elm) name##_ZIP_REMOVE(head, elm) +#define ZIP_FIND(name, head, key) name##_ZIP_FIND(head, key) +#define ZIP_MIN(name, head) name##_ZIP_MIN(head) +#define ZIP_MAX(name, head) name##_ZIP_MAX(head) +#define ZIP_ITER(name, head, cb, d) name##_ZIP_ITER(head, cb, d) + +/* Zip tree method prototypes */ +#define ZIP_PROTTYPE(name, type, keytype) \ +void name##_ZIP_INSERT(struct name *head, struct type *elm, unsigned char rank); \ +void name##_ZIP_REMOVE(struct name *head, struct type *elm); \ +struct type *name##_ZIP_FIND(struct name *head, const keytype *key); \ +struct type *name##_ZIP_MIN(struct name *head); \ +struct type *name##_ZIP_MAX(struct name *head); \ +typedef void (*name##_cb)(struct type *elm, void *data); \ +void name##_ZIP_ITER(struct name *head, name##_cb cb, void *data); \ + +/* The comparison method "cmp" defined for every zip tree has the signature + * + * enum ZIP_CMP cmpDateTime(const keytype *a, const keytype *b); + * + * The entries need an absolute ordering. So ZIP_CMP_EQ must only be returned if + * a and b point to the same memory. (E.g. assured by unique identifiers.) */ +enum ZIP_CMP { + ZIP_CMP_LESS = -1, + ZIP_CMP_EQ = 0, + ZIP_CMP_MORE = 1 +}; -#ifdef __cplusplus +/* Find the position of the first bit in an unsigned 32bit integer */ +#ifdef _MSC_VER +static __inline +#else +static inline +#endif +unsigned char +ZIP_FFS32(unsigned int v) { + unsigned int t = 1; + unsigned char r = 1; + if(v == 0) return 0; + while((v & t) == 0) { + t = t << 1; r++; + } + return r; +} + +/* Zip tree method implementations */ +#define ZIP_IMPL(name, type, field, keytype, keyfield, cmp) \ +static struct type * \ +__##name##_ZIP_INSERT(struct type *root, struct type *elm) { \ + if(!root) { \ + ZIP_LEFT(elm, field) = NULL; \ + ZIP_RIGHT(elm, field) = NULL; \ + return elm; \ + } \ + if((cmp)(&(elm)->keyfield, &(root)->keyfield) == ZIP_CMP_LESS) { \ + if(__##name##_ZIP_INSERT(ZIP_LEFT(root, field), elm) == elm) { \ + if(ZIP_RANK(elm, field) < ZIP_RANK(root, field)) { \ + ZIP_LEFT(root, field) = elm; \ + } else { \ + ZIP_LEFT(root, field) = ZIP_RIGHT(elm, field); \ + ZIP_RIGHT(elm, field) = root; \ + return elm; \ + } \ + } \ + } else { \ + if(__##name##_ZIP_INSERT(ZIP_RIGHT(root, field), elm) == elm) { \ + if(ZIP_RANK(elm, field) <= ZIP_RANK(root, field)) { \ + ZIP_RIGHT(root, field) = elm; \ + } else { \ + ZIP_RIGHT(root, field) = ZIP_LEFT(elm, field); \ + ZIP_LEFT(elm, field) = root; \ + return elm; \ + } \ + } \ + } \ + return root; \ +} \ + \ +void \ +name##_ZIP_INSERT(struct name *head, struct type *elm, \ + unsigned char rank) { \ + ZIP_RANK(elm, field) = rank; \ + ZIP_ROOT(head) = __##name##_ZIP_INSERT(ZIP_ROOT(head), elm); \ +} \ + \ +static struct type * \ +__##name##ZIP(struct type *x, struct type *y) { \ + if(!x) return y; \ + if(!y) return x; \ + if(ZIP_RANK(x, field) < ZIP_RANK(y, field)) { \ + ZIP_LEFT(y, field) = __##name##ZIP(x, ZIP_LEFT(y, field)); \ + return y; \ + } \ + ZIP_RIGHT(x, field) = __##name##ZIP(ZIP_RIGHT(x, field), y); \ + return x; \ +} \ + \ +static struct type * \ +__##name##_ZIP_REMOVE(struct type *root, struct type *elm) { \ + if(root == elm) \ + return __##name##ZIP(ZIP_LEFT(root, field), \ + ZIP_RIGHT(root, field)); \ + enum ZIP_CMP eq = (cmp)(&(elm)->keyfield, &(root)->keyfield); \ + if(eq == ZIP_CMP_LESS) { \ + struct type *left = ZIP_LEFT(root, field); \ + if(elm == left) \ + ZIP_LEFT(root, field) = \ + __##name##ZIP(ZIP_LEFT(left, field), \ + ZIP_RIGHT(left, field)); \ + else \ + __##name##_ZIP_REMOVE(left, elm); \ + } else { \ + struct type *right = ZIP_RIGHT(root, field); \ + if(elm == right) \ + ZIP_RIGHT(root, field) = \ + __##name##ZIP(ZIP_LEFT(right, field), \ + ZIP_RIGHT(right, field)); \ + else \ + __##name##_ZIP_REMOVE(right, elm); \ + } \ + return root; \ +} \ + \ +void \ +name##_ZIP_REMOVE(struct name *head, struct type *elm) { \ + ZIP_ROOT(head) = __##name##_ZIP_REMOVE(ZIP_ROOT(head), elm); \ +} \ + \ +static struct type * \ +__##name##_ZIP_FIND(struct type *root, const keytype *key) { \ + if(!root) \ + return NULL; \ + enum ZIP_CMP eq = (cmp)(key, &(root)->keyfield); \ + if(eq == ZIP_CMP_EQ) { \ + return root; \ + } \ + if(eq == ZIP_CMP_LESS) { \ + return __##name##_ZIP_FIND(ZIP_LEFT(root, field), key); \ + } \ + return __##name##_ZIP_FIND(ZIP_RIGHT(root, field), key); \ +} \ + \ +struct type * \ +name##_ZIP_FIND(struct name *head, const keytype *key) { \ + return __##name##_ZIP_FIND(ZIP_ROOT(head), key); \ +} \ + \ +struct type * \ +name##_ZIP_MIN(struct name *head) { \ + struct type *cur = ZIP_ROOT(head); \ + if(!cur) return NULL; \ + while(ZIP_LEFT(cur, field)) { \ + cur = ZIP_LEFT(cur, field); \ + } \ + return cur; \ +} \ + \ +struct type * \ +name##_ZIP_MAX(struct name *head) { \ + struct type *cur = ZIP_ROOT(head); \ + if(!cur) return NULL; \ + while(ZIP_RIGHT(cur, field)) { \ + cur = ZIP_RIGHT(cur, field); \ + } \ + return cur; \ +} \ + \ +static void \ +__##name##_ZIP_ITER(struct type *elm, name##_cb cb, void *data) { \ + if(!elm) \ + return; \ + __##name##_ZIP_ITER(ZIP_LEFT(elm, field), cb, data); \ + __##name##_ZIP_ITER(ZIP_RIGHT(elm, field), cb, data); \ + cb(elm, data); \ +} \ + \ +void \ +name##_ZIP_ITER(struct name *head, name##_cb cb, void *data) { \ + __##name##_ZIP_ITER(ZIP_ROOT(head), cb, data); \ } + +#ifdef __cplusplus +} /* extern "C" */ #endif -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_plugin_nodestore.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/plugin/nodestore.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2017 (c) Julian Grothoff * Copyright 2017 (c) Stefan Profanter, fortiss GmbH */ @@ -13084,10 +27072,13 @@ UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(const UA_SecurityP * not meant to be used directly by end users. Please use the public server API * / OPC UA services to interact with the information model. */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS + +/* Forward declaration */ +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS +struct UA_MonitoredItem; +#endif /** * .. _information-modelling: @@ -13128,12 +27119,24 @@ extern "C" { * not known or not important. The ``nodeClass`` attribute is used to ensure the * correctness of casting from ``UA_Node`` to a specific node type. */ +/* Ordered tree structure for fast member check */ +typedef struct UA_ReferenceTarget { + ZIP_ENTRY(UA_ReferenceTarget) zipfields; + UA_UInt32 targetHash; /* Hash of the target nodeid */ + UA_ExpandedNodeId target; +} UA_ReferenceTarget; + +ZIP_HEAD(UA_ReferenceTargetHead, UA_ReferenceTarget); +typedef struct UA_ReferenceTargetHead UA_ReferenceTargetHead; +ZIP_PROTTYPE(UA_ReferenceTargetHead, UA_ReferenceTarget, UA_ReferenceTarget) + /* List of reference targets with the same reference type and direction */ typedef struct { UA_NodeId referenceTypeId; UA_Boolean isInverse; - size_t targetIdsSize; - UA_ExpandedNodeId *targetIds; + size_t refTargetsSize; + UA_ReferenceTarget *refTargets; + UA_ReferenceTargetHead refTargetsTree; } UA_NodeReferenceKind; #define UA_NODE_BASEATTRIBUTES \ @@ -13147,7 +27150,8 @@ typedef struct { UA_NodeReferenceKind *references; \ \ /* Members specific to open62541 */ \ - void *context; + void *context; \ + UA_Boolean constructed; /* Constructors were called */ typedef struct { UA_NODE_BASEATTRIBUTES @@ -13248,7 +27252,14 @@ typedef struct { UA_NODE_VARIABLEATTRIBUTES UA_Byte accessLevel; UA_Double minimumSamplingInterval; - UA_Boolean historizing; /* currently unsupported */ + UA_Boolean historizing; + + /* Members specific to open62541 */ + UA_Boolean isDynamic; /* Some variables are "static" in the sense that they + * are not attached to a dynamic process in the + * background. Only dynamic variables conserve source + * and server timestamp for the value attribute. + * Static variables have timestamps of "now". */ } UA_VariableNode; /** @@ -13310,6 +27321,9 @@ typedef struct { typedef struct { UA_NODE_BASEATTRIBUTES +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + struct UA_MonitoredItem *monitoredItemQueue; +#endif UA_Byte eventNotifier; } UA_ObjectNode; @@ -13479,7 +27493,8 @@ typedef struct { /** * Nodestore Plugin API - * -------------------- + * ==================== + * * The following definitions are used for implementing custom node storage * backends. **Most users will want to use the default nodestore and don't need * to work with the nodestore API**. @@ -13488,62 +27503,73 @@ typedef struct { * nodes. Please use the OPC UA services for that. Otherwise, all consistency * checks are omitted. This can crash the application eventually. */ -typedef void (*UA_NodestoreVisitor)(void *visitorContext, const UA_Node *node); +/* For non-multithreaded access, some nodestores allow that nodes are edited + * without a copy/replace. This is not possible when the node is only an + * intermediate representation and stored e.g. in a database backend. */ +extern const UA_Boolean inPlaceEditAllowed; -typedef struct { - /* Nodestore context and lifecycle */ - void *context; - void (*deleteNodestore)(void *nodestoreContext); +/* Nodestore context and lifecycle */ +UA_StatusCode UA_Nodestore_new(void **nsCtx); +void UA_Nodestore_delete(void *nsCtx); - /* For non-multithreaded access, some nodestores allow that nodes are edited - * without a copy/replace. This is not possible when the node is only an - * intermediate representation and stored e.g. in a database backend. */ - UA_Boolean inPlaceEditAllowed; +/** + * The following definitions are used to create empty nodes of the different + * node types. The memory is managed by the nodestore. Therefore, the node has + * to be removed via a special deleteNode function. (If the new node is not + * added to the nodestore.) */ - /* The following definitions are used to create empty nodes of the different - * node types. The memory is managed by the nodestore. Therefore, the node - * has to be removed via a special deleteNode function. (If the new node is - * not added to the nodestore.) */ - UA_Node * (*newNode)(void *nodestoreContext, UA_NodeClass nodeClass); +UA_Node * +UA_Nodestore_newNode(void *nsCtx, UA_NodeClass nodeClass); - void (*deleteNode)(void *nodestoreContext, UA_Node *node); +void +UA_Nodestore_deleteNode(void *nsCtx, UA_Node *node); - /* ``Get`` returns a pointer to an immutable node. ``Release`` indicates - * that the pointer is no longer accessed afterwards. */ +/** + *``Get`` returns a pointer to an immutable node. ``Release`` indicates that the + * pointer is no longer accessed afterwards. */ - const UA_Node * (*getNode)(void *nodestoreContext, const UA_NodeId *nodeId); +const UA_Node * +UA_Nodestore_getNode(void *nsCtx, const UA_NodeId *nodeId); - void (*releaseNode)(void *nodestoreContext, const UA_Node *node); +void +UA_Nodestore_releaseNode(void *nsCtx, const UA_Node *node); - /* Returns an editable copy of a node (needs to be deleted with the - * deleteNode function or inserted / replaced into the nodestore). */ - UA_StatusCode (*getNodeCopy)(void *nodestoreContext, const UA_NodeId *nodeId, - UA_Node **outNode); +/* Returns an editable copy of a node (needs to be deleted with the + * deleteNode function or inserted / replaced into the nodestore). */ +UA_StatusCode +UA_Nodestore_getNodeCopy(void *nsCtx, const UA_NodeId *nodeId, + UA_Node **outNode); - /* Inserts a new node into the nodestore. If the NodeId is zero, then a - * fresh numeric NodeId is assigned. If insertion fails, the node is - * deleted. */ - UA_StatusCode (*insertNode)(void *nodestoreContext, UA_Node *node, - UA_NodeId *addedNodeId); +/* Inserts a new node into the nodestore. If the NodeId is zero, then a fresh + * numeric NodeId is assigned. If insertion fails, the node is deleted. */ +UA_StatusCode +UA_Nodestore_insertNode(void *nsCtx, UA_Node *node, UA_NodeId *addedNodeId); - /* To replace a node, get an editable copy of the node, edit and replace - * with this function. If the node was already replaced since the copy was - * made, UA_STATUSCODE_BADINTERNALERROR is returned. If the NodeId is not - * found, UA_STATUSCODE_BADNODEIDUNKNOWN is returned. In both error cases, - * the editable node is deleted. */ - UA_StatusCode (*replaceNode)(void *nodestoreContext, UA_Node *node); +/* To replace a node, get an editable copy of the node, edit and replace with + * this function. If the node was already replaced since the copy was made, + * UA_STATUSCODE_BADINTERNALERROR is returned. If the NodeId is not found, + * UA_STATUSCODE_BADNODEIDUNKNOWN is returned. In both error cases, the editable + * node is deleted. */ +UA_StatusCode +UA_Nodestore_replaceNode(void *nsCtx, UA_Node *node); - /* Removes a node from the nodestore. */ - UA_StatusCode (*removeNode)(void *nodestoreContext, const UA_NodeId *nodeId); +/* Removes a node from the nodestore. */ +UA_StatusCode +UA_Nodestore_removeNode(void *nsCtx, const UA_NodeId *nodeId); - /* Execute a callback for every node in the nodestore. */ - void (*iterate)(void *nodestoreContext, void* visitorContext, - UA_NodestoreVisitor visitor); -} UA_Nodestore; +/* Execute a callback for every node in the nodestore. */ +typedef void (*UA_NodestoreVisitor)(void *visitorCtx, const UA_Node *node); +void +UA_Nodestore_iterate(void *nsCtx, UA_NodestoreVisitor visitor, + void *visitorCtx); /** - * The following methods specialize internally for the different node classes - * (distinguished by the nodeClass member) */ + * Node Handling + * ============= + * + * To be used only in the nodestore and internally in the SDK. The following + * methods specialize internally for the different node classes, distinguished + * by the NodeClass attribute. */ /* Attributes must be of a matching type (VariableAttributes, ObjectAttributes, * and so on). The attributes are copied. Note that the attributes structs do @@ -13578,27 +27604,30 @@ UA_Node_deleteReferences(UA_Node *node); void UA_EXPORT UA_Node_deleteMembers(UA_Node *node); -#ifdef __cplusplus -} // extern "C" -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_server_config.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/server_config.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2017 (c) Stefan Profanter, fortiss GmbH * Copyright 2017 (c) Henrik Norrman + * Copyright 2018 (c) Fabian Arndt, Root-Core */ -#ifdef __cplusplus -extern "C" { + +#ifdef UA_ENABLE_PUBSUB +#endif + +#ifdef UA_ENABLE_HISTORIZING #endif +_UA_BEGIN_DECLS /** * .. _server-configuration: @@ -13632,6 +27661,29 @@ typedef struct { UA_Duration max; } UA_DurationRange; +#ifdef UA_ENABLE_DISCOVERY +typedef struct { + + /* Timeout in seconds when to automatically remove a registered server from + * the list, if it doesn't re-register within the given time frame. A value + * of 0 disables automatic removal. Default is 60 Minutes (60*60). Must be + * bigger than 10 seconds, because cleanup is only triggered approximately + * every 10 seconds. The server will still be removed depending on the + * state of the semaphore file. */ + UA_UInt32 cleanupTimeout; + + /* Enable mDNS announce and response to queries */ + bool mdnsEnable; + +#ifdef UA_ENABLE_DISCOVERY_MULTICAST + UA_MdnsDiscoveryConfiguration mdns; + UA_String mdnsInterfaceIP; +#endif + +} UA_ServerConfig_Discovery; + +#endif + struct UA_ServerConfig { UA_UInt16 nThreads; /* only if multithreading is enabled */ UA_Logger logger; @@ -13641,32 +27693,41 @@ struct UA_ServerConfig { UA_ApplicationDescription applicationDescription; UA_ByteString serverCertificate; - /* MDNS Discovery */ -#ifdef UA_ENABLE_DISCOVERY - UA_String mdnsServerName; - size_t serverCapabilitiesSize; - UA_String *serverCapabilities; -#endif + UA_Double shutdownDelay; /* Delay in ms from the shutdown signal (ctrl-c) + until the actual shutdown. Clients need to be + able to get a notification ahead of time. */ + + /* Rule Handling */ + UA_RuleHandling verifyRequestTimestamp; /* Verify that the server sends a + * timestamp in the request header */ + + /* Custom DataTypes. Attention! Custom datatypes are not cleaned up together + * with the configuration. So it is possible to allocate them on ROM. */ + const UA_DataTypeArray *customDataTypes; - /* Custom DataTypes */ - size_t customDataTypesSize; - UA_DataType *customDataTypes; /** * .. note:: See the section on :ref:`generic-types`. Examples for working * with custom data types are provided in * ``/examples/custom_datatype/``. */ - /* Nodestore */ - UA_Nodestore nodestore; - /* Networking */ size_t networkLayersSize; UA_ServerNetworkLayer *networkLayers; UA_String customHostname; +#ifdef UA_ENABLE_PUBSUB + /*PubSub network layer */ + size_t pubsubTransportLayersSize; + UA_PubSubTransportLayer *pubsubTransportLayers; +#endif + + /* Available security policies */ + size_t securityPoliciesSize; + UA_SecurityPolicy* securityPolicies; + /* Available endpoints */ size_t endpointsSize; - UA_Endpoint *endpoints; + UA_EndpointDescription *endpoints; /* Node Lifecycle callbacks */ UA_GlobalNodeLifecycle nodeLifecycle; @@ -13683,6 +27744,11 @@ struct UA_ServerConfig { /* Certificate Verification */ UA_CertificateVerification certificateVerification; + /* Relax constraints for the InformationModel */ + UA_Boolean relaxEmptyValueConstraint; /* Nominally, only variables with data + * type BaseDataType can have an empty + * value. */ + /* Limits for SecureChannels */ UA_UInt16 maxSecureChannels; UA_UInt32 maxSecurityTokenLifetime; /* in ms */ @@ -13705,14 +27771,20 @@ struct UA_ServerConfig { UA_UInt32 maxReferencesPerNode; /* Limits for Subscriptions */ + UA_UInt32 maxSubscriptions; UA_UInt32 maxSubscriptionsPerSession; UA_DurationRange publishingIntervalLimits; /* in ms (must not be less than 5) */ UA_UInt32Range lifeTimeCountLimits; UA_UInt32Range keepAliveCountLimits; UA_UInt32 maxNotificationsPerPublish; + UA_Boolean enableRetransmissionQueue; UA_UInt32 maxRetransmissionQueueSize; /* 0 -> unlimited size */ +#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS + UA_UInt32 maxEventsPerNode; /* 0 -> unlimited size */ +#endif /* Limits for MonitoredItems */ + UA_UInt32 maxMonitoredItems; UA_UInt32 maxMonitoredItemsPerSubscription; UA_DurationRange samplingIntervalLimits; /* in ms (must not be less than 5) */ UA_UInt32Range queueSizeLimits; /* Negotiated with the client */ @@ -13722,22 +27794,65 @@ struct UA_ServerConfig { /* Discovery */ #ifdef UA_ENABLE_DISCOVERY - /* Timeout in seconds when to automatically remove a registered server from - * the list, if it doesn't re-register within the given time frame. A value - * of 0 disables automatic removal. Default is 60 Minutes (60*60). Must be - * bigger than 10 seconds, because cleanup is only triggered approximately - * ervery 10 seconds. The server will still be removed depending on the - * state of the semaphore file. */ - UA_UInt32 discoveryCleanupTimeout; + UA_ServerConfig_Discovery discovery; #endif -}; -#ifdef __cplusplus -} +#ifdef UA_ENABLE_SUBSCRIPTIONS + /* Register MonitoredItem in Userland + * + * @param server Allows the access to the server object + * @param sessionId The session id, represented as an node id + * @param sessionContext An optional pointer to user-defined data for the specific data source + * @param nodeid Id of the node in question + * @param nodeidContext An optional pointer to user-defined data, associated + * with the node in the nodestore. Note that, if the node has already been removed, + * this value contains a NULL pointer. + * @param attributeId Identifies which attribute (value, data type etc.) is monitored + * @param removed Determines if the MonitoredItem was removed or created. */ + void (*monitoredItemRegisterCallback)(UA_Server *server, + const UA_NodeId *sessionId, void *sessionContext, + const UA_NodeId *nodeId, void *nodeContext, + UA_UInt32 attibuteId, UA_Boolean removed); +#endif + + /* Historical Access */ +#ifdef UA_ENABLE_HISTORIZING + UA_HistoryDatabase historyDatabase; + + UA_Boolean accessHistoryDataCapability; + UA_UInt32 maxReturnDataValues; /* 0 -> unlimited size */ + + UA_Boolean accessHistoryEventsCapability; + UA_UInt32 maxReturnEventValues; /* 0 -> unlimited size */ + + UA_Boolean insertDataCapability; + UA_Boolean insertEventCapability; + UA_Boolean insertAnnotationsCapability; + + UA_Boolean replaceDataCapability; + UA_Boolean replaceEventCapability; + + UA_Boolean updateDataCapability; + UA_Boolean updateEventCapability; + + UA_Boolean deleteRawCapability; + UA_Boolean deleteEventCapability; + UA_Boolean deleteAtTimeDataCapability; #endif +}; + +void UA_EXPORT +UA_ServerConfig_clean(UA_ServerConfig *config); + +/* Set a custom hostname in server configuration */ +UA_EXPORT void +UA_ServerConfig_setCustomHostname(UA_ServerConfig *config, + const UA_String customHostname); + +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_client_config.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/client_config.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this @@ -13750,10 +27865,11 @@ struct UA_ServerConfig { #ifndef UA_CLIENT_CONFIG_H #define UA_CLIENT_CONFIG_H -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS + +struct UA_Client; +typedef struct UA_Client UA_Client; /** * .. _client-config: @@ -13777,111 +27893,109 @@ extern "C" { * The :ref:`tutorials` provide a good starting point for this. */ typedef enum { - UA_CLIENTSTATE_DISCONNECTED, /* The client is disconnected */ - UA_CLIENTSTATE_CONNECTED, /* A TCP connection to the server is open */ - UA_CLIENTSTATE_SECURECHANNEL, /* A SecureChannel to the server is open */ - UA_CLIENTSTATE_SESSION, /* A session with the server is open */ - UA_CLIENTSTATE_SESSION_RENEWED /* A session with the server is open (renewed) */ + UA_CLIENTSTATE_DISCONNECTED, /* The client is disconnected */ + UA_CLIENTSTATE_WAITING_FOR_ACK, /* The Client has sent HEL and waiting */ + UA_CLIENTSTATE_CONNECTED, /* A TCP connection to the server is open */ + UA_CLIENTSTATE_SECURECHANNEL, /* A SecureChannel to the server is open */ + UA_CLIENTSTATE_SESSION, /* A session with the server is open */ + UA_CLIENTSTATE_SESSION_DISCONNECTED, /* Disconnected vs renewed? */ + UA_CLIENTSTATE_SESSION_RENEWED /* A session with the server is open (renewed) */ } UA_ClientState; +typedef struct { + /* Basic client configuration */ + void *clientContext; /* User-defined data attached to the client */ + UA_Logger logger; /* Logger used by the client */ + UA_UInt32 timeout; /* Response timeout in ms */ + UA_ApplicationDescription clientDescription; -struct UA_Client; -typedef struct UA_Client UA_Client; - -/** - * Client Lifecycle callback - * ^^^^^^^^^^^^^^^^^^^^^^^^^ */ - -typedef void (*UA_ClientStateCallback)(UA_Client *client, UA_ClientState clientState); - -/** - * Subscription Inactivity callback - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ - -#ifdef UA_ENABLE_SUBSCRIPTIONS -typedef void (*UA_SubscriptionInactivityCallback)(UA_Client *client, UA_UInt32 subscriptionId, void *subContext); -#endif - -/** - * Inactivity callback - * ^^^^^^^^^^^^^^^^^^^ */ - -typedef void (*UA_InactivityCallback)(UA_Client *client); + /* Basic connection configuration */ + UA_ExtensionObject userIdentityToken; /* Configured User-Identity Token */ + UA_MessageSecurityMode securityMode; /* None, Sign, SignAndEncrypt. The + * default is invalid. This indicates + * the client to select any matching + * endpoint. */ + UA_String securityPolicyUri; /* SecurityPolicy for the SecureChannel. An + * empty string indicates the client to select + * any matching SecurityPolicy. */ + + /* Advanced connection configuration + * + * If either endpoint or userTokenPolicy has been set (at least one non-zero + * byte in either structure), then the selected Endpoint and UserTokenPolicy + * overwrite the settings in the basic connection configuration. The + * userTokenPolicy array in the EndpointDescription is ignored. The selected + * userTokenPolicy is set in the dedicated configuration field. + * + * If the advanced configuration is not set, the client will write to it the + * selected Endpoint and UserTokenPolicy during GetEndpoints. + * + * The information in the advanced configuration is used during reconnect + * when the SecureChannel was broken. */ + UA_EndpointDescription endpoint; + UA_UserTokenPolicy userTokenPolicy; -/** - * Client Configuration Data - * ^^^^^^^^^^^^^^^^^^^^^^^^^ */ + /* Advanced client configuration */ -typedef struct UA_ClientConfig { - UA_UInt32 timeout; /* ASync + Sync response timeout in ms */ UA_UInt32 secureChannelLifeTime; /* Lifetime in ms (then the channel needs to be renewed) */ - UA_Logger logger; + UA_UInt32 requestedSessionTimeout; /* Session timeout in ms */ UA_ConnectionConfig localConnectionConfig; + UA_UInt32 connectivityCheckInterval; /* Connectivity check interval in ms. + * 0 = background task disabled */ + const UA_DataTypeArray *customDataTypes; /* Custom DataTypes. Attention! + * Custom datatypes are not cleaned + * up together with the + * configuration. So it is possible + * to allocate them on ROM. */ + + /* Available SecurityPolicies */ + size_t securityPoliciesSize; + UA_SecurityPolicy *securityPolicies; + + /* Certificate Verification Plugin */ + UA_CertificateVerification certificateVerification; + + /* Callbacks for async connection handshakes */ UA_ConnectClientConnection connectionFunc; + UA_ConnectClientConnection initConnectionFunc; + void (*pollConnectionFunc)(UA_Client *client, void *context); - /* Custom DataTypes */ - size_t customDataTypesSize; - const UA_DataType *customDataTypes; + /* Callback for state changes */ + void (*stateCallback)(UA_Client *client, UA_ClientState clientState); - /* Callback function */ - UA_ClientStateCallback stateCallback; -#ifdef UA_ENABLE_SUBSCRIPTIONS - /* When outStandingPublishRequests is greater than 0, - * the server automatically create publishRequest when - * UA_Client_runAsync is called. If the client don't receive - * a publishResponse after : - * (sub->publishingInterval * sub->maxKeepAliveCount) + - * client->config.timeout) - * then, the client call subscriptionInactivityCallback - * The connection can be closed, this in an attempt to - * recreate a healthy connection. */ - UA_SubscriptionInactivityCallback subscriptionInactivityCallback; -#endif - - /* When connectivityCheckInterval is greater than 0, - * every connectivityCheckInterval (in ms), a async read request - * is performed on the server. inactivityCallback is called - * when the client receive no response for this read request - * The connection can be closed, this in an attempt to - * recreate a healthy connection. */ - UA_InactivityCallback inactivityCallback; - - void *clientContext; + /* When connectivityCheckInterval is greater than 0, every + * connectivityCheckInterval (in ms), a async read request is performed on + * the server. inactivityCallback is called when the client receive no + * response for this read request The connection can be closed, this in an + * attempt to recreate a healthy connection. */ + void (*inactivityCallback)(UA_Client *client); #ifdef UA_ENABLE_SUBSCRIPTIONS - /* number of PublishResponse standing in the sever - * 0 = background task disabled */ + /* Number of PublishResponse queued up in the server */ UA_UInt16 outStandingPublishRequests; -#endif - /* connectivity check interval in ms - * 0 = background task disabled */ - UA_UInt32 connectivityCheckInterval; -} UA_ClientConfig; - - -/* Get the client configuration from the configuration plugin. Used by the - * server when it needs client functionality to register to a discovery server - * or when the server needs to create a client for other purposes - * - * @return The client configuration structure */ -UA_ClientConfig UA_EXPORT -UA_Server_getClientConfig(void); -#ifdef __cplusplus -} + /* If the client does not receive a PublishResponse after the defined delay + * of ``(sub->publishingInterval * sub->maxKeepAliveCount) + + * client->config.timeout)``, then subscriptionInactivityCallback is called + * for the subscription.. */ + void (*subscriptionInactivityCallback)(UA_Client *client, + UA_UInt32 subscriptionId, + void *subContext); #endif +} UA_ClientConfig; +_UA_END_DECLS #endif /* UA_CLIENT_CONFIG_H */ -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_client.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/client.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2015-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2015-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2015-2016 (c) Sten Grüner * Copyright 2015-2016 (c) Chris Iatrou * Copyright 2015-2017 (c) Florian Palm @@ -13890,13 +28004,12 @@ UA_Server_getClientConfig(void); * Copyright 2017 (c) Stefan Profanter, fortiss GmbH * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB * Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA + * Copyright 2018 (c) Kalycito Infotech Private Limited */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS /** * .. _client: @@ -13923,15 +28036,22 @@ extern "C" { /* Create a new client */ UA_Client UA_EXPORT * -UA_Client_new(UA_ClientConfig config); +UA_Client_new(void); /* Get the client connection status */ UA_ClientState UA_EXPORT UA_Client_getState(UA_Client *client); +/* Get the client configuration */ +UA_EXPORT UA_ClientConfig * +UA_Client_getConfig(UA_Client *client); + /* Get the client context */ -void UA_EXPORT * -UA_Client_getContext(UA_Client *client); +static UA_INLINE void * +UA_Client_getContext(UA_Client *client) { + UA_ClientConfig *config = UA_Client_getConfig(client); /* Cannot fail */ + return config->clientContext; +} /* Reset a client */ void UA_EXPORT @@ -13945,6 +28065,9 @@ UA_Client_delete(UA_Client *client); * Connect to a Server * ------------------- */ +typedef void (*UA_ClientAsyncServiceCallback)(UA_Client *client, void *userdata, + UA_UInt32 requestId, void *response); + /* Connect to the server * * @param client to use @@ -13953,6 +28076,19 @@ UA_Client_delete(UA_Client *client); UA_StatusCode UA_EXPORT UA_Client_connect(UA_Client *client, const char *endpointUrl); +UA_StatusCode UA_EXPORT +UA_Client_connect_async(UA_Client *client, const char *endpointUrl, + UA_ClientAsyncServiceCallback callback, + void *userdata); + +/* Connect to the server without creating a session + * + * @param client to use + * @param endpointURL to connect (for example "opc.tcp://localhost:4840") + * @return Indicates whether the operation succeeded or returns an error code */ +UA_StatusCode UA_EXPORT +UA_Client_connect_noSession(UA_Client *client, const char *endpointUrl); + /* Connect to the selected server with the given username and password * * @param client to use @@ -13968,13 +28104,14 @@ UA_Client_connect_username(UA_Client *client, const char *endpointUrl, UA_StatusCode UA_EXPORT UA_Client_disconnect(UA_Client *client); -/* Close a connection to the selected server */ UA_StatusCode UA_EXPORT -UA_Client_close(UA_Client *client); +UA_Client_disconnect_async(UA_Client *client, UA_UInt32 *requestId); -/* Renew the underlying secure channel */ -UA_StatusCode UA_EXPORT -UA_Client_manuallyRenewSecureChannel(UA_Client *client); +/* Close a connection to the selected server */ +UA_DEPRECATED static UA_INLINE UA_StatusCode +UA_Client_close(UA_Client *client) { + return UA_Client_disconnect(client); +} /** * Discovery @@ -14021,6 +28158,7 @@ UA_Client_findServers(UA_Client *client, const char *serverUrl, size_t *registeredServersSize, UA_ApplicationDescription **registeredServers); +#ifdef UA_ENABLE_DISCOVERY /* Get a list of all known server in the network. Only supported by LDS servers. * * @param client to use. Must be connected to the same endpoint given in @@ -14044,6 +28182,7 @@ UA_Client_findServersOnNetwork(UA_Client *client, const char *serverUrl, UA_UInt32 startingRecordId, UA_UInt32 maxRecordsToReturn, size_t serverCapabilityFilterSize, UA_String *serverCapabilityFilter, size_t *serverOnNetworkSize, UA_ServerOnNetwork **serverOnNetwork); +#endif /** * .. _client-services: @@ -14079,6 +28218,27 @@ UA_Client_Service_write(UA_Client *client, const UA_WriteRequest request) { return response; } +/* +* Historical Access Service Set +* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ +#ifdef UA_ENABLE_HISTORIZING +static UA_INLINE UA_HistoryReadResponse +UA_Client_Service_historyRead(UA_Client *client, const UA_HistoryReadRequest request) { + UA_HistoryReadResponse response; + __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_HISTORYREADREQUEST], + &response, &UA_TYPES[UA_TYPES_HISTORYREADRESPONSE]); + return response; +} + +static UA_INLINE UA_HistoryUpdateResponse +UA_Client_Service_historyUpdate(UA_Client *client, const UA_HistoryUpdateRequest request) { + UA_HistoryUpdateResponse response; + __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_HISTORYUPDATEREQUEST], + &response, &UA_TYPES[UA_TYPES_HISTORYUPDATERESPONSE]); + return response; +} +#endif + /* * Method Service Set * ^^^^^^^^^^^^^^^^^^ */ @@ -14183,6 +28343,8 @@ UA_Client_Service_unregisterNodes(UA_Client *client, /* * Query Service Set * ^^^^^^^^^^^^^^^^^ */ +#ifdef UA_ENABLE_QUERY + static UA_INLINE UA_QueryFirstResponse UA_Client_Service_queryFirst(UA_Client *client, const UA_QueryFirstRequest request) { @@ -14201,6 +28363,8 @@ UA_Client_Service_queryNext(UA_Client *client, return response; } +#endif + /** * .. _client-async-services: * @@ -14210,17 +28374,6 @@ UA_Client_Service_queryNext(UA_Client *client, * be made without waiting for a response first. Responess may come in a * different ordering. */ -/* Listen on the network and process arriving asynchronous responses in the - * background. Internal housekeeping and subscription management is done as - * well. */ -UA_StatusCode UA_EXPORT -UA_Client_runAsync(UA_Client *client, UA_UInt16 timeout); - -typedef void -(*UA_ClientAsyncServiceCallback)(UA_Client *client, void *userdata, - UA_UInt32 requestId, void *response, - const UA_DataType *responseType); - /* Use the type versions of this method. See below. However, the general * mechanism of async service calls is explained here. * @@ -14248,6 +28401,27 @@ __UA_Client_AsyncService(UA_Client *client, const void *request, const UA_DataType *responseType, void *userdata, UA_UInt32 *requestId); +UA_StatusCode UA_EXPORT +UA_Client_sendAsyncRequest(UA_Client *client, const void *request, + const UA_DataType *requestType, UA_ClientAsyncServiceCallback callback, + const UA_DataType *responseType, void *userdata, UA_UInt32 *requestId); + +/* Listen on the network and process arriving asynchronous responses in the + * background. Internal housekeeping, renewal of SecureChannels and subscription + * management is done as well. */ +UA_StatusCode UA_EXPORT +UA_Client_run_iterate(UA_Client *client, UA_UInt16 timeout); + +UA_DEPRECATED static UA_INLINE UA_StatusCode +UA_Client_runAsync(UA_Client *client, UA_UInt16 timeout) { + return UA_Client_run_iterate(client, timeout); +} + +UA_DEPRECATED static UA_INLINE UA_StatusCode +UA_Client_manuallyRenewSecureChannel(UA_Client *client) { + return UA_Client_run_iterate(client, 0); +} + /* Use the type versions of this method. See below. However, the general * mechanism of async service calls is explained here. * @@ -14275,45 +28449,59 @@ __UA_Client_AsyncServiceEx(UA_Client *client, const void *request, void *userdata, UA_UInt32 *requestId, UA_UInt32 timeout); -static UA_INLINE UA_StatusCode -UA_Client_AsyncService_read(UA_Client *client, const UA_ReadRequest *request, - UA_ClientAsyncServiceCallback callback, - void *userdata, UA_UInt32 *requestId) { - return __UA_Client_AsyncService(client, (const void*)request, - &UA_TYPES[UA_TYPES_READREQUEST], callback, - &UA_TYPES[UA_TYPES_READRESPONSE], - userdata, requestId); -} +/** + * Timed Callbacks + * --------------- + * Repeated callbacks can be attached to a client and will be executed in the + * defined interval. */ -static UA_INLINE UA_StatusCode -UA_Client_AsyncService_write(UA_Client *client, const UA_WriteRequest *request, - UA_ClientAsyncServiceCallback callback, - void *userdata, UA_UInt32 *requestId) { - return __UA_Client_AsyncService(client, (const void*)request, - &UA_TYPES[UA_TYPES_WRITEREQUEST], callback, - &UA_TYPES[UA_TYPES_WRITERESPONSE], - userdata, requestId); -} +typedef void (*UA_ClientCallback)(UA_Client *client, void *data); -static UA_INLINE UA_StatusCode -UA_Client_AsyncService_call(UA_Client *client, const UA_CallRequest *request, - UA_ClientAsyncServiceCallback callback, - void *userdata, UA_UInt32 *requestId) { - return __UA_Client_AsyncService(client, (const void*)request, - &UA_TYPES[UA_TYPES_CALLREQUEST], callback, - &UA_TYPES[UA_TYPES_CALLRESPONSE], - userdata, requestId); -} +/* Add a callback for execution at a specified time. If the indicated time lies + * in the past, then the callback is executed at the next iteration of the + * server's main loop. + * + * @param client The client object. + * @param callback The callback that shall be added. + * @param data Data that is forwarded to the callback. + * @param date The timestamp for the execution time. + * @param callbackId Set to the identifier of the repeated callback . This can + * be used to cancel the callback later on. If the pointer is null, the + * identifier is not set. + * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code + * otherwise. */ +UA_StatusCode UA_EXPORT +UA_Client_addTimedCallback(UA_Client *client, UA_ClientCallback callback, + void *data, UA_DateTime date, UA_UInt64 *callbackId); -static UA_INLINE UA_StatusCode -UA_Client_AsyncService_browse(UA_Client *client, const UA_BrowseRequest *request, - UA_ClientAsyncServiceCallback callback, - void *userdata, UA_UInt32 *requestId) { - return __UA_Client_AsyncService(client, (const void*)request, - &UA_TYPES[UA_TYPES_BROWSEREQUEST], callback, - &UA_TYPES[UA_TYPES_BROWSERESPONSE], - userdata, requestId); -} +/* Add a callback for cyclic repetition to the client. + * + * @param client The client object. + * @param callback The callback that shall be added. + * @param data Data that is forwarded to the callback. + * @param interval_ms The callback shall be repeatedly executed with the given + * interval (in ms). The interval must be positive. The first execution + * occurs at now() + interval at the latest. + * @param callbackId Set to the identifier of the repeated callback . This can + * be used to cancel the callback later on. If the pointer is null, the + * identifier is not set. + * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code + * otherwise. */ +UA_StatusCode UA_EXPORT +UA_Client_addRepeatedCallback(UA_Client *client, UA_ClientCallback callback, + void *data, UA_Double interval_ms, + UA_UInt64 *callbackId); + +UA_StatusCode UA_EXPORT +UA_Client_changeRepeatedCallbackInterval(UA_Client *client, + UA_UInt64 callbackId, + UA_Double interval_ms); + +void UA_EXPORT +UA_Client_removeCallback(UA_Client *client, UA_UInt64 callbackId); + +#define UA_Client_removeRepeatedCallback(client, callbackId) \ + UA_Client_removeCallback(client, callbackId) /** * .. toctree:: @@ -14321,30 +28509,28 @@ UA_Client_AsyncService_browse(UA_Client *client, const UA_BrowseRequest *request * client_highlevel * client_subscriptions */ -#ifdef __cplusplus -} // extern "C" -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_client_highlevel.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/client_highlevel.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright 2015-2018 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2015 (c) Oleksiy Vasylyev * Copyright 2017 (c) Florian Palm * Copyright 2016 (c) Chris Iatrou * Copyright 2017 (c) Stefan Profanter, fortiss GmbH * Copyright 2017 (c) Frank Meerkötter + * Copyright 2018 (c) Fabian Arndt + * Copyright 2018 (c) Peter Rustler, basyskom GmbH */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS /** * .. _client-highlevel: @@ -14530,14 +28716,75 @@ UA_Client_readExecutableAttribute(UA_Client *client, const UA_NodeId nodeId, outExecutable, &UA_TYPES[UA_TYPES_BOOLEAN]); } -static UA_INLINE UA_StatusCode -UA_Client_readUserExecutableAttribute(UA_Client *client, const UA_NodeId nodeId, - UA_Boolean *outUserExecutable) { - return __UA_Client_readAttribute(client, &nodeId, - UA_ATTRIBUTEID_USEREXECUTABLE, - outUserExecutable, - &UA_TYPES[UA_TYPES_BOOLEAN]); -} +static UA_INLINE UA_StatusCode +UA_Client_readUserExecutableAttribute(UA_Client *client, const UA_NodeId nodeId, + UA_Boolean *outUserExecutable) { + return __UA_Client_readAttribute(client, &nodeId, + UA_ATTRIBUTEID_USEREXECUTABLE, + outUserExecutable, + &UA_TYPES[UA_TYPES_BOOLEAN]); +} + +/** + * Historical Access + * ^^^^^^^^^^^^^^^^^ + * The following functions can be used to read a single node historically. + * Use the regular service to read several nodes at once. */ + +#ifdef UA_ENABLE_HISTORIZING +typedef UA_Boolean +(*UA_HistoricalIteratorCallback)(UA_Client *client, + const UA_NodeId *nodeId, + UA_Boolean moreDataAvailable, + const UA_ExtensionObject *data, void *callbackContext); + +#ifdef UA_ENABLE_EXPERIMENTAL_HISTORIZING +UA_StatusCode UA_EXPORT +UA_Client_HistoryRead_events(UA_Client *client, const UA_NodeId *nodeId, + const UA_HistoricalIteratorCallback callback, + UA_DateTime startTime, UA_DateTime endTime, + UA_String indexRange, const UA_EventFilter filter, UA_UInt32 numValuesPerNode, + UA_TimestampsToReturn timestampsToReturn, void *callbackContext); +#endif // UA_ENABLE_EXPERIMENTAL_HISTORIZING + +UA_StatusCode UA_EXPORT +UA_Client_HistoryRead_raw(UA_Client *client, const UA_NodeId *nodeId, + const UA_HistoricalIteratorCallback callback, + UA_DateTime startTime, UA_DateTime endTime, + UA_String indexRange, UA_Boolean returnBounds, UA_UInt32 numValuesPerNode, + UA_TimestampsToReturn timestampsToReturn, void *callbackContext); + +#ifdef UA_ENABLE_EXPERIMENTAL_HISTORIZING +UA_StatusCode UA_EXPORT +UA_Client_HistoryRead_modified(UA_Client *client, const UA_NodeId *nodeId, + const UA_HistoricalIteratorCallback callback, + UA_DateTime startTime, UA_DateTime endTime, + UA_String indexRange, UA_Boolean returnBounds, UA_UInt32 numValuesPerNode, + UA_TimestampsToReturn timestampsToReturn, void *callbackContext); +#endif // UA_ENABLE_EXPERIMENTAL_HISTORIZING + +UA_StatusCode UA_EXPORT +UA_Client_HistoryUpdate_insert(UA_Client *client, + const UA_NodeId *nodeId, + UA_DataValue *value); + +UA_StatusCode UA_EXPORT +UA_Client_HistoryUpdate_replace(UA_Client *client, + const UA_NodeId *nodeId, + UA_DataValue *value); + +UA_StatusCode UA_EXPORT +UA_Client_HistoryUpdate_update(UA_Client *client, + const UA_NodeId *nodeId, + UA_DataValue *value); + +UA_StatusCode UA_EXPORT +UA_Client_HistoryUpdate_deleteRaw(UA_Client *client, + const UA_NodeId *nodeId, + UA_DateTime startTimestamp, + UA_DateTime endTimestamp); + +#endif // UA_ENABLE_HISTORIZING /** * Write Attributes @@ -14545,6 +28792,7 @@ UA_Client_readUserExecutableAttribute(UA_Client *client, const UA_NodeId nodeId, * * The following functions can be use to write a single node attribute at a * time. Use the regular write service to write several attributes at once. */ + /* Don't call this function, use the typed versions */ UA_StatusCode UA_EXPORT __UA_Client_writeAttribute(UA_Client *client, const UA_NodeId *nodeId, @@ -14722,15 +28970,19 @@ UA_Client_writeUserExecutableAttribute(UA_Client *client, const UA_NodeId nodeId /** * Method Calling * ^^^^^^^^^^^^^^ */ + +#ifdef UA_ENABLE_METHODCALLS UA_StatusCode UA_EXPORT UA_Client_call(UA_Client *client, const UA_NodeId objectId, const UA_NodeId methodId, size_t inputSize, const UA_Variant *input, size_t *outputSize, UA_Variant **output); +#endif /** * Node Management * ^^^^^^^^^^^^^^^ * See the section on :ref:`server-side node management `. */ + UA_StatusCode UA_EXPORT UA_Client_addReference(UA_Client *client, const UA_NodeId sourceNodeId, const UA_NodeId referenceTypeId, UA_Boolean isForward, @@ -14892,6 +29144,7 @@ UA_Client_addMethodNode(UA_Client *client, const UA_NodeId requestedNewNodeId, /** * Misc Highlevel Functionality * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ + /* Get the namespace-index of a namespace-URI * * @param client The UA_Client struct for this connection @@ -14913,24 +29166,20 @@ typedef UA_StatusCode (*UA_NodeIteratorCallback)(UA_NodeId childId, UA_Boolean i UA_StatusCode UA_EXPORT UA_Client_forEachChildNodeCall(UA_Client *client, UA_NodeId parentNodeId, - UA_NodeIteratorCallback callback, void *handle) ; + UA_NodeIteratorCallback callback, void *handle); -#ifdef __cplusplus -} // extern "C" -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/include/ua_client_subscriptions.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/client_subscriptions.h" ***********************************/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS #ifdef UA_ENABLE_SUBSCRIPTIONS @@ -15022,8 +29271,8 @@ UA_Client_Subscriptions_setPublishingMode(UA_Client *client, * forward Event notifications from that node. * * During the creation of a MonitoredItem, the server may return changed - * adjusted parameters. Use ``UA_Client_MonitoredItem_getParameters`` to get the - * current parameters. */ + * adjusted parameters. Check the returned ``UA_CreateMonitoredItemsResponse`` + * to get the current parameters. */ /* Provides default values for a new monitored item. */ static UA_INLINE UA_MonitoredItemCreateRequest @@ -15039,6 +29288,10 @@ UA_MonitoredItemCreateRequest_default(UA_NodeId nodeId) { return request; } +/** + * The clientHandle parameter can't be set by the user, any value will be replaced + * by the client before sending the request to the server. */ + /* Callback for the deletion of a MonitoredItem */ typedef void (*UA_Client_DeleteMonitoredItemCallback) (UA_Client *client, UA_UInt32 subId, void *subContext, @@ -15073,7 +29326,7 @@ UA_Client_MonitoredItems_createDataChange(UA_Client *client, UA_UInt32 subscript UA_CreateMonitoredItemsResponse UA_EXPORT UA_Client_MonitoredItems_createEvents(UA_Client *client, const UA_CreateMonitoredItemsRequest request, void **contexts, - UA_Client_EventNotificationCallback *callbacks, + UA_Client_EventNotificationCallback *callback, UA_Client_DeleteMonitoredItemCallback *deleteCallback); UA_MonitoredItemCreateResult UA_EXPORT @@ -15088,20 +29341,15 @@ UA_Client_MonitoredItems_delete(UA_Client *client, const UA_DeleteMonitoredItems UA_StatusCode UA_EXPORT UA_Client_MonitoredItems_deleteSingle(UA_Client *client, UA_UInt32 subscriptionId, UA_UInt32 monitoredItemId); +/* The clientHandle parameter will be filled automatically */ +UA_ModifyMonitoredItemsResponse UA_EXPORT +UA_Client_MonitoredItems_modify(UA_Client *client, + const UA_ModifyMonitoredItemsRequest request); + /** * The following service calls go directly to the server. The MonitoredItem settings are * not stored in the client. */ -static UA_INLINE UA_ModifyMonitoredItemsResponse -UA_Client_MonitoredItems_modify(UA_Client *client, - const UA_ModifyMonitoredItemsRequest request) { - UA_ModifyMonitoredItemsResponse response; - __UA_Client_Service(client, - &request, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST], - &response, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]); - return response; -} - static UA_INLINE UA_SetMonitoringModeResponse UA_Client_MonitoredItems_setMonitoringMode(UA_Client *client, const UA_SetMonitoringModeRequest request) { @@ -15122,466 +29370,1425 @@ UA_Client_MonitoredItems_setTriggering(UA_Client *client, return response; } +#endif + +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/client_highlevel_async.h" ***********************************/ + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA + * Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + */ + + + +_UA_BEGIN_DECLS + +/** + * Raw Services + * ^^^^^^^^^^^^ */ + +typedef void (*UA_ClientAsyncReadCallback)(UA_Client *client, void *userdata, + UA_UInt32 requestId, UA_ReadResponse *rr); +static UA_INLINE UA_StatusCode +UA_Client_sendAsyncReadRequest(UA_Client *client, UA_ReadRequest *request, + UA_ClientAsyncReadCallback readCallback, void *userdata, + UA_UInt32 *reqId) { + return UA_Client_sendAsyncRequest(client, request, &UA_TYPES[UA_TYPES_READREQUEST], + (UA_ClientAsyncServiceCallback)readCallback, + &UA_TYPES[UA_TYPES_READRESPONSE], userdata, reqId); +} + +typedef void (*UA_ClientAsyncWriteCallback)(UA_Client *client, void *userdata, + UA_UInt32 requestId, UA_WriteResponse *wr); +static UA_INLINE UA_StatusCode +UA_Client_sendAsyncWriteRequest(UA_Client *client, UA_WriteRequest *request, + UA_ClientAsyncWriteCallback writeCallback, void *userdata, + UA_UInt32 *reqId) { + return UA_Client_sendAsyncRequest(client, request, &UA_TYPES[UA_TYPES_WRITEREQUEST], + (UA_ClientAsyncServiceCallback)writeCallback, + &UA_TYPES[UA_TYPES_WRITERESPONSE], userdata, reqId); +} + +typedef void (*UA_ClientAsyncBrowseCallback)(UA_Client *client, void *userdata, + UA_UInt32 requestId, UA_BrowseResponse *wr); +static UA_INLINE UA_StatusCode +UA_Client_sendAsyncBrowseRequest(UA_Client *client, UA_BrowseRequest *request, + UA_ClientAsyncBrowseCallback browseCallback, + void *userdata, UA_UInt32 *reqId) { + return UA_Client_sendAsyncRequest(client, request, &UA_TYPES[UA_TYPES_BROWSEREQUEST], + (UA_ClientAsyncServiceCallback)browseCallback, + &UA_TYPES[UA_TYPES_BROWSERESPONSE], userdata, + reqId); +} + /** - * Deprecated API - * -------------- - * The following API is kept for backwards compatibility. It will be removed in - * future releases. */ + * Read Attribute + * ^^^^^^^^^^^^^^ */ +UA_StatusCode UA_EXPORT +__UA_Client_readAttribute_async(UA_Client *client, const UA_NodeId *nodeId, + UA_AttributeId attributeId, + const UA_DataType *outDataType, + UA_ClientAsyncServiceCallback callback, void *userdata, + UA_UInt32 *reqId); + +typedef void (*UA_ClientAsyncReadDataTypeAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_NodeId *var); +static UA_INLINE UA_StatusCode +UA_Client_readDataTypeAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadDataTypeAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_DATATYPE, &UA_TYPES[UA_TYPES_NODEID], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} + +typedef void (*UA_ClientAsyncReadValueAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_Variant *var); +static UA_INLINE UA_StatusCode +UA_Client_readValueAttribute_async(UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadValueAttributeCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_VALUE, &UA_TYPES[UA_TYPES_VARIANT], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} + +typedef void (*UA_ClientAsyncReadNodeIdAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_NodeId *out); +static UA_INLINE UA_StatusCode +UA_Client_readNodeIdAttribute_async(UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadNodeIdAttributeCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_NODEID, &UA_TYPES[UA_TYPES_NODEID], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadNodeClassAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_NodeClass *out); +static UA_INLINE UA_StatusCode +UA_Client_readNodeClassAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadNodeClassAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_NODECLASS, &UA_TYPES[UA_TYPES_NODECLASS], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadBrowseNameAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_QualifiedName *out); +static UA_INLINE UA_StatusCode +UA_Client_readBrowseNameAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadBrowseNameAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_BROWSENAME, &UA_TYPES[UA_TYPES_QUALIFIEDNAME], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadDisplayNameAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_LocalizedText *out); +static UA_INLINE UA_StatusCode +UA_Client_readDisplayNameAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadDisplayNameAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_DISPLAYNAME, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadDescriptionAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_LocalizedText *out); +static UA_INLINE UA_StatusCode +UA_Client_readDescriptionAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadDescriptionAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_DESCRIPTION, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadWriteMaskAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_UInt32 *out); +static UA_INLINE UA_StatusCode +UA_Client_readWriteMaskAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadWriteMaskAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_WRITEMASK, &UA_TYPES[UA_TYPES_UINT32], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadUserWriteMaskAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_UInt32 *out); +static UA_INLINE UA_StatusCode +UA_Client_readUserWriteMaskAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadUserWriteMaskAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_USERWRITEMASK, &UA_TYPES[UA_TYPES_UINT32], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadIsAbstractAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_Boolean *out); +static UA_INLINE UA_StatusCode +UA_Client_readIsAbstractAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadIsAbstractAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_ISABSTRACT, &UA_TYPES[UA_TYPES_BOOLEAN], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadSymmetricAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_Boolean *out); +static UA_INLINE UA_StatusCode +UA_Client_readSymmetricAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadSymmetricAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_SYMMETRIC, &UA_TYPES[UA_TYPES_BOOLEAN], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadInverseNameAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_LocalizedText *out); +static UA_INLINE UA_StatusCode +UA_Client_readInverseNameAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadInverseNameAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_INVERSENAME, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadContainsNoLoopsAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_Boolean *out); +static UA_INLINE UA_StatusCode +UA_Client_readContainsNoLoopsAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadContainsNoLoopsAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_CONTAINSNOLOOPS, &UA_TYPES[UA_TYPES_BOOLEAN], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadEventNotifierAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_Byte *out); +static UA_INLINE UA_StatusCode +UA_Client_readEventNotifierAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadEventNotifierAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_EVENTNOTIFIER, &UA_TYPES[UA_TYPES_BYTE], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadValueRankAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_Int32 *out); +static UA_INLINE UA_StatusCode +UA_Client_readValueRankAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadValueRankAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_VALUERANK, &UA_TYPES[UA_TYPES_INT32], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadAccessLevelAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_Byte *out); +static UA_INLINE UA_StatusCode +UA_Client_readAccessLevelAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadAccessLevelAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_ACCESSLEVEL, &UA_TYPES[UA_TYPES_BYTE], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadUserAccessLevelAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_Byte *out); +static UA_INLINE UA_StatusCode +UA_Client_readUserAccessLevelAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadUserAccessLevelAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_USERACCESSLEVEL, &UA_TYPES[UA_TYPES_BYTE], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadMinimumSamplingIntervalAttributeCallback)( + UA_Client *client, void *userdata, UA_UInt32 requestId, UA_Double *out); +static UA_INLINE UA_StatusCode +UA_Client_readMinimumSamplingIntervalAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadMinimumSamplingIntervalAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL, + &UA_TYPES[UA_TYPES_DOUBLE], (UA_ClientAsyncServiceCallback)callback, userdata, + reqId); +} +typedef void (*UA_ClientAsyncReadHistorizingAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_Boolean *out); +static UA_INLINE UA_StatusCode +UA_Client_readHistorizingAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadHistorizingAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_HISTORIZING, &UA_TYPES[UA_TYPES_BOOLEAN], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadExecutableAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_Boolean *out); +static UA_INLINE UA_StatusCode +UA_Client_readExecutableAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadExecutableAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_EXECUTABLE, &UA_TYPES[UA_TYPES_BOOLEAN], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +typedef void (*UA_ClientAsyncReadUserExecutableAttributeCallback)(UA_Client *client, + void *userdata, + UA_UInt32 requestId, + UA_Boolean *out); +static UA_INLINE UA_StatusCode +UA_Client_readUserExecutableAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + UA_ClientAsyncReadUserExecutableAttributeCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_readAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_USEREXECUTABLE, &UA_TYPES[UA_TYPES_BOOLEAN], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} +/** + * Write Attribute + * ^^^^^^^^^^^^^^ */ + +UA_StatusCode UA_EXPORT +__UA_Client_writeAttribute_async(UA_Client *client, const UA_NodeId *nodeId, + UA_AttributeId attributeId, const void *in, + const UA_DataType *inDataType, + UA_ClientAsyncServiceCallback callback, void *userdata, + UA_UInt32 *reqId); + +static UA_INLINE UA_StatusCode +UA_Client_writeValueAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_Variant *newValue, + UA_ClientAsyncWriteCallback callback, void *userdata, + UA_UInt32 *reqId) { + + return __UA_Client_writeAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_VALUE, newValue, &UA_TYPES[UA_TYPES_VARIANT], + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} + +static UA_INLINE UA_StatusCode +UA_Client_writeNodeIdAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_NodeId *outNodeId, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_NODEID, + outNodeId, &UA_TYPES[UA_TYPES_NODEID], + callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeNodeClassAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_NodeClass *outNodeClass, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_NODECLASS, + outNodeClass, &UA_TYPES[UA_TYPES_NODECLASS], + callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeBrowseNameAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_QualifiedName *outBrowseName, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_BROWSENAME, outBrowseName, + &UA_TYPES[UA_TYPES_QUALIFIEDNAME], callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeDisplayNameAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_LocalizedText *outDisplayName, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_DISPLAYNAME, outDisplayName, + &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeDescriptionAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_LocalizedText *outDescription, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_DESCRIPTION, outDescription, + &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeWriteMaskAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_UInt32 *outWriteMask, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_WRITEMASK, + outWriteMask, &UA_TYPES[UA_TYPES_UINT32], + callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeUserWriteMaskAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_UInt32 *outUserWriteMask, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_USERWRITEMASK, + outUserWriteMask, &UA_TYPES[UA_TYPES_UINT32], + callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeIsAbstractAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_Boolean *outIsAbstract, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_ISABSTRACT, + outIsAbstract, &UA_TYPES[UA_TYPES_BOOLEAN], + callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeSymmetricAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_Boolean *outSymmetric, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_SYMMETRIC, + outSymmetric, &UA_TYPES[UA_TYPES_BOOLEAN], + callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeInverseNameAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_LocalizedText *outInverseName, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_INVERSENAME, outInverseName, + &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeContainsNoLoopsAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_Boolean *outContainsNoLoops, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_CONTAINSNOLOOPS, outContainsNoLoops, + &UA_TYPES[UA_TYPES_BOOLEAN], callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeEventNotifierAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_Byte *outEventNotifier, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_EVENTNOTIFIER, + outEventNotifier, &UA_TYPES[UA_TYPES_BYTE], + callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeDataTypeAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_NodeId *outDataType, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_DATATYPE, + outDataType, &UA_TYPES[UA_TYPES_NODEID], + callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeValueRankAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_Int32 *outValueRank, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_VALUERANK, + outValueRank, &UA_TYPES[UA_TYPES_INT32], + callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeAccessLevelAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_Byte *outAccessLevel, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_ACCESSLEVEL, + outAccessLevel, &UA_TYPES[UA_TYPES_BYTE], + callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeUserAccessLevelAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_Byte *outUserAccessLevel, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_USERACCESSLEVEL, outUserAccessLevel, + &UA_TYPES[UA_TYPES_BYTE], callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeMinimumSamplingIntervalAttribute_async( + UA_Client *client, const UA_NodeId nodeId, + const UA_Double *outMinimumSamplingInterval, UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL, + outMinimumSamplingInterval, &UA_TYPES[UA_TYPES_DOUBLE], callback, userdata, + reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeHistorizingAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_Boolean *outHistorizing, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_HISTORIZING, + outHistorizing, &UA_TYPES[UA_TYPES_BOOLEAN], + callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeExecutableAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_Boolean *outExecutable, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async(client, &nodeId, UA_ATTRIBUTEID_EXECUTABLE, + outExecutable, &UA_TYPES[UA_TYPES_BOOLEAN], + callback, userdata, reqId); +} +static UA_INLINE UA_StatusCode +UA_Client_writeUserExecutableAttribute_async(UA_Client *client, const UA_NodeId nodeId, + const UA_Boolean *outUserExecutable, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_writeAttribute_async( + client, &nodeId, UA_ATTRIBUTEID_USEREXECUTABLE, outUserExecutable, + &UA_TYPES[UA_TYPES_BOOLEAN], callback, userdata, reqId); +} + +/** + * Method Calling + * ^^^^^^^^^^^^^^ */ +#ifdef UA_ENABLE_METHODCALLS +UA_StatusCode UA_EXPORT +__UA_Client_call_async(UA_Client *client, const UA_NodeId objectId, + const UA_NodeId methodId, size_t inputSize, + const UA_Variant *input, UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId); + +typedef void (*UA_ClientAsyncCallCallback)(UA_Client *client, void *userdata, + UA_UInt32 requestId, UA_CallResponse *cr); + +static UA_INLINE UA_StatusCode +UA_Client_call_async(UA_Client *client, const UA_NodeId objectId, + const UA_NodeId methodId, size_t inputSize, const UA_Variant *input, + UA_ClientAsyncCallCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_call_async(client, objectId, methodId, inputSize, input, + (UA_ClientAsyncServiceCallback)callback, userdata, + reqId); +} +#endif + +/** + * Node Management + * ^^^^^^^^^^^^^^^ */ +typedef void (*UA_ClientAsyncAddNodesCallback)(UA_Client *client, void *userdata, + UA_UInt32 requestId, + UA_AddNodesResponse *ar); + +UA_StatusCode UA_EXPORT +__UA_Client_addNode_async(UA_Client *client, const UA_NodeClass nodeClass, + const UA_NodeId requestedNewNodeId, + const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId, + const UA_QualifiedName browseName, + const UA_NodeId typeDefinition, const UA_NodeAttributes *attr, + const UA_DataType *attributeType, UA_NodeId *outNewNodeId, + UA_ClientAsyncServiceCallback callback, void *userdata, + UA_UInt32 *reqId); + +static UA_INLINE UA_StatusCode +UA_Client_addVariableNode_async(UA_Client *client, const UA_NodeId requestedNewNodeId, + const UA_NodeId parentNodeId, + const UA_NodeId referenceTypeId, + const UA_QualifiedName browseName, + const UA_NodeId typeDefinition, + const UA_VariableAttributes attr, UA_NodeId *outNewNodeId, + UA_ClientAsyncAddNodesCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_addNode_async( + client, UA_NODECLASS_VARIABLE, requestedNewNodeId, parentNodeId, referenceTypeId, + browseName, typeDefinition, (const UA_NodeAttributes *)&attr, + &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES], outNewNodeId, + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} + +static UA_INLINE UA_StatusCode +UA_Client_addVariableTypeNode_async( + UA_Client *client, const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId, + const UA_NodeId referenceTypeId, const UA_QualifiedName browseName, + const UA_VariableTypeAttributes attr, UA_NodeId *outNewNodeId, + UA_ClientAsyncAddNodesCallback callback, void *userdata, UA_UInt32 *reqId) { + return __UA_Client_addNode_async( + client, UA_NODECLASS_VARIABLETYPE, requestedNewNodeId, parentNodeId, + referenceTypeId, browseName, UA_NODEID_NULL, (const UA_NodeAttributes *)&attr, + &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES], outNewNodeId, + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} + +static UA_INLINE UA_StatusCode +UA_Client_addObjectNode_async(UA_Client *client, const UA_NodeId requestedNewNodeId, + const UA_NodeId parentNodeId, + const UA_NodeId referenceTypeId, + const UA_QualifiedName browseName, + const UA_NodeId typeDefinition, + const UA_ObjectAttributes attr, UA_NodeId *outNewNodeId, + UA_ClientAsyncAddNodesCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_addNode_async( + client, UA_NODECLASS_OBJECT, requestedNewNodeId, parentNodeId, referenceTypeId, + browseName, typeDefinition, (const UA_NodeAttributes *)&attr, + &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES], outNewNodeId, + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} + +static UA_INLINE UA_StatusCode +UA_Client_addObjectTypeNode_async( + UA_Client *client, const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId, + const UA_NodeId referenceTypeId, const UA_QualifiedName browseName, + const UA_ObjectTypeAttributes attr, UA_NodeId *outNewNodeId, + UA_ClientAsyncAddNodesCallback callback, void *userdata, UA_UInt32 *reqId) { + return __UA_Client_addNode_async( + client, UA_NODECLASS_OBJECTTYPE, requestedNewNodeId, parentNodeId, + referenceTypeId, browseName, UA_NODEID_NULL, (const UA_NodeAttributes *)&attr, + &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES], outNewNodeId, + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} + +static UA_INLINE UA_StatusCode +UA_Client_addViewNode_async(UA_Client *client, const UA_NodeId requestedNewNodeId, + const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId, + const UA_QualifiedName browseName, + const UA_ViewAttributes attr, UA_NodeId *outNewNodeId, + UA_ClientAsyncAddNodesCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_addNode_async( + client, UA_NODECLASS_VIEW, requestedNewNodeId, parentNodeId, referenceTypeId, + browseName, UA_NODEID_NULL, (const UA_NodeAttributes *)&attr, + &UA_TYPES[UA_TYPES_VIEWATTRIBUTES], outNewNodeId, + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} + +static UA_INLINE UA_StatusCode +UA_Client_addReferenceTypeNode_async( + UA_Client *client, const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId, + const UA_NodeId referenceTypeId, const UA_QualifiedName browseName, + const UA_ReferenceTypeAttributes attr, UA_NodeId *outNewNodeId, + UA_ClientAsyncAddNodesCallback callback, void *userdata, UA_UInt32 *reqId) { + return __UA_Client_addNode_async( + client, UA_NODECLASS_REFERENCETYPE, requestedNewNodeId, parentNodeId, + referenceTypeId, browseName, UA_NODEID_NULL, (const UA_NodeAttributes *)&attr, + &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES], outNewNodeId, + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} + +static UA_INLINE UA_StatusCode +UA_Client_addDataTypeNode_async(UA_Client *client, const UA_NodeId requestedNewNodeId, + const UA_NodeId parentNodeId, + const UA_NodeId referenceTypeId, + const UA_QualifiedName browseName, + const UA_DataTypeAttributes attr, UA_NodeId *outNewNodeId, + UA_ClientAsyncAddNodesCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_addNode_async( + client, UA_NODECLASS_DATATYPE, requestedNewNodeId, parentNodeId, referenceTypeId, + browseName, UA_NODEID_NULL, (const UA_NodeAttributes *)&attr, + &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES], outNewNodeId, + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} + +static UA_INLINE UA_StatusCode +UA_Client_addMethodNode_async(UA_Client *client, const UA_NodeId requestedNewNodeId, + const UA_NodeId parentNodeId, + const UA_NodeId referenceTypeId, + const UA_QualifiedName browseName, + const UA_MethodAttributes attr, UA_NodeId *outNewNodeId, + UA_ClientAsyncAddNodesCallback callback, void *userdata, + UA_UInt32 *reqId) { + return __UA_Client_addNode_async( + client, UA_NODECLASS_METHOD, requestedNewNodeId, parentNodeId, referenceTypeId, + browseName, UA_NODEID_NULL, (const UA_NodeAttributes *)&attr, + &UA_TYPES[UA_TYPES_METHODATTRIBUTES], outNewNodeId, + (UA_ClientAsyncServiceCallback)callback, userdata, reqId); +} + +/** + * Misc Functionalities + * ^^^^^^^^^^^^^^^^^^^^ */ + +UA_StatusCode UA_EXPORT +__UA_Client_translateBrowsePathsToNodeIds_async(UA_Client *client, char *paths[], + UA_UInt32 ids[], size_t pathSize, + UA_ClientAsyncServiceCallback callback, + void *userdata, UA_UInt32 *reqId); + +typedef void (*UA_ClientAsyncTranslateCallback)( + UA_Client *client, void *userdata, UA_UInt32 requestId, + UA_TranslateBrowsePathsToNodeIdsResponse *tr); + +static UA_INLINE UA_StatusCode +UA_Cient_translateBrowsePathsToNodeIds_async(UA_Client *client, char **paths, + UA_UInt32 *ids, size_t pathSize, + UA_ClientAsyncTranslateCallback callback, + void *userdata, UA_UInt32 *reqId) { + return __UA_Client_translateBrowsePathsToNodeIds_async( + client, paths, ids, pathSize, (UA_ClientAsyncServiceCallback)callback, userdata, + reqId); +} + +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/include/open62541/plugin/accesscontrol_default.h" ***********************************/ + +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + */ + + + +_UA_BEGIN_DECLS typedef struct { - UA_Double requestedPublishingInterval; - UA_UInt32 requestedLifetimeCount; - UA_UInt32 requestedMaxKeepAliveCount; - UA_UInt32 maxNotificationsPerPublish; - UA_Boolean publishingEnabled; - UA_Byte priority; -} UA_SubscriptionSettings; - -extern const UA_EXPORT UA_SubscriptionSettings UA_SubscriptionSettings_default; - -UA_DEPRECATED UA_StatusCode UA_EXPORT -UA_Client_Subscriptions_new(UA_Client *client, UA_SubscriptionSettings settings, - UA_UInt32 *newSubscriptionId); - -UA_DEPRECATED UA_StatusCode UA_EXPORT -UA_Client_Subscriptions_remove(UA_Client *client, UA_UInt32 subscriptionId); - -/* Send a publish request and wait until a response to the request is processed. - * Note that other publish responses may be processed in the background until - * then. */ -UA_DEPRECATED UA_StatusCode UA_EXPORT -UA_Client_Subscriptions_manuallySendPublishRequest(UA_Client *client); - -/* For monitoring DataChanges */ -typedef void (*UA_MonitoredItemHandlingFunction)(UA_Client *client, UA_UInt32 monId, - UA_DataValue *value, void *context); - -UA_DEPRECATED UA_StatusCode UA_EXPORT -UA_Client_Subscriptions_addMonitoredItems(UA_Client *client, const UA_UInt32 subscriptionId, - UA_MonitoredItemCreateRequest *items, size_t itemsSize, - UA_MonitoredItemHandlingFunction *hfs, - void **hfContexts, UA_StatusCode *itemResults, - UA_UInt32 *newMonitoredItemIds); - -UA_DEPRECATED UA_StatusCode UA_EXPORT -UA_Client_Subscriptions_addMonitoredItem(UA_Client *client, UA_UInt32 subscriptionId, - UA_NodeId nodeId, UA_UInt32 attributeID, - UA_MonitoredItemHandlingFunction hf, - void *hfContext, - UA_UInt32 *newMonitoredItemId, - UA_Double samplingInterval); - -/* Monitored Events have different payloads from DataChanges. So they use a - * different callback method signature. */ -typedef void (*UA_MonitoredEventHandlingFunction)(UA_Client *client, - const UA_UInt32 monId, - const size_t nEventFields, - const UA_Variant *eventFields, - void *context); - -UA_DEPRECATED UA_StatusCode UA_EXPORT -UA_Client_Subscriptions_addMonitoredEvents(UA_Client *client, const UA_UInt32 subscriptionId, - UA_MonitoredItemCreateRequest *items, size_t itemsSize, - UA_MonitoredEventHandlingFunction *hfs, - void **hfContexts, UA_StatusCode *itemResults, - UA_UInt32 *newMonitoredItemIds); - -/* TODO for 0.4: attribute is fix for events. */ -UA_DEPRECATED UA_StatusCode UA_EXPORT -UA_Client_Subscriptions_addMonitoredEvent(UA_Client *client, UA_UInt32 subscriptionId, - const UA_NodeId nodeId, UA_UInt32 attributeID, - const UA_SimpleAttributeOperand *selectClauses, - size_t selectClausesSize, - const UA_ContentFilterElement *whereClauses, - size_t whereClausesSize, - const UA_MonitoredEventHandlingFunction hf, - void *hfContext, UA_UInt32 *newMonitoredItemId); - -UA_DEPRECATED UA_StatusCode UA_EXPORT -UA_Client_Subscriptions_removeMonitoredItem(UA_Client *client, UA_UInt32 subscriptionId, - UA_UInt32 monitoredItemId); - -UA_DEPRECATED UA_StatusCode UA_EXPORT -UA_Client_Subscriptions_removeMonitoredItems(UA_Client *client, UA_UInt32 subscriptionId, - UA_UInt32 *monitoredItemIds, size_t itemsSize, - UA_StatusCode *itemResults); + UA_String username; + UA_String password; +} UA_UsernamePasswordLogin; +/* Default access control. The log-in can be anonymous or username-password. A + * logged-in user has all access rights. */ +UA_EXPORT UA_StatusCode +UA_AccessControl_default(UA_ServerConfig *config, UA_Boolean allowAnonymous, + const UA_ByteString *userTokenPolicyUri, + size_t usernamePasswordLoginSize, + const UA_UsernamePasswordLogin *usernamePasswordLogin); + +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/include/open62541/plugin/pki_default.h" ***********************************/ + +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2019 (c) Kalycito Infotech Private Limited + */ + + + +_UA_BEGIN_DECLS + +/* Default implementation that accepts all certificates */ +UA_EXPORT void +UA_CertificateVerification_AcceptAll(UA_CertificateVerification *cv); + +#ifdef UA_ENABLE_ENCRYPTION + +/* Accept certificates based on a trust-list and a revocation-list. Based on + * mbedTLS. */ +UA_EXPORT UA_StatusCode +UA_CertificateVerification_Trustlist(UA_CertificateVerification *cv, + const UA_ByteString *certificateTrustList, + size_t certificateTrustListSize, + const UA_ByteString *certificateIssuerList, + size_t certificateIssuerListSize, + const UA_ByteString *certificateRevocationList, + size_t certificateRevocationListSize); + +#ifdef __linux__ /* Linux only so far */ +UA_EXPORT UA_StatusCode +UA_CertificateVerification_CertFolders(UA_CertificateVerification *cv, + const char *trustListFolder, + const char *issuerListFolder, + const char *revocationListFolder); #endif -#ifdef __cplusplus -} // extern "C" #endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_network_tcp.h" ***********************************/ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/include/open62541/plugin/log_stdout.h" ***********************************/ /* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2016, 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + */ + + + +_UA_BEGIN_DECLS + +extern UA_EXPORT const UA_Logger UA_Log_Stdout_; /* Logger structure */ +extern UA_EXPORT const UA_Logger *UA_Log_Stdout; /* Shorthand pointer */ + +/* Don't use these definitions. They are only exported as long as the client + * config is static and required compile-time */ +UA_EXPORT void +UA_Log_Stdout_log(void *_, UA_LogLevel level, UA_LogCategory category, + const char *msg, va_list args); +UA_EXPORT void +UA_Log_Stdout_clear(void *logContext); + +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/include/open62541/server_config_default.h" ***********************************/ + +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2019 (c) Kalycito Infotech Private Limited + */ + + + +_UA_BEGIN_DECLS + +/**********************/ +/* Default Connection */ +/**********************/ + +extern const UA_EXPORT +UA_ConnectionConfig UA_ConnectionConfig_default; + +/*************************/ +/* Default Server Config */ +/*************************/ + +/* Creates a new server config with one endpoint and custom buffer size. + * + * The config will set the tcp network layer to the given port and adds a single + * endpoint with the security policy ``SecurityPolicy#None`` to the server. A + * server certificate may be supplied but is optional. + * Additionally you can define a custom buffer size for send and receive buffer. + * + * @param portNumber The port number for the tcp network layer + * @param certificate Optional certificate for the server endpoint. Can be + * ``NULL``. + * @param sendBufferSize The size in bytes for the network send buffer + * @param recvBufferSize The size in bytes for the network receive buffer + * + */ +UA_EXPORT UA_StatusCode +UA_ServerConfig_setMinimalCustomBuffer(UA_ServerConfig *config, + UA_UInt16 portNumber, + const UA_ByteString *certificate, + UA_UInt32 sendBufferSize, + UA_UInt32 recvBufferSize); + +/* Creates a new server config with one endpoint. + * + * The config will set the tcp network layer to the given port and adds a single + * endpoint with the security policy ``SecurityPolicy#None`` to the server. A + * server certificate may be supplied but is optional. */ +static UA_INLINE UA_StatusCode +UA_ServerConfig_setMinimal(UA_ServerConfig *config, UA_UInt16 portNumber, + const UA_ByteString *certificate) { + return UA_ServerConfig_setMinimalCustomBuffer(config, portNumber, + certificate, 0, 0); +} + +#ifdef UA_ENABLE_ENCRYPTION + +UA_EXPORT UA_StatusCode +UA_ServerConfig_setDefaultWithSecurityPolicies(UA_ServerConfig *conf, + UA_UInt16 portNumber, + const UA_ByteString *certificate, + const UA_ByteString *privateKey, + const UA_ByteString *trustList, + size_t trustListSize, + const UA_ByteString *issuerList, + size_t issuerListSize, + const UA_ByteString *revocationList, + size_t revocationListSize); + +#endif + +/* Creates a server config on the default port 4840 with no server + * certificate. */ +static UA_INLINE UA_StatusCode +UA_ServerConfig_setDefault(UA_ServerConfig *config) { + return UA_ServerConfig_setMinimal(config, 4840, NULL); +} + +/* Creates a new server config with no network layer and no endpoints. + * + * It initializes reasonable defaults for many things, but does not + * add any network layer, security policies and endpoints. + * Use the various UA_ServerConfig_addXxx functions to add them. + * + * @param conf The configuration to manipulate + */ +UA_EXPORT UA_StatusCode +UA_ServerConfig_setBasics(UA_ServerConfig *conf); + +/* Adds a TCP network layer with custom buffer sizes + * + * @param conf The configuration to manipulate + * @param portNumber The port number for the tcp network layer + * @param sendBufferSize The size in bytes for the network send buffer. Pass 0 + * to use defaults. + * @param recvBufferSize The size in bytes for the network receive buffer. + * Pass 0 to use defaults. + */ +UA_EXPORT UA_StatusCode +UA_ServerConfig_addNetworkLayerTCP(UA_ServerConfig *conf, UA_UInt16 portNumber, + UA_UInt32 sendBufferSize, UA_UInt32 recvBufferSize); + +/* Adds the security policy ``SecurityPolicy#None`` to the server. A + * server certificate may be supplied but is optional. + * + * @param config The configuration to manipulate + * @param certificate The optional server certificate. + */ +UA_EXPORT UA_StatusCode +UA_ServerConfig_addSecurityPolicyNone(UA_ServerConfig *config, + const UA_ByteString *certificate); + +#ifdef UA_ENABLE_ENCRYPTION + +/* Adds the security policy ``SecurityPolicy#Basic128Rsa15`` to the server. A + * server certificate may be supplied but is optional. + * + * Certificate verification should be configured before calling this + * function. See PKI plugin. + * + * @param config The configuration to manipulate + * @param certificate The server certificate. + * @param privateKey The private key that corresponds to the certificate. + */ +UA_EXPORT UA_StatusCode +UA_ServerConfig_addSecurityPolicyBasic128Rsa15(UA_ServerConfig *config, + const UA_ByteString *certificate, + const UA_ByteString *privateKey); + +/* Adds the security policy ``SecurityPolicy#Basic256`` to the server. A + * server certificate may be supplied but is optional. + * + * Certificate verification should be configured before calling this + * function. See PKI plugin. + * + * @param config The configuration to manipulate + * @param certificate The server certificate. + * @param privateKey The private key that corresponds to the certificate. + */ +UA_EXPORT UA_StatusCode +UA_ServerConfig_addSecurityPolicyBasic256(UA_ServerConfig *config, + const UA_ByteString *certificate, + const UA_ByteString *privateKey); + +/* Adds the security policy ``SecurityPolicy#Basic256Sha256`` to the server. A + * server certificate may be supplied but is optional. + * + * Certificate verification should be configured before calling this + * function. See PKI plugin. * - * Copyright 2016 (c) Julius Pfrommer, Fraunhofer IOSB + * @param config The configuration to manipulate + * @param certificate The server certificate. + * @param privateKey The private key that corresponds to the certificate. */ +UA_EXPORT UA_StatusCode +UA_ServerConfig_addSecurityPolicyBasic256Sha256(UA_ServerConfig *config, + const UA_ByteString *certificate, + const UA_ByteString *privateKey); +/* Adds all supported security policies and sets up certificate + * validation procedures. + * + * Certificate verification should be configured before calling this + * function. See PKI plugin. + * + * @param config The configuration to manipulate + * @param certificate The server certificate. + * @param privateKey The private key that corresponds to the certificate. + * @param trustList The trustList for client certificate validation. + * @param trustListSize The trustList size. + * @param revocationList The revocationList for client certificate validation. + * @param revocationListSize The revocationList size. + */ +UA_EXPORT UA_StatusCode +UA_ServerConfig_addAllSecurityPolicies(UA_ServerConfig *config, + const UA_ByteString *certificate, + const UA_ByteString *privateKey); -#ifdef __cplusplus -extern "C" { #endif +/* Adds an endpoint for the given security policy and mode. The security + * policy has to be added already. See UA_ServerConfig_addXxx functions. + * + * @param config The configuration to manipulate + * @param securityPolicyUri The security policy for which to add the endpoint. + * @param securityMode The security mode for which to add the endpoint. + */ +UA_EXPORT UA_StatusCode +UA_ServerConfig_addEndpoint(UA_ServerConfig *config, const UA_String securityPolicyUri, + UA_MessageSecurityMode securityMode); -UA_ServerNetworkLayer UA_EXPORT -UA_ServerNetworkLayerTCP(UA_ConnectionConfig conf, UA_UInt16 port, UA_Logger logger); - -UA_Connection UA_EXPORT -UA_ClientConnectionTCP(UA_ConnectionConfig conf, const char *endpointUrl, const UA_UInt32 timeout, UA_Logger logger); +/* Adds endpoints for all configured security policies in each mode. + * + * @param config The configuration to manipulate + */ +UA_EXPORT UA_StatusCode +UA_ServerConfig_addAllEndpoints(UA_ServerConfig *config); -#ifdef __cplusplus -} // extern "C" -#endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_accesscontrol_default.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/include/open62541/client_config_default.h" ***********************************/ /* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. * - * Copyright 2016-2017 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB */ -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - UA_String username; - UA_String password; -} UA_UsernamePasswordLogin; +_UA_BEGIN_DECLS -/* Default access control. The log-in can be anonymous or username-password. A - * logged-in user has all access rights. */ -UA_EXPORT UA_AccessControl -UA_AccessControl_default(UA_Boolean allowAnonymous, - size_t usernamePasswordLoginSize, - const UA_UsernamePasswordLogin *usernamePasswordLogin); +UA_StatusCode UA_EXPORT +UA_ClientConfig_setDefault(UA_ClientConfig *config); -#ifdef __cplusplus -} +#ifdef UA_ENABLE_ENCRYPTION +UA_StatusCode UA_EXPORT +UA_ClientConfig_setDefaultEncryption(UA_ClientConfig *config, + UA_ByteString localCertificate, UA_ByteString privateKey, + const UA_ByteString *trustList, size_t trustListSize, + const UA_ByteString *revocationList, size_t revocationListSize); #endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_pki_certificate.h" ***********************************/ + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/include/open62541/plugin/securitypolicy_default.h" ***********************************/ /* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. * - * Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2018 (c) Daniel Feist, Precitec GmbH & Co. KG */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS -/* Default implementation that accepts all certificates */ -UA_EXPORT void -UA_CertificateVerification_AcceptAll(UA_CertificateVerification *cv); +UA_EXPORT UA_StatusCode +UA_SecurityPolicy_None(UA_SecurityPolicy *policy, + UA_CertificateVerification *certificateVerification, + const UA_ByteString localCertificate, const UA_Logger *logger); #ifdef UA_ENABLE_ENCRYPTION -/* Accept certificates based on a trust-list and a revocation-list. Based on - * mbedTLS. */ UA_EXPORT UA_StatusCode -UA_CertificateVerification_Trustlist(UA_CertificateVerification *cv, - const UA_ByteString *certificateTrustList, - size_t certificateTrustListSize, - const UA_ByteString *certificateRevocationList, - size_t certificateRevocationListSize); +UA_SecurityPolicy_Basic128Rsa15(UA_SecurityPolicy *policy, + UA_CertificateVerification *certificateVerification, + const UA_ByteString localCertificate, + const UA_ByteString localPrivateKey, + const UA_Logger *logger); -#endif +UA_EXPORT UA_StatusCode +UA_SecurityPolicy_Basic256(UA_SecurityPolicy *policy, + UA_CertificateVerification *certificateVerification, + const UA_ByteString localCertificate, + const UA_ByteString localPrivateKey, const UA_Logger *logger); + +UA_EXPORT UA_StatusCode +UA_SecurityPolicy_Basic256Sha256(UA_SecurityPolicy *policy, + UA_CertificateVerification *certificateVerification, + const UA_ByteString localCertificate, + const UA_ByteString localPrivateKey, + const UA_Logger *logger); -#ifdef __cplusplus -} #endif +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_securitypolicy_basic128rsa15.h" ***********************************/ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/include/open62541/plugin/securitypolicy_mbedtls_common.h" ***********************************/ + +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. * - * Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB + * Copyright 2019 (c) Fraunhofer IOSB (Author: Julius Pfrommer) */ -#ifndef UA_SECURITYPOLICY_BASIC128RSA15_H_ -#define UA_SECURITYPOLICY_BASIC128RSA15_H_ #ifdef UA_ENABLE_ENCRYPTION -#ifdef __cplusplus -extern "C" { -#endif +#include +#include +#include +#define UA_SHA1_LENGTH 20 -UA_EXPORT UA_StatusCode -UA_SecurityPolicy_Basic128Rsa15(UA_SecurityPolicy *policy, - UA_CertificateVerification *certificateVerification, - const UA_ByteString localCertificate, - const UA_ByteString localPrivateKey, - UA_Logger logger); +_UA_BEGIN_DECLS -#ifdef __cplusplus -} -#endif +void +swapBuffers(UA_ByteString *const bufA, UA_ByteString *const bufB); -#endif /* UA_ENABLE_ENCRYPTION */ +void +mbedtls_hmac(mbedtls_md_context_t *context, const UA_ByteString *key, + const UA_ByteString *in, unsigned char *out); -#endif // UA_SECURITYPOLICY_BASIC128RSA15_H_ +UA_StatusCode +mbedtls_generateKey(mbedtls_md_context_t *context, + const UA_ByteString *secret, const UA_ByteString *seed, + UA_ByteString *out); -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_securitypolicy_basic256sha256.h" ***********************************/ +UA_StatusCode +mbedtls_verifySig_sha1(mbedtls_x509_crt *certificate, const UA_ByteString *message, + const UA_ByteString *signature); -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB - * Copyright 2018 (c) Daniel Feist, Precitec GmbH & Co. KG - */ +UA_StatusCode +mbedtls_sign_sha1(mbedtls_pk_context *localPrivateKey, + mbedtls_ctr_drbg_context *drbgContext, + const UA_ByteString *message, + UA_ByteString *signature); -#ifndef UA_SECURITYPOLICY_BASIC256SHA256_H_ -#define UA_SECURITYPOLICY_BASIC256SHA256_H_ +UA_StatusCode +mbedtls_thumbprint_sha1(const UA_ByteString *certificate, + UA_ByteString *thumbprint); +/* Set the hashing scheme before calling + * E.g. mbedtls_rsa_set_padding(context, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA1); */ +UA_StatusCode +mbedtls_encrypt_rsaOaep(mbedtls_rsa_context *context, + mbedtls_ctr_drbg_context *drbgContext, + UA_ByteString *data, const size_t plainTextBlockSize); -#ifdef UA_ENABLE_ENCRYPTION +UA_StatusCode +mbedtls_decrypt_rsaOaep(mbedtls_pk_context *localPrivateKey, + mbedtls_ctr_drbg_context *drbgContext, + UA_ByteString *data); + +_UA_END_DECLS -#ifdef __cplusplus -extern "C" { #endif -UA_EXPORT UA_StatusCode -UA_SecurityPolicy_Basic256Sha256(UA_SecurityPolicy *policy, - UA_CertificateVerification *certificateVerification, - const UA_ByteString localCertificate, - const UA_ByteString localPrivateKey, - UA_Logger logger); +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/plugins/include/open62541/plugin/pubsub_udp.h" ***********************************/ + +/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * + * Copyright 2017-2018 (c) Fraunhofer IOSB (Author: Andreas Ebner) + */ + -#ifdef __cplusplus -} -#endif -#endif /* UA_ENABLE_ENCRYPTION */ +_UA_BEGIN_DECLS -#endif // UA_SECURITYPOLICY_BASIC256SHA256_H_ +UA_PubSubTransportLayer UA_EXPORT +UA_PubSubTransportLayerUDPMP(void); -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_log_stdout.h" ***********************************/ +_UA_END_DECLS + + +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/network_tcp.h" ***********************************/ /* This work is licensed under a Creative Commons CCZero 1.0 Universal License. * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. * - * Copyright 2016 (c) Julius Pfrommer, Fraunhofer IOSB + * Copyright 2016 (c) Fraunhofer IOSB (Author: Julius Pfrommer) */ -#ifdef __cplusplus -extern "C" { -#endif +_UA_BEGIN_DECLS -void UA_EXPORT -UA_Log_Stdout(UA_LogLevel level, UA_LogCategory category, - const char *msg, va_list args); +UA_ServerNetworkLayer UA_EXPORT +UA_ServerNetworkLayerTCP(UA_ConnectionConfig config, UA_UInt16 port, UA_Logger *logger); -#ifdef __cplusplus -} -#endif +UA_Connection UA_EXPORT +UA_ClientConnectionTCP(UA_ConnectionConfig config, const UA_String endpointUrl, + UA_UInt32 timeout, UA_Logger *logger); + +UA_StatusCode UA_EXPORT +UA_ClientConnectionTCP_poll(UA_Client *client, void *data); + +UA_Connection UA_EXPORT +UA_ClientConnectionTCP_init(UA_ConnectionConfig config, const UA_String endpointUrl, + UA_UInt32 timeout, UA_Logger *logger); + +_UA_END_DECLS -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_nodestore_default.h" ***********************************/ +/*********************************** amalgamated original file "/Users/jelena/Desktop/open62541/include/open62541/architecture_functions.h" ***********************************/ /* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. + * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. * - * Copyright 2017 (c) Julian Grothoff - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH + * Copyright 2018 (c) Jose Cabral, fortiss GmbH + */ + +/* + * This header has all the functions that are architecture dependent. The declaration is behind a ifndef since + * they can be previously defined in the ua_architecture.h which include this files at the end */ -#ifdef __cplusplus -extern "C" { +_UA_BEGIN_DECLS + +/* + * Allocation functions + */ + +#ifndef UA_malloc +void* UA_malloc(size_t size); //allocate memory in the heap with size bytes #endif -/* Initializes the nodestore, sets the context and function pointers */ -UA_StatusCode UA_EXPORT -UA_Nodestore_default_new(UA_Nodestore *ns); +#ifndef UA_calloc +void* UA_calloc(size_t num, size_t size); //allocate memory in the heap with size*num bytes and set the memory to zero +#endif -#ifdef __cplusplus -} // extern "C" +#ifndef UA_realloc +void* UA_realloc(void *ptr, size_t new_size);//re-allocate memory in the heap with new_size bytes from previously allocated memory ptr #endif +#ifndef UA_free +void UA_free(void* ptr); //de-allocate memory previously allocated with UA_malloc, UA_calloc or UA_realloc +#endif -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_config_default.h" ***********************************/ +#ifndef UA_alloca +# if defined(__GNUC__) || defined(__clang__) +# define UA_alloca(size) __builtin_alloca (size) +# elif defined(_WIN32) +# define UA_alloca(SIZE) _alloca(SIZE) +# else +# include +# define UA_alloca(SIZE) alloca(SIZE) +# endif +#endif -/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. - * - * Copyright 2017 (c) Julius Pfrommer, Fraunhofer IOSB - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - * Copyright 2018 (c) Mark Giraud, Fraunhofer IOSB +#ifndef UA_STACKARRAY +/* Stack-allocation of memory. Use C99 variable-length arrays if possible. + * Otherwise revert to alloca. Note that alloca is not supported on some + * plattforms. */ +# if defined(__GNUC__) || defined(__clang__) +# define UA_STACKARRAY(TYPE, NAME, SIZE) TYPE NAME[SIZE] +# else +# define UA_STACKARRAY(TYPE, NAME, SIZE) \ + TYPE *NAME = (TYPE*)UA_alloca(sizeof(TYPE) * SIZE) +# endif +#endif + +/* + * Sleep function */ +#ifndef UA_sleep_ms +int UA_sleep_ms(unsigned int miliSeconds); //suspend the thread for a certain amount of mili seconds +#endif -#ifdef __cplusplus -extern "C" { +/* + * Socket functions + */ + +#ifndef UA_send +ssize_t UA_send(UA_SOCKET sockfd, const void *buf, size_t len, int flags); //equivalent to posix send implementation #endif +#ifndef UA_sendto +ssize_t sendto(UA_SOCKET sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); //equivalent to posix sendto implementation +#endif -/**********************/ -/* Default Connection */ -/**********************/ +#ifndef UA_select +int UA_select(UA_SOCKET nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); //equivalent to posix select implementation +#endif -extern const UA_EXPORT UA_ConnectionConfig UA_ConnectionConfig_default; +#ifndef UA_recv +ssize_t UA_recv(UA_SOCKET sockfd, void *buf, size_t len, int flags); //equivalent to posix recv implementation +#endif -/*************************/ -/* Default Server Config */ -/*************************/ +#ifndef UA_recvfrom +ssize_t recvfrom(UA_SOCKET sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); +#endif -/* Creates a new server config with one endpoint. - * - * The config will set the tcp network layer to the given port and adds a single - * endpoint with the security policy ``SecurityPolicy#None`` to the server. A - * server certificate may be supplied but is optional. - * - * @param portNumber The port number for the tcp network layer - * @param certificate Optional certificate for the server endpoint. Can be - * ``NULL``. */ -UA_EXPORT UA_ServerConfig * -UA_ServerConfig_new_minimal(UA_UInt16 portNumber, const UA_ByteString *certificate); +#ifndef UA_shutdown +int UA_shutdown(UA_SOCKET sockfd, int how); //equivalent to posix shutdown implementation +#endif -#ifdef UA_ENABLE_ENCRYPTION +#ifndef UA_socket +UA_SOCKET UA_socket(int domain, int type, int protocol);//equivalent to posix socket implementation +#endif -UA_EXPORT UA_ServerConfig * -UA_ServerConfig_new_basic128rsa15(UA_UInt16 portNumber, - const UA_ByteString *certificate, - const UA_ByteString *privateKey, - const UA_ByteString *trustList, - size_t trustListSize, - const UA_ByteString *revocationList, - size_t revocationListSize); - -UA_EXPORT UA_ServerConfig * -UA_ServerConfig_new_basic256sha256(UA_UInt16 portNumber, - const UA_ByteString *certificate, - const UA_ByteString *privateKey, - const UA_ByteString *trustList, - size_t trustListSize, - const UA_ByteString *revocationList, - size_t revocationListSize); - -UA_EXPORT UA_ServerConfig * -UA_ServerConfig_new_allSecurityPolicies(UA_UInt16 portNumber, - const UA_ByteString *certificate, - const UA_ByteString *privateKey, - const UA_ByteString *trustList, - size_t trustListSize, - const UA_ByteString *revocationList, - size_t revocationListSize); +#ifndef UA_bind +int UA_bind(UA_SOCKET sockfd, const struct sockaddr *addr, socklen_t addrlen);//equivalent to posix bind implementation +#endif +#ifndef UA_listen +int UA_listen(UA_SOCKET sockfd, int backlog);//equivalent to posix listen implementation #endif -/* Creates a server config on the default port 4840 with no server - * certificate. */ -static UA_INLINE UA_ServerConfig * -UA_ServerConfig_new_default(void) { - return UA_ServerConfig_new_minimal(4840, NULL); -} +#ifndef UA_accept +int UA_accept(UA_SOCKET sockfd, struct sockaddr *addr, socklen_t *addrlen);//equivalent to posix accept implementation +#endif -/* Set a custom hostname in server configuration - * - * @param config A valid server configuration - * @param customHostname The custom hostname used by the server */ +#ifndef UA_close +int UA_close(UA_SOCKET sockfd);//equivalent to posix close implementation +#endif -UA_EXPORT void -UA_ServerConfig_set_customHostname(UA_ServerConfig *config, - const UA_String customHostname); +#ifndef UA_connect +int UA_connect(UA_SOCKET sockfd, const struct sockaddr *addr, socklen_t addrlen);//equivalent to posix connect implementation +#endif -/* Frees allocated memory in the server config */ -UA_EXPORT void -UA_ServerConfig_delete(UA_ServerConfig *config); +#ifndef UA_fd_set +void UA_fd_set(UA_SOCKET fd, fd_set *set); //equivalent to posix FD_SET implementation +#endif -/*************************/ -/* Default Client Config */ -/*************************/ +#ifndef UA_fd_isset +int UA_fd_isset(UA_SOCKET fd, fd_set *set);//equivalent to posix FD_ISSET implementation +#endif -extern const UA_EXPORT UA_ClientConfig UA_ClientConfig_default; +#ifndef UA_getaddrinfo +int UA_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);//equivalent to posix getaddrinfo implementation +#endif -#ifdef __cplusplus -} +#ifndef UA_htonl +uint32_t UA_htonl(uint32_t hostlong);//equivalent to posix UA_htonl implementation #endif +#ifndef UA_ntohl +uint32_t UA_ntohl(uint32_t netlong);//equivalent to posix ntohl implementation +#endif -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_securitypolicy_none.h" ***********************************/ +#ifndef UA_inet_pton +int UA_inet_pton(int af, const char *src, void *dst);//equivalent to ANSI inet_pton implementation +#endif -/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. - * - * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - */ +#if UA_IPV6 +# ifndef UA_if_nametoindex +unsigned int UA_if_nametoindex(const char *ifname);//equivalent to posix if_nametoindex implementation +# endif +#endif +#ifndef UA_socket_set_blocking +unsigned int UA_socket_set_blocking(UA_SOCKET sockfd);//set a socket as blocking. Returns 0 if OK, other value otherwise +#endif -#ifdef __cplusplus -extern "C" { +#ifndef UA_socket_set_nonblocking +unsigned int UA_socket_set_nonblocking(UA_SOCKET sockfd);//set a socket as non-blocking. Returns 0 if OK, other value otherwise #endif +#ifndef UA_getsockopt +int UA_getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); //equivalent to posix getsockopt implementation. Only in non windows architectures +#endif -UA_StatusCode UA_EXPORT -UA_SecurityPolicy_None(UA_SecurityPolicy *policy, UA_CertificateVerification *certificateVerification, - const UA_ByteString localCertificate, UA_Logger logger); +#ifndef UA_setsockopt +int UA_setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);//equivalent to posix setsockopt implementation +#endif -#ifdef __cplusplus -} +#ifndef UA_freeaddrinfo +void UA_freeaddrinfo(struct addrinfo *res);//equivalent to posix freeaddrinfo implementatio #endif +#ifndef UA_gethostname +int UA_gethostname(char *name, size_t len);//equivalent to posix gethostname implementation +#endif -/*********************************** amalgamated original file "/home/travis/build/open62541/open62541/plugins/ua_log_socket_error.h" ***********************************/ +#ifndef UA_getsockname +int UA_getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);//equivalent to posix getsockname implementation +#endif -/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. - * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. - * - * Copyright 2017 (c) Stefan Profanter, fortiss GmbH - */ +#ifndef UA_initialize_architecture_network +void UA_initialize_architecture_network(void);//initializes all needed for using the network interfaces +#endif +#ifndef UA_deinitialize_architecture_network +void UA_deinitialize_architecture_network(void);//de-initializes the network interfaces +#endif -#ifdef __cplusplus -extern "C" { +/* + * Print function + */ +#ifndef UA_snprintf +int UA_snprintf(char* pa_stream, size_t pa_size, const char* pa_format, ...); //prints text to output #endif +/* + * Access to file function + */ -#ifdef _WIN32 -#include -#define UA_LOG_SOCKET_ERRNO_WRAP(LOG) { \ - char *errno_str = NULL; \ - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, \ - NULL, WSAGetLastError(), \ - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \ - (LPSTR)&errno_str, 0, NULL); \ - LOG; \ - LocalFree(errno_str); \ -} -#else -#define UA_LOG_SOCKET_ERRNO_WRAP(LOG) { \ - char *errno_str = strerror(errno); \ - LOG; \ -} +#ifndef UA_access +int UA_access(const char *pathname, int mode); //equivalent implementation of https://linux.die.net/man/2/access #endif -#ifdef __cplusplus -} // extern "C" +#ifndef UA_fileExists +#define UA_fileExists(X) ( UA_access(X, 0) == 0) #endif + +_UA_END_DECLS + #endif /* OPEN62541_H_ */ diff --git a/lib/opcua_client/client.rb b/lib/opcua_client/client.rb index c3ca806..862a517 100644 --- a/lib/opcua_client/client.rb +++ b/lib/opcua_client/client.rb @@ -7,16 +7,5 @@ def after_session_created(&block) def after_data_changed(&block) @callback_after_data_changed = block end - - def human_state - state = self.state - - if state == OPCUAClient::UA_CLIENTSTATE_DISCONNECTED; "UA_CLIENTSTATE_DISCONNECTED" - elsif state == OPCUAClient::UA_CLIENTSTATE_CONNECTED; "UA_CLIENTSTATE_CONNECTED" - elsif state == OPCUAClient::UA_CLIENTSTATE_SECURECHANNEL; "UA_CLIENTSTATE_SECURECHANNEL" - elsif state == OPCUAClient::UA_CLIENTSTATE_SESSION; "UA_CLIENTSTATE_SESSION" - elsif state == OPCUAClient::UA_CLIENTSTATE_SESSION_RENEWED; "UA_CLIENTSTATE_SESSION_RENEWED" - end - end end end